https://github.com/inbelic updated https://github.com/llvm/llvm-project/pull/140294
>From 8889c7f28b29a1afc0d41da645216efeda30c991 Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Fri, 16 May 2025 17:45:24 +0000 Subject: [PATCH 1/3] pre-req: add keywords --- .../clang/Lex/HLSLRootSignatureTokenKinds.def | 45 ++++++++++++++++++- .../Lex/LexHLSLRootSignatureTest.cpp | 41 ++++++++++++++++- 2 files changed, 83 insertions(+), 3 deletions(-) diff --git a/clang/include/clang/Lex/HLSLRootSignatureTokenKinds.def b/clang/include/clang/Lex/HLSLRootSignatureTokenKinds.def index 9b47ec57f541b..9515bc7d847fa 100644 --- a/clang/include/clang/Lex/HLSLRootSignatureTokenKinds.def +++ b/clang/include/clang/Lex/HLSLRootSignatureTokenKinds.def @@ -53,6 +53,9 @@ #ifndef SHADER_VISIBILITY_ENUM #define SHADER_VISIBILITY_ENUM(NAME, LIT) ENUM(NAME, LIT) #endif +#ifndef FILTER_ENUM +#define FILTER_ENUM(NAME, LIT) ENUM(NAME, LIT) +#endif #ifndef TEXTURE_ADDRESS_MODE_ENUM #define TEXTURE_ADDRESS_MODE_ENUM(NAME, LIT) ENUM(NAME, LIT) #endif @@ -104,10 +107,11 @@ KEYWORD(numDescriptors) KEYWORD(offset) // StaticSampler Keywords: -KEYWORD(mipLODBias) +KEYWORD(filter) KEYWORD(addressU) KEYWORD(addressV) KEYWORD(addressW) +KEYWORD(mipLODBias) KEYWORD(maxAnisotropy) KEYWORD(minLOD) KEYWORD(maxLOD) @@ -154,6 +158,44 @@ SHADER_VISIBILITY_ENUM(Pixel, "SHADER_VISIBILITY_PIXEL") SHADER_VISIBILITY_ENUM(Amplification, "SHADER_VISIBILITY_AMPLIFICATION") SHADER_VISIBILITY_ENUM(Mesh, "SHADER_VISIBILITY_MESH") +// Filter Enums: +FILTER_ENUM(MinMagMipPoint, "FILTER_MIN_MAG_MIP_POINT") +FILTER_ENUM(MinMagPointMipLinear, "FILTER_MIN_MAG_POINT_MIP_LINEAR") +FILTER_ENUM(MinPointMagLinearMipPoint, "FILTER_MIN_POINT_MAG_LINEAR_MIP_POINT") +FILTER_ENUM(MinPointMagMipLinear, "FILTER_MIN_POINT_MAG_MIP_LINEAR") +FILTER_ENUM(MinLinearMagMipPoint, "FILTER_MIN_LINEAR_MAG_MIP_POINT") +FILTER_ENUM(MinLinearMagPointMipLinear, "FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR") +FILTER_ENUM(MinMagLinearMipPoint, "FILTER_MIN_MAG_LINEAR_MIP_POINT") +FILTER_ENUM(MinMagMipLinear, "FILTER_MIN_MAG_MIP_LINEAR") +FILTER_ENUM(Anisotropic, "FILTER_ANISOTROPIC") +FILTER_ENUM(ComparisonMinMagMipPoint, "FILTER_COMPARISON_MIN_MAG_MIP_POINT") +FILTER_ENUM(ComparisonMinMagPointMipLinear, "FILTER_COMPARISON_MIN_MAG_POINT_MIP_LINEAR") +FILTER_ENUM(ComparisonMinPointMagLinearMipPoint, "FILTER_COMPARISON_MIN_POINT_MAG_LINEAR_MIP_POINT") +FILTER_ENUM(ComparisonMinPointMagMipLinear, "FILTER_COMPARISON_MIN_POINT_MAG_MIP_LINEAR") +FILTER_ENUM(ComparisonMinLinearMagMipPoint, "FILTER_COMPARISON_MIN_LINEAR_MAG_MIP_POINT") +FILTER_ENUM(ComparisonMinLinearMagPointMipLinear, "FILTER_COMPARISON_MIN_LINEAR_MAG_POINT_MIP_LINEAR") +FILTER_ENUM(ComparisonMinMagLinearMipPoint, "FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT") +FILTER_ENUM(ComparisonMinMagMipLinear, "FILTER_COMPARISON_MIN_MAG_MIP_LINEAR") +FILTER_ENUM(ComparisonAnisotropic, "FILTER_COMPARISON_ANISOTROPIC") +FILTER_ENUM(MinimumMinMagMipPoint, "FILTER_MINIMUM_MIN_MAG_MIP_POINT") +FILTER_ENUM(MinimumMinMagPointMipLinear, "FILTER_MINIMUM_MIN_MAG_POINT_MIP_LINEAR") +FILTER_ENUM(MinimumMinPointMagLinearMipPoint, "FILTER_MINIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT") +FILTER_ENUM(MinimumMinPointMagMipLinear, "FILTER_MINIMUM_MIN_POINT_MAG_MIP_LINEAR") +FILTER_ENUM(MinimumMinLinearMagMipPoint, "FILTER_MINIMUM_MIN_LINEAR_MAG_MIP_POINT") +FILTER_ENUM(MinimumMinLinearMagPointMipLinear, "FILTER_MINIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR") +FILTER_ENUM(MinimumMinMagLinearMipPoint, "FILTER_MINIMUM_MIN_MAG_LINEAR_MIP_POINT") +FILTER_ENUM(MinimumMinMagMipLinear, "FILTER_MINIMUM_MIN_MAG_MIP_LINEAR") +FILTER_ENUM(MinimumAnisotropic, "FILTER_MINIMUM_ANISOTROPIC") +FILTER_ENUM(MaximumMinMagMipPoint, "FILTER_MAXIMUM_MIN_MAG_MIP_POINT") +FILTER_ENUM(MaximumMinMagPointMipLinear, "FILTER_MAXIMUM_MIN_MAG_POINT_MIP_LINEAR") +FILTER_ENUM(MaximumMinPointMagLinearMipPoint, "FILTER_MAXIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT") +FILTER_ENUM(MaximumMinPointMagMipLinear, "FILTER_MAXIMUM_MIN_POINT_MAG_MIP_LINEAR") +FILTER_ENUM(MaximumMinLinearMagMipPoint, "FILTER_MAXIMUM_MIN_LINEAR_MAG_MIP_POINT") +FILTER_ENUM(MaximumMinLinearMagPointMipLinear, "FILTER_MAXIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR") +FILTER_ENUM(MaximumMinMagLinearMipPoint, "FILTER_MAXIMUM_MIN_MAG_LINEAR_MIP_POINT") +FILTER_ENUM(MaximumMinMagMipLinear, "FILTER_MAXIMUM_MIN_MAG_MIP_LINEAR") +FILTER_ENUM(MaximumAnisotropic, "FILTER_MAXIMUM_ANISOTROPIC") + // Texture Address Mode Enums: TEXTURE_ADDRESS_MODE_ENUM(Wrap, "TEXTURE_ADDRESS_WRAP") TEXTURE_ADDRESS_MODE_ENUM(Mirror, "TEXTURE_ADDRESS_MIRROR") @@ -162,6 +204,7 @@ TEXTURE_ADDRESS_MODE_ENUM(Border, "TEXTURE_ADDRESS_BORDER") TEXTURE_ADDRESS_MODE_ENUM(MirrorOnce, "TEXTURE_ADDRESS_MIRRORONCE") #undef TEXTURE_ADDRESS_MODE_ENUM +#undef FILTER_ENUM #undef SHADER_VISIBILITY_ENUM #undef DESCRIPTOR_RANGE_FLAG_ENUM #undef DESCRIPTOR_RANGE_FLAG_ENUM_OFF diff --git a/clang/unittests/Lex/LexHLSLRootSignatureTest.cpp b/clang/unittests/Lex/LexHLSLRootSignatureTest.cpp index f0f22ccc29e9f..39872ea6b0a3e 100644 --- a/clang/unittests/Lex/LexHLSLRootSignatureTest.cpp +++ b/clang/unittests/Lex/LexHLSLRootSignatureTest.cpp @@ -136,8 +136,8 @@ TEST_F(LexHLSLRootSignatureTest, ValidLexAllTokensTest) { space visibility flags numDescriptors offset - mipLODBias addressU addressV addressW - maxAnisotropy minLOD maxLOD + filter addressU addressV addressW + mipLODBias maxAnisotropy minLOD maxLOD unbounded DESCRIPTOR_RANGE_OFFSET_APPEND @@ -170,6 +170,43 @@ TEST_F(LexHLSLRootSignatureTest, ValidLexAllTokensTest) { shader_visibility_amplification shader_visibility_mesh + FILTER_MIN_MAG_MIP_POINT + FILTER_MIN_MAG_POINT_MIP_LINEAR + FILTER_MIN_POINT_MAG_LINEAR_MIP_POINT + FILTER_MIN_POINT_MAG_MIP_LINEAR + FILTER_MIN_LINEAR_MAG_MIP_POINT + FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR + FILTER_MIN_MAG_LINEAR_MIP_POINT + FILTER_MIN_MAG_MIP_LINEAR + FILTER_ANISOTROPIC + FILTER_COMPARISON_MIN_MAG_MIP_POINT + FILTER_COMPARISON_MIN_MAG_POINT_MIP_LINEAR + FILTER_COMPARISON_MIN_POINT_MAG_LINEAR_MIP_POINT + FILTER_COMPARISON_MIN_POINT_MAG_MIP_LINEAR + FILTER_COMPARISON_MIN_LINEAR_MAG_MIP_POINT + FILTER_COMPARISON_MIN_LINEAR_MAG_POINT_MIP_LINEAR + FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT + FILTER_COMPARISON_MIN_MAG_MIP_LINEAR + FILTER_COMPARISON_ANISOTROPIC + FILTER_MINIMUM_MIN_MAG_MIP_POINT + FILTER_MINIMUM_MIN_MAG_POINT_MIP_LINEAR + FILTER_MINIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT + FILTER_MINIMUM_MIN_POINT_MAG_MIP_LINEAR + FILTER_MINIMUM_MIN_LINEAR_MAG_MIP_POINT + FILTER_MINIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR + FILTER_MINIMUM_MIN_MAG_LINEAR_MIP_POINT + FILTER_MINIMUM_MIN_MAG_MIP_LINEAR + FILTER_MINIMUM_ANISOTROPIC + FILTER_MAXIMUM_MIN_MAG_MIP_POINT + FILTER_MAXIMUM_MIN_MAG_POINT_MIP_LINEAR + FILTER_MAXIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT + FILTER_MAXIMUM_MIN_POINT_MAG_MIP_LINEAR + FILTER_MAXIMUM_MIN_LINEAR_MAG_MIP_POINT + FILTER_MAXIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR + FILTER_MAXIMUM_MIN_MAG_LINEAR_MIP_POINT + FILTER_MAXIMUM_MIN_MAG_MIP_LINEAR + FILTER_MAXIMUM_ANISOTROPIC + TEXTURE_ADDRESS_WRAP TEXTURE_ADDRESS_MIRROR TEXTURE_ADDRESS_CLAMP >From bb9f247c3f8ec13dd6e84393c4441d868199ea13 Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Fri, 16 May 2025 18:01:59 +0000 Subject: [PATCH 2/3] add parsing of Filter enum --- .../clang/Parse/ParseHLSLRootSignature.h | 4 +- clang/lib/Parse/ParseHLSLRootSignature.cpp | 45 +++++++++++++++++++ .../Parse/ParseHLSLRootSignatureTest.cpp | 4 ++ .../llvm/Frontend/HLSL/HLSLRootSignature.h | 40 +++++++++++++++++ 4 files changed, 92 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Parse/ParseHLSLRootSignature.h b/clang/include/clang/Parse/ParseHLSLRootSignature.h index d436265b8b37a..3af2f9bb5c754 100644 --- a/clang/include/clang/Parse/ParseHLSLRootSignature.h +++ b/clang/include/clang/Parse/ParseHLSLRootSignature.h @@ -111,10 +111,11 @@ class RootSignatureParser { struct ParsedStaticSamplerParams { std::optional<llvm::hlsl::rootsig::Register> Reg; - std::optional<float> MipLODBias; + std::optional<llvm::hlsl::rootsig::Filter> Filter; std::optional<llvm::hlsl::rootsig::TextureAddressMode> AddressU; std::optional<llvm::hlsl::rootsig::TextureAddressMode> AddressV; std::optional<llvm::hlsl::rootsig::TextureAddressMode> AddressW; + std::optional<float> MipLODBias; std::optional<uint32_t> MaxAnisotropy; std::optional<float> MinLOD; std::optional<float> MaxLOD; @@ -128,6 +129,7 @@ class RootSignatureParser { /// Parsing methods of various enums std::optional<llvm::hlsl::rootsig::ShaderVisibility> parseShaderVisibility(); + std::optional<llvm::hlsl::rootsig::Filter> parseFilter(); std::optional<llvm::hlsl::rootsig::TextureAddressMode> parseTextureAddressMode(); std::optional<llvm::hlsl::rootsig::RootDescriptorFlags> diff --git a/clang/lib/Parse/ParseHLSLRootSignature.cpp b/clang/lib/Parse/ParseHLSLRootSignature.cpp index e9373f9a82beb..0279819b84cd4 100644 --- a/clang/lib/Parse/ParseHLSLRootSignature.cpp +++ b/clang/lib/Parse/ParseHLSLRootSignature.cpp @@ -377,6 +377,9 @@ std::optional<StaticSampler> RootSignatureParser::parseStaticSampler() { Sampler.Reg = Params->Reg.value(); // Fill in optional values + if (Params->Filter.has_value()) + Sampler.Filter = Params->Filter.value(); + if (Params->AddressU.has_value()) Sampler.AddressU = Params->AddressU.value(); @@ -684,6 +687,23 @@ RootSignatureParser::parseStaticSamplerParams() { Params.Reg = Reg; } + // `filter` `=` FILTER + if (tryConsumeExpectedToken(TokenKind::kw_filter)) { + if (Params.Filter.has_value()) { + getDiags().Report(CurToken.TokLoc, diag::err_hlsl_rootsig_repeat_param) + << CurToken.TokKind; + return std::nullopt; + } + + if (consumeExpectedToken(TokenKind::pu_equal)) + return std::nullopt; + + auto Filter = parseFilter(); + if (!Filter.has_value()) + return std::nullopt; + Params.Filter = Filter; + } + // `addressU` `=` TEXTURE_ADDRESS if (tryConsumeExpectedToken(TokenKind::kw_addressU)) { if (Params.AddressU.has_value()) { @@ -909,6 +929,31 @@ RootSignatureParser::parseShaderVisibility() { return std::nullopt; } +std::optional<llvm::hlsl::rootsig::Filter> RootSignatureParser::parseFilter() { + assert(CurToken.TokKind == TokenKind::pu_equal && + "Expects to only be invoked starting at given keyword"); + + TokenKind Expected[] = { +#define FILTER_ENUM(NAME, LIT) TokenKind::en_##NAME, +#include "clang/Lex/HLSLRootSignatureTokenKinds.def" + }; + + if (!tryConsumeExpectedToken(Expected)) + return std::nullopt; + + switch (CurToken.TokKind) { +#define FILTER_ENUM(NAME, LIT) \ + case TokenKind::en_##NAME: \ + return Filter::NAME; \ + break; +#include "clang/Lex/HLSLRootSignatureTokenKinds.def" + default: + llvm_unreachable("Switch for consumed enum token was not provided"); + } + + return std::nullopt; +} + std::optional<llvm::hlsl::rootsig::TextureAddressMode> RootSignatureParser::parseTextureAddressMode() { assert(CurToken.TokKind == TokenKind::pu_equal && diff --git a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp index 6477b25550c4d..b0c667156ab6d 100644 --- a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp +++ b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp @@ -230,6 +230,7 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) { minLOD = 4.2f, mipLODBias = 0.23e+3, addressW = TEXTURE_ADDRESS_CLAMP, addressV = TEXTURE_ADDRESS_BORDER, + filter = FILTER_MAXIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT, maxLOD = 9000, addressU = TEXTURE_ADDRESS_MIRROR ) )cc"; @@ -254,6 +255,7 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) { ASSERT_TRUE(std::holds_alternative<StaticSampler>(Elem)); ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.ViewType, RegisterType::SReg); ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.Number, 0u); + ASSERT_EQ(std::get<StaticSampler>(Elem).Filter, Filter::Anisotropic); ASSERT_EQ(std::get<StaticSampler>(Elem).AddressU, TextureAddressMode::Wrap); ASSERT_EQ(std::get<StaticSampler>(Elem).AddressV, TextureAddressMode::Wrap); ASSERT_EQ(std::get<StaticSampler>(Elem).AddressW, TextureAddressMode::Wrap); @@ -267,6 +269,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) { ASSERT_TRUE(std::holds_alternative<StaticSampler>(Elem)); ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.ViewType, RegisterType::SReg); ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.Number, 0u); + ASSERT_EQ(std::get<StaticSampler>(Elem).Filter, + Filter::MaximumMinPointMagLinearMipPoint); ASSERT_EQ(std::get<StaticSampler>(Elem).AddressU, TextureAddressMode::Mirror); ASSERT_EQ(std::get<StaticSampler>(Elem).AddressV, TextureAddressMode::Border); ASSERT_EQ(std::get<StaticSampler>(Elem).AddressW, TextureAddressMode::Clamp); diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h index bb0a0d158a980..92f5d88594cc7 100644 --- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h +++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h @@ -76,6 +76,45 @@ enum class ShaderVisibility { Mesh = 7, }; +enum class Filter { + MinMagMipPoint = 0, + MinMagPointMipLinear = 0x1, + MinPointMagLinearMipPoint = 0x4, + MinPointMagMipLinear = 0x5, + MinLinearMagMipPoint = 0x10, + MinLinearMagPointMipLinear = 0x11, + MinMagLinearMipPoint = 0x14, + MinMagMipLinear = 0x15, + Anisotropic = 0x55, + ComparisonMinMagMipPoint = 0x80, + ComparisonMinMagPointMipLinear = 0x81, + ComparisonMinPointMagLinearMipPoint = 0x84, + ComparisonMinPointMagMipLinear = 0x85, + ComparisonMinLinearMagMipPoint = 0x90, + ComparisonMinLinearMagPointMipLinear = 0x91, + ComparisonMinMagLinearMipPoint = 0x94, + ComparisonMinMagMipLinear = 0x95, + ComparisonAnisotropic = 0xd5, + MinimumMinMagMipPoint = 0x100, + MinimumMinMagPointMipLinear = 0x101, + MinimumMinPointMagLinearMipPoint = 0x104, + MinimumMinPointMagMipLinear = 0x105, + MinimumMinLinearMagMipPoint = 0x110, + MinimumMinLinearMagPointMipLinear = 0x111, + MinimumMinMagLinearMipPoint = 0x114, + MinimumMinMagMipLinear = 0x115, + MinimumAnisotropic = 0x155, + MaximumMinMagMipPoint = 0x180, + MaximumMinMagPointMipLinear = 0x181, + MaximumMinPointMagLinearMipPoint = 0x184, + MaximumMinPointMagMipLinear = 0x185, + MaximumMinLinearMagMipPoint = 0x190, + MaximumMinLinearMagPointMipLinear = 0x191, + MaximumMinMagLinearMipPoint = 0x194, + MaximumMinMagMipLinear = 0x195, + MaximumAnisotropic = 0x1d5 +}; + enum class TextureAddressMode { Wrap = 1, Mirror = 2, @@ -165,6 +204,7 @@ raw_ostream &operator<<(raw_ostream &OS, const DescriptorTableClause &Clause); struct StaticSampler { Register Reg; + Filter Filter = Filter::Anisotropic; TextureAddressMode AddressU = TextureAddressMode::Wrap; TextureAddressMode AddressV = TextureAddressMode::Wrap; TextureAddressMode AddressW = TextureAddressMode::Wrap; >From 4b0bcc81e7d44f60a49b0bbdc1d1ca6f048d614d Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Wed, 28 May 2025 22:17:19 +0000 Subject: [PATCH 3/3] review: add context for enum values --- llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h index 92f5d88594cc7..29a55e326fa34 100644 --- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h +++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h @@ -27,7 +27,10 @@ class Metadata; namespace hlsl { namespace rootsig { -// Definition of the various enumerations and flags +// Definition of the various enumerations and flags. The definitions of all +// values here correspond to their description in the d3d12.h header and are +// carried over from their values in DXC. For reference: +// https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ enum class RootFlags : uint32_t { None = 0, @@ -76,6 +79,8 @@ enum class ShaderVisibility { Mesh = 7, }; +// D3D12_FILTER enumeration: +// https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ne-d3d12-d3d12_filter enum class Filter { MinMagMipPoint = 0, MinMagPointMipLinear = 0x1, _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits