vrust 0.0.1

VRust game engine
use super::super::super::system::vulkan as vk;
use super::Image;
use super::super::device::logical::Logical as LogicalDevice;
use std::default::Default;
use std::sync::Arc;
use std::ptr::null;

pub struct View {
    pub image: Arc<Image>,
    pub vk_data: vk::VkImageView,
}

impl View {
    pub fn new_depth_stencil(logical_device: Arc<LogicalDevice>) -> Self {
        let depth_format = logical_device.physical_device.get_supported_depth_format();
        let surface_caps = logical_device.physical_device.get_surface_capabilities();
        let mut image_info = vk::VkImageCreateInfo::default();
        image_info.sType = vk::VkStructureType::VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
        image_info.imageType = vk::VkImageType::VK_IMAGE_TYPE_2D;
        image_info.format = depth_format;
        image_info.extent.width = surface_caps.currentExtent.width;
        image_info.extent.height = surface_caps.currentExtent.height;
        image_info.extent.depth = 1;
        image_info.mipLevels = 1;
        image_info.arrayLayers = 1;
        image_info.samples = vk::VkSampleCountFlagBits::VK_SAMPLE_COUNT_1_BIT;
        image_info.tiling = vk::VkImageTiling::VK_IMAGE_TILING_OPTIMAL;
        image_info.usage = vk::VkImageUsageFlagBits::VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT as
            u32 |
            vk::VkImageUsageFlagBits::VK_IMAGE_USAGE_TRANSFER_SRC_BIT as u32;
        image_info.initialLayout = vk::VkImageLayout::VK_IMAGE_LAYOUT_UNDEFINED;
        let image = Arc::new(Image::new_with_info(logical_device.clone(), &image_info));
        let mut depth_stencil_view_info = vk::VkImageViewCreateInfo::default();
        depth_stencil_view_info.sType =
            vk::VkStructureType::VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
        depth_stencil_view_info.viewType = vk::VkImageViewType::VK_IMAGE_VIEW_TYPE_2D;
        depth_stencil_view_info.format = depth_format;
        depth_stencil_view_info.subresourceRange.aspectMask =
            vk::VkImageAspectFlagBits::VK_IMAGE_ASPECT_DEPTH_BIT as u32 |
                vk::VkImageAspectFlagBits::VK_IMAGE_ASPECT_STENCIL_BIT as u32;
        depth_stencil_view_info.subresourceRange.levelCount = 1;
        depth_stencil_view_info.subresourceRange.layerCount = 1;
        depth_stencil_view_info.image = image.vk_data;
        let mut vk_data = 0 as vk::VkImageView;
        vulkan_check!(vk::vkCreateImageView(
            logical_device.vk_data,
            &depth_stencil_view_info,
            null(),
            &mut vk_data,
        ));
        View {
            image: image,
            vk_data: vk_data,
        }
    }
    pub fn new_with_vk_image(
        logical_device: Arc<LogicalDevice>,
        vk_image: vk::VkImage,
        format: vk::VkFormat,
    ) -> Self {
        let image = Image::new_with_vk_data(logical_device.clone(), vk_image);
        let mut view_create_info = vk::VkImageViewCreateInfo::default();
        view_create_info.sType = vk::VkStructureType::VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
        view_create_info.image = image.vk_data;
        view_create_info.viewType = vk::VkImageViewType::VK_IMAGE_VIEW_TYPE_2D;
        view_create_info.format = format;
        view_create_info.components.r = vk::VkComponentSwizzle::VK_COMPONENT_SWIZZLE_R;
        view_create_info.components.g = vk::VkComponentSwizzle::VK_COMPONENT_SWIZZLE_G;
        view_create_info.components.b = vk::VkComponentSwizzle::VK_COMPONENT_SWIZZLE_B;
        view_create_info.components.a = vk::VkComponentSwizzle::VK_COMPONENT_SWIZZLE_A;
        view_create_info.subresourceRange.aspectMask =
            vk::VkImageAspectFlagBits::VK_IMAGE_ASPECT_COLOR_BIT as u32;
        view_create_info.subresourceRange.levelCount = 1;
        view_create_info.subresourceRange.layerCount = 1;
        let mut vk_data = 0 as vk::VkImageView;
        vulkan_check!(vk::vkCreateImageView(
            logical_device.vk_data,
            &view_create_info,
            null(),
            &mut vk_data,
        ));
        View {
            image: Arc::new(image),
            vk_data: vk_data,
        }
    }
}

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