From c48578fdd90873aa10430f3d155dd7e09ee4f0d7 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 5 Sep 2019 15:06:32 +0100 Subject: [PATCH] Add new location remapping when editing shaders on GL * If they're autogenerated then unfortunately the locations in a shader can change over edits depending on what the shader is doing. We need to remap across this as well as composing that onto any capture-replay remapping. --- renderdoc/driver/gl/gl_common.h | 3 ++- renderdoc/driver/gl/gl_driver.cpp | 21 +++++++++++++++++++-- renderdoc/driver/gl/gl_program_iterate.cpp | 5 +++-- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index 2f5729ab7..8cc482a55 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -849,7 +849,8 @@ struct PerStageReflections }; void CopyProgramUniforms(const PerStageReflections &srcStages, GLuint progSrc, - const PerStageReflections &dstStages, GLuint progDst); + const PerStageReflections &dstStages, GLuint progDst, + std::map *locTranslate = NULL); template void SerialiseProgramUniforms(SerialiserType &ser, CaptureState state, const PerStageReflections &stages, GLuint prog, diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 8dd5d8ed7..44845c4a8 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -1660,8 +1660,25 @@ void WrappedOpenGL::ReplaceResource(ResourceId from, ResourceId to) PerStageReflections dstStages; FillReflectionArray(progdstid, dstStages); - // copy uniforms - CopyProgramUniforms(stages, progsrc, dstStages, progdst); + std::map translate; + + // copy uniforms and set up new location translation table + CopyProgramUniforms(stages, progsrc, dstStages, progdst, &translate); + + // start with the original location translation table, to account for any + // capture-replay translation + m_Programs[progdstid].locationTranslate = m_Programs[progsrcid].locationTranslate; + + // compose on the one from editing. + for(auto lit = m_Programs[progdstid].locationTranslate.begin(); + lit != m_Programs[progdstid].locationTranslate.end(); lit++) + { + auto lit2 = translate.find(lit->second); + if(lit2 != translate.end()) + lit->second = lit2->second; + else + lit->second = -1; + } ResourceId origsrcid = GetResourceManager()->GetOriginalID(progsrcid); diff --git a/renderdoc/driver/gl/gl_program_iterate.cpp b/renderdoc/driver/gl/gl_program_iterate.cpp index a65cacfa0..fd56f022c 100644 --- a/renderdoc/driver/gl/gl_program_iterate.cpp +++ b/renderdoc/driver/gl/gl_program_iterate.cpp @@ -1254,12 +1254,13 @@ static void ForAllProgramUniforms(SerialiserType *ser, CaptureState state, } void CopyProgramUniforms(const PerStageReflections &srcStages, GLuint progSrc, - const PerStageReflections &dstStages, GLuint progDst) + const PerStageReflections &dstStages, GLuint progDst, + std::map *locTranslate) { const bool CopyUniforms = true; const bool SerialiseUniforms = false; ForAllProgramUniforms( - NULL, CaptureState::ActiveReplaying, srcStages, progSrc, dstStages, progDst, NULL); + NULL, CaptureState::ActiveReplaying, srcStages, progSrc, dstStages, progDst, locTranslate); } template