summaryrefslogtreecommitdiff
path: root/src/video_core
diff options
context:
space:
mode:
authorGravatar liamwhite2023-06-23 09:27:14 -0400
committerGravatar GitHub2023-06-23 09:27:14 -0400
commita6740224346db3c86944783e2b91dc7180c05537 (patch)
treeaf122b8a75d07f25113ef277aa25b2fdca14d05f /src/video_core
parentMerge pull request #10842 from german77/native_mifare (diff)
parentgeneral: remove atomic signal and wait (diff)
downloadyuzu-a6740224346db3c86944783e2b91dc7180c05537.tar.gz
yuzu-a6740224346db3c86944783e2b91dc7180c05537.tar.xz
yuzu-a6740224346db3c86944783e2b91dc7180c05537.zip
Merge pull request #10859 from liamwhite/no-more-atomic-wait
general: remove atomic signal and wait
Diffstat (limited to 'src/video_core')
-rw-r--r--src/video_core/renderer_vulkan/vk_master_semaphore.cpp22
-rw-r--r--src/video_core/renderer_vulkan/vk_master_semaphore.h1
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() {
75 75
76void MasterSemaphore::Wait(u64 tick) { 76void MasterSemaphore::Wait(u64 tick) {
77 if (!semaphore) { 77 if (!semaphore) {
78 // If we don't support timeline semaphores, use an atomic wait 78 // If we don't support timeline semaphores, wait for the value normally
79 while (true) { 79 std::unique_lock lk{free_mutex};
80 u64 current_value = gpu_tick.load(std::memory_order_relaxed); 80 free_cv.wait(lk, [&] { return gpu_tick.load(std::memory_order_relaxed) >= tick; });
81 if (current_value >= tick) {
82 return;
83 }
84 gpu_tick.wait(current_value);
85 }
86
87 return; 81 return;
88 } 82 }
89 83
@@ -198,11 +192,13 @@ void MasterSemaphore::WaitThread(std::stop_token token) {
198 192
199 fence.Wait(); 193 fence.Wait();
200 fence.Reset(); 194 fence.Reset();
201 gpu_tick.store(host_tick);
202 gpu_tick.notify_all();
203 195
204 std::scoped_lock lock{free_mutex}; 196 {
205 free_queue.push_front(std::move(fence)); 197 std::scoped_lock lock{free_mutex};
198 free_queue.push_front(std::move(fence));
199 gpu_tick.store(host_tick);
200 }
201 free_cv.notify_one();
206 } 202 }
207} 203}
208 204
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:
72 std::atomic<u64> current_tick{1}; ///< Current logical tick. 72 std::atomic<u64> current_tick{1}; ///< Current logical tick.
73 std::mutex wait_mutex; 73 std::mutex wait_mutex;
74 std::mutex free_mutex; 74 std::mutex free_mutex;
75 std::condition_variable free_cv;
75 std::condition_variable_any wait_cv; 76 std::condition_variable_any wait_cv;
76 std::queue<Waitable> wait_queue; ///< Queue for the fences to be waited on by the wait thread. 77 std::queue<Waitable> wait_queue; ///< Queue for the fences to be waited on by the wait thread.
77 std::deque<vk::Fence> free_queue; ///< Holds available fences for submission. 78 std::deque<vk::Fence> free_queue; ///< Holds available fences for submission.