From f3ff07a7fc8ccba54276a7d2beb1b390c170fbae Mon Sep 17 00:00:00 2001 From: Christophe Dehais Date: Fri, 14 Oct 2022 16:08:26 +0200 Subject: [PATCH] Simplify the sampler object code path selection in GL backend (#2955) --- src/renderer_gl.cpp | 226 ++++++++++++++++++++------------------------ 1 file changed, 101 insertions(+), 125 deletions(-) diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index 0e8d5b555..4f6f88511 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -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_BORDER_COLOR_SHIFT; + murmur.add(-1); + hash = murmur.end(); - _flags &= ~BGFX_SAMPLER_RESERVED_MASK; - _flags &= BGFX_SAMPLER_BITS_MASK; - _flags |= _numMips<>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]); } }