aspen_renderer/render_system/
mod.rs1use std::sync::Arc;
2
3use crate::{
4 renderpass::RenderPassCont,
5 submit_system::SubmitSystemCont,
6 GraphicsObjects
7};
8
9pub trait RenderSystem {
10 fn run(&mut self, graphics_objects: Arc<GraphicsObjects>);
11}
12
13pub struct DefaultRenderSystem<SST: SubmitSystemCont> {
14 submit_system: SST,
15 render_passes: Vec<Box<dyn RenderPassCont<SharedData = SST::SharedType> + Send>>
16}
17
18impl<SST: SubmitSystemCont> DefaultRenderSystem<SST> {
19 pub fn new(
20 submit_system: SST,
21 render_passes: Vec<Box<dyn RenderPassCont<SharedData = SST::SharedType> + Send>>
22 ) -> Self {
23 Self {
24 submit_system,
25 render_passes: render_passes.into_iter().collect()
26 }
27 }
28}
29
30impl<SST: SubmitSystemCont> RenderSystem for DefaultRenderSystem<SST> {
31 fn run(&mut self, graphics_objects: Arc<GraphicsObjects>) {
32 let (shared, mut cmd_buf) = match self.submit_system.setup(graphics_objects.clone()) {
33 Ok(val) => val,
34 Err(_) => return
35 };
36
37 let shared = Arc::new(shared);
38
39 for pass in self.render_passes.iter_mut() {
40 match pass.preprocess(graphics_objects.clone(), shared.clone()) {
41 Ok(_) => (),
42 Err(_) => return
43 }
44 }
45
46 for pass in self.render_passes.iter_mut() {
47 match pass.build_commands(graphics_objects.clone(), shared.clone(), &mut cmd_buf) {
48 Ok(_) => (),
49 Err(_) => return
50 }
51 }
52
53 for pass in self.render_passes.iter_mut() {
54 pass.postprocess(graphics_objects.clone(), shared.clone());
55 }
56
57 self.submit_system.submit(graphics_objects.clone(), cmd_buf)
58 }
59}