Skip to content

Commit f8a5543

Browse files
committed
add support for custom parameter parsing - DescriptorRangeOffset
1 parent eec1d0e commit f8a5543

File tree

4 files changed

+39
-3
lines changed

4 files changed

+39
-3
lines changed

clang/include/clang/Parse/ParseHLSLRootSignature.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,8 @@ class RootSignatureParser {
132132
// Common parsing helpers
133133
bool ParseRegister(llvm::hlsl::rootsig::Register *Reg);
134134
bool ParseUInt(uint32_t *X);
135+
bool
136+
ParseDescriptorRangeOffset(llvm::hlsl::rootsig::DescriptorRangeOffset *X);
135137

136138
/// Invoke the lexer to consume a token and update CurToken with the result
137139
///

clang/lib/Parse/ParseHLSLRootSignature.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,7 @@ bool RootSignatureParser::ParseDescriptorTableClause() {
324324
llvm::SmallDenseMap<TokenKind, ParamType> RefMap = {
325325
{TokenKind::kw_numDescriptors, &Clause.NumDescriptors},
326326
{TokenKind::kw_space, &Clause.Space},
327+
{TokenKind::kw_offset, &Clause.Offset},
327328
};
328329
if (ParseOptionalParams({RefMap}))
329330
return true;
@@ -347,6 +348,9 @@ bool RootSignatureParser::ParseParam(ParamType Ref) {
347348

348349
bool Error;
349350
std::visit(OverloadedMethods{[&](uint32_t *X) { Error = ParseUInt(X); },
351+
[&](DescriptorRangeOffset *X) {
352+
Error = ParseDescriptorRangeOffset(X);
353+
},
350354
}, Ref);
351355

352356
return Error;
@@ -380,6 +384,21 @@ bool RootSignatureParser::ParseOptionalParams(
380384
return false;
381385
}
382386

387+
bool RootSignatureParser::ParseDescriptorRangeOffset(DescriptorRangeOffset *X) {
388+
if (ConsumeExpectedToken(
389+
{TokenKind::int_literal, TokenKind::en_DescriptorRangeOffsetAppend}))
390+
return true;
391+
392+
// Edge case for the offset enum -> static value
393+
if (CurToken.Kind == TokenKind::en_DescriptorRangeOffsetAppend) {
394+
*X = DescriptorTableOffsetAppend;
395+
return false;
396+
}
397+
398+
*X = DescriptorRangeOffset(CurToken.NumLiteral.getInt().getExtValue());
399+
return false;
400+
}
401+
383402
bool RootSignatureParser::ParseUInt(uint32_t *X) {
384403
// Treat a postively signed integer as though it is unsigned to match DXC
385404
TryConsumeExpectedToken(TokenKind::pu_plus);

clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -339,8 +339,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseDTClausesTest) {
339339
const llvm::StringLiteral Source = R"cc(
340340
DescriptorTable(
341341
CBV(b0),
342-
SRV(t42, space = 3, numDescriptors = +4),
343-
Sampler(s987, space = 2),
342+
SRV(t42, space = 3, offset = 32, numDescriptors = +4),
343+
Sampler(s987, space = 2, offset = DESCRIPTOR_RANGE_OFFSET_APPEND),
344344
UAV(u987234)
345345
),
346346
DescriptorTable()
@@ -366,6 +366,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseDTClausesTest) {
366366
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Register.Number, (uint32_t)0);
367367
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).NumDescriptors, (uint32_t)1);
368368
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Space, (uint32_t)0);
369+
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Offset,
370+
DescriptorRangeOffset(DescriptorTableOffsetAppend));
369371

370372
Elem = Elements[1];
371373
ASSERT_TRUE(std::holds_alternative<DescriptorTableClause>(Elem));
@@ -376,6 +378,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseDTClausesTest) {
376378
(uint32_t)42);
377379
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).NumDescriptors, (uint32_t)4);
378380
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Space, (uint32_t)3);
381+
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Offset,
382+
DescriptorRangeOffset(32));
379383

380384
Elem = Elements[2];
381385
ASSERT_TRUE(std::holds_alternative<DescriptorTableClause>(Elem));
@@ -386,6 +390,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseDTClausesTest) {
386390
(uint32_t)987);
387391
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).NumDescriptors, (uint32_t)1);
388392
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Space, (uint32_t)2);
393+
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Offset,
394+
DescriptorRangeOffset(DescriptorTableOffsetAppend));
389395

390396
Elem = Elements[3];
391397
ASSERT_TRUE(std::holds_alternative<DescriptorTableClause>(Elem));
@@ -396,6 +402,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseDTClausesTest) {
396402
(uint32_t)987234);
397403
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).NumDescriptors, (uint32_t)1);
398404
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Space, (uint32_t)0);
405+
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Offset,
406+
DescriptorRangeOffset(DescriptorTableOffsetAppend));
399407

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

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ namespace llvm {
2121
namespace hlsl {
2222
namespace rootsig {
2323

24+
// Definition of the various enumerations and flags
25+
26+
enum class DescriptorRangeOffset : uint32_t;
27+
2428
// Definitions of the in-memory data layout structures
2529

2630
// Models the different registers: bReg | tReg | uReg | sReg
@@ -35,21 +39,24 @@ struct DescriptorTable {
3539
uint32_t NumClauses = 0; // The number of clauses in the table
3640
};
3741

42+
static const DescriptorRangeOffset DescriptorTableOffsetAppend =
43+
DescriptorRangeOffset(0xffffffff);
3844
// Models DTClause : CBV | SRV | UAV | Sampler, by collecting like parameters
3945
using ClauseType = llvm::dxil::ResourceClass;
4046
struct DescriptorTableClause {
4147
ClauseType Type;
4248
Register Register;
4349
uint32_t NumDescriptors = 1;
4450
uint32_t Space = 0;
51+
DescriptorRangeOffset Offset = DescriptorTableOffsetAppend;
4552
};
4653

4754
// Models RootElement : DescriptorTable | DescriptorTableClause
4855
using RootElement = std::variant<DescriptorTable, DescriptorTableClause>;
4956

5057
// Models a reference to all assignment parameter types that any RootElement
5158
// may have. Things of the form: Keyword = Param
52-
using ParamType = std::variant<uint32_t *>;
59+
using ParamType = std::variant<uint32_t *, DescriptorRangeOffset *>;
5360

5461
} // namespace rootsig
5562
} // namespace hlsl

0 commit comments

Comments
 (0)