Skip to content

Commit d1f810a

Browse files
authored
[VitisAI] Enable ort::logger usage in compile_onnx_model_vitisai_ep_v4 (#26487)
### Description Enable the use of ort::logger safely across DLL boundaries for the VitisAI execution provider. ### Motivation and Context Resolves issue PUID 1194096. This enables compile_onnx_model_vitisai_ep_v4 to use ort::logger properly.
1 parent ea5cd2f commit d1f810a

File tree

2 files changed

+31
-7
lines changed

2 files changed

+31
-7
lines changed

onnxruntime/core/providers/vitisai/imp/global_api.cc

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,10 @@ struct OrtVitisAIEpAPI {
7979
std::vector<std::unique_ptr<vaip_core::ExecutionProvider>>* (*compile_onnx_model_vitisai_ep_with_error_handling)(
8080
const std::string& model_path, const onnxruntime::Graph& graph, const onnxruntime::ProviderOptions& options, void* status, vaip_core::error_report_func func);
8181
std::vector<std::unique_ptr<vaip_core::ExecutionProvider>>* (*compile_onnx_model_vitisai_ep_v3)(
82-
const std::filesystem::path& model_path, const onnxruntime::Graph& graph, const onnxruntime::ProviderOptions& options, void* status, vaip_core::error_report_func func);
82+
const std::string& model_path, const onnxruntime::Graph& graph, const onnxruntime::ProviderOptions& options, void* status, vaip_core::error_report_func func);
83+
std::vector<std::unique_ptr<vaip_core::ExecutionProvider>>* (*compile_onnx_model_vitisai_ep_v4)(
84+
const std::string& model_path, const onnxruntime::Graph& graph, const onnxruntime::ProviderOptions& options, void* status, vaip_core::error_report_func func, const onnxruntime::logging::Logger& logger);
85+
void (*vaip_execution_provider_deletor)(std::vector<std::unique_ptr<vaip_core::ExecutionProvider>>*) noexcept = [](std::vector<std::unique_ptr<vaip_core::ExecutionProvider>>* p) noexcept { delete p; };
8386
uint32_t (*vaip_get_version)();
8487
void (*create_ep_context_nodes)(
8588
const std::vector<std::unique_ptr<vaip_core::ExecutionProvider>>& eps,
@@ -126,7 +129,8 @@ struct OrtVitisAIEpAPI {
126129
auto status1 = env.GetSymbolFromLibrary(handle_, "compile_onnx_model_vitisai_ep_with_error_handling", (void**)&compile_onnx_model_vitisai_ep_with_error_handling);
127130
auto status2 = env.GetSymbolFromLibrary(handle_, "compile_onnx_model_vitisai_ep_with_options", (void**)&compile_onnx_model_with_options);
128131
auto status3 = env.GetSymbolFromLibrary(handle_, "compile_onnx_model_vitisai_ep_v3", (void**)&compile_onnx_model_vitisai_ep_v3);
129-
if ((!status1.IsOK()) && (!status2.IsOK()) && (!status3.IsOK())) {
132+
auto status4 = env.GetSymbolFromLibrary(handle_, "compile_onnx_model_vitisai_ep_v4", (void**)&compile_onnx_model_vitisai_ep_v4);
133+
if ((!status1.IsOK()) && (!status2.IsOK()) && (!status3.IsOK()) && (!status4.IsOK())) {
130134
::onnxruntime::LogRuntimeError(0, status2, __FILE__, static_cast<const char*>(__FUNCTION__), __LINE__);
131135
ORT_THROW(status2);
132136
}
@@ -137,6 +141,15 @@ struct OrtVitisAIEpAPI {
137141
ORT_THROW_IF_ERROR(env.GetSymbolFromLibrary(handle_, "vitisai_ep_on_run_start", (void**)&vitisai_ep_on_run_start));
138142
ORT_THROW_IF_ERROR(env.GetSymbolFromLibrary(handle_, "vitisai_ep_set_ep_dynamic_options", (void**)&vitisai_ep_set_ep_dynamic_options));
139143
std::ignore = env.GetSymbolFromLibrary(handle_, "deinitialize_onnxruntime_vitisai_ep", (void**)&deinitialize_onnxruntime_vitisai_ep);
144+
{
145+
typedef void* (*vaip_get_execution_provider_deletor_func_t)();
146+
vaip_get_execution_provider_deletor_func_t vaip_get_execution_provider_deletor = nullptr;
147+
auto status = env.GetSymbolFromLibrary(handle_, "vaip_get_execution_provider_deletor",
148+
(void**)&vaip_get_execution_provider_deletor);
149+
if (status.IsOK()) {
150+
vaip_execution_provider_deletor = reinterpret_cast<decltype(vaip_execution_provider_deletor)>(vaip_get_execution_provider_deletor());
151+
};
152+
}
140153
}
141154
void Clear() {
142155
if (handle_) {
@@ -174,24 +187,33 @@ void change_status_with_error(void* status_ptr, int error_code, const char* erro
174187
vaip_core::DllSafe<std::vector<std::unique_ptr<vaip_core::ExecutionProvider>>> compile_onnx_model(
175188
const onnxruntime::GraphViewer& graph_viewer, const onnxruntime::logging::Logger& logger, const onnxruntime::ProviderOptions& options) {
176189
auto model_path = graph_viewer.ModelPath();
177-
if (s_library_vitisaiep.compile_onnx_model_vitisai_ep_v3) {
190+
auto vaip_execution_provider_deletor = s_library_vitisaiep.vaip_execution_provider_deletor;
191+
if (s_library_vitisaiep.compile_onnx_model_vitisai_ep_v4) {
192+
Status status = Status::OK();
193+
auto status_ptr = reinterpret_cast<void*>(&status);
194+
auto ret = vaip_core::DllSafe(s_library_vitisaiep.compile_onnx_model_vitisai_ep_v4(model_path.u8string(), graph_viewer.GetGraph(), options, status_ptr, change_status_with_error, logger), vaip_execution_provider_deletor);
195+
if (!status.IsOK()) {
196+
ORT_THROW(status);
197+
}
198+
return ret;
199+
} else if (s_library_vitisaiep.compile_onnx_model_vitisai_ep_v3) {
178200
Status status = Status::OK();
179201
auto status_ptr = reinterpret_cast<void*>(&status);
180-
auto ret = vaip_core::DllSafe(s_library_vitisaiep.compile_onnx_model_vitisai_ep_v3(model_path, graph_viewer.GetGraph(), options, status_ptr, change_status_with_error));
202+
auto ret = vaip_core::DllSafe(s_library_vitisaiep.compile_onnx_model_vitisai_ep_v3(model_path.u8string(), graph_viewer.GetGraph(), options, status_ptr, change_status_with_error), vaip_execution_provider_deletor);
181203
if (!status.IsOK()) {
182204
ORT_THROW(status);
183205
}
184206
return ret;
185207
} else if (s_library_vitisaiep.compile_onnx_model_vitisai_ep_with_error_handling) {
186208
Status status = Status::OK();
187209
auto status_ptr = reinterpret_cast<void*>(&status);
188-
auto ret = vaip_core::DllSafe(s_library_vitisaiep.compile_onnx_model_vitisai_ep_with_error_handling(model_path.u8string(), graph_viewer.GetGraph(), options, status_ptr, change_status_with_error));
210+
auto ret = vaip_core::DllSafe(s_library_vitisaiep.compile_onnx_model_vitisai_ep_with_error_handling(model_path.u8string(), graph_viewer.GetGraph(), options, status_ptr, change_status_with_error), vaip_execution_provider_deletor);
189211
if (!status.IsOK()) {
190212
ORT_THROW(status);
191213
}
192214
return ret;
193215
} else {
194-
return vaip_core::DllSafe(s_library_vitisaiep.compile_onnx_model_with_options(model_path.u8string(), graph_viewer.GetGraph(), options));
216+
return vaip_core::DllSafe(s_library_vitisaiep.compile_onnx_model_with_options(model_path.u8string(), graph_viewer.GetGraph(), options), vaip_execution_provider_deletor);
195217
}
196218
}
197219

onnxruntime/core/providers/vitisai/include/vaip/dll_safe.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ class DllSafe {
1717
: value_{value}, deleter_{[](T* value) noexcept {
1818
std::default_delete<T>()(value);
1919
}} {}
20-
20+
explicit DllSafe(T* value, void (*deleter)(T*) noexcept)
21+
: value_{value}, deleter_{deleter} {
22+
}
2123
explicit DllSafe(T&& value) : DllSafe(new T(std::move(value))) {}
2224
explicit DllSafe(const T& value) : DllSafe(new T(value)) {}
2325

0 commit comments

Comments
 (0)