summaryrefslogtreecommitdiff
path: root/src/video_core/fence_manager.h
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2023-08-04 03:32:30 +0200
committerGravatar Fernando Sahmkow2023-09-23 23:05:29 +0200
commitf1a2e367113518b277f34ffbb04499882c3b6051 (patch)
tree0920a98bd359b9207130d01f6df4ae5135ec805c /src/video_core/fence_manager.h
parentQuery Cache: Setup Base rework (diff)
downloadyuzu-f1a2e367113518b277f34ffbb04499882c3b6051.tar.gz
yuzu-f1a2e367113518b277f34ffbb04499882c3b6051.tar.xz
yuzu-f1a2e367113518b277f34ffbb04499882c3b6051.zip
Query Cachge: Fully rework Vulkan's query cache
Diffstat (limited to 'src/video_core/fence_manager.h')
-rw-r--r--src/video_core/fence_manager.h23
1 files changed, 21 insertions, 2 deletions
diff --git a/src/video_core/fence_manager.h b/src/video_core/fence_manager.h
index ab20ff30f..8459a3092 100644
--- a/src/video_core/fence_manager.h
+++ b/src/video_core/fence_manager.h
@@ -104,9 +104,28 @@ public:
104 SignalFence(std::move(func)); 104 SignalFence(std::move(func));
105 } 105 }
106 106
107 void WaitPendingFences() { 107 void WaitPendingFences(bool force) {
108 if constexpr (!can_async_check) { 108 if constexpr (!can_async_check) {
109 TryReleasePendingFences<true>(); 109 if (force) {
110 TryReleasePendingFences<true>();
111 } else {
112 TryReleasePendingFences<false>();
113 }
114 } else {
115 if (!force) {
116 return;
117 }
118 std::mutex wait_mutex;
119 std::condition_variable wait_cv;
120 std::atomic<bool> wait_finished{};
121 std::function<void()> func([&] {
122 std::scoped_lock lk(wait_mutex);
123 wait_finished.store(true, std::memory_order_relaxed);
124 wait_cv.notify_all();
125 });
126 SignalFence(std::move(func));
127 std::unique_lock lk(wait_mutex);
128 wait_cv.wait(lk, [&wait_finished] { return wait_finished.load(std::memory_order_relaxed); });
110 } 129 }
111 } 130 }
112 131