Skip to content

Commit 87b13ad

Browse files
authored
[HLSL][RootSignature] Implement serialization of remaining Root Elements (#143198)
Implements serialization of the remaining `RootElement`s, namely `RootDescriptor`s and `StaticSampler`s. - Adds unit testing for the serialization methods Resolves #138191 Resolves #138193
1 parent 1cd18bc commit 87b13ad

File tree

3 files changed

+269
-1
lines changed

3 files changed

+269
-1
lines changed

llvm/include/llvm/Frontend/HLSL/HLSLRootSignatureUtils.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@ LLVM_ABI raw_ostream &operator<<(raw_ostream &OS,
3838

3939
LLVM_ABI raw_ostream &operator<<(raw_ostream &OS, const DescriptorTable &Table);
4040

41+
LLVM_ABI raw_ostream &operator<<(raw_ostream &OS,
42+
const RootDescriptor &Descriptor);
43+
44+
LLVM_ABI raw_ostream &operator<<(raw_ostream &OS,
45+
const StaticSampler &StaticSampler);
46+
4147
LLVM_ABI void dumpRootElements(raw_ostream &OS, ArrayRef<RootElement> Elements);
4248

4349
class MetadataBuilder {

llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,109 @@ static raw_ostream &operator<<(raw_ostream &OS,
9898
return OS;
9999
}
100100

101+
static const EnumEntry<SamplerFilter> SamplerFilterNames[] = {
102+
{"MinMagMipPoint", SamplerFilter::MinMagMipPoint},
103+
{"MinMagPointMipLinear", SamplerFilter::MinMagPointMipLinear},
104+
{"MinPointMagLinearMipPoint", SamplerFilter::MinPointMagLinearMipPoint},
105+
{"MinPointMagMipLinear", SamplerFilter::MinPointMagMipLinear},
106+
{"MinLinearMagMipPoint", SamplerFilter::MinLinearMagMipPoint},
107+
{"MinLinearMagPointMipLinear", SamplerFilter::MinLinearMagPointMipLinear},
108+
{"MinMagLinearMipPoint", SamplerFilter::MinMagLinearMipPoint},
109+
{"MinMagMipLinear", SamplerFilter::MinMagMipLinear},
110+
{"Anisotropic", SamplerFilter::Anisotropic},
111+
{"ComparisonMinMagMipPoint", SamplerFilter::ComparisonMinMagMipPoint},
112+
{"ComparisonMinMagPointMipLinear",
113+
SamplerFilter::ComparisonMinMagPointMipLinear},
114+
{"ComparisonMinPointMagLinearMipPoint",
115+
SamplerFilter::ComparisonMinPointMagLinearMipPoint},
116+
{"ComparisonMinPointMagMipLinear",
117+
SamplerFilter::ComparisonMinPointMagMipLinear},
118+
{"ComparisonMinLinearMagMipPoint",
119+
SamplerFilter::ComparisonMinLinearMagMipPoint},
120+
{"ComparisonMinLinearMagPointMipLinear",
121+
SamplerFilter::ComparisonMinLinearMagPointMipLinear},
122+
{"ComparisonMinMagLinearMipPoint",
123+
SamplerFilter::ComparisonMinMagLinearMipPoint},
124+
{"ComparisonMinMagMipLinear", SamplerFilter::ComparisonMinMagMipLinear},
125+
{"ComparisonAnisotropic", SamplerFilter::ComparisonAnisotropic},
126+
{"MinimumMinMagMipPoint", SamplerFilter::MinimumMinMagMipPoint},
127+
{"MinimumMinMagPointMipLinear", SamplerFilter::MinimumMinMagPointMipLinear},
128+
{"MinimumMinPointMagLinearMipPoint",
129+
SamplerFilter::MinimumMinPointMagLinearMipPoint},
130+
{"MinimumMinPointMagMipLinear", SamplerFilter::MinimumMinPointMagMipLinear},
131+
{"MinimumMinLinearMagMipPoint", SamplerFilter::MinimumMinLinearMagMipPoint},
132+
{"MinimumMinLinearMagPointMipLinear",
133+
SamplerFilter::MinimumMinLinearMagPointMipLinear},
134+
{"MinimumMinMagLinearMipPoint", SamplerFilter::MinimumMinMagLinearMipPoint},
135+
{"MinimumMinMagMipLinear", SamplerFilter::MinimumMinMagMipLinear},
136+
{"MinimumAnisotropic", SamplerFilter::MinimumAnisotropic},
137+
{"MaximumMinMagMipPoint", SamplerFilter::MaximumMinMagMipPoint},
138+
{"MaximumMinMagPointMipLinear", SamplerFilter::MaximumMinMagPointMipLinear},
139+
{"MaximumMinPointMagLinearMipPoint",
140+
SamplerFilter::MaximumMinPointMagLinearMipPoint},
141+
{"MaximumMinPointMagMipLinear", SamplerFilter::MaximumMinPointMagMipLinear},
142+
{"MaximumMinLinearMagMipPoint", SamplerFilter::MaximumMinLinearMagMipPoint},
143+
{"MaximumMinLinearMagPointMipLinear",
144+
SamplerFilter::MaximumMinLinearMagPointMipLinear},
145+
{"MaximumMinMagLinearMipPoint", SamplerFilter::MaximumMinMagLinearMipPoint},
146+
{"MaximumMinMagMipLinear", SamplerFilter::MaximumMinMagMipLinear},
147+
{"MaximumAnisotropic", SamplerFilter::MaximumAnisotropic},
148+
};
149+
150+
static raw_ostream &operator<<(raw_ostream &OS, const SamplerFilter &Filter) {
151+
printEnum(OS, Filter, ArrayRef(SamplerFilterNames));
152+
153+
return OS;
154+
}
155+
156+
static const EnumEntry<TextureAddressMode> TextureAddressModeNames[] = {
157+
{"Wrap", TextureAddressMode::Wrap},
158+
{"Mirror", TextureAddressMode::Mirror},
159+
{"Clamp", TextureAddressMode::Clamp},
160+
{"Border", TextureAddressMode::Border},
161+
{"MirrorOnce", TextureAddressMode::MirrorOnce},
162+
};
163+
164+
static raw_ostream &operator<<(raw_ostream &OS,
165+
const TextureAddressMode &Address) {
166+
printEnum(OS, Address, ArrayRef(TextureAddressModeNames));
167+
168+
return OS;
169+
}
170+
171+
static const EnumEntry<ComparisonFunc> ComparisonFuncNames[] = {
172+
{"Never", ComparisonFunc::Never},
173+
{"Less", ComparisonFunc::Less},
174+
{"Equal", ComparisonFunc::Equal},
175+
{"LessEqual", ComparisonFunc::LessEqual},
176+
{"Greater", ComparisonFunc::Greater},
177+
{"NotEqual", ComparisonFunc::NotEqual},
178+
{"GreaterEqual", ComparisonFunc::GreaterEqual},
179+
{"Always", ComparisonFunc::Always},
180+
};
181+
182+
static raw_ostream &operator<<(raw_ostream &OS,
183+
const ComparisonFunc &CompFunc) {
184+
printEnum(OS, CompFunc, ArrayRef(ComparisonFuncNames));
185+
186+
return OS;
187+
}
188+
189+
static const EnumEntry<StaticBorderColor> StaticBorderColorNames[] = {
190+
{"TransparentBlack", StaticBorderColor::TransparentBlack},
191+
{"OpaqueBlack", StaticBorderColor::OpaqueBlack},
192+
{"OpaqueWhite", StaticBorderColor::OpaqueWhite},
193+
{"OpaqueBlackUint", StaticBorderColor::OpaqueBlackUint},
194+
{"OpaqueWhiteUint", StaticBorderColor::OpaqueWhiteUint},
195+
};
196+
197+
static raw_ostream &operator<<(raw_ostream &OS,
198+
const StaticBorderColor &BorderColor) {
199+
printEnum(OS, BorderColor, ArrayRef(StaticBorderColorNames));
200+
201+
return OS;
202+
}
203+
101204
static const EnumEntry<dxil::ResourceClass> ResourceClassNames[] = {
102205
{"CBV", dxil::ResourceClass::CBuffer},
103206
{"SRV", dxil::ResourceClass::SRV},
@@ -112,6 +215,20 @@ static raw_ostream &operator<<(raw_ostream &OS, const ClauseType &Type) {
112215
return OS;
113216
}
114217

218+
static const EnumEntry<RootDescriptorFlags> RootDescriptorFlagNames[] = {
219+
{"DataVolatile", RootDescriptorFlags::DataVolatile},
220+
{"DataStaticWhileSetAtExecute",
221+
RootDescriptorFlags::DataStaticWhileSetAtExecute},
222+
{"DataStatic", RootDescriptorFlags::DataStatic},
223+
};
224+
225+
static raw_ostream &operator<<(raw_ostream &OS,
226+
const RootDescriptorFlags &Flags) {
227+
printFlags(OS, Flags, ArrayRef(RootDescriptorFlagNames));
228+
229+
return OS;
230+
}
231+
115232
static const EnumEntry<DescriptorRangeFlags> DescriptorRangeFlagNames[] = {
116233
{"DescriptorsVolatile", DescriptorRangeFlags::DescriptorsVolatile},
117234
{"DataVolatile", DescriptorRangeFlags::DataVolatile},
@@ -182,6 +299,31 @@ raw_ostream &operator<<(raw_ostream &OS, const DescriptorTableClause &Clause) {
182299
return OS;
183300
}
184301

302+
raw_ostream &operator<<(raw_ostream &OS, const RootDescriptor &Descriptor) {
303+
ClauseType Type = ClauseType(llvm::to_underlying(Descriptor.Type));
304+
OS << "Root" << Type << "(" << Descriptor.Reg
305+
<< ", space = " << Descriptor.Space
306+
<< ", visibility = " << Descriptor.Visibility
307+
<< ", flags = " << Descriptor.Flags << ")";
308+
309+
return OS;
310+
}
311+
312+
raw_ostream &operator<<(raw_ostream &OS, const StaticSampler &Sampler) {
313+
OS << "StaticSampler(" << Sampler.Reg << ", filter = " << Sampler.Filter
314+
<< ", addressU = " << Sampler.AddressU
315+
<< ", addressV = " << Sampler.AddressV
316+
<< ", addressW = " << Sampler.AddressW
317+
<< ", mipLODBias = " << Sampler.MipLODBias
318+
<< ", maxAnisotropy = " << Sampler.MaxAnisotropy
319+
<< ", comparisonFunc = " << Sampler.CompFunc
320+
<< ", borderColor = " << Sampler.BorderColor
321+
<< ", minLOD = " << Sampler.MinLOD << ", maxLOD = " << Sampler.MaxLOD
322+
<< ", space = " << Sampler.Space << ", visibility = " << Sampler.Visibility
323+
<< ")";
324+
return OS;
325+
}
326+
185327
void dumpRootElements(raw_ostream &OS, ArrayRef<RootElement> Elements) {
186328
OS << "RootElements{";
187329
bool First = true;

llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp

Lines changed: 121 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,127 @@ TEST(HLSLRootSignatureTest, DescriptorTableDump) {
108108
EXPECT_EQ(Out, Expected);
109109
}
110110

111+
TEST(HLSLRootSignatureTest, RootCBVDump) {
112+
RootDescriptor Descriptor;
113+
Descriptor.Type = DescriptorType::CBuffer;
114+
Descriptor.Reg = {RegisterType::BReg, 0};
115+
Descriptor.setDefaultFlags();
116+
117+
std::string Out;
118+
llvm::raw_string_ostream OS(Out);
119+
OS << Descriptor;
120+
OS.flush();
121+
122+
std::string Expected = "RootCBV(b0, space = 0, "
123+
"visibility = All, "
124+
"flags = DataStaticWhileSetAtExecute)";
125+
EXPECT_EQ(Out, Expected);
126+
}
127+
128+
TEST(HLSLRootSignatureTest, RootSRVDump) {
129+
RootDescriptor Descriptor;
130+
Descriptor.Type = DescriptorType::SRV;
131+
Descriptor.Reg = {RegisterType::TReg, 0};
132+
Descriptor.Space = 42;
133+
Descriptor.Visibility = ShaderVisibility::Geometry;
134+
Descriptor.Flags = RootDescriptorFlags::None;
135+
136+
std::string Out;
137+
llvm::raw_string_ostream OS(Out);
138+
OS << Descriptor;
139+
OS.flush();
140+
141+
std::string Expected =
142+
"RootSRV(t0, space = 42, visibility = Geometry, flags = None)";
143+
EXPECT_EQ(Out, Expected);
144+
}
145+
146+
TEST(HLSLRootSignatureTest, RootUAVDump) {
147+
RootDescriptor Descriptor;
148+
Descriptor.Type = DescriptorType::UAV;
149+
Descriptor.Reg = {RegisterType::UReg, 92374};
150+
Descriptor.Space = 932847;
151+
Descriptor.Visibility = ShaderVisibility::Hull;
152+
Descriptor.Flags = RootDescriptorFlags::ValidFlags;
153+
154+
std::string Out;
155+
llvm::raw_string_ostream OS(Out);
156+
OS << Descriptor;
157+
OS.flush();
158+
159+
std::string Expected =
160+
"RootUAV(u92374, space = 932847, visibility = Hull, flags = "
161+
"DataVolatile | "
162+
"DataStaticWhileSetAtExecute | "
163+
"DataStatic)";
164+
EXPECT_EQ(Out, Expected);
165+
}
166+
167+
TEST(HLSLRootSignatureTest, DefaultStaticSamplerDump) {
168+
StaticSampler Sampler;
169+
Sampler.Reg = {RegisterType::SReg, 0};
170+
171+
std::string Out;
172+
llvm::raw_string_ostream OS(Out);
173+
OS << Sampler;
174+
OS.flush();
175+
176+
std::string Expected = "StaticSampler(s0, "
177+
"filter = Anisotropic, "
178+
"addressU = Wrap, "
179+
"addressV = Wrap, "
180+
"addressW = Wrap, "
181+
"mipLODBias = 0.000000e+00, "
182+
"maxAnisotropy = 16, "
183+
"comparisonFunc = LessEqual, "
184+
"borderColor = OpaqueWhite, "
185+
"minLOD = 0.000000e+00, "
186+
"maxLOD = 3.402823e+38, "
187+
"space = 0, "
188+
"visibility = All"
189+
")";
190+
EXPECT_EQ(Out, Expected);
191+
}
192+
193+
TEST(HLSLRootSignatureTest, DefinedStaticSamplerDump) {
194+
StaticSampler Sampler;
195+
Sampler.Reg = {RegisterType::SReg, 0};
196+
197+
Sampler.Filter = SamplerFilter::ComparisonMinMagLinearMipPoint;
198+
Sampler.AddressU = TextureAddressMode::Mirror;
199+
Sampler.AddressV = TextureAddressMode::Border;
200+
Sampler.AddressW = TextureAddressMode::Clamp;
201+
Sampler.MipLODBias = 4.8f;
202+
Sampler.MaxAnisotropy = 32;
203+
Sampler.CompFunc = ComparisonFunc::NotEqual;
204+
Sampler.BorderColor = StaticBorderColor::OpaqueBlack;
205+
Sampler.MinLOD = 1.0f;
206+
Sampler.MaxLOD = 32.0f;
207+
Sampler.Space = 7;
208+
Sampler.Visibility = ShaderVisibility::Domain;
209+
210+
std::string Out;
211+
llvm::raw_string_ostream OS(Out);
212+
OS << Sampler;
213+
OS.flush();
214+
215+
std::string Expected = "StaticSampler(s0, "
216+
"filter = ComparisonMinMagLinearMipPoint, "
217+
"addressU = Mirror, "
218+
"addressV = Border, "
219+
"addressW = Clamp, "
220+
"mipLODBias = 4.800000e+00, "
221+
"maxAnisotropy = 32, "
222+
"comparisonFunc = NotEqual, "
223+
"borderColor = OpaqueBlack, "
224+
"minLOD = 1.000000e+00, "
225+
"maxLOD = 3.200000e+01, "
226+
"space = 7, "
227+
"visibility = Domain"
228+
")";
229+
EXPECT_EQ(Out, Expected);
230+
}
231+
111232
TEST(HLSLRootSignatureTest, DefaultRootConstantsDump) {
112233
RootConstants Constants;
113234
Constants.Num32BitConstants = 1;
@@ -173,7 +294,6 @@ TEST(HLSLRootSignatureTest, AllRootFlagsDump) {
173294
"DenyMeshShaderRootAccess | "
174295
"CBVSRVUAVHeapDirectlyIndexed | "
175296
"SamplerHeapDirectlyIndexed)";
176-
177297
EXPECT_EQ(Out, Expected);
178298
}
179299

0 commit comments

Comments
 (0)