@@ -1262,8 +1262,6 @@ std::string GLShaderManager::BuildShaderText( const std::string& mainShaderText,
12621262void GLShaderManager::InitShader ( GLShader* shader ) {
12631263 const int start = Sys::Milliseconds ();
12641264
1265- shader->PostProcessUniforms ();
1266-
12671265 shader->_uniformStorageSize = 0 ;
12681266 for ( std::size_t i = 0 ; i < shader->_uniforms .size (); i++ ) {
12691267 GLUniform* uniform = shader->_uniforms [i];
@@ -1563,6 +1561,61 @@ void GLShaderManager::GenerateUniformStructDefinesText( const std::vector<GLUnif
15631561 uniformDefines += " \n " ;
15641562}
15651563
1564+ void GLShaderManager::PostProcessGlobalUniforms () {
1565+ /* Generate the struct and defines in the form of:
1566+ * struct GlobalUniforms {
1567+ * type uniform0;
1568+ * type uniform1;
1569+ * ..
1570+ * type uniformn;
1571+ * }
1572+ *
1573+ * #define uniformx globalUniforms.uniformx
1574+ */
1575+
1576+ std::string uniformStruct = " \n struct GlobalUniforms {\n " ;
1577+ std::string uniformBlock = " layout(std140, binding = "
1578+ + std::to_string ( BufferBind::GLOBAL_DATA )
1579+ + " ) uniform globalUBO {\n "
1580+ + " GlobalUniforms globalUniforms;\n "
1581+ + " };\n\n " ;
1582+ std::string uniformDefines;
1583+
1584+ GLuint size;
1585+ GLuint padding;
1586+ std::vector<GLUniform*>* uniforms = &( ( GLShader* ) globalUBOProxy )->_uniforms ;
1587+ std::vector<GLUniform*> constUniforms =
1588+ ProcessUniforms ( GLUniform::CONST, GLUniform::CONST, false , *uniforms, size, padding );
1589+
1590+ GenerateUniformStructDefinesText ( constUniforms, padding, 0 , " globalUniforms" , uniformStruct, uniformDefines );
1591+
1592+ uint32_t paddingCount = padding;
1593+
1594+ pushBuffer.constUniformsSize = size + padding;
1595+
1596+ std::vector<GLUniform*> frameUniforms =
1597+ ProcessUniforms ( GLUniform::FRAME, GLUniform::FRAME, false , *uniforms, size, padding );
1598+
1599+ GenerateUniformStructDefinesText ( frameUniforms, padding, paddingCount, " globalUniforms" , uniformStruct, uniformDefines );
1600+
1601+ pushBuffer.frameUniformsSize = size + padding;
1602+
1603+ uniformStruct += " };\n\n " ;
1604+
1605+ globalUniformBlock = uniformStruct + uniformBlock + uniformDefines;
1606+
1607+ uniforms = &( ( GLShader* ) globalUBOProxy )->_pushUniforms ;
1608+ uniforms->clear ();
1609+
1610+ for ( GLUniform* uniform : constUniforms ) {
1611+ uniforms->push_back ( uniform );
1612+ }
1613+
1614+ for ( GLUniform* uniform : frameUniforms ) {
1615+ uniforms->push_back ( uniform );
1616+ }
1617+ }
1618+
15661619// This will generate all the extra code for material system shaders
15671620std::string GLShaderManager::ShaderPostProcess ( GLShader *shader, const std::string& shaderText, const uint32_t offset ) {
15681621 if ( !shader->std140Size ) {
0 commit comments