From 2245957e385fdc8ac153b665d7b3894d02a9c2cd Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 12 Aug 2019 17:23:29 +0100 Subject: [PATCH] Fix referencing of program pipeline bound programs in renderstate --- renderdoc/driver/gl/gl_renderstate.cpp | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/renderdoc/driver/gl/gl_renderstate.cpp b/renderdoc/driver/gl/gl_renderstate.cpp index 3f335df9b..bf1017f89 100644 --- a/renderdoc/driver/gl/gl_renderstate.cpp +++ b/renderdoc/driver/gl/gl_renderstate.cpp @@ -484,12 +484,22 @@ void GLRenderState::MarkReferenced(WrappedOpenGL *driver, bool initial) const manager->MarkResourceFrameReferenced(Program, initial ? eFrameRef_None : eFrameRef_Read); manager->MarkResourceFrameReferenced(Pipeline, initial ? eFrameRef_None : eFrameRef_Read); - // the pipeline correctly has program parents, but we must also mark the programs as frame - // referenced so that their - // initial contents will be serialised. - GLResourceRecord *record = manager->GetResourceRecord(Pipeline); - if(record) - record->MarkParentsReferenced(manager, initial ? eFrameRef_None : eFrameRef_Read); + { + // mark all the sub programs referenced + GLenum programBinds[] = { + eGL_VERTEX_SHADER, eGL_FRAGMENT_SHADER, eGL_GEOMETRY_SHADER, + eGL_TESS_CONTROL_SHADER, eGL_TESS_EVALUATION_SHADER, eGL_COMPUTE_SHADER, + }; + + for(GLenum progbind : programBinds) + { + GLuint prog = 0; + GL.glGetProgramPipelineiv(Pipeline.name, progbind, (GLint *)&prog); + if(prog) + manager->MarkResourceFrameReferenced(ProgramRes(driver->GetCtx(), prog), + initial ? eFrameRef_None : eFrameRef_Read); + } + } for(size_t i = 0; i < ARRAY_COUNT(BufferBindings); i++) manager->MarkResourceFrameReferenced(BufferBindings[i],