Skip to content

Commit e383e10

Browse files
author
joaosaffran
committed
Merge branch 'users/joaosaffran/123147' into obj2yaml/root-constants
2 parents ff6184f + 825673f commit e383e10

20 files changed

+243
-188
lines changed

llvm/include/llvm/MC/DXContainerRootSignature.h

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9+
#include "llvm/ADT/SmallVector.h"
910
#include "llvm/BinaryFormat/DXContainer.h"
1011
#include <cstdint>
1112
#include <limits>
@@ -15,36 +16,36 @@ namespace llvm {
1516
class raw_ostream;
1617

1718
namespace mcdxbc {
19+
20+
struct RootConstants {
21+
uint32_t ShaderRegister;
22+
uint32_t RegisterSpace;
23+
uint32_t Num32BitValues;
1824

25+
void write(raw_ostream &OS) const;
26+
};
27+
28+
struct RootParameter {
29+
dxbc::RootParameterType ParameterType;
30+
union {
31+
RootConstants Constants;
32+
};
33+
dxbc::ShaderVisibilityFlag ShaderVisibility;
1934

35+
void write(raw_ostream &OS) const;
36+
};
2037

21-
struct RootSignatureHeader {
38+
struct RootSignatureDesc {
2239
uint32_t Version = 2;
2340
uint32_t NumParameters = 0;
2441
uint32_t RootParametersOffset = 0;
2542
uint32_t NumStaticSamplers = 0;
2643
uint32_t StaticSamplersOffset = 0;
2744
uint32_t Flags = 0;
2845

29-
void write(raw_ostream &OS);
30-
};
46+
SmallVector<RootParameter> Parameters;
3147

32-
struct RootConstants {
33-
uint32_t ShaderRegister;
34-
uint32_t RegisterSpace;
35-
uint32_t Num32BitValues;
36-
37-
void write(raw_ostream &OS);
48+
void write(raw_ostream &OS) const;
3849
};
39-
40-
struct RootParameter {
41-
dxbc::RootParameterType ParameterType;
42-
union {
43-
RootConstants Constants;
44-
};
45-
dxbc::ShaderVisibilityFlag ShaderVisibility;
46-
47-
void write(raw_ostream &OS);
48-
};
4950
} // namespace mcdxbc
5051
} // namespace llvm

llvm/include/llvm/ObjectYAML/DXContainerYAML.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,9 @@ struct ShaderHash {
7474
};
7575

7676
#define ROOT_ELEMENT_FLAG(Num, Val) bool Val = false;
77-
struct RootSignatureDesc {
78-
RootSignatureDesc() = default;
79-
RootSignatureDesc(const object::DirectX::RootSignature &Data);
77+
struct RootSignatureYamlDesc {
78+
RootSignatureYamlDesc() = default;
79+
RootSignatureYamlDesc(const object::DirectX::RootSignature &Data);
8080

8181
uint32_t Version;
8282
uint32_t NumParameters;
@@ -176,7 +176,7 @@ struct Part {
176176
std::optional<ShaderHash> Hash;
177177
std::optional<PSVInfo> Info;
178178
std::optional<DXContainerYAML::Signature> Signature;
179-
std::optional<DXContainerYAML::RootSignatureDesc> RootSignature;
179+
std::optional<DXContainerYAML::RootSignatureYamlDesc> RootSignature;
180180
};
181181

182182
struct Object {
@@ -259,9 +259,9 @@ template <> struct MappingTraits<DXContainerYAML::Signature> {
259259
static void mapping(IO &IO, llvm::DXContainerYAML::Signature &El);
260260
};
261261

262-
template <> struct MappingTraits<DXContainerYAML::RootSignatureDesc> {
262+
template <> struct MappingTraits<DXContainerYAML::RootSignatureYamlDesc> {
263263
static void mapping(IO &IO,
264-
DXContainerYAML::RootSignatureDesc &RootSignature);
264+
DXContainerYAML::RootSignatureYamlDesc &RootSignature);
265265
};
266266

267267
} // namespace yaml

llvm/lib/MC/DXContainerRootSignature.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,20 @@
1313
using namespace llvm;
1414
using namespace llvm::mcdxbc;
1515

16-
void RootSignatureHeader::write(raw_ostream &OS) {
16+
void RootSignatureDesc::write(raw_ostream &OS) const {
17+
1718
support::endian::write(OS, Version, llvm::endianness::little);
1819
support::endian::write(OS, NumParameters, llvm::endianness::little);
1920
support::endian::write(OS, RootParametersOffset, llvm::endianness::little);
2021
support::endian::write(OS, NumStaticSamplers, llvm::endianness::little);
2122
support::endian::write(OS, StaticSamplersOffset, llvm::endianness::little);
2223
support::endian::write(OS, Flags, llvm::endianness::little);
24+
25+
for (const auto &P : Parameters)
26+
P.write(OS);
2327
}
2428

25-
void RootParameter::write(raw_ostream &OS) {
29+
void RootParameter::write(raw_ostream &OS) const {
2630
support::endian::write(OS, ParameterType, llvm::endianness::little);
2731
support::endian::write(OS, ShaderVisibility, llvm::endianness::little);
2832

@@ -33,7 +37,7 @@ void RootParameter::write(raw_ostream &OS) {
3337
}
3438
}
3539

36-
void RootConstants::write(raw_ostream &OS) {
40+
void RootConstants::write(raw_ostream &OS) const {
3741
support::endian::write(OS, Num32BitValues, llvm::endianness::little);
3842
support::endian::write(OS, RegisterSpace, llvm::endianness::little);
3943
support::endian::write(OS, ShaderRegister, llvm::endianness::little);

llvm/lib/Object/DXContainer.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ static Error parseFailed(const Twine &Msg) {
2020
return make_error<GenericBinaryError>(Msg.str(), object_error::parse_failed);
2121
}
2222

23+
static Error validationFailed(const Twine &Msg) {
24+
return make_error<StringError>(Msg.str(), inconvertibleErrorCode());
25+
}
26+
2327
template <typename T>
2428
static Error readStruct(StringRef Buffer, const char *Src, T &Struct) {
2529
// Don't read before the beginning or past the end of the file
@@ -255,7 +259,8 @@ Error DirectX::RootSignature::parse(StringRef Data) {
255259
Current += sizeof(uint32_t);
256260

257261
if (!dxbc::RootSignatureValidations::isValidVersion(VValue))
258-
return make_error<GenericBinaryError>("Invalid Root Signature Version");
262+
return validationFailed("unsupported root signature version read: " +
263+
llvm::Twine(VValue));
259264
Version = VValue;
260265

261266
NumParameters =
@@ -279,7 +284,8 @@ Error DirectX::RootSignature::parse(StringRef Data) {
279284
Current += sizeof(uint32_t);
280285

281286
if (!dxbc::RootSignatureValidations::isValidRootFlag(FValue))
282-
return make_error<GenericBinaryError>("Invalid Root Signature flag");
287+
return validationFailed("unsupported root signature flag value read: " +
288+
llvm::Twine(FValue));
283289
Flags = FValue;
284290

285291
return Error::success();

llvm/lib/ObjectYAML/DXContainerEmitter.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -266,15 +266,15 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
266266
if (!P.RootSignature.has_value())
267267
continue;
268268

269-
mcdxbc::RootSignatureHeader Header;
270-
Header.Flags = P.RootSignature->getEncodedFlags();
271-
Header.Version = P.RootSignature->Version;
272-
Header.NumParameters = P.RootSignature->NumParameters;
273-
Header.RootParametersOffset = P.RootSignature->RootParametersOffset;
274-
Header.NumStaticSamplers = P.RootSignature->NumStaticSamplers;
275-
Header.StaticSamplersOffset = P.RootSignature->StaticSamplersOffset;
276-
277-
Header.write(OS);
269+
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;
276+
277+
RS.write(OS);
278278
break;
279279
}
280280
uint64_t BytesWritten = OS.tell() - DataStart;

llvm/lib/ObjectYAML/DXContainerYAML.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ DXContainerYAML::ShaderFeatureFlags::ShaderFeatureFlags(uint64_t FlagData) {
2929
#include "llvm/BinaryFormat/DXContainerConstants.def"
3030
}
3131

32-
DXContainerYAML::RootSignatureDesc::RootSignatureDesc(
32+
DXContainerYAML::RootSignatureYamlDesc::RootSignatureYamlDesc(
3333
const object::DirectX::RootSignature &Data)
3434
: Version(Data.getVersion()), NumParameters(Data.getNumParameters()),
3535
RootParametersOffset(Data.getRootParametersOffset()),
@@ -41,7 +41,7 @@ DXContainerYAML::RootSignatureDesc::RootSignatureDesc(
4141
#include "llvm/BinaryFormat/DXContainerConstants.def"
4242
}
4343

44-
uint32_t DXContainerYAML::RootSignatureDesc::getEncodedFlags() {
44+
uint32_t DXContainerYAML::RootSignatureYamlDesc::getEncodedFlags() {
4545
uint64_t Flag = 0;
4646
#define ROOT_ELEMENT_FLAG(Num, Val) \
4747
if (Val) \
@@ -209,8 +209,8 @@ void MappingTraits<DXContainerYAML::Signature>::mapping(
209209
IO.mapRequired("Parameters", S.Parameters);
210210
}
211211

212-
void MappingTraits<DXContainerYAML::RootSignatureDesc>::mapping(
213-
IO &IO, DXContainerYAML::RootSignatureDesc &S) {
212+
void MappingTraits<DXContainerYAML::RootSignatureYamlDesc>::mapping(
213+
IO &IO, DXContainerYAML::RootSignatureYamlDesc &S) {
214214
IO.mapRequired("Version", S.Version);
215215
IO.mapRequired("NumParameters", S.NumParameters);
216216
IO.mapRequired("RootParametersOffset", S.RootParametersOffset);

llvm/lib/Target/DirectX/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ add_llvm_target(DirectXCodeGen
3434
DXILShaderFlags.cpp
3535
DXILTranslateMetadata.cpp
3636
DXILRootSignature.cpp
37+
3738
LINK_COMPONENTS
3839
Analysis
3940
AsmPrinter

llvm/lib/Target/DirectX/DXContainerGlobals.cpp

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@
2424
#include "llvm/IR/Module.h"
2525
#include "llvm/InitializePasses.h"
2626
#include "llvm/MC/DXContainerPSVInfo.h"
27-
#include "llvm/MC/DXContainerRootSignature.h"
2827
#include "llvm/Pass.h"
2928
#include "llvm/Support/MD5.h"
29+
#include "llvm/TargetParser/Triple.h"
3030
#include "llvm/Transforms/Utils/ModuleUtils.h"
3131
#include <optional>
3232

@@ -153,19 +153,27 @@ void DXContainerGlobals::addSignature(Module &M,
153153
void DXContainerGlobals::addRootSignature(Module &M,
154154
SmallVector<GlobalValue *> &Globals) {
155155

156+
dxil::ModuleMetadataInfo &MMI =
157+
getAnalysis<DXILMetadataAnalysisWrapperPass>().getModuleMetadata();
158+
159+
// Root Signature in Library don't compile to DXContainer.
160+
if (MMI.ShaderProfile == llvm::Triple::Library)
161+
return;
162+
163+
assert(MMI.EntryPropertyVec.size() == 1);
164+
156165
auto &RSA = getAnalysis<RootSignatureAnalysisWrapper>();
166+
const Function *EntryFunction = MMI.EntryPropertyVec[0].Entry;
167+
const auto &FuncRs = RSA.find(EntryFunction);
157168

158-
if (!RSA.getResult())
169+
if (FuncRs == RSA.end())
159170
return;
160171

161-
const ModuleRootSignature &MRS = RSA.getResult().value();
172+
const RootSignatureDesc &RS = FuncRs->second;
162173
SmallString<256> Data;
163174
raw_svector_ostream OS(Data);
164175

165-
RootSignatureHeader RSH;
166-
RSH.Flags = MRS.Flags;
167-
168-
RSH.write(OS);
176+
RS.write(OS);
169177

170178
Constant *Constant =
171179
ConstantDataArray::getString(M.getContext(), Data, /*AddNull*/ false);

0 commit comments

Comments
 (0)