=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: wined3d: Add support for USE_WIN32_VULKAN.

Alexandre Julliard julliard at winehq.org
Wed Apr 3 15:26:20 CDT 2019


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

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Wed Apr  3 11:11:33 2019 +0200

wined3d: Add support for USE_WIN32_VULKAN.

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wined3d/adapter_vk.c | 87 ++++++++++++++++++++++++++++++++++++-----------
 dlls/wined3d/wined3d_vk.h |  6 ++++
 2 files changed, 74 insertions(+), 19 deletions(-)

diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c
index 337c6f7..cea6e69 100644
--- a/dlls/wined3d/adapter_vk.c
+++ b/dlls/wined3d/adapter_vk.c
@@ -24,12 +24,63 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(d3d);
 
+#ifdef USE_WIN32_VULKAN
+static BOOL wined3d_load_vulkan(struct wined3d_vk_info *vk_info)
+{
+    struct vulkan_ops *vk_ops = &vk_info->vk_ops;
+
+    if (!(vk_info->vulkan_lib = LoadLibraryA("vulkan-1.dll")))
+    {
+        WARN("Failed to load vulkan-1.dll.\n");
+        return FALSE;
+    }
+
+    vk_ops->vkGetInstanceProcAddr = (void *)GetProcAddress(vk_info->vulkan_lib, "vkGetInstanceProcAddr");
+    if (!vk_ops->vkGetInstanceProcAddr)
+    {
+        FreeLibrary(vk_info->vulkan_lib);
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
+static void wined3d_unload_vulkan(struct wined3d_vk_info *vk_info)
+{
+    if (vk_info->vulkan_lib)
+    {
+        FreeLibrary(vk_info->vulkan_lib);
+        vk_info->vulkan_lib = NULL;
+    }
+}
+#else
+static BOOL wined3d_load_vulkan(struct wined3d_vk_info *vk_info)
+{
+    struct vulkan_ops *vk_ops = &vk_info->vk_ops;
+    const struct vulkan_funcs *vk_funcs;
+    HDC dc;
+
+    dc = GetDC(0);
+    vk_funcs = __wine_get_vulkan_driver(dc, WINE_VULKAN_DRIVER_VERSION);
+    ReleaseDC(0, dc);
+
+    if (!vk_funcs)
+        return FALSE;
+
+    vk_ops->vkGetInstanceProcAddr = (void *)vk_funcs->p_vkGetInstanceProcAddr;
+    return TRUE;
+}
+
+static void wined3d_unload_vulkan(struct wined3d_vk_info *vk_info) {}
+#endif
+
 static void adapter_vk_destroy(struct wined3d_adapter *adapter)
 {
     struct wined3d_adapter_vk *adapter_vk = wined3d_adapter_vk(adapter);
-    const struct wined3d_vk_info *vk_info = &adapter_vk->vk_info;
+    struct wined3d_vk_info *vk_info = &adapter_vk->vk_info;
 
     VK_CALL(vkDestroyInstance(vk_info->instance, NULL));
+    wined3d_unload_vulkan(vk_info);
     wined3d_adapter_cleanup(&adapter_vk->a);
     heap_free(adapter_vk);
 }
@@ -62,25 +113,17 @@ static const struct wined3d_adapter_ops wined3d_adapter_vk_ops =
 static BOOL wined3d_init_vulkan(struct wined3d_vk_info *vk_info)
 {
     struct vulkan_ops *vk_ops = &vk_info->vk_ops;
-    const struct vulkan_funcs *vk_funcs;
+    VkInstance instance = VK_NULL_HANDLE;
     VkInstanceCreateInfo instance_info;
-    VkInstance instance;
     VkResult vr;
-    HDC dc;
-
-    dc = GetDC(0);
-    vk_funcs = __wine_get_vulkan_driver(dc, WINE_VULKAN_DRIVER_VERSION);
-    ReleaseDC(0, dc);
 
-    if (!vk_funcs)
+    if (!wined3d_load_vulkan(vk_info))
         return FALSE;
 
-    vk_ops->vkGetInstanceProcAddr = (void *)vk_funcs->p_vkGetInstanceProcAddr;
-
     if (!(vk_ops->vkCreateInstance = (void *)VK_CALL(vkGetInstanceProcAddr(NULL, "vkCreateInstance"))))
     {
         ERR("Could not get 'vkCreateInstance'.\n");
-        return FALSE;
+        goto fail;
     }
 
     memset(&instance_info, 0, sizeof(instance_info));
@@ -88,7 +131,7 @@ static BOOL wined3d_init_vulkan(struct wined3d_vk_info *vk_info)
     if ((vr = VK_CALL(vkCreateInstance(&instance_info, NULL, &instance))) < 0)
     {
         WARN("Failed to create Vulkan instance, vr %d.\n", vr);
-        return FALSE;
+        goto fail;
     }
 
     TRACE("Created Vulkan instance %p.\n", instance);
@@ -97,8 +140,7 @@ static BOOL wined3d_init_vulkan(struct wined3d_vk_info *vk_info)
     if (!(vk_ops->name = (void *)VK_CALL(vkGetInstanceProcAddr(instance, #name)))) \
     { \
         WARN("Could not get instance proc addr for '" #name "'.\n"); \
-        vk_funcs->p_vkDestroyInstance(instance, NULL); \
-        return FALSE; \
+        goto fail; \
     }
 #define VK_INSTANCE_PFN     LOAD_INSTANCE_PFN
 #define VK_DEVICE_PFN       LOAD_INSTANCE_PFN
@@ -110,6 +152,12 @@ static BOOL wined3d_init_vulkan(struct wined3d_vk_info *vk_info)
     vk_info->instance = instance;
 
     return TRUE;
+
+fail:
+    if (vk_ops->vkDestroyInstance)
+        VK_CALL(vkDestroyInstance(instance, NULL));
+    wined3d_unload_vulkan(vk_info);
+    return FALSE;
 }
 
 static BOOL wined3d_adapter_vk_init(struct wined3d_adapter_vk *adapter_vk,
@@ -134,12 +182,12 @@ static BOOL wined3d_adapter_vk_init(struct wined3d_adapter_vk *adapter_vk,
     if (!(gpu_description = wined3d_get_gpu_description(HW_VENDOR_AMD, CARD_AMD_RADEON_RX_VEGA)))
     {
         ERR("Failed to get GPU description.\n");
-        goto fail;
+        goto fail_vulkan;
     }
     wined3d_driver_info_init(&adapter->driver_info, gpu_description, wined3d_settings.emulated_textureram);
 
     if (!wined3d_adapter_vk_init_format_info(adapter))
-        goto fail;
+        goto fail_vulkan;
 
     adapter->vertex_pipe = &none_vertex_pipe;
     adapter->fragment_pipe = &none_fragment_pipe;
@@ -150,9 +198,10 @@ static BOOL wined3d_adapter_vk_init(struct wined3d_adapter_vk *adapter_vk,
 
     return TRUE;
 
+fail_vulkan:
+    VK_CALL(vkDestroyInstance(vk_info->instance, NULL));
+    wined3d_unload_vulkan(vk_info);
 fail:
-    if (vk_info->vk_ops.vkDestroyInstance)
-        VK_CALL(vkDestroyInstance(vk_info->instance, NULL));
     wined3d_adapter_cleanup(adapter);
     return FALSE;
 }
diff --git a/dlls/wined3d/wined3d_vk.h b/dlls/wined3d/wined3d_vk.h
index ac59a2d..784dd0c 100644
--- a/dlls/wined3d/wined3d_vk.h
+++ b/dlls/wined3d/wined3d_vk.h
@@ -20,7 +20,9 @@
 #define __WINE_WINED3D_VK_H
 
 #define VK_NO_PROTOTYPES
+#ifndef USE_WIN32_VULKAN
 #define WINE_VK_HOST
+#endif
 #include "wine/vulkan.h"
 
 #define VK_INSTANCE_FUNCS() \
@@ -179,6 +181,10 @@ struct wined3d_vk_info
 {
     VkInstance instance;
     struct vulkan_ops vk_ops;
+
+#ifdef USE_WIN32_VULKAN
+    HMODULE vulkan_lib;
+#endif
 };
 
 #define VK_CALL(f) (vk_info->vk_ops.f)




More information about the wine-cvs mailing list