aspen_renderer/submit_system/
mod.rs

1use std::sync::Arc;
2
3use crate::{renderpass::{CmdBuffer, HaltPolicy}, GraphicsObjects};
4
5pub trait SubmitSystem {
6    type SharedType;
7    type SetupType;
8    fn setup(&mut self, graphics_objects: Arc<GraphicsObjects>) -> Result<(Self::SharedType, Self::SetupType, Box<CmdBuffer>), HaltPolicy>;
9    fn submit(&mut self, graphics_objects: Arc<GraphicsObjects>, cmd_buffer: Box<CmdBuffer>, setup_data: Self::SetupType);
10}
11
12pub trait SubmitSystemCont {
13    type SharedType;
14    fn setup(&mut self, graphics_objects: Arc<GraphicsObjects>) -> Result<(Self::SharedType, Box<CmdBuffer>), HaltPolicy>;
15    fn submit(&mut self, graphics_objects: Arc<GraphicsObjects>, cmd_buffer: Box<CmdBuffer>);
16}
17
18pub struct DynamicSubmitSystem<T: SubmitSystem> {
19    inner: T,
20    data: Option<T::SetupType>,
21}
22
23impl<T: SubmitSystem> DynamicSubmitSystem<T> {
24    pub fn new(system: T) -> Self {
25        DynamicSubmitSystem {
26            inner: system,
27            data: None
28        }
29    }
30}
31
32impl<T: SubmitSystem> SubmitSystemCont for DynamicSubmitSystem<T> {
33    type SharedType = T::SharedType;
34
35    fn setup(&mut self, graphics_objects: Arc<GraphicsObjects>) -> Result<(T::SharedType, Box<CmdBuffer>), HaltPolicy> {
36        let (shared, data, cmd_buf) = self.inner.setup(graphics_objects)?;
37        self.data = Some(data);
38        Ok((shared, cmd_buf))
39    }
40
41    fn submit(&mut self, graphics_objects: Arc<GraphicsObjects>, cmd_buffer: Box<CmdBuffer>) {
42        self.inner.submit(graphics_objects, cmd_buffer, self.data.take().unwrap())
43    }
44}