Skip to content

Commit 665af09

Browse files
authored
[DirectX backend] emits metadata for DXIL version. (#88350)
Emit named metadata "dx.version" for DXIL version. Default to DXIL 1.0
1 parent 3ceacd8 commit 665af09

File tree

8 files changed

+132
-0
lines changed

8 files changed

+132
-0
lines changed

llvm/include/llvm/TargetParser/Triple.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,10 @@ class Triple {
428428
/// (SubArch). This should only be called with Vulkan SPIR-V triples.
429429
VersionTuple getVulkanVersion() const;
430430

431+
/// Parse the DXIL version number from the DXIL version
432+
/// (SubArch). This should only be called with DXIL triples.
433+
VersionTuple getDXILVersion() const;
434+
431435
/// @}
432436
/// @name Direct Component Access
433437
/// @{

llvm/lib/Target/DirectX/DXILMetadata.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,18 @@ void dxil::createShaderModelMD(Module &M) {
9090
Entry->addOperand(MDNode::get(Ctx, Vals));
9191
}
9292

93+
void dxil::createDXILVersionMD(Module &M) {
94+
Triple TT(Triple::normalize(M.getTargetTriple()));
95+
VersionTuple Ver = TT.getDXILVersion();
96+
LLVMContext &Ctx = M.getContext();
97+
IRBuilder<> B(Ctx);
98+
NamedMDNode *Entry = M.getOrInsertNamedMetadata("dx.version");
99+
Metadata *Vals[2];
100+
Vals[0] = ConstantAsMetadata::get(B.getInt32(Ver.getMajor()));
101+
Vals[1] = ConstantAsMetadata::get(B.getInt32(Ver.getMinor().value_or(0)));
102+
Entry->addOperand(MDNode::get(Ctx, Vals));
103+
}
104+
93105
static uint32_t getShaderStage(Triple::EnvironmentType Env) {
94106
return (uint32_t)Env - (uint32_t)llvm::Triple::Pixel;
95107
}

llvm/lib/Target/DirectX/DXILMetadata.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class ValidatorVersionMD {
3434
};
3535

3636
void createShaderModelMD(Module &M);
37+
void createDXILVersionMD(Module &M);
3738
void createEntryMD(Module &M, const uint64_t ShaderFlags);
3839

3940
} // namespace dxil

llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ bool DXILTranslateMetadata::runOnModule(Module &M) {
4848
if (ValVerMD.isEmpty())
4949
ValVerMD.update(VersionTuple(1, 0));
5050
dxil::createShaderModelMD(M);
51+
dxil::createDXILVersionMD(M);
5152

5253
const dxil::Resources &Res =
5354
getAnalysis<DXILResourceWrapper>().getDXILResource();

llvm/lib/TargetParser/Triple.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1420,6 +1420,17 @@ VersionTuple Triple::getVulkanVersion() const {
14201420
return VersionTuple(0);
14211421
}
14221422

1423+
VersionTuple Triple::getDXILVersion() const {
1424+
if (getArch() != dxil || getOS() != ShaderModel)
1425+
llvm_unreachable("invalid DXIL triple");
1426+
StringRef Arch = getArchName();
1427+
Arch.consume_front("dxilv");
1428+
VersionTuple DXILVersion = parseVersionFromName(Arch);
1429+
// FIXME: validate DXIL version against Shader Model version.
1430+
// Tracked by https://github.com/llvm/llvm-project/issues/91388
1431+
return DXILVersion;
1432+
}
1433+
14231434
void Triple::setTriple(const Twine &Str) {
14241435
*this = Triple(Str);
14251436
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
; RUN: opt -S -dxil-metadata-emit %s | FileCheck %s
2+
target triple = "dxil-pc-shadermodel6.0-vertex"
3+
4+
; CHECK: !dx.version = !{![[DXVER:[0-9]+]]}
5+
; CHECK: ![[DXVER]] = !{i32 1, i32 0}
6+
7+
define void @entry() #0 {
8+
entry:
9+
ret void
10+
}
11+
12+
attributes #0 = { noinline nounwind "hlsl.shader"="vertex" }
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
; RUN: opt -S -dxil-metadata-emit %s | FileCheck %s
2+
target triple = "dxil-pc-shadermodel6.8-compute"
3+
4+
; CHECK: !dx.version = !{![[DXVER:[0-9]+]]}
5+
; CHECK: ![[DXVER]] = !{i32 1, i32 8}
6+
7+
define void @entry() #0 {
8+
entry:
9+
ret void
10+
}
11+
12+
attributes #0 = { noinline nounwind "hlsl.numthreads"="1,2,1" "hlsl.shader"="compute" }

llvm/unittests/TargetParser/TripleTest.cpp

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,85 @@ TEST(TripleTest, ParsedIDs) {
437437
EXPECT_EQ(VersionTuple(1, 3), T.getVulkanVersion());
438438
EXPECT_EQ(Triple::Compute, T.getEnvironment());
439439

440+
T = Triple("dxilv1.0--shadermodel6.0-pixel");
441+
EXPECT_EQ(Triple::dxil, T.getArch());
442+
EXPECT_EQ(Triple::DXILSubArch_v1_0, T.getSubArch());
443+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
444+
EXPECT_EQ(Triple::ShaderModel, T.getOS());
445+
EXPECT_EQ(VersionTuple(1, 0), T.getDXILVersion());
446+
EXPECT_EQ(Triple::Pixel, T.getEnvironment());
447+
448+
T = Triple("dxilv1.1--shadermodel6.1-vertex");
449+
EXPECT_EQ(Triple::dxil, T.getArch());
450+
EXPECT_EQ(Triple::DXILSubArch_v1_1, T.getSubArch());
451+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
452+
EXPECT_EQ(Triple::ShaderModel, T.getOS());
453+
EXPECT_EQ(VersionTuple(1, 1), T.getDXILVersion());
454+
EXPECT_EQ(Triple::Vertex, T.getEnvironment());
455+
456+
T = Triple("dxilv1.2--shadermodel6.2-geometry");
457+
EXPECT_EQ(Triple::dxil, T.getArch());
458+
EXPECT_EQ(Triple::DXILSubArch_v1_2, T.getSubArch());
459+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
460+
EXPECT_EQ(Triple::ShaderModel, T.getOS());
461+
EXPECT_EQ(VersionTuple(1, 2), T.getDXILVersion());
462+
EXPECT_EQ(Triple::Geometry, T.getEnvironment());
463+
464+
T = Triple("dxilv1.3--shadermodel6.3-library");
465+
EXPECT_EQ(Triple::dxil, T.getArch());
466+
EXPECT_EQ(Triple::DXILSubArch_v1_3, T.getSubArch());
467+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
468+
EXPECT_EQ(Triple::ShaderModel, T.getOS());
469+
EXPECT_EQ(VersionTuple(1, 3), T.getDXILVersion());
470+
EXPECT_EQ(Triple::Library, T.getEnvironment());
471+
472+
T = Triple("dxilv1.4--shadermodel6.4-hull");
473+
EXPECT_EQ(Triple::dxil, T.getArch());
474+
EXPECT_EQ(Triple::DXILSubArch_v1_4, T.getSubArch());
475+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
476+
EXPECT_EQ(Triple::ShaderModel, T.getOS());
477+
EXPECT_EQ(VersionTuple(1, 4), T.getDXILVersion());
478+
EXPECT_EQ(Triple::Hull, T.getEnvironment());
479+
480+
T = Triple("dxilv1.5--shadermodel6.5-domain");
481+
EXPECT_EQ(Triple::dxil, T.getArch());
482+
EXPECT_EQ(Triple::DXILSubArch_v1_5, T.getSubArch());
483+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
484+
EXPECT_EQ(Triple::ShaderModel, T.getOS());
485+
EXPECT_EQ(VersionTuple(1, 5), T.getDXILVersion());
486+
EXPECT_EQ(Triple::Domain, T.getEnvironment());
487+
488+
T = Triple("dxilv1.6--shadermodel6.6-compute");
489+
EXPECT_EQ(Triple::dxil, T.getArch());
490+
EXPECT_EQ(Triple::DXILSubArch_v1_6, T.getSubArch());
491+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
492+
EXPECT_EQ(Triple::ShaderModel, T.getOS());
493+
EXPECT_EQ(VersionTuple(1, 6), T.getDXILVersion());
494+
EXPECT_EQ(Triple::Compute, T.getEnvironment());
495+
496+
T = Triple("dxilv1.7-unknown-shadermodel6.7-mesh");
497+
EXPECT_EQ(Triple::dxil, T.getArch());
498+
EXPECT_EQ(Triple::DXILSubArch_v1_7, T.getSubArch());
499+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
500+
EXPECT_EQ(Triple::ShaderModel, T.getOS());
501+
EXPECT_EQ(VersionTuple(1, 7), T.getDXILVersion());
502+
EXPECT_EQ(Triple::Mesh, T.getEnvironment());
503+
504+
T = Triple("dxilv1.8-unknown-shadermodel6.8-amplification");
505+
EXPECT_EQ(Triple::dxil, T.getArch());
506+
EXPECT_EQ(Triple::DXILSubArch_v1_8, T.getSubArch());
507+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
508+
EXPECT_EQ(Triple::ShaderModel, T.getOS());
509+
EXPECT_EQ(VersionTuple(1, 8), T.getDXILVersion());
510+
EXPECT_EQ(Triple::Amplification, T.getEnvironment());
511+
512+
T = Triple("dxilv1.8-unknown-shadermodel6.15-library");
513+
EXPECT_EQ(Triple::dxil, T.getArch());
514+
EXPECT_EQ(Triple::DXILSubArch_v1_8, T.getSubArch());
515+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
516+
EXPECT_EQ(Triple::ShaderModel, T.getOS());
517+
EXPECT_EQ(VersionTuple(1, 8), T.getDXILVersion());
518+
440519
T = Triple("x86_64-unknown-fuchsia");
441520
EXPECT_EQ(Triple::x86_64, T.getArch());
442521
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());

0 commit comments

Comments
 (0)