@@ -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,19 +75,24 @@ DXContainerYAML::RootSignatureYamlDesc::create(
7575 return std::move (E);
7676
7777 auto Constants = *ConstantsOrErr;
78- RootConstantsYaml ConstantYaml;
78+ RootParameterLocationYaml Location (Header);
79+ RootConstantsYaml &ConstantYaml = RootSigDesc.Parameters .getOrInsertConstants (Location);
80+ RootSigDesc.Parameters .addLocation (Location);
7981 ConstantYaml.Num32BitValues = Constants.Num32BitValues ;
8082 ConstantYaml.ShaderRegister = Constants.ShaderRegister ;
8183 ConstantYaml.RegisterSpace = Constants.RegisterSpace ;
82- NewP. Data = ConstantYaml;
84+
8385 } else if (auto *RDV =
8486 dyn_cast<object::DirectX::RootDescriptorView>(&ParamView)) {
8587 llvm::Expected<dxbc::RTS0::v2::RootDescriptor> DescriptorOrErr =
8688 RDV->read (Version);
8789 if (Error E = DescriptorOrErr.takeError ())
8890 return std::move (E);
8991 auto Descriptor = *DescriptorOrErr;
90- RootDescriptorYaml YamlDescriptor;
92+ RootParameterLocationYaml Location (Header);
93+ RootDescriptorYaml &YamlDescriptor = RootSigDesc.Parameters .getOrInsertDescriptor (Location);
94+ RootSigDesc.Parameters .addLocation (Location);
95+
9196 YamlDescriptor.ShaderRegister = Descriptor.ShaderRegister ;
9297 YamlDescriptor.RegisterSpace = Descriptor.RegisterSpace ;
9398 if (Version > 1 ) {
@@ -97,10 +102,7 @@ DXContainerYAML::RootSignatureYamlDesc::create(
97102 llvm::to_underlying (dxbc::RootDescriptorFlag::Val)) > 0 ;
98103#include " llvm/BinaryFormat/DXContainerConstants.def"
99104 }
100- NewP.Data = YamlDescriptor;
101105 }
102-
103- RootSigDesc.Parameters .push_back (NewP);
104106 }
105107#define ROOT_ELEMENT_FLAG (Num, Val ) \
106108 RootSigDesc.Val = \
@@ -293,11 +295,31 @@ void MappingTraits<DXContainerYAML::RootSignatureYamlDesc>::mapping(
293295 IO.mapRequired (" RootParametersOffset" , S.RootParametersOffset );
294296 IO.mapRequired (" NumStaticSamplers" , S.NumStaticSamplers );
295297 IO.mapRequired (" StaticSamplersOffset" , S.StaticSamplersOffset );
296- IO.mapRequired (" Parameters" , S.Parameters );
298+ IO.mapRequired (" Parameters" , S.Parameters . Locations , S );
297299#define ROOT_ELEMENT_FLAG (Num, Val ) IO.mapOptional(#Val, S.Val, false );
298300#include " llvm/BinaryFormat/DXContainerConstants.def"
299301}
300302
303+ void MappingContextTraits<DXContainerYAML::RootParameterLocationYaml, DXContainerYAML::RootSignatureYamlDesc>::mapping(IO &IO, DXContainerYAML::RootParameterLocationYaml &L, DXContainerYAML::RootSignatureYamlDesc &S) {
304+ IO.mapRequired (" ParameterType" , L.Header .Type );
305+ IO.mapRequired (" ShaderVisibility" , L.Header .Visibility );
306+
307+ switch (L.Header .Type ) {
308+ case llvm::to_underlying (dxbc::RootParameterType::Constants32Bit): {
309+ DXContainerYAML::RootConstantsYaml &Constants = S.Parameters .getOrInsertConstants (L);
310+ IO.mapRequired (" Constants" , Constants);
311+ break ;
312+ }
313+ case llvm::to_underlying (dxbc::RootParameterType::CBV):
314+ case llvm::to_underlying (dxbc::RootParameterType::SRV):
315+ case llvm::to_underlying (dxbc::RootParameterType::UAV):{
316+ DXContainerYAML::RootDescriptorYaml &Descriptor = S.Parameters .getOrInsertDescriptor (L);
317+ IO.mapRequired (" Descriptor" , Descriptor);
318+ break ;
319+ }
320+ }
321+
322+ }
301323void MappingTraits<llvm::DXContainerYAML::RootConstantsYaml>::mapping(
302324 IO &IO, llvm::DXContainerYAML::RootConstantsYaml &C) {
303325 IO.mapRequired (" Num32BitValues" , C.Num32BitValues );
@@ -313,33 +335,6 @@ void MappingTraits<llvm::DXContainerYAML::RootDescriptorYaml>::mapping(
313335#include " llvm/BinaryFormat/DXContainerConstants.def"
314336}
315337
316- void MappingTraits<llvm::DXContainerYAML::RootParameterYamlDesc>::mapping(
317- IO &IO, llvm::DXContainerYAML::RootParameterYamlDesc &P) {
318- IO.mapRequired (" ParameterType" , P.Type );
319- IO.mapRequired (" ShaderVisibility" , P.Visibility );
320-
321- switch (P.Type ) {
322- case llvm::to_underlying (dxbc::RootParameterType::Constants32Bit): {
323- DXContainerYAML::RootConstantsYaml Constants;
324- if (IO.outputting ())
325- Constants = std::get<DXContainerYAML::RootConstantsYaml>(P.Data );
326- IO.mapRequired (" Constants" , Constants);
327- if (!IO.outputting ())
328- P.Data = Constants;
329- } break ;
330- case llvm::to_underlying (dxbc::RootParameterType::CBV):
331- case llvm::to_underlying (dxbc::RootParameterType::SRV):
332- case llvm::to_underlying (dxbc::RootParameterType::UAV): {
333- DXContainerYAML::RootDescriptorYaml Descriptor;
334- if (IO.outputting ())
335- Descriptor = std::get<DXContainerYAML::RootDescriptorYaml>(P.Data );
336- IO.mapRequired (" Descriptor" , Descriptor);
337- if (!IO.outputting ())
338- P.Data = Descriptor;
339- } break ;
340- }
341- }
342-
343338void MappingTraits<DXContainerYAML::Part>::mapping(IO &IO,
344339 DXContainerYAML::Part &P) {
345340 IO.mapRequired (" Name" , P.Name );
0 commit comments