-
Notifications
You must be signed in to change notification settings - Fork 15.4k
[HLSL] Explicitly set the SPIR-V version with spv-target-env #121961
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
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.
|
@llvm/pr-subscribers-clang-driver Author: Steven Perron (s-perron) ChangesIn DXC, setting the vulkan version automatically sets the target spir-v Full diff: https://github.com/llvm/llvm-project/pull/121961.diff 3 Files Affected:
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:
|
|
@llvm/pr-subscribers-clang Author: Steven Perron (s-perron) ChangesIn DXC, setting the vulkan version automatically sets the target spir-v Full diff: https://github.com/llvm/llvm-project/pull/121961.diff 3 Files Affected:
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:
|
|
Failure is unrelated to my change. |
|
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/73/builds/11439 Here is the relevant piece of the build log for the reference |
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.