@@ -485,6 +485,9 @@ std::optional<StaticSampler> RootSignatureParser::parseStaticSampler() {
485
485
if (Params->Visibility .has_value ())
486
486
Sampler.Visibility = Params->Visibility .value ();
487
487
488
+ if (Params->Flags .has_value ())
489
+ Sampler.Flags = Params->Flags .value ();
490
+
488
491
return Sampler;
489
492
}
490
493
@@ -926,6 +929,20 @@ RootSignatureParser::parseStaticSamplerParams() {
926
929
if (!Visibility.has_value ())
927
930
return std::nullopt ;
928
931
Params.Visibility = Visibility;
932
+ } else if (tryConsumeExpectedToken (TokenKind::kw_flags)) {
933
+ // `flags` `=` UINT_BORDER_COLOR
934
+ if (Params.Flags .has_value ()) {
935
+ reportDiag (diag::err_hlsl_rootsig_repeat_param) << CurToken.TokKind ;
936
+ return std::nullopt ;
937
+ }
938
+
939
+ if (consumeExpectedToken (TokenKind::pu_equal))
940
+ return std::nullopt ;
941
+
942
+ auto Flags = parseStaticSamplerFlags (TokenKind::kw_flags);
943
+ if (!Flags.has_value ())
944
+ return std::nullopt ;
945
+ Params.Flags = Flags;
929
946
} else {
930
947
consumeNextToken (); // let diagnostic be at the start of invalid token
931
948
reportDiag (diag::err_hlsl_invalid_token)
@@ -1255,6 +1272,50 @@ RootSignatureParser::parseDescriptorRangeFlags(TokenKind Context) {
1255
1272
return Flags;
1256
1273
}
1257
1274
1275
+ std::optional<llvm::dxbc::StaticSamplerFlags>
1276
+ RootSignatureParser::parseStaticSamplerFlags (TokenKind Context) {
1277
+ assert (CurToken.TokKind == TokenKind::pu_equal &&
1278
+ " Expects to only be invoked starting at given keyword" );
1279
+
1280
+ // Handle the edge-case of '0' to specify no flags set
1281
+ if (tryConsumeExpectedToken (TokenKind::int_literal)) {
1282
+ if (!verifyZeroFlag ()) {
1283
+ reportDiag (diag::err_hlsl_rootsig_non_zero_flag);
1284
+ return std::nullopt ;
1285
+ }
1286
+ return llvm::dxbc::StaticSamplerFlags::None;
1287
+ }
1288
+
1289
+ TokenKind Expected[] = {
1290
+ #define STATIC_SAMPLER_FLAG_ENUM (NAME, LIT ) TokenKind::en_##NAME,
1291
+ #include " clang/Lex/HLSLRootSignatureTokenKinds.def"
1292
+ };
1293
+
1294
+ std::optional<llvm::dxbc::StaticSamplerFlags> Flags;
1295
+
1296
+ do {
1297
+ if (tryConsumeExpectedToken (Expected)) {
1298
+ switch (CurToken.TokKind ) {
1299
+ #define STATIC_SAMPLER_FLAG_ENUM (NAME, LIT ) \
1300
+ case TokenKind::en_##NAME: \
1301
+ Flags = maybeOrFlag<llvm::dxbc::StaticSamplerFlags>( \
1302
+ Flags, llvm::dxbc::StaticSamplerFlags::NAME); \
1303
+ break ;
1304
+ #include " clang/Lex/HLSLRootSignatureTokenKinds.def"
1305
+ default :
1306
+ llvm_unreachable (" Switch for consumed enum token was not provided" );
1307
+ }
1308
+ } else {
1309
+ consumeNextToken (); // consume token to point at invalid token
1310
+ reportDiag (diag::err_hlsl_invalid_token)
1311
+ << /* value=*/ 1 << /* value of*/ Context;
1312
+ return std::nullopt ;
1313
+ }
1314
+ } while (tryConsumeExpectedToken (TokenKind::pu_or));
1315
+
1316
+ return Flags;
1317
+ }
1318
+
1258
1319
std::optional<uint32_t > RootSignatureParser::handleUIntLiteral () {
1259
1320
// Parse the numeric value and do semantic checks on its specification
1260
1321
clang::NumericLiteralParser Literal (
0 commit comments