|
|
|
@ -3,7 +3,16 @@ use ash::{
|
|
|
|
|
version::InstanceV1_0, |
|
|
|
|
vk::{self, Handle}, |
|
|
|
|
}; |
|
|
|
|
use sdl2_sys as sdl; |
|
|
|
|
use sdl2_sys::{ |
|
|
|
|
SDL_CreateWindow, |
|
|
|
|
SDL_DestroyWindow, |
|
|
|
|
SDL_Vulkan_CreateSurface, |
|
|
|
|
SDL_Vulkan_GetInstanceExtensions, |
|
|
|
|
SDL_WINDOWPOS_UNDEFINED_MASK, |
|
|
|
|
SDL_Window, |
|
|
|
|
SDL_WindowFlags, |
|
|
|
|
SDL_bool, |
|
|
|
|
}; |
|
|
|
|
use std::{ |
|
|
|
|
marker::PhantomData, |
|
|
|
|
os::raw::{c_char, c_int}, |
|
|
|
@ -11,7 +20,7 @@ use std::{
|
|
|
|
|
|
|
|
|
|
pub struct Window<'a> { |
|
|
|
|
hal: PhantomData<&'a Context>, |
|
|
|
|
handle: *mut sdl::SDL_Window, |
|
|
|
|
handle: *mut SDL_Window, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
impl<'a> Window<'a> { |
|
|
|
@ -22,17 +31,18 @@ impl<'a> Window<'a> {
|
|
|
|
|
h: i16, |
|
|
|
|
) -> Result<Self, ErrSdl> { |
|
|
|
|
let handle = unsafe { |
|
|
|
|
sdl::SDL_CreateWindow( |
|
|
|
|
SDL_CreateWindow( |
|
|
|
|
title, |
|
|
|
|
sdl::SDL_WINDOWPOS_UNDEFINED_MASK as c_int, |
|
|
|
|
sdl::SDL_WINDOWPOS_UNDEFINED_MASK as c_int, |
|
|
|
|
SDL_WINDOWPOS_UNDEFINED_MASK as c_int, |
|
|
|
|
SDL_WINDOWPOS_UNDEFINED_MASK as c_int, |
|
|
|
|
w.into(), |
|
|
|
|
h.into(), |
|
|
|
|
sdl::SDL_WindowFlags::SDL_WINDOW_SHOWN as u32 | |
|
|
|
|
sdl::SDL_WindowFlags::SDL_WINDOW_VULKAN as u32, |
|
|
|
|
SDL_WindowFlags::SDL_WINDOW_SHOWN as u32 | |
|
|
|
|
SDL_WindowFlags::SDL_WINDOW_VULKAN as u32 | |
|
|
|
|
SDL_WindowFlags::SDL_WINDOW_RESIZABLE as u32, |
|
|
|
|
) |
|
|
|
|
}; |
|
|
|
|
if handle != std::ptr::null_mut() { |
|
|
|
|
if !handle.is_null() { |
|
|
|
|
Ok(Self { hal: PhantomData, handle }) |
|
|
|
|
} else { |
|
|
|
|
Err(unsafe { ErrSdl::new() }) |
|
|
|
@ -44,22 +54,22 @@ impl<'a> Window<'a> {
|
|
|
|
|
) -> Result<Vec<*const c_char>, ErrSdl> { |
|
|
|
|
let mut count = 0; |
|
|
|
|
let res = unsafe { |
|
|
|
|
sdl::SDL_Vulkan_GetInstanceExtensions( |
|
|
|
|
SDL_Vulkan_GetInstanceExtensions( |
|
|
|
|
self.handle, |
|
|
|
|
&mut count, |
|
|
|
|
std::ptr::null_mut(), |
|
|
|
|
) |
|
|
|
|
}; |
|
|
|
|
if res != sdl::SDL_bool::SDL_FALSE { |
|
|
|
|
if res != SDL_bool::SDL_FALSE { |
|
|
|
|
let mut names = vec![std::ptr::null(); count as usize]; |
|
|
|
|
let res = unsafe { |
|
|
|
|
sdl::SDL_Vulkan_GetInstanceExtensions( |
|
|
|
|
SDL_Vulkan_GetInstanceExtensions( |
|
|
|
|
self.handle, |
|
|
|
|
&mut count, |
|
|
|
|
names.as_mut_ptr(), |
|
|
|
|
) |
|
|
|
|
}; |
|
|
|
|
if res != sdl::SDL_bool::SDL_FALSE { |
|
|
|
|
if res != SDL_bool::SDL_FALSE { |
|
|
|
|
Ok(names) |
|
|
|
|
} else { |
|
|
|
|
Err(unsafe { ErrSdl::new() }) |
|
|
|
@ -75,13 +85,13 @@ impl<'a> Window<'a> {
|
|
|
|
|
) -> Result<vk::SurfaceKHR, ErrSdl> { |
|
|
|
|
let mut surface = 0; |
|
|
|
|
let res = unsafe { |
|
|
|
|
sdl::SDL_Vulkan_CreateSurface( |
|
|
|
|
SDL_Vulkan_CreateSurface( |
|
|
|
|
self.handle, |
|
|
|
|
(**instance).handle().as_raw() as usize, |
|
|
|
|
&mut surface, |
|
|
|
|
) |
|
|
|
|
}; |
|
|
|
|
if res != sdl::SDL_bool::SDL_FALSE { |
|
|
|
|
if res != SDL_bool::SDL_FALSE { |
|
|
|
|
Ok(vk::SurfaceKHR::from_raw(surface)) |
|
|
|
|
} else { |
|
|
|
|
Err(unsafe { ErrSdl::new() }) |
|
|
|
@ -92,7 +102,7 @@ impl<'a> Window<'a> {
|
|
|
|
|
impl Drop for Window<'_> { |
|
|
|
|
fn drop(&mut self) { |
|
|
|
|
unsafe { |
|
|
|
|
sdl::SDL_DestroyWindow(self.handle); |
|
|
|
|
SDL_DestroyWindow(self.handle); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|