rafx_plugins/features/debug_pip/
plugin.rs1use 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}