diff options
Diffstat (limited to 'src/graphics/frame.rs')
| -rw-r--r-- | src/graphics/frame.rs | 32 |
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) } + |