@@ -1280,8 +1280,6 @@ std::string GLShaderManager::BuildShaderText( const std::string& mainShaderText,
12801280void GLShaderManager::InitShader ( GLShader* shader ) {
12811281 const int start = Sys::Milliseconds ();
12821282
1283- shader->PostProcessUniforms ();
1284-
12851283 shader->_uniformStorageSize = 0 ;
12861284 for ( std::size_t i = 0 ; i < shader->_uniforms .size (); i++ ) {
12871285 GLUniform* uniform = shader->_uniforms [i];
@@ -1583,6 +1581,61 @@ void GLShaderManager::GenerateUniformStructDefinesText( const std::vector<GLUnif
15831581 uniformDefines += " \n " ;
15841582}
15851583
1584+ void GLShaderManager::PostProcessGlobalUniforms () {
1585+ /* Generate the struct and defines in the form of:
1586+ * struct GlobalUniforms {
1587+ * type uniform0;
1588+ * type uniform1;
1589+ * ..
1590+ * type uniformn;
1591+ * }
1592+ *
1593+ * #define uniformx globalUniforms.uniformx
1594+ */
1595+
1596+ std::string uniformStruct = " \n struct GlobalUniforms {\n " ;
1597+ std::string uniformBlock = " layout(std140, binding = "
1598+ + std::to_string ( BufferBind::GLOBAL_DATA )
1599+ + " ) uniform globalUBO {\n "
1600+ + " GlobalUniforms globalUniforms;\n "
1601+ + " };\n\n " ;
1602+ std::string uniformDefines;
1603+
1604+ GLuint size;
1605+ GLuint padding;
1606+ std::vector<GLUniform*>* uniforms = &( ( GLShader* ) globalUBOProxy )->_uniforms ;
1607+ std::vector<GLUniform*> constUniforms =
1608+ ProcessUniforms ( GLUniform::CONST, GLUniform::CONST, false , *uniforms, size, padding );
1609+
1610+ GenerateUniformStructDefinesText ( constUniforms, padding, 0 , " globalUniforms" , uniformStruct, uniformDefines );
1611+
1612+ uint32_t paddingCount = padding;
1613+
1614+ pushBuffer.constUniformsSize = size + padding;
1615+
1616+ std::vector<GLUniform*> frameUniforms =
1617+ ProcessUniforms ( GLUniform::FRAME, GLUniform::FRAME, false , *uniforms, size, padding );
1618+
1619+ GenerateUniformStructDefinesText ( frameUniforms, padding, paddingCount, " globalUniforms" , uniformStruct, uniformDefines );
1620+
1621+ pushBuffer.frameUniformsSize = size + padding;
1622+
1623+ uniformStruct += " };\n\n " ;
1624+
1625+ globalUniformBlock = uniformStruct + uniformBlock + uniformDefines;
1626+
1627+ uniforms = &( ( GLShader* ) globalUBOProxy )->_pushUniforms ;
1628+ uniforms->clear ();
1629+
1630+ for ( GLUniform* uniform : constUniforms ) {
1631+ uniforms->push_back ( uniform );
1632+ }
1633+
1634+ for ( GLUniform* uniform : frameUniforms ) {
1635+ uniforms->push_back ( uniform );
1636+ }
1637+ }
1638+
15861639// This will generate all the extra code for material system shaders
15871640std::string GLShaderManager::ShaderPostProcess ( GLShader *shader, const std::string& shaderText, const uint32_t offset ) {
15881641 if ( !shader->std430Size ) {
0 commit comments