From 88da82baa73238840806c928f9fcb6b43fc643d4 Mon Sep 17 00:00:00 2001 From: baldurk Date: Sun, 26 Apr 2015 21:04:49 +0200 Subject: [PATCH] Actually handle serialised case of program=0 on replay --- renderdoc/driver/gl/gl_driver.h | 1 - .../driver/gl/wrappers/gl_shader_funcs.cpp | 57 ++++++++++++------- 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index 02619e6d9..0aa9cfcf4 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -281,7 +281,6 @@ class WrappedOpenGL : public IFrameCapturer GLbitfield use; }; - vector programs; ResourceId stagePrograms[6]; ResourceId stageShaders[6]; }; diff --git a/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp index 4b5745067..052169248 100644 --- a/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp @@ -851,33 +851,52 @@ bool WrappedOpenGL::Serialise_glUseProgramStages(GLuint pipeline, GLbitfield sta if(m_State < WRITING) { - ResourceId livePipeId = GetResourceManager()->GetLiveID(pipe); - ResourceId liveProgId = GetResourceManager()->GetLiveID(prog); - - PipelineData &pipeDetails = m_Pipelines[livePipeId]; - ProgramData &progDetails = m_Programs[liveProgId]; - - pipeDetails.programs.push_back(PipelineData::ProgramUse(liveProgId, Stages)); - - for(size_t s=0; s < 6; s++) + if(prog != ResourceId()) { - if(Stages & ShaderBit(s)) + ResourceId livePipeId = GetResourceManager()->GetLiveID(pipe); + ResourceId liveProgId = GetResourceManager()->GetLiveID(prog); + + PipelineData &pipeDetails = m_Pipelines[livePipeId]; + ProgramData &progDetails = m_Programs[liveProgId]; + + for(size_t s=0; s < 6; s++) { - for(size_t sh=0; sh < progDetails.shaders.size(); sh++) + if(Stages & ShaderBit(s)) { - if(m_Shaders[ progDetails.shaders[sh] ].type == ShaderEnum(s)) + for(size_t sh=0; sh < progDetails.shaders.size(); sh++) { - pipeDetails.stagePrograms[s] = liveProgId; - pipeDetails.stageShaders[s] = progDetails.shaders[sh]; - break; + if(m_Shaders[ progDetails.shaders[sh] ].type == ShaderEnum(s)) + { + pipeDetails.stagePrograms[s] = liveProgId; + pipeDetails.stageShaders[s] = progDetails.shaders[sh]; + break; + } } } } + + m_Real.glUseProgramStages(GetResourceManager()->GetLiveResource(pipe).name, + Stages, + GetResourceManager()->GetLiveResource(prog).name); + } + else + { + ResourceId livePipeId = GetResourceManager()->GetLiveID(pipe); + PipelineData &pipeDetails = m_Pipelines[livePipeId]; + + for(size_t s=0; s < 6; s++) + { + if(Stages & ShaderBit(s)) + { + pipeDetails.stagePrograms[s] = ResourceId(); + pipeDetails.stageShaders[s] = ResourceId(); + } + } + + m_Real.glUseProgramStages(GetResourceManager()->GetLiveResource(pipe).name, + Stages, + 0); } - - m_Real.glUseProgramStages(GetResourceManager()->GetLiveResource(pipe).name, - Stages, - GetResourceManager()->GetLiveResource(prog).name); } return true;