gamescope/patches/1335.patch
Ward from fusion-voyager-3 4d380903fe
Some checks failed
PikaOS Package Build Only (Canary) (amd64-v3) / build (push) Failing after 1m8s
PikaOS Package Build Only (amd64-v3) / build (push) Failing after 1s
PikaOS Package Build & Release (Canary) (amd64-v3) / build (push) Failing after 1m7s
PikaOS Package Build & Release (amd64-v3) / build (push) Failing after 1s
port to pika os 4
2024-07-28 20:28:08 +03:00

128 lines
4.0 KiB
Diff

From 35f5ba8bb9297d06b7d8238295ae3601367d91ad Mon Sep 17 00:00:00 2001
From: sharkautarch <128002472+sharkautarch@users.noreply.github.com>
Date: Fri, 24 May 2024 15:43:09 -0400
Subject: [PATCH 1/2] sdlwindow.cpp: close m_thread w/o std::terminate being
called
---
src/Backends/SDLBackend.cpp | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/src/Backends/SDLBackend.cpp b/src/Backends/SDLBackend.cpp
index d7456b6a4..5420683a3 100644
--- a/src/Backends/SDLBackend.cpp
+++ b/src/Backends/SDLBackend.cpp
@@ -53,6 +53,7 @@ namespace gamescope
GAMESCOPE_SDL_EVENT_CURSOR,
GAMESCOPE_SDL_EVENT_COUNT,
+ GAMESCOPE_SDL_EVENT_REQ_EXIT,
};
class CSDLConnector final : public IBackendConnector
@@ -111,6 +112,7 @@ namespace gamescope
{
public:
CSDLBackend();
+ ~CSDLBackend();
/////////////
// IBackend
@@ -548,7 +550,12 @@ namespace gamescope
{
// Do nothing.
}
-
+
+ CSDLBackend::~CSDLBackend() {
+ PushUserEvent(GAMESCOPE_SDL_EVENT_REQ_EXIT);
+ m_SDLThread.join();
+ }
+
void CSDLBackend::SDLThreadFunc()
{
pthread_setname_np( pthread_self(), "gamescope-sdl" );
@@ -944,6 +951,9 @@ namespace gamescope
SDL_SetCursor( m_pCursor );
}
+ else if ( event.type == GetUserEventIndex( GAMESCOPE_SDL_EVENT_REQ_EXIT ) ) {
+ return;
+ }
}
break;
}
From 61392a9e545e0a3341c0d510aaa453c08826cc5b Mon Sep 17 00:00:00 2001
From: sharkautarch <128002472+sharkautarch@users.noreply.github.com>
Date: Thu, 30 May 2024 14:02:00 -0400
Subject: [PATCH 2/2] steamcompmgr, rendervulkan: prevent segfault that occured
when closing gamescope, due to a race condition between present thread @
present_wait_thread_func & compositor thread @ steamcompmgr_exit
---
src/rendervulkan.cpp | 7 ++++++-
src/rendervulkan.hpp | 4 ++++
src/steamcompmgr.cpp | 8 ++++++++
3 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/src/rendervulkan.cpp b/src/rendervulkan.cpp
index ffd0783da..094141839 100644
--- a/src/rendervulkan.cpp
+++ b/src/rendervulkan.cpp
@@ -2669,7 +2669,8 @@ bool acquire_next_image( void )
}
-static std::atomic<uint64_t> g_currentPresentWaitId = {0u};
+inline std::atomic<uint64_t> g_currentPresentWaitId = {0u};
+inline std::atomic<bool> g_presentThreadShouldExit = {false};
static std::mutex present_wait_lock;
extern void mangoapp_output_update( uint64_t vblanktime );
@@ -2693,6 +2694,10 @@ static void present_wait_thread_func( void )
uint64_t vblanktime = get_time_in_nanos();
GetVBlankTimer().MarkVBlank( vblanktime, true );
mangoapp_output_update( vblanktime );
+ } else if ( g_presentThreadShouldExit.load(std::memory_order_acquire)) {
+ g_presentThreadShouldExit = 0;
+ g_presentThreadShouldExit.notify_all();
+ return;
}
}
}
diff --git a/src/rendervulkan.hpp b/src/rendervulkan.hpp
index 177468228..a2e0dd972 100644
--- a/src/rendervulkan.hpp
+++ b/src/rendervulkan.hpp
@@ -74,6 +74,10 @@ enum EStreamColorspace : int
#include <vulkan/vulkan.h>
#include <drm_fourcc.h>
+extern std::atomic<uint64_t> g_currentPresentWaitId;
+
+extern std::atomic<bool> g_presentThreadShouldExit;
+
struct VulkanRenderer_t
{
struct wlr_renderer base;
diff --git a/src/steamcompmgr.cpp b/src/steamcompmgr.cpp
index 910ed3912..f6539829e 100644
--- a/src/steamcompmgr.cpp
+++ b/src/steamcompmgr.cpp
@@ -5840,6 +5840,14 @@ steamcompmgr_exit(void)
}
}
+ //request the present_wait thread to exit
+ //needed to avoid getting a segfault at exit due to race condition:
+ g_presentThreadShouldExit.store(true, std::memory_order_release);
+ g_currentPresentWaitId = 0; //present thread will check if it should exit if this is zero
+ g_currentPresentWaitId.notify_all();
+ g_presentThreadShouldExit.wait(true); //present thread will toggle this atomic when it sees the exit request
+ //this allows us to wait for present thread to close before deleting the backend
+
gamescope::IBackend::Set( nullptr );
wlserver_lock();