diff --git a/csharp/src/Microsoft.ML.OnnxRuntime/NativeMethods.shared.cs b/csharp/src/Microsoft.ML.OnnxRuntime/NativeMethods.shared.cs index 8cca2b42e987a..7f9c94638567f 100644 --- a/csharp/src/Microsoft.ML.OnnxRuntime/NativeMethods.shared.cs +++ b/csharp/src/Microsoft.ML.OnnxRuntime/NativeMethods.shared.cs @@ -597,6 +597,8 @@ static NativeMethods() api_.SessionOptionsAppendExecutionProvider_CUDA, typeof(DSessionOptionsAppendExecutionProvider_CUDA)); SessionOptionsAppendExecutionProvider_CUDA_V2 = (DSessionOptionsAppendExecutionProvider_CUDA_V2)Marshal.GetDelegateForFunctionPointer( api_.SessionOptionsAppendExecutionProvider_CUDA_V2, typeof(DSessionOptionsAppendExecutionProvider_CUDA_V2)); + SessionOptionsAppendExecutionProvider_VitisAI = (DSessionOptionsAppendExecutionProvider_VitisAI)Marshal.GetDelegateForFunctionPointer( + api_.SessionOptionsAppendExecutionProvider_VitisAI, typeof(DSessionOptionsAppendExecutionProvider_VitisAI)); OrtCreateCUDAProviderOptions = (DOrtCreateCUDAProviderOptions)Marshal.GetDelegateForFunctionPointer(api_.CreateCUDAProviderOptions, typeof(DOrtCreateCUDAProviderOptions)); OrtUpdateCUDAProviderOptions = (DOrtUpdateCUDAProviderOptions)Marshal.GetDelegateForFunctionPointer(api_.UpdateCUDAProviderOptions, typeof(DOrtUpdateCUDAProviderOptions)); OrtGetCUDAProviderOptionsAsString = (DOrtGetCUDAProviderOptionsAsString)Marshal.GetDelegateForFunctionPointer(api_.GetCUDAProviderOptionsAsString, typeof(DOrtGetCUDAProviderOptionsAsString)); @@ -1312,6 +1314,20 @@ IntPtr[] outputValues /* An array of output value pointers. Array must be alloca public static DSessionOptionsAppendExecutionProvider_TensorRT_V2 SessionOptionsAppendExecutionProvider_TensorRT_V2; + /// + /// Append a VitisAI EP instance (configured based on given provider options) to the native OrtSessionOptions instance + /// + /// Native OrtSessionOptions instance + /// Native keys instance + /// Native values instance + /// Native numEntries instance + [UnmanagedFunctionPointer(CallingConvention.Winapi)] + public delegate IntPtr /*(OrtStatus*)*/ DSessionOptionsAppendExecutionProvider_VitisAI( + IntPtr /*(OrtSessionOptions*)*/ options, + IntPtr keys, IntPtr values, UIntPtr numEntries); + + public static DSessionOptionsAppendExecutionProvider_VitisAI SessionOptionsAppendExecutionProvider_VitisAI; + /// /// Append a CUDA EP instance (configured based on given provider options) to the native OrtSessionOptions instance /// diff --git a/csharp/src/Microsoft.ML.OnnxRuntime/SessionOptions.shared.cs b/csharp/src/Microsoft.ML.OnnxRuntime/SessionOptions.shared.cs index 6e325f7fe9646..bebb7bd92e8bc 100644 --- a/csharp/src/Microsoft.ML.OnnxRuntime/SessionOptions.shared.cs +++ b/csharp/src/Microsoft.ML.OnnxRuntime/SessionOptions.shared.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Runtime.InteropServices; using System.Text; +using System.Linq; namespace Microsoft.ML.OnnxRuntime { @@ -257,6 +258,56 @@ public void AppendExecutionProvider_CUDA(OrtCUDAProviderOptions cudaProviderOpti #endif } + /// + /// Append a VitisAI EP instance (configured based on given provider options) to the native OrtSessionOptions instance + /// + /// Native OrtSessionOptions instance + /// Native keys instance + /// Native values instance + /// Native numEntries instance + public void AppendExecutionProvider_VitisAI(Dictionary config) + { +#if __MOBILE__ + throw new NotSupportedException("The VitisAI Execution Provider is not supported in this build"); +#else + int count = config.Count; + IntPtr[] keyPtrs = new IntPtr[count]; + IntPtr[] valuePtrs = new IntPtr[count]; + + string[] keys = config.Keys.ToArray(); + string[] values = config.Values.ToArray(); + + for (int i = 0; i < count; ++i) { + keyPtrs[i] = Marshal.StringToHGlobalAnsi(keys[i]); + valuePtrs[i] = Marshal.StringToHGlobalAnsi(values[i]); + } + + IntPtr keysNative = Marshal.AllocHGlobal(IntPtr.Size * count); + IntPtr valuesNative = Marshal.AllocHGlobal(IntPtr.Size * count); + + Marshal.Copy(keyPtrs, 0, keysNative, count); + Marshal.Copy(valuePtrs, 0, valuesNative, count); + + try + { + UIntPtr numKeys = new UIntPtr((uint)count); + NativeApiStatus.VerifySuccess( + NativeMethods.SessionOptionsAppendExecutionProvider_VitisAI( + handle, keysNative, valuesNative, numKeys)); + } + finally + { + for (int i = 0; i < count; ++i) + { + Marshal.FreeHGlobal(keyPtrs[i]); + Marshal.FreeHGlobal(valuePtrs[i]); + } + Marshal.FreeHGlobal(keysNative); + Marshal.FreeHGlobal(valuesNative); + } +#endif + } + /// /// Use only if you have the onnxruntime package specific to this Execution Provider. ///