Added support for texture2DGrad.

This commit is contained in:
Branimir Karadžić
2017-03-23 17:33:29 -07:00
parent 7f847d9af0
commit 293c1dc60a
4 changed files with 131 additions and 43 deletions

View File

@@ -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

View File

@@ -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)
{

View File

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

View File

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