MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
VKInstance.cpp
Go to the documentation of this file.
1#include "VKInstance.hpp"
2
4
5namespace MayaFlux::Core {
6
7static const std::vector<const char*> VALIDATION_LAYERS = {
8 "VK_LAYER_KHRONOS_validation"
9};
10
15
17 : m_instance(other.m_instance)
18 , m_debug_messenger(other.m_debug_messenger)
19 , m_validation_enabled(other.m_validation_enabled)
20{
21 other.m_instance = nullptr;
22 other.m_debug_messenger = nullptr;
23}
24
26{
27 if (this != &other) {
28 cleanup();
29 m_instance = other.m_instance;
30 m_debug_messenger = other.m_debug_messenger;
31 m_validation_enabled = other.m_validation_enabled;
32
33 other.m_instance = nullptr;
34 other.m_debug_messenger = nullptr;
35 }
36 return *this;
37}
38
39bool VKInstance::initialize(bool enable_validation,
40 const std::vector<const char*>& required_extensions)
41{
42 m_validation_enabled = enable_validation;
43
45 MF_ERROR(Journal::Component::Core, Journal::Context::GraphicsBackend, "Vulkan validation layers requested, but not available!");
46 return false;
47 }
48
49 vk::ApplicationInfo app_info {};
50 app_info.pApplicationName = "MayaFlux";
51 app_info.applicationVersion = VK_MAKE_VERSION(1, 0, 0);
52 app_info.pEngineName = "MayaFlux Engine";
53 app_info.engineVersion = VK_MAKE_VERSION(1, 0, 0);
54 app_info.apiVersion = VK_API_VERSION_1_2;
55
56 vk::InstanceCreateInfo create_info {};
57 create_info.pApplicationInfo = &app_info;
58
59 std::vector<const char*> extensions = required_extensions;
61 extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
62 }
63 create_info.enabledExtensionCount = static_cast<uint32_t>(extensions.size());
64 create_info.ppEnabledExtensionNames = extensions.data();
65
66 vk::DebugUtilsMessengerCreateInfoEXT debug_create_info {};
67
69 create_info.enabledLayerCount = static_cast<uint32_t>(VALIDATION_LAYERS.size());
70 create_info.ppEnabledLayerNames = VALIDATION_LAYERS.data();
71
72 debug_create_info.messageSeverity = vk::DebugUtilsMessageSeverityFlagBitsEXT::eVerbose
73 | vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning | vk::DebugUtilsMessageSeverityFlagBitsEXT::eError;
74
75 debug_create_info.messageType = vk::DebugUtilsMessageTypeFlagBitsEXT::eGeneral
76 | vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation
77 | vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance;
78
79 debug_create_info.pfnUserCallback = debug_callback;
80 create_info.pNext = &debug_create_info;
81
82 } else {
83 create_info.enabledLayerCount = 0;
84 create_info.pNext = nullptr;
85 }
86
87 try {
88 m_instance = vk::createInstance(create_info);
89 m_dynamic_dispatcher = vk::detail::DispatchLoaderDynamic(m_instance, vkGetInstanceProcAddr);
90
91 } catch (const std::exception& e) {
93 std::source_location::current(),
94 "Failed to create Vulkan instance: {}", e.what());
95 }
96
98
100 MF_ERROR(Journal::Component::Core, Journal::Context::GraphicsBackend, "Failed to set up debug messenger!");
101 return false;
102 }
103
104 return true;
105}
106
108{
109 if (m_debug_messenger) {
110 m_instance.destroyDebugUtilsMessengerEXT(m_debug_messenger, nullptr, m_dynamic_dispatcher);
111 m_debug_messenger = nullptr;
112 }
113
114 if (m_instance) {
115 m_instance.destroy();
116 m_instance = nullptr;
118 }
119}
120
121bool VKInstance::check_validation_layer_support(const std::vector<const char*>& layers)
122{
123 auto available_layers = vk::enumerateInstanceLayerProperties();
124
125 for (const char* layer_name : layers) {
126 bool layer_found = false;
127
128 for (const auto& layer_properties : available_layers) {
129 if (strcmp(layer_name, layer_properties.layerName) == 0) {
130 layer_found = true;
131 break;
132 }
133 }
134
135 if (!layer_found) {
136 return false;
137 }
138 }
139
140 return true;
141}
142
144{
145 vk::DebugUtilsMessengerCreateInfoEXT create_info {};
146
147 create_info.messageSeverity = vk::DebugUtilsMessageSeverityFlagBitsEXT::eVerbose
148 | vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning | vk::DebugUtilsMessageSeverityFlagBitsEXT::eError;
149
150 create_info.messageType = vk::DebugUtilsMessageTypeFlagBitsEXT::eGeneral
151 | vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation
152 | vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance;
153
154 create_info.pfnUserCallback = debug_callback;
155 create_info.pUserData = nullptr;
156
157 try {
158 m_debug_messenger = m_instance.createDebugUtilsMessengerEXT(create_info, nullptr, m_dynamic_dispatcher);
159 } catch (const std::exception& e) {
161 std::source_location::current(),
162 "Failed to set up debug messenger: {}", e.what());
163 return false;
164 }
165
166 return true;
167}
168
170 vk::DebugUtilsMessageSeverityFlagBitsEXT /*messageSeverity*/,
171 vk::DebugUtilsMessageTypeFlagsEXT /*messageTypes*/,
172 const vk::DebugUtilsMessengerCallbackDataEXT* p_callback_data,
173 void* /*pUserData*/)
174{
175 MF_INFO(Journal::Component::Core, Journal::Context::GraphicsBackend, "Validation layer: {}", p_callback_data->pMessage);
176 return VK_FALSE;
177}
178
179}
#define MF_INFO(comp, ctx,...)
#define MF_ERROR(comp, ctx,...)
#define MF_PRINT(comp, ctx,...)
void cleanup()
Cleanup Vulkan instance.
bool m_validation_enabled
Flag to indicate if validation layers are enabled.
vk::detail::DispatchLoaderDynamic m_dynamic_dispatcher
Dynamic dispatcher for extension functions.
bool check_validation_layer_support(const std::vector< const char * > &layers)
Check if requested validation layers are available.
VKInstance & operator=(const VKInstance &)=delete
vk::Instance m_instance
Vulkan instance handle.
bool setup_debug_messenger()
Setup debug messenger for validation layer output.
vk::DebugUtilsMessengerEXT m_debug_messenger
Debug messenger for validation layers.
bool initialize(bool enable_validation=true, const std::vector< const char * > &required_extensions={})
Initialize Vulkan instance.
static vk::Bool32 debug_callback(vk::DebugUtilsMessageSeverityFlagBitsEXT message_severity, vk::DebugUtilsMessageTypeFlagsEXT message_types, const vk::DebugUtilsMessengerCallbackDataEXT *p_callback_data, void *p_user_data)
Validation layer callback.
~VKInstance()
Destructor to clean up Vulkan instance and debug messenger.
Manages Vulkan instance creation and validation layers.
static const std::vector< const char * > VALIDATION_LAYERS
Definition VKInstance.cpp:7
@ GraphicsBackend
Graphics/visual rendering backend (Vulkan, OpenGL)
@ Core
Core engine, backend, subsystems.