From bd5cf8868610a7fe5060a85d62da33a28eb9a22b Mon Sep 17 00:00:00 2001
From: Shawn Hoffman <godisgovernment@gmail.com>
Date: Thu, 29 Dec 2011 16:25:03 +0100
Subject: [PATCH] let us try normal c++ static init instead...

---
 .../Src/ProgramShaderCache.cpp                | 13 ++--------
 .../Plugin_VideoOGL/Src/ProgramShaderCache.h  | 26 +++++++++++++------
 2 files changed, 20 insertions(+), 19 deletions(-)

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<ProgramShaderCache::ShaderUID, u8> g_program_disk_cache;
 GLenum ProgramFormat;
 
+GLuint ProgramShaderCache::PCacheEntry::prog_format = ProgramShaderCache::PCacheEntry::SetProgramFormat();
+
 std::pair<u32, u32> 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);
 };