[PATCH] wined3d: Use VK_EXT_debug_report if available.
Joshua Ashton
joshua at froggi.es
Mon Apr 5 17:33:35 CDT 2021
This extension is deprecated.
https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_EXT_debug_report.html
- Joshie 🐸✨
On 4/5/21 11:20 PM, Zebediah Figura wrote:
> 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)
>
More information about the wine-devel
mailing list