[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