aspen_renderer/submit_system/
mod.rs1use 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}