cen 0.0.8

Vulkan window backend
Documentation
use std::sync::Arc;
use ash::vk;
use ash::vk::Extent2D;
use log::trace;
use crate::vulkan::{Device, RenderPass, LOG_TARGET};
use crate::vulkan::device::DeviceInner;

pub struct FramebufferInner {
    pub framebuffer: vk::Framebuffer,
    pub device_dep: Arc<DeviceInner>,
    pub extent: Extent2D,
}

impl Drop for FramebufferInner {
    fn drop(&mut self) {
        unsafe {
            let framebuffer_addr = format!("{:?}", self.framebuffer);
            self.device_dep.device.destroy_framebuffer(self.framebuffer, None);
            trace!(target: LOG_TARGET, "Destroyed framebuffer: [{}]", framebuffer_addr);
        }
    }
}

pub struct Framebuffer {
    pub inner: Arc<FramebufferInner>,
}

impl Framebuffer {
    pub fn new(device: &Device, extent: vk::Extent2D, render_pass: &RenderPass, attachments: Vec<vk::ImageView>) -> Self {

        let framebuffer_create_info = vk::FramebufferCreateInfo::default()
            .render_pass(render_pass.handle())
            .attachments(&attachments)
            .width(extent.width)
            .height(extent.height)
            .layers(1);

        let framebuffer = unsafe {
            device.handle()
                .create_framebuffer(&framebuffer_create_info, None)
                .expect("Failed to create framebuffer")
        };

        trace!(target: LOG_TARGET, "Created framebuffer: {:?}", framebuffer);

        let framebuffer_inner = FramebufferInner {
            device_dep: device.inner.clone(),
            framebuffer,
            extent
        };

        Framebuffer {
            inner: Arc::new(framebuffer_inner)
        }
    }

    pub fn handle(&self) -> vk::Framebuffer {
        self.inner.framebuffer
    }

    pub fn get_extent(&self) -> vk::Extent2D {
        self.inner.extent
    }
}