|
|
|
@ -1,37 +1,33 @@
|
|
|
|
|
use super::{Context, Err}; |
|
|
|
|
use super::*; |
|
|
|
|
use crate::ffi; |
|
|
|
|
use ash::{ |
|
|
|
|
version::InstanceV1_0, |
|
|
|
|
vk::{self, Handle}, |
|
|
|
|
}; |
|
|
|
|
use sdl2_sys::{ |
|
|
|
|
SDL_CreateWindow, SDL_DestroyWindow, SDL_Vulkan_CreateSurface, |
|
|
|
|
SDL_Vulkan_GetInstanceExtensions, SDL_Window, SDL_WindowFlags, SDL_bool, |
|
|
|
|
SDL_WINDOWPOS_UNDEFINED_MASK, |
|
|
|
|
}; |
|
|
|
|
use std::{marker::PhantomData, os::raw::c_int}; |
|
|
|
|
|
|
|
|
|
pub struct Window<'a> { |
|
|
|
|
hal: PhantomData<&'a Context>, |
|
|
|
|
handle: *mut SDL_Window, |
|
|
|
|
hal: PhantomData<&'a ctx::Context>, |
|
|
|
|
handle: *mut sdl::SDL_Window, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
impl<'a> Window<'a> { |
|
|
|
|
pub fn new( |
|
|
|
|
_hal: &'a Context, |
|
|
|
|
title: crate::ffi::Nts, |
|
|
|
|
_hal: &'a ctx::Context, |
|
|
|
|
title: ffi::Nts, |
|
|
|
|
w: i16, |
|
|
|
|
h: i16, |
|
|
|
|
) -> Result<Self, Err> { |
|
|
|
|
let handle = unsafe { |
|
|
|
|
SDL_CreateWindow( |
|
|
|
|
sdl::SDL_CreateWindow( |
|
|
|
|
title, |
|
|
|
|
SDL_WINDOWPOS_UNDEFINED_MASK as c_int, |
|
|
|
|
SDL_WINDOWPOS_UNDEFINED_MASK as c_int, |
|
|
|
|
sdl::SDL_WINDOWPOS_UNDEFINED_MASK as c_int, |
|
|
|
|
sdl::SDL_WINDOWPOS_UNDEFINED_MASK as c_int, |
|
|
|
|
w.into(), |
|
|
|
|
h.into(), |
|
|
|
|
SDL_WindowFlags::SDL_WINDOW_SHOWN as u32 |
|
|
|
|
| SDL_WindowFlags::SDL_WINDOW_VULKAN as u32 |
|
|
|
|
| SDL_WindowFlags::SDL_WINDOW_RESIZABLE as u32, |
|
|
|
|
sdl::SDL_WindowFlags::SDL_WINDOW_SHOWN as u32 |
|
|
|
|
| sdl::SDL_WindowFlags::SDL_WINDOW_VULKAN as u32 |
|
|
|
|
| sdl::SDL_WindowFlags::SDL_WINDOW_RESIZABLE as u32, |
|
|
|
|
) |
|
|
|
|
}; |
|
|
|
|
if !handle.is_null() { |
|
|
|
@ -41,27 +37,25 @@ impl<'a> Window<'a> {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
pub fn vulkan_instance_extensions( |
|
|
|
|
&self, |
|
|
|
|
) -> Result<Vec<crate::ffi::Nts>, Err> { |
|
|
|
|
pub fn vulkan_instance_extensions(&self) -> Result<Vec<ffi::Nts>, Err> { |
|
|
|
|
let mut count = 0; |
|
|
|
|
let res = unsafe { |
|
|
|
|
SDL_Vulkan_GetInstanceExtensions( |
|
|
|
|
sdl::SDL_Vulkan_GetInstanceExtensions( |
|
|
|
|
self.handle, |
|
|
|
|
&mut count, |
|
|
|
|
std::ptr::null_mut(), |
|
|
|
|
) |
|
|
|
|
}; |
|
|
|
|
if res != SDL_bool::SDL_FALSE { |
|
|
|
|
if res != sdl::SDL_bool::SDL_FALSE { |
|
|
|
|
let mut names = vec![std::ptr::null(); count as usize]; |
|
|
|
|
let res = unsafe { |
|
|
|
|
SDL_Vulkan_GetInstanceExtensions( |
|
|
|
|
sdl::SDL_Vulkan_GetInstanceExtensions( |
|
|
|
|
self.handle, |
|
|
|
|
&mut count, |
|
|
|
|
names.as_mut_ptr(), |
|
|
|
|
) |
|
|
|
|
}; |
|
|
|
|
if res != SDL_bool::SDL_FALSE { |
|
|
|
|
if res != sdl::SDL_bool::SDL_FALSE { |
|
|
|
|
Ok(names) |
|
|
|
|
} else { |
|
|
|
|
Err(unsafe { Err::new_sdl() }) |
|
|
|
@ -77,13 +71,13 @@ impl<'a> Window<'a> {
|
|
|
|
|
) -> Result<vk::SurfaceKHR, Err> { |
|
|
|
|
let mut surface = 0; |
|
|
|
|
let res = unsafe { |
|
|
|
|
SDL_Vulkan_CreateSurface( |
|
|
|
|
sdl::SDL_Vulkan_CreateSurface( |
|
|
|
|
self.handle, |
|
|
|
|
(**instance).handle().as_raw() as usize, |
|
|
|
|
&mut surface, |
|
|
|
|
) |
|
|
|
|
}; |
|
|
|
|
if res != SDL_bool::SDL_FALSE { |
|
|
|
|
if res != sdl::SDL_bool::SDL_FALSE { |
|
|
|
|
Ok(vk::SurfaceKHR::from_raw(surface)) |
|
|
|
|
} else { |
|
|
|
|
Err(unsafe { Err::new_sdl() }) |
|
|
|
@ -94,7 +88,7 @@ impl<'a> Window<'a> {
|
|
|
|
|
impl Drop for Window<'_> { |
|
|
|
|
fn drop(&mut self) { |
|
|
|
|
unsafe { |
|
|
|
|
SDL_DestroyWindow(self.handle); |
|
|
|
|
sdl::SDL_DestroyWindow(self.handle); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |