@@ -27,6 +27,13 @@ RootSignatureParser::RootSignatureParser(SmallVector<RootElement> &Elements,
2727bool RootSignatureParser::parse () {
2828 // Iterate as many RootElements as possible
2929 do {
30+ if (tryConsumeExpectedToken (TokenKind::kw_RootConstants)) {
31+ auto Constants = parseRootConstants ();
32+ if (!Constants.has_value ())
33+ return true ;
34+ Elements.push_back (*Constants);
35+ }
36+
3037 if (tryConsumeExpectedToken (TokenKind::kw_DescriptorTable)) {
3138 auto Table = parseDescriptorTable ();
3239 if (!Table.has_value ())
@@ -35,12 +42,27 @@ bool RootSignatureParser::parse() {
3542 }
3643 } while (tryConsumeExpectedToken (TokenKind::pu_comma));
3744
38- if (consumeExpectedToken (TokenKind::end_of_stream,
45+ return consumeExpectedToken (TokenKind::end_of_stream,
46+ diag::err_hlsl_unexpected_end_of_params,
47+ /* param of=*/ TokenKind::kw_RootSignature);
48+ }
49+
50+ std::optional<RootConstants> RootSignatureParser::parseRootConstants () {
51+ assert (CurToken.TokKind == TokenKind::kw_RootConstants &&
52+ " Expects to only be invoked starting at given keyword" );
53+
54+ if (consumeExpectedToken (TokenKind::pu_l_paren, diag::err_expected_after,
55+ CurToken.TokKind ))
56+ return std::nullopt ;
57+
58+ RootConstants Constants;
59+
60+ if (consumeExpectedToken (TokenKind::pu_r_paren,
3961 diag::err_hlsl_unexpected_end_of_params,
40- /* param of=*/ TokenKind::kw_RootSignature ))
41- return true ;
62+ /* param of=*/ TokenKind::kw_RootConstants ))
63+ return std:: nullopt ;
4264
43- return false ;
65+ return Constants ;
4466}
4567
4668std::optional<DescriptorTable> RootSignatureParser::parseDescriptorTable () {
0 commit comments