MayaFlux 0.3.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
BackendWindowHandler.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "vulkan/vulkan.hpp"
4
6struct DisplayService;
7}
8
9namespace MayaFlux::Core {
10
11class VKContext;
12class VKImage;
13class VKSwapchain;
14class VKCommandManager;
15class Window;
16class BackendResourceManager;
17
19 std::shared_ptr<Window> window;
20 vk::SurfaceKHR surface;
21 std::unique_ptr<VKSwapchain> swapchain;
22
23 std::vector<vk::Semaphore> image_available;
24 std::vector<vk::Semaphore> render_finished;
25 std::vector<vk::Fence> in_flight;
26
27 std::vector<vk::CommandBuffer> clear_command_buffers;
28 std::shared_ptr<VKImage> depth_image;
29
31 size_t current_frame {};
33
36
41
42 void cleanup(VKContext& context);
43};
44
45class MAYAFLUX_API BackendWindowHandler {
46public:
47 BackendWindowHandler(VKContext& context, VKCommandManager& command_manager);
49
50 void setup_backend_service(const std::shared_ptr<Registry::Service::DisplayService>& display_service);
51
54
56 BackendWindowHandler& operator=(BackendWindowHandler&&) noexcept = default;
57
58 // ========================================================================
59 // Window management
60 // ========================================================================
61 bool register_window(const std::shared_ptr<Window>& window);
62 void unregister_window(const std::shared_ptr<Window>& window);
63 [[nodiscard]] bool is_window_registered(const std::shared_ptr<Window>& window) const;
64
65 // ========================================================================
66 // Rendering
67 // ========================================================================
68 void render_window(const std::shared_ptr<Window>& window);
69 void render_all_windows();
70 void handle_window_resize();
71
72 void submit_and_present(
73 const std::shared_ptr<Window>& window,
74 const vk::CommandBuffer& command_buffer);
75
76 // ========================================================================
77 // Access control
78 // ========================================================================
79 WindowRenderContext* find_window_context(const std::shared_ptr<Window>& window);
80 [[nodiscard]] const WindowRenderContext* find_window_context(const std::shared_ptr<Window>& window) const;
81
82 // Information
83 [[nodiscard]] uint32_t get_swapchain_image_count(const std::shared_ptr<Window>& window) const;
84
85 // Cleanup
86 void cleanup();
87
88 void set_resource_manager(BackendResourceManager* resource_manager) { m_resource_manager = resource_manager; }
89
90private:
93 std::vector<WindowRenderContext> m_window_contexts;
94
95 /**
96 * @brief Create synchronization objects for a window's swapchain
97 * @param config Window swapchain configuration to populate
98 * @return True if creation succeeded
99 */
100 bool create_sync_objects(WindowRenderContext& config);
101
102 /**
103 * @brief Recreate the swapchain and related resources for a window
104 * @param context Window render context
105 */
106 void recreate_swapchain_for_context(WindowRenderContext& context);
107
108 /**
109 * @brief Internal logic to recreate swapchain and related resources
110 * @param context Window render context
111 * @return True if recreation succeeded
112 */
113 bool recreate_swapchain_internal(WindowRenderContext& context);
114
115 /**
116 * @brief Ensure depth image exists at current swapchain extent
117 * @param ctx Window context to create depth image for
118 *
119 * Creates or recreates a D32_SFLOAT depth image matching the
120 * swapchain extent. No-op if depth image already matches.
121 */
122 void ensure_depth_image(WindowRenderContext& ctx);
123
124 /**
125 * @brief Render empty windows with clear color
126 * @param ctx Window render context
127 *
128 * For windows that are registered for processing but have no buffers attached,
129 * this performs a minimal clear pass so the window is visible and responsive
130 * to input events.
131 */
132 void render_empty_window(WindowRenderContext& ctx);
133
134 BackendResourceManager* m_resource_manager {};
135};
136
137}
Manages Vulkan resources (buffers, images, samplers) for the graphics backend.
BackendWindowHandler(BackendWindowHandler &&) noexcept=default
BackendWindowHandler & operator=(const BackendWindowHandler &)=delete
std::vector< WindowRenderContext > m_window_contexts
BackendWindowHandler(const BackendWindowHandler &)=delete
Manages Vulkan command pools and command buffers.
High-level wrapper for Vulkan instance and device.
Definition VKContext.hpp:16
Platform-agnostic window wrapper.
Definition Window.hpp:22
std::vector< vk::Semaphore > image_available
std::unique_ptr< VKSwapchain > swapchain
WindowRenderContext(WindowRenderContext &&)=default
std::vector< vk::Semaphore > render_finished
std::vector< vk::CommandBuffer > clear_command_buffers
WindowRenderContext & operator=(WindowRenderContext &&)=default
WindowRenderContext(const WindowRenderContext &)=delete
WindowRenderContext & operator=(const WindowRenderContext &)=delete