=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: libs/vkd3d: Allow library user to select Vulkan physical device.

Alexandre Julliard julliard at winehq.org
Tue Jan 16 13:18:59 CST 2018


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

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Tue Jan 16 14:02:27 2018 +0100

libs/vkd3d: Allow library user to select Vulkan physical device.

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>

---

 include/vkd3d.h                     |  2 ++
 libs/vkd3d-utils/vkd3d_utils_main.c |  1 +
 libs/vkd3d/device.c                 | 21 +++++++++++----------
 libs/vkd3d/vkd3d_main.c             |  2 +-
 libs/vkd3d/vkd3d_private.h          |  3 ++-
 5 files changed, 17 insertions(+), 12 deletions(-)

diff --git a/include/vkd3d.h b/include/vkd3d.h
index a70bd2d..78d5e2e 100644
--- a/include/vkd3d.h
+++ b/include/vkd3d.h
@@ -57,6 +57,8 @@ struct vkd3d_device_create_info
 
     struct vkd3d_instance *instance;
     const struct vkd3d_instance_create_info *instance_create_info;
+
+    VkPhysicalDevice vk_physical_device;
 };
 
 /* resource flags */
diff --git a/libs/vkd3d-utils/vkd3d_utils_main.c b/libs/vkd3d-utils/vkd3d_utils_main.c
index 38283bf..9fe61a1 100644
--- a/libs/vkd3d-utils/vkd3d_utils_main.c
+++ b/libs/vkd3d-utils/vkd3d_utils_main.c
@@ -45,6 +45,7 @@ HRESULT WINAPI D3D12CreateDevice(IUnknown *adapter,
     device_create_info.minimum_feature_level = minimum_feature_level;
     device_create_info.instance = NULL;
     device_create_info.instance_create_info = &instance_create_info;
+    device_create_info.vk_physical_device = VK_NULL_HANDLE;
 
     return vkd3d_create_device(&device_create_info, riid, device);
 }
diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c
index 1e40e5d..5cf2ecf 100644
--- a/libs/vkd3d/device.c
+++ b/libs/vkd3d/device.c
@@ -740,16 +740,15 @@ static HRESULT d3d12_device_create_vkd3d_queues(struct d3d12_device *device,
     return S_OK;
 }
 
-static HRESULT vkd3d_create_vk_device(struct d3d12_device *device)
+static HRESULT vkd3d_create_vk_device(struct d3d12_device *device, VkPhysicalDevice physical_device)
 {
-    unsigned int direct_queue_family_index, copy_queue_family_index, compute_queue_family_index;
     uint32_t direct_queue_timestamp_bits, copy_queue_timestamp_bits, compute_queue_timestamp_bits;
+    unsigned int direct_queue_family_index, copy_queue_family_index, compute_queue_family_index;
     const struct vkd3d_vk_instance_procs *vk_procs = &device->vkd3d_instance->vk_procs;
     const char *extensions[MAX_DEVICE_EXTENSION_COUNT];
     VkQueueFamilyProperties *queue_properties;
     VkPhysicalDeviceFeatures device_features;
     VkDeviceQueueCreateInfo *queue_info;
-    VkPhysicalDevice physical_device;
     VkDeviceCreateInfo device_info;
     uint32_t queue_family_count;
     VkDevice vk_device;
@@ -757,10 +756,10 @@ static HRESULT vkd3d_create_vk_device(struct d3d12_device *device)
     VkResult vr;
     HRESULT hr;
 
-    TRACE("device %p.\n", device);
+    TRACE("device %p, physical_device %p.\n", device, physical_device);
 
-    physical_device = VK_NULL_HANDLE;
-    if (FAILED(hr = vkd3d_select_physical_device(device->vkd3d_instance, &physical_device)))
+    if (!physical_device
+            && FAILED(hr = vkd3d_select_physical_device(device->vkd3d_instance, &physical_device)))
         return hr;
 
     /* Create command queues */
@@ -1976,7 +1975,8 @@ struct d3d12_device *unsafe_impl_from_ID3D12Device(ID3D12Device *iface)
     return impl_from_ID3D12Device(iface);
 }
 
-static HRESULT d3d12_device_init(struct d3d12_device *device, struct vkd3d_instance *instance)
+static HRESULT d3d12_device_init(struct d3d12_device *device,
+        struct vkd3d_instance *instance, VkPhysicalDevice vk_physical_device)
 {
     HRESULT hr;
 
@@ -1990,7 +1990,7 @@ static HRESULT d3d12_device_init(struct d3d12_device *device, struct vkd3d_insta
     device->join_thread = instance->join_thread;
     device->wchar_size = instance->wchar_size;
 
-    if (FAILED(hr = vkd3d_create_vk_device(device)))
+    if (FAILED(hr = vkd3d_create_vk_device(device, vk_physical_device)))
     {
         vkd3d_instance_decref(device->vkd3d_instance);
         return hr;
@@ -2021,7 +2021,8 @@ static HRESULT d3d12_device_init(struct d3d12_device *device, struct vkd3d_insta
     return S_OK;
 }
 
-HRESULT d3d12_device_create(struct vkd3d_instance *instance, struct d3d12_device **device)
+HRESULT d3d12_device_create(struct vkd3d_instance *instance,
+        VkPhysicalDevice vk_physical_device, struct d3d12_device **device)
 {
     struct d3d12_device *object;
     HRESULT hr;
@@ -2029,7 +2030,7 @@ HRESULT d3d12_device_create(struct vkd3d_instance *instance, struct d3d12_device
     if (!(object = vkd3d_malloc(sizeof(*object))))
         return E_OUTOFMEMORY;
 
-    if (FAILED(hr = d3d12_device_init(object, instance)))
+    if (FAILED(hr = d3d12_device_init(object, instance, vk_physical_device)))
     {
         vkd3d_free(object);
         return hr;
diff --git a/libs/vkd3d/vkd3d_main.c b/libs/vkd3d/vkd3d_main.c
index 005e6bf..d3b0bf4 100644
--- a/libs/vkd3d/vkd3d_main.c
+++ b/libs/vkd3d/vkd3d_main.c
@@ -64,7 +64,7 @@ HRESULT vkd3d_create_device(const struct vkd3d_device_create_info *create_info,
         return E_FAIL;
     }
 
-    hr = d3d12_device_create(instance, &object);
+    hr = d3d12_device_create(instance, create_info->vk_physical_device, &object);
     vkd3d_instance_decref(instance);
     if (FAILED(hr))
         return hr;
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index de5ed8e..eca6895 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -658,7 +658,8 @@ struct d3d12_device
     vkd3d_join_thread_pfn join_thread;
 };
 
-HRESULT d3d12_device_create(struct vkd3d_instance *instance, struct d3d12_device **device) DECLSPEC_HIDDEN;
+HRESULT d3d12_device_create(struct vkd3d_instance *instance,
+        VkPhysicalDevice vk_physical_device, struct d3d12_device **device) DECLSPEC_HIDDEN;
 struct d3d12_device *unsafe_impl_from_ID3D12Device(ID3D12Device *iface) DECLSPEC_HIDDEN;
 
 HRESULT vkd3d_create_buffer(struct d3d12_device *device,




More information about the wine-cvs mailing list