MayaFlux 0.2.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 VKSwapchain;
13class VKCommandManager;
14class Window;
15
17 std::shared_ptr<Window> window;
18 vk::SurfaceKHR surface;
19 std::unique_ptr<VKSwapchain> swapchain;
20
21 std::vector<vk::Semaphore> image_available;
22 std::vector<vk::Semaphore> render_finished;
23 std::vector<vk::Fence> in_flight;
24
26 size_t current_frame {};
28
31
36
37 void cleanup(VKContext& context);
38};
39
40class MAYAFLUX_API BackendWindowHandler {
41public:
42 BackendWindowHandler(VKContext& context, VKCommandManager& command_manager);
44
45 void setup_backend_service(const std::shared_ptr<Registry::Service::DisplayService>& display_service);
46
49
51 BackendWindowHandler& operator=(BackendWindowHandler&&) noexcept = default;
52
53 // ========================================================================
54 // Window management
55 // ========================================================================
56 bool register_window(const std::shared_ptr<Window>& window);
57 void unregister_window(const std::shared_ptr<Window>& window);
58 [[nodiscard]] bool is_window_registered(const std::shared_ptr<Window>& window) const;
59
60 // ========================================================================
61 // Rendering
62 // ========================================================================
63 void render_window(const std::shared_ptr<Window>& window);
64 void render_all_windows();
65 void handle_window_resize();
66
67 void submit_and_present(
68 const std::shared_ptr<Window>& window,
69 const vk::CommandBuffer& command_buffer);
70
71 // ========================================================================
72 // Access control
73 // ========================================================================
74 WindowRenderContext* find_window_context(const std::shared_ptr<Window>& window);
75 [[nodiscard]] const WindowRenderContext* find_window_context(const std::shared_ptr<Window>& window) const;
76
77 // Information
78 [[nodiscard]] uint32_t get_swapchain_image_count(const std::shared_ptr<Window>& window) const;
79
80 // Cleanup
81 void cleanup();
82
83private:
84 VKContext& m_context;
85 VKCommandManager& m_command_manager;
86 std::vector<WindowRenderContext> m_window_contexts;
87
88 /**
89 * @brief Create synchronization objects for a window's swapchain
90 * @param config Window swapchain configuration to populate
91 * @return True if creation succeeded
92 */
93 bool create_sync_objects(WindowRenderContext& config);
94
95 /**
96 * @brief Recreate the swapchain and related resources for a window
97 * @param context Window render context
98 */
99 void recreate_swapchain_for_context(WindowRenderContext& context);
100
101 /**
102 * @brief Internal logic to recreate swapchain and related resources
103 * @param context Window render context
104 * @return True if recreation succeeded
105 */
106 bool recreate_swapchain_internal(WindowRenderContext& context);
107
108 // Event handling
109 // void on_window_event(const WindowEvent& event, std::shared_ptr<Window> window);
110};
111
112}
BackendWindowHandler(BackendWindowHandler &&) noexcept=default
BackendWindowHandler & operator=(const BackendWindowHandler &)=delete
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
WindowRenderContext & operator=(WindowRenderContext &&)=default
WindowRenderContext(const WindowRenderContext &)=delete
WindowRenderContext & operator=(const WindowRenderContext &)=delete