[llvm] [HLSL] Add descriptor table metadata parsing (PR #142492)
Justin Bogner via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 18 13:33:28 PDT 2025
================
@@ -391,58 +564,68 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
OS << "Definition for '" << F.getName() << "':\n";
// start root signature header
- Space++;
- OS << indent(Space) << "Flags: " << format_hex(RS.Flags, 8) << "\n";
- OS << indent(Space) << "Version: " << RS.Version << "\n";
- OS << indent(Space) << "RootParametersOffset: " << RS.RootParameterOffset
- << "\n";
- OS << indent(Space) << "NumParameters: " << RS.ParametersContainer.size()
- << "\n";
- Space++;
+ OS << "Flags: " << format_hex(RS.Flags, 8) << "\n";
+ OS << "Version: " << RS.Version << "\n";
+ OS << "RootParametersOffset: " << RS.RootParameterOffset << "\n";
+ OS << "NumParameters: " << RS.ParametersContainer.size() << "\n";
for (size_t I = 0; I < RS.ParametersContainer.size(); I++) {
const auto &[Type, Loc] =
RS.ParametersContainer.getTypeAndLocForParameter(I);
const dxbc::RTS0::v1::RootParameterHeader Header =
RS.ParametersContainer.getHeader(I);
- OS << indent(Space) << "- Parameter Type: " << Type << "\n";
- OS << indent(Space + 2)
- << "Shader Visibility: " << Header.ShaderVisibility << "\n";
+ OS << "- Parameter Type: " << Type << "\n";
+ OS << indent(2) << "Shader Visibility: " << Header.ShaderVisibility
+ << "\n";
switch (Type) {
case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): {
const dxbc::RTS0::v1::RootConstants &Constants =
RS.ParametersContainer.getConstant(Loc);
- OS << indent(Space + 2) << "Register Space: " << Constants.RegisterSpace
+ OS << indent(2) << "Register Space: " << Constants.RegisterSpace
+ << "\n";
+ OS << indent(2) << "Shader Register: " << Constants.ShaderRegister
+ << "\n";
+ OS << indent(2) << "Num 32 Bit Values: " << Constants.Num32BitValues
<< "\n";
- OS << indent(Space + 2)
- << "Shader Register: " << Constants.ShaderRegister << "\n";
- OS << indent(Space + 2)
- << "Num 32 Bit Values: " << Constants.Num32BitValues << "\n";
break;
}
case llvm::to_underlying(dxbc::RootParameterType::CBV):
case llvm::to_underlying(dxbc::RootParameterType::UAV):
case llvm::to_underlying(dxbc::RootParameterType::SRV): {
const dxbc::RTS0::v2::RootDescriptor &Descriptor =
RS.ParametersContainer.getRootDescriptor(Loc);
- OS << indent(Space + 2)
- << "Register Space: " << Descriptor.RegisterSpace << "\n";
- OS << indent(Space + 2)
- << "Shader Register: " << Descriptor.ShaderRegister << "\n";
+ OS << indent(2) << "Register Space: " << Descriptor.RegisterSpace
+ << "\n";
+ OS << indent(2) << "Shader Register: " << Descriptor.ShaderRegister
+ << "\n";
if (RS.Version > 1)
- OS << indent(Space + 2) << "Flags: " << Descriptor.Flags << "\n";
+ OS << indent(2) << "Flags: " << Descriptor.Flags << "\n";
+ break;
+ }
+ case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable): {
+ const mcdxbc::DescriptorTable &Table =
+ RS.ParametersContainer.getDescriptorTable(Loc);
+ OS << indent(2) << "NumRanges: " << Table.Ranges.size() << "\n";
+
+ for (const dxbc::RTS0::v2::DescriptorRange Range : Table) {
+ OS << indent(2) << "- Range Type: " << Range.RangeType << "\n";
+ OS << indent(4) << "Register Space: " << Range.RegisterSpace << "\n";
+ OS << indent(4)
+ << "Base Shader Register: " << Range.BaseShaderRegister << "\n";
+ OS << indent(4) << "Num Descriptors: " << Range.NumDescriptors
+ << "\n";
+ OS << indent(4) << "Offset In Descriptors From Table Start: "
+ << Range.OffsetInDescriptorsFromTableStart << "\n";
+ if (RS.Version > 1)
+ OS << indent(4) << "Flags: " << Range.Flags << "\n";
----------------
bogner wrote:
Maybe it's just me, but I find using the `indent()` function with a small constant to be quite a bit less clear than just putting the spaces in the strings. Consider:
```c++
OS << " - Range Type: " << Range.RangeType << "\n"
<< " Register Space: " << Range.RegisterSpace << "\n"
<< " Base Shader Register: " << Range.BaseShaderRegister << "\n"
<< " Num Descriptors: " << Range.NumDescriptors << "\n"
<< " Offset In Descriptors From Table Start: "
<< Range.OffsetInDescriptorsFromTableStart << "\n";
if (RS.Version > 1)
OS << " Flags: " << Range.Flags << "\n";
```
Here, you can see how the strings line up just by looking at them. Though admittedly it can get a bit messier with longer lines. IMO `indent()` is mostly useful when the indentation varies depending on context, or is large enough that just writing it out makes things less readable.
https://github.com/llvm/llvm-project/pull/142492
More information about the llvm-commits
mailing list