Skip to content

Commit 2894f96

Browse files
author
joaosaffran
committed
addressing pr comments
1 parent 7c4236c commit 2894f96

File tree

6 files changed

+45
-27
lines changed

6 files changed

+45
-27
lines changed

llvm/include/llvm/MC/DXContainerRootSignature.h

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

99
#include "llvm/BinaryFormat/DXContainer.h"
10+
#include <cstddef>
11+
#include <cstdint>
1012

1113
namespace llvm {
1214

@@ -28,6 +30,10 @@ struct RootSignatureDesc {
2830
2, 0, sizeof(dxbc::RootSignatureHeader), 0, 0, 0}) {}
2931

3032
void write(raw_ostream &OS) const;
33+
34+
size_t getSize() const {
35+
return sizeof(dxbc::RootSignatureHeader) + Parameters.size_in_bytes();
36+
}
3137
};
3238
} // namespace mcdxbc
3339
} // namespace llvm

llvm/include/llvm/Object/DXContainer.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,8 @@ class RootSignature {
133133

134134
SmallVector<DirectX::RootParameter> Parameters;
135135

136+
using ParamsIter = SmallVector<DirectX::RootParameter>::iterator;
137+
136138
public:
137139
RootSignature() {}
138140

@@ -142,9 +144,9 @@ class RootSignature {
142144
uint32_t getRootParametersOffset() const { return RootParametersOffset; }
143145
uint32_t getNumStaticSamplers() const { return NumStaticSamplers; }
144146
uint32_t getStaticSamplersOffset() const { return StaticSamplersOffset; }
145-
const SmallVector<DirectX::RootParameter> &getParameters() const {
146-
return Parameters;
147-
}
147+
ParamsIter beginParams() { return Parameters.begin(); }
148+
149+
ParamsIter endParams() { return Parameters.end(); }
148150
uint32_t getFlags() const { return Flags; }
149151
};
150152

llvm/include/llvm/ObjectYAML/DXContainerYAML.h

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -88,16 +88,16 @@ struct RootParameterYamlDesc {
8888
uint32_t Offset;
8989

9090
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) {
91+
RootParameterYamlDesc(object::DirectX::RootParameter *Parameter) {
92+
Type = Parameter->Header.ParameterType;
93+
Visibility = Parameter->Header.ShaderVisibility;
94+
Offset = Parameter->Header.ParameterOffset;
95+
switch (Parameter->Header.ParameterType) {
9696

9797
case dxbc::RootParameterType::Constants32Bit: {
98-
Constants.Num32BitValues = Parameter.Constants.Num32BitValues;
99-
Constants.RegisterSpace = Parameter.Constants.RegisterSpace;
100-
Constants.ShaderRegister = Parameter.Constants.ShaderRegister;
98+
Constants.Num32BitValues = Parameter->Constants.Num32BitValues;
99+
Constants.RegisterSpace = Parameter->Constants.RegisterSpace;
100+
Constants.ShaderRegister = Parameter->Constants.ShaderRegister;
101101
} break;
102102
case dxbc::RootParameterType::Empty:
103103
llvm_unreachable("Invalid Root Parameter Type. It should be verified "
@@ -112,7 +112,7 @@ struct RootParameterYamlDesc {
112112

113113
struct RootSignatureYamlDesc {
114114
RootSignatureYamlDesc() = default;
115-
RootSignatureYamlDesc(const object::DirectX::RootSignature &Data);
115+
RootSignatureYamlDesc(object::DirectX::RootSignature Data);
116116

117117
uint32_t Version;
118118
uint32_t NumStaticSamplers;

llvm/lib/MC/DXContainerRootSignature.cpp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,41 +7,47 @@
77
//===----------------------------------------------------------------------===//
88

99
#include "llvm/MC/DXContainerRootSignature.h"
10+
#include "llvm/ADT/SmallString.h"
11+
#include "llvm/ADT/SmallVector.h"
12+
#include "llvm/BinaryFormat/DXContainer.h"
1013
#include "llvm/Support/EndianStream.h"
14+
#include <cstdint>
1115

1216
using namespace llvm;
1317
using namespace llvm::mcdxbc;
1418

15-
static uint32_t writePlaceholder(raw_ostream &Stream) {
19+
static uint32_t writePlaceholder(raw_svector_ostream &Stream) {
1620
const uint32_t DummyValue = std::numeric_limits<uint32_t>::max();
1721
uint32_t Offset = Stream.tell();
1822
support::endian::write(Stream, DummyValue, llvm::endianness::little);
1923
return Offset;
2024
}
2125

22-
static void rewriteOffset(buffer_ostream &Stream, uint32_t Offset) {
26+
static void rewriteOffset(raw_svector_ostream &Stream, uint32_t Offset) {
2327
uint32_t Value =
2428
support::endian::byte_swap<uint32_t, llvm::endianness::little>(
2529
Stream.tell());
2630
Stream.pwrite(reinterpret_cast<const char *>(&Value), sizeof(Value), Offset);
2731
}
2832

2933
void RootSignatureDesc::write(raw_ostream &OS) const {
30-
buffer_ostream BOS(OS);
34+
SmallString<256> Storage;
35+
raw_svector_ostream BOS(Storage);
36+
BOS.reserveExtraSpace(getSize());
3137
const uint32_t NumParameters = Parameters.size();
3238
const uint32_t Zero = 0;
3339

3440
support::endian::write(BOS, Header.Version, llvm::endianness::little);
3541
support::endian::write(BOS, NumParameters, llvm::endianness::little);
3642

37-
uint32_t HeaderPoint = writePlaceholder(BOS);
43+
// Root Parameters offset should always start after the
44+
support::endian::write(BOS, (uint32_t)sizeof(dxbc::RootSignatureHeader),
45+
llvm::endianness::little);
3846

3947
support::endian::write(BOS, Zero, llvm::endianness::little);
4048
support::endian::write(BOS, Zero, llvm::endianness::little);
4149
support::endian::write(BOS, Header.Flags, llvm::endianness::little);
4250

43-
rewriteOffset(BOS, HeaderPoint);
44-
4551
SmallVector<uint32_t> ParamsOffsets;
4652
for (const auto &P : Parameters) {
4753
support::endian::write(BOS, P.Header.ParameterType,
@@ -70,4 +76,6 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
7076
llvm_unreachable("Invalid RootParameterType");
7177
}
7278
}
79+
80+
OS.write(Storage.data(), Storage.size());
7381
}

llvm/lib/ObjectYAML/DXContainerYAML.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "llvm/ObjectYAML/DXContainerYAML.h"
1515
#include "llvm/ADT/ScopeExit.h"
1616
#include "llvm/BinaryFormat/DXContainer.h"
17+
#include "llvm/Object/DXContainer.h"
1718
#include "llvm/Support/ScopedPrinter.h"
1819

1920
namespace llvm {
@@ -30,12 +31,13 @@ DXContainerYAML::ShaderFeatureFlags::ShaderFeatureFlags(uint64_t FlagData) {
3031
}
3132

3233
DXContainerYAML::RootSignatureYamlDesc::RootSignatureYamlDesc(
33-
const object::DirectX::RootSignature &Data)
34+
object::DirectX::RootSignature Data)
3435
: Version(Data.getVersion()),
3536
NumStaticSamplers(Data.getNumStaticSamplers()),
3637
StaticSamplersOffset(Data.getStaticSamplersOffset()) {
3738
uint32_t Flags = Data.getFlags();
38-
for (const auto &P : Data.getParameters()) {
39+
for (auto *P = Data.beginParams(); P != Data.endParams(); ++P) {
40+
3941
Parameters.push_back(RootParameterYamlDesc(P));
4042
}
4143
#define ROOT_ELEMENT_FLAG(Num, Val) \

llvm/unittests/Object/DXContainerTest.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -909,7 +909,7 @@ TEST(RootSignature, ParseRootConstant) {
909909
DXContainer C =
910910
llvm::cantFail(DXContainer::create(getMemoryBuffer<133>(Buffer)));
911911

912-
const auto &RS = C.getRootSignature();
912+
auto RS = C.getRootSignature();
913913
ASSERT_TRUE(RS.has_value());
914914
ASSERT_EQ(RS->getVersion(), 2u);
915915
ASSERT_EQ(RS->getNumParameters(), 1);
@@ -918,12 +918,12 @@ TEST(RootSignature, ParseRootConstant) {
918918
ASSERT_EQ(RS->getStaticSamplersOffset(), 44u);
919919
ASSERT_EQ(RS->getFlags(), 17u);
920920

921-
const auto RootParam = RS->getParameters()[0];
922-
ASSERT_EQ((uint32_t)RootParam.Header.ParameterType, 1u);
923-
ASSERT_EQ((uint32_t)RootParam.Header.ShaderVisibility, 2u);
924-
ASSERT_EQ(RootParam.Constants.ShaderRegister, 15u);
925-
ASSERT_EQ(RootParam.Constants.RegisterSpace, 14u);
926-
ASSERT_EQ(RootParam.Constants.Num32BitValues, 16u);
921+
object::DirectX::RootParameter *RootParam = RS->beginParams();
922+
ASSERT_EQ((uint32_t)RootParam->Header.ParameterType, 1u);
923+
ASSERT_EQ((uint32_t)RootParam->Header.ShaderVisibility, 2u);
924+
ASSERT_EQ(RootParam->Constants.ShaderRegister, 15u);
925+
ASSERT_EQ(RootParam->Constants.RegisterSpace, 14u);
926+
ASSERT_EQ(RootParam->Constants.Num32BitValues, 16u);
927927
}
928928
{
929929
// ParameterType has been set to an invalid value

0 commit comments

Comments
 (0)