@@ -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