mirror of
https://github.com/bkaradzic/bgfx.git
synced 2026-02-20 05:43:12 +01:00
Added support for texture2DGrad.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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"
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user