mirror of
https://github.com/bkaradzic/bgfx.git
synced 2026-02-17 20:52:36 +01:00
Simplify the sampler object code path selection in GL backend (#2955)
This commit is contained in:
committed by
GitHub
parent
9e7aa2d2ef
commit
f3ff07a7fc
@@ -3670,13 +3670,9 @@ namespace bgfx { namespace gl
|
||||
|
||||
if (!BX_ENABLED(BX_PLATFORM_OSX) )
|
||||
{
|
||||
if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL)
|
||||
|| m_gles3 )
|
||||
if (m_samplerObjectSupport)
|
||||
{
|
||||
if (m_samplerObjectSupport)
|
||||
{
|
||||
GL_CHECK(glBindSampler(0, 0) );
|
||||
}
|
||||
GL_CHECK(glBindSampler(0, 0) );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4140,119 +4136,115 @@ namespace bgfx { namespace gl
|
||||
|
||||
void invalidateCache()
|
||||
{
|
||||
if ( (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) || m_gles3)
|
||||
&& m_samplerObjectSupport)
|
||||
if (m_samplerObjectSupport)
|
||||
{
|
||||
m_samplerStateCache.invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
void setSamplerState(uint32_t _stage, uint32_t _numMips, uint32_t _flags, const float _rgba[4])
|
||||
{
|
||||
if ( (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) || m_gles3)
|
||||
&& m_samplerObjectSupport)
|
||||
{
|
||||
BX_ASSERT(m_samplerObjectSupport, "Cannot use Sampler Objects");
|
||||
if (0 == (BGFX_SAMPLER_INTERNAL_DEFAULT & _flags) )
|
||||
{
|
||||
if (0 == (BGFX_SAMPLER_INTERNAL_DEFAULT & _flags) )
|
||||
const uint32_t index = (_flags & BGFX_SAMPLER_BORDER_COLOR_MASK) >> BGFX_SAMPLER_BORDER_COLOR_SHIFT;
|
||||
|
||||
_flags &= ~BGFX_SAMPLER_RESERVED_MASK;
|
||||
_flags &= BGFX_SAMPLER_BITS_MASK;
|
||||
_flags |= _numMips<<BGFX_SAMPLER_RESERVED_SHIFT;
|
||||
|
||||
GLuint sampler;
|
||||
|
||||
bool hasBorderColor = false;
|
||||
bx::HashMurmur2A murmur;
|
||||
uint32_t hash;
|
||||
|
||||
murmur.begin();
|
||||
murmur.add(_flags);
|
||||
if (!needBorderColor(_flags) )
|
||||
{
|
||||
const uint32_t index = (_flags & BGFX_SAMPLER_BORDER_COLOR_MASK) >> BGFX_SAMPLER_BORDER_COLOR_SHIFT;
|
||||
murmur.add(-1);
|
||||
hash = murmur.end();
|
||||
|
||||
_flags &= ~BGFX_SAMPLER_RESERVED_MASK;
|
||||
_flags &= BGFX_SAMPLER_BITS_MASK;
|
||||
_flags |= _numMips<<BGFX_SAMPLER_RESERVED_SHIFT;
|
||||
|
||||
GLuint sampler;
|
||||
|
||||
bool hasBorderColor = false;
|
||||
bx::HashMurmur2A murmur;
|
||||
uint32_t hash;
|
||||
|
||||
murmur.begin();
|
||||
murmur.add(_flags);
|
||||
if (!needBorderColor(_flags) )
|
||||
{
|
||||
murmur.add(-1);
|
||||
hash = murmur.end();
|
||||
|
||||
sampler = m_samplerStateCache.find(hash);
|
||||
}
|
||||
else
|
||||
{
|
||||
murmur.add(index);
|
||||
hash = murmur.end();
|
||||
|
||||
if (NULL != _rgba)
|
||||
{
|
||||
hasBorderColor = true;
|
||||
sampler = UINT32_MAX;
|
||||
}
|
||||
else
|
||||
{
|
||||
sampler = m_samplerStateCache.find(hash);
|
||||
}
|
||||
}
|
||||
|
||||
if (UINT32_MAX == sampler)
|
||||
{
|
||||
sampler = m_samplerStateCache.add(hash);
|
||||
|
||||
GL_CHECK(glSamplerParameteri(sampler
|
||||
, GL_TEXTURE_WRAP_S
|
||||
, s_textureAddress[(_flags&BGFX_SAMPLER_U_MASK)>>BGFX_SAMPLER_U_SHIFT]
|
||||
) );
|
||||
GL_CHECK(glSamplerParameteri(sampler
|
||||
, GL_TEXTURE_WRAP_T
|
||||
, s_textureAddress[(_flags&BGFX_SAMPLER_V_MASK)>>BGFX_SAMPLER_V_SHIFT]
|
||||
) );
|
||||
GL_CHECK(glSamplerParameteri(sampler
|
||||
, GL_TEXTURE_WRAP_R
|
||||
, s_textureAddress[(_flags&BGFX_SAMPLER_W_MASK)>>BGFX_SAMPLER_W_SHIFT]
|
||||
) );
|
||||
|
||||
GLenum minFilter;
|
||||
GLenum magFilter;
|
||||
getFilters(_flags, 1 < _numMips, magFilter, minFilter);
|
||||
GL_CHECK(glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, magFilter) );
|
||||
GL_CHECK(glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, minFilter) );
|
||||
|
||||
if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) )
|
||||
{
|
||||
GL_CHECK(glSamplerParameterf(sampler, GL_TEXTURE_LOD_BIAS, float(BGFX_CONFIG_MIP_LOD_BIAS) ) );
|
||||
}
|
||||
|
||||
if (m_borderColorSupport
|
||||
&& hasBorderColor)
|
||||
{
|
||||
GL_CHECK(glSamplerParameterfv(sampler, GL_TEXTURE_BORDER_COLOR, _rgba) );
|
||||
}
|
||||
|
||||
if (0 != (_flags & (BGFX_SAMPLER_MIN_ANISOTROPIC|BGFX_SAMPLER_MAG_ANISOTROPIC) )
|
||||
&& 0.0f < m_maxAnisotropy)
|
||||
{
|
||||
GL_CHECK(glSamplerParameterf(sampler, GL_TEXTURE_MAX_ANISOTROPY_EXT, m_maxAnisotropy) );
|
||||
}
|
||||
|
||||
if (m_gles3
|
||||
|| m_shadowSamplersSupport)
|
||||
{
|
||||
const uint32_t cmpFunc = (_flags&BGFX_SAMPLER_COMPARE_MASK)>>BGFX_SAMPLER_COMPARE_SHIFT;
|
||||
if (0 == cmpFunc)
|
||||
{
|
||||
GL_CHECK(glSamplerParameteri(sampler, GL_TEXTURE_COMPARE_MODE, GL_NONE) );
|
||||
}
|
||||
else
|
||||
{
|
||||
GL_CHECK(glSamplerParameteri(sampler, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE) );
|
||||
GL_CHECK(glSamplerParameteri(sampler, GL_TEXTURE_COMPARE_FUNC, s_cmpFunc[cmpFunc]) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GL_CHECK(glBindSampler(_stage, sampler) );
|
||||
sampler = m_samplerStateCache.find(hash);
|
||||
}
|
||||
else
|
||||
{
|
||||
GL_CHECK(glBindSampler(_stage, 0) );
|
||||
murmur.add(index);
|
||||
hash = murmur.end();
|
||||
|
||||
if (NULL != _rgba)
|
||||
{
|
||||
hasBorderColor = true;
|
||||
sampler = UINT32_MAX;
|
||||
}
|
||||
else
|
||||
{
|
||||
sampler = m_samplerStateCache.find(hash);
|
||||
}
|
||||
}
|
||||
|
||||
if (UINT32_MAX == sampler)
|
||||
{
|
||||
sampler = m_samplerStateCache.add(hash);
|
||||
|
||||
GL_CHECK(glSamplerParameteri(sampler
|
||||
, GL_TEXTURE_WRAP_S
|
||||
, s_textureAddress[(_flags&BGFX_SAMPLER_U_MASK)>>BGFX_SAMPLER_U_SHIFT]
|
||||
) );
|
||||
GL_CHECK(glSamplerParameteri(sampler
|
||||
, GL_TEXTURE_WRAP_T
|
||||
, s_textureAddress[(_flags&BGFX_SAMPLER_V_MASK)>>BGFX_SAMPLER_V_SHIFT]
|
||||
) );
|
||||
GL_CHECK(glSamplerParameteri(sampler
|
||||
, GL_TEXTURE_WRAP_R
|
||||
, s_textureAddress[(_flags&BGFX_SAMPLER_W_MASK)>>BGFX_SAMPLER_W_SHIFT]
|
||||
) );
|
||||
|
||||
GLenum minFilter;
|
||||
GLenum magFilter;
|
||||
getFilters(_flags, 1 < _numMips, magFilter, minFilter);
|
||||
GL_CHECK(glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, magFilter) );
|
||||
GL_CHECK(glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, minFilter) );
|
||||
|
||||
if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) )
|
||||
{
|
||||
GL_CHECK(glSamplerParameterf(sampler, GL_TEXTURE_LOD_BIAS, float(BGFX_CONFIG_MIP_LOD_BIAS) ) );
|
||||
}
|
||||
|
||||
if (m_borderColorSupport
|
||||
&& hasBorderColor)
|
||||
{
|
||||
GL_CHECK(glSamplerParameterfv(sampler, GL_TEXTURE_BORDER_COLOR, _rgba) );
|
||||
}
|
||||
|
||||
if (0 != (_flags & (BGFX_SAMPLER_MIN_ANISOTROPIC|BGFX_SAMPLER_MAG_ANISOTROPIC) )
|
||||
&& 0.0f < m_maxAnisotropy)
|
||||
{
|
||||
GL_CHECK(glSamplerParameterf(sampler, GL_TEXTURE_MAX_ANISOTROPY_EXT, m_maxAnisotropy) );
|
||||
}
|
||||
|
||||
if (m_gles3
|
||||
|| m_shadowSamplersSupport)
|
||||
{
|
||||
const uint32_t cmpFunc = (_flags&BGFX_SAMPLER_COMPARE_MASK)>>BGFX_SAMPLER_COMPARE_SHIFT;
|
||||
if (0 == cmpFunc)
|
||||
{
|
||||
GL_CHECK(glSamplerParameteri(sampler, GL_TEXTURE_COMPARE_MODE, GL_NONE) );
|
||||
}
|
||||
else
|
||||
{
|
||||
GL_CHECK(glSamplerParameteri(sampler, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE) );
|
||||
GL_CHECK(glSamplerParameteri(sampler, GL_TEXTURE_COMPARE_FUNC, s_cmpFunc[cmpFunc]) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GL_CHECK(glBindSampler(_stage, sampler) );
|
||||
}
|
||||
else
|
||||
{
|
||||
GL_CHECK(glBindSampler(_stage, 0) );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6157,29 +6149,13 @@ namespace bgfx { namespace gl
|
||||
GL_CHECK(glActiveTexture(GL_TEXTURE0+_stage) );
|
||||
GL_CHECK(glBindTexture(m_target, m_id) );
|
||||
|
||||
if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES)
|
||||
&& !s_renderGL->m_gles3)
|
||||
if (s_renderGL->m_samplerObjectSupport)
|
||||
{
|
||||
// GLES2 doesn't have support for sampler object.
|
||||
setSamplerState(flags, _palette[index]);
|
||||
}
|
||||
else if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL)
|
||||
&& BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL < 31) )
|
||||
{
|
||||
// In case that GL 2.1 sampler object is supported via extension.
|
||||
if (s_renderGL->m_samplerObjectSupport)
|
||||
{
|
||||
s_renderGL->setSamplerState(_stage, m_numMips, flags, _palette[index]);
|
||||
}
|
||||
else
|
||||
{
|
||||
setSamplerState(flags, _palette[index]);
|
||||
}
|
||||
s_renderGL->setSamplerState(_stage, m_numMips, flags, _palette[index]);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Everything else has sampler object.
|
||||
s_renderGL->setSamplerState(_stage, m_numMips, flags, _palette[index]);
|
||||
setSamplerState(flags, _palette[index]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user