Skip to content

Commit dfc2c15

Browse files
authored
[HLSL][RootSignature] Add parsing of filter enum for StaticSampler (#140294)
- defines in-memory reprsentation of `filter` - defines parsing of the `Filter` enum - integrates parsing of these number parameters with their respective, `parseFilter` - adds basic unit tests to demonstrate setting functionality Part 5 of #126574
1 parent 494c82e commit dfc2c15

File tree

6 files changed

+181
-5
lines changed

6 files changed

+181
-5
lines changed

clang/include/clang/Lex/HLSLRootSignatureTokenKinds.def

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@
5353
#ifndef SHADER_VISIBILITY_ENUM
5454
#define SHADER_VISIBILITY_ENUM(NAME, LIT) ENUM(NAME, LIT)
5555
#endif
56+
#ifndef FILTER_ENUM
57+
#define FILTER_ENUM(NAME, LIT) ENUM(NAME, LIT)
58+
#endif
5659
#ifndef TEXTURE_ADDRESS_MODE_ENUM
5760
#define TEXTURE_ADDRESS_MODE_ENUM(NAME, LIT) ENUM(NAME, LIT)
5861
#endif
@@ -104,10 +107,11 @@ KEYWORD(numDescriptors)
104107
KEYWORD(offset)
105108

106109
// StaticSampler Keywords:
107-
KEYWORD(mipLODBias)
110+
KEYWORD(filter)
108111
KEYWORD(addressU)
109112
KEYWORD(addressV)
110113
KEYWORD(addressW)
114+
KEYWORD(mipLODBias)
111115
KEYWORD(maxAnisotropy)
112116
KEYWORD(minLOD)
113117
KEYWORD(maxLOD)
@@ -154,6 +158,44 @@ SHADER_VISIBILITY_ENUM(Pixel, "SHADER_VISIBILITY_PIXEL")
154158
SHADER_VISIBILITY_ENUM(Amplification, "SHADER_VISIBILITY_AMPLIFICATION")
155159
SHADER_VISIBILITY_ENUM(Mesh, "SHADER_VISIBILITY_MESH")
156160

161+
// Filter Enums:
162+
FILTER_ENUM(MinMagMipPoint, "FILTER_MIN_MAG_MIP_POINT")
163+
FILTER_ENUM(MinMagPointMipLinear, "FILTER_MIN_MAG_POINT_MIP_LINEAR")
164+
FILTER_ENUM(MinPointMagLinearMipPoint, "FILTER_MIN_POINT_MAG_LINEAR_MIP_POINT")
165+
FILTER_ENUM(MinPointMagMipLinear, "FILTER_MIN_POINT_MAG_MIP_LINEAR")
166+
FILTER_ENUM(MinLinearMagMipPoint, "FILTER_MIN_LINEAR_MAG_MIP_POINT")
167+
FILTER_ENUM(MinLinearMagPointMipLinear, "FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR")
168+
FILTER_ENUM(MinMagLinearMipPoint, "FILTER_MIN_MAG_LINEAR_MIP_POINT")
169+
FILTER_ENUM(MinMagMipLinear, "FILTER_MIN_MAG_MIP_LINEAR")
170+
FILTER_ENUM(Anisotropic, "FILTER_ANISOTROPIC")
171+
FILTER_ENUM(ComparisonMinMagMipPoint, "FILTER_COMPARISON_MIN_MAG_MIP_POINT")
172+
FILTER_ENUM(ComparisonMinMagPointMipLinear, "FILTER_COMPARISON_MIN_MAG_POINT_MIP_LINEAR")
173+
FILTER_ENUM(ComparisonMinPointMagLinearMipPoint, "FILTER_COMPARISON_MIN_POINT_MAG_LINEAR_MIP_POINT")
174+
FILTER_ENUM(ComparisonMinPointMagMipLinear, "FILTER_COMPARISON_MIN_POINT_MAG_MIP_LINEAR")
175+
FILTER_ENUM(ComparisonMinLinearMagMipPoint, "FILTER_COMPARISON_MIN_LINEAR_MAG_MIP_POINT")
176+
FILTER_ENUM(ComparisonMinLinearMagPointMipLinear, "FILTER_COMPARISON_MIN_LINEAR_MAG_POINT_MIP_LINEAR")
177+
FILTER_ENUM(ComparisonMinMagLinearMipPoint, "FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT")
178+
FILTER_ENUM(ComparisonMinMagMipLinear, "FILTER_COMPARISON_MIN_MAG_MIP_LINEAR")
179+
FILTER_ENUM(ComparisonAnisotropic, "FILTER_COMPARISON_ANISOTROPIC")
180+
FILTER_ENUM(MinimumMinMagMipPoint, "FILTER_MINIMUM_MIN_MAG_MIP_POINT")
181+
FILTER_ENUM(MinimumMinMagPointMipLinear, "FILTER_MINIMUM_MIN_MAG_POINT_MIP_LINEAR")
182+
FILTER_ENUM(MinimumMinPointMagLinearMipPoint, "FILTER_MINIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT")
183+
FILTER_ENUM(MinimumMinPointMagMipLinear, "FILTER_MINIMUM_MIN_POINT_MAG_MIP_LINEAR")
184+
FILTER_ENUM(MinimumMinLinearMagMipPoint, "FILTER_MINIMUM_MIN_LINEAR_MAG_MIP_POINT")
185+
FILTER_ENUM(MinimumMinLinearMagPointMipLinear, "FILTER_MINIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR")
186+
FILTER_ENUM(MinimumMinMagLinearMipPoint, "FILTER_MINIMUM_MIN_MAG_LINEAR_MIP_POINT")
187+
FILTER_ENUM(MinimumMinMagMipLinear, "FILTER_MINIMUM_MIN_MAG_MIP_LINEAR")
188+
FILTER_ENUM(MinimumAnisotropic, "FILTER_MINIMUM_ANISOTROPIC")
189+
FILTER_ENUM(MaximumMinMagMipPoint, "FILTER_MAXIMUM_MIN_MAG_MIP_POINT")
190+
FILTER_ENUM(MaximumMinMagPointMipLinear, "FILTER_MAXIMUM_MIN_MAG_POINT_MIP_LINEAR")
191+
FILTER_ENUM(MaximumMinPointMagLinearMipPoint, "FILTER_MAXIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT")
192+
FILTER_ENUM(MaximumMinPointMagMipLinear, "FILTER_MAXIMUM_MIN_POINT_MAG_MIP_LINEAR")
193+
FILTER_ENUM(MaximumMinLinearMagMipPoint, "FILTER_MAXIMUM_MIN_LINEAR_MAG_MIP_POINT")
194+
FILTER_ENUM(MaximumMinLinearMagPointMipLinear, "FILTER_MAXIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR")
195+
FILTER_ENUM(MaximumMinMagLinearMipPoint, "FILTER_MAXIMUM_MIN_MAG_LINEAR_MIP_POINT")
196+
FILTER_ENUM(MaximumMinMagMipLinear, "FILTER_MAXIMUM_MIN_MAG_MIP_LINEAR")
197+
FILTER_ENUM(MaximumAnisotropic, "FILTER_MAXIMUM_ANISOTROPIC")
198+
157199
// Texture Address Mode Enums:
158200
TEXTURE_ADDRESS_MODE_ENUM(Wrap, "TEXTURE_ADDRESS_WRAP")
159201
TEXTURE_ADDRESS_MODE_ENUM(Mirror, "TEXTURE_ADDRESS_MIRROR")
@@ -162,6 +204,7 @@ TEXTURE_ADDRESS_MODE_ENUM(Border, "TEXTURE_ADDRESS_BORDER")
162204
TEXTURE_ADDRESS_MODE_ENUM(MirrorOnce, "TEXTURE_ADDRESS_MIRRORONCE")
163205

164206
#undef TEXTURE_ADDRESS_MODE_ENUM
207+
#undef FILTER_ENUM
165208
#undef SHADER_VISIBILITY_ENUM
166209
#undef DESCRIPTOR_RANGE_FLAG_ENUM
167210
#undef DESCRIPTOR_RANGE_FLAG_ENUM_OFF

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/Lex/LexHLSLRootSignatureTest.cpp

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,8 @@ TEST_F(LexHLSLRootSignatureTest, ValidLexAllTokensTest) {
136136
space visibility flags
137137
numDescriptors offset
138138
139-
mipLODBias addressU addressV addressW
140-
maxAnisotropy minLOD maxLOD
139+
filter addressU addressV addressW
140+
mipLODBias maxAnisotropy minLOD maxLOD
141141
142142
unbounded
143143
DESCRIPTOR_RANGE_OFFSET_APPEND
@@ -170,6 +170,43 @@ TEST_F(LexHLSLRootSignatureTest, ValidLexAllTokensTest) {
170170
shader_visibility_amplification
171171
shader_visibility_mesh
172172
173+
FILTER_MIN_MAG_MIP_POINT
174+
FILTER_MIN_MAG_POINT_MIP_LINEAR
175+
FILTER_MIN_POINT_MAG_LINEAR_MIP_POINT
176+
FILTER_MIN_POINT_MAG_MIP_LINEAR
177+
FILTER_MIN_LINEAR_MAG_MIP_POINT
178+
FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR
179+
FILTER_MIN_MAG_LINEAR_MIP_POINT
180+
FILTER_MIN_MAG_MIP_LINEAR
181+
FILTER_ANISOTROPIC
182+
FILTER_COMPARISON_MIN_MAG_MIP_POINT
183+
FILTER_COMPARISON_MIN_MAG_POINT_MIP_LINEAR
184+
FILTER_COMPARISON_MIN_POINT_MAG_LINEAR_MIP_POINT
185+
FILTER_COMPARISON_MIN_POINT_MAG_MIP_LINEAR
186+
FILTER_COMPARISON_MIN_LINEAR_MAG_MIP_POINT
187+
FILTER_COMPARISON_MIN_LINEAR_MAG_POINT_MIP_LINEAR
188+
FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT
189+
FILTER_COMPARISON_MIN_MAG_MIP_LINEAR
190+
FILTER_COMPARISON_ANISOTROPIC
191+
FILTER_MINIMUM_MIN_MAG_MIP_POINT
192+
FILTER_MINIMUM_MIN_MAG_POINT_MIP_LINEAR
193+
FILTER_MINIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT
194+
FILTER_MINIMUM_MIN_POINT_MAG_MIP_LINEAR
195+
FILTER_MINIMUM_MIN_LINEAR_MAG_MIP_POINT
196+
FILTER_MINIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR
197+
FILTER_MINIMUM_MIN_MAG_LINEAR_MIP_POINT
198+
FILTER_MINIMUM_MIN_MAG_MIP_LINEAR
199+
FILTER_MINIMUM_ANISOTROPIC
200+
FILTER_MAXIMUM_MIN_MAG_MIP_POINT
201+
FILTER_MAXIMUM_MIN_MAG_POINT_MIP_LINEAR
202+
FILTER_MAXIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT
203+
FILTER_MAXIMUM_MIN_POINT_MAG_MIP_LINEAR
204+
FILTER_MAXIMUM_MIN_LINEAR_MAG_MIP_POINT
205+
FILTER_MAXIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR
206+
FILTER_MAXIMUM_MIN_MAG_LINEAR_MIP_POINT
207+
FILTER_MAXIMUM_MIN_MAG_MIP_LINEAR
208+
FILTER_MAXIMUM_ANISOTROPIC
209+
173210
TEXTURE_ADDRESS_WRAP
174211
TEXTURE_ADDRESS_MIRROR
175212
TEXTURE_ADDRESS_CLAMP

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: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@ class Metadata;
2727
namespace hlsl {
2828
namespace rootsig {
2929

30-
// Definition of the various enumerations and flags
30+
// Definition of the various enumerations and flags. The definitions of all
31+
// values here correspond to their description in the d3d12.h header and are
32+
// carried over from their values in DXC. For reference:
33+
// https://learn.microsoft.com/en-us/windows/win32/api/d3d12/
3134

3235
enum class RootFlags : uint32_t {
3336
None = 0,
@@ -76,6 +79,47 @@ enum class ShaderVisibility {
7679
Mesh = 7,
7780
};
7881

82+
// D3D12_FILTER enumeration:
83+
// https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ne-d3d12-d3d12_filter
84+
enum class Filter {
85+
MinMagMipPoint = 0,
86+
MinMagPointMipLinear = 0x1,
87+
MinPointMagLinearMipPoint = 0x4,
88+
MinPointMagMipLinear = 0x5,
89+
MinLinearMagMipPoint = 0x10,
90+
MinLinearMagPointMipLinear = 0x11,
91+
MinMagLinearMipPoint = 0x14,
92+
MinMagMipLinear = 0x15,
93+
Anisotropic = 0x55,
94+
ComparisonMinMagMipPoint = 0x80,
95+
ComparisonMinMagPointMipLinear = 0x81,
96+
ComparisonMinPointMagLinearMipPoint = 0x84,
97+
ComparisonMinPointMagMipLinear = 0x85,
98+
ComparisonMinLinearMagMipPoint = 0x90,
99+
ComparisonMinLinearMagPointMipLinear = 0x91,
100+
ComparisonMinMagLinearMipPoint = 0x94,
101+
ComparisonMinMagMipLinear = 0x95,
102+
ComparisonAnisotropic = 0xd5,
103+
MinimumMinMagMipPoint = 0x100,
104+
MinimumMinMagPointMipLinear = 0x101,
105+
MinimumMinPointMagLinearMipPoint = 0x104,
106+
MinimumMinPointMagMipLinear = 0x105,
107+
MinimumMinLinearMagMipPoint = 0x110,
108+
MinimumMinLinearMagPointMipLinear = 0x111,
109+
MinimumMinMagLinearMipPoint = 0x114,
110+
MinimumMinMagMipLinear = 0x115,
111+
MinimumAnisotropic = 0x155,
112+
MaximumMinMagMipPoint = 0x180,
113+
MaximumMinMagPointMipLinear = 0x181,
114+
MaximumMinPointMagLinearMipPoint = 0x184,
115+
MaximumMinPointMagMipLinear = 0x185,
116+
MaximumMinLinearMagMipPoint = 0x190,
117+
MaximumMinLinearMagPointMipLinear = 0x191,
118+
MaximumMinMagLinearMipPoint = 0x194,
119+
MaximumMinMagMipLinear = 0x195,
120+
MaximumAnisotropic = 0x1d5
121+
};
122+
79123
enum class TextureAddressMode {
80124
Wrap = 1,
81125
Mirror = 2,
@@ -165,6 +209,7 @@ raw_ostream &operator<<(raw_ostream &OS, const DescriptorTableClause &Clause);
165209

166210
struct StaticSampler {
167211
Register Reg;
212+
Filter Filter = Filter::Anisotropic;
168213
TextureAddressMode AddressU = TextureAddressMode::Wrap;
169214
TextureAddressMode AddressV = TextureAddressMode::Wrap;
170215
TextureAddressMode AddressW = TextureAddressMode::Wrap;

0 commit comments

Comments
 (0)