use crate::{async_device::AsyncDevice, WgpuFuture};
use std::{ops::Deref, sync::Arc};
use wgpu::{CommandBuffer, Queue};
#[derive(Clone, Debug)]
pub struct AsyncQueue {
device: AsyncDevice,
queue: Arc<Queue>,
}
impl AsyncQueue {
pub(crate) fn new(device: AsyncDevice, queue: Arc<Queue>) -> Self {
Self { device, queue }
}
pub fn submit<I: IntoIterator<Item = CommandBuffer> + Send>(
&self,
command_buffers: I,
) -> WgpuFuture<()> {
let queue_ref = self.queue.clone();
queue_ref.submit(command_buffers);
self.device.do_async(move |callback| {
queue_ref.on_submitted_work_done(|| callback(()));
})
}
pub fn device(&self) -> &AsyncDevice {
&self.device
}
}
impl Deref for AsyncQueue {
type Target = wgpu::Queue;
fn deref(&self) -> &Self::Target {
&self.queue
}
}
impl<T> AsRef<T> for AsyncQueue
where
T: ?Sized,
<AsyncQueue as Deref>::Target: AsRef<T>,
{
fn as_ref(&self) -> &T {
self.deref().as_ref()
}
}