From d65be3d0c5698a1b0df7c39ec0eaa485a8bd35de Mon Sep 17 00:00:00 2001 From: Giovanni Mascellani Date: Thu, 5 Jun 2025 16:17:15 +0200 Subject: [PATCH] tests: Skip test_graphics_compute_queue_synchronization() on paravirtualized MoltenVK. This used to work when the macOS runner had a Sonoma host system. Now it has Sequoia, even if the guest is still Sonoma, and the test crashes with: [mvk-error] VK_TIMEOUT: MTLCommandBuffer "vkQueueSubmit MTLCommandBuffer on Queue 3-0" execution failed (code 2): Caused GPU Hang Error (00000003:kIOGPUCommandBufferCallbackErrorHang) vkd3d:56072:err:vkd3d_wait_for_gpu_timeline_semaphore Failed to wait for Vulkan timeline semaphore, vr -4. Upgrading MoltenVK or the guest to Sequoia doesn't seem to help. I haven't investigated the problem, but my experience is that the paravirtualized Metal driver has a number of problems. --- tests/d3d12.c | 7 +++++++ tests/d3d12_crosstest.h | 15 +++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/tests/d3d12.c b/tests/d3d12.c index f1484cf96..5df738d11 100644 --- a/tests/d3d12.c +++ b/tests/d3d12.c @@ -35116,6 +35116,13 @@ static void test_graphics_compute_queue_synchronization(void) device = context.device; queue = context.queue; + if (is_mvk_paravirtualized_device(device)) + { + skip("GPU hangs on paravirtualized MVK.\n"); + destroy_test_context(&context); + return; + } + root_parameters[0].ParameterType = D3D12_ROOT_PARAMETER_TYPE_UAV; root_parameters[0].Descriptor.ShaderRegister = 1; root_parameters[0].Descriptor.RegisterSpace = 0; diff --git a/tests/d3d12_crosstest.h b/tests/d3d12_crosstest.h index faf5e9d80..dfd0939b8 100644 --- a/tests/d3d12_crosstest.h +++ b/tests/d3d12_crosstest.h @@ -538,6 +538,11 @@ static inline bool is_mvk_device(ID3D12Device *device) return false; } +static inline bool is_mvk_paravirtualized_device(ID3D12Device *device) +{ + return false; +} + static inline bool is_mvk_device_lt(ID3D12Device *device, uint32_t major, uint32_t minor, uint32_t patch) { return false; @@ -872,6 +877,16 @@ static inline bool is_mvk_device(ID3D12Device *device) return properties.driverID == VK_DRIVER_ID_MOLTENVK; } +static inline bool is_mvk_paravirtualized_device(ID3D12Device *device) +{ + VkPhysicalDeviceDriverPropertiesKHR properties; + VkPhysicalDeviceProperties device_properties; + + get_driver_properties(device, &device_properties, &properties); + return properties.driverID == VK_DRIVER_ID_MOLTENVK + && strcmp(device_properties.deviceName, "Apple Paravirtual device") == 0; +} + /* MoltenVK uses a different pattern than standard Vulkan. */ #define MVK_MAKE_API_VERSION(major, minor, patch) \ ((((uint32_t)(major)) * 10000) + (((uint32_t)(minor)) * 100) + (uint32_t)(patch))