diff --git a/base/VulkanDebug.cpp b/base/VulkanDebug.cpp index c18f1364..f2eded93 100644 --- a/base/VulkanDebug.cpp +++ b/base/VulkanDebug.cpp @@ -13,108 +13,79 @@ namespace vks { namespace debug { - PFN_vkCreateDebugReportCallbackEXT CreateDebugReportCallback = VK_NULL_HANDLE; - PFN_vkDestroyDebugReportCallbackEXT DestroyDebugReportCallback = VK_NULL_HANDLE; - PFN_vkDebugReportMessageEXT dbgBreakCallback = VK_NULL_HANDLE; + PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT; + PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT; + VkDebugUtilsMessengerEXT debugUtilsMessenger; - VkDebugReportCallbackEXT msgCallback; - - VKAPI_ATTR VkBool32 VKAPI_CALL messageCallback( - VkDebugReportFlagsEXT flags, - VkDebugReportObjectTypeEXT objType, - uint64_t srcObject, - size_t location, - int32_t msgCode, - const char* pLayerPrefix, - const char* pMsg, + VKAPI_ATTR VkBool32 VKAPI_CALL debugUtilsMessengerCallback( + VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, + VkDebugUtilsMessageTypeFlagsEXT messageType, + const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, void* pUserData) { // Select prefix depending on flags passed to the callback - // Note that multiple flags may be set for a single validation message std::string prefix(""); - // Error that may result in undefined behaviour - if (flags & VK_DEBUG_REPORT_ERROR_BIT_EXT) - { - prefix += "ERROR:"; - }; - // Warnings may hint at unexpected / non-spec API usage - if (flags & VK_DEBUG_REPORT_WARNING_BIT_EXT) - { - prefix += "WARNING:"; - }; - // May indicate sub-optimal usage of the API - if (flags & VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT) - { - prefix += "PERFORMANCE:"; - }; - // Informal messages that may become handy during debugging - if (flags & VK_DEBUG_REPORT_INFORMATION_BIT_EXT) - { - prefix += "INFO:"; + if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT) { + prefix = "VERBOSE: "; } - // Diagnostic info from the Vulkan loader and layers - // Usually not helpful in terms of API usage, but may help to debug layer and loader problems - if (flags & VK_DEBUG_REPORT_DEBUG_BIT_EXT) - { - prefix += "DEBUG:"; + else if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT) { + prefix = "INFO: "; } + else if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) { + prefix = "WARNING: "; + } + else if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) { + prefix = "ERROR: "; + } + // Display message to default output (console/logcat) std::stringstream debugMessage; - debugMessage << prefix << " [" << pLayerPrefix << "] Code " << msgCode << " : " << pMsg; + debugMessage << prefix << "[" << pCallbackData->messageIdNumber << "][" << pCallbackData->pMessageIdName << "] : " << pCallbackData->pMessage; #if defined(__ANDROID__) - if (flags & VK_DEBUG_REPORT_ERROR_BIT_EXT) { + if (messageSeverity >= VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) { LOGE("%s", debugMessage.str().c_str()); - } - else { + } else { LOGD("%s", debugMessage.str().c_str()); } #else - if (flags & VK_DEBUG_REPORT_ERROR_BIT_EXT) { + if (messageSeverity >= VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) { std::cerr << debugMessage.str() << "\n"; - } - else { + } else { std::cout << debugMessage.str() << "\n"; } + fflush(stdout); #endif - fflush(stdout); - // The return value of this callback controls wether the Vulkan call that caused - // the validation message will be aborted or not - // We return VK_FALSE as we DON'T want Vulkan calls that cause a validation message - // (and return a VkResult) to abort - // If you instead want to have calls abort, pass in VK_TRUE and the function will - // return VK_ERROR_VALIDATION_FAILED_EXT + // The return value of this callback controls wether the Vulkan call that caused the validation message will be aborted or not + // We return VK_FALSE as we DON'T want Vulkan calls that cause a validation message to abort + // If you instead want to have calls abort, pass in VK_TRUE and the function will return VK_ERROR_VALIDATION_FAILED_EXT return VK_FALSE; } void setupDebugging(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportCallbackEXT callBack) { - CreateDebugReportCallback = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCreateDebugReportCallbackEXT")); - DestroyDebugReportCallback = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkDestroyDebugReportCallbackEXT")); - dbgBreakCallback = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkDebugReportMessageEXT")); - VkDebugReportCallbackCreateInfoEXT dbgCreateInfo = {}; - dbgCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT; - dbgCreateInfo.pfnCallback = (PFN_vkDebugReportCallbackEXT)messageCallback; - dbgCreateInfo.flags = flags; + vkCreateDebugUtilsMessengerEXT = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT")); + vkDestroyDebugUtilsMessengerEXT = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkDestroyDebugUtilsMessengerEXT")); - VkResult err = CreateDebugReportCallback( - instance, - &dbgCreateInfo, - nullptr, - (callBack != VK_NULL_HANDLE) ? &callBack : &msgCallback); - assert(!err); + VkDebugUtilsMessengerCreateInfoEXT debugUtilsMessengerCI{}; + debugUtilsMessengerCI.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT; + debugUtilsMessengerCI.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT; + debugUtilsMessengerCI.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT; + debugUtilsMessengerCI.pfnUserCallback = debugUtilsMessengerCallback; + VkResult result = vkCreateDebugUtilsMessengerEXT(instance, &debugUtilsMessengerCI, nullptr, &debugUtilsMessenger); + assert(result == VK_SUCCESS); } void freeDebugCallback(VkInstance instance) { - if (msgCallback != VK_NULL_HANDLE) + if (debugUtilsMessenger != VK_NULL_HANDLE) { - DestroyDebugReportCallback(instance, msgCallback, nullptr); + vkDestroyDebugUtilsMessengerEXT(instance, debugUtilsMessenger, nullptr); } } } diff --git a/base/vulkanexamplebase.cpp b/base/vulkanexamplebase.cpp index 98744215..1ec8d6a1 100644 --- a/base/vulkanexamplebase.cpp +++ b/base/vulkanexamplebase.cpp @@ -58,7 +58,7 @@ VkResult VulkanExampleBase::createInstance(bool enableValidation) { if (settings.validation) { - instanceExtensions.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME); + instanceExtensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); } instanceCreateInfo.enabledExtensionCount = (uint32_t)instanceExtensions.size(); instanceCreateInfo.ppEnabledExtensionNames = instanceExtensions.data();