Using VK_debug_report extension if available.

This commit is contained in:
David Carlier 2023-01-13 22:32:12 +00:00 committed by Denis Pauk
parent 495a40dffd
commit 0f6d05ed9b
3 changed files with 59 additions and 0 deletions

View file

@ -275,6 +275,8 @@ extern PFN_vkSetDebugUtilsObjectTagEXT qvkSetDebugUtilsObjectTagEXT;
extern PFN_vkCmdBeginDebugUtilsLabelEXT qvkCmdBeginDebugUtilsLabelEXT; extern PFN_vkCmdBeginDebugUtilsLabelEXT qvkCmdBeginDebugUtilsLabelEXT;
extern PFN_vkCmdEndDebugUtilsLabelEXT qvkCmdEndDebugUtilsLabelEXT; extern PFN_vkCmdEndDebugUtilsLabelEXT qvkCmdEndDebugUtilsLabelEXT;
extern PFN_vkCmdInsertDebugUtilsLabelEXT qvkInsertDebugUtilsLabelEXT; extern PFN_vkCmdInsertDebugUtilsLabelEXT qvkInsertDebugUtilsLabelEXT;
extern PFN_vkCreateDebugReportCallbackEXT qvkCreateDebugReportCallbackEXT;
extern PFN_vkDestroyDebugReportCallbackEXT qvkDestroyDebugReportCallbackEXT;
#if defined(__APPLE__) #if defined(__APPLE__)
extern PFN_vkGetPhysicalDeviceMetalFeaturesMVK qvkGetPhysicalDeviceMetalFeaturesMVK; extern PFN_vkGetPhysicalDeviceMetalFeaturesMVK qvkGetPhysicalDeviceMetalFeaturesMVK;
extern PFN_vkGetMoltenVKConfigurationMVK qvkGetMoltenVKConfigurationMVK; extern PFN_vkGetMoltenVKConfigurationMVK qvkGetMoltenVKConfigurationMVK;

View file

@ -165,6 +165,8 @@ PFN_vkSetDebugUtilsObjectTagEXT qvkSetDebugUtilsObjectTagEXT;
PFN_vkCmdBeginDebugUtilsLabelEXT qvkCmdBeginDebugUtilsLabelEXT; PFN_vkCmdBeginDebugUtilsLabelEXT qvkCmdBeginDebugUtilsLabelEXT;
PFN_vkCmdEndDebugUtilsLabelEXT qvkCmdEndDebugUtilsLabelEXT; PFN_vkCmdEndDebugUtilsLabelEXT qvkCmdEndDebugUtilsLabelEXT;
PFN_vkCmdInsertDebugUtilsLabelEXT qvkInsertDebugUtilsLabelEXT; PFN_vkCmdInsertDebugUtilsLabelEXT qvkInsertDebugUtilsLabelEXT;
PFN_vkCreateDebugReportCallbackEXT qvkCreateDebugReportCallbackEXT;
PFN_vkDestroyDebugReportCallbackEXT qvkDestroyDebugReportCallbackEXT;
#define VK_INPUTBIND_DESC(s) { \ #define VK_INPUTBIND_DESC(s) { \
.binding = 0, \ .binding = 0, \
@ -1899,6 +1901,8 @@ qboolean QVk_Init(void)
qvkCmdBeginDebugUtilsLabelEXT = (PFN_vkCmdBeginDebugUtilsLabelEXT)vkGetInstanceProcAddr(vk_instance, "vkCmdBeginDebugUtilsLabelEXT"); qvkCmdBeginDebugUtilsLabelEXT = (PFN_vkCmdBeginDebugUtilsLabelEXT)vkGetInstanceProcAddr(vk_instance, "vkCmdBeginDebugUtilsLabelEXT");
qvkCmdEndDebugUtilsLabelEXT = (PFN_vkCmdEndDebugUtilsLabelEXT)vkGetInstanceProcAddr(vk_instance, "vkCmdEndDebugUtilsLabelEXT"); qvkCmdEndDebugUtilsLabelEXT = (PFN_vkCmdEndDebugUtilsLabelEXT)vkGetInstanceProcAddr(vk_instance, "vkCmdEndDebugUtilsLabelEXT");
qvkInsertDebugUtilsLabelEXT = (PFN_vkCmdInsertDebugUtilsLabelEXT)vkGetInstanceProcAddr(vk_instance, "vkCmdInsertDebugUtilsLabelEXT"); qvkInsertDebugUtilsLabelEXT = (PFN_vkCmdInsertDebugUtilsLabelEXT)vkGetInstanceProcAddr(vk_instance, "vkCmdInsertDebugUtilsLabelEXT");
qvkCreateDebugReportCallbackEXT = (PFN_vkCreateDebugReportCallbackEXT)vkGetInstanceProcAddr(vk_instance, "vkCreateDebugReportCallbackEXT");
qvkDestroyDebugReportCallbackEXT = (PFN_vkDestroyDebugReportCallbackEXT)vkGetInstanceProcAddr(vk_instance, "vkDestroyDebugReportCallbackEXT");
} }
else else
{ {
@ -1909,6 +1913,8 @@ qboolean QVk_Init(void)
qvkCmdBeginDebugUtilsLabelEXT = NULL; qvkCmdBeginDebugUtilsLabelEXT = NULL;
qvkCmdEndDebugUtilsLabelEXT = NULL; qvkCmdEndDebugUtilsLabelEXT = NULL;
qvkInsertDebugUtilsLabelEXT = NULL; qvkInsertDebugUtilsLabelEXT = NULL;
qvkCreateDebugReportCallbackEXT = NULL;
qvkDestroyDebugReportCallbackEXT = NULL;
} }
if (r_validation->value > 0) if (r_validation->value > 0)

View file

@ -61,6 +61,36 @@ static VKAPI_ATTR VkBool32 VKAPI_CALL debugUtilsCallback(VkDebugUtilsMessageSeve
return VK_FALSE; return VK_FALSE;
} }
static VkDebugReportCallbackEXT validationLayerCallback = VK_NULL_HANDLE;
// validation layer callback function (VK_EXT_debug_report)
static VKAPI_ATTR VkBool32 VKAPI_CALL debugCallbackReport(VkDebugReportFlagsEXT flags,
VkDebugReportObjectTypeEXT objType,
uint64_t obj, size_t location, int32_t code,
const char *layerPrefix, const char *msg,
void* userData)
{
switch (flags)
{
case VK_DEBUG_REPORT_INFORMATION_BIT_EXT:
R_Printf(PRINT_ALL, "VK_INFO: %s %s\n", layerPrefix, msg);
break;
case VK_DEBUG_REPORT_DEBUG_BIT_EXT:
R_Printf(PRINT_ALL, "VK_DEBUG: %s %s\n", layerPrefix, msg);
break;
case VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT:
R_Printf(PRINT_ALL, "VK_PERFORMANCE: %s %s\n", layerPrefix, msg);
break;
case VK_DEBUG_REPORT_WARNING_BIT_EXT:
R_Printf(PRINT_ALL, "VK_WARNING: %s %s\n", layerPrefix, msg);
break;
default:
R_Printf(PRINT_ALL, "VK_ERROR: %s %s\n", layerPrefix, msg);
break;
}
return VK_FALSE;
}
void QVk_CreateValidationLayers() void QVk_CreateValidationLayers()
{ {
VkDebugUtilsMessengerCreateInfoEXT callbackInfo = { VkDebugUtilsMessengerCreateInfoEXT callbackInfo = {
@ -76,6 +106,16 @@ void QVk_CreateValidationLayers()
.pUserData = NULL .pUserData = NULL
}; };
VkDebugReportCallbackCreateInfoEXT callbackReport = {
.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT,
.pNext = NULL,
.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT |
VK_DEBUG_REPORT_DEBUG_BIT_EXT | VK_DEBUG_REPORT_INFORMATION_BIT_EXT |
VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
.pfnCallback = debugCallbackReport,
.pUserData = NULL
};
if (r_validation->value > 1) if (r_validation->value > 1)
{ {
callbackInfo.messageSeverity |= VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT | callbackInfo.messageSeverity |= VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT |
@ -85,6 +125,11 @@ void QVk_CreateValidationLayers()
if (qvkCreateDebugUtilsMessengerEXT) if (qvkCreateDebugUtilsMessengerEXT)
{ {
VK_VERIFY(qvkCreateDebugUtilsMessengerEXT(vk_instance, &callbackInfo, NULL, &validationMessenger)); VK_VERIFY(qvkCreateDebugUtilsMessengerEXT(vk_instance, &callbackInfo, NULL, &validationMessenger));
}
if (qvkCreateDebugReportCallbackEXT)
{
VK_VERIFY(qvkCreateDebugReportCallbackEXT(vk_instance, &callbackReport, NULL, &validationLayerCallback));
R_Printf(PRINT_ALL, "...Vulkan validation layers enabled\n"); R_Printf(PRINT_ALL, "...Vulkan validation layers enabled\n");
} }
} }
@ -96,4 +141,10 @@ void QVk_DestroyValidationLayers()
qvkDestroyDebugUtilsMessengerEXT( vk_instance, validationMessenger, NULL ); qvkDestroyDebugUtilsMessengerEXT( vk_instance, validationMessenger, NULL );
validationMessenger = VK_NULL_HANDLE; validationMessenger = VK_NULL_HANDLE;
} }
if ( validationLayerCallback != VK_NULL_HANDLE && qvkDestroyDebugReportCallbackEXT)
{
qvkDestroyDebugReportCallbackEXT( vk_instance, validationLayerCallback, NULL );
validationLayerCallback = VK_NULL_HANDLE;
}
} }