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;
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;
}

View file

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