Read me update
This commit is contained in:
parent
72f85fc77f
commit
4edadcdf4a
102
README.md
102
README.md
|
@ -1,5 +1,103 @@
|
||||||
#ASH
|
#ASH
|
||||||
|
|
||||||
An experimental wrapper for Vulkan. This library is not stable use [Vulkano](https://github.com/tomaka/vulkano) instead.
|
A low level Vulkan wrapper for Rust
|
||||||
|
|
||||||
The main goal for this library is to familiarize myself with Vulkan.
|
|
||||||
|
## Why ASH?
|
||||||
|
|
||||||
|
Functions return a `type VkResult<T> = Result<T, vk::Result>` instead of an error code. No mutable references for the output are required.
|
||||||
|
```Rust
|
||||||
|
pub fn create_swapchain_khr(&self,
|
||||||
|
create_info: &vk::SwapchainCreateInfoKHR)
|
||||||
|
-> VkResult<vk::SwapchainKHR>;
|
||||||
|
let swapchain = device.create_swapchain_khr(&swapchain_create_info).unwrap();
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
Always returns a `Vec<T>` for functions that output multiple values.
|
||||||
|
```Rust
|
||||||
|
pub fn get_swapchain_images_khr(&self,
|
||||||
|
swapchain: vk::SwapchainKHR)
|
||||||
|
-> VkResult<Vec<vk::Image>>;
|
||||||
|
let present_images = device.get_swapchain_images_khr(swapchain).unwrap();
|
||||||
|
```
|
||||||
|
Ash uses always uses slices in functions.
|
||||||
|
```Rust
|
||||||
|
// C
|
||||||
|
void vkCmdPipelineBarrier(
|
||||||
|
VkCommandBuffer commandBuffer,
|
||||||
|
VkPipelineStageFlags srcStageMask,
|
||||||
|
VkPipelineStageFlags dstStageMask,
|
||||||
|
VkDependencyFlags dependencyFlags,
|
||||||
|
uint32_t memoryBarrierCount,
|
||||||
|
const VkMemoryBarrier* pMemoryBarriers,
|
||||||
|
uint32_t bufferMemoryBarrierCount,
|
||||||
|
const VkBufferMemoryBarrier* pBufferMemoryBarriers,
|
||||||
|
uint32_t imageMemoryBarrierCount,
|
||||||
|
const VkImageMemoryBarrier* pImageMemoryBarriers);
|
||||||
|
|
||||||
|
// Rust
|
||||||
|
pub fn cmd_pipeline_barrier(&self,
|
||||||
|
command_buffer: vk::CommandBuffer,
|
||||||
|
src_stage_mask: vk::PipelineStageFlags,
|
||||||
|
dst_stage_mask: vk::PipelineStageFlags,
|
||||||
|
dependency_flags: vk::DependencyFlags,
|
||||||
|
memory_barriers: &[vk::MemoryBarrier],
|
||||||
|
buffer_memory_barriers: &[vk::BufferMemoryBarrier],
|
||||||
|
image_memory_barriers: &[vk::ImageMemoryBarrier]);
|
||||||
|
|
||||||
|
device.cmd_pipeline_barrier(setup_command_buffer,
|
||||||
|
vk::PIPELINE_STAGE_TOP_OF_PIPE_BIT,
|
||||||
|
vk::PIPELINE_STAGE_TOP_OF_PIPE_BIT,
|
||||||
|
vk::DependencyFlags::empty(),
|
||||||
|
&[],
|
||||||
|
&[],
|
||||||
|
&[layout_transition_barrier]);
|
||||||
|
```
|
||||||
|
Ash still uses raw Vulkan structs. The only difference is type safety. Everything that can be an enum is an enum like `vk::StructureType`, flags are implemented similar to the `Bitflags` crate. Ash also follows the Rust style guide. The reason that Ash uses raw Vulkan structs is to be extensible, just like the Vulkan spec.
|
||||||
|
```Rust
|
||||||
|
let pool_create_info = vk::CommandPoolCreateInfo {
|
||||||
|
s_type: vk::StructureType::CommandPoolCreateInfo,
|
||||||
|
p_next: ptr::null(),
|
||||||
|
flags: vk::COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,
|
||||||
|
queue_family_index: queue_family_index,
|
||||||
|
};
|
||||||
|
let pool = device.create_command_pool(&pool_create_info).unwrap();
|
||||||
|
```
|
||||||
|
Ash also takes care of loading the function pointers. Function pointers are split into 3 categories. Entry, Instance and Device. The reason for not loading it into a global is that in Vulkan you can have multiple devices and each device must load its own function pointers.
|
||||||
|
```Rust
|
||||||
|
// Looks for the vulkan lib in your path, alternatively you can supply the path explicitly.
|
||||||
|
let entry = Entry::load_vulkan().unwrap();
|
||||||
|
let instance: Instance = entry.create_instance(&create_info).expect("Instance creation error");
|
||||||
|
let device: Device = instance.create_device(pdevice, &device_create_info)
|
||||||
|
.unwrap();
|
||||||
|
```
|
||||||
|
You don't have to pass an Instance or Device handle anymore, this is done implicitly for you.
|
||||||
|
```Rust
|
||||||
|
// C
|
||||||
|
VkResult vkCreateCommandPool(
|
||||||
|
VkDevice device,
|
||||||
|
const VkCommandPoolCreateInfo* pCreateInfo,
|
||||||
|
const VkAllocationCallbacks* pAllocator,
|
||||||
|
VkCommandPool* pCommandPool);
|
||||||
|
|
||||||
|
// Rust
|
||||||
|
pub fn create_command_pool(&self,
|
||||||
|
create_info: &vk::CommandPoolCreateInfo)
|
||||||
|
-> VkResult<vk::CommandPool>;
|
||||||
|
|
||||||
|
let pool = device.create_command_pool(&pool_create_info).unwrap();
|
||||||
|
```
|
||||||
|
```Rust
|
||||||
|
```
|
||||||
|
```Rust
|
||||||
|
```
|
||||||
|
## Complete
|
||||||
|
|
||||||
|
## In progress
|
||||||
|
|
||||||
|
- Wrapping the complete spec
|
||||||
|
- Optional extension loading
|
||||||
|
|
||||||
|
## Not started
|
||||||
|
- Custom allocators
|
||||||
|
|
|
@ -1,14 +1,16 @@
|
||||||
#![allow(dead_code)]
|
#![allow(dead_code)]
|
||||||
|
use prelude::*;
|
||||||
use std::ptr;
|
use std::ptr;
|
||||||
use std::mem;
|
use std::mem;
|
||||||
use vk_loader2 as vk;
|
use vk_loader2 as vk;
|
||||||
|
|
||||||
type VkResult<T> = Result<T, vk::Result>;
|
|
||||||
pub struct Device<'r> {
|
pub struct Device<'r> {
|
||||||
handle: vk::Device,
|
handle: vk::Device,
|
||||||
device_fn: vk::DeviceFn,
|
device_fn: vk::DeviceFn,
|
||||||
_lifetime: ::std::marker::PhantomData<&'r ()>,
|
_lifetime: ::std::marker::PhantomData<&'r ()>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'r> Device<'r> {
|
impl<'r> Device<'r> {
|
||||||
pub unsafe fn from_raw(handle: vk::Device, device_fn: vk::DeviceFn) -> Self {
|
pub unsafe fn from_raw(handle: vk::Device, device_fn: vk::DeviceFn) -> Self {
|
||||||
Device {
|
Device {
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
|
use prelude::*;
|
||||||
use std::mem;
|
use std::mem;
|
||||||
use std::ptr;
|
use std::ptr;
|
||||||
use vk_loader2 as vk;
|
use vk_loader2 as vk;
|
||||||
use instance::Instance;
|
use instance::Instance;
|
||||||
use shared_library::dynamic_library::DynamicLibrary;
|
use shared_library::dynamic_library::DynamicLibrary;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
type VkResult<T> = Result<T, vk::Result>;
|
|
||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
fn get_path() -> &'static Path {
|
fn get_path() -> &'static Path {
|
||||||
Path::new("vulkan-1.dll")
|
Path::new("vulkan-1.dll")
|
||||||
|
@ -34,53 +34,55 @@ pub enum LoadingError {
|
||||||
EntryLoadError(String),
|
EntryLoadError(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum InstanceError {
|
||||||
|
LoadError(String),
|
||||||
|
VkError(vk::Result),
|
||||||
|
}
|
||||||
|
|
||||||
impl Entry {
|
impl Entry {
|
||||||
pub fn load_vulkan_path(path: &Path) -> Result<Entry, LoadingError> {
|
pub fn load_vulkan_path(path: &Path) -> Result<Entry, LoadingError> {
|
||||||
let lib = try!(DynamicLibrary::open(Some(path))
|
let lib =
|
||||||
.map_err(|err| LoadingError::LibraryLoadFailure(err)));
|
DynamicLibrary::open(Some(path)).map_err(|err| LoadingError::LibraryLoadFailure(err))?;
|
||||||
let static_fn = try!(vk::StaticFn::load(|name| unsafe {
|
let static_fn = vk::StaticFn::load(|name| unsafe {
|
||||||
let name = name.to_str().unwrap();
|
let name = name.to_str().unwrap();
|
||||||
let f = match lib.symbol(name) {
|
let f = match lib.symbol(name) {
|
||||||
Ok(s) => s,
|
Ok(s) => s,
|
||||||
Err(_) => ptr::null(),
|
Err(_) => ptr::null(),
|
||||||
};
|
};
|
||||||
f
|
f
|
||||||
})
|
}).map_err(|err| LoadingError::StaticLoadError(err))?;
|
||||||
.map_err(|err| LoadingError::StaticLoadError(err)));
|
let entry_fn = vk::EntryFn::load(|name| unsafe {
|
||||||
let entry_fn = try!(vk::EntryFn::load(|name| unsafe {
|
|
||||||
mem::transmute(static_fn.get_instance_proc_addr(ptr::null_mut(), name.as_ptr()))
|
mem::transmute(static_fn.get_instance_proc_addr(ptr::null_mut(), name.as_ptr()))
|
||||||
})
|
}).map_err(|err| LoadingError::EntryLoadError(err))?;
|
||||||
.map_err(|err| LoadingError::EntryLoadError(err)));
|
|
||||||
Ok(Entry {
|
Ok(Entry {
|
||||||
lib: lib,
|
lib: lib,
|
||||||
static_fn: static_fn,
|
static_fn: static_fn,
|
||||||
entry_fn: entry_fn,
|
entry_fn: entry_fn,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn load_vulkan() -> Result<Entry, LoadingError> {
|
pub fn load_vulkan() -> Result<Entry, LoadingError> {
|
||||||
Entry::load_vulkan_path(get_path())
|
Entry::load_vulkan_path(get_path())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pub fn create_instance(&self,
|
pub fn create_instance(&self,
|
||||||
create_info: &vk::InstanceCreateInfo)
|
create_info: &vk::InstanceCreateInfo)
|
||||||
-> Result<Instance, vk::Result> {
|
-> Result<Instance, InstanceError> {
|
||||||
unsafe {
|
unsafe {
|
||||||
let mut instance: vk::Instance = mem::uninitialized();
|
let mut instance: vk::Instance = mem::uninitialized();
|
||||||
let err_code = self.entry_fn.create_instance(create_info, ptr::null(), &mut instance);
|
let err_code = self.entry_fn.create_instance(create_info, ptr::null(), &mut instance);
|
||||||
if err_code != vk::Result::Success {
|
if err_code != vk::Result::Success {
|
||||||
return Err(err_code);
|
return Err(InstanceError::VkError(err_code));
|
||||||
}
|
}
|
||||||
let instance_fn = vk::InstanceFn::load(|name| unsafe {
|
let instance_fn = vk::InstanceFn::load(|name| unsafe {
|
||||||
mem::transmute(self.static_fn.get_instance_proc_addr(instance, name.as_ptr()))
|
mem::transmute(self.static_fn.get_instance_proc_addr(instance, name.as_ptr()))
|
||||||
})
|
}).map_err(|err| InstanceError::LoadError(err))?;
|
||||||
.unwrap();
|
|
||||||
Ok(Instance::from_raw(instance, instance_fn))
|
Ok(Instance::from_raw(instance, instance_fn))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn enumerate_instance_layer_properties(&self)
|
pub fn enumerate_instance_layer_properties(&self) -> VkResult<Vec<vk::LayerProperties>> {
|
||||||
-> Result<Vec<vk::LayerProperties>, vk::Result> {
|
|
||||||
unsafe {
|
unsafe {
|
||||||
let mut num = 0;
|
let mut num = 0;
|
||||||
self.entry_fn.enumerate_instance_layer_properties(&mut num, ptr::null_mut());
|
self.entry_fn.enumerate_instance_layer_properties(&mut num, ptr::null_mut());
|
||||||
|
@ -96,9 +98,8 @@ impl Entry {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn enumerate_instance_extension_properties
|
pub fn enumerate_instance_extension_properties(&self)
|
||||||
(&self)
|
-> VkResult<Vec<vk::ExtensionProperties>> {
|
||||||
-> Result<Vec<vk::ExtensionProperties>, vk::Result> {
|
|
||||||
unsafe {
|
unsafe {
|
||||||
let mut num = 0;
|
let mut num = 0;
|
||||||
self.entry_fn
|
self.entry_fn
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#![allow(dead_code)]
|
#![allow(dead_code)]
|
||||||
|
use prelude::*;
|
||||||
use std::ptr;
|
use std::ptr;
|
||||||
use std::mem;
|
use std::mem;
|
||||||
use std::os::raw::*;
|
use std::os::raw::*;
|
||||||
|
@ -7,8 +8,11 @@ use vk_loader2 as vk;
|
||||||
use device::Device;
|
use device::Device;
|
||||||
use shared_library::dynamic_library::DynamicLibrary;
|
use shared_library::dynamic_library::DynamicLibrary;
|
||||||
|
|
||||||
type VkResult<T> = Result<T, vk::Result>;
|
#[derive(Debug)]
|
||||||
|
pub enum DeviceError {
|
||||||
|
LoadError(String),
|
||||||
|
VkError(vk::Result),
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Instance<'r> {
|
pub struct Instance<'r> {
|
||||||
|
@ -16,6 +20,7 @@ pub struct Instance<'r> {
|
||||||
instance_fn: vk::InstanceFn,
|
instance_fn: vk::InstanceFn,
|
||||||
_lifetime: ::std::marker::PhantomData<&'r ()>,
|
_lifetime: ::std::marker::PhantomData<&'r ()>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'r> Instance<'r> {
|
impl<'r> Instance<'r> {
|
||||||
pub unsafe fn from_raw(handle: vk::Instance, instance_fn: vk::InstanceFn) -> Self {
|
pub unsafe fn from_raw(handle: vk::Instance, instance_fn: vk::InstanceFn) -> Self {
|
||||||
Instance {
|
Instance {
|
||||||
|
@ -25,6 +30,24 @@ impl<'r> Instance<'r> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn create_device(&self,
|
||||||
|
physical_device: vk::PhysicalDevice,
|
||||||
|
create_info: &vk::DeviceCreateInfo)
|
||||||
|
-> Result<Device, DeviceError> {
|
||||||
|
unsafe {
|
||||||
|
let mut device = mem::uninitialized();
|
||||||
|
let err_code = self.instance_fn
|
||||||
|
.create_device(physical_device, create_info, ptr::null(), &mut device);
|
||||||
|
if err_code != vk::Result::Success {
|
||||||
|
return Err(DeviceError::VkError(err_code));
|
||||||
|
}
|
||||||
|
let device_fn = vk::DeviceFn::load(|name| unsafe {
|
||||||
|
mem::transmute(self.instance_fn.get_device_proc_addr(device, name.as_ptr()))
|
||||||
|
}).map_err(|err| DeviceError::LoadError(err))?;
|
||||||
|
Ok(Device::from_raw(device, device_fn))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn destroy_instance(&self) {
|
pub fn destroy_instance(&self) {
|
||||||
unsafe {
|
unsafe {
|
||||||
self.instance_fn.destroy_instance(self.handle, ptr::null());
|
self.instance_fn.destroy_instance(self.handle, ptr::null());
|
||||||
|
@ -186,24 +209,6 @@ impl<'r> Instance<'r> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn create_device(&self,
|
|
||||||
physical_device: vk::PhysicalDevice,
|
|
||||||
create_info: &vk::DeviceCreateInfo)
|
|
||||||
-> VkResult<Device> {
|
|
||||||
unsafe {
|
|
||||||
let mut device = mem::uninitialized();
|
|
||||||
let err_code = self.instance_fn
|
|
||||||
.create_device(physical_device, create_info, ptr::null(), &mut device);
|
|
||||||
if err_code != vk::Result::Success {
|
|
||||||
return Err(err_code);
|
|
||||||
}
|
|
||||||
let device_fn = vk::DeviceFn::load(|name| unsafe {
|
|
||||||
mem::transmute(self.instance_fn.get_device_proc_addr(device, name.as_ptr()))
|
|
||||||
})
|
|
||||||
.unwrap();
|
|
||||||
Ok(Device::from_raw(device, device_fn))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn enumerate_physical_devices(&self) -> VkResult<Vec<vk::PhysicalDevice>> {
|
pub fn enumerate_physical_devices(&self) -> VkResult<Vec<vk::PhysicalDevice>> {
|
||||||
unsafe {
|
unsafe {
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate shared_library;
|
extern crate shared_library;
|
||||||
extern crate vk_loader;
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate vk_loader2;
|
extern crate vk_loader2;
|
||||||
extern crate glfw;
|
|
||||||
|
|
||||||
pub mod instance;
|
pub mod instance;
|
||||||
pub mod device;
|
pub mod device;
|
||||||
pub mod entry;
|
pub mod entry;
|
||||||
|
pub mod prelude;
|
||||||
|
|
2
ash/src/prelude.rs
Normal file
2
ash/src/prelude.rs
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
use vk_loader2;
|
||||||
|
pub type VkResult<T> = Result<T, vk_loader2::Result>;
|
34
examples/Cargo.lock
generated
34
examples/Cargo.lock
generated
|
@ -4,7 +4,6 @@ version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ash 0.1.0",
|
"ash 0.1.0",
|
||||||
"glfw 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"glfw 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"vk_loader 0.1.0",
|
"vk_loader 0.1.0",
|
||||||
"vk_loader2 0.1.0",
|
"vk_loader2 0.1.0",
|
||||||
]
|
]
|
||||||
|
@ -69,15 +68,6 @@ dependencies = [
|
||||||
"cmake 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cmake 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "kernel32-sys"
|
|
||||||
version = "0.2.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lazy_static"
|
name = "lazy_static"
|
||||||
version = "0.2.1"
|
version = "0.2.1"
|
||||||
|
@ -194,16 +184,6 @@ dependencies = [
|
||||||
"libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "time"
|
|
||||||
version = "0.1.35"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "vk_loader"
|
name = "vk_loader"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
@ -218,16 +198,6 @@ dependencies = [
|
||||||
"shared_library 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"shared_library 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "winapi"
|
|
||||||
version = "0.2.8"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "winapi-build"
|
|
||||||
version = "0.1.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
|
|
||||||
[metadata]
|
[metadata]
|
||||||
"checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d"
|
"checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d"
|
||||||
"checksum cmake 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "dfcf5bcece56ef953b8ea042509e9dcbdfe97820b7e20d86beb53df30ed94978"
|
"checksum cmake 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "dfcf5bcece56ef953b8ea042509e9dcbdfe97820b7e20d86beb53df30ed94978"
|
||||||
|
@ -235,7 +205,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
"checksum gcc 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)" = "dcb000abd6df9df4c637f75190297ebe56c1d7e66b56bbf3b4aa7aece15f61a2"
|
"checksum gcc 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)" = "dcb000abd6df9df4c637f75190297ebe56c1d7e66b56bbf3b4aa7aece15f61a2"
|
||||||
"checksum glfw 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b14e68c4ccefdf293ecb65390a5761971b83fcfc54d153a5b73d438327633965"
|
"checksum glfw 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b14e68c4ccefdf293ecb65390a5761971b83fcfc54d153a5b73d438327633965"
|
||||||
"checksum glfw-sys 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eaff144079cb22d6f17009e29e87c02f5fd6c4669093ce12b0b2faa6027f0d23"
|
"checksum glfw-sys 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eaff144079cb22d6f17009e29e87c02f5fd6c4669093ce12b0b2faa6027f0d23"
|
||||||
"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
|
|
||||||
"checksum lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "49247ec2a285bb3dcb23cbd9c35193c025e7251bfce77c1d5da97e6362dffe7f"
|
"checksum lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "49247ec2a285bb3dcb23cbd9c35193c025e7251bfce77c1d5da97e6362dffe7f"
|
||||||
"checksum libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)" = "23e3757828fa702a20072c37ff47938e9dd331b92fac6e223d26d4b7a55f7ee2"
|
"checksum libc 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)" = "23e3757828fa702a20072c37ff47938e9dd331b92fac6e223d26d4b7a55f7ee2"
|
||||||
"checksum log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ab83497bf8bf4ed2a74259c1c802351fcd67a65baa86394b6ba73c36f4838054"
|
"checksum log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ab83497bf8bf4ed2a74259c1c802351fcd67a65baa86394b6ba73c36f4838054"
|
||||||
|
@ -251,6 +220,3 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
"checksum rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "6159e4e6e559c81bd706afe9c8fd68f547d3e851ce12e76b1de7914bab61691b"
|
"checksum rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "6159e4e6e559c81bd706afe9c8fd68f547d3e851ce12e76b1de7914bab61691b"
|
||||||
"checksum semver 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2d5b7638a1f03815d94e88cb3b3c08e87f0db4d683ef499d1836aaf70a45623f"
|
"checksum semver 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2d5b7638a1f03815d94e88cb3b3c08e87f0db4d683ef499d1836aaf70a45623f"
|
||||||
"checksum shared_library 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fb04126b6fcfd2710fb5b6d18f4207b6c535f2850a7e1a43bcd526d44f30a79a"
|
"checksum shared_library 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fb04126b6fcfd2710fb5b6d18f4207b6c535f2850a7e1a43bcd526d44f30a79a"
|
||||||
"checksum time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "3c7ec6d62a20df54e07ab3b78b9a3932972f4b7981de295563686849eb3989af"
|
|
||||||
"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
|
|
||||||
"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ authors = ["maik klein <maikklein@googlemail.com>"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
glfw = "0.9.1"
|
glfw = "0.9.1"
|
||||||
time = "0.1"
|
|
||||||
vk_loader = { version = "0.1.0", path = "../vk_loader"}
|
vk_loader = { version = "0.1.0", path = "../vk_loader"}
|
||||||
vk_loader2 = { version = "0.1.0", path = "../vk_loader2"}
|
vk_loader2 = { version = "0.1.0", path = "../vk_loader2"}
|
||||||
ash = { version = "0.1.0", path = "../ash"}
|
ash = { version = "0.1.0", path = "../ash"}
|
||||||
|
|
|
@ -5,7 +5,6 @@ extern crate ash;
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate vk_loader2 as vk;
|
extern crate vk_loader2 as vk;
|
||||||
extern crate glfw;
|
extern crate glfw;
|
||||||
extern crate time;
|
|
||||||
|
|
||||||
use std::default::Default;
|
use std::default::Default;
|
||||||
use glfw::*;
|
use glfw::*;
|
||||||
|
@ -44,6 +43,20 @@ fn create_surface(instance: &Instance, window: &Window) -> Result<vk::SurfaceKHR
|
||||||
instance.create_xlib_surface_khr(&x11_create_info)
|
instance.create_xlib_surface_khr(&x11_create_info)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(all(unix, not(target_os = "android")))]
|
||||||
|
fn extension_names() -> Vec<CString> {
|
||||||
|
vec![CString::new("VK_KHR_surface").unwrap(),
|
||||||
|
CString::new("VK_KHR_xlib_surface").unwrap(),
|
||||||
|
CString::new("VK_EXT_debug_report").unwrap()]
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(all(windows))]
|
||||||
|
fn extension_names() -> Vec<CString> {
|
||||||
|
vec![CString::new("VK_KHR_surface").unwrap(),
|
||||||
|
CString::new("VK_KHR_win32_surface").unwrap(),
|
||||||
|
CString::new("VK_EXT_debug_report").unwrap()]
|
||||||
|
}
|
||||||
|
|
||||||
unsafe extern "system" fn vulkan_debug_callback(flags: vk::DebugReportFlagsEXT,
|
unsafe extern "system" fn vulkan_debug_callback(flags: vk::DebugReportFlagsEXT,
|
||||||
obj_type: vk::DebugReportObjectTypeEXT,
|
obj_type: vk::DebugReportObjectTypeEXT,
|
||||||
obj: u64,
|
obj: u64,
|
||||||
|
@ -76,6 +89,7 @@ pub fn find_memorytype_index(memory_req: &vk::MemoryRequirements,
|
||||||
}
|
}
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Copy)]
|
#[derive(Clone, Debug, Copy)]
|
||||||
struct Vertex {
|
struct Vertex {
|
||||||
pos: [f32; 4],
|
pos: [f32; 4],
|
||||||
|
@ -106,9 +120,7 @@ fn main() {
|
||||||
let layers_names_raw: Vec<*const i8> = layer_names.iter()
|
let layers_names_raw: Vec<*const i8> = layer_names.iter()
|
||||||
.map(|raw_name| raw_name.as_ptr())
|
.map(|raw_name| raw_name.as_ptr())
|
||||||
.collect();
|
.collect();
|
||||||
let extension_names = [CString::new("VK_KHR_surface").unwrap(),
|
let extension_names = extension_names();
|
||||||
CString::new("VK_KHR_xlib_surface").unwrap(),
|
|
||||||
CString::new("VK_EXT_debug_report").unwrap()];
|
|
||||||
let extension_names_raw: Vec<*const i8> = extension_names.iter()
|
let extension_names_raw: Vec<*const i8> = extension_names.iter()
|
||||||
.map(|raw_name| raw_name.as_ptr())
|
.map(|raw_name| raw_name.as_ptr())
|
||||||
.collect();
|
.collect();
|
||||||
|
@ -141,16 +153,6 @@ fn main() {
|
||||||
p_user_data: ptr::null_mut(),
|
p_user_data: ptr::null_mut(),
|
||||||
};
|
};
|
||||||
let debug_call_back = instance.create_debug_report_callback_ext(&debug_info).unwrap();
|
let debug_call_back = instance.create_debug_report_callback_ext(&debug_info).unwrap();
|
||||||
//let x11_display = window.glfw.get_x11_display();
|
|
||||||
//let x11_window = window.get_x11_window();
|
|
||||||
//let x11_create_info = vk::XlibSurfaceCreateInfoKHR {
|
|
||||||
// s_type: vk::StructureType::XlibSurfaceCreateInfoKhr,
|
|
||||||
// p_next: ptr::null(),
|
|
||||||
// flags: Default::default(),
|
|
||||||
// window: x11_window as vk::Window,
|
|
||||||
// dpy: x11_display as *mut vk::Display,
|
|
||||||
//};
|
|
||||||
//let surface = instance.create_xlib_surface_khr(&x11_create_info).unwrap();
|
|
||||||
let surface = create_surface(&instance, &window).unwrap();
|
let surface = create_surface(&instance, &window).unwrap();
|
||||||
let pdevices = instance.enumerate_physical_devices().expect("Physical device error");
|
let pdevices = instance.enumerate_physical_devices().expect("Physical device error");
|
||||||
let (pdevice, queue_family_index) = pdevices.iter()
|
let (pdevice, queue_family_index) = pdevices.iter()
|
||||||
|
@ -815,19 +817,12 @@ fn main() {
|
||||||
let present_complete_semaphore = device.create_semaphore(&semaphore_create_info).unwrap();
|
let present_complete_semaphore = device.create_semaphore(&semaphore_create_info).unwrap();
|
||||||
let rendering_complete_semaphore = device.create_semaphore(&semaphore_create_info).unwrap();
|
let rendering_complete_semaphore = device.create_semaphore(&semaphore_create_info).unwrap();
|
||||||
|
|
||||||
let mut current = time::precise_time_ns();
|
|
||||||
let mut last = current;
|
|
||||||
let draw_fence = device.create_fence(&fence_create_info).unwrap();
|
let draw_fence = device.create_fence(&fence_create_info).unwrap();
|
||||||
while !window.should_close() {
|
while !window.should_close() {
|
||||||
glfw.poll_events();
|
glfw.poll_events();
|
||||||
|
|
||||||
for (_, event) in glfw::flush_messages(&events) {
|
for (_, event) in glfw::flush_messages(&events) {
|
||||||
handle_window_event(&mut window, event);
|
handle_window_event(&mut window, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
current = time::precise_time_ns();
|
|
||||||
let dt = current - last;
|
|
||||||
last = current;
|
|
||||||
let present_index = device.acquire_next_image_khr(swapchain,
|
let present_index = device.acquire_next_image_khr(swapchain,
|
||||||
std::u64::MAX,
|
std::u64::MAX,
|
||||||
present_complete_semaphore,
|
present_complete_semaphore,
|
||||||
|
|
Loading…
Reference in a new issue