diff options
-rw-r--r-- | include/tapi/t_cleanup.h | 1 | ||||
-rw-r--r-- | include/util/cru_cleanup.h | 1 | ||||
-rw-r--r-- | src/framework/test/t_phase_setup.c | 75 | ||||
-rw-r--r-- | src/framework/test/test.h | 4 | ||||
-rw-r--r-- | src/util/cru_cleanup.c | 18 |
5 files changed, 98 insertions, 1 deletions
diff --git a/include/tapi/t_cleanup.h b/include/tapi/t_cleanup.h index 6af12e1..dff5df9 100644 --- a/include/tapi/t_cleanup.h +++ b/include/tapi/t_cleanup.h @@ -57,6 +57,7 @@ static inline void t_cleanup_push_free(void *data) static inline void t_cleanup_push_cru_cleanup_stack(cru_cleanup_stack_t *x) { t_cleanup_push_command(CRU_CLEANUP_CMD_CRU_CLEANUP_STACK, x); } static inline void t_cleanup_push_cru_image(cru_image_t *x) { t_cleanup_push_command(CRU_CLEANUP_CMD_CRU_IMAGE, x); } +static inline void t_cleanup_push_vk_debug_cb(PFN_vkDestroyDebugReportCallbackEXT f, VkInstance i, VkDebugReportCallbackEXT cb) { t_cleanup_push_command(CRU_CLEANUP_CMD_VK_DEBUG_CB, f, i, cb); } static inline void t_cleanup_push_vk_instance(VkInstance x, const VkAllocationCallbacks *a) { t_cleanup_push_command(CRU_CLEANUP_CMD_VK_INSTANCE, x, a); } static inline void t_cleanup_push_vk_device(VkDevice x, const VkAllocationCallbacks *a) { t_cleanup_push_command(CRU_CLEANUP_CMD_VK_DEVICE, x, a); } diff --git a/include/util/cru_cleanup.h b/include/util/cru_cleanup.h index 877840f..6eca304 100644 --- a/include/util/cru_cleanup.h +++ b/include/util/cru_cleanup.h @@ -44,6 +44,7 @@ enum cru_cleanup_cmd { CRU_CLEANUP_CMD_VK_BUFFER_VIEW, CRU_CLEANUP_CMD_VK_COMMAND_BUFFER, CRU_CLEANUP_CMD_VK_COMMAND_POOL, + CRU_CLEANUP_CMD_VK_DEBUG_CB, CRU_CLEANUP_CMD_VK_DESCRIPTOR_POOL, CRU_CLEANUP_CMD_VK_DESCRIPTOR_SET, CRU_CLEANUP_CMD_VK_DESCRIPTOR_SET_LAYOUT, diff --git a/src/framework/test/t_phase_setup.c b/src/framework/test/t_phase_setup.c index db92f7b..f60e7ba 100644 --- a/src/framework/test/t_phase_setup.c +++ b/src/framework/test/t_phase_setup.c @@ -276,6 +276,34 @@ t_setup_descriptor_pool(void) t_cleanup_push_vk_descriptor_pool(t->vk.device, t->vk.descriptor_pool); } +static VkBool32 debug_cb(VkDebugReportFlagsEXT flags, + VkDebugReportObjectTypeEXT objectType, + uint64_t object, + size_t location, + int32_t messageCode, + const char *pLayerPrefix, + const char *pMessage, + void *pUserData) +{ + if (flags & VK_DEBUG_REPORT_INFORMATION_BIT_EXT) + logi("object %lu type 0x%x location %lu code %u layer \"%s\" msg %s", + object, objectType, location, messageCode, pLayerPrefix, pMessage); + + if (flags & VK_DEBUG_REPORT_WARNING_BIT_EXT) + logw("object %lu type 0x%x location %lu code %u layer \"%s\" msg %s", + object, objectType, location, messageCode, pLayerPrefix, pMessage); + + if (flags & VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT) + logw("object %lu type 0x%x location %lu code %u layer \"%s\" msg %s", + object, objectType, location, messageCode, pLayerPrefix, pMessage); + + if (flags & VK_DEBUG_REPORT_ERROR_BIT_EXT) + loge("object %lu type 0x%x location %lu code %u layer \"%s\" msg %s", + object, objectType, location, messageCode, pLayerPrefix, pMessage); + + return false; +} + void t_setup_vulkan(void) { @@ -299,12 +327,30 @@ t_setup_vulkan(void) ext_names = malloc(t->vk.instance_extension_count * sizeof(*ext_names)); t_assert(ext_names); - for (uint32_t i = 0; i < t->vk.instance_extension_count; i++) + void *debug_report = NULL; + VkDebugReportCallbackCreateInfoEXT cb_info = { + VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT, + NULL, + VK_DEBUG_REPORT_INFORMATION_BIT_EXT | + VK_DEBUG_REPORT_WARNING_BIT_EXT | + VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT | + VK_DEBUG_REPORT_ERROR_BIT_EXT | + VK_DEBUG_REPORT_DEBUG_BIT_EXT, + debug_cb, + t + }; + + for (uint32_t i = 0; i < t->vk.instance_extension_count; i++) { ext_names[i] = t->vk.instance_extension_props[i].extensionName; + if (strcmp(ext_names[i], "VK_EXT_debug_report") == 0) + debug_report = &cb_info; + } + res = vkCreateInstance( &(VkInstanceCreateInfo) { .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, + .pNext = debug_report, .pApplicationInfo = &(VkApplicationInfo) { .pApplicationName = "crucible", .apiVersion = VK_MAKE_VERSION(1, 0, 0), @@ -316,6 +362,33 @@ t_setup_vulkan(void) t_assert(res == VK_SUCCESS); t_cleanup_push_vk_instance(t->vk.instance, &test_alloc_cb); + if (debug_report) { +#define RESOLVE(func)\ + (PFN_ ##func) vkGetInstanceProcAddr(t->vk.instance, #func); + t->vk.vkCreateDebugReportCallbackEXT = RESOLVE(vkCreateDebugReportCallbackEXT); + t->vk.vkDestroyDebugReportCallbackEXT = RESOLVE(vkDestroyDebugReportCallbackEXT); +#undef RESOLVE + + VkDebugReportCallbackCreateInfoEXT info; + info.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT; + info.pNext = NULL; + info.flags = VK_DEBUG_REPORT_INFORMATION_BIT_EXT | + VK_DEBUG_REPORT_WARNING_BIT_EXT | + VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT | + VK_DEBUG_REPORT_ERROR_BIT_EXT | + VK_DEBUG_REPORT_DEBUG_BIT_EXT; + info.pfnCallback = debug_cb; + info.pUserData = t; + + res = t->vk.vkCreateDebugReportCallbackEXT(t_instance, &info, NULL, + &t->vk.debug_callback); + t_assert(res == VK_SUCCESS); + t_assert(t->vk.debug_callback != 0); + + t_cleanup_push_vk_debug_cb(t->vk.vkDestroyDebugReportCallbackEXT, + t->vk.instance, t->vk.debug_callback); + } + t_setup_phys_dev(); qoGetPhysicalDeviceMemoryProperties(t->vk.physical_dev, diff --git a/src/framework/test/test.h b/src/framework/test/test.h index 7fcac88..edd0a5f 100644 --- a/src/framework/test/test.h +++ b/src/framework/test/test.h @@ -159,6 +159,10 @@ struct test { VkImage ds_image; VkImageView depthstencil_image_view; + + PFN_vkCreateDebugReportCallbackEXT vkCreateDebugReportCallbackEXT; + PFN_vkDestroyDebugReportCallbackEXT vkDestroyDebugReportCallbackEXT; + VkDebugReportCallbackEXT debug_callback; } vk; }; diff --git a/src/util/cru_cleanup.c b/src/util/cru_cleanup.c index addf4ba..cb29562 100644 --- a/src/util/cru_cleanup.c +++ b/src/util/cru_cleanup.c @@ -74,6 +74,12 @@ struct cmd_vk_instance { const VkAllocationCallbacks *alloc; }; +struct cmd_debug_cb { + PFN_vkDestroyDebugReportCallbackEXT func; + VkInstance instance; + VkDebugReportCallbackEXT callback; +}; + struct cmd_vk_device { VkDevice dev; const VkAllocationCallbacks *alloc; @@ -278,6 +284,13 @@ cru_cleanup_push_commandv(cru_cleanup_stack_t *c, CMD_SET(alloc); break; } + case CRU_CLEANUP_CMD_VK_DEBUG_CB: { + CMD_CREATE(struct cmd_debug_cb); + CMD_SET(func); + CMD_SET(instance); + CMD_SET(callback); + break; + } case CRU_CLEANUP_CMD_VK_DEVICE: { CMD_CREATE(struct cmd_vk_device); CMD_SET(dev); @@ -487,6 +500,11 @@ cru_cleanup_pop_impl(cru_cleanup_stack_t *c, bool noop) CMD_DO(vkDestroyInstance(cmd->instance, cmd->alloc)); break; } + case CRU_CLEANUP_CMD_VK_DEBUG_CB: { + CMD_GET(struct cmd_debug_cb); + CMD_DO(cmd->func(cmd->instance, cmd->callback, NULL)); + break; + } // Non-dispatchable Vulkan objects case CRU_CLEANUP_CMD_VK_BUFFER: { |