Skip to content

Commit 9eb02ce

Browse files
committed
add parsing of addressV and addressW
1 parent 4f85c5b commit 9eb02ce

File tree

4 files changed

+50
-0
lines changed

4 files changed

+50
-0
lines changed

clang/include/clang/Parse/ParseHLSLRootSignature.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ class RootSignatureParser {
113113
std::optional<llvm::hlsl::rootsig::Register> Reg;
114114
std::optional<float> MipLODBias;
115115
std::optional<llvm::hlsl::rootsig::TextureAddressMode> AddressU;
116+
std::optional<llvm::hlsl::rootsig::TextureAddressMode> AddressV;
117+
std::optional<llvm::hlsl::rootsig::TextureAddressMode> AddressW;
116118
std::optional<uint32_t> MaxAnisotropy;
117119
std::optional<float> MinLOD;
118120
std::optional<float> MaxLOD;

clang/lib/Parse/ParseHLSLRootSignature.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,12 @@ std::optional<StaticSampler> RootSignatureParser::parseStaticSampler() {
380380
if (Params->AddressU.has_value())
381381
Sampler.AddressU = Params->AddressU.value();
382382

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+
383389
if (Params->MipLODBias.has_value())
384390
Sampler.MipLODBias = Params->MipLODBias.value();
385391

@@ -695,6 +701,40 @@ RootSignatureParser::parseStaticSamplerParams() {
695701
Params.AddressU = AddressU;
696702
}
697703

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+
698738
// `mipLODBias` `=` NUMBER
699739
if (tryConsumeExpectedToken(TokenKind::kw_mipLODBias)) {
700740
if (Params.MipLODBias.has_value()) {

clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
228228
StaticSampler(s0),
229229
StaticSampler(s0, maxAnisotropy = 3,
230230
minLOD = 4.2f, mipLODBias = 0.23e+3,
231+
addressW = TEXTURE_ADDRESS_CLAMP,
232+
addressV = TEXTURE_ADDRESS_BORDER,
231233
maxLOD = 9000, addressU = TEXTURE_ADDRESS_MIRROR
232234
)
233235
)cc";
@@ -253,6 +255,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
253255
ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.ViewType, RegisterType::SReg);
254256
ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.Number, 0u);
255257
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);
256260
ASSERT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 0.f);
257261
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 0.f);
258262
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 16u);
@@ -265,6 +269,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
265269
ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.ViewType, RegisterType::SReg);
266270
ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.Number, 0u);
267271
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressU, TextureAddressMode::Mirror);
272+
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressV, TextureAddressMode::Border);
273+
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressW, TextureAddressMode::Clamp);
268274
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 230.f);
269275
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 3u);
270276
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MinLOD, 4.2f);

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,8 @@ raw_ostream &operator<<(raw_ostream &OS, const DescriptorTableClause &Clause);
166166
struct StaticSampler {
167167
Register Reg;
168168
TextureAddressMode AddressU = TextureAddressMode::Wrap;
169+
TextureAddressMode AddressV = TextureAddressMode::Wrap;
170+
TextureAddressMode AddressW = TextureAddressMode::Wrap;
169171
float MipLODBias = 0.f;
170172
uint32_t MaxAnisotropy = 16;
171173
float MinLOD = 0.f;

0 commit comments

Comments
 (0)