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