singe-npp 0.1.0-alpha.8

Safe Rust wrappers for NVIDIA Performance Primitives library (NPP).
Documentation
use super::*;

macro_rules! impl_accumulate_square {
    ($name:ident, $source_ty:ty, $destination_ty:ty, $ffi:ident) => {
        pub fn $name(
            stream_context: &StreamContext,
            source: &ImageView<'_, $source_ty, C1>,
            source_destination: &mut ImageViewMut<'_, $destination_ty, C1>,
        ) -> Result<()> {
            validate_same_size(source.size(), source_destination.size())?;
            unsafe {
                try_ffi!(sys::$ffi(
                    source.as_ptr().cast(),
                    source.step(),
                    source_destination.as_mut_ptr().cast(),
                    source_destination.step(),
                    source.size().into(),
                    stream_context.as_raw(),
                ))?;
            }
            Ok(())
        }
    };
}

macro_rules! impl_accumulate_square_masked {
    ($name:ident, $source_ty:ty, $destination_ty:ty, $ffi:ident) => {
        pub fn $name(
            stream_context: &StreamContext,
            source: &ImageView<'_, $source_ty, C1>,
            mask: &MaskView<'_>,
            source_destination: &mut ImageViewMut<'_, $destination_ty, C1>,
        ) -> Result<()> {
            validate_same_size(source.size(), mask.size())?;
            validate_same_size(source.size(), source_destination.size())?;
            unsafe {
                try_ffi!(sys::$ffi(
                    source.as_ptr().cast(),
                    source.step(),
                    mask.as_ptr().cast(),
                    mask.step(),
                    source_destination.as_mut_ptr().cast(),
                    source_destination.step(),
                    source.size().into(),
                    stream_context.as_raw(),
                ))?;
            }
            Ok(())
        }
    };
}

macro_rules! impl_accumulate_product {
    ($name:ident, $source_ty:ty, $destination_ty:ty, $ffi:ident) => {
        pub fn $name(
            stream_context: &StreamContext,
            source1: &ImageView<'_, $source_ty, C1>,
            source2: &ImageView<'_, $source_ty, C1>,
            source_destination: &mut ImageViewMut<'_, $destination_ty, C1>,
        ) -> Result<()> {
            validate_same_size(source1.size(), source2.size())?;
            validate_same_size(source1.size(), source_destination.size())?;
            unsafe {
                try_ffi!(sys::$ffi(
                    source1.as_ptr().cast(),
                    source1.step(),
                    source2.as_ptr().cast(),
                    source2.step(),
                    source_destination.as_mut_ptr().cast(),
                    source_destination.step(),
                    source1.size().into(),
                    stream_context.as_raw(),
                ))?;
            }
            Ok(())
        }
    };
}

macro_rules! impl_accumulate_product_masked {
    ($name:ident, $source_ty:ty, $destination_ty:ty, $ffi:ident) => {
        pub fn $name(
            stream_context: &StreamContext,
            source1: &ImageView<'_, $source_ty, C1>,
            source2: &ImageView<'_, $source_ty, C1>,
            mask: &MaskView<'_>,
            source_destination: &mut ImageViewMut<'_, $destination_ty, C1>,
        ) -> Result<()> {
            validate_same_size(source1.size(), source2.size())?;
            validate_same_size(source1.size(), mask.size())?;
            validate_same_size(source1.size(), source_destination.size())?;
            unsafe {
                try_ffi!(sys::$ffi(
                    source1.as_ptr().cast(),
                    source1.step(),
                    source2.as_ptr().cast(),
                    source2.step(),
                    mask.as_ptr().cast(),
                    mask.step(),
                    source_destination.as_mut_ptr().cast(),
                    source_destination.step(),
                    source1.size().into(),
                    stream_context.as_raw(),
                ))?;
            }
            Ok(())
        }
    };
}

macro_rules! impl_accumulate_weighted {
    ($name:ident, $source_ty:ty, $destination_ty:ty, $ffi:ident) => {
        pub fn $name(
            stream_context: &StreamContext,
            source: &ImageView<'_, $source_ty, C1>,
            source_destination: &mut ImageViewMut<'_, $destination_ty, C1>,
            alpha: f32,
        ) -> Result<()> {
            validate_same_size(source.size(), source_destination.size())?;
            unsafe {
                try_ffi!(sys::$ffi(
                    source.as_ptr().cast(),
                    source.step(),
                    source_destination.as_mut_ptr().cast(),
                    source_destination.step(),
                    source.size().into(),
                    alpha,
                    stream_context.as_raw(),
                ))?;
            }
            Ok(())
        }
    };
}

macro_rules! impl_accumulate_weighted_masked {
    ($name:ident, $source_ty:ty, $destination_ty:ty, $ffi:ident) => {
        pub fn $name(
            stream_context: &StreamContext,
            source: &ImageView<'_, $source_ty, C1>,
            mask: &MaskView<'_>,
            source_destination: &mut ImageViewMut<'_, $destination_ty, C1>,
            alpha: f32,
        ) -> Result<()> {
            validate_same_size(source.size(), mask.size())?;
            validate_same_size(source.size(), source_destination.size())?;
            unsafe {
                try_ffi!(sys::$ffi(
                    source.as_ptr().cast(),
                    source.step(),
                    mask.as_ptr().cast(),
                    mask.step(),
                    source_destination.as_mut_ptr().cast(),
                    source_destination.step(),
                    source.size().into(),
                    alpha,
                    stream_context.as_raw(),
                ))?;
            }
            Ok(())
        }
    };
}

impl_accumulate_square!(
    accumulate_square_u8_to_f32_c1,
    u8,
    f32,
    nppiAddSquare_8u32f_C1IR_Ctx
);
impl_accumulate_square_masked!(
    accumulate_square_u8_to_f32_c1_masked,
    u8,
    f32,
    nppiAddSquare_8u32f_C1IMR_Ctx
);
impl_accumulate_square!(
    accumulate_square_u16_to_f32_c1,
    u16,
    f32,
    nppiAddSquare_16u32f_C1IR_Ctx
);
impl_accumulate_square_masked!(
    accumulate_square_u16_to_f32_c1_masked,
    u16,
    f32,
    nppiAddSquare_16u32f_C1IMR_Ctx
);
impl_accumulate_square!(
    accumulate_square_f32_c1,
    f32,
    f32,
    nppiAddSquare_32f_C1IR_Ctx
);
impl_accumulate_square_masked!(
    accumulate_square_f32_c1_masked,
    f32,
    f32,
    nppiAddSquare_32f_C1IMR_Ctx
);

impl_accumulate_product!(
    accumulate_product_u8_to_f32_c1,
    u8,
    f32,
    nppiAddProduct_8u32f_C1IR_Ctx
);
impl_accumulate_product_masked!(
    accumulate_product_u8_to_f32_c1_masked,
    u8,
    f32,
    nppiAddProduct_8u32f_C1IMR_Ctx
);
impl_accumulate_product!(
    accumulate_product_u16_to_f32_c1,
    u16,
    f32,
    nppiAddProduct_16u32f_C1IR_Ctx
);
impl_accumulate_product_masked!(
    accumulate_product_u16_to_f32_c1_masked,
    u16,
    f32,
    nppiAddProduct_16u32f_C1IMR_Ctx
);
impl_accumulate_product!(
    accumulate_product_f32_c1,
    f32,
    f32,
    nppiAddProduct_32f_C1IR_Ctx
);
impl_accumulate_product_masked!(
    accumulate_product_f32_c1_masked,
    f32,
    f32,
    nppiAddProduct_32f_C1IMR_Ctx
);
impl_accumulate_product!(
    accumulate_product_f16_c1,
    f16,
    f16,
    nppiAddProduct_16f_C1IR_Ctx
);

impl_accumulate_weighted!(
    accumulate_weighted_u8_to_f32_c1,
    u8,
    f32,
    nppiAddWeighted_8u32f_C1IR_Ctx
);
impl_accumulate_weighted_masked!(
    accumulate_weighted_u8_to_f32_c1_masked,
    u8,
    f32,
    nppiAddWeighted_8u32f_C1IMR_Ctx
);
impl_accumulate_weighted!(
    accumulate_weighted_u16_to_f32_c1,
    u16,
    f32,
    nppiAddWeighted_16u32f_C1IR_Ctx
);
impl_accumulate_weighted_masked!(
    accumulate_weighted_u16_to_f32_c1_masked,
    u16,
    f32,
    nppiAddWeighted_16u32f_C1IMR_Ctx
);
impl_accumulate_weighted!(
    accumulate_weighted_f32_c1,
    f32,
    f32,
    nppiAddWeighted_32f_C1IR_Ctx
);
impl_accumulate_weighted_masked!(
    accumulate_weighted_f32_c1_masked,
    f32,
    f32,
    nppiAddWeighted_32f_C1IMR_Ctx
);