@@ -377,6 +377,15 @@ std::optional<StaticSampler> RootSignatureParser::parseStaticSampler() {
377377 Sampler.Reg = Params->Reg .value ();
378378
379379 // Fill in optional values
380+ if (Params->AddressU .has_value ())
381+ Sampler.AddressU = Params->AddressU .value ();
382+
383+ if (Params->AddressV .has_value ())
384+ Sampler.AddressV = Params->AddressV .value ();
385+
386+ if (Params->AddressW .has_value ())
387+ Sampler.AddressW = Params->AddressW .value ();
388+
380389 if (Params->MipLODBias .has_value ())
381390 Sampler.MipLODBias = Params->MipLODBias .value ();
382391
@@ -675,6 +684,57 @@ RootSignatureParser::parseStaticSamplerParams() {
675684 Params.Reg = Reg;
676685 }
677686
687+ // `addressU` `=` TEXTURE_ADDRESS
688+ if (tryConsumeExpectedToken (TokenKind::kw_addressU)) {
689+ if (Params.AddressU .has_value ()) {
690+ getDiags ().Report (CurToken.TokLoc , diag::err_hlsl_rootsig_repeat_param)
691+ << CurToken.TokKind ;
692+ return std::nullopt ;
693+ }
694+
695+ if (consumeExpectedToken (TokenKind::pu_equal))
696+ return std::nullopt ;
697+
698+ auto AddressU = parseTextureAddressMode ();
699+ if (!AddressU.has_value ())
700+ return std::nullopt ;
701+ Params.AddressU = AddressU;
702+ }
703+
704+ // `addressV` `=` TEXTURE_ADDRESS
705+ if (tryConsumeExpectedToken (TokenKind::kw_addressV)) {
706+ if (Params.AddressV .has_value ()) {
707+ getDiags ().Report (CurToken.TokLoc , diag::err_hlsl_rootsig_repeat_param)
708+ << CurToken.TokKind ;
709+ return std::nullopt ;
710+ }
711+
712+ if (consumeExpectedToken (TokenKind::pu_equal))
713+ return std::nullopt ;
714+
715+ auto AddressV = parseTextureAddressMode ();
716+ if (!AddressV.has_value ())
717+ return std::nullopt ;
718+ Params.AddressV = AddressV;
719+ }
720+
721+ // `addressW` `=` TEXTURE_ADDRESS
722+ if (tryConsumeExpectedToken (TokenKind::kw_addressW)) {
723+ if (Params.AddressW .has_value ()) {
724+ getDiags ().Report (CurToken.TokLoc , diag::err_hlsl_rootsig_repeat_param)
725+ << CurToken.TokKind ;
726+ return std::nullopt ;
727+ }
728+
729+ if (consumeExpectedToken (TokenKind::pu_equal))
730+ return std::nullopt ;
731+
732+ auto AddressW = parseTextureAddressMode ();
733+ if (!AddressW.has_value ())
734+ return std::nullopt ;
735+ Params.AddressW = AddressW;
736+ }
737+
678738 // `mipLODBias` `=` NUMBER
679739 if (tryConsumeExpectedToken (TokenKind::kw_mipLODBias)) {
680740 if (Params.MipLODBias .has_value ()) {
@@ -849,6 +909,32 @@ RootSignatureParser::parseShaderVisibility() {
849909 return std::nullopt ;
850910}
851911
912+ std::optional<llvm::hlsl::rootsig::TextureAddressMode>
913+ RootSignatureParser::parseTextureAddressMode () {
914+ assert (CurToken.TokKind == TokenKind::pu_equal &&
915+ " Expects to only be invoked starting at given keyword" );
916+
917+ TokenKind Expected[] = {
918+ #define TEXTURE_ADDRESS_MODE_ENUM (NAME, LIT ) TokenKind::en_##NAME,
919+ #include " clang/Lex/HLSLRootSignatureTokenKinds.def"
920+ };
921+
922+ if (!tryConsumeExpectedToken (Expected))
923+ return std::nullopt ;
924+
925+ switch (CurToken.TokKind ) {
926+ #define TEXTURE_ADDRESS_MODE_ENUM (NAME, LIT ) \
927+ case TokenKind::en_##NAME: \
928+ return TextureAddressMode::NAME; \
929+ break ;
930+ #include " clang/Lex/HLSLRootSignatureTokenKinds.def"
931+ default :
932+ llvm_unreachable (" Switch for consumed enum token was not provided" );
933+ }
934+
935+ return std::nullopt ;
936+ }
937+
852938std::optional<llvm::hlsl::rootsig::RootDescriptorFlags>
853939RootSignatureParser::parseRootDescriptorFlags () {
854940 assert (CurToken.TokKind == TokenKind::pu_equal &&
0 commit comments