[llvm-branch-commits] [llvm] [HLSL] Refactor Offset calculation while writing Root Signatures. (PR #128577)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Feb 25 10:53:09 PST 2025
https://github.com/joaosaffran updated https://github.com/llvm/llvm-project/pull/128577
>From 767b7d02bf71e6e0137e2b5f9f9b8d8b799ac81f Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Sat, 22 Feb 2025 06:19:15 +0000
Subject: [PATCH 1/5] first working version
---
.../llvm/MC/DXContainerRootSignature.h | 5 +-
llvm/lib/MC/DXContainerRootSignature.cpp | 90 +++++++++++++------
llvm/lib/Object/DXContainer.cpp | 10 ++-
llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 4 +-
.../lib/Target/DirectX/DXContainerGlobals.cpp | 5 +-
.../ContainerData/RootSignature-Flags.ll | 2 +-
.../DXContainer/RootSignature-Flags.yaml | 2 +-
.../RootSignature-MultipleParameters.yaml | 2 +-
.../ObjectYAML/DXContainerYAMLTest.cpp | 8 +-
9 files changed, 85 insertions(+), 43 deletions(-)
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index b31b0da352038..cae4f79aef56f 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -7,8 +7,7 @@
//===----------------------------------------------------------------------===//
#include "llvm/BinaryFormat/DXContainer.h"
-#include <cstdint>
-#include <limits>
+#include "llvm/Support/raw_ostream.h"
namespace llvm {
@@ -19,7 +18,7 @@ struct RootSignatureDesc {
dxbc::RootSignatureHeader Header;
SmallVector<dxbc::RootParameter> Parameters;
- void write(raw_ostream &OS) const;
+ Error write(raw_ostream &OS) const;
};
} // namespace mcdxbc
} // namespace llvm
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 35a4ef322d01e..9a279ab722877 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -7,53 +7,89 @@
//===----------------------------------------------------------------------===//
#include "llvm/MC/DXContainerRootSignature.h"
-#include "llvm/Support/EndianStream.h"
+#include "llvm/Support/BinaryStreamWriter.h"
+#include <vector>
using namespace llvm;
using namespace llvm::mcdxbc;
-void RootSignatureDesc::write(raw_ostream &OS) const {
- // Root signature header in dxcontainer has 6 uint_32t values.
- const uint32_t HeaderSize = 24;
- const uint32_t ParameterByteSize = Parameters.size_in_bytes();
- const uint32_t NumParametes = Parameters.size();
+Error RootSignatureDesc::write(raw_ostream &OS) const {
+ // Header Size + accounting for parameter offset + parameters size
+ std::vector<uint8_t> Buffer(24 + (Parameters.size() * 4) +
+ Parameters.size_in_bytes());
+ BinaryStreamWriter Writer(Buffer, llvm::endianness::little);
+
+ SmallVector<uint64_t> OffsetsToReplace;
+ SmallVector<uint32_t> ValuesToReplaceOffsetsWith;
+ const uint32_t Dummy = std::numeric_limits<uint32_t>::max();
+
+ const uint32_t NumParameters = Parameters.size();
const uint32_t Zero = 0;
- // Writing header information
- support::endian::write(OS, Header.Version, llvm::endianness::little);
- support::endian::write(OS, NumParametes, llvm::endianness::little);
- support::endian::write(OS, HeaderSize, llvm::endianness::little);
+ if (Error Err = Writer.writeInteger(Header.Version))
+ return Err;
+
+ if (Error Err = Writer.writeInteger(NumParameters))
+ return Err;
+
+ OffsetsToReplace.push_back(Writer.getOffset());
+ if (Error Err = Writer.writeInteger(Dummy))
+ return Err;
// Static samplers still not implemented
- support::endian::write(OS, Zero, llvm::endianness::little);
- support::endian::write(OS, ParameterByteSize + HeaderSize,
- llvm::endianness::little);
+ if (Error Err = Writer.writeInteger(Zero))
+ return Err;
+
+ if (Error Err = Writer.writeInteger(Zero))
+ return Err;
+
+ if (Error Err = Writer.writeInteger(Header.Flags))
+ return Err;
- support::endian::write(OS, Header.Flags, llvm::endianness::little);
+ ValuesToReplaceOffsetsWith.push_back(Writer.getOffset());
- uint32_t ParamsOffset =
- HeaderSize + (3 * sizeof(uint32_t) * Parameters.size());
for (const dxbc::RootParameter &P : Parameters) {
- support::endian::write(OS, P.ParameterType, llvm::endianness::little);
- support::endian::write(OS, P.ShaderVisibility, llvm::endianness::little);
- support::endian::write(OS, ParamsOffset, llvm::endianness::little);
+ if (Error Err = Writer.writeEnum(P.ParameterType))
+ return Err;
+ if (Error Err = Writer.writeEnum(P.ShaderVisibility))
+ return Err;
- // Size of root parameter, removing the ParameterType and ShaderVisibility.
- ParamsOffset += sizeof(dxbc::RootParameter) - 2 * sizeof(uint32_t);
+ OffsetsToReplace.push_back(Writer.getOffset());
+ if (Error Err = Writer.writeInteger(Dummy))
+ return Err;
}
for (const dxbc::RootParameter &P : Parameters) {
+ ValuesToReplaceOffsetsWith.push_back(Writer.getOffset());
switch (P.ParameterType) {
case dxbc::RootParameterType::Constants32Bit: {
- support::endian::write(OS, P.Constants.ShaderRegister,
- llvm::endianness::little);
- support::endian::write(OS, P.Constants.RegisterSpace,
- llvm::endianness::little);
- support::endian::write(OS, P.Constants.Num32BitValues,
- llvm::endianness::little);
+ if (Error Err = Writer.writeInteger(P.Constants.ShaderRegister))
+ return Err;
+ if (Error Err = Writer.writeInteger(P.Constants.RegisterSpace))
+ return Err;
+ if (Error Err = Writer.writeInteger(P.Constants.Num32BitValues))
+ return Err;
} break;
case dxbc::RootParameterType::Empty:
llvm_unreachable("Invalid RootParameterType");
}
}
+
+ assert(ValuesToReplaceOffsetsWith.size() == OffsetsToReplace.size() &&
+ "Offset missing value to replace with.");
+
+ for (size_t It = 0; It < ValuesToReplaceOffsetsWith.size(); It++) {
+ uint32_t Position = OffsetsToReplace[It];
+ uint32_t Value = ValuesToReplaceOffsetsWith[It];
+
+ Writer.setOffset(Position);
+ if (Error Err = Writer.writeInteger(Value))
+ return Err;
+ }
+
+ llvm::ArrayRef<char> BufferRef(reinterpret_cast<char *>(Buffer.data()),
+ Buffer.size());
+ OS.write(BufferRef.data(), BufferRef.size());
+
+ return Error::success();
}
diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 010f70a952ebf..35261b661cf2f 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -296,16 +296,18 @@ Error DirectX::RootSignature::parse(StringRef Data) {
NewParam.ParameterType =
support::endian::read<dxbc::RootParameterType,
llvm::endianness::little>(Current);
- if (!dxbc::RootSignatureValidations::isValidParameterType(NewParam.ParameterType))
+ if (!dxbc::RootSignatureValidations::isValidParameterType(
+ NewParam.ParameterType))
return validationFailed("unsupported parameter type value read: " +
llvm::Twine((uint32_t)NewParam.ParameterType));
Current += sizeof(dxbc::RootParameterType);
NewParam.ShaderVisibility =
- support::endian::read<dxbc::ShaderVisibility,
- llvm::endianness::little>(Current);
- if (!dxbc::RootSignatureValidations::isValidShaderVisibility(NewParam.ShaderVisibility))
+ support::endian::read<dxbc::ShaderVisibility, llvm::endianness::little>(
+ Current);
+ if (!dxbc::RootSignatureValidations::isValidShaderVisibility(
+ NewParam.ShaderVisibility))
return validationFailed("unsupported shader visility flag value read: " +
llvm::Twine((uint32_t)NewParam.ShaderVisibility));
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index 87ba16fd40ba9..a5831a69f9bca 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -271,7 +271,9 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
RS.Header.Version = P.RootSignature->Version;
RS.Parameters = std::move(P.RootSignature->Parameters);
- RS.write(OS);
+ if (Error Err = RS.write(OS))
+ handleAllErrors(std::move(Err));
+
break;
}
uint64_t BytesWritten = OS.tell() - DataStart;
diff --git a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
index 5508af40663b1..5801046f83674 100644
--- a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
+++ b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
@@ -25,10 +25,12 @@
#include "llvm/InitializePasses.h"
#include "llvm/MC/DXContainerPSVInfo.h"
#include "llvm/Pass.h"
+#include "llvm/Support/Error.h"
#include "llvm/Support/MD5.h"
#include "llvm/TargetParser/Triple.h"
#include "llvm/Transforms/Utils/ModuleUtils.h"
#include <optional>
+#include <utility>
using namespace llvm;
using namespace llvm::dxil;
@@ -173,7 +175,8 @@ void DXContainerGlobals::addRootSignature(Module &M,
SmallString<256> Data;
raw_svector_ostream OS(Data);
- RS.write(OS);
+ if (Error Err = RS.write(OS))
+ handleAllErrors(std::move(Err));
Constant *Constant =
ConstantDataArray::getString(M.getContext(), Data, /*AddNull*/ false);
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
index 035ea373d30ea..1ca6ebb7ddab8 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
@@ -23,6 +23,6 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
; DXC-NEXT: RootSignature:
; DXC-NEXT: Version: 2
; DXC-NEXT: NumStaticSamplers: 0
-; DXC-NEXT: StaticSamplersOffset: 24
+; DXC-NEXT: StaticSamplersOffset: 0
; DXC-NEXT: Parameters: []
; DXC-NEXT: AllowInputAssemblerInputLayout: true
diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
index 1b73b830f015f..0d7902afdaa66 100644
--- a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
@@ -25,7 +25,7 @@ Parts:
# CHECK-NEXT: RootSignature:
# CHECK-NEXT: Version: 2
# CHECK-NEXT: NumStaticSamplers: 0
-# CHECK-NEXT: StaticSamplersOffset: 24
+# CHECK-NEXT: StaticSamplersOffset: 0
# CHECK-NEXT: Parameters: []
# CHECK-NEXT: AllowInputAssemblerInputLayout: true
# CHECK-NEXT: DenyGeometryShaderRootAccess: true
diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml
index bccfacb72819b..8d5ab5c1b0b23 100644
--- a/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml
@@ -37,7 +37,7 @@ Parts:
# CHECK-NEXT: RootSignature:
# CHECK-NEXT: Version: 2
# CHECK-NEXT: NumStaticSamplers: 0
-# CHECK-NEXT: StaticSamplersOffset: 64
+# CHECK-NEXT: StaticSamplersOffset: 0
# CHECK-NEXT: Parameters:
# CHECK-NEXT: - ParameterType: Constants32Bit
# CHECK-NEXT: ShaderVisibility: Hull
diff --git a/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp b/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
index b5fb8d143c0b9..fed941f685272 100644
--- a/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
+++ b/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
@@ -134,12 +134,12 @@ TEST(RootSignature, ParseRootFlags) {
)"));
uint8_t Buffer[] = {
- 0x44, 0x58, 0x42, 0x43, 0x32, 0x9A, 0x53, 0xD8, 0xEC, 0xBE, 0x35, 0x6F,
- 0x05, 0x39, 0xE1, 0xFE, 0x31, 0x20, 0xF0, 0xC1, 0x01, 0x00, 0x00, 0x00,
+ 0x44, 0x58, 0x42, 0x43, 0x32, 0x9a, 0x53, 0xd8, 0xec, 0xbe, 0x35, 0x6f,
+ 0x05, 0x39, 0xe1, 0xfe, 0x31, 0x20, 0xf0, 0xc1, 0x01, 0x00, 0x00, 0x00,
0x44, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
0x52, 0x54, 0x53, 0x30, 0x18, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
};
EXPECT_EQ(Storage.size(), 68u);
@@ -184,7 +184,7 @@ TEST(RootSignature, ParseRootConstants) {
0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
0x52, 0x54, 0x53, 0x30, 0x59, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x2c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
0x0e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
>From d39172781e9f7e882de78d2e24a7bd1bd8c48688 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 24 Feb 2025 20:57:23 +0000
Subject: [PATCH 2/5] moving the offset logic to it's own class
---
.../llvm/MC/DXContainerRootSignature.h | 24 ++++++
llvm/lib/MC/DXContainerRootSignature.cpp | 83 +++++++++++++------
2 files changed, 81 insertions(+), 26 deletions(-)
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index cae4f79aef56f..ca958c0780cdd 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -7,18 +7,42 @@
//===----------------------------------------------------------------------===//
#include "llvm/BinaryFormat/DXContainer.h"
+#include "llvm/Support/BinaryStreamWriter.h"
#include "llvm/Support/raw_ostream.h"
+#include <map>
+#include <string>
namespace llvm {
class raw_ostream;
namespace mcdxbc {
+
+class StreamOffsetHelper {
+private:
+ std::map<std::string, std::pair<uint32_t, uint32_t>> OffsetsMaping;
+ BinaryStreamWriter &Stream;
+
+public:
+ explicit StreamOffsetHelper(BinaryStreamWriter &Stream) : Stream(Stream) {}
+
+ Error addOffset(std::string Key);
+
+ void addRewriteValue(std::string Key);
+
+ Error rewrite();
+};
+
struct RootSignatureDesc {
dxbc::RootSignatureHeader Header;
SmallVector<dxbc::RootParameter> Parameters;
Error write(raw_ostream &OS) const;
+
+ uint32_t getSizeInBytes() const {
+ // Header Size + accounting for parameter offset + parameters size
+ return 24 + (Parameters.size() * 4) + Parameters.size_in_bytes();
+ }
};
} // namespace mcdxbc
} // namespace llvm
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 9a279ab722877..828785980c15d 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -7,21 +7,55 @@
//===----------------------------------------------------------------------===//
#include "llvm/MC/DXContainerRootSignature.h"
+#include "llvm/ADT/Twine.h"
#include "llvm/Support/BinaryStreamWriter.h"
-#include <vector>
using namespace llvm;
using namespace llvm::mcdxbc;
+Error StreamOffsetHelper::addOffset(std::string Key) {
+ const uint32_t DummyValue = std::numeric_limits<uint32_t>::max();
+
+ uint32_t Offset = Stream.getOffset();
+ auto Value = std::make_pair(Offset, DummyValue);
+
+ OffsetsMaping.insert_or_assign(Key, Value);
+
+ if (Error Err = Stream.writeInteger(DummyValue))
+ return Err;
+
+ return Error::success();
+}
+
+void StreamOffsetHelper::addRewriteValue(std::string Key) {
+ auto It = OffsetsMaping.find(Key);
+ assert(It != OffsetsMaping.end() && "Offset address was not found.");
+ auto [Offset, _] = It->second;
+
+ uint32_t Value = Stream.getOffset();
+
+ std::pair<uint32_t, uint32_t> NewValue = std::make_pair(Offset, Value);
+ OffsetsMaping.insert_or_assign(Key, NewValue);
+}
+
+Error StreamOffsetHelper::rewrite() {
+ for (auto &[Key, RewriteInfo] : OffsetsMaping) {
+ auto [Position, Value] = RewriteInfo;
+ assert(Value != std::numeric_limits<uint32_t>::max());
+
+ Stream.setOffset(Position);
+ if (Error Err = Stream.writeInteger(Value))
+ return Err;
+ }
+
+ return Error::success();
+}
+
Error RootSignatureDesc::write(raw_ostream &OS) const {
- // Header Size + accounting for parameter offset + parameters size
- std::vector<uint8_t> Buffer(24 + (Parameters.size() * 4) +
- Parameters.size_in_bytes());
+ std::vector<uint8_t> Buffer(getSizeInBytes());
BinaryStreamWriter Writer(Buffer, llvm::endianness::little);
- SmallVector<uint64_t> OffsetsToReplace;
- SmallVector<uint32_t> ValuesToReplaceOffsetsWith;
- const uint32_t Dummy = std::numeric_limits<uint32_t>::max();
+ StreamOffsetHelper OffsetMap(Writer);
const uint32_t NumParameters = Parameters.size();
const uint32_t Zero = 0;
@@ -32,8 +66,7 @@ Error RootSignatureDesc::write(raw_ostream &OS) const {
if (Error Err = Writer.writeInteger(NumParameters))
return Err;
- OffsetsToReplace.push_back(Writer.getOffset());
- if (Error Err = Writer.writeInteger(Dummy))
+ if (Error Err = OffsetMap.addOffset("header"))
return Err;
// Static samplers still not implemented
@@ -46,21 +79,28 @@ Error RootSignatureDesc::write(raw_ostream &OS) const {
if (Error Err = Writer.writeInteger(Header.Flags))
return Err;
- ValuesToReplaceOffsetsWith.push_back(Writer.getOffset());
+ OffsetMap.addRewriteValue("header");
+
+ for (size_t It = 0; It < Parameters.size(); It++) {
+ const auto &P = Parameters[It];
- for (const dxbc::RootParameter &P : Parameters) {
if (Error Err = Writer.writeEnum(P.ParameterType))
return Err;
+
if (Error Err = Writer.writeEnum(P.ShaderVisibility))
return Err;
- OffsetsToReplace.push_back(Writer.getOffset());
- if (Error Err = Writer.writeInteger(Dummy))
+ std::string Key = ("parameters" + Twine(It)).str();
+ if (Error Err = OffsetMap.addOffset(Key))
return Err;
}
- for (const dxbc::RootParameter &P : Parameters) {
- ValuesToReplaceOffsetsWith.push_back(Writer.getOffset());
+ for (size_t It = 0; It < Parameters.size(); It++) {
+ const auto &P = Parameters[It];
+
+ std::string Key = ("parameters" + Twine(It)).str();
+ OffsetMap.addRewriteValue(Key);
+
switch (P.ParameterType) {
case dxbc::RootParameterType::Constants32Bit: {
if (Error Err = Writer.writeInteger(P.Constants.ShaderRegister))
@@ -75,17 +115,8 @@ Error RootSignatureDesc::write(raw_ostream &OS) const {
}
}
- assert(ValuesToReplaceOffsetsWith.size() == OffsetsToReplace.size() &&
- "Offset missing value to replace with.");
-
- for (size_t It = 0; It < ValuesToReplaceOffsetsWith.size(); It++) {
- uint32_t Position = OffsetsToReplace[It];
- uint32_t Value = ValuesToReplaceOffsetsWith[It];
-
- Writer.setOffset(Position);
- if (Error Err = Writer.writeInteger(Value))
- return Err;
- }
+ if (Error Err = OffsetMap.rewrite())
+ return Err;
llvm::ArrayRef<char> BufferRef(reinterpret_cast<char *>(Buffer.data()),
Buffer.size());
>From 68c7513d27ee9d5ada3851230b4dcd9611e88f02 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 24 Feb 2025 22:39:34 +0000
Subject: [PATCH 3/5] refactoring to remove use of map and string
---
.../llvm/MC/DXContainerRootSignature.h | 18 +----
llvm/lib/MC/DXContainerRootSignature.cpp | 65 ++++++++-----------
2 files changed, 28 insertions(+), 55 deletions(-)
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index ca958c0780cdd..911ff53c15fae 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -6,11 +6,10 @@
//
//===----------------------------------------------------------------------===//
+#include "llvm/ADT/IndexedMap.h"
#include "llvm/BinaryFormat/DXContainer.h"
#include "llvm/Support/BinaryStreamWriter.h"
#include "llvm/Support/raw_ostream.h"
-#include <map>
-#include <string>
namespace llvm {
@@ -18,21 +17,6 @@ class raw_ostream;
namespace mcdxbc {
-class StreamOffsetHelper {
-private:
- std::map<std::string, std::pair<uint32_t, uint32_t>> OffsetsMaping;
- BinaryStreamWriter &Stream;
-
-public:
- explicit StreamOffsetHelper(BinaryStreamWriter &Stream) : Stream(Stream) {}
-
- Error addOffset(std::string Key);
-
- void addRewriteValue(std::string Key);
-
- Error rewrite();
-};
-
struct RootSignatureDesc {
dxbc::RootSignatureHeader Header;
SmallVector<dxbc::RootParameter> Parameters;
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 828785980c15d..abcaa66aff380 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -7,19 +7,19 @@
//===----------------------------------------------------------------------===//
#include "llvm/MC/DXContainerRootSignature.h"
+#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Support/BinaryStreamWriter.h"
+#include <cstdint>
+#include <sys/types.h>
using namespace llvm;
using namespace llvm::mcdxbc;
-Error StreamOffsetHelper::addOffset(std::string Key) {
+Error setRewrite(BinaryStreamWriter &Stream, uint32_t &Offset) {
const uint32_t DummyValue = std::numeric_limits<uint32_t>::max();
- uint32_t Offset = Stream.getOffset();
- auto Value = std::make_pair(Offset, DummyValue);
-
- OffsetsMaping.insert_or_assign(Key, Value);
+ Offset = Stream.getOffset();
if (Error Err = Stream.writeInteger(DummyValue))
return Err;
@@ -27,26 +27,13 @@ Error StreamOffsetHelper::addOffset(std::string Key) {
return Error::success();
}
-void StreamOffsetHelper::addRewriteValue(std::string Key) {
- auto It = OffsetsMaping.find(Key);
- assert(It != OffsetsMaping.end() && "Offset address was not found.");
- auto [Offset, _] = It->second;
-
- uint32_t Value = Stream.getOffset();
-
- std::pair<uint32_t, uint32_t> NewValue = std::make_pair(Offset, Value);
- OffsetsMaping.insert_or_assign(Key, NewValue);
-}
-
-Error StreamOffsetHelper::rewrite() {
- for (auto &[Key, RewriteInfo] : OffsetsMaping) {
- auto [Position, Value] = RewriteInfo;
- assert(Value != std::numeric_limits<uint32_t>::max());
+Error rewriteOffset(BinaryStreamWriter &Stream, uint32_t Offset) {
+ uint64_t Value = Stream.getOffset();
+ Stream.setOffset(Offset);
+ if (Error Err = Stream.writeInteger((uint32_t)Value))
+ return Err;
- Stream.setOffset(Position);
- if (Error Err = Stream.writeInteger(Value))
- return Err;
- }
+ Stream.setOffset(Value);
return Error::success();
}
@@ -55,8 +42,6 @@ Error RootSignatureDesc::write(raw_ostream &OS) const {
std::vector<uint8_t> Buffer(getSizeInBytes());
BinaryStreamWriter Writer(Buffer, llvm::endianness::little);
- StreamOffsetHelper OffsetMap(Writer);
-
const uint32_t NumParameters = Parameters.size();
const uint32_t Zero = 0;
@@ -66,7 +51,8 @@ Error RootSignatureDesc::write(raw_ostream &OS) const {
if (Error Err = Writer.writeInteger(NumParameters))
return Err;
- if (Error Err = OffsetMap.addOffset("header"))
+ uint32_t HeaderPoint;
+ if (Error Err = setRewrite(Writer, HeaderPoint))
return Err;
// Static samplers still not implemented
@@ -79,10 +65,11 @@ Error RootSignatureDesc::write(raw_ostream &OS) const {
if (Error Err = Writer.writeInteger(Header.Flags))
return Err;
- OffsetMap.addRewriteValue("header");
+ if (Error Err = rewriteOffset(Writer, HeaderPoint))
+ return Err;
- for (size_t It = 0; It < Parameters.size(); It++) {
- const auto &P = Parameters[It];
+ SmallVector<uint32_t> ParamsOffset;
+ for (const auto &P : Parameters) {
if (Error Err = Writer.writeEnum(P.ParameterType))
return Err;
@@ -90,16 +77,19 @@ Error RootSignatureDesc::write(raw_ostream &OS) const {
if (Error Err = Writer.writeEnum(P.ShaderVisibility))
return Err;
- std::string Key = ("parameters" + Twine(It)).str();
- if (Error Err = OffsetMap.addOffset(Key))
+ uint32_t Offset;
+ if (Error Err = setRewrite(Writer, Offset))
return Err;
+ ParamsOffset.push_back(Offset);
}
- for (size_t It = 0; It < Parameters.size(); It++) {
- const auto &P = Parameters[It];
+ size_t It = 0;
+ for (const auto &P : Parameters) {
- std::string Key = ("parameters" + Twine(It)).str();
- OffsetMap.addRewriteValue(Key);
+ auto Offset = ParamsOffset[It];
+ if (Error Err = rewriteOffset(Writer, Offset))
+ return Err;
+ It++;
switch (P.ParameterType) {
case dxbc::RootParameterType::Constants32Bit: {
@@ -115,8 +105,7 @@ Error RootSignatureDesc::write(raw_ostream &OS) const {
}
}
- if (Error Err = OffsetMap.rewrite())
- return Err;
+ assert(It == NumParameters);
llvm::ArrayRef<char> BufferRef(reinterpret_cast<char *>(Buffer.data()),
Buffer.size());
>From 23069ab6def6089a74ce50f3d1b42c896b13f623 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 25 Feb 2025 04:25:33 +0000
Subject: [PATCH 4/5] addressing comments
---
llvm/lib/MC/DXContainerRootSignature.cpp | 13 +++++--------
1 file changed, 5 insertions(+), 8 deletions(-)
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index abcaa66aff380..5cdd7726e6e3f 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -83,13 +83,12 @@ Error RootSignatureDesc::write(raw_ostream &OS) const {
ParamsOffset.push_back(Offset);
}
- size_t It = 0;
- for (const auto &P : Parameters) {
-
- auto Offset = ParamsOffset[It];
- if (Error Err = rewriteOffset(Writer, Offset))
+ assert(NumParameters == ParamsOffset.size());
+ for (size_t I = 0; I < NumParameters; ++I) {
+ if (Error Err = rewriteOffset(Writer, ParamsOffset[I]))
return Err;
- It++;
+
+ const auto &P = Parameters[I];
switch (P.ParameterType) {
case dxbc::RootParameterType::Constants32Bit: {
@@ -105,8 +104,6 @@ Error RootSignatureDesc::write(raw_ostream &OS) const {
}
}
- assert(It == NumParameters);
-
llvm::ArrayRef<char> BufferRef(reinterpret_cast<char *>(Buffer.data()),
Buffer.size());
OS.write(BufferRef.data(), BufferRef.size());
>From d14471b11c7eaaa12870982229cc804946cc59fb Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 25 Feb 2025 18:52:33 +0000
Subject: [PATCH 5/5] using buffer_ostream
---
.../llvm/MC/DXContainerRootSignature.h | 2 -
llvm/lib/MC/DXContainerRootSignature.cpp | 90 ++++++-------------
2 files changed, 29 insertions(+), 63 deletions(-)
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index 911ff53c15fae..9e8c7ee54c148 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -6,9 +6,7 @@
//
//===----------------------------------------------------------------------===//
-#include "llvm/ADT/IndexedMap.h"
#include "llvm/BinaryFormat/DXContainer.h"
-#include "llvm/Support/BinaryStreamWriter.h"
#include "llvm/Support/raw_ostream.h"
namespace llvm {
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 5cdd7726e6e3f..d66b9f7776a71 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -9,104 +9,72 @@
#include "llvm/MC/DXContainerRootSignature.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Twine.h"
-#include "llvm/Support/BinaryStreamWriter.h"
+#include "llvm/Support/EndianStream.h"
+#include "llvm/Support/Error.h"
#include <cstdint>
-#include <sys/types.h>
using namespace llvm;
using namespace llvm::mcdxbc;
-Error setRewrite(BinaryStreamWriter &Stream, uint32_t &Offset) {
+void setRewrite(raw_ostream &Stream, uint32_t &Offset) {
const uint32_t DummyValue = std::numeric_limits<uint32_t>::max();
-
- Offset = Stream.getOffset();
-
- if (Error Err = Stream.writeInteger(DummyValue))
- return Err;
-
- return Error::success();
+ Offset = Stream.tell();
+ support::endian::write(Stream, DummyValue, llvm::endianness::little);
}
-Error rewriteOffset(BinaryStreamWriter &Stream, uint32_t Offset) {
- uint64_t Value = Stream.getOffset();
- Stream.setOffset(Offset);
- if (Error Err = Stream.writeInteger((uint32_t)Value))
- return Err;
-
- Stream.setOffset(Value);
-
- return Error::success();
+void rewriteOffset(buffer_ostream &Stream, uint32_t Offset) {
+ uint32_t Value = Stream.tell();
+ auto *InsertPoint = &Stream.buffer()[Offset];
+ support::endian::write(InsertPoint, Value, llvm::endianness::little);
}
Error RootSignatureDesc::write(raw_ostream &OS) const {
- std::vector<uint8_t> Buffer(getSizeInBytes());
- BinaryStreamWriter Writer(Buffer, llvm::endianness::little);
-
+ buffer_ostream Writer(OS);
const uint32_t NumParameters = Parameters.size();
const uint32_t Zero = 0;
- if (Error Err = Writer.writeInteger(Header.Version))
- return Err;
-
- if (Error Err = Writer.writeInteger(NumParameters))
- return Err;
+ support::endian::write(Writer, Header.Version, llvm::endianness::little);
+ support::endian::write(Writer, NumParameters, llvm::endianness::little);
uint32_t HeaderPoint;
- if (Error Err = setRewrite(Writer, HeaderPoint))
- return Err;
-
- // Static samplers still not implemented
- if (Error Err = Writer.writeInteger(Zero))
- return Err;
+ setRewrite(Writer, HeaderPoint);
- if (Error Err = Writer.writeInteger(Zero))
- return Err;
+ support::endian::write(Writer, Zero, llvm::endianness::little);
+ support::endian::write(Writer, Zero, llvm::endianness::little);
+ support::endian::write(Writer, Header.Flags, llvm::endianness::little);
- if (Error Err = Writer.writeInteger(Header.Flags))
- return Err;
-
- if (Error Err = rewriteOffset(Writer, HeaderPoint))
- return Err;
+ rewriteOffset(Writer, HeaderPoint);
SmallVector<uint32_t> ParamsOffset;
for (const auto &P : Parameters) {
-
- if (Error Err = Writer.writeEnum(P.ParameterType))
- return Err;
-
- if (Error Err = Writer.writeEnum(P.ShaderVisibility))
- return Err;
+ support::endian::write(Writer, P.ParameterType, llvm::endianness::little);
+ support::endian::write(Writer, P.ShaderVisibility,
+ llvm::endianness::little);
uint32_t Offset;
- if (Error Err = setRewrite(Writer, Offset))
- return Err;
+ setRewrite(Writer, Offset);
+
ParamsOffset.push_back(Offset);
}
assert(NumParameters == ParamsOffset.size());
for (size_t I = 0; I < NumParameters; ++I) {
- if (Error Err = rewriteOffset(Writer, ParamsOffset[I]))
- return Err;
-
+ rewriteOffset(Writer, ParamsOffset[I]);
const auto &P = Parameters[I];
switch (P.ParameterType) {
case dxbc::RootParameterType::Constants32Bit: {
- if (Error Err = Writer.writeInteger(P.Constants.ShaderRegister))
- return Err;
- if (Error Err = Writer.writeInteger(P.Constants.RegisterSpace))
- return Err;
- if (Error Err = Writer.writeInteger(P.Constants.Num32BitValues))
- return Err;
+ support::endian::write(Writer, P.Constants.ShaderRegister,
+ llvm::endianness::little);
+ support::endian::write(Writer, P.Constants.RegisterSpace,
+ llvm::endianness::little);
+ support::endian::write(Writer, P.Constants.Num32BitValues,
+ llvm::endianness::little);
} break;
case dxbc::RootParameterType::Empty:
llvm_unreachable("Invalid RootParameterType");
}
}
- llvm::ArrayRef<char> BufferRef(reinterpret_cast<char *>(Buffer.data()),
- Buffer.size());
- OS.write(BufferRef.data(), BufferRef.size());
-
return Error::success();
}
More information about the llvm-branch-commits
mailing list