|
|
@@ -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;
|
|
|
+ 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;
|
|
|
+ _flags &= ~BGFX_SAMPLER_RESERVED_MASK;
|
|
|
+ _flags &= BGFX_SAMPLER_BITS_MASK;
|
|
|
+ _flags |= _numMips<<BGFX_SAMPLER_RESERVED_SHIFT;
|
|
|
|
|
|
- GLuint sampler;
|
|
|
+ GLuint sampler;
|
|
|
|
|
|
- bool hasBorderColor = false;
|
|
|
- bx::HashMurmur2A murmur;
|
|
|
- uint32_t hash;
|
|
|
+ bool hasBorderColor = false;
|
|
|
+ bx::HashMurmur2A murmur;
|
|
|
+ uint32_t hash;
|
|
|
|
|
|
- murmur.begin();
|
|
|
- murmur.add(_flags);
|
|
|
- if (!needBorderColor(_flags) )
|
|
|
- {
|
|
|
- murmur.add(-1);
|
|
|
- hash = murmur.end();
|
|
|
+ murmur.begin();
|
|
|
+ murmur.add(_flags);
|
|
|
+ if (!needBorderColor(_flags) )
|
|
|
+ {
|
|
|
+ murmur.add(-1);
|
|
|
+ hash = murmur.end();
|
|
|
|
|
|
- sampler = m_samplerStateCache.find(hash);
|
|
|
+ sampler = m_samplerStateCache.find(hash);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ murmur.add(index);
|
|
|
+ hash = murmur.end();
|
|
|
+
|
|
|
+ if (NULL != _rgba)
|
|
|
+ {
|
|
|
+ hasBorderColor = true;
|
|
|
+ sampler = UINT32_MAX;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- murmur.add(index);
|
|
|
- hash = murmur.end();
|
|
|
-
|
|
|
- if (NULL != _rgba)
|
|
|
- {
|
|
|
- hasBorderColor = true;
|
|
|
- sampler = UINT32_MAX;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sampler = m_samplerStateCache.find(hash);
|
|
|
- }
|
|
|
+ sampler = m_samplerStateCache.find(hash);
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- if (UINT32_MAX == sampler)
|
|
|
- {
|
|
|
- sampler = m_samplerStateCache.add(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]
|
|
|
- ) );
|
|
|
+ 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) );
|
|
|
+ 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 (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 (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)
|
|
|
+ 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(glSamplerParameterf(sampler, GL_TEXTURE_MAX_ANISOTROPY_EXT, m_maxAnisotropy) );
|
|
|
+ GL_CHECK(glSamplerParameteri(sampler, GL_TEXTURE_COMPARE_MODE, GL_NONE) );
|
|
|
}
|
|
|
-
|
|
|
- if (m_gles3
|
|
|
- || m_shadowSamplersSupport)
|
|
|
+ else
|
|
|
{
|
|
|
- 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(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) );
|
|
|
}
|
|
|
+
|
|
|
+ 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)
|
|
|
- {
|
|
|
- // 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) )
|
|
|
+ if (s_renderGL->m_samplerObjectSupport)
|
|
|
{
|
|
|
- // 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]);
|
|
|
}
|
|
|
}
|
|
|
|