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