@@ -897,8 +897,7 @@ static bool IsUnusedPermutation( const char *compileMacros )
897897void GLShaderManager::buildPermutation ( GLShader *shader, int macroIndex, int deformIndex )
898898{
899899 std::string compileMacros;
900- int startTime = ri.Milliseconds ();
901- int endTime;
900+ int startTime = ri.Milliseconds ();
902901 size_t i = macroIndex + ( deformIndex << shader->_compileMacros .size () );
903902
904903 // program already exists
@@ -913,36 +912,28 @@ void GLShaderManager::buildPermutation( GLShader *shader, int macroIndex, int de
913912 shader->BuildShaderCompileMacros ( compileMacros );
914913
915914 if ( IsUnusedPermutation ( compileMacros.c_str () ) )
915+ {
916916 return ;
917+ }
917918
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+ }
920923
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 ;
923926
924- if ( deformIndex > 0 )
927+ if ( ( deformIndex > 0 ) || ! LoadShaderBinary ( shader, i ) )
925928 {
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];
938930
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+ }
946937 }
947938
948939 UpdateShaderProgramUniformLocations ( shader, shaderProgram );
@@ -952,7 +943,7 @@ void GLShaderManager::buildPermutation( GLShader *shader, int macroIndex, int de
952943
953944 GL_CheckErrors ();
954945
955- endTime = ri.Milliseconds ();
946+ int endTime = ri.Milliseconds ();
956947 _totalBuildTime += ( endTime - startTime );
957948 }
958949}
@@ -966,9 +957,8 @@ void GLShaderManager::buildAll()
966957 std::string shaderName = shader.GetMainShaderName ();
967958
968959 size_t numPermutations = static_cast <size_t >(1 ) << shader.GetNumOfCompiledMacros ();
969- size_t i;
970960
971- for ( i = 0 ; i < numPermutations; i++ )
961+ for ( size_t i = 0 ; i < numPermutations; i++ )
972962 {
973963 buildPermutation ( &shader, i, 0 );
974964 }
@@ -1052,29 +1042,41 @@ bool GLShaderManager::LoadShaderBinary( GLShader *shader, size_t programNum )
10521042 const byte *binaryptr;
10531043 GLBinaryHeader shaderHeader;
10541044
1055- if (!GetShaderPath ().empty ())
1045+ if ( !GetShaderPath ().empty () )
1046+ {
10561047 return false ;
1048+ }
10571049
10581050 // don't even try if the necessary functions aren't available
1059- if ( !glConfig2.getProgramBinaryAvailable )
1051+ if ( !glConfig2.getProgramBinaryAvailable )
1052+ {
10601053 return false ;
1054+ }
10611055
1062- if (_shaderBinaryCacheInvalidated)
1056+ if ( _shaderBinaryCacheInvalidated )
1057+ {
10631058 return false ;
1059+ }
10641060
10651061 std::error_code err;
10661062
10671063 std::string shaderFilename = Str::Format (" glsl/%s/%s_%u.bin" , shader->GetName (), shader->GetName (), (unsigned int )programNum);
10681064 FS::File shaderFile = FS::HomePath::OpenRead (shaderFilename, err);
1069- if (err)
1065+ if ( err )
1066+ {
10701067 return false ;
1068+ }
10711069
10721070 std::string shaderData = shaderFile.ReadAll (err);
1073- if (err)
1071+ if ( err )
1072+ {
10741073 return false ;
1074+ }
10751075
1076- if (shaderData.size () < sizeof (shaderHeader))
1076+ if ( shaderData.size () < sizeof ( shaderHeader ) )
1077+ {
10771078 return false ;
1079+ }
10781080
10791081 binaryptr = reinterpret_cast <const byte*>(shaderData.data ());
10801082
@@ -1095,18 +1097,24 @@ bool GLShaderManager::LoadShaderBinary( GLShader *shader, size_t programNum )
10951097
10961098 // make sure this shader uses the same number of macros
10971099 if ( shaderHeader.numMacros != shader->GetNumOfCompiledMacros () )
1100+ {
10981101 return false ;
1102+ }
10991103
11001104 // make sure this shader uses the same macros
11011105 for ( unsigned int i = 0 ; i < shaderHeader.numMacros ; i++ )
11021106 {
11031107 if ( shader->_compileMacros [ i ]->GetType () != shaderHeader.macros [ i ] )
1108+ {
11041109 return false ;
1110+ }
11051111 }
11061112
11071113 // make sure the checksums for the source code match
11081114 if ( shaderHeader.checkSum != shader->_checkSum )
1115+ {
11091116 return false ;
1117+ }
11101118
11111119 if ( shaderHeader.binaryLength != shaderData.size () - sizeof ( shaderHeader ) )
11121120 {
@@ -1121,7 +1129,9 @@ bool GLShaderManager::LoadShaderBinary( GLShader *shader, size_t programNum )
11211129 glGetProgramiv ( shaderProgram->program , GL_LINK_STATUS, &success );
11221130
11231131 if ( !success )
1132+ {
11241133 return false ;
1134+ }
11251135
11261136 return true ;
11271137#else
@@ -1138,8 +1148,10 @@ void GLShaderManager::SaveShaderBinary( GLShader *shader, size_t programNum )
11381148 GLBinaryHeader shaderHeader{}; // Zero init.
11391149 shaderProgram_t *shaderProgram;
11401150
1141- if (!GetShaderPath ().empty ())
1151+ if ( !GetShaderPath ().empty () )
1152+ {
11421153 return ;
1154+ }
11431155
11441156 // don't even try if the necessary functions aren't available
11451157 if ( !glConfig2.getProgramBinaryAvailable )
@@ -1175,15 +1187,15 @@ void GLShaderManager::SaveShaderBinary( GLShader *shader, size_t programNum )
11751187
11761188 for ( unsigned int i = 0 ; i < shaderHeader.numMacros ; i++ )
11771189 {
1178- shaderHeader.macros [ i ] = shader->_compileMacros [ i ]->GetType ();
1190+ shaderHeader.macros [i ] = shader->_compileMacros [ i ]->GetType ();
11791191 }
11801192
11811193 shaderHeader.binaryLength = binaryLength;
11821194 shaderHeader.checkSum = shader->_checkSum ;
11831195 shaderHeader.driverVersionHash = _driverVersionHash;
11841196
11851197 // write the header to the buffer
1186- memcpy (binary, &shaderHeader, sizeof ( shaderHeader ) );
1198+ memcpy ( binary, &shaderHeader, sizeof ( shaderHeader ) );
11871199
11881200 auto fileName = Str::Format (" glsl/%s/%s_%u.bin" , shader->GetName (), shader->GetName (), (unsigned int )programNum);
11891201 ri.FS_WriteFile (fileName.c_str (), binary, binarySize);
@@ -1248,21 +1260,25 @@ void GLShaderManager::CompileGPUShaders( GLShader *shader, shaderProgram_t *prog
12481260 }
12491261}
12501262
1251- void GLShaderManager::CompileAndLinkGPUShaderProgram ( GLShader *shader, shaderProgram_t *program,
1263+ void GLShaderManager::CompileAndLinkGPUShaderProgram ( GLShader *shader, shaderProgram_t *program, shaderProgram_t* baseProgram,
12521264 Str::StringRef compileMacros, int deformIndex )
12531265{
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+ }
12551271
12561272 program->program = glCreateProgram ();
12571273 if ( shader->_hasVertexShader ) {
1258- glAttachShader ( program->program , program ->VS );
1274+ glAttachShader ( program->program , baseProgram ->VS );
12591275 glAttachShader ( program->program , _deformShaders[ deformIndex ] );
12601276 }
12611277 if ( shader->_hasFragmentShader ) {
1262- glAttachShader ( program->program , program ->FS );
1278+ glAttachShader ( program->program , baseProgram ->FS );
12631279 }
12641280 if ( shader->_hasComputeShader ) {
1265- glAttachShader ( program->program , program ->CS );
1281+ glAttachShader ( program->program , baseProgram ->CS );
12661282 }
12671283
12681284 BindAttribLocations ( program->program );
0 commit comments