Skip to content

Commit 469c039

Browse files
committed
add parsing of comparisonfunc
1 parent 94c9f29 commit 469c039

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
@@ -116,6 +116,7 @@ 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> ComparisonFunc;
119120
std::optional<float> MinLOD;
120121
std::optional<float> MaxLOD;
121122
};
@@ -130,6 +131,7 @@ class RootSignatureParser {
130131
std::optional<llvm::hlsl::rootsig::ShaderVisibility> parseShaderVisibility();
131132
std::optional<llvm::hlsl::rootsig::TextureAddressMode>
132133
parseTextureAddressMode();
134+
std::optional<llvm::hlsl::rootsig::ComparisonFunc> parseComparisonFunc();
133135
std::optional<llvm::hlsl::rootsig::RootDescriptorFlags>
134136
parseRootDescriptorFlags();
135137
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
@@ -392,6 +392,9 @@ std::optional<StaticSampler> RootSignatureParser::parseStaticSampler() {
392392
if (Params->MaxAnisotropy.has_value())
393393
Sampler.MaxAnisotropy = Params->MaxAnisotropy.value();
394394

395+
if (Params->ComparisonFunc.has_value())
396+
Sampler.ComparisonFunc= Params->ComparisonFunc.value();
397+
395398
if (Params->MinLOD.has_value())
396399
Sampler.MinLOD = Params->MinLOD.value();
397400

@@ -769,6 +772,24 @@ RootSignatureParser::parseStaticSamplerParams() {
769772
Params.MaxAnisotropy = MaxAnisotropy;
770773
}
771774

775+
776+
// `comparisonFunc` `=` COMPARISON_FUNC
777+
if (tryConsumeExpectedToken(TokenKind::kw_comparisonFunc)) {
778+
if (Params.ComparisonFunc.has_value()) {
779+
getDiags().Report(CurToken.TokLoc, diag::err_hlsl_rootsig_repeat_param)
780+
<< CurToken.TokKind;
781+
return std::nullopt;
782+
}
783+
784+
if (consumeExpectedToken(TokenKind::pu_equal))
785+
return std::nullopt;
786+
787+
auto ComparisonFunc = parseComparisonFunc();
788+
if (!ComparisonFunc.has_value())
789+
return std::nullopt;
790+
Params.ComparisonFunc = ComparisonFunc;
791+
}
792+
772793
// `minLOD` `=` NUMBER
773794
if (tryConsumeExpectedToken(TokenKind::kw_minLOD)) {
774795
if (Params.MinLOD.has_value()) {
@@ -935,6 +956,32 @@ RootSignatureParser::parseTextureAddressMode() {
935956
return std::nullopt;
936957
}
937958

959+
std::optional<llvm::hlsl::rootsig::ComparisonFunc>
960+
RootSignatureParser::parseComparisonFunc() {
961+
assert(CurToken.TokKind == TokenKind::pu_equal &&
962+
"Expects to only be invoked starting at given keyword");
963+
964+
TokenKind Expected[] = {
965+
#define COMPARISON_FUNC_ENUM(NAME, LIT) TokenKind::en_##NAME,
966+
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
967+
};
968+
969+
if (!tryConsumeExpectedToken(Expected))
970+
return std::nullopt;
971+
972+
switch (CurToken.TokKind) {
973+
#define COMPARISON_FUNC_ENUM(NAME, LIT) \
974+
case TokenKind::en_##NAME: \
975+
return ComparisonFunc::NAME; \
976+
break;
977+
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
978+
default:
979+
llvm_unreachable("Switch for consumed enum token was not provided");
980+
}
981+
982+
return std::nullopt;
983+
}
984+
938985
std::optional<llvm::hlsl::rootsig::RootDescriptorFlags>
939986
RootSignatureParser::parseRootDescriptorFlags() {
940987
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
@@ -230,7 +230,8 @@ 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
234235
)
235236
)cc";
236237

@@ -259,6 +260,7 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
259260
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressW, TextureAddressMode::Wrap);
260261
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 0.f);
261262
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 16u);
263+
ASSERT_EQ(std::get<StaticSampler>(Elem).ComparisonFunc, ComparisonFunc::LessEqual);
262264
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MinLOD, 0.f);
263265
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 3.402823466e+38f);
264266

@@ -272,6 +274,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
272274
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressW, TextureAddressMode::Clamp);
273275
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 230.f);
274276
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 3u);
277+
ASSERT_EQ(std::get<StaticSampler>(Elem).ComparisonFunc,
278+
ComparisonFunc::NotEqual);
275279
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MinLOD, 4.2f);
276280
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 9000.f);
277281

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,17 @@ 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+
8798
// Definitions of the in-memory data layout structures
8899

89100
// Models the different registers: bReg | tReg | uReg | sReg
@@ -170,6 +181,7 @@ struct StaticSampler {
170181
TextureAddressMode AddressW = TextureAddressMode::Wrap;
171182
float MipLODBias = 0.f;
172183
uint32_t MaxAnisotropy = 16;
184+
ComparisonFunc ComparisonFunc = ComparisonFunc::LessEqual;
173185
float MinLOD = 0.f;
174186
float MaxLOD = std::numeric_limits<float>::max();
175187
};

0 commit comments

Comments
 (0)