Skip to content

Commit 79d4de4

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 04757d6 commit 79d4de4

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
@@ -1275,8 +1275,6 @@ std::string GLShaderManager::BuildShaderText( const std::string& mainShaderText,
12751275
void GLShaderManager::InitShader( GLShader* shader ) {
12761276
const int start = Sys::Milliseconds();
12771277

1278-
shader->PostProcessUniforms();
1279-
12801278
shader->_uniformStorageSize = 0;
12811279
for ( std::size_t i = 0; i < shader->_uniforms.size(); i++ ) {
12821280
GLUniform* uniform = shader->_uniforms[i];
@@ -1578,6 +1576,61 @@ void GLShaderManager::GenerateUniformStructDefinesText( const std::vector<GLUnif
15781576
uniformDefines += "\n";
15791577
}
15801578

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

src/engine/renderer/gl_shader.h

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

393+
std::string globalUniformBlock;
394+
393395
GLShaderManager() {}
394396
~GLShaderManager();
395397

@@ -411,6 +413,9 @@ class GLShaderManager {
411413
}
412414

413415
shader = new T();
416+
417+
shader->PostProcessUniforms();
418+
414419
_shaders.emplace_back( shader );
415420
_shaderBuildQueue.push( shader );
416421
}
@@ -437,6 +442,8 @@ class GLShaderManager {
437442
void BuildAll( const bool buildOnlyMarked );
438443
void FreeAll();
439444

445+
void PostProcessGlobalUniforms();
446+
440447
void BindBuffers();
441448
private:
442449
struct InfoLogEntry {

src/engine/renderer/tr_shade.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,7 @@ static void GLSL_InitGPUShadersOrError()
375375
gl_fxaaShader->MarkProgramForBuilding( 0 );
376376
}
377377

378+
gl_shaderManager.PostProcessGlobalUniforms();
378379
gl_shaderManager.InitShaders();
379380

380381
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
@@ -766,6 +766,10 @@ void R_InitVBOs()
766766
stagingBuffer.InitGLBuffer();
767767
}
768768

769+
if ( glConfig2.pushBufferAvailable ) {
770+
pushBuffer.InitGLBuffers();
771+
}
772+
769773
GL_CheckErrors();
770774
}
771775

@@ -842,6 +846,10 @@ void R_ShutdownVBOs()
842846
stagingBuffer.FreeGLBuffer();
843847
}
844848

849+
if ( glConfig2.pushBufferAvailable ) {
850+
pushBuffer.FreeGLBuffers();
851+
}
852+
845853
tess.verts = tess.vertsBuffer = nullptr;
846854
tess.indexes = tess.indexesBuffer = nullptr;
847855
}

0 commit comments

Comments
 (0)