Skip to content

Commit 2b5b8db

Browse files
authored
[HLSL][RootSignature] Add parsing of address params in StaticSampler (#140293)
- defines in-memory reprsentation of `address[U|V|W]` - defines parsing of the `TextureAddressMode` enum - integrates parsing of these number parameters with their respective, `parseTextureAddressMode` - adds basic unit tests to demonstrate setting functionality Part 4 of #126574
1 parent e60b633 commit 2b5b8db

File tree

6 files changed

+133
-2
lines changed

6 files changed

+133
-2
lines changed

clang/include/clang/Lex/HLSLRootSignatureTokenKinds.def

Lines changed: 14 additions & 0 deletions
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 TEXTURE_ADDRESS_MODE_ENUM
57+
#define TEXTURE_ADDRESS_MODE_ENUM(NAME, LIT) ENUM(NAME, LIT)
58+
#endif
5659

5760
// General Tokens:
5861
TOK(invalid, "invalid identifier")
@@ -102,6 +105,9 @@ KEYWORD(offset)
102105

103106
// StaticSampler Keywords:
104107
KEYWORD(mipLODBias)
108+
KEYWORD(addressU)
109+
KEYWORD(addressV)
110+
KEYWORD(addressW)
105111
KEYWORD(maxAnisotropy)
106112
KEYWORD(minLOD)
107113
KEYWORD(maxLOD)
@@ -148,6 +154,14 @@ SHADER_VISIBILITY_ENUM(Pixel, "SHADER_VISIBILITY_PIXEL")
148154
SHADER_VISIBILITY_ENUM(Amplification, "SHADER_VISIBILITY_AMPLIFICATION")
149155
SHADER_VISIBILITY_ENUM(Mesh, "SHADER_VISIBILITY_MESH")
150156

157+
// Texture Address Mode Enums:
158+
TEXTURE_ADDRESS_MODE_ENUM(Wrap, "TEXTURE_ADDRESS_WRAP")
159+
TEXTURE_ADDRESS_MODE_ENUM(Mirror, "TEXTURE_ADDRESS_MIRROR")
160+
TEXTURE_ADDRESS_MODE_ENUM(Clamp, "TEXTURE_ADDRESS_CLAMP")
161+
TEXTURE_ADDRESS_MODE_ENUM(Border, "TEXTURE_ADDRESS_BORDER")
162+
TEXTURE_ADDRESS_MODE_ENUM(MirrorOnce, "TEXTURE_ADDRESS_MIRRORONCE")
163+
164+
#undef TEXTURE_ADDRESS_MODE_ENUM
151165
#undef SHADER_VISIBILITY_ENUM
152166
#undef DESCRIPTOR_RANGE_FLAG_ENUM
153167
#undef DESCRIPTOR_RANGE_FLAG_ENUM_OFF

clang/include/clang/Parse/ParseHLSLRootSignature.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,9 @@ class RootSignatureParser {
112112
struct ParsedStaticSamplerParams {
113113
std::optional<llvm::hlsl::rootsig::Register> Reg;
114114
std::optional<float> MipLODBias;
115+
std::optional<llvm::hlsl::rootsig::TextureAddressMode> AddressU;
116+
std::optional<llvm::hlsl::rootsig::TextureAddressMode> AddressV;
117+
std::optional<llvm::hlsl::rootsig::TextureAddressMode> AddressW;
115118
std::optional<uint32_t> MaxAnisotropy;
116119
std::optional<float> MinLOD;
117120
std::optional<float> MaxLOD;
@@ -125,6 +128,8 @@ class RootSignatureParser {
125128

126129
/// Parsing methods of various enums
127130
std::optional<llvm::hlsl::rootsig::ShaderVisibility> parseShaderVisibility();
131+
std::optional<llvm::hlsl::rootsig::TextureAddressMode>
132+
parseTextureAddressMode();
128133
std::optional<llvm::hlsl::rootsig::RootDescriptorFlags>
129134
parseRootDescriptorFlags();
130135
std::optional<llvm::hlsl::rootsig::DescriptorRangeFlags>

clang/lib/Parse/ParseHLSLRootSignature.cpp

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

379379
// Fill in optional values
380+
if (Params->AddressU.has_value())
381+
Sampler.AddressU = Params->AddressU.value();
382+
383+
if (Params->AddressV.has_value())
384+
Sampler.AddressV = Params->AddressV.value();
385+
386+
if (Params->AddressW.has_value())
387+
Sampler.AddressW = Params->AddressW.value();
388+
380389
if (Params->MipLODBias.has_value())
381390
Sampler.MipLODBias = Params->MipLODBias.value();
382391

@@ -675,6 +684,57 @@ RootSignatureParser::parseStaticSamplerParams() {
675684
Params.Reg = Reg;
676685
}
677686

687+
// `addressU` `=` TEXTURE_ADDRESS
688+
if (tryConsumeExpectedToken(TokenKind::kw_addressU)) {
689+
if (Params.AddressU.has_value()) {
690+
getDiags().Report(CurToken.TokLoc, diag::err_hlsl_rootsig_repeat_param)
691+
<< CurToken.TokKind;
692+
return std::nullopt;
693+
}
694+
695+
if (consumeExpectedToken(TokenKind::pu_equal))
696+
return std::nullopt;
697+
698+
auto AddressU = parseTextureAddressMode();
699+
if (!AddressU.has_value())
700+
return std::nullopt;
701+
Params.AddressU = AddressU;
702+
}
703+
704+
// `addressV` `=` TEXTURE_ADDRESS
705+
if (tryConsumeExpectedToken(TokenKind::kw_addressV)) {
706+
if (Params.AddressV.has_value()) {
707+
getDiags().Report(CurToken.TokLoc, diag::err_hlsl_rootsig_repeat_param)
708+
<< CurToken.TokKind;
709+
return std::nullopt;
710+
}
711+
712+
if (consumeExpectedToken(TokenKind::pu_equal))
713+
return std::nullopt;
714+
715+
auto AddressV = parseTextureAddressMode();
716+
if (!AddressV.has_value())
717+
return std::nullopt;
718+
Params.AddressV = AddressV;
719+
}
720+
721+
// `addressW` `=` TEXTURE_ADDRESS
722+
if (tryConsumeExpectedToken(TokenKind::kw_addressW)) {
723+
if (Params.AddressW.has_value()) {
724+
getDiags().Report(CurToken.TokLoc, diag::err_hlsl_rootsig_repeat_param)
725+
<< CurToken.TokKind;
726+
return std::nullopt;
727+
}
728+
729+
if (consumeExpectedToken(TokenKind::pu_equal))
730+
return std::nullopt;
731+
732+
auto AddressW = parseTextureAddressMode();
733+
if (!AddressW.has_value())
734+
return std::nullopt;
735+
Params.AddressW = AddressW;
736+
}
737+
678738
// `mipLODBias` `=` NUMBER
679739
if (tryConsumeExpectedToken(TokenKind::kw_mipLODBias)) {
680740
if (Params.MipLODBias.has_value()) {
@@ -849,6 +909,32 @@ RootSignatureParser::parseShaderVisibility() {
849909
return std::nullopt;
850910
}
851911

912+
std::optional<llvm::hlsl::rootsig::TextureAddressMode>
913+
RootSignatureParser::parseTextureAddressMode() {
914+
assert(CurToken.TokKind == TokenKind::pu_equal &&
915+
"Expects to only be invoked starting at given keyword");
916+
917+
TokenKind Expected[] = {
918+
#define TEXTURE_ADDRESS_MODE_ENUM(NAME, LIT) TokenKind::en_##NAME,
919+
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
920+
};
921+
922+
if (!tryConsumeExpectedToken(Expected))
923+
return std::nullopt;
924+
925+
switch (CurToken.TokKind) {
926+
#define TEXTURE_ADDRESS_MODE_ENUM(NAME, LIT) \
927+
case TokenKind::en_##NAME: \
928+
return TextureAddressMode::NAME; \
929+
break;
930+
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
931+
default:
932+
llvm_unreachable("Switch for consumed enum token was not provided");
933+
}
934+
935+
return std::nullopt;
936+
}
937+
852938
std::optional<llvm::hlsl::rootsig::RootDescriptorFlags>
853939
RootSignatureParser::parseRootDescriptorFlags() {
854940
assert(CurToken.TokKind == TokenKind::pu_equal &&

clang/unittests/Lex/LexHLSLRootSignatureTest.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,8 @@ TEST_F(LexHLSLRootSignatureTest, ValidLexAllTokensTest) {
136136
space visibility flags
137137
numDescriptors offset
138138
139-
mipLODBias maxAnisotropy minLOD maxLOD
139+
mipLODBias addressU addressV addressW
140+
maxAnisotropy minLOD maxLOD
140141
141142
unbounded
142143
DESCRIPTOR_RANGE_OFFSET_APPEND
@@ -168,6 +169,12 @@ TEST_F(LexHLSLRootSignatureTest, ValidLexAllTokensTest) {
168169
shader_visibility_pixel
169170
shader_visibility_amplification
170171
shader_visibility_mesh
172+
173+
TEXTURE_ADDRESS_WRAP
174+
TEXTURE_ADDRESS_MIRROR
175+
TEXTURE_ADDRESS_CLAMP
176+
TEXTURE_ADDRESS_BORDER
177+
TEXTURE_ADDRESS_MIRRORONCE
171178
)cc";
172179
auto TokLoc = SourceLocation();
173180
hlsl::RootSignatureLexer Lexer(Source, TokLoc);

clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,9 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
228228
StaticSampler(s0),
229229
StaticSampler(s0, maxAnisotropy = 3,
230230
minLOD = 4.2f, mipLODBias = 0.23e+3,
231-
maxLOD = 9000,
231+
addressW = TEXTURE_ADDRESS_CLAMP,
232+
addressV = TEXTURE_ADDRESS_BORDER,
233+
maxLOD = 9000, addressU = TEXTURE_ADDRESS_MIRROR
232234
)
233235
)cc";
234236

@@ -252,6 +254,9 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
252254
ASSERT_TRUE(std::holds_alternative<StaticSampler>(Elem));
253255
ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.ViewType, RegisterType::SReg);
254256
ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.Number, 0u);
257+
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressU, TextureAddressMode::Wrap);
258+
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressV, TextureAddressMode::Wrap);
259+
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressW, TextureAddressMode::Wrap);
255260
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 0.f);
256261
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 16u);
257262
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MinLOD, 0.f);
@@ -262,6 +267,9 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
262267
ASSERT_TRUE(std::holds_alternative<StaticSampler>(Elem));
263268
ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.ViewType, RegisterType::SReg);
264269
ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.Number, 0u);
270+
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressU, TextureAddressMode::Mirror);
271+
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressV, TextureAddressMode::Border);
272+
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressW, TextureAddressMode::Clamp);
265273
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 230.f);
266274
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 3u);
267275
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MinLOD, 4.2f);

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

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

79+
enum class TextureAddressMode {
80+
Wrap = 1,
81+
Mirror = 2,
82+
Clamp = 3,
83+
Border = 4,
84+
MirrorOnce = 5
85+
};
86+
7987
// Definitions of the in-memory data layout structures
8088

8189
// Models the different registers: bReg | tReg | uReg | sReg
@@ -157,6 +165,9 @@ raw_ostream &operator<<(raw_ostream &OS, const DescriptorTableClause &Clause);
157165

158166
struct StaticSampler {
159167
Register Reg;
168+
TextureAddressMode AddressU = TextureAddressMode::Wrap;
169+
TextureAddressMode AddressV = TextureAddressMode::Wrap;
170+
TextureAddressMode AddressW = TextureAddressMode::Wrap;
160171
float MipLODBias = 0.f;
161172
uint32_t MaxAnisotropy = 16;
162173
float MinLOD = 0.f;

0 commit comments

Comments
 (0)