Skip to content

Commit bb9f247

Browse files
committed
add parsing of Filter enum
1 parent 8889c7f commit bb9f247

File tree

4 files changed

+92
-1
lines changed

4 files changed

+92
-1
lines changed

clang/include/clang/Parse/ParseHLSLRootSignature.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,10 +111,11 @@ class RootSignatureParser {
111111

112112
struct ParsedStaticSamplerParams {
113113
std::optional<llvm::hlsl::rootsig::Register> Reg;
114-
std::optional<float> MipLODBias;
114+
std::optional<llvm::hlsl::rootsig::Filter> Filter;
115115
std::optional<llvm::hlsl::rootsig::TextureAddressMode> AddressU;
116116
std::optional<llvm::hlsl::rootsig::TextureAddressMode> AddressV;
117117
std::optional<llvm::hlsl::rootsig::TextureAddressMode> AddressW;
118+
std::optional<float> MipLODBias;
118119
std::optional<uint32_t> MaxAnisotropy;
119120
std::optional<float> MinLOD;
120121
std::optional<float> MaxLOD;
@@ -128,6 +129,7 @@ class RootSignatureParser {
128129

129130
/// Parsing methods of various enums
130131
std::optional<llvm::hlsl::rootsig::ShaderVisibility> parseShaderVisibility();
132+
std::optional<llvm::hlsl::rootsig::Filter> parseFilter();
131133
std::optional<llvm::hlsl::rootsig::TextureAddressMode>
132134
parseTextureAddressMode();
133135
std::optional<llvm::hlsl::rootsig::RootDescriptorFlags>

clang/lib/Parse/ParseHLSLRootSignature.cpp

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,9 @@ std::optional<StaticSampler> RootSignatureParser::parseStaticSampler() {
377377
Sampler.Reg = Params->Reg.value();
378378

379379
// Fill in optional values
380+
if (Params->Filter.has_value())
381+
Sampler.Filter = Params->Filter.value();
382+
380383
if (Params->AddressU.has_value())
381384
Sampler.AddressU = Params->AddressU.value();
382385

@@ -684,6 +687,23 @@ RootSignatureParser::parseStaticSamplerParams() {
684687
Params.Reg = Reg;
685688
}
686689

690+
// `filter` `=` FILTER
691+
if (tryConsumeExpectedToken(TokenKind::kw_filter)) {
692+
if (Params.Filter.has_value()) {
693+
getDiags().Report(CurToken.TokLoc, diag::err_hlsl_rootsig_repeat_param)
694+
<< CurToken.TokKind;
695+
return std::nullopt;
696+
}
697+
698+
if (consumeExpectedToken(TokenKind::pu_equal))
699+
return std::nullopt;
700+
701+
auto Filter = parseFilter();
702+
if (!Filter.has_value())
703+
return std::nullopt;
704+
Params.Filter = Filter;
705+
}
706+
687707
// `addressU` `=` TEXTURE_ADDRESS
688708
if (tryConsumeExpectedToken(TokenKind::kw_addressU)) {
689709
if (Params.AddressU.has_value()) {
@@ -909,6 +929,31 @@ RootSignatureParser::parseShaderVisibility() {
909929
return std::nullopt;
910930
}
911931

932+
std::optional<llvm::hlsl::rootsig::Filter> RootSignatureParser::parseFilter() {
933+
assert(CurToken.TokKind == TokenKind::pu_equal &&
934+
"Expects to only be invoked starting at given keyword");
935+
936+
TokenKind Expected[] = {
937+
#define FILTER_ENUM(NAME, LIT) TokenKind::en_##NAME,
938+
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
939+
};
940+
941+
if (!tryConsumeExpectedToken(Expected))
942+
return std::nullopt;
943+
944+
switch (CurToken.TokKind) {
945+
#define FILTER_ENUM(NAME, LIT) \
946+
case TokenKind::en_##NAME: \
947+
return Filter::NAME; \
948+
break;
949+
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
950+
default:
951+
llvm_unreachable("Switch for consumed enum token was not provided");
952+
}
953+
954+
return std::nullopt;
955+
}
956+
912957
std::optional<llvm::hlsl::rootsig::TextureAddressMode>
913958
RootSignatureParser::parseTextureAddressMode() {
914959
assert(CurToken.TokKind == TokenKind::pu_equal &&

clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
230230
minLOD = 4.2f, mipLODBias = 0.23e+3,
231231
addressW = TEXTURE_ADDRESS_CLAMP,
232232
addressV = TEXTURE_ADDRESS_BORDER,
233+
filter = FILTER_MAXIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT,
233234
maxLOD = 9000, addressU = TEXTURE_ADDRESS_MIRROR
234235
)
235236
)cc";
@@ -254,6 +255,7 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
254255
ASSERT_TRUE(std::holds_alternative<StaticSampler>(Elem));
255256
ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.ViewType, RegisterType::SReg);
256257
ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.Number, 0u);
258+
ASSERT_EQ(std::get<StaticSampler>(Elem).Filter, Filter::Anisotropic);
257259
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressU, TextureAddressMode::Wrap);
258260
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressV, TextureAddressMode::Wrap);
259261
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressW, TextureAddressMode::Wrap);
@@ -267,6 +269,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
267269
ASSERT_TRUE(std::holds_alternative<StaticSampler>(Elem));
268270
ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.ViewType, RegisterType::SReg);
269271
ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.Number, 0u);
272+
ASSERT_EQ(std::get<StaticSampler>(Elem).Filter,
273+
Filter::MaximumMinPointMagLinearMipPoint);
270274
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressU, TextureAddressMode::Mirror);
271275
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressV, TextureAddressMode::Border);
272276
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressW, TextureAddressMode::Clamp);

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

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,45 @@ enum class ShaderVisibility {
7676
Mesh = 7,
7777
};
7878

79+
enum class Filter {
80+
MinMagMipPoint = 0,
81+
MinMagPointMipLinear = 0x1,
82+
MinPointMagLinearMipPoint = 0x4,
83+
MinPointMagMipLinear = 0x5,
84+
MinLinearMagMipPoint = 0x10,
85+
MinLinearMagPointMipLinear = 0x11,
86+
MinMagLinearMipPoint = 0x14,
87+
MinMagMipLinear = 0x15,
88+
Anisotropic = 0x55,
89+
ComparisonMinMagMipPoint = 0x80,
90+
ComparisonMinMagPointMipLinear = 0x81,
91+
ComparisonMinPointMagLinearMipPoint = 0x84,
92+
ComparisonMinPointMagMipLinear = 0x85,
93+
ComparisonMinLinearMagMipPoint = 0x90,
94+
ComparisonMinLinearMagPointMipLinear = 0x91,
95+
ComparisonMinMagLinearMipPoint = 0x94,
96+
ComparisonMinMagMipLinear = 0x95,
97+
ComparisonAnisotropic = 0xd5,
98+
MinimumMinMagMipPoint = 0x100,
99+
MinimumMinMagPointMipLinear = 0x101,
100+
MinimumMinPointMagLinearMipPoint = 0x104,
101+
MinimumMinPointMagMipLinear = 0x105,
102+
MinimumMinLinearMagMipPoint = 0x110,
103+
MinimumMinLinearMagPointMipLinear = 0x111,
104+
MinimumMinMagLinearMipPoint = 0x114,
105+
MinimumMinMagMipLinear = 0x115,
106+
MinimumAnisotropic = 0x155,
107+
MaximumMinMagMipPoint = 0x180,
108+
MaximumMinMagPointMipLinear = 0x181,
109+
MaximumMinPointMagLinearMipPoint = 0x184,
110+
MaximumMinPointMagMipLinear = 0x185,
111+
MaximumMinLinearMagMipPoint = 0x190,
112+
MaximumMinLinearMagPointMipLinear = 0x191,
113+
MaximumMinMagLinearMipPoint = 0x194,
114+
MaximumMinMagMipLinear = 0x195,
115+
MaximumAnisotropic = 0x1d5
116+
};
117+
79118
enum class TextureAddressMode {
80119
Wrap = 1,
81120
Mirror = 2,
@@ -165,6 +204,7 @@ raw_ostream &operator<<(raw_ostream &OS, const DescriptorTableClause &Clause);
165204

166205
struct StaticSampler {
167206
Register Reg;
207+
Filter Filter = Filter::Anisotropic;
168208
TextureAddressMode AddressU = TextureAddressMode::Wrap;
169209
TextureAddressMode AddressV = TextureAddressMode::Wrap;
170210
TextureAddressMode AddressW = TextureAddressMode::Wrap;

0 commit comments

Comments
 (0)