MayaFlux 0.5.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
VKSwapchain.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "VKContext.hpp"
4
5namespace MayaFlux::Core {
6
7class Window;
8
9/**
10 * @struct SwapchainSupportDetails
11 * @brief Holds swapchain capability information for a physical device
12 */
14 vk::SurfaceCapabilitiesKHR capabilities;
15 std::vector<vk::SurfaceFormatKHR> formats;
16 std::vector<vk::PresentModeKHR> present_modes;
17
18 [[nodiscard]] bool is_adequate() const
19 {
20 return !formats.empty() && !present_modes.empty();
21 }
22};
23
24/**
25 * @class VKSwapchain
26 * @brief Manages Vulkan swapchain using C++ API (vulkan.hpp)
27 */
29public:
30 VKSwapchain() = default;
32
33 VKSwapchain(const VKSwapchain&) = delete;
35
36 /**
37 * @brief Create swapchain for the given surface using VKContext
38 * @param context Vulkan context (provides device and configuration)
39 * @param surface Window surface
40 * @param window_config per-window configuration overrides
41 * @param sharing_families Queue families that will access the swapchain
42 * images. Empty or single-entry yields eExclusive; two or more
43 * distinct families yields eConcurrent. Supply both graphics and
44 * present families when driving presentation on a separate queue.
45 * @return True if creation succeeded
46 */
47 bool create(VKContext& context, vk::SurfaceKHR surface,
48 const WindowCreateInfo& window_config,
49 const std::vector<uint32_t>& sharing_families = {});
50
51 /**
52 * @brief Recreate swapchain (for window resize)
53 * @param width New width
54 * @param height New height
55 * @return True if recreation succeeded
56 */
57 bool recreate(uint32_t width, uint32_t height);
58
59 /**
60 * @brief Cleanup swapchain resources
61 */
62 void cleanup();
63
64 /**
65 * @brief Acquire next image from swapchain
66 * @param signal_semaphore Semaphore to signal when image is acquired
67 * @param timeout_ns Timeout in nanoseconds (UINT64_MAX = no timeout)
68 * @return Image index, or empty if acquisition failed
69 */
70 std::optional<uint32_t> acquire_next_image(
71 vk::Semaphore signal_semaphore,
72 uint64_t timeout_ns = UINT64_MAX);
73
74 /**
75 * @brief Present image to screen
76 * @param image_index Index of image to present
77 * @param wait_semaphore Semaphore to wait on before presenting
78 * @param present_queue Queue to submit present operation to (optional, uses context's graphics queue if null)
79 * @return True if present succeeded, false if swapchain out of date
80 */
81 bool present(uint32_t image_index,
82 vk::Semaphore wait_semaphore,
83 vk::Queue present_queue = nullptr);
84
85 // Getters
86 [[nodiscard]] vk::SwapchainKHR get_swapchain() const { return m_swapchain; }
87 [[nodiscard]] vk::Format get_image_format() const { return m_image_format; }
88 [[nodiscard]] vk::Extent2D get_extent() const { return m_extent; }
89 [[nodiscard]] uint32_t get_image_count() const { return static_cast<uint32_t>(m_images.size()); }
90 [[nodiscard]] const std::vector<vk::Image>& get_images() const { return m_images; }
91 [[nodiscard]] const std::vector<vk::ImageView>& get_image_views() const { return m_image_views; }
92
93 /**
94 * @brief Query swapchain support details for a device
95 */
97 vk::PhysicalDevice physical_device,
98 vk::SurfaceKHR surface);
99
100private:
101 VKContext* m_context = nullptr; // Non-owning pointer to context
102 vk::SurfaceKHR m_surface;
103 const WindowCreateInfo* m_window_config = nullptr; // Store for recreation
104 std::vector<uint32_t> m_sharing_families;
105
106 vk::SwapchainKHR m_swapchain;
107 std::vector<vk::Image> m_images;
108 std::vector<vk::ImageView> m_image_views;
109
110 vk::Format m_image_format;
111 vk::Extent2D m_extent;
112
113 /**
114 * @brief Choose best surface format from available formats based on config
115 */
116 [[nodiscard]] vk::SurfaceFormatKHR choose_surface_format(
117 const std::vector<vk::SurfaceFormatKHR>& available_formats,
119 GraphicsSurfaceInfo::ColorSpace desired_color_space) const;
120
121 /**
122 * @brief Choose best present mode from available modes based on config
123 */
124 [[nodiscard]] vk::PresentModeKHR choose_present_mode(
125 const std::vector<vk::PresentModeKHR>& available_modes,
126 GraphicsSurfaceInfo::PresentMode desired_mode) const;
127
128 /**
129 * @brief Choose swap extent based on capabilities
130 */
131 [[nodiscard]] vk::Extent2D choose_extent(
132 const vk::SurfaceCapabilitiesKHR& capabilities,
133 uint32_t width,
134 uint32_t height) const;
135
136 /**
137 * @brief Find an HDR-capable format from available formats
138 */
139 [[nodiscard]] std::optional<vk::SurfaceFormatKHR> find_hdr_format(
140 const std::vector<vk::SurfaceFormatKHR>& available_formats) const;
141
142 /**
143 * @brief Create image views for swapchain images
144 */
145 bool create_image_views();
146
147 /**
148 * @brief Cleanup old swapchain during recreation
149 */
150 void cleanup_swapchain();
151};
152
153} // namespace MayaFlux::Core
uint32_t width
uint32_t height
High-level wrapper for Vulkan instance and device.
Definition VKContext.hpp:16
vk::Extent2D choose_extent(const vk::SurfaceCapabilitiesKHR &capabilities, uint32_t width, uint32_t height) const
Choose swap extent based on capabilities.
vk::PresentModeKHR choose_present_mode(const std::vector< vk::PresentModeKHR > &available_modes, GraphicsSurfaceInfo::PresentMode desired_mode) const
Choose best present mode from available modes based on config.
vk::Format get_image_format() const
vk::SwapchainKHR get_swapchain() const
const std::vector< vk::Image > & get_images() const
bool create_image_views()
Create image views for swapchain images.
VKSwapchain(const VKSwapchain &)=delete
vk::Extent2D get_extent() const
static SwapchainSupportDetails query_support(vk::PhysicalDevice physical_device, vk::SurfaceKHR surface)
Query swapchain support details for a device.
bool present(uint32_t image_index, vk::Semaphore wait_semaphore, vk::Queue present_queue=nullptr)
Present image to screen.
std::optional< uint32_t > acquire_next_image(vk::Semaphore signal_semaphore, uint64_t timeout_ns=UINT64_MAX)
Acquire next image from swapchain.
VKSwapchain & operator=(const VKSwapchain &)=delete
bool recreate(uint32_t width, uint32_t height)
Recreate swapchain (for window resize)
uint32_t get_image_count() const
void cleanup()
Cleanup swapchain resources.
bool create(VKContext &context, vk::SurfaceKHR surface, const WindowCreateInfo &window_config, const std::vector< uint32_t > &sharing_families={})
Create swapchain for the given surface using VKContext.
std::optional< vk::SurfaceFormatKHR > find_hdr_format(const std::vector< vk::SurfaceFormatKHR > &available_formats) const
Find an HDR-capable format from available formats.
vk::SurfaceFormatKHR choose_surface_format(const std::vector< vk::SurfaceFormatKHR > &available_formats, GraphicsSurfaceInfo::SurfaceFormat desired_format, GraphicsSurfaceInfo::ColorSpace desired_color_space) const
Choose best surface format from available formats based on config.
void cleanup_swapchain()
Cleanup old swapchain during recreation.
const std::vector< vk::ImageView > & get_image_views() const
std::vector< vk::Image > m_images
std::vector< uint32_t > m_sharing_families
std::vector< vk::ImageView > m_image_views
const WindowCreateInfo * m_window_config
Manages Vulkan swapchain using C++ API (vulkan.hpp)
ColorSpace
Default color space for window surfaces.
SurfaceFormat
Default pixel format for window surfaces (Vulkan-compatible)
PresentMode
Frame presentation strategy.
std::vector< vk::PresentModeKHR > present_modes
std::vector< vk::SurfaceFormatKHR > formats
vk::SurfaceCapabilitiesKHR capabilities
Holds swapchain capability information for a physical device.
Configuration for creating a single window instance.