From 293c1dc60a3909454b9b93ebaa9aa53ce7095e48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Thu, 23 Mar 2017 17:33:29 -0700 Subject: [PATCH] Added support for texture2DGrad. --- src/bgfx_shader.sh | 8 +++ src/renderer_gl.cpp | 47 ++++++++++----- tools/shaderc/shaderc.cpp | 102 +++++++++++++++++++++++++-------- tools/shaderc/shaderc_glsl.cpp | 17 ++++-- 4 files changed, 131 insertions(+), 43 deletions(-) diff --git a/src/bgfx_shader.sh b/src/bgfx_shader.sh index 0d71b2a4d..3ee69e85e 100644 --- a/src/bgfx_shader.sh +++ b/src/bgfx_shader.sh @@ -169,6 +169,11 @@ vec4 bgfxTexture2DProj(BgfxSampler2D _sampler, vec4 _coord) return _sampler.m_texture.Sample(_sampler.m_sampler, coord); } +vec4 bgfxTexture2DGrad(BgfxSampler2D _sampler, vec2 _coord, vec2 _dPdx, vec2 _dPdy) +{ + return _sampler.m_texture.SampleGrad(_sampler.m_sampler, _coord, _dPdx, _dPdy); +} + vec4 bgfxTexture2DArray(BgfxSampler2DArray _sampler, vec3 _coord) { return _sampler.m_texture.Sample(_sampler.m_sampler, _coord); @@ -263,6 +268,7 @@ vec4 bgfxTexelFetch(BgfxSampler3D _sampler, ivec3 _coord, int _lod) # define texture2D(_sampler, _coord) bgfxTexture2D(_sampler, _coord) # define texture2DLod(_sampler, _coord, _level) bgfxTexture2DLod(_sampler, _coord, _level) # define texture2DProj(_sampler, _coord) bgfxTexture2DProj(_sampler, _coord) +# define texture2DGrad(_sampler, _coord, _dPdx, _dPdy) bgfxTexture2DGrad(_sampler, _coord, _dPdx, _dPdy) # define SAMPLER2DARRAY(_name, _reg) \ uniform SamplerState _name ## Sampler : REGISTER(s, _reg); \ @@ -360,10 +366,12 @@ float bgfxShadow2DProj(sampler2DShadow _sampler, vec4 _coord) # if BGFX_SHADER_LANGUAGE_HLSL == 2 # define texture2DLod(_sampler, _coord, _level) tex2D(_sampler, (_coord).xy) +# define texture2DGrad(_sampler, _coord, _dPdx, _dPdy) tex2D(_sampler, _coord) # define texture3DLod(_sampler, _coord, _level) tex3D(_sampler, (_coord).xyz) # define textureCubeLod(_sampler, _coord, _level) texCUBE(_sampler, (_coord).xyz) # else # define texture2DLod(_sampler, _coord, _level) tex2Dlod(_sampler, vec4( (_coord).xy, 0.0, _level) ) +# define texture2DGrad(_sampler, _coord, _dPdx, _dPdy) tex2Dgrad(_sampler, _coord, _dPdx, _dPdy) # define texture3DLod(_sampler, _coord, _level) tex3Dlod(_sampler, vec4( (_coord).xyz, _level) ) # define textureCubeLod(_sampler, _coord, _level) texCUBElod(_sampler, vec4( (_coord).xyz, _level) ) # endif // BGFX_SHADER_LANGUAGE_HLSL == 2 diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index 5f7e671ad..8f4903a2c 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -851,10 +851,16 @@ namespace bgfx { namespace gl static const char* s_ARB_shader_texture_lod[] = { "texture2DLod", + "texture2DArrayLod", // BK - interacts with ARB_texture_array. "texture2DProjLod", + "texture2DGrad", + "texture2DProjGrad", "texture3DLod", "texture3DProjLod", + "texture3DGrad", + "texture3DProjGrad", "textureCubeLod", + "textureCubeGrad", "shadow2DLod", "shadow2DProjLod", NULL @@ -869,10 +875,10 @@ namespace bgfx { namespace gl "texture2DLod", "texture2DProjLod", "textureCubeLod", + "texture2DGrad", + "texture2DProjGrad", + "textureCubeGrad", NULL - // "texture2DGrad", - // "texture2DProjGrad", - // "textureCubeGrad", }; static const char* s_EXT_shadow_samplers[] = @@ -5499,15 +5505,20 @@ namespace bgfx { namespace gl if (usesTextureLod) { - BX_WARN(s_extension[Extension::EXT_shader_texture_lod].m_supported, "EXT_shader_texture_lod is used but not supported by GLES2 driver."); - if (s_extension[Extension::EXT_shader_texture_lod].m_supported - /*&& GL_VERTEX_SHADER == m_type*/) + BX_WARN(s_extension[Extension::ARB_shader_texture_lod].m_supported + , "ARB_shader_texture_lod is used but not supported by GLES2 driver." + ); + + if (s_extension[Extension::ARB_shader_texture_lod].m_supported) { writeString(&writer - , "#extension GL_EXT_shader_texture_lod : enable\n" - "#define texture2DLod texture2DLodEXT\n" - "#define texture2DProjLod texture2DProjLodEXT\n" - "#define textureCubeLod textureCubeLodEXT\n" + , "#extension GL_ARB_shader_texture_lod : enable\n" + "#define texture2DLod texture2DLodARB\n" + "#define texture2DProjLod texture2DProjLodARB\n" + "#define textureCubeLod textureCubeLodARB\n" + "#define texture2DGrad texture2DGradARB\n" + "#define texture2DProjGrad texture2DProjGradARB\n" + "#define textureCubeGrad textureCubeGradARB\n" ); } else @@ -5593,7 +5604,12 @@ namespace bgfx { namespace gl { if (m_type == GL_FRAGMENT_SHADER) { - writeString(&writer, "#extension GL_ARB_shader_texture_lod : enable\n"); + writeString(&writer + , "#extension GL_ARB_shader_texture_lod : enable\n" + "#define texture2DGrad texture2DGradARB\n" + "#define texture2DProjGrad texture2DProjGradARB\n" + "#define textureCubeGrad textureCubeGradARB\n" + ); } } @@ -5695,9 +5711,12 @@ namespace bgfx { namespace gl writeString(&writer, "#version 140\n"); } - writeString(&writer, "#define texture2DLod textureLod\n"); - writeString(&writer, "#define texture3DLod textureLod\n"); - writeString(&writer, "#define textureCubeLod textureLod\n"); + writeString(&writer, "#define texture2DLod textureLod\n"); + writeString(&writer, "#define texture3DLod textureLod\n"); + writeString(&writer, "#define textureCubeLod textureLod\n"); + writeString(&writer, "#define texture2DGrad textureGrad\n"); + writeString(&writer, "#define texture3DGrad textureGrad\n"); + writeString(&writer, "#define textureCubeGrad textureGrad\n"); if (m_type == GL_FRAGMENT_SHADER) { diff --git a/tools/shaderc/shaderc.cpp b/tools/shaderc/shaderc.cpp index bde594c6a..57934b5c6 100644 --- a/tools/shaderc/shaderc.cpp +++ b/tools/shaderc/shaderc.cpp @@ -25,9 +25,14 @@ namespace bgfx "texture2DLod", "texture2DArrayLod", // BK - interacts with ARB_texture_array. "texture2DProjLod", + "texture2DGrad", + "texture2DProjGrad", "texture3DLod", "texture3DProjLod", + "texture3DGrad", + "texture3DProjGrad", "textureCubeLod", + "textureCubeGrad", "shadow2DLod", "shadow2DProjLod", NULL @@ -37,6 +42,17 @@ namespace bgfx // "shadow1DProjLod", }; + static const char* s_EXT_shader_texture_lod[] = + { + "texture2DLod", + "texture2DProjLod", + "textureCubeLod", + "texture2DGrad", + "texture2DProjGrad", + "textureCubeGrad", + NULL + }; + static const char* s_EXT_shadow_samplers[] = { "shadow2D", @@ -347,28 +363,28 @@ namespace bgfx char* strInsert(char* _str, const char* _insert) { - size_t len = strlen(_insert); - memmove(&_str[len], _str, strlen(_str) ); - memcpy(_str, _insert, len); + uint32_t len = bx::strnlen(_insert); + bx::memMove(&_str[len], _str, bx::strnlen(_str) ); + bx::memCopy(_str, _insert, len); return _str + len; } void strReplace(char* _str, const char* _find, const char* _replace) { - const size_t len = strlen(_find); + const int32_t len = bx::strnlen(_find); char* replace = (char*)alloca(len+1); bx::strlcpy(replace, _replace, len+1); - for (size_t ii = strlen(replace); ii < len; ++ii) + for (int32_t ii = bx::strnlen(replace); ii < len; ++ii) { replace[ii] = ' '; } replace[len] = '\0'; - BX_CHECK(len >= strlen(_replace), ""); - for (char* ptr = strstr(_str, _find); NULL != ptr; ptr = strstr(ptr + len, _find) ) + BX_CHECK(len >= bx::strnlen(_replace), ""); + for (const char* ptr = bx::strnstr(_str, _find); NULL != ptr; ptr = bx::strnstr(ptr + len, _find) ) { - memcpy(ptr, replace, len); + bx::memCopy(const_cast(ptr), replace, len); } } @@ -529,7 +545,7 @@ namespace bgfx m_input = m_default; m_input += "\n\n"; - size_t len = strlen(_input)+1; + int32_t len = bx::strnlen(_input)+1; char* temp = new char[len]; bx::eolLF(temp, len, _input); m_input += temp; @@ -1834,9 +1850,12 @@ namespace bgfx { std::string code; + const bool usesTextureLod = false + || !!bx::findIdentifierMatch(input, s_ARB_shader_texture_lod) + || !!bx::findIdentifierMatch(input, s_EXT_shader_texture_lod) + ; const bool usesGpuShader5 = !!bx::findIdentifierMatch(input, s_ARB_gpu_shader5); const bool usesTexelFetch = !!bx::findIdentifierMatch(input, s_texelFetch); - const bool usesTextureLod = !!bx::findIdentifierMatch(input, s_ARB_shader_texture_lod /*EXT_shader_texture_lod*/); const bool usesTextureMS = !!bx::findIdentifierMatch(input, s_ARB_texture_multisample); const bool usesTextureArray = !!bx::findIdentifierMatch(input, s_textureArray); const bool usesPacking = !!bx::findIdentifierMatch(input, s_ARB_shading_language_packing); @@ -1871,12 +1890,26 @@ namespace bgfx ); } - if (usesTextureLod - && 130 > glsl) + bool ARB_shader_texture_lod = false; + bool EXT_shader_texture_lod = false; + + if (usesTextureLod) { - bx::stringPrintf(code - , "#extension GL_ARB_shader_texture_lod : enable\n" - ); + if ( (0 != metal || 130 > glsl) + && 'f' == shaderType) + { + ARB_shader_texture_lod = true; + bx::stringPrintf(code + , "#extension GL_ARB_shader_texture_lod : enable\n" + ); + } + else + { + EXT_shader_texture_lod = true; + bx::stringPrintf(code + , "#extension GL_EXT_shader_texture_lod : enable\n" + ); + } } if (usesTextureMS) @@ -1896,10 +1929,29 @@ namespace bgfx if (130 > glsl) { bx::stringPrintf(code, - "#define ivec2 vec2\n" - "#define ivec3 vec3\n" - "#define ivec4 vec4\n" - ); + "#define ivec2 vec2\n" + "#define ivec3 vec3\n" + "#define ivec4 vec4\n" + ); + } + + if (ARB_shader_texture_lod) + { + bx::stringPrintf(code, + "#define texture2DProjLod texture2DProjLodARB\n" + "#define texture2DGrad texture2DGradARB\n" + "#define texture2DProjGrad texture2DProjGradARB\n" + "#define textureCubeGrad textureCubeGradARB\n" + ); + } + else if (EXT_shader_texture_lod) + { + bx::stringPrintf(code, + "#define texture2DProjLod texture2DProjLodEXT\n" + "#define texture2DGrad texture2DGradEXT\n" + "#define texture2DProjGrad texture2DProjGradEXT\n" + "#define textureCubeGrad textureCubeGradEXT\n" + ); } bx::stringPrintf(code @@ -1915,12 +1967,12 @@ namespace bgfx { bx::stringPrintf(code , "#extension GL_EXT_shader_texture_lod : enable\n" - "#define texture2DLod texture2DLodEXT\n" - "#define texture2DProjLod texture2DProjLodEXT\n" - "#define textureCubeLod textureCubeLodEXT\n" - // "#define texture2DGrad texture2DGradEXT\n" - // "#define texture2DProjGrad texture2DProjGradEXT\n" - // "#define textureCubeGrad textureCubeGradEXT\n" + "#define texture2DLod texture2DLodEXT\n" + "#define texture2DGrad texture2DGradEXT\n" + "#define texture2DProjLod texture2DProjLodEXT\n" + "#define texture2DProjGrad texture2DProjGradEXT\n" + "#define textureCubeLod textureCubeLodEXT\n" + "#define textureCubeGrad textureCubeGradEXT\n" ); } diff --git a/tools/shaderc/shaderc_glsl.cpp b/tools/shaderc/shaderc_glsl.cpp index 84bebf76e..10ab449c0 100644 --- a/tools/shaderc/shaderc_glsl.cpp +++ b/tools/shaderc/shaderc_glsl.cpp @@ -73,19 +73,28 @@ namespace bgfx { namespace glsl optimizedShader = bx::strnl(optimizedShader); } - if (0 != _version) { char* code = const_cast(optimizedShader); strReplace(code, "gl_FragDepthEXT", "gl_FragDepth"); + strReplace(code, "texture2DLodARB", "texture2DLod"); strReplace(code, "texture2DLodEXT", "texture2DLod"); - strReplace(code, "texture2DProjLodEXT", "texture2DProjLod"); - strReplace(code, "textureCubeLodEXT", "textureCubeLod"); + strReplace(code, "texture2DGradARB", "texture2DGrad"); strReplace(code, "texture2DGradEXT", "texture2DGrad"); - strReplace(code, "texture2DProjGradEXT", "texture2DProjGrad"); + + strReplace(code, "textureCubeLodARB", "textureCubeLod"); + strReplace(code, "textureCubeLodEXT", "textureCubeLod"); + strReplace(code, "textureCubeGradARB", "textureCubeGrad"); strReplace(code, "textureCubeGradEXT", "textureCubeGrad"); + strReplace(code, "texture2DProjLodARB", "texture2DProjLod"); + strReplace(code, "texture2DProjLodEXT", "texture2DProjLod"); + strReplace(code, "texture2DProjGradARB", "texture2DProjGrad"); + strReplace(code, "texture2DProjGradEXT", "texture2DProjGrad"); + + strReplace(code, "shadow2DARB", "shadow2D"); strReplace(code, "shadow2DEXT", "shadow2D"); + strReplace(code, "shadow2DProjARB", "shadow2DProj"); strReplace(code, "shadow2DProjEXT", "shadow2DProj"); }