ash 0.17.0

Vulkan bindings for Rust
Documentation
#![allow(dead_code)]
use prelude::*;
use std::ptr;
use std::mem;
use vk;
use device::Device;
use std::error::Error;
use std::fmt;
use RawPtr;
use version::{FunctionPointers, V1_0};
use version::DeviceLoader;

#[derive(Debug)]
pub enum DeviceError {
    LoadError(Vec<&'static str>),
    VkError(vk::Result),
}

impl fmt::Display for DeviceError{
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result{
        write!(f, "DeviceError::{:?}", self)
    }
}

impl Error for DeviceError {
    fn description(&self) -> &str {
        "DeviceErrorr"
    }

    fn cause(&self) -> Option<&Error>{
        if let &DeviceError::VkError(ref err) = self{
            return err.cause();
        }
        None
    }
}

#[derive(Clone)]
pub struct Instance<V: FunctionPointers> {
    handle: vk::Instance,
    instance_fp: V::InstanceFp,
}

impl InstanceV1_0 for Instance<V1_0> {
    type Fp = V1_0;
    fn handle(&self) -> vk::Instance {
        self.handle
    }

    fn fp_v1_0(&self) -> &vk::InstanceFnV1_0 {
        &self.instance_fp.instance_fn
    }
}
impl<V: FunctionPointers> Instance<V> {
    pub fn handle(&self) -> vk::Instance {
        self.handle
    }

    pub fn from_raw(handle: vk::Instance, version: V::InstanceFp) -> Self {
        Instance {
            handle: handle,
            instance_fp: version,
        }
    }
}

#[allow(non_camel_case_types)]
pub trait InstanceV1_0 {
    type Fp: FunctionPointers;
    fn handle(&self) -> vk::Instance;
    fn fp_v1_0(&self) -> &vk::InstanceFnV1_0;
    unsafe fn create_device(&self,
                            physical_device: vk::PhysicalDevice,
                            create_info: &vk::DeviceCreateInfo,
                            allocation_callbacks: Option<&vk::AllocationCallbacks>)
                            -> Result<Device<Self::Fp>, DeviceError> {
        let mut device: vk::Device = mem::uninitialized();
        let err_code = self.fp_v1_0()
            .create_device(physical_device,
                           create_info,
                           allocation_callbacks.as_raw_ptr(),
                           &mut device);
        if err_code != vk::Result::Success {
            return Err(DeviceError::VkError(err_code));
        }
        let device_fn =
            <<Self as InstanceV1_0>::Fp as FunctionPointers>::DeviceFp::load(self.fp_v1_0(), device).map_err(|err| DeviceError::LoadError(err))?;
        Ok(Device::from_raw(device, device_fn))
    }

    fn get_device_proc_addr(&self,
                            device: vk::Device,
                            p_name: *const vk::c_char)
                            -> vk::PFN_vkVoidFunction {
        unsafe { self.fp_v1_0().get_device_proc_addr(device, p_name) }
    }

    unsafe fn destroy_instance(&self, allocation_callbacks: Option<&vk::AllocationCallbacks>) {
        self.fp_v1_0()
            .destroy_instance(self.handle(), allocation_callbacks.as_raw_ptr());
    }

    fn get_physical_device_format_properties(&self,
                                             physical_device: vk::PhysicalDevice,
                                             format: vk::Format)
                                             -> vk::FormatProperties {
        unsafe {
            let mut format_prop = mem::uninitialized();
            self.fp_v1_0()
                .get_physical_device_format_properties(physical_device, format, &mut format_prop);
            format_prop
        }
    }

    fn get_physical_device_memory_properties(&self,
                                             physical_device: vk::PhysicalDevice)
                                             -> vk::PhysicalDeviceMemoryProperties {
        unsafe {
            let mut memory_prop = mem::uninitialized();
            self.fp_v1_0()
                .get_physical_device_memory_properties(physical_device, &mut memory_prop);
            memory_prop
        }
    }

    fn get_physical_device_properties(&self,
                                      physical_device: vk::PhysicalDevice)
                                      -> vk::PhysicalDeviceProperties {
        unsafe {
            let mut prop = mem::uninitialized();
            self.fp_v1_0()
                .get_physical_device_properties(physical_device, &mut prop);
            prop
        }
    }

    fn get_physical_device_queue_family_properties(&self,
                                                   physical_device: vk::PhysicalDevice)
                                                   -> Vec<vk::QueueFamilyProperties> {
        unsafe {
            let mut queue_count = 0;
            self.fp_v1_0()
                .get_physical_device_queue_family_properties(physical_device,
                                                             &mut queue_count,
                                                             ptr::null_mut());
            let mut queue_families_vec = Vec::with_capacity(queue_count as usize);
            self.fp_v1_0()
                .get_physical_device_queue_family_properties(physical_device,
                                                             &mut queue_count,
                                                             queue_families_vec.as_mut_ptr());
            queue_families_vec.set_len(queue_count as usize);
            queue_families_vec
        }
    }

    fn get_physical_device_features(&self,
                                    physical_device: vk::PhysicalDevice)
                                    -> vk::PhysicalDeviceFeatures {
        unsafe {
            let mut prop = mem::uninitialized();
            self.fp_v1_0()
                .get_physical_device_features(physical_device, &mut prop);
            prop
        }
    }

    fn enumerate_physical_devices(&self) -> VkResult<Vec<vk::PhysicalDevice>> {
        unsafe {
            let mut num = mem::uninitialized();
            self.fp_v1_0()
                .enumerate_physical_devices(self.handle(), &mut num, ptr::null_mut());
            let mut physical_devices = Vec::<vk::PhysicalDevice>::with_capacity(num as usize);
            let err_code =
                self.fp_v1_0()
                    .enumerate_physical_devices(self.handle(),
                                                &mut num,
                                                physical_devices.as_mut_ptr());
            physical_devices.set_len(num as usize);
            match err_code {
                vk::Result::Success => Ok(physical_devices),
                _ => Err(err_code),
            }
        }
    }

    fn enumerate_device_extension_properties
        (&self,
         device: vk::PhysicalDevice)
         -> Result<Vec<vk::ExtensionProperties>, vk::Result> {
        unsafe {
            let mut num = 0;
            self.fp_v1_0()
                .enumerate_device_extension_properties(device,
                                                       ptr::null(),
                                                       &mut num,
                                                       ptr::null_mut());
            let mut data = Vec::with_capacity(num as usize);
            let err_code = self.fp_v1_0()
                .enumerate_device_extension_properties(device,
                                                       ptr::null(),
                                                       &mut num,
                                                       data.as_mut_ptr());
            data.set_len(num as usize);
            match err_code {
                vk::Result::Success => Ok(data),
                _ => Err(err_code),
            }
        }
    }
}

// pub trait InstanceMajor1Minor1: InstanceMajor1Minor0 {}
// pub trait InstanceMajor1Minor2: InstanceMajor1Minor1 {}