Browse Source

an additional counter is not needed

pull/3598/head
PavelBARABANOV 2 weeks ago
parent
commit
c2079c54d4
  1. 12
      src/video_core/renderer_vulkan/vk_master_semaphore.cpp
  2. 1
      src/video_core/renderer_vulkan/vk_master_semaphore.h

12
src/video_core/renderer_vulkan/vk_master_semaphore.cpp

@ -83,11 +83,10 @@ void MasterSemaphore::Wait(u64 tick) {
return;
}
// Wait for fence completions using atomic wait
u64 last_notify = notify_counter.load(std::memory_order_relaxed);
u64 last_tick = gpu_tick.load(std::memory_order_relaxed);
while (gpu_tick.load(std::memory_order_acquire) < tick) {
notify_counter.wait(last_notify, std::memory_order_acquire);
last_notify = notify_counter.load(std::memory_order_relaxed);
gpu_tick.wait(last_tick, std::memory_order_acquire);
last_tick = gpu_tick.load(std::memory_order_relaxed);
}
return;
}
@ -223,15 +222,16 @@ void MasterSemaphore::WaitThread(std::stop_token token) {
std::tie(host_tick, fence) = std::move(wait_queue.front());
wait_queue.pop();
}
fence.Wait();
fence.Reset();
{
std::scoped_lock lock{free_mutex};
free_queue.push_front(std::move(fence));
gpu_tick.store(host_tick, std::memory_order_release);
notify_counter.fetch_add(1, std::memory_order_release);
}
notify_counter.notify_one();
gpu_tick.notify_one();
}
}

1
src/video_core/renderer_vulkan/vk_master_semaphore.h

@ -75,7 +75,6 @@ private:
vk::Semaphore semaphore; ///< Timeline semaphore.
std::atomic<u64> gpu_tick{0}; ///< Current known GPU tick.
std::atomic<u64> current_tick{1}; ///< Current logical tick.
std::atomic<u64> notify_counter{0}; ///< Fence completion counter for atomic wait.
std::mutex wait_mutex;
std::mutex free_mutex;
std::condition_variable_any wait_cv;

Loading…
Cancel
Save