From d95404e2f7eaa4d0b432ba901d49ee46a923064c Mon Sep 17 00:00:00 2001 From: sharkautarch <128002472+sharkautarch@users.noreply.github.com> Date: Wed, 11 Dec 2024 16:52:11 -0500 Subject: [PATCH] steamcompmgr: fix another coredump-at-exit --- src/backend.cpp | 2 +- src/backend.h | 1 + src/steamcompmgr.cpp | 18 +++++++++++++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/backend.cpp b/src/backend.cpp index d07f847ba6..69bd270739 100644 --- a/src/backend.cpp +++ b/src/backend.cpp @@ -27,7 +27,7 @@ namespace gamescope bool IBackend::Set( IBackend *pBackend ) { if ( s_pBackend ) { - GetBackend()->IBackend::~IBackend(); + static_cast(GetBackend())->CBaseBackend::~CBaseBackend(); } if ( pBackend ) diff --git a/src/backend.h b/src/backend.h index dd295f4ac0..f88b5f2166 100644 --- a/src/backend.h +++ b/src/backend.h @@ -269,6 +269,7 @@ namespace gamescope class CBaseBackend : public IBackend { public: + virtual ~CBaseBackend() {} virtual INestedHints *GetNestedHints() override; virtual bool HackTemporarySetDynamicRefresh( int nRefresh ) override { return false; } diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp index 8d15bda9d2..996458d945 100644 --- a/src/steamcompmgr.cpp +++ b/src/steamcompmgr.cpp @@ -5898,6 +5898,23 @@ error(Display *dpy, XErrorEvent *ev) [[noreturn]] static void steamcompmgr_exit(std::optional> lock = std::nullopt) { + + // Need to clear all the vk_lutxd references (which can be tied to backend-allocated memory) + // for the colormgmt globals/statics, to avoid coredump at exit from within the colormgmt exit-time destructors: + for (auto& colorMgmtArr : + { + std::ref(g_ColorMgmtLuts), + std::ref(g_ColorMgmtLutsOverride), + std::ref(g_ScreenshotColorMgmtLuts), + std::ref(g_ScreenshotColorMgmtLutsHDR) + }) + { + for (auto& colorMgmt : colorMgmtArr.get()) + { + colorMgmt.gamescope_color_mgmt_luts::~gamescope_color_mgmt_luts(); //dtor call also calls all the subobjects' dtors + } + } + g_ImageWaiter.Shutdown(); // Clean up any commits. @@ -5922,7 +5939,6 @@ steamcompmgr_exit(std::optional> lock = std::nullop { g_ColorMgmt.pending.appHDRMetadata = nullptr; g_ColorMgmt.current.appHDRMetadata = nullptr; - s_scRGB709To2020Matrix = nullptr; for (int i = 0; i < gamescope::GAMESCOPE_SCREEN_TYPE_COUNT; i++) {