diff options
author | liamwhite <liamwhite@users.noreply.github.com> | 2023-05-23 15:42:56 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-23 15:42:56 +0200 |
commit | a5d4c3e5add279f22635ceaffa0c4690e2c9662a (patch) | |
tree | 4c22950697dd344b26a794fdb12388bb51218321 /src/video_core/renderer_vulkan/vk_master_semaphore.h | |
parent | Merge pull request #10402 from liamwhite/uh (diff) | |
parent | vk_master_semaphore: Move fence wait on separate thread (diff) | |
download | yuzu-a5d4c3e5add279f22635ceaffa0c4690e2c9662a.tar yuzu-a5d4c3e5add279f22635ceaffa0c4690e2c9662a.tar.gz yuzu-a5d4c3e5add279f22635ceaffa0c4690e2c9662a.tar.bz2 yuzu-a5d4c3e5add279f22635ceaffa0c4690e2c9662a.tar.lz yuzu-a5d4c3e5add279f22635ceaffa0c4690e2c9662a.tar.xz yuzu-a5d4c3e5add279f22635ceaffa0c4690e2c9662a.tar.zst yuzu-a5d4c3e5add279f22635ceaffa0c4690e2c9662a.zip |
Diffstat (limited to '')
-rw-r--r-- | src/video_core/renderer_vulkan/vk_master_semaphore.h | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/src/video_core/renderer_vulkan/vk_master_semaphore.h b/src/video_core/renderer_vulkan/vk_master_semaphore.h index f2f61f781..1e7c90215 100644 --- a/src/video_core/renderer_vulkan/vk_master_semaphore.h +++ b/src/video_core/renderer_vulkan/vk_master_semaphore.h @@ -5,8 +5,10 @@ #include <atomic> #include <condition_variable> +#include <deque> #include <mutex> #include <thread> +#include <queue> #include "common/common_types.h" #include "common/polyfill_thread.h" @@ -17,6 +19,8 @@ namespace Vulkan { class Device; class MasterSemaphore { + using Waitable = std::pair<u64, vk::Fence>; + public: explicit MasterSemaphore(const Device& device); ~MasterSemaphore(); @@ -57,13 +61,22 @@ private: VkResult SubmitQueueFence(vk::CommandBuffer& cmdbuf, VkSemaphore signal_semaphore, VkSemaphore wait_semaphore, u64 host_tick); + void WaitThread(std::stop_token token); + + vk::Fence GetFreeFence(); + private: const Device& device; ///< Device. - vk::Fence fence; ///< Fence. 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::mutex wait_mutex; + std::mutex free_mutex; + std::condition_variable_any wait_cv; + std::queue<Waitable> wait_queue; ///< Queue for the fences to be waited on by the wait thread. + std::deque<vk::Fence> free_queue; ///< Holds available fences for submission. std::jthread debug_thread; ///< Debug thread to workaround validation layer bugs. + std::jthread wait_thread; ///< Helper thread that waits for submitted fences. }; } // namespace Vulkan |