MayaFlux 0.2.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_3;
55
56 vk::InstanceCreateInfo create_info {};
57 create_info.pApplicationInfo = &app_info;
58
59 std::vector<const char*> extensions = required_extensions;
60
61#ifdef MAYAFLUX_PLATFORM_MACOS
62 extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME);
63 create_info.flags = vk::InstanceCreateFlagBits::eEnumeratePortabilityKHR;
64#endif
65
67 extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
68 }
69 create_info.enabledExtensionCount = static_cast<uint32_t>(extensions.size());
70 create_info.ppEnabledExtensionNames = extensions.data();
71
72 vk::DebugUtilsMessengerCreateInfoEXT debug_create_info {};
73
75 create_info.enabledLayerCount = static_cast<uint32_t>(VALIDATION_LAYERS.size());
76 create_info.ppEnabledLayerNames = VALIDATION_LAYERS.data();
77
78 debug_create_info.messageSeverity = vk::DebugUtilsMessageSeverityFlagBitsEXT::eVerbose
79 | vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning | vk::DebugUtilsMessageSeverityFlagBitsEXT::eError;
80
81 debug_create_info.messageType = vk::DebugUtilsMessageTypeFlagBitsEXT::eGeneral
82 | vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation
83 | vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance;
84
85 debug_create_info.pfnUserCallback = debug_callback;
86 create_info.pNext = &debug_create_info;
87
88 } else {
89 create_info.enabledLayerCount = 0;
90 create_info.pNext = nullptr;
91 }
92
93 try {
94 m_instance = vk::createInstance(create_info);
95 m_dynamic_dispatcher = vk::detail::DispatchLoaderDynamic(m_instance, vkGetInstanceProcAddr);
96
97 } catch (const std::exception& e) {
99 std::source_location::current(),
100 "Failed to create Vulkan instance: {}", e.what());
101 }
102
104
106 MF_ERROR(Journal::Component::Core, Journal::Context::GraphicsBackend, "Failed to set up debug messenger!");
107 return false;
108 }
109
110 return true;
111}
112
114{
115 if (m_debug_messenger) {
116 m_instance.destroyDebugUtilsMessengerEXT(m_debug_messenger, nullptr, m_dynamic_dispatcher);
117 m_debug_messenger = nullptr;
118 }
119
120 if (m_instance) {
121 m_instance.destroy();
122 m_instance = nullptr;
124 }
125}
126
127bool VKInstance::check_validation_layer_support(const std::vector<const char*>& layers)
128{
129 auto available_layers = vk::enumerateInstanceLayerProperties();
130
131 for (const char* layer_name : layers) {
132 bool layer_found = false;
133
134 for (const auto& layer_properties : available_layers) {
135 if (strcmp(layer_name, layer_properties.layerName) == 0) {
136 layer_found = true;
137 break;
138 }
139 }
140
141 if (!layer_found) {
142 return false;
143 }
144 }
145
146 return true;
147}
148
150{
151 vk::DebugUtilsMessengerCreateInfoEXT create_info {};
152
153 create_info.messageSeverity = vk::DebugUtilsMessageSeverityFlagBitsEXT::eVerbose
154 | vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning | vk::DebugUtilsMessageSeverityFlagBitsEXT::eError;
155
156 create_info.messageType = vk::DebugUtilsMessageTypeFlagBitsEXT::eGeneral
157 | vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation
158 | vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance;
159
160 create_info.pfnUserCallback = debug_callback;
161 create_info.pUserData = nullptr;
162
163 try {
164 m_debug_messenger = m_instance.createDebugUtilsMessengerEXT(create_info, nullptr, m_dynamic_dispatcher);
165 } catch (const std::exception& e) {
167 std::source_location::current(),
168 "Failed to set up debug messenger: {}", e.what());
169 return false;
170 }
171
172 return true;
173}
174
176 vk::DebugUtilsMessageSeverityFlagBitsEXT /*messageSeverity*/,
177 vk::DebugUtilsMessageTypeFlagsEXT /*messageTypes*/,
178 const vk::DebugUtilsMessengerCallbackDataEXT* p_callback_data,
179 void* /*pUserData*/)
180{
181 MF_INFO(Journal::Component::Core, Journal::Context::GraphicsBackend, "Validation layer: {}", p_callback_data->pMessage);
182 return VK_FALSE;
183}
184
185}
#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.