[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 16:06:23 PST 2025
https://github.com/joaosaffran updated https://github.com/llvm/llvm-project/pull/124813
>From b02e7fe88bcafe236fc3eb592eae67eb47da8b0b 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/2] adding support for root constants in dxcontainer for
ob2jyaml and yaml2obj tools
---
llvm/include/llvm/BinaryFormat/DXContainer.h | 50 +++++++++++++++++++
.../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 | 5 ++
.../DXContainer/RootSignature-Flags.yaml | 32 +++++++++---
11 files changed, 171 insertions(+), 24 deletions(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 71a6d15e46a81d..c241ec7e87348d 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,6 +64,7 @@ struct ShaderHash {
void swapBytes() { sys::swapByteOrder(Flags); }
};
+<<<<<<< HEAD
struct RootSignatureDesc {
uint32_t Size;
uint32_t Flags;
@@ -73,6 +75,8 @@ struct RootSignatureDesc {
}
};
+=======
+>>>>>>> b1b967db8d32 (adding support for root constants in dxcontainer for ob2jyaml and yaml2obj tools)
struct ContainerVersion {
uint16_t Major;
uint16_t Minor;
@@ -167,6 +171,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 {
@@ -508,6 +556,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 20b4f5a4285f69..9102137c14b473 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>
@@ -16,6 +18,7 @@ class raw_ostream;
namespace mcdxbc {
struct RootSignatureHeader {
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 5f7737d2fa41d2..1d6590dacadaff 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,10 +119,15 @@ template <typename T> struct ViewArray {
namespace DirectX {
class RootSignature {
+
+ using ParametersArray = ViewArray<dxbc::RootParameter>;
+
private:
StringRef Data;
uint32_t Size;
uint32_t Flags;
+ uint32_t NParameters;
+ ParametersArray Parameters;
public:
RootSignature(StringRef Data) : Data(Data) {}
@@ -131,6 +137,10 @@ class RootSignature {
uint32_t getSize() const { return Size; }
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 a82083fa18de6b..5ac90a4f3e0731 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -187,6 +187,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)
@@ -195,6 +196,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 {
@@ -259,6 +262,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 4e085654a1e5e1..df5a0dca769eb8 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -7,16 +7,27 @@
//===----------------------------------------------------------------------===//
#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, 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 6743911059cfd4..627433e38f51c0 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -251,6 +251,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 ada7383ea3c6b8..ecf3714d29d613 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -268,6 +268,7 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
mcdxbc::RootSignatureHeader Header;
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 fd85d75dc32eb3..7d2ebef44b1bfb 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -33,6 +33,8 @@ DXContainerYAML::ShaderFeatureFlags::ShaderFeatureFlags(uint64_t FlagData) {
DXContainerYAML::RootSignatureDesc::RootSignatureDesc(
const object::DirectX::RootSignature &Data)
: Size(Data.getSize()) {
+ : Size(Data.getSize()), Version(Data.getVersion()),
+ NumParameters(Data.getNParameters()) {
uint32_t Flags = Data.getFlags();
#define ROOT_ELEMENT_FLAG(Num, Val, Str) \
Val = (Flags & (uint32_t)dxbc::RootElementFlag::Val) > 0;
@@ -210,6 +212,9 @@ 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);
#include "llvm/BinaryFormat/DXContainerConstants.def"
}
diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
index f5f7837d403780..2da4ef8db96825 100644
--- a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml
@@ -10,13 +10,29 @@ Header:
PartOffsets: [ 60 ]
Parts:
- Name: RTS0
- Size: 4
+ Size: 40
RootSignature:
- Size: 8
+ Size: 64
+ NumParameters: 1
+ Parameters:
+ - Type: Constants32Bit
+ ShaderVisibility: All
+ Constants:
+ Num32BitValues: 3
+ ShaderRegister: 1
+ RegisterSpace: 2
AllowInputAssemblerInputLayout: true
-
-#CHECK: - Name: RTS0
-#CHECK-NEXT: Size: 4
-#CHECK-NEXT: RootSignature:
-#CHECK-NEXT: Size: 8
-#CHECK-NEXT: AllowInputAssemblerInputLayout: true
+
+#CHECK: - Name: RTS0
+#CHECK-NEXT: Size: 40
+#CHECK-NEXT: RootSignature:
+#CHECK-NEXT: Size: 64
+#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 a6934915165ec3a867a69121fdf646b5416ae91b 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/2] updating test
---
llvm/include/llvm/BinaryFormat/DXContainer.h | 99 +++++++++----------
llvm/include/llvm/Object/DXContainer.h | 1 -
.../include/llvm/ObjectYAML/DXContainerYAML.h | 2 +
llvm/lib/MC/DXContainerRootSignature.cpp | 1 -
llvm/lib/ObjectYAML/DXContainerYAML.cpp | 47 ++++++++-
.../ContainerData/RootSignature-Flags.ll | 8 +-
6 files changed, 94 insertions(+), 64 deletions(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index c241ec7e87348d..5993492dfd15d6 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,19 +63,55 @@ struct ShaderHash {
void swapBytes() { sys::swapByteOrder(Flags); }
};
-<<<<<<< HEAD
-struct RootSignatureDesc {
- uint32_t Size;
- uint32_t Flags;
+#define ROOT_PARAMETER(Val, Enum) Enum = Val,
+enum class RootParameterType : uint8_t {
+#include "DXContainerConstants.def"
+};
+
+ArrayRef<EnumEntry<RootParameterType>> getRootParameterTypes();
+
+
+#define SHADER_VISIBILITY(Val, Enum) Enum = Val,
+enum class ShaderVisibilityFlag : uint8_t {
+#include "DXContainerConstants.def"
+};
+
+ArrayRef<EnumEntry<ShaderVisibilityFlag>> getShaderVisibilityFlags();
+
+struct RootConstants {
+ uint32_t ShaderRegister;
+ uint32_t RegisterSpace;
+ uint32_t Num32BitValues;
void swapBytes() {
- sys::swapByteOrder(Size);
- sys::swapByteOrder(Flags);
+ 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;
+ }
}
};
-=======
->>>>>>> b1b967db8d32 (adding support for root constants in dxcontainer for ob2jyaml and yaml2obj tools)
struct ContainerVersion {
uint16_t Major;
uint16_t Minor;
@@ -171,50 +206,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 {
@@ -556,8 +547,6 @@ 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/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index 1d6590dacadaff..e2d9f7266fcb49 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/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index 5ac90a4f3e0731..a368d5bf3634af 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -80,6 +80,8 @@ struct RootSignatureDesc {
uint32_t getEncodedFlags();
uint32_t Size;
+ uint32_t NumParameters;
+ SmallVector<dxbc::RootParameter> Parameters;
#include "llvm/BinaryFormat/DXContainerConstants.def"
};
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index df5a0dca769eb8..0ac72be0d3b667 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/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index 7d2ebef44b1bfb..9174c1f11e2a2c 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -32,10 +32,11 @@ DXContainerYAML::ShaderFeatureFlags::ShaderFeatureFlags(uint64_t FlagData) {
DXContainerYAML::RootSignatureDesc::RootSignatureDesc(
const object::DirectX::RootSignature &Data)
- : Size(Data.getSize()) {
- : 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())
+ Parameters.push_back(Param);
+
#define ROOT_ELEMENT_FLAG(Num, Val, Str) \
Val = (Flags & (uint32_t)dxbc::RootElementFlag::Val) > 0;
#include "llvm/BinaryFormat/DXContainerConstants.def"
@@ -209,10 +210,48 @@ void MappingTraits<DXContainerYAML::Signature>::mapping(
IO.mapRequired("Parameters", S.Parameters);
}
+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 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);
+}
+
+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::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/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
index b44d31c5b38574..04a4f378ecb396 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 [8 x i8] c"{{.*}}", section "RTS0", align 4
+; CHECK: @dx.rts0 = private constant [12 x i8] c"{{.*}}", section "RTS0", align 4
define void @main() #0 {
@@ -24,7 +24,9 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
; DXC: - Name: RTS0
-; DXC-NEXT: Size: 8
+; DXC-NEXT: Size: 12
; DXC-NEXT: RootSignature:
-; DXC-NEXT: Size: 8
+; DXC-NEXT: Size: 64
+; DXC-NEXT: NumParameters: 0
+; DXC-NEXT: Parameters: []
; DXC-NEXT: AllowInputAssemblerInputLayout: true
More information about the llvm-branch-commits
mailing list