diff --git a/renderdoc/core/image_viewer.cpp b/renderdoc/core/image_viewer.cpp index cc4a4ffc5..e7843dcf1 100644 --- a/renderdoc/core/image_viewer.cpp +++ b/renderdoc/core/image_viewer.cpp @@ -93,7 +93,7 @@ public: } IReplayDriver *MakeDummyDriver() { - IReplayDriver *ret = new DummyDriver(this, {}, m_File); + 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 47567376b..d17cc6b19 100644 --- a/renderdoc/core/replay_proxy.cpp +++ b/renderdoc/core/replay_proxy.cpp @@ -3113,7 +3113,7 @@ IReplayDriver *ReplayProxy::MakeDummyDriver() shaders.push_back(it.second); m_PointerReflectionCache.clear(); - IReplayDriver *dummy = new DummyDriver(this, shaders, m_StructuredFile); + 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_context.h b/renderdoc/driver/d3d11/d3d11_context.h index 0b63abf08..f993356b0 100644 --- a/renderdoc/driver/d3d11/d3d11_context.h +++ b/renderdoc/driver/d3d11/d3d11_context.h @@ -349,6 +349,16 @@ public: void AttemptCapture(); void FinishCapture(); + rdcarray DetachAnnotations() + { + rdcarray ret; + ret.swap(m_EventAnnotations); + for(auto it = m_Annotations.begin(); it != m_Annotations.end(); ++it) + ret.push_back(it->second); + m_Annotations.clear(); + return ret; + } + D3D11RenderState *GetCurrentPipelineState() { return m_CurrentPipelineState; } ResourceId GetResourceID() { return m_ResourceID; } D3D11ResourceRecord *GetResourceRecord() { return m_ContextRecord; } diff --git a/renderdoc/driver/d3d11/d3d11_replay.cpp b/renderdoc/driver/d3d11/d3d11_replay.cpp index ef9b6ffa8..cd0bc9004 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.cpp +++ b/renderdoc/driver/d3d11/d3d11_replay.cpp @@ -97,7 +97,8 @@ IReplayDriver *D3D11Replay::MakeDummyDriver() rdcarray shaders; WrappedID3D11Shader::GetReflections(shaders); - IReplayDriver *dummy = new DummyDriver(this, shaders, m_pDevice->DetachStructuredFile()); + IReplayDriver *dummy = new DummyDriver(this, shaders, m_pDevice->DetachStructuredFile(), + m_pDevice->GetImmediateContext()->DetachAnnotations()); return dummy; } diff --git a/renderdoc/driver/d3d12/d3d12_device.cpp b/renderdoc/driver/d3d12/d3d12_device.cpp index d4922afd8..f334d4b9a 100644 --- a/renderdoc/driver/d3d12/d3d12_device.cpp +++ b/renderdoc/driver/d3d12/d3d12_device.cpp @@ -4934,6 +4934,17 @@ void WrappedID3D12Device::DataUploadSync() } } +rdcarray WrappedID3D12Device::DetachAnnotations() +{ + rdcarray ret; + if(m_Queue) + ret.swap(m_Queue->GetCommandData()->m_EventAnnotations); + for(auto it = m_Annotations.begin(); it != m_Annotations.end(); ++it) + ret.push_back(it->second); + m_Annotations.clear(); + return ret; +} + void WrappedID3D12Device::InternalQueueWaitForIdle() { QueueWaitForIdle(GetQueue(), m_WFIFence); diff --git a/renderdoc/driver/d3d12/d3d12_device.h b/renderdoc/driver/d3d12/d3d12_device.h index 063d6ab90..9ec0cd4d4 100644 --- a/renderdoc/driver/d3d12/d3d12_device.h +++ b/renderdoc/driver/d3d12/d3d12_device.h @@ -1188,6 +1188,7 @@ public: m_StoredStructuredData = m_StructuredFile = NULL; return ret; } + rdcarray DetachAnnotations(); 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 4f2689710..7e664ef0c 100644 --- a/renderdoc/driver/d3d12/d3d12_replay.cpp +++ b/renderdoc/driver/d3d12/d3d12_replay.cpp @@ -169,7 +169,8 @@ IReplayDriver *D3D12Replay::MakeDummyDriver() rdcarray shaders; WrappedID3D12Shader::GetReflections(shaders); - IReplayDriver *dummy = new DummyDriver(this, shaders, m_pDevice->DetachStructuredFile()); + IReplayDriver *dummy = new DummyDriver(this, shaders, m_pDevice->DetachStructuredFile(), + m_pDevice->DetachAnnotations()); return dummy; } diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index 9e4760ae6..579f5719f 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -668,6 +668,15 @@ public: m_StoredStructuredData = m_StructuredFile = NULL; return ret; } + rdcarray DetachAnnotations() + { + rdcarray ret; + ret.swap(m_EventAnnotations); + for(auto it = m_Annotations.begin(); it != m_Annotations.end(); ++it) + ret.push_back(it->second); + m_Annotations.clear(); + 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 174e3a0df..84df1cbd8 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -106,7 +106,8 @@ IReplayDriver *GLReplay::MakeDummyDriver() shaders.push_back(it->second.StealReflection()); } - IReplayDriver *dummy = new DummyDriver(this, shaders, m_pDriver->DetachStructuredFile()); + IReplayDriver *dummy = new DummyDriver(this, shaders, m_pDriver->DetachStructuredFile(), + m_pDriver->DetachAnnotations()); return dummy; } diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 2b2050fbb..942551a35 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -1380,6 +1380,16 @@ public: m_StoredStructuredData = m_StructuredFile = NULL; return ret; } + rdcarray DetachAnnotations() + { + rdcarray ret; + ret.swap(m_EventAnnotations); + for(auto it = m_Annotations.begin(); it != m_Annotations.end(); ++it) + ret.push_back(it->second); + m_Annotations.clear(); + 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 d58ea128b..66290e818 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -106,7 +106,8 @@ IReplayDriver *VulkanReplay::MakeDummyDriver() } } - IReplayDriver *dummy = new DummyDriver(this, shaders, m_pDriver->DetachStructuredFile()); + IReplayDriver *dummy = new DummyDriver(this, shaders, m_pDriver->DetachStructuredFile(), + m_pDriver->DetachAnnotations()); return dummy; } diff --git a/renderdoc/replay/dummy_driver.cpp b/renderdoc/replay/dummy_driver.cpp index fb6993ce3..b4ca00024 100644 --- a/renderdoc/replay/dummy_driver.cpp +++ b/renderdoc/replay/dummy_driver.cpp @@ -25,9 +25,10 @@ #include "dummy_driver.h" DummyDriver::DummyDriver(IReplayDriver *original, const rdcarray &shaders, - SDFile *sdfile) + SDFile *sdfile, const rdcarray &annotations) { m_Shaders = shaders; + m_Annotations = annotations; m_SDFile = sdfile; m_Props = original->GetAPIProperties(); @@ -54,6 +55,10 @@ DummyDriver::~DummyDriver() for(const ShaderReflection *refl : m_Shaders) delete refl; + // and annotations + for(const SDObject *ann : m_Annotations) + delete ann; + // and we own the structured file delete m_SDFile; } diff --git a/renderdoc/replay/dummy_driver.h b/renderdoc/replay/dummy_driver.h index 527c279d0..72936faf0 100644 --- a/renderdoc/replay/dummy_driver.h +++ b/renderdoc/replay/dummy_driver.h @@ -34,7 +34,7 @@ class DummyDriver : public IReplayDriver { public: DummyDriver(IReplayDriver *original, const rdcarray &shaders, - SDFile *sdfile); + SDFile *sdfile, const rdcarray &annotations); void Shutdown(); @@ -193,6 +193,7 @@ private: virtual ~DummyDriver(); rdcarray m_Shaders; + rdcarray m_Annotations; SDFile *m_SDFile; APIProperties m_Props;