@@ -392,6 +392,12 @@ std::optional<StaticSampler> RootSignatureParser::parseStaticSampler() {
392392 if (Params->MaxAnisotropy .has_value ())
393393 Sampler.MaxAnisotropy = Params->MaxAnisotropy .value ();
394394
395+ if (Params->CompFunc .has_value ())
396+ Sampler.CompFunc = Params->CompFunc .value ();
397+
398+ if (Params->BorderColor .has_value ())
399+ Sampler.BorderColor = Params->BorderColor .value ();
400+
395401 if (Params->MinLOD .has_value ())
396402 Sampler.MinLOD = Params->MinLOD .value ();
397403
@@ -769,6 +775,40 @@ RootSignatureParser::parseStaticSamplerParams() {
769775 Params.MaxAnisotropy = MaxAnisotropy;
770776 }
771777
778+ // `comparisonFunc` `=` COMPARISON_FUNC
779+ if (tryConsumeExpectedToken (TokenKind::kw_comparisonFunc)) {
780+ if (Params.CompFunc .has_value ()) {
781+ getDiags ().Report (CurToken.TokLoc , diag::err_hlsl_rootsig_repeat_param)
782+ << CurToken.TokKind ;
783+ return std::nullopt ;
784+ }
785+
786+ if (consumeExpectedToken (TokenKind::pu_equal))
787+ return std::nullopt ;
788+
789+ auto CompFunc = parseComparisonFunc ();
790+ if (!CompFunc.has_value ())
791+ return std::nullopt ;
792+ Params.CompFunc = CompFunc;
793+ }
794+
795+ // `borderColor` `=` STATIC_BORDER_COLOR
796+ if (tryConsumeExpectedToken (TokenKind::kw_borderColor)) {
797+ if (Params.BorderColor .has_value ()) {
798+ getDiags ().Report (CurToken.TokLoc , diag::err_hlsl_rootsig_repeat_param)
799+ << CurToken.TokKind ;
800+ return std::nullopt ;
801+ }
802+
803+ if (consumeExpectedToken (TokenKind::pu_equal))
804+ return std::nullopt ;
805+
806+ auto BorderColor = parseStaticBorderColor ();
807+ if (!BorderColor.has_value ())
808+ return std::nullopt ;
809+ Params.BorderColor = BorderColor;
810+ }
811+
772812 // `minLOD` `=` NUMBER
773813 if (tryConsumeExpectedToken (TokenKind::kw_minLOD)) {
774814 if (Params.MinLOD .has_value ()) {
@@ -935,6 +975,58 @@ RootSignatureParser::parseTextureAddressMode() {
935975 return std::nullopt ;
936976}
937977
978+ std::optional<llvm::hlsl::rootsig::ComparisonFunc>
979+ RootSignatureParser::parseComparisonFunc () {
980+ assert (CurToken.TokKind == TokenKind::pu_equal &&
981+ " Expects to only be invoked starting at given keyword" );
982+
983+ TokenKind Expected[] = {
984+ #define COMPARISON_FUNC_ENUM (NAME, LIT ) TokenKind::en_##NAME,
985+ #include " clang/Lex/HLSLRootSignatureTokenKinds.def"
986+ };
987+
988+ if (!tryConsumeExpectedToken (Expected))
989+ return std::nullopt ;
990+
991+ switch (CurToken.TokKind ) {
992+ #define COMPARISON_FUNC_ENUM (NAME, LIT ) \
993+ case TokenKind::en_##NAME: \
994+ return ComparisonFunc::NAME; \
995+ break ;
996+ #include " clang/Lex/HLSLRootSignatureTokenKinds.def"
997+ default :
998+ llvm_unreachable (" Switch for consumed enum token was not provided" );
999+ }
1000+
1001+ return std::nullopt ;
1002+ }
1003+
1004+ std::optional<llvm::hlsl::rootsig::StaticBorderColor>
1005+ RootSignatureParser::parseStaticBorderColor () {
1006+ assert (CurToken.TokKind == TokenKind::pu_equal &&
1007+ " Expects to only be invoked starting at given keyword" );
1008+
1009+ TokenKind Expected[] = {
1010+ #define STATIC_BORDER_COLOR_ENUM (NAME, LIT ) TokenKind::en_##NAME,
1011+ #include " clang/Lex/HLSLRootSignatureTokenKinds.def"
1012+ };
1013+
1014+ if (!tryConsumeExpectedToken (Expected))
1015+ return std::nullopt ;
1016+
1017+ switch (CurToken.TokKind ) {
1018+ #define STATIC_BORDER_COLOR_ENUM (NAME, LIT ) \
1019+ case TokenKind::en_##NAME: \
1020+ return StaticBorderColor::NAME; \
1021+ break ;
1022+ #include " clang/Lex/HLSLRootSignatureTokenKinds.def"
1023+ default :
1024+ llvm_unreachable (" Switch for consumed enum token was not provided" );
1025+ }
1026+
1027+ return std::nullopt ;
1028+ }
1029+
9381030std::optional<llvm::hlsl::rootsig::RootDescriptorFlags>
9391031RootSignatureParser::parseRootDescriptorFlags () {
9401032 assert (CurToken.TokKind == TokenKind::pu_equal &&
0 commit comments