From dd2f6eb88aafca3d0cfa94adb2c75670db3e9c86 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 27 Apr 2017 18:18:25 +0100 Subject: [PATCH] Don't delete objects allocated in renderdoc module outside it. --- qrenderdoc/Windows/BufferViewer.cpp | 2 +- qrenderdoc/Windows/PixelHistoryView.cpp | 2 +- qrenderdoc/Windows/ShaderViewer.cpp | 5 ++++- qrenderdoc/Windows/TextureViewer.cpp | 2 +- renderdoc/api/replay/renderdoc_replay.h | 15 ++++++++++++--- renderdoc/replay/replay_controller.cpp | 5 +++++ renderdoc/replay/replay_controller.h | 1 + 7 files changed, 25 insertions(+), 7 deletions(-) diff --git a/qrenderdoc/Windows/BufferViewer.cpp b/qrenderdoc/Windows/BufferViewer.cpp index f0b39050a..18d482078 100644 --- a/qrenderdoc/Windows/BufferViewer.cpp +++ b/qrenderdoc/Windows/BufferViewer.cpp @@ -2759,7 +2759,7 @@ void BufferViewer::debugVertex() if(trace->states.count == 0) { - delete trace; + r->FreeTrace(trace); // if we couldn't debug the pixel on this event, open up a pixel history GUIInvoke::call([this]() { diff --git a/qrenderdoc/Windows/PixelHistoryView.cpp b/qrenderdoc/Windows/PixelHistoryView.cpp index 041913adc..7c4623155 100644 --- a/qrenderdoc/Windows/PixelHistoryView.cpp +++ b/qrenderdoc/Windows/PixelHistoryView.cpp @@ -644,7 +644,7 @@ void PixelHistoryView::startDebug(EventTag tag) if(trace->states.count == 0) { RDDialog::critical(this, tr("Debug Error"), tr("Error debugging pixel.")); - delete trace; + m_Ctx.Replay().AsyncInvoke([trace](IReplayController *r) { r->FreeTrace(trace); }); return; } diff --git a/qrenderdoc/Windows/ShaderViewer.cpp b/qrenderdoc/Windows/ShaderViewer.cpp index a49731f97..d338b388d 100644 --- a/qrenderdoc/Windows/ShaderViewer.cpp +++ b/qrenderdoc/Windows/ShaderViewer.cpp @@ -484,7 +484,10 @@ void ShaderViewer::debugShader(const ShaderBindpointMapping *bind, const ShaderR ShaderViewer::~ShaderViewer() { - delete m_Trace; + // don't want to async invoke while using 'this', so save the trace separately + ShaderDebugTrace *trace = m_Trace; + + m_Ctx.Replay().AsyncInvoke([trace](IReplayController *r) { r->FreeTrace(trace); }); if(m_CloseCallback) m_CloseCallback(&m_Ctx); diff --git a/qrenderdoc/Windows/TextureViewer.cpp b/qrenderdoc/Windows/TextureViewer.cpp index 4fe2ceb85..76c508e82 100644 --- a/qrenderdoc/Windows/TextureViewer.cpp +++ b/qrenderdoc/Windows/TextureViewer.cpp @@ -3284,7 +3284,7 @@ void TextureViewer::on_debugPixelContext_clicked() if(trace->states.count == 0) { - delete trace; + r->FreeTrace(trace); // if we couldn't debug the pixel on this event, open up a pixel history GUIInvoke::call([this]() { on_pixelHistory_clicked(); }); diff --git a/renderdoc/api/replay/renderdoc_replay.h b/renderdoc/api/replay/renderdoc_replay.h index 64cfbb21c..9fbad2fe0 100644 --- a/renderdoc/api/replay/renderdoc_replay.h +++ b/renderdoc/api/replay/renderdoc_replay.h @@ -672,7 +672,8 @@ newly generated messages will be returned after that. indexed draws or drawn from the index buffer. This must have all drawcall offsets applied. :param int instOffset: The value from :data:`DrawcallDescription.instanceOffset`. :param int vertOffset: The value from :data:`DrawcallDescription.vertexOffset`. -:return: The resulting trace resulting from debugging. +:return: The resulting trace resulting from debugging. Destroy with + :meth:`FreeTrace`. :rtype: ShaderDebugTrace )"); virtual ShaderDebugTrace *DebugVertex(uint32_t vertid, uint32_t instid, uint32_t idx, @@ -685,7 +686,8 @@ newly generated messages will be returned after that. :param int sample: The multi-sampled sample. Ignored if non-multisampled texture. :param int primitive: Debug the pixel from this primitive if there's ambiguity. If set to :data:`NoPreference` then a random fragment writing to the given co-ordinate is debugged. -:return: The resulting trace resulting from debugging. +:return: The resulting trace resulting from debugging. Destroy with + :meth:`FreeTrace`. :rtype: ShaderDebugTrace )"); virtual ShaderDebugTrace *DebugPixel(uint32_t x, uint32_t y, uint32_t sample, @@ -695,11 +697,18 @@ newly generated messages will be returned after that. :param groupid: A list containing the 3D workgroup index. :param threadid: A list containing the 3D thread index within the above workgroup. -:return: The resulting trace resulting from debugging. +:return: The resulting trace resulting from debugging. Destroy with + :meth:`FreeTrace`. :rtype: ShaderDebugTrace )"); virtual ShaderDebugTrace *DebugThread(uint32_t groupid[3], uint32_t threadid[3]) = 0; + DOCUMENT(R"(Free a debugging trace from running a shader invocation debug. + +:param ShaderDebugTrace trace: The shader debugging trace to free. +)"); + virtual void FreeTrace(ShaderDebugTrace *trace) = 0; + DOCUMENT(R"(Retrieve a list of ways a given resource is used. :param ResourceId id: The id of the texture or buffer resource to be queried. diff --git a/renderdoc/replay/replay_controller.cpp b/renderdoc/replay/replay_controller.cpp index a8d42ab85..9ec2ddd1b 100644 --- a/renderdoc/replay/replay_controller.cpp +++ b/renderdoc/replay/replay_controller.cpp @@ -1317,6 +1317,11 @@ ShaderDebugTrace *ReplayController::DebugThread(uint32_t groupid[3], uint32_t th return ret; } +void ReplayController::FreeTrace(ShaderDebugTrace *trace) +{ + delete trace; +} + rdctype::array ReplayController::GetCBufferVariableContents( ResourceId shader, const char *entryPoint, uint32_t cbufslot, ResourceId buffer, uint64_t offs) { diff --git a/renderdoc/replay/replay_controller.h b/renderdoc/replay/replay_controller.h index 895a70ddf..1cec10f02 100644 --- a/renderdoc/replay/replay_controller.h +++ b/renderdoc/replay/replay_controller.h @@ -171,6 +171,7 @@ public: uint32_t vertOffset); ShaderDebugTrace *DebugPixel(uint32_t x, uint32_t y, uint32_t sample, uint32_t primitive); ShaderDebugTrace *DebugThread(uint32_t groupid[3], uint32_t threadid[3]); + void FreeTrace(ShaderDebugTrace *trace); MeshFormat GetPostVSData(uint32_t instID, MeshDataStage stage);