diff --git a/README.md b/README.md index 3ca5b911..98271983 100644 --- a/README.md +++ b/README.md @@ -155,6 +155,7 @@ commas or semicolons. - `VKD3D_LOG_FILE` - If set, redirects `VKD3D_DEBUG` logging output to a file instead. - `VKD3D_VULKAN_DEVICE` - a zero-based device index. Use to force the selected Vulkan device. + - `VKD3D_FILTER_DEVICE_NAME` - skips devices that don't include this substring. - `VKD3D_DISABLE_EXTENSIONS` - a list of Vulkan extensions that vkd3d-proton should not use even if available. - `VKD3D_TEST_DEBUG` - enables additional debug messages in tests. Set to 0, 1 diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index 181359a6..952dd2c6 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -1597,10 +1597,13 @@ static HRESULT vkd3d_select_physical_device(struct vkd3d_instance *instance, VkPhysicalDeviceProperties device_properties; VkPhysicalDevice device = VK_NULL_HANDLE; VkPhysicalDevice *physical_devices; + const char *filter; uint32_t count; unsigned int i; VkResult vr; + filter = getenv("VKD3D_FILTER_DEVICE_NAME"); + count = 0; if ((vr = VK_CALL(vkEnumeratePhysicalDevices(vk_instance, &count, NULL))) < 0) { @@ -1640,6 +1643,12 @@ static HRESULT vkd3d_select_physical_device(struct vkd3d_instance *instance, if (i == device_index) device = physical_devices[i]; + if (filter && !strstr(device_properties.deviceName, filter)) + { + INFO("Device %s doesn't match filter %s, skipping.\n", device_properties.deviceName, filter); + continue; + } + 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)