Skip to content

Commit 56664e2

Browse files
committed
add support for parsing registers
1 parent 6f57e87 commit 56664e2

File tree

4 files changed

+60
-4
lines changed

4 files changed

+60
-4
lines changed

clang/include/clang/Parse/ParseHLSLRootSignature.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ class RootSignatureParser {
106106
bool ParseDescriptorTableClause();
107107

108108
// Helper dispatch method
109+
bool ParseRegister(rs::Register *Reg);
110+
109111
// Increment the token iterator if we have not reached the end.
110112
// Return value denotes if we were already at the last token.
111113
bool ConsumeNextToken();

clang/lib/Parse/ParseHLSLRootSignature.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,13 +318,44 @@ bool RootSignatureParser::ParseDescriptorTableClause() {
318318
if (ConsumeExpectedToken(TokenKind::pu_l_paren))
319319
return true;
320320

321+
// Consume mandatory Register paramater
322+
if (ConsumeExpectedToken(
323+
{TokenKind::bReg, TokenKind::tReg, TokenKind::uReg, TokenKind::sReg}))
324+
return true;
325+
if (ParseRegister(&Clause.Register))
326+
return true;
327+
321328
if (ConsumeExpectedToken(TokenKind::pu_r_paren))
322329
return true;
323330

324331
Elements.push_back(Clause);
325332
return false;
326333
}
327334

335+
bool RootSignatureParser::ParseRegister(Register *Register) {
336+
switch (CurTok->Kind) {
337+
case TokenKind::bReg:
338+
Register->ViewType = RegisterType::BReg;
339+
break;
340+
case TokenKind::tReg:
341+
Register->ViewType = RegisterType::TReg;
342+
break;
343+
case TokenKind::uReg:
344+
Register->ViewType = RegisterType::UReg;
345+
break;
346+
case TokenKind::sReg:
347+
Register->ViewType = RegisterType::SReg;
348+
break;
349+
default:
350+
llvm_unreachable("Switch for an expected token was not provided");
351+
return true;
352+
}
353+
354+
Register->Number = CurTok->NumLiteral.getInt().getExtValue();
355+
356+
return false;
357+
}
358+
328359
RootSignatureToken RootSignatureParser::PeekNextToken() {
329360
// Create an invalid token
330361
RootSignatureToken Token = RootSignatureToken(SourceLocation());

clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -308,10 +308,10 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseEmptyTest) {
308308
TEST_F(ParseHLSLRootSignatureTest, ValidParseDTClausesTest) {
309309
const llvm::StringLiteral Source = R"cc(
310310
DescriptorTable(
311-
CBV(),
312-
SRV(),
313-
Sampler(),
314-
UAV()
311+
CBV(b0),
312+
SRV(t42),
313+
Sampler(s987),
314+
UAV(u987234)
315315
),
316316
DescriptorTable()
317317
)cc";
@@ -335,18 +335,33 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseDTClausesTest) {
335335
RootElement Elem = Elements[0];
336336
ASSERT_TRUE(std::holds_alternative<DescriptorTableClause>(Elem));
337337
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Type, ClauseType::CBuffer);
338+
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Register.ViewType,
339+
RegisterType::BReg);
340+
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Register.Number, (uint32_t)0);
338341

339342
Elem = Elements[1];
340343
ASSERT_TRUE(std::holds_alternative<DescriptorTableClause>(Elem));
341344
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Type, ClauseType::SRV);
345+
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Register.ViewType,
346+
RegisterType::TReg);
347+
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Register.Number,
348+
(uint32_t)42);
342349

343350
Elem = Elements[2];
344351
ASSERT_TRUE(std::holds_alternative<DescriptorTableClause>(Elem));
345352
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Type, ClauseType::Sampler);
353+
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Register.ViewType,
354+
RegisterType::SReg);
355+
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Register.Number,
356+
(uint32_t)987);
346357

347358
Elem = Elements[3];
348359
ASSERT_TRUE(std::holds_alternative<DescriptorTableClause>(Elem));
349360
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Type, ClauseType::UAV);
361+
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Register.ViewType,
362+
RegisterType::UReg);
363+
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Register.Number,
364+
(uint32_t)987234);
350365

351366
Elem = Elements[4];
352367
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 root_signature {
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)