@@ -60,7 +60,10 @@ readDescriptorRanges(DXContainerYAML::RootParameterHeaderYaml &Header,
60
60
NewR.NumDescriptors = R.NumDescriptors ;
61
61
NewR.BaseShaderRegister = R.BaseShaderRegister ;
62
62
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 );
64
67
if constexpr (std::is_same_v<T, dxbc::RTS0::v2::DescriptorRange>) {
65
68
// Set all flag fields for v2
66
69
#define DESCRIPTOR_RANGE_FLAG (Num, Enum, Flag ) \
@@ -94,15 +97,14 @@ DXContainerYAML::RootSignatureYamlDesc::create(
94
97
return createStringError (std::errc::invalid_argument,
95
98
" Invalid value for parameter type" );
96
99
97
- RootParameterHeaderYaml Header (PH.ParameterType );
100
+ RootParameterHeaderYaml Header (dxbc::RootParameterType ( PH.ParameterType ) );
98
101
Header.Offset = PH.ParameterOffset ;
99
- Header.Type = PH.ParameterType ;
100
102
101
103
if (!dxbc::isValidShaderVisibility (PH.ShaderVisibility ))
102
104
return createStringError (std::errc::invalid_argument,
103
105
" Invalid value for shader visibility" );
104
106
105
- Header.Visibility = PH.ShaderVisibility ;
107
+ Header.Visibility = dxbc::ShaderVisibility ( PH.ShaderVisibility ) ;
106
108
107
109
llvm::Expected<object::DirectX::RootParameterView> ParamViewOrErr =
108
110
Data.getParameter (PH);
@@ -162,20 +164,50 @@ DXContainerYAML::RootSignatureYamlDesc::create(
162
164
}
163
165
164
166
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
+
165
197
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 ) ;
170
202
NewS.MipLODBias = S.MipLODBias ;
171
203
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 ) ;
174
206
NewS.MinLOD = S.MinLOD ;
175
207
NewS.MaxLOD = S.MaxLOD ;
176
208
NewS.ShaderRegister = S.ShaderRegister ;
177
209
NewS.RegisterSpace = S.RegisterSpace ;
178
- NewS.ShaderVisibility = S.ShaderVisibility ;
210
+ NewS.ShaderVisibility = dxbc::ShaderVisibility ( S.ShaderVisibility ) ;
179
211
180
212
RootSigDesc.StaticSamplers .push_back (NewS);
181
213
}
@@ -425,21 +457,21 @@ void MappingContextTraits<DXContainerYAML::RootParameterLocationYaml,
425
457
IO.mapRequired (" ShaderVisibility" , L.Header .Visibility );
426
458
427
459
switch (L.Header .Type ) {
428
- case llvm::to_underlying ( dxbc::RootParameterType::Constants32Bit) : {
460
+ case dxbc::RootParameterType::Constants32Bit: {
429
461
DXContainerYAML::RootConstantsYaml &Constants =
430
462
S.Parameters .getOrInsertConstants (L);
431
463
IO.mapRequired (" Constants" , Constants);
432
464
break ;
433
465
}
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: {
437
469
DXContainerYAML::RootDescriptorYaml &Descriptor =
438
470
S.Parameters .getOrInsertDescriptor (L);
439
471
IO.mapRequired (" Descriptor" , Descriptor);
440
472
break ;
441
473
}
442
- case llvm::to_underlying ( dxbc::RootParameterType::DescriptorTable) : {
474
+ case dxbc::RootParameterType::DescriptorTable: {
443
475
DXContainerYAML::DescriptorTableYaml &Table =
444
476
S.Parameters .getOrInsertTable (L);
445
477
IO.mapRequired (" Table" , Table);
@@ -585,6 +617,55 @@ void ScalarEnumerationTraits<dxbc::SigComponentType>::enumeration(
585
617
IO.enumCase (Value, E.Name .str ().c_str (), E.Value );
586
618
}
587
619
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
+
588
669
} // namespace yaml
589
670
590
671
void DXContainerYAML::PSVInfo::mapInfoForVersion (yaml::IO &IO) {
0 commit comments