MayaFlux 0.1.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
10namespace MayaFlux::Core {
11
12bool VKContext::initialize(const GlobalGraphicsConfig& graphics_config, bool enable_validation,
13 const std::vector<const char*>& required_extensions)
14{
15 m_graphics_config = graphics_config;
16
19 "Vulkan context initialization requested, but graphics API is not set to Vulkan!");
20 return false;
21 }
22
23 std::vector<const char*> extensions;
25
28
29 for (const char* ext : required_extensions) {
30 if (std::ranges::find(extensions, ext) == extensions.end()) {
31 extensions.push_back(ext);
32 }
33 }
34 } else {
35 extensions = required_extensions;
36 }
37
38 if (!m_instance.initialize(enable_validation, extensions)) {
40 "Failed to initialize Vulkan instance!");
41 return false;
42 }
43
46 "Failed to initialize Vulkan device!");
47 cleanup();
48 return false;
49 }
50
52 "Vulkan context initialized successfully.");
53 return true;
54}
55
56vk::SurfaceKHR VKContext::create_surface(std::shared_ptr<Window> window)
57{
58 if (!window) {
60 "Cannot create surface: null window");
61 return nullptr;
62 }
63
64 auto* glfw_window = dynamic_cast<GlfwWindow*>(window.get());
65 if (!glfw_window) {
67 "Cannot create surface: window is not a GlfwWindow");
68 return nullptr;
69 }
70
71 GLFWwindow* glfw_handle = glfw_window->get_glfw_handle();
72 if (!glfw_handle) {
74 "Cannot create surface: null GLFW handle");
75 return nullptr;
76 }
77
78 VkSurfaceKHR c_surface;
79 VkResult result = glfwCreateWindowSurface(
80 static_cast<VkInstance>(m_instance.get_instance()),
81 glfw_handle,
82 nullptr,
83 &c_surface);
84
85 if (result != VK_SUCCESS) {
87 "Failed to create window surface");
88 return nullptr;
89 }
90
91 vk::SurfaceKHR surface(c_surface);
92 m_surfaces.push_back(surface);
93
95 "Surface created for window '{}'", window->get_create_info().title);
96
97 return surface;
98}
99
100void VKContext::destroy_surface(vk::SurfaceKHR surface)
101{
102 if (!surface)
103 return;
104
105 auto it = std::ranges::find(m_surfaces, surface);
106 if (it != m_surfaces.end()) {
107 m_instance.get_instance().destroySurfaceKHR(*it);
108 m_surfaces.erase(it);
109 }
110}
111
112bool VKContext::update_present_family(vk::SurfaceKHR surface)
113{
114 return m_device.update_presentation_queue(surface);
115}
116
118{
119 for (auto surface : m_surfaces) {
120 if (surface) {
121 m_instance.get_instance().destroySurfaceKHR(surface);
122 }
123 }
124 m_surfaces.clear();
125
128}
129
130}
#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:56
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:12
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.
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.