@@ -268,6 +268,10 @@ void GLShaderManager::FreeAll() {
268
268
{
269
269
_shaderBuildQueue.pop ();
270
270
}
271
+
272
+ if ( glConfig2.pushBufferAvailable ) {
273
+ pushBuffer.FreeGLBuffers ();
274
+ }
271
275
}
272
276
273
277
void GLShaderManager::UpdateShaderProgramUniformLocations ( GLShader* shader, ShaderProgramDescriptor* shaderProgram ) const {
@@ -1275,8 +1279,6 @@ std::string GLShaderManager::BuildShaderText( const std::string& mainShaderText,
1275
1279
void GLShaderManager::InitShader ( GLShader* shader ) {
1276
1280
const int start = Sys::Milliseconds ();
1277
1281
1278
- shader->PostProcessUniforms ();
1279
-
1280
1282
shader->_uniformStorageSize = 0 ;
1281
1283
for ( std::size_t i = 0 ; i < shader->_uniforms .size (); i++ ) {
1282
1284
GLUniform* uniform = shader->_uniforms [i];
@@ -1578,6 +1580,67 @@ void GLShaderManager::GenerateUniformStructDefinesText( const std::vector<GLUnif
1578
1580
uniformDefines += " \n " ;
1579
1581
}
1580
1582
1583
+ void GLShaderManager::PostProcessGlobalUniforms () {
1584
+ std::string uniformStruct = " \n struct GlobalUniforms {\n " ;
1585
+ std::string uniformBlock = " layout(std140, binding = "
1586
+ + std::to_string ( BufferBind::GLOBAL_DATA )
1587
+ + " ) uniform globalUBO {\n "
1588
+ + " GlobalUniforms globalUniforms;\n "
1589
+ + " };\n\n " ;
1590
+ std::string uniformDefines;
1591
+
1592
+ /* Generate the struct and defines in the form of:
1593
+ * struct GlobalUniforms {
1594
+ * type uniform0;
1595
+ * type uniform1;
1596
+ * ..
1597
+ * type uniformn;
1598
+ * }
1599
+ *
1600
+ * #define uniformx globalUniforms.uniformx
1601
+ */
1602
+
1603
+ GLuint size;
1604
+ GLuint padding;
1605
+ std::vector<GLUniform*>* uniforms = &( ( GLShader* ) globalUBOProxy )->_uniforms ;
1606
+ std::vector<GLUniform*> constUniforms =
1607
+ ProcessUniforms ( GLUniform::CONST, GLUniform::CONST, false , *uniforms, size, padding );
1608
+
1609
+ GenerateUniformStructDefinesText ( constUniforms, padding, 0 , " globalUniforms" , uniformStruct, uniformDefines );
1610
+
1611
+ uint32_t paddingCount = padding;
1612
+
1613
+ pushBuffer.constUniformsSize = size + padding;
1614
+
1615
+ std::vector<GLUniform*> frameUniforms =
1616
+ ProcessUniforms ( GLUniform::FRAME, GLUniform::FRAME, false , *uniforms, size, padding );
1617
+
1618
+ GenerateUniformStructDefinesText ( frameUniforms, padding, paddingCount, " globalUniforms" , uniformStruct, uniformDefines );
1619
+
1620
+ pushBuffer.frameUniformsSize = size + padding;
1621
+
1622
+ uniformStruct += " };\n\n " ;
1623
+
1624
+ globalUniformBlock = uniformStruct + uniformBlock + uniformDefines;
1625
+
1626
+ uniforms = &( ( GLShader* ) globalUBOProxy )->_pushUniforms ;
1627
+ uniforms->clear ();
1628
+
1629
+ for ( GLUniform* uniform : constUniforms ) {
1630
+ uniforms->push_back ( uniform );
1631
+ }
1632
+
1633
+ for ( GLUniform* uniform : frameUniforms ) {
1634
+ uniforms->push_back ( uniform );
1635
+ }
1636
+
1637
+ pushBuffer.InitGLBuffers ();
1638
+
1639
+ pushBuffer.globalUBO .BufferStorage ( pushBuffer.constUniformsSize + pushBuffer.frameUniformsSize , 1 , nullptr );
1640
+
1641
+ pushBuffer.globalUBO .BindBufferBase ();
1642
+ }
1643
+
1581
1644
// This will generate all the extra code for material system shaders
1582
1645
std::string GLShaderManager::ShaderPostProcess ( GLShader *shader, const std::string& shaderText, const uint32_t offset ) {
1583
1646
if ( !shader->std430Size ) {
0 commit comments