Skip to content

Commit 98bac32

Browse files
committed
[HLSL][RootSignature] Plug-in serialization and add full sample testcase
1 parent 509fb93 commit 98bac32

File tree

2 files changed

+105
-46
lines changed

2 files changed

+105
-46
lines changed

clang/test/AST/HLSL/RootSignatures-AST.hlsl

Lines changed: 69 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5,29 +5,61 @@
55
// the Attr AST Node is created succesfully. If an invalid root signature was
66
// passed in then we would exit out of Sema before the Attr is created.
77

8-
#define SampleRS \
9-
"DescriptorTable( " \
10-
" CBV(b1), " \
11-
" SRV(t1, numDescriptors = 8, " \
12-
" flags = DESCRIPTORS_VOLATILE), " \
13-
" UAV(u1, numDescriptors = 0, " \
14-
" flags = DESCRIPTORS_VOLATILE) " \
15-
"), " \
16-
"DescriptorTable(Sampler(s0, numDescriptors = 4, space = 1))"
8+
#define SampleRS "RootFlags( ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT | " \
9+
"DENY_VERTEX_SHADER_ROOT_ACCESS), " \
10+
"CBV(b0, space = 1, flags = DATA_STATIC), " \
11+
"SRV(t0), " \
12+
"UAV(u0), " \
13+
"DescriptorTable( CBV(b1), " \
14+
"SRV(t1, numDescriptors = 8, " \
15+
" flags = DESCRIPTORS_VOLATILE), " \
16+
"UAV(u1, numDescriptors = unbounded, " \
17+
" flags = DESCRIPTORS_VOLATILE)), " \
18+
"DescriptorTable(Sampler(s0, space=1, numDescriptors = 4)), " \
19+
"RootConstants(num32BitConstants=3, b10), " \
20+
"StaticSampler(s1)," \
21+
"StaticSampler(s2, " \
22+
"addressU = TEXTURE_ADDRESS_CLAMP, " \
23+
"filter = FILTER_MIN_MAG_MIP_LINEAR )"
1724

1825
// CHECK: -HLSLRootSignatureDecl 0x{{.*}} {{.*}} implicit [[SAMPLE_RS_DECL:__hlsl_rootsig_decl_\d*]]
1926
// CHECK-SAME: RootElements{
20-
// CHECK-SAME: CBV(b1, numDescriptors = 1, space = 0,
21-
// CHECK-SAME: offset = DescriptorTableOffsetAppend, flags = DataStaticWhileSetAtExecute),
22-
// CHECK-SAME: SRV(t1, numDescriptors = 8, space = 0,
23-
// CHECK-SAME: offset = DescriptorTableOffsetAppend, flags = DescriptorsVolatile),
24-
// CHECK-SAME: UAV(u1, numDescriptors = 0, space = 0,
25-
// CHECK-SAME: offset = DescriptorTableOffsetAppend, flags = DescriptorsVolatile),
26-
// CHECK-SAME: DescriptorTable(numClauses = 3, visibility = All),
27-
// CHECK-SAME: Sampler(s0, numDescriptors = 4, space = 1,
28-
// CHECK-SAME: offset = DescriptorTableOffsetAppend, flags = None),
29-
// CHECK-SAME: DescriptorTable(numClauses = 1, visibility = All)
30-
// CHECK-SAME: }
27+
// CHECK-SAME: RootFlags(AllowInputAssemblerInputLayout | DenyVertexShaderRootAccess),
28+
// CHECK-SAME: RootCBV(b0,
29+
// CHECK-SAME: space = 1, visibility = All, flags = DataStatic
30+
// CHECK-SAME: ),
31+
// CHECK-SAME: RootSRV(t0,
32+
// CHECK-SAME: space = 0, visibility = All, flags = DataStaticWhileSetAtExecute
33+
// CHECK-SAME: ),
34+
// CHECK-SAME: RootUAV(
35+
// CHECK-SAME: u0, space = 0, visibility = All, flags = DataVolatile
36+
// CHECK-SAME: ),
37+
// CHECK-SAME: CBV(
38+
// CHECK-SAME: b1, numDescriptors = 1, space = 0, offset = DescriptorTableOffsetAppend, flags = DataStaticWhileSetAtExecute
39+
// CHECK-SAME: ),
40+
// CHECK-SAME: SRV(
41+
// CHECK-SAME: t1, numDescriptors = 8, space = 0, offset = DescriptorTableOffsetAppend, flags = DescriptorsVolatile
42+
// CHECK-SAME: ),
43+
// CHECK-SAME: UAV(
44+
// CHECK-SAME: u1, numDescriptors = 4294967295, space = 0, offset = DescriptorTableOffsetAppend, flags = DescriptorsVolatile
45+
// CHECK-SAME: ),
46+
// CHECK-SAME: DescriptorTable(
47+
// CHECK-SAME: numClauses = 3, visibility = All
48+
// CHECK-SAME: ),
49+
// CHECK-SAME: Sampler(
50+
// CHECK-SAME: s0, numDescriptors = 4, space = 1, offset = DescriptorTableOffsetAppend, flags = None
51+
// CHECK-SAME: ),
52+
// CHECK-SAME: DescriptorTable(
53+
// CHECK-SAME: numClauses = 1, visibility = All
54+
// CHECK-SAME: ),
55+
// CHECK-SAME: RootConstants(
56+
// CHECK-SAME: num32BitConstants = 3, b10, space = 0, visibility = All
57+
// CHECK-SAME: ),
58+
// CHECK-SAME: StaticSampler(
59+
// CHECK-SAME: s1, filter = Anisotropic, addressU = Wrap, addressV = Wrap, addressW = Wrap,
60+
// CHECK-SAME: mipLODBias = 0.000000e+00, maxAnisotropy = 16, comparisonFunc = LessEqual,
61+
// CHECK-SAME: borderColor = OpaqueWhite, minLOD = 0.000000e+00, maxLOD = 3.402823e+38, space = 0, visibility = All
62+
// CHECK-SAME: )}
3163

3264
// CHECK: -RootSignatureAttr 0x{{.*}} {{.*}} [[SAMPLE_RS_DECL]]
3365
[RootSignature(SampleRS)]
@@ -44,14 +76,23 @@ void same_rs_main() {}
4476
// link to the same root signature declaration
4577

4678
#define SampleSameRS \
47-
"DescriptorTable( " \
48-
" CBV(b1), " \
49-
" SRV(t1, numDescriptors = 8, " \
50-
" flags = DESCRIPTORS_VOLATILE), " \
51-
" UAV(u1, numDescriptors = 0, " \
52-
" flags = DESCRIPTORS_VOLATILE) " \
53-
"), " \
54-
"DescriptorTable(Sampler(s0, numDescriptors = 4, space = 1))"
79+
"RootFlags( ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT | " \
80+
"DENY_VERTEX_SHADER_ROOT_ACCESS), " \
81+
"CBV(b0, space = 1, flags = DATA_STATIC), " \
82+
"SRV(t0), " \
83+
"UAV(u0), " \
84+
"DescriptorTable( CBV(b1), " \
85+
"SRV(t1, numDescriptors = 8, " \
86+
" flags = DESCRIPTORS_VOLATILE), " \
87+
"UAV(u1, numDescriptors = unbounded, " \
88+
" flags = DESCRIPTORS_VOLATILE)), " \
89+
"DescriptorTable(Sampler(s0, space=1, numDescriptors = 4)), " \
90+
"RootConstants(num32BitConstants=3, b10), " \
91+
"StaticSampler(s1)," \
92+
"StaticSampler(s2, " \
93+
"addressU = TEXTURE_ADDRESS_CLAMP, " \
94+
"filter = FILTER_MIN_MAG_MIP_LINEAR )"
95+
5596

5697
// CHECK: -RootSignatureAttr 0x{{.*}} {{.*}} [[SAMPLE_RS_DECL]]
5798
[RootSignature(SampleSameRS)]

llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -324,36 +324,54 @@ raw_ostream &operator<<(raw_ostream &OS, const StaticSampler &Sampler) {
324324
return OS;
325325
}
326326

327+
namespace {
328+
329+
// We use the OverloadVisit with std::visit to ensure the compiler catches if a
330+
// new RootElement variant type is added but it's operator<< or metadata
331+
// generation isn't handled.
332+
template <class... Ts> struct OverloadedVisit : Ts... {
333+
using Ts::operator()...;
334+
};
335+
template <class... Ts> OverloadedVisit(Ts...) -> OverloadedVisit<Ts...>;
336+
337+
} // namespace
338+
327339
void dumpRootElements(raw_ostream &OS, ArrayRef<RootElement> Elements) {
328-
OS << "RootElements{";
340+
const auto Visitor = OverloadedVisit{
341+
[&OS](const RootFlags &Flags) -> raw_ostream& {
342+
return OS << Flags;
343+
},
344+
[&OS](const RootConstants &Constants) -> raw_ostream& {
345+
return OS << Constants;
346+
},
347+
[&OS](const RootDescriptor &Descriptor) -> raw_ostream& {
348+
return OS << Descriptor;
349+
},
350+
[&OS](const DescriptorTableClause &Clause) -> raw_ostream& {
351+
return OS << Clause;
352+
},
353+
[&OS](const DescriptorTable &Table) -> raw_ostream& {
354+
return OS << Table;
355+
},
356+
[&OS](const StaticSampler &Sampler) -> raw_ostream& {
357+
return OS << Sampler;
358+
},
359+
};
360+
361+
OS << " RootElements{";
329362
bool First = true;
330363
for (const RootElement &Element : Elements) {
331364
if (!First)
332365
OS << ",";
333366
OS << " ";
334-
if (const auto &Clause = std::get_if<DescriptorTableClause>(&Element))
335-
OS << *Clause;
336-
if (const auto &Table = std::get_if<DescriptorTable>(&Element))
337-
OS << *Table;
367+
std::visit(Visitor, Element);
338368
First = false;
339369
}
340370
OS << "}";
341371
}
342372

343-
namespace {
344-
345-
// We use the OverloadBuild with std::visit to ensure the compiler catches if a
346-
// new RootElement variant type is added but it's metadata generation isn't
347-
// handled.
348-
template <class... Ts> struct OverloadedBuild : Ts... {
349-
using Ts::operator()...;
350-
};
351-
template <class... Ts> OverloadedBuild(Ts...) -> OverloadedBuild<Ts...>;
352-
353-
} // namespace
354-
355373
MDNode *MetadataBuilder::BuildRootSignature() {
356-
const auto Visitor = OverloadedBuild{
374+
const auto Visitor = OverloadedVisit{
357375
[this](const RootFlags &Flags) -> MDNode * {
358376
return BuildRootFlags(Flags);
359377
},

0 commit comments

Comments
 (0)