mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-05-13 13:30:44 +00:00
Pass through chunk serialiser and log state to ResourceManager
This commit is contained in:
@@ -264,7 +264,7 @@ template<typename ResourceType, typename RecordType>
|
||||
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<typename ResourceType, typename RecordType>
|
||||
ResourceManager<ResourceType, RecordType>::ResourceManager()
|
||||
ResourceManager<ResourceType, RecordType>::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<ResourceType, RecordType>::InitialContentData ResourceM
|
||||
}
|
||||
|
||||
template<typename ResourceType, typename RecordType>
|
||||
void ResourceManager<ResourceType, RecordType>::Serialise_InitialContentsNeeded(Serialiser *ser)
|
||||
void ResourceManager<ResourceType, RecordType>::Serialise_InitialContentsNeeded()
|
||||
{
|
||||
SCOPED_LOCK(m_Lock);
|
||||
|
||||
@@ -677,30 +683,30 @@ void ResourceManager<ResourceType, RecordType>::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<typename ResourceType, typename RecordType>
|
||||
void ResourceManager<ResourceType, RecordType>::CreateInitialContents(Serialiser *ser)
|
||||
void ResourceManager<ResourceType, RecordType>::CreateInitialContents()
|
||||
{
|
||||
set<ResourceId> 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<ResourceType, RecordType>::MarkUnwrittenResources()
|
||||
}
|
||||
|
||||
template<typename ResourceType, typename RecordType>
|
||||
void ResourceManager<ResourceType, RecordType>::InsertReferencedChunks(Serialiser *ser)
|
||||
void ResourceManager<ResourceType, RecordType>::InsertReferencedChunks(Serialiser *fileSer)
|
||||
{
|
||||
map<int32_t,Chunk*> sortedChunks;
|
||||
|
||||
@@ -791,7 +797,7 @@ void ResourceManager<ResourceType, RecordType>::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<ResourceType, RecordType>::PrepareInitialContents()
|
||||
}
|
||||
|
||||
template<typename ResourceType, typename RecordType>
|
||||
void ResourceManager<ResourceType, RecordType>::InsertInitialContentsChunks(Serialiser *chunkSerialiser, Serialiser *fileSerialiser)
|
||||
void ResourceManager<ResourceType, RecordType>::InsertInitialContentsChunks(Serialiser *fileSerialiser)
|
||||
{
|
||||
SCOPED_LOCK(m_Lock);
|
||||
|
||||
@@ -858,7 +864,7 @@ void ResourceManager<ResourceType, RecordType>::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<ResourceType, RecordType>::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);
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
|
||||
@@ -116,8 +116,8 @@ private:
|
||||
class D3D11ResourceManager : public ResourceManager<ID3D11DeviceChild*, D3D11ResourceRecord>
|
||||
{
|
||||
public:
|
||||
D3D11ResourceManager(WrappedID3D11Device *dev)
|
||||
: m_Device(dev)
|
||||
D3D11ResourceManager(LogState state, Serialiser *ser, WrappedID3D11Device *dev)
|
||||
: ResourceManager(state, ser), m_Device(dev)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -34,10 +34,10 @@ class WrappedOpenGL;
|
||||
class GLResourceManager : public ResourceManager<GLResource, GLResourceRecord>
|
||||
{
|
||||
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<GLResource, GLResourceRecord>
|
||||
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<GLResource, GLResourceRecord>
|
||||
map<GLuint, GLsync> m_CurrentSyncs;
|
||||
volatile int64_t m_SyncName;
|
||||
|
||||
Serialiser *m_pSerialiser;
|
||||
LogState m_State;
|
||||
|
||||
WrappedOpenGL *m_GL;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user