From a98df1894705195f7051ef1dfccafffe135149c5 Mon Sep 17 00:00:00 2001 From: "Admiral H. Curtiss" Date: Sun, 6 Nov 2022 21:48:55 +0100 Subject: [PATCH] VideoCommon: Hold ImGui lock while initializing and shutting down ImGui. --- Source/Core/VideoCommon/RenderBase.cpp | 10 +++++++++- Source/Core/VideoCommon/RenderBase.h | 3 +++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Source/Core/VideoCommon/RenderBase.cpp b/Source/Core/VideoCommon/RenderBase.cpp index f787ab7dab..c2fdcbaa3d 100644 --- a/Source/Core/VideoCommon/RenderBase.cpp +++ b/Source/Core/VideoCommon/RenderBase.cpp @@ -1009,6 +1009,8 @@ void Renderer::RecordVideoMemory() bool Renderer::InitializeImGui() { + std::unique_lock imgui_lock(m_imgui_mutex); + if (!IMGUI_CHECKVERSION()) { PanicAlertFmt("ImGui version check failed"); @@ -1068,7 +1070,7 @@ bool Renderer::InitializeImGui() return false; m_imgui_last_frame_time = Common::Timer::NowUs(); - BeginImGuiFrame(); + BeginImGuiFrameUnlocked(); // lock is already held return true; } @@ -1129,6 +1131,8 @@ bool Renderer::RecompileImGuiPipeline() void Renderer::ShutdownImGui() { + std::unique_lock imgui_lock(m_imgui_mutex); + ImGui::EndFrame(); ImGui::DestroyContext(); m_imgui_pipeline.reset(); @@ -1139,7 +1143,11 @@ void Renderer::ShutdownImGui() void Renderer::BeginImGuiFrame() { std::unique_lock imgui_lock(m_imgui_mutex); + BeginImGuiFrameUnlocked(); +} +void Renderer::BeginImGuiFrameUnlocked() +{ const u64 current_time_us = Common::Timer::NowUs(); const u64 time_diff_us = current_time_us - m_imgui_last_frame_time; const float time_diff_secs = static_cast(time_diff_us / 1000000.0); diff --git a/Source/Core/VideoCommon/RenderBase.h b/Source/Core/VideoCommon/RenderBase.h index 8824e6ff77..0553d59f73 100644 --- a/Source/Core/VideoCommon/RenderBase.h +++ b/Source/Core/VideoCommon/RenderBase.h @@ -303,6 +303,9 @@ protected: // This function itself acquires the ImGui lock, so it should not be held. void BeginImGuiFrame(); + // Same as above but without locking the ImGui lock. + void BeginImGuiFrameUnlocked(); + // Destroys all ImGui GPU resources, must do before shutdown. void ShutdownImGui();