diff options
author | liamwhite <liamwhite@users.noreply.github.com> | 2023-06-23 15:27:14 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-06-23 15:27:14 +0200 |
commit | a6740224346db3c86944783e2b91dc7180c05537 (patch) | |
tree | af122b8a75d07f25113ef277aa25b2fdca14d05f /src/video_core | |
parent | Merge pull request #10842 from german77/native_mifare (diff) | |
parent | general: remove atomic signal and wait (diff) | |
download | yuzu-a6740224346db3c86944783e2b91dc7180c05537.tar yuzu-a6740224346db3c86944783e2b91dc7180c05537.tar.gz yuzu-a6740224346db3c86944783e2b91dc7180c05537.tar.bz2 yuzu-a6740224346db3c86944783e2b91dc7180c05537.tar.lz yuzu-a6740224346db3c86944783e2b91dc7180c05537.tar.xz yuzu-a6740224346db3c86944783e2b91dc7180c05537.tar.zst yuzu-a6740224346db3c86944783e2b91dc7180c05537.zip |
Diffstat (limited to 'src/video_core')
-rw-r--r-- | src/video_core/renderer_vulkan/vk_master_semaphore.cpp | 22 | ||||
-rw-r--r-- | src/video_core/renderer_vulkan/vk_master_semaphore.h | 1 |
2 files changed, 10 insertions, 13 deletions
diff --git a/src/video_core/renderer_vulkan/vk_master_semaphore.cpp b/src/video_core/renderer_vulkan/vk_master_semaphore.cpp index 5eeda08d2..6b288b994 100644 --- a/src/video_core/renderer_vulkan/vk_master_semaphore.cpp +++ b/src/video_core/renderer_vulkan/vk_master_semaphore.cpp @@ -75,15 +75,9 @@ void MasterSemaphore::Refresh() { void MasterSemaphore::Wait(u64 tick) { if (!semaphore) { - // If we don't support timeline semaphores, use an atomic wait - while (true) { - u64 current_value = gpu_tick.load(std::memory_order_relaxed); - if (current_value >= tick) { - return; - } - gpu_tick.wait(current_value); - } - + // 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; }); return; } @@ -198,11 +192,13 @@ void MasterSemaphore::WaitThread(std::stop_token token) { fence.Wait(); fence.Reset(); - gpu_tick.store(host_tick); - gpu_tick.notify_all(); - std::scoped_lock lock{free_mutex}; - free_queue.push_front(std::move(fence)); + { + std::scoped_lock lock{free_mutex}; + free_queue.push_front(std::move(fence)); + gpu_tick.store(host_tick); + } + free_cv.notify_one(); } } diff --git a/src/video_core/renderer_vulkan/vk_master_semaphore.h b/src/video_core/renderer_vulkan/vk_master_semaphore.h index 1e7c90215..3f599d7bd 100644 --- a/src/video_core/renderer_vulkan/vk_master_semaphore.h +++ b/src/video_core/renderer_vulkan/vk_master_semaphore.h @@ -72,6 +72,7 @@ private: std::atomic<u64> current_tick{1}; ///< Current logical tick. std::mutex wait_mutex; std::mutex free_mutex; + std::condition_variable free_cv; std::condition_variable_any wait_cv; std::queue<Waitable> wait_queue; ///< Queue for the fences to be waited on by the wait thread. std::deque<vk::Fence> free_queue; ///< Holds available fences for submission. |