aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/gpu.cpp
diff options
context:
space:
mode:
authorlizzie <lizzie@eden-emu.dev>2026-09-11 15:29:52 +0200
committercrueter <crueter@eden-emu.dev>2026-09-11 15:29:52 +0200
commitc95ad020fb529d47f9c3106a53553bec955c1586 (patch)
tree6aaf5e8771784a24b359caae7b7fb5fe0965313e /src/video_core/gpu.cpp
parentf3af5d0c252feba0df73bedddcd8a40f71ebc0fa (diff)
[gpu] Fix infinite hangup/freezes at shutdown/reset (#4395)
Thread may be destroyed at dtor(), but it hasn't fully shut down, so before notify shutdown, request immediate stop (effective immediately). Like the issue was that the thread didn't want to stop running, thus it would hang, it would also reference objects which were being destroyed without waiting for them to actually be destroyed So it would reference invalid data This PR tells the thread: "hey, STOP now, and DESTROY yourself" So all of that should be avoided Signed-off-by: lizzie <lizzie@eden-emu.dev> - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4395 Reviewed-by: Maufeat <sahyno1996@gmail.com> Reviewed-by: MaranBr <maranbr@eden-emu.dev>
Diffstat (limited to 'src/video_core/gpu.cpp')
-rw-r--r--src/video_core/gpu.cpp9
1 files changed, 5 insertions, 4 deletions
diff --git a/src/video_core/gpu.cpp b/src/video_core/gpu.cpp
index a2e87b260a..9901cf4262 100644
--- a/src/video_core/gpu.cpp
+++ b/src/video_core/gpu.cpp
@@ -55,8 +55,8 @@ constexpr u64 GpuClockMultiplier(Settings::GpuClock clock) {
struct GPU::Impl {
explicit Impl(Core::System& system_, bool is_async_, bool use_nvdec_)
- : gpu_thread{system_}
- , system{system_}
+ : system{system_}
+ , gpu_thread{system_}
, use_nvdec{use_nvdec_}
, shader_notify()
, is_async{is_async_}
@@ -182,6 +182,7 @@ struct GPU::Impl {
}
void NotifyShutdown() {
+ gpu_thread.NotifyShutdown();
std::unique_lock lk{sync_mutex};
shutting_down.store(true, std::memory_order::relaxed);
sync_cv.notify_all();
@@ -301,12 +302,12 @@ struct GPU::Impl {
return out;
}
+ Core::System& system;
+
// Destruction of thread must be done before all (non trivial)
// previous members has been destroyed
VideoCommon::GPUThread::ThreadManager gpu_thread;
- Core::System& system;
-
std::unique_ptr<VideoCore::RendererBase> renderer;
const bool use_nvdec;