Skip to content

Commit 9bd63b1

Browse files
authored
[HLSL][RootSignature] Add parsing of remaining enums to StaticSampler (#140305)
- defines in-memory reprsentation of `comparisonFunc` and `borderColor` - defines parsing of the `ComparisonFunc` and `StaticBorderColor` enum - integrates parsing of these number parameters with their respective `parseComparisonFunc` and `parseStaticBorderColor` - adds basic unit tests to demonstrate setting functionality Part 6 of #126574
1 parent 8eadbea commit 9bd63b1

File tree

6 files changed

+171
-2
lines changed

6 files changed

+171
-2
lines changed

clang/include/clang/Lex/HLSLRootSignatureTokenKinds.def

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,12 @@
5656
#ifndef TEXTURE_ADDRESS_MODE_ENUM
5757
#define TEXTURE_ADDRESS_MODE_ENUM(NAME, LIT) ENUM(NAME, LIT)
5858
#endif
59+
#ifndef COMPARISON_FUNC_ENUM
60+
#define COMPARISON_FUNC_ENUM(NAME, LIT) ENUM(NAME, LIT)
61+
#endif
62+
#ifndef STATIC_BORDER_COLOR_ENUM
63+
#define STATIC_BORDER_COLOR_ENUM(NAME, LIT) ENUM(NAME, LIT)
64+
#endif
5965

6066
// General Tokens:
6167
TOK(invalid, "invalid identifier")
@@ -109,6 +115,8 @@ KEYWORD(addressU)
109115
KEYWORD(addressV)
110116
KEYWORD(addressW)
111117
KEYWORD(maxAnisotropy)
118+
KEYWORD(comparisonFunc)
119+
KEYWORD(borderColor)
112120
KEYWORD(minLOD)
113121
KEYWORD(maxLOD)
114122

@@ -161,6 +169,25 @@ TEXTURE_ADDRESS_MODE_ENUM(Clamp, "TEXTURE_ADDRESS_CLAMP")
161169
TEXTURE_ADDRESS_MODE_ENUM(Border, "TEXTURE_ADDRESS_BORDER")
162170
TEXTURE_ADDRESS_MODE_ENUM(MirrorOnce, "TEXTURE_ADDRESS_MIRRORONCE")
163171

172+
// Comparison Func Enums:
173+
COMPARISON_FUNC_ENUM(Never, "COMPARISON_NEVER")
174+
COMPARISON_FUNC_ENUM(Less, "COMPARISON_LESS")
175+
COMPARISON_FUNC_ENUM(Equal, "COMPARISON_EQUAL")
176+
COMPARISON_FUNC_ENUM(LessEqual, "COMPARISON_LESS_EQUAL")
177+
COMPARISON_FUNC_ENUM(Greater, "COMPARISON_GREATER")
178+
COMPARISON_FUNC_ENUM(NotEqual, "COMPARISON_NOT_EQUAL")
179+
COMPARISON_FUNC_ENUM(GreaterEqual, "COMPARISON_GREATER_EQUAL")
180+
COMPARISON_FUNC_ENUM(Always, "COMPARISON_ALWAYS")
181+
182+
// Static Border Color Enums:
183+
STATIC_BORDER_COLOR_ENUM(TransparentBlack, "STATIC_BORDER_COLOR_TRANSPARENT_BLACK")
184+
STATIC_BORDER_COLOR_ENUM(OpaqueBlack, "STATIC_BORDER_COLOR_OPAQUE_BLACK")
185+
STATIC_BORDER_COLOR_ENUM(OpaqueWhite, "STATIC_BORDER_COLOR_OPAQUE_WHITE")
186+
STATIC_BORDER_COLOR_ENUM(OpaqueBlackUint, "STATIC_BORDER_COLOR_OPAQUE_BLACK_UINT")
187+
STATIC_BORDER_COLOR_ENUM(OpaqueWhiteUint, "STATIC_BORDER_COLOR_OPAQUE_WHITE_UINT")
188+
189+
#undef STATIC_BORDER_COLOR_ENUM
190+
#undef COMPARISON_FUNC_ENUM
164191
#undef TEXTURE_ADDRESS_MODE_ENUM
165192
#undef SHADER_VISIBILITY_ENUM
166193
#undef DESCRIPTOR_RANGE_FLAG_ENUM

clang/include/clang/Parse/ParseHLSLRootSignature.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ class RootSignatureParser {
116116
std::optional<llvm::hlsl::rootsig::TextureAddressMode> AddressV;
117117
std::optional<llvm::hlsl::rootsig::TextureAddressMode> AddressW;
118118
std::optional<uint32_t> MaxAnisotropy;
119+
std::optional<llvm::hlsl::rootsig::ComparisonFunc> CompFunc;
120+
std::optional<llvm::hlsl::rootsig::StaticBorderColor> BorderColor;
119121
std::optional<float> MinLOD;
120122
std::optional<float> MaxLOD;
121123
};
@@ -130,6 +132,9 @@ class RootSignatureParser {
130132
std::optional<llvm::hlsl::rootsig::ShaderVisibility> parseShaderVisibility();
131133
std::optional<llvm::hlsl::rootsig::TextureAddressMode>
132134
parseTextureAddressMode();
135+
std::optional<llvm::hlsl::rootsig::ComparisonFunc> parseComparisonFunc();
136+
std::optional<llvm::hlsl::rootsig::StaticBorderColor>
137+
parseStaticBorderColor();
133138
std::optional<llvm::hlsl::rootsig::RootDescriptorFlags>
134139
parseRootDescriptorFlags();
135140
std::optional<llvm::hlsl::rootsig::DescriptorRangeFlags>

clang/lib/Parse/ParseHLSLRootSignature.cpp

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,12 @@ std::optional<StaticSampler> RootSignatureParser::parseStaticSampler() {
392392
if (Params->MaxAnisotropy.has_value())
393393
Sampler.MaxAnisotropy = Params->MaxAnisotropy.value();
394394

395+
if (Params->CompFunc.has_value())
396+
Sampler.CompFunc = Params->CompFunc.value();
397+
398+
if (Params->BorderColor.has_value())
399+
Sampler.BorderColor = Params->BorderColor.value();
400+
395401
if (Params->MinLOD.has_value())
396402
Sampler.MinLOD = Params->MinLOD.value();
397403

@@ -769,6 +775,40 @@ RootSignatureParser::parseStaticSamplerParams() {
769775
Params.MaxAnisotropy = MaxAnisotropy;
770776
}
771777

778+
// `comparisonFunc` `=` COMPARISON_FUNC
779+
if (tryConsumeExpectedToken(TokenKind::kw_comparisonFunc)) {
780+
if (Params.CompFunc.has_value()) {
781+
getDiags().Report(CurToken.TokLoc, diag::err_hlsl_rootsig_repeat_param)
782+
<< CurToken.TokKind;
783+
return std::nullopt;
784+
}
785+
786+
if (consumeExpectedToken(TokenKind::pu_equal))
787+
return std::nullopt;
788+
789+
auto CompFunc = parseComparisonFunc();
790+
if (!CompFunc.has_value())
791+
return std::nullopt;
792+
Params.CompFunc = CompFunc;
793+
}
794+
795+
// `borderColor` `=` STATIC_BORDER_COLOR
796+
if (tryConsumeExpectedToken(TokenKind::kw_borderColor)) {
797+
if (Params.BorderColor.has_value()) {
798+
getDiags().Report(CurToken.TokLoc, diag::err_hlsl_rootsig_repeat_param)
799+
<< CurToken.TokKind;
800+
return std::nullopt;
801+
}
802+
803+
if (consumeExpectedToken(TokenKind::pu_equal))
804+
return std::nullopt;
805+
806+
auto BorderColor = parseStaticBorderColor();
807+
if (!BorderColor.has_value())
808+
return std::nullopt;
809+
Params.BorderColor = BorderColor;
810+
}
811+
772812
// `minLOD` `=` NUMBER
773813
if (tryConsumeExpectedToken(TokenKind::kw_minLOD)) {
774814
if (Params.MinLOD.has_value()) {
@@ -935,6 +975,58 @@ RootSignatureParser::parseTextureAddressMode() {
935975
return std::nullopt;
936976
}
937977

978+
std::optional<llvm::hlsl::rootsig::ComparisonFunc>
979+
RootSignatureParser::parseComparisonFunc() {
980+
assert(CurToken.TokKind == TokenKind::pu_equal &&
981+
"Expects to only be invoked starting at given keyword");
982+
983+
TokenKind Expected[] = {
984+
#define COMPARISON_FUNC_ENUM(NAME, LIT) TokenKind::en_##NAME,
985+
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
986+
};
987+
988+
if (!tryConsumeExpectedToken(Expected))
989+
return std::nullopt;
990+
991+
switch (CurToken.TokKind) {
992+
#define COMPARISON_FUNC_ENUM(NAME, LIT) \
993+
case TokenKind::en_##NAME: \
994+
return ComparisonFunc::NAME; \
995+
break;
996+
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
997+
default:
998+
llvm_unreachable("Switch for consumed enum token was not provided");
999+
}
1000+
1001+
return std::nullopt;
1002+
}
1003+
1004+
std::optional<llvm::hlsl::rootsig::StaticBorderColor>
1005+
RootSignatureParser::parseStaticBorderColor() {
1006+
assert(CurToken.TokKind == TokenKind::pu_equal &&
1007+
"Expects to only be invoked starting at given keyword");
1008+
1009+
TokenKind Expected[] = {
1010+
#define STATIC_BORDER_COLOR_ENUM(NAME, LIT) TokenKind::en_##NAME,
1011+
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
1012+
};
1013+
1014+
if (!tryConsumeExpectedToken(Expected))
1015+
return std::nullopt;
1016+
1017+
switch (CurToken.TokKind) {
1018+
#define STATIC_BORDER_COLOR_ENUM(NAME, LIT) \
1019+
case TokenKind::en_##NAME: \
1020+
return StaticBorderColor::NAME; \
1021+
break;
1022+
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
1023+
default:
1024+
llvm_unreachable("Switch for consumed enum token was not provided");
1025+
}
1026+
1027+
return std::nullopt;
1028+
}
1029+
9381030
std::optional<llvm::hlsl::rootsig::RootDescriptorFlags>
9391031
RootSignatureParser::parseRootDescriptorFlags() {
9401032
assert(CurToken.TokKind == TokenKind::pu_equal &&

clang/unittests/Lex/LexHLSLRootSignatureTest.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,8 @@ TEST_F(LexHLSLRootSignatureTest, ValidLexAllTokensTest) {
137137
numDescriptors offset
138138
139139
mipLODBias addressU addressV addressW
140-
maxAnisotropy minLOD maxLOD
140+
maxAnisotropy comparisonFunc borderColor
141+
minLOD maxLOD
141142
142143
unbounded
143144
DESCRIPTOR_RANGE_OFFSET_APPEND
@@ -175,6 +176,21 @@ TEST_F(LexHLSLRootSignatureTest, ValidLexAllTokensTest) {
175176
TEXTURE_ADDRESS_CLAMP
176177
TEXTURE_ADDRESS_BORDER
177178
TEXTURE_ADDRESS_MIRRORONCE
179+
180+
comparison_never
181+
comparison_less
182+
comparison_equal
183+
comparison_less_equal
184+
comparison_greater
185+
comparison_not_equal
186+
comparison_greater_equal
187+
comparison_always
188+
189+
STATIC_BORDER_COLOR_TRANSPARENT_BLACK
190+
STATIC_BORDER_COLOR_OPAQUE_BLACK
191+
STATIC_BORDER_COLOR_OPAQUE_WHITE
192+
STATIC_BORDER_COLOR_OPAQUE_BLACK_UINT
193+
STATIC_BORDER_COLOR_OPAQUE_WHITE_UINT
178194
)cc";
179195
auto TokLoc = SourceLocation();
180196
hlsl::RootSignatureLexer Lexer(Source, TokLoc);

clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,9 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
230230
minLOD = 4.2f, mipLODBias = 0.23e+3,
231231
addressW = TEXTURE_ADDRESS_CLAMP,
232232
addressV = TEXTURE_ADDRESS_BORDER,
233-
maxLOD = 9000, addressU = TEXTURE_ADDRESS_MIRROR
233+
maxLOD = 9000, addressU = TEXTURE_ADDRESS_MIRROR,
234+
comparisonFunc = COMPARISON_NOT_EQUAL,
235+
borderColor = STATIC_BORDER_COLOR_OPAQUE_BLACK_UINT
234236
)
235237
)cc";
236238

@@ -259,6 +261,9 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
259261
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressW, TextureAddressMode::Wrap);
260262
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 0.f);
261263
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 16u);
264+
ASSERT_EQ(std::get<StaticSampler>(Elem).CompFunc, ComparisonFunc::LessEqual);
265+
ASSERT_EQ(std::get<StaticSampler>(Elem).BorderColor,
266+
StaticBorderColor::OpaqueWhite);
262267
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MinLOD, 0.f);
263268
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 3.402823466e+38f);
264269

@@ -272,6 +277,9 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
272277
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressW, TextureAddressMode::Clamp);
273278
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 230.f);
274279
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 3u);
280+
ASSERT_EQ(std::get<StaticSampler>(Elem).CompFunc, ComparisonFunc::NotEqual);
281+
ASSERT_EQ(std::get<StaticSampler>(Elem).BorderColor,
282+
StaticBorderColor::OpaqueBlackUint);
275283
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MinLOD, 4.2f);
276284
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 9000.f);
277285

llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,25 @@ enum class TextureAddressMode {
8484
MirrorOnce = 5
8585
};
8686

87+
enum class ComparisonFunc : unsigned {
88+
Never = 1,
89+
Less = 2,
90+
Equal = 3,
91+
LessEqual = 4,
92+
Greater = 5,
93+
NotEqual = 6,
94+
GreaterEqual = 7,
95+
Always = 8
96+
};
97+
98+
enum class StaticBorderColor {
99+
TransparentBlack = 0,
100+
OpaqueBlack = 1,
101+
OpaqueWhite = 2,
102+
OpaqueBlackUint = 3,
103+
OpaqueWhiteUint = 4
104+
};
105+
87106
// Definitions of the in-memory data layout structures
88107

89108
// Models the different registers: bReg | tReg | uReg | sReg
@@ -170,6 +189,8 @@ struct StaticSampler {
170189
TextureAddressMode AddressW = TextureAddressMode::Wrap;
171190
float MipLODBias = 0.f;
172191
uint32_t MaxAnisotropy = 16;
192+
ComparisonFunc CompFunc = ComparisonFunc::LessEqual;
193+
StaticBorderColor BorderColor = StaticBorderColor::OpaqueWhite;
173194
float MinLOD = 0.f;
174195
float MaxLOD = std::numeric_limits<float>::max();
175196
};

0 commit comments

Comments
 (0)