From 1b42dcc05f6f947948d26aef536055abce12307d Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 17 Sep 2021 14:29:05 +0100 Subject: [PATCH] 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. --- renderdoc/core/image_viewer.cpp | 2 +- renderdoc/core/replay_proxy.cpp | 2 +- renderdoc/driver/d3d11/d3d11_device.h | 7 ++++++- renderdoc/driver/d3d11/d3d11_replay.cpp | 5 +---- renderdoc/driver/d3d12/d3d12_device.h | 7 ++++++- renderdoc/driver/d3d12/d3d12_replay.cpp | 5 +---- renderdoc/driver/gl/gl_driver.h | 7 ++++++- renderdoc/driver/gl/gl_replay.cpp | 5 +---- renderdoc/driver/vulkan/vk_core.h | 7 ++++++- renderdoc/driver/vulkan/vk_replay.cpp | 5 +---- renderdoc/replay/dummy_driver.cpp | 5 +++-- renderdoc/replay/dummy_driver.h | 2 +- 12 files changed, 34 insertions(+), 25 deletions(-) diff --git a/renderdoc/core/image_viewer.cpp b/renderdoc/core/image_viewer.cpp index 7e58a89f8..b033180e4 100644 --- a/renderdoc/core/image_viewer.cpp +++ b/renderdoc/core/image_viewer.cpp @@ -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; diff --git a/renderdoc/core/replay_proxy.cpp b/renderdoc/core/replay_proxy.cpp index c480ea7b4..cb065cd6a 100644 --- a/renderdoc/core/replay_proxy.cpp +++ b/renderdoc/core/replay_proxy.cpp @@ -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; diff --git a/renderdoc/driver/d3d11/d3d11_device.h b/renderdoc/driver/d3d11/d3d11_device.h index 36464a94f..a7fe09e5e 100644 --- a/renderdoc/driver/d3d11/d3d11_device.h +++ b/renderdoc/driver/d3d11/d3d11_device.h @@ -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); diff --git a/renderdoc/driver/d3d11/d3d11_replay.cpp b/renderdoc/driver/d3d11/d3d11_replay.cpp index fd64df8d2..e7ef227af 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.cpp +++ b/renderdoc/driver/d3d11/d3d11_replay.cpp @@ -95,10 +95,7 @@ IReplayDriver *D3D11Replay::MakeDummyDriver() rdcarray shaders; WrappedID3D11Shader::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; } diff --git a/renderdoc/driver/d3d12/d3d12_device.h b/renderdoc/driver/d3d12/d3d12_device.h index f09b971a7..6a8016631 100644 --- a/renderdoc/driver/d3d12/d3d12_device.h +++ b/renderdoc/driver/d3d12/d3d12_device.h @@ -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 diff --git a/renderdoc/driver/d3d12/d3d12_replay.cpp b/renderdoc/driver/d3d12/d3d12_replay.cpp index a66ee1cf6..ce83b69c7 100644 --- a/renderdoc/driver/d3d12/d3d12_replay.cpp +++ b/renderdoc/driver/d3d12/d3d12_replay.cpp @@ -126,10 +126,7 @@ IReplayDriver *D3D12Replay::MakeDummyDriver() rdcarray 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; } diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index 1414f45af..d803bd9c8 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -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) diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index ff3149ef0..5e0b5f33d 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -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; } diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 43d3183aa..42910674c 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -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); diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 00b1a5437..5859f0957 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -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; } diff --git a/renderdoc/replay/dummy_driver.cpp b/renderdoc/replay/dummy_driver.cpp index 6c7e521c8..1cb12e65e 100644 --- a/renderdoc/replay/dummy_driver.cpp +++ b/renderdoc/replay/dummy_driver.cpp @@ -24,16 +24,17 @@ #include "dummy_driver.h" -DummyDriver::DummyDriver(IReplayDriver *original, const rdcarray &shaders) +DummyDriver::DummyDriver(IReplayDriver *original, const rdcarray &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(); diff --git a/renderdoc/replay/dummy_driver.h b/renderdoc/replay/dummy_driver.h index b424ab2c2..1f8cd1552 100644 --- a/renderdoc/replay/dummy_driver.h +++ b/renderdoc/replay/dummy_driver.h @@ -33,7 +33,7 @@ class DummyDriver : public IReplayDriver { public: - DummyDriver(IReplayDriver *original, const rdcarray &shaders); + DummyDriver(IReplayDriver *original, const rdcarray &shaders, SDFile *sdfile); void Shutdown();