despero 0.1.0

Rusty game engine, using API Vulkan and implementing paradigm of ECS
Documentation
#[cfg(feature = "gtk")]
use gtk::prelude::*;
use ash::vk;
use crate::render::{
    backend::{
        instance::Instance,
    },
};

pub struct Surface {
    pub surface: vk::SurfaceKHR,
    pub surface_loader: ash::extensions::khr::Surface,
}

impl Surface {
    pub fn init(
        window: &winit::window::Window,
        instance: &Instance,
    ) -> Result<Surface, vk::Result> {
        let surface = unsafe { ash_window::create_surface(
            &instance.entry, 
            &instance.instance, 
            &window, 
            None,
        )? };
        
        let surface_loader = ash::extensions::khr::Surface::new(&instance.entry, &instance.instance);
        return Ok(Surface {
            surface,
            surface_loader,
        })
    }
    
    pub fn get_capabilities(
        &self,
        physical_device: vk::PhysicalDevice,
    ) -> Result<vk::SurfaceCapabilitiesKHR, vk::Result> {
        unsafe {
            self.surface_loader.get_physical_device_surface_capabilities(physical_device, self.surface)
        }
    }
    
    pub fn get_present_modes(
        &self,
        physical_device: vk::PhysicalDevice,
    ) -> Result<Vec<vk::PresentModeKHR>, vk::Result> {
        unsafe {
            self.surface_loader
                .get_physical_device_surface_present_modes(physical_device, self.surface)
        }
    }
    
    pub fn get_formats(
        &self,
        physical_device: vk::PhysicalDevice,
    ) -> Result<Vec<vk::SurfaceFormatKHR>, vk::Result> {
        unsafe {
            self.surface_loader
                .get_physical_device_surface_formats(physical_device, self.surface)
        }
    }
    
    pub fn get_physical_device_surface_support(
        &self,
        physical_device: vk::PhysicalDevice,
        queuefamilyindex: usize,
    ) -> Result<bool, vk::Result> {
        unsafe {
            self.surface_loader.get_physical_device_surface_support(
                physical_device,
                queuefamilyindex as u32,
                self.surface,
            )
        }
    }

}

impl Drop for Surface {
    fn drop(&mut self) {
        unsafe {
            self.surface_loader.destroy_surface(self.surface, None);
        }
    }
}