From f3a594a50cceb3e3e5562058fb31f592779cb3ff Mon Sep 17 00:00:00 2001 From: Chris Bieneman Date: Sun, 20 Jul 2025 10:46:08 -0500 Subject: [PATCH 1/8] Add support for querying extensions This adds extensions as a queryable capability through the device interface for Vulkan. This also gates adding extensions that we had previously been using based on their availabiltiy. As a last bit, this does include one small line added in the Changes to enable MoltenVK on Apple. When targeting Apple platforms the VK_KHR_PORTABILITY is always enabled. That extension is always required on Apple platforms so we can hard code that one. --- lib/API/VK/Device.cpp | 73 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 63 insertions(+), 10 deletions(-) diff --git a/lib/API/VK/Device.cpp b/lib/API/VK/Device.cpp index 9724a3c3..63827c2a 100644 --- a/lib/API/VK/Device.cpp +++ b/lib/API/VK/Device.cpp @@ -163,6 +163,8 @@ class VKDevice : public offloadtest::Device { Capabilities Caps; using LayerVector = std::vector; LayerVector Layers; + using ExtensionVector = std::vector; + ExtensionVector Extensions; struct BufferRef { VkBuffer Buffer; @@ -226,6 +228,20 @@ class VKDevice : public offloadtest::Device { return false; } + const ExtensionVector &getExtensions() { + if (Extensions.empty()) + queryExtensions(); + return Extensions; + } + + bool isExtensionSupported(llvm::StringRef QueryName) { + for (const auto &Ext : getExtensions()) { + if (Ext.extensionName == QueryName) + return true; + } + return false; + } + void printExtra(llvm::raw_ostream &OS) override { OS << " Layers:\n"; for (auto Layer : getLayers()) { @@ -236,6 +252,12 @@ class VKDevice : public offloadtest::Device { Sz = strnlen(Layer.description, VK_MAX_DESCRIPTION_SIZE); OS << " LayerDesc: " << llvm::StringRef(Layer.description, Sz) << "\n"; } + + OS << " Extensions:\n"; + for (const auto &Ext : getExtensions()) { + OS << " - ExtensionName: " << llvm::StringRef(Ext.extensionName) << "\n"; + OS << " SpecVersion: " << Ext.specVersion << "\n"; + } } const VkPhysicalDeviceProperties &getProps() const { return Props; } @@ -301,6 +323,19 @@ class VKDevice : public offloadtest::Device { vkEnumerateInstanceLayerProperties(&LayerCount, Layers.data()); } + void queryExtensions() { + assert(Extensions.empty() && "Should not be called twice!"); + uint32_t ExtCount; + vkEnumerateDeviceExtensionProperties(Device, nullptr, &ExtCount, nullptr); + + if (ExtCount == 0) + return; + + Extensions.insert(Extensions.begin(), ExtCount, VkExtensionProperties()); + vkEnumerateDeviceExtensionProperties(Device, nullptr, &ExtCount, + Extensions.data()); + } + public: llvm::Error createDevice(InvocationState &IS) { @@ -906,6 +941,19 @@ class VKContext { CreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; CreateInfo.pApplicationInfo = &AppInfo; + llvm::SmallVector Extensions; + llvm::SmallVector Layers; +#if __APPLE__ + // If we build Vulkan support for Apple platforms the VK_KHR_PORTABILITY + // extension is required, so we can just force this one on. If it fails, the + // whole device would fail anyways. + Extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); + CreateInfo.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; +#endif + + CreateInfo.ppEnabledExtensionNames = Extensions.data(); + CreateInfo.enabledExtensionCount = Extensions.size(); + VkResult Res = vkCreateInstance(&CreateInfo, NULL, &Instance); if (Res == VK_ERROR_INCOMPATIBLE_DRIVER) return llvm::createStringError(std::errc::no_such_device, @@ -927,21 +975,26 @@ class VKContext { { auto TmpDev = std::make_shared(PhysicalDevicesTmp[0]); AppInfo.apiVersion = TmpDev->getProps().apiVersion; - } - vkDestroyInstance(Instance, NULL); - Instance = VK_NULL_HANDLE; -// TODO: This is a bit hacky but matches what I did in DX. #ifndef NDEBUG - const char *ValidationLayer = "VK_LAYER_KHRONOS_validation"; - CreateInfo.ppEnabledLayerNames = &ValidationLayer; - CreateInfo.enabledLayerCount = 1; + const llvm::StringRef ValidationLayer = "VK_LAYER_KHRONOS_validation"; + if (TmpDev->isLayerSupported(ValidationLayer)) + Layers.push_back(ValidationLayer.data()); - const char *DebugUtilsExtensionName = "VK_EXT_debug_utils"; - CreateInfo.ppEnabledExtensionNames = &DebugUtilsExtensionName; - CreateInfo.enabledExtensionCount = 1; + const llvm::StringRef DebugUtilsExtensionName = "VK_EXT_debug_utils"; + if (TmpDev->isExtensionSupported(DebugUtilsExtensionName)) + Extensions.push_back(DebugUtilsExtensionName.data()); #endif + CreateInfo.ppEnabledLayerNames = Layers.data(); + CreateInfo.enabledLayerCount = Layers.size(); + CreateInfo.ppEnabledExtensionNames = Extensions.data(); + CreateInfo.enabledExtensionCount = Extensions.size(); + } + vkDestroyInstance(Instance, NULL); + Instance = VK_NULL_HANDLE; + // This second creation shouldn't ever fail, but it tries to create the + // highest supported device version. Res = vkCreateInstance(&CreateInfo, NULL, &Instance); if (Res == VK_ERROR_INCOMPATIBLE_DRIVER) return llvm::createStringError(std::errc::no_such_device, From ad36a55885a6d5034c7e65b9557ecfc7b820469f Mon Sep 17 00:00:00 2001 From: Chris Bieneman Date: Wed, 18 Jun 2025 09:12:58 -0500 Subject: [PATCH 2/8] [Vulkan] Add support for MoltenVK on macOS This gets Vulkan support working on macOS if the Vulkan SDK and MoltenVK are available. All current Vulkan tests except particle_life pass with Vulkan on macOS with DXC, and sign.32.test fails with Clang. --- CMakeLists.txt | 6 +++++- docs/MoltenVK.md | 16 ++++++++++++++++ lib/API/CMakeLists.txt | 3 ++- lib/API/VK/Device.cpp | 2 +- test/Feature/HLSLLib/sign.32.test | 7 +++++-- test/UseCase/particle-life.test | 3 +++ test/lit.cfg.py | 1 + test/lit.site.cfg.py.in | 1 + tools/api-query/CMakeLists.txt | 5 +++++ tools/offloader/CMakeLists.txt | 5 +++++ 10 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 docs/MoltenVK.md diff --git a/CMakeLists.txt b/CMakeLists.txt index 67ca3911..3e3b76d3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,7 +41,11 @@ macro(add_offloadtest_library name) set_target_properties(OffloadTest${name} PROPERTIES FOLDER "Offload Test/Libraries") endmacro() -find_package(Vulkan) +if (APPLE) + set(OPTIONAL_MOLTEN COMPONENTS MoltenVK) +endif() + +find_package(Vulkan ${OPTIONAL_MOLTEN}) message(STATUS "Vulkan Include Dirs: ${Vulkan_INCLUDE_DIRS}") if (Vulkan_INCLUDE_DIRS) set(OFFLOADTEST_ENABLE_VULKAN On) diff --git a/docs/MoltenVK.md b/docs/MoltenVK.md new file mode 100644 index 00000000..cd9854c6 --- /dev/null +++ b/docs/MoltenVK.md @@ -0,0 +1,16 @@ +# Enabling Vulkan on macOS with MoltenVK + +To enable Vulkan testing on macOS you first need to download and install the +Vulkan SDK from [here](https://vulkan.lunarg.com). + +By default the SDK installs into your home directory under +`~/VulkanSDK/${SDK_Version}/macOS`. For CMake to find the SDK you either need to +set the `VULKAN_SDK` environment variable to the macOS subdirectory of the +VulkanSDK installation you wish to use. You also need to run `sudo +~/VulkanSDK/${SDK_Version}/install_vulkan.py --force-install`, to install the +development binaries into `/usr/local/...` so that launched applications can +find them. + +Once the SDK is installed and exposed to CMake, a clean configuration will +detect Vulkan and the MoltenVK portability layer and enable the Vulkan test +configurations. diff --git a/lib/API/CMakeLists.txt b/lib/API/CMakeLists.txt index ec3d24fe..47b146e4 100644 --- a/lib/API/CMakeLists.txt +++ b/lib/API/CMakeLists.txt @@ -24,7 +24,8 @@ if (APPLE) "-framework MetalKit" "-framework AppKit" "-framework Foundation" - "-framework QuartzCore") + "-framework QuartzCore" + ${api_frameworks}) list(APPEND api_headers PRIVATE ${METAL_INCLUDE_DIRS}) endif() diff --git a/lib/API/VK/Device.cpp b/lib/API/VK/Device.cpp index 63827c2a..9cb11d0a 100644 --- a/lib/API/VK/Device.cpp +++ b/lib/API/VK/Device.cpp @@ -957,7 +957,7 @@ class VKContext { VkResult Res = vkCreateInstance(&CreateInfo, NULL, &Instance); if (Res == VK_ERROR_INCOMPATIBLE_DRIVER) return llvm::createStringError(std::errc::no_such_device, - "Cannot find a compatible Vulkan device"); + "Cannot find a base Vulkan device"); if (Res) return llvm::createStringError(std::errc::no_such_device, "Unknown Vulkan initialization error: %d", diff --git a/test/Feature/HLSLLib/sign.32.test b/test/Feature/HLSLLib/sign.32.test index 88cef099..a7a7ef5e 100644 --- a/test/Feature/HLSLLib/sign.32.test +++ b/test/Feature/HLSLLib/sign.32.test @@ -74,7 +74,7 @@ Buffers: - Name: Out2 Format: Int32 Stride: 16 - ZeroInitSize: 48 + ZeroInitSize: 48 - Name: ExpectedOut2 # The result we expect Format: Int32 Stride: 16 @@ -82,7 +82,7 @@ Buffers: - Name: Out3 Format: Int32 Stride: 16 - ZeroInitSize: 48 + ZeroInitSize: 48 - Name: ExpectedOut3 # The result we expect Format: Int32 Stride: 16 @@ -176,6 +176,9 @@ DescriptorSets: # https://github.com/microsoft/DirectXShaderCompiler/issues/7512 # XFAIL: DXC-Vulkan +# No idea what is going on here, but Out1 and Out3 are coming through as 0's. +# XFAIL: Clang && Vulkan-Darwin + # RUN: split-file %s %t # RUN: %dxc_target -T cs_6_5 -Fo %t.o %t/source.hlsl # RUN: %offloader %t/pipeline.yaml %t.o diff --git a/test/UseCase/particle-life.test b/test/UseCase/particle-life.test index 63722339..1c8d4d29 100644 --- a/test/UseCase/particle-life.test +++ b/test/UseCase/particle-life.test @@ -357,6 +357,9 @@ DescriptorSets: # https://github.com/llvm/offload-test-suite/issues/55 # UNSUPPORTED: Metal +# No idea what is going on here, but the results are _way_ off. +# XFAIL: Vulkan-Darwin + # RUN: split-file %s %t # RUN: %if !Vulkan %{ %dxc_target -T cs_6_0 -Fo %t.o %t/particle-life.hlsl %} # RUN: %if Vulkan %{ %dxc_target -T cs_6_0 -fspv-target-env=vulkan1.3 -fvk-use-scalar-layout -Fo %t.o %t/particle-life.hlsl %} diff --git a/test/lit.cfg.py b/test/lit.cfg.py index 9cd3a943..23968fe3 100644 --- a/test/lit.cfg.py +++ b/test/lit.cfg.py @@ -51,6 +51,7 @@ def setDeviceFeatures(config, device, compiler): API = device["API"] config.available_features.add(API) + config.available_features.add("%s-%s" % (API, config.offloadtest_os)) if "Microsoft Basic Render Driver" in device["Description"]: config.available_features.add("%s-WARP" % API) if "Intel" in device["Description"]: diff --git a/test/lit.site.cfg.py.in b/test/lit.site.cfg.py.in index b670e195..83d0a62b 100644 --- a/test/lit.site.cfg.py.in +++ b/test/lit.site.cfg.py.in @@ -16,6 +16,7 @@ config.offloadtest_suite = "@suite@" config.offloadtest_enable_d3d12 = @TEST_d3d12@ config.offloadtest_enable_vulkan = @TEST_vk@ config.offloadtest_enable_metal = @TEST_mtl@ +config.offloadtest_os = "@CMAKE_SYSTEM_NAME@" import lit.llvm lit.llvm.initialize(lit_config, config) diff --git a/tools/api-query/CMakeLists.txt b/tools/api-query/CMakeLists.txt index 6b060293..65f544c4 100644 --- a/tools/api-query/CMakeLists.txt +++ b/tools/api-query/CMakeLists.txt @@ -2,3 +2,8 @@ add_offloadtest_tool(api-query api-query.cpp) target_link_libraries(api-query PRIVATE LLVMSupport OffloadTestAPI) + +if (APPLE AND OFFLOADTEST_ENABLE_VULKAN) + set_property(TARGET api-query APPEND_STRING PROPERTY + LINK_FLAGS " -Wl,-rpath,/usr/local/lib ") +endif() diff --git a/tools/offloader/CMakeLists.txt b/tools/offloader/CMakeLists.txt index d19487d7..a3b2556a 100644 --- a/tools/offloader/CMakeLists.txt +++ b/tools/offloader/CMakeLists.txt @@ -6,3 +6,8 @@ target_link_libraries(offloader PRIVATE OffloadTestAPI OffloadTestImage OffloadTestSupport) + +if (APPLE AND OFFLOADTEST_ENABLE_VULKAN) + set_property(TARGET offloader APPEND_STRING PROPERTY + LINK_FLAGS " -Wl,-rpath,/usr/local/lib ") +endif() From 37886707ad69d1d5690d24f9981c19d05695b674 Mon Sep 17 00:00:00 2001 From: Chris B Date: Wed, 18 Jun 2025 11:07:38 -0500 Subject: [PATCH 3/8] Removing unnecessary changes from earlier iterations These changes are not actually needed, I just didn't have the linkage and paths correct. --- CMakeLists.txt | 6 +----- lib/API/CMakeLists.txt | 3 +-- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3e3b76d3..67ca3911 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,11 +41,7 @@ macro(add_offloadtest_library name) set_target_properties(OffloadTest${name} PROPERTIES FOLDER "Offload Test/Libraries") endmacro() -if (APPLE) - set(OPTIONAL_MOLTEN COMPONENTS MoltenVK) -endif() - -find_package(Vulkan ${OPTIONAL_MOLTEN}) +find_package(Vulkan) message(STATUS "Vulkan Include Dirs: ${Vulkan_INCLUDE_DIRS}") if (Vulkan_INCLUDE_DIRS) set(OFFLOADTEST_ENABLE_VULKAN On) diff --git a/lib/API/CMakeLists.txt b/lib/API/CMakeLists.txt index 47b146e4..ec3d24fe 100644 --- a/lib/API/CMakeLists.txt +++ b/lib/API/CMakeLists.txt @@ -24,8 +24,7 @@ if (APPLE) "-framework MetalKit" "-framework AppKit" "-framework Foundation" - "-framework QuartzCore" - ${api_frameworks}) + "-framework QuartzCore") list(APPEND api_headers PRIVATE ${METAL_INCLUDE_DIRS}) endif() From c4d49d2e94f99774ba529a493e48db52cc54b2aa Mon Sep 17 00:00:00 2001 From: Chris Bieneman Date: Mon, 23 Jun 2025 13:16:31 -0500 Subject: [PATCH 4/8] Try using the library path to define the rpath This seems to be working, although it's not great that the library is in a weird SDK path... --- tools/api-query/CMakeLists.txt | 3 ++- tools/offloader/CMakeLists.txt | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/api-query/CMakeLists.txt b/tools/api-query/CMakeLists.txt index 65f544c4..9e55fb2f 100644 --- a/tools/api-query/CMakeLists.txt +++ b/tools/api-query/CMakeLists.txt @@ -4,6 +4,7 @@ add_offloadtest_tool(api-query target_link_libraries(api-query PRIVATE LLVMSupport OffloadTestAPI) if (APPLE AND OFFLOADTEST_ENABLE_VULKAN) + get_filename_component(_Vulkan_LIB_DIR ${Vulkan_LIBRARY} DIRECTORY) set_property(TARGET api-query APPEND_STRING PROPERTY - LINK_FLAGS " -Wl,-rpath,/usr/local/lib ") + LINK_FLAGS " -Wl,-rpath,${_Vulkan_LIB_DIR} ") endif() diff --git a/tools/offloader/CMakeLists.txt b/tools/offloader/CMakeLists.txt index a3b2556a..d4c6120b 100644 --- a/tools/offloader/CMakeLists.txt +++ b/tools/offloader/CMakeLists.txt @@ -8,6 +8,7 @@ target_link_libraries(offloader PRIVATE OffloadTestSupport) if (APPLE AND OFFLOADTEST_ENABLE_VULKAN) + get_filename_component(_Vulkan_LIB_DIR ${Vulkan_LIBRARY} DIRECTORY) set_property(TARGET offloader APPEND_STRING PROPERTY - LINK_FLAGS " -Wl,-rpath,/usr/local/lib ") + LINK_FLAGS " -Wl,-rpath,${_Vulkan_LIB_DIR} ") endif() From 475d484bd1052a3bdc820d1a087ee5145f718ff0 Mon Sep 17 00:00:00 2001 From: Chris Bieneman Date: Sun, 20 Jul 2025 11:35:17 -0500 Subject: [PATCH 5/8] Add XFAIL with link to MoltenVK bug --- test/Feature/HLSLLib/cosh.16.test | 3 +++ test/Feature/HLSLLib/sinh.16.test | 3 +++ test/Feature/HLSLLib/tanh.16.test | 3 +++ 3 files changed, 9 insertions(+) diff --git a/test/Feature/HLSLLib/cosh.16.test b/test/Feature/HLSLLib/cosh.16.test index ea4bb502..a540a17c 100644 --- a/test/Feature/HLSLLib/cosh.16.test +++ b/test/Feature/HLSLLib/cosh.16.test @@ -61,6 +61,9 @@ DescriptorSets: ... #--- end +# https://github.com/KhronosGroup/MoltenVK/issues/2580 +# XFAIL: Vulkan-Darwin + # REQUIRES: Half # RUN: split-file %s %t # RUN: %dxc_target -enable-16bit-types -T cs_6_5 -Fo %t.o %t/source.hlsl diff --git a/test/Feature/HLSLLib/sinh.16.test b/test/Feature/HLSLLib/sinh.16.test index 6a9de395..89633483 100644 --- a/test/Feature/HLSLLib/sinh.16.test +++ b/test/Feature/HLSLLib/sinh.16.test @@ -61,6 +61,9 @@ DescriptorSets: ... #--- end +# https://github.com/KhronosGroup/MoltenVK/issues/2580 +# XFAIL: Vulkan-Darwin + # REQUIRES: Half # RUN: split-file %s %t # RUN: %dxc_target -enable-16bit-types -T cs_6_5 -Fo %t.o %t/source.hlsl diff --git a/test/Feature/HLSLLib/tanh.16.test b/test/Feature/HLSLLib/tanh.16.test index 6e4fc9e5..15038f2f 100644 --- a/test/Feature/HLSLLib/tanh.16.test +++ b/test/Feature/HLSLLib/tanh.16.test @@ -61,6 +61,9 @@ DescriptorSets: ... #--- end +# https://github.com/KhronosGroup/MoltenVK/issues/2580 +# XFAIL: Vulkan-Darwin + # REQUIRES: Half # RUN: split-file %s %t # RUN: %dxc_target -enable-16bit-types -T cs_6_5 -Fo %t.o %t/source.hlsl From 407677ed422564ef89c55524431a9094d194d92e Mon Sep 17 00:00:00 2001 From: Chris Bieneman Date: Sun, 20 Jul 2025 11:47:58 -0500 Subject: [PATCH 6/8] Add issue detail on sign.32 test --- test/Feature/HLSLLib/sign.32.test | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/Feature/HLSLLib/sign.32.test b/test/Feature/HLSLLib/sign.32.test index a7a7ef5e..295f5a93 100644 --- a/test/Feature/HLSLLib/sign.32.test +++ b/test/Feature/HLSLLib/sign.32.test @@ -176,7 +176,9 @@ DescriptorSets: # https://github.com/microsoft/DirectXShaderCompiler/issues/7512 # XFAIL: DXC-Vulkan -# No idea what is going on here, but Out1 and Out3 are coming through as 0's. +# https://github.com/llvm/llvm-project/issues/149722 +# We're generating invalid SPIRV for this. I have _no_ idea why this isn't +# failing on all Clang Vulkan tests. # XFAIL: Clang && Vulkan-Darwin # RUN: split-file %s %t From 27522b1cbb08127df60e9f447ed424b550ca479d Mon Sep 17 00:00:00 2001 From: Chris Bieneman Date: Sun, 20 Jul 2025 11:54:10 -0500 Subject: [PATCH 7/8] Add a note about tests being unreliable on MoltenVK --- docs/MoltenVK.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/MoltenVK.md b/docs/MoltenVK.md index cd9854c6..3c8d8bee 100644 --- a/docs/MoltenVK.md +++ b/docs/MoltenVK.md @@ -1,5 +1,9 @@ # Enabling Vulkan on macOS with MoltenVK +> Note: MoltenVK uses SPIRV-Cross to convert SPIRV shaders to the Metal shading +> language. This increases the mismatch between shader behavior, and as a result +> many of the tests in this suite have known failures or behavior differences. + To enable Vulkan testing on macOS you first need to download and install the Vulkan SDK from [here](https://vulkan.lunarg.com). From af531a75e5f8fd7c4eda89fe337147169c32ee1c Mon Sep 17 00:00:00 2001 From: Chris Bieneman Date: Mon, 21 Jul 2025 08:52:48 -0500 Subject: [PATCH 8/8] correct issue URL --- test/Feature/HLSLLib/cosh.16.test | 2 +- test/Feature/HLSLLib/sinh.16.test | 2 +- test/Feature/HLSLLib/tanh.16.test | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/Feature/HLSLLib/cosh.16.test b/test/Feature/HLSLLib/cosh.16.test index a540a17c..6e59be7c 100644 --- a/test/Feature/HLSLLib/cosh.16.test +++ b/test/Feature/HLSLLib/cosh.16.test @@ -61,7 +61,7 @@ DescriptorSets: ... #--- end -# https://github.com/KhronosGroup/MoltenVK/issues/2580 +# https://github.com/KhronosGroup/SPIRV-Cross/issues/2507 # XFAIL: Vulkan-Darwin # REQUIRES: Half diff --git a/test/Feature/HLSLLib/sinh.16.test b/test/Feature/HLSLLib/sinh.16.test index 89633483..8d6f7ee1 100644 --- a/test/Feature/HLSLLib/sinh.16.test +++ b/test/Feature/HLSLLib/sinh.16.test @@ -61,7 +61,7 @@ DescriptorSets: ... #--- end -# https://github.com/KhronosGroup/MoltenVK/issues/2580 +# https://github.com/KhronosGroup/SPIRV-Cross/issues/2507 # XFAIL: Vulkan-Darwin # REQUIRES: Half diff --git a/test/Feature/HLSLLib/tanh.16.test b/test/Feature/HLSLLib/tanh.16.test index 15038f2f..26efebf7 100644 --- a/test/Feature/HLSLLib/tanh.16.test +++ b/test/Feature/HLSLLib/tanh.16.test @@ -61,7 +61,7 @@ DescriptorSets: ... #--- end -# https://github.com/KhronosGroup/MoltenVK/issues/2580 +# https://github.com/KhronosGroup/SPIRV-Cross/issues/2507 # XFAIL: Vulkan-Darwin # REQUIRES: Half