Skip to content

Commit 994bc35

Browse files
committed
[HLSL][RootSignature] Add parsing of Register in params for RootParams
- defines the `parseRootParamParams` infastructure for parsing the params of a RootParam - defines the register type to illustrate use - add tests to demonstrate functionality
1 parent fc2fc60 commit 994bc35

File tree

4 files changed

+58
-4
lines changed

4 files changed

+58
-4
lines changed

clang/include/clang/Parse/ParseHLSLRootSignature.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,12 @@ class RootSignatureParser {
8989
};
9090
std::optional<ParsedConstantParams> parseRootConstantParams();
9191

92+
struct ParsedRootParamParams {
93+
std::optional<llvm::hlsl::rootsig::Register> Reg;
94+
};
95+
std::optional<ParsedRootParamParams>
96+
parseRootParamParams(RootSignatureToken::Kind RegType);
97+
9298
struct ParsedClauseParams {
9399
std::optional<llvm::hlsl::rootsig::Register> Reg;
94100
std::optional<uint32_t> NumDescriptors;

clang/lib/Parse/ParseHLSLRootSignature.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,20 +176,37 @@ std::optional<RootParam> RootSignatureParser::parseRootParam() {
176176
return std::nullopt;
177177

178178
RootParam Param;
179+
TokenKind ExpectedReg;
179180
switch (ParamKind) {
180181
default:
181182
llvm_unreachable("Switch for consumed token was not provided");
182183
case TokenKind::kw_CBV:
183184
Param.Type = ParamType::CBuffer;
185+
ExpectedReg = TokenKind::bReg;
184186
break;
185187
case TokenKind::kw_SRV:
186188
Param.Type = ParamType::SRV;
189+
ExpectedReg = TokenKind::tReg;
187190
break;
188191
case TokenKind::kw_UAV:
189192
Param.Type = ParamType::UAV;
193+
ExpectedReg = TokenKind::uReg;
190194
break;
191195
}
192196

197+
auto Params = parseRootParamParams(ExpectedReg);
198+
if (!Params.has_value())
199+
return std::nullopt;
200+
201+
// Check mandatory parameters were provided
202+
if (!Params->Reg.has_value()) {
203+
getDiags().Report(CurToken.TokLoc, diag::err_hlsl_rootsig_missing_param)
204+
<< ExpectedReg;
205+
return std::nullopt;
206+
}
207+
208+
Param.Reg = Params->Reg.value();
209+
193210
if (consumeExpectedToken(TokenKind::pu_r_paren,
194211
diag::err_hlsl_unexpected_end_of_params,
195212
/*param of=*/TokenKind::kw_RootConstants))
@@ -398,6 +415,31 @@ RootSignatureParser::parseRootConstantParams() {
398415
return Params;
399416
}
400417

418+
std::optional<RootSignatureParser::ParsedRootParamParams>
419+
RootSignatureParser::parseRootParamParams(TokenKind RegType) {
420+
assert(CurToken.TokKind == TokenKind::pu_l_paren &&
421+
"Expects to only be invoked starting at given token");
422+
423+
ParsedRootParamParams Params;
424+
do {
425+
// ( `b` | `t` | `u`) POS_INT
426+
if (tryConsumeExpectedToken(RegType)) {
427+
if (Params.Reg.has_value()) {
428+
getDiags().Report(CurToken.TokLoc, diag::err_hlsl_rootsig_repeat_param)
429+
<< CurToken.TokKind;
430+
return std::nullopt;
431+
}
432+
auto Reg = parseRegister();
433+
if (!Reg.has_value())
434+
return std::nullopt;
435+
Params.Reg = Reg;
436+
}
437+
438+
} while (tryConsumeExpectedToken(TokenKind::pu_comma));
439+
440+
return Params;
441+
}
442+
401443
std::optional<RootSignatureParser::ParsedClauseParams>
402444
RootSignatureParser::parseDescriptorTableClauseParams(TokenKind RegType) {
403445
assert(CurToken.TokKind == TokenKind::pu_l_paren &&

clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -346,9 +346,9 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseRootFlagsTest) {
346346

347347
TEST_F(ParseHLSLRootSignatureTest, ValidParseRootParamsTest) {
348348
const llvm::StringLiteral Source = R"cc(
349-
CBV(),
350-
SRV(),
351-
UAV()
349+
CBV(b0),
350+
SRV(t42),
351+
UAV(u34893247)
352352
)cc";
353353

354354
TrivialModuleLoader ModLoader;
@@ -368,15 +368,20 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseRootParamsTest) {
368368

369369
RootElement Elem = Elements[0];
370370
ASSERT_TRUE(std::holds_alternative<RootParam>(Elem));
371-
ASSERT_EQ(std::get<RootParam>(Elem).Type, ParamType::CBuffer);
371+
ASSERT_EQ(std::get<RootParam>(Elem).Reg.ViewType, RegisterType::BReg);
372+
ASSERT_EQ(std::get<RootParam>(Elem).Reg.Number, 0u);
372373

373374
Elem = Elements[1];
374375
ASSERT_TRUE(std::holds_alternative<RootParam>(Elem));
375376
ASSERT_EQ(std::get<RootParam>(Elem).Type, ParamType::SRV);
377+
ASSERT_EQ(std::get<RootParam>(Elem).Reg.ViewType, RegisterType::TReg);
378+
ASSERT_EQ(std::get<RootParam>(Elem).Reg.Number, 42u);
376379

377380
Elem = Elements[2];
378381
ASSERT_TRUE(std::holds_alternative<RootParam>(Elem));
379382
ASSERT_EQ(std::get<RootParam>(Elem).Type, ParamType::UAV);
383+
ASSERT_EQ(std::get<RootParam>(Elem).Reg.ViewType, RegisterType::UReg);
384+
ASSERT_EQ(std::get<RootParam>(Elem).Reg.Number, 34893247u);
380385

381386
ASSERT_TRUE(Consumer->isSatisfied());
382387
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ struct RootConstants {
8888
using ParamType = llvm::dxil::ResourceClass;
8989
struct RootParam {
9090
ParamType Type;
91+
Register Reg;
9192
};
9293

9394
// Models the end of a descriptor table and stores its visibility

0 commit comments

Comments
 (0)