@@ -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
590671void DXContainerYAML::PSVInfo::mapInfoForVersion (yaml::IO &IO) {
0 commit comments