ursus_core/render/frame_pipeline/
render_pipeline.rs1use 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}