Skip to content

PushBuffer auxiliary changes #1683

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 2 additions & 12 deletions src/engine/renderer/Material.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -828,12 +828,12 @@ void BindShaderLightMapping( Material* material ) {

// bind u_LightGrid1
if ( material->enableGridLighting ) {
gl_lightMappingShaderMaterial->SetUniform_LightGrid1Bindless( GL_BindToTMU( BIND_LIGHTMAP, tr.lightGrid1Image ) );
gl_lightMappingShaderMaterial->SetUniform_LightGrid1Bindless( GL_BindToTMU( BIND_LIGHTGRID1, tr.lightGrid1Image ) );
}

// bind u_LightGrid2
if ( material->enableGridDeluxeMapping ) {
gl_lightMappingShaderMaterial->SetUniform_LightGrid2Bindless( GL_BindToTMU( BIND_DELUXEMAP, tr.lightGrid2Image ) );
gl_lightMappingShaderMaterial->SetUniform_LightGrid2Bindless( GL_BindToTMU( BIND_LIGHTGRID2, tr.lightGrid2Image ) );
}

if ( glConfig2.realtimeLighting ) {
Expand Down Expand Up @@ -1729,17 +1729,7 @@ void MaterialSystem::Free() {
texData.clear();
dynamicTexData.clear();

R_SyncRenderThread();

surfaceCommandsSSBO.UnmapBuffer();
culledCommandsBuffer.UnmapBuffer();
atomicCommandCountersBuffer.UnmapBuffer();
texDataBuffer.UnmapBuffer();
lightMapDataUBO.UnmapBuffer();

if ( totalPortals > 0 ) {
portalSurfacesSSBO.UnmapBuffer();

for ( PortalView& portalView : portalStack ) {
memset( portalView.views, 0, MAX_VIEWS * sizeof( uint32_t ) );
portalView.count = 0;
Expand Down
151 changes: 83 additions & 68 deletions src/engine/renderer/gl_shader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1514,22 +1514,75 @@ void GLShaderManager::SaveShaderBinary( ShaderProgramDescriptor* descriptor ) {
cacheSaveCount++;
}

std::string GLShaderManager::RemoveUniformsFromShaderText( const std::string& shaderText, const std::vector<GLUniform*>& uniforms ) {
std::istringstream shaderTextStream( shaderText );
std::string shaderMain;

std::string line;
/* Remove local uniform declarations, but avoid removing uniform / storage blocks;
* their values will be sourced from a buffer instead
* Global uniforms (like u_ViewOrigin) will still be set as regular uniforms */
while ( std::getline( shaderTextStream, line, '\n' ) ) {
bool skip = false;
if ( line.find( "uniform" ) < line.find( "//" ) && line.find( ";" ) != std::string::npos ) {
for ( GLUniform* uniform : uniforms ) {
const size_t pos = line.find( uniform->_name );
if ( pos != std::string::npos && !Str::cisalpha( line[pos + uniform->_name.size()] ) ) {
skip = true;
break;
}
}
}

if ( skip ) {
continue;
}

shaderMain += line + "\n";
}

return shaderMain;
}

void GLShaderManager::GenerateUniformStructDefinesText( const std::vector<GLUniform*>& uniforms, const uint32_t padding,
const uint32_t paddingCount, const std::string& definesName,
std::string& uniformStruct, std::string& uniformDefines ) {
for ( GLUniform* uniform : uniforms ) {
uniformStruct += " " + ( uniform->_isTexture ? "uvec2" : uniform->_type ) + " " + uniform->_name;

if ( uniform->_components ) {
uniformStruct += "[" + std::to_string( uniform->_components ) + "]";
}
uniformStruct += ";\n";

uniformDefines += "#define ";
uniformDefines += uniform->_name;

if ( uniform->_isTexture ) {
uniformDefines += "_initial";
}

uniformDefines += " " + definesName + ".";
uniformDefines += uniform->_name;

uniformDefines += "\n";
}

// Array of structs is aligned to the largest member of the struct
for ( uint32_t i = 0; i < padding; i++ ) {
uniformStruct += " int uniform_padding" + std::to_string( i + paddingCount );
uniformStruct += ";\n";
}

uniformDefines += "\n";
}

// This will generate all the extra code for material system shaders
std::string GLShaderManager::ShaderPostProcess( GLShader *shader, const std::string& shaderText, const uint32_t offset ) {
if ( !shader->std430Size ) {
return shaderText;
}

std::string newShaderText;
std::string materialStruct = "\nstruct Material {\n";
// 6 kb for materials
const uint32_t count = ( 4096 + 2048 ) / shader->GetSTD430Size();
std::string materialBlock = "layout(std140, binding = "
+ std::to_string( BufferBind::MATERIALS )
+ ") uniform materialsUBO {\n"
" Material materials[" + std::to_string( count ) + "]; \n"
"};\n\n";

std::string texBuf = glConfig2.maxUniformBlockSize >= MIN_MATERIAL_UBO_SIZE ?
"layout(std140, binding = "
+ std::to_string( BufferBind::TEX_DATA )
Expand Down Expand Up @@ -1569,7 +1622,6 @@ std::string GLShaderManager::ShaderPostProcess( GLShader *shader, const std::str
"};\n\n"
"#define u_LightMap_initial lightMapData[( baseInstance >> 24 ) & 0xFF].u_LightMap\n"
"#define u_DeluxeMap_initial lightMapData[( baseInstance >> 24 ) & 0xFF].u_DeluxeMap\n\n";
std::string materialDefines;

/* Generate the struct and defines in the form of:
* struct Material {
Expand All @@ -1582,62 +1634,24 @@ std::string GLShaderManager::ShaderPostProcess( GLShader *shader, const std::str
* #define uniformx materials[baseInstance].uniformx
*/

for( GLUniform* uniform : shader->_materialSystemUniforms ) {
materialStruct += " " + uniform->_type + " " + uniform->_name;

if ( uniform->_components ) {
materialStruct += "[" + std::to_string( uniform->_components ) + "]";
}
materialStruct += ";\n";

materialDefines += "#define ";
materialDefines += uniform->_name;

materialDefines += " materials[baseInstance & 0xFFF].";
materialDefines += uniform->_name;

materialDefines += "\n";
}

// Array of structs is aligned to the largest member of the struct
for ( uint i = 0; i < shader->padding; i++ ) {
materialStruct += " int material_padding" + std::to_string( i );
materialStruct += ";\n";
}
std::string materialStruct = "\nstruct Material {\n";
std::string materialDefines;
GenerateUniformStructDefinesText( shader->_materialSystemUniforms, shader->padding,
0, "materials[baseInstance & 0xFFF]", materialStruct, materialDefines );

materialStruct += "};\n\n";
materialDefines += "\n";

std::istringstream shaderTextStream( shaderText );
std::string shaderMain;

std::string line;

/* Remove local uniform declarations, but avoid removing uniform / storage blocks;
* their values will be sourced from a buffer instead
* Global uniforms (like u_ViewOrigin) will still be set as regular uniforms */
while( std::getline( shaderTextStream, line, '\n' ) ) {
bool skip = false;
if ( line.find( "uniform" ) < line.find( "//" ) && line.find( ";" ) != std::string::npos ) {
for ( GLUniform* uniform : shader->_materialSystemUniforms ) {
const size_t pos = line.find( uniform->_name );
if ( pos != std::string::npos && !Str::cisalpha( line[pos + strlen( uniform->_name.c_str() )] ) ) {
skip = true;
break;
}
}
}

if ( skip ) {
continue;
}

shaderMain += line + "\n";
}
// 6 kb for materials
const uint32_t count = ( 4096 + 2048 ) / shader->GetSTD430Size();
std::string materialBlock = "layout(std140, binding = "
+ std::to_string( BufferBind::MATERIALS )
+ ") uniform materialsUBO {\n"
" Material materials[" + std::to_string( count ) + "]; \n"
"};\n\n";

materialDefines += "\n";
std::string shaderMain = RemoveUniformsFromShaderText( shaderText, shader->_materialSystemUniforms );

newShaderText = "#define USE_MATERIAL_SYSTEM\n" + materialStruct + materialBlock + texDataBlock + materialDefines;
std::string newShaderText = "#define USE_MATERIAL_SYSTEM\n" + materialStruct + materialBlock + texDataBlock + materialDefines;
shaderMain.insert( offset, newShaderText );
return shaderMain;
}
Expand Down Expand Up @@ -2455,9 +2469,9 @@ void GLShader_lightMapping::SetShaderProgramUniforms( ShaderProgramDescriptor *s
glUniform1i( glGetUniformLocation( shaderProgram->id, "u_HeightMap" ), BIND_HEIGHTMAP );
glUniform1i( glGetUniformLocation( shaderProgram->id, "u_MaterialMap" ), BIND_MATERIALMAP );
glUniform1i( glGetUniformLocation( shaderProgram->id, "u_LightMap" ), BIND_LIGHTMAP );
glUniform1i( glGetUniformLocation( shaderProgram->id, "u_LightGrid1" ), BIND_LIGHTMAP );
glUniform1i( glGetUniformLocation( shaderProgram->id, "u_LightGrid1" ), BIND_LIGHTGRID1 );
glUniform1i( glGetUniformLocation( shaderProgram->id, "u_DeluxeMap" ), BIND_DELUXEMAP );
glUniform1i( glGetUniformLocation( shaderProgram->id, "u_LightGrid2" ), BIND_DELUXEMAP );
glUniform1i( glGetUniformLocation( shaderProgram->id, "u_LightGrid2" ), BIND_LIGHTGRID2 );
glUniform1i( glGetUniformLocation( shaderProgram->id, "u_GlowMap" ), BIND_GLOWMAP );
glUniform1i( glGetUniformLocation( shaderProgram->id, "u_EnvironmentMap0" ), BIND_ENVIRONMENTMAP0 );
glUniform1i( glGetUniformLocation( shaderProgram->id, "u_EnvironmentMap1" ), BIND_ENVIRONMENTMAP1 );
Expand Down Expand Up @@ -2950,7 +2964,7 @@ void GLShader_depthtile1::SetShaderProgramUniforms( ShaderProgramDescriptor *sha
GLShader_depthtile2::GLShader_depthtile2() :
GLShader( "depthtile2", ATTR_POSITION,
false, "screenSpace", "depthtile2" ),
u_DepthMap( this ) {
u_DepthTile1( this ) {
}

void GLShader_depthtile2::SetShaderProgramUniforms( ShaderProgramDescriptor *shaderProgram )
Expand All @@ -2961,7 +2975,7 @@ void GLShader_depthtile2::SetShaderProgramUniforms( ShaderProgramDescriptor *sha
GLShader_lighttile::GLShader_lighttile() :
GLShader( "lighttile", ATTR_POSITION | ATTR_TEXCOORD,
false, "lighttile", "lighttile" ),
u_DepthMap( this ),
u_DepthTile2( this ),
u_Lights( this ),
u_numLights( this ),
u_lightLayer( this ),
Expand Down Expand Up @@ -2992,7 +3006,7 @@ void GLShader_fxaa::SetShaderProgramUniforms( ShaderProgramDescriptor *shaderPro

GLShader_cull::GLShader_cull() :
GLShader( "cull",
false, "cull" ),
false, "cull", true ),
u_Frame( this ),
u_ViewID( this ),
u_SurfaceDescriptorsCount( this ),
Expand All @@ -3015,11 +3029,12 @@ GLShader_depthReduction::GLShader_depthReduction() :
false, "depthReduction" ),
u_ViewWidth( this ),
u_ViewHeight( this ),
u_DepthMap( this ),
u_InitialDepthLevel( this ) {
}

void GLShader_depthReduction::SetShaderProgramUniforms( ShaderProgramDescriptor* shaderProgram ) {
glUniform1i( glGetUniformLocation( shaderProgram->id, "depthTextureInitial" ), 0 );
glUniform1i( glGetUniformLocation( shaderProgram->id, "u_DepthMap" ), 0 );
}

GLShader_clearSurfaces::GLShader_clearSurfaces() :
Expand Down
Loading