Skip to content

Commit 4f85c5b

Browse files
committed
add parsing of TextureAddressMode for addressU
1 parent 1eabfe2 commit 4f85c5b

File tree

4 files changed

+62
-1
lines changed

4 files changed

+62
-1
lines changed

clang/include/clang/Parse/ParseHLSLRootSignature.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ 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;
115116
std::optional<uint32_t> MaxAnisotropy;
116117
std::optional<float> MinLOD;
117118
std::optional<float> MaxLOD;
@@ -125,6 +126,8 @@ class RootSignatureParser {
125126

126127
/// Parsing methods of various enums
127128
std::optional<llvm::hlsl::rootsig::ShaderVisibility> parseShaderVisibility();
129+
std::optional<llvm::hlsl::rootsig::TextureAddressMode>
130+
parseTextureAddressMode();
128131
std::optional<llvm::hlsl::rootsig::RootDescriptorFlags>
129132
parseRootDescriptorFlags();
130133
std::optional<llvm::hlsl::rootsig::DescriptorRangeFlags>

clang/lib/Parse/ParseHLSLRootSignature.cpp

Lines changed: 46 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->AddressU.has_value())
381+
Sampler.AddressU = Params->AddressU.value();
382+
380383
if (Params->MipLODBias.has_value())
381384
Sampler.MipLODBias = Params->MipLODBias.value();
382385

@@ -675,6 +678,23 @@ RootSignatureParser::parseStaticSamplerParams() {
675678
Params.Reg = Reg;
676679
}
677680

681+
// `addressU` `=` TEXTURE_ADDRESS
682+
if (tryConsumeExpectedToken(TokenKind::kw_addressU)) {
683+
if (Params.AddressU.has_value()) {
684+
getDiags().Report(CurToken.TokLoc, diag::err_hlsl_rootsig_repeat_param)
685+
<< CurToken.TokKind;
686+
return std::nullopt;
687+
}
688+
689+
if (consumeExpectedToken(TokenKind::pu_equal))
690+
return std::nullopt;
691+
692+
auto AddressU = parseTextureAddressMode();
693+
if (!AddressU.has_value())
694+
return std::nullopt;
695+
Params.AddressU = AddressU;
696+
}
697+
678698
// `mipLODBias` `=` NUMBER
679699
if (tryConsumeExpectedToken(TokenKind::kw_mipLODBias)) {
680700
if (Params.MipLODBias.has_value()) {
@@ -849,6 +869,32 @@ RootSignatureParser::parseShaderVisibility() {
849869
return std::nullopt;
850870
}
851871

872+
std::optional<llvm::hlsl::rootsig::TextureAddressMode>
873+
RootSignatureParser::parseTextureAddressMode() {
874+
assert(CurToken.TokKind == TokenKind::pu_equal &&
875+
"Expects to only be invoked starting at given keyword");
876+
877+
TokenKind Expected[] = {
878+
#define TEXTURE_ADDRESS_MODE_ENUM(NAME, LIT) TokenKind::en_##NAME,
879+
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
880+
};
881+
882+
if (!tryConsumeExpectedToken(Expected))
883+
return std::nullopt;
884+
885+
switch (CurToken.TokKind) {
886+
#define TEXTURE_ADDRESS_MODE_ENUM(NAME, LIT) \
887+
case TokenKind::en_##NAME: \
888+
return TextureAddressMode::NAME; \
889+
break;
890+
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
891+
default:
892+
llvm_unreachable("Switch for consumed enum token was not provided");
893+
}
894+
895+
return std::nullopt;
896+
}
897+
852898
std::optional<llvm::hlsl::rootsig::RootDescriptorFlags>
853899
RootSignatureParser::parseRootDescriptorFlags() {
854900
assert(CurToken.TokKind == TokenKind::pu_equal &&

clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
228228
StaticSampler(s0),
229229
StaticSampler(s0, maxAnisotropy = 3,
230230
minLOD = 4.2f, mipLODBias = 0.23e+3,
231-
maxLOD = 9000,
231+
maxLOD = 9000, addressU = TEXTURE_ADDRESS_MIRROR
232232
)
233233
)cc";
234234

@@ -252,6 +252,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
252252
ASSERT_TRUE(std::holds_alternative<StaticSampler>(Elem));
253253
ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.ViewType, RegisterType::SReg);
254254
ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.Number, 0u);
255+
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressU, TextureAddressMode::Wrap);
256+
ASSERT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 0.f);
255257
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 0.f);
256258
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 16u);
257259
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MinLOD, 0.f);
@@ -262,6 +264,7 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
262264
ASSERT_TRUE(std::holds_alternative<StaticSampler>(Elem));
263265
ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.ViewType, RegisterType::SReg);
264266
ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.Number, 0u);
267+
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressU, TextureAddressMode::Mirror);
265268
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 230.f);
266269
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 3u);
267270
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MinLOD, 4.2f);

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

Lines changed: 9 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,7 @@ raw_ostream &operator<<(raw_ostream &OS, const DescriptorTableClause &Clause);
157165

158166
struct StaticSampler {
159167
Register Reg;
168+
TextureAddressMode AddressU = TextureAddressMode::Wrap;
160169
float MipLODBias = 0.f;
161170
uint32_t MaxAnisotropy = 16;
162171
float MinLOD = 0.f;

0 commit comments

Comments
 (0)