[PATCH vkd3d 04/11] vkd3d: Add VKD3D_VULKAN_DEVICE debug environment variable.

Józef Kucia joseph.kucia at gmail.com
Thu Mar 14 05:34:56 CDT 2019


From: Józef Kucia <jkucia at codeweavers.com>

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 include/private/vkd3d_debug.h |  2 ++
 libs/vkd3d-common/debug.c     | 20 +++++++++++++++++++-
 libs/vkd3d/device.c           | 26 +++++++++++++++++++-------
 3 files changed, 40 insertions(+), 8 deletions(-)

diff --git a/include/private/vkd3d_debug.h b/include/private/vkd3d_debug.h
index 8b4c77db291d..42e5903d96d9 100644
--- a/include/private/vkd3d_debug.h
+++ b/include/private/vkd3d_debug.h
@@ -70,4 +70,6 @@ static inline const char *debugstr_guid(const GUID *guid)
             guid->Data4[5], guid->Data4[6], guid->Data4[7]);
 }
 
+unsigned int vkd3d_env_var_as_uint(const char *name, unsigned int default_value) DECLSPEC_HIDDEN;
+
 #endif  /* __VKD3D_DEBUG_H */
diff --git a/libs/vkd3d-common/debug.c b/libs/vkd3d-common/debug.c
index ee23ab0f49a8..9d10c28662da 100644
--- a/libs/vkd3d-common/debug.c
+++ b/libs/vkd3d-common/debug.c
@@ -20,10 +20,11 @@
 
 #include <assert.h>
 #include <ctype.h>
+#include <errno.h>
+#include <inttypes.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <inttypes.h>
 
 #define VKD3D_DEBUG_BUFFER_COUNT 64
 #define VKD3D_DEBUG_BUFFER_SIZE 512
@@ -297,3 +298,20 @@ const char *debugstr_w(const WCHAR *wstr, size_t wchar_size)
         return debugstr_w16((const uint16_t *)wstr);
     return debugstr_w32((const uint32_t *)wstr);
 }
+
+unsigned int vkd3d_env_var_as_uint(const char *name, unsigned int default_value)
+{
+    const char *value = getenv(name);
+    unsigned long r;
+    char *end_ptr;
+
+    if (value)
+    {
+        errno = 0;
+        r = strtoul(value, &end_ptr, 0);
+        if (!errno && end_ptr != value)
+            return r;
+    }
+
+    return default_value;
+}
diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c
index 204489c2993a..f809a00b03ff 100644
--- a/libs/vkd3d/device.c
+++ b/libs/vkd3d/device.c
@@ -1061,12 +1061,13 @@ static HRESULT vkd3d_init_device_caps(struct d3d12_device *device,
 }
 
 static HRESULT vkd3d_select_physical_device(struct vkd3d_instance *instance,
-        VkPhysicalDevice *selected_device)
+        unsigned int device_index, VkPhysicalDevice *selected_device)
 {
     VkPhysicalDevice dgpu_device = VK_NULL_HANDLE, igpu_device = VK_NULL_HANDLE;
     const struct vkd3d_vk_instance_procs *vk_procs = &instance->vk_procs;
     VkInstance vk_instance = instance->vk_instance;
     VkPhysicalDeviceProperties device_properties;
+    VkPhysicalDevice device = VK_NULL_HANDLE;
     VkPhysicalDevice *physical_devices;
     uint32_t count;
     unsigned int i;
@@ -1094,27 +1095,36 @@ static HRESULT vkd3d_select_physical_device(struct vkd3d_instance *instance,
         return hresult_from_vk_result(vr);
     }
 
+    if (device_index != ~0u && device_index >= count)
+        WARN("Device index %u is out of range.\n", device_index);
+
     for (i = 0; i < count; ++i)
     {
         VK_CALL(vkGetPhysicalDeviceProperties(physical_devices[i], &device_properties));
         vkd3d_trace_physical_device(physical_devices[i], &device_properties, vk_procs);
 
+        if (i == device_index)
+            device = physical_devices[i];
+
         if (device_properties.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU && !dgpu_device)
             dgpu_device = physical_devices[i];
         else if (device_properties.deviceType == VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU && !igpu_device)
             igpu_device = physical_devices[i];
     }
 
-    *selected_device = dgpu_device ? dgpu_device : igpu_device;
-    if (!*selected_device)
-        *selected_device = physical_devices[0];
+    if (!device)
+        device = dgpu_device ? dgpu_device : igpu_device;
+    if (!device)
+        device = physical_devices[0];
 
     vkd3d_free(physical_devices);
 
-    VK_CALL(vkGetPhysicalDeviceProperties(*selected_device, &device_properties));
+    VK_CALL(vkGetPhysicalDeviceProperties(device, &device_properties));
     TRACE("Using device: %s, %#x:%#x.\n", device_properties.deviceName,
             device_properties.vendorID, device_properties.deviceID);
 
+    *selected_device = device;
+
     return S_OK;
 }
 
@@ -1285,6 +1295,7 @@ static HRESULT vkd3d_create_vk_device(struct d3d12_device *device,
     VkPhysicalDeviceFeatures2 features2;
     VkPhysicalDevice physical_device;
     VkDeviceCreateInfo device_info;
+    unsigned int device_index;
     uint32_t extension_count;
     const char **extensions;
     VkDevice vk_device;
@@ -1294,8 +1305,9 @@ static HRESULT vkd3d_create_vk_device(struct d3d12_device *device,
     TRACE("device %p, create_info %p.\n", device, create_info);
 
     physical_device = create_info->vk_physical_device;
-    if (!physical_device
-            && FAILED(hr = vkd3d_select_physical_device(device->vkd3d_instance, &physical_device)))
+    device_index = vkd3d_env_var_as_uint("VKD3D_VULKAN_DEVICE", ~0u);
+    if ((!physical_device || device_index != ~0u)
+            && FAILED(hr = vkd3d_select_physical_device(device->vkd3d_instance, device_index, &physical_device)))
         return hr;
 
     device->vk_physical_device = physical_device;
-- 
2.19.2




More information about the wine-devel mailing list