@@ -53,15 +53,15 @@ DXContainerYAML::RootSignatureYamlDesc::create(
5353 return createStringError (std::errc::invalid_argument,
5454 " Invalid value for parameter type" );
5555
56- RootParameterYamlDesc NewP (PH.ParameterType );
57- NewP .Offset = PH.ParameterOffset ;
58- NewP .Type = PH.ParameterType ;
56+ RootParameterHeaderYaml Header (PH.ParameterType );
57+ Header .Offset = PH.ParameterOffset ;
58+ Header .Type = PH.ParameterType ;
5959
6060 if (!dxbc::isValidShaderVisibility (PH.ShaderVisibility ))
6161 return createStringError (std::errc::invalid_argument,
6262 " Invalid value for shader visibility" );
6363
64- NewP .Visibility = PH.ShaderVisibility ;
64+ Header .Visibility = PH.ShaderVisibility ;
6565
6666 llvm::Expected<object::DirectX::RootParameterView> ParamViewOrErr =
6767 Data.getParameter (PH);
@@ -75,29 +75,36 @@ DXContainerYAML::RootSignatureYamlDesc::create(
7575 return std::move (E);
7676
7777 auto Constants = *ConstantsOrErr;
78+ RootParameterLocationYaml Location (Header);
79+ RootConstantsYaml &ConstantYaml =
80+ RootSigDesc.Parameters .getOrInsertConstants (Location);
81+ RootSigDesc.Parameters .insertLocation (Location);
82+ ConstantYaml.Num32BitValues = Constants.Num32BitValues ;
83+ ConstantYaml.ShaderRegister = Constants.ShaderRegister ;
84+ ConstantYaml.RegisterSpace = Constants.RegisterSpace ;
7885
79- NewP.Constants .Num32BitValues = Constants.Num32BitValues ;
80- NewP.Constants .ShaderRegister = Constants.ShaderRegister ;
81- NewP.Constants .RegisterSpace = Constants.RegisterSpace ;
8286 } else if (auto *RDV =
8387 dyn_cast<object::DirectX::RootDescriptorView>(&ParamView)) {
8488 llvm::Expected<dxbc::RTS0::v2::RootDescriptor> DescriptorOrErr =
8589 RDV->read (Version);
8690 if (Error E = DescriptorOrErr.takeError ())
8791 return std::move (E);
8892 auto Descriptor = *DescriptorOrErr;
89- NewP.Descriptor .ShaderRegister = Descriptor.ShaderRegister ;
90- NewP.Descriptor .RegisterSpace = Descriptor.RegisterSpace ;
93+ RootParameterLocationYaml Location (Header);
94+ RootDescriptorYaml &YamlDescriptor =
95+ RootSigDesc.Parameters .getOrInsertDescriptor (Location);
96+ RootSigDesc.Parameters .insertLocation (Location);
97+
98+ YamlDescriptor.ShaderRegister = Descriptor.ShaderRegister ;
99+ YamlDescriptor.RegisterSpace = Descriptor.RegisterSpace ;
91100 if (Version > 1 ) {
92101#define ROOT_DESCRIPTOR_FLAG (Num, Val ) \
93- NewP. Descriptor . Val = \
102+ YamlDescriptor. Val = \
94103 (Descriptor.Flags & \
95104 llvm::to_underlying (dxbc::RootDescriptorFlag::Val)) > 0 ;
96105#include " llvm/BinaryFormat/DXContainerConstants.def"
97106 }
98107 }
99-
100- RootSigDesc.Parameters .push_back (NewP);
101108 }
102109#define ROOT_ELEMENT_FLAG (Num, Val ) \
103110 RootSigDesc.Val = \
@@ -290,11 +297,36 @@ void MappingTraits<DXContainerYAML::RootSignatureYamlDesc>::mapping(
290297 IO.mapRequired (" RootParametersOffset" , S.RootParametersOffset );
291298 IO.mapRequired (" NumStaticSamplers" , S.NumStaticSamplers );
292299 IO.mapRequired (" StaticSamplersOffset" , S.StaticSamplersOffset );
293- IO.mapRequired (" Parameters" , S.Parameters );
300+ IO.mapRequired (" Parameters" , S.Parameters . Locations , S );
294301#define ROOT_ELEMENT_FLAG (Num, Val ) IO.mapOptional(#Val, S.Val, false );
295302#include " llvm/BinaryFormat/DXContainerConstants.def"
296303}
297304
305+ void MappingContextTraits<DXContainerYAML::RootParameterLocationYaml,
306+ DXContainerYAML::RootSignatureYamlDesc>::
307+ mapping (IO &IO, DXContainerYAML::RootParameterLocationYaml &L,
308+ DXContainerYAML::RootSignatureYamlDesc &S) {
309+ IO.mapRequired (" ParameterType" , L.Header .Type );
310+ IO.mapRequired (" ShaderVisibility" , L.Header .Visibility );
311+
312+ switch (L.Header .Type ) {
313+ case llvm::to_underlying (dxbc::RootParameterType::Constants32Bit): {
314+ DXContainerYAML::RootConstantsYaml &Constants =
315+ S.Parameters .getOrInsertConstants (L);
316+ IO.mapRequired (" Constants" , Constants);
317+ break ;
318+ }
319+ case llvm::to_underlying (dxbc::RootParameterType::CBV):
320+ case llvm::to_underlying (dxbc::RootParameterType::SRV):
321+ case llvm::to_underlying (dxbc::RootParameterType::UAV): {
322+ DXContainerYAML::RootDescriptorYaml &Descriptor =
323+ S.Parameters .getOrInsertDescriptor (L);
324+ IO.mapRequired (" Descriptor" , Descriptor);
325+ break ;
326+ }
327+ }
328+ }
329+
298330void MappingTraits<llvm::DXContainerYAML::RootConstantsYaml>::mapping(
299331 IO &IO, llvm::DXContainerYAML::RootConstantsYaml &C) {
300332 IO.mapRequired (" Num32BitValues" , C.Num32BitValues );
@@ -310,23 +342,6 @@ void MappingTraits<llvm::DXContainerYAML::RootDescriptorYaml>::mapping(
310342#include " llvm/BinaryFormat/DXContainerConstants.def"
311343}
312344
313- void MappingTraits<llvm::DXContainerYAML::RootParameterYamlDesc>::mapping(
314- IO &IO, llvm::DXContainerYAML::RootParameterYamlDesc &P) {
315- IO.mapRequired (" ParameterType" , P.Type );
316- IO.mapRequired (" ShaderVisibility" , P.Visibility );
317-
318- switch (P.Type ) {
319- case llvm::to_underlying (dxbc::RootParameterType::Constants32Bit):
320- IO.mapRequired (" Constants" , P.Constants );
321- break ;
322- case llvm::to_underlying (dxbc::RootParameterType::CBV):
323- case llvm::to_underlying (dxbc::RootParameterType::SRV):
324- case llvm::to_underlying (dxbc::RootParameterType::UAV):
325- IO.mapRequired (" Descriptor" , P.Descriptor );
326- break ;
327- }
328- }
329-
330345void MappingTraits<DXContainerYAML::Part>::mapping(IO &IO,
331346 DXContainerYAML::Part &P) {
332347 IO.mapRequired (" Name" , P.Name );
0 commit comments