Skip to content
Permalink
Browse files
Merge pull request #11258 from AdmiralCurtiss/imgui-crash-v2
ImGui render context race condition fix: Lock context during Init/Shutdown.
  • Loading branch information
AdmiralCurtiss committed Nov 7, 2022
2 parents c931529 + a98df18 commit ee7887b
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 1 deletion.
@@ -554,6 +554,9 @@ void RenderWidget::SetImGuiKeyMap()
}};
auto lock = g_renderer->GetImGuiLock();

if (!ImGui::GetCurrentContext())
return;

for (auto [imgui_key, qt_key] : key_map)
ImGui::GetIO().KeyMap[imgui_key] = (qt_key & 0x1FF);
}
@@ -1009,6 +1009,8 @@ void Renderer::RecordVideoMemory()

bool Renderer::InitializeImGui()
{
std::unique_lock<std::mutex> 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<std::mutex> 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<std::mutex> 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<float>(time_diff_us / 1000000.0);
@@ -303,6 +303,9 @@ class Renderer
// 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();

0 comments on commit ee7887b

Please sign in to comment.