@@ -1578,7 +1578,7 @@ void GLShaderManager::GenerateUniformStructDefinesText( const std::vector<GLUnif
15781578
15791579//  This will generate all the extra code for material system shaders
15801580std::string GLShaderManager::ShaderPostProcess ( GLShader *shader, const  std::string& shaderText, const  uint32_t  offset ) {
1581- 	if  ( !shader->std430Size  ) {
1581+ 	if  ( !shader->std140Size  ) {
15821582		return  shaderText;
15831583	}
15841584
@@ -1641,7 +1641,7 @@ std::string GLShaderManager::ShaderPostProcess( GLShader *shader, const std::str
16411641	materialStruct += " };\n\n "  ;
16421642
16431643	//  6 kb for materials
1644- 	const  uint32_t  count = ( 4096  + 2048  ) / shader->GetSTD430Size ();
1644+ 	const  uint32_t  count = ( 4096  + 2048  ) / shader->GetSTD140Size ();
16451645	std::string materialBlock = " layout(std140, binding = " 
16461646		+ std::to_string ( BufferBind::MATERIALS )
16471647		+ " ) uniform materialsUBO {\n " 
@@ -2084,8 +2084,8 @@ bool GLCompileMacro_USE_BSP_SURFACE::HasConflictingMacros(size_t permutation, co
20842084	return  false ;
20852085}
20862086
2087- uint32_t * GLUniform::WriteToBuffer ( uint32_t * buffer  ) {
2088- 	return  buffer ;
2087+ uint32_t * GLUniform::WriteToBuffer ( uint32_t  *  ) {
2088+ 	Sys::Error (  " WriteToBuffer not implemented for GLUniform '%s' " , _name ) ;
20892089}
20902090
20912091void  GLShader::RegisterUniform ( GLUniform* uniform ) {
@@ -2107,7 +2107,9 @@ static auto FindUniformForOffset( std::vector<GLUniform*>& uniforms, const GLuin
21072107	return  uniforms.end ();
21082108}
21092109
2110- //  Compute std430 size/alignment and sort uniforms from highest to lowest alignment
2110+ //  Compute std140 size/alignment and sort uniforms from highest to lowest alignment
2111+ //  Note: using the std430 uniform size will give the wrong result for matrix types where
2112+ //  the number of rows is not 4
21112113void  GLShader::PostProcessUniforms () {
21122114	if  ( !_useMaterialSystem ) {
21132115		return ;
@@ -2128,17 +2130,18 @@ void GLShader::PostProcessUniforms() {
21282130
21292131	//  Sort uniforms from highest to lowest alignment so we don't need to pad uniforms (other than vec3s)
21302132	GLuint align = 4 ; //  mininum alignment since this will be used as an std140 array element
2131- 	std430Size  = 0 ;
2133+ 	std140Size  = 0 ;
21322134	_materialSystemUniforms.clear ();
2133- 	while  ( !uniformQueue.empty () || std430Size  & ( align - 1  ) ) {
2134- 		auto  iterNext = FindUniformForOffset ( uniformQueue, std430Size  );
2135+ 	while  ( !uniformQueue.empty () || std140Size  & ( align - 1  ) ) {
2136+ 		auto  iterNext = FindUniformForOffset ( uniformQueue, std140Size  );
21352137		if  ( iterNext == uniformQueue.end () ) {
21362138			//  add 1 unit of padding
2137- 			++std430Size ;
2139+ 			++std140Size ;
21382140			++_materialSystemUniforms.back ()->_std430Size ;
21392141		} else  {
2142+ 			ASSERT_EQ ( 0 , ( *iterNext )->_components  ); //  array handling not implemented
21402143			( *iterNext )->_std430Size  = ( *iterNext )->_std430BaseSize ;
2141- 			std430Size  += ( *iterNext )->_std430Size ;
2144+ 			std140Size  += ( *iterNext )->_std430Size ;
21422145			align = std::max ( align, ( *iterNext )->_std430Alignment  );
21432146			_materialSystemUniforms.push_back ( *iterNext );
21442147			uniformQueue.erase ( iterNext );
0 commit comments