From eaab1be0799c8e24f1037c23c0a7f52daa2d5e31 Mon Sep 17 00:00:00 2001 From: kingscallop <54776947+kingscallop@users.noreply.github.com> Date: Mon, 27 Apr 2020 04:43:03 +0100 Subject: [PATCH] Fix GpuShader5 extension on Intel and support 'bitsTo' functions (#2118) GpuShader5 extension isn't supported on fragment shaders. Bumps the GLSL version to support the 'bitsTo' functions when present on the shader. --- src/renderer_gl.cpp | 7 ++++++- tools/shaderc/shaderc.cpp | 16 ++++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index 9be791b0d..4f0f66eae 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -6135,7 +6135,12 @@ namespace bgfx { namespace gl && !bx::findIdentifierMatch(code, s_EXT_gpu_shader4).isEmpty() ; - const bool usesGpuShader5 = !bx::findIdentifierMatch(code, s_ARB_gpu_shader5).isEmpty(); + // GpuShader5 extension is not supported on the fragment shader! + const bool usesGpuShader5 = true + && m_type != GL_FRAGMENT_SHADER + && !bx::findIdentifierMatch(code, s_ARB_gpu_shader5).isEmpty() + ; + const bool usesIUsamplers = !bx::findIdentifierMatch(code, s_uisamplers).isEmpty(); const bool usesUint = !bx::findIdentifierMatch(code, s_uint).isEmpty(); const bool usesTexelFetch = !bx::findIdentifierMatch(code, s_texelFetch).isEmpty(); diff --git a/tools/shaderc/shaderc.cpp b/tools/shaderc/shaderc.cpp index f1de75819..7db507016 100644 --- a/tools/shaderc/shaderc.cpp +++ b/tools/shaderc/shaderc.cpp @@ -1965,7 +1965,14 @@ namespace bgfx const bx::StringView preprocessedInput(preprocessor.m_preprocessed.c_str() ); if (!bx::strFind(preprocessedInput, "layout(std430").isEmpty() - || !bx::strFind(preprocessedInput, "image2D").isEmpty() ) + || !bx::strFind(preprocessedInput, "image2D").isEmpty() + || (_options.shaderType == 'f' + && (!bx::strFind(preprocessedInput, "floatBitsToUint").isEmpty() || + !bx::strFind(preprocessedInput, "floatBitsToInt").isEmpty() || + !bx::strFind(preprocessedInput, "intBitsToFloat").isEmpty() || + !bx::strFind(preprocessedInput, "uintBitsToFloat").isEmpty() + ) ) + ) { glsl = 430; } @@ -1976,9 +1983,14 @@ namespace bgfx || !bx::findIdentifierMatch(input, s_ARB_shader_texture_lod).isEmpty() || !bx::findIdentifierMatch(input, s_EXT_shader_texture_lod).isEmpty() ; + + const bool usesGpuShader5 = true + && _options.shaderType != 'f' + && !bx::findIdentifierMatch(input, s_ARB_gpu_shader5).isEmpty() + ; + const bool usesInstanceID = !bx::findIdentifierMatch(input, "gl_InstanceID").isEmpty(); const bool usesGpuShader4 = !bx::findIdentifierMatch(input, s_EXT_gpu_shader4).isEmpty(); - const bool usesGpuShader5 = !bx::findIdentifierMatch(input, s_ARB_gpu_shader5).isEmpty(); const bool usesTexelFetch = !bx::findIdentifierMatch(input, s_texelFetch).isEmpty(); const bool usesTextureMS = !bx::findIdentifierMatch(input, s_ARB_texture_multisample).isEmpty(); const bool usesTextureArray = !bx::findIdentifierMatch(input, s_textureArray).isEmpty();