mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
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:
parent
42a7060193
commit
e80c63945a
2 changed files with 13 additions and 11 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -199,8 +199,7 @@ private:
|
||||||
|
|
||||||
LinkedShaderCache linkedShaderCache_;
|
LinkedShaderCache linkedShaderCache_;
|
||||||
|
|
||||||
FragmentShaderID FSID_;
|
bool lastVShaderSame_;
|
||||||
bool lastShaderSame_;
|
|
||||||
|
|
||||||
FragmentShaderID lastFSID_;
|
FragmentShaderID lastFSID_;
|
||||||
VertexShaderID lastVSID_;
|
VertexShaderID lastVSID_;
|
||||||
|
|
Loading…
Add table
Reference in a new issue