Skip to content

Commit 60127c8

Browse files
committed
add parsing of comparisonfunc
1 parent e3e711f commit 60127c8

File tree

4 files changed

+66
-1
lines changed

4 files changed

+66
-1
lines changed

clang/include/clang/Parse/ParseHLSLRootSignature.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ class RootSignatureParser {
117117
std::optional<llvm::hlsl::rootsig::TextureAddressMode> AddressW;
118118
std::optional<float> MipLODBias;
119119
std::optional<uint32_t> MaxAnisotropy;
120+
std::optional<llvm::hlsl::rootsig::ComparisonFunc> ComparisonFunc;
120121
std::optional<float> MinLOD;
121122
std::optional<float> MaxLOD;
122123
};
@@ -132,6 +133,7 @@ class RootSignatureParser {
132133
std::optional<llvm::hlsl::rootsig::Filter> parseFilter();
133134
std::optional<llvm::hlsl::rootsig::TextureAddressMode>
134135
parseTextureAddressMode();
136+
std::optional<llvm::hlsl::rootsig::ComparisonFunc> parseComparisonFunc();
135137
std::optional<llvm::hlsl::rootsig::RootDescriptorFlags>
136138
parseRootDescriptorFlags();
137139
std::optional<llvm::hlsl::rootsig::DescriptorRangeFlags>

clang/lib/Parse/ParseHLSLRootSignature.cpp

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,9 @@ std::optional<StaticSampler> RootSignatureParser::parseStaticSampler() {
399399
if (Params->MaxAnisotropy.has_value())
400400
Sampler.MaxAnisotropy = Params->MaxAnisotropy.value();
401401

402+
if (Params->ComparisonFunc.has_value())
403+
Sampler.ComparisonFunc= Params->ComparisonFunc.value();
404+
402405
if (Params->MinLOD.has_value())
403406
Sampler.MinLOD = Params->MinLOD.value();
404407

@@ -793,6 +796,24 @@ RootSignatureParser::parseStaticSamplerParams() {
793796
Params.MaxAnisotropy = MaxAnisotropy;
794797
}
795798

799+
800+
// `comparisonFunc` `=` COMPARISON_FUNC
801+
if (tryConsumeExpectedToken(TokenKind::kw_comparisonFunc)) {
802+
if (Params.ComparisonFunc.has_value()) {
803+
getDiags().Report(CurToken.TokLoc, diag::err_hlsl_rootsig_repeat_param)
804+
<< CurToken.TokKind;
805+
return std::nullopt;
806+
}
807+
808+
if (consumeExpectedToken(TokenKind::pu_equal))
809+
return std::nullopt;
810+
811+
auto ComparisonFunc = parseComparisonFunc();
812+
if (!ComparisonFunc.has_value())
813+
return std::nullopt;
814+
Params.ComparisonFunc = ComparisonFunc;
815+
}
816+
796817
// `minLOD` `=` NUMBER
797818
if (tryConsumeExpectedToken(TokenKind::kw_minLOD)) {
798819
if (Params.MinLOD.has_value()) {
@@ -980,6 +1001,32 @@ RootSignatureParser::parseTextureAddressMode() {
9801001
return std::nullopt;
9811002
}
9821003

1004+
std::optional<llvm::hlsl::rootsig::ComparisonFunc>
1005+
RootSignatureParser::parseComparisonFunc() {
1006+
assert(CurToken.TokKind == TokenKind::pu_equal &&
1007+
"Expects to only be invoked starting at given keyword");
1008+
1009+
TokenKind Expected[] = {
1010+
#define COMPARISON_FUNC_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 COMPARISON_FUNC_ENUM(NAME, LIT) \
1019+
case TokenKind::en_##NAME: \
1020+
return ComparisonFunc::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+
9831030
std::optional<llvm::hlsl::rootsig::RootDescriptorFlags>
9841031
RootSignatureParser::parseRootDescriptorFlags() {
9851032
assert(CurToken.TokKind == TokenKind::pu_equal &&

clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
231231
addressW = TEXTURE_ADDRESS_CLAMP,
232232
addressV = TEXTURE_ADDRESS_BORDER,
233233
filter = FILTER_MAXIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT,
234-
maxLOD = 9000, addressU = TEXTURE_ADDRESS_MIRROR
234+
maxLOD = 9000, addressU = TEXTURE_ADDRESS_MIRROR,
235+
comparisonFunc = COMPARISON_NOT_EQUAL
235236
)
236237
)cc";
237238

@@ -261,6 +262,7 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
261262
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressW, TextureAddressMode::Wrap);
262263
ASSERT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 0.f);
263264
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 16u);
265+
ASSERT_EQ(std::get<StaticSampler>(Elem).ComparisonFunc, ComparisonFunc::LessEqual);
264266
ASSERT_EQ(std::get<StaticSampler>(Elem).MinLOD, 0.f);
265267
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 3.402823466e+38f);
266268

@@ -276,6 +278,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
276278
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressW, TextureAddressMode::Clamp);
277279
ASSERT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 230.f);
278280
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 3u);
281+
ASSERT_EQ(std::get<StaticSampler>(Elem).ComparisonFunc,
282+
ComparisonFunc::NotEqual);
279283
ASSERT_EQ(std::get<StaticSampler>(Elem).MinLOD, 4.2f);
280284
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 9000.f);
281285

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,17 @@ enum class TextureAddressMode {
123123
MirrorOnce = 5
124124
};
125125

126+
enum class ComparisonFunc : unsigned {
127+
Never = 1,
128+
Less = 2,
129+
Equal = 3,
130+
LessEqual = 4,
131+
Greater = 5,
132+
NotEqual = 6,
133+
GreaterEqual = 7,
134+
Always = 8
135+
};
136+
126137
// Definitions of the in-memory data layout structures
127138

128139
// Models the different registers: bReg | tReg | uReg | sReg
@@ -213,6 +224,7 @@ struct StaticSampler {
213224
TextureAddressMode AddressW = TextureAddressMode::Wrap;
214225
float MipLODBias = 0.f;
215226
uint32_t MaxAnisotropy = 16;
227+
ComparisonFunc ComparisonFunc = ComparisonFunc::LessEqual;
216228
float MinLOD = 0.f;
217229
float MaxLOD = 3.402823466e+38f; // FLT_MAX
218230
};

0 commit comments

Comments
 (0)