https://github.com/s-perron created https://github.com/llvm/llvm-project/pull/121961
In DXC, setting the vulkan version automatically sets the target spir-v version to the maximum spir-v version that the vulkan version must support. So for Vulkan 1.2, we set the spir-v version to spirv 1.5 because every implementation of Vulkan 1.2 must support spirv 1.5, but not spir-v 1.6. >From 3651bfc84db36b90799bad4bf8344be99aa51879 Mon Sep 17 00:00:00 2001 From: Steven Perron <stevenper...@google.com> Date: Mon, 6 Jan 2025 15:22:03 -0500 Subject: [PATCH] [HLSL] Explicitly set the SPIR-V version with spv-target-env In DXC, setting the vulkan version automatically sets the target spir-v version to the maximum spir-v version that the vulkan version must support. So for Vulkan 1.2, we set the spir-v version to spirv 1.5 because every implementation of Vulkan 1.2 must support spirv 1.5, but not spir-v 1.6. --- clang/lib/Driver/Driver.cpp | 11 ++++++++--- clang/test/Driver/dxc_spirv.hlsl | 4 ++-- llvm/lib/TargetParser/Triple.cpp | 20 ++++++++++++++++++++ 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 36d6c93c43321f..a31fb3fc08a42f 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1468,9 +1468,14 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) { // Set specific Vulkan version if applicable. if (const Arg *A = Args.getLastArg(options::OPT_fspv_target_env_EQ)) { - const llvm::StringSet<> ValidValues = {"vulkan1.2", "vulkan1.3"}; - if (ValidValues.contains(A->getValue())) { - T.setOSName(A->getValue()); + const llvm::StringMap<llvm::Triple::SubArchType> ValidTargets = { + {"vulkan1.2", llvm::Triple::SPIRVSubArch_v15}, + {"vulkan1.3", llvm::Triple::SPIRVSubArch_v16}}; + + auto TargetInfo = ValidTargets.find(A->getValue()); + if (TargetInfo != ValidTargets.end()) { + T.setOSName(TargetInfo->getKey()); + T.setArch(llvm::Triple::spirv, TargetInfo->getValue()); } else { Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << A->getValue(); diff --git a/clang/test/Driver/dxc_spirv.hlsl b/clang/test/Driver/dxc_spirv.hlsl index c087ea4b0d709f..e6624e5f1b3f6f 100644 --- a/clang/test/Driver/dxc_spirv.hlsl +++ b/clang/test/Driver/dxc_spirv.hlsl @@ -6,8 +6,8 @@ // CHECK: "-triple" "spirv-unknown-vulkan-compute" // CHECK-SAME: "-x" "hlsl" -// CHECK-VULKAN12: "-triple" "spirv-unknown-vulkan1.2-compute" +// CHECK-VULKAN12: "-triple" "spirv1.5-unknown-vulkan1.2-compute" -// CHECK-VULKAN13: "-triple" "spirv-unknown-vulkan1.3-compute" +// CHECK-VULKAN13: "-triple" "spirv1.6-unknown-vulkan1.3-compute" // CHECK-ERROR: error: invalid value 'vulkan1.0' in '-fspv-target-env=vulkan1.0' diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp index 7e040688dc1a7b..4c1de09e91f21c 100644 --- a/llvm/lib/TargetParser/Triple.cpp +++ b/llvm/lib/TargetParser/Triple.cpp @@ -113,6 +113,26 @@ StringRef Triple::getArchName(ArchType Kind, SubArchType SubArch) { if (SubArch == AArch64SubArch_arm64e) return "arm64e"; break; + case Triple::spirv: + switch (SubArch) { + case Triple::SPIRVSubArch_v10: + return "spirv1.0"; + case Triple::SPIRVSubArch_v11: + return "spirv1.1"; + case Triple::SPIRVSubArch_v12: + return "spirv1.2"; + case Triple::SPIRVSubArch_v13: + return "spirv1.3"; + case Triple::SPIRVSubArch_v14: + return "spirv1.4"; + case Triple::SPIRVSubArch_v15: + return "spirv1.5"; + case Triple::SPIRVSubArch_v16: + return "spirv1.6"; + default: + break; + } + break; case Triple::dxil: switch (SubArch) { case Triple::NoSubArch: _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits