Skip to content

Commit 275cca8

Browse files
committed
Improve shader building
Previously, the GLSL shader building was done in the following manner: 1. When the renderer is started, some of the shader source was initialised/processed. This included the main shader text, #insert's, and material system post-processing. 2. When `buildAll()` was called, all permutations with empty deform shaders were built. The deform shaders themselves are loaded either at the start (for the default, empty one), or when the map itself is being loaded. These permutations included adding macros to shaders in the form of `#ifndef #define #endif`, and attaching the default deform shader. When possible, shader program binaries were saved/loaded to/from disk. 3. UI shader and non-0 deform shaders were built on-demand. There were multiple issues with that system: 1. Shader caches were unreliable. This is likely because the checksum was calculated *before* macros and such were added to the shader text. 2. Every shader permutation was always compiled and linked every time. 3. Shader programs with non-0 deformVertexes were never cached. This commit changes the underlying system to use an `std::vector` of shader program descriptors, and another one for shader descriptors. The initialisation/building of shaders is now more generic for each type, and as a result each unique shader is only compiled once. The permutations are still linked each time (unless downloaded from cache), but this change lays the foundation to easily add shader pipelines, which would solve this problem. Shader cache binaries are now identified by each shader compiled into the corresponding shader program, which allows caching non-0 deformVertexes too. This also fixes the incorrect #line numbers emitted by #insert due to macros and such being added after #insert is processed. Also adds more information into how many shader/shader programs were built and how much time it took (there's currently a small discrepancy, because the output is shown at the end of `BuildAll()`, but is gathered every time `BuildPermutation()` or `InitShader()` is called).
1 parent d636984 commit 275cca8

File tree

14 files changed

+1072
-836
lines changed

14 files changed

+1072
-836
lines changed

src/engine/renderer/gl_shader.cpp

Lines changed: 684 additions & 554 deletions
Large diffs are not rendered by default.

src/engine/renderer/gl_shader.h

Lines changed: 319 additions & 206 deletions
Large diffs are not rendered by default.

src/engine/renderer/glsl_source/cull_cp.glsl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ layout (local_size_x = 64, local_size_y = 1, local_size_z = 1) in;
4242

4343
layout(binding = 0) uniform sampler2D depthImage;
4444

45+
struct SurfaceDescriptor {
46+
BoundingSphere boundingSphere;
47+
uint surfaceCommandIDs[MAX_SURFACE_COMMANDS];
48+
};
49+
4550
layout(std430, binding = BIND_SURFACE_DESCRIPTORS) readonly restrict buffer surfaceDescriptorsSSBO {
4651
SurfaceDescriptor surfaces[];
4752
};

src/engine/renderer/glsl_source/fogQuake3_vp.glsl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ void DeformVertex( inout vec4 pos,
4444
inout vec3 normal,
4545
inout vec2 st,
4646
inout vec4 color,
47-
in float time);
47+
in float time );
4848

49-
void main()
49+
void main()
5050
{
5151
#insert material_vp
5252

@@ -63,7 +63,7 @@ void main()
6363
LB.normal,
6464
texCoord,
6565
color,
66-
u_Time);
66+
u_Time );
6767

6868
// transform vertex position into homogenous clip-space
6969
gl_Position = u_ModelViewProjectionMatrix * position;

src/engine/renderer/glsl_source/generic_vp.glsl

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@ void DeformVertex( inout vec4 pos,
5555
inout vec3 normal,
5656
inout vec2 st,
5757
inout vec4 color,
58-
in float time);
58+
in float time );
5959

60-
void main()
60+
void main()
6161
{
6262
#insert material_vp
6363

@@ -72,11 +72,7 @@ void main()
7272
color = color * ColorModulateToColor( u_ColorModulateColorGen, lightFactor )
7373
+ unpackUnorm4x8( u_Color ) * vec4( lightFactor, lightFactor, lightFactor, 1.0 );
7474

75-
DeformVertex( position,
76-
LB.normal,
77-
texCoord,
78-
color,
79-
u_Time);
75+
DeformVertex( position, LB.normal, texCoord, color, u_Time );
8076

8177
// transform vertex position into homogenous clip-space
8278
gl_Position = u_ModelViewProjectionMatrix * position;

src/engine/renderer/glsl_source/lightMapping_vp.glsl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ OUT(smooth) vec3 var_Normal;
6464

6565
OUT(smooth) vec4 var_Color;
6666

67-
void DeformVertex(inout vec4 pos, inout vec3 normal, inout vec2 st, inout vec4 color, in float time);
67+
void DeformVertex( inout vec4 pos, inout vec3 normal, inout vec2 st, inout vec4 color, in float time );
6868

6969
void main()
7070
{
@@ -78,7 +78,7 @@ void main()
7878

7979
color = color * ColorModulateToColor( u_ColorModulateColorGen ) + unpackUnorm4x8( u_Color );
8080

81-
DeformVertex(position, LB.normal, texCoord, color, u_Time);
81+
DeformVertex( position, LB.normal, texCoord, color, u_Time );
8282

8383
// transform vertex position into homogenous clip-space
8484
gl_Position = u_ModelViewProjectionMatrix * position;

src/engine/renderer/glsl_source/material_cp.glsl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,10 @@ struct BoundingSphere {
3939
float radius;
4040
};
4141

42-
struct SurfaceDescriptor {
42+
/* struct SurfaceDescriptor {
4343
BoundingSphere boundingSphere;
4444
uint surfaceCommandIDs[MAX_SURFACE_COMMANDS];
45-
};
45+
}; */
4646

4747
struct PortalSurface {
4848
BoundingSphere boundingSphere;

src/engine/renderer/tr_backend.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ GLuint64 BindAnimatedImage( int unit, const textureBundle_t *bundle )
120120
return GL_BindToTMU( unit, bundle->image[ index ] );
121121
}
122122

123-
void GL_BindProgram( shaderProgram_t *program )
123+
void GL_BindProgram( ShaderProgramDescriptor* program )
124124
{
125125
if ( !program )
126126
{
@@ -130,7 +130,7 @@ void GL_BindProgram( shaderProgram_t *program )
130130

131131
if ( glState.currentProgram != program )
132132
{
133-
glUseProgram( program->program );
133+
glUseProgram( program->id );
134134
glState.currentProgram = program;
135135
}
136136
}
@@ -1378,7 +1378,7 @@ static void RB_SetupLightForShadowing( trRefLight_t *light, int index,
13781378
bool shadowClip )
13791379
{
13801380
// HACK: bring OpenGL into a safe state or strange FBO update problems will occur
1381-
GL_BindProgram( nullptr );
1381+
GL_BindNullProgram();
13821382
GL_State( GLS_DEFAULT );
13831383

13841384
GL_Bind( tr.whiteImage );

src/engine/renderer/tr_bsp.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5081,6 +5081,7 @@ void RE_LoadWorldMap( const char *name )
50815081

50825082
Q_strncpyz( s_worldData.baseName, COM_SkipPath( s_worldData.name ), sizeof( s_worldData.name ) );
50835083
COM_StripExtension3( s_worldData.baseName, s_worldData.baseName, sizeof( s_worldData.baseName ) );
5084+
tr.loadingMap = s_worldData.baseName;
50845085

50855086
startMarker = (byte*) ri.Hunk_Alloc( 0, ha_pref::h_low );
50865087

@@ -5239,6 +5240,7 @@ void RE_LoadWorldMap( const char *name )
52395240
}
52405241

52415242
tr.worldLoaded = true;
5243+
tr.loadingMap = "";
52425244
GLSL_InitWorldShaders();
52435245

52445246
if ( glConfig2.reflectionMappingAvailable ) {

src/engine/renderer/tr_init.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -874,7 +874,7 @@ ScreenshotCmd screenshotPNGRegistration("screenshotPNG", ssFormat_t::SSF_PNG, "p
874874
glState.vertexAttribsState = 0;
875875
glState.vertexAttribPointersSet = 0;
876876

877-
GL_BindProgram( nullptr );
877+
GL_BindNullProgram();
878878

879879
glBindBuffer( GL_ARRAY_BUFFER, 0 );
880880
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 );
@@ -1137,7 +1137,7 @@ ScreenshotCmd screenshotPNGRegistration("screenshotPNG", ssFormat_t::SSF_PNG, "p
11371137
}
11381138

11391139
int deformIndex =
1140-
gl_shaderManager.getDeformShaderIndex( shader.deforms, shader.numDeforms );
1140+
gl_shaderManager.GetDeformShaderIndex( shader.deforms, shader.numDeforms );
11411141

11421142
for ( shaderStage_t *stage = shader.stages; stage != shader.lastStage; stage++ )
11431143
{

0 commit comments

Comments
 (0)