Pass through chunk serialiser and log state to ResourceManager

This commit is contained in:
baldurk
2014-09-25 01:29:39 +01:00
parent c1cb2c7333
commit aaaf9ae908
5 changed files with 41 additions and 42 deletions
+25 -19
View File
@@ -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);
+8 -4
View File
@@ -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");
+2 -2
View File
@@ -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)
{
}
+4 -6
View File
@@ -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();
}
}
+2 -11
View File
@@ -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;
};