[llvm-branch-commits] [llvm] [DXContainer] Obj2yaml support for root constants (PR #124813)

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Wed Jan 29 16:34:30 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/3] 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/3] 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/3] 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



More information about the llvm-branch-commits mailing list