Attempt at more validation layers

This commit is contained in:
Warwick New 2024-10-12 22:16:29 +01:00
parent 7c5362682a
commit 6d5854d5b1

View file

@ -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) {
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();