Skip to content

Commit df5d04e

Browse files
committed
add parsing of TextureAddressMode for addressU
1 parent da7724f commit df5d04e

File tree

4 files changed

+61
-1
lines changed

4 files changed

+61
-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
@@ -381,6 +381,9 @@ std::optional<StaticSampler> RootSignatureParser::parseStaticSampler() {
381381
Sampler.Reg = Params->Reg.value();
382382

383383
// Fill in optional values
384+
if (Params->AddressU.has_value())
385+
Sampler.AddressU = Params->AddressU.value();
386+
384387
if (Params->MipLODBias.has_value())
385388
Sampler.MipLODBias = Params->MipLODBias.value();
386389

@@ -679,6 +682,23 @@ RootSignatureParser::parseStaticSamplerParams() {
679682
Params.Reg = Reg;
680683
}
681684

685+
// `addressU` `=` TEXTURE_ADDRESS
686+
if (tryConsumeExpectedToken(TokenKind::kw_addressU)) {
687+
if (Params.AddressU.has_value()) {
688+
getDiags().Report(CurToken.TokLoc, diag::err_hlsl_rootsig_repeat_param)
689+
<< CurToken.TokKind;
690+
return std::nullopt;
691+
}
692+
693+
if (consumeExpectedToken(TokenKind::pu_equal))
694+
return std::nullopt;
695+
696+
auto AddressU = parseTextureAddressMode();
697+
if (!AddressU.has_value())
698+
return std::nullopt;
699+
Params.AddressU = AddressU;
700+
}
701+
682702
// `mipLODBias` `=` NUMBER
683703
if (tryConsumeExpectedToken(TokenKind::kw_mipLODBias)) {
684704
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: 3 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,7 @@ 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);
255256
ASSERT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 0.f);
256257
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 16u);
257258
ASSERT_EQ(std::get<StaticSampler>(Elem).MinLOD, 0.f);
@@ -262,6 +263,7 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
262263
ASSERT_TRUE(std::holds_alternative<StaticSampler>(Elem));
263264
ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.ViewType, RegisterType::SReg);
264265
ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.Number, 0u);
266+
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressU, TextureAddressMode::Mirror);
265267
ASSERT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 230.f);
266268
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 3u);
267269
ASSERT_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
@@ -160,6 +168,7 @@ struct DescriptorTableClause {
160168

161169
struct StaticSampler {
162170
Register Reg;
171+
TextureAddressMode AddressU = TextureAddressMode::Wrap;
163172
float MipLODBias = 0.f;
164173
uint32_t MaxAnisotropy = 16;
165174
float MinLOD = 0.f;

0 commit comments

Comments
 (0)