https://github.com/inbelic updated https://github.com/llvm/llvm-project/pull/140291
>From d6148b7d9815c2543f37d50a7a611e482c99b91c Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Fri, 16 May 2025 16:08:36 +0000 Subject: [PATCH 1/8] pre-req: add keywords --- clang/include/clang/Lex/HLSLRootSignatureTokenKinds.def | 3 +++ clang/unittests/Lex/LexHLSLRootSignatureTest.cpp | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Lex/HLSLRootSignatureTokenKinds.def b/clang/include/clang/Lex/HLSLRootSignatureTokenKinds.def index 5d16eaa5b72f6..7ca131349fed4 100644 --- a/clang/include/clang/Lex/HLSLRootSignatureTokenKinds.def +++ b/clang/include/clang/Lex/HLSLRootSignatureTokenKinds.def @@ -102,6 +102,9 @@ KEYWORD(offset) // StaticSampler Keywords: KEYWORD(mipLODBias) +KEYWORD(maxAnisotropy) +KEYWORD(minLOD) +KEYWORD(maxLOD) // Unbounded Enum: UNBOUNDED_ENUM(unbounded, "unbounded") diff --git a/clang/unittests/Lex/LexHLSLRootSignatureTest.cpp b/clang/unittests/Lex/LexHLSLRootSignatureTest.cpp index b610b8f10f8da..575a97e75a05d 100644 --- a/clang/unittests/Lex/LexHLSLRootSignatureTest.cpp +++ b/clang/unittests/Lex/LexHLSLRootSignatureTest.cpp @@ -136,7 +136,7 @@ TEST_F(LexHLSLRootSignatureTest, ValidLexAllTokensTest) { space visibility flags numDescriptors offset - mipLODBias + mipLODBias maxAnisotropy minLOD maxLOD unbounded DESCRIPTOR_RANGE_OFFSET_APPEND >From 79d817fe7d8b0c754ff9ea70feb077c65f8d2a25 Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Fri, 16 May 2025 16:10:05 +0000 Subject: [PATCH 2/8] add parsing for maxAnisotropy --- .../clang/Parse/ParseHLSLRootSignature.h | 1 + clang/lib/Parse/ParseHLSLRootSignature.cpp | 20 +++++++++++++++++++ .../llvm/Frontend/HLSL/HLSLRootSignature.h | 1 + 3 files changed, 22 insertions(+) diff --git a/clang/include/clang/Parse/ParseHLSLRootSignature.h b/clang/include/clang/Parse/ParseHLSLRootSignature.h index c12b022a030ef..9fc991cfabc6d 100644 --- a/clang/include/clang/Parse/ParseHLSLRootSignature.h +++ b/clang/include/clang/Parse/ParseHLSLRootSignature.h @@ -112,6 +112,7 @@ class RootSignatureParser { struct ParsedStaticSamplerParams { std::optional<llvm::hlsl::rootsig::Register> Reg; std::optional<float> MipLODBias; + std::optional<uint32_t> MaxAnisotropy; }; std::optional<ParsedStaticSamplerParams> parseStaticSamplerParams(); diff --git a/clang/lib/Parse/ParseHLSLRootSignature.cpp b/clang/lib/Parse/ParseHLSLRootSignature.cpp index db2e922160062..41e4b31d8ff84 100644 --- a/clang/lib/Parse/ParseHLSLRootSignature.cpp +++ b/clang/lib/Parse/ParseHLSLRootSignature.cpp @@ -384,6 +384,9 @@ std::optional<StaticSampler> RootSignatureParser::parseStaticSampler() { if (Params->MipLODBias.has_value()) Sampler.MipLODBias = Params->MipLODBias.value(); + if (Params->MaxAnisotropy.has_value()) + Sampler.MaxAnisotropy= Params->MaxAnisotropy.value(); + if (consumeExpectedToken(TokenKind::pu_r_paren, diag::err_hlsl_unexpected_end_of_params, /*param of=*/TokenKind::kw_StaticSampler)) @@ -686,6 +689,23 @@ RootSignatureParser::parseStaticSamplerParams() { return std::nullopt; Params.MipLODBias = (float)*MipLODBias; } + + // `maxAnisotropy` `=` POS_INT + if (tryConsumeExpectedToken(TokenKind::kw_maxAnisotropy)) { + if (Params.MaxAnisotropy.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 MaxAnisotropy = parseUIntParam(); + if (!MaxAnisotropy.has_value()) + return std::nullopt; + Params.MaxAnisotropy = MaxAnisotropy; + } } while (tryConsumeExpectedToken(TokenKind::pu_comma)); return Params; diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h index 6b4da48a302bc..b09ea688627d6 100644 --- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h +++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h @@ -161,6 +161,7 @@ struct DescriptorTableClause { struct StaticSampler { Register Reg; float MipLODBias = 0.f; + uint32_t MaxAnisotropy = 16; }; /// Models RootElement : RootFlags | RootConstants | RootParam >From 4ed8cdd9f0d5166c6e391406aa9d7337e750a39c Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Fri, 16 May 2025 16:13:37 +0000 Subject: [PATCH 3/8] add parsing for minLOD --- .../clang/Parse/ParseHLSLRootSignature.h | 1 + clang/lib/Parse/ParseHLSLRootSignature.cpp | 20 +++++++++++++++++++ .../llvm/Frontend/HLSL/HLSLRootSignature.h | 1 + 3 files changed, 22 insertions(+) diff --git a/clang/include/clang/Parse/ParseHLSLRootSignature.h b/clang/include/clang/Parse/ParseHLSLRootSignature.h index 9fc991cfabc6d..8c4a945d440e5 100644 --- a/clang/include/clang/Parse/ParseHLSLRootSignature.h +++ b/clang/include/clang/Parse/ParseHLSLRootSignature.h @@ -113,6 +113,7 @@ class RootSignatureParser { std::optional<llvm::hlsl::rootsig::Register> Reg; std::optional<float> MipLODBias; std::optional<uint32_t> MaxAnisotropy; + std::optional<float> MinLOD; }; std::optional<ParsedStaticSamplerParams> parseStaticSamplerParams(); diff --git a/clang/lib/Parse/ParseHLSLRootSignature.cpp b/clang/lib/Parse/ParseHLSLRootSignature.cpp index 41e4b31d8ff84..1d82ffd2ec8f9 100644 --- a/clang/lib/Parse/ParseHLSLRootSignature.cpp +++ b/clang/lib/Parse/ParseHLSLRootSignature.cpp @@ -387,6 +387,9 @@ std::optional<StaticSampler> RootSignatureParser::parseStaticSampler() { if (Params->MaxAnisotropy.has_value()) Sampler.MaxAnisotropy= Params->MaxAnisotropy.value(); + if (Params->MinLOD.has_value()) + Sampler.MinLOD= Params->MinLOD.value(); + if (consumeExpectedToken(TokenKind::pu_r_paren, diag::err_hlsl_unexpected_end_of_params, /*param of=*/TokenKind::kw_StaticSampler)) @@ -706,6 +709,23 @@ RootSignatureParser::parseStaticSamplerParams() { return std::nullopt; Params.MaxAnisotropy = MaxAnisotropy; } + + // `minLOD` `=` NUMBER + if (tryConsumeExpectedToken(TokenKind::kw_minLOD)) { + if (Params.MinLOD.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 MinLOD= parseFloatParam(); + if (!MinLOD.has_value()) + return std::nullopt; + Params.MinLOD = MinLOD; + } } while (tryConsumeExpectedToken(TokenKind::pu_comma)); return Params; diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h index b09ea688627d6..6e1552ee0e3ab 100644 --- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h +++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h @@ -162,6 +162,7 @@ struct StaticSampler { Register Reg; float MipLODBias = 0.f; uint32_t MaxAnisotropy = 16; + float MinLOD = 0.f; }; /// Models RootElement : RootFlags | RootConstants | RootParam >From 1b337eaec93d432347cd6da44ac92699d0c181a9 Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Fri, 16 May 2025 16:14:25 +0000 Subject: [PATCH 4/8] add parsing for maxLOD --- .../clang/Parse/ParseHLSLRootSignature.h | 1 + clang/lib/Parse/ParseHLSLRootSignature.cpp | 20 +++++++++++++++++++ .../llvm/Frontend/HLSL/HLSLRootSignature.h | 1 + 3 files changed, 22 insertions(+) diff --git a/clang/include/clang/Parse/ParseHLSLRootSignature.h b/clang/include/clang/Parse/ParseHLSLRootSignature.h index 8c4a945d440e5..e62d5de948a44 100644 --- a/clang/include/clang/Parse/ParseHLSLRootSignature.h +++ b/clang/include/clang/Parse/ParseHLSLRootSignature.h @@ -114,6 +114,7 @@ class RootSignatureParser { std::optional<float> MipLODBias; std::optional<uint32_t> MaxAnisotropy; std::optional<float> MinLOD; + std::optional<float> MaxLOD; }; std::optional<ParsedStaticSamplerParams> parseStaticSamplerParams(); diff --git a/clang/lib/Parse/ParseHLSLRootSignature.cpp b/clang/lib/Parse/ParseHLSLRootSignature.cpp index 1d82ffd2ec8f9..95935bb8e6424 100644 --- a/clang/lib/Parse/ParseHLSLRootSignature.cpp +++ b/clang/lib/Parse/ParseHLSLRootSignature.cpp @@ -390,6 +390,9 @@ std::optional<StaticSampler> RootSignatureParser::parseStaticSampler() { if (Params->MinLOD.has_value()) Sampler.MinLOD= Params->MinLOD.value(); + if (Params->MaxLOD.has_value()) + Sampler.MaxLOD= Params->MaxLOD.value(); + if (consumeExpectedToken(TokenKind::pu_r_paren, diag::err_hlsl_unexpected_end_of_params, /*param of=*/TokenKind::kw_StaticSampler)) @@ -726,6 +729,23 @@ RootSignatureParser::parseStaticSamplerParams() { return std::nullopt; Params.MinLOD = MinLOD; } + + // `maxLOD` `=` NUMBER + if (tryConsumeExpectedToken(TokenKind::kw_maxLOD)) { + if (Params.MaxLOD.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 MaxLOD= parseFloatParam(); + if (!MaxLOD.has_value()) + return std::nullopt; + Params.MaxLOD = MaxLOD; + } } while (tryConsumeExpectedToken(TokenKind::pu_comma)); return Params; diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h index 6e1552ee0e3ab..f1da4c7998c7e 100644 --- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h +++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h @@ -163,6 +163,7 @@ struct StaticSampler { float MipLODBias = 0.f; uint32_t MaxAnisotropy = 16; float MinLOD = 0.f; + float MaxLOD = 3.402823466e+38f; }; /// Models RootElement : RootFlags | RootConstants | RootParam >From 94e87389150f36f1ab6bc45ca573d545fa07f0cb Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Fri, 16 May 2025 16:21:35 +0000 Subject: [PATCH 5/8] add testing of setting parameters --- .../Parse/ParseHLSLRootSignatureTest.cpp | 23 +++++++++++++++++-- .../llvm/Frontend/HLSL/HLSLRootSignature.h | 2 +- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp index 539232e0bf2c2..b4ed634bb4d75 100644 --- a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp +++ b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp @@ -225,7 +225,11 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseDTClausesTest) { TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) { const llvm::StringLiteral Source = R"cc( - StaticSampler(s0, mipLODBias = 0) + StaticSampler(s0), + StaticSampler(s0, maxAnisotropy = 3, + minLOD = 4.2f, mipLODBias = 0.23e+3, + maxLOD = 9000, + ) )cc"; TrivialModuleLoader ModLoader; @@ -241,13 +245,28 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) { ASSERT_FALSE(Parser.parse()); - ASSERT_EQ(Elements.size(), 1u); + ASSERT_EQ(Elements.size(), 2u); + // Check default values are as expected RootElement Elem = Elements[0]; 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).MipLODBias, 0.f); + ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 16u); + ASSERT_EQ(std::get<StaticSampler>(Elem).MinLOD, 0.f); + ASSERT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 3.402823466e+38f); + + // Check values can be set as expected + Elem = Elements[1]; + 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).MipLODBias, 230.f); + ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 3u); + ASSERT_EQ(std::get<StaticSampler>(Elem).MinLOD, 4.2f); + ASSERT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 9000.f); + ASSERT_TRUE(Consumer->isSatisfied()); } diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h index f1da4c7998c7e..8ee58b87f5e49 100644 --- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h +++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h @@ -163,7 +163,7 @@ struct StaticSampler { float MipLODBias = 0.f; uint32_t MaxAnisotropy = 16; float MinLOD = 0.f; - float MaxLOD = 3.402823466e+38f; + float MaxLOD = 3.402823466e+38f; // FLT_MAX }; /// Models RootElement : RootFlags | RootConstants | RootParam >From 5733ae3e3fec19d580eea0e86f87b9776012f672 Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Fri, 16 May 2025 16:54:11 +0000 Subject: [PATCH 6/8] format --- clang/lib/Parse/ParseHLSLRootSignature.cpp | 10 +++++----- clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp | 1 - 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/clang/lib/Parse/ParseHLSLRootSignature.cpp b/clang/lib/Parse/ParseHLSLRootSignature.cpp index 95935bb8e6424..04fe8d00f25cd 100644 --- a/clang/lib/Parse/ParseHLSLRootSignature.cpp +++ b/clang/lib/Parse/ParseHLSLRootSignature.cpp @@ -385,13 +385,13 @@ std::optional<StaticSampler> RootSignatureParser::parseStaticSampler() { Sampler.MipLODBias = Params->MipLODBias.value(); if (Params->MaxAnisotropy.has_value()) - Sampler.MaxAnisotropy= Params->MaxAnisotropy.value(); + Sampler.MaxAnisotropy = Params->MaxAnisotropy.value(); if (Params->MinLOD.has_value()) - Sampler.MinLOD= Params->MinLOD.value(); + Sampler.MinLOD = Params->MinLOD.value(); if (Params->MaxLOD.has_value()) - Sampler.MaxLOD= Params->MaxLOD.value(); + Sampler.MaxLOD = Params->MaxLOD.value(); if (consumeExpectedToken(TokenKind::pu_r_paren, diag::err_hlsl_unexpected_end_of_params, @@ -724,7 +724,7 @@ RootSignatureParser::parseStaticSamplerParams() { if (consumeExpectedToken(TokenKind::pu_equal)) return std::nullopt; - auto MinLOD= parseFloatParam(); + auto MinLOD = parseFloatParam(); if (!MinLOD.has_value()) return std::nullopt; Params.MinLOD = MinLOD; @@ -741,7 +741,7 @@ RootSignatureParser::parseStaticSamplerParams() { if (consumeExpectedToken(TokenKind::pu_equal)) return std::nullopt; - auto MaxLOD= parseFloatParam(); + auto MaxLOD = parseFloatParam(); if (!MaxLOD.has_value()) return std::nullopt; Params.MaxLOD = MaxLOD; diff --git a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp index b4ed634bb4d75..94e0464ddf03b 100644 --- a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp +++ b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp @@ -267,7 +267,6 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) { ASSERT_EQ(std::get<StaticSampler>(Elem).MinLOD, 4.2f); ASSERT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 9000.f); - ASSERT_TRUE(Consumer->isSatisfied()); } >From b5ffce479ba7320566cd3885159a59ea2f1b6c2f Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Mon, 26 May 2025 20:52:56 +0000 Subject: [PATCH 7/8] review: use EXPECT_FLOAT_EQ --- clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp index 94e0464ddf03b..717a62b40ee66 100644 --- a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp +++ b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp @@ -254,8 +254,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) { ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.Number, 0u); ASSERT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 0.f); ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 16u); - ASSERT_EQ(std::get<StaticSampler>(Elem).MinLOD, 0.f); - ASSERT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 3.402823466e+38f); + ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MinLOD, 0.f); + ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 3.402823466e+38f); // Check values can be set as expected Elem = Elements[1]; @@ -264,8 +264,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) { ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.Number, 0u); ASSERT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 230.f); ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 3u); - ASSERT_EQ(std::get<StaticSampler>(Elem).MinLOD, 4.2f); - ASSERT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 9000.f); + ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MinLOD, 4.2f); + ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 9000.f); ASSERT_TRUE(Consumer->isSatisfied()); } >From 30f8bddf8e1e65f5b8c5bc0c5f53adaf9d623a0b Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Mon, 26 May 2025 21:02:46 +0000 Subject: [PATCH 8/8] review: use defined FLT_MAX --- llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h index 8ee58b87f5e49..b2f1811d4a337 100644 --- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h +++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h @@ -163,7 +163,7 @@ struct StaticSampler { float MipLODBias = 0.f; uint32_t MaxAnisotropy = 16; float MinLOD = 0.f; - float MaxLOD = 3.402823466e+38f; // FLT_MAX + float MaxLOD = std::numeric_limits<float>::max(); }; /// Models RootElement : RootFlags | RootConstants | RootParam _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits