Просмотр исходного кода

Added support for texture2DGrad.

Branimir Karadžić 8 лет назад
Родитель
Сommit
293c1dc60a
4 измененных файлов с 131 добавлено и 43 удалено
  1. 8 0
      src/bgfx_shader.sh
  2. 33 14
      src/renderer_gl.cpp
  3. 77 25
      tools/shaderc/shaderc.cpp
  4. 13 4
      tools/shaderc/shaderc_glsl.cpp

+ 8 - 0
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

+ 33 - 14
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)
 					{

+ 77 - 25
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;
@@ -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"
 											);
 									}
 

+ 13 - 4
tools/shaderc/shaderc_glsl.cpp

@@ -73,19 +73,28 @@ namespace bgfx { namespace glsl
 			optimizedShader = bx::strnl(optimizedShader);
 		}
 
-		if (0 != _version)
 		{
 			char* code = const_cast<char*>(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");
 		}