diff --git a/examples/src/lib.rs b/examples/src/lib.rs index d174dc5..13fac15 100644 --- a/examples/src/lib.rs +++ b/examples/src/lib.rs @@ -12,7 +12,7 @@ use std::default::Default; use ash::Entry; use ash::Instance; use ash::Device; -pub use ash::version::{FunctionPointers, V1_0, InstanceV1_0, DeviceV1_0}; +pub use ash::version::{V1_0, InstanceV1_0, DeviceV1_0, EntryV1_0}; use ash::extensions::{Swapchain, XlibSurface, Surface, DebugReport, Win32Surface}; use std::ptr; use std::ffi::{CStr, CString}; diff --git a/src/entry.rs b/src/entry.rs index 04e8cce..a42e8e1 100644 --- a/src/entry.rs +++ b/src/entry.rs @@ -47,17 +47,34 @@ pub enum InstanceError { LoadError(Vec<&'static str>), VkError(vk::Result), } -pub trait EntryV1_0{ +pub trait EntryV1_0 { + type Fp: FunctionPointers; fn fp_v1_0(&self) -> &vk::EntryFnV1_0; fn static_fn(&self) -> &vk::StaticFn; + + fn create_instance(&self, + create_info: &vk::InstanceCreateInfo, + allocation_callbacks: Option<&vk::AllocationCallbacks>) + -> Result, InstanceError> { + unsafe { + let mut instance: vk::Instance = mem::uninitialized(); + let err_code = self.fp_v1_0().create_instance(create_info, + allocation_callbacks.as_raw_ptr(), + &mut instance); + if err_code != vk::Result::Success { + return Err(InstanceError::VkError(err_code)); + } + let instance_fp = <::Fp as FunctionPointers>::InstanceFp::load(&self.static_fn(), instance).map_err(|err| InstanceError::LoadError(err))?; + Ok(Instance::from_raw(instance, instance_fp)) + } + } fn enumerate_instance_layer_properties(&self) -> VkResult> { unsafe { let mut num = 0; self.fp_v1_0().enumerate_instance_layer_properties(&mut num, ptr::null_mut()); let mut v = Vec::with_capacity(num as usize); - let err_code = self - .fp_v1_0() + let err_code = self.fp_v1_0() .enumerate_instance_layer_properties(&mut num, v.as_mut_ptr()); v.set_len(num as usize); match err_code { @@ -67,16 +84,13 @@ pub trait EntryV1_0{ } } - fn enumerate_instance_extension_properties(&self) - -> VkResult> { + fn enumerate_instance_extension_properties(&self) -> VkResult> { unsafe { let mut num = 0; - self - .fp_v1_0() + self.fp_v1_0() .enumerate_instance_extension_properties(ptr::null(), &mut num, ptr::null_mut()); let mut data = Vec::with_capacity(num as usize); - let err_code = self - .fp_v1_0() + let err_code = self.fp_v1_0() .enumerate_instance_extension_properties(ptr::null(), &mut num, data.as_mut_ptr()); data.set_len(num as usize); match err_code { @@ -87,40 +101,24 @@ pub trait EntryV1_0{ } fn get_instance_proc_addr(&self, - instance: vk::Instance, - p_name: *const vk::c_char) - -> vk::PFN_vkVoidFunction { + instance: vk::Instance, + p_name: *const vk::c_char) + -> vk::PFN_vkVoidFunction { unsafe { self.static_fn().get_instance_proc_addr(instance, p_name) } } } -impl EntryV1_0 for Entry{ - fn fp_v1_0(&self) -> &vk::EntryFnV1_0{ +impl EntryV1_0 for Entry { + type Fp = V1_0; + fn fp_v1_0(&self) -> &vk::EntryFnV1_0 { self.entry_fn.fp_v1_0() } - fn static_fn(&self) -> &vk::StaticFn{ + fn static_fn(&self) -> &vk::StaticFn { &self.static_fn } } impl Entry { - pub fn create_instance(&self, - create_info: &vk::InstanceCreateInfo, - allocation_callbacks: Option<&vk::AllocationCallbacks>) - -> Result, InstanceError> { - unsafe { - let mut instance: vk::Instance = mem::uninitialized(); - let err_code = - self.entry_fn.fp_v1_0().create_instance(create_info, - allocation_callbacks.as_raw_ptr(), - &mut instance); - if err_code != vk::Result::Success { - return Err(InstanceError::VkError(err_code)); - } - let instance_fp = V::InstanceFp::load(&self.static_fn, instance).map_err(|err| InstanceError::LoadError(err))?; - Ok(Instance::from_raw(instance, instance_fp)) - } - } pub fn new() -> Result, LoadingError> { let static_fn = match *VK_LIB { Ok(ref lib) => {