[PATCH] wined3d: Use VK_EXT_debug_report if available.
Zebediah Figura
z.figura12 at gmail.com
Mon Apr 5 17:20:28 CDT 2021
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/wined3d/adapter_vk.c | 60 +++++++++++++++++++++++++++++++++++++++
dlls/wined3d/wined3d_vk.h | 6 ++++
2 files changed, 66 insertions(+)
diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c
index 7303c994eb4..e7ef721703c 100644
--- a/dlls/wined3d/adapter_vk.c
+++ b/dlls/wined3d/adapter_vk.c
@@ -271,6 +271,9 @@ static void adapter_vk_destroy(struct wined3d_adapter *adapter)
struct wined3d_adapter_vk *adapter_vk = wined3d_adapter_vk(adapter);
struct wined3d_vk_info *vk_info = &adapter_vk->vk_info;
+ if (vk_info->debug_callback)
+ VK_CALL(vkDestroyDebugReportCallbackEXT(vk_info->instance, vk_info->debug_callback, NULL));
+
VK_CALL(vkDestroyInstance(vk_info->instance, NULL));
wined3d_unload_vulkan(vk_info);
wined3d_adapter_cleanup(&adapter_vk->a);
@@ -1827,6 +1830,7 @@ static const struct
}
vulkan_instance_extensions[] =
{
+ {VK_EXT_DEBUG_REPORT_EXTENSION_NAME, ~0u, FALSE},
{VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, VK_API_VERSION_1_1, FALSE},
{VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME, VK_API_VERSION_1_1, FALSE},
{VK_KHR_SURFACE_EXTENSION_NAME, ~0u, TRUE},
@@ -1904,6 +1908,34 @@ done:
return success;
}
+static VkBool32 VKAPI_PTR debug_report_callback(VkDebugReportFlagsEXT flags,
+ VkDebugReportObjectTypeEXT object_type, uint64_t object, size_t location,
+ int32_t message_code, const char *layer_prefix, const char *message, void *user_data)
+{
+ FIXME("%s\n", debugstr_a(message));
+ return VK_FALSE;
+}
+
+static void init_debug_report(struct wined3d_vk_info *vk_info)
+{
+ VkDebugReportCallbackCreateInfoEXT callback_info;
+ VkDebugReportCallbackEXT callback;
+ VkResult vr;
+
+ callback_info.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT;
+ callback_info.pNext = NULL;
+ callback_info.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT;
+ callback_info.pfnCallback = debug_report_callback;
+ callback_info.pUserData = NULL;
+ if ((vr = VK_CALL(vkCreateDebugReportCallbackEXT(vk_info->instance, &callback_info, NULL, &callback))) < 0)
+ {
+ WARN("Failed to create debug report callback, vr %d.\n", vr);
+ return;
+ }
+
+ vk_info->debug_callback = callback;
+}
+
static BOOL wined3d_init_vulkan(struct wined3d_vk_info *vk_info)
{
const char *enabled_instance_extensions[ARRAY_SIZE(vulkan_instance_extensions)];
@@ -1914,8 +1946,19 @@ static BOOL wined3d_init_vulkan(struct wined3d_vk_info *vk_info)
VkApplicationInfo app_info;
uint32_t api_version = 0;
char app_name[MAX_PATH];
+ unsigned int i, j;
VkResult vr;
+ static const struct
+ {
+ const char *name;
+ enum wined3d_vk_extension extension;
+ }
+ map[] =
+ {
+ {VK_EXT_DEBUG_REPORT_EXTENSION_NAME, WINED3D_VK_EXT_DEBUG_REPORT},
+ };
+
if (!wined3d_load_vulkan(vk_info))
return FALSE;
@@ -1953,6 +1996,18 @@ static BOOL wined3d_init_vulkan(struct wined3d_vk_info *vk_info)
memset(vk_info->supported, 0, sizeof(vk_info->supported));
vk_info->supported[WINED3D_VK_EXT_NONE] = TRUE;
+ for (i = 0; i < ARRAY_SIZE(map); ++i)
+ {
+ for (j = 0; j < instance_info.enabledExtensionCount; ++j)
+ {
+ if (!strcmp(enabled_instance_extensions[j], map[i].name))
+ {
+ vk_info->supported[map[i].extension] = TRUE;
+ break;
+ }
+ }
+ }
+
if ((vr = VK_CALL(vkCreateInstance(&instance_info, NULL, &instance))) < 0)
{
WARN("Failed to create Vulkan instance, vr %s.\n", wined3d_debug_vkresult(vr));
@@ -1989,6 +2044,9 @@ static BOOL wined3d_init_vulkan(struct wined3d_vk_info *vk_info)
vk_info->instance = instance;
+ if (vk_info->supported[WINED3D_VK_EXT_DEBUG_REPORT])
+ init_debug_report(vk_info);
+
return TRUE;
fail:
@@ -2366,6 +2424,8 @@ fail:
wined3d_adapter_cleanup(adapter);
heap_free(adapter_vk->device_extensions);
fail_vulkan:
+ if (vk_info->debug_callback)
+ VK_CALL(vkDestroyDebugReportCallbackEXT(vk_info->instance, vk_info->debug_callback, NULL));
VK_CALL(vkDestroyInstance(vk_info->instance, NULL));
wined3d_unload_vulkan(vk_info);
return FALSE;
diff --git a/dlls/wined3d/wined3d_vk.h b/dlls/wined3d/wined3d_vk.h
index a417a795901..d9d7faa55f6 100644
--- a/dlls/wined3d/wined3d_vk.h
+++ b/dlls/wined3d/wined3d_vk.h
@@ -42,6 +42,9 @@
/* Vulkan 1.1 */ \
VK_INSTANCE_EXT_PFN(vkGetPhysicalDeviceFeatures2) \
VK_INSTANCE_EXT_PFN(vkGetPhysicalDeviceProperties2) \
+ /* VK_EXT_debug_report */ \
+ VK_INSTANCE_EXT_PFN(vkCreateDebugReportCallbackEXT) \
+ VK_INSTANCE_EXT_PFN(vkDestroyDebugReportCallbackEXT) \
/* VK_KHR_surface */ \
VK_INSTANCE_PFN(vkDestroySurfaceKHR) \
VK_INSTANCE_PFN(vkGetPhysicalDeviceSurfaceCapabilitiesKHR) \
@@ -208,6 +211,7 @@ enum wined3d_vk_extension
{
WINED3D_VK_EXT_NONE,
+ WINED3D_VK_EXT_DEBUG_REPORT,
WINED3D_VK_EXT_TRANSFORM_FEEDBACK,
WINED3D_VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE,
@@ -225,6 +229,8 @@ struct wined3d_vk_info
#ifdef USE_WIN32_VULKAN
HMODULE vulkan_lib;
#endif
+
+ VkDebugReportCallbackEXT debug_callback;
};
#define VK_CALL(f) (vk_info->vk_ops.f)
--
2.30.2
More information about the wine-devel
mailing list