Skip to content

Commit 56ca23c

Browse files
authored
[DirectX] Updating Root Signature Metadata to contain Static Sampler flags (#160210)
Root Signature 1.2 adds flags to static samplers. This requires us to change the metadata representation to account for it when being generated. This patch focus on the metadata changes required in the backend, frontend changes will come in a future PR.
1 parent 71365c0 commit 56ca23c

21 files changed

+94
-20
lines changed

clang/test/CodeGenHLSL/RootSignature.hlsl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,8 @@ void RootDescriptorsEntry() {}
8282
// checking minLOD, maxLOD
8383
// CHECK-SAME: float -1.280000e+02, float 1.280000e+02,
8484

85-
// checking register, space and visibility
86-
// CHECK-SAME: i32 42, i32 0, i32 0}
85+
// checking register, space, visibility and flags
86+
// CHECK-SAME: i32 42, i32 0, i32 0, i32 0}
8787

8888
#define SampleStaticSampler \
8989
"StaticSampler(s42, " \

llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ struct StaticSampler {
131131
float MaxLOD = std::numeric_limits<float>::max();
132132
uint32_t Space = 0;
133133
dxbc::ShaderVisibility Visibility = dxbc::ShaderVisibility::All;
134+
dxbc::StaticSamplerFlags Flags = dxbc::StaticSamplerFlags::None;
134135
};
135136

136137
/// Models RootElement : RootFlags | RootConstants | RootParam

llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@ MDNode *MetadataBuilder::BuildStaticSampler(const StaticSampler &Sampler) {
218218
ConstantAsMetadata::get(Builder.getInt32(Sampler.Space)),
219219
ConstantAsMetadata::get(
220220
Builder.getInt32(to_underlying(Sampler.Visibility))),
221+
ConstantAsMetadata::get(Builder.getInt32(to_underlying(Sampler.Flags))),
221222
};
222223
return MDNode::get(Ctx, Operands);
223224
}
@@ -417,7 +418,7 @@ Error MetadataParser::parseDescriptorTable(mcdxbc::RootSignatureDesc &RSD,
417418

418419
Error MetadataParser::parseStaticSampler(mcdxbc::RootSignatureDesc &RSD,
419420
MDNode *StaticSamplerNode) {
420-
if (StaticSamplerNode->getNumOperands() != 14)
421+
if (StaticSamplerNode->getNumOperands() != 15)
421422
return make_error<InvalidRSMetadataFormat>("Static Sampler");
422423

423424
mcdxbc::StaticSampler Sampler;
@@ -501,6 +502,17 @@ Error MetadataParser::parseStaticSampler(mcdxbc::RootSignatureDesc &RSD,
501502
return Error(std::move(E));
502503
Sampler.ShaderVisibility = *Visibility;
503504

505+
if (RSD.Version < 3) {
506+
RSD.StaticSamplers.push_back(Sampler);
507+
return Error::success();
508+
}
509+
assert(RSD.Version >= 3);
510+
511+
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 14))
512+
Sampler.Flags = *Val;
513+
else
514+
return make_error<InvalidRSMetadataValue>("Static Sampler Flags");
515+
504516
RSD.StaticSamplers.push_back(Sampler);
505517
return Error::success();
506518
}

llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressU.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,4 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
1616
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
1717
!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
1818
!3 = !{ !5 } ; list of root signature elements
19-
!5 = !{ !"StaticSampler", i32 4, i32 666, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0 }
19+
!5 = !{ !"StaticSampler", i32 4, i32 666, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0, i32 0 }

llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressV.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,4 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
1616
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
1717
!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
1818
!3 = !{ !5 } ; list of root signature elements
19-
!5 = !{ !"StaticSampler", i32 4, i32 2, i32 666, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0 }
19+
!5 = !{ !"StaticSampler", i32 4, i32 2, i32 666, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0, i32 0 }

llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressW.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,4 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
1616
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
1717
!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
1818
!3 = !{ !5 } ; list of root signature elements
19-
!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 666, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0 }
19+
!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 666, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0, i32 0 }

llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-BorderColor.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,4 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
1616
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
1717
!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
1818
!3 = !{ !5 } ; list of root signature elements
19-
!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 666, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0 }
19+
!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 666, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0, i32 0 }

llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-ComparisonFunc.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,4 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
1616
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
1717
!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
1818
!3 = !{ !5 } ; list of root signature elements
19-
!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 666, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0 }
19+
!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 666, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0, i32 0 }

llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-Filter.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,4 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
1616
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
1717
!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
1818
!3 = !{ !5 } ; list of root signature elements
19-
!5 = !{ !"StaticSampler", i32 45, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0 }
19+
!5 = !{ !"StaticSampler", i32 45, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0, i32 0 }
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
2+
3+
4+
target triple = "dxil-unknown-shadermodel6.0-compute"
5+
6+
; CHECK: error: Invalid value for Static Sampler Flag: 4
7+
; CHECK-NOT: Root Signature Definitions
8+
9+
define void @main() #0 {
10+
entry:
11+
ret void
12+
}
13+
attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
14+
15+
16+
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
17+
!2 = !{ ptr @main, !3, i32 3 } ; function, root signature
18+
!3 = !{ !5 } ; list of root signature elements
19+
!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0, i32 4 }

0 commit comments

Comments
 (0)