1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
use crate::nodes::{
FeatureCommandWriter, FeatureSubmitNodes, FramePacket, MergedFrameSubmitNodes,
PreparedRenderData, RenderFeatureIndex, RenderJobPrepareContext, RenderRegistry, RenderView,
};
pub trait PrepareJob: Send {
fn prepare(
self: Box<Self>,
prepare_context: &RenderJobPrepareContext,
frame_packet: &FramePacket,
views: &[RenderView],
) -> (Box<dyn FeatureCommandWriter>, FeatureSubmitNodes);
fn feature_debug_name(&self) -> &'static str;
fn feature_index(&self) -> RenderFeatureIndex;
}
pub struct PrepareJobSet {
prepare_jobs: Vec<Box<dyn PrepareJob>>,
}
impl PrepareJobSet {
pub fn new(prepare_jobs: Vec<Box<dyn PrepareJob>>) -> Self {
PrepareJobSet { prepare_jobs }
}
pub fn prepare(
self,
prepare_context: &RenderJobPrepareContext,
frame_packet: &FramePacket,
views: &[RenderView],
registry: &RenderRegistry,
) -> PreparedRenderData {
let mut feature_command_writers = Vec::with_capacity(self.prepare_jobs.len());
let mut all_submit_nodes = Vec::with_capacity(self.prepare_jobs.len());
for prepare_job in self.prepare_jobs {
let (writer, submit_nodes) = prepare_job.prepare(prepare_context, frame_packet, views);
feature_command_writers.push(writer);
all_submit_nodes.push(submit_nodes);
}
let merged_submit_nodes = MergedFrameSubmitNodes::new(all_submit_nodes, registry);
PreparedRenderData::new(feature_command_writers, merged_submit_nodes)
}
}