[llvm-branch-commits] [llvm] [DirectX] adding support to read/write descriptor table data using obj2yaml/yaml2obj (PR #138315)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu May 22 19:00:35 PDT 2025
https://github.com/joaosaffran updated https://github.com/llvm/llvm-project/pull/138315
>From 15eb6f50b947f59b265fd092d6a97c51e5742e6b Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 5 May 2025 18:26:14 +0000
Subject: [PATCH 01/29] fix naming
---
llvm/include/llvm/BinaryFormat/DXContainerConstants.def | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
index bd9bd760547dc..db0379b90ef6b 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -73,7 +73,7 @@ ROOT_ELEMENT_FLAG(11, SamplerHeapDirectlyIndexed)
#endif // ROOT_ELEMENT_FLAG
-// ROOT_ELEMENT_FLAG(bit offset for the flag, name).
+// ROOT_DESCRIPTOR_FLAG(bit offset for the flag, name).
#ifdef ROOT_DESCRIPTOR_FLAG
ROOT_DESCRIPTOR_FLAG(0, NONE)
>From 3e263648724ba859d4d94f414dd3595e80a12f02 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 5 May 2025 21:10:38 +0000
Subject: [PATCH 02/29] moving root signature binary representation to RTS0
namespace
---
llvm/include/llvm/BinaryFormat/DXContainer.h | 201 +++++++++---------
.../llvm/MC/DXContainerRootSignature.h | 52 ++---
llvm/include/llvm/Object/DXContainer.h | 63 +++---
llvm/lib/BinaryFormat/DXContainer.cpp | 16 +-
llvm/lib/MC/DXContainerRootSignature.cpp | 43 ++--
llvm/lib/Object/DXContainer.cpp | 3 +-
llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 14 +-
llvm/lib/ObjectYAML/DXContainerYAML.cpp | 43 ++--
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 16 +-
llvm/unittests/Object/DXContainerTest.cpp | 4 +-
10 files changed, 237 insertions(+), 218 deletions(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index a441fa3a36886..98e30b1b6a8af 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -153,62 +153,6 @@ enum class FeatureFlags : uint64_t {
static_assert((uint64_t)FeatureFlags::NextUnusedBit <= 1ull << 63,
"Shader flag bits exceed enum size.");
-#define ROOT_ELEMENT_FLAG(Num, Val) Val = 1ull << Num,
-enum class RootElementFlag : uint32_t {
-#include "DXContainerConstants.def"
-};
-
-#define ROOT_DESCRIPTOR_FLAG(Num, Val) Val = 1ull << Num,
-enum class RootDescriptorFlag : uint32_t {
-#include "DXContainerConstants.def"
-};
-
-#define DESCRIPTOR_RANGE_FLAG(Num, Val) Val = 1ull << Num,
-enum class DescriptorRangeFlag : uint32_t {
-#include "DXContainerConstants.def"
-};
-
-#define ROOT_PARAMETER(Val, Enum) Enum = Val,
-enum class RootParameterType : uint32_t {
-#include "DXContainerConstants.def"
-};
-
-ArrayRef<EnumEntry<RootParameterType>> getRootParameterTypes();
-
-#define DESCRIPTOR_RANGE(Val, Enum) Enum = Val,
-enum class DescriptorRangeType : uint32_t {
-#include "DXContainerConstants.def"
-};
-
-ArrayRef<EnumEntry<DescriptorRangeType>> getDescriptorRangeTypes();
-
-#define ROOT_PARAMETER(Val, Enum) \
- case Val: \
- return true;
-inline bool isValidParameterType(uint32_t V) {
- switch (V) {
-#include "DXContainerConstants.def"
- }
- return false;
-}
-
-#define SHADER_VISIBILITY(Val, Enum) Enum = Val,
-enum class ShaderVisibility : uint32_t {
-#include "DXContainerConstants.def"
-};
-
-ArrayRef<EnumEntry<ShaderVisibility>> getShaderVisibility();
-
-#define SHADER_VISIBILITY(Val, Enum) \
- case Val: \
- return true;
-inline bool isValidShaderVisibility(uint32_t V) {
- switch (V) {
-#include "DXContainerConstants.def"
- }
- return false;
-}
-
PartType parsePartType(StringRef S);
struct VertexPSVInfo {
@@ -597,8 +541,109 @@ struct ProgramSignatureElement {
static_assert(sizeof(ProgramSignatureElement) == 32,
"ProgramSignatureElement is misaligned");
-namespace RST0 {
+
+namespace RTS0 {
+
+#define ROOT_ELEMENT_FLAG(Num, Val) Val = 1ull << Num,
+enum class RootElementFlag : uint32_t {
+#include "DXContainerConstants.def"
+};
+
+#define ROOT_DESCRIPTOR_FLAG(Num, Val) Val = 1ull << Num,
+enum class RootDescriptorFlag : uint32_t {
+#include "DXContainerConstants.def"
+};
+
+#define DESCRIPTOR_RANGE_FLAG(Num, Val) Val = 1ull << Num,
+enum class DescriptorRangeFlag : uint32_t {
+#include "DXContainerConstants.def"
+};
+
+#define ROOT_PARAMETER(Val, Enum) Enum = Val,
+enum class RootParameterType : uint32_t {
+#include "DXContainerConstants.def"
+};
+
+ArrayRef<EnumEntry<RootParameterType>> getRootParameterTypes();
+
+#define DESCRIPTOR_RANGE(Val, Enum) Enum = Val,
+enum class DescriptorRangeType : uint32_t {
+#include "DXContainerConstants.def"
+};
+
+ArrayRef<EnumEntry<DescriptorRangeType>> getDescriptorRangeTypes();
+
+#define ROOT_PARAMETER(Val, Enum) \
+ case Val: \
+ return true;
+inline bool isValidParameterType(uint32_t V) {
+ switch (V) {
+#include "DXContainerConstants.def"
+ }
+ return false;
+}
+
+#define SHADER_VISIBILITY(Val, Enum) Enum = Val,
+enum class ShaderVisibility : uint32_t {
+#include "DXContainerConstants.def"
+};
+
+ArrayRef<EnumEntry<ShaderVisibility>> getShaderVisibility();
+
+#define SHADER_VISIBILITY(Val, Enum) \
+ case Val: \
+ return true;
+inline bool isValidShaderVisibility(uint32_t V) {
+ switch (V) {
+#include "DXContainerConstants.def"
+ }
+ return false;
+}
+
namespace v0 {
+
+struct RootSignatureHeader {
+ uint32_t Version;
+ uint32_t NumParameters;
+ uint32_t ParametersOffset;
+ uint32_t NumStaticSamplers;
+ uint32_t StaticSamplerOffset;
+ uint32_t Flags;
+
+ void swapBytes() {
+ sys::swapByteOrder(Version);
+ sys::swapByteOrder(NumParameters);
+ sys::swapByteOrder(ParametersOffset);
+ sys::swapByteOrder(NumStaticSamplers);
+ sys::swapByteOrder(StaticSamplerOffset);
+ sys::swapByteOrder(Flags);
+ }
+};
+
+struct RootParameterHeader {
+ uint32_t ParameterType;
+ uint32_t ShaderVisibility;
+ uint32_t ParameterOffset;
+
+ void swapBytes() {
+ sys::swapByteOrder(ParameterType);
+ sys::swapByteOrder(ShaderVisibility);
+ sys::swapByteOrder(ParameterOffset);
+ }
+};
+
+struct RootConstants {
+ uint32_t ShaderRegister;
+ uint32_t RegisterSpace;
+ uint32_t Num32BitValues;
+
+ void swapBytes() {
+ sys::swapByteOrder(ShaderRegister);
+ sys::swapByteOrder(RegisterSpace);
+ sys::swapByteOrder(Num32BitValues);
+ }
+};
+
struct RootDescriptor {
uint32_t ShaderRegister;
uint32_t RegisterSpace;
@@ -641,50 +686,10 @@ struct DescriptorRange : public v0::DescriptorRange {
}
};
} // namespace v1
-} // namespace RST0
+} // namespace RTS0
// following dx12 naming
// https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ns-d3d12-d3d12_root_constants
-struct RootConstants {
- uint32_t ShaderRegister;
- uint32_t RegisterSpace;
- uint32_t Num32BitValues;
-
- void swapBytes() {
- sys::swapByteOrder(ShaderRegister);
- sys::swapByteOrder(RegisterSpace);
- sys::swapByteOrder(Num32BitValues);
- }
-};
-
-struct RootParameterHeader {
- uint32_t ParameterType;
- uint32_t ShaderVisibility;
- uint32_t ParameterOffset;
- void swapBytes() {
- sys::swapByteOrder(ParameterType);
- sys::swapByteOrder(ShaderVisibility);
- sys::swapByteOrder(ParameterOffset);
- }
-};
-
-struct RootSignatureHeader {
- uint32_t Version;
- uint32_t NumParameters;
- uint32_t ParametersOffset;
- uint32_t NumStaticSamplers;
- uint32_t StaticSamplerOffset;
- uint32_t Flags;
-
- void swapBytes() {
- sys::swapByteOrder(Version);
- sys::swapByteOrder(NumParameters);
- sys::swapByteOrder(ParametersOffset);
- sys::swapByteOrder(NumStaticSamplers);
- sys::swapByteOrder(StaticSamplerOffset);
- sys::swapByteOrder(Flags);
- }
-};
} // namespace dxbc
} // namespace llvm
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index 3f5960a6de2f9..84f6421d8ad9d 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -21,16 +21,16 @@ class raw_ostream;
namespace mcdxbc {
struct RootParameterInfo {
- dxbc::RootParameterHeader Header;
+ dxbc::RTS0::v0::RootParameterHeader Header;
size_t Location;
RootParameterInfo() = default;
- RootParameterInfo(dxbc::RootParameterHeader H, size_t L)
+ RootParameterInfo(dxbc::RTS0::v0::RootParameterHeader H, size_t L)
: Header(H), Location(L) {}
};
-using DescriptorRanges = std::variant<dxbc::RST0::v0::DescriptorRange,
- dxbc::RST0::v1::DescriptorRange>;
+using DescriptorRanges = std::variant<dxbc::RTS0::v0::DescriptorRange,
+ dxbc::RTS0::v1::DescriptorRange>;
struct DescriptorTable {
SmallVector<DescriptorRanges> Ranges;
@@ -42,59 +42,61 @@ struct DescriptorTable {
}
};
-using RootDescriptor = std::variant<dxbc::RST0::v0::RootDescriptor,
- dxbc::RST0::v1::RootDescriptor>;
+using RootDescriptor = std::variant<dxbc::RTS0::v0::RootDescriptor,
+ dxbc::RTS0::v1::RootDescriptor>;
-using ParametersView = std::variant<
- const dxbc::RootConstants *, const dxbc::RST0::v0::RootDescriptor *,
- const dxbc::RST0::v1::RootDescriptor *, const DescriptorTable *>;
+using ParametersView = std::variant<const dxbc::RTS0::v0::RootConstants *,
+ const dxbc::RTS0::v0::RootDescriptor *,
+ const dxbc::RTS0::v1::RootDescriptor *,
+ const DescriptorTable *>;
struct RootParametersContainer {
SmallVector<RootParameterInfo> ParametersInfo;
- SmallVector<dxbc::RootConstants> Constants;
+ SmallVector<dxbc::RTS0::v0::RootConstants> Constants;
SmallVector<RootDescriptor> Descriptors;
SmallVector<DescriptorTable> Tables;
- void addInfo(dxbc::RootParameterHeader H, size_t L) {
+ void addInfo(dxbc::RTS0::v0::RootParameterHeader H, size_t L) {
ParametersInfo.push_back(RootParameterInfo(H, L));
}
- void addParameter(dxbc::RootParameterHeader H, dxbc::RootConstants C) {
+ void addParameter(dxbc::RTS0::v0::RootParameterHeader H,
+ dxbc::RTS0::v0::RootConstants C) {
addInfo(H, Constants.size());
Constants.push_back(C);
}
- void addParameter(dxbc::RootParameterHeader H,
- dxbc::RST0::v0::RootDescriptor D) {
+ void addParameter(dxbc::RTS0::v0::RootParameterHeader H,
+ dxbc::RTS0::v0::RootDescriptor D) {
addInfo(H, Descriptors.size());
Descriptors.push_back(D);
}
- void addParameter(dxbc::RootParameterHeader H,
- dxbc::RST0::v1::RootDescriptor D) {
+ void addParameter(dxbc::RTS0::v0::RootParameterHeader H,
+ dxbc::RTS0::v1::RootDescriptor D) {
addInfo(H, Descriptors.size());
Descriptors.push_back(D);
}
- void addParameter(dxbc::RootParameterHeader H, DescriptorTable D) {
+ void addParameter(dxbc::RTS0::v0::RootParameterHeader H, DescriptorTable D) {
addInfo(H, Tables.size());
Tables.push_back(D);
}
std::optional<ParametersView> getParameter(const RootParameterInfo *H) const {
switch (H->Header.ParameterType) {
- case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
+ case llvm::to_underlying(dxbc::RTS0::RootParameterType::Constants32Bit):
return &Constants[H->Location];
- case llvm::to_underlying(dxbc::RootParameterType::CBV):
- case llvm::to_underlying(dxbc::RootParameterType::SRV):
- case llvm::to_underlying(dxbc::RootParameterType::UAV): {
+ case llvm::to_underlying(dxbc::RTS0::RootParameterType::CBV):
+ case llvm::to_underlying(dxbc::RTS0::RootParameterType::SRV):
+ case llvm::to_underlying(dxbc::RTS0::RootParameterType::UAV): {
const RootDescriptor &VersionedParam = Descriptors[H->Location];
- if (std::holds_alternative<dxbc::RST0::v0::RootDescriptor>(
+ if (std::holds_alternative<dxbc::RTS0::v0::RootDescriptor>(
VersionedParam)) {
- return &std::get<dxbc::RST0::v0::RootDescriptor>(VersionedParam);
+ return &std::get<dxbc::RTS0::v0::RootDescriptor>(VersionedParam);
}
- return &std::get<dxbc::RST0::v1::RootDescriptor>(VersionedParam);
+ return &std::get<dxbc::RTS0::v1::RootDescriptor>(VersionedParam);
}
- case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable):
+ case llvm::to_underlying(dxbc::RTS0::RootParameterType::DescriptorTable):
return &Tables[H->Location];
}
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index c6c22213d7de8..3e32870c5fb8f 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -120,11 +120,12 @@ template <typename T> struct ViewArray {
namespace DirectX {
struct RootParameterView {
- const dxbc::RootParameterHeader &Header;
+ const dxbc::RTS0::v0::RootParameterHeader &Header;
StringRef ParamData;
uint32_t Version;
- RootParameterView(uint32_t V, const dxbc::RootParameterHeader &H, StringRef P)
+ RootParameterView(uint32_t V, const dxbc::RTS0::v0::RootParameterHeader &H,
+ StringRef P)
: Header(H), ParamData(P), Version(V) {}
template <typename T, typename VersionT = T> Expected<T> readParameter() {
@@ -147,29 +148,29 @@ struct RootParameterView {
struct RootConstantView : RootParameterView {
static bool classof(const RootParameterView *V) {
return V->Header.ParameterType ==
- (uint32_t)dxbc::RootParameterType::Constants32Bit;
+ (uint32_t)dxbc::RTS0::RootParameterType::Constants32Bit;
}
- llvm::Expected<dxbc::RootConstants> read() {
- return readParameter<dxbc::RootConstants>();
+ llvm::Expected<dxbc::RTS0::v0::RootConstants> read() {
+ return readParameter<dxbc::RTS0::v0::RootConstants>();
}
};
struct RootDescriptorView : RootParameterView {
static bool classof(const RootParameterView *V) {
return (V->Header.ParameterType ==
- llvm::to_underlying(dxbc::RootParameterType::CBV) ||
+ llvm::to_underlying(dxbc::RTS0::RootParameterType::CBV) ||
V->Header.ParameterType ==
- llvm::to_underlying(dxbc::RootParameterType::SRV) ||
+ llvm::to_underlying(dxbc::RTS0::RootParameterType::SRV) ||
V->Header.ParameterType ==
- llvm::to_underlying(dxbc::RootParameterType::UAV));
+ llvm::to_underlying(dxbc::RTS0::RootParameterType::UAV));
}
- llvm::Expected<dxbc::RST0::v1::RootDescriptor> read(uint32_t Version) {
+ llvm::Expected<dxbc::RTS0::v1::RootDescriptor> read(uint32_t Version) {
if (Version == 1)
- return readParameter<dxbc::RST0::v1::RootDescriptor,
- dxbc::RST0::v0::RootDescriptor>();
- return readParameter<dxbc::RST0::v1::RootDescriptor>();
+ return readParameter<dxbc::RTS0::v1::RootDescriptor,
+ dxbc::RTS0::v0::RootDescriptor>();
+ return readParameter<dxbc::RTS0::v1::RootDescriptor>();
}
};
template <typename T> struct DescriptorTable {
@@ -186,11 +187,11 @@ template <typename T> struct TemplateTypeToVersion {
static constexpr uint32_t Value = -1;
};
-template <> struct TemplateTypeToVersion<dxbc::RST0::v0::DescriptorRange> {
+template <> struct TemplateTypeToVersion<dxbc::RTS0::v0::DescriptorRange> {
static constexpr uint32_t Value = 1;
};
-template <> struct TemplateTypeToVersion<dxbc::RST0::v1::DescriptorRange> {
+template <> struct TemplateTypeToVersion<dxbc::RTS0::v1::DescriptorRange> {
static constexpr uint32_t Value = 2;
};
@@ -199,7 +200,8 @@ template <typename T> struct DescriptorTableView : RootParameterView {
static bool classof(const RootParameterView *V) {
return (V->Header.ParameterType ==
- llvm::to_underlying(dxbc::RootParameterType::DescriptorTable)) &&
+ llvm::to_underlying(
+ dxbc::RTS0::RootParameterType::DescriptorTable)) &&
(V->Version == TemplateTypeToVersion<T>::Value);
}
@@ -234,10 +236,11 @@ class RootSignature {
uint32_t NumStaticSamplers;
uint32_t StaticSamplersOffset;
uint32_t Flags;
- ViewArray<dxbc::RootParameterHeader> ParametersHeaders;
+ ViewArray<dxbc::RTS0::v0::RootParameterHeader> ParametersHeaders;
StringRef PartData;
- using param_header_iterator = ViewArray<dxbc::RootParameterHeader>::iterator;
+ using param_header_iterator =
+ ViewArray<dxbc::RTS0::v0::RootParameterHeader>::iterator;
public:
RootSignature(StringRef PD) : PartData(PD) {}
@@ -255,33 +258,33 @@ class RootSignature {
uint32_t getFlags() const { return Flags; }
llvm::Expected<RootParameterView>
- getParameter(const dxbc::RootParameterHeader &Header) const {
+ getParameter(const dxbc::RTS0::v0::RootParameterHeader &Header) const {
size_t DataSize;
- if (!dxbc::isValidParameterType(Header.ParameterType))
+ if (!dxbc::RTS0::isValidParameterType(Header.ParameterType))
return parseFailed("invalid parameter type");
- switch (static_cast<dxbc::RootParameterType>(Header.ParameterType)) {
- case dxbc::RootParameterType::Constants32Bit:
- DataSize = sizeof(dxbc::RootConstants);
+ switch (static_cast<dxbc::RTS0::RootParameterType>(Header.ParameterType)) {
+ case dxbc::RTS0::RootParameterType::Constants32Bit:
+ DataSize = sizeof(dxbc::RTS0::v0::RootConstants);
break;
- case dxbc::RootParameterType::CBV:
- case dxbc::RootParameterType::SRV:
- case dxbc::RootParameterType::UAV:
+ case dxbc::RTS0::RootParameterType::CBV:
+ case dxbc::RTS0::RootParameterType::SRV:
+ case dxbc::RTS0::RootParameterType::UAV:
if (Version == 1)
- DataSize = sizeof(dxbc::RST0::v0::RootDescriptor);
+ DataSize = sizeof(dxbc::RTS0::v0::RootDescriptor);
else
- DataSize = sizeof(dxbc::RST0::v1::RootDescriptor);
+ DataSize = sizeof(dxbc::RTS0::v1::RootDescriptor);
break;
- case dxbc::RootParameterType::DescriptorTable:
+ case dxbc::RTS0::RootParameterType::DescriptorTable:
uint32_t NumRanges =
support::endian::read<uint32_t, llvm::endianness::little>(
PartData.begin() + Header.ParameterOffset);
if (Version == 1)
- DataSize = sizeof(dxbc::RST0::v0::DescriptorRange) * NumRanges +
+ DataSize = sizeof(dxbc::RTS0::v0::DescriptorRange) * NumRanges +
2 * sizeof(uint32_t);
else
- DataSize = sizeof(dxbc::RST0::v1::DescriptorRange) * NumRanges +
+ DataSize = sizeof(dxbc::RTS0::v1::DescriptorRange) * NumRanges +
2 * sizeof(uint32_t);
break;
}
diff --git a/llvm/lib/BinaryFormat/DXContainer.cpp b/llvm/lib/BinaryFormat/DXContainer.cpp
index 8e7b7d313706a..1e4fc002f1519 100644
--- a/llvm/lib/BinaryFormat/DXContainer.cpp
+++ b/llvm/lib/BinaryFormat/DXContainer.cpp
@@ -60,23 +60,27 @@ ArrayRef<EnumEntry<SigComponentType>> dxbc::getSigComponentTypes() {
return ArrayRef(SigComponentTypes);
}
-#define SHADER_VISIBILITY(Val, Enum) {#Enum, ShaderVisibility::Enum},
+#define SHADER_VISIBILITY(Val, Enum) \
+ {#Enum, dxbc::RTS0::ShaderVisibility::Enum},
-static const EnumEntry<ShaderVisibility> ShaderVisibilityValues[] = {
+static const EnumEntry<dxbc::RTS0::ShaderVisibility> ShaderVisibilityValues[] =
+ {
#include "llvm/BinaryFormat/DXContainerConstants.def"
};
-ArrayRef<EnumEntry<ShaderVisibility>> dxbc::getShaderVisibility() {
+ArrayRef<EnumEntry<dxbc::RTS0::ShaderVisibility>>
+dxbc::RTS0::getShaderVisibility() {
return ArrayRef(ShaderVisibilityValues);
}
-#define ROOT_PARAMETER(Val, Enum) {#Enum, RootParameterType::Enum},
+#define ROOT_PARAMETER(Val, Enum) {#Enum, dxbc::RTS0::RootParameterType::Enum},
-static const EnumEntry<RootParameterType> RootParameterTypes[] = {
+static const EnumEntry<dxbc::RTS0::RootParameterType> RootParameterTypes[] = {
#include "llvm/BinaryFormat/DXContainerConstants.def"
};
-ArrayRef<EnumEntry<RootParameterType>> dxbc::getRootParameterTypes() {
+ArrayRef<EnumEntry<dxbc::RTS0::RootParameterType>>
+dxbc::RTS0::getRootParameterTypes() {
return ArrayRef(RootParameterTypes);
}
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 4c725969e63cf..352a8d3a9c603 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -21,25 +21,25 @@ class SizeCalculatorVisitor {
SizeCalculatorVisitor(uint32_t Version, size_t &SizeRef)
: Size(SizeRef), Version(Version) {}
- void operator()(const dxbc::RootConstants *Value) const {
- Size += sizeof(dxbc::RootConstants);
+ void operator()(const dxbc::RTS0::v0::RootConstants *Value) const {
+ Size += sizeof(dxbc::RTS0::v0::RootConstants);
}
- void operator()(const dxbc::RST0::v0::RootDescriptor *Value) const {
- Size += sizeof(dxbc::RST0::v0::RootDescriptor);
+ void operator()(const dxbc::RTS0::v0::RootDescriptor *Value) const {
+ Size += sizeof(dxbc::RTS0::v0::RootDescriptor);
}
- void operator()(const dxbc::RST0::v1::RootDescriptor *Value) const {
- Size += sizeof(dxbc::RST0::v1::RootDescriptor);
+ void operator()(const dxbc::RTS0::v1::RootDescriptor *Value) const {
+ Size += sizeof(dxbc::RTS0::v1::RootDescriptor);
}
void operator()(const DescriptorTable *Value) const {
if (Version == 1)
Size +=
- sizeof(dxbc::RST0::v0::DescriptorRange) * Value->Ranges.size() + 8;
+ sizeof(dxbc::RTS0::v0::DescriptorRange) * Value->Ranges.size() + 8;
else
Size +=
- sizeof(dxbc::RST0::v1::DescriptorRange) * Value->Ranges.size() + 8;
+ sizeof(dxbc::RTS0::v1::DescriptorRange) * Value->Ranges.size() + 8;
}
private:
@@ -63,8 +63,9 @@ static void rewriteOffsetToCurrentByte(raw_svector_ostream &Stream,
}
size_t RootSignatureDesc::getSize() const {
- size_t Size = sizeof(dxbc::RootSignatureHeader) +
- ParametersContainer.size() * sizeof(dxbc::RootParameterHeader);
+ size_t Size =
+ sizeof(dxbc::RTS0::v0::RootSignatureHeader) +
+ ParametersContainer.size() * sizeof(dxbc::RTS0::v0::RootParameterHeader);
for (const auto &I : ParametersContainer) {
std::optional<ParametersView> P = ParametersContainer.getParameter(&I);
@@ -108,26 +109,28 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
auto P = ParametersContainer.getParameter(H);
if (!P)
continue;
- if (std::holds_alternative<const dxbc::RootConstants *>(P.value())) {
- auto *Constants = std::get<const dxbc::RootConstants *>(P.value());
+ if (std::holds_alternative<const dxbc::RTS0::v0::RootConstants *>(
+ P.value())) {
+ auto *Constants =
+ std::get<const dxbc::RTS0::v0::RootConstants *>(P.value());
support::endian::write(BOS, Constants->ShaderRegister,
llvm::endianness::little);
support::endian::write(BOS, Constants->RegisterSpace,
llvm::endianness::little);
support::endian::write(BOS, Constants->Num32BitValues,
llvm::endianness::little);
- } else if (std::holds_alternative<const dxbc::RST0::v0::RootDescriptor *>(
+ } else if (std::holds_alternative<const dxbc::RTS0::v0::RootDescriptor *>(
*P)) {
auto *Descriptor =
- std::get<const dxbc::RST0::v0::RootDescriptor *>(P.value());
+ std::get<const dxbc::RTS0::v0::RootDescriptor *>(P.value());
support::endian::write(BOS, Descriptor->ShaderRegister,
llvm::endianness::little);
support::endian::write(BOS, Descriptor->RegisterSpace,
llvm::endianness::little);
- } else if (std::holds_alternative<const dxbc::RST0::v1::RootDescriptor *>(
+ } else if (std::holds_alternative<const dxbc::RTS0::v1::RootDescriptor *>(
*P)) {
auto *Descriptor =
- std::get<const dxbc::RST0::v1::RootDescriptor *>(P.value());
+ std::get<const dxbc::RTS0::v1::RootDescriptor *>(P.value());
support::endian::write(BOS, Descriptor->ShaderRegister,
llvm::endianness::little);
@@ -141,8 +144,8 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
llvm::endianness::little);
rewriteOffsetToCurrentByte(BOS, writePlaceholder(BOS));
for (const auto &R : *Table) {
- if (std::holds_alternative<dxbc::RST0::v0::DescriptorRange>(R)) {
- auto Range = std::get<dxbc::RST0::v0::DescriptorRange>(R);
+ if (std::holds_alternative<dxbc::RTS0::v0::DescriptorRange>(R)) {
+ auto Range = std::get<dxbc::RTS0::v0::DescriptorRange>(R);
support::endian::write(BOS, Range.RangeType,
llvm::endianness::little);
@@ -155,8 +158,8 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
support::endian::write(BOS, Range.OffsetInDescriptorsFromTableStart,
llvm::endianness::little);
} else {
- if (std::holds_alternative<dxbc::RST0::v1::DescriptorRange>(R)) {
- auto Range = std::get<dxbc::RST0::v1::DescriptorRange>(R);
+ if (std::holds_alternative<dxbc::RTS0::v1::DescriptorRange>(R)) {
+ auto Range = std::get<dxbc::RTS0::v1::DescriptorRange>(R);
support::endian::write(BOS, Range.RangeType,
llvm::endianness::little);
diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 95f6788e75aa6..f4617bd87e0f7 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -273,7 +273,8 @@ Error DirectX::RootSignature::parse() {
Current += sizeof(uint32_t);
ParametersHeaders.Data = PartData.substr(
- RootParametersOffset, NumParameters * sizeof(dxbc::RootParameterHeader));
+ RootParametersOffset,
+ NumParameters * sizeof(dxbc::RTS0::v0::RootParameterHeader));
return Error::success();
}
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index 9f31f4efdeab7..e24d5cb528389 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -277,15 +277,15 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
RS.StaticSamplersOffset = P.RootSignature->StaticSamplersOffset;
for (const auto &Param : P.RootSignature->Parameters) {
- auto Header = dxbc::RootParameterHeader{Param.Type, Param.Visibility,
- Param.Offset};
+ auto Header = dxbc::RTS0::v0::RootParameterHeader{
+ Param.Type, Param.Visibility, Param.Offset};
if (std::holds_alternative<DXContainerYAML::RootConstantsYaml>(
Param.Data)) {
auto ConstantYaml =
std::get<DXContainerYAML::RootConstantsYaml>(Param.Data);
- dxbc::RootConstants Constants;
+ dxbc::RTS0::v0::RootConstants Constants;
Constants.Num32BitValues = ConstantYaml.Num32BitValues;
Constants.RegisterSpace = ConstantYaml.RegisterSpace;
Constants.ShaderRegister = ConstantYaml.ShaderRegister;
@@ -296,12 +296,12 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
std::get<DXContainerYAML::RootDescriptorYaml>(Param.Data);
if (RS.Version == 1) {
- dxbc::RST0::v0::RootDescriptor Descriptor;
+ dxbc::RTS0::v0::RootDescriptor Descriptor;
Descriptor.RegisterSpace = DescriptorYaml.RegisterSpace;
Descriptor.ShaderRegister = DescriptorYaml.ShaderRegister;
RS.ParametersContainer.addParameter(Header, Descriptor);
} else {
- dxbc::RST0::v1::RootDescriptor Descriptor;
+ dxbc::RTS0::v1::RootDescriptor Descriptor;
Descriptor.RegisterSpace = DescriptorYaml.RegisterSpace;
Descriptor.ShaderRegister = DescriptorYaml.ShaderRegister;
Descriptor.Flags = DescriptorYaml.getEncodedFlags();
@@ -315,7 +315,7 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
for (const auto &R : TableYaml.Ranges) {
if (RS.Version == 1) {
- dxbc::RST0::v0::DescriptorRange Range;
+ dxbc::RTS0::v0::DescriptorRange Range;
Range.RangeType = R.RangeType;
Range.NumDescriptors = R.NumDescriptors;
Range.BaseShaderRegister = R.BaseShaderRegister;
@@ -324,7 +324,7 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
R.OffsetInDescriptorsFromTableStart;
Table.Ranges.push_back(Range);
} else {
- dxbc::RST0::v1::DescriptorRange Range;
+ dxbc::RTS0::v1::DescriptorRange Range;
Range.RangeType = R.RangeType;
Range.NumDescriptors = R.NumDescriptors;
Range.BaseShaderRegister = R.BaseShaderRegister;
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index 8a578a838a249..f61ef9dc3e2ef 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -48,9 +48,9 @@ DXContainerYAML::RootSignatureYamlDesc::create(
RootSigDesc.RootParametersOffset = Data.getRootParametersOffset();
uint32_t Flags = Data.getFlags();
- for (const dxbc::RootParameterHeader &PH : Data.param_headers()) {
+ for (const dxbc::RTS0::v0::RootParameterHeader &PH : Data.param_headers()) {
- if (!dxbc::isValidParameterType(PH.ParameterType))
+ if (!dxbc::RTS0::isValidParameterType(PH.ParameterType))
return createStringError(std::errc::invalid_argument,
"Invalid value for parameter type");
@@ -58,7 +58,7 @@ DXContainerYAML::RootSignatureYamlDesc::create(
NewP.Offset = PH.ParameterOffset;
NewP.Type = PH.ParameterType;
- if (!dxbc::isValidShaderVisibility(PH.ShaderVisibility))
+ if (!dxbc::RTS0::isValidShaderVisibility(PH.ShaderVisibility))
return createStringError(std::errc::invalid_argument,
"Invalid value for shader visibility");
@@ -71,7 +71,8 @@ DXContainerYAML::RootSignatureYamlDesc::create(
object::DirectX::RootParameterView ParamView = ParamViewOrErr.get();
if (auto *RCV = dyn_cast<object::DirectX::RootConstantView>(&ParamView)) {
- llvm::Expected<dxbc::RootConstants> ConstantsOrErr = RCV->read();
+ llvm::Expected<dxbc::RTS0::v0::RootConstants> ConstantsOrErr =
+ RCV->read();
if (Error E = ConstantsOrErr.takeError())
return std::move(E);
@@ -83,7 +84,7 @@ DXContainerYAML::RootSignatureYamlDesc::create(
NewP.Data = ConstantYaml;
} else if (auto *RDV =
dyn_cast<object::DirectX::RootDescriptorView>(&ParamView)) {
- llvm::Expected<dxbc::RST0::v1::RootDescriptor> DescriptorOrErr =
+ llvm::Expected<dxbc::RTS0::v1::RootDescriptor> DescriptorOrErr =
RDV->read(Version);
if (Error E = DescriptorOrErr.takeError())
return std::move(E);
@@ -95,14 +96,14 @@ DXContainerYAML::RootSignatureYamlDesc::create(
#define ROOT_DESCRIPTOR_FLAG(Num, Val) \
YamlDescriptor.Val = \
(Descriptor.Flags & \
- llvm::to_underlying(dxbc::RootDescriptorFlag::Val)) > 0;
+ llvm::to_underlying(dxbc::RTS0::RootDescriptorFlag::Val)) > 0;
#include "llvm/BinaryFormat/DXContainerConstants.def"
}
NewP.Data = YamlDescriptor;
} else if (auto *TDV = dyn_cast<object::DirectX::DescriptorTableView<
- dxbc::RST0::v0::DescriptorRange>>(&ParamView)) {
+ dxbc::RTS0::v0::DescriptorRange>>(&ParamView)) {
llvm::Expected<
- object::DirectX::DescriptorTable<dxbc::RST0::v0::DescriptorRange>>
+ object::DirectX::DescriptorTable<dxbc::RTS0::v0::DescriptorRange>>
TableOrErr = TDV->read();
if (Error E = TableOrErr.takeError())
return std::move(E);
@@ -125,9 +126,9 @@ DXContainerYAML::RootSignatureYamlDesc::create(
}
NewP.Data = YamlTable;
} else if (auto *TDV = dyn_cast<object::DirectX::DescriptorTableView<
- dxbc::RST0::v1::DescriptorRange>>(&ParamView)) {
+ dxbc::RTS0::v1::DescriptorRange>>(&ParamView)) {
llvm::Expected<
- object::DirectX::DescriptorTable<dxbc::RST0::v1::DescriptorRange>>
+ object::DirectX::DescriptorTable<dxbc::RTS0::v1::DescriptorRange>>
TableOrErr = TDV->read();
if (Error E = TableOrErr.takeError())
return std::move(E);
@@ -146,8 +147,8 @@ DXContainerYAML::RootSignatureYamlDesc::create(
NewR.RegisterSpace = R.RegisterSpace;
NewR.RangeType = R.RangeType;
#define DESCRIPTOR_RANGE_FLAG(Num, Val) \
- NewR.Val = \
- (R.Flags & llvm::to_underlying(dxbc::DescriptorRangeFlag::Val)) > 0;
+ NewR.Val = (R.Flags & \
+ llvm::to_underlying(dxbc::RTS0::DescriptorRangeFlag::Val)) > 0;
#include "llvm/BinaryFormat/DXContainerConstants.def"
YamlTable.Ranges.push_back(NewR);
}
@@ -158,7 +159,7 @@ DXContainerYAML::RootSignatureYamlDesc::create(
}
#define ROOT_ELEMENT_FLAG(Num, Val) \
RootSigDesc.Val = \
- (Flags & llvm::to_underlying(dxbc::RootElementFlag::Val)) > 0;
+ (Flags & llvm::to_underlying(dxbc::RTS0::RootElementFlag::Val)) > 0;
#include "llvm/BinaryFormat/DXContainerConstants.def"
return RootSigDesc;
}
@@ -167,7 +168,7 @@ uint32_t DXContainerYAML::RootDescriptorYaml::getEncodedFlags() const {
uint64_t Flag = 0;
#define ROOT_DESCRIPTOR_FLAG(Num, Val) \
if (Val) \
- Flag |= (uint32_t)dxbc::RootDescriptorFlag::Val;
+ Flag |= (uint32_t)dxbc::RTS0::RootDescriptorFlag::Val;
#include "llvm/BinaryFormat/DXContainerConstants.def"
return Flag;
}
@@ -176,7 +177,7 @@ uint32_t DXContainerYAML::RootSignatureYamlDesc::getEncodedFlags() {
uint64_t Flag = 0;
#define ROOT_ELEMENT_FLAG(Num, Val) \
if (Val) \
- Flag |= (uint32_t)dxbc::RootElementFlag::Val;
+ Flag |= (uint32_t)dxbc::RTS0::RootElementFlag::Val;
#include "llvm/BinaryFormat/DXContainerConstants.def"
return Flag;
}
@@ -185,7 +186,7 @@ uint32_t DXContainerYAML::DescriptorRangeYaml::getEncodedFlags() const {
uint64_t Flag = 0;
#define DESCRIPTOR_RANGE_FLAG(Num, Val) \
if (Val) \
- Flag |= (uint32_t)dxbc::DescriptorRangeFlag::Val;
+ Flag |= (uint32_t)dxbc::RTS0::DescriptorRangeFlag::Val;
#include "llvm/BinaryFormat/DXContainerConstants.def"
return Flag;
}
@@ -401,23 +402,23 @@ void MappingTraits<llvm::DXContainerYAML::RootParameterYamlDesc>::mapping(
IO.mapRequired("ShaderVisibility", P.Visibility);
switch (P.Type) {
- case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): {
+ case llvm::to_underlying(dxbc::RTS0::RootParameterType::Constants32Bit): {
DXContainerYAML::RootConstantsYaml Constants;
if (IO.outputting())
Constants = std::get<DXContainerYAML::RootConstantsYaml>(P.Data);
IO.mapRequired("Constants", Constants);
P.Data = Constants;
} break;
- case llvm::to_underlying(dxbc::RootParameterType::CBV):
- case llvm::to_underlying(dxbc::RootParameterType::SRV):
- case llvm::to_underlying(dxbc::RootParameterType::UAV): {
+ case llvm::to_underlying(dxbc::RTS0::RootParameterType::CBV):
+ case llvm::to_underlying(dxbc::RTS0::RootParameterType::SRV):
+ case llvm::to_underlying(dxbc::RTS0::RootParameterType::UAV): {
DXContainerYAML::RootDescriptorYaml Descriptor;
if (IO.outputting())
Descriptor = std::get<DXContainerYAML::RootDescriptorYaml>(P.Data);
IO.mapRequired("Descriptor", Descriptor);
P.Data = Descriptor;
} break;
- case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable): {
+ case llvm::to_underlying(dxbc::RTS0::RootParameterType::DescriptorTable): {
DXContainerYAML::DescriptorTableYaml Table;
if (IO.outputting())
Table = std::get<DXContainerYAML::DescriptorTableYaml>(P.Data);
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 30ca4d8f7c8ed..ddd3bd11c3ab0 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -76,16 +76,16 @@ static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
if (RootConstantNode->getNumOperands() != 5)
return reportError(Ctx, "Invalid format for RootConstants Element");
- dxbc::RootParameterHeader Header;
+ dxbc::RTS0::v0::RootParameterHeader Header;
Header.ParameterType =
- llvm::to_underlying(dxbc::RootParameterType::Constants32Bit);
+ llvm::to_underlying(dxbc::RTS0::RootParameterType::Constants32Bit);
if (std::optional<uint32_t> Val = extractMdIntValue(RootConstantNode, 1))
Header.ShaderVisibility = *Val;
else
return reportError(Ctx, "Invalid value for ShaderVisibility");
- dxbc::RootConstants Constants;
+ dxbc::RTS0::v0::RootConstants Constants;
if (std::optional<uint32_t> Val = extractMdIntValue(RootConstantNode, 2))
Constants.ShaderRegister = *Val;
else
@@ -167,11 +167,11 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
}
for (const llvm::mcdxbc::RootParameterInfo &Info : RSD.ParametersContainer) {
- if (!dxbc::isValidShaderVisibility(Info.Header.ShaderVisibility))
+ if (!dxbc::RTS0::isValidShaderVisibility(Info.Header.ShaderVisibility))
return reportValueError(Ctx, "ShaderVisibility",
Info.Header.ShaderVisibility);
- assert(dxbc::isValidParameterType(Info.Header.ParameterType) &&
+ assert(dxbc::RTS0::isValidParameterType(Info.Header.ParameterType) &&
"Invalid value for ParameterType");
}
@@ -246,7 +246,7 @@ analyzeModule(Module &M) {
// Clang emits the root signature data in dxcontainer following a specific
// sequence. First the header, then the root parameters. So the header
// offset will always equal to the header size.
- RSD.RootParameterOffset = sizeof(dxbc::RootSignatureHeader);
+ RSD.RootParameterOffset = sizeof(dxbc::RTS0::v0::RootSignatureHeader);
if (parse(Ctx, RSD, RootElementListNode) || validate(Ctx, RSD)) {
return RSDMap;
@@ -301,8 +301,8 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
RS.ParametersContainer.getParameter(&Info);
if (!P)
continue;
- if (std::holds_alternative<const dxbc::RootConstants *>(*P)) {
- auto *Constants = std::get<const dxbc::RootConstants *>(*P);
+ if (std::holds_alternative<const dxbc::RTS0::v0::RootConstants *>(*P)) {
+ auto *Constants = std::get<const dxbc::RTS0::v0::RootConstants *>(*P);
OS << indent(Space + 2)
<< "Register Space: " << Constants->RegisterSpace << "\n";
OS << indent(Space + 2)
diff --git a/llvm/unittests/Object/DXContainerTest.cpp b/llvm/unittests/Object/DXContainerTest.cpp
index 955b832459879..602aae875a283 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -1086,7 +1086,7 @@ TEST(RootSignature, ParseDescriptorTable) {
ASSERT_THAT_ERROR(ParamView.takeError(), Succeeded());
auto *DescriptorTableView =
- dyn_cast<DirectX::DescriptorTableView<dxbc::RST0::v1::DescriptorRange>>(
+ dyn_cast<DirectX::DescriptorTableView<dxbc::RTS0::v1::DescriptorRange>>(
&*ParamView);
ASSERT_TRUE(DescriptorTableView != nullptr);
auto Table = DescriptorTableView->read();
@@ -1139,7 +1139,7 @@ TEST(RootSignature, ParseDescriptorTable) {
ASSERT_THAT_ERROR(ParamView.takeError(), Succeeded());
auto *DescriptorTableView =
- dyn_cast<DirectX::DescriptorTableView<dxbc::RST0::v0::DescriptorRange>>(
+ dyn_cast<DirectX::DescriptorTableView<dxbc::RTS0::v0::DescriptorRange>>(
&*ParamView);
ASSERT_TRUE(DescriptorTableView != nullptr);
auto Table = DescriptorTableView->read();
>From b9d7f076e9c1b3a1c1027b4ed9e8012a58b7cd2b Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 5 May 2025 18:26:14 +0000
Subject: [PATCH 03/29] fix naming
---
llvm/include/llvm/BinaryFormat/DXContainerConstants.def | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
index bd9bd760547dc..db0379b90ef6b 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -73,7 +73,7 @@ ROOT_ELEMENT_FLAG(11, SamplerHeapDirectlyIndexed)
#endif // ROOT_ELEMENT_FLAG
-// ROOT_ELEMENT_FLAG(bit offset for the flag, name).
+// ROOT_DESCRIPTOR_FLAG(bit offset for the flag, name).
#ifdef ROOT_DESCRIPTOR_FLAG
ROOT_DESCRIPTOR_FLAG(0, NONE)
>From 46cc8c1a557c2783159411b72543e1d350e2b55b Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 8 May 2025 17:37:32 +0000
Subject: [PATCH 04/29] addressing comments
---
llvm/include/llvm/MC/DXContainerRootSignature.h | 2 --
llvm/lib/MC/DXContainerRootSignature.cpp | 2 --
llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 6 ++++--
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 1 -
4 files changed, 4 insertions(+), 7 deletions(-)
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index c8af613a57094..b290f4c96c20f 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -6,9 +6,7 @@
//
//===----------------------------------------------------------------------===//
-#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/BinaryFormat/DXContainer.h"
-#include <cstddef>
#include <cstdint>
#include <optional>
#include <utility>
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 641c2f5fa1b1b..54a8bd3e90c69 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -8,9 +8,7 @@
#include "llvm/MC/DXContainerRootSignature.h"
#include "llvm/ADT/SmallString.h"
-#include "llvm/BinaryFormat/DXContainer.h"
#include "llvm/Support/EndianStream.h"
-#include <variant>
using namespace llvm;
using namespace llvm::mcdxbc;
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index b8ea1b048edfe..1c163587d295c 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -298,11 +298,13 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
Descriptor.RegisterSpace = Param.Descriptor.RegisterSpace;
Descriptor.ShaderRegister = Param.Descriptor.ShaderRegister;
Descriptor.Flags = Param.Descriptor.getEncodedFlags();
- RS.ParametersContainer.addParameter(Header, Descriptor);
+ RS.ParametersContainer.addParameter(Header, Descriptor);
}
break;
default:
- // Handling invalid parameter type edge case
+ // Handling invalid parameter type edge case. We intentionally let
+ // obj2yaml/yaml2obj parse and emit invalid dxcontainer data, in order
+ // for that to be used as a testing tool more effectively.
RS.ParametersContainer.addInfo(Header, -1);
}
}
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 30ca4d8f7c8ed..1bd816b026fec 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -30,7 +30,6 @@
#include <cstdint>
#include <optional>
#include <utility>
-#include <variant>
using namespace llvm;
using namespace llvm::dxil;
>From 1b3e10ab85716e194ce16c273a6091e0136bf890 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 8 May 2025 21:44:55 +0000
Subject: [PATCH 05/29] addressing comments
---
llvm/include/llvm/BinaryFormat/DXContainer.h | 21 ++++++++-----
.../llvm/MC/DXContainerRootSignature.h | 2 +-
llvm/include/llvm/Object/DXContainer.h | 31 +++++++++++--------
.../include/llvm/ObjectYAML/DXContainerYAML.h | 2 +-
llvm/lib/MC/DXContainerRootSignature.cpp | 4 +--
llvm/lib/ObjectYAML/DXContainerYAML.cpp | 2 +-
6 files changed, 36 insertions(+), 26 deletions(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 3dbcfa82f3d7c..4fbc0cf1e5954 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -585,8 +585,8 @@ struct ProgramSignatureElement {
static_assert(sizeof(ProgramSignatureElement) == 32,
"ProgramSignatureElement is misaligned");
-namespace RST0 {
-namespace v0 {
+namespace RTS0 {
+namespace v1 {
struct RootDescriptor {
uint32_t ShaderRegister;
uint32_t RegisterSpace;
@@ -595,18 +595,23 @@ struct RootDescriptor {
sys::swapByteOrder(RegisterSpace);
}
};
-} // namespace v0
+} // namespace v1
-namespace v1 {
-struct RootDescriptor : public v0::RootDescriptor {
+namespace v2 {
+struct RootDescriptor : public v1::RootDescriptor {
uint32_t Flags;
+
+ RootDescriptor() = default;
+ RootDescriptor(v1::RootDescriptor &Base)
+ : v1::RootDescriptor(Base), Flags(0u) {}
+
void swapBytes() {
- v0::RootDescriptor::swapBytes();
+ v1::RootDescriptor::swapBytes();
sys::swapByteOrder(Flags);
}
};
-} // namespace v1
-} // namespace RST0
+} // namespace v2
+} // namespace RTS0
// following dx12 naming
// https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ns-d3d12-d3d12_root_constants
struct RootConstants {
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index 44e26c81eedc1..e3c4900ba175c 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -19,7 +19,7 @@ struct RootParameter {
dxbc::RootParameterHeader Header;
union {
dxbc::RootConstants Constants;
- dxbc::RST0::v1::RootDescriptor Descriptor;
+ dxbc::RTS0::v2::RootDescriptor Descriptor;
};
};
struct RootSignatureDesc {
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index e359d85f08bec..f23797149d377 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -17,6 +17,7 @@
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
+#include "llvm/ADT/Twine.h"
#include "llvm/BinaryFormat/DXContainer.h"
#include "llvm/Object/Error.h"
#include "llvm/Support/Error.h"
@@ -124,16 +125,13 @@ struct RootParameterView {
RootParameterView(uint32_t V, const dxbc::RootParameterHeader &H, StringRef P)
: Header(H), ParamData(P) {}
- template <typename T, typename VersionT = T> Expected<T> readParameter() {
- assert(sizeof(VersionT) <= sizeof(T) &&
- "Parameter of higher version must inherit all previous version data "
- "members");
- if (sizeof(VersionT) != ParamData.size())
+ template <typename T> Expected<T> readParameter() {
+ if (sizeof(T) != ParamData.size())
return make_error<GenericBinaryError>(
"Reading structure out of file bounds", object_error::parse_failed);
T Struct;
- memcpy(&Struct, ParamData.data(), sizeof(VersionT));
+ memcpy(&Struct, ParamData.data(), sizeof(T));
// DXContainer is always little endian
if (sys::IsBigEndianHost)
Struct.swapBytes();
@@ -162,11 +160,18 @@ struct RootDescriptorView : RootParameterView {
llvm::to_underlying(dxbc::RootParameterType::UAV));
}
- llvm::Expected<dxbc::RST0::v1::RootDescriptor> read(uint32_t Version) {
- if (Version == 1)
- return readParameter<dxbc::RST0::v1::RootDescriptor,
- dxbc::RST0::v0::RootDescriptor>();
- return readParameter<dxbc::RST0::v1::RootDescriptor>();
+ llvm::Expected<dxbc::RTS0::v2::RootDescriptor> read(uint32_t Version) {
+ if (Version == 1) {
+ auto Descriptor = readParameter<dxbc::RTS0::v1::RootDescriptor>();
+ if (Error E = Descriptor.takeError())
+ return E;
+ return dxbc::RTS0::v2::RootDescriptor(*Descriptor);
+ }
+ if (Version != 2)
+ return make_error<GenericBinaryError>("Invalid Root Signature version: " +
+ Twine(Version),
+ object_error::parse_failed);
+ return readParameter<dxbc::RTS0::v2::RootDescriptor>();
}
};
@@ -217,9 +222,9 @@ class RootSignature {
case dxbc::RootParameterType::SRV:
case dxbc::RootParameterType::UAV:
if (Version == 1)
- DataSize = sizeof(dxbc::RST0::v0::RootDescriptor);
+ DataSize = sizeof(dxbc::RTS0::v1::RootDescriptor);
else
- DataSize = sizeof(dxbc::RST0::v1::RootDescriptor);
+ DataSize = sizeof(dxbc::RTS0::v2::RootDescriptor);
break;
}
size_t EndOfSectionByte = getNumStaticSamplers() == 0
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index 8bb9da7884bed..d9d43b40db299 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -95,7 +95,7 @@ struct RootParameterYamlDesc {
uint32_t Type;
uint32_t Visibility;
uint32_t Offset;
- RootParameterYamlDesc(){};
+ RootParameterYamlDesc() {};
RootParameterYamlDesc(uint32_t T) : Type(T) {
switch (T) {
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 2693cb9943d5e..161711a79e467 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -41,9 +41,9 @@ size_t RootSignatureDesc::getSize() const {
case llvm::to_underlying(dxbc::RootParameterType::SRV):
case llvm::to_underlying(dxbc::RootParameterType::UAV):
if (Version == 1)
- Size += sizeof(dxbc::RST0::v0::RootDescriptor);
+ Size += sizeof(dxbc::RTS0::v1::RootDescriptor);
else
- Size += sizeof(dxbc::RST0::v1::RootDescriptor);
+ Size += sizeof(dxbc::RTS0::v2::RootDescriptor);
break;
}
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index 18c1299d4b867..4c681d80b3358 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -82,7 +82,7 @@ DXContainerYAML::RootSignatureYamlDesc::create(
NewP.Constants.RegisterSpace = Constants.RegisterSpace;
} else if (auto *RDV =
dyn_cast<object::DirectX::RootDescriptorView>(&ParamView)) {
- llvm::Expected<dxbc::RST0::v1::RootDescriptor> DescriptorOrErr =
+ llvm::Expected<dxbc::RTS0::v2::RootDescriptor> DescriptorOrErr =
RDV->read(Version);
if (Error E = DescriptorOrErr.takeError())
return std::move(E);
>From 1f3195784775b3244fd6c0d7447026d290605e85 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 8 May 2025 21:48:35 +0000
Subject: [PATCH 06/29] addressing comments
---
llvm/include/llvm/Object/DXContainer.h | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index f23797149d377..c93c85e638f7b 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -25,6 +25,7 @@
#include "llvm/TargetParser/Triple.h"
#include <array>
#include <cstddef>
+#include <cstdint>
#include <variant>
namespace llvm {
@@ -122,8 +123,10 @@ namespace DirectX {
struct RootParameterView {
const dxbc::RootParameterHeader &Header;
StringRef ParamData;
+ uint32_t Version;
+
RootParameterView(uint32_t V, const dxbc::RootParameterHeader &H, StringRef P)
- : Header(H), ParamData(P) {}
+ : Header(H), ParamData(P), Version(V) {}
template <typename T> Expected<T> readParameter() {
if (sizeof(T) != ParamData.size())
>From e8fbfce6d9c761a640534e8d9ed731a5a4ac986a Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 8 May 2025 22:03:45 +0000
Subject: [PATCH 07/29] clean up
---
llvm/include/llvm/Object/DXContainer.h | 2 +-
llvm/include/llvm/ObjectYAML/DXContainerYAML.h | 1 -
llvm/lib/ObjectYAML/DXContainerYAML.cpp | 1 -
3 files changed, 1 insertion(+), 3 deletions(-)
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index c93c85e638f7b..985a4b0c49e5a 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -129,11 +129,11 @@ struct RootParameterView {
: Header(H), ParamData(P), Version(V) {}
template <typename T> Expected<T> readParameter() {
+ T Struct;
if (sizeof(T) != ParamData.size())
return make_error<GenericBinaryError>(
"Reading structure out of file bounds", object_error::parse_failed);
- T Struct;
memcpy(&Struct, ParamData.data(), sizeof(T));
// DXContainer is always little endian
if (sys::IsBigEndianHost)
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index d9d43b40db299..73532fa392520 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -21,7 +21,6 @@
#include "llvm/ObjectYAML/YAML.h"
#include "llvm/Support/YAMLTraits.h"
#include <array>
-#include <cstdint>
#include <optional>
#include <string>
#include <vector>
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index 4c681d80b3358..8964c913946f2 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -15,7 +15,6 @@
#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/ScopeExit.h"
#include "llvm/BinaryFormat/DXContainer.h"
-#include "llvm/Object/DXContainer.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/ScopedPrinter.h"
#include <cstdint>
>From a31e5a5d14a2e81a411e30e2b50150a0ba85d409 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Fri, 9 May 2025 00:10:39 +0000
Subject: [PATCH 08/29] removing v parameter
---
llvm/include/llvm/Object/DXContainer.h | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index 985a4b0c49e5a..61bfa9411cc57 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -123,10 +123,9 @@ namespace DirectX {
struct RootParameterView {
const dxbc::RootParameterHeader &Header;
StringRef ParamData;
- uint32_t Version;
- RootParameterView(uint32_t V, const dxbc::RootParameterHeader &H, StringRef P)
- : Header(H), ParamData(P), Version(V) {}
+ RootParameterView(const dxbc::RootParameterHeader &H, StringRef P)
+ : Header(H), ParamData(P) {}
template <typename T> Expected<T> readParameter() {
T Struct;
@@ -238,7 +237,7 @@ class RootSignature {
return parseFailed("Reading structure out of file bounds");
StringRef Buff = PartData.substr(Header.ParameterOffset, DataSize);
- RootParameterView View = RootParameterView(Version, Header, Buff);
+ RootParameterView View = RootParameterView(Header, Buff);
return View;
}
};
>From ad415a7a5a4ac5be41445f2d0527895b60e05d7b Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Fri, 9 May 2025 00:28:07 +0000
Subject: [PATCH 09/29] clean up
---
llvm/include/llvm/MC/DXContainerRootSignature.h | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index 7489b7437ff69..b07d0f66e02a4 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -8,8 +8,7 @@
#include "llvm/BinaryFormat/DXContainer.h"
#include <cstdint>
-#include <optional>
-#include <utility>
+#include <limits>
#include <variant>
namespace llvm {
>From 98c6a5f2134ff4e55147c36aeb621a5e3b4ef367 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 14 May 2025 18:20:46 +0000
Subject: [PATCH 10/29] updating namespace naming
---
llvm/include/llvm/BinaryFormat/DXContainer.h | 16 ++++----
.../llvm/MC/DXContainerRootSignature.h | 40 +++++++++----------
llvm/include/llvm/Object/DXContainer.h | 36 ++++++++---------
llvm/lib/MC/DXContainerRootSignature.cpp | 40 +++++++++----------
llvm/lib/Object/DXContainer.cpp | 2 +-
llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 12 +++---
llvm/lib/ObjectYAML/DXContainerYAML.cpp | 14 +++----
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 10 ++---
llvm/unittests/Object/DXContainerTest.cpp | 4 +-
9 files changed, 87 insertions(+), 87 deletions(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 98e30b1b6a8af..c18d1e3d7f024 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -600,7 +600,7 @@ inline bool isValidShaderVisibility(uint32_t V) {
return false;
}
-namespace v0 {
+namespace v1 {
struct RootSignatureHeader {
uint32_t Version;
@@ -667,25 +667,25 @@ struct DescriptorRange {
sys::swapByteOrder(OffsetInDescriptorsFromTableStart);
}
};
-} // namespace v0
+} // namespace v1
-namespace v1 {
-struct RootDescriptor : public v0::RootDescriptor {
+namespace v2 {
+struct RootDescriptor : public v1::RootDescriptor {
uint32_t Flags;
void swapBytes() {
- v0::RootDescriptor::swapBytes();
+ v1::RootDescriptor::swapBytes();
sys::swapByteOrder(Flags);
}
};
-struct DescriptorRange : public v0::DescriptorRange {
+struct DescriptorRange : public v1::DescriptorRange {
uint32_t Flags;
void swapBytes() {
- v0::DescriptorRange::swapBytes();
+ v1::DescriptorRange::swapBytes();
sys::swapByteOrder(Flags);
}
};
-} // namespace v1
+} // namespace v2
} // namespace RTS0
// following dx12 naming
// https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ns-d3d12-d3d12_root_constants
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index 84f6421d8ad9d..caebf4716863b 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -21,16 +21,16 @@ class raw_ostream;
namespace mcdxbc {
struct RootParameterInfo {
- dxbc::RTS0::v0::RootParameterHeader Header;
+ dxbc::RTS0::v1::RootParameterHeader Header;
size_t Location;
RootParameterInfo() = default;
- RootParameterInfo(dxbc::RTS0::v0::RootParameterHeader H, size_t L)
+ RootParameterInfo(dxbc::RTS0::v1::RootParameterHeader H, size_t L)
: Header(H), Location(L) {}
};
-using DescriptorRanges = std::variant<dxbc::RTS0::v0::DescriptorRange,
- dxbc::RTS0::v1::DescriptorRange>;
+using DescriptorRanges = std::variant<dxbc::RTS0::v1::DescriptorRange,
+ dxbc::RTS0::v2::DescriptorRange>;
struct DescriptorTable {
SmallVector<DescriptorRanges> Ranges;
@@ -42,42 +42,42 @@ struct DescriptorTable {
}
};
-using RootDescriptor = std::variant<dxbc::RTS0::v0::RootDescriptor,
- dxbc::RTS0::v1::RootDescriptor>;
+using RootDescriptor = std::variant<dxbc::RTS0::v1::RootDescriptor,
+ dxbc::RTS0::v2::RootDescriptor>;
-using ParametersView = std::variant<const dxbc::RTS0::v0::RootConstants *,
- const dxbc::RTS0::v0::RootDescriptor *,
+using ParametersView = std::variant<const dxbc::RTS0::v1::RootConstants *,
const dxbc::RTS0::v1::RootDescriptor *,
+ const dxbc::RTS0::v2::RootDescriptor *,
const DescriptorTable *>;
struct RootParametersContainer {
SmallVector<RootParameterInfo> ParametersInfo;
- SmallVector<dxbc::RTS0::v0::RootConstants> Constants;
+ SmallVector<dxbc::RTS0::v1::RootConstants> Constants;
SmallVector<RootDescriptor> Descriptors;
SmallVector<DescriptorTable> Tables;
- void addInfo(dxbc::RTS0::v0::RootParameterHeader H, size_t L) {
+ void addInfo(dxbc::RTS0::v1::RootParameterHeader H, size_t L) {
ParametersInfo.push_back(RootParameterInfo(H, L));
}
- void addParameter(dxbc::RTS0::v0::RootParameterHeader H,
- dxbc::RTS0::v0::RootConstants C) {
+ void addParameter(dxbc::RTS0::v1::RootParameterHeader H,
+ dxbc::RTS0::v1::RootConstants C) {
addInfo(H, Constants.size());
Constants.push_back(C);
}
- void addParameter(dxbc::RTS0::v0::RootParameterHeader H,
- dxbc::RTS0::v0::RootDescriptor D) {
+ void addParameter(dxbc::RTS0::v1::RootParameterHeader H,
+ dxbc::RTS0::v1::RootDescriptor D) {
addInfo(H, Descriptors.size());
Descriptors.push_back(D);
}
- void addParameter(dxbc::RTS0::v0::RootParameterHeader H,
- dxbc::RTS0::v1::RootDescriptor D) {
+ void addParameter(dxbc::RTS0::v1::RootParameterHeader H,
+ dxbc::RTS0::v2::RootDescriptor D) {
addInfo(H, Descriptors.size());
Descriptors.push_back(D);
}
- void addParameter(dxbc::RTS0::v0::RootParameterHeader H, DescriptorTable D) {
+ void addParameter(dxbc::RTS0::v1::RootParameterHeader H, DescriptorTable D) {
addInfo(H, Tables.size());
Tables.push_back(D);
}
@@ -90,11 +90,11 @@ struct RootParametersContainer {
case llvm::to_underlying(dxbc::RTS0::RootParameterType::SRV):
case llvm::to_underlying(dxbc::RTS0::RootParameterType::UAV): {
const RootDescriptor &VersionedParam = Descriptors[H->Location];
- if (std::holds_alternative<dxbc::RTS0::v0::RootDescriptor>(
+ if (std::holds_alternative<dxbc::RTS0::v1::RootDescriptor>(
VersionedParam)) {
- return &std::get<dxbc::RTS0::v0::RootDescriptor>(VersionedParam);
+ return &std::get<dxbc::RTS0::v1::RootDescriptor>(VersionedParam);
}
- return &std::get<dxbc::RTS0::v1::RootDescriptor>(VersionedParam);
+ return &std::get<dxbc::RTS0::v2::RootDescriptor>(VersionedParam);
}
case llvm::to_underlying(dxbc::RTS0::RootParameterType::DescriptorTable):
return &Tables[H->Location];
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index 3e32870c5fb8f..a4b1f91cd16ff 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -120,11 +120,11 @@ template <typename T> struct ViewArray {
namespace DirectX {
struct RootParameterView {
- const dxbc::RTS0::v0::RootParameterHeader &Header;
+ const dxbc::RTS0::v1::RootParameterHeader &Header;
StringRef ParamData;
uint32_t Version;
- RootParameterView(uint32_t V, const dxbc::RTS0::v0::RootParameterHeader &H,
+ RootParameterView(uint32_t V, const dxbc::RTS0::v1::RootParameterHeader &H,
StringRef P)
: Header(H), ParamData(P), Version(V) {}
@@ -151,8 +151,8 @@ struct RootConstantView : RootParameterView {
(uint32_t)dxbc::RTS0::RootParameterType::Constants32Bit;
}
- llvm::Expected<dxbc::RTS0::v0::RootConstants> read() {
- return readParameter<dxbc::RTS0::v0::RootConstants>();
+ llvm::Expected<dxbc::RTS0::v1::RootConstants> read() {
+ return readParameter<dxbc::RTS0::v1::RootConstants>();
}
};
@@ -166,11 +166,11 @@ struct RootDescriptorView : RootParameterView {
llvm::to_underlying(dxbc::RTS0::RootParameterType::UAV));
}
- llvm::Expected<dxbc::RTS0::v1::RootDescriptor> read(uint32_t Version) {
+ llvm::Expected<dxbc::RTS0::v2::RootDescriptor> read(uint32_t Version) {
if (Version == 1)
- return readParameter<dxbc::RTS0::v1::RootDescriptor,
- dxbc::RTS0::v0::RootDescriptor>();
- return readParameter<dxbc::RTS0::v1::RootDescriptor>();
+ return readParameter<dxbc::RTS0::v2::RootDescriptor,
+ dxbc::RTS0::v1::RootDescriptor>();
+ return readParameter<dxbc::RTS0::v2::RootDescriptor>();
}
};
template <typename T> struct DescriptorTable {
@@ -187,11 +187,11 @@ template <typename T> struct TemplateTypeToVersion {
static constexpr uint32_t Value = -1;
};
-template <> struct TemplateTypeToVersion<dxbc::RTS0::v0::DescriptorRange> {
+template <> struct TemplateTypeToVersion<dxbc::RTS0::v1::DescriptorRange> {
static constexpr uint32_t Value = 1;
};
-template <> struct TemplateTypeToVersion<dxbc::RTS0::v1::DescriptorRange> {
+template <> struct TemplateTypeToVersion<dxbc::RTS0::v2::DescriptorRange> {
static constexpr uint32_t Value = 2;
};
@@ -236,11 +236,11 @@ class RootSignature {
uint32_t NumStaticSamplers;
uint32_t StaticSamplersOffset;
uint32_t Flags;
- ViewArray<dxbc::RTS0::v0::RootParameterHeader> ParametersHeaders;
+ ViewArray<dxbc::RTS0::v1::RootParameterHeader> ParametersHeaders;
StringRef PartData;
using param_header_iterator =
- ViewArray<dxbc::RTS0::v0::RootParameterHeader>::iterator;
+ ViewArray<dxbc::RTS0::v1::RootParameterHeader>::iterator;
public:
RootSignature(StringRef PD) : PartData(PD) {}
@@ -258,7 +258,7 @@ class RootSignature {
uint32_t getFlags() const { return Flags; }
llvm::Expected<RootParameterView>
- getParameter(const dxbc::RTS0::v0::RootParameterHeader &Header) const {
+ getParameter(const dxbc::RTS0::v1::RootParameterHeader &Header) const {
size_t DataSize;
if (!dxbc::RTS0::isValidParameterType(Header.ParameterType))
@@ -266,25 +266,25 @@ class RootSignature {
switch (static_cast<dxbc::RTS0::RootParameterType>(Header.ParameterType)) {
case dxbc::RTS0::RootParameterType::Constants32Bit:
- DataSize = sizeof(dxbc::RTS0::v0::RootConstants);
+ DataSize = sizeof(dxbc::RTS0::v1::RootConstants);
break;
case dxbc::RTS0::RootParameterType::CBV:
case dxbc::RTS0::RootParameterType::SRV:
case dxbc::RTS0::RootParameterType::UAV:
if (Version == 1)
- DataSize = sizeof(dxbc::RTS0::v0::RootDescriptor);
- else
DataSize = sizeof(dxbc::RTS0::v1::RootDescriptor);
+ else
+ DataSize = sizeof(dxbc::RTS0::v2::RootDescriptor);
break;
case dxbc::RTS0::RootParameterType::DescriptorTable:
uint32_t NumRanges =
support::endian::read<uint32_t, llvm::endianness::little>(
PartData.begin() + Header.ParameterOffset);
if (Version == 1)
- DataSize = sizeof(dxbc::RTS0::v0::DescriptorRange) * NumRanges +
+ DataSize = sizeof(dxbc::RTS0::v1::DescriptorRange) * NumRanges +
2 * sizeof(uint32_t);
else
- DataSize = sizeof(dxbc::RTS0::v1::DescriptorRange) * NumRanges +
+ DataSize = sizeof(dxbc::RTS0::v2::DescriptorRange) * NumRanges +
2 * sizeof(uint32_t);
break;
}
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 352a8d3a9c603..1da4910f3a3db 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -21,25 +21,25 @@ class SizeCalculatorVisitor {
SizeCalculatorVisitor(uint32_t Version, size_t &SizeRef)
: Size(SizeRef), Version(Version) {}
- void operator()(const dxbc::RTS0::v0::RootConstants *Value) const {
- Size += sizeof(dxbc::RTS0::v0::RootConstants);
- }
-
- void operator()(const dxbc::RTS0::v0::RootDescriptor *Value) const {
- Size += sizeof(dxbc::RTS0::v0::RootDescriptor);
+ void operator()(const dxbc::RTS0::v1::RootConstants *Value) const {
+ Size += sizeof(dxbc::RTS0::v1::RootConstants);
}
void operator()(const dxbc::RTS0::v1::RootDescriptor *Value) const {
Size += sizeof(dxbc::RTS0::v1::RootDescriptor);
}
+ void operator()(const dxbc::RTS0::v2::RootDescriptor *Value) const {
+ Size += sizeof(dxbc::RTS0::v2::RootDescriptor);
+ }
+
void operator()(const DescriptorTable *Value) const {
if (Version == 1)
Size +=
- sizeof(dxbc::RTS0::v0::DescriptorRange) * Value->Ranges.size() + 8;
+ sizeof(dxbc::RTS0::v1::DescriptorRange) * Value->Ranges.size() + 8;
else
Size +=
- sizeof(dxbc::RTS0::v1::DescriptorRange) * Value->Ranges.size() + 8;
+ sizeof(dxbc::RTS0::v2::DescriptorRange) * Value->Ranges.size() + 8;
}
private:
@@ -64,8 +64,8 @@ static void rewriteOffsetToCurrentByte(raw_svector_ostream &Stream,
size_t RootSignatureDesc::getSize() const {
size_t Size =
- sizeof(dxbc::RTS0::v0::RootSignatureHeader) +
- ParametersContainer.size() * sizeof(dxbc::RTS0::v0::RootParameterHeader);
+ sizeof(dxbc::RTS0::v1::RootSignatureHeader) +
+ ParametersContainer.size() * sizeof(dxbc::RTS0::v1::RootParameterHeader);
for (const auto &I : ParametersContainer) {
std::optional<ParametersView> P = ParametersContainer.getParameter(&I);
@@ -109,28 +109,28 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
auto P = ParametersContainer.getParameter(H);
if (!P)
continue;
- if (std::holds_alternative<const dxbc::RTS0::v0::RootConstants *>(
+ if (std::holds_alternative<const dxbc::RTS0::v1::RootConstants *>(
P.value())) {
auto *Constants =
- std::get<const dxbc::RTS0::v0::RootConstants *>(P.value());
+ std::get<const dxbc::RTS0::v1::RootConstants *>(P.value());
support::endian::write(BOS, Constants->ShaderRegister,
llvm::endianness::little);
support::endian::write(BOS, Constants->RegisterSpace,
llvm::endianness::little);
support::endian::write(BOS, Constants->Num32BitValues,
llvm::endianness::little);
- } else if (std::holds_alternative<const dxbc::RTS0::v0::RootDescriptor *>(
+ } else if (std::holds_alternative<const dxbc::RTS0::v1::RootDescriptor *>(
*P)) {
auto *Descriptor =
- std::get<const dxbc::RTS0::v0::RootDescriptor *>(P.value());
+ std::get<const dxbc::RTS0::v1::RootDescriptor *>(P.value());
support::endian::write(BOS, Descriptor->ShaderRegister,
llvm::endianness::little);
support::endian::write(BOS, Descriptor->RegisterSpace,
llvm::endianness::little);
- } else if (std::holds_alternative<const dxbc::RTS0::v1::RootDescriptor *>(
+ } else if (std::holds_alternative<const dxbc::RTS0::v2::RootDescriptor *>(
*P)) {
auto *Descriptor =
- std::get<const dxbc::RTS0::v1::RootDescriptor *>(P.value());
+ std::get<const dxbc::RTS0::v2::RootDescriptor *>(P.value());
support::endian::write(BOS, Descriptor->ShaderRegister,
llvm::endianness::little);
@@ -144,8 +144,8 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
llvm::endianness::little);
rewriteOffsetToCurrentByte(BOS, writePlaceholder(BOS));
for (const auto &R : *Table) {
- if (std::holds_alternative<dxbc::RTS0::v0::DescriptorRange>(R)) {
- auto Range = std::get<dxbc::RTS0::v0::DescriptorRange>(R);
+ if (std::holds_alternative<dxbc::RTS0::v1::DescriptorRange>(R)) {
+ auto Range = std::get<dxbc::RTS0::v1::DescriptorRange>(R);
support::endian::write(BOS, Range.RangeType,
llvm::endianness::little);
@@ -158,8 +158,8 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
support::endian::write(BOS, Range.OffsetInDescriptorsFromTableStart,
llvm::endianness::little);
} else {
- if (std::holds_alternative<dxbc::RTS0::v1::DescriptorRange>(R)) {
- auto Range = std::get<dxbc::RTS0::v1::DescriptorRange>(R);
+ if (std::holds_alternative<dxbc::RTS0::v2::DescriptorRange>(R)) {
+ auto Range = std::get<dxbc::RTS0::v2::DescriptorRange>(R);
support::endian::write(BOS, Range.RangeType,
llvm::endianness::little);
diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index f4617bd87e0f7..2d05566626bfc 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -274,7 +274,7 @@ Error DirectX::RootSignature::parse() {
ParametersHeaders.Data = PartData.substr(
RootParametersOffset,
- NumParameters * sizeof(dxbc::RTS0::v0::RootParameterHeader));
+ NumParameters * sizeof(dxbc::RTS0::v1::RootParameterHeader));
return Error::success();
}
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index e24d5cb528389..66aad157cd5c2 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -277,7 +277,7 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
RS.StaticSamplersOffset = P.RootSignature->StaticSamplersOffset;
for (const auto &Param : P.RootSignature->Parameters) {
- auto Header = dxbc::RTS0::v0::RootParameterHeader{
+ auto Header = dxbc::RTS0::v1::RootParameterHeader{
Param.Type, Param.Visibility, Param.Offset};
if (std::holds_alternative<DXContainerYAML::RootConstantsYaml>(
@@ -285,7 +285,7 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
auto ConstantYaml =
std::get<DXContainerYAML::RootConstantsYaml>(Param.Data);
- dxbc::RTS0::v0::RootConstants Constants;
+ dxbc::RTS0::v1::RootConstants Constants;
Constants.Num32BitValues = ConstantYaml.Num32BitValues;
Constants.RegisterSpace = ConstantYaml.RegisterSpace;
Constants.ShaderRegister = ConstantYaml.ShaderRegister;
@@ -296,12 +296,12 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
std::get<DXContainerYAML::RootDescriptorYaml>(Param.Data);
if (RS.Version == 1) {
- dxbc::RTS0::v0::RootDescriptor Descriptor;
+ dxbc::RTS0::v1::RootDescriptor Descriptor;
Descriptor.RegisterSpace = DescriptorYaml.RegisterSpace;
Descriptor.ShaderRegister = DescriptorYaml.ShaderRegister;
RS.ParametersContainer.addParameter(Header, Descriptor);
} else {
- dxbc::RTS0::v1::RootDescriptor Descriptor;
+ dxbc::RTS0::v2::RootDescriptor Descriptor;
Descriptor.RegisterSpace = DescriptorYaml.RegisterSpace;
Descriptor.ShaderRegister = DescriptorYaml.ShaderRegister;
Descriptor.Flags = DescriptorYaml.getEncodedFlags();
@@ -315,7 +315,7 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
for (const auto &R : TableYaml.Ranges) {
if (RS.Version == 1) {
- dxbc::RTS0::v0::DescriptorRange Range;
+ dxbc::RTS0::v1::DescriptorRange Range;
Range.RangeType = R.RangeType;
Range.NumDescriptors = R.NumDescriptors;
Range.BaseShaderRegister = R.BaseShaderRegister;
@@ -324,7 +324,7 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
R.OffsetInDescriptorsFromTableStart;
Table.Ranges.push_back(Range);
} else {
- dxbc::RTS0::v1::DescriptorRange Range;
+ dxbc::RTS0::v2::DescriptorRange Range;
Range.RangeType = R.RangeType;
Range.NumDescriptors = R.NumDescriptors;
Range.BaseShaderRegister = R.BaseShaderRegister;
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index f61ef9dc3e2ef..8656fc288e92a 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -48,7 +48,7 @@ DXContainerYAML::RootSignatureYamlDesc::create(
RootSigDesc.RootParametersOffset = Data.getRootParametersOffset();
uint32_t Flags = Data.getFlags();
- for (const dxbc::RTS0::v0::RootParameterHeader &PH : Data.param_headers()) {
+ for (const dxbc::RTS0::v1::RootParameterHeader &PH : Data.param_headers()) {
if (!dxbc::RTS0::isValidParameterType(PH.ParameterType))
return createStringError(std::errc::invalid_argument,
@@ -71,7 +71,7 @@ DXContainerYAML::RootSignatureYamlDesc::create(
object::DirectX::RootParameterView ParamView = ParamViewOrErr.get();
if (auto *RCV = dyn_cast<object::DirectX::RootConstantView>(&ParamView)) {
- llvm::Expected<dxbc::RTS0::v0::RootConstants> ConstantsOrErr =
+ llvm::Expected<dxbc::RTS0::v1::RootConstants> ConstantsOrErr =
RCV->read();
if (Error E = ConstantsOrErr.takeError())
return std::move(E);
@@ -84,7 +84,7 @@ DXContainerYAML::RootSignatureYamlDesc::create(
NewP.Data = ConstantYaml;
} else if (auto *RDV =
dyn_cast<object::DirectX::RootDescriptorView>(&ParamView)) {
- llvm::Expected<dxbc::RTS0::v1::RootDescriptor> DescriptorOrErr =
+ llvm::Expected<dxbc::RTS0::v2::RootDescriptor> DescriptorOrErr =
RDV->read(Version);
if (Error E = DescriptorOrErr.takeError())
return std::move(E);
@@ -101,9 +101,9 @@ DXContainerYAML::RootSignatureYamlDesc::create(
}
NewP.Data = YamlDescriptor;
} else if (auto *TDV = dyn_cast<object::DirectX::DescriptorTableView<
- dxbc::RTS0::v0::DescriptorRange>>(&ParamView)) {
+ dxbc::RTS0::v1::DescriptorRange>>(&ParamView)) {
llvm::Expected<
- object::DirectX::DescriptorTable<dxbc::RTS0::v0::DescriptorRange>>
+ object::DirectX::DescriptorTable<dxbc::RTS0::v1::DescriptorRange>>
TableOrErr = TDV->read();
if (Error E = TableOrErr.takeError())
return std::move(E);
@@ -126,9 +126,9 @@ DXContainerYAML::RootSignatureYamlDesc::create(
}
NewP.Data = YamlTable;
} else if (auto *TDV = dyn_cast<object::DirectX::DescriptorTableView<
- dxbc::RTS0::v1::DescriptorRange>>(&ParamView)) {
+ dxbc::RTS0::v2::DescriptorRange>>(&ParamView)) {
llvm::Expected<
- object::DirectX::DescriptorTable<dxbc::RTS0::v1::DescriptorRange>>
+ object::DirectX::DescriptorTable<dxbc::RTS0::v2::DescriptorRange>>
TableOrErr = TDV->read();
if (Error E = TableOrErr.takeError())
return std::move(E);
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index ddd3bd11c3ab0..f3c6835822a32 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -76,7 +76,7 @@ static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
if (RootConstantNode->getNumOperands() != 5)
return reportError(Ctx, "Invalid format for RootConstants Element");
- dxbc::RTS0::v0::RootParameterHeader Header;
+ dxbc::RTS0::v1::RootParameterHeader Header;
Header.ParameterType =
llvm::to_underlying(dxbc::RTS0::RootParameterType::Constants32Bit);
@@ -85,7 +85,7 @@ static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
else
return reportError(Ctx, "Invalid value for ShaderVisibility");
- dxbc::RTS0::v0::RootConstants Constants;
+ dxbc::RTS0::v1::RootConstants Constants;
if (std::optional<uint32_t> Val = extractMdIntValue(RootConstantNode, 2))
Constants.ShaderRegister = *Val;
else
@@ -246,7 +246,7 @@ analyzeModule(Module &M) {
// Clang emits the root signature data in dxcontainer following a specific
// sequence. First the header, then the root parameters. So the header
// offset will always equal to the header size.
- RSD.RootParameterOffset = sizeof(dxbc::RTS0::v0::RootSignatureHeader);
+ RSD.RootParameterOffset = sizeof(dxbc::RTS0::v1::RootSignatureHeader);
if (parse(Ctx, RSD, RootElementListNode) || validate(Ctx, RSD)) {
return RSDMap;
@@ -301,8 +301,8 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
RS.ParametersContainer.getParameter(&Info);
if (!P)
continue;
- if (std::holds_alternative<const dxbc::RTS0::v0::RootConstants *>(*P)) {
- auto *Constants = std::get<const dxbc::RTS0::v0::RootConstants *>(*P);
+ if (std::holds_alternative<const dxbc::RTS0::v1::RootConstants *>(*P)) {
+ auto *Constants = std::get<const dxbc::RTS0::v1::RootConstants *>(*P);
OS << indent(Space + 2)
<< "Register Space: " << Constants->RegisterSpace << "\n";
OS << indent(Space + 2)
diff --git a/llvm/unittests/Object/DXContainerTest.cpp b/llvm/unittests/Object/DXContainerTest.cpp
index 602aae875a283..d2c4e5bb91ee9 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -1086,7 +1086,7 @@ TEST(RootSignature, ParseDescriptorTable) {
ASSERT_THAT_ERROR(ParamView.takeError(), Succeeded());
auto *DescriptorTableView =
- dyn_cast<DirectX::DescriptorTableView<dxbc::RTS0::v1::DescriptorRange>>(
+ dyn_cast<DirectX::DescriptorTableView<dxbc::RTS0::v2::DescriptorRange>>(
&*ParamView);
ASSERT_TRUE(DescriptorTableView != nullptr);
auto Table = DescriptorTableView->read();
@@ -1139,7 +1139,7 @@ TEST(RootSignature, ParseDescriptorTable) {
ASSERT_THAT_ERROR(ParamView.takeError(), Succeeded());
auto *DescriptorTableView =
- dyn_cast<DirectX::DescriptorTableView<dxbc::RTS0::v0::DescriptorRange>>(
+ dyn_cast<DirectX::DescriptorTableView<dxbc::RTS0::v1::DescriptorRange>>(
&*ParamView);
ASSERT_TRUE(DescriptorTableView != nullptr);
auto Table = DescriptorTableView->read();
>From d67f7d3f528e5e2bf476444dfa32a7d4433ecf07 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 14 May 2025 22:19:07 +0000
Subject: [PATCH 11/29] addressing comment
---
.../llvm/MC/DXContainerRootSignature.h | 39 +++++------
.../include/llvm/ObjectYAML/DXContainerYAML.h | 2 +-
llvm/lib/MC/DXContainerRootSignature.cpp | 69 ++++++++++---------
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 40 ++++++-----
4 files changed, 76 insertions(+), 74 deletions(-)
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index b07d0f66e02a4..f02afddc8d57d 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -35,7 +35,7 @@ struct RootParametersContainer {
SmallVector<RootParameterInfo> ParametersInfo;
SmallVector<dxbc::RootConstants> Constants;
- SmallVector<RootDescriptor> Descriptors;
+ SmallVector<dxbc::RTS0::v2::RootDescriptor> Descriptors;
void addInfo(dxbc::RootParameterHeader H, size_t L) {
ParametersInfo.push_back(RootParameterInfo(H, L));
@@ -47,33 +47,28 @@ struct RootParametersContainer {
}
void addParameter(dxbc::RootParameterHeader H,
- dxbc::RTS0::v1::RootDescriptor D) {
+ dxbc::RTS0::v2::RootDescriptor D) {
addInfo(H, Descriptors.size());
Descriptors.push_back(D);
}
- void addParameter(dxbc::RootParameterHeader H,
- dxbc::RTS0::v2::RootDescriptor D) {
- addInfo(H, Descriptors.size());
- Descriptors.push_back(D);
+ const std::pair<uint32_t, uint32_t>
+ getTypeAndLocForParameter(uint32_t Index) const {
+ const RootParameterInfo &Info = ParametersInfo[Index];
+ return {Info.Header.ParameterType, Info.Location};
+ }
+
+ const dxbc::RootParameterHeader &getHeader(size_t Index) const {
+ const RootParameterInfo &Info = ParametersInfo[Index];
+ return Info.Header;
+ }
+
+ const dxbc::RootConstants &getConstant(size_t Index) const {
+ return Constants[Index];
}
- std::optional<ParametersView> getParameter(const RootParameterInfo *H) const {
- switch (H->Header.ParameterType) {
- case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
- return &Constants[H->Location];
- case llvm::to_underlying(dxbc::RootParameterType::CBV):
- case llvm::to_underlying(dxbc::RootParameterType::SRV):
- case llvm::to_underlying(dxbc::RootParameterType::UAV):
- const RootDescriptor &VersionedParam = Descriptors[H->Location];
- if (std::holds_alternative<dxbc::RTS0::v1::RootDescriptor>(
- VersionedParam)) {
- return &std::get<dxbc::RTS0::v1::RootDescriptor>(VersionedParam);
- }
- return &std::get<dxbc::RTS0::v2::RootDescriptor>(VersionedParam);
- }
-
- return std::nullopt;
+ const dxbc::RTS0::v2::RootDescriptor &getRootDescriptor(size_t Index) const {
+ return Descriptors[Index];
}
size_t size() const { return ParametersInfo.size(); }
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index 72bf5a9964a7d..73532fa392520 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -94,7 +94,7 @@ struct RootParameterYamlDesc {
uint32_t Type;
uint32_t Visibility;
uint32_t Offset;
- RootParameterYamlDesc(){};
+ RootParameterYamlDesc() {};
RootParameterYamlDesc(uint32_t T) : Type(T) {
switch (T) {
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 4980413472ede..f68f7cca752e1 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -7,7 +7,9 @@
//===----------------------------------------------------------------------===//
#include "llvm/MC/DXContainerRootSignature.h"
+#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/SmallString.h"
+#include "llvm/BinaryFormat/DXContainer.h"
#include "llvm/Support/EndianStream.h"
using namespace llvm;
@@ -33,15 +35,20 @@ size_t RootSignatureDesc::getSize() const {
ParametersContainer.size() * sizeof(dxbc::RootParameterHeader);
for (const auto &I : ParametersContainer) {
- std::optional<ParametersView> P = ParametersContainer.getParameter(&I);
- if (!P)
- continue;
- std::visit(
- [&Size](auto &Value) -> void {
- using T = std::decay_t<decltype(*Value)>;
- Size += sizeof(T);
- },
- *P);
+ switch (I.Header.ParameterType) {
+ case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
+ Size += sizeof(dxbc::RootConstants);
+ break;
+ case llvm::to_underlying(dxbc::RootParameterType::CBV):
+ case llvm::to_underlying(dxbc::RootParameterType::SRV):
+ case llvm::to_underlying(dxbc::RootParameterType::UAV):
+ if (Version == 1)
+ Size += sizeof(dxbc::RTS0::v1::RootDescriptor);
+ else
+ Size += sizeof(dxbc::RTS0::v2::RootDescriptor);
+
+ break;
+ }
}
return Size;
@@ -62,7 +69,7 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
support::endian::write(BOS, Flags, llvm::endianness::little);
SmallVector<uint32_t> ParamsOffsets;
- for (const auto &P : ParametersContainer) {
+ for (const RootParameterInfo &P : ParametersContainer) {
support::endian::write(BOS, P.Header.ParameterType,
llvm::endianness::little);
support::endian::write(BOS, P.Header.ShaderVisibility,
@@ -75,35 +82,31 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
const RootParameterInfo *H = ParametersContainer.begin();
for (size_t I = 0; I < NumParameters; ++I, H++) {
rewriteOffsetToCurrentByte(BOS, ParamsOffsets[I]);
- auto P = ParametersContainer.getParameter(H);
- if (!P)
- continue;
- if (std::holds_alternative<const dxbc::RootConstants *>(P.value())) {
- auto *Constants = std::get<const dxbc::RootConstants *>(P.value());
- support::endian::write(BOS, Constants->ShaderRegister,
- llvm::endianness::little);
- support::endian::write(BOS, Constants->RegisterSpace,
+ const auto &[Type, Loc] = ParametersContainer.getTypeAndLocForParameter(I);
+ switch (Type) {
+ case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): {
+ const dxbc::RootConstants Constants =
+ ParametersContainer.getConstant(Loc);
+ support::endian::write(BOS, Constants.ShaderRegister,
llvm::endianness::little);
- support::endian::write(BOS, Constants->Num32BitValues,
+ support::endian::write(BOS, Constants.RegisterSpace,
llvm::endianness::little);
- } else if (std::holds_alternative<const dxbc::RTS0::v1::RootDescriptor *>(
- *P)) {
- auto *Descriptor =
- std::get<const dxbc::RTS0::v1::RootDescriptor *>(P.value());
- support::endian::write(BOS, Descriptor->ShaderRegister,
+ support::endian::write(BOS, Constants.Num32BitValues,
llvm::endianness::little);
- support::endian::write(BOS, Descriptor->RegisterSpace,
- llvm::endianness::little);
- } else if (std::holds_alternative<const dxbc::RTS0::v2::RootDescriptor *>(
- *P)) {
- auto *Descriptor =
- std::get<const dxbc::RTS0::v2::RootDescriptor *>(P.value());
+ } break;
+ case llvm::to_underlying(dxbc::RootParameterType::CBV):
+ case llvm::to_underlying(dxbc::RootParameterType::SRV):
+ case llvm::to_underlying(dxbc::RootParameterType::UAV): {
+ const dxbc::RTS0::v2::RootDescriptor Descriptor =
+ ParametersContainer.getRootDescriptor(Loc);
- support::endian::write(BOS, Descriptor->ShaderRegister,
+ support::endian::write(BOS, Descriptor.ShaderRegister,
llvm::endianness::little);
- support::endian::write(BOS, Descriptor->RegisterSpace,
+ support::endian::write(BOS, Descriptor.RegisterSpace,
llvm::endianness::little);
- support::endian::write(BOS, Descriptor->Flags, llvm::endianness::little);
+ if (Version > 1)
+ support::endian::write(BOS, Descriptor.Flags, llvm::endianness::little);
+ }
}
}
assert(Storage.size() == getSize());
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 1bd816b026fec..39083b6f1f757 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//
#include "DXILRootSignature.h"
#include "DirectX.h"
+#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/DXILMetadataAnalysis.h"
@@ -27,6 +28,7 @@
#include "llvm/Support/Error.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
+#include <cstddef>
#include <cstdint>
#include <optional>
#include <utility>
@@ -291,35 +293,37 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
OS << indent(Space) << "NumParameters: " << RS.ParametersContainer.size()
<< "\n";
Space++;
- for (auto const &Info : RS.ParametersContainer) {
- OS << indent(Space) << "- Parameter Type: " << Info.Header.ParameterType
- << "\n";
+ for (size_t I = 0; I < RS.ParametersContainer.size(); I++) {
+ const auto &[Type, Loc] =
+ RS.ParametersContainer.getTypeAndLocForParameter(I);
+ const dxbc::RootParameterHeader Header =
+ RS.ParametersContainer.getHeader(I);
+
+ OS << indent(Space) << "- Parameter Type: " << Type << "\n";
OS << indent(Space + 2)
- << "Shader Visibility: " << Info.Header.ShaderVisibility << "\n";
- std::optional<mcdxbc::ParametersView> P =
- RS.ParametersContainer.getParameter(&Info);
- if (!P)
- continue;
- if (std::holds_alternative<const dxbc::RootConstants *>(*P)) {
- auto *Constants = std::get<const dxbc::RootConstants *>(*P);
- OS << indent(Space + 2)
- << "Register Space: " << Constants->RegisterSpace << "\n";
+ << "Shader Visibility: " << Header.ShaderVisibility << "\n";
+
+ switch (Type) {
+ case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): {
+ auto Constants = RS.ParametersContainer.getConstant(Loc);
+ OS << indent(Space + 2) << "Register Space: " << Constants.RegisterSpace
+ << "\n";
OS << indent(Space + 2)
- << "Shader Register: " << Constants->ShaderRegister << "\n";
+ << "Shader Register: " << Constants.ShaderRegister << "\n";
OS << indent(Space + 2)
- << "Num 32 Bit Values: " << Constants->Num32BitValues << "\n";
+ << "Num 32 Bit Values: " << Constants.Num32BitValues << "\n";
+ }
}
+ Space--;
}
- Space--;
OS << indent(Space) << "NumStaticSamplers: " << 0 << "\n";
OS << indent(Space) << "StaticSamplersOffset: " << RS.StaticSamplersOffset
<< "\n";
Space--;
// end root signature header
- }
-
- return PreservedAnalyses::all();
+}
+return PreservedAnalyses::all();
}
//===----------------------------------------------------------------------===//
>From 5453ad082730aca3b066408c25334bd9e1665335 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 14 May 2025 22:29:09 +0000
Subject: [PATCH 12/29] clean up
---
llvm/include/llvm/MC/DXContainerRootSignature.h | 6 ------
llvm/lib/MC/DXContainerRootSignature.cpp | 2 --
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 2 --
3 files changed, 10 deletions(-)
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index f02afddc8d57d..ca27a0f0379cc 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -9,7 +9,6 @@
#include "llvm/BinaryFormat/DXContainer.h"
#include <cstdint>
#include <limits>
-#include <variant>
namespace llvm {
@@ -26,11 +25,6 @@ struct RootParameterInfo {
: Header(H), Location(L) {}
};
-using RootDescriptor = std::variant<dxbc::RTS0::v1::RootDescriptor,
- dxbc::RTS0::v2::RootDescriptor>;
-using ParametersView = std::variant<const dxbc::RootConstants *,
- const dxbc::RTS0::v1::RootDescriptor *,
- const dxbc::RTS0::v2::RootDescriptor *>;
struct RootParametersContainer {
SmallVector<RootParameterInfo> ParametersInfo;
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index f68f7cca752e1..ac061ebb4be33 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -7,9 +7,7 @@
//===----------------------------------------------------------------------===//
#include "llvm/MC/DXContainerRootSignature.h"
-#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/SmallString.h"
-#include "llvm/BinaryFormat/DXContainer.h"
#include "llvm/Support/EndianStream.h"
using namespace llvm;
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 39083b6f1f757..8064c7c9511e6 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -12,7 +12,6 @@
//===----------------------------------------------------------------------===//
#include "DXILRootSignature.h"
#include "DirectX.h"
-#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/DXILMetadataAnalysis.h"
@@ -28,7 +27,6 @@
#include "llvm/Support/Error.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
-#include <cstddef>
#include <cstdint>
#include <optional>
#include <utility>
>From 836a8a8eb02bac84e6c5a222994c5c7a478dd4ae Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 14 May 2025 22:58:30 +0000
Subject: [PATCH 13/29] format
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 8064c7c9511e6..e39ba7b519161 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -320,8 +320,8 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
Space--;
// end root signature header
-}
-return PreservedAnalyses::all();
+ }
+ return PreservedAnalyses::all();
}
//===----------------------------------------------------------------------===//
>From 5bd57a645b6bdf8c3f0829d0cd4e79ffd93a5806 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 14 May 2025 23:04:18 +0000
Subject: [PATCH 14/29] adding comment
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 2 ++
1 file changed, 2 insertions(+)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index e39ba7b519161..7545a9bc5304b 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -76,6 +76,8 @@ static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
return reportError(Ctx, "Invalid format for RootConstants Element");
dxbc::RootParameterHeader Header;
+ // this will be properly calculated when writing it.
+ Header.ParameterOffset = 0;
Header.ParameterType =
llvm::to_underlying(dxbc::RootParameterType::Constants32Bit);
>From 960cb9cdfef111ad7126e1250de676c66f8d7767 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 14 May 2025 23:19:54 +0000
Subject: [PATCH 15/29] adrresing comments
---
llvm/lib/MC/DXContainerRootSignature.cpp | 9 ++++-----
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 2 +-
2 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index ac061ebb4be33..6e2eaf5e6fdf8 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -77,13 +77,12 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
}
assert(NumParameters == ParamsOffsets.size());
- const RootParameterInfo *H = ParametersContainer.begin();
- for (size_t I = 0; I < NumParameters; ++I, H++) {
+ for (size_t I = 0; I < NumParameters; ++I) {
rewriteOffsetToCurrentByte(BOS, ParamsOffsets[I]);
const auto &[Type, Loc] = ParametersContainer.getTypeAndLocForParameter(I);
switch (Type) {
case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): {
- const dxbc::RootConstants Constants =
+ const dxbc::RootConstants &Constants =
ParametersContainer.getConstant(Loc);
support::endian::write(BOS, Constants.ShaderRegister,
llvm::endianness::little);
@@ -95,7 +94,7 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
case llvm::to_underlying(dxbc::RootParameterType::CBV):
case llvm::to_underlying(dxbc::RootParameterType::SRV):
case llvm::to_underlying(dxbc::RootParameterType::UAV): {
- const dxbc::RTS0::v2::RootDescriptor Descriptor =
+ const dxbc::RTS0::v2::RootDescriptor &Descriptor =
ParametersContainer.getRootDescriptor(Loc);
support::endian::write(BOS, Descriptor.ShaderRegister,
@@ -104,7 +103,7 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
llvm::endianness::little);
if (Version > 1)
support::endian::write(BOS, Descriptor.Flags, llvm::endianness::little);
- }
+ } break ;
}
}
assert(Storage.size() == getSize());
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 7545a9bc5304b..7e33329eb0219 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -305,7 +305,7 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
switch (Type) {
case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): {
- auto Constants = RS.ParametersContainer.getConstant(Loc);
+ const dxbc::RootConstants &Constants = RS.ParametersContainer.getConstant(Loc);
OS << indent(Space + 2) << "Register Space: " << Constants.RegisterSpace
<< "\n";
OS << indent(Space + 2)
>From a60c7a3b2a66a571f09982cd32f74d4bf24e751e Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 14 May 2025 23:26:31 +0000
Subject: [PATCH 16/29] clean up
---
llvm/lib/MC/DXContainerRootSignature.cpp | 3 +--
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 2 +-
2 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 6e2eaf5e6fdf8..00d04f6f2a767 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -32,7 +32,7 @@ size_t RootSignatureDesc::getSize() const {
size_t Size = sizeof(dxbc::RootSignatureHeader) +
ParametersContainer.size() * sizeof(dxbc::RootParameterHeader);
- for (const auto &I : ParametersContainer) {
+ for (const RootParameterInfo &I : ParametersContainer) {
switch (I.Header.ParameterType) {
case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
Size += sizeof(dxbc::RootConstants);
@@ -48,7 +48,6 @@ size_t RootSignatureDesc::getSize() const {
break;
}
}
-
return Size;
}
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 7e33329eb0219..f69ebf423f311 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -167,7 +167,7 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
return reportValueError(Ctx, "RootFlags", RSD.Flags);
}
- for (const llvm::mcdxbc::RootParameterInfo &Info : RSD.ParametersContainer) {
+ for (const mcdxbc::RootParameterInfo &Info : RSD.ParametersContainer) {
if (!dxbc::isValidShaderVisibility(Info.Header.ShaderVisibility))
return reportValueError(Ctx, "ShaderVisibility",
Info.Header.ShaderVisibility);
>From 2a4c2cb1f23936e39ab38702283d442c33d028d9 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 15 May 2025 00:26:05 +0000
Subject: [PATCH 17/29] formatting
---
llvm/lib/MC/DXContainerRootSignature.cpp | 2 +-
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 3 ++-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 00d04f6f2a767..262c81c72d6b0 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -102,7 +102,7 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
llvm::endianness::little);
if (Version > 1)
support::endian::write(BOS, Descriptor.Flags, llvm::endianness::little);
- } break ;
+ } break;
}
}
assert(Storage.size() == getSize());
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index f69ebf423f311..aca0104b53c1f 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -305,7 +305,8 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
switch (Type) {
case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): {
- const dxbc::RootConstants &Constants = RS.ParametersContainer.getConstant(Loc);
+ const dxbc::RootConstants &Constants =
+ RS.ParametersContainer.getConstant(Loc);
OS << indent(Space + 2) << "Register Space: " << Constants.RegisterSpace
<< "\n";
OS << indent(Space + 2)
>From c29d3f2cddf20d0a4af8c42b2da16d5d400be878 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 15 May 2025 17:26:54 +0000
Subject: [PATCH 18/29] addressing comments
---
llvm/include/llvm/BinaryFormat/DXContainer.h | 2 +-
.../llvm/MC/DXContainerRootSignature.h | 35 +++++++++++--------
llvm/lib/MC/DXContainerRootSignature.cpp | 6 ++--
llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 22 +++++-------
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 4 +--
5 files changed, 35 insertions(+), 34 deletions(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 4fbc0cf1e5954..82890bf814935 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -602,7 +602,7 @@ struct RootDescriptor : public v1::RootDescriptor {
uint32_t Flags;
RootDescriptor() = default;
- RootDescriptor(v1::RootDescriptor &Base)
+ explicit RootDescriptor(v1::RootDescriptor &Base)
: v1::RootDescriptor(Base), Flags(0u) {}
void swapBytes() {
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index ca27a0f0379cc..3496b5fff398f 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -21,8 +21,8 @@ struct RootParameterInfo {
RootParameterInfo() = default;
- RootParameterInfo(dxbc::RootParameterHeader H, size_t L)
- : Header(H), Location(L) {}
+ RootParameterInfo(dxbc::RootParameterHeader Header, size_t Location)
+ : Header(Header), Location(Location) {}
};
struct RootParametersContainer {
@@ -31,29 +31,34 @@ struct RootParametersContainer {
SmallVector<dxbc::RootConstants> Constants;
SmallVector<dxbc::RTS0::v2::RootDescriptor> Descriptors;
- void addInfo(dxbc::RootParameterHeader H, size_t L) {
- ParametersInfo.push_back(RootParameterInfo(H, L));
+ void addInfo(dxbc::RootParameterHeader Header, size_t Location) {
+ ParametersInfo.push_back(RootParameterInfo(Header, Location));
}
- void addParameter(dxbc::RootParameterHeader H, dxbc::RootConstants C) {
- addInfo(H, Constants.size());
- Constants.push_back(C);
+ void addParameter(dxbc::RootParameterHeader Header,
+ dxbc::RootConstants Constant) {
+ addInfo(Header, Constants.size());
+ Constants.push_back(Constant);
}
- void addParameter(dxbc::RootParameterHeader H,
- dxbc::RTS0::v2::RootDescriptor D) {
- addInfo(H, Descriptors.size());
- Descriptors.push_back(D);
+ void addInvalidParameter(dxbc::RootParameterHeader Header) {
+ addInfo(Header, -1);
+ }
+
+ void addParameter(dxbc::RootParameterHeader Header,
+ dxbc::RTS0::v2::RootDescriptor Descriptor) {
+ addInfo(Header, Descriptors.size());
+ Descriptors.push_back(Descriptor);
}
const std::pair<uint32_t, uint32_t>
- getTypeAndLocForParameter(uint32_t Index) const {
- const RootParameterInfo &Info = ParametersInfo[Index];
+ getTypeAndLocForParameter(uint32_t Location) const {
+ const RootParameterInfo &Info = ParametersInfo[Location];
return {Info.Header.ParameterType, Info.Location};
}
- const dxbc::RootParameterHeader &getHeader(size_t Index) const {
- const RootParameterInfo &Info = ParametersInfo[Index];
+ const dxbc::RootParameterHeader &getHeader(size_t Location) const {
+ const RootParameterInfo &Info = ParametersInfo[Location];
return Info.Header;
}
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 262c81c72d6b0..a9394541d18da 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -89,7 +89,8 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
llvm::endianness::little);
support::endian::write(BOS, Constants.Num32BitValues,
llvm::endianness::little);
- } break;
+ break;
+ }
case llvm::to_underlying(dxbc::RootParameterType::CBV):
case llvm::to_underlying(dxbc::RootParameterType::SRV):
case llvm::to_underlying(dxbc::RootParameterType::UAV): {
@@ -102,7 +103,8 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
llvm::endianness::little);
if (Version > 1)
support::endian::write(BOS, Descriptor.Flags, llvm::endianness::little);
- } break;
+ break;
+ }
}
}
assert(Storage.size() == getSize());
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index dabc23380fa02..c00cd3e08d59d 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -274,8 +274,8 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
RS.StaticSamplersOffset = P.RootSignature->StaticSamplersOffset;
for (const auto &Param : P.RootSignature->Parameters) {
- auto Header = dxbc::RootParameterHeader{Param.Type, Param.Visibility,
- Param.Offset};
+ dxbc::RootParameterHeader Header{Param.Type, Param.Visibility,
+ Param.Offset};
switch (Param.Type) {
case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
@@ -288,24 +288,18 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
case llvm::to_underlying(dxbc::RootParameterType::SRV):
case llvm::to_underlying(dxbc::RootParameterType::UAV):
case llvm::to_underlying(dxbc::RootParameterType::CBV):
- if (RS.Version == 1) {
- dxbc::RTS0::v1::RootDescriptor Descriptor;
- Descriptor.RegisterSpace = Param.Descriptor.RegisterSpace;
- Descriptor.ShaderRegister = Param.Descriptor.ShaderRegister;
- RS.ParametersContainer.addParameter(Header, Descriptor);
- } else {
- dxbc::RTS0::v2::RootDescriptor Descriptor;
- Descriptor.RegisterSpace = Param.Descriptor.RegisterSpace;
- Descriptor.ShaderRegister = Param.Descriptor.ShaderRegister;
+ dxbc::RTS0::v2::RootDescriptor Descriptor;
+ Descriptor.RegisterSpace = Param.Descriptor.RegisterSpace;
+ Descriptor.ShaderRegister = Param.Descriptor.ShaderRegister;
+ if (RS.Version > 1)
Descriptor.Flags = Param.Descriptor.getEncodedFlags();
- RS.ParametersContainer.addParameter(Header, Descriptor);
- }
+ RS.ParametersContainer.addParameter(Header, Descriptor);
break;
default:
// Handling invalid parameter type edge case. We intentionally let
// obj2yaml/yaml2obj parse and emit invalid dxcontainer data, in order
// for that to be used as a testing tool more effectively.
- RS.ParametersContainer.addInfo(Header, -1);
+ RS.ParametersContainer.addInvalidParameter(Header);
}
}
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index aca0104b53c1f..43e06ee278b49 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -76,8 +76,8 @@ static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
return reportError(Ctx, "Invalid format for RootConstants Element");
dxbc::RootParameterHeader Header;
- // this will be properly calculated when writing it.
- Header.ParameterOffset = 0;
+ // The parameter offset doesn't matter here - we recalculate it during
+ // serialization Header.ParameterOffset = 0;
Header.ParameterType =
llvm::to_underlying(dxbc::RootParameterType::Constants32Bit);
>From eb97f1b60fdee91cf524aa7ceb51bf1970c2c803 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Fri, 16 May 2025 20:35:10 +0000
Subject: [PATCH 19/29] fixing test issues
---
llvm/include/llvm/Object/DXContainer.h | 1 +
llvm/lib/ObjectYAML/DXContainerYAML.cpp | 4 ++--
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index 27d7ee0c94d91..8908719640e63 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -211,6 +211,7 @@ struct DescriptorTableView : RootParameterView {
if(Version > 1)
RangeSize = sizeof(dxbc::RTS0::v2::DescriptorRange);
+ Table.Ranges.Stride = RangeSize;
Table.Ranges.Data =
ParamData.substr(2 * sizeof(uint32_t), Table.NumRanges * RangeSize);
return Table;
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index ce3aaf2bfac1f..830d5ea46459c 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -117,8 +117,8 @@ DXContainerYAML::RootSignatureYamlDesc::create(
NewR.Val = \
(R.Flags & llvm::to_underlying(dxbc::DescriptorRangeFlag::Val)) > 0;
#include "llvm/BinaryFormat/DXContainerConstants.def"
- NewP.Table.Ranges.push_back(NewR);
- }
+}
+NewP.Table.Ranges.push_back(NewR);
}
}
>From a9b87c2f11858cec9ea896e2c8f1ae38243d9920 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Fri, 16 May 2025 20:52:39 +0000
Subject: [PATCH 20/29] format
---
llvm/lib/ObjectYAML/DXContainerYAML.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index 830d5ea46459c..64c9335caa495 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -117,8 +117,8 @@ DXContainerYAML::RootSignatureYamlDesc::create(
NewR.Val = \
(R.Flags & llvm::to_underlying(dxbc::DescriptorRangeFlag::Val)) > 0;
#include "llvm/BinaryFormat/DXContainerConstants.def"
-}
-NewP.Table.Ranges.push_back(NewR);
+ }
+ NewP.Table.Ranges.push_back(NewR);
}
}
>From 28be2f89dfe0a10387b0f5ef6293037da866c5d6 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 20 May 2025 16:37:27 +0000
Subject: [PATCH 21/29] format
---
.../llvm/MC/DXContainerRootSignature.h | 6 +-
llvm/include/llvm/Object/DXContainer.h | 10 +-
llvm/lib/MC/DXContainerRootSignature.cpp | 53 ++++----
llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 20 +--
llvm/lib/ObjectYAML/DXContainerYAML.cpp | 8 +-
llvm/unittests/Object/DXContainerTest.cpp | 127 +++++++++---------
6 files changed, 112 insertions(+), 112 deletions(-)
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index 5abcf1710e8ee..cdf526d40d77d 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -28,10 +28,8 @@ struct RootParameterInfo {
: Header(Header), Location(Location) {}
};
-
struct DescriptorTable {
SmallVector<dxbc::RTS0::v2::DescriptorRange> Ranges;
-
SmallVector<dxbc::RTS0::v2::DescriptorRange>::const_iterator begin() const {
return Ranges.begin();
}
@@ -40,8 +38,6 @@ struct DescriptorTable {
}
};
-
-
struct RootParametersContainer {
SmallVector<RootParameterInfo> ParametersInfo;
SmallVector<dxbc::RootConstants> Constants;
@@ -91,7 +87,7 @@ struct RootParametersContainer {
const dxbc::RTS0::v2::RootDescriptor &getRootDescriptor(size_t Index) const {
return Descriptors[Index];
}
- const DescriptorTable &getDescriptorTable(size_t Index) const {
+ const DescriptorTable &getDescriptorTable(size_t Index) const {
return Tables[Index];
}
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index 8908719640e63..3f15eb1a44c77 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -183,9 +183,13 @@ struct DescriptorTable {
uint32_t RangesOffset;
ViewArray<dxbc::RTS0::v2::DescriptorRange> Ranges;
- typename ViewArray<dxbc::RTS0::v2::DescriptorRange>::iterator begin() const { return Ranges.begin(); }
+ typename ViewArray<dxbc::RTS0::v2::DescriptorRange>::iterator begin() const {
+ return Ranges.begin();
+ }
- typename ViewArray<dxbc::RTS0::v2::DescriptorRange>::iterator end() const { return Ranges.end(); }
+ typename ViewArray<dxbc::RTS0::v2::DescriptorRange>::iterator end() const {
+ return Ranges.end();
+ }
};
struct DescriptorTableView : RootParameterView {
@@ -208,7 +212,7 @@ struct DescriptorTableView : RootParameterView {
Current += sizeof(uint32_t);
size_t RangeSize = sizeof(dxbc::RTS0::v1::DescriptorRange);
- if(Version > 1)
+ if (Version > 1)
RangeSize = sizeof(dxbc::RTS0::v2::DescriptorRange);
Table.Ranges.Stride = RangeSize;
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 116ada468582c..dde7ecfb7e928 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -48,15 +48,16 @@ size_t RootSignatureDesc::getSize() const {
Size += sizeof(dxbc::RTS0::v2::RootDescriptor);
break;
- case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable):
- const DescriptorTable &Table = ParametersContainer.getDescriptorTable(I.Location);
- if (Version == 1)
- Size +=
- sizeof(dxbc::RTS0::v1::DescriptorRange) * Table.Ranges.size() + 8;
- else
- Size +=
- sizeof(dxbc::RTS0::v2::DescriptorRange) * Table.Ranges.size() + 8;
- break;
+ case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable):
+ const DescriptorTable &Table =
+ ParametersContainer.getDescriptorTable(I.Location);
+ if (Version == 1)
+ Size +=
+ sizeof(dxbc::RTS0::v1::DescriptorRange) * Table.Ranges.size() + 8;
+ else
+ Size +=
+ sizeof(dxbc::RTS0::v2::DescriptorRange) * Table.Ranges.size() + 8;
+ break;
}
}
return Size;
@@ -100,8 +101,7 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
llvm::endianness::little);
support::endian::write(BOS, Constants.Num32BitValues,
llvm::endianness::little);
- }
- break;
+ } break;
case llvm::to_underlying(dxbc::RootParameterType::CBV):
case llvm::to_underlying(dxbc::RootParameterType::SRV):
case llvm::to_underlying(dxbc::RootParameterType::UAV): {
@@ -114,29 +114,26 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
llvm::endianness::little);
if (Version > 1)
support::endian::write(BOS, Descriptor.Flags, llvm::endianness::little);
- }
- break;
- case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable):{
+ } break;
+ case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable): {
const DescriptorTable &Table =
ParametersContainer.getDescriptorTable(Loc);
support::endian::write(BOS, (uint32_t)Table.Ranges.size(),
llvm::endianness::little);
rewriteOffsetToCurrentByte(BOS, writePlaceholder(BOS));
for (const auto &Range : Table) {
- support::endian::write(BOS, Range.RangeType,
- llvm::endianness::little);
- support::endian::write(BOS, Range.NumDescriptors,
- llvm::endianness::little);
- support::endian::write(BOS, Range.BaseShaderRegister,
- llvm::endianness::little);
- support::endian::write(BOS, Range.RegisterSpace,
- llvm::endianness::little);
- support::endian::write(BOS, Range.OffsetInDescriptorsFromTableStart,
- llvm::endianness::little);
- if(Version > 1)
- support::endian::write(BOS, Range.Flags,
- llvm::endianness::little);
- }
+ support::endian::write(BOS, Range.RangeType, llvm::endianness::little);
+ support::endian::write(BOS, Range.NumDescriptors,
+ llvm::endianness::little);
+ support::endian::write(BOS, Range.BaseShaderRegister,
+ llvm::endianness::little);
+ support::endian::write(BOS, Range.RegisterSpace,
+ llvm::endianness::little);
+ support::endian::write(BOS, Range.OffsetInDescriptorsFromTableStart,
+ llvm::endianness::little);
+ if (Version > 1)
+ support::endian::write(BOS, Range.Flags, llvm::endianness::little);
+ }
} break;
}
}
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index 13ee8758e363d..8b1b61b880f1d 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -300,16 +300,16 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
mcdxbc::DescriptorTable Table;
for (const auto &R : Param.Table.Ranges) {
- dxbc::RTS0::v2::DescriptorRange Range;
- Range.RangeType = R.RangeType;
- Range.NumDescriptors = R.NumDescriptors;
- Range.BaseShaderRegister = R.BaseShaderRegister;
- Range.RegisterSpace = R.RegisterSpace;
- Range.OffsetInDescriptorsFromTableStart =
- R.OffsetInDescriptorsFromTableStart;
- if (RS.Version > 1)
- Range.Flags = R.getEncodedFlags();
- Table.Ranges.push_back(Range);
+ dxbc::RTS0::v2::DescriptorRange Range;
+ Range.RangeType = R.RangeType;
+ Range.NumDescriptors = R.NumDescriptors;
+ Range.BaseShaderRegister = R.BaseShaderRegister;
+ Range.RegisterSpace = R.RegisterSpace;
+ Range.OffsetInDescriptorsFromTableStart =
+ R.OffsetInDescriptorsFromTableStart;
+ if (RS.Version > 1)
+ Range.Flags = R.getEncodedFlags();
+ Table.Ranges.push_back(Range);
}
RS.ParametersContainer.addParameter(Header, Table);
} break;
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index 64c9335caa495..cccd5ea49b0b1 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -95,8 +95,10 @@ DXContainerYAML::RootSignatureYamlDesc::create(
llvm::to_underlying(dxbc::RootDescriptorFlag::Val)) > 0;
#include "llvm/BinaryFormat/DXContainerConstants.def"
}
- } else if (auto *TDV = dyn_cast<object::DirectX::DescriptorTableView>(&ParamView)) {
- llvm::Expected<object::DirectX::DescriptorTable>TableOrErr = TDV->read(Version);
+ } else if (auto *TDV =
+ dyn_cast<object::DirectX::DescriptorTableView>(&ParamView)) {
+ llvm::Expected<object::DirectX::DescriptorTable> TableOrErr =
+ TDV->read(Version);
if (Error E = TableOrErr.takeError())
return std::move(E);
auto Table = *TableOrErr;
@@ -119,8 +121,8 @@ DXContainerYAML::RootSignatureYamlDesc::create(
#include "llvm/BinaryFormat/DXContainerConstants.def"
}
NewP.Table.Ranges.push_back(NewR);
+ }
}
- }
RootSigDesc.Parameters.push_back(NewP);
}
diff --git a/llvm/unittests/Object/DXContainerTest.cpp b/llvm/unittests/Object/DXContainerTest.cpp
index d33a4264e1b14..0c25a8982af5b 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -248,49 +248,49 @@ generateDXContainer(StringRef Yaml, SmallVectorImpl<char> &BinaryData) {
TEST(DXCFile, PSVResourceIterators) {
const char *Yaml = R"(
---- !dxcontainer
-Header:
- Hash: [ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ]
- Version:
- Major: 1
- Minor: 0
- PartCount: 2
-Parts:
- - Name: PSV0
- Size: 144
- PSVInfo:
- Version: 0
- ShaderStage: 14
- PayloadSizeInBytes: 4092
- MinimumWaveLaneCount: 0
- MaximumWaveLaneCount: 4294967295
- ResourceStride: 16
- Resources:
- - Type: Sampler
- Space: 1
- LowerBound: 1
- UpperBound: 1
- - Type: CBV
- Space: 2
- LowerBound: 2
- UpperBound: 2
- - Type: SRVTyped
- Space: 3
- LowerBound: 3
- UpperBound: 3
- - Name: DXIL
- Size: 24
- Program:
- MajorVersion: 6
- MinorVersion: 0
- ShaderKind: 14
- Size: 6
- DXILMajorVersion: 1
- DXILMinorVersion: 0
- DXILSize: 0
-...
-)";
+ --- !dxcontainer
+ Header:
+ Hash: [ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ]
+ Version:
+ Major: 1
+ Minor: 0
+ PartCount: 2
+ Parts:
+ - Name: PSV0
+ Size: 144
+ PSVInfo:
+ Version: 0
+ ShaderStage: 14
+ PayloadSizeInBytes: 4092
+ MinimumWaveLaneCount: 0
+ MaximumWaveLaneCount: 4294967295
+ ResourceStride: 16
+ Resources:
+ - Type: Sampler
+ Space: 1
+ LowerBound: 1
+ UpperBound: 1
+ - Type: CBV
+ Space: 2
+ LowerBound: 2
+ UpperBound: 2
+ - Type: SRVTyped
+ Space: 3
+ LowerBound: 3
+ UpperBound: 3
+ - Name: DXIL
+ Size: 24
+ Program:
+ MajorVersion: 6
+ MinorVersion: 0
+ ShaderKind: 14
+ Size: 6
+ DXILMajorVersion: 1
+ DXILMinorVersion: 0
+ DXILSize: 0
+ ...
+ )";
SmallVector<char, 256> BinaryData;
auto C = generateDXContainer(Yaml, BinaryData);
@@ -560,20 +560,23 @@ TEST(DXCFile, MaliciousFiles) {
// ...
TEST(DXCFile, PSVResourceIteratorsStride) {
uint8_t Buffer[] = {
- 0x44, 0x58, 0x42, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xB0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
- 0x28, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4C, 0x18, 0x00, 0x00, 0x00,
- 0x60, 0x00, 0x0E, 0x00, 0x06, 0x00, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4C, 0x00, 0x01, 0x00, 0x00,
- 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x53, 0x56, 0x30, 0x64, 0x00, 0x00, 0x00,
- 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
- 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
- 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
- 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00,
- };
- DXContainer C =
+ 0x44, 0x58, 0x42, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0xB0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00,
+ 0x48, 0x00, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4C, 0x18, 0x00, 0x00, 0x00,
+ 0x60, 0x00, 0x0E, 0x00, 0x06, 0x00, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4C,
+ 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x50, 0x53, 0x56, 0x30, 0x64, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+ 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ DXContainer C =
llvm::cantFail(DXContainer::create(getMemoryBuffer<180>(Buffer)));
const auto &PSVInfo = C.getPSVInfo();
@@ -625,8 +628,8 @@ TEST(DXCFile, PSVResourceIteratorsStride) {
EXPECT_EQ(Binding.Type, dxbc::PSV::ResourceType::SRVStructured);
EXPECT_EQ(Binding.Space, 6u);
EXPECT_EQ(Binding.LowerBound, 7u);
- EXPECT_EQ(Binding.UpperBound, 8u);;
-
+ EXPECT_EQ(Binding.UpperBound, 8u);
+ ;
EXPECT_FALSE(It == PSVInfo->getResources().end());
@@ -1086,8 +1089,7 @@ TEST(RootSignature, ParseDescriptorTable) {
ASSERT_THAT_ERROR(ParamView.takeError(), Succeeded());
auto *DescriptorTableView =
- dyn_cast<DirectX::DescriptorTableView>(
- &*ParamView);
+ dyn_cast<DirectX::DescriptorTableView>(&*ParamView);
ASSERT_TRUE(DescriptorTableView != nullptr);
auto Table = DescriptorTableView->read(2);
@@ -1139,8 +1141,7 @@ TEST(RootSignature, ParseDescriptorTable) {
ASSERT_THAT_ERROR(ParamView.takeError(), Succeeded());
auto *DescriptorTableView =
- dyn_cast<DirectX::DescriptorTableView>(
- &*ParamView);
+ dyn_cast<DirectX::DescriptorTableView>(&*ParamView);
ASSERT_TRUE(DescriptorTableView != nullptr);
auto Table = DescriptorTableView->read(1);
>From 76a2b07dd4c6e8507f23df76ce7f530375ce8812 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 21 May 2025 17:11:41 +0000
Subject: [PATCH 22/29] clean up
---
.../llvm/MC/DXContainerRootSignature.h | 3 +-
llvm/include/llvm/Object/DXContainer.h | 14 ++-
.../include/llvm/ObjectYAML/DXContainerYAML.h | 2 -
llvm/lib/MC/DXContainerRootSignature.cpp | 22 ++--
llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 1 -
llvm/lib/ObjectYAML/DXContainerYAML.cpp | 1 -
llvm/unittests/Object/DXContainerTest.cpp | 118 +++++++++---------
7 files changed, 81 insertions(+), 80 deletions(-)
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index cdf526d40d77d..7b47c697fcfa6 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -6,12 +6,10 @@
//
//===----------------------------------------------------------------------===//
-#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/BinaryFormat/DXContainer.h"
#include <cstdint>
#include <limits>
-#include <variant>
namespace llvm {
@@ -87,6 +85,7 @@ struct RootParametersContainer {
const dxbc::RTS0::v2::RootDescriptor &getRootDescriptor(size_t Index) const {
return Descriptors[Index];
}
+
const DescriptorTable &getDescriptorTable(size_t Index) const {
return Tables[Index];
}
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index 3f15eb1a44c77..12fdcb38f1e42 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -20,11 +20,12 @@
#include "llvm/ADT/Twine.h"
#include "llvm/BinaryFormat/DXContainer.h"
#include "llvm/Object/Error.h"
-#include "llvm/Support/Casting.h"
#include "llvm/Support/Endian.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/MemoryBufferRef.h"
#include "llvm/TargetParser/Triple.h"
+#include <array>
+#include <cstddef>
#include <cstdint>
#include <variant>
@@ -41,7 +42,6 @@ template <typename T>
std::enable_if_t<std::is_class<T>::value, void> swapBytes(T &value) {
value.swapBytes();
}
-
} // namespace detail
// This class provides a view into the underlying resource array. The Resource
@@ -278,11 +278,13 @@ class RootSignature {
support::endian::read<uint32_t, llvm::endianness::little>(
PartData.begin() + Header.ParameterOffset);
if (Version == 1)
- DataSize = sizeof(dxbc::RTS0::v1::DescriptorRange) * NumRanges +
- 2 * sizeof(uint32_t);
+ DataSize = sizeof(dxbc::RTS0::v1::DescriptorRange) * NumRanges;
else
- DataSize = sizeof(dxbc::RTS0::v2::DescriptorRange) * NumRanges +
- 2 * sizeof(uint32_t);
+ DataSize = sizeof(dxbc::RTS0::v2::DescriptorRange) * NumRanges;
+
+ // 4 bits for the number of ranges in table and
+ // 4 bits for the ranges offset
+ DataSize += 2 * sizeof(uint32_t);
break;
}
size_t EndOfSectionByte = getNumStaticSamplers() == 0
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index ced8c9583d6ad..80177c0b087fd 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -15,8 +15,6 @@
#ifndef LLVM_OBJECTYAML_DXCONTAINERYAML_H
#define LLVM_OBJECTYAML_DXCONTAINERYAML_H
-#include "llvm/ADT/STLForwardCompat.h"
-#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/BinaryFormat/DXContainer.h"
#include "llvm/Object/DXContainer.h"
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index dde7ecfb7e928..74463e374270e 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -7,10 +7,9 @@
//===----------------------------------------------------------------------===//
#include "llvm/MC/DXContainerRootSignature.h"
-#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/SmallString.h"
-#include "llvm/BinaryFormat/DXContainer.h"
#include "llvm/Support/EndianStream.h"
+#include <cstdint>
using namespace llvm;
using namespace llvm::mcdxbc;
@@ -51,12 +50,14 @@ size_t RootSignatureDesc::getSize() const {
case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable):
const DescriptorTable &Table =
ParametersContainer.getDescriptorTable(I.Location);
+
+ // 4 bits for the number of ranges in table and
+ // 4 bits for the ranges offset
+ Size += 2 * sizeof(uint32_t);
if (Version == 1)
- Size +=
- sizeof(dxbc::RTS0::v1::DescriptorRange) * Table.Ranges.size() + 8;
+ Size += sizeof(dxbc::RTS0::v1::DescriptorRange) * Table.Ranges.size();
else
- Size +=
- sizeof(dxbc::RTS0::v2::DescriptorRange) * Table.Ranges.size() + 8;
+ Size += sizeof(dxbc::RTS0::v2::DescriptorRange) * Table.Ranges.size();
break;
}
}
@@ -101,7 +102,8 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
llvm::endianness::little);
support::endian::write(BOS, Constants.Num32BitValues,
llvm::endianness::little);
- } break;
+ break;
+ }
case llvm::to_underlying(dxbc::RootParameterType::CBV):
case llvm::to_underlying(dxbc::RootParameterType::SRV):
case llvm::to_underlying(dxbc::RootParameterType::UAV): {
@@ -114,7 +116,8 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
llvm::endianness::little);
if (Version > 1)
support::endian::write(BOS, Descriptor.Flags, llvm::endianness::little);
- } break;
+ break;
+ }
case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable): {
const DescriptorTable &Table =
ParametersContainer.getDescriptorTable(Loc);
@@ -134,7 +137,8 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
if (Version > 1)
support::endian::write(BOS, Range.Flags, llvm::endianness::little);
}
- } break;
+ break;
+ }
}
}
assert(Storage.size() == getSize());
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index 8b1b61b880f1d..7494273beb57a 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -11,7 +11,6 @@
///
//===----------------------------------------------------------------------===//
-#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/BinaryFormat/DXContainer.h"
#include "llvm/MC/DXContainerPSVInfo.h"
#include "llvm/MC/DXContainerRootSignature.h"
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index cccd5ea49b0b1..5f6305921c21f 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -382,7 +382,6 @@ void MappingTraits<llvm::DXContainerYAML::RootParameterYamlDesc>::mapping(
case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable):
IO.mapRequired("Table", P.Table);
break;
- break;
}
}
diff --git a/llvm/unittests/Object/DXContainerTest.cpp b/llvm/unittests/Object/DXContainerTest.cpp
index 0c25a8982af5b..2505c9e728201 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -248,49 +248,49 @@ generateDXContainer(StringRef Yaml, SmallVectorImpl<char> &BinaryData) {
TEST(DXCFile, PSVResourceIterators) {
const char *Yaml = R"(
- --- !dxcontainer
- Header:
- Hash: [ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ]
- Version:
- Major: 1
- Minor: 0
- PartCount: 2
- Parts:
- - Name: PSV0
- Size: 144
- PSVInfo:
- Version: 0
- ShaderStage: 14
- PayloadSizeInBytes: 4092
- MinimumWaveLaneCount: 0
- MaximumWaveLaneCount: 4294967295
- ResourceStride: 16
- Resources:
- - Type: Sampler
- Space: 1
- LowerBound: 1
- UpperBound: 1
- - Type: CBV
- Space: 2
- LowerBound: 2
- UpperBound: 2
- - Type: SRVTyped
- Space: 3
- LowerBound: 3
- UpperBound: 3
- - Name: DXIL
- Size: 24
- Program:
- MajorVersion: 6
- MinorVersion: 0
- ShaderKind: 14
- Size: 6
- DXILMajorVersion: 1
- DXILMinorVersion: 0
- DXILSize: 0
- ...
- )";
+--- !dxcontainer
+Header:
+ Hash: [ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ]
+ Version:
+ Major: 1
+ Minor: 0
+ PartCount: 2
+Parts:
+ - Name: PSV0
+ Size: 144
+ PSVInfo:
+ Version: 0
+ ShaderStage: 14
+ PayloadSizeInBytes: 4092
+ MinimumWaveLaneCount: 0
+ MaximumWaveLaneCount: 4294967295
+ ResourceStride: 16
+ Resources:
+ - Type: Sampler
+ Space: 1
+ LowerBound: 1
+ UpperBound: 1
+ - Type: CBV
+ Space: 2
+ LowerBound: 2
+ UpperBound: 2
+ - Type: SRVTyped
+ Space: 3
+ LowerBound: 3
+ UpperBound: 3
+ - Name: DXIL
+ Size: 24
+ Program:
+ MajorVersion: 6
+ MinorVersion: 0
+ ShaderKind: 14
+ Size: 6
+ DXILMajorVersion: 1
+ DXILMinorVersion: 0
+ DXILSize: 0
+...
+)";
SmallVector<char, 256> BinaryData;
auto C = generateDXContainer(Yaml, BinaryData);
@@ -560,21 +560,21 @@ TEST(DXCFile, MaliciousFiles) {
// ...
TEST(DXCFile, PSVResourceIteratorsStride) {
uint8_t Buffer[] = {
- 0x44, 0x58, 0x42, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
- 0xB0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00,
- 0x48, 0x00, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4C, 0x18, 0x00, 0x00, 0x00,
- 0x60, 0x00, 0x0E, 0x00, 0x06, 0x00, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4C,
- 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x50, 0x53, 0x56, 0x30, 0x64, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
- 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
- 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x44, 0x58, 0x42, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0xB0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00,
+ 0x48, 0x00, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4C, 0x18, 0x00, 0x00, 0x00,
+ 0x60, 0x00, 0x0E, 0x00, 0x06, 0x00, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4C,
+ 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x50, 0x53, 0x56, 0x30, 0x64, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+ 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
DXContainer C =
llvm::cantFail(DXContainer::create(getMemoryBuffer<180>(Buffer)));
@@ -602,7 +602,7 @@ TEST(DXCFile, PSVResourceIteratorsStride) {
EXPECT_EQ(Binding.Type, dxbc::PSV::ResourceType::SRVStructured);
EXPECT_EQ(Binding.Space, 6u);
EXPECT_EQ(Binding.LowerBound, 7u);
- EXPECT_EQ(Binding.UpperBound, 8u);
+ EXPECT_EQ(Binding.UpperBound, 8u);;
--It;
Binding = *It;
>From b8911261de5bbda37ce1be0385f8aab69d996ccc Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 21 May 2025 17:30:24 +0000
Subject: [PATCH 23/29] clean up
---
llvm/lib/MC/DXContainerRootSignature.cpp | 1 -
llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 1 +
2 files changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 74463e374270e..3f3e86ae1e1a6 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -9,7 +9,6 @@
#include "llvm/MC/DXContainerRootSignature.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/Support/EndianStream.h"
-#include <cstdint>
using namespace llvm;
using namespace llvm::mcdxbc;
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index 7494273beb57a..0ae8f4e5610dd 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -317,6 +317,7 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
// obj2yaml/yaml2obj parse and emit invalid dxcontainer data, in order
// for that to be used as a testing tool more effectively.
RS.ParametersContainer.addInvalidParameter(Header);
+ break;
}
}
>From 2a9325250e09daacf68b8764bc1f005fde7accf6 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 21 May 2025 22:11:52 +0000
Subject: [PATCH 24/29] fix formating issue
---
llvm/unittests/Object/DXContainerTest.cpp | 37 +++++++++++------------
1 file changed, 17 insertions(+), 20 deletions(-)
diff --git a/llvm/unittests/Object/DXContainerTest.cpp b/llvm/unittests/Object/DXContainerTest.cpp
index 2505c9e728201..5415d28779801 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -560,23 +560,20 @@ TEST(DXCFile, MaliciousFiles) {
// ...
TEST(DXCFile, PSVResourceIteratorsStride) {
uint8_t Buffer[] = {
- 0x44, 0x58, 0x42, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
- 0xB0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00,
- 0x48, 0x00, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4C, 0x18, 0x00, 0x00, 0x00,
- 0x60, 0x00, 0x0E, 0x00, 0x06, 0x00, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4C,
- 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x50, 0x53, 0x56, 0x30, 0x64, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
- 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
- 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- };
- DXContainer C =
+ 0x44, 0x58, 0x42, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xB0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x28, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4C, 0x18, 0x00, 0x00, 0x00,
+ 0x60, 0x00, 0x0E, 0x00, 0x06, 0x00, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4C, 0x00, 0x01, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x53, 0x56, 0x30, 0x64, 0x00, 0x00, 0x00,
+ 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
+ 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ };
+ DXContainer C =
llvm::cantFail(DXContainer::create(getMemoryBuffer<180>(Buffer)));
const auto &PSVInfo = C.getPSVInfo();
@@ -602,7 +599,7 @@ TEST(DXCFile, PSVResourceIteratorsStride) {
EXPECT_EQ(Binding.Type, dxbc::PSV::ResourceType::SRVStructured);
EXPECT_EQ(Binding.Space, 6u);
EXPECT_EQ(Binding.LowerBound, 7u);
- EXPECT_EQ(Binding.UpperBound, 8u);;
+ EXPECT_EQ(Binding.UpperBound, 8u);
--It;
Binding = *It;
@@ -628,8 +625,8 @@ TEST(DXCFile, PSVResourceIteratorsStride) {
EXPECT_EQ(Binding.Type, dxbc::PSV::ResourceType::SRVStructured);
EXPECT_EQ(Binding.Space, 6u);
EXPECT_EQ(Binding.LowerBound, 7u);
- EXPECT_EQ(Binding.UpperBound, 8u);
- ;
+ EXPECT_EQ(Binding.UpperBound, 8u);;
+
EXPECT_FALSE(It == PSVInfo->getResources().end());
>From d616b659a7d56fcf2774a7e6d6961026021dc530 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 21 May 2025 22:13:45 +0000
Subject: [PATCH 25/29] fix formating issue
---
llvm/unittests/Object/DXContainerTest.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/unittests/Object/DXContainerTest.cpp b/llvm/unittests/Object/DXContainerTest.cpp
index 5415d28779801..b52e96e9aefc9 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -251,7 +251,7 @@ TEST(DXCFile, PSVResourceIterators) {
--- !dxcontainer
Header:
Hash: [ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ]
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ]
Version:
Major: 1
Minor: 0
>From 6eac7c4494e73e195c08d40915aa01aa15d69dad Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 22 May 2025 18:19:42 +0000
Subject: [PATCH 26/29] making NumDescriptors uint32_t
---
llvm/include/llvm/BinaryFormat/DXContainer.h | 2 +-
.../llvm/MC/DXContainerRootSignature.h | 6 +-
llvm/include/llvm/Object/DXContainer.h | 4 +-
.../include/llvm/ObjectYAML/DXContainerYAML.h | 3 +-
llvm/lib/MC/DXContainerRootSignature.cpp | 4 +-
llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 1 +
llvm/lib/ObjectYAML/DXContainerYAML.cpp | 19 +++-
.../RootSignature-DescriptorTable1.0.yaml | 8 +-
.../RootSignature-DescriptorTable1.1.yaml | 8 +-
.../RootSignature-MultipleParameters.yaml | 86 +++++++++----------
llvm/unittests/Object/DXContainerTest.cpp | 16 ++--
.../ObjectYAML/DXContainerYAMLTest.cpp | 12 +--
12 files changed, 91 insertions(+), 78 deletions(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 2f1a9fe2e8f93..677583ffee22d 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -613,7 +613,7 @@ struct DescriptorRange {
uint32_t NumDescriptors;
uint32_t BaseShaderRegister;
uint32_t RegisterSpace;
- int32_t OffsetInDescriptorsFromTableStart;
+ uint32_t OffsetInDescriptorsFromTableStart;
void swapBytes() {
sys::swapByteOrder(RangeType);
sys::swapByteOrder(NumDescriptors);
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index 7b47c697fcfa6..c9dc382c3c1c0 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -62,9 +62,9 @@ struct RootParametersContainer {
Descriptors.push_back(Descriptor);
}
- void addParameter(dxbc::RootParameterHeader H, DescriptorTable D) {
- addInfo(H, Tables.size());
- Tables.push_back(D);
+ void addParameter(dxbc::RootParameterHeader Header, DescriptorTable Table) {
+ addInfo(Header, Tables.size());
+ Tables.push_back(Table);
}
const std::pair<uint32_t, uint32_t>
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index 12fdcb38f1e42..0b8d71f686fd6 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -282,8 +282,8 @@ class RootSignature {
else
DataSize = sizeof(dxbc::RTS0::v2::DescriptorRange) * NumRanges;
- // 4 bits for the number of ranges in table and
- // 4 bits for the ranges offset
+ // 4 bytes for the number of ranges in table and
+ // 4 bytes for the ranges offset
DataSize += 2 * sizeof(uint32_t);
break;
}
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index 80177c0b087fd..730a4cd11f37f 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -95,7 +95,7 @@ struct DescriptorRangeYaml {
uint32_t NumDescriptors;
uint32_t BaseShaderRegister;
uint32_t RegisterSpace;
- int32_t OffsetInDescriptorsFromTableStart;
+ uint32_t OffsetInDescriptorsFromTableStart;
uint32_t getEncodedFlags() const;
@@ -195,7 +195,6 @@ struct RootParameterYamlDesc {
return *this;
}
- // ToDo: Fix this (Already have a follow up PR with it)
union {
RootConstantsYaml Constants;
RootDescriptorYaml Descriptor;
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 3f3e86ae1e1a6..bb6c14804e2cb 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -50,8 +50,8 @@ size_t RootSignatureDesc::getSize() const {
const DescriptorTable &Table =
ParametersContainer.getDescriptorTable(I.Location);
- // 4 bits for the number of ranges in table and
- // 4 bits for the ranges offset
+ // 4 bytes for the number of ranges in table and
+ // 4 bytes for the ranges offset
Size += 2 * sizeof(uint32_t);
if (Version == 1)
Size += sizeof(dxbc::RTS0::v1::DescriptorRange) * Table.Ranges.size();
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index 0ae8f4e5610dd..27e05d7577eba 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -322,6 +322,7 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
}
RS.write(OS);
+ break;
}
uint64_t BytesWritten = OS.tell() - DataStart;
RollingOffset += BytesWritten;
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index 5f6305921c21f..d25e908a9af26 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -17,6 +17,7 @@
#include "llvm/BinaryFormat/DXContainer.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/ScopedPrinter.h"
+#include <climits>
#include <cstdint>
#include <system_error>
@@ -95,10 +96,10 @@ DXContainerYAML::RootSignatureYamlDesc::create(
llvm::to_underlying(dxbc::RootDescriptorFlag::Val)) > 0;
#include "llvm/BinaryFormat/DXContainerConstants.def"
}
- } else if (auto *TDV =
+ } else if (auto *DTV =
dyn_cast<object::DirectX::DescriptorTableView>(&ParamView)) {
llvm::Expected<object::DirectX::DescriptorTable> TableOrErr =
- TDV->read(Version);
+ DTV->read(Version);
if (Error E = TableOrErr.takeError())
return std::move(E);
auto Table = *TableOrErr;
@@ -349,7 +350,19 @@ void MappingTraits<llvm::DXContainerYAML::RootDescriptorYaml>::mapping(
void MappingTraits<llvm::DXContainerYAML::DescriptorRangeYaml>::mapping(
IO &IO, llvm::DXContainerYAML::DescriptorRangeYaml &R) {
IO.mapRequired("RangeType", R.RangeType);
- IO.mapRequired("NumDescriptors", R.NumDescriptors);
+ // handling the edge case where NumDescriptors might be -1
+ if (IO.outputting()) {
+ if (R.NumDescriptors == UINT_MAX) {
+ int32_t NegOne = -1;
+ IO.mapRequired("NumDescriptors", NegOne);
+ } else
+ IO.mapRequired("NumDescriptors", R.NumDescriptors);
+ } else {
+ int32_t TmpNumDesc = 0;
+ IO.mapRequired("NumDescriptors", TmpNumDesc);
+ R.NumDescriptors = static_cast<uint32_t>(TmpNumDesc);
+ }
+
IO.mapRequired("BaseShaderRegister", R.BaseShaderRegister);
IO.mapRequired("RegisterSpace", R.RegisterSpace);
IO.mapRequired("OffsetInDescriptorsFromTableStart",
diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-DescriptorTable1.0.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-DescriptorTable1.0.yaml
index f431afa3cd3d3..0441bb7a256b1 100644
--- a/llvm/test/ObjectYAML/DXContainer/RootSignature-DescriptorTable1.0.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-DescriptorTable1.0.yaml
@@ -26,10 +26,10 @@ Parts:
NumRanges: 1
Ranges:
- RangeType: 0
- NumDescriptors: 41
+ NumDescriptors: -1
BaseShaderRegister: 42
RegisterSpace: 43
- OffsetInDescriptorsFromTableStart: -1
+ OffsetInDescriptorsFromTableStart: 41
AllowInputAssemblerInputLayout: true
DenyGeometryShaderRootAccess: true
@@ -49,9 +49,9 @@ Parts:
# CHECK-NEXT: RangesOffset: 44
# CHECK-NEXT: Ranges:
# CHECK-NEXT: - RangeType: 0
-# CHECK-NEXT: NumDescriptors: 41
+# CHECK-NEXT: NumDescriptors: -1
# CHECK-NEXT: BaseShaderRegister: 42
# CHECK-NEXT: RegisterSpace: 43
-# CHECK-NEXT: OffsetInDescriptorsFromTableStart: -1
+# CHECK-NEXT: OffsetInDescriptorsFromTableStart: 41
# CHECK-NEXT: AllowInputAssemblerInputLayout: true
# CHECK-NEXT: DenyGeometryShaderRootAccess: true
diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-DescriptorTable1.1.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-DescriptorTable1.1.yaml
index 54899cae57bf9..d06be5e181418 100644
--- a/llvm/test/ObjectYAML/DXContainer/RootSignature-DescriptorTable1.1.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-DescriptorTable1.1.yaml
@@ -26,10 +26,10 @@ Parts:
NumRanges: 1
Ranges:
- RangeType: 0
- NumDescriptors: 41
+ NumDescriptors: -1
BaseShaderRegister: 42
RegisterSpace: 43
- OffsetInDescriptorsFromTableStart: -1
+ OffsetInDescriptorsFromTableStart: 41
DATA_STATIC_WHILE_SET_AT_EXECUTE: true
AllowInputAssemblerInputLayout: true
DenyGeometryShaderRootAccess: true
@@ -50,10 +50,10 @@ Parts:
# CHECK-NEXT: RangesOffset: 44
# CHECK-NEXT: Ranges:
# CHECK-NEXT: - RangeType: 0
-# CHECK-NEXT: NumDescriptors: 41
+# CHECK-NEXT: NumDescriptors: -1
# CHECK-NEXT: BaseShaderRegister: 42
# CHECK-NEXT: RegisterSpace: 43
-# CHECK-NEXT: OffsetInDescriptorsFromTableStart: -1
+# CHECK-NEXT: OffsetInDescriptorsFromTableStart: 41
# CHECK-NEXT: DATA_STATIC_WHILE_SET_AT_EXECUTE: true
# 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 50cf7950be8aa..947fc096a9207 100644
--- a/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml
@@ -43,52 +43,52 @@ Parts:
NumRanges: 1
Ranges:
- RangeType: 0
- NumDescriptors: 41
+ NumDescriptors: -1
BaseShaderRegister: 42
RegisterSpace: 43
- OffsetInDescriptorsFromTableStart: -1
+ OffsetInDescriptorsFromTableStart: 41
DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS: true
AllowInputAssemblerInputLayout: true
DenyGeometryShaderRootAccess: true
-#CHECK: - Name: RTS0
-#CHECK-NEXT: Size: 200
-#CHECK-NEXT: RootSignature:
-#CHECK-NEXT: Version: 2
-#CHECK-NEXT: NumRootParameters: 4
-#CHECK-NEXT: RootParametersOffset: 24
-#CHECK-NEXT: NumStaticSamplers: 0
-#CHECK-NEXT: StaticSamplersOffset: 60
-#CHECK-NEXT: Parameters:
-#CHECK-NEXT: - ParameterType: 1
-#CHECK-NEXT: ShaderVisibility: 2
-#CHECK-NEXT: Constants:
-#CHECK-NEXT: Num32BitValues: 16
-#CHECK-NEXT: RegisterSpace: 14
-#CHECK-NEXT: ShaderRegister: 15
-#CHECK-NEXT: - ParameterType: 1
-#CHECK-NEXT: ShaderVisibility: 4
-#CHECK-NEXT: Constants:
-#CHECK-NEXT: Num32BitValues: 21
-#CHECK-NEXT: RegisterSpace: 23
-#CHECK-NEXT: ShaderRegister: 22
-#CHECK-NEXT: - ParameterType: 2
-#CHECK-NEXT: ShaderVisibility: 3
-#CHECK-NEXT: Descriptor:
-#CHECK-NEXT: RegisterSpace: 32
-#CHECK-NEXT: ShaderRegister: 31
-#CHECK-NEXT: DATA_STATIC_WHILE_SET_AT_EXECUTE: true
-#CHECK-NEXT: - ParameterType: 0
-#CHECK-NEXT: ShaderVisibility: 3
-#CHECK-NEXT: Table:
-#CHECK-NEXT: NumRanges: 1
-#CHECK-NEXT: RangesOffset: 116
-#CHECK-NEXT: Ranges:
-#CHECK-NEXT: - RangeType: 0
-#CHECK-NEXT: NumDescriptors: 41
-#CHECK-NEXT: BaseShaderRegister: 42
-#CHECK-NEXT: RegisterSpace: 43
-#CHECK-NEXT: OffsetInDescriptorsFromTableStart: -1
-#CHECK-NEXT: DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS: true
-#CHECK-NEXT: AllowInputAssemblerInputLayout: true
-#CHECK-NEXT: DenyGeometryShaderRootAccess: true
+# CHECK: - Name: RTS0
+# CHECK-NEXT: Size: 200
+# CHECK-NEXT: RootSignature:
+# CHECK-NEXT: Version: 2
+# CHECK-NEXT: NumRootParameters: 4
+# CHECK-NEXT: RootParametersOffset: 24
+# CHECK-NEXT: NumStaticSamplers: 0
+# CHECK-NEXT: StaticSamplersOffset: 60
+# CHECK-NEXT: Parameters:
+# CHECK-NEXT: - ParameterType: 1
+# CHECK-NEXT: ShaderVisibility: 2
+# CHECK-NEXT: Constants:
+# CHECK-NEXT: Num32BitValues: 16
+# CHECK-NEXT: RegisterSpace: 14
+# CHECK-NEXT: ShaderRegister: 15
+# CHECK-NEXT: - ParameterType: 1
+# CHECK-NEXT: ShaderVisibility: 4
+# CHECK-NEXT: Constants:
+# CHECK-NEXT: Num32BitValues: 21
+# CHECK-NEXT: RegisterSpace: 23
+# CHECK-NEXT: ShaderRegister: 22
+# CHECK-NEXT: - ParameterType: 2
+# CHECK-NEXT: ShaderVisibility: 3
+# CHECK-NEXT: Descriptor:
+# CHECK-NEXT: RegisterSpace: 32
+# CHECK-NEXT: ShaderRegister: 31
+# CHECK-NEXT: DATA_STATIC_WHILE_SET_AT_EXECUTE: true
+# CHECK-NEXT: - ParameterType: 0
+# CHECK-NEXT: ShaderVisibility: 3
+# CHECK-NEXT: Table:
+# CHECK-NEXT: NumRanges: 1
+# CHECK-NEXT: RangesOffset: 116
+# CHECK-NEXT: Ranges:
+# CHECK-NEXT: - RangeType: 0
+# CHECK-NEXT: NumDescriptors: -1
+# CHECK-NEXT: BaseShaderRegister: 42
+# CHECK-NEXT: RegisterSpace: 43
+# CHECK-NEXT: OffsetInDescriptorsFromTableStart: 41
+# CHECK-NEXT: DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS: true
+# CHECK-NEXT: AllowInputAssemblerInputLayout: true
+# CHECK-NEXT: DenyGeometryShaderRootAccess: true
diff --git a/llvm/unittests/Object/DXContainerTest.cpp b/llvm/unittests/Object/DXContainerTest.cpp
index b52e96e9aefc9..71503729b5f34 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -1061,8 +1061,8 @@ TEST(RootSignature, ParseDescriptorTable) {
0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x3c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
- 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00,
- 0x2a, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
+ 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
+ 0x2a, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00};
@@ -1097,10 +1097,10 @@ TEST(RootSignature, ParseDescriptorTable) {
auto Range = *Table->begin();
ASSERT_EQ(Range.RangeType, 0u);
- ASSERT_EQ(Range.NumDescriptors, 41u);
+ ASSERT_EQ(Range.NumDescriptors, -1u);
ASSERT_EQ(Range.BaseShaderRegister, 42u);
ASSERT_EQ(Range.RegisterSpace, 43u);
- ASSERT_EQ(Range.OffsetInDescriptorsFromTableStart, -1);
+ ASSERT_EQ(Range.OffsetInDescriptorsFromTableStart, 41u);
ASSERT_EQ(Range.Flags, 65536u);
}
@@ -1113,8 +1113,8 @@ TEST(RootSignature, ParseDescriptorTable) {
0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x3c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
- 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00,
- 0x2a, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
+ 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
+ 0x2a, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00};
@@ -1149,9 +1149,9 @@ TEST(RootSignature, ParseDescriptorTable) {
auto Range = *Table->begin();
ASSERT_EQ(Range.RangeType, 0u);
- ASSERT_EQ(Range.NumDescriptors, 41u);
+ ASSERT_EQ(Range.NumDescriptors, -1u);
ASSERT_EQ(Range.BaseShaderRegister, 42u);
ASSERT_EQ(Range.RegisterSpace, 43u);
- ASSERT_EQ(Range.OffsetInDescriptorsFromTableStart, -1);
+ ASSERT_EQ(Range.OffsetInDescriptorsFromTableStart, 41u);
}
}
diff --git a/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp b/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
index fa3af7045a4fd..9215b609a485a 100644
--- a/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
+++ b/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
@@ -388,7 +388,7 @@ TEST(RootSignature, ParseDescriptorTableV10) {
NumDescriptors: 41
BaseShaderRegister: 42
RegisterSpace: 43
- OffsetInDescriptorsFromTableStart: -1
+ OffsetInDescriptorsFromTableStart: 44
AllowInputAssemblerInputLayout: true
DenyGeometryShaderRootAccess: true
)"));
@@ -402,7 +402,7 @@ TEST(RootSignature, ParseDescriptorTableV10) {
0x3c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00,
- 0x2a, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
+ 0x2a, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00};
@@ -441,10 +441,10 @@ TEST(RootSignature, ParseDescriptorTableV11) {
NumRanges: 1
Ranges:
- RangeType: 0
- NumDescriptors: 41
+ NumDescriptors: -1
BaseShaderRegister: 42
RegisterSpace: 43
- OffsetInDescriptorsFromTableStart: -1
+ OffsetInDescriptorsFromTableStart: 41
DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS: true
AllowInputAssemblerInputLayout: true
DenyGeometryShaderRootAccess: true
@@ -458,8 +458,8 @@ TEST(RootSignature, ParseDescriptorTableV11) {
0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x3c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
- 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00,
- 0x2a, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
+ 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
+ 0x2a, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00};
>From f8080c45e7070d0e3a8e7673b3195ab53b902041 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 22 May 2025 21:50:05 +0000
Subject: [PATCH 27/29] fix tests
---
llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 17 +++++++++++++++++
llvm/lib/ObjectYAML/DXContainerYAML.cpp | 9 +++++++++
2 files changed, 26 insertions(+)
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index b4eed282f1c8a..5a31b1205f95e 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -14,6 +14,7 @@
#include "llvm/BinaryFormat/DXContainer.h"
#include "llvm/MC/DXContainerPSVInfo.h"
#include "llvm/MC/DXContainerRootSignature.h"
+#include "llvm/ObjectYAML/DXContainerYAML.h"
#include "llvm/ObjectYAML/ObjectYAML.h"
#include "llvm/ObjectYAML/yaml2obj.h"
#include "llvm/Support/Errc.h"
@@ -293,6 +294,22 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
if (RS.Version > 1)
Descriptor.Flags = DescriptorYaml->getEncodedFlags();
RS.ParametersContainer.addParameter(Header, Descriptor);
+ } else if (auto *TableYaml = std::get_if<DXContainerYAML::DescriptorTableYaml>(&Param.Data)) {
+ mcdxbc::DescriptorTable Table;
+ for (const auto &R : TableYaml->Ranges) {
+
+ dxbc::RTS0::v2::DescriptorRange Range;
+ Range.RangeType = R.RangeType;
+ Range.NumDescriptors = R.NumDescriptors;
+ Range.BaseShaderRegister = R.BaseShaderRegister;
+ Range.RegisterSpace = R.RegisterSpace;
+ Range.OffsetInDescriptorsFromTableStart =
+ R.OffsetInDescriptorsFromTableStart;
+ if (RS.Version > 1)
+ Range.Flags = R.getEncodedFlags();
+ Table.Ranges.push_back(Range);
+ }
+ RS.ParametersContainer.addParameter(Header, Table);
} else {
// Handling invalid parameter type edge case. We intentionally let
// obj2yaml/yaml2obj parse and emit invalid dxcontainer data, in order
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index c5a9500b4ce5d..a7e199b47da26 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -158,6 +158,15 @@ uint32_t DXContainerYAML::RootSignatureYamlDesc::getEncodedFlags() {
return Flag;
}
+uint32_t DXContainerYAML::DescriptorRangeYaml::getEncodedFlags() const {
+ uint64_t Flag = 0;
+#define DESCRIPTOR_RANGE_FLAG(Num, Val) \
+ if (Val) \
+ Flag |= (uint32_t)dxbc::DescriptorRangeFlag::Val;
+#include "llvm/BinaryFormat/DXContainerConstants.def"
+ return Flag;
+}
+
uint64_t DXContainerYAML::ShaderFeatureFlags::getEncodedFlags() {
uint64_t Flag = 0;
#define SHADER_FEATURE_FLAG(Num, DxilModuleNum, Val, Str) \
>From e6553158dbfd718a2e9d76d6209cc36666004abf Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Fri, 23 May 2025 01:00:24 +0000
Subject: [PATCH 28/29] move to namespace
---
llvm/include/llvm/BinaryFormat/DXContainer.h | 52 ++++++++++---------
.../llvm/MC/DXContainerRootSignature.h | 20 +++----
llvm/include/llvm/Object/DXContainer.h | 17 +++---
llvm/lib/MC/DXContainerRootSignature.cpp | 9 ++--
llvm/lib/Object/DXContainer.cpp | 3 +-
llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 6 +--
llvm/lib/ObjectYAML/DXContainerYAML.cpp | 5 +-
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 10 ++--
8 files changed, 64 insertions(+), 58 deletions(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 82890bf814935..ef628cbc34c9d 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -587,31 +587,6 @@ static_assert(sizeof(ProgramSignatureElement) == 32,
"ProgramSignatureElement is misaligned");
namespace RTS0 {
namespace v1 {
-struct RootDescriptor {
- uint32_t ShaderRegister;
- uint32_t RegisterSpace;
- void swapBytes() {
- sys::swapByteOrder(ShaderRegister);
- sys::swapByteOrder(RegisterSpace);
- }
-};
-} // namespace v1
-
-namespace v2 {
-struct RootDescriptor : public v1::RootDescriptor {
- uint32_t Flags;
-
- RootDescriptor() = default;
- explicit RootDescriptor(v1::RootDescriptor &Base)
- : v1::RootDescriptor(Base), Flags(0u) {}
-
- void swapBytes() {
- v1::RootDescriptor::swapBytes();
- sys::swapByteOrder(Flags);
- }
-};
-} // namespace v2
-} // namespace RTS0
// following dx12 naming
// https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ns-d3d12-d3d12_root_constants
struct RootConstants {
@@ -655,6 +630,33 @@ struct RootSignatureHeader {
sys::swapByteOrder(Flags);
}
};
+
+struct RootDescriptor {
+ uint32_t ShaderRegister;
+ uint32_t RegisterSpace;
+ void swapBytes() {
+ sys::swapByteOrder(ShaderRegister);
+ sys::swapByteOrder(RegisterSpace);
+ }
+};
+} // namespace v1
+
+namespace v2 {
+struct RootDescriptor : public v1::RootDescriptor {
+ uint32_t Flags;
+
+ RootDescriptor() = default;
+ explicit RootDescriptor(v1::RootDescriptor &Base)
+ : v1::RootDescriptor(Base), Flags(0u) {}
+
+ void swapBytes() {
+ v1::RootDescriptor::swapBytes();
+ sys::swapByteOrder(Flags);
+ }
+};
+} // namespace v2
+} // namespace RTS0
+
} // namespace dxbc
} // namespace llvm
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index 3496b5fff398f..5f5919122b3c5 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -16,36 +16,36 @@ class raw_ostream;
namespace mcdxbc {
struct RootParameterInfo {
- dxbc::RootParameterHeader Header;
+ dxbc::RTS0::v1::RootParameterHeader Header;
size_t Location;
RootParameterInfo() = default;
- RootParameterInfo(dxbc::RootParameterHeader Header, size_t Location)
+ RootParameterInfo(dxbc::RTS0::v1::RootParameterHeader Header, size_t Location)
: Header(Header), Location(Location) {}
};
struct RootParametersContainer {
SmallVector<RootParameterInfo> ParametersInfo;
- SmallVector<dxbc::RootConstants> Constants;
+ SmallVector<dxbc::RTS0::v1::RootConstants> Constants;
SmallVector<dxbc::RTS0::v2::RootDescriptor> Descriptors;
- void addInfo(dxbc::RootParameterHeader Header, size_t Location) {
+ void addInfo(dxbc::RTS0::v1::RootParameterHeader Header, size_t Location) {
ParametersInfo.push_back(RootParameterInfo(Header, Location));
}
- void addParameter(dxbc::RootParameterHeader Header,
- dxbc::RootConstants Constant) {
+ void addParameter(dxbc::RTS0::v1::RootParameterHeader Header,
+ dxbc::RTS0::v1::RootConstants Constant) {
addInfo(Header, Constants.size());
Constants.push_back(Constant);
}
- void addInvalidParameter(dxbc::RootParameterHeader Header) {
+ void addInvalidParameter(dxbc::RTS0::v1::RootParameterHeader Header) {
addInfo(Header, -1);
}
- void addParameter(dxbc::RootParameterHeader Header,
+ void addParameter(dxbc::RTS0::v1::RootParameterHeader Header,
dxbc::RTS0::v2::RootDescriptor Descriptor) {
addInfo(Header, Descriptors.size());
Descriptors.push_back(Descriptor);
@@ -57,12 +57,12 @@ struct RootParametersContainer {
return {Info.Header.ParameterType, Info.Location};
}
- const dxbc::RootParameterHeader &getHeader(size_t Location) const {
+ const dxbc::RTS0::v1::RootParameterHeader &getHeader(size_t Location) const {
const RootParameterInfo &Info = ParametersInfo[Location];
return Info.Header;
}
- const dxbc::RootConstants &getConstant(size_t Index) const {
+ const dxbc::RTS0::v1::RootConstants &getConstant(size_t Index) const {
return Constants[Index];
}
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index 61bfa9411cc57..37cd5ca7dc935 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -121,10 +121,10 @@ template <typename T> struct ViewArray {
namespace DirectX {
struct RootParameterView {
- const dxbc::RootParameterHeader &Header;
+ const dxbc::RTS0::v1::RootParameterHeader &Header;
StringRef ParamData;
- RootParameterView(const dxbc::RootParameterHeader &H, StringRef P)
+ RootParameterView(const dxbc::RTS0::v1::RootParameterHeader &H, StringRef P)
: Header(H), ParamData(P) {}
template <typename T> Expected<T> readParameter() {
@@ -147,8 +147,8 @@ struct RootConstantView : RootParameterView {
(uint32_t)dxbc::RootParameterType::Constants32Bit;
}
- llvm::Expected<dxbc::RootConstants> read() {
- return readParameter<dxbc::RootConstants>();
+ llvm::Expected<dxbc::RTS0::v1::RootConstants> read() {
+ return readParameter<dxbc::RTS0::v1::RootConstants>();
}
};
@@ -189,10 +189,11 @@ class RootSignature {
uint32_t NumStaticSamplers;
uint32_t StaticSamplersOffset;
uint32_t Flags;
- ViewArray<dxbc::RootParameterHeader> ParametersHeaders;
+ ViewArray<dxbc::RTS0::v1::RootParameterHeader> ParametersHeaders;
StringRef PartData;
- using param_header_iterator = ViewArray<dxbc::RootParameterHeader>::iterator;
+ using param_header_iterator =
+ ViewArray<dxbc::RTS0::v1::RootParameterHeader>::iterator;
public:
RootSignature(StringRef PD) : PartData(PD) {}
@@ -210,7 +211,7 @@ class RootSignature {
uint32_t getFlags() const { return Flags; }
llvm::Expected<RootParameterView>
- getParameter(const dxbc::RootParameterHeader &Header) const {
+ getParameter(const dxbc::RTS0::v1::RootParameterHeader &Header) const {
size_t DataSize;
if (!dxbc::isValidParameterType(Header.ParameterType))
@@ -218,7 +219,7 @@ class RootSignature {
switch (static_cast<dxbc::RootParameterType>(Header.ParameterType)) {
case dxbc::RootParameterType::Constants32Bit:
- DataSize = sizeof(dxbc::RootConstants);
+ DataSize = sizeof(dxbc::RTS0::v1::RootConstants);
break;
case dxbc::RootParameterType::CBV:
case dxbc::RootParameterType::SRV:
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index a9394541d18da..3a4bd8321eb95 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -29,13 +29,14 @@ static void rewriteOffsetToCurrentByte(raw_svector_ostream &Stream,
}
size_t RootSignatureDesc::getSize() const {
- size_t Size = sizeof(dxbc::RootSignatureHeader) +
- ParametersContainer.size() * sizeof(dxbc::RootParameterHeader);
+ size_t Size =
+ sizeof(dxbc::RTS0::v1::RootSignatureHeader) +
+ ParametersContainer.size() * sizeof(dxbc::RTS0::v1::RootParameterHeader);
for (const RootParameterInfo &I : ParametersContainer) {
switch (I.Header.ParameterType) {
case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
- Size += sizeof(dxbc::RootConstants);
+ Size += sizeof(dxbc::RTS0::v1::RootConstants);
break;
case llvm::to_underlying(dxbc::RootParameterType::CBV):
case llvm::to_underlying(dxbc::RootParameterType::SRV):
@@ -81,7 +82,7 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
const auto &[Type, Loc] = ParametersContainer.getTypeAndLocForParameter(I);
switch (Type) {
case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): {
- const dxbc::RootConstants &Constants =
+ const dxbc::RTS0::v1::RootConstants &Constants =
ParametersContainer.getConstant(Loc);
support::endian::write(BOS, Constants.ShaderRegister,
llvm::endianness::little);
diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 95f6788e75aa6..2d05566626bfc 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -273,7 +273,8 @@ Error DirectX::RootSignature::parse() {
Current += sizeof(uint32_t);
ParametersHeaders.Data = PartData.substr(
- RootParametersOffset, NumParameters * sizeof(dxbc::RootParameterHeader));
+ RootParametersOffset,
+ NumParameters * sizeof(dxbc::RTS0::v1::RootParameterHeader));
return Error::success();
}
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index ace2eca5072bd..71a87f6aa24fc 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -274,12 +274,12 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
RS.StaticSamplersOffset = P.RootSignature->StaticSamplersOffset;
for (const auto &Param : P.RootSignature->Parameters) {
- auto Header = dxbc::RootParameterHeader{Param.Type, Param.Visibility,
- Param.Offset};
+ auto Header = dxbc::RTS0::v1::RootParameterHeader{
+ Param.Type, Param.Visibility, Param.Offset};
if (auto *ConstantYaml =
std::get_if<DXContainerYAML::RootConstantsYaml>(&Param.Data)) {
- dxbc::RootConstants Constants;
+ dxbc::RTS0::v1::RootConstants Constants;
Constants.Num32BitValues = ConstantYaml->Num32BitValues;
Constants.RegisterSpace = ConstantYaml->RegisterSpace;
Constants.ShaderRegister = ConstantYaml->ShaderRegister;
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index fdb039e75fdda..b824a408e30a6 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -47,7 +47,7 @@ DXContainerYAML::RootSignatureYamlDesc::create(
RootSigDesc.RootParametersOffset = Data.getRootParametersOffset();
uint32_t Flags = Data.getFlags();
- for (const dxbc::RootParameterHeader &PH : Data.param_headers()) {
+ for (const dxbc::RTS0::v1::RootParameterHeader &PH : Data.param_headers()) {
if (!dxbc::isValidParameterType(PH.ParameterType))
return createStringError(std::errc::invalid_argument,
@@ -70,7 +70,8 @@ DXContainerYAML::RootSignatureYamlDesc::create(
object::DirectX::RootParameterView ParamView = ParamViewOrErr.get();
if (auto *RCV = dyn_cast<object::DirectX::RootConstantView>(&ParamView)) {
- llvm::Expected<dxbc::RootConstants> ConstantsOrErr = RCV->read();
+ llvm::Expected<dxbc::RTS0::v1::RootConstants> ConstantsOrErr =
+ RCV->read();
if (Error E = ConstantsOrErr.takeError())
return std::move(E);
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 43e06ee278b49..40277899b5c7e 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -75,7 +75,7 @@ static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
if (RootConstantNode->getNumOperands() != 5)
return reportError(Ctx, "Invalid format for RootConstants Element");
- dxbc::RootParameterHeader Header;
+ dxbc::RTS0::v1::RootParameterHeader Header;
// The parameter offset doesn't matter here - we recalculate it during
// serialization Header.ParameterOffset = 0;
Header.ParameterType =
@@ -86,7 +86,7 @@ static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
else
return reportError(Ctx, "Invalid value for ShaderVisibility");
- dxbc::RootConstants Constants;
+ dxbc::RTS0::v1::RootConstants Constants;
if (std::optional<uint32_t> Val = extractMdIntValue(RootConstantNode, 2))
Constants.ShaderRegister = *Val;
else
@@ -247,7 +247,7 @@ analyzeModule(Module &M) {
// Clang emits the root signature data in dxcontainer following a specific
// sequence. First the header, then the root parameters. So the header
// offset will always equal to the header size.
- RSD.RootParameterOffset = sizeof(dxbc::RootSignatureHeader);
+ RSD.RootParameterOffset = sizeof(dxbc::RTS0::v1::RootSignatureHeader);
if (parse(Ctx, RSD, RootElementListNode) || validate(Ctx, RSD)) {
return RSDMap;
@@ -296,7 +296,7 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
for (size_t I = 0; I < RS.ParametersContainer.size(); I++) {
const auto &[Type, Loc] =
RS.ParametersContainer.getTypeAndLocForParameter(I);
- const dxbc::RootParameterHeader Header =
+ const dxbc::RTS0::v1::RootParameterHeader Header =
RS.ParametersContainer.getHeader(I);
OS << indent(Space) << "- Parameter Type: " << Type << "\n";
@@ -305,7 +305,7 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
switch (Type) {
case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): {
- const dxbc::RootConstants &Constants =
+ const dxbc::RTS0::v1::RootConstants &Constants =
RS.ParametersContainer.getConstant(Loc);
OS << indent(Space + 2) << "Register Space: " << Constants.RegisterSpace
<< "\n";
>From 3094a758cd2ab9537bcb288527d26388ed1553fe Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Fri, 23 May 2025 01:18:57 +0000
Subject: [PATCH 29/29] cleanup
---
llvm/include/llvm/BinaryFormat/DXContainer.h | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index ef628cbc34c9d..3494e0fe1a0e9 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -585,8 +585,18 @@ struct ProgramSignatureElement {
static_assert(sizeof(ProgramSignatureElement) == 32,
"ProgramSignatureElement is misaligned");
+
namespace RTS0 {
namespace v1 {
+struct RootDescriptor {
+ uint32_t ShaderRegister;
+ uint32_t RegisterSpace;
+ void swapBytes() {
+ sys::swapByteOrder(ShaderRegister);
+ sys::swapByteOrder(RegisterSpace);
+ }
+};
+
// following dx12 naming
// https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ns-d3d12-d3d12_root_constants
struct RootConstants {
@@ -630,15 +640,6 @@ struct RootSignatureHeader {
sys::swapByteOrder(Flags);
}
};
-
-struct RootDescriptor {
- uint32_t ShaderRegister;
- uint32_t RegisterSpace;
- void swapBytes() {
- sys::swapByteOrder(ShaderRegister);
- sys::swapByteOrder(RegisterSpace);
- }
-};
} // namespace v1
namespace v2 {
More information about the llvm-branch-commits
mailing list