Skip to main content

ursus_core/render/thread/
command.rs

1use crate::assets::storage::GpuAssetServer;
2use crate::render::frame_pipeline::render_pipeline::{NoopPipeline, RenderPipeline};
3use crate::vulkan::renderer::{build_dyn_renderer, DynRenderer};
4use crate::vulkan::VulkanContext;
5use std::fmt::{Debug, Formatter, Result};
6
7type PipelineBuildFn =
8    dyn FnOnce(&VulkanContext, &mut GpuAssetServer, f32, f32) -> anyhow::Result<Box<dyn DynRenderer>> + Send;
9
10pub struct PipelineFactory {
11    build: Box<PipelineBuildFn>,
12}
13
14impl PipelineFactory {
15    pub fn of<P>() -> Self
16    where
17        P: RenderPipeline + Default + 'static,
18    {
19        Self {
20            build: Box::new(|ctx, gpu_assets, exposure, fsr_sharpness| {
21                build_dyn_renderer::<P>(ctx, gpu_assets, exposure, fsr_sharpness)
22            }),
23        }
24    }
25
26    pub fn build(
27        self,
28        ctx: &VulkanContext,
29        gpu_assets: &mut GpuAssetServer,
30        prev_exposure: f32,
31        prev_fsr_sharpness: f32,
32    ) -> anyhow::Result<Box<dyn DynRenderer>> {
33        (self.build)(ctx, gpu_assets, prev_exposure, prev_fsr_sharpness)
34    }
35
36    pub fn empty() -> Self {
37        Self::of::<NoopPipeline>()
38    }
39}
40
41impl Debug for PipelineFactory {
42    fn fmt(&self, f: &mut Formatter<'_>) -> Result {
43        f.write_str("PipelineFactory(..)")
44    }
45}
46
47#[derive(Debug)]
48pub enum RenderCommand {
49    Resize { width: u32, height: u32 },
50    SetInternalScale(f32),
51    SetExposure(f32),
52    SetFsrSharpness(f32),
53    SetPipeline(PipelineFactory),
54    SetPaused(bool),
55    Shutdown,
56}