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 renderer; const bool use_nvdec; diff --git a/src/video_core/gpu_thread.cpp b/src/video_core/gpu_thread.cpp index 2acf9ac458..a01375e7be 100644 --- a/src/video_core/gpu_thread.cpp +++ b/src/video_core/gpu_thread.cpp @@ -114,4 +114,11 @@ u64 ThreadManager::PushCommand(CommandData&& command_data, bool block, bool is_a return fence; } +void ThreadManager::NotifyShutdown() { + if (thread.joinable()) { + thread.request_stop(); + thread.join(); + } +} + } // namespace VideoCommon::GPUThread diff --git a/src/video_core/gpu_thread.h b/src/video_core/gpu_thread.h index 4c3fadce15..631a680db4 100644 --- a/src/video_core/gpu_thread.h +++ b/src/video_core/gpu_thread.h @@ -125,6 +125,8 @@ public: void TickGPU(bool is_async); + void NotifyShutdown(); + private: /// Pushes a command to be executed by the GPU thread u64 PushCommand(CommandData&& command_data, bool block, bool is_async);