Skip to content

Commit cadc296

Browse files
author
joaosaffran
committed
Merge branch 'obj2yaml/root-constants' into metadata/root-constants
2 parents efc5e52 + c0ac522 commit cadc296

18 files changed

+220
-116
lines changed

llvm/include/llvm/BinaryFormat/DXContainer.h

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#define LLVM_BINARYFORMAT_DXCONTAINER_H
1515

1616
#include "llvm/ADT/StringRef.h"
17+
#include "llvm/Support/Error.h"
1718
#include "llvm/Support/SwapByteOrder.h"
1819
#include "llvm/TargetParser/Triple.h"
1920

@@ -158,19 +159,39 @@ enum class RootElementFlag : uint32_t {
158159
};
159160

160161
#define ROOT_PARAMETER(Val, Enum) Enum = Val,
161-
enum class RootParameterType : uint32_t {
162+
enum RootParameterType : uint32_t {
162163
#include "DXContainerConstants.def"
163164
};
164165

165166
ArrayRef<EnumEntry<RootParameterType>> getRootParameterTypes();
166167

168+
#define ROOT_PARAMETER(Val, Enum) \
169+
case Val: \
170+
return true;
171+
inline bool isValidParameterType(uint32_t V) {
172+
switch (V) {
173+
#include "DXContainerConstants.def"
174+
}
175+
return false;
176+
}
177+
167178
#define SHADER_VISIBILITY(Val, Enum) Enum = Val,
168-
enum class ShaderVisibility : uint32_t {
179+
enum ShaderVisibility : uint32_t {
169180
#include "DXContainerConstants.def"
170181
};
171182

172183
ArrayRef<EnumEntry<ShaderVisibility>> getShaderVisibility();
173184

185+
#define SHADER_VISIBILITY(Val, Enum) \
186+
case Val: \
187+
return true;
188+
inline bool isValidShaderVisibility(uint32_t V) {
189+
switch (V) {
190+
#include "DXContainerConstants.def"
191+
}
192+
return false;
193+
}
194+
174195
PartType parsePartType(StringRef S);
175196

176197
struct VertexPSVInfo {
@@ -575,8 +596,8 @@ struct RootConstants {
575596
};
576597

577598
struct RootParameterHeader {
578-
RootParameterType ParameterType;
579-
ShaderVisibility ShaderVisibility;
599+
uint32_t ParameterType;
600+
uint32_t ShaderVisibility;
580601
uint32_t ParameterOffset;
581602

582603
void swapBytes() {

llvm/include/llvm/MC/DXContainerRootSignature.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,9 @@ struct RootParameter {
2323
};
2424
struct RootSignatureDesc {
2525

26-
dxbc::RootSignatureHeader Header;
26+
uint32_t Version = 2U;
27+
uint32_t Flags = 0U;
2728
SmallVector<mcdxbc::RootParameter> Parameters;
28-
RootSignatureDesc()
29-
: Header(dxbc::RootSignatureHeader{
30-
2, 0, sizeof(dxbc::RootSignatureHeader), 0, 0, 0}) {}
3129

3230
void write(raw_ostream &OS) const;
3331

llvm/include/llvm/Object/DXContainer.h

Lines changed: 11 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -117,16 +117,6 @@ template <typename T> struct ViewArray {
117117
};
118118

119119
namespace DirectX {
120-
121-
struct RootParameter {
122-
dxbc::RootParameterHeader Header;
123-
union {
124-
dxbc::RootConstants Constants;
125-
};
126-
127-
RootParameter() = default;
128-
};
129-
130120
struct RootParameterView {
131121
const dxbc::RootParameterHeader &Header;
132122
StringRef ParamData;
@@ -170,44 +160,43 @@ class RootSignature {
170160
uint32_t StaticSamplersOffset;
171161
uint32_t Flags;
172162
ViewArray<dxbc::RootParameterHeader> ParametersHeaders;
173-
uint32_t ParameterSpaceOffset;
174-
StringRef ParameterSpace;
163+
StringRef PartData;
175164

176165
using param_header_iterator = ViewArray<dxbc::RootParameterHeader>::iterator;
177166

178167
public:
179-
RootSignature() {}
168+
RootSignature(StringRef PD) : PartData(PD) {}
180169

181-
Error parse(StringRef Data);
170+
Error parse();
182171
uint32_t getVersion() const { return Version; }
183172
uint32_t getNumParameters() const { return NumParameters; }
184173
uint32_t getRootParametersOffset() const { return RootParametersOffset; }
185174
uint32_t getNumStaticSamplers() const { return NumStaticSamplers; }
186175
uint32_t getStaticSamplersOffset() const { return StaticSamplersOffset; }
187-
llvm::iterator_range<param_header_iterator> param_header() const {
176+
uint32_t getNumRootParameters() const { return ParametersHeaders.size(); }
177+
llvm::iterator_range<param_header_iterator> param_headers() const {
188178
return llvm::make_range(ParametersHeaders.begin(), ParametersHeaders.end());
189179
}
190180
uint32_t getFlags() const { return Flags; }
191181

192182
llvm::Expected<RootParameterView>
193183
getParameter(const dxbc::RootParameterHeader &Header) const {
194-
assert(ParameterSpaceOffset != 0 &&
195-
"This should be initialized before reading parameters");
196-
size_t CorrectOffset = Header.ParameterOffset - ParameterSpaceOffset;
197-
StringRef Data;
198184
size_t DataSize;
199185

200186
switch (Header.ParameterType) {
201187
case dxbc::RootParameterType::Constants32Bit:
202188
DataSize = sizeof(dxbc::RootConstants);
203189
break;
204190
}
191+
auto EndOfSectionByte = getNumStaticSamplers() == 0
192+
? PartData.size()
193+
: getStaticSamplersOffset();
205194

206-
if (CorrectOffset + DataSize > ParameterSpace.size())
195+
if (Header.ParameterOffset + DataSize > EndOfSectionByte)
207196
return parseFailed("Reading structure out of file bounds");
208197

209-
Data = ParameterSpace.substr(CorrectOffset, DataSize);
210-
RootParameterView View = RootParameterView(Header, Data);
198+
StringRef Buff = PartData.substr(Header.ParameterOffset, DataSize);
199+
RootParameterView View = RootParameterView(Header, Buff);
211200
return View;
212201
}
213202
};

llvm/include/llvm/ObjectYAML/DXContainerYAML.h

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,8 @@ struct RootConstantsYaml {
8282
};
8383

8484
struct RootParameterYamlDesc {
85-
dxbc::RootParameterType Type;
86-
dxbc::ShaderVisibility Visibility;
85+
uint32_t Type;
86+
uint32_t Visibility;
8787
uint32_t Offset;
8888

8989
union {
@@ -93,16 +93,24 @@ struct RootParameterYamlDesc {
9393

9494
struct RootSignatureYamlDesc {
9595
RootSignatureYamlDesc() = default;
96-
RootSignatureYamlDesc(const object::DirectX::RootSignature &Data);
9796

9897
uint32_t Version;
98+
uint32_t NumRootParameters;
99+
uint32_t RootParametersOffset;
99100
uint32_t NumStaticSamplers;
100101
uint32_t StaticSamplersOffset;
101102

102103
SmallVector<RootParameterYamlDesc> Parameters;
103104

104105
uint32_t getEncodedFlags();
105106

107+
iterator_range<RootParameterYamlDesc *> params() {
108+
return make_range(Parameters.begin(), Parameters.end());
109+
}
110+
111+
static llvm::Expected<DXContainerYAML::RootSignatureYamlDesc>
112+
create(const object::DirectX::RootSignature &Data);
113+
106114
#include "llvm/BinaryFormat/DXContainerConstants.def"
107115
};
108116

@@ -218,8 +226,6 @@ LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::PSV::ResourceKind)
218226
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::D3DSystemValue)
219227
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::SigComponentType)
220228
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::SigMinPrecision)
221-
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::RootParameterType)
222-
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::ShaderVisibility)
223229

224230
namespace llvm {
225231

llvm/lib/MC/DXContainerRootSignature.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,13 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
5151
const uint32_t StaticSamplerOffset = 0u;
5252
const uint32_t NumStaticSamplers = 0u;
5353

54-
support::endian::write(BOS, Header.Version, llvm::endianness::little);
54+
support::endian::write(BOS, Version, llvm::endianness::little);
5555
support::endian::write(BOS, NumParameters, llvm::endianness::little);
5656
support::endian::write(BOS, (uint32_t)sizeof(dxbc::RootSignatureHeader),
5757
llvm::endianness::little);
5858
support::endian::write(BOS, StaticSamplerOffset, llvm::endianness::little);
5959
support::endian::write(BOS, NumStaticSamplers, llvm::endianness::little);
60-
support::endian::write(BOS, Header.Flags, llvm::endianness::little);
60+
support::endian::write(BOS, Flags, llvm::endianness::little);
6161

6262
SmallVector<uint32_t> ParamsOffsets;
6363
for (const auto &P : Parameters) {

llvm/lib/Object/DXContainer.cpp

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,8 @@ Error DXContainer::parseHash(StringRef Part) {
9696
Error DXContainer::parseRootSignature(StringRef Part) {
9797
if (RootSignature)
9898
return parseFailed("More than one RTS0 part is present in the file");
99-
RootSignature = DirectX::RootSignature();
100-
if (Error Err = RootSignature->parse(Part))
99+
RootSignature = DirectX::RootSignature(Part);
100+
if (Error Err = RootSignature->parse())
101101
return Err;
102102
return Error::success();
103103
}
@@ -242,12 +242,11 @@ void DXContainer::PartIterator::updateIteratorImpl(const uint32_t Offset) {
242242
IteratorState.Offset = Offset;
243243
}
244244

245-
Error DirectX::RootSignature::parse(StringRef Data) {
246-
const char *Begin = Data.begin();
247-
const char *Current = Data.begin();
245+
Error DirectX::RootSignature::parse() {
246+
const char *Current = PartData.begin();
248247

249248
// Root Signature headers expects 6 integers to be present.
250-
if (Data.size() < 6 * sizeof(uint32_t))
249+
if (PartData.size() < 6 * sizeof(uint32_t))
251250
return parseFailed(
252251
"Invalid root signature, insufficient space for header.");
253252

@@ -273,19 +272,11 @@ Error DirectX::RootSignature::parse(StringRef Data) {
273272
Flags = support::endian::read<uint32_t, llvm::endianness::little>(Current);
274273
Current += sizeof(uint32_t);
275274

276-
assert(Current == Begin + RootParametersOffset);
275+
assert(Current == PartData.begin() + RootParametersOffset);
277276

278-
ParametersHeaders.Data = Data.substr(
277+
ParametersHeaders.Data = PartData.substr(
279278
RootParametersOffset, NumParameters * sizeof(dxbc::RootParameterHeader));
280279

281-
ParameterSpaceOffset =
282-
RootParametersOffset + NumParameters * sizeof(dxbc::RootParameterHeader);
283-
size_t ParameterSpaceEnd =
284-
(NumStaticSamplers == 0) ? Data.size() : StaticSamplersOffset;
285-
286-
ParameterSpace = Data.substr(ParameterSpaceOffset,
287-
ParameterSpaceEnd - ParameterSpaceOffset);
288-
289280
return Error::success();
290281
}
291282

llvm/lib/ObjectYAML/DXContainerEmitter.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -267,8 +267,8 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
267267
continue;
268268

269269
mcdxbc::RootSignatureDesc RS;
270-
RS.Header.Flags = P.RootSignature->getEncodedFlags();
271-
RS.Header.Version = P.RootSignature->Version;
270+
RS.Flags = P.RootSignature->getEncodedFlags();
271+
RS.Version = P.RootSignature->Version;
272272
for (const auto &Param : P.RootSignature->Parameters) {
273273
mcdxbc::RootParameter NewParam;
274274
NewParam.Header = dxbc::RootParameterHeader{

llvm/lib/ObjectYAML/DXContainerYAML.cpp

Lines changed: 47 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414
#include "llvm/ObjectYAML/DXContainerYAML.h"
1515
#include "llvm/ADT/ScopeExit.h"
1616
#include "llvm/BinaryFormat/DXContainer.h"
17+
#include "llvm/Support/Error.h"
1718
#include "llvm/Support/ScopedPrinter.h"
19+
#include <system_error>
1820

1921
namespace llvm {
2022

@@ -29,39 +31,61 @@ DXContainerYAML::ShaderFeatureFlags::ShaderFeatureFlags(uint64_t FlagData) {
2931
#include "llvm/BinaryFormat/DXContainerConstants.def"
3032
}
3133

32-
DXContainerYAML::RootSignatureYamlDesc::RootSignatureYamlDesc(
33-
const object::DirectX::RootSignature &Data)
34-
: Version(Data.getVersion()),
35-
NumStaticSamplers(Data.getNumStaticSamplers()),
36-
StaticSamplersOffset(Data.getStaticSamplersOffset()) {
34+
llvm::Expected<DXContainerYAML::RootSignatureYamlDesc>
35+
DXContainerYAML::RootSignatureYamlDesc::create(
36+
const object::DirectX::RootSignature &Data) {
37+
38+
RootSignatureYamlDesc RootSigDesc;
39+
40+
RootSigDesc.Version = Data.getVersion();
41+
RootSigDesc.NumStaticSamplers = Data.getNumStaticSamplers();
42+
RootSigDesc.StaticSamplersOffset = Data.getStaticSamplersOffset();
43+
RootSigDesc.NumRootParameters = Data.getNumRootParameters();
44+
RootSigDesc.RootParametersOffset = Data.getRootParametersOffset();
45+
3746
uint32_t Flags = Data.getFlags();
38-
for (const auto &PH : Data.param_header()) {
47+
for (const auto &PH : Data.param_headers()) {
3948

4049
RootParameterYamlDesc NewP;
4150
NewP.Offset = PH.ParameterOffset;
51+
52+
if (!dxbc::isValidParameterType(PH.ParameterType))
53+
return createStringError(std::errc::invalid_argument,
54+
"Invalid value for parameter type");
55+
4256
NewP.Type = PH.ParameterType;
57+
58+
if (!dxbc::isValidShaderVisibility(PH.ShaderVisibility))
59+
return createStringError(std::errc::invalid_argument,
60+
"Invalid value for shader visibility");
61+
4362
NewP.Visibility = PH.ShaderVisibility;
4463

45-
llvm::Expected<object::DirectX::RootParameterView> ParamView =
64+
llvm::Expected<object::DirectX::RootParameterView> ParamViewOrErr =
4665
Data.getParameter(PH);
47-
if (!ParamView)
48-
llvm::errs() << "Error: " << ParamView.takeError() << "\n";
49-
auto PV = *ParamView;
50-
51-
if (auto *RCV = dyn_cast<object::DirectX::RootConstantView>(&PV)) {
52-
auto Constants = RCV->read();
53-
if (!Constants)
54-
llvm::errs() << "Error: " << Constants.takeError() << "\n";
55-
56-
NewP.Constants.Num32BitValues = Constants->Num32BitValues;
57-
NewP.Constants.ShaderRegister = Constants->ShaderRegister;
58-
NewP.Constants.RegisterSpace = Constants->RegisterSpace;
66+
if (Error E = ParamViewOrErr.takeError()) {
67+
return std::move(E);
5968
}
60-
Parameters.push_back(NewP);
69+
object::DirectX::RootParameterView ParamView = ParamViewOrErr.get();
70+
71+
if (auto *RCV = dyn_cast<object::DirectX::RootConstantView>(&ParamView)) {
72+
llvm::Expected<dxbc::RootConstants> ConstantsOrErr = RCV->read();
73+
if (Error E = ConstantsOrErr.takeError()) {
74+
return std::move(E);
75+
}
76+
77+
auto Constants = *ConstantsOrErr;
78+
79+
NewP.Constants.Num32BitValues = Constants.Num32BitValues;
80+
NewP.Constants.ShaderRegister = Constants.ShaderRegister;
81+
NewP.Constants.RegisterSpace = Constants.RegisterSpace;
82+
}
83+
RootSigDesc.Parameters.push_back(NewP);
6184
}
6285
#define ROOT_ELEMENT_FLAG(Num, Val) \
63-
Val = (Flags & (uint32_t)dxbc::RootElementFlag::Val) > 0;
86+
RootSigDesc.Val = (Flags & (uint32_t)dxbc::RootElementFlag::Val) > 0;
6487
#include "llvm/BinaryFormat/DXContainerConstants.def"
88+
return RootSigDesc;
6589
}
6690

6791
uint32_t DXContainerYAML::RootSignatureYamlDesc::getEncodedFlags() {
@@ -235,6 +259,8 @@ void MappingTraits<DXContainerYAML::Signature>::mapping(
235259
void MappingTraits<DXContainerYAML::RootSignatureYamlDesc>::mapping(
236260
IO &IO, DXContainerYAML::RootSignatureYamlDesc &S) {
237261
IO.mapRequired("Version", S.Version);
262+
IO.mapRequired("NumRootParameters", S.NumRootParameters);
263+
IO.mapRequired("RootParametersOffset", S.RootParametersOffset);
238264
IO.mapRequired("NumStaticSamplers", S.NumStaticSamplers);
239265
IO.mapRequired("StaticSamplersOffset", S.StaticSamplersOffset);
240266
IO.mapRequired("Parameters", S.Parameters);
@@ -363,18 +389,6 @@ void ScalarEnumerationTraits<dxbc::SigComponentType>::enumeration(
363389
IO.enumCase(Value, E.Name.str().c_str(), E.Value);
364390
}
365391

366-
void ScalarEnumerationTraits<dxbc::RootParameterType>::enumeration(
367-
IO &IO, dxbc::RootParameterType &Value) {
368-
for (const auto &E : dxbc::getRootParameterTypes())
369-
IO.enumCase(Value, E.Name.str().c_str(), E.Value);
370-
}
371-
372-
void ScalarEnumerationTraits<dxbc::ShaderVisibility>::enumeration(
373-
IO &IO, dxbc::ShaderVisibility &Value) {
374-
for (const auto &E : dxbc::getShaderVisibility())
375-
IO.enumCase(Value, E.Name.str().c_str(), E.Value);
376-
}
377-
378392
} // namespace yaml
379393

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

0 commit comments

Comments
 (0)