77// ===----------------------------------------------------------------------===//
88
99#include " llvm/MC/DXContainerRootSignature.h"
10+ #include " llvm/ADT/STLForwardCompat.h"
1011#include " llvm/ADT/SmallString.h"
12+ #include " llvm/BinaryFormat/DXContainer.h"
1113#include " llvm/Support/EndianStream.h"
1214
1315using namespace llvm ;
@@ -33,15 +35,20 @@ size_t RootSignatureDesc::getSize() const {
3335 ParametersContainer.size () * sizeof (dxbc::RootParameterHeader);
3436
3537 for (const auto &I : ParametersContainer) {
36- std::optional<ParametersView> P = ParametersContainer.getParameter (&I);
37- if (!P)
38- continue ;
39- std::visit (
40- [&Size](auto &Value) -> void {
41- using T = std::decay_t <decltype (*Value)>;
42- Size += sizeof (T);
43- },
44- *P);
38+ switch (I.Header .ParameterType ) {
39+ case llvm::to_underlying (dxbc::RootParameterType::Constants32Bit):
40+ Size += sizeof (dxbc::RootConstants);
41+ break ;
42+ case llvm::to_underlying (dxbc::RootParameterType::CBV):
43+ case llvm::to_underlying (dxbc::RootParameterType::SRV):
44+ case llvm::to_underlying (dxbc::RootParameterType::UAV):
45+ if (Version == 1 )
46+ Size += sizeof (dxbc::RTS0::v1::RootDescriptor);
47+ else
48+ Size += sizeof (dxbc::RTS0::v2::RootDescriptor);
49+
50+ break ;
51+ }
4552 }
4653
4754 return Size;
@@ -62,7 +69,7 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
6269 support::endian::write (BOS, Flags, llvm::endianness::little);
6370
6471 SmallVector<uint32_t > ParamsOffsets;
65- for (const auto &P : ParametersContainer) {
72+ for (const RootParameterInfo &P : ParametersContainer) {
6673 support::endian::write (BOS, P.Header .ParameterType ,
6774 llvm::endianness::little);
6875 support::endian::write (BOS, P.Header .ShaderVisibility ,
@@ -75,35 +82,31 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
7582 const RootParameterInfo *H = ParametersContainer.begin ();
7683 for (size_t I = 0 ; I < NumParameters; ++I, H++) {
7784 rewriteOffsetToCurrentByte (BOS, ParamsOffsets[I]);
78- auto P = ParametersContainer.getParameter (H);
79- if (!P)
80- continue ;
81- if (std::holds_alternative<const dxbc::RootConstants *>(P.value ())) {
82- auto *Constants = std::get<const dxbc::RootConstants *>(P.value ());
83- support::endian::write (BOS, Constants->ShaderRegister ,
84- llvm::endianness::little);
85- support::endian::write (BOS, Constants->RegisterSpace ,
85+ const auto &[Type, Loc] = ParametersContainer.getTypeAndLocForParameter (I);
86+ switch (Type) {
87+ case llvm::to_underlying (dxbc::RootParameterType::Constants32Bit): {
88+ const dxbc::RootConstants Constants =
89+ ParametersContainer.getConstant (Loc);
90+ support::endian::write (BOS, Constants.ShaderRegister ,
8691 llvm::endianness::little);
87- support::endian::write (BOS, Constants-> Num32BitValues ,
92+ support::endian::write (BOS, Constants. RegisterSpace ,
8893 llvm::endianness::little);
89- } else if (std::holds_alternative<const dxbc::RTS0::v1::RootDescriptor *>(
90- *P)) {
91- auto *Descriptor =
92- std::get<const dxbc::RTS0::v1::RootDescriptor *>(P.value ());
93- support::endian::write (BOS, Descriptor->ShaderRegister ,
94+ support::endian::write (BOS, Constants.Num32BitValues ,
9495 llvm::endianness::little);
95- support::endian::write (BOS, Descriptor-> RegisterSpace ,
96- llvm::endianness::little);
97- } else if (std::holds_alternative< const dxbc::RTS0::v2::RootDescriptor *>(
98- *P)) {
99- auto * Descriptor =
100- std::get< const dxbc::RTS0::v2::RootDescriptor *>(P. value () );
96+ } break ;
97+ case llvm::to_underlying (dxbc::RootParameterType::CBV):
98+ case llvm::to_underlying ( dxbc::RootParameterType::SRV):
99+ case llvm::to_underlying (dxbc::RootParameterType::UAV): {
100+ const dxbc::RTS0::v2::RootDescriptor Descriptor =
101+ ParametersContainer. getRootDescriptor (Loc );
101102
102- support::endian::write (BOS, Descriptor-> ShaderRegister ,
103+ support::endian::write (BOS, Descriptor. ShaderRegister ,
103104 llvm::endianness::little);
104- support::endian::write (BOS, Descriptor-> RegisterSpace ,
105+ support::endian::write (BOS, Descriptor. RegisterSpace ,
105106 llvm::endianness::little);
106- support::endian::write (BOS, Descriptor->Flags , llvm::endianness::little);
107+ if (Version > 1 )
108+ support::endian::write (BOS, Descriptor.Flags , llvm::endianness::little);
109+ }
107110 }
108111 }
109112 assert (Storage.size () == getSize ());
0 commit comments