MayaFlux 0.1.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 VKRenderPass;
15class VKFramebuffer;
16class Window;
17
19 std::shared_ptr<Window> window;
20 vk::SurfaceKHR surface;
21 std::unique_ptr<VKSwapchain> swapchain;
22 // std::unique_ptr<VKRenderPass> render_pass;
23 std::shared_ptr<VKRenderPass> render_pass;
24 std::vector<std::unique_ptr<VKFramebuffer>> framebuffers;
25 vk::CommandBuffer command_buffer;
26
27 std::vector<vk::Semaphore> image_available;
28 std::vector<vk::Semaphore> render_finished;
29 std::vector<vk::Fence> in_flight;
30
33 size_t current_frame {};
34
37
42
43 void cleanup(VKContext& context);
44};
45
46class MAYAFLUX_API BackendWindowHandler {
47public:
48 BackendWindowHandler(VKContext& context, VKCommandManager& command_manager);
50
51 void setup_backend_service(const std::shared_ptr<Registry::Service::DisplayService>& display_service);
52
55
57 BackendWindowHandler& operator=(BackendWindowHandler&&) noexcept = default;
58
59 // ========================================================================
60 // Window management
61 // ========================================================================
62 bool register_window(const std::shared_ptr<Window>& window);
63 void unregister_window(const std::shared_ptr<Window>& window);
64 [[nodiscard]] bool is_window_registered(const std::shared_ptr<Window>& window) const;
65
66 /**
67 * @brief Attach a user render pass and recreate sync objects with it
68 * Used by Portal when registering a window for rendering
69 */
70 bool attach_render_pass(
71 const std::shared_ptr<Window>& window,
72 const std::shared_ptr<Core::VKRenderPass>& render_pass);
73
74 // ========================================================================
75 // Rendering
76 // ========================================================================
77 void render_window(const std::shared_ptr<Window>& window);
78 void render_all_windows();
79 void handle_window_resize();
80
81 // ========================================================================
82 // Access control
83 // ========================================================================
84 WindowRenderContext* find_window_context(const std::shared_ptr<Window>& window);
85 [[nodiscard]] const WindowRenderContext* find_window_context(const std::shared_ptr<Window>& window) const;
86
87 // Information
88 [[nodiscard]] uint32_t get_swapchain_image_count(const std::shared_ptr<Window>& window) const;
89
90 // Cleanup
91 void cleanup();
92
93private:
94 VKContext& m_context;
95 VKCommandManager& m_command_manager;
96 std::vector<WindowRenderContext> m_window_contexts;
97
98 /**
99 * @brief Create synchronization objects for a window's swapchain
100 * @param config Window swapchain configuration to populate
101 * @return True if creation succeeded
102 */
103 bool create_sync_objects(WindowRenderContext& config);
104
105 /**
106 * @brief Internal rendering logic for a window
107 * @param context Window render context
108 */
109 void render_window_internal(WindowRenderContext& context);
110
111 /**
112 * @brief Recreate the swapchain and related resources for a window
113 * @param context Window render context
114 */
115 void recreate_swapchain_for_context(WindowRenderContext& context);
116
117 /**
118 * @brief Internal logic to recreate swapchain and related resources
119 * @param context Window render context
120 * @return True if recreation succeeded
121 */
122 bool recreate_swapchain_internal(WindowRenderContext& context);
123
124 // Event handling
125 // void on_window_event(const WindowEvent& event, std::shared_ptr<Window> window);
126};
127
128}
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
A wrapper class for Vulkan Render Pass.
Platform-agnostic window wrapper.
Definition Window.hpp:18
std::vector< vk::Semaphore > image_available
std::unique_ptr< VKSwapchain > swapchain
std::vector< std::unique_ptr< VKFramebuffer > > framebuffers
WindowRenderContext(WindowRenderContext &&)=default
std::vector< vk::Semaphore > render_finished
WindowRenderContext & operator=(WindowRenderContext &&)=default
std::shared_ptr< VKRenderPass > render_pass
WindowRenderContext(const WindowRenderContext &)=delete
WindowRenderContext & operator=(const WindowRenderContext &)=delete