rafx_plugins/features/debug_pip/
plugin.rs

1use rafx::render_feature_renderer_prelude::*;
2
3use super::*;
4use crate::phases::DebugPipRenderPhase;
5use hydrate_base::handle::Handle;
6use rafx::assets::MaterialAsset;
7use rafx::renderer::RendererLoadContext;
8
9pub struct DebugPipStaticResources {
10    pub debug_pip_material: Handle<MaterialAsset>,
11}
12
13#[derive(Default)]
14pub struct DebugPipRendererPlugin;
15
16#[cfg(feature = "legion")]
17impl DebugPipRendererPlugin {
18    pub fn legion_init(
19        &self,
20        resources: &mut legion::Resources,
21    ) {
22        resources.insert(DebugPipResource::default());
23    }
24
25    pub fn legion_destroy(resources: &mut legion::Resources) {
26        resources.remove::<DebugPipResource>();
27    }
28}
29
30impl RenderFeaturePlugin for DebugPipRendererPlugin {
31    fn feature_debug_constants(&self) -> &'static RenderFeatureDebugConstants {
32        super::render_feature_debug_constants()
33    }
34
35    fn feature_index(&self) -> RenderFeatureIndex {
36        super::render_feature_index()
37    }
38
39    fn is_view_relevant(
40        &self,
41        view: &RenderView,
42    ) -> bool {
43        view.phase_is_relevant::<DebugPipRenderPhase>()
44    }
45
46    fn requires_visible_render_objects(&self) -> bool {
47        false
48    }
49
50    fn configure_render_registry(
51        &self,
52        render_registry: RenderRegistryBuilder,
53    ) -> RenderRegistryBuilder {
54        render_registry.register_feature::<DebugPipRenderFeature>()
55    }
56
57    fn initialize_static_resources(
58        &self,
59        renderer_load_context: &RendererLoadContext,
60        asset_manager: &mut AssetManager,
61        asset_resource: &mut AssetResource,
62        _extract_resources: &ExtractResources,
63        render_resources: &mut RenderResources,
64        _upload: &mut RafxTransferUpload,
65    ) -> RafxResult<()> {
66        let debug_pip_material = asset_resource.load_artifact_symbol_name::<MaterialAsset>(
67            "rafx-plugins://materials/debug_pip.material",
68        );
69
70        renderer_load_context.wait_for_asset_to_load(
71            render_resources,
72            asset_manager,
73            &debug_pip_material,
74            asset_resource,
75            "debug_pip material",
76        )?;
77
78        render_resources.insert(DebugPipStaticResources { debug_pip_material });
79        render_resources.insert(DebugPipRenderResource::default());
80
81        Ok(())
82    }
83
84    fn new_frame_packet(
85        &self,
86        frame_packet_size: &FramePacketSize,
87    ) -> Box<dyn RenderFeatureFramePacket> {
88        Box::new(DebugPipFramePacket::new(
89            self.feature_index(),
90            frame_packet_size,
91        ))
92    }
93
94    fn new_extract_job<'extract>(
95        &self,
96        extract_context: &RenderJobExtractContext<'extract>,
97        frame_packet: Box<dyn RenderFeatureFramePacket>,
98    ) -> Arc<dyn RenderFeatureExtractJob<'extract> + 'extract> {
99        let static_resources = extract_context
100            .render_resources
101            .fetch::<DebugPipStaticResources>();
102
103        DebugPipExtractJob::new(
104            extract_context,
105            frame_packet.into_concrete(),
106            static_resources.debug_pip_material.clone(),
107        )
108    }
109
110    fn new_submit_packet(
111        &self,
112        frame_packet: &Box<dyn RenderFeatureFramePacket>,
113    ) -> Box<dyn RenderFeatureSubmitPacket> {
114        let frame_packet: &DebugPipFramePacket = frame_packet.as_ref().as_concrete();
115
116        let mut view_submit_packets = Vec::with_capacity(frame_packet.view_packets().len());
117        for view_packet in frame_packet.view_packets() {
118            let view_submit_packet =
119                ViewSubmitPacket::from_view_packet::<DebugPipRenderPhase>(view_packet, Some(1));
120            view_submit_packets.push(view_submit_packet);
121        }
122
123        Box::new(DebugPipSubmitPacket::new(
124            self.feature_index(),
125            frame_packet.render_object_instances().len(),
126            view_submit_packets,
127        ))
128    }
129
130    fn new_prepare_job<'prepare>(
131        &self,
132        prepare_context: &RenderJobPrepareContext<'prepare>,
133        frame_packet: Box<dyn RenderFeatureFramePacket>,
134        submit_packet: Box<dyn RenderFeatureSubmitPacket>,
135    ) -> Arc<dyn RenderFeaturePrepareJob<'prepare> + 'prepare> {
136        DebugPipPrepareJob::new(
137            prepare_context,
138            frame_packet.into_concrete(),
139            submit_packet.into_concrete(),
140        )
141    }
142
143    fn new_write_job<'write>(
144        &self,
145        write_context: &RenderJobWriteContext<'write>,
146        frame_packet: Box<dyn RenderFeatureFramePacket>,
147        submit_packet: Box<dyn RenderFeatureSubmitPacket>,
148    ) -> Arc<dyn RenderFeatureWriteJob<'write> + 'write> {
149        DebugPipWriteJob::new(
150            write_context,
151            frame_packet.into_concrete(),
152            submit_packet.into_concrete(),
153        )
154    }
155}