dynamis-gpu 0.7.0

wgpu device, buffer, stream, pipeline, and readback runtime
Documentation
use std::ops::{Deref, DerefMut};
use std::sync::{Arc, OnceLock};
use wgpu::{CommandEncoder, CommandEncoderDescriptor, Device, Queue, SubmissionIndex};

pub struct SubmissionEncoder {
    encoder: CommandEncoder,
    submission: Arc<OnceLock<SubmissionIndex>>,
}

impl SubmissionEncoder {
    pub fn new(device: &Device, label: &str) -> Self {
        Self {
            encoder: device
                .create_command_encoder(&CommandEncoderDescriptor { label: Some(label) }),
            submission: Arc::new(OnceLock::new()),
        }
    }

    pub fn submit(self, queue: &Queue) -> SubmissionIndex {
        let index = queue.submit([self.encoder.finish()]);
        self.submission
            .set(index.clone())
            .expect("encoder submitted twice");
        index
    }

    pub(crate) fn submission(&self) -> Arc<OnceLock<SubmissionIndex>> {
        self.submission.clone()
    }
}

impl Deref for SubmissionEncoder {
    type Target = CommandEncoder;

    fn deref(&self) -> &Self::Target {
        &self.encoder
    }
}

impl DerefMut for SubmissionEncoder {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.encoder
    }
}