=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d12: Add support for building with Win32 Vulkan.

Alexandre Julliard julliard at winehq.org
Thu Mar 21 17:21:19 CDT 2019


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

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Thu Mar 21 13:12:41 2019 +0100

d3d12: Add support for building with 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/d3d12/d3d12_main.c | 73 ++++++++++++++++++++++++++++++++-----------------
 1 file changed, 48 insertions(+), 25 deletions(-)

diff --git a/dlls/d3d12/d3d12_main.c b/dlls/d3d12/d3d12_main.c
index 2c6472a..8a199aa 100644
--- a/dlls/d3d12/d3d12_main.c
+++ b/dlls/d3d12/d3d12_main.c
@@ -24,7 +24,9 @@
 #define VK_NO_PROTOTYPES
 #define VKD3D_NO_VULKAN_H
 #define VKD3D_NO_WIN32_TYPES
+#ifndef USE_WIN32_VULKAN
 #define WINE_VK_HOST
+#endif
 
 #include "wine/debug.h"
 #include "wine/heap.h"
@@ -43,6 +45,34 @@
 WINE_DEFAULT_DEBUG_CHANNEL(d3d12);
 WINE_DECLARE_DEBUG_CHANNEL(winediag);
 
+#ifdef USE_WIN32_VULKAN
+
+/* FIXME: We should unload vulkan-1.dll. */
+static PFN_vkGetInstanceProcAddr load_vulkan(void)
+{
+    HMODULE vulkan = LoadLibraryA("vulkan-1.dll");
+    return (void *)GetProcAddress(vulkan, "vkGetInstanceProcAddr");
+}
+
+#else
+
+static PFN_vkGetInstanceProcAddr load_vulkan(void)
+{
+    const struct vulkan_funcs *vk_funcs;
+    HDC hdc;
+
+    hdc = GetDC(0);
+    vk_funcs = __wine_get_vulkan_driver(hdc, WINE_VULKAN_DRIVER_VERSION);
+    ReleaseDC(0, hdc);
+
+    if (vk_funcs)
+        return (PFN_vkGetInstanceProcAddr)vk_funcs->p_vkGetInstanceProcAddr;
+
+    return NULL;
+}
+
+#endif  /* USE_WIN32_VULKAN */
+
 HRESULT WINAPI D3D12GetDebugInterface(REFIID iid, void **debug)
 {
     TRACE("iid %s, debug %p.\n", debugstr_guid(iid), debug);
@@ -111,17 +141,6 @@ static HRESULT d3d12_join_thread(void *handle)
     return ret == WAIT_OBJECT_0 ? S_OK : E_FAIL;
 }
 
-static const struct vulkan_funcs *get_vk_funcs(void)
-{
-    const struct vulkan_funcs *vk_funcs;
-    HDC hdc;
-
-    hdc = GetDC(0);
-    vk_funcs = __wine_get_vulkan_driver(hdc, WINE_VULKAN_DRIVER_VERSION);
-    ReleaseDC(0, hdc);
-    return vk_funcs;
-}
-
 static HRESULT d3d12_get_adapter(IWineDXGIAdapter **wine_adapter, IUnknown *adapter)
 {
     IDXGIAdapter *dxgi_adapter = NULL;
@@ -157,20 +176,25 @@ done:
     return hr;
 }
 
-static BOOL check_vk_instance_extension(const struct vulkan_funcs *vk_funcs, const char *name)
+static BOOL check_vk_instance_extension(VkInstance vk_instance,
+        PFN_vkGetInstanceProcAddr pfn_vkGetInstanceProcAddr, const char *name)
 {
+    PFN_vkEnumerateInstanceExtensionProperties pfn_vkEnumerateInstanceExtensionProperties;
     VkExtensionProperties *properties;
     BOOL ret = FALSE;
     unsigned int i;
     uint32_t count;
 
-    if (vk_funcs->p_vkEnumerateInstanceExtensionProperties(NULL, &count, NULL) < 0)
+    pfn_vkEnumerateInstanceExtensionProperties
+            = (void *)pfn_vkGetInstanceProcAddr(vk_instance, "vkEnumerateInstanceExtensionProperties");
+
+    if (pfn_vkEnumerateInstanceExtensionProperties(NULL, &count, NULL) < 0)
         return FALSE;
 
     if (!(properties = heap_calloc(count, sizeof(*properties))))
         return FALSE;
 
-    if (vk_funcs->p_vkEnumerateInstanceExtensionProperties(NULL, &count, properties) >= 0)
+    if (pfn_vkEnumerateInstanceExtensionProperties(NULL, &count, properties) >= 0)
     {
         for (i = 0; i < count; ++i)
         {
@@ -187,7 +211,7 @@ static BOOL check_vk_instance_extension(const struct vulkan_funcs *vk_funcs, con
 }
 
 static VkPhysicalDevice d3d12_get_vk_physical_device(struct vkd3d_instance *instance,
-        const struct vulkan_funcs *vk_funcs, const struct wine_dxgi_adapter_info *adapter_info)
+        PFN_vkGetInstanceProcAddr pfn_vkGetInstanceProcAddr, const struct wine_dxgi_adapter_info *adapter_info)
 {
     PFN_vkGetPhysicalDeviceProperties2 pfn_vkGetPhysicalDeviceProperties2 = NULL;
     PFN_vkGetPhysicalDeviceProperties pfn_vkGetPhysicalDeviceProperties;
@@ -204,11 +228,11 @@ static VkPhysicalDevice d3d12_get_vk_physical_device(struct vkd3d_instance *inst
 
     vk_instance = vkd3d_instance_get_vk_instance(instance);
 
-    pfn_vkEnumeratePhysicalDevices = vk_funcs->p_vkGetInstanceProcAddr(vk_instance, "vkEnumeratePhysicalDevices");
+    pfn_vkEnumeratePhysicalDevices = (void *)pfn_vkGetInstanceProcAddr(vk_instance, "vkEnumeratePhysicalDevices");
 
-    pfn_vkGetPhysicalDeviceProperties = vk_funcs->p_vkGetInstanceProcAddr(vk_instance, "vkGetPhysicalDeviceProperties");
-    if (check_vk_instance_extension(vk_funcs, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME))
-        pfn_vkGetPhysicalDeviceProperties2 = vk_funcs->p_vkGetInstanceProcAddr(vk_instance, "vkGetPhysicalDeviceProperties2KHR");
+    pfn_vkGetPhysicalDeviceProperties = (void *)pfn_vkGetInstanceProcAddr(vk_instance, "vkGetPhysicalDeviceProperties");
+    if (check_vk_instance_extension(vk_instance, pfn_vkGetInstanceProcAddr, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME))
+        pfn_vkGetPhysicalDeviceProperties2 = (void *)pfn_vkGetInstanceProcAddr(vk_instance, "vkGetPhysicalDeviceProperties2KHR");
 
     if ((vr = pfn_vkEnumeratePhysicalDevices(vk_instance, &count, NULL)) < 0)
     {
@@ -279,9 +303,9 @@ HRESULT WINAPI D3D12CreateDevice(IUnknown *adapter, D3D_FEATURE_LEVEL minimum_fe
 {
     struct vkd3d_optional_instance_extensions_info optional_extensions_info;
     struct vkd3d_instance_create_info instance_create_info;
+    PFN_vkGetInstanceProcAddr pfn_vkGetInstanceProcAddr;
     struct vkd3d_device_create_info device_create_info;
     struct wine_dxgi_adapter_info adapter_info;
-    const struct vulkan_funcs *vk_funcs;
     struct vkd3d_instance *instance;
     IWineDXGIAdapter *wine_adapter;
     HRESULT hr;
@@ -303,9 +327,9 @@ HRESULT WINAPI D3D12CreateDevice(IUnknown *adapter, D3D_FEATURE_LEVEL minimum_fe
     TRACE("adapter %p, minimum_feature_level %#x, iid %s, device %p.\n",
             adapter, minimum_feature_level, debugstr_guid(iid), device);
 
-    if (!(vk_funcs = get_vk_funcs()))
+    if (!(pfn_vkGetInstanceProcAddr = load_vulkan()))
     {
-        ERR_(winediag)("Failed to load Wine Vulkan driver.\n");
+        ERR_(winediag)("Failed to load Vulkan library.\n");
         return E_FAIL;
     }
 
@@ -329,8 +353,7 @@ HRESULT WINAPI D3D12CreateDevice(IUnknown *adapter, D3D_FEATURE_LEVEL minimum_fe
     instance_create_info.pfn_create_thread = d3d12_create_thread;
     instance_create_info.pfn_join_thread = d3d12_join_thread;
     instance_create_info.wchar_size = sizeof(WCHAR);
-    instance_create_info.pfn_vkGetInstanceProcAddr
-            = (PFN_vkGetInstanceProcAddr)vk_funcs->p_vkGetInstanceProcAddr;
+    instance_create_info.pfn_vkGetInstanceProcAddr = pfn_vkGetInstanceProcAddr;
     instance_create_info.instance_extensions = instance_extensions;
     instance_create_info.instance_extension_count = ARRAY_SIZE(instance_extensions);
 
@@ -345,7 +368,7 @@ HRESULT WINAPI D3D12CreateDevice(IUnknown *adapter, D3D_FEATURE_LEVEL minimum_fe
     device_create_info.minimum_feature_level = minimum_feature_level;
     device_create_info.instance = instance;
     device_create_info.instance_create_info = NULL;
-    device_create_info.vk_physical_device = d3d12_get_vk_physical_device(instance, vk_funcs, &adapter_info);
+    device_create_info.vk_physical_device = d3d12_get_vk_physical_device(instance, pfn_vkGetInstanceProcAddr, &adapter_info);
     device_create_info.device_extensions = device_extensions;
     device_create_info.device_extension_count = ARRAY_SIZE(device_extensions);
     device_create_info.parent = (IUnknown *)wine_adapter;




More information about the wine-cvs mailing list