diff options
author | bunnei <bunneidev@gmail.com> | 2023-05-03 02:54:57 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-03 02:54:57 +0200 |
commit | 8f43b05d6b1be260f68907c581b8e3a91cf244d8 (patch) | |
tree | be95158c22707e828cd57be90c68f9a1f683d3f1 /src/video_core/renderer_vulkan/vk_present_manager.h | |
parent | Merge pull request #10133 from lat9nq/clang-shadow-and-fallthrough (diff) | |
parent | vk_present_manager: Add toggle for async presentation (diff) | |
download | yuzu-8f43b05d6b1be260f68907c581b8e3a91cf244d8.tar yuzu-8f43b05d6b1be260f68907c581b8e3a91cf244d8.tar.gz yuzu-8f43b05d6b1be260f68907c581b8e3a91cf244d8.tar.bz2 yuzu-8f43b05d6b1be260f68907c581b8e3a91cf244d8.tar.lz yuzu-8f43b05d6b1be260f68907c581b8e3a91cf244d8.tar.xz yuzu-8f43b05d6b1be260f68907c581b8e3a91cf244d8.tar.zst yuzu-8f43b05d6b1be260f68907c581b8e3a91cf244d8.zip |
Diffstat (limited to 'src/video_core/renderer_vulkan/vk_present_manager.h')
-rw-r--r-- | src/video_core/renderer_vulkan/vk_present_manager.h | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/src/video_core/renderer_vulkan/vk_present_manager.h b/src/video_core/renderer_vulkan/vk_present_manager.h new file mode 100644 index 000000000..9885fd7c6 --- /dev/null +++ b/src/video_core/renderer_vulkan/vk_present_manager.h @@ -0,0 +1,83 @@ +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include <condition_variable> +#include <mutex> +#include <queue> + +#include "common/common_types.h" +#include "common/polyfill_thread.h" +#include "video_core/vulkan_common/vulkan_memory_allocator.h" +#include "video_core/vulkan_common/vulkan_wrapper.h" + +namespace Core::Frontend { +class EmuWindow; +} // namespace Core::Frontend + +namespace Vulkan { + +class Device; +class Scheduler; +class Swapchain; + +struct Frame { + u32 width; + u32 height; + bool is_srgb; + vk::Image image; + vk::ImageView image_view; + vk::Framebuffer framebuffer; + MemoryCommit image_commit; + vk::CommandBuffer cmdbuf; + vk::Semaphore render_ready; + vk::Fence present_done; +}; + +class PresentManager { +public: + PresentManager(Core::Frontend::EmuWindow& render_window, const Device& device, + MemoryAllocator& memory_allocator, Scheduler& scheduler, Swapchain& swapchain); + ~PresentManager(); + + /// Returns the last used presentation frame + Frame* GetRenderFrame(); + + /// Pushes a frame for presentation + void PushFrame(Frame* frame); + + /// Recreates the present frame to match the provided parameters + void RecreateFrame(Frame* frame, u32 width, u32 height, bool is_srgb, + VkFormat image_view_format, VkRenderPass rd); + + /// Waits for the present thread to finish presenting all queued frames. + void WaitPresent(); + +private: + void PresentThread(std::stop_token token); + + void CopyToSwapchain(Frame* frame); + +private: + Core::Frontend::EmuWindow& render_window; + const Device& device; + MemoryAllocator& memory_allocator; + Scheduler& scheduler; + Swapchain& swapchain; + vk::CommandPool cmdpool; + std::vector<Frame> frames; + std::queue<Frame*> present_queue; + std::queue<Frame*> free_queue; + std::condition_variable_any frame_cv; + std::condition_variable free_cv; + std::mutex swapchain_mutex; + std::mutex queue_mutex; + std::mutex free_mutex; + std::jthread present_thread; + bool blit_supported; + bool use_present_thread; + std::size_t image_count; +}; + +} // namespace Vulkan |