use cpp::cpp;
use crate::OptimizationProfile;
type Result<T> = std::result::Result<T, crate::error::Error>;
pub struct BuilderConfig(*mut std::ffi::c_void);
unsafe impl Send for BuilderConfig {}
unsafe impl Sync for BuilderConfig {}
impl BuilderConfig {
pub(crate) fn wrap(internal: *mut std::ffi::c_void) -> Self {
Self(internal)
}
pub fn with_max_workspace_size(mut self, size: usize) -> Self {
let internal = self.as_mut_ptr();
cpp!(unsafe [
internal as "void*",
size as "std::size_t"
] {
((IBuilderConfig*) internal)->setMemoryPoolLimit(MemoryPoolType::kWORKSPACE, size);
});
self
}
pub fn with_strict_types(mut self) -> Self {
let internal = self.as_mut_ptr();
cpp!(unsafe [
internal as "void*"
] {
#if NV_TENSORRT_MAJOR >= 10
((IBuilderConfig*) internal)->setFlag(BuilderFlag::kPREFER_PRECISION_CONSTRAINTS);
((IBuilderConfig*) internal)->setFlag(BuilderFlag::kDIRECT_IO);
((IBuilderConfig*) internal)->setFlag(BuilderFlag::kREJECT_EMPTY_ALGORITHMS);
#else
((IBuilderConfig*) internal)->setFlag(BuilderFlag::kSTRICT_TYPES);
#endif
});
self
}
pub fn with_fp16(mut self) -> Self {
let internal = self.as_mut_ptr();
cpp!(unsafe [
internal as "void*"
] {
((IBuilderConfig*) internal)->setFlag(BuilderFlag::kFP16);
});
self
}
pub fn with_optimization_profile(
mut self,
optimization_profile: OptimizationProfile,
) -> Result<Self> {
self.add_optimization_profile(optimization_profile)?;
Ok(self)
}
pub fn add_optimization_profile(
&mut self,
optimization_profile: OptimizationProfile,
) -> Result<()> {
let internal = self.as_mut_ptr();
let optimization_profile = optimization_profile.as_ptr();
let index = cpp!(unsafe [
internal as "void*",
optimization_profile as "const IOptimizationProfile*"
] -> i32 as "std::int32_t" {
return ((IBuilderConfig*) internal)->addOptimizationProfile(optimization_profile);
});
if index >= 0 {
Ok(())
} else {
Err(crate::error::last_error())
}
}
#[inline(always)]
pub fn as_ptr(&self) -> *const std::ffi::c_void {
let BuilderConfig(internal) = *self;
internal
}
#[inline(always)]
pub fn as_mut_ptr(&mut self) -> *mut std::ffi::c_void {
let BuilderConfig(internal) = *self;
internal
}
}
impl Drop for BuilderConfig {
fn drop(&mut self) {
let internal = self.as_mut_ptr();
cpp!(unsafe [
internal as "void*"
] {
destroy((IBuilderConfig*) internal);
});
}
}