Skip to content

Commit 8b6042a

Browse files
committed
Debug Utils extension
1 parent 93c98f8 commit 8b6042a

3 files changed

Lines changed: 51 additions & 2 deletions

File tree

src/main.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,17 @@ uint32_t indexData[] = {
7575
};
7676

7777
void initApplication(SDL_Window* window) {
78+
const char* additionalInstanceExtensions[] = {
79+
VK_EXT_DEBUG_UTILS_EXTENSION_NAME,
80+
VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME,
81+
};
7882
uint32_t instanceExtensionCount;
7983
SDL_Vulkan_GetInstanceExtensions(window, &instanceExtensionCount, 0);
80-
const char** enabledInstanceExtensions = new const char* [instanceExtensionCount];
84+
const char** enabledInstanceExtensions = new const char* [instanceExtensionCount + ARRAY_COUNT(additionalInstanceExtensions)];
8185
SDL_Vulkan_GetInstanceExtensions(window, &instanceExtensionCount, enabledInstanceExtensions);
86+
for (uint32_t i = 0; i < ARRAY_COUNT(additionalInstanceExtensions); ++i) {
87+
enabledInstanceExtensions[instanceExtensionCount++] = additionalInstanceExtensions[i];
88+
}
8289

8390
const char* enabledDeviceExtensions[]{ VK_KHR_SWAPCHAIN_EXTENSION_NAME };
8491
context = initVulkan(instanceExtensionCount, enabledInstanceExtensions, ARRAY_COUNT(enabledDeviceExtensions), enabledDeviceExtensions);

src/vulkan_base/vulkan_base.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ struct VulkanContext {
3939
VkPhysicalDeviceProperties physicalDeviceProperties;
4040
VkDevice device;
4141
VulkanQueue graphicsQueue;
42+
VkDebugUtilsMessengerEXT debugCallback;
4243
};
4344

4445
struct VulkanBuffer {

src/vulkan_base/vulkan_device.cpp

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,28 @@
11
#include "vulkan_base.h"
22

3+
VkBool32 VKAPI_CALL debugReportCallback(VkDebugUtilsMessageSeverityFlagBitsEXT severity, VkDebugUtilsMessageTypeFlagsEXT messageTypes, const VkDebugUtilsMessengerCallbackDataEXT* callbackData, void* userData) {
4+
if (severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) {
5+
LOG_ERROR(callbackData->pMessage);
6+
} else {
7+
LOG_WARN(callbackData->pMessage);
8+
}
9+
return VK_FALSE;
10+
}
11+
12+
VkDebugUtilsMessengerEXT registerDebugCallback(VkInstance instance) {
13+
PFN_vkCreateDebugUtilsMessengerEXT pfnCreateDebutUtilsMessengerEXT;
14+
pfnCreateDebutUtilsMessengerEXT = (PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT");
15+
VkDebugUtilsMessengerCreateInfoEXT callbackInfo = { VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT };
16+
callbackInfo.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT;
17+
callbackInfo.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT;
18+
callbackInfo.pfnUserCallback = debugReportCallback;
19+
20+
VkDebugUtilsMessengerEXT callback = 0;
21+
VKA(pfnCreateDebutUtilsMessengerEXT(instance, &callbackInfo, 0, &callback));
22+
23+
return callback;
24+
}
25+
326
bool initVulkanInstance(VulkanContext* context, uint32_t instanceExtensionCount, const char** instanceExtensions) {
427
uint32_t layerPropertyCount = 0;
528
VKA(vkEnumerateInstanceLayerProperties(&layerPropertyCount, 0));
@@ -17,6 +40,15 @@ bool initVulkanInstance(VulkanContext* context, uint32_t instanceExtensionCount,
1740
"VK_LAYER_KHRONOS_validation",
1841
};
1942

43+
VkValidationFeatureEnableEXT enableValidationFeatures[] = {
44+
//VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT,
45+
VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT,
46+
VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT,
47+
};
48+
VkValidationFeaturesEXT validationFeatures = { VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT };
49+
validationFeatures.enabledValidationFeatureCount = ARRAY_COUNT(enableValidationFeatures);
50+
validationFeatures.pEnabledValidationFeatures = enableValidationFeatures;
51+
2052
#ifdef VULKAN_INFO_OUTPUT
2153
uint32_t availableInstanceExtensionCount;
2254
VKA(vkEnumerateInstanceExtensionProperties(0, &availableInstanceExtensionCount, 0));
@@ -31,9 +63,10 @@ bool initVulkanInstance(VulkanContext* context, uint32_t instanceExtensionCount,
3163
VkApplicationInfo applicationInfo = {VK_STRUCTURE_TYPE_APPLICATION_INFO};
3264
applicationInfo.pApplicationName = "Vulkan Tutorial";
3365
applicationInfo.applicationVersion = VK_MAKE_VERSION(0, 0, 1); // 0.0.1
34-
applicationInfo.apiVersion = VK_API_VERSION_1_2;
66+
applicationInfo.apiVersion = VK_API_VERSION_1_0;
3567

3668
VkInstanceCreateInfo createInfo = { VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO };
69+
createInfo.pNext = &validationFeatures;
3770
createInfo.pApplicationInfo = &applicationInfo;
3871
createInfo.enabledLayerCount = ARRAY_COUNT(enabledLayers);
3972
createInfo.ppEnabledLayerNames = enabledLayers;
@@ -45,6 +78,8 @@ bool initVulkanInstance(VulkanContext* context, uint32_t instanceExtensionCount,
4578
return false;
4679
}
4780

81+
context->debugCallback = registerDebugCallback(context->instance);
82+
4883
return true;
4984
}
5085

@@ -152,5 +187,11 @@ void exitVulkan(VulkanContext* context) {
152187
VKA(vkDeviceWaitIdle(context->device));
153188
VK(vkDestroyDevice(context->device, 0));
154189

190+
if (context->debugCallback) {
191+
PFN_vkDestroyDebugUtilsMessengerEXT pfnDestroyDebugUtilsMessengerEXT;
192+
pfnDestroyDebugUtilsMessengerEXT = (PFN_vkDestroyDebugUtilsMessengerEXT)vkGetInstanceProcAddr(context->instance, "vkDestroyDebugUtilsMessengerEXT");
193+
pfnDestroyDebugUtilsMessengerEXT(context->instance, context->debugCallback, 0);
194+
context->debugCallback = 0;
195+
}
155196
vkDestroyInstance(context->instance, 0);
156197
}

0 commit comments

Comments
 (0)