use super::{VkDevice, VkRenderPass, VkSwapchain}; use ash::vk; use std::sync::Arc; pub struct VkFramebuffer { device: Arc, image_view: Arc, render_pass: Arc, pub handle: vk::Framebuffer, } impl VkFramebuffer { pub fn from_swapchain_image_view( device: &Arc, render_pass: &Arc, image_view: &Arc, swapchain: &VkSwapchain, ) -> anyhow::Result { let attachments = [*image_view.as_ref()]; let framebuffer_info = vk::FramebufferCreateInfo::default() .render_pass(render_pass.handle) .width(swapchain.surface_resolution.width) .height(swapchain.surface_resolution.height) .attachments(&attachments) .layers(1); let framebuffer = unsafe { device.handle.create_framebuffer(&framebuffer_info, None)? }; Ok(Self { device: device.clone(), render_pass: render_pass.clone(), image_view: image_view.clone(), handle: framebuffer, }) } } impl Drop for VkFramebuffer { fn drop(&mut self) { unsafe { self.device.handle.destroy_framebuffer(self.handle, None) }; } }