use super::buffer_descriptor::BufferDescriptor;
use super::cuda_vertex_buffer::CudaVertexBuffer;
use crate::far::StencilTable;
use opensubdiv_petite_sys as sys;
use crate::Error;
type Result<T, E = Error> = std::result::Result<T, E>;
pub fn evaluate_stencils(
src_buffer: &CudaVertexBuffer,
src_desc: BufferDescriptor,
dst_buffer: &mut CudaVertexBuffer,
dst_desc: BufferDescriptor,
stencil_table: &CudaStencilTable,
) -> Result<()> {
unsafe {
if sys::osd::CudaEvaluator_EvalStencils(
src_buffer.0,
src_desc.0,
dst_buffer.0,
dst_desc.0,
stencil_table.ptr,
) {
Ok(())
} else {
Err(Error::EvalStencilsFailed)
}
}
}
pub struct CudaStencilTable<'a> {
pub(crate) ptr: sys::osd::CudaStencilTablePtr,
st: std::marker::PhantomData<&'a StencilTable>,
}
impl<'a> CudaStencilTable<'a> {
pub fn new(st: &StencilTable) -> crate::Result<CudaStencilTable<'_>> {
let ptr = unsafe { sys::osd::CudaStencilTable_Create(st.0) };
if ptr.is_null() {
return Err(crate::Error::GpuBackend(
"Could not create CudaStencilTable".to_string(),
));
}
Ok(CudaStencilTable {
ptr,
st: std::marker::PhantomData,
})
}
}