Skip to content

Commit 8adb678

Browse files
author
joaosaffran
committed
adding rootsignature to obj2yaml
1 parent bb27d5e commit 8adb678

File tree

9 files changed

+101
-0
lines changed

9 files changed

+101
-0
lines changed

llvm/include/llvm/BinaryFormat/DXContainer.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,15 @@ struct ShaderHash {
6363
void swapBytes() { sys::swapByteOrder(Flags); }
6464
};
6565

66+
struct RootSignatureDesc {
67+
uint32_t Version;
68+
uint32_t Flags;
69+
void swapBytes() {
70+
sys::swapByteOrder(Version);
71+
sys::swapByteOrder(Flags);
72+
}
73+
};
74+
6675
struct ContainerVersion {
6776
uint16_t Major;
6877
uint16_t Minor;

llvm/include/llvm/BinaryFormat/DXContainerConstants.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ CONTAINER_PART(DXIL)
44
CONTAINER_PART(SFI0)
55
CONTAINER_PART(HASH)
66
CONTAINER_PART(PSV0)
7+
CONTAINER_PART(RTS0)
78
CONTAINER_PART(ISG1)
89
CONTAINER_PART(OSG1)
910
CONTAINER_PART(PSG1)

llvm/include/llvm/Object/DXContainer.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,7 @@ class DXContainer {
287287
std::optional<uint64_t> ShaderFeatureFlags;
288288
std::optional<dxbc::ShaderHash> Hash;
289289
std::optional<DirectX::PSVRuntimeInfo> PSVInfo;
290+
std::optional<dxbc::RootSignatureDesc> RootSignature;
290291
DirectX::Signature InputSignature;
291292
DirectX::Signature OutputSignature;
292293
DirectX::Signature PatchConstantSignature;
@@ -296,6 +297,7 @@ class DXContainer {
296297
Error parseDXILHeader(StringRef Part);
297298
Error parseShaderFeatureFlags(StringRef Part);
298299
Error parseHash(StringRef Part);
300+
Error parseRootSignature(StringRef Part);
299301
Error parsePSVInfo(StringRef Part);
300302
Error parseSignature(StringRef Part, DirectX::Signature &Array);
301303
friend class PartIterator;
@@ -382,6 +384,11 @@ class DXContainer {
382384

383385
std::optional<dxbc::ShaderHash> getShaderHash() const { return Hash; }
384386

387+
std::optional<dxbc::RootSignatureDesc>
388+
getRootSignature() const {
389+
return RootSignature;
390+
}
391+
385392
const std::optional<DirectX::PSVRuntimeInfo> &getPSVInfo() const {
386393
return PSVInfo;
387394
};

llvm/include/llvm/ObjectYAML/DXContainerYAML.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,16 @@ struct ShaderHash {
7272
std::vector<llvm::yaml::Hex8> Digest;
7373
};
7474

75+
76+
77+
struct RootSignatureDesc {
78+
RootSignatureDesc() = default;
79+
RootSignatureDesc(const dxbc::RootSignatureDesc &Data);
80+
81+
uint32_t Version;
82+
uint32_t Flags;
83+
};
84+
7585
using ResourceFlags = dxbc::PSV::ResourceFlags;
7686
using ResourceBindInfo = dxbc::PSV::v2::ResourceBindInfo;
7787

@@ -159,6 +169,7 @@ struct Part {
159169
std::optional<ShaderHash> Hash;
160170
std::optional<PSVInfo> Info;
161171
std::optional<DXContainerYAML::Signature> Signature;
172+
std::optional<DXContainerYAML::RootSignatureDesc> RootSignature;
162173
};
163174

164175
struct Object {
@@ -241,6 +252,11 @@ template <> struct MappingTraits<DXContainerYAML::Signature> {
241252
static void mapping(IO &IO, llvm::DXContainerYAML::Signature &El);
242253
};
243254

255+
template <> struct MappingTraits<DXContainerYAML::RootSignatureDesc> {
256+
static void mapping(IO &IO,
257+
DXContainerYAML::RootSignatureDesc &RootSignature);
258+
};
259+
244260
} // namespace yaml
245261

246262
} // namespace llvm

llvm/lib/Object/DXContainer.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "llvm/BinaryFormat/DXContainer.h"
1111
#include "llvm/Object/Error.h"
1212
#include "llvm/Support/Alignment.h"
13+
#include "llvm/Support/ErrorHandling.h"
1314
#include "llvm/Support/FormatVariadic.h"
1415

1516
using namespace llvm;
@@ -92,6 +93,14 @@ Error DXContainer::parseHash(StringRef Part) {
9293
return Error::success();
9394
}
9495

96+
Error DXContainer::parseRootSignature(StringRef Part) {
97+
dxbc::RootSignatureDesc Desc;
98+
if (Error Err = readStruct(Part, Part.begin(), Desc))
99+
return Err;
100+
RootSignature = Desc;
101+
return Error::success();
102+
}
103+
95104
Error DXContainer::parsePSVInfo(StringRef Part) {
96105
if (PSVInfo)
97106
return parseFailed("More than one PSV0 part is present in the file");
@@ -192,6 +201,11 @@ Error DXContainer::parsePartOffsets() {
192201
return Err;
193202
break;
194203
case dxbc::PartType::Unknown:
204+
break;
205+
case dxbc::PartType::RTS0:
206+
if (Error Err = parseRootSignature(PartData))
207+
return Err;
208+
195209
break;
196210
}
197211
}

llvm/lib/ObjectYAML/DXContainerEmitter.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,14 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
261261
}
262262
case dxbc::PartType::Unknown:
263263
break; // Skip any handling for unrecognized parts.
264+
case dxbc::PartType::RTS0:
265+
if (!P.RootSignature.has_value())
266+
continue;
267+
dxbc::RootSignatureDesc RS = {P.RootSignature->Version, P.RootSignature->Flags};
268+
if (sys::IsBigEndianHost)
269+
RS.swapBytes();
270+
OS.write(reinterpret_cast<char *>(&RS), sizeof(dxbc::RootSignatureDesc));
271+
break;
264272
}
265273
uint64_t BytesWritten = OS.tell() - DataStart;
266274
RollingOffset += BytesWritten;

llvm/lib/ObjectYAML/DXContainerYAML.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ DXContainerYAML::ShaderHash::ShaderHash(const dxbc::ShaderHash &Data)
4545
memcpy(Digest.data(), &Data.Digest[0], 16);
4646
}
4747

48+
DXContainerYAML::RootSignatureDesc::RootSignatureDesc(const dxbc::RootSignatureDesc &Data)
49+
: Version(Data.Version), Flags(Data.Flags) {
50+
}
51+
4852
DXContainerYAML::PSVInfo::PSVInfo() : Version(0) {
4953
memset(&Info, 0, sizeof(Info));
5054
}
@@ -188,6 +192,12 @@ void MappingTraits<DXContainerYAML::Signature>::mapping(
188192
IO.mapRequired("Parameters", S.Parameters);
189193
}
190194

195+
void MappingTraits<DXContainerYAML::RootSignatureDesc>::mapping(
196+
IO &IO, DXContainerYAML::RootSignatureDesc &S) {
197+
IO.mapRequired("Version", S.Version);
198+
IO.mapRequired("Flags", S.Flags);
199+
}
200+
191201
void MappingTraits<DXContainerYAML::Part>::mapping(IO &IO,
192202
DXContainerYAML::Part &P) {
193203
IO.mapRequired("Name", P.Name);
@@ -197,6 +207,7 @@ void MappingTraits<DXContainerYAML::Part>::mapping(IO &IO,
197207
IO.mapOptional("Hash", P.Hash);
198208
IO.mapOptional("PSVInfo", P.Info);
199209
IO.mapOptional("Signature", P.Signature);
210+
IO.mapOptional("RootSignature", P.RootSignature);
200211
}
201212

202213
void MappingTraits<DXContainerYAML::Object>::mapping(
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
; RUN: opt %s -dxil-embed -dxil-globals -S -o - | FileCheck %s
2+
; RUN: llc %s --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=DXC
3+
4+
target triple = "dxil-unknown-shadermodel6.0-compute"
5+
6+
; CHECK: @dx.rts0 = private constant [8 x i8] c"{{.*}}", section "RTS0", align 4
7+
8+
9+
define void @main() #0 {
10+
entry:
11+
ret void
12+
}
13+
14+
attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
15+
16+
17+
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
18+
!2 = !{ ptr @main, !3 } ; function, root signature
19+
!3 = !{ !4 } ; list of root signature elements
20+
!4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
21+
22+
23+
; DXC: - Name: RTS0
24+
; DXC-NEXT: Size: 8
25+
; DXC-NEXT: RootSignature:
26+
; DXC-NEXT: Version: 1.0
27+
; DXC-NEXT: Flags: AllowInputAssemblerInputLayout

llvm/tools/obj2yaml/dxcontainer2yaml.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@
77
//===----------------------------------------------------------------------===//
88

99
#include "obj2yaml.h"
10+
#include "llvm/BinaryFormat/DXContainer.h"
1011
#include "llvm/Object/DXContainer.h"
1112
#include "llvm/ObjectYAML/DXContainerYAML.h"
1213
#include "llvm/Support/Error.h"
14+
#include "llvm/Support/ErrorHandling.h"
1315

1416
#include <algorithm>
1517

@@ -153,6 +155,12 @@ dumpDXContainer(MemoryBufferRef Source) {
153155
break;
154156
case dxbc::PartType::Unknown:
155157
break;
158+
case dxbc::PartType::RTS0:
159+
std::optional<dxbc::RootSignatureDesc> RS = Container.getRootSignature();
160+
if (RS && RS.has_value())
161+
NewPart.RootSignature = DXContainerYAML::RootSignatureDesc(*RS);
162+
break;
163+
break;
156164
}
157165
}
158166

0 commit comments

Comments
 (0)