-
Notifications
You must be signed in to change notification settings - Fork 14.8k
[NFC] Refactoring MCDXBC to support out of order storage of root parameters #137284
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 22 commits
0abacfc
8b8c02a
7ac9641
c105458
efe76aa
a928e9d
a38f10b
9a7c359
d6c2b55
93e4cf2
b45b1b6
f804a23
15eb6f5
b9d7f07
46cc8c1
1b3e10a
1f31957
e8fbfce
a31e5a5
a394ad0
ad415a7
8ff4845
d67f7d3
5453ad0
836a8a8
5bd57a6
960cb9c
a60c7a3
2a4c2cb
c29d3f2
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -9,18 +9,81 @@ | |
#include "llvm/BinaryFormat/DXContainer.h" | ||
#include <cstdint> | ||
#include <limits> | ||
#include <variant> | ||
|
||
namespace llvm { | ||
|
||
class raw_ostream; | ||
namespace mcdxbc { | ||
|
||
struct RootParameter { | ||
struct RootParameterInfo { | ||
dxbc::RootParameterHeader Header; | ||
union { | ||
dxbc::RootConstants Constants; | ||
dxbc::RTS0::v2::RootDescriptor Descriptor; | ||
}; | ||
size_t Location; | ||
|
||
RootParameterInfo() = default; | ||
|
||
RootParameterInfo(dxbc::RootParameterHeader H, size_t L) | ||
: Header(H), Location(L) {} | ||
}; | ||
|
||
using RootDescriptor = std::variant<dxbc::RTS0::v1::RootDescriptor, | ||
dxbc::RTS0::v2::RootDescriptor>; | ||
using ParametersView = std::variant<const dxbc::RootConstants *, | ||
const dxbc::RTS0::v1::RootDescriptor *, | ||
const dxbc::RTS0::v2::RootDescriptor *>; | ||
struct RootParametersContainer { | ||
SmallVector<RootParameterInfo> ParametersInfo; | ||
|
||
SmallVector<dxbc::RootConstants> Constants; | ||
SmallVector<RootDescriptor> Descriptors; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We're not tied to the binary format itself here, so I think it would be quite a bit simpler to just have this vector contain the SmallVector<dxbc::RTS0::v2::RootDescriptor> Descriptors; This should end up simplifying support::endian::write(BOS, Descriptor.ShaderRegister,
llvm::endianness::little);
support::endian::write(BOS, Descriptor.RegisterSpace,
llvm::endianness::little);
if (Version > 1)
support::endian::write(BOS, Descriptor.Flags, llvm::endianness::little); |
||
|
||
void addInfo(dxbc::RootParameterHeader H, size_t L) { | ||
ParametersInfo.push_back(RootParameterInfo(H, L)); | ||
} | ||
|
||
void addParameter(dxbc::RootParameterHeader H, dxbc::RootConstants C) { | ||
addInfo(H, Constants.size()); | ||
Constants.push_back(C); | ||
} | ||
|
||
void addParameter(dxbc::RootParameterHeader H, | ||
dxbc::RTS0::v1::RootDescriptor D) { | ||
addInfo(H, Descriptors.size()); | ||
Descriptors.push_back(D); | ||
} | ||
|
||
void addParameter(dxbc::RootParameterHeader H, | ||
dxbc::RTS0::v2::RootDescriptor D) { | ||
addInfo(H, Descriptors.size()); | ||
Descriptors.push_back(D); | ||
} | ||
|
||
std::optional<ParametersView> getParameter(const RootParameterInfo *H) const { | ||
switch (H->Header.ParameterType) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is this switch exhaustive? If it is then do we need to make the return optional? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, is using an optional necessary here? Is the nullopt case reachable? If it should not be reachable likely best to use an llvm_unreachable instead. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Optional is necessary here, because yaml2obj needs to be able to write invalid root signatures representations, since we used it as a testing tool. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't understand, can you elaborate. What does writing an invalid root signature look like and how does it interact with this code? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sure. Some context, Root Parameters are split into a Header and a Data section. The Header contains a RootParameter type field, specifying which kind of data is being stored: Root Constants, Root Descriptors or Descriptor Tables. The header also contains an offset, pointing to the exact location of the data in the binary file. Here is an test example showing what an invalid root signature look like: https://github.com/llvm/llvm-project/blob/038d357dde4907d39f6a3fabbaf48dc39cf9dc60/llvm/test/ObjectYAML/DXContainer/RootSignature-InvalidType.yaml. Notice that in such test there is no data section, only the header section. Since I don't know what kind of data it is/the data is not supported, it is not possible to write it. |
||
case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): | ||
return &Constants[H->Location]; | ||
case llvm::to_underlying(dxbc::RootParameterType::CBV): | ||
case llvm::to_underlying(dxbc::RootParameterType::SRV): | ||
case llvm::to_underlying(dxbc::RootParameterType::UAV): | ||
const RootDescriptor &VersionedParam = Descriptors[H->Location]; | ||
if (std::holds_alternative<dxbc::RTS0::v1::RootDescriptor>( | ||
VersionedParam)) { | ||
return &std::get<dxbc::RTS0::v1::RootDescriptor>(VersionedParam); | ||
} | ||
return &std::get<dxbc::RTS0::v2::RootDescriptor>(VersionedParam); | ||
} | ||
|
||
return std::nullopt; | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm not really convinced that the abstraction that the const std::pair<uint32_t, uint32_t>
getTypeAndLocForParameter(uint32_t Index) const {
const RootParameterInfo &Info = ParametersInfo[Index];
return {Info.Header.ParameterType, Info.Location};
}
const dxbc::RootConstants &getConstant(size_t Index) const {
return Constants[Index];
}
const dxbc::RTS0::v2::RootDescriptor &getRootDescriptor(size_t Index) const {
return Descriptors[Index];
} The logic to use this is more or less the same - instead of the - auto P = ParametersContainer.getParameter(ParametersContainer[I]);
- if (std::holds_alternative<const dxbc::RootConstants *>(P.value())) {
- auto *Constants = std::get<const dxbc::RootConstants *>(P.value());
- support::endian::write(BOS, Constants->ShaderRegister,
- llvm::endianness::little);
+ const auto &[Type, Loc] = ParametersContainer.getTypeAndLocForParameter(I);
+ switch (Type) {
+ case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): {
+ const dxbc::RootConstants &Constants =
+ ParametersContainer.getConstant(Loc);
+ support::endian::write(BOS, Constants.ShaderRegister,
+ llvm::endianness::little); I think |
||
|
||
size_t size() const { return ParametersInfo.size(); } | ||
|
||
SmallVector<RootParameterInfo>::const_iterator begin() const { | ||
return ParametersInfo.begin(); | ||
} | ||
SmallVector<RootParameterInfo>::const_iterator end() const { | ||
return ParametersInfo.end(); | ||
} | ||
}; | ||
struct RootSignatureDesc { | ||
|
||
|
@@ -29,7 +92,7 @@ struct RootSignatureDesc { | |
uint32_t RootParameterOffset = 0U; | ||
uint32_t StaticSamplersOffset = 0u; | ||
uint32_t NumStaticSamplers = 0u; | ||
SmallVector<mcdxbc::RootParameter> Parameters; | ||
mcdxbc::RootParametersContainer ParametersContainer; | ||
|
||
void write(raw_ostream &OS) const; | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -94,7 +94,7 @@ struct RootParameterYamlDesc { | |
uint32_t Type; | ||
uint32_t Visibility; | ||
uint32_t Offset; | ||
RootParameterYamlDesc() {}; | ||
RootParameterYamlDesc(){}; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Looks like an accidental reformat here. |
||
RootParameterYamlDesc(uint32_t T) : Type(T) { | ||
switch (T) { | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -30,24 +30,20 @@ static void rewriteOffsetToCurrentByte(raw_svector_ostream &Stream, | |
|
||
size_t RootSignatureDesc::getSize() const { | ||
size_t Size = sizeof(dxbc::RootSignatureHeader) + | ||
Parameters.size() * sizeof(dxbc::RootParameterHeader); | ||
ParametersContainer.size() * sizeof(dxbc::RootParameterHeader); | ||
|
||
for (const mcdxbc::RootParameter &P : Parameters) { | ||
switch (P.Header.ParameterType) { | ||
case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): | ||
Size += sizeof(dxbc::RootConstants); | ||
break; | ||
case llvm::to_underlying(dxbc::RootParameterType::CBV): | ||
case llvm::to_underlying(dxbc::RootParameterType::SRV): | ||
case llvm::to_underlying(dxbc::RootParameterType::UAV): | ||
if (Version == 1) | ||
Size += sizeof(dxbc::RTS0::v1::RootDescriptor); | ||
else | ||
Size += sizeof(dxbc::RTS0::v2::RootDescriptor); | ||
|
||
break; | ||
} | ||
for (const auto &I : ParametersContainer) { | ||
std::optional<ParametersView> P = ParametersContainer.getParameter(&I); | ||
if (!P) | ||
spall marked this conversation as resolved.
Show resolved
Hide resolved
|
||
continue; | ||
std::visit( | ||
[&Size](auto &Value) -> void { | ||
using T = std::decay_t<decltype(*Value)>; | ||
Size += sizeof(T); | ||
}, | ||
*P); | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If you end up taking my suggestions for the simplified API above this will probably just revert to what it was before. |
||
|
||
return Size; | ||
} | ||
|
||
|
@@ -56,7 +52,7 @@ void RootSignatureDesc::write(raw_ostream &OS) const { | |
raw_svector_ostream BOS(Storage); | ||
BOS.reserveExtraSpace(getSize()); | ||
|
||
const uint32_t NumParameters = Parameters.size(); | ||
const uint32_t NumParameters = ParametersContainer.size(); | ||
|
||
support::endian::write(BOS, Version, llvm::endianness::little); | ||
support::endian::write(BOS, NumParameters, llvm::endianness::little); | ||
|
@@ -66,7 +62,7 @@ void RootSignatureDesc::write(raw_ostream &OS) const { | |
support::endian::write(BOS, Flags, llvm::endianness::little); | ||
|
||
SmallVector<uint32_t> ParamsOffsets; | ||
for (const mcdxbc::RootParameter &P : Parameters) { | ||
for (const auto &P : ParametersContainer) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't think |
||
support::endian::write(BOS, P.Header.ParameterType, | ||
llvm::endianness::little); | ||
support::endian::write(BOS, P.Header.ShaderVisibility, | ||
|
@@ -76,29 +72,38 @@ void RootSignatureDesc::write(raw_ostream &OS) const { | |
} | ||
|
||
assert(NumParameters == ParamsOffsets.size()); | ||
for (size_t I = 0; I < NumParameters; ++I) { | ||
const RootParameterInfo *H = ParametersContainer.begin(); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
for (size_t I = 0; I < NumParameters; ++I, H++) { | ||
rewriteOffsetToCurrentByte(BOS, ParamsOffsets[I]); | ||
const mcdxbc::RootParameter &P = Parameters[I]; | ||
|
||
switch (P.Header.ParameterType) { | ||
case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): | ||
support::endian::write(BOS, P.Constants.ShaderRegister, | ||
auto P = ParametersContainer.getParameter(H); | ||
if (!P) | ||
continue; | ||
spall marked this conversation as resolved.
Show resolved
Hide resolved
|
||
if (std::holds_alternative<const dxbc::RootConstants *>(P.value())) { | ||
auto *Constants = std::get<const dxbc::RootConstants *>(P.value()); | ||
support::endian::write(BOS, Constants->ShaderRegister, | ||
llvm::endianness::little); | ||
support::endian::write(BOS, P.Constants.RegisterSpace, | ||
support::endian::write(BOS, Constants->RegisterSpace, | ||
llvm::endianness::little); | ||
support::endian::write(BOS, P.Constants.Num32BitValues, | ||
support::endian::write(BOS, Constants->Num32BitValues, | ||
llvm::endianness::little); | ||
break; | ||
case llvm::to_underlying(dxbc::RootParameterType::CBV): | ||
case llvm::to_underlying(dxbc::RootParameterType::SRV): | ||
case llvm::to_underlying(dxbc::RootParameterType::UAV): | ||
support::endian::write(BOS, P.Descriptor.ShaderRegister, | ||
} else if (std::holds_alternative<const dxbc::RTS0::v1::RootDescriptor *>( | ||
*P)) { | ||
auto *Descriptor = | ||
std::get<const dxbc::RTS0::v1::RootDescriptor *>(P.value()); | ||
support::endian::write(BOS, Descriptor->ShaderRegister, | ||
llvm::endianness::little); | ||
support::endian::write(BOS, Descriptor->RegisterSpace, | ||
llvm::endianness::little); | ||
} else if (std::holds_alternative<const dxbc::RTS0::v2::RootDescriptor *>( | ||
*P)) { | ||
auto *Descriptor = | ||
std::get<const dxbc::RTS0::v2::RootDescriptor *>(P.value()); | ||
|
||
support::endian::write(BOS, Descriptor->ShaderRegister, | ||
llvm::endianness::little); | ||
support::endian::write(BOS, P.Descriptor.RegisterSpace, | ||
support::endian::write(BOS, Descriptor->RegisterSpace, | ||
llvm::endianness::little); | ||
if (Version > 1) | ||
support::endian::write(BOS, P.Descriptor.Flags, | ||
llvm::endianness::little); | ||
support::endian::write(BOS, Descriptor->Flags, llvm::endianness::little); | ||
} | ||
} | ||
assert(Storage.size() == getSize()); | ||
|
Original file line number | Diff line number | Diff line change | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
@@ -274,27 +274,39 @@ void DXContainerWriter::writeParts(raw_ostream &OS) { | |||||||||
RS.StaticSamplersOffset = P.RootSignature->StaticSamplersOffset; | ||||||||||
|
||||||||||
for (const auto &Param : P.RootSignature->Parameters) { | ||||||||||
mcdxbc::RootParameter NewParam; | ||||||||||
NewParam.Header = dxbc::RootParameterHeader{ | ||||||||||
Param.Type, Param.Visibility, Param.Offset}; | ||||||||||
auto Header = dxbc::RootParameterHeader{Param.Type, Param.Visibility, | ||||||||||
Param.Offset}; | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||
|
||||||||||
switch (Param.Type) { | ||||||||||
case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): | ||||||||||
NewParam.Constants.Num32BitValues = Param.Constants.Num32BitValues; | ||||||||||
NewParam.Constants.RegisterSpace = Param.Constants.RegisterSpace; | ||||||||||
NewParam.Constants.ShaderRegister = Param.Constants.ShaderRegister; | ||||||||||
dxbc::RootConstants Constants; | ||||||||||
Constants.Num32BitValues = Param.Constants.Num32BitValues; | ||||||||||
Constants.RegisterSpace = Param.Constants.RegisterSpace; | ||||||||||
Constants.ShaderRegister = Param.Constants.ShaderRegister; | ||||||||||
RS.ParametersContainer.addParameter(Header, Constants); | ||||||||||
bogner marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||
break; | ||||||||||
case llvm::to_underlying(dxbc::RootParameterType::SRV): | ||||||||||
case llvm::to_underlying(dxbc::RootParameterType::UAV): | ||||||||||
case llvm::to_underlying(dxbc::RootParameterType::CBV): | ||||||||||
NewParam.Descriptor.RegisterSpace = Param.Descriptor.RegisterSpace; | ||||||||||
NewParam.Descriptor.ShaderRegister = Param.Descriptor.ShaderRegister; | ||||||||||
if (P.RootSignature->Version > 1) | ||||||||||
NewParam.Descriptor.Flags = Param.Descriptor.getEncodedFlags(); | ||||||||||
if (RS.Version == 1) { | ||||||||||
dxbc::RTS0::v1::RootDescriptor Descriptor; | ||||||||||
Descriptor.RegisterSpace = Param.Descriptor.RegisterSpace; | ||||||||||
Descriptor.ShaderRegister = Param.Descriptor.ShaderRegister; | ||||||||||
RS.ParametersContainer.addParameter(Header, Descriptor); | ||||||||||
} else { | ||||||||||
dxbc::RTS0::v2::RootDescriptor Descriptor; | ||||||||||
Descriptor.RegisterSpace = Param.Descriptor.RegisterSpace; | ||||||||||
Descriptor.ShaderRegister = Param.Descriptor.ShaderRegister; | ||||||||||
Descriptor.Flags = Param.Descriptor.getEncodedFlags(); | ||||||||||
RS.ParametersContainer.addParameter(Header, Descriptor); | ||||||||||
} | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This seems clearer than the implicit cast to from the dxbc::RTS0::v2::RootDescriptor Descriptor;
Descriptor.RegisterSpace = Param.Descriptor.RegisterSpace;
Descriptor.ShaderRegister = Param.Descriptor.ShaderRegister;
if (RS.Version > 1)
Descriptor.Flags = Param.Descriptor.getEncodedFlags();
RS.ParametersContainer.addParameter(Header, Descriptor); aside: We should probably make the |
||||||||||
break; | ||||||||||
default: | ||||||||||
// Handling invalid parameter type edge case. We intentionally let | ||||||||||
// obj2yaml/yaml2obj parse and emit invalid dxcontainer data, in order | ||||||||||
// for that to be used as a testing tool more effectively. | ||||||||||
RS.ParametersContainer.addInfo(Header, -1); | ||||||||||
spall marked this conversation as resolved.
Show resolved
Hide resolved
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm not sure, but do you think it's worth adding a There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I thinks that is a good idea. It can make the code more consistent. And reduce a little of the confusion regarding this edge case. |
||||||||||
} | ||||||||||
|
||||||||||
RS.Parameters.push_back(NewParam); | ||||||||||
} | ||||||||||
|
||||||||||
RS.write(OS); | ||||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -75,31 +75,32 @@ static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD, | |
if (RootConstantNode->getNumOperands() != 5) | ||
return reportError(Ctx, "Invalid format for RootConstants Element"); | ||
|
||
mcdxbc::RootParameter NewParameter; | ||
NewParameter.Header.ParameterType = | ||
dxbc::RootParameterHeader Header; | ||
Header.ParameterType = | ||
llvm::to_underlying(dxbc::RootParameterType::Constants32Bit); | ||
|
||
if (std::optional<uint32_t> Val = extractMdIntValue(RootConstantNode, 1)) | ||
NewParameter.Header.ShaderVisibility = *Val; | ||
Header.ShaderVisibility = *Val; | ||
else | ||
return reportError(Ctx, "Invalid value for ShaderVisibility"); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There is no need to initialized There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It looks like a bug when the structure is created here but then only partially initialized. We should probably have a comment here, or even write a zero to it with a comment that it will be overwritten later. |
||
|
||
dxbc::RootConstants Constants; | ||
if (std::optional<uint32_t> Val = extractMdIntValue(RootConstantNode, 2)) | ||
NewParameter.Constants.ShaderRegister = *Val; | ||
Constants.ShaderRegister = *Val; | ||
else | ||
return reportError(Ctx, "Invalid value for ShaderRegister"); | ||
|
||
if (std::optional<uint32_t> Val = extractMdIntValue(RootConstantNode, 3)) | ||
NewParameter.Constants.RegisterSpace = *Val; | ||
Constants.RegisterSpace = *Val; | ||
else | ||
return reportError(Ctx, "Invalid value for RegisterSpace"); | ||
|
||
if (std::optional<uint32_t> Val = extractMdIntValue(RootConstantNode, 4)) | ||
NewParameter.Constants.Num32BitValues = *Val; | ||
Constants.Num32BitValues = *Val; | ||
else | ||
return reportError(Ctx, "Invalid value for Num32BitValues"); | ||
|
||
RSD.Parameters.push_back(NewParameter); | ||
RSD.ParametersContainer.addParameter(Header, Constants); | ||
|
||
return false; | ||
} | ||
|
@@ -164,12 +165,12 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) { | |
return reportValueError(Ctx, "RootFlags", RSD.Flags); | ||
} | ||
|
||
for (const mcdxbc::RootParameter &P : RSD.Parameters) { | ||
if (!dxbc::isValidShaderVisibility(P.Header.ShaderVisibility)) | ||
for (const llvm::mcdxbc::RootParameterInfo &Info : RSD.ParametersContainer) { | ||
if (!dxbc::isValidShaderVisibility(Info.Header.ShaderVisibility)) | ||
return reportValueError(Ctx, "ShaderVisibility", | ||
P.Header.ShaderVisibility); | ||
Info.Header.ShaderVisibility); | ||
|
||
assert(dxbc::isValidParameterType(P.Header.ParameterType) && | ||
assert(dxbc::isValidParameterType(Info.Header.ParameterType) && | ||
"Invalid value for ParameterType"); | ||
} | ||
|
||
|
@@ -287,22 +288,26 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M, | |
OS << indent(Space) << "Version: " << RS.Version << "\n"; | ||
OS << indent(Space) << "RootParametersOffset: " << RS.RootParameterOffset | ||
<< "\n"; | ||
OS << indent(Space) << "NumParameters: " << RS.Parameters.size() << "\n"; | ||
OS << indent(Space) << "NumParameters: " << RS.ParametersContainer.size() | ||
<< "\n"; | ||
Space++; | ||
for (auto const &P : RS.Parameters) { | ||
OS << indent(Space) << "- Parameter Type: " << P.Header.ParameterType | ||
for (auto const &Info : RS.ParametersContainer) { | ||
OS << indent(Space) << "- Parameter Type: " << Info.Header.ParameterType | ||
<< "\n"; | ||
OS << indent(Space + 2) | ||
<< "Shader Visibility: " << P.Header.ShaderVisibility << "\n"; | ||
switch (P.Header.ParameterType) { | ||
case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): | ||
<< "Shader Visibility: " << Info.Header.ShaderVisibility << "\n"; | ||
std::optional<mcdxbc::ParametersView> P = | ||
RS.ParametersContainer.getParameter(&Info); | ||
if (!P) | ||
continue; | ||
if (std::holds_alternative<const dxbc::RootConstants *>(*P)) { | ||
auto *Constants = std::get<const dxbc::RootConstants *>(*P); | ||
OS << indent(Space + 2) | ||
<< "Register Space: " << P.Constants.RegisterSpace << "\n"; | ||
<< "Register Space: " << Constants->RegisterSpace << "\n"; | ||
OS << indent(Space + 2) | ||
<< "Shader Register: " << P.Constants.ShaderRegister << "\n"; | ||
<< "Shader Register: " << Constants->ShaderRegister << "\n"; | ||
OS << indent(Space + 2) | ||
<< "Num 32 Bit Values: " << P.Constants.Num32BitValues << "\n"; | ||
break; | ||
<< "Num 32 Bit Values: " << Constants->Num32BitValues << "\n"; | ||
} | ||
bogner marked this conversation as resolved.
Show resolved
Hide resolved
|
||
} | ||
Space--; | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Clearer to call these
Header
andLocation
rather than abbreviating here