[clang] c21f48e - [HLSL][SPIR-V] Add Vulkan to target triple (#76749)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Jan 18 09:52:05 PST 2024
Author: Natalie Chouinard
Date: 2024-01-18T12:52:00-05:00
New Revision: c21f48e5ad1799db41cc9f16541b8365e3b75e63
URL: https://github.com/llvm/llvm-project/commit/c21f48e5ad1799db41cc9f16541b8365e3b75e63
DIFF: https://github.com/llvm/llvm-project/commit/c21f48e5ad1799db41cc9f16541b8365e3b75e63.diff
LOG: [HLSL][SPIR-V] Add Vulkan to target triple (#76749)
Add support for specifying the logical SPIR-V target environment in the
triple as Vulkan. When compiling HLSL, this replaces the DirectX Shader
Model with a Vulkan environment instead.
Currently, the only supported combinations of SPIR-V version and Vulkan
environment are:
- Vulkan 1.2 and SPIR-V 1.5
- Vulkan 1.3 and SPIR-V 1.6
Fixes #70051
Added:
Modified:
clang/include/clang/Basic/DiagnosticDriverKinds.td
clang/lib/Basic/Targets/SPIR.h
clang/lib/Frontend/CompilerInvocation.cpp
clang/test/Driver/hlsl-lang-targets-spirv.hlsl
clang/test/Driver/hlsl-lang-targets.hlsl
llvm/include/llvm/TargetParser/Triple.h
llvm/lib/TargetParser/Triple.cpp
llvm/unittests/TargetParser/TripleTest.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index 8b5232a6df3958..0fe8798dfb301b 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -735,10 +735,10 @@ def err_drv_dxc_missing_target_profile : Error<
def err_drv_hlsl_unsupported_target : Error<
"HLSL code generation is unsupported for target '%0'">;
def err_drv_hlsl_bad_shader_required_in_target : Error<
- "shader %select{model|stage}0 is required in target '%1' for HLSL code generation">;
+ "%select{shader model|Vulkan environment|shader stage}0 is required as %select{OS|environment}1 in target '%2' for HLSL code generation">;
def err_drv_hlsl_bad_shader_unsupported : Error<
- "shader %select{model|stage}0 '%1' in target '%2' is invalid for HLSL code generation">;
+ "%select{shader model|Vulkan environment|shader stage}0 '%1' in target '%2' is invalid for HLSL code generation">;
def warn_drv_dxc_missing_dxv : Warning<"dxv not found. "
"Resulting DXIL will not be validated or signed for use in release environments.">,
InGroup<DXILValidation>;
diff --git a/clang/lib/Basic/Targets/SPIR.h b/clang/lib/Basic/Targets/SPIR.h
index 9ab2b7c6093639..fa4a3bb1c82eed 100644
--- a/clang/lib/Basic/Targets/SPIR.h
+++ b/clang/lib/Basic/Targets/SPIR.h
@@ -17,6 +17,7 @@
#include "clang/Basic/TargetInfo.h"
#include "clang/Basic/TargetOptions.h"
#include "llvm/Support/Compiler.h"
+#include "llvm/Support/VersionTuple.h"
#include "llvm/TargetParser/Triple.h"
#include <optional>
@@ -301,8 +302,9 @@ class LLVM_LIBRARY_VISIBILITY SPIRVTargetInfo : public BaseSPIRVTargetInfo {
: BaseSPIRVTargetInfo(Triple, Opts) {
assert(Triple.getArch() == llvm::Triple::spirv &&
"Invalid architecture for Logical SPIR-V.");
- assert(Triple.getOS() == llvm::Triple::ShaderModel &&
- "Logical SPIR-V requires a valid ShaderModel.");
+ assert(Triple.getOS() == llvm::Triple::Vulkan &&
+ Triple.getVulkanVersion() != llvm::VersionTuple(0) &&
+ "Logical SPIR-V requires a valid Vulkan environment.");
assert(Triple.getEnvironment() >= llvm::Triple::Pixel &&
Triple.getEnvironment() <= llvm::Triple::Amplification &&
"Logical SPIR-V environment must be a valid shader stage.");
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp
index 11f3f2c2d6425c..b5e192d54465b1 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -4236,20 +4236,35 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args,
// TODO: Revisit restricting SPIR-V to logical once we've figured out how to
// handle PhysicalStorageBuffer64 memory model
if (T.isDXIL() || T.isSPIRVLogical()) {
- enum { ShaderModel, ShaderStage };
+ enum { ShaderModel, VulkanEnv, ShaderStage };
+ enum { OS, Environment };
+
+ int ExpectedOS = T.isSPIRVLogical() ? VulkanEnv : ShaderModel;
+
if (T.getOSName().empty()) {
Diags.Report(diag::err_drv_hlsl_bad_shader_required_in_target)
- << ShaderModel << T.str();
- } else if (!T.isShaderModelOS() || T.getOSVersion() == VersionTuple(0)) {
- Diags.Report(diag::err_drv_hlsl_bad_shader_unsupported)
- << ShaderModel << T.getOSName() << T.str();
+ << ExpectedOS << OS << T.str();
} else if (T.getEnvironmentName().empty()) {
Diags.Report(diag::err_drv_hlsl_bad_shader_required_in_target)
- << ShaderStage << T.str();
+ << ShaderStage << Environment << T.str();
} else if (!T.isShaderStageEnvironment()) {
Diags.Report(diag::err_drv_hlsl_bad_shader_unsupported)
<< ShaderStage << T.getEnvironmentName() << T.str();
}
+
+ if (T.isDXIL()) {
+ if (!T.isShaderModelOS() || T.getOSVersion() == VersionTuple(0)) {
+ Diags.Report(diag::err_drv_hlsl_bad_shader_unsupported)
+ << ShaderModel << T.getOSName() << T.str();
+ }
+ } else if (T.isSPIRVLogical()) {
+ if (!T.isVulkanOS() || T.getVulkanVersion() == VersionTuple(0)) {
+ Diags.Report(diag::err_drv_hlsl_bad_shader_unsupported)
+ << VulkanEnv << T.getOSName() << T.str();
+ }
+ } else {
+ llvm_unreachable("expected DXIL or SPIR-V target");
+ }
} else
Diags.Report(diag::err_drv_hlsl_unsupported_target) << T.str();
}
diff --git a/clang/test/Driver/hlsl-lang-targets-spirv.hlsl b/clang/test/Driver/hlsl-lang-targets-spirv.hlsl
index e04d71263770bb..b86c2e01f8d80e 100644
--- a/clang/test/Driver/hlsl-lang-targets-spirv.hlsl
+++ b/clang/test/Driver/hlsl-lang-targets-spirv.hlsl
@@ -3,29 +3,39 @@
// Supported targets
//
// RUN: %clang -target dxil-unknown-shadermodel6.2-compute %s -S -o /dev/null 2>&1 | FileCheck --allow-empty --check-prefix=CHECK-VALID %s
-// RUN: %clang -target spirv-unknown-shadermodel6.2-compute %s -S -o /dev/null 2>&1 | FileCheck --allow-empty --check-prefix=CHECK-VALID %s
+// RUN: %clang -target spirv-unknown-vulkan-compute %s -S -o /dev/null 2>&1 | FileCheck --allow-empty --check-prefix=CHECK-VALID %s
+// RUN: %clang -target spirv-unknown-vulkan1.2-compute %s -S -o /dev/null 2>&1 | FileCheck --allow-empty --check-prefix=CHECK-VALID %s
+// RUN: %clang -target spirv-unknown-vulkan1.3-compute %s -S -o /dev/null 2>&1 | FileCheck --allow-empty --check-prefix=CHECK-VALID %s
+// RUN: %clang -target spirv1.5-unknown-vulkan1.2-compute %s -S -o /dev/null 2>&1 | FileCheck --allow-empty --check-prefix=CHECK-VALID %s
+// RUN: %clang -target spirv1.6-unknown-vulkan1.3-compute %s -S -o /dev/null 2>&1 | FileCheck --allow-empty --check-prefix=CHECK-VALID %s
-// Empty shader model
+// Empty Vulkan environment
//
// RUN: not %clang -target spirv %s -S -o /dev/null 2>&1 | FileCheck --check-prefix=CHECK-NO-OS %s
-// Invalid shader models
+// Invalid Vulkan environment
//
-// RUN: not %clang -target spirv--unknown %s -S -o /dev/null 2>&1 | FileCheck --check-prefix=CHECK-BAD-OS %s
+// RUN: not %clang -target spirv--shadermodel %s -S -o /dev/null 2>&1 | FileCheck --check-prefix=CHECK-BAD-OS %s
+// RUN: not %clang -target spirv-unknown-vulkan1.0-compute %s -S -o /dev/null 2>&1 | FileCheck --check-prefix=CHECK-BAD-OS %s
+// RUN: not %clang -target spirv1.5-unknown-vulkan1.3-compute %s -S -o /dev/null 2>&1 | FileCheck --check-prefix=CHECK-BAD-OS %s
+
+// Invalid SPIR-V version
+// RUN: not %clang -target spirv1.0-unknown-vulkan-compute %s -S -o /dev/null 2>&1 | FileCheck --check-prefix=CHECK-BAD-TARGET %s
// Empty shader stage
//
-// RUN: not %clang -target spirv--shadermodel6.2 %s -S -o /dev/null 2>&1 | FileCheck --check-prefix=CHECK-NO-ENV %s
+// RUN: not %clang -target spirv--vulkan %s -S -o /dev/null 2>&1 | FileCheck --check-prefix=CHECK-NO-ENV %s
// Invalid shader stages
//
-// RUN: not %clang -target spirv--shadermodel6.2-unknown %s -S -o /dev/null 2>&1 | FileCheck --check-prefix=CHECK-BAD-ENV %s
+// RUN: not %clang -target spirv--vulkan-unknown %s -S -o /dev/null 2>&1 | FileCheck --check-prefix=CHECK-BAD-ENV %s
// CHECK-VALID-NOT: error:
-// CHECK-NO-OS: error: shader model is required in target '{{.*}}' for HLSL code generation
-// CHECK-BAD-OS: error: shader model '{{.*}}' in target '{{.*}}' is invalid for HLSL code generation
-// CHECK-NO-ENV: error: shader stage is required in target '{{.*}}' for HLSL code generation
+// CHECK-NO-OS: error: Vulkan environment is required as OS in target '{{.*}}' for HLSL code generation
+// CHECK-BAD-OS: error: Vulkan environment '{{.*}}' in target '{{.*}}' is invalid for HLSL code generation
+// CHECK-NO-ENV: error: shader stage is required as environment in target '{{.*}}' for HLSL code generation
// CHECK-BAD-ENV: error: shader stage '{{.*}}' in target '{{.*}}' is invalid for HLSL code generation
+// CHECK-BAD-TARGET: error: HLSL code generation is unsupported for target '{{.*}}'
[shader("compute"), numthreads(1,1,1)]
void main() {}
diff --git a/clang/test/Driver/hlsl-lang-targets.hlsl b/clang/test/Driver/hlsl-lang-targets.hlsl
index 816e84cdc6dcbf..f2f4bba8196bc9 100644
--- a/clang/test/Driver/hlsl-lang-targets.hlsl
+++ b/clang/test/Driver/hlsl-lang-targets.hlsl
@@ -1,4 +1,4 @@
-// REQUIRES: dxil-registered-target
+// REQUIRES: directx-registered-target
// Supported targets
//
@@ -43,9 +43,9 @@
// RUN: not %clang -target amdgcn %s -S -o /dev/null 2>&1 | FileCheck --check-prefix=CHECK-BAD-TARGET %s
// CHECK-VALID-NOT: error:
-// CHECK-NO-OS: error: shader model is required in target '{{.*}}' for HLSL code generation
+// CHECK-NO-OS: error: shader model is required as OS in target '{{.*}}' for HLSL code generation
// CHECK-BAD-OS: error: shader model '{{.*}}' in target '{{.*}}' is invalid for HLSL code generation
-// CHECK-NO-ENV: error: shader stage is required in target '{{.*}}' for HLSL code generation
+// CHECK-NO-ENV: error: shader stage is required as environment in target '{{.*}}' for HLSL code generation
// CHECK-BAD-ENV: error: shader stage '{{.*}}' in target '{{.*}}' is invalid for HLSL code generation
// CHECK-BAD-TARGET: error: HLSL code generation is unsupported for target '{{.*}}'
diff --git a/llvm/include/llvm/TargetParser/Triple.h b/llvm/include/llvm/TargetParser/Triple.h
index 052336c8a305c2..1f8c7a060e249d 100644
--- a/llvm/include/llvm/TargetParser/Triple.h
+++ b/llvm/include/llvm/TargetParser/Triple.h
@@ -164,6 +164,7 @@ class Triple {
SPIRVSubArch_v13,
SPIRVSubArch_v14,
SPIRVSubArch_v15,
+ SPIRVSubArch_v16,
};
enum VendorType {
UnknownVendor,
@@ -224,7 +225,8 @@ class Triple {
ShaderModel, // DirectX ShaderModel
LiteOS,
Serenity,
- LastOSType = Serenity
+ Vulkan, // Vulkan SPIR-V
+ LastOSType = Vulkan
};
enum EnvironmentType {
UnknownEnvironment,
@@ -410,6 +412,10 @@ class Triple {
/// Parse the version number as with getOSVersion.
VersionTuple getDriverKitVersion() const;
+ /// Parse the Vulkan version number from the OSVersion and SPIR-V version
+ /// (SubArch). This should only be called with Vulkan SPIR-V triples.
+ VersionTuple getVulkanVersion() const;
+
/// @}
/// @name Direct Component Access
/// @{
@@ -775,6 +781,8 @@ class Triple {
return getOS() == Triple::ShaderModel;
}
+ bool isVulkanOS() const { return getOS() == Triple::Vulkan; }
+
bool isShaderStageEnvironment() const {
EnvironmentType Env = getEnvironment();
return Env == Triple::Pixel || Env == Triple::Vertex ||
diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp
index 40079c1dcd3e7d..3212ba77de9bdb 100644
--- a/llvm/lib/TargetParser/Triple.cpp
+++ b/llvm/lib/TargetParser/Triple.cpp
@@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//
#include "llvm/TargetParser/Triple.h"
+#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringSwitch.h"
@@ -274,6 +275,7 @@ StringRef Triple::getOSTypeName(OSType Kind) {
case ShaderModel: return "shadermodel";
case LiteOS: return "liteos";
case XROS: return "xros";
+ case Vulkan: return "vulkan";
}
llvm_unreachable("Invalid OSType");
@@ -551,8 +553,7 @@ static Triple::ArchType parseArch(StringRef ArchName) {
.Case("hsail64", Triple::hsail64)
.Case("spir", Triple::spir)
.Case("spir64", Triple::spir64)
- .Cases("spirv", "spirv1.0", "spirv1.1", "spirv1.2",
- "spirv1.3", "spirv1.4", "spirv1.5", Triple::spirv)
+ .Cases("spirv", "spirv1.5", "spirv1.6", Triple::spirv)
.Cases("spirv32", "spirv32v1.0", "spirv32v1.1", "spirv32v1.2",
"spirv32v1.3", "spirv32v1.4", "spirv32v1.5", Triple::spirv32)
.Cases("spirv64", "spirv64v1.0", "spirv64v1.1", "spirv64v1.2",
@@ -646,6 +647,7 @@ static Triple::OSType parseOS(StringRef OSName) {
.StartsWith("shadermodel", Triple::ShaderModel)
.StartsWith("liteos", Triple::LiteOS)
.StartsWith("serenity", Triple::Serenity)
+ .StartsWith("vulkan", Triple::Vulkan)
.Default(Triple::UnknownOS);
}
@@ -730,6 +732,7 @@ static Triple::SubArchType parseSubArch(StringRef SubArchName) {
.EndsWith("v1.3", Triple::SPIRVSubArch_v13)
.EndsWith("v1.4", Triple::SPIRVSubArch_v14)
.EndsWith("v1.5", Triple::SPIRVSubArch_v15)
+ .EndsWith("v1.6", Triple::SPIRVSubArch_v16)
.Default(Triple::NoSubArch);
StringRef ARMSubArch = ARM::getCanonicalArchName(SubArchName);
@@ -1345,6 +1348,31 @@ VersionTuple Triple::getDriverKitVersion() const {
}
}
+VersionTuple Triple::getVulkanVersion() const {
+ if (getArch() != spirv || getOS() != Vulkan)
+ llvm_unreachable("invalid Vulkan SPIR-V triple");
+
+ VersionTuple VulkanVersion = getOSVersion();
+ SubArchType SpirvVersion = getSubArch();
+
+ llvm::DenseMap<VersionTuple, SubArchType> ValidVersionMap = {
+ // Vulkan 1.2 -> SPIR-V 1.5.
+ {VersionTuple(1, 2), SPIRVSubArch_v15},
+ // Vulkan 1.3 -> SPIR-V 1.6.
+ {VersionTuple(1, 3), SPIRVSubArch_v16}};
+
+ // If Vulkan version is unset, default to 1.2.
+ if (VulkanVersion == VersionTuple(0))
+ VulkanVersion = VersionTuple(1, 2);
+
+ if (ValidVersionMap.contains(VulkanVersion) &&
+ (ValidVersionMap.lookup(VulkanVersion) == SpirvVersion ||
+ SpirvVersion == NoSubArch))
+ return VulkanVersion;
+
+ return VersionTuple(0);
+}
+
void Triple::setTriple(const Twine &Str) {
*this = Triple(Str);
}
diff --git a/llvm/unittests/TargetParser/TripleTest.cpp b/llvm/unittests/TargetParser/TripleTest.cpp
index 6f9a35739bff65..4db54a08c0f639 100644
--- a/llvm/unittests/TargetParser/TripleTest.cpp
+++ b/llvm/unittests/TargetParser/TripleTest.cpp
@@ -325,130 +325,116 @@ TEST(TripleTest, ParsedIDs) {
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
EXPECT_EQ(Triple::UnknownOS, T.getOS());
- T = Triple("spirv-unknown-shadermodel-pixel");
+ T = Triple("spirv-unknown-vulkan-pixel");
EXPECT_EQ(Triple::spirv, T.getArch());
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
- EXPECT_EQ(Triple::ShaderModel, T.getOS());
+ EXPECT_EQ(Triple::Vulkan, T.getOS());
+ EXPECT_EQ(VersionTuple(1, 2), T.getVulkanVersion());
EXPECT_EQ(Triple::Pixel, T.getEnvironment());
- T = Triple("spirv-unknown-shadermodel-vertex");
+ T = Triple("spirv-unknown-vulkan-vertex");
EXPECT_EQ(Triple::spirv, T.getArch());
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
- EXPECT_EQ(Triple::ShaderModel, T.getOS());
+ EXPECT_EQ(Triple::Vulkan, T.getOS());
+ EXPECT_EQ(VersionTuple(1, 2), T.getVulkanVersion());
EXPECT_EQ(Triple::Vertex, T.getEnvironment());
- T = Triple("spirv-unknown-shadermodel-geometry");
+ T = Triple("spirv-unknown-vulkan-geometry");
EXPECT_EQ(Triple::spirv, T.getArch());
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
- EXPECT_EQ(Triple::ShaderModel, T.getOS());
+ EXPECT_EQ(Triple::Vulkan, T.getOS());
+ EXPECT_EQ(VersionTuple(1, 2), T.getVulkanVersion());
EXPECT_EQ(Triple::Geometry, T.getEnvironment());
- T = Triple("spirv-unknown-shadermodel-library");
+ T = Triple("spirv-unknown-vulkan-library");
EXPECT_EQ(Triple::spirv, T.getArch());
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
- EXPECT_EQ(Triple::ShaderModel, T.getOS());
+ EXPECT_EQ(Triple::Vulkan, T.getOS());
+ EXPECT_EQ(VersionTuple(1, 2), T.getVulkanVersion());
EXPECT_EQ(Triple::Library, T.getEnvironment());
- T = Triple("spirv-unknown-shadermodel-raygeneration");
+ T = Triple("spirv-unknown-vulkan-raygeneration");
EXPECT_EQ(Triple::spirv, T.getArch());
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
- EXPECT_EQ(Triple::ShaderModel, T.getOS());
+ EXPECT_EQ(Triple::Vulkan, T.getOS());
+ EXPECT_EQ(VersionTuple(1, 2), T.getVulkanVersion());
EXPECT_EQ(Triple::RayGeneration, T.getEnvironment());
- T = Triple("spirv-unknown-shadermodel-intersection");
+ T = Triple("spirv-unknown-vulkan-intersection");
EXPECT_EQ(Triple::spirv, T.getArch());
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
- EXPECT_EQ(Triple::ShaderModel, T.getOS());
+ EXPECT_EQ(Triple::Vulkan, T.getOS());
+ EXPECT_EQ(VersionTuple(1, 2), T.getVulkanVersion());
EXPECT_EQ(Triple::Intersection, T.getEnvironment());
- T = Triple("spirv-unknown-shadermodel-anyhit");
+ T = Triple("spirv-unknown-vulkan-anyhit");
EXPECT_EQ(Triple::spirv, T.getArch());
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
- EXPECT_EQ(Triple::ShaderModel, T.getOS());
+ EXPECT_EQ(Triple::Vulkan, T.getOS());
+ EXPECT_EQ(VersionTuple(1, 2), T.getVulkanVersion());
EXPECT_EQ(Triple::AnyHit, T.getEnvironment());
- T = Triple("spirv-unknown-shadermodel-closesthit");
+ T = Triple("spirv-unknown-vulkan-closesthit");
EXPECT_EQ(Triple::spirv, T.getArch());
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
- EXPECT_EQ(Triple::ShaderModel, T.getOS());
+ EXPECT_EQ(Triple::Vulkan, T.getOS());
+ EXPECT_EQ(VersionTuple(1, 2), T.getVulkanVersion());
EXPECT_EQ(Triple::ClosestHit, T.getEnvironment());
- T = Triple("spirv-unknown-shadermodel-miss");
+ T = Triple("spirv-unknown-vulkan-miss");
EXPECT_EQ(Triple::spirv, T.getArch());
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
- EXPECT_EQ(Triple::ShaderModel, T.getOS());
+ EXPECT_EQ(Triple::Vulkan, T.getOS());
+ EXPECT_EQ(VersionTuple(1, 2), T.getVulkanVersion());
EXPECT_EQ(Triple::Miss, T.getEnvironment());
- T = Triple("spirv-unknown-shadermodel-callable");
+ T = Triple("spirv-unknown-vulkan-callable");
EXPECT_EQ(Triple::spirv, T.getArch());
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
- EXPECT_EQ(Triple::ShaderModel, T.getOS());
+ EXPECT_EQ(Triple::Vulkan, T.getOS());
+ EXPECT_EQ(VersionTuple(1, 2), T.getVulkanVersion());
EXPECT_EQ(Triple::Callable, T.getEnvironment());
- T = Triple("spirv-unknown-shadermodel-mesh");
+ T = Triple("spirv-unknown-vulkan-mesh");
EXPECT_EQ(Triple::spirv, T.getArch());
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
- EXPECT_EQ(Triple::ShaderModel, T.getOS());
+ EXPECT_EQ(Triple::Vulkan, T.getOS());
+ EXPECT_EQ(VersionTuple(1, 2), T.getVulkanVersion());
EXPECT_EQ(Triple::Mesh, T.getEnvironment());
- T = Triple("spirv-unknown-shadermodel-amplification");
+ T = Triple("spirv-unknown-vulkan-amplification");
EXPECT_EQ(Triple::spirv, T.getArch());
EXPECT_EQ(Triple::NoSubArch, T.getSubArch());
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
- EXPECT_EQ(Triple::ShaderModel, T.getOS());
+ EXPECT_EQ(Triple::Vulkan, T.getOS());
+ EXPECT_EQ(VersionTuple(1, 2), T.getVulkanVersion());
EXPECT_EQ(Triple::Amplification, T.getEnvironment());
- T = Triple("spirv1.0-unknown-shadermodel-compute");
- EXPECT_EQ(Triple::spirv, T.getArch());
- EXPECT_EQ(Triple::SPIRVSubArch_v10, T.getSubArch());
- EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
- EXPECT_EQ(Triple::ShaderModel, T.getOS());
- EXPECT_EQ(Triple::Compute, T.getEnvironment());
-
- T = Triple("spirv1.1-unknown-shadermodel-compute");
+ T = Triple("spirv1.5-unknown-vulkan1.2-compute");
EXPECT_EQ(Triple::spirv, T.getArch());
- EXPECT_EQ(Triple::SPIRVSubArch_v11, T.getSubArch());
- EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
- EXPECT_EQ(Triple::ShaderModel, T.getOS());
- EXPECT_EQ(Triple::Compute, T.getEnvironment());
-
- T = Triple("spirv1.2-unknown-shadermodel-compute");
- EXPECT_EQ(Triple::spirv, T.getArch());
- EXPECT_EQ(Triple::SPIRVSubArch_v12, T.getSubArch());
- EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
- EXPECT_EQ(Triple::ShaderModel, T.getOS());
- EXPECT_EQ(Triple::Compute, T.getEnvironment());
-
- T = Triple("spirv1.3-unknown-shadermodel-compute");
- EXPECT_EQ(Triple::spirv, T.getArch());
- EXPECT_EQ(Triple::SPIRVSubArch_v13, T.getSubArch());
- EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
- EXPECT_EQ(Triple::ShaderModel, T.getOS());
- EXPECT_EQ(Triple::Compute, T.getEnvironment());
-
- T = Triple("spirv1.4-unknown-shadermodel-compute");
- EXPECT_EQ(Triple::spirv, T.getArch());
- EXPECT_EQ(Triple::SPIRVSubArch_v14, T.getSubArch());
+ EXPECT_EQ(Triple::SPIRVSubArch_v15, T.getSubArch());
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
- EXPECT_EQ(Triple::ShaderModel, T.getOS());
+ EXPECT_EQ(Triple::Vulkan, T.getOS());
+ EXPECT_EQ(VersionTuple(1, 2), T.getVulkanVersion());
EXPECT_EQ(Triple::Compute, T.getEnvironment());
- T = Triple("spirv1.5-unknown-shadermodel-compute");
+ T = Triple("spirv1.6-unknown-vulkan1.3-compute");
EXPECT_EQ(Triple::spirv, T.getArch());
- EXPECT_EQ(Triple::SPIRVSubArch_v15, T.getSubArch());
+ EXPECT_EQ(Triple::SPIRVSubArch_v16, T.getSubArch());
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
- EXPECT_EQ(Triple::ShaderModel, T.getOS());
+ EXPECT_EQ(Triple::Vulkan, T.getOS());
+ EXPECT_EQ(VersionTuple(1, 3), T.getVulkanVersion());
EXPECT_EQ(Triple::Compute, T.getEnvironment());
T = Triple("x86_64-unknown-fuchsia");
More information about the cfe-commits
mailing list