Skip to content

Commit 5fd3aad

Browse files
authored
[DirectX] Updating Root Signature YAML representation to use Enums instead of uint (#154827)
This PR is updating Root Signature YAML to use enums, this is a required change to remove the use of to_underlying from DirectXContainer binary file. Closes: [#150676](#150676)
1 parent 3706070 commit 5fd3aad

23 files changed

+274
-206
lines changed

llvm/include/llvm/ObjectYAML/DXContainerYAML.h

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ struct RootDescriptorYaml {
9292
};
9393

9494
struct DescriptorRangeYaml {
95-
uint32_t RangeType;
95+
dxil::ResourceClass RangeType;
9696
uint32_t NumDescriptors;
9797
uint32_t BaseShaderRegister;
9898
uint32_t RegisterSpace;
@@ -111,12 +111,12 @@ struct DescriptorTableYaml {
111111
};
112112

113113
struct RootParameterHeaderYaml {
114-
uint32_t Type;
115-
uint32_t Visibility;
114+
dxbc::RootParameterType Type;
115+
dxbc::ShaderVisibility Visibility;
116116
uint32_t Offset;
117117

118118
RootParameterHeaderYaml(){};
119-
RootParameterHeaderYaml(uint32_t T) : Type(T) {}
119+
RootParameterHeaderYaml(dxbc::RootParameterType T) : Type(T) {}
120120
};
121121

122122
struct RootParameterLocationYaml {
@@ -165,21 +165,19 @@ struct RootParameterYamlDesc {
165165
};
166166

167167
struct StaticSamplerYamlDesc {
168-
uint32_t Filter = llvm::to_underlying(dxbc::SamplerFilter::Anisotropic);
169-
uint32_t AddressU = llvm::to_underlying(dxbc::TextureAddressMode::Wrap);
170-
uint32_t AddressV = llvm::to_underlying(dxbc::TextureAddressMode::Wrap);
171-
uint32_t AddressW = llvm::to_underlying(dxbc::TextureAddressMode::Wrap);
168+
dxbc::SamplerFilter Filter = dxbc::SamplerFilter::Anisotropic;
169+
dxbc::TextureAddressMode AddressU = dxbc::TextureAddressMode::Wrap;
170+
dxbc::TextureAddressMode AddressV = dxbc::TextureAddressMode::Wrap;
171+
dxbc::TextureAddressMode AddressW = dxbc::TextureAddressMode::Wrap;
172172
float MipLODBias = 0.f;
173173
uint32_t MaxAnisotropy = 16u;
174-
uint32_t ComparisonFunc =
175-
llvm::to_underlying(dxbc::ComparisonFunc::LessEqual);
176-
uint32_t BorderColor =
177-
llvm::to_underlying(dxbc::StaticBorderColor::OpaqueWhite);
174+
dxbc::ComparisonFunc ComparisonFunc = dxbc::ComparisonFunc::LessEqual;
175+
dxbc::StaticBorderColor BorderColor = dxbc::StaticBorderColor::OpaqueWhite;
178176
float MinLOD = 0.f;
179177
float MaxLOD = std::numeric_limits<float>::max();
180178
uint32_t ShaderRegister;
181179
uint32_t RegisterSpace;
182-
uint32_t ShaderVisibility;
180+
dxbc::ShaderVisibility ShaderVisibility;
183181
};
184182

185183
struct RootSignatureYamlDesc {
@@ -321,6 +319,13 @@ LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::PSV::ResourceKind)
321319
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::D3DSystemValue)
322320
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::SigComponentType)
323321
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::SigMinPrecision)
322+
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::RootParameterType)
323+
LLVM_YAML_DECLARE_ENUM_TRAITS(dxil::ResourceClass)
324+
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::SamplerFilter)
325+
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::StaticBorderColor)
326+
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::TextureAddressMode)
327+
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::ShaderVisibility)
328+
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::ComparisonFunc)
324329

325330
namespace llvm {
326331

llvm/include/llvm/Support/DXILABI.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,6 @@ const unsigned MinWaveSize = 4;
102102
const unsigned MaxWaveSize = 128;
103103

104104
LLVM_ABI StringRef getResourceClassName(ResourceClass RC);
105-
106105
} // namespace dxil
107106
} // namespace llvm
108107

llvm/lib/ObjectYAML/DXContainerEmitter.cpp

Lines changed: 10 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -274,13 +274,8 @@ Error DXContainerWriter::writeParts(raw_ostream &OS) {
274274
for (DXContainerYAML::RootParameterLocationYaml &L :
275275
P.RootSignature->Parameters.Locations) {
276276

277-
assert(dxbc::isValidParameterType(L.Header.Type) &&
278-
"invalid DXContainer YAML");
279-
assert(dxbc::isValidShaderVisibility(L.Header.Visibility) &&
280-
"invalid DXContainer YAML");
281-
dxbc::RootParameterType Type = dxbc::RootParameterType(L.Header.Type);
282-
dxbc::ShaderVisibility Visibility =
283-
dxbc::ShaderVisibility(L.Header.Visibility);
277+
const dxbc::RootParameterType Type = L.Header.Type;
278+
const dxbc::ShaderVisibility Visibility = L.Header.Visibility;
284279

285280
switch (Type) {
286281
case dxbc::RootParameterType::Constants32Bit: {
@@ -313,10 +308,8 @@ Error DXContainerWriter::writeParts(raw_ostream &OS) {
313308
P.RootSignature->Parameters.getOrInsertTable(L);
314309
mcdxbc::DescriptorTable Table;
315310
for (const auto &R : TableYaml.Ranges) {
316-
assert(dxbc::isValidRangeType(R.RangeType) &&
317-
"Invalid Descriptor Range Type");
318311
mcdxbc::DescriptorRange Range;
319-
Range.RangeType = dxil::ResourceClass(R.RangeType);
312+
Range.RangeType = R.RangeType;
320313
Range.NumDescriptors = R.NumDescriptors;
321314
Range.BaseShaderRegister = R.BaseShaderRegister;
322315
Range.RegisterSpace = R.RegisterSpace;
@@ -335,30 +328,20 @@ Error DXContainerWriter::writeParts(raw_ostream &OS) {
335328
}
336329

337330
for (const auto &Param : P.RootSignature->samplers()) {
338-
assert(dxbc::isValidSamplerFilter(Param.Filter) &&
339-
dxbc::isValidAddress(Param.AddressU) &&
340-
dxbc::isValidAddress(Param.AddressV) &&
341-
dxbc::isValidAddress(Param.AddressW) &&
342-
dxbc::isValidComparisonFunc(Param.ComparisonFunc) &&
343-
dxbc::isValidBorderColor(Param.BorderColor) &&
344-
dxbc::isValidShaderVisibility(Param.ShaderVisibility) &&
345-
"Invalid enum value in static sampler");
346-
347331
mcdxbc::StaticSampler NewSampler;
348-
NewSampler.Filter = dxbc::SamplerFilter(Param.Filter);
349-
NewSampler.AddressU = dxbc::TextureAddressMode(Param.AddressU);
350-
NewSampler.AddressV = dxbc::TextureAddressMode(Param.AddressV);
351-
NewSampler.AddressW = dxbc::TextureAddressMode(Param.AddressW);
332+
NewSampler.Filter = Param.Filter;
333+
NewSampler.AddressU = Param.AddressU;
334+
NewSampler.AddressV = Param.AddressV;
335+
NewSampler.AddressW = Param.AddressW;
352336
NewSampler.MipLODBias = Param.MipLODBias;
353337
NewSampler.MaxAnisotropy = Param.MaxAnisotropy;
354-
NewSampler.ComparisonFunc = dxbc::ComparisonFunc(Param.ComparisonFunc);
355-
NewSampler.BorderColor = dxbc::StaticBorderColor(Param.BorderColor);
338+
NewSampler.ComparisonFunc = Param.ComparisonFunc;
339+
NewSampler.BorderColor = Param.BorderColor;
356340
NewSampler.MinLOD = Param.MinLOD;
357341
NewSampler.MaxLOD = Param.MaxLOD;
358342
NewSampler.ShaderRegister = Param.ShaderRegister;
359343
NewSampler.RegisterSpace = Param.RegisterSpace;
360-
NewSampler.ShaderVisibility =
361-
dxbc::ShaderVisibility(Param.ShaderVisibility);
344+
NewSampler.ShaderVisibility = Param.ShaderVisibility;
362345

363346
RS.StaticSamplers.push_back(NewSampler);
364347
}

llvm/lib/ObjectYAML/DXContainerYAML.cpp

Lines changed: 97 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,10 @@ readDescriptorRanges(DXContainerYAML::RootParameterHeaderYaml &Header,
6060
NewR.NumDescriptors = R.NumDescriptors;
6161
NewR.BaseShaderRegister = R.BaseShaderRegister;
6262
NewR.RegisterSpace = R.RegisterSpace;
63-
NewR.RangeType = R.RangeType;
63+
if (!dxbc::isValidRangeType(R.RangeType))
64+
return createStringError(std::errc::invalid_argument,
65+
"Invalid value for descriptor range type");
66+
NewR.RangeType = dxil::ResourceClass(R.RangeType);
6467
if constexpr (std::is_same_v<T, dxbc::RTS0::v2::DescriptorRange>) {
6568
// Set all flag fields for v2
6669
#define DESCRIPTOR_RANGE_FLAG(Num, Enum, Flag) \
@@ -94,15 +97,14 @@ DXContainerYAML::RootSignatureYamlDesc::create(
9497
return createStringError(std::errc::invalid_argument,
9598
"Invalid value for parameter type");
9699

97-
RootParameterHeaderYaml Header(PH.ParameterType);
100+
RootParameterHeaderYaml Header(dxbc::RootParameterType(PH.ParameterType));
98101
Header.Offset = PH.ParameterOffset;
99-
Header.Type = PH.ParameterType;
100102

101103
if (!dxbc::isValidShaderVisibility(PH.ShaderVisibility))
102104
return createStringError(std::errc::invalid_argument,
103105
"Invalid value for shader visibility");
104106

105-
Header.Visibility = PH.ShaderVisibility;
107+
Header.Visibility = dxbc::ShaderVisibility(PH.ShaderVisibility);
106108

107109
llvm::Expected<object::DirectX::RootParameterView> ParamViewOrErr =
108110
Data.getParameter(PH);
@@ -162,20 +164,50 @@ DXContainerYAML::RootSignatureYamlDesc::create(
162164
}
163165

164166
for (const auto &S : Data.samplers()) {
167+
if (!dxbc::isValidSamplerFilter(S.Filter))
168+
return createStringError(std::errc::invalid_argument,
169+
"Invalid value for static sampler filter");
170+
171+
if (!dxbc::isValidAddress(S.AddressU))
172+
return createStringError(std::errc::invalid_argument,
173+
"Invalid value for static sampler AddressU");
174+
175+
if (!dxbc::isValidAddress(S.AddressV))
176+
return createStringError(std::errc::invalid_argument,
177+
"Invalid value for static sampler AddressV");
178+
179+
if (!dxbc::isValidAddress(S.AddressW))
180+
return createStringError(std::errc::invalid_argument,
181+
"Invalid value for static sampler AddressW");
182+
183+
if (!dxbc::isValidComparisonFunc(S.ComparisonFunc))
184+
return createStringError(
185+
std::errc::invalid_argument,
186+
"Invalid value for static sampler ComparisonFunc");
187+
188+
if (!dxbc::isValidBorderColor(S.BorderColor))
189+
return createStringError(std::errc::invalid_argument,
190+
"Invalid value for static sampler BorderColor");
191+
192+
if (!dxbc::isValidShaderVisibility(S.ShaderVisibility))
193+
return createStringError(
194+
std::errc::invalid_argument,
195+
"Invalid value for static sampler ShaderVisibility");
196+
165197
StaticSamplerYamlDesc NewS;
166-
NewS.Filter = S.Filter;
167-
NewS.AddressU = S.AddressU;
168-
NewS.AddressV = S.AddressV;
169-
NewS.AddressW = S.AddressW;
198+
NewS.Filter = dxbc::SamplerFilter(S.Filter);
199+
NewS.AddressU = dxbc::TextureAddressMode(S.AddressU);
200+
NewS.AddressV = dxbc::TextureAddressMode(S.AddressV);
201+
NewS.AddressW = dxbc::TextureAddressMode(S.AddressW);
170202
NewS.MipLODBias = S.MipLODBias;
171203
NewS.MaxAnisotropy = S.MaxAnisotropy;
172-
NewS.ComparisonFunc = S.ComparisonFunc;
173-
NewS.BorderColor = S.BorderColor;
204+
NewS.ComparisonFunc = dxbc::ComparisonFunc(S.ComparisonFunc);
205+
NewS.BorderColor = dxbc::StaticBorderColor(S.BorderColor);
174206
NewS.MinLOD = S.MinLOD;
175207
NewS.MaxLOD = S.MaxLOD;
176208
NewS.ShaderRegister = S.ShaderRegister;
177209
NewS.RegisterSpace = S.RegisterSpace;
178-
NewS.ShaderVisibility = S.ShaderVisibility;
210+
NewS.ShaderVisibility = dxbc::ShaderVisibility(S.ShaderVisibility);
179211

180212
RootSigDesc.StaticSamplers.push_back(NewS);
181213
}
@@ -425,21 +457,21 @@ void MappingContextTraits<DXContainerYAML::RootParameterLocationYaml,
425457
IO.mapRequired("ShaderVisibility", L.Header.Visibility);
426458

427459
switch (L.Header.Type) {
428-
case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): {
460+
case dxbc::RootParameterType::Constants32Bit: {
429461
DXContainerYAML::RootConstantsYaml &Constants =
430462
S.Parameters.getOrInsertConstants(L);
431463
IO.mapRequired("Constants", Constants);
432464
break;
433465
}
434-
case llvm::to_underlying(dxbc::RootParameterType::CBV):
435-
case llvm::to_underlying(dxbc::RootParameterType::SRV):
436-
case llvm::to_underlying(dxbc::RootParameterType::UAV): {
466+
case dxbc::RootParameterType::CBV:
467+
case dxbc::RootParameterType::SRV:
468+
case dxbc::RootParameterType::UAV: {
437469
DXContainerYAML::RootDescriptorYaml &Descriptor =
438470
S.Parameters.getOrInsertDescriptor(L);
439471
IO.mapRequired("Descriptor", Descriptor);
440472
break;
441473
}
442-
case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable): {
474+
case dxbc::RootParameterType::DescriptorTable: {
443475
DXContainerYAML::DescriptorTableYaml &Table =
444476
S.Parameters.getOrInsertTable(L);
445477
IO.mapRequired("Table", Table);
@@ -585,6 +617,55 @@ void ScalarEnumerationTraits<dxbc::SigComponentType>::enumeration(
585617
IO.enumCase(Value, E.Name.str().c_str(), E.Value);
586618
}
587619

620+
void ScalarEnumerationTraits<dxbc::RootParameterType>::enumeration(
621+
IO &IO, dxbc::RootParameterType &Value) {
622+
for (const auto &E : dxbc::getRootParameterTypes())
623+
IO.enumCase(Value, E.Name.str().c_str(), E.Value);
624+
}
625+
626+
void ScalarEnumerationTraits<dxil::ResourceClass>::enumeration(
627+
IO &IO, dxil::ResourceClass &Value) {
628+
const EnumEntry<dxil::ResourceClass> ResourceClasses[] = {
629+
{"CBuffer", dxil::ResourceClass::CBuffer},
630+
{"SRV", dxil::ResourceClass::SRV},
631+
{"UAV", dxil::ResourceClass::UAV},
632+
{"Sampler", dxil::ResourceClass::Sampler},
633+
};
634+
635+
for (const auto &E : ResourceClasses)
636+
IO.enumCase(Value, E.Name.str().c_str(), E.Value);
637+
}
638+
639+
void ScalarEnumerationTraits<dxbc::SamplerFilter>::enumeration(
640+
IO &IO, dxbc::SamplerFilter &Value) {
641+
for (const auto &E : dxbc::getSamplerFilters())
642+
IO.enumCase(Value, E.Name.str().c_str(), E.Value);
643+
}
644+
645+
void ScalarEnumerationTraits<dxbc::StaticBorderColor>::enumeration(
646+
IO &IO, dxbc::StaticBorderColor &Value) {
647+
for (const auto &E : dxbc::getStaticBorderColors())
648+
IO.enumCase(Value, E.Name.str().c_str(), E.Value);
649+
}
650+
651+
void ScalarEnumerationTraits<dxbc::TextureAddressMode>::enumeration(
652+
IO &IO, dxbc::TextureAddressMode &Value) {
653+
for (const auto &E : dxbc::getTextureAddressModes())
654+
IO.enumCase(Value, E.Name.str().c_str(), E.Value);
655+
}
656+
657+
void ScalarEnumerationTraits<dxbc::ShaderVisibility>::enumeration(
658+
IO &IO, dxbc::ShaderVisibility &Value) {
659+
for (const auto &E : dxbc::getShaderVisibility())
660+
IO.enumCase(Value, E.Name.str().c_str(), E.Value);
661+
}
662+
663+
void ScalarEnumerationTraits<dxbc::ComparisonFunc>::enumeration(
664+
IO &IO, dxbc::ComparisonFunc &Value) {
665+
for (const auto &E : dxbc::getComparisonFuncs())
666+
IO.enumCase(Value, E.Name.str().c_str(), E.Value);
667+
}
668+
588669
} // namespace yaml
589670

590671
void DXContainerYAML::PSVInfo::mapInfoForVersion(yaml::IO &IO) {

0 commit comments

Comments
 (0)