aboutsummaryrefslogtreecommitdiff
path: root/stockton-render/src/draw_passes/cons.rs
diff options
context:
space:
mode:
Diffstat (limited to 'stockton-render/src/draw_passes/cons.rs')
-rw-r--r--stockton-render/src/draw_passes/cons.rs66
1 files changed, 66 insertions, 0 deletions
diff --git a/stockton-render/src/draw_passes/cons.rs b/stockton-render/src/draw_passes/cons.rs
new file mode 100644
index 0000000..ad94b1c
--- /dev/null
+++ b/stockton-render/src/draw_passes/cons.rs
@@ -0,0 +1,66 @@
+//! Code for using multiple draw passes in place of just one
+//! Note that this can be extended to an arbitrary amount of draw passes.
+
+use super::{DrawPass, IntoDrawPass};
+use crate::{context::RenderingContext, queue_negotiator::QueueNegotiator, types::*};
+use stockton_types::Session;
+
+use anyhow::Result;
+
+/// One draw pass, then another.
+pub struct ConsDrawPass<A: DrawPass, B: DrawPass> {
+ pub a: A,
+ pub b: B,
+}
+
+impl<A: DrawPass, B: DrawPass> DrawPass for ConsDrawPass<A, B> {
+ fn queue_draw(
+ &mut self,
+ session: &Session,
+ img_view: &ImageViewT,
+ cmd_buffer: &mut CommandBufferT,
+ ) -> Result<()> {
+ self.a.queue_draw(session, img_view, cmd_buffer)?;
+ self.b.queue_draw(session, img_view, cmd_buffer)?;
+
+ Ok(())
+ }
+
+ fn deactivate(self, context: &mut RenderingContext) -> Result<()> {
+ self.a.deactivate(context)?;
+ self.b.deactivate(context)
+ }
+
+ fn handle_surface_change(
+ &mut self,
+ session: &Session,
+ context: &mut RenderingContext,
+ ) -> Result<()> {
+ self.a.handle_surface_change(session, context)?;
+ self.b.handle_surface_change(session, context)
+ }
+}
+
+impl<A: DrawPass, B: DrawPass, IA: IntoDrawPass<A>, IB: IntoDrawPass<B>>
+ IntoDrawPass<ConsDrawPass<A, B>> for (IA, IB)
+{
+ fn init(
+ self,
+ session: &mut Session,
+ context: &mut RenderingContext,
+ ) -> Result<ConsDrawPass<A, B>> {
+ Ok(ConsDrawPass {
+ a: self.0.init(session, context)?,
+ b: self.1.init(session, context)?,
+ })
+ }
+
+ fn find_aux_queues<'a>(
+ adapter: &'a Adapter,
+ queue_negotiator: &mut QueueNegotiator,
+ ) -> Result<Vec<(&'a QueueFamilyT, Vec<f32>)>> {
+ let mut v = IA::find_aux_queues(adapter, queue_negotiator)?;
+ v.extend(IB::find_aux_queues(adapter, queue_negotiator)?);
+ Ok(v)
+ }
+}