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.saff...@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.saff...@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.saff...@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.saff...@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.saff...@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.saff...@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.saff...@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.saff...@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); _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits