diff --git a/renderdoc/core/resource_manager.h b/renderdoc/core/resource_manager.h index aad53c636..5bf8bb306 100644 --- a/renderdoc/core/resource_manager.h +++ b/renderdoc/core/resource_manager.h @@ -105,6 +105,12 @@ struct ResourceRecord mgr->MarkDirtyResource((*it)->GetResourceID()); } + void MarkParentsReferenced(ResourceRecordHandler *mgr, FrameRefType refType) + { + for(auto it = Parents.begin(); it != Parents.end(); ++it) + mgr->MarkResourceFrameReferenced((*it)->GetResourceID(), refType); + } + void FreeParents(ResourceRecordHandler *mgr) { for(auto it = Parents.begin(); it != Parents.end(); ++it) diff --git a/renderdoc/driver/gl/gl_renderstate.cpp b/renderdoc/driver/gl/gl_renderstate.cpp index 191e2e1fe..3c143f3f6 100644 --- a/renderdoc/driver/gl/gl_renderstate.cpp +++ b/renderdoc/driver/gl/gl_renderstate.cpp @@ -347,6 +347,12 @@ void GLRenderState::MarkReferenced(WrappedOpenGL *gl, bool initial) const manager->MarkResourceFrameReferenced(ProgramRes(ctx, Program), initial ? eFrameRef_Unknown : eFrameRef_Read); manager->MarkResourceFrameReferenced(ProgramPipeRes(ctx, Pipeline), initial ? eFrameRef_Unknown : 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(ProgramPipeRes(ctx, Pipeline)); + if(record) + record->MarkParentsReferenced(manager, initial ? eFrameRef_Unknown : eFrameRef_Read); + for(size_t i=0; i < ARRAY_COUNT(BufferBindings); i++) manager->MarkResourceFrameReferenced(BufferRes(ctx, BufferBindings[i]), initial ? eFrameRef_Unknown : eFrameRef_Read);