From 75e6b20c3f794f99f077731471186d790e691cff Mon Sep 17 00:00:00 2001 From: Sergiusz Bazanski Date: Mon, 20 Jan 2020 02:12:50 +0100 Subject: [PATCH] rearming works --- engine/src/render/vulkan/mod.rs | 37 ++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/engine/src/render/vulkan/mod.rs b/engine/src/render/vulkan/mod.rs index a9927fd..83ecee9 100644 --- a/engine/src/render/vulkan/mod.rs +++ b/engine/src/render/vulkan/mod.rs @@ -33,8 +33,8 @@ pub struct Instance { framebuffers: Vec>, command_buffers: Vec>, + armed: bool, previous_frame_end: Option>>, - recreate_swap_chain: bool, fps_counter: crate::util::counter::Counter, } @@ -67,7 +67,7 @@ impl Instance { command_buffers: vec![], previous_frame_end: None, - recreate_swap_chain: false, + armed: false, fps_counter: crate::util::counter::Counter::new(time::Duration::from_millis(100)), } } @@ -90,7 +90,7 @@ impl Instance { } fn arm(&mut self) { - self.swapchains = Some(swapchains::Swapchains::new(self.binding.as_ref().unwrap(), None)); + self.swapchains = Some(swapchains::Swapchains::new(self.binding.as_ref().unwrap(), self.swapchains.as_ref())); let device = self.binding.as_ref().unwrap().device.clone(); let chain = self.get_swapchain(); @@ -102,7 +102,8 @@ impl Instance { let pipeline = shaders::pipeline_triangle(device.clone(), chain.dimensions(), render_pass); self.create_command_buffers(pipeline); - self.previous_frame_end = None + self.previous_frame_end = None; + self.armed = true; } @@ -113,8 +114,20 @@ impl Instance { Some(future) => future.wait(None).unwrap(), } + if !self.armed { + self.arm(); + } + let chain = self.get_swapchain(); - let (image_index, acquire_future) = vs::acquire_next_image(chain.clone(), None).unwrap(); + let (image_index, acquire_future) = match vs::acquire_next_image(chain.clone(), None) { + Ok(r) => r, + Err(vs::AcquireError::OutOfDate) => { + self.armed = false; + self.previous_frame_end = None; + return; + }, + Err(err) => panic!("{:?}", err), + }; let command_buffer = self.command_buffers[image_index].clone(); let gq = self.binding.as_ref().unwrap().graphics_queue.clone(); @@ -124,11 +137,19 @@ impl Instance { .then_execute(gq, command_buffer) .unwrap() .then_swapchain_present(pq, chain, image_index) - .then_signal_fence_and_flush() - .unwrap(); + .then_signal_fence_and_flush(); - self.previous_frame_end = Some(Box::new(future)); + match future { + Ok(_) => (), + Err(vulkano::sync::FlushError::OutOfDate) => { + self.armed = false; + self.previous_frame_end = None; + return; + }, + Err(err) => panic!("{:?}", err), + }; + self.previous_frame_end = Some(Box::new(future.unwrap())); match self.fps_counter.tick() { Some(rate) => log::info!("FPS: {}", rate), None => ()