From: Giovanni Mascellani gmascellani@codeweavers.com
--- libs/vkd3d/device.c | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-)
diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index b9a8943c..39047c92 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -1690,16 +1690,21 @@ static HRESULT vkd3d_init_device_caps(struct d3d12_device *device, static HRESULT vkd3d_select_physical_device(struct vkd3d_instance *instance, unsigned int device_index, VkPhysicalDevice *selected_device) { - VkPhysicalDevice dgpu_device = VK_NULL_HANDLE, igpu_device = VK_NULL_HANDLE; + VkPhysicalDevice dgpu_device = VK_NULL_HANDLE, igpu_device = VK_NULL_HANDLE, first_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; + unsigned int i, index = 0; + const char *filter; uint32_t count; - unsigned int i; VkResult vr;
+ filter = getenv("VKD3D_VULKAN_DEVICE_FILTER"); + if (!filter) + filter = ""; + count = 0; if ((vr = VK_CALL(vkEnumeratePhysicalDevices(vk_instance, &count, NULL))) < 0) { @@ -1727,25 +1732,47 @@ static HRESULT vkd3d_select_physical_device(struct vkd3d_instance *instance,
for (i = 0; i < count; ++i) { + bool filtered; + VK_CALL(vkGetPhysicalDeviceProperties(physical_devices[i], &device_properties)); + + filtered = !strstr(device_properties.deviceName, filter); + if (filtered) + TRACE("Ignored because of filter:\n"); + else + TRACE("Index %u:\n", index); vkd3d_trace_physical_device_properties(&device_properties);
- if (i == device_index) + if (filtered) + continue; + + if (index == 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]; + + if (!first_device) + first_device = physical_devices[i]; + + ++index; }
if (!device) device = dgpu_device ? dgpu_device : igpu_device; if (!device) - device = physical_devices[0]; + device = first_device;
vkd3d_free(physical_devices);
+ if (!device) + { + ERR("No physical device accepted by filter.\n"); + return E_FAIL; + } + VK_CALL(vkGetPhysicalDeviceProperties(device, &device_properties)); TRACE("Using device: %s, %#x:%#x.\n", device_properties.deviceName, device_properties.vendorID, device_properties.deviceID);