pub mod vk;
pub mod error;
pub mod platform;
use ash::extensions::khr::Surface;
#[cfg(feature = "winit")]
use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle};
use crate::error::{ErrorKind, VlTkError};
use crate::vk::{Vk, VkContext};
#[cfg(feature = "winit")]
use winit::window::Window;
pub trait VkApplication<T> {
fn run(&mut self) {
let vk = Vk {};
VkApplication::init_vulkan(self, vk);
VkApplication::main_loop(self, vk);
VkApplication::clean_up(self, vk);
}
fn init_vulkan(&mut self, vk: Vk) -> VkContext;
fn main_loop(&mut self, vk: Vk);
fn clean_up(&mut self, vk: Vk);
}
#[cfg(feature = "winit")]
pub trait WindowExt {
fn use_vk(&self, context: &VkContext) -> Result<vk::Surface, VlTkError>;
}
#[cfg(feature = "winit")]
impl WindowExt for Window {
fn use_vk(&self, context: &VkContext) -> Result<vk::Surface, VlTkError> {
unsafe {
let surface = match ash_window::create_surface(
&context.entry,
&context.instance,
self.raw_display_handle(),
self.raw_window_handle(),
None,
) {
Ok(surface) => surface,
Err(err) => return Err(VlTkError::new(ErrorKind::VkInitialize, err)),
};
let surface_fn: Surface = Surface::new(&context.entry, &context.instance);
Ok(vk::Surface::new(surface_fn, surface))
}
}
}