diff --git a/src/main.c b/src/main.c index 6901559..039f6ef 100644 --- a/src/main.c +++ b/src/main.c @@ -14,6 +14,19 @@ const bool enableValidationLayers = false; const bool enableValidationLayers = true; #endif +static VKAPI_ATTR VkBool32 VKAPI_CALL +debugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, + VkDebugUtilsMessageTypeFlagsEXT messageType, + const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData, + void *pUserData) { + // TODO: Put all messages into a log file + if (messageSeverity >= VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) { + fprintf(stderr, "validation layer: %s\n", pCallbackData->pMessage); + } + + return VK_FALSE; +} + const char *validationLayers[] = {"VK_LAYER_KHRONOS_validation"}; size_t validationLayerCount = sizeof(validationLayers) / sizeof(validationLayers[0]); @@ -21,6 +34,7 @@ size_t validationLayerCount = typedef struct Application { GLFWwindow *window; VkInstance instance; + VkDebugUtilsMessengerEXT debugMessenger; } Application; bool checkValidationLayerSupport() { @@ -65,7 +79,7 @@ bool verifyGlfwExtensionSupport(uint32_t extensionCount, void createInstance(Application *app) { if (enableValidationLayers && !checkValidationLayerSupport()) { - fprintf(stderr, "Validation layers requested, but not available!"); + fprintf(stderr, "Validation layers requested, but not available!\n"); exit(EXIT_FAILURE); } @@ -123,7 +137,23 @@ void initWindow(Application *app) { glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE); app->window = glfwCreateWindow(800, 600, "Vulkan", NULL, NULL); } -void initVulkan(Application *app) { createInstance(app); } +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 +} + +void initVulkan(Application *app) { + setupDebugMessenger(app); + createInstance(app); +} void mainLoop(Application *app) { while (!glfwWindowShouldClose(app->window)) { glfwPollEvents();