From 687d74e6c20efa3b66c839365b2431c2a4caf9e4 Mon Sep 17 00:00:00 2001 From: degasus Date: Tue, 15 Jan 2013 14:22:40 +0100 Subject: [PATCH] only change shader if needed --- .../Src/ProgramShaderCache.cpp | 29 +++++++++---------- .../Plugin_VideoOGL/Src/RasterFont.cpp | 2 -- Source/Plugins/Plugin_VideoOGL/Src/Render.cpp | 4 --- 3 files changed, 14 insertions(+), 21 deletions(-) diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 99997b1aa6..b1930570bd 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -131,26 +131,25 @@ void ProgramShaderCache::SetProgramBindings ( ProgramShaderCache::PCacheEntry& e void ProgramShaderCache::SetBothShaders(GLuint PS, GLuint VS) { + if(!PS || !VS) { + ERROR_LOG(VIDEO, "tried to bind a zero shader"); + return; + } + CurrentFShader = PS; CurrentVShader = VS; - if (CurrentFShader == 0 && CurrentVShader == 0) - { - CurrentProgram = 0; - glUseProgram(0); - return; - } - - // Fragment shaders can survive without Vertex Shaders - // We have a valid fragment shader, let's create our program + // We have a valid shaders, let's create our program std::pair ShaderPair = std::make_pair(CurrentFShader, CurrentVShader); PCache::iterator iter = pshaders.find(ShaderPair); if (iter != pshaders.end()) { PCacheEntry &entry = iter->second; - glUseProgram(entry.prog_id); - CurrentShaderProgram = ShaderPair; - CurrentProgram = entry.prog_id; + if(CurrentProgram != entry.prog_id) { + glUseProgram(entry.prog_id); + CurrentProgram = entry.prog_id; + CurrentShaderProgram = ShaderPair; + } return; } @@ -159,9 +158,7 @@ void ProgramShaderCache::SetBothShaders(GLuint PS, GLuint VS) // Right, the program is created now // Let's attach everything - if (entry.vsid != 0) // attaching zero vertex shader makes it freak out - glAttachShader(entry.prog_id, entry.vsid); - + glAttachShader(entry.prog_id, entry.vsid); glAttachShader(entry.prog_id, entry.psid); if (g_ActiveConfig.backend_info.bSupportsGLSLCache) @@ -254,6 +251,8 @@ void ProgramShaderCache::Init(void) ProgramShaderCacheInserter inserter; g_program_disk_cache.OpenAndRead(cache_filename, inserter); } + + CurrentProgram = 0; } void ProgramShaderCache::Shutdown(void) diff --git a/Source/Plugins/Plugin_VideoOGL/Src/RasterFont.cpp b/Source/Plugins/Plugin_VideoOGL/Src/RasterFont.cpp index 3d443f13db..7ac793527c 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/RasterFont.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/RasterFont.cpp @@ -283,8 +283,6 @@ void RasterFont::printMultilineText(const char *text, double start_x, double sta glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texture); glDrawArrays(GL_TRIANGLES, 0, usage/4); - - glUseProgram(0); } } diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp index 069a2a90aa..1e05c0b0b8 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp @@ -1412,8 +1412,6 @@ void Renderer::ResetAPIState() { // Gets us to a reasonably sane state where it's possible to do things like // image copies with textured quads, etc. - ProgramShaderCache::SetBothShaders(0, 0); - glDisable(GL_SCISSOR_TEST); glDisable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); @@ -1434,8 +1432,6 @@ void Renderer::RestoreAPIState() VertexShaderManager::SetViewportChanged(); glPolygonMode(GL_FRONT_AND_BACK, g_ActiveConfig.bWireFrame ? GL_LINE : GL_FILL); - - ProgramShaderCache::SetBothShaders(0, 0); VertexManager *vm = (OGL::VertexManager*)g_vertex_manager; glBindBuffer(GL_ARRAY_BUFFER, vm->m_vertex_buffers);