|
|
|
@ -1,8 +1,10 @@
|
|
|
|
|
use crate::{ |
|
|
|
|
render::{ensure_properties, Conf}, |
|
|
|
|
util::{err, meta}, |
|
|
|
|
hal::ErrSdl, |
|
|
|
|
render::{ensure_properties, Conf, ErrNoProperty}, |
|
|
|
|
util::meta, |
|
|
|
|
}; |
|
|
|
|
use ash::{ |
|
|
|
|
InstanceError, |
|
|
|
|
extensions::khr, |
|
|
|
|
version::{EntryV1_0, InstanceV1_0}, |
|
|
|
|
vk, vk_make_version, |
|
|
|
@ -15,10 +17,18 @@ pub struct Instance {
|
|
|
|
|
pub surface_ext: khr::Surface, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#[derive(Debug)] |
|
|
|
|
pub enum ErrInstanceCreate { |
|
|
|
|
Vk(vk::Result), |
|
|
|
|
Instance(InstanceError), |
|
|
|
|
NoExtension(ErrNoProperty), |
|
|
|
|
Sdl(ErrSdl), |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fn enable_instance_layers( |
|
|
|
|
layers: &[*const c_char], |
|
|
|
|
entry: &ash::Entry, |
|
|
|
|
) -> err::Result<vk::InstanceCreateInfo> { |
|
|
|
|
) -> Result<vk::InstanceCreateInfo, ErrInstanceCreate> { |
|
|
|
|
if layers.len() > 0 { |
|
|
|
|
let props = entry.enumerate_instance_layer_properties()?; |
|
|
|
|
ensure_properties(&props, layers, |x| x.layer_name.as_ptr())?; |
|
|
|
@ -36,7 +46,7 @@ impl Instance {
|
|
|
|
|
conf: &Conf, |
|
|
|
|
entry: &ash::Entry, |
|
|
|
|
window: &crate::hal::Window, |
|
|
|
|
) -> err::Result<Self> { |
|
|
|
|
) -> Result<Self, ErrInstanceCreate> { |
|
|
|
|
let exts = window.vulkan_instance_extensions()?; |
|
|
|
|
|
|
|
|
|
let app_info = vk::ApplicationInfo { |
|
|
|
@ -79,4 +89,41 @@ impl std::ops::Deref for Instance {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
impl std::fmt::Display for ErrInstanceCreate { |
|
|
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
|
|
|
|
match self { |
|
|
|
|
Self::Vk(res) => res.fmt(f), |
|
|
|
|
Self::Instance(err) => err.fmt(f), |
|
|
|
|
Self::NoExtension(err) => write!(f, "Missing extension: {}", err), |
|
|
|
|
Self::Sdl(err) => err.fmt(f), |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
impl std::error::Error for ErrInstanceCreate {} |
|
|
|
|
|
|
|
|
|
impl From<vk::Result> for ErrInstanceCreate { |
|
|
|
|
fn from(res: vk::Result) -> Self { |
|
|
|
|
Self::Vk(res) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
impl From<InstanceError> for ErrInstanceCreate { |
|
|
|
|
fn from(err: InstanceError) -> Self { |
|
|
|
|
Self::Instance(err) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
impl From<ErrNoProperty> for ErrInstanceCreate { |
|
|
|
|
fn from(err: ErrNoProperty) -> Self { |
|
|
|
|
Self::NoExtension(err) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
impl From<ErrSdl> for ErrInstanceCreate { |
|
|
|
|
fn from(err: ErrSdl) -> Self { |
|
|
|
|
Self::Sdl(err) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// EOF
|
|
|
|
|