summary refs log tree commit diff
path: root/src/graphics/frame.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/graphics/frame.rs')
-rw-r--r--src/graphics/frame.rs32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/graphics/frame.rs b/src/graphics/frame.rs
index 721eced..749b5ac 100644
--- a/src/graphics/frame.rs
+++ b/src/graphics/frame.rs
@@ -77,6 +77,8 @@ impl Frame {
                 texture: &Texture, render_pass: &vk::RenderPass)
       -> Result<()>
   {
+    Frame::destroy_replaceable(frames, permanent);
+
     let device = &permanent.device;
     let primary_command_pool = &permanent.primary_command_pool;
     let descriptor_set_layout = &for_reinit.descriptor_set_layout;
@@ -116,6 +118,35 @@ impl Frame {
 
     Ok(())
   }
+
+  //   This relies on its caller to have already waited for the device to be
+  // idle.
+  #[allow(unsafe_code)]
+  pub fn destroy(frames: &mut Vec<Self>, permanent: &Permanent) {
+    Frame::destroy_replaceable(frames, permanent);
+  }
+
+  #[allow(unsafe_code)]
+  pub fn destroy_replaceable(frames: &mut Vec<Self>, permanent: &Permanent) {
+    let device = &permanent.device;
+
+    let mut command_buffers = Vec::new();
+    for frame in frames {
+      unsafe { device.destroy_framebuffer(frame.framebuffer, None) };
+
+      command_buffers.push(frame.command_buffer);
+    }
+
+    //   Notice that we free the buffers in the pool, but do not destroy the
+    // pool itself. Notice also that we only do this for the primary command
+    // pool, because that's the only one where we've kept track of the
+    // buffers. We promise ourselves to free buffers in the transient pool
+    // immediately after using them.
+    unsafe {
+      device.free_command_buffers(permanent.primary_command_pool,
+                                  &command_buffers)
+    };
+  }
 }
 
 
@@ -225,3 +256,4 @@ fn init_descriptor_sets(count: usize, device: &Device,
 
   Ok(sets)
 }
+