Swtich device to the new extension version format

This commit is contained in:
maik klein 2016-12-30 05:42:34 +01:00
parent d964453d2d
commit 45936ae6bb
5 changed files with 419 additions and 394 deletions

View file

@ -16,7 +16,8 @@ use ash::device::Device;
use std::ptr;
use std::ffi::{CStr, CString};
use std::ops::Drop;
use ash::instance::{V1_0, InstanceV1_0};
pub use ash::instance::{V1_0, InstanceV1_0};
pub use ash::device::{DeviceV1_0};
// Simple offset_of macro akin to C++ offsetof
#[macro_export]
@ -32,7 +33,7 @@ macro_rules! offset_of{
}
}
pub fn record_submit_commandbuffer<F: FnOnce(&Device, vk::CommandBuffer)>(device: &Device,
pub fn record_submit_commandbuffer<F: FnOnce(&Device<V1_0>, vk::CommandBuffer)>(device: &Device<V1_0>,
command_buffer: vk::CommandBuffer,
submit_queue: vk::Queue,
wait_mask: &[vk::PipelineStageFlags],
@ -188,7 +189,7 @@ fn resize_callback(width: u32, height: u32) {
pub struct ExampleBase {
pub entry: Entry,
pub instance: Instance<V1_0>,
pub device: Device,
pub device: Device<V1_0>,
pub surface_loader: Surface,
pub swapchain_loader: Swapchain,
pub debug_report_loader: DebugReport,
@ -334,7 +335,7 @@ impl ExampleBase {
pp_enabled_extension_names: device_extension_names_raw.as_ptr(),
p_enabled_features: &features,
};
let device: Device = instance.create_device(pdevice, &device_create_info, None)
let device: Device<V1_0> = instance.create_device(pdevice, &device_create_info, None)
.unwrap();
let present_queue = device.get_device_queue(queue_family_index as u32, 0);

File diff suppressed because it is too large Load diff

View file

@ -15,7 +15,7 @@ pub struct Swapchain {
}
impl Swapchain {
pub fn new(instance: &Instance<V1_0>, device: &Device) -> Result<Swapchain, Vec<&'static str>> {
pub fn new(instance: &Instance<V1_0>, device: &Device<V1_0>) -> Result<Swapchain, Vec<&'static str>> {
let swapchain_fn = vk::SwapchainFn::load(|name| {
unsafe { mem::transmute(instance.get_device_proc_addr(device.handle(), name.as_ptr())) }
})?;

View file

@ -14,6 +14,7 @@ pub struct Win32Surface {
win32_surface_fn: vk::Win32SurfaceFn,
}
impl Win32Surface {
pub fn new(entry: &Entry, instance: &Instance<V1_0>) -> Result<Win32Surface, Vec<&'static str>> {
let surface_fn = vk::Win32SurfaceFn::load(|name| {

View file

@ -3,7 +3,7 @@ use prelude::*;
use std::ptr;
use std::mem;
use vk;
use device::Device;
use device::{Device, DeviceFpV1_0};
use ::RawPtr;
#[derive(Debug)]
@ -12,36 +12,35 @@ pub enum DeviceError {
VkError(vk::Result),
}
pub trait VkVersion{
pub trait VkVersion {
type InstanceFp;
type DeviceFp;
}
#[warn(non_camel_case_types)]
pub struct V1_0;
impl VkVersion for V1_0{
impl VkVersion for V1_0 {
type InstanceFp = InstanceFpV1_0;
type DeviceFp = ();
type DeviceFp = DeviceFpV1_0;
}
#[warn(non_camel_case_types)]
pub struct InstanceFpV1_0{
pub instance_fn: vk::InstanceFn
pub struct InstanceFpV1_0 {
pub instance_fn: vk::InstanceFn,
}
#[derive(Clone)]
pub struct Instance<V: VkVersion> {
handle: vk::Instance,
instance_fp: V::InstanceFp
instance_fp: V::InstanceFp,
}
impl InstanceV1_0 for Instance<V1_0>{
fn handle(&self) -> vk::Instance{
impl InstanceV1_0 for Instance<V1_0> {
fn handle(&self) -> vk::Instance {
self.handle
}
fn fp_v1_0(&self) -> &vk::InstanceFn{
fn fp_v1_0(&self) -> &vk::InstanceFn {
&self.instance_fp.instance_fn
}
}
@ -53,21 +52,17 @@ impl<V: VkVersion> Instance<V> {
pub fn from_raw(handle: vk::Instance, version: V::InstanceFp) -> Self {
Instance {
handle: handle,
instance_fp: version
instance_fp: version,
}
}
}
#[warn(non_camel_case_types)]
pub trait InstanceV1_0 {
fn handle(&self) -> vk::Instance;
fn fp_v1_0(&self) -> &vk::InstanceFn;
unsafe fn create_device(&self,
physical_device: vk::PhysicalDevice,
create_info: &vk::DeviceCreateInfo,
allocation_callbacks: Option<&vk::AllocationCallbacks>)
-> Result<Device, DeviceError> {
impl Instance<V1_0> {
pub unsafe fn create_device(&self,
physical_device: vk::PhysicalDevice,
create_info: &vk::DeviceCreateInfo,
allocation_callbacks: Option<&vk::AllocationCallbacks>)
-> Result<Device<V1_0>, DeviceError> {
let mut device: vk::Device = mem::uninitialized();
let err_code = self.fp_v1_0()
.create_device(physical_device,
@ -80,12 +75,18 @@ pub trait InstanceV1_0 {
let device_fn = vk::DeviceFn::load(|name| {
mem::transmute(self.fp_v1_0().get_device_proc_addr(device, name.as_ptr()))
}).map_err(|err| DeviceError::LoadError(err))?;
Ok(Device::from_raw(device, device_fn))
Ok(Device::from_raw(device, DeviceFpV1_0 { device_fn: device_fn }))
}
}
#[warn(non_camel_case_types)]
pub trait InstanceV1_0 {
fn handle(&self) -> vk::Instance;
fn fp_v1_0(&self) -> &vk::InstanceFn;
fn get_device_proc_addr(&self,
device: vk::Device,
p_name: *const vk::c_char)
-> vk::PFN_vkVoidFunction {
device: vk::Device,
p_name: *const vk::c_char)
-> vk::PFN_vkVoidFunction {
unsafe { self.fp_v1_0().get_device_proc_addr(device, p_name) }
}
@ -94,9 +95,9 @@ pub trait InstanceV1_0 {
}
fn get_physical_device_format_properties(&self,
physical_device: vk::PhysicalDevice,
format: vk::Format)
-> vk::FormatProperties {
physical_device: vk::PhysicalDevice,
format: vk::Format)
-> vk::FormatProperties {
unsafe {
let mut format_prop = mem::uninitialized();
self.fp_v1_0()
@ -105,8 +106,8 @@ pub trait InstanceV1_0 {
}
}
fn get_physical_device_memory_properties(&self,
physical_device: vk::PhysicalDevice)
-> vk::PhysicalDeviceMemoryProperties {
physical_device: vk::PhysicalDevice)
-> vk::PhysicalDeviceMemoryProperties {
unsafe {
let mut memory_prop = mem::uninitialized();
self.fp_v1_0()
@ -116,8 +117,8 @@ pub trait InstanceV1_0 {
}
fn get_physical_device_queue_family_properties(&self,
physical_device: vk::PhysicalDevice)
-> Vec<vk::QueueFamilyProperties> {
physical_device: vk::PhysicalDevice)
-> Vec<vk::QueueFamilyProperties> {
unsafe {
let mut queue_count = 0;
self.fp_v1_0()
@ -176,6 +177,5 @@ pub trait InstanceV1_0 {
}
}
//pub trait InstanceMajor1Minor1: InstanceMajor1Minor0 {}
//pub trait InstanceMajor1Minor2: InstanceMajor1Minor1 {}
// pub trait InstanceMajor1Minor1: InstanceMajor1Minor0 {}
// pub trait InstanceMajor1Minor2: InstanceMajor1Minor1 {}