vrust 0.0.1

VRust game engine
use std::default::Default;
use std::ptr::null;
use std::sync::Arc;
use super::super::system::vulkan as vk;
use super::super::system::os::OsApplication;
use super::super::core::application::ApplicationTrait as CoreAppTrait;
use super::instance::Instance;

pub struct Surface {
    pub instance: Arc<Instance>,
    pub vk_data: vk::VkSurfaceKHR,
}

impl Surface {
    #[cfg(target_os = "android")]
    pub fn new<CoreApp>(instance: Arc<Instance>, os_app: *mut OsApplication<CoreApp>) -> Self
    where
        CoreApp: CoreAppTrait,
    {
        loge!("Reached {:?}", os_app);
        let mut vk_data = 0 as vk::VkSurfaceKHR;
        let mut create_info = vk::VkAndroidSurfaceCreateInfoKHR::default();
        create_info.structure_type =
            vk::VkStructureType::VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR;
        create_info.window = unsafe { (*os_app).window };
        loge!("{:?}.{:?}", os_app, create_info.window);
        vulkan_check!(vk::vkCreateAndroidSurfaceKHR(
            instance.vk_data,
            &create_info,
            null(),
            &mut vk_data,
        ));
        loge!("Reached");
        Surface {
            instance: instance,
            vk_data: vk_data,
        }
    }
    #[cfg(target_os = "linux")]
    pub fn new<CoreApp>(instance: Arc<Instance>, os_app: *mut OsApplication<CoreApp>) -> Self
    where
        CoreApp: CoreAppTrait,
    {
        let mut vk_surface = 0 as vk::VkSurfaceKHR;
        let mut create_info = vk::VkXcbSurfaceCreateInfoKHR::default();
        create_info.sType = vk::VkStructureType::VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
        create_info.window = unsafe { (*os_app).window };
        create_info.connection = unsafe { (*os_app).connection };
        vulkan_check!(vk::vkCreateXcbSurfaceKHR(
            instance.vk_data,
            &create_info,
            null(),
            &mut vk_surface,
        ));
        logi!("vk surface {:?}", vk_surface);
        Surface {
            instance: instance,
            vk_data: vk_surface,
        }
    }
    #[cfg(target_os = "windows")]
    pub fn new<CoreApp>(instance: Arc<Instance>, os_app: *mut OsApplication<CoreApp>) -> Self
    where
        CoreApp: CoreAppTrait,
    {
        let mut vk_data = 0 as vk::VkSurfaceKHR;
        let mut create_info = vk::VkWin32SurfaceCreateInfoKHR::default();
        create_info.sType = vk::VkStructureType::VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR;
        create_info.hinstance = unsafe { (*os_app).h_instance };
        create_info.hwnd = unsafe { (*os_app).h_window };
        vulkan_check!(vk::vkCreateWin32SurfaceKHR(
            instance.vk_data,
            &create_info,
            null(),
            &mut vk_data,
        ));
        logi!("vk surface {:?}", vk_data);
        Surface {
            instance: instance,
            vk_data: vk_data,
        }
    }
}

impl Drop for Surface {
    fn drop(&mut self) {
        unsafe {
            logi!("terminated {:?}", self.vk_data);
            vk::vkDestroySurfaceKHR(self.instance.vk_data, self.vk_data, null());
        }
    }
}