diff options
author | bunnei <bunneidev@gmail.com> | 2020-01-06 00:09:57 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-01-06 00:09:57 -0500 |
commit | 89fc75d76993d294ee106402bc78becc95d0bb38 (patch) | |
tree | 5efd323f3848e1203a72dc69f52f0cd02776ac48 /src/video_core/gpu.cpp | |
parent | 56e450a3f7a59d40be142eee781cdb01a88c7821 (diff) | |
parent | cb9dd01ffd3f54f5592330e3a37e2b26975bf209 (diff) |
Merge pull request #3257 from degasus/no_busy_loops
video_core: Block in WaitFence.
Diffstat (limited to 'src/video_core/gpu.cpp')
-rw-r--r-- | src/video_core/gpu.cpp | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/src/video_core/gpu.cpp b/src/video_core/gpu.cpp index 095660115..b9c5c41a2 100644 --- a/src/video_core/gpu.cpp +++ b/src/video_core/gpu.cpp @@ -66,19 +66,20 @@ const DmaPusher& GPU::DmaPusher() const { return *dma_pusher; } -void GPU::WaitFence(u32 syncpoint_id, u32 value) const { +void GPU::WaitFence(u32 syncpoint_id, u32 value) { // Synced GPU, is always in sync if (!is_async) { return; } MICROPROFILE_SCOPE(GPU_wait); - while (syncpoints[syncpoint_id].load(std::memory_order_relaxed) < value) { - } + std::unique_lock lock{sync_mutex}; + sync_cv.wait(lock, [=]() { return syncpoints[syncpoint_id].load() >= value; }); } void GPU::IncrementSyncPoint(const u32 syncpoint_id) { syncpoints[syncpoint_id]++; std::lock_guard lock{sync_mutex}; + sync_cv.notify_all(); if (!syncpt_interrupts[syncpoint_id].empty()) { u32 value = syncpoints[syncpoint_id].load(); auto it = syncpt_interrupts[syncpoint_id].begin(); |