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