From 8186e615aba2ac3d43feb6741fdf81df99dd816c Mon Sep 17 00:00:00 2001 From: Stenzek Date: Wed, 9 Apr 2025 13:21:52 +1000 Subject: [PATCH] ShaderGen: Don't use __VERSION__ for polyfill Adreno once again is a broken turd and uses 300 even for GLSL ES 3.20. And to add insult to injury, it reports the errors at the call site instead of where the function is actually being overloaded... --- src/util/shadergen.cpp | 14 ++++++-------- src/util/shadergen.h | 1 + 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/util/shadergen.cpp b/src/util/shadergen.cpp index 893645afd..a746dc01b 100644 --- a/src/util/shadergen.cpp +++ b/src/util/shadergen.cpp @@ -29,7 +29,10 @@ ShaderGen::ShaderGen(RenderAPI render_api, GPUShaderLanguage shader_language, bo { #ifdef ENABLE_OPENGL if (m_render_api == RenderAPI::OpenGL || m_render_api == RenderAPI::OpenGLES) - m_glsl_version_string = GetGLSLVersionString(m_render_api, GetGLSLVersion(render_api)); + { + m_glsl_version = GetGLSLVersion(render_api); + m_glsl_version_string = GetGLSLVersionString(m_render_api, m_glsl_version); + } m_use_glsl_interface_blocks = (shader_language == GPUShaderLanguage::GLSLVK || GLAD_GL_ES_VERSION_3_2 || GLAD_GL_VERSION_3_2); @@ -349,11 +352,9 @@ void ShaderGen::WriteHeader(std::stringstream& ss, bool enable_rov /* = false */ } // Pack functions missing from GLSL ES 3.0. - if (!m_glsl || m_shader_language == GPUShaderLanguage::GLSLES) + // We can't rely on __VERSION__ because Adreno is a broken turd and reports 300 even for GLES 3.2. + if (!m_glsl || (m_shader_language == GPUShaderLanguage::GLSLES && m_glsl_version < 310)) { - if (m_shader_language == GPUShaderLanguage::GLSLES) - ss << "#if __VERSION__ < 310\n"; - ss << "uint packUnorm4x8(float4 value) {\n" " uint4 packed = uint4(round(saturate(value) * 255.0));\n" " return packed.x | (packed.y << 8) | (packed.z << 16) | (packed.w << 24);\n" @@ -363,9 +364,6 @@ void ShaderGen::WriteHeader(std::stringstream& ss, bool enable_rov /* = false */ " uint4 packed = uint4(value & 0xffu, (value >> 8) & 0xffu, (value >> 16) & 0xffu, value >> 24);\n" " return float4(packed) / 255.0;\n" "}\n"; - - if (m_shader_language == GPUShaderLanguage::GLSLES) - ss << "#endif\n"; } ss << "\n"; diff --git a/src/util/shadergen.h b/src/util/shadergen.h index b5d3356af..da7f97e74 100644 --- a/src/util/shadergen.h +++ b/src/util/shadergen.h @@ -76,5 +76,6 @@ protected: bool m_use_glsl_binding_layout = false; mutable bool m_has_uniform_buffer = false; + u32 m_glsl_version = 0; TinyString m_glsl_version_string; };