dynamis_gpu/
submission.rs1use 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}