Skip to content

Commit 7c4236c

Browse files
author
joaosaffran
committed
refactoring to change representations in binary format
1 parent f2a4f04 commit 7c4236c

File tree

11 files changed

+132
-59
lines changed

11 files changed

+132
-59
lines changed

llvm/include/llvm/BinaryFormat/DXContainer.h

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "llvm/Support/SwapByteOrder.h"
1818
#include "llvm/TargetParser/Triple.h"
1919

20+
#include <cstdint>
2021
#include <stdint.h>
2122

2223
namespace llvm {
@@ -572,33 +573,32 @@ struct RootConstants {
572573
}
573574
};
574575

575-
struct RootParameter {
576+
struct RootParameterHeader {
576577
dxbc::RootParameterType ParameterType;
577-
union {
578-
dxbc::RootConstants Constants;
579-
};
580578
dxbc::ShaderVisibility ShaderVisibility;
579+
uint32_t ParameterOffset;
581580

582581
void swapBytes() {
583-
sys::swapByteOrder(ShaderVisibility);
584-
switch (ParameterType) {
585-
case RootParameterType::Constants32Bit:
586-
Constants.swapBytes();
587-
break;
588-
case RootParameterType::Empty:
589-
llvm_unreachable("invalid value for ParameterType");
590-
break;
591-
}
592582
sys::swapByteOrder(ParameterType);
583+
sys::swapByteOrder(ShaderVisibility);
584+
sys::swapByteOrder(ParameterOffset);
593585
}
594586
};
595587

596588
struct RootSignatureHeader {
597589
uint32_t Version;
590+
uint32_t NumParameters;
591+
uint32_t ParametersOffset;
592+
uint32_t NumStaticSamplers;
593+
uint32_t StaticSamplerOffset;
598594
uint32_t Flags;
599595

600596
void swapBytes() {
601597
sys::swapByteOrder(Version);
598+
sys::swapByteOrder(NumParameters);
599+
sys::swapByteOrder(ParametersOffset);
600+
sys::swapByteOrder(NumStaticSamplers);
601+
sys::swapByteOrder(StaticSamplerOffset);
602602
sys::swapByteOrder(Flags);
603603
}
604604
};

llvm/include/llvm/MC/DXContainerRootSignature.h

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,25 @@
77
//===----------------------------------------------------------------------===//
88

99
#include "llvm/BinaryFormat/DXContainer.h"
10-
#include <cstdint>
11-
#include <limits>
1210

1311
namespace llvm {
1412

1513
class raw_ostream;
16-
1714
namespace mcdxbc {
15+
16+
struct RootParameter {
17+
dxbc::RootParameterHeader Header;
18+
union {
19+
dxbc::RootConstants Constants;
20+
};
21+
};
1822
struct RootSignatureDesc {
1923

2024
dxbc::RootSignatureHeader Header;
21-
SmallVector<dxbc::RootParameter> Parameters;
22-
RootSignatureDesc() : Header(dxbc::RootSignatureHeader{2, 0}) {}
25+
SmallVector<mcdxbc::RootParameter> Parameters;
26+
RootSignatureDesc()
27+
: Header(dxbc::RootSignatureHeader{
28+
2, 0, sizeof(dxbc::RootSignatureHeader), 0, 0, 0}) {}
2329

2430
void write(raw_ostream &OS) const;
2531
};

llvm/include/llvm/Object/DXContainer.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,12 @@ template <typename T> struct ViewArray {
116116
};
117117

118118
namespace DirectX {
119-
119+
struct RootParameter {
120+
dxbc::RootParameterHeader Header;
121+
union {
122+
dxbc::RootConstants Constants;
123+
};
124+
};
120125
class RootSignature {
121126
private:
122127
uint32_t Version = 2;
@@ -126,7 +131,7 @@ class RootSignature {
126131
uint32_t StaticSamplersOffset = 0;
127132
uint32_t Flags = 0;
128133

129-
SmallVector<dxbc::RootParameter> Parameters;
134+
SmallVector<DirectX::RootParameter> Parameters;
130135

131136
public:
132137
RootSignature() {}
@@ -137,7 +142,7 @@ class RootSignature {
137142
uint32_t getRootParametersOffset() const { return RootParametersOffset; }
138143
uint32_t getNumStaticSamplers() const { return NumStaticSamplers; }
139144
uint32_t getStaticSamplersOffset() const { return StaticSamplersOffset; }
140-
const SmallVector<dxbc::RootParameter> &getParameters() const {
145+
const SmallVector<DirectX::RootParameter> &getParameters() const {
141146
return Parameters;
142147
}
143148
uint32_t getFlags() const { return Flags; }

llvm/include/llvm/ObjectYAML/DXContainerYAML.h

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "llvm/BinaryFormat/DXContainer.h"
2020
#include "llvm/Object/DXContainer.h"
2121
#include "llvm/ObjectYAML/YAML.h"
22+
#include "llvm/Support/ErrorHandling.h"
2223
#include "llvm/Support/YAMLTraits.h"
2324
#include <array>
2425
#include <cstdint>
@@ -74,6 +75,41 @@ struct ShaderHash {
7475
};
7576

7677
#define ROOT_ELEMENT_FLAG(Num, Val) bool Val = false;
78+
79+
struct RootConstantsYaml {
80+
uint32_t ShaderRegister;
81+
uint32_t RegisterSpace;
82+
uint32_t Num32BitValues;
83+
};
84+
85+
struct RootParameterYamlDesc {
86+
dxbc::RootParameterType Type;
87+
dxbc::ShaderVisibility Visibility;
88+
uint32_t Offset;
89+
90+
RootParameterYamlDesc() = default;
91+
RootParameterYamlDesc(const object::DirectX::RootParameter &Parameter) {
92+
Type = Parameter.Header.ParameterType;
93+
Visibility = Parameter.Header.ShaderVisibility;
94+
Offset = Parameter.Header.ParameterOffset;
95+
switch (Parameter.Header.ParameterType) {
96+
97+
case dxbc::RootParameterType::Constants32Bit: {
98+
Constants.Num32BitValues = Parameter.Constants.Num32BitValues;
99+
Constants.RegisterSpace = Parameter.Constants.RegisterSpace;
100+
Constants.ShaderRegister = Parameter.Constants.ShaderRegister;
101+
} break;
102+
case dxbc::RootParameterType::Empty:
103+
llvm_unreachable("Invalid Root Parameter Type. It should be verified "
104+
"before reaching here.");
105+
break;
106+
}
107+
}
108+
union {
109+
RootConstantsYaml Constants;
110+
};
111+
};
112+
77113
struct RootSignatureYamlDesc {
78114
RootSignatureYamlDesc() = default;
79115
RootSignatureYamlDesc(const object::DirectX::RootSignature &Data);
@@ -82,7 +118,7 @@ struct RootSignatureYamlDesc {
82118
uint32_t NumStaticSamplers;
83119
uint32_t StaticSamplersOffset;
84120

85-
SmallVector<dxbc::RootParameter> Parameters;
121+
SmallVector<RootParameterYamlDesc> Parameters;
86122

87123
uint32_t getEncodedFlags();
88124

@@ -192,7 +228,7 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::ResourceBindInfo)
192228
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::SignatureElement)
193229
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::PSVInfo::MaskVector)
194230
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::SignatureParameter)
195-
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::dxbc::RootParameter)
231+
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::RootParameterYamlDesc)
196232
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::PSV::SemanticKind)
197233
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::PSV::ComponentType)
198234
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::PSV::InterpolationMode)
@@ -267,12 +303,12 @@ template <> struct MappingTraits<DXContainerYAML::RootSignatureYamlDesc> {
267303
DXContainerYAML::RootSignatureYamlDesc &RootSignature);
268304
};
269305

270-
template <> struct MappingTraits<dxbc::RootParameter> {
271-
static void mapping(IO &IO, dxbc::RootParameter &P);
306+
template <> struct MappingTraits<llvm::DXContainerYAML::RootParameterYamlDesc> {
307+
static void mapping(IO &IO, llvm::DXContainerYAML::RootParameterYamlDesc &P);
272308
};
273309

274-
template <> struct MappingTraits<dxbc::RootConstants> {
275-
static void mapping(IO &IO, dxbc::RootConstants &C);
310+
template <> struct MappingTraits<llvm::DXContainerYAML::RootConstantsYaml> {
311+
static void mapping(IO &IO, llvm::DXContainerYAML::RootConstantsYaml &C);
276312
};
277313

278314
} // namespace yaml

llvm/lib/MC/DXContainerRootSignature.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,10 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
4444

4545
SmallVector<uint32_t> ParamsOffsets;
4646
for (const auto &P : Parameters) {
47-
support::endian::write(BOS, P.ParameterType, llvm::endianness::little);
48-
support::endian::write(BOS, P.ShaderVisibility, llvm::endianness::little);
47+
support::endian::write(BOS, P.Header.ParameterType,
48+
llvm::endianness::little);
49+
support::endian::write(BOS, P.Header.ShaderVisibility,
50+
llvm::endianness::little);
4951

5052
ParamsOffsets.push_back(writePlaceholder(BOS));
5153
}
@@ -55,7 +57,7 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
5557
rewriteOffset(BOS, ParamsOffsets[I]);
5658
const auto &P = Parameters[I];
5759

58-
switch (P.ParameterType) {
60+
switch (P.Header.ParameterType) {
5961
case dxbc::RootParameterType::Constants32Bit: {
6062
support::endian::write(BOS, P.Constants.ShaderRegister,
6163
llvm::endianness::little);

llvm/lib/Object/DXContainer.cpp

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -291,36 +291,39 @@ Error DirectX::RootSignature::parse(StringRef Data) {
291291

292292
Current = Begin + RootParametersOffset;
293293
for (uint32_t It = 0; It < NumParameters; It++) {
294-
dxbc::RootParameter NewParam;
294+
DirectX::RootParameter NewParam;
295295

296-
NewParam.ParameterType =
296+
NewParam.Header.ParameterType =
297297
support::endian::read<dxbc::RootParameterType,
298298
llvm::endianness::little>(Current);
299299
if (!dxbc::RootSignatureValidations::isValidParameterType(
300-
NewParam.ParameterType))
301-
return validationFailed("unsupported parameter type value read: " +
302-
llvm::Twine((uint32_t)NewParam.ParameterType));
300+
NewParam.Header.ParameterType))
301+
return validationFailed(
302+
"unsupported parameter type value read: " +
303+
llvm::Twine((uint32_t)NewParam.Header.ParameterType));
303304

304305
Current += sizeof(dxbc::RootParameterType);
305306

306-
NewParam.ShaderVisibility =
307+
NewParam.Header.ShaderVisibility =
307308
support::endian::read<dxbc::ShaderVisibility, llvm::endianness::little>(
308309
Current);
309310
if (!dxbc::RootSignatureValidations::isValidShaderVisibility(
310-
NewParam.ShaderVisibility))
311-
return validationFailed("unsupported shader visility flag value read: " +
312-
llvm::Twine((uint32_t)NewParam.ShaderVisibility));
311+
NewParam.Header.ShaderVisibility))
312+
return validationFailed(
313+
"unsupported shader visility flag value read: " +
314+
llvm::Twine((uint32_t)NewParam.Header.ShaderVisibility));
313315

314316
Current += sizeof(dxbc::ShaderVisibility);
315317

316-
uint32_t Offset =
318+
NewParam.Header.ParameterOffset =
317319
support::endian::read<uint32_t, llvm::endianness::little>(Current);
318320
Current += sizeof(uint32_t);
319321

320-
switch (NewParam.ParameterType) {
322+
switch (NewParam.Header.ParameterType) {
321323

322324
case dxbc::RootParameterType::Constants32Bit:
323-
if (Error Err = readStruct(Data, Begin + Offset, NewParam.Constants))
325+
if (Error Err = readStruct(Data, Begin + NewParam.Header.ParameterOffset,
326+
NewParam.Constants))
324327
return Err;
325328
break;
326329
case dxbc::RootParameterType::Empty:

llvm/lib/ObjectYAML/DXContainerEmitter.cpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "llvm/ObjectYAML/yaml2obj.h"
1919
#include "llvm/Support/Errc.h"
2020
#include "llvm/Support/Error.h"
21+
#include "llvm/Support/ErrorHandling.h"
2122
#include "llvm/Support/raw_ostream.h"
2223

2324
using namespace llvm;
@@ -269,7 +270,25 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
269270
mcdxbc::RootSignatureDesc RS;
270271
RS.Header.Flags = P.RootSignature->getEncodedFlags();
271272
RS.Header.Version = P.RootSignature->Version;
272-
RS.Parameters = std::move(P.RootSignature->Parameters);
273+
for (const auto &Param : P.RootSignature->Parameters) {
274+
mcdxbc::RootParameter NewParam;
275+
NewParam.Header = dxbc::RootParameterHeader{
276+
Param.Type, Param.Visibility, Param.Offset};
277+
278+
switch (Param.Type) {
279+
280+
case dxbc::RootParameterType::Constants32Bit: {
281+
NewParam.Constants.Num32BitValues = Param.Constants.Num32BitValues;
282+
NewParam.Constants.RegisterSpace = Param.Constants.RegisterSpace;
283+
NewParam.Constants.ShaderRegister = Param.Constants.ShaderRegister;
284+
} break;
285+
case dxbc::RootParameterType::Empty:
286+
llvm_unreachable("Invalid parameter type");
287+
break;
288+
}
289+
290+
RS.Parameters.push_back(NewParam);
291+
}
273292

274293
RS.write(OS);
275294
break;

llvm/lib/ObjectYAML/DXContainerYAML.cpp

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ DXContainerYAML::RootSignatureYamlDesc::RootSignatureYamlDesc(
3535
NumStaticSamplers(Data.getNumStaticSamplers()),
3636
StaticSamplersOffset(Data.getStaticSamplersOffset()) {
3737
uint32_t Flags = Data.getFlags();
38-
Parameters = Data.getParameters();
38+
for (const auto &P : Data.getParameters()) {
39+
Parameters.push_back(RootParameterYamlDesc(P));
40+
}
3941
#define ROOT_ELEMENT_FLAG(Num, Val) \
4042
Val = (Flags & (uint32_t)dxbc::RootElementFlag::Val) > 0;
4143
#include "llvm/BinaryFormat/DXContainerConstants.def"
@@ -219,18 +221,18 @@ void MappingTraits<DXContainerYAML::RootSignatureYamlDesc>::mapping(
219221
#include "llvm/BinaryFormat/DXContainerConstants.def"
220222
}
221223

222-
void MappingTraits<dxbc::RootConstants>::mapping(IO &IO,
223-
dxbc::RootConstants &C) {
224+
void MappingTraits<llvm::DXContainerYAML::RootConstantsYaml>::mapping(
225+
IO &IO, llvm::DXContainerYAML::RootConstantsYaml &C) {
224226
IO.mapRequired("Num32BitValues", C.Num32BitValues);
225227
IO.mapRequired("RegisterSpace", C.RegisterSpace);
226228
IO.mapRequired("ShaderRegister", C.ShaderRegister);
227229
}
228230

229-
void MappingTraits<dxbc::RootParameter>::mapping(IO &IO,
230-
dxbc::RootParameter &P) {
231-
IO.mapRequired("ParameterType", P.ParameterType);
232-
IO.mapRequired("ShaderVisibility", P.ShaderVisibility);
233-
switch (P.ParameterType) {
231+
void MappingTraits<llvm::DXContainerYAML::RootParameterYamlDesc>::mapping(
232+
IO &IO, llvm::DXContainerYAML::RootParameterYamlDesc &P) {
233+
IO.mapRequired("ParameterType", P.Type);
234+
IO.mapRequired("ShaderVisibility", P.Visibility);
235+
switch (P.Type) {
234236
case dxbc::RootParameterType::Constants32Bit:
235237
IO.mapRequired("Constants", P.Constants);
236238
break;

llvm/lib/Target/DirectX/DXILRootSignature.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,8 +204,8 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
204204
OS << indent(Space) << "Flags: " << format_hex(RS.Header.Flags, 8) << ":\n";
205205
OS << indent(Space) << "Version: " << RS.Header.Version << ":\n";
206206
OS << indent(Space) << "NumParameters: " << RS.Parameters.size() << ":\n";
207-
OS << indent(Space)
208-
<< "RootParametersOffset: " << RS.Parameters.size_in_bytes() << ":\n";
207+
OS << indent(Space) << "RootParametersOffset: " << sizeof(RS.Header)
208+
<< ":\n";
209209
OS << indent(Space) << "NumStaticSamplers: " << 0 << ":\n";
210210
OS << indent(Space) << "StaticSamplersOffset: "
211211
<< sizeof(RS.Header) + RS.Parameters.size_in_bytes() << ":\n";

llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
2727
; CHECK-NEXT: Flags: 0x000001
2828
; CHECK-NEXT: Version: 2
2929
; CHECK-NEXT: NumParameters: 0
30-
; CHECK-NEXT: RootParametersOffset: 0
30+
; CHECK-NEXT: RootParametersOffset: 24
3131
; CHECK-NEXT: NumStaticSamplers: 0
32-
; CHECK-NEXT: StaticSamplersOffset: 8
32+
; CHECK-NEXT: StaticSamplersOffset: 24
3333

3434
; CHECK-LABEL: Definition for 'anotherMain':
3535
; CHECK-NEXT: Flags: 0x000002
3636
; CHECK-NEXT: Version: 2
3737
; CHECK-NEXT: NumParameters: 0
38-
; CHECK-NEXT: RootParametersOffset: 0
38+
; CHECK-NEXT: RootParametersOffset: 24
3939
; CHECK-NEXT: NumStaticSamplers: 0
40-
; CHECK-NEXT: StaticSamplersOffset: 8
40+
; CHECK-NEXT: StaticSamplersOffset: 24

0 commit comments

Comments
 (0)