[PATCH 2/4] winex11.drv: Enable VK_EXT_acquire_xlib_display if VK_KHR_get_physical_device_properties2 is enabled.

Zhiyi Zhang zzhang at codeweavers.com
Fri Jun 12 02:20:25 CDT 2020


VK_KHR_get_physical_device_properties2 doesn't report a valid LUID on non-Windows hosts.
Extension VK_EXT_acquire_xlib_display is needed for the use of vkGetRandROutputDisplayEXT(),
which will be used to fill in the LUID property of Vulkan devices.

Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
 dlls/vulkan-1/tests/vulkan.c |  1 +
 dlls/winex11.drv/vulkan.c    | 55 +++++++++++++++++++++++++++++++-----
 2 files changed, 49 insertions(+), 7 deletions(-)

diff --git a/dlls/vulkan-1/tests/vulkan.c b/dlls/vulkan-1/tests/vulkan.c
index 63fd48b33d3..4ebfe6815bf 100644
--- a/dlls/vulkan-1/tests/vulkan.c
+++ b/dlls/vulkan-1/tests/vulkan.c
@@ -352,6 +352,7 @@ static void test_unsupported_instance_extensions(void)
     {
         "VK_KHR_xcb_surface",
         "VK_KHR_xlib_surface",
+        "VK_EXT_acquire_xlib_display",
     };
 
     for (i = 0; i < ARRAY_SIZE(extensions); ++i)
diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c
index c988b1a6b27..9ee79220f76 100644
--- a/dlls/winex11.drv/vulkan.c
+++ b/dlls/winex11.drv/vulkan.c
@@ -155,9 +155,9 @@ fail:
  * Caller is responsible for allocation and cleanup of 'dst'.
  */
 static VkResult wine_vk_instance_convert_create_info(const VkInstanceCreateInfo *src,
-        VkInstanceCreateInfo *dst)
+        VkInstanceCreateInfo *dst, BOOL enable_acquire_xlib_display)
 {
-    unsigned int i;
+    unsigned int i, extension_count;
     const char **enabled_extensions = NULL;
 
     dst->sType = src->sType;
@@ -169,9 +169,13 @@ static VkResult wine_vk_instance_convert_create_info(const VkInstanceCreateInfo
     dst->enabledExtensionCount = 0;
     dst->ppEnabledExtensionNames = NULL;
 
-    if (src->enabledExtensionCount > 0)
+    extension_count = src->enabledExtensionCount;
+    if (enable_acquire_xlib_display)
+        ++extension_count;
+
+    if (extension_count)
     {
-        enabled_extensions = heap_calloc(src->enabledExtensionCount, sizeof(*src->ppEnabledExtensionNames));
+        enabled_extensions = heap_calloc(extension_count, sizeof(*src->ppEnabledExtensionNames));
         if (!enabled_extensions)
         {
             ERR("Failed to allocate memory for enabled extensions\n");
@@ -192,8 +196,12 @@ static VkResult wine_vk_instance_convert_create_info(const VkInstanceCreateInfo
                 enabled_extensions[i] = src->ppEnabledExtensionNames[i];
             }
         }
+
+        if (enable_acquire_xlib_display)
+            enabled_extensions[i] = "VK_EXT_acquire_xlib_display";
+
         dst->ppEnabledExtensionNames = enabled_extensions;
-        dst->enabledExtensionCount = src->enabledExtensionCount;
+        dst->enabledExtensionCount = extension_count;
     }
 
     return VK_SUCCESS;
@@ -232,6 +240,7 @@ static VkResult X11DRV_vkCreateInstance(const VkInstanceCreateInfo *create_info,
         const VkAllocationCallbacks *allocator, VkInstance *instance)
 {
     VkInstanceCreateInfo create_info_host;
+    unsigned int i;
     VkResult res;
     TRACE("create_info %p, allocator %p, instance %p\n", create_info, allocator, instance);
 
@@ -240,9 +249,33 @@ static VkResult X11DRV_vkCreateInstance(const VkInstanceCreateInfo *create_info,
 
     /* Perform a second pass on converting VkInstanceCreateInfo. Winevulkan
      * performed a first pass in which it handles everything except for WSI
-     * functionality such as VK_KHR_win32_surface. Handle this now.
+     * functionality such as VK_KHR_win32_surface. Handle this now. And try
+     * to enable VK_EXT_acquire_xlib_display if VK_KHR_get_physical_device_properties2
+     * is enabled for getting valid LUIDs.
      */
-    res = wine_vk_instance_convert_create_info(create_info, &create_info_host);
+    for (i = 0; i < create_info->enabledExtensionCount; ++i)
+    {
+        if (!strcmp(create_info->ppEnabledExtensionNames[i],
+                VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME))
+            break;
+    }
+
+    if (i < create_info->enabledExtensionCount)
+    {
+        res = wine_vk_instance_convert_create_info(create_info, &create_info_host, TRUE);
+        if (res != VK_SUCCESS)
+        {
+            ERR("Failed to convert instance create info, res=%d\n", res);
+            return res;
+        }
+
+        res = pvkCreateInstance(&create_info_host, NULL /* allocator */, instance);
+        heap_free((void *)create_info_host.ppEnabledExtensionNames);
+        if (res != VK_ERROR_EXTENSION_NOT_PRESENT)
+            return res;
+    }
+
+    res = wine_vk_instance_convert_create_info(create_info, &create_info_host, FALSE);
     if (res != VK_SUCCESS)
     {
         ERR("Failed to convert instance create info, res=%d\n", res);
@@ -413,6 +446,14 @@ static VkResult X11DRV_vkEnumerateInstanceExtensionProperties(const char *layer_
                     VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
             properties[i].specVersion = VK_KHR_WIN32_SURFACE_SPEC_VERSION;
         }
+
+        /* Do not report VK_EXT_acquire_xlib_display */
+        if (!strcmp(properties[i].extensionName, "VK_EXT_acquire_xlib_display"))
+        {
+            if (i + 1 < *count)
+                memmove(&properties[i], &properties[i + 1], sizeof(*properties) * (*count - (i + 1)));
+            *count = *count - 1;
+        }
     }
 
     TRACE("Returning %u extensions.\n", *count);
-- 
2.25.1




More information about the wine-devel mailing list