vrust 0.0.1

VRust game engine
use super::super::system::vulkan as vk;
use super::swapchain::Swapchain;
use std::sync::Arc;
use std::default::Default;
use std::ptr::null;
pub struct RenderPass {
    pub swapchain: Arc<Swapchain>,
    pub vk_data: vk::VkRenderPass,
}
impl RenderPass {
    pub fn new(swapchain: Arc<Swapchain>) -> Self {
        let mut attachment_descriptions = vec![vk::VkAttachmentDescription::default(); 2];
        attachment_descriptions[0].format = swapchain.surface_format.format;
        attachment_descriptions[0].samples = vk::VkSampleCountFlagBits::VK_SAMPLE_COUNT_1_BIT;
        attachment_descriptions[0].loadOp = vk::VkAttachmentLoadOp::VK_ATTACHMENT_LOAD_OP_CLEAR;
        attachment_descriptions[0].storeOp = vk::VkAttachmentStoreOp::VK_ATTACHMENT_STORE_OP_STORE;
        attachment_descriptions[0].stencilLoadOp =
            vk::VkAttachmentLoadOp::VK_ATTACHMENT_LOAD_OP_DONT_CARE;
        attachment_descriptions[0].stencilStoreOp =
            vk::VkAttachmentStoreOp::VK_ATTACHMENT_STORE_OP_DONT_CARE;
        attachment_descriptions[0].initialLayout = vk::VkImageLayout::VK_IMAGE_LAYOUT_UNDEFINED;
        attachment_descriptions[0].finalLayout = vk::VkImageLayout::VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
        attachment_descriptions[1].format = swapchain
            .logical_device
            .physical_device
            .get_supported_depth_format();
        attachment_descriptions[1].samples = vk::VkSampleCountFlagBits::VK_SAMPLE_COUNT_1_BIT;
        attachment_descriptions[1].loadOp = vk::VkAttachmentLoadOp::VK_ATTACHMENT_LOAD_OP_CLEAR;
        attachment_descriptions[1].storeOp =
            vk::VkAttachmentStoreOp::VK_ATTACHMENT_STORE_OP_DONT_CARE;
        attachment_descriptions[1].stencilLoadOp =
            vk::VkAttachmentLoadOp::VK_ATTACHMENT_LOAD_OP_DONT_CARE;
        attachment_descriptions[1].stencilStoreOp =
            vk::VkAttachmentStoreOp::VK_ATTACHMENT_STORE_OP_DONT_CARE;
        attachment_descriptions[1].initialLayout = vk::VkImageLayout::VK_IMAGE_LAYOUT_UNDEFINED;
        attachment_descriptions[1].finalLayout =
            vk::VkImageLayout::VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
        let mut colour_reference = vk::VkAttachmentReference::default();
        colour_reference.layout = vk::VkImageLayout::VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
        colour_reference.attachment = 0;
        let mut depth_reference = vk::VkAttachmentReference::default();
        depth_reference.layout =
            vk::VkImageLayout::VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
        depth_reference.attachment = 1;
        let mut subpass_description = vk::VkSubpassDescription::default();
        subpass_description.pipelineBindPoint =
            vk::VkPipelineBindPoint::VK_PIPELINE_BIND_POINT_GRAPHICS;
        subpass_description.colorAttachmentCount = 1;
        subpass_description.pColorAttachments = &colour_reference;
        subpass_description.pDepthStencilAttachment = &depth_reference;
        let mut dependencies = vec![vk::VkSubpassDependency::default(); 2];
        dependencies[0].srcSubpass = vk::VK_SUBPASS_EXTERNAL;
        dependencies[0].srcStageMask =
            vk::VkPipelineStageFlagBits::VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT as u32;
        dependencies[0].dstStageMask =
            vk::VkPipelineStageFlagBits::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT as u32;
        dependencies[0].srcAccessMask = vk::VkAccessFlagBits::VK_ACCESS_MEMORY_READ_BIT as u32;
        dependencies[0].dstAccessMask = vk::VkAccessFlagBits::VK_ACCESS_COLOR_ATTACHMENT_READ_BIT as
            u32 |
            vk::VkAccessFlagBits::VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT as u32;
        dependencies[0].dependencyFlags =
            vk::VkDependencyFlagBits::VK_DEPENDENCY_BY_REGION_BIT as u32;
        dependencies[1].dstSubpass = vk::VK_SUBPASS_EXTERNAL;
        dependencies[1].srcStageMask =
            vk::VkPipelineStageFlagBits::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT as u32;
        dependencies[1].dstStageMask =
            vk::VkPipelineStageFlagBits::VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT as u32;
        dependencies[1].srcAccessMask = vk::VkAccessFlagBits::VK_ACCESS_COLOR_ATTACHMENT_READ_BIT as
            u32 |
            vk::VkAccessFlagBits::VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT as u32;
        dependencies[1].dstAccessMask = vk::VkAccessFlagBits::VK_ACCESS_MEMORY_READ_BIT as u32;
        dependencies[1].dependencyFlags =
            vk::VkDependencyFlagBits::VK_DEPENDENCY_BY_REGION_BIT as u32;
        let mut render_pass_create_info = vk::VkRenderPassCreateInfo::default();
        render_pass_create_info.sType =
            vk::VkStructureType::VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
        render_pass_create_info.attachmentCount = attachment_descriptions.len() as u32;
        render_pass_create_info.pAttachments = attachment_descriptions.as_ptr();
        render_pass_create_info.subpassCount = 1;
        render_pass_create_info.pSubpasses = &subpass_description;
        render_pass_create_info.dependencyCount = dependencies.len() as u32;
        render_pass_create_info.pDependencies = dependencies.as_ptr();
        let mut vk_data = 0 as vk::VkRenderPass;
        vulkan_check!(vk::vkCreateRenderPass(
            swapchain.logical_device.vk_data,
            &render_pass_create_info,
            null(),
            &mut vk_data,
        ));
        RenderPass {
            swapchain: swapchain,
            vk_data: vk_data,
        }
    }
}

impl Drop for RenderPass {
    fn drop(&mut self) {
        unsafe {
            vk::vkDestroyRenderPass(self.swapchain.logical_device.vk_data, self.vk_data, null());
        }
    }
}