aluminium 0.1.0

vulkan-based graphics engine
use ash::vk::{self};
use super::device::Device;
use super::{VulkanError, VulkanResult};

pub struct FrameBuffer {
    pub(crate) raw: vk::Framebuffer,
}

impl FrameBuffer {
    pub fn destroy(&self, device: &Device) {
        unsafe { device.destroy_framebuffer(self.raw, None) };
    }
}

pub struct FrameBufferBuilder<'a> {
    device: &'a Device,
    extent: Option<vk::Extent2D>,
    attachments: Option<&'a [vk::ImageView]>,
    layers: Option<u32>,
    render_pass: Option<vk::RenderPass>
}

impl<'a> FrameBufferBuilder<'a> {
    pub fn new(device: &'a Device) -> Self {
        FrameBufferBuilder {
            device,
            extent: None,
            attachments: None,
            layers: None,
            render_pass: None
        }
    }

    pub fn layers(mut self, layers: u32) -> Self {
        self.layers = Some(layers);
        self
    }

    pub fn attachments(mut self, attachments: &'a [vk::ImageView]) -> Self {
        self.attachments = Some(attachments);
        self
    }

    pub fn extent(mut self, extent: vk::Extent2D) -> Self {
        self.extent = Some(extent);
        self
    }

    pub fn render_pass(mut self, render_pass: vk::RenderPass) -> Self {
        self.render_pass = Some(render_pass);
        self
    }

    pub fn build(self) -> VulkanResult<FrameBuffer> {
        
        let render_pass = self.render_pass.expect("Missing RenderPass");
        let extent = self.extent.expect("Missing Extent");
        let layers = self.layers.expect("Missing Layers"); 
        let attachments = self.attachments.expect("Missing Attachments");

        #[cfg(debug_assertions)]
        {
            if layers == 0 {
                panic!("Layer must be 1 or less");
            }

            if extent.width == 0 || extent.height == 0 {
                panic!("Extent must have width and height with size less 0")
            }

            if attachments.is_empty() {
                panic!("Attachemnts musth have 1 or less attachments")
            }
        }

        let create_info = vk::FramebufferCreateInfo::default()
            .render_pass(render_pass)
            .layers(layers)
            .width(extent.width)
            .height(extent.height)
            .attachments(attachments);

        let frame_buffer = unsafe {
            profiling::scope!("vkCreateFramebuffer");
            self.device
                .create_framebuffer(&create_info, None)
                .map_err(VulkanError::Unknown)?
        };

        Ok(FrameBuffer { raw: frame_buffer })
    }
}