use crate::AsyncBuffer;
use crate::WgpuFuture;
use std::ops::Deref;
use std::sync::Arc;
use wgpu::util::{BufferInitDescriptor, DeviceExt};
use wgpu::Device;
#[derive(Clone, Debug)]
pub struct AsyncDevice {
#[cfg(not(target_arch = "wasm32"))]
pub(crate) poll_loop: Arc<crate::wgpu_future::PollLoop>,
device: Arc<Device>,
}
impl AsyncDevice {
pub(crate) fn new(device: Arc<Device>) -> Self {
Self {
#[cfg(not(target_arch = "wasm32"))]
poll_loop: Arc::new(crate::wgpu_future::PollLoop::new(Arc::downgrade(&device))),
device,
}
}
pub fn do_async<F, R>(&self, f: F) -> WgpuFuture<R>
where
F: FnOnce(Box<dyn FnOnce(R) + Send>),
R: Send + 'static,
{
let future = WgpuFuture::new(self.clone());
f(future.callback());
future
}
pub fn create_buffer(&self, desc: &wgpu::BufferDescriptor) -> AsyncBuffer {
AsyncBuffer {
device: self.clone(),
buffer: self.device.create_buffer(desc),
}
}
pub fn create_buffer_init(&self, desc: &BufferInitDescriptor) -> AsyncBuffer {
AsyncBuffer {
device: self.clone(),
buffer: self.device.create_buffer_init(desc),
}
}
}
impl Deref for AsyncDevice {
type Target = wgpu::Device;
fn deref(&self) -> &Self::Target {
&self.device
}
}
impl<T> AsRef<T> for AsyncDevice
where
T: ?Sized,
<AsyncDevice as Deref>::Target: AsRef<T>,
{
fn as_ref(&self) -> &T {
self.deref().as_ref()
}
}