Henri Verbeet : wined3d: Initialise the list of Vulkan device extensions during adapter initialisation.

Alexandre Julliard julliard at winehq.org
Wed Oct 7 16:04:11 CDT 2020


Module: wine
Branch: master
Commit: 10bfc47a48d0cc16673b836710d1cc1e969a7d43
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=10bfc47a48d0cc16673b836710d1cc1e969a7d43

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Wed Oct  7 16:45:09 2020 +0330

wined3d: Initialise the list of Vulkan device extensions during adapter initialisation.

There's no reason to wait until wined3d device creation.

Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wined3d/adapter_vk.c      | 174 +++++++++++++++++++++++------------------
 dlls/wined3d/wined3d_private.h |   2 +
 2 files changed, 99 insertions(+), 77 deletions(-)

diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c
index 799ec2601e..e589699bcd 100644
--- a/dlls/wined3d/adapter_vk.c
+++ b/dlls/wined3d/adapter_vk.c
@@ -274,6 +274,7 @@ static void adapter_vk_destroy(struct wined3d_adapter *adapter)
     VK_CALL(vkDestroyInstance(vk_info->instance, NULL));
     wined3d_unload_vulkan(vk_info);
     wined3d_adapter_cleanup(&adapter_vk->a);
+    heap_free(adapter_vk->device_extensions);
     heap_free(adapter_vk);
 }
 
@@ -397,82 +398,12 @@ static const struct wined3d_allocator_ops wined3d_allocator_vk_ops =
     .allocator_destroy_chunk = wined3d_allocator_vk_destroy_chunk,
 };
 
-static const struct
-{
-    const char *name;
-    unsigned int core_since_version;
-}
-vulkan_device_extensions[] =
-{
-    {VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME,    ~0u},
-    {VK_KHR_MAINTENANCE1_EXTENSION_NAME,                VK_API_VERSION_1_1},
-    {VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME,      VK_API_VERSION_1_1},
-    {VK_KHR_SWAPCHAIN_EXTENSION_NAME,                   ~0u},
-};
-
-static bool enable_vulkan_device_extensions(VkPhysicalDevice physical_device, uint32_t *extension_count,
-        const char *enabled_extensions[], const struct wined3d_vk_info *vk_info)
-{
-    VkExtensionProperties *extensions = NULL;
-    bool success = false, found;
-    unsigned int i, j, count;
-    VkResult vr;
-
-    *extension_count = 0;
-
-    if ((vr = VK_CALL(vkEnumerateDeviceExtensionProperties(physical_device, NULL, &count, NULL))) < 0)
-    {
-        ERR("Failed to enumerate device extensions, vr %s.\n", wined3d_debug_vkresult(vr));
-        goto done;
-    }
-    if (!(extensions = heap_calloc(count, sizeof(*extensions))))
-    {
-        WARN("Out of memory.\n");
-        goto done;
-    }
-    if ((vr = VK_CALL(vkEnumerateDeviceExtensionProperties(physical_device, NULL, &count, extensions))) < 0)
-    {
-        ERR("Failed to enumerate device extensions, vr %s.\n", wined3d_debug_vkresult(vr));
-        goto done;
-    }
-
-    for (i = 0; i < ARRAY_SIZE(vulkan_device_extensions); ++i)
-    {
-        if (vulkan_device_extensions[i].core_since_version <= vk_info->api_version)
-            continue;
-
-        for (j = 0, found = false; j < count; ++j)
-        {
-            if (!strcmp(extensions[j].extensionName, vulkan_device_extensions[i].name))
-            {
-                found = true;
-                break;
-            }
-        }
-
-        if (!found)
-        {
-            WARN("Required extension '%s' is not available.\n", vulkan_device_extensions[i].name);
-            goto done;
-        }
-
-        TRACE("Enabling instance extension '%s'.\n", vulkan_device_extensions[i].name);
-        enabled_extensions[(*extension_count)++] = vulkan_device_extensions[i].name;
-    }
-    success = true;
-
-done:
-    heap_free(extensions);
-    return success;
-}
-
 static HRESULT adapter_vk_create_device(struct wined3d *wined3d, const struct wined3d_adapter *adapter,
         enum wined3d_device_type device_type, HWND focus_window, unsigned int flags, BYTE surface_alignment,
         const enum wined3d_feature_level *levels, unsigned int level_count,
         struct wined3d_device_parent *device_parent, struct wined3d_device **device)
 {
     const struct wined3d_adapter_vk *adapter_vk = wined3d_adapter_vk_const(adapter);
-    const char *enabled_device_extensions[ARRAY_SIZE(vulkan_device_extensions)];
     VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *vertex_divisor_features;
     const struct wined3d_vk_info *vk_info = &adapter_vk->vk_info;
     struct wined3d_physical_device_info physical_device_info;
@@ -533,13 +464,8 @@ static HRESULT adapter_vk_create_device(struct wined3d *wined3d, const struct wi
     device_info.pQueueCreateInfos = &queue_info;
     device_info.enabledLayerCount = 0;
     device_info.ppEnabledLayerNames = NULL;
-    device_info.ppEnabledExtensionNames = enabled_device_extensions;
-    if (!enable_vulkan_device_extensions(physical_device,
-            &device_info.enabledExtensionCount, enabled_device_extensions, vk_info))
-    {
-        hr = E_FAIL;
-        goto fail;
-    }
+    device_info.enabledExtensionCount = adapter_vk->device_extension_count;
+    device_info.ppEnabledExtensionNames = adapter_vk->device_extensions;
     device_info.pEnabledFeatures = &features2->features;
 
     if ((vr = VK_CALL(vkCreateDevice(physical_device, &device_info, NULL, &vk_device))) < 0)
@@ -2146,6 +2072,93 @@ static void wined3d_adapter_vk_init_d3d_info(struct wined3d_adapter_vk *adapter_
     d3d_info->multisample_draw_location = WINED3D_LOCATION_TEXTURE_RGB;
 }
 
+static bool wined3d_adapter_vk_init_device_extensions(struct wined3d_adapter_vk *adapter_vk)
+{
+    VkPhysicalDevice physical_device = adapter_vk->physical_device;
+    struct wined3d_vk_info *vk_info = &adapter_vk->vk_info;
+    unsigned int count, enable_count, i, j;
+    const char **enabled_extensions = NULL;
+    VkExtensionProperties *extensions;
+    bool found, success = false;
+    SIZE_T enable_size = 0;
+    VkResult vr;
+
+    static const struct
+    {
+        const char *name;
+        unsigned int core_since_version;
+    }
+    info[] =
+    {
+        {VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME,    ~0u},
+        {VK_KHR_MAINTENANCE1_EXTENSION_NAME,                VK_API_VERSION_1_1},
+        {VK_KHR_SHADER_DRAW_PARAMETERS_EXTENSION_NAME,      VK_API_VERSION_1_1},
+        {VK_KHR_SWAPCHAIN_EXTENSION_NAME,                   ~0u},
+    };
+
+    if ((vr = VK_CALL(vkEnumerateDeviceExtensionProperties(physical_device, NULL, &count, NULL))) < 0)
+    {
+        ERR("Failed to enumerate device extensions, vr %s.\n", wined3d_debug_vkresult(vr));
+        return false;
+    }
+
+    if (!(extensions = heap_calloc(count, sizeof(*extensions))))
+    {
+        ERR("Failed to allocate extension properties array.\n");
+        return false;
+    }
+
+    if ((vr = VK_CALL(vkEnumerateDeviceExtensionProperties(physical_device, NULL, &count, extensions))) < 0)
+    {
+        ERR("Failed to enumerate device extensions, vr %s.\n", wined3d_debug_vkresult(vr));
+        goto done;
+    }
+
+    for (i = 0, enable_count = 0; i < ARRAY_SIZE(info); ++i)
+    {
+        if (info[i].core_since_version <= vk_info->api_version)
+            continue;
+
+        for (j = 0, found = false; j < count; ++j)
+        {
+            if (!strcmp(extensions[j].extensionName, info[i].name))
+            {
+                found = true;
+                break;
+            }
+        }
+
+        if (!found)
+        {
+            WARN("Required extension '%s' is not available.\n", info[i].name);
+            goto done;
+        }
+
+        TRACE("Enabling device extension '%s'.\n", info[i].name);
+        if (!wined3d_array_reserve((void **)&enabled_extensions, &enable_size,
+                enable_count + 1, sizeof(*enabled_extensions)))
+        {
+            ERR("Failed to allocate enabled extensions array.\n");
+            goto done;
+        }
+        enabled_extensions[enable_count++] = info[i].name;
+    }
+    success = true;
+
+done:
+    if (success)
+    {
+        adapter_vk->device_extension_count = enable_count;
+        adapter_vk->device_extensions = enabled_extensions;
+    }
+    else
+    {
+        heap_free(enabled_extensions);
+    }
+    heap_free(extensions);
+    return success;
+}
+
 static BOOL wined3d_adapter_vk_init(struct wined3d_adapter_vk *adapter_vk,
         unsigned int ordinal, unsigned int wined3d_creation_flags)
 {
@@ -2167,6 +2180,9 @@ static BOOL wined3d_adapter_vk_init(struct wined3d_adapter_vk *adapter_vk,
     if (!(adapter_vk->physical_device = get_vulkan_physical_device(vk_info)))
         goto fail_vulkan;
 
+    if (!wined3d_adapter_vk_init_device_extensions(adapter_vk))
+        goto fail_vulkan;
+
     memset(&id_properties, 0, sizeof(id_properties));
     id_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES;
     properties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
@@ -2184,7 +2200,10 @@ static BOOL wined3d_adapter_vk_init(struct wined3d_adapter_vk *adapter_vk,
         luid = (LUID *)id_properties.deviceLUID;
 
     if (!wined3d_adapter_init(adapter, ordinal, luid, &wined3d_adapter_vk_ops))
+    {
+        heap_free(adapter_vk->device_extensions);
         goto fail_vulkan;
+    }
 
     adapter->vertex_pipe = wined3d_spirv_vertex_pipe_init_vk();
     adapter->fragment_pipe = wined3d_spirv_fragment_pipe_init_vk();
@@ -2210,6 +2229,7 @@ static BOOL wined3d_adapter_vk_init(struct wined3d_adapter_vk *adapter_vk,
 
 fail:
     wined3d_adapter_cleanup(adapter);
+    heap_free(adapter_vk->device_extensions);
 fail_vulkan:
     VK_CALL(vkDestroyInstance(vk_info->instance, NULL));
     wined3d_unload_vulkan(vk_info);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 1c783d28bc..a4ab61b186 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -3347,6 +3347,8 @@ struct wined3d_adapter_vk
     struct wined3d_adapter a;
 
     struct wined3d_vk_info vk_info;
+    unsigned int device_extension_count;
+    const char **device_extensions;
     VkPhysicalDevice physical_device;
 
     VkPhysicalDeviceLimits device_limits;




More information about the wine-cvs mailing list