Skip to content

Commit d948218

Browse files
committed
Add PostProcessGlobalUniforms()
This will set `GLShaderManager.globalUniformBlock` to the struct + defines text, which will be the same for all shaders.
1 parent 75f77a2 commit d948218

File tree

5 files changed

+75
-2
lines changed

5 files changed

+75
-2
lines changed

src/engine/renderer/GLMemory.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,10 @@ void GLStagingBuffer::FreeGLBuffer() {
136136

137137
void PushBuffer::InitGLBuffers() {
138138
globalUBO.GenBuffer();
139+
140+
globalUBO.BufferStorage( pushBuffer.constUniformsSize + pushBuffer.frameUniformsSize, 1, nullptr );
141+
142+
globalUBO.BindBufferBase();
139143
}
140144

141145
void PushBuffer::FreeGLBuffers() {

src/engine/renderer/gl_shader.cpp

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1262,8 +1262,6 @@ std::string GLShaderManager::BuildShaderText( const std::string& mainShaderText,
12621262
void GLShaderManager::InitShader( GLShader* shader ) {
12631263
const int start = Sys::Milliseconds();
12641264

1265-
shader->PostProcessUniforms();
1266-
12671265
shader->_uniformStorageSize = 0;
12681266
for ( std::size_t i = 0; i < shader->_uniforms.size(); i++ ) {
12691267
GLUniform* uniform = shader->_uniforms[i];
@@ -1563,6 +1561,61 @@ void GLShaderManager::GenerateUniformStructDefinesText( const std::vector<GLUnif
15631561
uniformDefines += "\n";
15641562
}
15651563

1564+
void GLShaderManager::PostProcessGlobalUniforms() {
1565+
/* Generate the struct and defines in the form of:
1566+
* struct GlobalUniforms {
1567+
* type uniform0;
1568+
* type uniform1;
1569+
* ..
1570+
* type uniformn;
1571+
* }
1572+
*
1573+
* #define uniformx globalUniforms.uniformx
1574+
*/
1575+
1576+
std::string uniformStruct = "\nstruct GlobalUniforms {\n";
1577+
std::string uniformBlock = "layout(std140, binding = "
1578+
+ std::to_string( BufferBind::GLOBAL_DATA )
1579+
+ ") uniform globalUBO {\n"
1580+
+ "GlobalUniforms globalUniforms;\n"
1581+
+ "};\n\n";
1582+
std::string uniformDefines;
1583+
1584+
GLuint size;
1585+
GLuint padding;
1586+
std::vector<GLUniform*>* uniforms = &( ( GLShader* ) globalUBOProxy )->_uniforms;
1587+
std::vector<GLUniform*> constUniforms =
1588+
ProcessUniforms( GLUniform::CONST, GLUniform::CONST, false, *uniforms, size, padding );
1589+
1590+
GenerateUniformStructDefinesText( constUniforms, padding, 0, "globalUniforms", uniformStruct, uniformDefines );
1591+
1592+
uint32_t paddingCount = padding;
1593+
1594+
pushBuffer.constUniformsSize = size + padding;
1595+
1596+
std::vector<GLUniform*> frameUniforms =
1597+
ProcessUniforms( GLUniform::FRAME, GLUniform::FRAME, false, *uniforms, size, padding );
1598+
1599+
GenerateUniformStructDefinesText( frameUniforms, padding, paddingCount, "globalUniforms", uniformStruct, uniformDefines );
1600+
1601+
pushBuffer.frameUniformsSize = size + padding;
1602+
1603+
uniformStruct += "};\n\n";
1604+
1605+
globalUniformBlock = uniformStruct + uniformBlock + uniformDefines;
1606+
1607+
uniforms = &( ( GLShader* ) globalUBOProxy )->_pushUniforms;
1608+
uniforms->clear();
1609+
1610+
for ( GLUniform* uniform : constUniforms ) {
1611+
uniforms->push_back( uniform );
1612+
}
1613+
1614+
for ( GLUniform* uniform : frameUniforms ) {
1615+
uniforms->push_back( uniform );
1616+
}
1617+
}
1618+
15661619
// This will generate all the extra code for material system shaders
15671620
std::string GLShaderManager::ShaderPostProcess( GLShader *shader, const std::string& shaderText, const uint32_t offset ) {
15681621
if ( !shader->std140Size ) {

src/engine/renderer/gl_shader.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,8 @@ class GLShaderManager {
393393
GLHeader GLWorldHeader;
394394
GLHeader GLEngineConstants;
395395

396+
std::string globalUniformBlock;
397+
396398
GLShaderManager() {}
397399
~GLShaderManager();
398400

@@ -414,6 +416,9 @@ class GLShaderManager {
414416
}
415417

416418
shader = new T();
419+
420+
shader->PostProcessUniforms();
421+
417422
_shaders.emplace_back( shader );
418423
_shaderBuildQueue.push( shader );
419424
}
@@ -440,6 +445,8 @@ class GLShaderManager {
440445
void BuildAll( const bool buildOnlyMarked );
441446
void FreeAll();
442447

448+
void PostProcessGlobalUniforms();
449+
443450
void BindBuffers();
444451
private:
445452
struct InfoLogEntry {

src/engine/renderer/tr_shade.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,7 @@ static void GLSL_InitGPUShadersOrError()
382382
gl_fxaaShader->MarkProgramForBuilding( 0 );
383383
}
384384

385+
gl_shaderManager.PostProcessGlobalUniforms();
385386
gl_shaderManager.InitShaders();
386387

387388
if ( r_lazyShaders.Get() == 0 )

src/engine/renderer/tr_vbo.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -760,6 +760,10 @@ void R_InitVBOs()
760760
stagingBuffer.InitGLBuffer();
761761
}
762762

763+
if ( glConfig2.pushBufferAvailable ) {
764+
pushBuffer.InitGLBuffers();
765+
}
766+
763767
GL_CheckErrors();
764768
}
765769

@@ -837,6 +841,10 @@ void R_ShutdownVBOs()
837841
stagingBuffer.FreeGLBuffer();
838842
}
839843

844+
if ( glConfig2.pushBufferAvailable ) {
845+
pushBuffer.FreeGLBuffers();
846+
}
847+
840848
tess.verts = tess.vertsBuffer = nullptr;
841849
tess.indexes = tess.indexesBuffer = nullptr;
842850
}

0 commit comments

Comments
 (0)