@@ -53,6 +53,13 @@ bool RootSignatureParser::parse() {
5353 return true ;
5454 Elements.push_back (*Descriptor);
5555 }
56+
57+ if (tryConsumeExpectedToken (TokenKind::kw_StaticSampler)) {
58+ auto Sampler = parseStaticSampler ();
59+ if (!Sampler.has_value ())
60+ return true ;
61+ Elements.push_back (*Sampler);
62+ }
5663 } while (tryConsumeExpectedToken (TokenKind::pu_comma));
5764
5865 return consumeExpectedToken (TokenKind::end_of_stream,
@@ -346,6 +353,37 @@ RootSignatureParser::parseDescriptorTableClause() {
346353 return Clause;
347354}
348355
356+ std::optional<StaticSampler> RootSignatureParser::parseStaticSampler () {
357+ assert (CurToken.TokKind == TokenKind::kw_StaticSampler &&
358+ " Expects to only be invoked starting at given keyword" );
359+
360+ if (consumeExpectedToken (TokenKind::pu_l_paren, diag::err_expected_after,
361+ CurToken.TokKind ))
362+ return std::nullopt ;
363+
364+ StaticSampler Sampler;
365+
366+ auto Params = parseStaticSamplerParams ();
367+ if (!Params.has_value ())
368+ return std::nullopt ;
369+
370+ // Check mandatory parameters were provided
371+ if (!Params->Reg .has_value ()) {
372+ getDiags ().Report (CurToken.TokLoc , diag::err_hlsl_rootsig_missing_param)
373+ << TokenKind::sReg ;
374+ return std::nullopt ;
375+ }
376+
377+ Sampler.Reg = Params->Reg .value ();
378+
379+ if (consumeExpectedToken (TokenKind::pu_r_paren,
380+ diag::err_hlsl_unexpected_end_of_params,
381+ /* param of=*/ TokenKind::kw_StaticSampler))
382+ return std::nullopt ;
383+
384+ return Sampler;
385+ }
386+
349387// Parameter arguments (eg. `bReg`, `space`, ...) can be specified in any
350388// order and only exactly once. The following methods will parse through as
351389// many arguments as possible reporting an error if a duplicate is seen.
@@ -604,6 +642,30 @@ RootSignatureParser::parseDescriptorTableClauseParams(TokenKind RegType) {
604642 return Params;
605643}
606644
645+ std::optional<RootSignatureParser::ParsedStaticSamplerParams>
646+ RootSignatureParser::parseStaticSamplerParams () {
647+ assert (CurToken.TokKind == TokenKind::pu_l_paren &&
648+ " Expects to only be invoked starting at given token" );
649+
650+ ParsedStaticSamplerParams Params;
651+ do {
652+ // `s` POS_INT
653+ if (tryConsumeExpectedToken (TokenKind::sReg )) {
654+ if (Params.Reg .has_value ()) {
655+ getDiags ().Report (CurToken.TokLoc , diag::err_hlsl_rootsig_repeat_param)
656+ << CurToken.TokKind ;
657+ return std::nullopt ;
658+ }
659+ auto Reg = parseRegister ();
660+ if (!Reg.has_value ())
661+ return std::nullopt ;
662+ Params.Reg = Reg;
663+ }
664+ } while (tryConsumeExpectedToken (TokenKind::pu_comma));
665+
666+ return Params;
667+ }
668+
607669std::optional<uint32_t > RootSignatureParser::parseUIntParam () {
608670 assert (CurToken.TokKind == TokenKind::pu_equal &&
609671 " Expects to only be invoked starting at given keyword" );
0 commit comments