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