[clang] [llvm] [HLSL][RootSignature] Add parsing of remaining enums to StaticSampler (PR #140305)
Finn Plummer via llvm-commits
llvm-commits at lists.llvm.org
Fri May 30 10:51:17 PDT 2025
https://github.com/inbelic updated https://github.com/llvm/llvm-project/pull/140305
>From 94c9f29325d0609b896ac127bb6279aecc1fd36a Mon Sep 17 00:00:00 2001
From: Finn Plummer <canadienfinn at gmail.com>
Date: Fri, 16 May 2025 19:53:17 +0000
Subject: [PATCH 1/7] pre-req: add keywords
---
.../clang/Lex/HLSLRootSignatureTokenKinds.def | 27 +++++++++++++++++++
.../Lex/LexHLSLRootSignatureTest.cpp | 21 +++++++++++++--
2 files changed, 46 insertions(+), 2 deletions(-)
diff --git a/clang/include/clang/Lex/HLSLRootSignatureTokenKinds.def b/clang/include/clang/Lex/HLSLRootSignatureTokenKinds.def
index 9b47ec57f541b..1814ac4aeae5f 100644
--- a/clang/include/clang/Lex/HLSLRootSignatureTokenKinds.def
+++ b/clang/include/clang/Lex/HLSLRootSignatureTokenKinds.def
@@ -56,6 +56,12 @@
#ifndef TEXTURE_ADDRESS_MODE_ENUM
#define TEXTURE_ADDRESS_MODE_ENUM(NAME, LIT) ENUM(NAME, LIT)
#endif
+#ifndef COMPARISON_FUNC_ENUM
+#define COMPARISON_FUNC_ENUM(NAME, LIT) ENUM(NAME, LIT)
+#endif
+#ifndef STATIC_BORDER_COLOR_ENUM
+#define STATIC_BORDER_COLOR_ENUM(NAME, LIT) ENUM(NAME, LIT)
+#endif
// General Tokens:
TOK(invalid, "invalid identifier")
@@ -109,6 +115,8 @@ KEYWORD(addressU)
KEYWORD(addressV)
KEYWORD(addressW)
KEYWORD(maxAnisotropy)
+KEYWORD(comparisonFunc)
+KEYWORD(borderColor)
KEYWORD(minLOD)
KEYWORD(maxLOD)
@@ -161,6 +169,25 @@ TEXTURE_ADDRESS_MODE_ENUM(Clamp, "TEXTURE_ADDRESS_CLAMP")
TEXTURE_ADDRESS_MODE_ENUM(Border, "TEXTURE_ADDRESS_BORDER")
TEXTURE_ADDRESS_MODE_ENUM(MirrorOnce, "TEXTURE_ADDRESS_MIRRORONCE")
+// Comparison Func Enums:
+COMPARISON_FUNC_ENUM(Never, "COMPARISON_NEVER")
+COMPARISON_FUNC_ENUM(Less, "COMPARISON_LESS")
+COMPARISON_FUNC_ENUM(Equal, "COMPARISON_EQUAL")
+COMPARISON_FUNC_ENUM(LessEqual, "COMPARISON_LESS_EQUAL")
+COMPARISON_FUNC_ENUM(Greater, "COMPARISON_GREATER")
+COMPARISON_FUNC_ENUM(NotEqual, "COMPARISON_NOT_EQUAL")
+COMPARISON_FUNC_ENUM(GreaterEqual, "COMPARISON_GREATER_EQUAL")
+COMPARISON_FUNC_ENUM(Always, "COMPARISON_ALWAYS")
+
+// Static Border Color Enums:
+STATIC_BORDER_COLOR_ENUM(TransparentBlack, "STATIC_BORDER_COLOR_TRANSPARENT_BLACK")
+STATIC_BORDER_COLOR_ENUM(OpaqueBlack, "STATIC_BORDER_COLOR_OPAQUE_BLACK")
+STATIC_BORDER_COLOR_ENUM(OpaqueWhite, "STATIC_BORDER_COLOR_OPAQUE_WHITE")
+STATIC_BORDER_COLOR_ENUM(OpaqueBlackUint, "STATIC_BORDER_COLOR_OPAQUE_BLACK_UINT")
+STATIC_BORDER_COLOR_ENUM(OpaqueWhiteUint, "STATIC_BORDER_COLOR_OPAQUE_WHITE_UINT")
+
+#undef STATIC_BORDER_COLOR_ENUM
+#undef COMPARISON_FUNC_ENUM
#undef TEXTURE_ADDRESS_MODE_ENUM
#undef SHADER_VISIBILITY_ENUM
#undef DESCRIPTOR_RANGE_FLAG_ENUM
diff --git a/clang/unittests/Lex/LexHLSLRootSignatureTest.cpp b/clang/unittests/Lex/LexHLSLRootSignatureTest.cpp
index f0f22ccc29e9f..0e0b1373c9915 100644
--- a/clang/unittests/Lex/LexHLSLRootSignatureTest.cpp
+++ b/clang/unittests/Lex/LexHLSLRootSignatureTest.cpp
@@ -136,8 +136,10 @@ TEST_F(LexHLSLRootSignatureTest, ValidLexAllTokensTest) {
space visibility flags
numDescriptors offset
- mipLODBias addressU addressV addressW
- maxAnisotropy minLOD maxLOD
+ addressU addressV addressW
+ mipLODBias maxAnisotropy
+ comparisonFunc borderColor
+ minLOD maxLOD
unbounded
DESCRIPTOR_RANGE_OFFSET_APPEND
@@ -175,6 +177,21 @@ TEST_F(LexHLSLRootSignatureTest, ValidLexAllTokensTest) {
TEXTURE_ADDRESS_CLAMP
TEXTURE_ADDRESS_BORDER
TEXTURE_ADDRESS_MIRRORONCE
+
+ comparison_never
+ comparison_less
+ comparison_equal
+ comparison_less_equal
+ comparison_greater
+ comparison_not_equal
+ comparison_greater_equal
+ comparison_always
+
+ STATIC_BORDER_COLOR_TRANSPARENT_BLACK
+ STATIC_BORDER_COLOR_OPAQUE_BLACK
+ STATIC_BORDER_COLOR_OPAQUE_WHITE
+ STATIC_BORDER_COLOR_OPAQUE_BLACK_UINT
+ STATIC_BORDER_COLOR_OPAQUE_WHITE_UINT
)cc";
auto TokLoc = SourceLocation();
hlsl::RootSignatureLexer Lexer(Source, TokLoc);
>From 469c0397dcfdd01f2dcfda93e79e4f05602ec826 Mon Sep 17 00:00:00 2001
From: Finn Plummer <canadienfinn at gmail.com>
Date: Fri, 16 May 2025 20:00:32 +0000
Subject: [PATCH 2/7] add parsing of comparisonfunc
---
.../clang/Parse/ParseHLSLRootSignature.h | 2 +
clang/lib/Parse/ParseHLSLRootSignature.cpp | 47 +++++++++++++++++++
.../Parse/ParseHLSLRootSignatureTest.cpp | 6 ++-
.../llvm/Frontend/HLSL/HLSLRootSignature.h | 12 +++++
4 files changed, 66 insertions(+), 1 deletion(-)
diff --git a/clang/include/clang/Parse/ParseHLSLRootSignature.h b/clang/include/clang/Parse/ParseHLSLRootSignature.h
index d436265b8b37a..04282d3f686b0 100644
--- a/clang/include/clang/Parse/ParseHLSLRootSignature.h
+++ b/clang/include/clang/Parse/ParseHLSLRootSignature.h
@@ -116,6 +116,7 @@ class RootSignatureParser {
std::optional<llvm::hlsl::rootsig::TextureAddressMode> AddressV;
std::optional<llvm::hlsl::rootsig::TextureAddressMode> AddressW;
std::optional<uint32_t> MaxAnisotropy;
+ std::optional<llvm::hlsl::rootsig::ComparisonFunc> ComparisonFunc;
std::optional<float> MinLOD;
std::optional<float> MaxLOD;
};
@@ -130,6 +131,7 @@ class RootSignatureParser {
std::optional<llvm::hlsl::rootsig::ShaderVisibility> parseShaderVisibility();
std::optional<llvm::hlsl::rootsig::TextureAddressMode>
parseTextureAddressMode();
+ std::optional<llvm::hlsl::rootsig::ComparisonFunc> parseComparisonFunc();
std::optional<llvm::hlsl::rootsig::RootDescriptorFlags>
parseRootDescriptorFlags();
std::optional<llvm::hlsl::rootsig::DescriptorRangeFlags>
diff --git a/clang/lib/Parse/ParseHLSLRootSignature.cpp b/clang/lib/Parse/ParseHLSLRootSignature.cpp
index e9373f9a82beb..0e2d67ccc31f1 100644
--- a/clang/lib/Parse/ParseHLSLRootSignature.cpp
+++ b/clang/lib/Parse/ParseHLSLRootSignature.cpp
@@ -392,6 +392,9 @@ std::optional<StaticSampler> RootSignatureParser::parseStaticSampler() {
if (Params->MaxAnisotropy.has_value())
Sampler.MaxAnisotropy = Params->MaxAnisotropy.value();
+ if (Params->ComparisonFunc.has_value())
+ Sampler.ComparisonFunc= Params->ComparisonFunc.value();
+
if (Params->MinLOD.has_value())
Sampler.MinLOD = Params->MinLOD.value();
@@ -769,6 +772,24 @@ RootSignatureParser::parseStaticSamplerParams() {
Params.MaxAnisotropy = MaxAnisotropy;
}
+
+ // `comparisonFunc` `=` COMPARISON_FUNC
+ if (tryConsumeExpectedToken(TokenKind::kw_comparisonFunc)) {
+ if (Params.ComparisonFunc.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 ComparisonFunc = parseComparisonFunc();
+ if (!ComparisonFunc.has_value())
+ return std::nullopt;
+ Params.ComparisonFunc = ComparisonFunc;
+ }
+
// `minLOD` `=` NUMBER
if (tryConsumeExpectedToken(TokenKind::kw_minLOD)) {
if (Params.MinLOD.has_value()) {
@@ -935,6 +956,32 @@ RootSignatureParser::parseTextureAddressMode() {
return std::nullopt;
}
+std::optional<llvm::hlsl::rootsig::ComparisonFunc>
+RootSignatureParser::parseComparisonFunc() {
+ assert(CurToken.TokKind == TokenKind::pu_equal &&
+ "Expects to only be invoked starting at given keyword");
+
+ TokenKind Expected[] = {
+#define COMPARISON_FUNC_ENUM(NAME, LIT) TokenKind::en_##NAME,
+#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
+ };
+
+ if (!tryConsumeExpectedToken(Expected))
+ return std::nullopt;
+
+ switch (CurToken.TokKind) {
+#define COMPARISON_FUNC_ENUM(NAME, LIT) \
+ case TokenKind::en_##NAME: \
+ return ComparisonFunc::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::RootDescriptorFlags>
RootSignatureParser::parseRootDescriptorFlags() {
assert(CurToken.TokKind == TokenKind::pu_equal &&
diff --git a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
index 6477b25550c4d..c8b4316ae7f88 100644
--- a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
+++ b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
@@ -230,7 +230,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
minLOD = 4.2f, mipLODBias = 0.23e+3,
addressW = TEXTURE_ADDRESS_CLAMP,
addressV = TEXTURE_ADDRESS_BORDER,
- maxLOD = 9000, addressU = TEXTURE_ADDRESS_MIRROR
+ maxLOD = 9000, addressU = TEXTURE_ADDRESS_MIRROR,
+ comparisonFunc = COMPARISON_NOT_EQUAL
)
)cc";
@@ -259,6 +260,7 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressW, TextureAddressMode::Wrap);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 0.f);
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 16u);
+ ASSERT_EQ(std::get<StaticSampler>(Elem).ComparisonFunc, ComparisonFunc::LessEqual);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MinLOD, 0.f);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 3.402823466e+38f);
@@ -272,6 +274,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressW, TextureAddressMode::Clamp);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 230.f);
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 3u);
+ ASSERT_EQ(std::get<StaticSampler>(Elem).ComparisonFunc,
+ ComparisonFunc::NotEqual);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MinLOD, 4.2f);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 9000.f);
diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
index bb0a0d158a980..fc41245c20bc9 100644
--- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
+++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
@@ -84,6 +84,17 @@ enum class TextureAddressMode {
MirrorOnce = 5
};
+enum class ComparisonFunc : unsigned {
+ Never = 1,
+ Less = 2,
+ Equal = 3,
+ LessEqual = 4,
+ Greater = 5,
+ NotEqual = 6,
+ GreaterEqual = 7,
+ Always = 8
+};
+
// Definitions of the in-memory data layout structures
// Models the different registers: bReg | tReg | uReg | sReg
@@ -170,6 +181,7 @@ struct StaticSampler {
TextureAddressMode AddressW = TextureAddressMode::Wrap;
float MipLODBias = 0.f;
uint32_t MaxAnisotropy = 16;
+ ComparisonFunc ComparisonFunc = ComparisonFunc::LessEqual;
float MinLOD = 0.f;
float MaxLOD = std::numeric_limits<float>::max();
};
>From 79bb0f608685401c49c7c3003e68f58b0506e94d Mon Sep 17 00:00:00 2001
From: Finn Plummer <canadienfinn at gmail.com>
Date: Fri, 16 May 2025 20:24:34 +0000
Subject: [PATCH 3/7] add parsing of borderColor
---
.../clang/Parse/ParseHLSLRootSignature.h | 3 ++
clang/lib/Parse/ParseHLSLRootSignature.cpp | 47 +++++++++++++++++++
.../Parse/ParseHLSLRootSignatureTest.cpp | 5 +-
.../llvm/Frontend/HLSL/HLSLRootSignature.h | 9 ++++
4 files changed, 63 insertions(+), 1 deletion(-)
diff --git a/clang/include/clang/Parse/ParseHLSLRootSignature.h b/clang/include/clang/Parse/ParseHLSLRootSignature.h
index 04282d3f686b0..77b208106265e 100644
--- a/clang/include/clang/Parse/ParseHLSLRootSignature.h
+++ b/clang/include/clang/Parse/ParseHLSLRootSignature.h
@@ -117,6 +117,7 @@ class RootSignatureParser {
std::optional<llvm::hlsl::rootsig::TextureAddressMode> AddressW;
std::optional<uint32_t> MaxAnisotropy;
std::optional<llvm::hlsl::rootsig::ComparisonFunc> ComparisonFunc;
+ std::optional<llvm::hlsl::rootsig::StaticBorderColor> BorderColor;
std::optional<float> MinLOD;
std::optional<float> MaxLOD;
};
@@ -132,6 +133,8 @@ class RootSignatureParser {
std::optional<llvm::hlsl::rootsig::TextureAddressMode>
parseTextureAddressMode();
std::optional<llvm::hlsl::rootsig::ComparisonFunc> parseComparisonFunc();
+ std::optional<llvm::hlsl::rootsig::StaticBorderColor>
+ parseStaticBorderColor();
std::optional<llvm::hlsl::rootsig::RootDescriptorFlags>
parseRootDescriptorFlags();
std::optional<llvm::hlsl::rootsig::DescriptorRangeFlags>
diff --git a/clang/lib/Parse/ParseHLSLRootSignature.cpp b/clang/lib/Parse/ParseHLSLRootSignature.cpp
index 0e2d67ccc31f1..814cf574a4b45 100644
--- a/clang/lib/Parse/ParseHLSLRootSignature.cpp
+++ b/clang/lib/Parse/ParseHLSLRootSignature.cpp
@@ -395,6 +395,9 @@ std::optional<StaticSampler> RootSignatureParser::parseStaticSampler() {
if (Params->ComparisonFunc.has_value())
Sampler.ComparisonFunc= Params->ComparisonFunc.value();
+ if (Params->BorderColor.has_value())
+ Sampler.BorderColor= Params->BorderColor.value();
+
if (Params->MinLOD.has_value())
Sampler.MinLOD = Params->MinLOD.value();
@@ -790,6 +793,24 @@ RootSignatureParser::parseStaticSamplerParams() {
Params.ComparisonFunc = ComparisonFunc;
}
+
+ // `borderColor` `=` STATIC_BORDER_COLOR
+ if (tryConsumeExpectedToken(TokenKind::kw_borderColor)) {
+ if (Params.BorderColor.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 BorderColor = parseStaticBorderColor();
+ if (!BorderColor.has_value())
+ return std::nullopt;
+ Params.BorderColor = BorderColor;
+ }
+
// `minLOD` `=` NUMBER
if (tryConsumeExpectedToken(TokenKind::kw_minLOD)) {
if (Params.MinLOD.has_value()) {
@@ -982,6 +1003,32 @@ RootSignatureParser::parseComparisonFunc() {
return std::nullopt;
}
+std::optional<llvm::hlsl::rootsig::StaticBorderColor>
+RootSignatureParser::parseStaticBorderColor() {
+ assert(CurToken.TokKind == TokenKind::pu_equal &&
+ "Expects to only be invoked starting at given keyword");
+
+ TokenKind Expected[] = {
+#define STATIC_BORDER_COLOR_ENUM(NAME, LIT) TokenKind::en_##NAME,
+#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
+ };
+
+ if (!tryConsumeExpectedToken(Expected))
+ return std::nullopt;
+
+ switch (CurToken.TokKind) {
+#define STATIC_BORDER_COLOR_ENUM(NAME, LIT) \
+ case TokenKind::en_##NAME: \
+ return StaticBorderColor::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::RootDescriptorFlags>
RootSignatureParser::parseRootDescriptorFlags() {
assert(CurToken.TokKind == TokenKind::pu_equal &&
diff --git a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
index c8b4316ae7f88..b41ea529e926b 100644
--- a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
+++ b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
@@ -231,7 +231,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
addressW = TEXTURE_ADDRESS_CLAMP,
addressV = TEXTURE_ADDRESS_BORDER,
maxLOD = 9000, addressU = TEXTURE_ADDRESS_MIRROR,
- comparisonFunc = COMPARISON_NOT_EQUAL
+ comparisonFunc = COMPARISON_NOT_EQUAL,
+ borderColor = STATIC_BORDER_COLOR_OPAQUE_BLACK_UINT
)
)cc";
@@ -261,6 +262,7 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 0.f);
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 16u);
ASSERT_EQ(std::get<StaticSampler>(Elem).ComparisonFunc, ComparisonFunc::LessEqual);
+ ASSERT_EQ(std::get<StaticSampler>(Elem).BorderColor, StaticBorderColor::OpaqueWhite);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MinLOD, 0.f);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 3.402823466e+38f);
@@ -276,6 +278,7 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 3u);
ASSERT_EQ(std::get<StaticSampler>(Elem).ComparisonFunc,
ComparisonFunc::NotEqual);
+ ASSERT_EQ(std::get<StaticSampler>(Elem).BorderColor, StaticBorderColor::OpaqueBlackUint);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MinLOD, 4.2f);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 9000.f);
diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
index fc41245c20bc9..0fc0ddbded168 100644
--- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
+++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
@@ -95,6 +95,14 @@ enum class ComparisonFunc : unsigned {
Always = 8
};
+enum class StaticBorderColor {
+ TransparentBlack = 0,
+ OpaqueBlack = 1,
+ OpaqueWhite = 2,
+ OpaqueBlackUint = 3,
+ OpaqueWhiteUint = 4
+};
+
// Definitions of the in-memory data layout structures
// Models the different registers: bReg | tReg | uReg | sReg
@@ -182,6 +190,7 @@ struct StaticSampler {
float MipLODBias = 0.f;
uint32_t MaxAnisotropy = 16;
ComparisonFunc ComparisonFunc = ComparisonFunc::LessEqual;
+ StaticBorderColor BorderColor = StaticBorderColor::OpaqueWhite;
float MinLOD = 0.f;
float MaxLOD = std::numeric_limits<float>::max();
};
>From 6a30a6bdbabe7bd8d76006b96480b0fa314bd6f4 Mon Sep 17 00:00:00 2001
From: Finn Plummer <canadienfinn at gmail.com>
Date: Fri, 16 May 2025 20:25:55 +0000
Subject: [PATCH 4/7] clang format
---
clang/lib/Parse/ParseHLSLRootSignature.cpp | 14 ++++++--------
.../unittests/Parse/ParseHLSLRootSignatureTest.cpp | 9 ++++++---
2 files changed, 12 insertions(+), 11 deletions(-)
diff --git a/clang/lib/Parse/ParseHLSLRootSignature.cpp b/clang/lib/Parse/ParseHLSLRootSignature.cpp
index 814cf574a4b45..65c55a31e2b01 100644
--- a/clang/lib/Parse/ParseHLSLRootSignature.cpp
+++ b/clang/lib/Parse/ParseHLSLRootSignature.cpp
@@ -393,10 +393,10 @@ std::optional<StaticSampler> RootSignatureParser::parseStaticSampler() {
Sampler.MaxAnisotropy = Params->MaxAnisotropy.value();
if (Params->ComparisonFunc.has_value())
- Sampler.ComparisonFunc= Params->ComparisonFunc.value();
+ Sampler.ComparisonFunc = Params->ComparisonFunc.value();
if (Params->BorderColor.has_value())
- Sampler.BorderColor= Params->BorderColor.value();
+ Sampler.BorderColor = Params->BorderColor.value();
if (Params->MinLOD.has_value())
Sampler.MinLOD = Params->MinLOD.value();
@@ -775,7 +775,6 @@ RootSignatureParser::parseStaticSamplerParams() {
Params.MaxAnisotropy = MaxAnisotropy;
}
-
// `comparisonFunc` `=` COMPARISON_FUNC
if (tryConsumeExpectedToken(TokenKind::kw_comparisonFunc)) {
if (Params.ComparisonFunc.has_value()) {
@@ -793,7 +792,6 @@ RootSignatureParser::parseStaticSamplerParams() {
Params.ComparisonFunc = ComparisonFunc;
}
-
// `borderColor` `=` STATIC_BORDER_COLOR
if (tryConsumeExpectedToken(TokenKind::kw_borderColor)) {
if (Params.BorderColor.has_value()) {
@@ -991,9 +989,9 @@ RootSignatureParser::parseComparisonFunc() {
return std::nullopt;
switch (CurToken.TokKind) {
-#define COMPARISON_FUNC_ENUM(NAME, LIT) \
+#define COMPARISON_FUNC_ENUM(NAME, LIT) \
case TokenKind::en_##NAME: \
- return ComparisonFunc::NAME; \
+ return ComparisonFunc::NAME; \
break;
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
default:
@@ -1017,9 +1015,9 @@ RootSignatureParser::parseStaticBorderColor() {
return std::nullopt;
switch (CurToken.TokKind) {
-#define STATIC_BORDER_COLOR_ENUM(NAME, LIT) \
+#define STATIC_BORDER_COLOR_ENUM(NAME, LIT) \
case TokenKind::en_##NAME: \
- return StaticBorderColor::NAME; \
+ return StaticBorderColor::NAME; \
break;
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
default:
diff --git a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
index b41ea529e926b..cd2b8df35c135 100644
--- a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
+++ b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
@@ -261,8 +261,10 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressW, TextureAddressMode::Wrap);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 0.f);
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 16u);
- ASSERT_EQ(std::get<StaticSampler>(Elem).ComparisonFunc, ComparisonFunc::LessEqual);
- ASSERT_EQ(std::get<StaticSampler>(Elem).BorderColor, StaticBorderColor::OpaqueWhite);
+ ASSERT_EQ(std::get<StaticSampler>(Elem).ComparisonFunc,
+ ComparisonFunc::LessEqual);
+ ASSERT_EQ(std::get<StaticSampler>(Elem).BorderColor,
+ StaticBorderColor::OpaqueWhite);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MinLOD, 0.f);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 3.402823466e+38f);
@@ -278,7 +280,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 3u);
ASSERT_EQ(std::get<StaticSampler>(Elem).ComparisonFunc,
ComparisonFunc::NotEqual);
- ASSERT_EQ(std::get<StaticSampler>(Elem).BorderColor, StaticBorderColor::OpaqueBlackUint);
+ ASSERT_EQ(std::get<StaticSampler>(Elem).BorderColor,
+ StaticBorderColor::OpaqueBlackUint);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MinLOD, 4.2f);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 9000.f);
>From c8e334e43865d021ee06c0c2dfa67abd9ad50bea Mon Sep 17 00:00:00 2001
From: Finn Plummer <canadienfinn at gmail.com>
Date: Thu, 29 May 2025 22:57:10 +0000
Subject: [PATCH 5/7] self-review: rename ComparisonFunc members to avoid name
abiguitity
---
clang/include/clang/Parse/ParseHLSLRootSignature.h | 2 +-
clang/lib/Parse/ParseHLSLRootSignature.cpp | 12 ++++++------
clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp | 4 ++--
llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h | 2 +-
4 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/clang/include/clang/Parse/ParseHLSLRootSignature.h b/clang/include/clang/Parse/ParseHLSLRootSignature.h
index 77b208106265e..8052df1c568dd 100644
--- a/clang/include/clang/Parse/ParseHLSLRootSignature.h
+++ b/clang/include/clang/Parse/ParseHLSLRootSignature.h
@@ -116,7 +116,7 @@ class RootSignatureParser {
std::optional<llvm::hlsl::rootsig::TextureAddressMode> AddressV;
std::optional<llvm::hlsl::rootsig::TextureAddressMode> AddressW;
std::optional<uint32_t> MaxAnisotropy;
- std::optional<llvm::hlsl::rootsig::ComparisonFunc> ComparisonFunc;
+ std::optional<llvm::hlsl::rootsig::ComparisonFunc> CompFunc;
std::optional<llvm::hlsl::rootsig::StaticBorderColor> BorderColor;
std::optional<float> MinLOD;
std::optional<float> MaxLOD;
diff --git a/clang/lib/Parse/ParseHLSLRootSignature.cpp b/clang/lib/Parse/ParseHLSLRootSignature.cpp
index 65c55a31e2b01..eb0ebee2e6ce9 100644
--- a/clang/lib/Parse/ParseHLSLRootSignature.cpp
+++ b/clang/lib/Parse/ParseHLSLRootSignature.cpp
@@ -392,8 +392,8 @@ std::optional<StaticSampler> RootSignatureParser::parseStaticSampler() {
if (Params->MaxAnisotropy.has_value())
Sampler.MaxAnisotropy = Params->MaxAnisotropy.value();
- if (Params->ComparisonFunc.has_value())
- Sampler.ComparisonFunc = Params->ComparisonFunc.value();
+ if (Params->CompFunc.has_value())
+ Sampler.CompFunc = Params->CompFunc.value();
if (Params->BorderColor.has_value())
Sampler.BorderColor = Params->BorderColor.value();
@@ -777,7 +777,7 @@ RootSignatureParser::parseStaticSamplerParams() {
// `comparisonFunc` `=` COMPARISON_FUNC
if (tryConsumeExpectedToken(TokenKind::kw_comparisonFunc)) {
- if (Params.ComparisonFunc.has_value()) {
+ if (Params.CompFunc.has_value()) {
getDiags().Report(CurToken.TokLoc, diag::err_hlsl_rootsig_repeat_param)
<< CurToken.TokKind;
return std::nullopt;
@@ -786,10 +786,10 @@ RootSignatureParser::parseStaticSamplerParams() {
if (consumeExpectedToken(TokenKind::pu_equal))
return std::nullopt;
- auto ComparisonFunc = parseComparisonFunc();
- if (!ComparisonFunc.has_value())
+ auto CompFunc = parseComparisonFunc();
+ if (!CompFunc.has_value())
return std::nullopt;
- Params.ComparisonFunc = ComparisonFunc;
+ Params.CompFunc = CompFunc;
}
// `borderColor` `=` STATIC_BORDER_COLOR
diff --git a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
index cd2b8df35c135..26a8b5d900f91 100644
--- a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
+++ b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
@@ -261,7 +261,7 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressW, TextureAddressMode::Wrap);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 0.f);
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 16u);
- ASSERT_EQ(std::get<StaticSampler>(Elem).ComparisonFunc,
+ ASSERT_EQ(std::get<StaticSampler>(Elem).CompFunc,
ComparisonFunc::LessEqual);
ASSERT_EQ(std::get<StaticSampler>(Elem).BorderColor,
StaticBorderColor::OpaqueWhite);
@@ -278,7 +278,7 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressW, TextureAddressMode::Clamp);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 230.f);
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 3u);
- ASSERT_EQ(std::get<StaticSampler>(Elem).ComparisonFunc,
+ ASSERT_EQ(std::get<StaticSampler>(Elem).CompFunc,
ComparisonFunc::NotEqual);
ASSERT_EQ(std::get<StaticSampler>(Elem).BorderColor,
StaticBorderColor::OpaqueBlackUint);
diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
index 0fc0ddbded168..7c8ddef4144e6 100644
--- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
+++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
@@ -189,7 +189,7 @@ struct StaticSampler {
TextureAddressMode AddressW = TextureAddressMode::Wrap;
float MipLODBias = 0.f;
uint32_t MaxAnisotropy = 16;
- ComparisonFunc ComparisonFunc = ComparisonFunc::LessEqual;
+ ComparisonFunc CompFunc = ComparisonFunc::LessEqual;
StaticBorderColor BorderColor = StaticBorderColor::OpaqueWhite;
float MinLOD = 0.f;
float MaxLOD = std::numeric_limits<float>::max();
>From 0f943c85012fee76b213f19c3c2a9b4324d9f916 Mon Sep 17 00:00:00 2001
From: Finn Plummer <canadienfinn at gmail.com>
Date: Thu, 29 May 2025 23:02:08 +0000
Subject: [PATCH 6/7] format
---
clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
index 26a8b5d900f91..5330355596356 100644
--- a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
+++ b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
@@ -261,8 +261,7 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressW, TextureAddressMode::Wrap);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 0.f);
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 16u);
- ASSERT_EQ(std::get<StaticSampler>(Elem).CompFunc,
- ComparisonFunc::LessEqual);
+ ASSERT_EQ(std::get<StaticSampler>(Elem).CompFunc, ComparisonFunc::LessEqual);
ASSERT_EQ(std::get<StaticSampler>(Elem).BorderColor,
StaticBorderColor::OpaqueWhite);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MinLOD, 0.f);
@@ -278,8 +277,7 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressW, TextureAddressMode::Clamp);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 230.f);
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 3u);
- ASSERT_EQ(std::get<StaticSampler>(Elem).CompFunc,
- ComparisonFunc::NotEqual);
+ ASSERT_EQ(std::get<StaticSampler>(Elem).CompFunc, ComparisonFunc::NotEqual);
ASSERT_EQ(std::get<StaticSampler>(Elem).BorderColor,
StaticBorderColor::OpaqueBlackUint);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MinLOD, 4.2f);
>From 91f161b2a503647e36f72a6156fce288429daf43 Mon Sep 17 00:00:00 2001
From: Finn Plummer <canadienfinn at gmail.com>
Date: Fri, 30 May 2025 17:28:36 +0000
Subject: [PATCH 7/7] fix cherry-pick typo: token order
---
clang/unittests/Lex/LexHLSLRootSignatureTest.cpp | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/clang/unittests/Lex/LexHLSLRootSignatureTest.cpp b/clang/unittests/Lex/LexHLSLRootSignatureTest.cpp
index 0e0b1373c9915..943a31a08604c 100644
--- a/clang/unittests/Lex/LexHLSLRootSignatureTest.cpp
+++ b/clang/unittests/Lex/LexHLSLRootSignatureTest.cpp
@@ -136,9 +136,8 @@ TEST_F(LexHLSLRootSignatureTest, ValidLexAllTokensTest) {
space visibility flags
numDescriptors offset
- addressU addressV addressW
- mipLODBias maxAnisotropy
- comparisonFunc borderColor
+ mipLODBias addressU addressV addressW
+ maxAnisotropy comparisonFunc borderColor
minLOD maxLOD
unbounded
More information about the llvm-commits
mailing list