diff --git a/src/lib.rs b/src/lib.rs index 613d233..cf0aeac 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -230,19 +230,25 @@ impl Renderer { }); } - let opaque_cmds = Mutex::new(Vec::new()); - if let Some(opaque) = phase_passes.get_vec(&Phase::Opaque) { - opaque.par_iter().for_each(|pass_index| { - let phase_data = frame_data.make_phase_data(Phase::Opaque, &viewport); - let pass = &self.render_passes[*pass_index]; + let record_render = |phase| { + let cmds = Mutex::new(Vec::new()); + if let Some(passes) = phase_passes.get_vec(&phase) { + passes.par_iter().for_each(|pass_index| { + let phase_data = frame_data.make_phase_data(phase, &viewport); + let pass = &self.render_passes[*pass_index]; - if let Some(cmd) = pass.record_render(phase_data) { - opaque_cmds.lock().unwrap().push(cmd); - } - }) - } + if let Some(cmd) = pass.record_render(phase_data) { + cmds.lock().unwrap().push(cmd); + } + }) + } - let opaque_cmds = opaque_cmds.into_inner().unwrap(); + cmds.into_inner().unwrap() + }; + + // TODO: parallelize each phase's record_render + let opaque_cmds = record_render(Phase::Opaque); + let overlay_cmds = record_render(Phase::Overlay); { let mut rp = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { @@ -264,6 +270,7 @@ impl Renderer { }); rp.execute_bundles(opaque_cmds.iter()); + rp.execute_bundles(overlay_cmds.iter()); } self.queue.submit(std::iter::once(encoder.finish())); diff --git a/src/phase.rs b/src/phase.rs index a1d8ba8..5df8664 100644 --- a/src/phase.rs +++ b/src/phase.rs @@ -9,6 +9,7 @@ pub enum Phase { Depth, Opaque, Transparent, + Overlay, } impl Phase { @@ -16,7 +17,7 @@ impl Phase { use Phase::*; match self { Upload => PhaseKind::Command, - Depth | Opaque | Transparent => PhaseKind::Render, + Depth | Opaque | Transparent | Overlay => PhaseKind::Render, } } }