=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: wined3d: Use vkGetDeviceProcAddr() to load Vulkan device functions.

Alexandre Julliard julliard at winehq.org
Fri Apr 19 17:30:46 CDT 2019


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

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Fri Apr 19 12:50:13 2019 +0200

wined3d: Use vkGetDeviceProcAddr() to load Vulkan device functions.

In order to bypass Vulkan loader trampoline.

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 | 17 +++++++++++++++--
 dlls/wined3d/wined3d_vk.h |  2 +-
 2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c
index 813a027..e573c66 100644
--- a/dlls/wined3d/adapter_vk.c
+++ b/dlls/wined3d/adapter_vk.c
@@ -30,6 +30,8 @@ struct wined3d_device_vk
 
     VkDevice vk_device;
     VkQueue vk_queue;
+
+    struct wined3d_vk_info vk_info;
 };
 
 static inline struct wined3d_device_vk *wined3d_device_vk(struct wined3d_device *device)
@@ -220,6 +222,18 @@ static HRESULT adapter_vk_create_device(struct wined3d *wined3d, const struct wi
     device_vk->vk_device = vk_device;
     VK_CALL(vkGetDeviceQueue(vk_device, queue_family_index, 0, &device_vk->vk_queue));
 
+    device_vk->vk_info = *vk_info;
+#define LOAD_DEVICE_PFN(name) \
+    if (!(device_vk->vk_info.vk_ops.name = (void *)VK_CALL(vkGetDeviceProcAddr(vk_device, #name)))) \
+    { \
+        WARN("Could not get device proc addr for '" #name "'.\n"); \
+        hr = E_FAIL; \
+        goto fail; \
+    }
+#define VK_DEVICE_PFN LOAD_DEVICE_PFN
+    VK_DEVICE_FUNCS()
+#undef VK_DEVICE_PFN
+
     if (FAILED(hr = wined3d_device_init(&device_vk->d, wined3d, adapter->ordinal, device_type,
             focus_window, flags, surface_alignment, levels, level_count, device_parent)))
     {
@@ -237,9 +251,8 @@ fail:
 
 static void adapter_vk_destroy_device(struct wined3d_device *device)
 {
-    struct wined3d_adapter_vk *adapter_vk = wined3d_adapter_vk(device->adapter);
     struct wined3d_device_vk *device_vk = wined3d_device_vk(device);
-    const struct wined3d_vk_info *vk_info = &adapter_vk->vk_info;
+    const struct wined3d_vk_info *vk_info = &device_vk->vk_info;
 
     wined3d_device_cleanup(&device_vk->d);
     VK_CALL(vkDestroyDevice(device_vk->vk_device, NULL));
diff --git a/dlls/wined3d/wined3d_vk.h b/dlls/wined3d/wined3d_vk.h
index 10c706a..13e07ab 100644
--- a/dlls/wined3d/wined3d_vk.h
+++ b/dlls/wined3d/wined3d_vk.h
@@ -183,9 +183,9 @@ struct vulkan_ops
 
 struct wined3d_vk_info
 {
-    VkInstance instance;
     struct vulkan_ops vk_ops;
 
+    VkInstance instance;
     unsigned int api_version;
 
 #ifdef USE_WIN32_VULKAN




More information about the wine-cvs mailing list