diff --git a/renderdoc/core/resource_manager.h b/renderdoc/core/resource_manager.h index 95c6a346e..8afca76ac 100644 --- a/renderdoc/core/resource_manager.h +++ b/renderdoc/core/resource_manager.h @@ -264,7 +264,7 @@ template class ResourceManager : public ResourceRecordHandler { public: - ResourceManager(); + ResourceManager(LogState state, Serialiser *ser); virtual ~ResourceManager(); void Shutdown(); @@ -297,7 +297,7 @@ class ResourceManager : public ResourceRecordHandler void ReleaseInFrameResources(); // insert the chunks for the resources referenced in the frame - void InsertReferencedChunks(Serialiser *ser); + void InsertReferencedChunks(Serialiser *fileSer); // mark resource records as unwritten, ready to be written to a new logfile. void MarkUnwrittenResources(); @@ -329,12 +329,12 @@ class ResourceManager : public ResourceRecordHandler void SetInitialContents(ResourceId id, InitialContentData contents); // generate chunks for initial contents and insert. - void InsertInitialContentsChunks(Serialiser *chunkSer, Serialiser *fileSer); + void InsertInitialContentsChunks(Serialiser *fileSer); // Serialise out which resources need initial contents, along with whether their // initial contents are in the serialised stream (e.g. RTs might still want to be // cleared on frame init). - void Serialise_InitialContentsNeeded(Serialiser *ser); + void Serialise_InitialContentsNeeded(); // handle marking a resource referenced for read or write and storing RAW access etc. @@ -366,7 +366,7 @@ class ResourceManager : public ResourceRecordHandler ResourceId GetLiveID(ResourceId id); // Serialise in which resources need initial contents and set them up. - void CreateInitialContents(Serialiser *ser); + void CreateInitialContents(); // Apply the initial contents for the resources that need them, used at the start of a frame void ApplyInitialContents(); @@ -391,6 +391,9 @@ class ResourceManager : public ResourceRecordHandler virtual void Create_InitialState(ResourceId id, ResourceType live, bool hasData) = 0; virtual void Apply_InitialState(ResourceType live, InitialContentData initial) = 0; + LogState m_State; + Serialiser *m_pSerialiser; + private: bool m_InFrame; @@ -434,10 +437,13 @@ class ResourceManager : public ResourceRecordHandler }; template -ResourceManager::ResourceManager() +ResourceManager::ResourceManager(LogState state, Serialiser *ser) { if(RenderDoc::Inst().GetCrashHandler()) RenderDoc::Inst().GetCrashHandler()->RegisterMemoryRegion(this, sizeof(ResourceManager)); + + m_State = state; + m_pSerialiser = ser; m_InFrame = false; } @@ -642,7 +648,7 @@ typename ResourceManager::InitialContentData ResourceM } template -void ResourceManager::Serialise_InitialContentsNeeded(Serialiser *ser) +void ResourceManager::Serialise_InitialContentsNeeded() { SCOPED_LOCK(m_Lock); @@ -677,30 +683,30 @@ void ResourceManager::Serialise_InitialContentsNeeded( } uint32_t numWritten = (uint32_t)written.size(); - ser->Serialise("NumWrittenResources", numWritten); + m_pSerialiser->Serialise("NumWrittenResources", numWritten); for(auto it=written.begin(); it != written.end(); ++it) { - ser->Serialise("id", it->id); - ser->Serialise("WrittenData", it->written); + m_pSerialiser->Serialise("id", it->id); + m_pSerialiser->Serialise("WrittenData", it->written); } } template -void ResourceManager::CreateInitialContents(Serialiser *ser) +void ResourceManager::CreateInitialContents() { set neededInitials; uint32_t NumWrittenResources = 0; - ser->Serialise("NumWrittenResources", NumWrittenResources); + m_pSerialiser->Serialise("NumWrittenResources", NumWrittenResources); for(uint32_t i=0; i < NumWrittenResources; i++) { ResourceId id = ResourceId(); bool WrittenData = false; - ser->Serialise("id", id); - ser->Serialise("WrittenData", WrittenData); + m_pSerialiser->Serialise("id", id); + m_pSerialiser->Serialise("WrittenData", WrittenData); neededInitials.insert(id); @@ -759,7 +765,7 @@ void ResourceManager::MarkUnwrittenResources() } template -void ResourceManager::InsertReferencedChunks(Serialiser *ser) +void ResourceManager::InsertReferencedChunks(Serialiser *fileSer) { map sortedChunks; @@ -791,7 +797,7 @@ void ResourceManager::InsertReferencedChunks(Serialise for(auto it = sortedChunks.begin(); it != sortedChunks.end(); it++) { - ser->Insert(it->second); + fileSer->Insert(it->second); } RDCDEBUG("inserted to serialiser"); @@ -828,7 +834,7 @@ void ResourceManager::PrepareInitialContents() } template -void ResourceManager::InsertInitialContentsChunks(Serialiser *chunkSerialiser, Serialiser *fileSerialiser) +void ResourceManager::InsertInitialContentsChunks(Serialiser *fileSerialiser) { SCOPED_LOCK(m_Lock); @@ -858,7 +864,7 @@ void ResourceManager::InsertInitialContentsChunks(Seri continue; } - ScopedContext scope(chunkSerialiser, NULL, "Initial Contents", "Initial Contents", INITIAL_CONTENTS, false); + ScopedContext scope(m_pSerialiser, NULL, "Initial Contents", "Initial Contents", INITIAL_CONTENTS, false); Serialise_InitialState(res); @@ -871,7 +877,7 @@ void ResourceManager::InsertInitialContentsChunks(Seri if(Force_InitialState(it->second)) { - ScopedContext scope(chunkSerialiser, NULL, "Initial Contents", "Initial Contents", INITIAL_CONTENTS, false); + ScopedContext scope(m_pSerialiser, NULL, "Initial Contents", "Initial Contents", INITIAL_CONTENTS, false); Serialise_InitialState(it->second); diff --git a/renderdoc/driver/d3d11/d3d11_device.cpp b/renderdoc/driver/d3d11/d3d11_device.cpp index dd928eed8..d7c7e4ffe 100644 --- a/renderdoc/driver/d3d11/d3d11_device.cpp +++ b/renderdoc/driver/d3d11/d3d11_device.cpp @@ -230,6 +230,9 @@ void WrappedID3D11Device::SetLogFile(const wchar_t *logfile) m_pSerialiser = new Serialiser(logfile, Serialiser::READING, debugSerialiser); m_pSerialiser->SetChunkNameLookup(&GetChunkName); m_pImmediateContext->SetSerialiser(m_pSerialiser); + + SAFE_DELETE(m_ResourceManager); + m_ResourceManager = new D3D11ResourceManager(m_State, m_pSerialiser, this); } WrappedID3D11Device::WrappedID3D11Device(ID3D11Device* realDevice, D3D11InitParams *params) @@ -246,7 +249,6 @@ WrappedID3D11Device::WrappedID3D11Device(ID3D11Device* realDevice, D3D11InitPara m_Replay.SetDevice(this); m_DebugManager = NULL; - m_ResourceManager = new D3D11ResourceManager(this); // refcounters implicitly construct with one reference, but we don't start with any soft // references. @@ -296,6 +298,8 @@ WrappedID3D11Device::WrappedID3D11Device(ID3D11Device* realDevice, D3D11InitPara m_pDebugSerialiser = NULL; #endif } + + m_ResourceManager = new D3D11ResourceManager(m_State, m_pSerialiser, this); if(m_pSerialiser) m_pSerialiser->SetChunkNameLookup(&GetChunkName); @@ -876,7 +880,7 @@ void WrappedID3D11Device::Serialise_CaptureScope(uint64_t offset) if(m_State >= WRITING) { - GetResourceManager()->Serialise_InitialContentsNeeded(m_pSerialiser); + GetResourceManager()->Serialise_InitialContentsNeeded(); } else { @@ -887,7 +891,7 @@ void WrappedID3D11Device::Serialise_CaptureScope(uint64_t offset) record.frameInfo.immContextId = GetResourceManager()->GetOriginalID(m_pImmediateContext->GetResourceID()); m_FrameRecord.push_back(record); - GetResourceManager()->CreateInitialContents(m_pSerialiser); + GetResourceManager()->CreateInitialContents(); } } @@ -2660,7 +2664,7 @@ bool WrappedID3D11Device::EndFrameCapture(void *wnd) GetResourceManager()->InsertReferencedChunks(m_pFileSerialiser); - GetResourceManager()->InsertInitialContentsChunks(m_pSerialiser, m_pFileSerialiser); + GetResourceManager()->InsertInitialContentsChunks(m_pFileSerialiser); RDCDEBUG("Creating Capture Scope"); diff --git a/renderdoc/driver/d3d11/d3d11_manager.h b/renderdoc/driver/d3d11/d3d11_manager.h index 9e66d3d02..1b232d5cd 100644 --- a/renderdoc/driver/d3d11/d3d11_manager.h +++ b/renderdoc/driver/d3d11/d3d11_manager.h @@ -116,8 +116,8 @@ private: class D3D11ResourceManager : public ResourceManager { public: - D3D11ResourceManager(WrappedID3D11Device *dev) - : m_Device(dev) + D3D11ResourceManager(LogState state, Serialiser *ser, WrappedID3D11Device *dev) + : ResourceManager(state, ser), m_Device(dev) { } diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 725baf5a0..bbfc53742 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -329,7 +329,7 @@ WrappedOpenGL::WrappedOpenGL(const wchar_t *logfile, const GLHookSet &funcs) m_DeviceRecord = NULL; - m_ResourceManager = new GLResourceManager(this); + m_ResourceManager = new GLResourceManager(m_State, m_pSerialiser, this); m_DeviceResourceID = GetResourceManager()->RegisterResource(GLResource(NULL, eResSpecial, eSpecialResDevice)); m_ContextResourceID = GetResourceManager()->RegisterResource(GLResource(NULL, eResSpecial, eSpecialResContext)); @@ -360,8 +360,6 @@ WrappedOpenGL::WrappedOpenGL(const wchar_t *logfile, const GLHookSet &funcs) m_FakeBB_FBO = 0; m_FakeBB_Color = 0; m_FakeBB_DepthStencil = 0; - - GetResourceManager()->SetSerialiser(m_State, m_pSerialiser); RDCDEBUG("Debug Text enabled - for development! remove before release!"); m_pSerialiser->SetDebugText(true); @@ -660,7 +658,7 @@ void WrappedOpenGL::Present(void *windowHandle) GetResourceManager()->InsertReferencedChunks(m_pFileSerialiser); - GetResourceManager()->InsertInitialContentsChunks(m_pSerialiser, m_pFileSerialiser); + GetResourceManager()->InsertInitialContentsChunks(m_pFileSerialiser); RDCDEBUG("Creating Capture Scope"); @@ -730,7 +728,7 @@ void WrappedOpenGL::Serialise_CaptureScope(uint64_t offset) if(m_State >= WRITING) { - GetResourceManager()->Serialise_InitialContentsNeeded(m_pSerialiser); + GetResourceManager()->Serialise_InitialContentsNeeded(); } else { @@ -741,7 +739,7 @@ void WrappedOpenGL::Serialise_CaptureScope(uint64_t offset) record.frameInfo.immContextId = GetResourceManager()->GetOriginalID(m_ContextResourceID); m_FrameRecord.push_back(record); - GetResourceManager()->CreateInitialContents(m_pSerialiser); + GetResourceManager()->CreateInitialContents(); } } diff --git a/renderdoc/driver/gl/gl_manager.h b/renderdoc/driver/gl/gl_manager.h index cd3d43d62..f88051bfb 100644 --- a/renderdoc/driver/gl/gl_manager.h +++ b/renderdoc/driver/gl/gl_manager.h @@ -34,10 +34,10 @@ class WrappedOpenGL; class GLResourceManager : public ResourceManager { public: - GLResourceManager(WrappedOpenGL *gl) : m_GL(gl), m_SyncName(1) + GLResourceManager(LogState state, Serialiser *ser, WrappedOpenGL *gl) + : ResourceManager(state, ser), m_GL(gl), m_SyncName(1) { m_pSerialiser = NULL; - m_State = READING; } ~GLResourceManager() {} @@ -138,12 +138,6 @@ class GLResourceManager : public ResourceManager return m_SyncIDs[sync]; } - void SetSerialiser(LogState state, Serialiser *ser) - { - m_State = state; - m_pSerialiser = ser; - } - bool Serialise_InitialState(GLResource res); private: @@ -167,9 +161,6 @@ class GLResourceManager : public ResourceManager map m_CurrentSyncs; volatile int64_t m_SyncName; - Serialiser *m_pSerialiser; - LogState m_State; - WrappedOpenGL *m_GL; };