[llvm-branch-commits] [llvm] [HLSL][RootSignature] Implement serialization of `RootConstants` and `RootFlags` (PR #141130)

Finn Plummer via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Thu May 22 13:00:58 PDT 2025


https://github.com/inbelic created https://github.com/llvm/llvm-project/pull/141130

- Implements serialization of the currently completely defined `RootElement`s, namely `RootConstants` and `RootFlags`
- Adds unit testing for the serialization methods

Resolves: https://github.com/llvm/llvm-project/issues/138190 and https://github.com/llvm/llvm-project/issues/138192

>From 92535b5601ed60798a4558a37a126083011947c7 Mon Sep 17 00:00:00 2001
From: Finn Plummer <canadienfinn at gmail.com>
Date: Thu, 22 May 2025 19:01:41 +0000
Subject: [PATCH 1/2] [HLSL][RootSignature] Add serialization for RootConstants

---
 .../llvm/Frontend/HLSL/HLSLRootSignature.h    |  2 ++
 llvm/lib/Frontend/HLSL/HLSLRootSignature.cpp  |  8 +++++
 .../Frontend/HLSLRootSignatureDumpTest.cpp    | 32 +++++++++++++++++++
 3 files changed, 42 insertions(+)

diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
index 7e7eeec0deb52..1c6d8f0fecb47 100644
--- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
+++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
@@ -85,6 +85,8 @@ struct RootConstants {
   ShaderVisibility Visibility = ShaderVisibility::All;
 };
 
+raw_ostream &operator<<(raw_ostream &OS, const RootConstants &Constants);
+
 using DescriptorType = llvm::dxil::ResourceClass;
 // Models RootDescriptor : CBV | SRV | UAV, by collecting like parameters
 struct RootDescriptor {
diff --git a/llvm/lib/Frontend/HLSL/HLSLRootSignature.cpp b/llvm/lib/Frontend/HLSL/HLSLRootSignature.cpp
index ec0d130a6767c..7e686a4629c8f 100644
--- a/llvm/lib/Frontend/HLSL/HLSLRootSignature.cpp
+++ b/llvm/lib/Frontend/HLSL/HLSLRootSignature.cpp
@@ -132,6 +132,14 @@ static raw_ostream &operator<<(raw_ostream &OS,
   return OS;
 }
 
+raw_ostream &operator<<(raw_ostream &OS, const RootConstants &Constants) {
+  OS << "RootConstants(num32BitConstants = " << Constants.Num32BitConstants
+     << ", " << Constants.Reg << ", space = " << Constants.Space
+     << ", visibility = " << Constants.Visibility << ")";
+
+  return OS;
+}
+
 raw_ostream &operator<<(raw_ostream &OS, const DescriptorTable &Table) {
   OS << "DescriptorTable(numClauses = " << Table.NumClauses
      << ", visibility = " << Table.Visibility << ")";
diff --git a/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp b/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
index 3f92fa0f05794..271bab649f0c2 100644
--- a/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
+++ b/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
@@ -108,4 +108,36 @@ TEST(HLSLRootSignatureTest, DescriptorTableDump) {
   EXPECT_EQ(Out, Expected);
 }
 
+TEST(HLSLRootSignatureTest, DefaultRootConstantsDump) {
+  RootConstants Constants;
+  Constants.Num32BitConstants = 1;
+  Constants.Reg = {RegisterType::BReg, 3};
+
+  std::string Out;
+  llvm::raw_string_ostream OS(Out);
+  OS << Constants;
+  OS.flush();
+
+  std::string Expected = "RootConstants(num32BitConstants = 1, b3, space = 0, "
+                         "visibility = All)";
+  EXPECT_EQ(Out, Expected);
+}
+
+TEST(HLSLRootSignatureTest, SetRootConstantsDump) {
+  RootConstants Constants;
+  Constants.Num32BitConstants = 983;
+  Constants.Reg = {RegisterType::BReg, 34593};
+  Constants.Space = 7;
+  Constants.Visibility = ShaderVisibility::Pixel;
+
+  std::string Out;
+  llvm::raw_string_ostream OS(Out);
+  OS << Constants;
+  OS.flush();
+
+  std::string Expected = "RootConstants(num32BitConstants = 983, b34593, "
+                         "space = 7, visibility = Pixel)";
+  EXPECT_EQ(Out, Expected);
+}
+
 } // namespace

>From c1f63194ca60e8ba7c667f3748c3034883e1a3e6 Mon Sep 17 00:00:00 2001
From: Finn Plummer <canadienfinn at gmail.com>
Date: Thu, 22 May 2025 19:33:14 +0000
Subject: [PATCH 2/2] [HLSL][RootSignature] Add serialization for RootFlags

---
 .../llvm/Frontend/HLSL/HLSLRootSignature.h    |  2 +
 llvm/lib/Frontend/HLSL/HLSLRootSignature.cpp  | 65 +++++++++++++++++++
 .../Frontend/HLSLRootSignatureDumpTest.cpp    | 37 +++++++++++
 3 files changed, 104 insertions(+)

diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
index 1c6d8f0fecb47..dbf7adf660012 100644
--- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
+++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
@@ -46,6 +46,8 @@ enum class RootFlags : uint32_t {
   ValidFlags = 0x00000fff
 };
 
+raw_ostream &operator<<(raw_ostream &OS, const RootFlags &Flags);
+
 enum class DescriptorRangeFlags : unsigned {
   None = 0,
   DescriptorsVolatile = 0x1,
diff --git a/llvm/lib/Frontend/HLSL/HLSLRootSignature.cpp b/llvm/lib/Frontend/HLSL/HLSLRootSignature.cpp
index 7e686a4629c8f..6e0e0cdcd5946 100644
--- a/llvm/lib/Frontend/HLSL/HLSLRootSignature.cpp
+++ b/llvm/lib/Frontend/HLSL/HLSLRootSignature.cpp
@@ -132,6 +132,71 @@ static raw_ostream &operator<<(raw_ostream &OS,
   return OS;
 }
 
+raw_ostream &operator<<(raw_ostream &OS, const RootFlags &Flags) {
+  OS << "RootFlags(";
+  bool FlagSet = false;
+  unsigned Remaining = llvm::to_underlying(Flags);
+  while (Remaining) {
+    unsigned Bit = 1u << llvm::countr_zero(Remaining);
+    if (Remaining & Bit) {
+      if (FlagSet)
+        OS << " | ";
+
+      switch (static_cast<RootFlags>(Bit)) {
+      case RootFlags::AllowInputAssemblerInputLayout:
+        OS << "AllowInputAssemblerInputLayout";
+        break;
+      case RootFlags::DenyVertexShaderRootAccess:
+        OS << "DenyVertexShaderRootAccess";
+        break;
+      case RootFlags::DenyHullShaderRootAccess:
+        OS << "DenyHullShaderRootAccess";
+        break;
+      case RootFlags::DenyDomainShaderRootAccess:
+        OS << "DenyDomainShaderRootAccess";
+        break;
+      case RootFlags::DenyGeometryShaderRootAccess:
+        OS << "DenyGeometryShaderRootAccess";
+        break;
+      case RootFlags::DenyPixelShaderRootAccess:
+        OS << "DenyPixelShaderRootAccess";
+        break;
+      case RootFlags::AllowStreamOutput:
+        OS << "AllowStreamOutput";
+        break;
+      case RootFlags::LocalRootSignature:
+        OS << "LocalRootSignature";
+        break;
+      case RootFlags::DenyAmplificationShaderRootAccess:
+        OS << "DenyAmplificationShaderRootAccess";
+        break;
+      case RootFlags::DenyMeshShaderRootAccess:
+        OS << "DenyMeshShaderRootAccess";
+        break;
+      case RootFlags::CBVSRVUAVHeapDirectlyIndexed:
+        OS << "CBVSRVUAVHeapDirectlyIndexed";
+        break;
+      case RootFlags::SamplerHeapDirectlyIndexed:
+        OS << "SamplerHeapDirectlyIndexed";
+        break;
+      default:
+        OS << "invalid: " << Bit;
+        break;
+      }
+
+      FlagSet = true;
+    }
+    Remaining &= ~Bit;
+  }
+
+  if (!FlagSet)
+    OS << "None";
+
+  OS << ")";
+
+  return OS;
+}
+
 raw_ostream &operator<<(raw_ostream &OS, const RootConstants &Constants) {
   OS << "RootConstants(num32BitConstants = " << Constants.Num32BitConstants
      << ", " << Constants.Reg << ", space = " << Constants.Space
diff --git a/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp b/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
index 271bab649f0c2..8597ed78b4fbb 100644
--- a/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
+++ b/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
@@ -140,4 +140,41 @@ TEST(HLSLRootSignatureTest, SetRootConstantsDump) {
   EXPECT_EQ(Out, Expected);
 }
 
+TEST(HLSLRootSignatureTest, NoneRootFlagsDump) {
+  RootFlags Flags = RootFlags::None;
+
+  std::string Out;
+  llvm::raw_string_ostream OS(Out);
+  OS << Flags;
+  OS.flush();
+
+  std::string Expected = "RootFlags(None)";
+  EXPECT_EQ(Out, Expected);
+}
+
+TEST(HLSLRootSignatureTest, AllRootFlagsDump) {
+  RootFlags Flags = RootFlags::ValidFlags;
+
+  std::string Out;
+  llvm::raw_string_ostream OS(Out);
+  OS << Flags;
+  OS.flush();
+
+  std::string Expected = "RootFlags("
+                         "AllowInputAssemblerInputLayout | "
+                         "DenyVertexShaderRootAccess | "
+                         "DenyHullShaderRootAccess | "
+                         "DenyDomainShaderRootAccess | "
+                         "DenyGeometryShaderRootAccess | "
+                         "DenyPixelShaderRootAccess | "
+                         "AllowStreamOutput | "
+                         "LocalRootSignature | "
+                         "DenyAmplificationShaderRootAccess | "
+                         "DenyMeshShaderRootAccess | "
+                         "CBVSRVUAVHeapDirectlyIndexed | "
+                         "SamplerHeapDirectlyIndexed)";
+
+  EXPECT_EQ(Out, Expected);
+}
+
 } // namespace



More information about the llvm-branch-commits mailing list