Skip to content

Commit f355380

Browse files
committed
Defer shader building
This will be required for PushBuffer.
1 parent f8a8f95 commit f355380

File tree

3 files changed

+33
-10
lines changed

3 files changed

+33
-10
lines changed

src/engine/renderer/gl_shader.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2992,7 +2992,7 @@ void GLShader_fxaa::SetShaderProgramUniforms( ShaderProgramDescriptor *shaderPro
29922992

29932993
GLShader_cull::GLShader_cull() :
29942994
GLShader( "cull",
2995-
false, "cull" ),
2995+
false, "cull", true ),
29962996
u_Frame( this ),
29972997
u_ViewID( this ),
29982998
u_SurfaceDescriptorsCount( this ),

src/engine/renderer/gl_shader.h

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ class GLShader {
103103

104104
GLuint std430Size = 0;
105105
uint32_t padding = 0;
106+
107+
const bool worldShader;
106108
protected:
107109
int _activeMacros = 0;
108110
ShaderProgramDescriptor* currentProgram;
@@ -131,19 +133,21 @@ class GLShader {
131133
fragmentShaderName( newFragmentShaderName ),
132134
hasVertexShader( true ),
133135
hasFragmentShader( true ),
134-
hasComputeShader( false ) {
136+
hasComputeShader( false ),
137+
worldShader( false ) {
135138
}
136139

137140
GLShader( const std::string& name,
138141
const bool useMaterialSystem,
139-
const std::string newComputeShaderName ) :
142+
const std::string newComputeShaderName, const bool newWorldShader = false ) :
140143
_name( name ),
141144
_vertexAttribsRequired( 0 ),
142145
_useMaterialSystem( useMaterialSystem ),
143146
computeShaderName( newComputeShaderName ),
144147
hasVertexShader( false ),
145148
hasFragmentShader( false ),
146-
hasComputeShader( true ) {
149+
hasComputeShader( true ),
150+
worldShader( newWorldShader ) {
147151
}
148152

149153
public:
@@ -387,19 +391,34 @@ class GLShaderManager {
387391
void GenerateWorldHeaders();
388392

389393
template<class T>
390-
void LoadShader( T *& shader ) {
391-
if( !deformShaderCount ) {
394+
void LoadShader( T*& shader ) {
395+
if ( !deformShaderCount ) {
392396
Q_UNUSED( GetDeformShaderIndex( nullptr, 0 ) );
393397
initTime = 0;
394398
initCount = 0;
395399
}
396400

397401
shader = new T();
398-
InitShader( shader );
399402
_shaders.emplace_back( shader );
400403
_shaderBuildQueue.push( shader );
401404
}
402405

406+
void InitShaders() {
407+
for ( const std::unique_ptr<GLShader>& shader : _shaders ) {
408+
if ( !shader.get()->worldShader ) {
409+
InitShader( shader.get() );
410+
}
411+
}
412+
}
413+
414+
void InitWorldShaders() {
415+
for ( const std::unique_ptr<GLShader>& shader : _shaders ) {
416+
if ( shader.get()->worldShader ) {
417+
InitShader( shader.get() );
418+
}
419+
}
420+
}
421+
403422
int GetDeformShaderIndex( deformStage_t *deforms, int numDeforms );
404423

405424
bool BuildPermutation( GLShader* shader, int macroIndex, int deformIndex, const bool buildOneShader );

src/engine/renderer/tr_shade.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -190,10 +190,10 @@ void GLSL_InitWorldShaders() {
190190

191191
// Material system shaders that are always loaded if material system is available
192192
if ( glConfig2.usingMaterialSystem ) {
193-
gl_shaderManager.LoadShader( gl_cullShader );
194-
195193
gl_cullShader->MarkProgramForBuilding( 0 );
196194
}
195+
196+
gl_shaderManager.InitWorldShaders();
197197
}
198198

199199
static void GLSL_InitGPUShadersOrError()
@@ -224,6 +224,9 @@ static void GLSL_InitGPUShadersOrError()
224224
gl_shaderManager.LoadShader( gl_lightMappingShaderMaterial );
225225

226226
gl_shaderManager.LoadShader( gl_clearSurfacesShader );
227+
/* Load gl_cullShader so we can post-process it correctly for push buffer,
228+
it will only actually be built in GLSL_InitWorldShaders() */
229+
gl_shaderManager.LoadShader( gl_cullShader );
227230
gl_shaderManager.LoadShader( gl_processSurfacesShader );
228231
gl_shaderManager.LoadShader( gl_depthReductionShader );
229232

@@ -320,7 +323,6 @@ static void GLSL_InitGPUShadersOrError()
320323

321324
gl_contrastShader->MarkProgramForBuilding( 0 );
322325
}
323-
324326

325327
// portal process effect
326328
gl_shaderManager.LoadShader( gl_portalShader );
@@ -371,6 +373,8 @@ static void GLSL_InitGPUShadersOrError()
371373
gl_fxaaShader->MarkProgramForBuilding( 0 );
372374
}
373375

376+
gl_shaderManager.InitShaders();
377+
374378
if ( r_lazyShaders.Get() == 0 )
375379
{
376380
gl_shaderManager.BuildAll( false );

0 commit comments

Comments
 (0)