mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-09-22 21:55:52 +00:00
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:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user