use crate::{async_device::AsyncDevice, WgpuFuture};
use std::ops::{Deref, DerefMut, RangeBounds};
use wgpu::{BufferAddress, BufferAsyncError};
#[derive(Debug)]
pub struct AsyncBuffer
where
Self: wgpu::WasmNotSend,
{
pub(crate) device: AsyncDevice,
pub(crate) buffer: wgpu::Buffer,
}
impl AsyncBuffer {
pub fn slice<'a, S: RangeBounds<BufferAddress>>(&'a self, bounds: S) -> AsyncBufferSlice<'a> {
let buffer_slice = self.buffer.slice(bounds);
AsyncBufferSlice {
device: self.device.clone(),
buffer_slice,
}
}
}
impl Deref for AsyncBuffer {
type Target = wgpu::Buffer;
fn deref(&self) -> &Self::Target {
&self.buffer
}
}
impl DerefMut for AsyncBuffer {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.buffer
}
}
impl<T> AsRef<T> for AsyncBuffer
where
T: ?Sized,
<AsyncBuffer as Deref>::Target: AsRef<T>,
{
fn as_ref(&self) -> &T {
self.deref().as_ref()
}
}
impl<T> AsMut<T> for AsyncBuffer
where
<AsyncBuffer as Deref>::Target: AsMut<T>,
{
fn as_mut(&mut self) -> &mut T {
self.deref_mut().as_mut()
}
}
#[derive(Debug)]
pub struct AsyncBufferSlice<'a>
where
Self: wgpu::WasmNotSend,
{
device: AsyncDevice,
buffer_slice: wgpu::BufferSlice<'a>,
}
impl<'a> AsyncBufferSlice<'a> {
pub fn map_async(&self, mode: wgpu::MapMode) -> WgpuFuture<Result<(), BufferAsyncError>> {
self.device
.do_async(|callback| self.buffer_slice.map_async(mode, callback))
}
}
impl<'a> Deref for AsyncBufferSlice<'a> {
type Target = wgpu::BufferSlice<'a>;
fn deref(&self) -> &Self::Target {
&self.buffer_slice
}
}
impl<'a> DerefMut for AsyncBufferSlice<'a> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.buffer_slice
}
}
impl<'a, T> AsRef<T> for AsyncBufferSlice<'a>
where
T: ?Sized,
<AsyncBufferSlice<'a> as Deref>::Target: AsRef<T>,
{
fn as_ref(&self) -> &T {
self.deref().as_ref()
}
}
impl<'a, T> AsMut<T> for AsyncBufferSlice<'a>
where
<AsyncBufferSlice<'a> as Deref>::Target: AsMut<T>,
{
fn as_mut(&mut self) -> &mut T {
self.deref_mut().as_mut()
}
}