From: Giovanni Mascellani gmascellani@codeweavers.com
--- tests/d3d12.c | 18 ++++++++++++++++ tests/d3d12_crosstest.h | 48 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+)
diff --git a/tests/d3d12.c b/tests/d3d12.c index 34c37b604..550ec5936 100644 --- a/tests/d3d12.c +++ b/tests/d3d12.c @@ -19588,6 +19588,15 @@ static void test_null_srv(void) queue = context.queue; device = context.device;
+ if (is_llvmpipe_device_gte(device, 23, 2, 1)) + { + /* llvmpipe crashes with mutable descriptors are used. I don't + * know yet whether this is a bug in vkd3d or Mesa. */ + skip("Test crashes on llvmpipe, skipping.\n"); + destroy_test_context(&context); + return; + } + context.root_signature = create_texture_root_signature(context.device, D3D12_SHADER_VISIBILITY_PIXEL, 4, 0);
@@ -19803,6 +19812,15 @@ static void test_null_uav(void) command_list = context.list; queue = context.queue;
+ if (is_llvmpipe_device_gte(device, 23, 2, 1)) + { + /* llvmpipe crashes with mutable descriptors are used. I don't + * know yet whether this is a bug in vkd3d or Mesa. */ + skip("Test crashes on llvmpipe, skipping.\n"); + destroy_test_context(&context); + return; + } + descriptor_ranges[0].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_UAV; descriptor_ranges[0].NumDescriptors = 1; descriptor_ranges[0].BaseShaderRegister = 1; diff --git a/tests/d3d12_crosstest.h b/tests/d3d12_crosstest.h index e24016459..ea515d09a 100644 --- a/tests/d3d12_crosstest.h +++ b/tests/d3d12_crosstest.h @@ -406,6 +406,12 @@ static inline bool is_llvmpipe_device(ID3D12Device *device) return false; }
+static inline bool is_llvmpipe_device_gte(ID3D12Device *device, + uint32_t major, uint32_t minor, uint32_t patch) +{ + return false; +} + static inline bool is_nvidia_device(ID3D12Device *device) { return false; @@ -564,6 +570,20 @@ static ID3D12Device *create_device(void) return SUCCEEDED(hr) ? device : NULL; }
+static void get_physical_device_properties( + ID3D12Device *device, VkPhysicalDeviceProperties *device_properties) +{ + PFN_vkGetPhysicalDeviceProperties pfn_vkGetPhysicalDeviceProperties; + VkPhysicalDevice vk_physical_device; + VkInstance vk_instance; + + vk_instance = vkd3d_instance_get_vk_instance(vkd3d_instance_from_device(device)); + pfn_vkGetPhysicalDeviceProperties = (void *)vkGetInstanceProcAddr(vk_instance, + "vkGetPhysicalDeviceProperties"); + vk_physical_device = vkd3d_get_vk_physical_device(device); + pfn_vkGetPhysicalDeviceProperties(vk_physical_device, device_properties); +} + static bool get_driver_properties(ID3D12Device *device, VkPhysicalDeviceDriverPropertiesKHR *driver_properties) { PFN_vkGetPhysicalDeviceProperties2KHR pfn_vkGetPhysicalDeviceProperties2KHR; @@ -662,6 +682,34 @@ static inline bool is_llvmpipe_device(ID3D12Device *device) return properties.driverID == VK_DRIVER_ID_MESA_LLVMPIPE; }
+static inline bool is_llvmpipe_device_gte(ID3D12Device *device, + uint32_t major, uint32_t minor, uint32_t patch) +{ + VkPhysicalDeviceDriverPropertiesKHR driver_properties; + VkPhysicalDeviceProperties device_properties; + + get_driver_properties(device, &driver_properties); + get_physical_device_properties(device, &device_properties); + if (driver_properties.driverID != VK_DRIVER_ID_MESA_LLVMPIPE) + return false; + + if (device_properties.driverVersion == 1) + { + uint32_t driver_major, driver_minor, driver_patch; + + /* llvmpipe doesn't provide a valid driverVersion value, so we resort to parsing the + * driverInfo string. */ + if (sscanf(driver_properties.driverInfo, "Mesa %u.%u.%u", + &driver_major, &driver_minor, &driver_patch) == 3) + { + device_properties.driverVersion = VK_MAKE_API_VERSION(0, + driver_major, driver_minor, driver_patch); + } + } + + return device_properties.driverVersion >= VK_MAKE_API_VERSION(0, major, minor, patch); +} + static inline bool is_nvidia_device(ID3D12Device *device) { VkPhysicalDeviceDriverPropertiesKHR properties;