[llvm-branch-commits] [llvm] [DXContainer] Obj2yaml support for root constants (PR #124813)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Jan 30 11:18:45 PST 2025
https://github.com/joaosaffran updated https://github.com/llvm/llvm-project/pull/124813
>From b1b967db8d3252894b72db1d6161c655898680bd Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 28 Jan 2025 17:46:23 +0000
Subject: [PATCH 1/5] adding support for root constants in dxcontainer for
ob2jyaml and yaml2obj tools
---
llvm/include/llvm/BinaryFormat/DXContainer.h | 85 ++++++++++---------
.../BinaryFormat/DXContainerConstants.def | 26 +++---
.../llvm/MC/DXContainerRootSignature.h | 3 +
llvm/include/llvm/Object/DXContainer.h | 10 +++
.../include/llvm/ObjectYAML/DXContainerYAML.h | 11 +++
llvm/lib/BinaryFormat/DXContainer.cpp | 20 +++++
llvm/lib/MC/DXContainerRootSignature.cpp | 17 +++-
llvm/lib/Object/DXContainer.cpp | 20 +++++
llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 1 +
llvm/lib/ObjectYAML/DXContainerYAML.cpp | 48 ++++++++++-
.../DXContainer/RootSignature-Flags.yaml | 14 ++-
11 files changed, 197 insertions(+), 58 deletions(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 9268c28dbc69d2..8d6c7b787ad4c1 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -17,6 +17,7 @@
#include "llvm/Support/SwapByteOrder.h"
#include "llvm/TargetParser/Triple.h"
+#include <cstdint>
#include <stdint.h>
namespace llvm {
@@ -63,44 +64,6 @@ struct ShaderHash {
void swapBytes() { sys::swapByteOrder(Flags); }
};
-#define ROOT_PARAMETER(RootParameter) RootParameter,
-enum class RootParameterType {
-#include "DXContainerConstants.def"
-};
-
-#define SHADER_VISIBILITY(ShaderVisibility) ShaderVisibility,
-enum class ShaderVisibilityFlag {
-#include "DXContainerConstants.def"
-};
-
-struct RootConstants {
- uint32_t ShaderRegister;
- uint32_t RegisterSpace;
- uint32_t Num32BitValues;
-};
-
-struct RootParameter {
- RootParameterType ParameterType;
- union {
- RootConstants Constants;
- };
- ShaderVisibilityFlag ShaderVisibility;
-};
-
-struct RootSignatureDesc {
- uint32_t Size;
- uint32_t Version;
- uint32_t Flags;
- uint32_t NumParameters;
- RootParameter *Parameters;
-
- void swapBytes() {
- sys::swapByteOrder(Size);
- sys::swapByteOrder(Version);
- sys::swapByteOrder(Flags);
- }
-};
-
struct ContainerVersion {
uint16_t Major;
uint16_t Minor;
@@ -195,6 +158,50 @@ enum class RootElementFlag : uint32_t {
#include "DXContainerConstants.def"
};
+#define ROOT_PARAMETER(Val, Enum) Enum = Val,
+enum class RootParameterType : uint8_t {
+#include "DXContainerConstants.def"
+};
+
+#define SHADER_VISIBILITY(Val, Enum) Enum = Val,
+enum class ShaderVisibilityFlag : uint8_t {
+#include "DXContainerConstants.def"
+};
+
+struct RootConstants {
+ uint32_t ShaderRegister;
+ uint32_t RegisterSpace;
+ uint32_t Num32BitValues;
+
+ void swapBytes() {
+ sys::swapByteOrder(ShaderRegister);
+ sys::swapByteOrder(RegisterSpace);
+ sys::swapByteOrder(Num32BitValues);
+ }
+};
+
+struct RootParameter {
+ RootParameterType ParameterType;
+ union {
+ RootConstants Constants;
+ };
+ ShaderVisibilityFlag ShaderVisibility;
+
+ void swapBytes() {
+ switch (ParameterType) {
+
+ case RootParameterType::Constants32Bit:
+ Constants.swapBytes();
+ break;
+ case RootParameterType::DescriptorTable:
+ case RootParameterType::CBV:
+ case RootParameterType::SRV:
+ case RootParameterType::UAV:
+ break;
+ }
+ }
+};
+
PartType parsePartType(StringRef S);
struct VertexPSVInfo {
@@ -536,6 +543,8 @@ enum class SigComponentType : uint32_t {
};
ArrayRef<EnumEntry<SigComponentType>> getSigComponentTypes();
+ArrayRef<EnumEntry<RootParameterType>> getRootParameterTypes();
+ArrayRef<EnumEntry<ShaderVisibilityFlag>> getShaderVisibilityFlags();
struct ProgramSignatureHeader {
uint32_t ParamCount;
diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
index 2134c2375f6d35..755322abf8140b 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -55,25 +55,25 @@ SHADER_FEATURE_FLAG(31, 36, NextUnusedBit, "Next reserved shader flag bit (not a
#ifdef ROOT_PARAMETER
-ROOT_PARAMETER(DescriptorTable)
-ROOT_PARAMETER(Constants32Bit)
-ROOT_PARAMETER(CBV)
-ROOT_PARAMETER(SRV)
-ROOT_PARAMETER(UAV)
+ROOT_PARAMETER(0, DescriptorTable)
+ROOT_PARAMETER(1, Constants32Bit)
+ROOT_PARAMETER(2, CBV)
+ROOT_PARAMETER(3, SRV)
+ROOT_PARAMETER(4, UAV)
#undef ROOT_PARAMETER
#endif // ROOT_PARAMETER
#ifdef SHADER_VISIBILITY
-SHADER_VISIBILITY(All)
-SHADER_VISIBILITY(Vertex)
-SHADER_VISIBILITY(Hull)
-SHADER_VISIBILITY(Domain)
-SHADER_VISIBILITY(Geometry)
-SHADER_VISIBILITY(Pixel)
-SHADER_VISIBILITY(Amplification)
-SHADER_VISIBILITY(Mesh)
+SHADER_VISIBILITY(0, All)
+SHADER_VISIBILITY(1, Vertex)
+SHADER_VISIBILITY(2, Hull)
+SHADER_VISIBILITY(3, Domain)
+SHADER_VISIBILITY(4, Geometry)
+SHADER_VISIBILITY(5, Pixel)
+SHADER_VISIBILITY(6, Amplification)
+SHADER_VISIBILITY(7, Mesh)
#undef SHADER_VISIBILITY
#endif // SHADER_VISIBILITY
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index 23de2709088c66..63a5699a978b79 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -6,6 +6,8 @@
//
//===----------------------------------------------------------------------===//
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/BinaryFormat/DXContainer.h"
#include <cstdint>
#include <limits>
@@ -17,6 +19,7 @@ namespace mcdxbc {
struct RootSignatureHeader {
uint32_t Version;
uint32_t Flags;
+ SmallVector<dxbc::RootParameter> Parameters;
void swapBytes();
void write(raw_ostream &OS);
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index 290fbd69991864..b28d80c2002855 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -22,6 +22,7 @@
#include "llvm/Support/MemoryBufferRef.h"
#include "llvm/TargetParser/Triple.h"
#include <array>
+#include <cstdint>
#include <variant>
namespace llvm {
@@ -118,11 +119,16 @@ template <typename T> struct ViewArray {
namespace DirectX {
class RootSignature {
+
+ using ParametersArray = ViewArray<dxbc::RootParameter>;
+
private:
StringRef Data;
uint32_t Size;
uint32_t Version;
uint32_t Flags;
+ uint32_t NParameters;
+ ParametersArray Parameters;
public:
RootSignature(StringRef Data) : Data(Data) {}
@@ -134,6 +140,10 @@ class RootSignature {
uint32_t getVersion() const { return Version; }
uint32_t getFlags() const { return Flags; }
+
+ uint32_t getNParameters() const { return NParameters; }
+
+ ParametersArray getParameters() const { return Parameters; }
};
class PSVRuntimeInfo {
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index 6b01f105a544bf..b1366c8de3dc49 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -190,6 +190,7 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::ResourceBindInfo)
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::SignatureElement)
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::PSVInfo::MaskVector)
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::SignatureParameter)
+LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::dxbc::RootParameter)
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::PSV::SemanticKind)
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::PSV::ComponentType)
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::PSV::InterpolationMode)
@@ -198,6 +199,8 @@ LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::PSV::ResourceKind)
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::D3DSystemValue)
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::SigComponentType)
LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::SigMinPrecision)
+LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::RootParameterType)
+LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::ShaderVisibilityFlag)
namespace llvm {
@@ -262,6 +265,14 @@ template <> struct MappingTraits<DXContainerYAML::RootSignatureDesc> {
DXContainerYAML::RootSignatureDesc &RootSignature);
};
+template <> struct MappingTraits<dxbc::RootParameter> {
+ static void mapping(IO &IO, dxbc::RootParameter &RootParameter);
+};
+
+template <> struct MappingTraits<dxbc::RootConstants> {
+ static void mapping(IO &IO, dxbc::RootConstants &RootConstants);
+};
+
} // namespace yaml
} // namespace llvm
diff --git a/llvm/lib/BinaryFormat/DXContainer.cpp b/llvm/lib/BinaryFormat/DXContainer.cpp
index 97ceb16ccf53f4..d1a1f1f5441370 100644
--- a/llvm/lib/BinaryFormat/DXContainer.cpp
+++ b/llvm/lib/BinaryFormat/DXContainer.cpp
@@ -60,6 +60,26 @@ ArrayRef<EnumEntry<SigComponentType>> dxbc::getSigComponentTypes() {
return ArrayRef(SigComponentTypes);
}
+#define SHADER_VISIBILITY(Val, Enum) {#Enum, ShaderVisibilityFlag::Enum},
+
+static const EnumEntry<ShaderVisibilityFlag> ShaderVisibilityFlags[] = {
+#include "llvm/BinaryFormat/DXContainerConstants.def"
+};
+
+ArrayRef<EnumEntry<ShaderVisibilityFlag>> dxbc::getShaderVisibilityFlags() {
+ return ArrayRef(ShaderVisibilityFlags);
+}
+
+#define ROOT_PARAMETER(Val, Enum) {#Enum, RootParameterType::Enum},
+
+static const EnumEntry<RootParameterType> RootParameterTypes[] = {
+#include "llvm/BinaryFormat/DXContainerConstants.def"
+};
+
+ArrayRef<EnumEntry<RootParameterType>> dxbc::getRootParameterTypes() {
+ return ArrayRef(RootParameterTypes);
+}
+
#define SEMANTIC_KIND(Val, Enum) {#Enum, PSV::SemanticKind::Enum},
static const EnumEntry<PSV::SemanticKind> SemanticKindNames[] = {
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 0bb87c2cc38324..4258bc066d3d40 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -7,17 +7,28 @@
//===----------------------------------------------------------------------===//
#include "llvm/MC/DXContainerRootSignature.h"
+#include "llvm/BinaryFormat/DXContainer.h"
#include "llvm/Support/EndianStream.h"
-#include "llvm/Support/SwapByteOrder.h"
-#include <iterator>
+#include <cstdint>
using namespace llvm;
using namespace llvm::mcdxbc;
void RootSignatureHeader::write(raw_ostream &OS) {
- uint32_t SizeInfo = sizeof(this);
+ uint32_t SizeInfo = sizeof(RootSignatureHeader);
+ uint32_t ParamsSize = Parameters.size();
support::endian::write(OS, SizeInfo, llvm::endianness::little);
support::endian::write(OS, Version, llvm::endianness::little);
support::endian::write(OS, Flags, llvm::endianness::little);
+ support::endian::write(OS, ParamsSize, llvm::endianness::little);
+
+ if (Parameters.size() > 0) {
+ uint32_t BindingSize = sizeof(dxbc::RootParameter);
+
+ support::endian::write(OS, BindingSize, llvm::endianness::little);
+
+ for (const auto &Param : Parameters)
+ OS.write(reinterpret_cast<const char *>(&Param), BindingSize);
+ }
}
diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index ffb0b6884831ba..48bbf22a12ff9d 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -254,6 +254,26 @@ Error DirectX::RootSignature::parse() {
Flags = support::endian::read<uint32_t, llvm::endianness::little>(Current);
Current += sizeof(uint32_t);
+ NParameters =
+ support::endian::read<uint32_t, llvm::endianness::little>(Current);
+ Current += sizeof(uint32_t);
+
+ if (NParameters > 0) {
+
+ Parameters.Stride =
+ support::endian::read<uint32_t, llvm::endianness::little>(Current);
+ Current += sizeof(uint32_t);
+
+ size_t BindingDataSize = Parameters.Stride * NParameters;
+ Parameters.Data = Data.substr(Current - Data.begin(), BindingDataSize);
+
+ if (Parameters.Data.size() < BindingDataSize)
+ return parseFailed(
+ "Resource binding data extends beyond the bounds of the part");
+
+ Current += BindingDataSize;
+ }
+
return Error::success();
}
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index 0504f6b88a7db5..9aeda0f12ead87 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -269,6 +269,7 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
mcdxbc::RootSignatureHeader Header;
Header.Version = P.RootSignature->Version;
Header.Flags = P.RootSignature->getEncodedFlags();
+ Header.Parameters = P.RootSignature->Parameters;
Header.write(OS);
break;
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index 985546872a8b35..184bf32279141a 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -32,8 +32,13 @@ DXContainerYAML::ShaderFeatureFlags::ShaderFeatureFlags(uint64_t FlagData) {
DXContainerYAML::RootSignatureDesc::RootSignatureDesc(
const object::DirectX::RootSignature &Data)
- : Size(Data.getSize()), Version(Data.getVersion()) {
+ : Size(Data.getSize()), Version(Data.getVersion()),
+ NumParameters(Data.getNParameters()) {
uint32_t Flags = Data.getFlags();
+
+ for (const auto &Param : Data.getParameters())
+ Parameters.push_back(Param);
+
#define ROOT_ELEMENT_FLAG(Num, Val, Str) \
Val = (Flags & (uint32_t)dxbc::RootElementFlag::Val) > 0;
#include "llvm/BinaryFormat/DXContainerConstants.def"
@@ -211,10 +216,39 @@ void MappingTraits<DXContainerYAML::RootSignatureDesc>::mapping(
IO &IO, DXContainerYAML::RootSignatureDesc &S) {
IO.mapRequired("Size", S.Size);
IO.mapRequired("Version", S.Version);
+ IO.mapRequired("NumParameters", S.NumParameters);
+ IO.mapRequired("Parameters", S.Parameters);
#define ROOT_ELEMENT_FLAG(Num, Val, Str) IO.mapOptional(#Val, S.Val, false);
#include "llvm/BinaryFormat/DXContainerConstants.def"
}
+void MappingTraits<dxbc::RootParameter>::mapping(IO &IO,
+ dxbc::RootParameter &S) {
+
+ IO.mapRequired("Type", S.ParameterType);
+ IO.mapRequired("ShaderVisibility", S.ShaderVisibility);
+
+ switch (S.ParameterType) {
+
+ case dxbc::RootParameterType::Constants32Bit:
+ IO.mapRequired("Constants", S.Constants);
+ break;
+ case dxbc::RootParameterType::DescriptorTable:
+ case dxbc::RootParameterType::CBV:
+ case dxbc::RootParameterType::SRV:
+ case dxbc::RootParameterType::UAV:
+ break;
+ }
+}
+
+void MappingTraits<dxbc::RootConstants>::mapping(IO &IO,
+ dxbc::RootConstants &S) {
+
+ IO.mapRequired("Num32BitValues", S.Num32BitValues);
+ IO.mapRequired("ShaderRegister", S.ShaderRegister);
+ IO.mapRequired("RegisterSpace", S.RegisterSpace);
+}
+
void MappingTraits<DXContainerYAML::Part>::mapping(IO &IO,
DXContainerYAML::Part &P) {
IO.mapRequired("Name", P.Name);
@@ -318,6 +352,18 @@ void ScalarEnumerationTraits<dxbc::SigComponentType>::enumeration(
IO.enumCase(Value, E.Name.str().c_str(), E.Value);
}
+void ScalarEnumerationTraits<dxbc::RootParameterType>::enumeration(
+ IO &IO, dxbc::RootParameterType &Value) {
+ for (const auto &E : dxbc::getRootParameterTypes())
+ IO.enumCase(Value, E.Name.str().c_str(), E.Value);
+}
+
+void ScalarEnumerationTraits<dxbc::ShaderVisibilityFlag>::enumeration(
+ IO &IO, dxbc::ShaderVisibilityFlag &Value) {
+ for (const auto &E : dxbc::getShaderVisibilityFlags())
+ IO.enumCase(Value, E.Name.str().c_str(), E.Value);
+}
+
} // namespace yaml
void DXContainerYAML::PSVInfo::mapInfoForVersion(yaml::IO &IO) {
diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
index 6c0ccda2e4ca5f..b6bba277f516f0 100644
--- a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
@@ -10,12 +10,20 @@ Header:
PartOffsets: [ 60 ]
Parts:
- Name: RTS0
- Size: 8
+ Size: 44
RootSignature:
- Size: 8
+ Size: 44
Version: 1
AllowInputAssemblerInputLayout: true
-
+ NumParameters: 1
+ Parameters:
+ - Type: Constants32Bit
+ ShaderVisibility: All
+ Constants:
+ Num32BitValues: 3
+ ShaderRegister: 1
+ RegisterSpace: 2
+
#CHECK: - Name: RTS0
#CHECK-NEXT: Size: 8
#CHECK-NEXT: RootSignature:
>From ad3dbe302ed08cb7fed26475273dd67d02a1ca47 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 28 Jan 2025 18:02:54 +0000
Subject: [PATCH 2/5] updating test
---
llvm/include/llvm/BinaryFormat/DXContainer.h | 89 +++++++++----------
llvm/include/llvm/Object/DXContainer.h | 1 -
llvm/lib/MC/DXContainerRootSignature.cpp | 1 -
.../DXContainer/RootSignature-Flags.yaml | 22 +++--
4 files changed, 59 insertions(+), 54 deletions(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 8d6c7b787ad4c1..cb57309ae183fc 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -17,7 +17,6 @@
#include "llvm/Support/SwapByteOrder.h"
#include "llvm/TargetParser/Triple.h"
-#include <cstdint>
#include <stdint.h>
namespace llvm {
@@ -64,6 +63,50 @@ struct ShaderHash {
void swapBytes() { sys::swapByteOrder(Flags); }
};
+#define ROOT_PARAMETER(Val, Enum) Enum = Val,
+enum class RootParameterType : uint8_t {
+#include "DXContainerConstants.def"
+};
+
+#define SHADER_VISIBILITY(Val, Enum) Enum = Val,
+enum class ShaderVisibilityFlag : uint8_t {
+#include "DXContainerConstants.def"
+};
+
+struct RootConstants {
+ uint32_t ShaderRegister;
+ uint32_t RegisterSpace;
+ uint32_t Num32BitValues;
+
+ void swapBytes() {
+ sys::swapByteOrder(ShaderRegister);
+ sys::swapByteOrder(RegisterSpace);
+ sys::swapByteOrder(Num32BitValues);
+ }
+};
+
+struct RootParameter {
+ RootParameterType ParameterType;
+ union {
+ RootConstants Constants;
+ };
+ ShaderVisibilityFlag ShaderVisibility;
+
+ void swapBytes() {
+ switch (ParameterType) {
+
+ case RootParameterType::Constants32Bit:
+ Constants.swapBytes();
+ break;
+ case RootParameterType::DescriptorTable:
+ case RootParameterType::CBV:
+ case RootParameterType::SRV:
+ case RootParameterType::UAV:
+ break;
+ }
+ }
+};
+
struct ContainerVersion {
uint16_t Major;
uint16_t Minor;
@@ -158,50 +201,6 @@ enum class RootElementFlag : uint32_t {
#include "DXContainerConstants.def"
};
-#define ROOT_PARAMETER(Val, Enum) Enum = Val,
-enum class RootParameterType : uint8_t {
-#include "DXContainerConstants.def"
-};
-
-#define SHADER_VISIBILITY(Val, Enum) Enum = Val,
-enum class ShaderVisibilityFlag : uint8_t {
-#include "DXContainerConstants.def"
-};
-
-struct RootConstants {
- uint32_t ShaderRegister;
- uint32_t RegisterSpace;
- uint32_t Num32BitValues;
-
- void swapBytes() {
- sys::swapByteOrder(ShaderRegister);
- sys::swapByteOrder(RegisterSpace);
- sys::swapByteOrder(Num32BitValues);
- }
-};
-
-struct RootParameter {
- RootParameterType ParameterType;
- union {
- RootConstants Constants;
- };
- ShaderVisibilityFlag ShaderVisibility;
-
- void swapBytes() {
- switch (ParameterType) {
-
- case RootParameterType::Constants32Bit:
- Constants.swapBytes();
- break;
- case RootParameterType::DescriptorTable:
- case RootParameterType::CBV:
- case RootParameterType::SRV:
- case RootParameterType::UAV:
- break;
- }
- }
-};
-
PartType parsePartType(StringRef S);
struct VertexPSVInfo {
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index b28d80c2002855..be13ee3ea8680a 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -22,7 +22,6 @@
#include "llvm/Support/MemoryBufferRef.h"
#include "llvm/TargetParser/Triple.h"
#include <array>
-#include <cstdint>
#include <variant>
namespace llvm {
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 4258bc066d3d40..5893752a767beb 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -9,7 +9,6 @@
#include "llvm/MC/DXContainerRootSignature.h"
#include "llvm/BinaryFormat/DXContainer.h"
#include "llvm/Support/EndianStream.h"
-#include <cstdint>
using namespace llvm;
using namespace llvm::mcdxbc;
diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
index b6bba277f516f0..b719768e75058c 100644
--- a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
@@ -14,7 +14,6 @@ Parts:
RootSignature:
Size: 44
Version: 1
- AllowInputAssemblerInputLayout: true
NumParameters: 1
Parameters:
- Type: Constants32Bit
@@ -23,10 +22,19 @@ Parts:
Num32BitValues: 3
ShaderRegister: 1
RegisterSpace: 2
+ AllowInputAssemblerInputLayout: true
-#CHECK: - Name: RTS0
-#CHECK-NEXT: Size: 8
-#CHECK-NEXT: RootSignature:
-#CHECK-NEXT: Size: 8
-#CHECK-NEXT: Version: 1
-#CHECK-NEXT: AllowInputAssemblerInputLayout: true
+#CHECK: - Name: RTS0
+#CHECK-NEXT: Size: 44
+#CHECK-NEXT: RootSignature:
+#CHECK-NEXT: Size: 64
+#CHECK-NEXT: Version: 1
+#CHECK-NEXT: NumParameters: 1
+#CHECK-NEXT: Parameters:
+#CHECK-NEXT: - Type: Constants32Bit
+#CHECK-NEXT: ShaderVisibility: All
+#CHECK-NEXT: Constants:
+#CHECK-NEXT: Num32BitValues: 3
+#CHECK-NEXT: ShaderRegister: 1
+#CHECK-NEXT: RegisterSpace: 2
+#CHECK-NEXT: AllowInputAssemblerInputLayout: true
>From 5034fb370f2268de60d20145ac80f3913d65f98c Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 30 Jan 2025 00:33:30 +0000
Subject: [PATCH 3/5] fixing tests
---
.../DirectX/ContainerData/RootSignature-Flags.ll | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
index 20253efbb8e5c5..4914a409e65286 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
@@ -3,7 +3,7 @@
target triple = "dxil-unknown-shadermodel6.0-compute"
-; CHECK: @dx.rts0 = private constant [12 x i8] c"{{.*}}", section "RTS0", align 4
+; CHECK: @dx.rts0 = private constant [16 x i8] c"{{.*}}", section "RTS0", align 4
define void @main() #0 {
@@ -20,9 +20,11 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
-; DXC: - Name: RTS0
-; DXC-NEXT: Size: 12
-; DXC-NEXT: RootSignature:
-; DXC-NEXT: Size: 8
-; DXC-NEXT: Version: 1
-; DXC-NEXT: AllowInputAssemblerInputLayout: true
+; DXC: - Name: RTS0
+; DXC-NEXT: Size: 16
+; DXC-NEXT: RootSignature:
+; DXC-NEXT: Size: 64
+; DXC-NEXT: Version: 1
+; DXC-NEXT: NumParameters: 0
+; DXC-NEXT: Parameters: []
+; DXC-NEXT: AllowInputAssemblerInputLayout: true
>From c055fd0cd8b19f08c90d587d82e6a4a28ca65a5c Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 30 Jan 2025 18:33:23 +0000
Subject: [PATCH 4/5] removing version
---
llvm/include/llvm/MC/DXContainerRootSignature.h | 1 -
llvm/include/llvm/Object/DXContainer.h | 3 ---
llvm/include/llvm/ObjectYAML/DXContainerYAML.h | 1 -
llvm/lib/MC/DXContainerRootSignature.cpp | 1 -
llvm/lib/Object/DXContainer.cpp | 3 ---
llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 1 -
llvm/lib/ObjectYAML/DXContainerYAML.cpp | 4 +---
llvm/lib/Target/DirectX/DXContainerGlobals.cpp | 2 +-
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 5 ++---
llvm/lib/Target/DirectX/DXILRootSignature.h | 3 +--
llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml | 8 +++-----
11 files changed, 8 insertions(+), 24 deletions(-)
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index 63a5699a978b79..9102137c14b473 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -17,7 +17,6 @@ class raw_ostream;
namespace mcdxbc {
struct RootSignatureHeader {
- uint32_t Version;
uint32_t Flags;
SmallVector<dxbc::RootParameter> Parameters;
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index be13ee3ea8680a..e2d9f7266fcb49 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -124,7 +124,6 @@ class RootSignature {
private:
StringRef Data;
uint32_t Size;
- uint32_t Version;
uint32_t Flags;
uint32_t NParameters;
ParametersArray Parameters;
@@ -136,8 +135,6 @@ class RootSignature {
uint32_t getSize() const { return Size; }
- uint32_t getVersion() const { return Version; }
-
uint32_t getFlags() const { return Flags; }
uint32_t getNParameters() const { return NParameters; }
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index b1366c8de3dc49..a368d5bf3634af 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -80,7 +80,6 @@ struct RootSignatureDesc {
uint32_t getEncodedFlags();
uint32_t Size;
- uint32_t Version;
uint32_t NumParameters;
SmallVector<dxbc::RootParameter> Parameters;
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 5893752a767beb..0ac72be0d3b667 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -18,7 +18,6 @@ void RootSignatureHeader::write(raw_ostream &OS) {
uint32_t SizeInfo = sizeof(RootSignatureHeader);
uint32_t ParamsSize = Parameters.size();
support::endian::write(OS, SizeInfo, llvm::endianness::little);
- support::endian::write(OS, Version, llvm::endianness::little);
support::endian::write(OS, Flags, llvm::endianness::little);
support::endian::write(OS, ParamsSize, llvm::endianness::little);
diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index 48bbf22a12ff9d..627433e38f51c0 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -248,9 +248,6 @@ Error DirectX::RootSignature::parse() {
Size = support::endian::read<uint32_t, llvm::endianness::little>(Current);
Current += sizeof(uint32_t);
- Version = support::endian::read<uint32_t, llvm::endianness::little>(Current);
- Current += sizeof(uint32_t);
-
Flags = support::endian::read<uint32_t, llvm::endianness::little>(Current);
Current += sizeof(uint32_t);
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index 9aeda0f12ead87..ecf3714d29d613 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -267,7 +267,6 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
continue;
mcdxbc::RootSignatureHeader Header;
- Header.Version = P.RootSignature->Version;
Header.Flags = P.RootSignature->getEncodedFlags();
Header.Parameters = P.RootSignature->Parameters;
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index 184bf32279141a..3dbe174ac4cc88 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -32,8 +32,7 @@ DXContainerYAML::ShaderFeatureFlags::ShaderFeatureFlags(uint64_t FlagData) {
DXContainerYAML::RootSignatureDesc::RootSignatureDesc(
const object::DirectX::RootSignature &Data)
- : Size(Data.getSize()), Version(Data.getVersion()),
- NumParameters(Data.getNParameters()) {
+ : Size(Data.getSize()), NumParameters(Data.getNParameters()) {
uint32_t Flags = Data.getFlags();
for (const auto &Param : Data.getParameters())
@@ -215,7 +214,6 @@ void MappingTraits<DXContainerYAML::Signature>::mapping(
void MappingTraits<DXContainerYAML::RootSignatureDesc>::mapping(
IO &IO, DXContainerYAML::RootSignatureDesc &S) {
IO.mapRequired("Size", S.Size);
- IO.mapRequired("Version", S.Version);
IO.mapRequired("NumParameters", S.NumParameters);
IO.mapRequired("Parameters", S.Parameters);
#define ROOT_ELEMENT_FLAG(Num, Val, Str) IO.mapOptional(#Val, S.Val, false);
diff --git a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
index 36e7cedbdaee0c..37108f92718df8 100644
--- a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
+++ b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
@@ -162,7 +162,7 @@ void DXContainerGlobals::addRootSignature(Module &M,
RootSignatureHeader RSH;
RSH.Flags = MRS->Flags;
- RSH.Version = MRS->Version;
+
RSH.write(OS);
Constant *Constant =
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 52c7ad8e249379..c86be5bd9eb676 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -80,8 +80,7 @@ static bool parseRootSignatureElement(ModuleRootSignature *MRS,
return true;
}
-bool ModuleRootSignature::parse(int32_t Version, NamedMDNode *Root) {
- this->Version = Version;
+bool ModuleRootSignature::parse(NamedMDNode *Root) {
bool HasError = false;
/** Root Signature are specified as following in the metadata:
@@ -127,7 +126,7 @@ ModuleRootSignature ModuleRootSignature::analyzeModule(Module &M) {
NamedMDNode *RootSignatureNode = M.getNamedMetadata("dx.rootsignatures");
if (RootSignatureNode) {
- if (MRS.parse(1, RootSignatureNode))
+ if (MRS.parse(RootSignatureNode))
llvm_unreachable("Invalid Root Signature Metadata.");
}
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index 0439deea6451a6..f89fb0f00b5a4d 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -30,12 +30,11 @@ enum class RootSignatureElementKind {
};
struct ModuleRootSignature {
- uint32_t Version;
uint32_t Flags;
ModuleRootSignature() = default;
- bool parse(int32_t Version, NamedMDNode *Root);
+ bool parse(NamedMDNode *Root);
static ModuleRootSignature analyzeModule(Module &M);
};
diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
index b719768e75058c..2da4ef8db96825 100644
--- a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
@@ -10,10 +10,9 @@ Header:
PartOffsets: [ 60 ]
Parts:
- Name: RTS0
- Size: 44
+ Size: 40
RootSignature:
- Size: 44
- Version: 1
+ Size: 64
NumParameters: 1
Parameters:
- Type: Constants32Bit
@@ -25,10 +24,9 @@ Parts:
AllowInputAssemblerInputLayout: true
#CHECK: - Name: RTS0
-#CHECK-NEXT: Size: 44
+#CHECK-NEXT: Size: 40
#CHECK-NEXT: RootSignature:
#CHECK-NEXT: Size: 64
-#CHECK-NEXT: Version: 1
#CHECK-NEXT: NumParameters: 1
#CHECK-NEXT: Parameters:
#CHECK-NEXT: - Type: Constants32Bit
>From 7541d9a09047bda0d5cb26c0cb0229a35bc5f42f Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 30 Jan 2025 19:18:10 +0000
Subject: [PATCH 5/5] fix tests
---
.../CodeGen/DirectX/ContainerData/RootSignature-Flags.ll | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
index 4914a409e65286..122836ce61eac8 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
@@ -3,7 +3,7 @@
target triple = "dxil-unknown-shadermodel6.0-compute"
-; CHECK: @dx.rts0 = private constant [16 x i8] c"{{.*}}", section "RTS0", align 4
+; CHECK: @dx.rts0 = private constant [12 x i8] c"{{.*}}", section "RTS0", align 4
define void @main() #0 {
@@ -21,10 +21,9 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
; DXC: - Name: RTS0
-; DXC-NEXT: Size: 16
+; DXC-NEXT: Size: 12
; DXC-NEXT: RootSignature:
; DXC-NEXT: Size: 64
-; DXC-NEXT: Version: 1
; DXC-NEXT: NumParameters: 0
; DXC-NEXT: Parameters: []
; DXC-NEXT: AllowInputAssemblerInputLayout: true
More information about the llvm-branch-commits
mailing list