From 6d5854d5b16de41d1db729bdf6792d91f3ad2dcc Mon Sep 17 00:00:00 2001 From: Warwick New Date: Sat, 12 Oct 2024 22:16:29 +0100 Subject: [PATCH] Attempt at more validation layers --- src/main.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 57 insertions(+), 10 deletions(-) diff --git a/src/main.c b/src/main.c index f041542..2499ead 100644 --- a/src/main.c +++ b/src/main.c @@ -78,6 +78,21 @@ bool verifyExtensionSupport(uint32_t extensionCount, return true; } +void populateDebugMessengerCreateInfo( + VkDebugUtilsMessengerCreateInfoEXT *createInfo) { + createInfo->sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT; + createInfo->messageSeverity = + VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT | + VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | + VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT; + createInfo->messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | + VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | + VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT; + createInfo->pfnUserCallback = debugCallback; + createInfo->pUserData = NULL; // Optional +} + + void createInstance(Application *app) { if (enableValidationLayers && !checkValidationLayerSupport()) { fprintf(stderr, "Validation layers requested, but not available!\n"); @@ -112,7 +127,11 @@ void createInstance(Application *app) { VkExtensionProperties extensions[extensionCount]; vkEnumerateInstanceExtensionProperties(NULL, &extensionCount, extensions); + VkDebugUtilsMessengerCreateInfoEXT debugCreateInfo = {}; if (enableValidationLayers) { + populateDebugMessengerCreateInfo(&debugCreateInfo); + createInfo.pNext = (VkDebugUtilsMessengerCreateInfoEXT *)&debugCreateInfo; + createInfo.enabledLayerCount = validationLayerCount; createInfo.ppEnabledLayerNames = validationLayers; @@ -156,21 +175,46 @@ void initWindow(Application *app) { glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE); app->window = glfwCreateWindow(800, 600, "Vulkan", NULL, NULL); } + +VkResult CreateDebugUtilsMessengerEXT( + VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkDebugUtilsMessengerEXT *pDebugMessenger) { + PFN_vkCreateDebugUtilsMessengerEXT func = + (PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr( + instance, "vkCreateDebugUtilsMessengerEXT"); + if (func != NULL) { + return func(instance, pCreateInfo, pAllocator, pDebugMessenger); + } else { + return VK_ERROR_EXTENSION_NOT_PRESENT; + } +} + void setupDebugMessenger(Application *app) { VkDebugUtilsMessengerCreateInfoEXT createInfo = {}; - createInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT; - createInfo.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT | - VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | - VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT; - createInfo.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | - VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | - VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT; - createInfo.pfnUserCallback = debugCallback; - createInfo.pUserData = NULL; // Optional + populateDebugMessengerCreateInfo(&createInfo); + + if (CreateDebugUtilsMessengerEXT(app->instance, &createInfo, NULL, + &app->debugMessenger) != VK_SUCCESS) { + fprintf(stderr, "failed to set up debug messenger!"); + } +} + +void DestroyDebugUtilsMessengerEXT(VkInstance instance, + VkDebugUtilsMessengerEXT debugMessenger, + const VkAllocationCallbacks *pAllocator) { + PFN_vkDestroyDebugUtilsMessengerEXT func = + (PFN_vkDestroyDebugUtilsMessengerEXT)vkGetInstanceProcAddr( + instance, "vkDestroyDebugUtilsMessengerEXT"); + if (func != NULL) { + func(instance, debugMessenger, pAllocator); + } } void initVulkan(Application *app) { - setupDebugMessenger(app); + if (enableValidationLayers) { + setupDebugMessenger(app); + } createInstance(app); } void mainLoop(Application *app) { @@ -179,6 +223,9 @@ void mainLoop(Application *app) { } } void cleanup(Application *app) { + if (enableValidationLayers) { + DestroyDebugUtilsMessengerEXT(app->instance, app->debugMessenger, NULL); + } vkDestroyInstance(app->instance, NULL); glfwDestroyWindow(app->window); glfwTerminate();