diff --git a/scwx-qt/source/scwx/qt/manager/font_manager.cpp b/scwx-qt/source/scwx/qt/manager/font_manager.cpp index 64b93d78..1cc752fe 100644 --- a/scwx-qt/source/scwx/qt/manager/font_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/font_manager.cpp @@ -45,12 +45,19 @@ public: const std::vector& styles); std::string fontCachePath_ {}; + + std::shared_mutex imguiFontAtlasMutex_ {}; }; FontManager::FontManager() : p(std::make_unique()) {} FontManager::~FontManager() {}; +std::shared_mutex& FontManager::imgui_font_atlas_mutex() +{ + return p->imguiFontAtlasMutex_; +} + std::shared_ptr FontManager::GetImGuiFont(const std::string& family, const std::vector& styles, diff --git a/scwx-qt/source/scwx/qt/manager/font_manager.hpp b/scwx-qt/source/scwx/qt/manager/font_manager.hpp index 0a4a812e..c647c31a 100644 --- a/scwx-qt/source/scwx/qt/manager/font_manager.hpp +++ b/scwx-qt/source/scwx/qt/manager/font_manager.hpp @@ -2,6 +2,8 @@ #include +#include + #include namespace scwx @@ -19,6 +21,8 @@ public: explicit FontManager(); ~FontManager(); + std::shared_mutex& imgui_font_atlas_mutex(); + std::shared_ptr GetImGuiFont(const std::string& family, const std::vector& styles, diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index 4f279ad3..89eabb3f 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -1028,6 +1029,10 @@ void MapWidget::paintGL() // Setup ImGui Frame ImGui::SetCurrentContext(p->imGuiContext_); + // Lock ImGui font atlas prior to new ImGui frame + std::shared_lock imguiFontAtlasLock { + manager::FontManager::Instance().imgui_font_atlas_mutex()}; + // Start ImGui Frame ImGui_ImplQt_NewFrame(this); ImGui_ImplOpenGL3_NewFrame(); @@ -1059,6 +1064,9 @@ void MapWidget::paintGL() ImGui::Render(); ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); + // Unlock ImGui font atlas after rendering + imguiFontAtlasLock.unlock(); + // Paint complete Q_EMIT WidgetPainted(); } diff --git a/scwx-qt/source/scwx/qt/ui/imgui_debug_widget.cpp b/scwx-qt/source/scwx/qt/ui/imgui_debug_widget.cpp index 18011b7f..04e692ac 100644 --- a/scwx-qt/source/scwx/qt/ui/imgui_debug_widget.cpp +++ b/scwx-qt/source/scwx/qt/ui/imgui_debug_widget.cpp @@ -1,4 +1,5 @@ #include +#include #include #include @@ -109,6 +110,10 @@ void ImGuiDebugWidget::paintGL() { ImGui::SetCurrentContext(p->currentContext_); + // Lock ImGui font atlas prior to new ImGui frame + std::shared_lock imguiFontAtlasLock { + manager::FontManager::Instance().imgui_font_atlas_mutex()}; + ImGui_ImplQt_NewFrame(this); ImGui_ImplOpenGL3_NewFrame(); @@ -131,6 +136,9 @@ void ImGuiDebugWidget::paintGL() ImGui::Render(); ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); + + // Unlock ImGui font atlas after rendering + imguiFontAtlasLock.unlock(); } } // namespace ui