custos 0.7.0

A minimal OpenCL, WGPU, CUDA and host CPU array manipulation engine.
Documentation
use core::{marker::PhantomData, mem::size_of};
use wgpu::util::DeviceExt;

pub struct WGPUBuffer<T> {
    pub buf: wgpu::Buffer,
    pub _p: PhantomData<T>,
}

impl<T> WGPUBuffer<T> {
    pub fn new(device: &wgpu::Device, size: u64) -> Self {
        let buf = device.create_buffer(&wgpu::BufferDescriptor {
            label: None,
            size: size * size_of::<T>() as u64,
            usage: wgpu::BufferUsages::STORAGE
                | wgpu::BufferUsages::COPY_DST
                | wgpu::BufferUsages::COPY_SRC
                | wgpu::BufferUsages::MAP_READ,
            mapped_at_creation: false,
        });
        Self {
            buf,
            _p: PhantomData,
        }
    }

    pub fn with_slice(device: &wgpu::Device, slice: &[T]) -> Self {
        let buf = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
            label: None,
            contents: slice_u8_cast(slice),
            usage: wgpu::BufferUsages::STORAGE
                | wgpu::BufferUsages::COPY_DST
                | wgpu::BufferUsages::COPY_SRC
                | wgpu::BufferUsages::MAP_READ,
        });
        Self {
            buf,
            _p: PhantomData,
        }
    }
}

pub fn slice_u8_cast<T>(input: &[T]) -> &[u8] {
    unsafe { std::slice::from_raw_parts(input.as_ptr() as *const u8, input.len() * size_of::<T>()) }
}

pub fn slice_gen_cast<T>(input: &[u8]) -> &[T] {
    unsafe { std::slice::from_raw_parts(input.as_ptr() as *const T, input.len() / size_of::<T>()) }
}