@@ -897,8 +897,7 @@ static bool IsUnusedPermutation( const char *compileMacros )
897
897
void GLShaderManager::buildPermutation ( GLShader *shader, int macroIndex, int deformIndex )
898
898
{
899
899
std::string compileMacros;
900
- int startTime = ri.Milliseconds ();
901
- int endTime;
900
+ int startTime = ri.Milliseconds ();
902
901
size_t i = macroIndex + ( deformIndex << shader->_compileMacros .size () );
903
902
904
903
// program already exists
@@ -913,36 +912,28 @@ void GLShaderManager::buildPermutation( GLShader *shader, int macroIndex, int de
913
912
shader->BuildShaderCompileMacros ( compileMacros );
914
913
915
914
if ( IsUnusedPermutation ( compileMacros.c_str () ) )
915
+ {
916
916
return ;
917
+ }
917
918
918
- if ( i >= shader->_shaderPrograms .size () )
919
- shader->_shaderPrograms .resize ( (deformIndex + 1 ) << shader->_compileMacros .size () );
919
+ if ( i >= shader->_shaderPrograms .size () )
920
+ {
921
+ shader->_shaderPrograms .resize ( ( deformIndex + 1 ) << shader->_compileMacros .size () );
922
+ }
920
923
921
- shaderProgram_t *shaderProgram = &shader->_shaderPrograms [ i ];
922
- shaderProgram->attribs = shader->_vertexAttribsRequired ; // | _vertexAttribsOptional;
924
+ shaderProgram_t *shaderProgram = &shader->_shaderPrograms [i ];
925
+ shaderProgram->attribs = shader->_vertexAttribsRequired ;
923
926
924
- if ( deformIndex > 0 )
927
+ if ( ( deformIndex > 0 ) || ! LoadShaderBinary ( shader, i ) )
925
928
{
926
- shaderProgram_t *baseShader = &shader->_shaderPrograms [ macroIndex ];
927
- if ( ( !baseShader->VS && shader->_hasVertexShader ) || ( !baseShader->FS && shader->_hasFragmentShader ) )
928
- CompileGPUShaders ( shader, baseShader, compileMacros );
929
-
930
- shaderProgram->program = glCreateProgram ();
931
- if ( shader->_hasVertexShader ) {
932
- glAttachShader ( shaderProgram->program , baseShader->VS );
933
- glAttachShader ( shaderProgram->program , _deformShaders[deformIndex] );
934
- }
935
- if ( shader->_hasFragmentShader ) {
936
- glAttachShader ( shaderProgram->program , baseShader->FS );
937
- }
929
+ shaderProgram_t* baseProgram = &shader->_shaderPrograms [macroIndex];
938
930
939
- BindAttribLocations ( shaderProgram->program );
940
- LinkProgram ( shaderProgram->program );
941
- }
942
- else if ( !LoadShaderBinary ( shader, i ) )
943
- {
944
- CompileAndLinkGPUShaderProgram ( shader, shaderProgram, compileMacros, deformIndex );
945
- SaveShaderBinary ( shader, i );
931
+ CompileAndLinkGPUShaderProgram ( shader, shaderProgram, baseProgram, compileMacros, deformIndex );
932
+
933
+ if ( deformIndex == 0 )
934
+ {
935
+ SaveShaderBinary ( shader, i );
936
+ }
946
937
}
947
938
948
939
UpdateShaderProgramUniformLocations ( shader, shaderProgram );
@@ -952,7 +943,7 @@ void GLShaderManager::buildPermutation( GLShader *shader, int macroIndex, int de
952
943
953
944
GL_CheckErrors ();
954
945
955
- endTime = ri.Milliseconds ();
946
+ int endTime = ri.Milliseconds ();
956
947
_totalBuildTime += ( endTime - startTime );
957
948
}
958
949
}
@@ -966,9 +957,8 @@ void GLShaderManager::buildAll()
966
957
std::string shaderName = shader.GetMainShaderName ();
967
958
968
959
size_t numPermutations = static_cast <size_t >(1 ) << shader.GetNumOfCompiledMacros ();
969
- size_t i;
970
960
971
- for ( i = 0 ; i < numPermutations; i++ )
961
+ for ( size_t i = 0 ; i < numPermutations; i++ )
972
962
{
973
963
buildPermutation ( &shader, i, 0 );
974
964
}
@@ -1052,29 +1042,41 @@ bool GLShaderManager::LoadShaderBinary( GLShader *shader, size_t programNum )
1052
1042
const byte *binaryptr;
1053
1043
GLBinaryHeader shaderHeader;
1054
1044
1055
- if (!GetShaderPath ().empty ())
1045
+ if ( !GetShaderPath ().empty () )
1046
+ {
1056
1047
return false ;
1048
+ }
1057
1049
1058
1050
// don't even try if the necessary functions aren't available
1059
- if ( !glConfig2.getProgramBinaryAvailable )
1051
+ if ( !glConfig2.getProgramBinaryAvailable )
1052
+ {
1060
1053
return false ;
1054
+ }
1061
1055
1062
- if (_shaderBinaryCacheInvalidated)
1056
+ if ( _shaderBinaryCacheInvalidated )
1057
+ {
1063
1058
return false ;
1059
+ }
1064
1060
1065
1061
std::error_code err;
1066
1062
1067
1063
std::string shaderFilename = Str::Format (" glsl/%s/%s_%u.bin" , shader->GetName (), shader->GetName (), (unsigned int )programNum);
1068
1064
FS::File shaderFile = FS::HomePath::OpenRead (shaderFilename, err);
1069
- if (err)
1065
+ if ( err )
1066
+ {
1070
1067
return false ;
1068
+ }
1071
1069
1072
1070
std::string shaderData = shaderFile.ReadAll (err);
1073
- if (err)
1071
+ if ( err )
1072
+ {
1074
1073
return false ;
1074
+ }
1075
1075
1076
- if (shaderData.size () < sizeof (shaderHeader))
1076
+ if ( shaderData.size () < sizeof ( shaderHeader ) )
1077
+ {
1077
1078
return false ;
1079
+ }
1078
1080
1079
1081
binaryptr = reinterpret_cast <const byte*>(shaderData.data ());
1080
1082
@@ -1095,18 +1097,24 @@ bool GLShaderManager::LoadShaderBinary( GLShader *shader, size_t programNum )
1095
1097
1096
1098
// make sure this shader uses the same number of macros
1097
1099
if ( shaderHeader.numMacros != shader->GetNumOfCompiledMacros () )
1100
+ {
1098
1101
return false ;
1102
+ }
1099
1103
1100
1104
// make sure this shader uses the same macros
1101
1105
for ( unsigned int i = 0 ; i < shaderHeader.numMacros ; i++ )
1102
1106
{
1103
1107
if ( shader->_compileMacros [ i ]->GetType () != shaderHeader.macros [ i ] )
1108
+ {
1104
1109
return false ;
1110
+ }
1105
1111
}
1106
1112
1107
1113
// make sure the checksums for the source code match
1108
1114
if ( shaderHeader.checkSum != shader->_checkSum )
1115
+ {
1109
1116
return false ;
1117
+ }
1110
1118
1111
1119
if ( shaderHeader.binaryLength != shaderData.size () - sizeof ( shaderHeader ) )
1112
1120
{
@@ -1121,7 +1129,9 @@ bool GLShaderManager::LoadShaderBinary( GLShader *shader, size_t programNum )
1121
1129
glGetProgramiv ( shaderProgram->program , GL_LINK_STATUS, &success );
1122
1130
1123
1131
if ( !success )
1132
+ {
1124
1133
return false ;
1134
+ }
1125
1135
1126
1136
return true ;
1127
1137
#else
@@ -1138,8 +1148,10 @@ void GLShaderManager::SaveShaderBinary( GLShader *shader, size_t programNum )
1138
1148
GLBinaryHeader shaderHeader{}; // Zero init.
1139
1149
shaderProgram_t *shaderProgram;
1140
1150
1141
- if (!GetShaderPath ().empty ())
1151
+ if ( !GetShaderPath ().empty () )
1152
+ {
1142
1153
return ;
1154
+ }
1143
1155
1144
1156
// don't even try if the necessary functions aren't available
1145
1157
if ( !glConfig2.getProgramBinaryAvailable )
@@ -1175,15 +1187,15 @@ void GLShaderManager::SaveShaderBinary( GLShader *shader, size_t programNum )
1175
1187
1176
1188
for ( unsigned int i = 0 ; i < shaderHeader.numMacros ; i++ )
1177
1189
{
1178
- shaderHeader.macros [ i ] = shader->_compileMacros [ i ]->GetType ();
1190
+ shaderHeader.macros [i ] = shader->_compileMacros [ i ]->GetType ();
1179
1191
}
1180
1192
1181
1193
shaderHeader.binaryLength = binaryLength;
1182
1194
shaderHeader.checkSum = shader->_checkSum ;
1183
1195
shaderHeader.driverVersionHash = _driverVersionHash;
1184
1196
1185
1197
// write the header to the buffer
1186
- memcpy (binary, &shaderHeader, sizeof ( shaderHeader ) );
1198
+ memcpy ( binary, &shaderHeader, sizeof ( shaderHeader ) );
1187
1199
1188
1200
auto fileName = Str::Format (" glsl/%s/%s_%u.bin" , shader->GetName (), shader->GetName (), (unsigned int )programNum);
1189
1201
ri.FS_WriteFile (fileName.c_str (), binary, binarySize);
@@ -1248,21 +1260,25 @@ void GLShaderManager::CompileGPUShaders( GLShader *shader, shaderProgram_t *prog
1248
1260
}
1249
1261
}
1250
1262
1251
- void GLShaderManager::CompileAndLinkGPUShaderProgram ( GLShader *shader, shaderProgram_t *program,
1263
+ void GLShaderManager::CompileAndLinkGPUShaderProgram ( GLShader *shader, shaderProgram_t *program, shaderProgram_t* baseProgram,
1252
1264
Str::StringRef compileMacros, int deformIndex )
1253
1265
{
1254
- GLShaderManager::CompileGPUShaders ( shader, program, compileMacros );
1266
+ if ( ( !baseProgram->VS && shader->_hasVertexShader ) || ( !baseProgram->FS && shader->_hasFragmentShader )
1267
+ || ( !baseProgram->CS && shader->_hasComputeShader ) )
1268
+ {
1269
+ CompileGPUShaders ( shader, baseProgram, compileMacros );
1270
+ }
1255
1271
1256
1272
program->program = glCreateProgram ();
1257
1273
if ( shader->_hasVertexShader ) {
1258
- glAttachShader ( program->program , program ->VS );
1274
+ glAttachShader ( program->program , baseProgram ->VS );
1259
1275
glAttachShader ( program->program , _deformShaders[ deformIndex ] );
1260
1276
}
1261
1277
if ( shader->_hasFragmentShader ) {
1262
- glAttachShader ( program->program , program ->FS );
1278
+ glAttachShader ( program->program , baseProgram ->FS );
1263
1279
}
1264
1280
if ( shader->_hasComputeShader ) {
1265
- glAttachShader ( program->program , program ->CS );
1281
+ glAttachShader ( program->program , baseProgram ->CS );
1266
1282
}
1267
1283
1268
1284
BindAttribLocations ( program->program );
0 commit comments