MayaFlux 0.2.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
VKContext.cpp
Go to the documentation of this file.
1#include "VKContext.hpp"
3
6
7#define GLFW_INCLUDE_VULKAN
8#include <GLFW/glfw3.h>
9
10#include "MayaFlux/Parallel.hpp"
11
12namespace MayaFlux::Core {
13
14bool VKContext::initialize(const GlobalGraphicsConfig& graphics_config, bool enable_validation,
15 const std::vector<const char*>& required_extensions)
16{
17 m_graphics_config = graphics_config;
18
21 "Vulkan context initialization requested, but graphics API is not set to Vulkan!");
22 return false;
23 }
24
25 std::vector<const char*> extensions;
27
30
31 for (const char* ext : required_extensions) {
32 if (std::ranges::find(extensions, ext) == extensions.end()) {
33 extensions.push_back(ext);
34 }
35 }
36 } else {
37 extensions = required_extensions;
38 }
39
40 if (!m_instance.initialize(enable_validation, extensions)) {
42 "Failed to initialize Vulkan instance!");
43 return false;
44 }
45
48 "Failed to initialize Vulkan device!");
49 cleanup();
50 return false;
51 }
52
54 "Vulkan context initialized successfully.");
55 return true;
56}
57
58vk::SurfaceKHR VKContext::create_surface(std::shared_ptr<Window> window)
59{
60 if (!window) {
62 "Cannot create surface: null window");
63 return nullptr;
64 }
65
66 auto* glfw_window = dynamic_cast<GlfwWindow*>(window.get());
67 if (!glfw_window) {
69 "Cannot create surface: window is not a GlfwWindow");
70 return nullptr;
71 }
72
73 GLFWwindow* glfw_handle = glfw_window->get_glfw_handle();
74 if (!glfw_handle) {
76 "Cannot create surface: null GLFW handle");
77 return nullptr;
78 }
79
80 VkSurfaceKHR c_surface;
81 VkResult result = Parallel::dispatch_main_sync([&]() {
82 return glfwCreateWindowSurface(
83 static_cast<VkInstance>(m_instance.get_instance()),
84 glfw_handle,
85 nullptr,
86 &c_surface);
87 });
88
89 if (result != VK_SUCCESS) {
91 "Failed to create window surface");
92 return nullptr;
93 }
94
95 vk::SurfaceKHR surface(c_surface);
96 m_surfaces.push_back(surface);
97
99 "Surface created for window '{}'", window->get_create_info().title);
100
101 return surface;
102}
103
104void VKContext::destroy_surface(vk::SurfaceKHR surface)
105{
106 if (!surface)
107 return;
108
109 auto it = std::ranges::find(m_surfaces, surface);
110 if (it != m_surfaces.end()) {
111 m_instance.get_instance().destroySurfaceKHR(*it);
112 m_surfaces.erase(it);
113 }
114}
115
116bool VKContext::update_present_family(vk::SurfaceKHR surface)
117{
118 return m_device.update_presentation_queue(surface);
119}
120
122{
123 for (auto surface : m_surfaces) {
124 if (surface) {
125 m_instance.get_instance().destroySurfaceKHR(surface);
126 }
127 }
128 m_surfaces.clear();
129
132}
133
134}
#define MF_INFO(comp, ctx,...)
#define MF_ERROR(comp, ctx,...)
static std::vector< const char * > get_required_instance_extensions()
Retrieves the list of required Vulkan instance extensions for GLFW.
static void configure(const GlfwPreInitConfig &config)
Configures GLFW with pre-initialization hints.
Platform-agnostic window wrapper.
bool update_present_family(vk::SurfaceKHR surface)
Update presentation support for a surface.
vk::SurfaceKHR create_surface(std::shared_ptr< Window > window)
Create surface from window's native handles.
Definition VKContext.cpp:58
std::vector< vk::SurfaceKHR > m_surfaces
void cleanup()
Cleanup all Vulkan resources.
GlobalGraphicsConfig m_graphics_config
bool initialize(const GlobalGraphicsConfig &graphics_config, bool enable_validation=true, const std::vector< const char * > &required_extensions={})
Initialize Vulkan context.
Definition VKContext.cpp:14
void destroy_surface(vk::SurfaceKHR surface)
Destroy a specific surface Called when window is unregistered.
void cleanup()
Cleanup device resources.
Definition VKDevice.cpp:58
bool update_presentation_queue(vk::SurfaceKHR surface)
Update presentation queue family for a specific surface.
Definition VKDevice.cpp:146
bool initialize(vk::Instance instance, vk::SurfaceKHR temp_surface, const GraphicsBackendInfo &backend_info)
Initialize device (pick physical device and create logical device)
Definition VKDevice.cpp:49
void cleanup()
Cleanup Vulkan instance.
vk::Instance get_instance() const
Get the Vulkan instance handle.
bool initialize(bool enable_validation=true, const std::vector< const char * > &required_extensions={})
Initialize Vulkan instance.
@ GraphicsBackend
Graphics/visual rendering backend (Vulkan, OpenGL)
@ Core
Core engine, backend, subsystems.
auto dispatch_main_sync(Func &&func, Args &&... args) -> decltype(auto)
Definition Parallel.hpp:110
GlfwPreInitConfig glfw_preinit_config
Pre-initialization configuration for GLFW.
GraphicsBackendInfo backend_info
Graphics backend configuration.
WindowingBackend windowing_backend
Selected windowing backend.
GraphicsApi requested_api
Selected graphics API for rendering.