Skip to main content

dynamis_gpu/
submission.rs

1use std::ops::{Deref, DerefMut};
2use std::sync::{Arc, OnceLock};
3use wgpu::{CommandEncoder, CommandEncoderDescriptor, Device, Queue, SubmissionIndex};
4
5pub struct SubmissionEncoder {
6    encoder: CommandEncoder,
7    submission: Arc<OnceLock<SubmissionIndex>>,
8}
9
10impl SubmissionEncoder {
11    pub fn new(device: &Device, label: &str) -> Self {
12        Self {
13            encoder: device
14                .create_command_encoder(&CommandEncoderDescriptor { label: Some(label) }),
15            submission: Arc::new(OnceLock::new()),
16        }
17    }
18
19    pub fn submit(self, queue: &Queue) -> SubmissionIndex {
20        let index = queue.submit([self.encoder.finish()]);
21        self.submission
22            .set(index.clone())
23            .expect("encoder submitted twice");
24        index
25    }
26
27    pub(crate) fn submission(&self) -> Arc<OnceLock<SubmissionIndex>> {
28        self.submission.clone()
29    }
30}
31
32impl Deref for SubmissionEncoder {
33    type Target = CommandEncoder;
34
35    fn deref(&self) -> &Self::Target {
36        &self.encoder
37    }
38}
39
40impl DerefMut for SubmissionEncoder {
41    fn deref_mut(&mut self) -> &mut Self::Target {
42        &mut self.encoder
43    }
44}