From 5a0134ed4b5cd07dbdb03c57ac903366fc9dc88a Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 15 May 2020 02:52:07 +0100 Subject: [PATCH] Free shader debugger in replay driver so it's proxied correctly --- renderdoc/core/image_viewer.cpp | 1 + renderdoc/core/replay_proxy.cpp | 31 ++++++++++++++++++++ renderdoc/core/replay_proxy.h | 2 ++ renderdoc/driver/d3d11/d3d11_replay.h | 1 + renderdoc/driver/d3d11/d3d11_shaderdebug.cpp | 5 ++++ renderdoc/driver/d3d12/d3d12_replay.h | 1 + renderdoc/driver/d3d12/d3d12_shaderdebug.cpp | 5 ++++ renderdoc/driver/gl/gl_replay.cpp | 5 ++++ renderdoc/driver/gl/gl_replay.h | 1 + renderdoc/driver/vulkan/vk_replay.h | 1 + renderdoc/driver/vulkan/vk_shaderdebug.cpp | 5 ++++ renderdoc/replay/replay_controller.cpp | 2 +- renderdoc/replay/replay_driver.h | 1 + 13 files changed, 60 insertions(+), 1 deletion(-) diff --git a/renderdoc/core/image_viewer.cpp b/renderdoc/core/image_viewer.cpp index 08c9b1fb0..8398ce91f 100644 --- a/renderdoc/core/image_viewer.cpp +++ b/renderdoc/core/image_viewer.cpp @@ -272,6 +272,7 @@ public: return new ShaderDebugTrace(); } rdcarray ContinueDebug(ShaderDebugger *debugger) { return {}; } + void FreeDebugger(ShaderDebugger *debugger) { delete debugger; } void BuildTargetShader(ShaderEncoding sourceEncoding, const bytebuf &source, const rdcstr &entry, const ShaderCompileFlags &compileFlags, ShaderStage type, ResourceId &id, rdcstr &errors) diff --git a/renderdoc/core/replay_proxy.cpp b/renderdoc/core/replay_proxy.cpp index 32bc0ed4c..969c97f2e 100644 --- a/renderdoc/core/replay_proxy.cpp +++ b/renderdoc/core/replay_proxy.cpp @@ -95,6 +95,7 @@ rdcstr DoStringise(const ReplayProxyPacket &el) STRINGISE_ENUM_NAMED(eReplayProxy_GetDriverInfo, "GetDriverInfo"); STRINGISE_ENUM_NAMED(eReplayProxy_ContinueDebug, "ContinueDebug"); + STRINGISE_ENUM_NAMED(eReplayProxy_FreeDebugger, "FreeDebugger"); } END_ENUM_STRINGISE(); } @@ -1601,6 +1602,35 @@ rdcarray ReplayProxy::ContinueDebug(ShaderDebugger *debugger) PROXY_FUNCTION(ContinueDebug, debugger); } +template +void ReplayProxy::Proxied_FreeDebugger(ParamSerialiser ¶mser, ReturnSerialiser &retser, + ShaderDebugger *debugger) +{ + const ReplayProxyPacket expectedPacket = eReplayProxy_FreeDebugger; + ReplayProxyPacket packet = eReplayProxy_FreeDebugger; + + { + BEGIN_PARAMS(); + uint64_t debugger_ptr = (uint64_t)(uintptr_t)debugger; + SERIALISE_ELEMENT(debugger_ptr); + debugger = (ShaderDebugger *)(uintptr_t)debugger_ptr; + END_PARAMS(); + } + + { + REMOTE_EXECUTION(); + if(paramser.IsReading() && !paramser.IsErrored() && !m_IsErrored) + m_Remote->FreeDebugger(debugger); + } + + CheckError(packet, expectedPacket); +} + +void ReplayProxy::FreeDebugger(ShaderDebugger *debugger) +{ + PROXY_FUNCTION(FreeDebugger, debugger); +} + template void ReplayProxy::Proxied_SavePipelineState(ParamSerialiser ¶mser, ReturnSerialiser &retser, uint32_t eventId) @@ -2790,6 +2820,7 @@ bool ReplayProxy::Tick(int type) break; } case eReplayProxy_ContinueDebug: ContinueDebug(NULL); break; + case eReplayProxy_FreeDebugger: FreeDebugger(NULL); break; case eReplayProxy_RenderOverlay: RenderOverlay(ResourceId(), Subresource(), CompType::Typeless, FloatVector(), DebugOverlay::NoOverlay, 0, rdcarray()); diff --git a/renderdoc/core/replay_proxy.h b/renderdoc/core/replay_proxy.h index 04f7a10df..23c78aacf 100644 --- a/renderdoc/core/replay_proxy.h +++ b/renderdoc/core/replay_proxy.h @@ -102,6 +102,7 @@ enum ReplayProxyPacket eReplayProxy_GetAvailableGPUs, eReplayProxy_ContinueDebug, + eReplayProxy_FreeDebugger, }; DECLARE_REFLECTION_ENUM(ReplayProxyPacket); @@ -529,6 +530,7 @@ public: IMPLEMENT_FUNCTION_PROXIED(ShaderDebugTrace *, DebugThread, uint32_t eventId, const uint32_t groupid[3], const uint32_t threadid[3]); IMPLEMENT_FUNCTION_PROXIED(rdcarray, ContinueDebug, ShaderDebugger *debugger); + IMPLEMENT_FUNCTION_PROXIED(void, FreeDebugger, ShaderDebugger *debugger); IMPLEMENT_FUNCTION_PROXIED(rdcarray, GetTargetShaderEncodings); IMPLEMENT_FUNCTION_PROXIED(void, BuildTargetShader, ShaderEncoding sourceEncoding, diff --git a/renderdoc/driver/d3d11/d3d11_replay.h b/renderdoc/driver/d3d11/d3d11_replay.h index 7c6278f39..f697fe5ff 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.h +++ b/renderdoc/driver/d3d11/d3d11_replay.h @@ -237,6 +237,7 @@ public: ShaderDebugTrace *DebugThread(uint32_t eventId, const uint32_t groupid[3], const uint32_t threadid[3]); rdcarray ContinueDebug(ShaderDebugger *debugger); + void FreeDebugger(ShaderDebugger *debugger); uint32_t PickVertex(uint32_t eventId, int32_t width, int32_t height, const MeshDisplay &cfg, uint32_t x, uint32_t y); diff --git a/renderdoc/driver/d3d11/d3d11_shaderdebug.cpp b/renderdoc/driver/d3d11/d3d11_shaderdebug.cpp index c9837122c..ebbcbd915 100644 --- a/renderdoc/driver/d3d11/d3d11_shaderdebug.cpp +++ b/renderdoc/driver/d3d11/d3d11_shaderdebug.cpp @@ -2995,3 +2995,8 @@ rdcarray D3D11Replay::ContinueDebug(ShaderDebugger *debugger) return interpreter->ContinueDebug(&apiWrapper); } + +void D3D11Replay::FreeDebugger(ShaderDebugger *debugger) +{ + delete debugger; +} diff --git a/renderdoc/driver/d3d12/d3d12_replay.h b/renderdoc/driver/d3d12/d3d12_replay.h index c368f3192..14089217c 100644 --- a/renderdoc/driver/d3d12/d3d12_replay.h +++ b/renderdoc/driver/d3d12/d3d12_replay.h @@ -192,6 +192,7 @@ public: ShaderDebugTrace *DebugThread(uint32_t eventId, const uint32_t groupid[3], const uint32_t threadid[3]); rdcarray ContinueDebug(ShaderDebugger *debugger); + void FreeDebugger(ShaderDebugger *debugger); uint32_t PickVertex(uint32_t eventId, int32_t width, int32_t height, const MeshDisplay &cfg, uint32_t x, uint32_t y); diff --git a/renderdoc/driver/d3d12/d3d12_shaderdebug.cpp b/renderdoc/driver/d3d12/d3d12_shaderdebug.cpp index 5cbcb5b5f..13c96d769 100644 --- a/renderdoc/driver/d3d12/d3d12_shaderdebug.cpp +++ b/renderdoc/driver/d3d12/d3d12_shaderdebug.cpp @@ -2964,3 +2964,8 @@ rdcarray D3D12Replay::ContinueDebug(ShaderDebugger *debugger) return interpreter->ContinueDebug(&apiWrapper); } + +void D3D12Replay::FreeDebugger(ShaderDebugger *debugger) +{ + delete debugger; +} diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index b697b8988..b785a6b33 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -3476,6 +3476,11 @@ rdcarray GLReplay::ContinueDebug(ShaderDebugger *debugger) return {}; } +void GLReplay::FreeDebugger(ShaderDebugger *debugger) +{ + delete debugger; +} + void GLReplay::MakeCurrentReplayContext(GLWindowingData *ctx) { static GLWindowingData *prev = NULL; diff --git a/renderdoc/driver/gl/gl_replay.h b/renderdoc/driver/gl/gl_replay.h index 85ac2377c..8d1edd8d5 100644 --- a/renderdoc/driver/gl/gl_replay.h +++ b/renderdoc/driver/gl/gl_replay.h @@ -223,6 +223,7 @@ public: ShaderDebugTrace *DebugThread(uint32_t eventId, const uint32_t groupid[3], const uint32_t threadid[3]); rdcarray ContinueDebug(ShaderDebugger *debugger); + void FreeDebugger(ShaderDebugger *debugger); uint32_t PickVertex(uint32_t eventId, int32_t width, int32_t height, const MeshDisplay &cfg, uint32_t x, uint32_t y); diff --git a/renderdoc/driver/vulkan/vk_replay.h b/renderdoc/driver/vulkan/vk_replay.h index b2d7015d0..d55222fd4 100644 --- a/renderdoc/driver/vulkan/vk_replay.h +++ b/renderdoc/driver/vulkan/vk_replay.h @@ -378,6 +378,7 @@ public: ShaderDebugTrace *DebugThread(uint32_t eventId, const uint32_t groupid[3], const uint32_t threadid[3]); rdcarray ContinueDebug(ShaderDebugger *debugger); + void FreeDebugger(ShaderDebugger *debugger); uint32_t PickVertex(uint32_t eventId, int32_t width, int32_t height, const MeshDisplay &cfg, uint32_t x, uint32_t y); diff --git a/renderdoc/driver/vulkan/vk_shaderdebug.cpp b/renderdoc/driver/vulkan/vk_shaderdebug.cpp index 0ad80e32e..8d2281556 100644 --- a/renderdoc/driver/vulkan/vk_shaderdebug.cpp +++ b/renderdoc/driver/vulkan/vk_shaderdebug.cpp @@ -4263,3 +4263,8 @@ rdcarray VulkanReplay::ContinueDebug(ShaderDebugger *debugger) return ret; } + +void VulkanReplay::FreeDebugger(ShaderDebugger *debugger) +{ + delete debugger; +} diff --git a/renderdoc/replay/replay_controller.cpp b/renderdoc/replay/replay_controller.cpp index 49279ac5b..4b0155b37 100644 --- a/renderdoc/replay/replay_controller.cpp +++ b/renderdoc/replay/replay_controller.cpp @@ -1625,7 +1625,7 @@ void ReplayController::FreeTrace(ShaderDebugTrace *trace) if(trace) { - SAFE_DELETE(trace->debugger); + m_pDevice->FreeDebugger(trace->debugger); delete trace; } } diff --git a/renderdoc/replay/replay_driver.h b/renderdoc/replay/replay_driver.h index 8c08e1c76..5deddc66b 100644 --- a/renderdoc/replay/replay_driver.h +++ b/renderdoc/replay/replay_driver.h @@ -188,6 +188,7 @@ public: virtual ShaderDebugTrace *DebugThread(uint32_t eventId, const uint32_t groupid[3], const uint32_t threadid[3]) = 0; virtual rdcarray ContinueDebug(ShaderDebugger *debugger) = 0; + virtual void FreeDebugger(ShaderDebugger *debugger) = 0; virtual ResourceId RenderOverlay(ResourceId texid, const Subresource &sub, CompType typeCast, FloatVector clearCol, DebugOverlay overlay, uint32_t eventId,