diff options
Diffstat (limited to '3rdparty/bgfx/tools/shaderc/shaderc.cpp')
-rw-r--r-- | 3rdparty/bgfx/tools/shaderc/shaderc.cpp | 106 |
1 files changed, 79 insertions, 27 deletions
diff --git a/3rdparty/bgfx/tools/shaderc/shaderc.cpp b/3rdparty/bgfx/tools/shaderc/shaderc.cpp index 114ce602cc1..57934b5c632 100644 --- a/3rdparty/bgfx/tools/shaderc/shaderc.cpp +++ b/3rdparty/bgfx/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<char*>(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; @@ -579,7 +595,7 @@ namespace bgfx static void fppOutput(int _ch, void* _userData) { Preprocessor* thisClass = (Preprocessor*)_userData; - thisClass->m_preprocessed += _ch; + thisClass->m_preprocessed += char(_ch); } static void fppError(void* /*_userData*/, char* _format, va_list _vargs) @@ -992,7 +1008,7 @@ namespace bgfx preprocessor.setDefine("M_PI=3.1415926535897932384626433832795"); - char shaderType = tolower(type[0]); + char shaderType = bx::toLower(type[0]); switch (shaderType) { case 'c': @@ -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" ); } |