[llvm-branch-commits] [llvm] [DXIL] Add support for root signature Constants element Generation in DXContainer (PR #124967)

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Thu Jan 30 16:39:08 PST 2025


https://github.com/joaosaffran updated https://github.com/llvm/llvm-project/pull/124967

>From 086e0491a055952d094d0c0c2b886f324166613e 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/8] adding support for root constants in dxcontainer for
 ob2jyaml and yaml2obj tools

---
 llvm/include/llvm/BinaryFormat/DXContainer.h | 47 ++++++++++++++++++++
 llvm/include/llvm/Object/DXContainer.h       |  1 +
 llvm/lib/ObjectYAML/DXContainerYAML.cpp      | 39 ++++++++++++++++
 3 files changed, 87 insertions(+)

diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 5993492dfd15d6..8946be6908309d 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 {
@@ -206,6 +207,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 {
@@ -547,6 +592,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/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index e2d9f7266fcb49..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 {
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index 9174c1f11e2a2c..618a9a8a52bda8 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -258,6 +258,33 @@ void MappingTraits<DXContainerYAML::RootSignatureDesc>::mapping(
 #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);
@@ -361,6 +388,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) {

>From f304938f15f0e8c39fa74fb6c99405acec757eaf 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/8] updating test

---
 llvm/include/llvm/BinaryFormat/DXContainer.h | 45 --------------------
 llvm/include/llvm/Object/DXContainer.h       |  1 -
 2 files changed, 46 deletions(-)

diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 8946be6908309d..9248a981c5e24c 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 {
@@ -207,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 {
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 {

>From 26e4ba043b684717328bfd2f76abc8a08be30dfa 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/8] fixing tests

---
 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
index 04a4f378ecb396..1e2bb1b4c84d80 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 {

>From 6aabbb8e378c6aca9c3d61e1e1b09f87eb473b06 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 30 Jan 2025 00:42:27 +0000
Subject: [PATCH 4/8] formating

---
 llvm/include/llvm/BinaryFormat/DXContainer.h  |  7 +++
 .../llvm/MC/DXContainerRootSignature.h        |  3 +-
 llvm/lib/MC/DXContainerRootSignature.cpp      |  4 ++
 .../lib/Target/DirectX/DXContainerGlobals.cpp | 17 +++++++
 llvm/lib/Target/DirectX/DXILRootSignature.cpp | 51 +++++++++++++++++--
 llvm/lib/Target/DirectX/DXILRootSignature.h   | 38 ++++++++++++++
 .../ContainerData/RootSignature-Flags.ll      | 30 +++++++----
 7 files changed, 134 insertions(+), 16 deletions(-)

diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 9248a981c5e24c..4310655218e28f 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -91,6 +91,13 @@ struct RootConstants {
 };
 
 struct RootParameter {
+  RootParameter() = default;
+  RootParameter(RootConstants RootConstant, ShaderVisibilityFlag Visibility) {
+    ParameterType = RootParameterType::Constants32Bit;
+    Constants = RootConstant;
+    ShaderVisibility = Visibility;
+  }
+  
   RootParameterType ParameterType;
   union {
     RootConstants Constants;
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index 9102137c14b473..e797953f2c3067 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -8,7 +8,6 @@
 
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/BinaryFormat/DXContainer.h"
-#include <cstdint>
 #include <limits>
 
 namespace llvm {
@@ -22,6 +21,8 @@ struct RootSignatureHeader {
 
   void swapBytes();
   void write(raw_ostream &OS);
+
+  void pushPart(dxbc::RootParameter Part);
 };
 } // namespace mcdxbc
 } // namespace llvm
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 0ac72be0d3b667..5ec9da28f8ffa2 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -30,3 +30,7 @@ void RootSignatureHeader::write(raw_ostream &OS) {
       OS.write(reinterpret_cast<const char *>(&Param), BindingSize);
   }
 }
+
+void RootSignatureHeader::pushPart(dxbc::RootParameter Param){
+  Parameters.push_back(Param);
+}
diff --git a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
index 37108f92718df8..045325455e8002 100644
--- a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
+++ b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
@@ -72,6 +72,23 @@ class DXContainerGlobals : public llvm::ModulePass {
 
 } // namespace
 
+static dxbc::RootParameter constructHeaderPart(const RootSignaturePart &Part) {
+  
+  dxbc::ShaderVisibilityFlag Visibility = static_cast<dxbc::ShaderVisibilityFlag>(Part.Visibility);
+
+  switch(Part.Type){
+
+  case PartType::Constants:{
+
+    return dxbc::RootParameter(dxbc::RootConstants {
+      Part.Constants.ShaderRegistry,
+      Part.Constants.RegistrySpace,
+      Part.Constants.Number32BitValues
+    }, Visibility);
+  } break;
+  }
+}
+
 bool DXContainerGlobals::runOnModule(Module &M) {
   llvm::SmallVector<GlobalValue *> Globals;
   Globals.push_back(getFeatureFlags(M));
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index c86be5bd9eb676..29fa611e5311ca 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -26,13 +26,23 @@ static bool reportError(Twine Message) {
   return true;
 }
 
+
+static bool isValidShaderVisibility(uint32_t V) {
+    return V < static_cast<uint32_t>(ShaderVisibility::MAX_VALUE);
+}
+
+
+static uint64_t extractInt(MDNode *Node, unsigned int I) {
+  assert(I > 0 && I < Node->getNumOperands() && "Invalid operand Index");
+  return mdconst::extract<ConstantInt>(Node->getOperand(I))->getZExtValue();
+}
+
+
 static bool parseRootFlags(ModuleRootSignature *MRS, MDNode *RootFlagNode) {
 
   if (RootFlagNode->getNumOperands() != 2)
     return reportError("Invalid format for RootFlag Element");
-
-  auto *Flag = mdconst::extract<ConstantInt>(RootFlagNode->getOperand(1));
-  uint32_t Value = Flag->getZExtValue();
+  uint64_t Value = extractInt(RootFlagNode, 1);
 
   // Root Element validation, as specified:
   // https://github.com/llvm/wg-hlsl/blob/main/proposals/0002-root-signature-in-clang.md#validations-during-dxil-generation
@@ -43,6 +53,36 @@ static bool parseRootFlags(ModuleRootSignature *MRS, MDNode *RootFlagNode) {
   return false;
 }
 
+static bool parseRootConstants(ModuleRootSignature *MRS, MDNode *RootFlagNode) {
+  assert(RootFlagNode->getNumOperands() == 5 &&
+         "Invalid format for RootFlag Element");
+  
+  uint32_t MaybeShaderVisibility  = extractInt(RootFlagNode, 1);
+  assert(isValidShaderVisibility(MaybeShaderVisibility) && "Invalid shader visibility value");
+
+  ShaderVisibility Visibility = static_cast<ShaderVisibility>(MaybeShaderVisibility);
+  
+  uint32_t ShaderRegistry  = extractInt(RootFlagNode, 2);
+  uint32_t RegisterSpace  = extractInt(RootFlagNode, 3);
+  uint32_t Num32BitsValue  = extractInt(RootFlagNode, 4);
+
+  RootConstants Constant {
+    ShaderRegistry,
+    RegisterSpace,
+    Num32BitsValue
+  };
+
+  RootSignaturePart Part {
+    PartType::Constants,
+    {Constant},
+    Visibility
+  };
+
+  MRS->pushPart(Part);
+
+  return false;
+}
+
 static bool parseRootSignatureElement(ModuleRootSignature *MRS,
                                       MDNode *Element) {
   MDString *ElementText = cast<MDString>(Element->getOperand(0));
@@ -68,7 +108,10 @@ static bool parseRootSignatureElement(ModuleRootSignature *MRS,
     break;
   }
 
-  case RootSignatureElementKind::RootConstants:
+  case RootSignatureElementKind::RootConstants:{
+    return parseRootConstants(MRS, Element);
+    break;
+  }
   case RootSignatureElementKind::RootDescriptor:
   case RootSignatureElementKind::DescriptorTable:
   case RootSignatureElementKind::StaticSampler:
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index f89fb0f00b5a4d..501c9227f3c5c6 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -12,9 +12,11 @@
 ///
 //===----------------------------------------------------------------------===//
 
+#include "llvm/ADT/SmallVector.h"
 #include "llvm/IR/Metadata.h"
 #include "llvm/IR/PassManager.h"
 #include "llvm/Pass.h"
+#include <cstdint>
 #include <optional>
 
 namespace llvm {
@@ -29,14 +31,50 @@ enum class RootSignatureElementKind {
   StaticSampler = 5
 };
 
+enum class PartType {
+  Constants = 0
+};
+
+enum class ShaderVisibility : uint32_t {
+  SHADER_VISIBILITY_ALL = 0,
+  SHADER_VISIBILITY_VERTEX = 1,
+  SHADER_VISIBILITY_HULL = 2,
+  SHADER_VISIBILITY_DOMAIN = 3,
+  SHADER_VISIBILITY_GEOMETRY =4 ,
+  SHADER_VISIBILITY_PIXEL = 5,
+  SHADER_VISIBILITY_AMPLIFICATION = 6,
+  SHADER_VISIBILITY_MESH = 7,
+  // not a flag
+  MAX_VALUE = 8
+};
+
+struct RootConstants {
+  uint32_t ShaderRegistry;
+  uint32_t RegistrySpace;
+  uint32_t Number32BitValues;
+};
+
+struct RootSignaturePart {
+    PartType Type;
+    union {
+      RootConstants Constants;
+    };
+    ShaderVisibility Visibility;
+};
+
 struct ModuleRootSignature {
   uint32_t Flags;
+  SmallVector<RootSignaturePart> Parts;
 
   ModuleRootSignature() = default;
 
   bool parse(NamedMDNode *Root);
 
   static ModuleRootSignature analyzeModule(Module &M);
+
+  void pushPart(RootSignaturePart Part) {
+    Parts.push_back(Part);
+  }
 };
 
 class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
index 1e2bb1b4c84d80..7819e4fe810628 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 [40 x i8]  c"{{.*}}", section "RTS0", align 4
 
 
 define void @main() #0 {
@@ -19,14 +19,22 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
 
 !dx.rootsignatures = !{!2} ; list of function/root signature pairs
 !2 = !{ ptr @main, !3 } ; function, root signature
-!3 = !{ !4 } ; list of root signature elements
+!3 = !{ !4, !5 } ; list of root signature elements
 !4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
-
-
-; DXC:    - Name: RTS0
-; DXC-NEXT: Size: 12
-; DXC-NEXT: RootSignature:
-; DXC-NEXT:   Size: 64
-; DXC-NEXT:   NumParameters: 0 
-; DXC-NEXT:   Parameters: [] 
-; DXC-NEXT:   AllowInputAssemblerInputLayout: true
+!5 = !{ !"RootConstants", i32 0, i32 1, i32 2, i32 3 }
+
+
+; DXC:       - Name:            RTS0
+; DXC-NEXT:    Size:            40
+; DXC-NEXT:    RootSignature:
+; DXC-NEXT:      Size:            64
+; DXC-NEXT:      Version:         1
+; DXC-NEXT:      NumParameters:   1
+; DXC-NEXT:      Parameters:
+; DXC-NEXT:        - Type:            Constants32Bit
+; DXC-NEXT:          ShaderVisibility: All
+; DXC-NEXT:          Constants:
+; DXC-NEXT:            Num32BitValues:  3
+; DXC-NEXT:            ShaderRegister:  1
+; DXC-NEXT:            RegisterSpace:   2
+; DXC-NEXT:      AllowInputAssemblerInputLayout: true

>From 7bc2b4f4bb88e570538e3faf421c78edf3ae52d7 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 29 Jan 2025 00:01:43 +0000
Subject: [PATCH 5/8] adding root constants support to DXIL

---
 llvm/include/llvm/BinaryFormat/DXContainer.h  |  2 +-
 llvm/lib/MC/DXContainerRootSignature.cpp      |  2 +-
 .../lib/Target/DirectX/DXContainerGlobals.cpp | 19 ++++----
 llvm/lib/Target/DirectX/DXILRootSignature.cpp | 43 ++++++++-----------
 llvm/lib/Target/DirectX/DXILRootSignature.h   | 20 ++++-----
 5 files changed, 37 insertions(+), 49 deletions(-)

diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 4310655218e28f..b4cc4dba325ff2 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -97,7 +97,7 @@ struct RootParameter {
     Constants = RootConstant;
     ShaderVisibility = Visibility;
   }
-  
+
   RootParameterType ParameterType;
   union {
     RootConstants Constants;
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 5ec9da28f8ffa2..b4370ef768a945 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -31,6 +31,6 @@ void RootSignatureHeader::write(raw_ostream &OS) {
   }
 }
 
-void RootSignatureHeader::pushPart(dxbc::RootParameter Param){
+void RootSignatureHeader::pushPart(dxbc::RootParameter Param) {
   Parameters.push_back(Param);
 }
diff --git a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
index 045325455e8002..1dfddcd4df2269 100644
--- a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
+++ b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
@@ -73,18 +73,19 @@ class DXContainerGlobals : public llvm::ModulePass {
 } // namespace
 
 static dxbc::RootParameter constructHeaderPart(const RootSignaturePart &Part) {
-  
-  dxbc::ShaderVisibilityFlag Visibility = static_cast<dxbc::ShaderVisibilityFlag>(Part.Visibility);
 
-  switch(Part.Type){
+  dxbc::ShaderVisibilityFlag Visibility =
+      static_cast<dxbc::ShaderVisibilityFlag>(Part.Visibility);
 
-  case PartType::Constants:{
+  switch (Part.Type) {
 
-    return dxbc::RootParameter(dxbc::RootConstants {
-      Part.Constants.ShaderRegistry,
-      Part.Constants.RegistrySpace,
-      Part.Constants.Number32BitValues
-    }, Visibility);
+  case PartType::Constants: {
+
+    return dxbc::RootParameter(
+        dxbc::RootConstants{Part.Constants.ShaderRegistry,
+                            Part.Constants.RegistrySpace,
+                            Part.Constants.Number32BitValues},
+        Visibility);
   } break;
   }
 }
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 29fa611e5311ca..b4996c9a47d688 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -26,18 +26,15 @@ static bool reportError(Twine Message) {
   return true;
 }
 
-
 static bool isValidShaderVisibility(uint32_t V) {
-    return V < static_cast<uint32_t>(ShaderVisibility::MAX_VALUE);
+  return V < static_cast<uint32_t>(ShaderVisibility::MAX_VALUE);
 }
 
-
 static uint64_t extractInt(MDNode *Node, unsigned int I) {
   assert(I > 0 && I < Node->getNumOperands() && "Invalid operand Index");
   return mdconst::extract<ConstantInt>(Node->getOperand(I))->getZExtValue();
 }
 
-
 static bool parseRootFlags(ModuleRootSignature *MRS, MDNode *RootFlagNode) {
 
   if (RootFlagNode->getNumOperands() != 2)
@@ -56,27 +53,21 @@ static bool parseRootFlags(ModuleRootSignature *MRS, MDNode *RootFlagNode) {
 static bool parseRootConstants(ModuleRootSignature *MRS, MDNode *RootFlagNode) {
   assert(RootFlagNode->getNumOperands() == 5 &&
          "Invalid format for RootFlag Element");
-  
-  uint32_t MaybeShaderVisibility  = extractInt(RootFlagNode, 1);
-  assert(isValidShaderVisibility(MaybeShaderVisibility) && "Invalid shader visibility value");
-
-  ShaderVisibility Visibility = static_cast<ShaderVisibility>(MaybeShaderVisibility);
-  
-  uint32_t ShaderRegistry  = extractInt(RootFlagNode, 2);
-  uint32_t RegisterSpace  = extractInt(RootFlagNode, 3);
-  uint32_t Num32BitsValue  = extractInt(RootFlagNode, 4);
-
-  RootConstants Constant {
-    ShaderRegistry,
-    RegisterSpace,
-    Num32BitsValue
-  };
-
-  RootSignaturePart Part {
-    PartType::Constants,
-    {Constant},
-    Visibility
-  };
+
+  uint32_t MaybeShaderVisibility = extractInt(RootFlagNode, 1);
+  assert(isValidShaderVisibility(MaybeShaderVisibility) &&
+         "Invalid shader visibility value");
+
+  ShaderVisibility Visibility =
+      static_cast<ShaderVisibility>(MaybeShaderVisibility);
+
+  uint32_t ShaderRegistry = extractInt(RootFlagNode, 2);
+  uint32_t RegisterSpace = extractInt(RootFlagNode, 3);
+  uint32_t Num32BitsValue = extractInt(RootFlagNode, 4);
+
+  RootConstants Constant{ShaderRegistry, RegisterSpace, Num32BitsValue};
+
+  RootSignaturePart Part{PartType::Constants, {Constant}, Visibility};
 
   MRS->pushPart(Part);
 
@@ -108,7 +99,7 @@ static bool parseRootSignatureElement(ModuleRootSignature *MRS,
     break;
   }
 
-  case RootSignatureElementKind::RootConstants:{
+  case RootSignatureElementKind::RootConstants: {
     return parseRootConstants(MRS, Element);
     break;
   }
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index 501c9227f3c5c6..5b36cbf75c389e 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -31,16 +31,14 @@ enum class RootSignatureElementKind {
   StaticSampler = 5
 };
 
-enum class PartType {
-  Constants = 0
-};
+enum class PartType { Constants = 0 };
 
 enum class ShaderVisibility : uint32_t {
   SHADER_VISIBILITY_ALL = 0,
   SHADER_VISIBILITY_VERTEX = 1,
   SHADER_VISIBILITY_HULL = 2,
   SHADER_VISIBILITY_DOMAIN = 3,
-  SHADER_VISIBILITY_GEOMETRY =4 ,
+  SHADER_VISIBILITY_GEOMETRY = 4,
   SHADER_VISIBILITY_PIXEL = 5,
   SHADER_VISIBILITY_AMPLIFICATION = 6,
   SHADER_VISIBILITY_MESH = 7,
@@ -55,11 +53,11 @@ struct RootConstants {
 };
 
 struct RootSignaturePart {
-    PartType Type;
-    union {
-      RootConstants Constants;
-    };
-    ShaderVisibility Visibility;
+  PartType Type;
+  union {
+    RootConstants Constants;
+  };
+  ShaderVisibility Visibility;
 };
 
 struct ModuleRootSignature {
@@ -72,9 +70,7 @@ struct ModuleRootSignature {
 
   static ModuleRootSignature analyzeModule(Module &M);
 
-  void pushPart(RootSignaturePart Part) {
-    Parts.push_back(Part);
-  }
+  void pushPart(RootSignaturePart Part) { Parts.push_back(Part); }
 };
 
 class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {

>From b7838a140cbdd39b5468c5cc25cdbe6950bac329 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 29 Jan 2025 18:19:20 +0000
Subject: [PATCH 6/8] clean up

---
 llvm/lib/Target/DirectX/DXILRootSignature.h | 1 -
 1 file changed, 1 deletion(-)

diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index 5b36cbf75c389e..33e4f3b033f315 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -16,7 +16,6 @@
 #include "llvm/IR/Metadata.h"
 #include "llvm/IR/PassManager.h"
 #include "llvm/Pass.h"
-#include <cstdint>
 #include <optional>
 
 namespace llvm {

>From 7ee27e604cd77667c856d36a8a5b937660d27088 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 7/8] removing version

---
 llvm/lib/ObjectYAML/DXContainerYAML.cpp       | 38 -------------------
 .../lib/Target/DirectX/DXContainerGlobals.cpp |  4 ++
 .../ContainerData/RootSignature-Flags.ll      |  5 +--
 3 files changed, 6 insertions(+), 41 deletions(-)

diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index 618a9a8a52bda8..3f6944f93ed6f9 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -210,25 +210,6 @@ 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())
@@ -241,13 +222,6 @@ void ScalarEnumerationTraits<dxbc::ShaderVisibilityFlag>::enumeration(
     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) {
@@ -388,18 +362,6 @@ 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/lib/Target/DirectX/DXContainerGlobals.cpp b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
index 1dfddcd4df2269..7c229ace5e502c 100644
--- a/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
+++ b/llvm/lib/Target/DirectX/DXContainerGlobals.cpp
@@ -181,6 +181,10 @@ void DXContainerGlobals::addRootSignature(Module &M,
   RootSignatureHeader RSH;
   RSH.Flags = MRS->Flags;
 
+  for (const auto &Part : MRS->Parts) {
+    RSH.pushPart(constructHeaderPart(Part));
+  }
+
   RSH.write(OS);
 
   Constant *Constant =
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
index 7819e4fe810628..9bedc891d233f2 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 [40 x i8]  c"{{.*}}", section "RTS0", align 4
+; CHECK: @dx.rts0 = private constant [36 x i8]  c"{{.*}}", section "RTS0", align 4
 
 
 define void @main() #0 {
@@ -25,10 +25,9 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
 
 
 ; DXC:       - Name:            RTS0
-; DXC-NEXT:    Size:            40
+; DXC-NEXT:    Size:            36
 ; DXC-NEXT:    RootSignature:
 ; DXC-NEXT:      Size:            64
-; DXC-NEXT:      Version:         1
 ; DXC-NEXT:      NumParameters:   1
 ; DXC-NEXT:      Parameters:
 ; DXC-NEXT:        - Type:            Constants32Bit

>From 288bbf5e382cd6bc97c748e9a28deb3b94328102 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Fri, 31 Jan 2025 00:38:43 +0000
Subject: [PATCH 8/8] formating

---
 llvm/include/llvm/BinaryFormat/DXContainer.h | 1 -
 llvm/lib/ObjectYAML/DXContainerYAML.cpp      | 1 -
 2 files changed, 2 deletions(-)

diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index b4cc4dba325ff2..f4957a59bcd70e 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -70,7 +70,6 @@ enum class RootParameterType : uint8_t {
 
 ArrayRef<EnumEntry<RootParameterType>> getRootParameterTypes();
 
-
 #define SHADER_VISIBILITY(Val, Enum) Enum = Val,
 enum class ShaderVisibilityFlag : uint8_t {
 #include "DXContainerConstants.def"
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index 3f6944f93ed6f9..3173917f640113 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -222,7 +222,6 @@ void ScalarEnumerationTraits<dxbc::ShaderVisibilityFlag>::enumeration(
     IO.enumCase(Value, E.Name.str().c_str(), E.Value);
 }
 
-
 void MappingTraits<DXContainerYAML::RootSignatureDesc>::mapping(
     IO &IO, DXContainerYAML::RootSignatureDesc &S) {
   IO.mapRequired("Size", S.Size);



More information about the llvm-branch-commits mailing list