#![allow(non_snake_case, non_camel_case_types, non_upper_case_globals)]
#![allow(unused, dead_code)]
#![deny(clippy::all)]
#![warn(clippy::pedantic)]
#![warn(clippy::cargo)]
#![allow(
clippy::must_use_candidate,
clippy::suspicious_doc_comments,
clippy::wildcard_imports,
clippy::doc_markdown
)]
mod linking;
mod generated;
pub use generated::*;
pub use openvino_sys::ov_status_e;
pub use openvino_sys::ov_tensor_t;
pub mod library {
use std::path::PathBuf;
pub fn load() -> Result<(), String> {
super::generated::load()?;
init_variadic(find().as_deref())
}
pub fn load_from(path: impl Into<std::path::PathBuf>) -> Result<(), String> {
let path = path.into();
super::generated::load_from(path.clone())?;
init_variadic(Some(&path))
}
#[allow(unused_variables)]
fn init_variadic(path: Option<&std::path::Path>) -> Result<(), String> {
#[cfg(feature = "runtime-linking")]
if let Some(path) = path {
super::runtime_variadic::init_variadic_fns(path)?;
}
Ok(())
}
pub fn find() -> Option<PathBuf> {
if cfg!(feature = "runtime-linking") {
openvino_finder::find("openvino_genai_c", openvino_finder::Linking::Dynamic)
} else {
Some(PathBuf::from(env!("OPENVINO_GENAI_LIB_PATH")))
}
}
}
const MAX_PROPERTIES: usize = 8;
fn pad_props(
props: &[*const ::std::os::raw::c_char],
) -> [*const ::std::os::raw::c_char; MAX_PROPERTIES * 2] {
let mut out = [std::ptr::null(); MAX_PROPERTIES * 2];
let n = props.len().min(MAX_PROPERTIES * 2);
out[..n].copy_from_slice(&props[..n]);
out
}
#[cfg(feature = "dynamic-linking")]
mod dynamic_variadic {
use super::*;
unsafe extern "C" {
#[link_name = "ov_genai_llm_pipeline_create"]
fn ov_genai_llm_pipeline_create_raw(
models_path: *const ::std::os::raw::c_char,
device: *const ::std::os::raw::c_char,
property_args_size: usize,
pipe: *mut *mut ov_genai_llm_pipeline,
...
) -> ov_status_e;
#[link_name = "ov_genai_vlm_pipeline_create"]
fn ov_genai_vlm_pipeline_create_raw(
models_path: *const ::std::os::raw::c_char,
device: *const ::std::os::raw::c_char,
property_args_size: usize,
pipe: *mut *mut ov_genai_vlm_pipeline,
...
) -> ov_status_e;
#[link_name = "ov_genai_whisper_pipeline_create"]
fn ov_genai_whisper_pipeline_create_raw(
models_path: *const ::std::os::raw::c_char,
device: *const ::std::os::raw::c_char,
property_args_size: usize,
pipeline: *mut *mut ov_genai_whisper_pipeline,
...
) -> ov_status_e;
}
pub unsafe fn ov_genai_llm_pipeline_create(
models_path: *const ::std::os::raw::c_char,
device: *const ::std::os::raw::c_char,
property_args_size: usize,
pipe: *mut *mut ov_genai_llm_pipeline,
props: &[*const ::std::os::raw::c_char],
) -> ov_status_e {
assert!(
props.len() <= MAX_PROPERTIES * 2,
"too many properties (max {})",
MAX_PROPERTIES
);
let p = pad_props(props);
ov_genai_llm_pipeline_create_raw(
models_path,
device,
property_args_size,
pipe,
p[0],
p[1],
p[2],
p[3],
p[4],
p[5],
p[6],
p[7],
p[8],
p[9],
p[10],
p[11],
p[12],
p[13],
p[14],
p[15],
)
}
pub unsafe fn ov_genai_vlm_pipeline_create(
models_path: *const ::std::os::raw::c_char,
device: *const ::std::os::raw::c_char,
property_args_size: usize,
pipe: *mut *mut ov_genai_vlm_pipeline,
props: &[*const ::std::os::raw::c_char],
) -> ov_status_e {
assert!(
props.len() <= MAX_PROPERTIES * 2,
"too many properties (max {})",
MAX_PROPERTIES
);
let p = pad_props(props);
ov_genai_vlm_pipeline_create_raw(
models_path,
device,
property_args_size,
pipe,
p[0],
p[1],
p[2],
p[3],
p[4],
p[5],
p[6],
p[7],
p[8],
p[9],
p[10],
p[11],
p[12],
p[13],
p[14],
p[15],
)
}
pub unsafe fn ov_genai_whisper_pipeline_create(
models_path: *const ::std::os::raw::c_char,
device: *const ::std::os::raw::c_char,
property_args_size: usize,
pipeline: *mut *mut ov_genai_whisper_pipeline,
props: &[*const ::std::os::raw::c_char],
) -> ov_status_e {
assert!(
props.len() <= MAX_PROPERTIES * 2,
"too many properties (max {})",
MAX_PROPERTIES
);
let p = pad_props(props);
ov_genai_whisper_pipeline_create_raw(
models_path,
device,
property_args_size,
pipeline,
p[0],
p[1],
p[2],
p[3],
p[4],
p[5],
p[6],
p[7],
p[8],
p[9],
p[10],
p[11],
p[12],
p[13],
p[14],
p[15],
)
}
}
#[cfg(feature = "dynamic-linking")]
pub use dynamic_variadic::{
ov_genai_llm_pipeline_create, ov_genai_vlm_pipeline_create, ov_genai_whisper_pipeline_create,
};
#[cfg(feature = "runtime-linking")]
mod runtime_variadic {
use super::*;
use std::path::Path;
use std::sync::OnceLock;
type CreateFn = unsafe extern "C" fn(
*const ::std::os::raw::c_char, *const ::std::os::raw::c_char, usize, *mut *mut ::std::os::raw::c_void, *const ::std::os::raw::c_char,
*const ::std::os::raw::c_char,
*const ::std::os::raw::c_char,
*const ::std::os::raw::c_char,
*const ::std::os::raw::c_char,
*const ::std::os::raw::c_char,
*const ::std::os::raw::c_char,
*const ::std::os::raw::c_char,
*const ::std::os::raw::c_char,
*const ::std::os::raw::c_char,
*const ::std::os::raw::c_char,
*const ::std::os::raw::c_char,
*const ::std::os::raw::c_char,
*const ::std::os::raw::c_char,
*const ::std::os::raw::c_char,
*const ::std::os::raw::c_char,
) -> ov_status_e;
static LLM_CREATE: OnceLock<CreateFn> = OnceLock::new();
static VLM_CREATE: OnceLock<CreateFn> = OnceLock::new();
static WHISPER_CREATE: OnceLock<CreateFn> = OnceLock::new();
pub(crate) fn init_variadic_fns(path: &Path) -> Result<(), String> {
unsafe {
let lib = libloading::Library::new(path).map_err(|e| {
format!(
"failed to open shared library for variadic fns at {}: {}",
path.display(),
e,
)
})?;
if let Ok(sym) = lib.get::<CreateFn>(b"ov_genai_llm_pipeline_create") {
let _ = LLM_CREATE.set(*sym);
}
if let Ok(sym) = lib.get::<CreateFn>(b"ov_genai_vlm_pipeline_create") {
let _ = VLM_CREATE.set(*sym);
}
if let Ok(sym) = lib.get::<CreateFn>(b"ov_genai_whisper_pipeline_create") {
let _ = WHISPER_CREATE.set(*sym);
}
std::mem::forget(lib);
}
Ok(())
}
pub unsafe fn ov_genai_llm_pipeline_create(
models_path: *const ::std::os::raw::c_char,
device: *const ::std::os::raw::c_char,
property_args_size: usize,
pipe: *mut *mut ov_genai_llm_pipeline,
props: &[*const ::std::os::raw::c_char],
) -> ov_status_e {
assert!(
props.len() <= MAX_PROPERTIES * 2,
"too many properties (max {MAX_PROPERTIES})"
);
let p = pad_props(props);
let f = LLM_CREATE
.get()
.expect("`openvino_genai_c` function not loaded: `ov_genai_llm_pipeline_create`; call library::load() or library::load_from() first");
f(
models_path,
device,
property_args_size,
pipe.cast(),
p[0],
p[1],
p[2],
p[3],
p[4],
p[5],
p[6],
p[7],
p[8],
p[9],
p[10],
p[11],
p[12],
p[13],
p[14],
p[15],
)
}
pub unsafe fn ov_genai_vlm_pipeline_create(
models_path: *const ::std::os::raw::c_char,
device: *const ::std::os::raw::c_char,
property_args_size: usize,
pipe: *mut *mut ov_genai_vlm_pipeline,
props: &[*const ::std::os::raw::c_char],
) -> ov_status_e {
assert!(
props.len() <= MAX_PROPERTIES * 2,
"too many properties (max {MAX_PROPERTIES})"
);
let p = pad_props(props);
let f = VLM_CREATE
.get()
.expect("`openvino_genai_c` function not loaded: `ov_genai_vlm_pipeline_create`; call library::load() or library::load_from() first");
f(
models_path,
device,
property_args_size,
pipe.cast(),
p[0],
p[1],
p[2],
p[3],
p[4],
p[5],
p[6],
p[7],
p[8],
p[9],
p[10],
p[11],
p[12],
p[13],
p[14],
p[15],
)
}
pub unsafe fn ov_genai_whisper_pipeline_create(
models_path: *const ::std::os::raw::c_char,
device: *const ::std::os::raw::c_char,
property_args_size: usize,
pipeline: *mut *mut ov_genai_whisper_pipeline,
props: &[*const ::std::os::raw::c_char],
) -> ov_status_e {
assert!(
props.len() <= MAX_PROPERTIES * 2,
"too many properties (max {MAX_PROPERTIES})"
);
let p = pad_props(props);
let f = WHISPER_CREATE
.get()
.expect("`openvino_genai_c` function not loaded: `ov_genai_whisper_pipeline_create`; call library::load() or library::load_from() first");
f(
models_path,
device,
property_args_size,
pipeline.cast(),
p[0],
p[1],
p[2],
p[3],
p[4],
p[5],
p[6],
p[7],
p[8],
p[9],
p[10],
p[11],
p[12],
p[13],
p[14],
p[15],
)
}
}
#[cfg(feature = "runtime-linking")]
pub use runtime_variadic::{
ov_genai_llm_pipeline_create, ov_genai_vlm_pipeline_create, ov_genai_whisper_pipeline_create,
};