vrust 0.0.1

VRust game engine
use super::image::view::View;
use super::render_pass::RenderPass;
use super::super::system::vulkan as vk;

use std::ptr::null;
use std::sync::Arc;
use std::default::Default;

pub struct Framebuffer {
    pub color_buffer: Arc<View>,
    pub depth_buffer: Arc<View>,
    pub render_pass: Arc<RenderPass>,
    pub vk_data: vk::VkFramebuffer,
}

impl Framebuffer {
    pub fn new(
        color_buffer: Arc<View>,
        depth_buffer: Arc<View>,
        render_pass: Arc<RenderPass>,
    ) -> Self {
        let attachments = vec![color_buffer.vk_data, depth_buffer.vk_data];
        let surface_caps = color_buffer
            .image
            .logical_device
            .physical_device
            .get_surface_capabilities();
        let mut fb_create_info = vk::VkFramebufferCreateInfo::default();
        fb_create_info.sType = vk::VkStructureType::VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
        fb_create_info.renderPass = render_pass.vk_data;
        fb_create_info.layers = 1;
        fb_create_info.attachmentCount = 2;
        fb_create_info.pAttachments = attachments.as_ptr();
        fb_create_info.width = surface_caps.currentExtent.width;
        fb_create_info.height = surface_caps.currentExtent.height;
        let mut vk_data = 0 as vk::VkFramebuffer;
        vulkan_check!(vk::vkCreateFramebuffer(
            color_buffer.image.logical_device.vk_data,
            &fb_create_info,
            null(),
            &mut vk_data,
        ));
        Framebuffer {
            color_buffer: color_buffer,
            depth_buffer: depth_buffer,
            render_pass: render_pass,
            vk_data: vk_data,
        }
    }
}

impl Drop for Framebuffer {
    fn drop(&mut self) {
        unsafe {
            vk::vkDestroyFramebuffer(
                self.color_buffer.image.logical_device.vk_data,
                self.vk_data,
                null(),
            );
        }
    }
}