From e80c63945a3d37b17abc7ff25bb29b9082a31c85 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 4 May 2014 16:31:57 -0700 Subject: [PATCH] Make sure to gen the frag shader matching the id. Otherwise, the frag shader might be generated accounting for different vertexFullAlpha values, or otherwise won't match up with the id, since we change flags between the two Apply calls. --- GPU/GLES/ShaderManager.cpp | 21 ++++++++++++--------- GPU/GLES/ShaderManager.h | 3 +-- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/GPU/GLES/ShaderManager.cpp b/GPU/GLES/ShaderManager.cpp index 6d9e894c2c..08c4d41dee 100644 --- a/GPU/GLES/ShaderManager.cpp +++ b/GPU/GLES/ShaderManager.cpp @@ -631,19 +631,16 @@ Shader *ShaderManager::ApplyVertexShader(int prim, u32 vertType) { VertexShaderID VSID; ComputeVertexShaderID(&VSID, vertType, prim, useHWTransform); - ComputeFragmentShaderID(&FSID_); // Just update uniforms if this is the same shader as last time. - if (lastShader_ != 0 && VSID == lastVSID_ && FSID_ == lastFSID_) { - lastShader_->UpdateUniforms(vertType); - lastShaderSame_ = true; + if (lastShader_ != 0 && VSID == lastVSID_) { + lastVShaderSame_ = true; return lastShader_->vs_; // Already all set. } else { - lastShaderSame_ = false; + lastVShaderSame_ = false; } lastVSID_ = VSID; - lastFSID_ = FSID_; VSCache::iterator vsIter = vsCache_.find(VSID); Shader *vs; @@ -674,16 +671,22 @@ Shader *ShaderManager::ApplyVertexShader(int prim, u32 vertType) { } LinkedShader *ShaderManager::ApplyFragmentShader(Shader *vs, int prim, u32 vertType) { - if (lastShaderSame_) + FragmentShaderID FSID; + ComputeFragmentShaderID(&FSID); + if (lastVShaderSame_ && FSID == lastFSID_) { + lastShader_->UpdateUniforms(vertType); return lastShader_; + } - FSCache::iterator fsIter = fsCache_.find(FSID_); + lastFSID_ = FSID; + + FSCache::iterator fsIter = fsCache_.find(FSID); Shader *fs; if (fsIter == fsCache_.end()) { // Fragment shader not in cache. Let's compile it. GenerateFragmentShader(codeBuffer_); fs = new Shader(codeBuffer_, GL_FRAGMENT_SHADER, vs->UseHWTransform()); - fsCache_[FSID_] = fs; + fsCache_[FSID] = fs; } else { fs = fsIter->second; } diff --git a/GPU/GLES/ShaderManager.h b/GPU/GLES/ShaderManager.h index 2a7bba13c3..b589b66f90 100644 --- a/GPU/GLES/ShaderManager.h +++ b/GPU/GLES/ShaderManager.h @@ -199,8 +199,7 @@ private: LinkedShaderCache linkedShaderCache_; - FragmentShaderID FSID_; - bool lastShaderSame_; + bool lastVShaderSame_; FragmentShaderID lastFSID_; VertexShaderID lastVSID_;