diff --git a/src/core/libraries/gnmdriver/gnmdriver.cpp b/src/core/libraries/gnmdriver/gnmdriver.cpp index a2358955d..9b351c3c4 100644 --- a/src/core/libraries/gnmdriver/gnmdriver.cpp +++ b/src/core/libraries/gnmdriver/gnmdriver.cpp @@ -1455,6 +1455,7 @@ int PS4_SYSV_ABI sceGnmSubmitDone() { if (!liverpool->IsGpuIdle()) { submission_lock = true; } + liverpool->NotifySubmitDone(); return ORBIS_OK; } diff --git a/src/video_core/amdgpu/liverpool.cpp b/src/video_core/amdgpu/liverpool.cpp index 0bcc34863..ddfff4b74 100644 --- a/src/video_core/amdgpu/liverpool.cpp +++ b/src/video_core/amdgpu/liverpool.cpp @@ -61,7 +61,11 @@ void Liverpool::Process(std::stop_token stoken) { --num_submits; } } - num_submits.notify_all(); + + if (submit_done) { + num_submits.notify_all(); + submit_done = false; + } } } diff --git a/src/video_core/amdgpu/liverpool.h b/src/video_core/amdgpu/liverpool.h index 9c2b4bcd2..4718d174d 100644 --- a/src/video_core/amdgpu/liverpool.h +++ b/src/video_core/amdgpu/liverpool.h @@ -777,6 +777,10 @@ public: return num_submits == 0; } + void NotifySubmitDone() { + submit_done = true; + } + void BindRasterizer(Vulkan::Rasterizer* rasterizer_) { rasterizer = rasterizer_; } @@ -841,6 +845,7 @@ private: Vulkan::Rasterizer* rasterizer{}; std::jthread process_thread{}; std::atomic num_submits{}; + std::atomic submit_done{}; }; static_assert(GFX6_3D_REG_INDEX(ps_program) == 0x2C08);