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.
This commit is contained in:
Unknown W. Brackets 2014-05-04 16:31:57 -07:00
parent 42a7060193
commit e80c63945a
2 changed files with 13 additions and 11 deletions

View file

@ -631,19 +631,16 @@ Shader *ShaderManager::ApplyVertexShader(int prim, u32 vertType) {
VertexShaderID VSID; VertexShaderID VSID;
ComputeVertexShaderID(&VSID, vertType, prim, useHWTransform); ComputeVertexShaderID(&VSID, vertType, prim, useHWTransform);
ComputeFragmentShaderID(&FSID_);
// Just update uniforms if this is the same shader as last time. // Just update uniforms if this is the same shader as last time.
if (lastShader_ != 0 && VSID == lastVSID_ && FSID_ == lastFSID_) { if (lastShader_ != 0 && VSID == lastVSID_) {
lastShader_->UpdateUniforms(vertType); lastVShaderSame_ = true;
lastShaderSame_ = true;
return lastShader_->vs_; // Already all set. return lastShader_->vs_; // Already all set.
} else { } else {
lastShaderSame_ = false; lastVShaderSame_ = false;
} }
lastVSID_ = VSID; lastVSID_ = VSID;
lastFSID_ = FSID_;
VSCache::iterator vsIter = vsCache_.find(VSID); VSCache::iterator vsIter = vsCache_.find(VSID);
Shader *vs; Shader *vs;
@ -674,16 +671,22 @@ Shader *ShaderManager::ApplyVertexShader(int prim, u32 vertType) {
} }
LinkedShader *ShaderManager::ApplyFragmentShader(Shader *vs, 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_; return lastShader_;
}
FSCache::iterator fsIter = fsCache_.find(FSID_); lastFSID_ = FSID;
FSCache::iterator fsIter = fsCache_.find(FSID);
Shader *fs; Shader *fs;
if (fsIter == fsCache_.end()) { if (fsIter == fsCache_.end()) {
// Fragment shader not in cache. Let's compile it. // Fragment shader not in cache. Let's compile it.
GenerateFragmentShader(codeBuffer_); GenerateFragmentShader(codeBuffer_);
fs = new Shader(codeBuffer_, GL_FRAGMENT_SHADER, vs->UseHWTransform()); fs = new Shader(codeBuffer_, GL_FRAGMENT_SHADER, vs->UseHWTransform());
fsCache_[FSID_] = fs; fsCache_[FSID] = fs;
} else { } else {
fs = fsIter->second; fs = fsIter->second;
} }

View file

@ -199,8 +199,7 @@ private:
LinkedShaderCache linkedShaderCache_; LinkedShaderCache linkedShaderCache_;
FragmentShaderID FSID_; bool lastVShaderSame_;
bool lastShaderSame_;
FragmentShaderID lastFSID_; FragmentShaderID lastFSID_;
VertexShaderID lastVSID_; VertexShaderID lastVSID_;