summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authordegasus <wickmarkus@web.de>2013-01-15 17:10:43 +0100
committerdegasus <wickmarkus@web.de>2013-01-15 23:42:24 +0100
commitbb200acdd8a346f561b33f091d139724b562de23 (patch)
tree267cb98b0d4a95499710486f1504eb32c39ee358 /Source
parent9165ac5a679762fe9a4a23a506149610b31bc6ed (diff)
also don't search in the shader cache if the shader isn't changed
Diffstat (limited to 'Source')
-rw-r--r--Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp25
-rw-r--r--Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.h2
2 files changed, 14 insertions, 13 deletions
diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp
index b1930570bd..c6e309d359 100644
--- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp
+++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp
@@ -21,7 +21,7 @@
namespace OGL
{
-GLuint ProgramShaderCache::CurrentFShader = 0, ProgramShaderCache::CurrentVShader = 0, ProgramShaderCache::CurrentProgram = 0;
+GLuint ProgramShaderCache::CurrentProgram = 0;
ProgramShaderCache::PCache ProgramShaderCache::pshaders;
GLuint ProgramShaderCache::s_ps_vs_ubo;
GLintptr ProgramShaderCache::s_vs_data_offset;
@@ -136,25 +136,23 @@ void ProgramShaderCache::SetBothShaders(GLuint PS, GLuint VS)
return;
}
- CurrentFShader = PS;
- CurrentVShader = VS;
-
- // We have a valid shaders, let's create our program
- std::pair<u32, u32> ShaderPair = std::make_pair(CurrentFShader, CurrentVShader);
+ std::pair<u32, u32> ShaderPair = std::make_pair(PS, VS);
+
+ // program is already bound
+ if(ShaderPair == CurrentShaderProgram) return;
+
PCache::iterator iter = pshaders.find(ShaderPair);
if (iter != pshaders.end())
{
PCacheEntry &entry = iter->second;
- if(CurrentProgram != entry.prog_id) {
- glUseProgram(entry.prog_id);
- CurrentProgram = entry.prog_id;
- CurrentShaderProgram = ShaderPair;
- }
+ glUseProgram(entry.prog_id);
+ CurrentProgram = entry.prog_id;
+ CurrentShaderProgram = ShaderPair;
return;
}
PCacheEntry entry;
- entry.Create(CurrentFShader, CurrentVShader);
+ entry.Create(PS, VS);
// Right, the program is created now
// Let's attach everything
@@ -253,6 +251,7 @@ void ProgramShaderCache::Init(void)
}
CurrentProgram = 0;
+ CurrentShaderProgram = std::pair<u32,u32>(0,0);
}
void ProgramShaderCache::Shutdown(void)
@@ -270,6 +269,8 @@ void ProgramShaderCache::Shutdown(void)
g_program_disk_cache.Close();
}
+ glUseProgram(0);
+
PCache::iterator iter = pshaders.begin();
for (; iter != pshaders.end(); ++iter)
iter->second.Destroy();
diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.h b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.h
index 9f5fae4df0..00a95457ba 100644
--- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.h
+++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.h
@@ -150,7 +150,7 @@ private:
typedef std::map<ShaderUID, PCacheEntry> PCache;
static PCache pshaders;
- static GLuint CurrentFShader, CurrentVShader, CurrentProgram;
+ static GLuint CurrentProgram;
static ShaderUID CurrentShaderProgram;
static GLuint s_ps_vs_ubo;