2016-02-23 13:45:51 +01:00
|
|
|
/*
|
2023-05-09 20:04:34 +02:00
|
|
|
* Vulkan examples debug wrapper
|
|
|
|
|
*
|
|
|
|
|
* Copyright (C) 2016-2023 by Sascha Willems - www.saschawillems.de
|
|
|
|
|
*
|
|
|
|
|
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
|
|
|
|
*/
|
2016-02-23 13:45:51 +01:00
|
|
|
|
2017-02-12 11:33:04 +01:00
|
|
|
#include "VulkanDebug.h"
|
2016-02-16 15:07:25 +01:00
|
|
|
#include <iostream>
|
|
|
|
|
|
2017-02-12 11:33:04 +01:00
|
|
|
namespace vks
|
2016-02-16 15:07:25 +01:00
|
|
|
{
|
2017-02-12 11:33:04 +01:00
|
|
|
namespace debug
|
2016-02-16 15:07:25 +01:00
|
|
|
{
|
2019-10-18 20:51:46 +02:00
|
|
|
PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT;
|
|
|
|
|
PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT;
|
|
|
|
|
VkDebugUtilsMessengerEXT debugUtilsMessenger;
|
|
|
|
|
|
2024-01-21 05:07:35 -08:00
|
|
|
VKAPI_ATTR VkBool32 VKAPI_CALL debugUtilsMessageCallback(
|
2019-10-18 20:51:46 +02:00
|
|
|
VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
|
|
|
|
|
VkDebugUtilsMessageTypeFlagsEXT messageType,
|
|
|
|
|
const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
|
2017-02-12 11:33:04 +01:00
|
|
|
void* pUserData)
|
2016-06-08 22:41:29 +02:00
|
|
|
{
|
2017-02-12 11:33:04 +01:00
|
|
|
// Select prefix depending on flags passed to the callback
|
2023-11-01 11:38:28 +01:00
|
|
|
std::string prefix;
|
2016-06-08 22:41:29 +02:00
|
|
|
|
2019-10-18 20:51:46 +02:00
|
|
|
if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT) {
|
2025-01-17 13:55:30 +01:00
|
|
|
prefix = "VERBOSE: ";
|
2023-11-01 11:38:28 +01:00
|
|
|
#if defined(_WIN32)
|
|
|
|
|
prefix = "\033[32m" + prefix + "\033[0m";
|
|
|
|
|
#endif
|
2017-02-12 11:33:04 +01:00
|
|
|
}
|
2019-10-18 20:51:46 +02:00
|
|
|
else if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT) {
|
|
|
|
|
prefix = "INFO: ";
|
2023-11-01 11:38:28 +01:00
|
|
|
#if defined(_WIN32)
|
|
|
|
|
prefix = "\033[36m" + prefix + "\033[0m";
|
|
|
|
|
#endif
|
2019-10-18 20:51:46 +02:00
|
|
|
}
|
|
|
|
|
else if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) {
|
|
|
|
|
prefix = "WARNING: ";
|
2023-11-01 11:38:28 +01:00
|
|
|
#if defined(_WIN32)
|
|
|
|
|
prefix = "\033[33m" + prefix + "\033[0m";
|
|
|
|
|
#endif
|
2019-10-18 20:51:46 +02:00
|
|
|
}
|
|
|
|
|
else if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) {
|
|
|
|
|
prefix = "ERROR: ";
|
2023-11-01 11:38:28 +01:00
|
|
|
#if defined(_WIN32)
|
|
|
|
|
prefix = "\033[31m" + prefix + "\033[0m";
|
|
|
|
|
#endif
|
2017-02-12 11:33:04 +01:00
|
|
|
}
|
2016-02-16 15:07:25 +01:00
|
|
|
|
2019-10-18 20:51:46 +02:00
|
|
|
|
2017-03-12 17:46:50 +01:00
|
|
|
// Display message to default output (console/logcat)
|
|
|
|
|
std::stringstream debugMessage;
|
2024-05-04 07:53:08 -04:00
|
|
|
if (pCallbackData->pMessageIdName) {
|
|
|
|
|
debugMessage << prefix << "[" << pCallbackData->messageIdNumber << "][" << pCallbackData->pMessageIdName << "] : " << pCallbackData->pMessage;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
debugMessage << prefix << "[" << pCallbackData->messageIdNumber << "] : " << pCallbackData->pMessage;
|
|
|
|
|
}
|
2017-03-12 17:46:50 +01:00
|
|
|
|
2017-03-13 19:24:07 +01:00
|
|
|
#if defined(__ANDROID__)
|
2019-10-18 20:51:46 +02:00
|
|
|
if (messageSeverity >= VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) {
|
2017-03-12 17:46:50 +01:00
|
|
|
LOGE("%s", debugMessage.str().c_str());
|
2019-10-18 20:51:46 +02:00
|
|
|
} else {
|
2017-03-12 17:46:50 +01:00
|
|
|
LOGD("%s", debugMessage.str().c_str());
|
|
|
|
|
}
|
|
|
|
|
#else
|
2019-10-18 20:51:46 +02:00
|
|
|
if (messageSeverity >= VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) {
|
2023-11-01 11:38:28 +01:00
|
|
|
std::cerr << debugMessage.str() << "\n\n";
|
2019-10-18 20:51:46 +02:00
|
|
|
} else {
|
2023-11-01 11:38:28 +01:00
|
|
|
std::cout << debugMessage.str() << "\n\n";
|
2017-03-12 17:46:50 +01:00
|
|
|
}
|
2019-10-18 20:51:46 +02:00
|
|
|
fflush(stdout);
|
2017-03-12 17:46:50 +01:00
|
|
|
#endif
|
2016-02-16 15:07:25 +01:00
|
|
|
|
|
|
|
|
|
2020-08-08 13:25:58 +02:00
|
|
|
// The return value of this callback controls whether the Vulkan call that caused the validation message will be aborted or not
|
2019-10-18 20:51:46 +02:00
|
|
|
// We return VK_FALSE as we DON'T want Vulkan calls that cause a validation message to abort
|
2024-01-21 05:07:35 -08:00
|
|
|
// If you instead want to have calls abort, pass in VK_TRUE and the function will return VK_ERROR_VALIDATION_FAILED_EXT
|
2017-02-12 11:33:04 +01:00
|
|
|
return VK_FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-21 05:07:35 -08:00
|
|
|
void setupDebugingMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& debugUtilsMessengerCI)
|
2016-02-16 15:07:25 +01:00
|
|
|
{
|
2024-01-21 05:07:35 -08:00
|
|
|
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 = debugUtilsMessageCallback;
|
|
|
|
|
}
|
2019-10-18 20:51:46 +02:00
|
|
|
|
2024-01-21 05:07:35 -08:00
|
|
|
void setupDebugging(VkInstance instance)
|
|
|
|
|
{
|
2019-10-18 20:51:46 +02:00
|
|
|
vkCreateDebugUtilsMessengerEXT = reinterpret_cast<PFN_vkCreateDebugUtilsMessengerEXT>(vkGetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT"));
|
|
|
|
|
vkDestroyDebugUtilsMessengerEXT = reinterpret_cast<PFN_vkDestroyDebugUtilsMessengerEXT>(vkGetInstanceProcAddr(instance, "vkDestroyDebugUtilsMessengerEXT"));
|
|
|
|
|
|
|
|
|
|
VkDebugUtilsMessengerCreateInfoEXT debugUtilsMessengerCI{};
|
2024-01-21 05:07:35 -08:00
|
|
|
setupDebugingMessengerCreateInfo(debugUtilsMessengerCI);
|
2019-10-18 20:51:46 +02:00
|
|
|
VkResult result = vkCreateDebugUtilsMessengerEXT(instance, &debugUtilsMessengerCI, nullptr, &debugUtilsMessenger);
|
|
|
|
|
assert(result == VK_SUCCESS);
|
2017-02-12 11:33:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void freeDebugCallback(VkInstance instance)
|
|
|
|
|
{
|
2019-10-18 20:51:46 +02:00
|
|
|
if (debugUtilsMessenger != VK_NULL_HANDLE)
|
2017-02-12 11:33:04 +01:00
|
|
|
{
|
2019-10-18 20:51:46 +02:00
|
|
|
vkDestroyDebugUtilsMessengerEXT(instance, debugUtilsMessenger, nullptr);
|
2017-02-12 11:33:04 +01:00
|
|
|
}
|
2016-02-16 15:07:25 +01:00
|
|
|
}
|
|
|
|
|
}
|
2016-05-07 14:05:56 +02:00
|
|
|
|
2023-05-09 20:04:34 +02:00
|
|
|
namespace debugutils
|
2016-05-07 14:05:56 +02:00
|
|
|
{
|
2023-05-09 20:04:34 +02:00
|
|
|
PFN_vkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabelEXT{ nullptr };
|
|
|
|
|
PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT{ nullptr };
|
|
|
|
|
PFN_vkCmdInsertDebugUtilsLabelEXT vkCmdInsertDebugUtilsLabelEXT{ nullptr };
|
2016-05-07 14:05:56 +02:00
|
|
|
|
2023-05-09 20:04:34 +02:00
|
|
|
void setup(VkInstance instance)
|
2016-05-07 14:05:56 +02:00
|
|
|
{
|
2023-05-09 20:04:34 +02:00
|
|
|
vkCmdBeginDebugUtilsLabelEXT = reinterpret_cast<PFN_vkCmdBeginDebugUtilsLabelEXT>(vkGetInstanceProcAddr(instance, "vkCmdBeginDebugUtilsLabelEXT"));
|
|
|
|
|
vkCmdEndDebugUtilsLabelEXT = reinterpret_cast<PFN_vkCmdEndDebugUtilsLabelEXT>(vkGetInstanceProcAddr(instance, "vkCmdEndDebugUtilsLabelEXT"));
|
|
|
|
|
vkCmdInsertDebugUtilsLabelEXT = reinterpret_cast<PFN_vkCmdInsertDebugUtilsLabelEXT>(vkGetInstanceProcAddr(instance, "vkCmdInsertDebugUtilsLabelEXT"));
|
2016-05-28 12:00:43 +02:00
|
|
|
}
|
|
|
|
|
|
2023-05-09 20:04:34 +02:00
|
|
|
void cmdBeginLabel(VkCommandBuffer cmdbuffer, std::string caption, glm::vec4 color)
|
2016-05-28 12:00:43 +02:00
|
|
|
{
|
2023-05-09 20:04:34 +02:00
|
|
|
if (!vkCmdBeginDebugUtilsLabelEXT) {
|
|
|
|
|
return;
|
2016-05-28 12:00:43 +02:00
|
|
|
}
|
2023-05-09 20:04:34 +02:00
|
|
|
VkDebugUtilsLabelEXT labelInfo{};
|
|
|
|
|
labelInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT;
|
|
|
|
|
labelInfo.pLabelName = caption.c_str();
|
|
|
|
|
memcpy(labelInfo.color, &color[0], sizeof(float) * 4);
|
|
|
|
|
vkCmdBeginDebugUtilsLabelEXT(cmdbuffer, &labelInfo);
|
2016-05-28 12:00:43 +02:00
|
|
|
}
|
|
|
|
|
|
2023-05-09 20:04:34 +02:00
|
|
|
void cmdEndLabel(VkCommandBuffer cmdbuffer)
|
2016-05-28 12:00:43 +02:00
|
|
|
{
|
2023-05-09 20:04:34 +02:00
|
|
|
if (!vkCmdEndDebugUtilsLabelEXT) {
|
|
|
|
|
return;
|
2016-05-22 20:29:03 +02:00
|
|
|
}
|
2023-05-09 20:04:34 +02:00
|
|
|
vkCmdEndDebugUtilsLabelEXT(cmdbuffer);
|
2016-05-07 14:05:56 +02:00
|
|
|
}
|
|
|
|
|
|
2016-05-28 12:00:43 +02:00
|
|
|
};
|
2016-05-22 20:29:03 +02:00
|
|
|
|
2023-05-09 20:04:34 +02:00
|
|
|
}
|