summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/tapi/t_cleanup.h1
-rw-r--r--include/util/cru_cleanup.h1
-rw-r--r--src/framework/test/t_phase_setup.c75
-rw-r--r--src/framework/test/test.h4
-rw-r--r--src/util/cru_cleanup.c18
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: {