ursus_core/render/thread/
command.rs1use 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}