From 49836d5fcc6fdc47418308b87df0077fda3f72b2 Mon Sep 17 00:00:00 2001 From: baldurk Date: Sat, 11 Jul 2015 18:57:22 +0200 Subject: [PATCH] Make sure to mark programs bound to pipelines as frame referenced --- renderdoc/core/resource_manager.h | 6 ++++++ renderdoc/driver/gl/gl_renderstate.cpp | 6 ++++++ 2 files changed, 12 insertions(+) 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);