Fix crash returning serialiser's structured file to dummy driver

* If we hit a fatal error during initialisation, the structured file pointer
  still points at the temporary serialiser's structured file. It's not until we
  finish loading that we swap it into the driver-stored file that we can safely
  return and detach ownership of.
This commit is contained in:
baldurk
2021-09-17 14:29:05 +01:00
parent bffeb08a86
commit 1b42dcc05f
12 changed files with 34 additions and 25 deletions
+1 -1
View File
@@ -89,7 +89,7 @@ public:
}
IReplayDriver *MakeDummyDriver()
{
IReplayDriver *ret = new DummyDriver(this, {});
IReplayDriver *ret = new DummyDriver(this, {}, m_File);
// lose our structured file reference
m_File = NULL;
return ret;
+1 -1
View File
@@ -2804,7 +2804,7 @@ IReplayDriver *ReplayProxy::MakeDummyDriver()
shaders.push_back(it->second);
m_ShaderReflectionCache.clear();
IReplayDriver *dummy = new DummyDriver(this, shaders);
IReplayDriver *dummy = new DummyDriver(this, shaders, m_StructuredFile);
// the dummy driver now owns the file, remove our reference
m_StructuredFile = NULL;
+6 -1
View File
@@ -661,7 +661,12 @@ public:
void UnlockForChunkRemoval();
SDFile *GetStructuredFile() { return m_StructuredFile; }
void DetachStructuredFile() { m_StoredStructuredData = m_StructuredFile = NULL; }
SDFile *DetachStructuredFile()
{
SDFile *ret = m_StoredStructuredData;
m_StoredStructuredData = m_StructuredFile = NULL;
return ret;
}
uint64_t GetTimeBase() { return m_TimeBase; }
double GetTimeFrequency() { return m_TimeFrequency; }
void FirstFrame(IDXGISwapper *swapper);
+1 -4
View File
@@ -95,10 +95,7 @@ IReplayDriver *D3D11Replay::MakeDummyDriver()
rdcarray<ShaderReflection *> shaders;
WrappedID3D11Shader<ID3D11ComputeShader>::GetReflections(shaders);
IReplayDriver *dummy = new DummyDriver(this, shaders);
// the dummy driver now owns the file, remove our reference
m_pDevice->DetachStructuredFile();
IReplayDriver *dummy = new DummyDriver(this, shaders, m_pDevice->DetachStructuredFile());
return dummy;
}
+6 -1
View File
@@ -931,7 +931,12 @@ public:
m_State = CaptureState::StructuredExport;
}
SDFile *GetStructuredFile() { return m_StructuredFile; }
void DetachStructuredFile() { m_StoredStructuredData = m_StructuredFile = NULL; }
SDFile *DetachStructuredFile()
{
SDFile *ret = m_StoredStructuredData;
m_StoredStructuredData = m_StructuredFile = NULL;
return ret;
}
uint64_t GetTimeBase() { return m_TimeBase; }
double GetTimeFrequency() { return m_TimeFrequency; }
// interface for DXGI
+1 -4
View File
@@ -126,10 +126,7 @@ IReplayDriver *D3D12Replay::MakeDummyDriver()
rdcarray<ShaderReflection *> shaders;
WrappedID3D12Shader::GetReflections(shaders);
IReplayDriver *dummy = new DummyDriver(this, shaders);
// the dummy driver now owns the file, remove our reference
m_pDevice->DetachStructuredFile();
IReplayDriver *dummy = new DummyDriver(this, shaders, m_pDevice->DetachStructuredFile());
return dummy;
}
+6 -1
View File
@@ -634,7 +634,12 @@ public:
m_State = CaptureState::StructuredExport;
}
SDFile *GetStructuredFile() { return m_StructuredFile; }
void DetachStructuredFile() { m_StoredStructuredData = m_StructuredFile = NULL; }
SDFile *DetachStructuredFile()
{
SDFile *ret = m_StoredStructuredData;
m_StoredStructuredData = m_StructuredFile = NULL;
return ret;
}
void SetFetchCounters(bool in) { m_FetchCounters = in; };
void SetDebugMsgContext(const rdcstr &context) { m_DebugMsgContext = context; }
void AddDebugMessage(DebugMessage msg)
+1 -4
View File
@@ -102,10 +102,7 @@ IReplayDriver *GLReplay::MakeDummyDriver()
it->second.reflection = NULL;
}
IReplayDriver *dummy = new DummyDriver(this, shaders);
// the dummy driver now owns the file, remove our reference
m_pDriver->DetachStructuredFile();
IReplayDriver *dummy = new DummyDriver(this, shaders, m_pDriver->DetachStructuredFile());
return dummy;
}
+6 -1
View File
@@ -1042,7 +1042,12 @@ public:
ReplayStatus ReadLogInitialisation(RDCFile *rdc, bool storeStructuredBuffers);
SDFile *GetStructuredFile() { return m_StructuredFile; }
void DetachStructuredFile() { m_StoredStructuredData = m_StructuredFile = NULL; }
SDFile *DetachStructuredFile()
{
SDFile *ret = m_StoredStructuredData;
m_StoredStructuredData = m_StructuredFile = NULL;
return ret;
}
const APIEvent &GetEvent(uint32_t eventId);
uint32_t GetMaxEID() { return m_Events.back().eventId; }
const ActionDescription *GetAction(uint32_t eventId);
+1 -4
View File
@@ -104,10 +104,7 @@ IReplayDriver *VulkanReplay::MakeDummyDriver()
}
}
IReplayDriver *dummy = new DummyDriver(this, shaders);
// the dummy driver now owns the file, remove our reference
m_pDriver->DetachStructuredFile();
IReplayDriver *dummy = new DummyDriver(this, shaders, m_pDriver->DetachStructuredFile());
return dummy;
}
+3 -2
View File
@@ -24,16 +24,17 @@
#include "dummy_driver.h"
DummyDriver::DummyDriver(IReplayDriver *original, const rdcarray<ShaderReflection *> &shaders)
DummyDriver::DummyDriver(IReplayDriver *original, const rdcarray<ShaderReflection *> &shaders,
SDFile *sdfile)
{
m_Shaders = shaders;
m_SDFile = sdfile;
m_Props = original->GetAPIProperties();
m_Resources = original->GetResources();
m_Buffers = original->GetBuffers();
m_Textures = original->GetTextures();
m_FrameRecord = original->GetFrameRecord();
m_SDFile = original->GetStructuredFile();
m_TargetEncodings = original->GetTargetShaderEncodings();
m_DriverInfo = original->GetDriverInfo();
+1 -1
View File
@@ -33,7 +33,7 @@
class DummyDriver : public IReplayDriver
{
public:
DummyDriver(IReplayDriver *original, const rdcarray<ShaderReflection *> &shaders);
DummyDriver(IReplayDriver *original, const rdcarray<ShaderReflection *> &shaders, SDFile *sdfile);
void Shutdown();