Skip to content

Commit 8fc40b2

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 f90915a commit 8fc40b2

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

1283-
shader->PostProcessUniforms();
1284-
12851283
shader->_uniformStorageSize = 0;
12861284
for ( std::size_t i = 0; i < shader->_uniforms.size(); i++ ) {
12871285
GLUniform* uniform = shader->_uniforms[i];
@@ -1583,6 +1581,61 @@ void GLShaderManager::GenerateUniformStructDefinesText( const std::vector<GLUnif
15831581
uniformDefines += "\n";
15841582
}
15851583

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

379+
gl_shaderManager.PostProcessGlobalUniforms();
379380
gl_shaderManager.InitShaders();
380381

381382
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)