1 module bindbc.onnxruntime.v12.bind;
2
3 import bindbc.loader;
4 import bindbc.onnxruntime.config;
5 import bindbc.onnxruntime.v12.types;
6
7 version (BindONNXRuntime_Static)
8 {
9 extern (C) OrtApiBase* OrtGetApiBase();
10 }
11 else
12 {
13 private __gshared SharedLib lib;
14 private __gshared ONNXRuntimeSupport loadedVersion;
15
16 extern (C) @nogc nothrow:
17
18 __gshared const(OrtApiBase)* function() OrtGetApiBase;
19
20 ONNXRuntimeSupport loadedONNXVersion()
21 {
22 return loadedVersion;
23 }
24
25 bool isONNXLoaded()
26 {
27 return lib != invalidHandle;
28 }
29
30 ONNXRuntimeSupport loadONNXRuntime()
31 {
32 version (Windows)
33 {
34 const(char)[][1] libNames = ["onnxruntime.dll"];
35 }
36 else version (OSX)
37 {
38 const(char)[][2] libNames = [
39 "libonnxruntime.dylib", "libonnxruntime.1.2.0.dylib"
40 ];
41 }
42 else version (Posix)
43 {
44 const(char)[][2] libNames = ["onnxruntime.so", "onnxruntime.so.1.2"];
45 }
46 else
47 static assert(false,
48 "bindbc-onnxruntime support for ONNX Runtime 1.2 is not implemented on this platform.");
49
50 ONNXRuntimeSupport ret;
51 foreach (libName; libNames)
52 {
53 ret = loadONNXRuntimeByLibName(libName.ptr);
54 if (ret != ONNXRuntimeSupport.noLibrary)
55 {
56 return ret;
57 }
58 }
59
60 return ONNXRuntimeSupport.noLibrary;
61 }
62
63 ONNXRuntimeSupport loadONNXRuntimeByLibName(const char* libName)
64 in(libName !is null)
65 {
66 lib = load(libName);
67 if (lib == invalidHandle)
68 {
69 return ONNXRuntimeSupport.noLibrary;
70 }
71
72 const errCount = errorCount();
73
74 lib.bindSymbol(cast(void**)&OrtGetApiBase, "OrtGetApiBase");
75
76 if (errCount != errorCount())
77 {
78 return ONNXRuntimeSupport.badLibrary;
79 }
80 loadedVersion = ONNXRuntimeSupport.onnx12;
81
82 return ONNXRuntimeSupport.onnx12;
83 }
84
85 void unloadONNXRuntime()
86 {
87 if (lib != invalidHandle)
88 {
89 lib.unload();
90 }
91 }
92 }