Vulkan: Fix the master Semaphore

This commit is contained in:
FernandoS27 2021-10-04 20:46:58 +02:00
parent 35f46fc079
commit 7f4de3466a

View File

@ -21,12 +21,12 @@ public:
/// Returns the current logical tick. /// Returns the current logical tick.
[[nodiscard]] u64 CurrentTick() const noexcept { [[nodiscard]] u64 CurrentTick() const noexcept {
return current_tick.load(std::memory_order_relaxed); return current_tick.load(std::memory_order_acquire);
} }
/// Returns the last known GPU tick. /// Returns the last known GPU tick.
[[nodiscard]] u64 KnownGpuTick() const noexcept { [[nodiscard]] u64 KnownGpuTick() const noexcept {
return gpu_tick.load(std::memory_order_relaxed); return gpu_tick.load(std::memory_order_acquire);
} }
/// Returns the timeline semaphore handle. /// Returns the timeline semaphore handle.
@ -41,12 +41,20 @@ public:
/// Advance to the logical tick and return the old one /// Advance to the logical tick and return the old one
[[nodiscard]] u64 NextTick() noexcept { [[nodiscard]] u64 NextTick() noexcept {
return current_tick.fetch_add(1, std::memory_order::relaxed); return current_tick.fetch_add(1, std::memory_order_release);
} }
/// Refresh the known GPU tick /// Refresh the known GPU tick
void Refresh() { void Refresh() {
gpu_tick.store(semaphore.GetCounter(), std::memory_order_relaxed); auto this_tick = gpu_tick.load(std::memory_order_acquire);
u64 counter{};
do {
counter = semaphore.GetCounter();
if (counter < this_tick) {
return;
}
} while (!gpu_tick.compare_exchange_weak(this_tick, counter, std::memory_order_release,
std::memory_order_relaxed));
} }
/// Waits for a tick to be hit on the GPU /// Waits for a tick to be hit on the GPU