@@ -75,31 +75,34 @@ static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
7575 if (RootConstantNode->getNumOperands () != 5 )
7676 return reportError (Ctx, " Invalid format for RootConstants Element" );
7777
78- mcdxbc::RootParameter NewParameter;
79- NewParameter.Header .ParameterType =
78+ dxbc::RootParameterHeader Header;
79+ // The parameter offset doesn't matter here - we recalculate it during
80+ // serialization Header.ParameterOffset = 0;
81+ Header.ParameterType =
8082 llvm::to_underlying (dxbc::RootParameterType::Constants32Bit);
8183
8284 if (std::optional<uint32_t > Val = extractMdIntValue (RootConstantNode, 1 ))
83- NewParameter. Header .ShaderVisibility = *Val;
85+ Header.ShaderVisibility = *Val;
8486 else
8587 return reportError (Ctx, " Invalid value for ShaderVisibility" );
8688
89+ dxbc::RootConstants Constants;
8790 if (std::optional<uint32_t > Val = extractMdIntValue (RootConstantNode, 2 ))
88- NewParameter. Constants .ShaderRegister = *Val;
91+ Constants.ShaderRegister = *Val;
8992 else
9093 return reportError (Ctx, " Invalid value for ShaderRegister" );
9194
9295 if (std::optional<uint32_t > Val = extractMdIntValue (RootConstantNode, 3 ))
93- NewParameter. Constants .RegisterSpace = *Val;
96+ Constants.RegisterSpace = *Val;
9497 else
9598 return reportError (Ctx, " Invalid value for RegisterSpace" );
9699
97100 if (std::optional<uint32_t > Val = extractMdIntValue (RootConstantNode, 4 ))
98- NewParameter. Constants .Num32BitValues = *Val;
101+ Constants.Num32BitValues = *Val;
99102 else
100103 return reportError (Ctx, " Invalid value for Num32BitValues" );
101104
102- RSD.Parameters . push_back (NewParameter );
105+ RSD.ParametersContainer . addParameter (Header, Constants );
103106
104107 return false ;
105108}
@@ -164,12 +167,12 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
164167 return reportValueError (Ctx, " RootFlags" , RSD.Flags );
165168 }
166169
167- for (const mcdxbc::RootParameter &P : RSD.Parameters ) {
168- if (!dxbc::isValidShaderVisibility (P .Header .ShaderVisibility ))
170+ for (const mcdxbc::RootParameterInfo &Info : RSD.ParametersContainer ) {
171+ if (!dxbc::isValidShaderVisibility (Info .Header .ShaderVisibility ))
169172 return reportValueError (Ctx, " ShaderVisibility" ,
170- P .Header .ShaderVisibility );
173+ Info .Header .ShaderVisibility );
171174
172- assert (dxbc::isValidParameterType (P .Header .ParameterType ) &&
175+ assert (dxbc::isValidParameterType (Info .Header .ParameterType ) &&
173176 " Invalid value for ParameterType" );
174177 }
175178
@@ -287,33 +290,40 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
287290 OS << indent (Space) << " Version: " << RS.Version << " \n " ;
288291 OS << indent (Space) << " RootParametersOffset: " << RS.RootParameterOffset
289292 << " \n " ;
290- OS << indent (Space) << " NumParameters: " << RS.Parameters .size () << " \n " ;
293+ OS << indent (Space) << " NumParameters: " << RS.ParametersContainer .size ()
294+ << " \n " ;
291295 Space++;
292- for (auto const &P : RS.Parameters ) {
293- OS << indent (Space) << " - Parameter Type: " << P.Header .ParameterType
294- << " \n " ;
296+ for (size_t I = 0 ; I < RS.ParametersContainer .size (); I++) {
297+ const auto &[Type, Loc] =
298+ RS.ParametersContainer .getTypeAndLocForParameter (I);
299+ const dxbc::RootParameterHeader Header =
300+ RS.ParametersContainer .getHeader (I);
301+
302+ OS << indent (Space) << " - Parameter Type: " << Type << " \n " ;
295303 OS << indent (Space + 2 )
296- << " Shader Visibility: " << P.Header .ShaderVisibility << " \n " ;
297- switch (P.Header .ParameterType ) {
298- case llvm::to_underlying (dxbc::RootParameterType::Constants32Bit):
299- OS << indent (Space + 2 )
300- << " Register Space: " << P.Constants .RegisterSpace << " \n " ;
304+ << " Shader Visibility: " << Header.ShaderVisibility << " \n " ;
305+
306+ switch (Type) {
307+ case llvm::to_underlying (dxbc::RootParameterType::Constants32Bit): {
308+ const dxbc::RootConstants &Constants =
309+ RS.ParametersContainer .getConstant (Loc);
310+ OS << indent (Space + 2 ) << " Register Space: " << Constants.RegisterSpace
311+ << " \n " ;
301312 OS << indent (Space + 2 )
302- << " Shader Register: " << P. Constants .ShaderRegister << " \n " ;
313+ << " Shader Register: " << Constants.ShaderRegister << " \n " ;
303314 OS << indent (Space + 2 )
304- << " Num 32 Bit Values: " << P.Constants .Num32BitValues << " \n " ;
305- break ;
315+ << " Num 32 Bit Values: " << Constants.Num32BitValues << " \n " ;
306316 }
317+ }
318+ Space--;
307319 }
308- Space--;
309320 OS << indent (Space) << " NumStaticSamplers: " << 0 << " \n " ;
310321 OS << indent (Space) << " StaticSamplersOffset: " << RS.StaticSamplersOffset
311322 << " \n " ;
312323
313324 Space--;
314325 // end root signature header
315326 }
316-
317327 return PreservedAnalyses::all ();
318328}
319329
0 commit comments