From a921b2e29ebdeb52265308d11bfff74e60408e95 Mon Sep 17 00:00:00 2001 From: PavelBARABANOV Date: Fri, 5 Dec 2025 02:43:15 +0300 Subject: [PATCH] [vk_master_semaphore] Fix Android fence deadlock with polling --- .../renderer_vulkan/vk_master_semaphore.cpp | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_master_semaphore.cpp b/src/video_core/renderer_vulkan/vk_master_semaphore.cpp index e65755de64..a82e2c73fa 100644 --- a/src/video_core/renderer_vulkan/vk_master_semaphore.cpp +++ b/src/video_core/renderer_vulkan/vk_master_semaphore.cpp @@ -80,7 +80,9 @@ void MasterSemaphore::Wait(u64 tick) { if (!semaphore) { // If we don't support timeline semaphores, wait for the value normally std::unique_lock lk{free_mutex}; - free_cv.wait(lk, [&] { return gpu_tick.load(std::memory_order_relaxed) >= tick; }); + free_cv.wait(lk, [&] { + return gpu_tick.load(std::memory_order_acquire) >= tick; + }); return; } @@ -216,15 +218,32 @@ void MasterSemaphore::WaitThread(std::stop_token token) { wait_queue.pop(); } +#ifdef ANDROID + VkResult status; + do { + status = fence.GetStatus(); + if (status == VK_NOT_READY) { + std::this_thread::sleep_for(std::chrono::microseconds(100)); + } + } while (status == VK_NOT_READY); + + if (status == VK_SUCCESS) { + fence.Reset(); + } else { + vk::Check(status); + continue; + } +#else fence.Wait(); fence.Reset(); +#endif { std::scoped_lock lock{free_mutex}; free_queue.push_front(std::move(fence)); - gpu_tick.store(host_tick); + gpu_tick.store(host_tick, std::memory_order_release); } - free_cv.notify_one(); + free_cv.notify_all(); } }