@@ -611,3 +611,55 @@ vaip_core::OrtApiForVaip* create_org_api_hook() {
611611 return &the_global_api;
612612 }
613613}
614+
615+ struct ExternalEpLibaray {
616+ ExternalEpLibaray (const std::string& libray_name) : libray_name_{libray_name} {
617+ Ensure ();
618+ }
619+ onnxruntime::Provider* (*get_provider_api)();
620+ void (*create_ep_factories)(void *, const OrtApiBase*, void *, OrtEpFactory**, size_t , size_t *);
621+ void (*set_session_option)(OrtSessionOptions*);
622+
623+ void Ensure () {
624+ if (handle_)
625+ return ;
626+ auto & env = Provider_GetHost ()->Env__Default ();
627+ auto library_filename = PathString (LIBRARY_PREFIX) + PathString (libray_name_.begin (), libray_name_.end ()) + LIBRARY_EXTENSION;
628+ auto full_path = env.GetRuntimePath () + library_filename;
629+ ORT_THROW_IF_ERROR (env.LoadDynamicLibrary (full_path, true , &handle_));
630+ ORT_THROW_IF_ERROR (env.GetSymbolFromLibrary (handle_, " GetProvider" , (void **)&get_provider_api));
631+ env.GetSymbolFromLibrary (handle_, " CreateEpFactories" , (void **)&create_ep_factories);
632+ env.GetSymbolFromLibrary (handle_, " RyzenAI_SetSessionOptions" , (void **)&set_session_option);
633+ }
634+
635+ void Clear () {
636+ if (handle_) {
637+ auto & env = Provider_GetHost ()->Env__Default ();
638+ auto status = env.UnloadDynamicLibrary (handle_);
639+ vai_assert (status.IsOK (), status.ErrorMessage ());
640+ handle_ = nullptr ;
641+ }
642+ }
643+
644+ private:
645+ std::string libray_name_;
646+ void * handle_{};
647+ };
648+ static std::unordered_map<std::string, std::unique_ptr<ExternalEpLibaray>> g_external_ep_libaries;
649+
650+ std::unique_ptr<onnxruntime::IExecutionProvider>
651+ CreateExecutionProviderFromAnotherEp (const std::string& lib, const OrtSessionOptions& session_options,
652+ std::unordered_map<std::string, std::string>& provider_options) {
653+ auto it = g_external_ep_libaries.find (lib);
654+ if (it == g_external_ep_libaries.end ()) {
655+ it = g_external_ep_libaries.emplace (lib, std::make_unique<ExternalEpLibaray>(lib)).first ;
656+ }
657+ auto ep_lib = it->second .get ();
658+ auto get_provider_func = ep_lib->get_provider_api ;
659+ auto provider = get_provider_func ();
660+ std::unique_ptr<onnxruntime::IExecutionProvider> ret;
661+ provider->Initialize ();
662+ std::ignore = provider->CreateIExecutionProvider (nullptr , nullptr , 0 , const_cast <onnxruntime::ProviderOptions&>(provider_options), session_options, *((OrtLogger*)nullptr ), ret);
663+
664+ return ret;
665+ }
0 commit comments