Skip to content

Commit 08f6ddc

Browse files
author
joaosaffran
committed
adding yaml2obj support
1 parent 3c6894f commit 08f6ddc

File tree

8 files changed

+158
-48
lines changed

8 files changed

+158
-48
lines changed

llvm/include/llvm/BinaryFormat/DXContainer.h

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,14 +160,14 @@ enum class RootElementFlag : uint32_t {
160160
};
161161

162162
#define ROOT_PARAMETER(Val, Enum) Enum = Val,
163-
enum class RootParameterType : uint8_t {
163+
enum class RootParameterType: uint32_t {
164164
#include "DXContainerConstants.def"
165165
};
166166

167167
ArrayRef<EnumEntry<RootParameterType>> getRootParameterTypes();
168168

169169
#define SHADER_VISIBILITY(Val, Enum) Enum = Val,
170-
enum class ShaderVisibilityFlag : uint8_t {
170+
enum class ShaderVisibilityFlag: uint32_t {
171171
#include "DXContainerConstants.def"
172172
};
173173

@@ -562,6 +562,26 @@ struct ProgramSignatureElement {
562562
static_assert(sizeof(ProgramSignatureElement) == 32,
563563
"ProgramSignatureElement is misaligned");
564564

565+
struct RootConstants {
566+
uint32_t ShaderRegister;
567+
uint32_t RegisterSpace;
568+
uint32_t Num32BitValues;
569+
};
570+
571+
struct RootParameter {
572+
dxbc::RootParameterType ParameterType;
573+
union {
574+
RootConstants Constants;
575+
};
576+
dxbc::ShaderVisibilityFlag ShaderVisibility;
577+
};
578+
579+
struct RootSignatureHeader {
580+
uint32_t Version = 2;
581+
uint32_t Flags = 0;
582+
};
583+
584+
565585
struct RootSignatureValidations {
566586

567587
static bool isValidRootFlag(uint32_t Flags) { return (Flags & ~0xfff) == 0; }

llvm/include/llvm/MC/DXContainerRootSignature.h

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,10 @@ namespace llvm {
1515
class raw_ostream;
1616

1717
namespace mcdxbc {
18+
1819
struct RootSignatureDesc {
19-
uint32_t Version = 2;
20-
uint32_t NumParameters = 0;
21-
uint32_t RootParametersOffset = 0;
22-
uint32_t NumStaticSamplers = 0;
23-
uint32_t StaticSamplersOffset = 0;
24-
uint32_t Flags = 0;
20+
dxbc::RootSignatureHeader Header;
21+
SmallVector<dxbc::RootParameter> Parameters;
2522

2623
void write(raw_ostream &OS) const;
2724
};

llvm/include/llvm/ObjectYAML/DXContainerYAML.h

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,12 @@ struct RootSignatureYamlDesc {
7979
RootSignatureYamlDesc(const object::DirectX::RootSignature &Data);
8080

8181
uint32_t Version;
82-
uint32_t NumParameters;
83-
uint32_t RootParametersOffset;
8482
uint32_t NumStaticSamplers;
8583
uint32_t StaticSamplersOffset;
8684

85+
SmallVector<dxbc::RootParameter> Parameters;
86+
87+
8788
uint32_t getEncodedFlags();
8889

8990
#include "llvm/BinaryFormat/DXContainerConstants.def"
@@ -192,6 +193,7 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::ResourceBindInfo)
192193
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::SignatureElement)
193194
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::PSVInfo::MaskVector)
194195
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::SignatureParameter)
196+
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::dxbc::RootParameter)
195197
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::PSV::SemanticKind)
196198
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::PSV::ComponentType)
197199
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::PSV::InterpolationMode)
@@ -200,6 +202,8 @@ LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::PSV::ResourceKind)
200202
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::D3DSystemValue)
201203
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::SigComponentType)
202204
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::SigMinPrecision)
205+
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::RootParameterType)
206+
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::ShaderVisibilityFlag)
203207

204208
namespace llvm {
205209

@@ -264,6 +268,16 @@ template <> struct MappingTraits<DXContainerYAML::RootSignatureYamlDesc> {
264268
DXContainerYAML::RootSignatureYamlDesc &RootSignature);
265269
};
266270

271+
template <> struct MappingTraits<dxbc::RootParameter> {
272+
static void mapping(IO &IO,
273+
dxbc::RootParameter &P);
274+
};
275+
276+
template <> struct MappingTraits<dxbc::RootConstants> {
277+
static void mapping(IO &IO,
278+
dxbc::RootConstants &C);
279+
};
280+
267281
} // namespace yaml
268282

269283
} // namespace llvm

llvm/lib/BinaryFormat/DXContainer.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,26 @@ ArrayRef<EnumEntry<SigComponentType>> dxbc::getSigComponentTypes() {
6060
return ArrayRef(SigComponentTypes);
6161
}
6262

63+
#define SHADER_VISIBILITY(Val, Enum) {#Enum, ShaderVisibilityFlag::Enum},
64+
65+
static const EnumEntry<ShaderVisibilityFlag> ShaderVisibilityFlags[] = {
66+
#include "llvm/BinaryFormat/DXContainerConstants.def"
67+
};
68+
69+
ArrayRef<EnumEntry<ShaderVisibilityFlag>> dxbc::getShaderVisibilityFlags() {
70+
return ArrayRef(ShaderVisibilityFlags);
71+
}
72+
73+
#define ROOT_PARAMETER(Val, Enum) {#Enum, RootParameterType::Enum},
74+
75+
static const EnumEntry<RootParameterType> RootParameterTypes[] = {
76+
#include "llvm/BinaryFormat/DXContainerConstants.def"
77+
};
78+
79+
ArrayRef<EnumEntry<RootParameterType>> dxbc::getRootParameterTypes() {
80+
return ArrayRef(RootParameterTypes);
81+
}
82+
6383
#define SEMANTIC_KIND(Val, Enum) {#Enum, PSV::SemanticKind::Enum},
6484

6585
static const EnumEntry<PSV::SemanticKind> SemanticKindNames[] = {

llvm/lib/MC/DXContainerRootSignature.cpp

Lines changed: 50 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,34 +8,64 @@
88

99
#include "llvm/MC/DXContainerRootSignature.h"
1010
#include "llvm/ADT/bit.h"
11+
#include "llvm/BinaryFormat/DXContainer.h"
1112
#include "llvm/Support/EndianStream.h"
13+
#include <cstdint>
14+
#include <sys/types.h>
1215

1316
using namespace llvm;
1417
using namespace llvm::mcdxbc;
1518

19+
template <typename T>
20+
static uint32_t getSizeOf () {
21+
return static_cast<uint32_t>(sizeof(T));
22+
}
23+
24+
25+
1626
void RootSignatureDesc::write(raw_ostream &OS) const {
27+
uint32_t Offset = 16;
28+
const uint32_t ParametersOffset = getSizeOf<dxbc::RootSignatureHeader>() + Offset;
29+
const uint32_t ParameterByteSize = Parameters.size_in_bytes();
1730

18-
support::endian::write(OS, Version, llvm::endianness::little);
19-
support::endian::write(OS, NumParameters, llvm::endianness::little);
20-
support::endian::write(OS, RootParametersOffset, llvm::endianness::little);
21-
support::endian::write(OS, NumStaticSamplers, llvm::endianness::little);
22-
support::endian::write(OS, StaticSamplersOffset, llvm::endianness::little);
23-
support::endian::write(OS, Flags, llvm::endianness::little);
24-
}
2531

26-
void RootParameter::write(raw_ostream &OS) {
27-
support::endian::write(OS, ParameterType, llvm::endianness::little);
28-
support::endian::write(OS, ShaderVisibility, llvm::endianness::little);
32+
// Writing header information
33+
support::endian::write(OS, Header.Version, llvm::endianness::little);
34+
Offset += getSizeOf<uint32_t>();
2935

30-
switch(ParameterType){
31-
case dxbc::RootParameterType::Constants32Bit:
32-
Constants.write(OS);
33-
break;
34-
}
35-
}
36+
support::endian::write(OS, (uint32_t)Parameters.size(), llvm::endianness::little);
37+
Offset += getSizeOf<uint32_t>();
3638

37-
void RootConstants::write(raw_ostream &OS) {
38-
support::endian::write(OS, Num32BitValues, llvm::endianness::little);
39-
support::endian::write(OS, RegisterSpace, llvm::endianness::little);
40-
support::endian::write(OS, ShaderRegister, llvm::endianness::little);
39+
support::endian::write(OS, ParametersOffset, llvm::endianness::little);
40+
Offset += getSizeOf<uint32_t>();
41+
42+
support::endian::write(OS, ((uint32_t)0), llvm::endianness::little);
43+
Offset += getSizeOf<uint32_t>();
44+
45+
support::endian::write(OS, ParameterByteSize + ParametersOffset, llvm::endianness::little);
46+
Offset += getSizeOf<uint32_t>();
47+
48+
support::endian::write(OS, Header.Flags, llvm::endianness::little);
49+
50+
for (const dxbc::RootParameter &P : Parameters){
51+
support::endian::write(OS, P.ParameterType, llvm::endianness::little);
52+
support::endian::write(OS, P.ShaderVisibility, llvm::endianness::little);
53+
support::endian::write(OS, Offset, llvm::endianness::little);
54+
Offset += getSizeOf<uint32_t>();
55+
56+
57+
switch(P.ParameterType){
58+
case dxbc::RootParameterType::Constants32Bit:{
59+
support::endian::write(OS, P.Constants.ShaderRegister, llvm::endianness::little);
60+
Offset += getSizeOf<uint32_t>();
61+
62+
support::endian::write(OS, P.Constants.RegisterSpace, llvm::endianness::little);
63+
Offset += getSizeOf<uint32_t>();
64+
65+
support::endian::write(OS, P.Constants.Num32BitValues, llvm::endianness::little);
66+
Offset += getSizeOf<uint32_t>();
67+
68+
} break;
69+
}
70+
}
4171
}

llvm/lib/ObjectYAML/DXContainerEmitter.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "llvm/Support/Errc.h"
2020
#include "llvm/Support/Error.h"
2121
#include "llvm/Support/raw_ostream.h"
22+
#include <utility>
2223

2324
using namespace llvm;
2425

@@ -267,12 +268,9 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
267268
continue;
268269

269270
mcdxbc::RootSignatureDesc RS;
270-
RS.Flags = P.RootSignature->getEncodedFlags();
271-
RS.Version = P.RootSignature->Version;
272-
RS.NumParameters = P.RootSignature->NumParameters;
273-
RS.RootParametersOffset = P.RootSignature->RootParametersOffset;
274-
RS.NumStaticSamplers = P.RootSignature->NumStaticSamplers;
275-
RS.StaticSamplersOffset = P.RootSignature->StaticSamplersOffset;
271+
RS.Header.Flags = P.RootSignature->getEncodedFlags();
272+
RS.Header.Version = P.RootSignature->Version;
273+
RS.Parameters = std::move(P.RootSignature->Parameters);
276274

277275
RS.write(OS);
278276
break;

llvm/lib/ObjectYAML/DXContainerYAML.cpp

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,7 @@ DXContainerYAML::ShaderFeatureFlags::ShaderFeatureFlags(uint64_t FlagData) {
3131

3232
DXContainerYAML::RootSignatureYamlDesc::RootSignatureYamlDesc(
3333
const object::DirectX::RootSignature &Data)
34-
: Version(Data.getVersion()), NumParameters(Data.getNumParameters()),
35-
RootParametersOffset(Data.getRootParametersOffset()),
34+
: Version(Data.getVersion()),
3635
NumStaticSamplers(Data.getNumStaticSamplers()),
3736
StaticSamplersOffset(Data.getStaticSamplersOffset()) {
3837
uint32_t Flags = Data.getFlags();
@@ -212,14 +211,34 @@ void MappingTraits<DXContainerYAML::Signature>::mapping(
212211
void MappingTraits<DXContainerYAML::RootSignatureYamlDesc>::mapping(
213212
IO &IO, DXContainerYAML::RootSignatureYamlDesc &S) {
214213
IO.mapRequired("Version", S.Version);
215-
IO.mapRequired("NumParameters", S.NumParameters);
216-
IO.mapRequired("RootParametersOffset", S.RootParametersOffset);
217214
IO.mapRequired("NumStaticSamplers", S.NumStaticSamplers);
218215
IO.mapRequired("StaticSamplersOffset", S.StaticSamplersOffset);
216+
IO.mapRequired("Parameters", S.Parameters);
219217
#define ROOT_ELEMENT_FLAG(Num, Val) IO.mapOptional(#Val, S.Val, false);
220218
#include "llvm/BinaryFormat/DXContainerConstants.def"
221219
}
222220

221+
void MappingTraits<dxbc::RootConstants>::mapping(
222+
IO &IO, dxbc::RootConstants &C) {
223+
IO.mapRequired("Num32BitValues", C.Num32BitValues);
224+
IO.mapRequired("RegisterSpace", C.RegisterSpace);
225+
IO.mapRequired("ShaderRegister", C.ShaderRegister);
226+
227+
}
228+
229+
void MappingTraits<dxbc::RootParameter>::mapping(
230+
IO &IO, dxbc::RootParameter &P) {
231+
IO.mapRequired("ParameterType", P.ParameterType);
232+
IO.mapRequired("ShaderVisibility", P.ShaderVisibility);
233+
switch (P.ParameterType) {
234+
235+
case dxbc::RootParameterType::Constants32Bit:
236+
IO.mapRequired("Constants", P.Constants);
237+
238+
break;
239+
}
240+
}
241+
223242
void MappingTraits<DXContainerYAML::Part>::mapping(IO &IO,
224243
DXContainerYAML::Part &P) {
225244
IO.mapRequired("Name", P.Name);
@@ -323,6 +342,18 @@ void ScalarEnumerationTraits<dxbc::SigComponentType>::enumeration(
323342
IO.enumCase(Value, E.Name.str().c_str(), E.Value);
324343
}
325344

345+
void ScalarEnumerationTraits<dxbc::RootParameterType>::enumeration(
346+
IO &IO, dxbc::RootParameterType &Value) {
347+
for (const auto &E : dxbc::getRootParameterTypes())
348+
IO.enumCase(Value, E.Name.str().c_str(), E.Value);
349+
}
350+
351+
void ScalarEnumerationTraits<dxbc::ShaderVisibilityFlag>::enumeration(
352+
IO &IO, dxbc::ShaderVisibilityFlag &Value) {
353+
for (const auto &E : dxbc::getShaderVisibilityFlags())
354+
IO.enumCase(Value, E.Name.str().c_str(), E.Value);
355+
}
356+
326357
} // namespace yaml
327358

328359
void DXContainerYAML::PSVInfo::mapInfoForVersion(yaml::IO &IO) {

llvm/lib/Target/DirectX/DXILRootSignature.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ static bool parseRootFlags(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
4747
return reportError(Ctx, "Invalid format for RootFlag Element");
4848

4949
auto *Flag = mdconst::extract<ConstantInt>(RootFlagNode->getOperand(1));
50-
RSD.Flags = Flag->getZExtValue();
50+
RSD.Header.Flags = Flag->getZExtValue();
5151

5252
return false;
5353
}
@@ -93,7 +93,7 @@ static bool parse(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
9393
}
9494

9595
static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
96-
if (!dxbc::RootSignatureValidations::isValidRootFlag(RSD.Flags)) {
96+
if (!dxbc::RootSignatureValidations::isValidRootFlag(RSD.Header.Flags)) {
9797
return reportError(Ctx, "Invalid Root Signature flag value");
9898
}
9999
return false;
@@ -198,14 +198,14 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
198198

199199
// start root signature header
200200
Space++;
201-
OS << indent(Space) << "Flags: " << format_hex(RSD.Flags, 8) << ":\n";
202-
OS << indent(Space) << "Version: " << RSD.Version << ":\n";
203-
OS << indent(Space) << "NumParameters: " << RSD.NumParameters << ":\n";
204-
OS << indent(Space) << "RootParametersOffset: " << RSD.RootParametersOffset
201+
OS << indent(Space) << "Flags: " << format_hex(RS.Header.Flags, 8) << ":\n";
202+
OS << indent(Space) << "Version: " << RS.Header.Version << ":\n";
203+
OS << indent(Space) << "NumParameters: " << RS.Parameters.size() << ":\n";
204+
OS << indent(Space) << "RootParametersOffset: " << RS.Parameters.size_in_bytes()
205205
<< ":\n";
206-
OS << indent(Space) << "NumStaticSamplers: " << RSD.NumStaticSamplers
206+
OS << indent(Space) << "NumStaticSamplers: " << 0
207207
<< ":\n";
208-
OS << indent(Space) << "StaticSamplersOffset: " << RSD.StaticSamplersOffset
208+
OS << indent(Space) << "StaticSamplersOffset: " << sizeof(RS.Header) + RS.Parameters.size_in_bytes()
209209
<< ":\n";
210210
Space--;
211211
// end root signature header

0 commit comments

Comments
 (0)