.. _program_listing_file_Src_GraphicsEngineVulkan_vulkan_base_VulkanDebug.cpp: Program Listing for File VulkanDebug.cpp ======================================== |exhale_lsh| :ref:`Return to documentation for file ` (``Src/GraphicsEngineVulkan/vulkan_base/VulkanDebug.cpp``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #include "vulkan_base/VulkanDebug.hpp" #include #include #include #include "common/Utilities.hpp" namespace Kataglyphis::debug { PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT; PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT; VkDebugUtilsMessengerEXT debugUtilsMessenger; VKAPI_ATTR VkBool32 VKAPI_CALL debugUtilsMessengerCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageType, const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData, void *pUserData) { // Select prefix depending on flags passed to the callback std::string prefix(""); if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT) { prefix = "VERBOSE: "; } 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 << "[" << pCallbackData->messageIdNumber << "][" << pCallbackData->pMessageIdName << "] : " << pCallbackData->pMessage; #if defined(__ANDROID__) if (messageSeverity >= VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) { LOGE("%s", debugMessage.str().c_str()); } else { LOGD("%s", debugMessage.str().c_str()); } #else if (messageSeverity >= VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) { std::cerr << debugMessage.str() << "\n"; } else { std::cout << debugMessage.str() << "\n"; } fflush(stdout); #endif // The return value of this callback controls whether 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) { vkCreateDebugUtilsMessengerEXT = reinterpret_cast( vkGetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT")); vkDestroyDebugUtilsMessengerEXT = reinterpret_cast( vkGetInstanceProcAddr(instance, "vkDestroyDebugUtilsMessengerEXT")); 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; ASSERT_VULKAN(vkCreateDebugUtilsMessengerEXT(instance, &debugUtilsMessengerCI, nullptr, &debugUtilsMessenger), "Failed to create debug messenger") } void freeDebugCallback(VkInstance instance) { if (debugUtilsMessenger != VK_NULL_HANDLE) { vkDestroyDebugUtilsMessengerEXT(instance, debugUtilsMessenger, nullptr); } } }// namespace Kataglyphis::debug