MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
VulkanBackend.cpp
Go to the documentation of this file.
1#include "VulkanBackend.hpp"
2
4#include "VKFramebuffer.hpp"
5#include "VKRenderPass.hpp"
6#include "VKSwapchain.hpp"
7
11
16
18
20
21namespace MayaFlux::Core {
22
24 : m_context(std::make_unique<VKContext>())
25 , m_command_manager(std::make_unique<VKCommandManager>())
26 , m_resource_manager(std::make_unique<BackendResourceManager>(*m_context, *m_command_manager))
27 , m_pipeline_manager(std::make_unique<BackendPipelineManager>(*m_context))
28 , m_window_handler(std::make_unique<BackendWindowHandler>(*m_context, *m_command_manager))
29{
30}
31
33
35{
36 if (m_is_initialized) {
37 return true;
38 }
39 if (!m_context->initialize(config, true)) {
41 "Failed to initialize Vulkan context!");
42 return false;
43 }
44
45 if (!m_command_manager->initialize(
46 m_context->get_device(),
47 m_context->get_queue_families().graphics_family.value())) {
48
50 "Failed to initialize command manager!");
51 return false;
52 }
53
55
56 m_is_initialized = true;
57 return true;
58}
59
61{
62 auto& registry = Registry::BackendRegistry::instance();
63
64 auto buffer_service = std::make_shared<Registry::Service::BufferService>();
65 m_resource_manager->setup_backend_service(buffer_service);
66 m_buffer_service = buffer_service;
67 registry.register_service<Registry::Service::BufferService>([buffer_service]() -> void* {
68 return buffer_service.get();
69 });
70
71 auto compute_service = std::make_shared<Registry::Service::ComputeService>();
72 m_pipeline_manager->setup_backend_service(compute_service);
73 m_compute_service = compute_service;
74 registry.register_service<Registry::Service::ComputeService>([compute_service]() -> void* {
75 return compute_service.get();
76 });
77
78 auto display_service = std::make_shared<Registry::Service::DisplayService>();
79 m_window_handler->setup_backend_service(display_service);
80 m_display_service = display_service;
81 registry.register_service<Registry::Service::DisplayService>([display_service]() -> void* {
82 return display_service.get();
83 });
84}
85
87{
88 if (!m_is_initialized) {
89 return;
90 }
92
94 m_resource_manager->cleanup();
95 m_resource_manager.reset();
96 }
97
99 m_pipeline_manager->cleanup();
100 m_pipeline_manager.reset();
101 }
102
103 m_window_handler->cleanup();
104
105 if (m_command_manager) {
106 m_command_manager->cleanup();
107 }
108
109 m_context->cleanup();
110
111 auto& registry = Registry::BackendRegistry::instance();
112 registry.unregister_service<Registry::Service::BufferService>();
113 registry.unregister_service<Registry::Service::ComputeService>();
114 registry.unregister_service<Registry::Service::DisplayService>();
115
116 m_display_service.reset();
117 m_compute_service.reset();
118 m_buffer_service.reset();
119 m_is_initialized = false;
120}
121
122bool VulkanBackend::register_window(std::shared_ptr<Window> window)
123{
124 return m_window_handler->register_window(window);
125}
126
127void VulkanBackend::render_window(std::shared_ptr<Window> window)
128{
129 m_window_handler->render_window(window);
130}
131
133{
134 m_window_handler->render_all_windows();
135}
136
137void VulkanBackend::unregister_window(std::shared_ptr<Window> window)
138{
139 m_window_handler->unregister_window(window);
140}
141
143{
144 m_window_handler->handle_window_resize();
145}
146
151
153{
154 return m_context.get();
155}
156
158{
159 return m_context.get();
160}
161
162bool VulkanBackend::is_window_registered(std::shared_ptr<Window> window)
163{
164 return m_window_handler->is_window_registered(window);
165}
166
167}
#define MF_RT_ERROR(comp, ctx,...)
Manages Vulkan pipelines (compute, graphics) and related resources.
Manages Vulkan resources (buffers, images, samplers) for the graphics backend.
Manages Vulkan command pools and command buffers.
High-level wrapper for Vulkan instance and device.
Definition VKContext.hpp:16
std::shared_ptr< Registry::Service::ComputeService > m_compute_service
bool is_window_registered(std::shared_ptr< Window > window) override
Check if a window is registered with the graphics backend.
void wait_idle() override
Wait until the graphics backend is idle.
void * get_native_context() override
Get context pointer specific to the graphics backend (e.g., OpenGL context, Vulkan instance,...
void render_all_windows() override
Render all registered windows (batch optimization) Default: calls render_window() for each registered...
std::shared_ptr< Registry::Service::BufferService > m_buffer_service
bool initialize(const GlobalGraphicsConfig &config) override
Initialize the graphics backend with global configuration.
void render_window(std::shared_ptr< Window > window) override
Render the contents of the specified window.
bool register_window(std::shared_ptr< Window > window) override
Register a window with the graphics backend for rendering.
std::unique_ptr< BackendWindowHandler > m_window_handler
std::unique_ptr< VKContext > m_context
std::shared_ptr< Registry::Service::DisplayService > m_display_service
void cleanup() override
Cleanup the graphics backend and release all resources.
std::unique_ptr< BackendPipelineManager > m_pipeline_manager
void handle_window_resize() override
Handle window resize event for the specified window.
void unregister_window(std::shared_ptr< Window > window) override
Unregister a window from the graphics backend.
std::unique_ptr< VKCommandManager > m_command_manager
std::unique_ptr< BackendResourceManager > m_resource_manager
static BackendRegistry & instance()
Get the global registry instance.
@ GraphicsBackend
Graphics/visual rendering backend (Vulkan, OpenGL)
@ Core
Core engine, backend, subsystems.
Backend buffer management service interface.
Backend compute shader and pipeline service interface.
std::function< void()> wait_idle
Wait for all GPU operations to complete.
Backend display and presentation service interface.