mev 0.1.0

Metal Et Vulkan abstraction
Documentation
use std::{fmt, hash, rc::Rc};

use crate::{
    backend::{arguments::ArgumentsField, from::WgpuInto},
    generic::{
        BufferDesc, BufferInitDesc, BufferMappedRange, BufferMappedRangeMut, BufferRange,
        BufferUsage, DeviceError,
    },
    ArgumentKind, ArgumentsSealed, Automatic, Storage, Uniform,
};

#[derive(Clone)]
pub struct Buffer {
    inner: wgpu::Buffer,
}

impl Buffer {
    pub(super) fn new(buffer: wgpu::Buffer) -> Self {
        Buffer { inner: buffer }
    }

    pub(super) fn wgpu(&self) -> &wgpu::Buffer {
        &self.inner
    }

    pub(crate) fn flush_range(&mut self, _offset: usize, _size: usize) -> Result<(), DeviceError> {
        Ok(())
    }
}

impl fmt::Debug for Buffer {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.debug_struct("Buffer")
            .field("size", &self.inner.size())
            .field("usage", &self.inner.usage())
            .finish()
    }
}

impl PartialEq for Buffer {
    fn eq(&self, other: &Self) -> bool {
        self.inner == other.inner
    }
}

impl Eq for Buffer {}

impl hash::Hash for Buffer {
    fn hash<H: hash::Hasher>(&self, state: &mut H) {
        self.inner.hash(state);
    }
}

impl crate::traits::Resource for Buffer {}

#[hidden_trait::expose]
impl crate::traits::Buffer for Buffer {
    fn size(&self) -> usize {
        self.inner.size() as usize
    }

    fn usage(&self) -> BufferUsage {
        self.inner.usage().wgpu_into()
    }

    fn detached(&self) -> bool {
        false
    }

    fn map<R>(&mut self, _range: R) -> Result<(), DeviceError>
    where
        R: BufferRange,
    {
        panic!("buffer mapping is not supported in the WebGPU backend")
    }

    fn unmap(&mut self) {
        panic!("buffer mapping is not supported in the WebGPU backend")
    }

    fn read_mapped_range<R>(&mut self, _range: R) -> Result<BufferMappedRange<'_>, DeviceError>
    where
        R: BufferRange,
    {
        panic!("buffer mapping is not supported in the WebGPU backend")
    }

    fn write_mapped_range<R>(&mut self, _range: R) -> Result<BufferMappedRangeMut<'_>, DeviceError>
    where
        R: BufferRange,
    {
        panic!("buffer mapping is not supported in the WebGPU backend")
    }

    fn write(&mut self, _offset: usize, _data: &[u8]) -> Result<(), DeviceError> {
        panic!("buffer host-write is not supported in the WebGPU backend; use CopyCommandEncoder::write_buffer instead")
    }

    fn read(&mut self, _offset: usize, _data: &mut [u8]) -> Result<(), DeviceError> {
        panic!("buffer host-read is not supported in the WebGPU backend")
    }
}

impl ArgumentsSealed for Buffer {}

impl ArgumentsField<Automatic> for Buffer {
    const KIND: ArgumentKind = crate::generic::ArgumentKind::UniformBuffer;
    const SIZE: usize = 1;

    fn as_binding_resource(&self) -> wgpu::BindingResource<'_> {
        wgpu::BindingResource::Buffer(wgpu::BufferBinding {
            buffer: &self.inner,
            offset: 0,
            size: None,
        })
    }
}

impl ArgumentsField<Uniform> for Buffer {
    const KIND: ArgumentKind = crate::generic::ArgumentKind::UniformBuffer;
    const SIZE: usize = 1;

    fn as_binding_resource(&self) -> wgpu::BindingResource<'_> {
        wgpu::BindingResource::Buffer(wgpu::BufferBinding {
            buffer: &self.inner,
            offset: 0,
            size: None,
        })
    }
}

impl ArgumentsField<Storage> for Buffer {
    const KIND: ArgumentKind = crate::generic::ArgumentKind::StorageBuffer;
    const SIZE: usize = 1;

    fn as_binding_resource(&self) -> wgpu::BindingResource<'_> {
        wgpu::BindingResource::Buffer(wgpu::BufferBinding {
            buffer: &self.inner,
            offset: 0,
            size: None,
        })
    }
}