@@ -53,15 +53,15 @@ DXContainerYAML::RootSignatureYamlDesc::create(
53
53
return createStringError (std::errc::invalid_argument,
54
54
" Invalid value for parameter type" );
55
55
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 ;
59
59
60
60
if (!dxbc::isValidShaderVisibility (PH.ShaderVisibility ))
61
61
return createStringError (std::errc::invalid_argument,
62
62
" Invalid value for shader visibility" );
63
63
64
- NewP .Visibility = PH.ShaderVisibility ;
64
+ Header .Visibility = PH.ShaderVisibility ;
65
65
66
66
llvm::Expected<object::DirectX::RootParameterView> ParamViewOrErr =
67
67
Data.getParameter (PH);
@@ -75,29 +75,36 @@ DXContainerYAML::RootSignatureYamlDesc::create(
75
75
return std::move (E);
76
76
77
77
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 ;
78
85
79
- NewP.Constants .Num32BitValues = Constants.Num32BitValues ;
80
- NewP.Constants .ShaderRegister = Constants.ShaderRegister ;
81
- NewP.Constants .RegisterSpace = Constants.RegisterSpace ;
82
86
} else if (auto *RDV =
83
87
dyn_cast<object::DirectX::RootDescriptorView>(&ParamView)) {
84
88
llvm::Expected<dxbc::RTS0::v2::RootDescriptor> DescriptorOrErr =
85
89
RDV->read (Version);
86
90
if (Error E = DescriptorOrErr.takeError ())
87
91
return std::move (E);
88
92
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 ;
91
100
if (Version > 1 ) {
92
101
#define ROOT_DESCRIPTOR_FLAG (Num, Val ) \
93
- NewP. Descriptor . Val = \
102
+ YamlDescriptor. Val = \
94
103
(Descriptor.Flags & \
95
104
llvm::to_underlying (dxbc::RootDescriptorFlag::Val)) > 0 ;
96
105
#include " llvm/BinaryFormat/DXContainerConstants.def"
97
106
}
98
107
}
99
-
100
- RootSigDesc.Parameters .push_back (NewP);
101
108
}
102
109
#define ROOT_ELEMENT_FLAG (Num, Val ) \
103
110
RootSigDesc.Val = \
@@ -290,11 +297,36 @@ void MappingTraits<DXContainerYAML::RootSignatureYamlDesc>::mapping(
290
297
IO.mapRequired (" RootParametersOffset" , S.RootParametersOffset );
291
298
IO.mapRequired (" NumStaticSamplers" , S.NumStaticSamplers );
292
299
IO.mapRequired (" StaticSamplersOffset" , S.StaticSamplersOffset );
293
- IO.mapRequired (" Parameters" , S.Parameters );
300
+ IO.mapRequired (" Parameters" , S.Parameters . Locations , S );
294
301
#define ROOT_ELEMENT_FLAG (Num, Val ) IO.mapOptional(#Val, S.Val, false );
295
302
#include " llvm/BinaryFormat/DXContainerConstants.def"
296
303
}
297
304
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
+
298
330
void MappingTraits<llvm::DXContainerYAML::RootConstantsYaml>::mapping(
299
331
IO &IO, llvm::DXContainerYAML::RootConstantsYaml &C) {
300
332
IO.mapRequired (" Num32BitValues" , C.Num32BitValues );
@@ -310,23 +342,6 @@ void MappingTraits<llvm::DXContainerYAML::RootDescriptorYaml>::mapping(
310
342
#include " llvm/BinaryFormat/DXContainerConstants.def"
311
343
}
312
344
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
-
330
345
void MappingTraits<DXContainerYAML::Part>::mapping(IO &IO,
331
346
DXContainerYAML::Part &P) {
332
347
IO.mapRequired (" Name" , P.Name );
0 commit comments