diff options
author | GPUCode <geoster3d@gmail.com> | 2023-05-20 13:08:05 +0200 |
---|---|---|
committer | GPUCode <geoster3d@gmail.com> | 2023-05-20 18:23:53 +0200 |
commit | 4e491ab59ba8b9c08253ca9cce5bb9fe909ac2ff (patch) | |
tree | 1a371195bf04722d77c01ec624224adc517ce7a3 /src/video_core/renderer_vulkan/vk_master_semaphore.h | |
parent | Merge pull request #10344 from german77/pro-amiibo (diff) | |
download | yuzu-4e491ab59ba8b9c08253ca9cce5bb9fe909ac2ff.tar yuzu-4e491ab59ba8b9c08253ca9cce5bb9fe909ac2ff.tar.gz yuzu-4e491ab59ba8b9c08253ca9cce5bb9fe909ac2ff.tar.bz2 yuzu-4e491ab59ba8b9c08253ca9cce5bb9fe909ac2ff.tar.lz yuzu-4e491ab59ba8b9c08253ca9cce5bb9fe909ac2ff.tar.xz yuzu-4e491ab59ba8b9c08253ca9cce5bb9fe909ac2ff.tar.zst yuzu-4e491ab59ba8b9c08253ca9cce5bb9fe909ac2ff.zip |
Diffstat (limited to 'src/video_core/renderer_vulkan/vk_master_semaphore.h')
-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 |