Skip to content

Commit 9b67639

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 d610008 commit 9b67639

File tree

3 files changed

+73
-2
lines changed

3 files changed

+73
-2
lines changed

src/engine/renderer/gl_shader.cpp

Lines changed: 65 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,10 @@ void GLShaderManager::FreeAll() {
268268
{
269269
_shaderBuildQueue.pop();
270270
}
271+
272+
if ( glConfig2.pushBufferAvailable ) {
273+
pushBuffer.FreeGLBuffers();
274+
}
271275
}
272276

273277
void GLShaderManager::UpdateShaderProgramUniformLocations( GLShader* shader, ShaderProgramDescriptor* shaderProgram ) const {
@@ -1275,8 +1279,6 @@ std::string GLShaderManager::BuildShaderText( const std::string& mainShaderText,
12751279
void GLShaderManager::InitShader( GLShader* shader ) {
12761280
const int start = Sys::Milliseconds();
12771281

1278-
shader->PostProcessUniforms();
1279-
12801282
shader->_uniformStorageSize = 0;
12811283
for ( std::size_t i = 0; i < shader->_uniforms.size(); i++ ) {
12821284
GLUniform* uniform = shader->_uniforms[i];
@@ -1578,6 +1580,67 @@ void GLShaderManager::GenerateUniformStructDefinesText( const std::vector<GLUnif
15781580
uniformDefines += "\n";
15791581
}
15801582

1583+
void GLShaderManager::PostProcessGlobalUniforms() {
1584+
std::string uniformStruct = "\nstruct 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+
15811644
// This will generate all the extra code for material system shaders
15821645
std::string GLShaderManager::ShaderPostProcess( GLShader *shader, const std::string& shaderText, const uint32_t offset ) {
15831646
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 )

0 commit comments

Comments
 (0)