singe-npp 0.1.0-alpha.8

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

impl_mirror!(mirror_u8_c1, u8, C1, nppiMirror_8u_C1R_Ctx);
impl_mirror!(mirror_u8_c3, u8, C3, nppiMirror_8u_C3R_Ctx);
impl_mirror!(mirror_u8_c4, u8, C4, nppiMirror_8u_C4R_Ctx);
impl_mirror!(mirror_u8_ac4, u8, AC4, nppiMirror_8u_AC4R_Ctx);
impl_mirror!(mirror_u16_c1, u16, C1, nppiMirror_16u_C1R_Ctx);
impl_mirror!(mirror_u16_c3, u16, C3, nppiMirror_16u_C3R_Ctx);
impl_mirror!(mirror_u16_c4, u16, C4, nppiMirror_16u_C4R_Ctx);
impl_mirror!(mirror_u16_ac4, u16, AC4, nppiMirror_16u_AC4R_Ctx);
impl_mirror!(mirror_i16_c1, i16, C1, nppiMirror_16s_C1R_Ctx);
impl_mirror!(mirror_i16_c3, i16, C3, nppiMirror_16s_C3R_Ctx);
impl_mirror!(mirror_i16_c4, i16, C4, nppiMirror_16s_C4R_Ctx);
impl_mirror!(mirror_i16_ac4, i16, AC4, nppiMirror_16s_AC4R_Ctx);
impl_mirror!(mirror_i32_c1, i32, C1, nppiMirror_32s_C1R_Ctx);
impl_mirror!(mirror_i32_c3, i32, C3, nppiMirror_32s_C3R_Ctx);
impl_mirror!(mirror_i32_c4, i32, C4, nppiMirror_32s_C4R_Ctx);
impl_mirror!(mirror_i32_ac4, i32, AC4, nppiMirror_32s_AC4R_Ctx);
impl_mirror!(mirror_f32_c1, f32, C1, nppiMirror_32f_C1R_Ctx);
impl_mirror!(mirror_f32_c3, f32, C3, nppiMirror_32f_C3R_Ctx);
impl_mirror!(mirror_f32_c4, f32, C4, nppiMirror_32f_C4R_Ctx);
impl_mirror!(mirror_f32_ac4, f32, AC4, nppiMirror_32f_AC4R_Ctx);

impl_mirror_in_place!(mirror_u8_c1_in_place, u8, C1, nppiMirror_8u_C1IR_Ctx);
impl_mirror_in_place!(mirror_u8_c3_in_place, u8, C3, nppiMirror_8u_C3IR_Ctx);
impl_mirror_in_place!(mirror_u8_c4_in_place, u8, C4, nppiMirror_8u_C4IR_Ctx);
impl_mirror_in_place!(mirror_u8_ac4_in_place, u8, AC4, nppiMirror_8u_AC4IR_Ctx);
impl_mirror_in_place!(mirror_u16_c1_in_place, u16, C1, nppiMirror_16u_C1IR_Ctx);
impl_mirror_in_place!(mirror_u16_c3_in_place, u16, C3, nppiMirror_16u_C3IR_Ctx);
impl_mirror_in_place!(mirror_u16_c4_in_place, u16, C4, nppiMirror_16u_C4IR_Ctx);
impl_mirror_in_place!(mirror_u16_ac4_in_place, u16, AC4, nppiMirror_16u_AC4IR_Ctx);
impl_mirror_in_place!(mirror_i16_c1_in_place, i16, C1, nppiMirror_16s_C1IR_Ctx);
impl_mirror_in_place!(mirror_i16_c3_in_place, i16, C3, nppiMirror_16s_C3IR_Ctx);
impl_mirror_in_place!(mirror_i16_c4_in_place, i16, C4, nppiMirror_16s_C4IR_Ctx);
impl_mirror_in_place!(mirror_i16_ac4_in_place, i16, AC4, nppiMirror_16s_AC4IR_Ctx);
impl_mirror_in_place!(mirror_i32_c1_in_place, i32, C1, nppiMirror_32s_C1IR_Ctx);
impl_mirror_in_place!(mirror_i32_c3_in_place, i32, C3, nppiMirror_32s_C3IR_Ctx);
impl_mirror_in_place!(mirror_i32_c4_in_place, i32, C4, nppiMirror_32s_C4IR_Ctx);
impl_mirror_in_place!(mirror_i32_ac4_in_place, i32, AC4, nppiMirror_32s_AC4IR_Ctx);
impl_mirror_in_place!(mirror_f32_c1_in_place, f32, C1, nppiMirror_32f_C1IR_Ctx);
impl_mirror_in_place!(mirror_f32_c3_in_place, f32, C3, nppiMirror_32f_C3IR_Ctx);
impl_mirror_in_place!(mirror_f32_c4_in_place, f32, C4, nppiMirror_32f_C4IR_Ctx);
impl_mirror_in_place!(mirror_f32_ac4_in_place, f32, AC4, nppiMirror_32f_AC4IR_Ctx);

pub trait Mirror<L: ChannelLayout>: DataTypeLike {
    fn mirror(
        stream_context: &StreamContext,
        source: &ImageView<'_, Self, L>,
        destination: &mut ImageViewMut<'_, Self, L>,
        axis: Axis,
    ) -> Result<()>;
}

macro_rules! impl_mirror_dispatch {
    ($ty:ty, $layout:ty, $function:ident) => {
        impl Mirror<$layout> for $ty {
            fn mirror(
                stream_context: &StreamContext,
                source: &ImageView<'_, Self, $layout>,
                destination: &mut ImageViewMut<'_, Self, $layout>,
                axis: Axis,
            ) -> Result<()> {
                $function(stream_context, source, destination, axis)
            }
        }
    };
}

impl_mirror_dispatch!(u8, C1, mirror_u8_c1);
impl_mirror_dispatch!(u8, C3, mirror_u8_c3);
impl_mirror_dispatch!(u8, C4, mirror_u8_c4);
impl_mirror_dispatch!(u8, AC4, mirror_u8_ac4);
impl_mirror_dispatch!(u16, C1, mirror_u16_c1);
impl_mirror_dispatch!(u16, C3, mirror_u16_c3);
impl_mirror_dispatch!(u16, C4, mirror_u16_c4);
impl_mirror_dispatch!(u16, AC4, mirror_u16_ac4);
impl_mirror_dispatch!(i16, C1, mirror_i16_c1);
impl_mirror_dispatch!(i16, C3, mirror_i16_c3);
impl_mirror_dispatch!(i16, C4, mirror_i16_c4);
impl_mirror_dispatch!(i16, AC4, mirror_i16_ac4);
impl_mirror_dispatch!(i32, C1, mirror_i32_c1);
impl_mirror_dispatch!(i32, C3, mirror_i32_c3);
impl_mirror_dispatch!(i32, C4, mirror_i32_c4);
impl_mirror_dispatch!(i32, AC4, mirror_i32_ac4);
impl_mirror_dispatch!(f32, C1, mirror_f32_c1);
impl_mirror_dispatch!(f32, C3, mirror_f32_c3);
impl_mirror_dispatch!(f32, C4, mirror_f32_c4);
impl_mirror_dispatch!(f32, AC4, mirror_f32_ac4);

pub fn mirror<T, L>(
    stream_context: &StreamContext,
    source: &ImageView<'_, T, L>,
    destination: &mut ImageViewMut<'_, T, L>,
    axis: Axis,
) -> Result<()>
where
    T: Mirror<L>,
    L: ChannelLayout,
{
    T::mirror(stream_context, source, destination, axis)
}

pub trait MirrorInPlace<L: ChannelLayout>: DataTypeLike {
    fn mirror_in_place(
        stream_context: &StreamContext,
        image: &mut ImageViewMut<'_, Self, L>,
        axis: Axis,
    ) -> Result<()>;
}

macro_rules! impl_mirror_in_place_dispatch {
    ($ty:ty, $layout:ty, $function:ident) => {
        impl MirrorInPlace<$layout> for $ty {
            fn mirror_in_place(
                stream_context: &StreamContext,
                image: &mut ImageViewMut<'_, Self, $layout>,
                axis: Axis,
            ) -> Result<()> {
                $function(stream_context, image, axis)
            }
        }
    };
}

impl_mirror_in_place_dispatch!(u8, C1, mirror_u8_c1_in_place);
impl_mirror_in_place_dispatch!(u8, C3, mirror_u8_c3_in_place);
impl_mirror_in_place_dispatch!(u8, C4, mirror_u8_c4_in_place);
impl_mirror_in_place_dispatch!(u8, AC4, mirror_u8_ac4_in_place);
impl_mirror_in_place_dispatch!(u16, C1, mirror_u16_c1_in_place);
impl_mirror_in_place_dispatch!(u16, C3, mirror_u16_c3_in_place);
impl_mirror_in_place_dispatch!(u16, C4, mirror_u16_c4_in_place);
impl_mirror_in_place_dispatch!(u16, AC4, mirror_u16_ac4_in_place);
impl_mirror_in_place_dispatch!(i16, C1, mirror_i16_c1_in_place);
impl_mirror_in_place_dispatch!(i16, C3, mirror_i16_c3_in_place);
impl_mirror_in_place_dispatch!(i16, C4, mirror_i16_c4_in_place);
impl_mirror_in_place_dispatch!(i16, AC4, mirror_i16_ac4_in_place);
impl_mirror_in_place_dispatch!(i32, C1, mirror_i32_c1_in_place);
impl_mirror_in_place_dispatch!(i32, C3, mirror_i32_c3_in_place);
impl_mirror_in_place_dispatch!(i32, C4, mirror_i32_c4_in_place);
impl_mirror_in_place_dispatch!(i32, AC4, mirror_i32_ac4_in_place);
impl_mirror_in_place_dispatch!(f32, C1, mirror_f32_c1_in_place);
impl_mirror_in_place_dispatch!(f32, C3, mirror_f32_c3_in_place);
impl_mirror_in_place_dispatch!(f32, C4, mirror_f32_c4_in_place);
impl_mirror_in_place_dispatch!(f32, AC4, mirror_f32_ac4_in_place);

pub fn mirror_in_place<T, L>(
    stream_context: &StreamContext,
    image: &mut ImageViewMut<'_, T, L>,
    axis: Axis,
) -> Result<()>
where
    T: MirrorInPlace<L>,
    L: ChannelLayout,
{
    T::mirror_in_place(stream_context, image, axis)
}

impl_mirror_batch!(mirror_batch_f32_c1, f32, C1, nppiMirrorBatch_32f_C1R_Ctx);
impl_mirror_batch!(mirror_batch_f32_c3, f32, C3, nppiMirrorBatch_32f_C3R_Ctx);
impl_mirror_batch!(mirror_batch_f32_c4, f32, C4, nppiMirrorBatch_32f_C4R_Ctx);
impl_mirror_batch!(mirror_batch_f32_ac4, f32, AC4, nppiMirrorBatch_32f_AC4R_Ctx);
impl_mirror_batch_in_place!(
    mirror_batch_f32_c1_in_place,
    f32,
    C1,
    nppiMirrorBatch_32f_C1IR_Ctx
);
impl_mirror_batch_in_place!(
    mirror_batch_f32_c3_in_place,
    f32,
    C3,
    nppiMirrorBatch_32f_C3IR_Ctx
);
impl_mirror_batch_in_place!(
    mirror_batch_f32_c4_in_place,
    f32,
    C4,
    nppiMirrorBatch_32f_C4IR_Ctx
);
impl_mirror_batch_in_place!(
    mirror_batch_f32_ac4_in_place,
    f32,
    AC4,
    nppiMirrorBatch_32f_AC4IR_Ctx
);

pub trait MirrorBatch<L: ChannelLayout>: DataTypeLike {
    fn mirror_batch(
        stream_context: &StreamContext,
        axis: Axis,
        sources: &[ImageView<'_, Self, L>],
        destinations: &mut [ImageViewMut<'_, Self, L>],
    ) -> Result<()>;
}

macro_rules! impl_mirror_batch_dispatch {
    ($ty:ty, $layout:ty, $function:ident) => {
        impl MirrorBatch<$layout> for $ty {
            fn mirror_batch(
                stream_context: &StreamContext,
                axis: Axis,
                sources: &[ImageView<'_, Self, $layout>],
                destinations: &mut [ImageViewMut<'_, Self, $layout>],
            ) -> Result<()> {
                $function(stream_context, axis, sources, destinations)
            }
        }
    };
}

impl_mirror_batch_dispatch!(f32, C1, mirror_batch_f32_c1);
impl_mirror_batch_dispatch!(f32, C3, mirror_batch_f32_c3);
impl_mirror_batch_dispatch!(f32, C4, mirror_batch_f32_c4);
impl_mirror_batch_dispatch!(f32, AC4, mirror_batch_f32_ac4);

pub fn mirror_batch<T, L>(
    stream_context: &StreamContext,
    axis: Axis,
    sources: &[ImageView<'_, T, L>],
    destinations: &mut [ImageViewMut<'_, T, L>],
) -> Result<()>
where
    T: MirrorBatch<L>,
    L: ChannelLayout,
{
    T::mirror_batch(stream_context, axis, sources, destinations)
}

pub trait MirrorBatchInPlace<L: ChannelLayout>: DataTypeLike {
    fn mirror_batch_in_place(
        stream_context: &StreamContext,
        axis: Axis,
        images: &mut [ImageViewMut<'_, Self, L>],
    ) -> Result<()>;
}

macro_rules! impl_mirror_batch_in_place_dispatch {
    ($ty:ty, $layout:ty, $function:ident) => {
        impl MirrorBatchInPlace<$layout> for $ty {
            fn mirror_batch_in_place(
                stream_context: &StreamContext,
                axis: Axis,
                images: &mut [ImageViewMut<'_, Self, $layout>],
            ) -> Result<()> {
                $function(stream_context, axis, images)
            }
        }
    };
}

impl_mirror_batch_in_place_dispatch!(f32, C1, mirror_batch_f32_c1_in_place);
impl_mirror_batch_in_place_dispatch!(f32, C3, mirror_batch_f32_c3_in_place);
impl_mirror_batch_in_place_dispatch!(f32, C4, mirror_batch_f32_c4_in_place);
impl_mirror_batch_in_place_dispatch!(f32, AC4, mirror_batch_f32_ac4_in_place);

pub fn mirror_batch_in_place<T, L>(
    stream_context: &StreamContext,
    axis: Axis,
    images: &mut [ImageViewMut<'_, T, L>],
) -> Result<()>
where
    T: MirrorBatchInPlace<L>,
    L: ChannelLayout,
{
    T::mirror_batch_in_place(stream_context, axis, images)
}