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