Browse Source

Simplify the sampler object code path selection in GL backend (#2955)

Christophe Dehais 3 years ago
parent
commit
f3ff07a7fc
1 changed files with 86 additions and 110 deletions
  1. 86 110
      src/renderer_gl.cpp

+ 86 - 110
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;
+				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]);
 		}
 	}