Skip to content

Commit a03668f

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 45db1ed commit a03668f

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
@@ -1276,8 +1276,6 @@ std::string GLShaderManager::BuildShaderText( const std::string& mainShaderText,
12761276
void 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 = "\nstruct 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
15831636
std::string GLShaderManager::ShaderPostProcess( GLShader *shader, const std::string& shaderText, const uint32_t offset ) {
15841637
if ( !shader->std430Size ) {

src/engine/renderer/gl_shader.h

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

394+
std::string globalUniformBlock;
395+
394396
GLShaderManager() {}
395397
~GLShaderManager();
396398

@@ -412,6 +414,9 @@ class GLShaderManager {
412414
}
413415

414416
shader = new T();
417+
418+
shader->PostProcessUniforms();
419+
415420
_shaders.emplace_back( shader );
416421
_shaderBuildQueue.push( shader );
417422
}
@@ -438,6 +443,8 @@ class GLShaderManager {
438443
void BuildAll( const bool buildOnlyMarked );
439444
void FreeAll();
440445

446+
void PostProcessGlobalUniforms();
447+
441448
void BindBuffers();
442449
private:
443450
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)