Skip to main content

ursus_core/render/frame_pipeline/
render_pipeline.rs

1use crate::assets::storage::GpuAssetServer;
2use crate::render::gfx::types::format::ImageLayout;
3use crate::render::gfx::CommandEncoder;
4use crate::render::graph::{pass, RenderGraph};
5use crate::render::resource::ResourceHandle;
6use crate::render::world::RWorld;
7use crate::vulkan::VulkanContext;
8
9pub struct FrameInput<'a> {
10    pub render_world: &'a RWorld,
11    pub gpu_assets: &'a mut GpuAssetServer,
12}
13
14pub trait RenderPipeline: Send + 'static {
15    fn build(
16        ctx: &VulkanContext,
17        gpu_assets: &mut GpuAssetServer,
18        graph: &mut RenderGraph,
19    ) -> anyhow::Result<PipelineHandles>
20    where
21        Self: Sized;
22
23    fn on_resize(&mut self, _graph: &mut RenderGraph, _width: u32, _height: u32) -> anyhow::Result<()> {
24        Ok(())
25    }
26    fn on_resize_internal(&mut self, _graph: &mut RenderGraph, _w: u32, _h: u32) -> anyhow::Result<()> {
27        Ok(())
28    }
29}
30
31pub struct PipelineHandles {
32    pub swapchain: ResourceHandle,
33}
34
35#[derive(Default)]
36pub struct NoopPipeline;
37
38impl RenderPipeline for NoopPipeline {
39    fn build(
40        ctx: &VulkanContext,
41        gpu_assets: &mut GpuAssetServer,
42        graph: &mut RenderGraph,
43    ) -> anyhow::Result<PipelineHandles>
44    where
45        Self: Sized,
46    {
47        let swapchain = ctx.swapchain.as_ref().unwrap();
48        let h_swapchain = graph.pool.register_swapchain_external(swapchain.format);
49
50        pass("noop_clear")
51            .write(h_swapchain, ImageLayout::ColorAttachment)
52            .record(move |enc: &mut CommandEncoder, _rw, _gpu| {
53                enc.begin_rendering_clear(h_swapchain, [0.0, 0.0, 0.0, 1.0]);
54                enc.end_rendering();
55                Ok(())
56            })
57            .build(graph, gpu_assets);
58
59        Ok(PipelineHandles { swapchain: h_swapchain })
60    }
61}