Skip to content

Commit e7b54bc

Browse files
committed
add support for parsing registers
1 parent 7fba04c commit e7b54bc

File tree

4 files changed

+60
-4
lines changed

4 files changed

+60
-4
lines changed

clang/include/clang/Parse/ParseHLSLRootSignature.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,9 @@ class RootSignatureParser {
115115
bool ParseDescriptorTable();
116116
bool ParseDescriptorTableClause();
117117

118+
// Helper dispatch method
119+
bool ParseRegister(llvm::hlsl::rootsig::Register *Reg);
120+
118121
/// Invoke the lexer to consume a token and update CurToken with the result
119122
///
120123
/// Return value denotes if we were already at the last token.

clang/lib/Parse/ParseHLSLRootSignature.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,13 +313,43 @@ bool RootSignatureParser::ParseDescriptorTableClause() {
313313
if (ConsumeExpectedToken(TokenKind::pu_l_paren))
314314
return true;
315315

316+
// Consume mandatory Register paramater
317+
if (ConsumeExpectedToken(
318+
{TokenKind::bReg, TokenKind::tReg, TokenKind::uReg, TokenKind::sReg}))
319+
return true;
320+
if (ParseRegister(&Clause.Register))
321+
return true;
322+
316323
if (ConsumeExpectedToken(TokenKind::pu_r_paren))
317324
return true;
318325

319326
Elements.push_back(Clause);
320327
return false;
321328
}
322329

330+
bool RootSignatureParser::ParseRegister(Register *Register) {
331+
switch (CurToken.Kind) {
332+
case TokenKind::bReg:
333+
Register->ViewType = RegisterType::BReg;
334+
break;
335+
case TokenKind::tReg:
336+
Register->ViewType = RegisterType::TReg;
337+
break;
338+
case TokenKind::uReg:
339+
Register->ViewType = RegisterType::UReg;
340+
break;
341+
case TokenKind::sReg:
342+
Register->ViewType = RegisterType::SReg;
343+
break;
344+
default:
345+
llvm_unreachable("Switch for an expected token was not provided");
346+
}
347+
348+
Register->Number = CurToken.NumLiteral.getInt().getExtValue();
349+
350+
return false;
351+
}
352+
323353
// Is given token one of the expected kinds
324354
static bool IsExpectedToken(TokenKind Kind, ArrayRef<TokenKind> AnyExpected) {
325355
for (auto Expected : AnyExpected)

clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -338,10 +338,10 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseEmptyTest) {
338338
TEST_F(ParseHLSLRootSignatureTest, ValidParseDTClausesTest) {
339339
const llvm::StringLiteral Source = R"cc(
340340
DescriptorTable(
341-
CBV(),
342-
SRV(),
343-
Sampler(),
344-
UAV()
341+
CBV(b0),
342+
SRV(t42),
343+
Sampler(s987),
344+
UAV(u987234)
345345
),
346346
DescriptorTable()
347347
)cc";
@@ -361,18 +361,33 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseDTClausesTest) {
361361
RootElement Elem = Elements[0];
362362
ASSERT_TRUE(std::holds_alternative<DescriptorTableClause>(Elem));
363363
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Type, ClauseType::CBuffer);
364+
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Register.ViewType,
365+
RegisterType::BReg);
366+
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Register.Number, (uint32_t)0);
364367

365368
Elem = Elements[1];
366369
ASSERT_TRUE(std::holds_alternative<DescriptorTableClause>(Elem));
367370
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Type, ClauseType::SRV);
371+
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Register.ViewType,
372+
RegisterType::TReg);
373+
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Register.Number,
374+
(uint32_t)42);
368375

369376
Elem = Elements[2];
370377
ASSERT_TRUE(std::holds_alternative<DescriptorTableClause>(Elem));
371378
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Type, ClauseType::Sampler);
379+
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Register.ViewType,
380+
RegisterType::SReg);
381+
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Register.Number,
382+
(uint32_t)987);
372383

373384
Elem = Elements[3];
374385
ASSERT_TRUE(std::holds_alternative<DescriptorTableClause>(Elem));
375386
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Type, ClauseType::UAV);
387+
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Register.ViewType,
388+
RegisterType::UReg);
389+
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Register.Number,
390+
(uint32_t)987234);
376391

377392
Elem = Elements[4];
378393
ASSERT_TRUE(std::holds_alternative<DescriptorTable>(Elem));

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@ namespace rootsig {
2323

2424
// Definitions of the in-memory data layout structures
2525

26+
// Models the different registers: bReg | tReg | uReg | sReg
27+
enum class RegisterType { BReg, TReg, UReg, SReg };
28+
struct Register {
29+
RegisterType ViewType;
30+
uint32_t Number;
31+
};
32+
2633
// Models the end of a descriptor table and stores its visibility
2734
struct DescriptorTable {
2835
uint32_t NumClauses = 0; // The number of clauses in the table
@@ -32,6 +39,7 @@ struct DescriptorTable {
3239
using ClauseType = llvm::dxil::ResourceClass;
3340
struct DescriptorTableClause {
3441
ClauseType Type;
42+
Register Register;
3543
};
3644

3745
// Models RootElement : DescriptorTable | DescriptorTableClause

0 commit comments

Comments
 (0)