diff --git a/renderdoc/core/remote_server.cpp b/renderdoc/core/remote_server.cpp index 06bcf2f99..41e3a9b02 100644 --- a/renderdoc/core/remote_server.cpp +++ b/renderdoc/core/remote_server.cpp @@ -1648,7 +1648,7 @@ rdcpair RemoteServer::OpenCapture( if(status != ReplayStatus::Succeeded) { - SAFE_DELETE(rend); + rend->Shutdown(); ret.first = status; return ret; } diff --git a/renderdoc/replay/capture_file.cpp b/renderdoc/replay/capture_file.cpp index 7d45c3208..87206e0a8 100644 --- a/renderdoc/replay/capture_file.cpp +++ b/renderdoc/replay/capture_file.cpp @@ -366,7 +366,10 @@ rdcpair CaptureFile::OpenCapture(const Replay RenderDoc::Inst().SetProgressCallback(RENDERDOC_ProgressCallback()); if(ret != ReplayStatus::Succeeded) - SAFE_DELETE(render); + { + render->Shutdown(); + render = NULL; + } return rdcpair(ret, render); } diff --git a/renderdoc/replay/replay_controller.cpp b/renderdoc/replay/replay_controller.cpp index 531aa0978..405f8fc2f 100644 --- a/renderdoc/replay/replay_controller.cpp +++ b/renderdoc/replay/replay_controller.cpp @@ -65,27 +65,6 @@ ReplayController::ReplayController() ReplayController::~ReplayController() { CHECK_REPLAY_THREAD(); - - RDCLOG("Shutting down replay renderer"); - - for(size_t i = 0; i < m_Outputs.size(); i++) - SAFE_DELETE(m_Outputs[i]); - - m_Outputs.clear(); - - for(auto it = m_CustomShaders.begin(); it != m_CustomShaders.end(); ++it) - m_pDevice->FreeCustomShader(*it); - - m_CustomShaders.clear(); - - for(auto it = m_TargetResources.begin(); it != m_TargetResources.end(); ++it) - m_pDevice->FreeTargetResource(*it); - - m_TargetResources.clear(); - - if(m_pDevice) - m_pDevice->Shutdown(); - m_pDevice = NULL; } void ReplayController::SetFrameEvent(uint32_t eventId, bool force) @@ -1855,6 +1834,27 @@ void ReplayController::Shutdown() { CHECK_REPLAY_THREAD(); + RDCLOG("Shutting down replay renderer"); + + for(size_t i = 0; i < m_Outputs.size(); i++) + SAFE_DELETE(m_Outputs[i]); + + m_Outputs.clear(); + + for(auto it = m_CustomShaders.begin(); it != m_CustomShaders.end(); ++it) + m_pDevice->FreeCustomShader(*it); + + m_CustomShaders.clear(); + + for(auto it = m_TargetResources.begin(); it != m_TargetResources.end(); ++it) + m_pDevice->FreeTargetResource(*it); + + m_TargetResources.clear(); + + if(m_pDevice) + m_pDevice->Shutdown(); + m_pDevice = NULL; + delete this; } diff --git a/renderdoc/replay/replay_controller.h b/renderdoc/replay/replay_controller.h index 69c6d0f4a..d9a34d23f 100644 --- a/renderdoc/replay/replay_controller.h +++ b/renderdoc/replay/replay_controller.h @@ -126,7 +126,6 @@ struct ReplayController : public IReplayController { public: ReplayController(); - virtual ~ReplayController(); APIProperties GetAPIProperties(); @@ -219,6 +218,7 @@ public: void Shutdown(); private: + virtual ~ReplayController(); ReplayStatus PostCreateInit(IReplayDriver *device, RDCFile *rdc); void FetchPipelineState(uint32_t eventId);