diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 57470959d2..b178157a89 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -25,11 +25,12 @@ GLuint ProgramShaderCache::CurrentFShader = 0, ProgramShaderCache::CurrentVShade ProgramShaderCache::PCache ProgramShaderCache::pshaders; GLuint ProgramShaderCache::s_ps_vs_ubo; GLintptr ProgramShaderCache::s_vs_data_offset; -GLenum ProgramShaderCache::prog_format; LinearDiskCache g_program_disk_cache; GLenum ProgramFormat; +GLuint ProgramShaderCache::PCacheEntry::prog_format = ProgramShaderCache::PCacheEntry::SetProgramFormat(); + std::pair ProgramShaderCache::CurrentShaderProgram; const char *UniformNames[NUM_UNIFORMS] = { @@ -214,16 +215,6 @@ void ProgramShaderCache::Init(void) // Read our shader cache, only if supported if (g_ActiveConfig.backend_info.bSupportsGLSLCache) { - GLint Supported; - glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &Supported); - - GLint *Formats = new GLint[Supported]; - glGetIntegerv(GL_PROGRAM_BINARY_FORMATS, Formats); - // We don't really care about format - // We just need the correct data type - prog_format = (GLenum)Formats[0]; - delete[] Formats; - char cache_filename[MAX_PATH]; sprintf(cache_filename, "%sogl-%s-shaders.cache", File::GetUserPath(D_SHADERCACHE_IDX).c_str(), SConfig::GetInstance().m_LocalCoreStartupParameter.m_strUniqueID.c_str()); diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.h b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.h index 6ea72c05dd..07e77e3eae 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.h +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.h @@ -41,6 +41,7 @@ public: struct PCacheEntry { GLuint prog_id; + static GLenum prog_format; u8 *binary; GLint binary_size; GLuint vsid, psid; @@ -74,15 +75,26 @@ public: glGetProgramiv(prog_id, GL_PROGRAM_BINARY_LENGTH, &binary_size); } + // No idea how necessary this is + static GLenum SetProgramFormat() + { + GLint Supported; + glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &Supported); + + GLint *Formats = new GLint[Supported]; + glGetIntegerv(GL_PROGRAM_BINARY_FORMATS, Formats); + // We don't really care about format + GLenum prog_format = (GLenum)Formats[0]; + delete[] Formats; + return prog_format; + } + u8 *GetProgram() { UpdateSize(); FreeProgram(); binary = new u8[binary_size]; - GLenum _form; - glGetProgramBinary(prog_id, binary_size, NULL, &_form, binary); - if (_form != prog_format) - ERROR_LOG(VIDEO, "Returned format not the same as expected! %d vs %d", _form, prog_format); + glGetProgramBinary(prog_id, binary_size, NULL, &prog_format, binary); return binary; } @@ -119,7 +131,8 @@ private: // But it is fine, no need to worry about that PCacheEntry entry; entry.Create(key.first, key.second); - glProgramBinary(entry.prog_id, prog_format, value, value_size); + + glProgramBinary(entry.prog_id, entry.prog_format, value, value_size); GLint success; glGetProgramiv(entry.prog_id, GL_LINK_STATUS, &success); @@ -141,9 +154,6 @@ private: static GLuint s_ps_vs_ubo; static GLintptr s_vs_data_offset; - - static GLenum prog_format; - static void SetProgramVariables(PCacheEntry &entry); };