From 077e532bd2f6d4815bd826b3ec1209d695f89d8f Mon Sep 17 00:00:00 2001 From: Mr_Goldberg Date: Tue, 16 Aug 2022 12:32:28 -0400 Subject: [PATCH] Fix overlay getting stuck if stopped to quickly after being started. --- overlay_experimental/Renderer_Detector.cpp | 28 ++++++++++++++++++---- overlay_experimental/Renderer_Detector.h | 2 +- overlay_experimental/steam_overlay.cpp | 1 + 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/overlay_experimental/Renderer_Detector.cpp b/overlay_experimental/Renderer_Detector.cpp index 576ddec..02684e6 100644 --- a/overlay_experimental/Renderer_Detector.cpp +++ b/overlay_experimental/Renderer_Detector.cpp @@ -68,6 +68,15 @@ public: return instance; } + static void deleteInst() + { + if (instance != nullptr) + { + delete instance; + instance = nullptr; + } + } + ~Renderer_Detector() { delete dx9_hook; @@ -95,7 +104,8 @@ private: dx12_hook(nullptr), opengl_hook(nullptr), vulkan_hook(nullptr), - detection_done(false) + detection_done(false), + force_done(false) { std::wstring tmp(4096, L'\0'); tmp.resize(GetSystemDirectoryW(&tmp[0], tmp.size())); @@ -142,7 +152,7 @@ private: OpenGL_Hook* opengl_hook; Vulkan_Hook* vulkan_hook; - bool detection_done; + bool detection_done, force_done; std::condition_variable stop_detection_cv; std::mutex stop_detection_mutex; @@ -1043,7 +1053,7 @@ public: std::lock_guard lk(renderer_mutex); if (detection_done) { - if (renderer_hook != nullptr) + if (renderer_hook != nullptr || force_done) return renderer_hook; detection_done = false; @@ -1122,6 +1132,7 @@ public: { System::scoped_lock lk(renderer_mutex, stop_detection_mutex); detection_done = true; + force_done = true; } stop_detection_cv.notify_all(); } @@ -1253,7 +1264,7 @@ public: std::lock_guard lk(renderer_mutex); if (detection_done) { - if (renderer_hook != nullptr) + if (renderer_hook != nullptr || force_done) return renderer_hook; detection_done = false; @@ -1305,6 +1316,7 @@ public: { System::scoped_lock lk(renderer_mutex, stop_detection_mutex); detection_done = true; + force_done = true; } stop_detection_cv.notify_all(); } @@ -1432,7 +1444,7 @@ public: std::lock_guard lk(renderer_mutex); if (detection_done) { - if (renderer_hook != nullptr) + if (renderer_hook != nullptr || force_done) return renderer_hook; detection_done = false; @@ -1484,6 +1496,7 @@ public: { System::scoped_lock lk(renderer_mutex, stop_detection_mutex); detection_done = true; + force_done = true; } stop_detection_cv.notify_all(); } @@ -1505,4 +1518,9 @@ void StopRendererDetection() Renderer_Detector::Inst()->stop_detection(); } +void FreeRendererDetection() +{ + Renderer_Detector::deleteInst(); +} + } \ No newline at end of file diff --git a/overlay_experimental/Renderer_Detector.h b/overlay_experimental/Renderer_Detector.h index d51d135..23abe07 100644 --- a/overlay_experimental/Renderer_Detector.h +++ b/overlay_experimental/Renderer_Detector.h @@ -31,5 +31,5 @@ namespace ingame_overlay { std::future DetectRenderer(std::chrono::milliseconds timeout = std::chrono::milliseconds{ -1 }); void StopRendererDetection(); - +void FreeRendererDetection(); } \ No newline at end of file diff --git a/overlay_experimental/steam_overlay.cpp b/overlay_experimental/steam_overlay.cpp index b54d0e8..720b2d8 100644 --- a/overlay_experimental/steam_overlay.cpp +++ b/overlay_experimental/steam_overlay.cpp @@ -207,6 +207,7 @@ void Steam_Overlay::UnSetupOverlay() if (!Ready() && future_renderer.valid()) { if (future_renderer.wait_for(std::chrono::milliseconds{500}) == std::future_status::ready) { future_renderer.get(); + ingame_overlay::FreeRendererDetection(); } } }