aspen_renderer/renderpass/
mod.rs

1use std::sync::Arc;
2
3use vulkano::command_buffer::{
4    allocator::StandardCommandBufferAllocator, 
5    AutoCommandBufferBuilder, 
6    PrimaryAutoCommandBuffer
7};
8
9use crate::GraphicsObjects;
10
11pub type CmdBuffer = AutoCommandBufferBuilder<
12    PrimaryAutoCommandBuffer<Arc<StandardCommandBufferAllocator>>, 
13    Arc<StandardCommandBufferAllocator>
14>;
15
16pub enum HaltPolicy {
17    HaltThis,
18    HaltAll,
19}
20
21pub trait RenderPass {
22    type SharedData;
23    type PreProcessed;
24    type Output;
25    fn preprocess(&mut self, graphics_objects: Arc<GraphicsObjects>, shared: Arc<Self::SharedData>) -> Result<Self::PreProcessed, HaltPolicy>;
26    fn build_commands(&mut self, graphics_objects: Arc<GraphicsObjects>, shared: Arc<Self::SharedData>, cmd_buffer: &mut Box<CmdBuffer>, preprocessed: Self::PreProcessed) -> Result<Self::Output, HaltPolicy>;
27    fn postprocess(&mut self, graphics_objects: Arc<GraphicsObjects>, shared: Arc<Self::SharedData>, output: Self::Output);
28}
29
30pub trait RenderPassCont {
31    type SharedData;
32    fn preprocess(&mut self, graphics_objects: Arc<GraphicsObjects>, shared: Arc<Self::SharedData>) -> Result<(), HaltPolicy>;
33    fn build_commands(&mut self, graphics_objects: Arc<GraphicsObjects>, shared: Arc<Self::SharedData>, cmd_buffer: &mut Box<CmdBuffer>) -> Result<(), HaltPolicy>;
34    fn postprocess(&mut self, graphics_objects: Arc<GraphicsObjects>, shared: Arc<Self::SharedData>);
35}
36
37enum RenderPassType<PreT, PostT> {
38    None,
39    PreProcessed(PreT),
40    PostProcessed(PostT),
41}
42
43pub struct DynamicRenderPass<T: RenderPass> {
44    data: RenderPassType<T::PreProcessed, T::Output>,
45    inner: T,
46}
47
48impl<T: RenderPass> DynamicRenderPass<T> {
49    pub fn from_renderpass(renderpass: T) -> Box<Self> {
50        Box::new(Self {
51            data: RenderPassType::None,
52            inner: renderpass
53        })
54    }
55}
56
57impl<T: RenderPass> RenderPassCont for DynamicRenderPass<T> {
58    type SharedData = T::SharedData;
59
60    fn preprocess(&mut self, graphics_objects: Arc<GraphicsObjects>, shared: Arc<Self::SharedData>) -> Result<(), HaltPolicy> {
61        self.data = RenderPassType::PreProcessed(self.inner.preprocess(graphics_objects, shared)?);
62        Ok(())
63    }
64
65    fn build_commands(&mut self, graphics_objects: Arc<GraphicsObjects>, shared: Arc<Self::SharedData>, cmd_buffer: &mut Box<CmdBuffer>) -> Result<(), HaltPolicy> {
66        let data = match std::mem::replace(&mut self.data, RenderPassType::None) {
67            RenderPassType::PreProcessed(data) => data,
68            _ => panic!("data not preprocessed")
69        };
70
71        self.data = RenderPassType::PostProcessed(self.inner.build_commands(graphics_objects, shared, cmd_buffer, data)?);
72        Ok(())
73    }
74
75    fn postprocess(&mut self, graphics_objects: Arc<GraphicsObjects>, shared: Arc<Self::SharedData>) {
76        let data = match std::mem::replace(&mut self.data, RenderPassType::None) {
77            RenderPassType::PostProcessed(data) => data,
78            _ => panic!("data not postprocessed")
79        };
80
81        self.inner.postprocess(graphics_objects, shared, data);
82    }
83}