#[macro_use]
extern crate log;
#[macro_use]
extern crate lazy_static;
#[cfg(unix)]
extern crate libc;
#[cfg(windows)]
extern crate winapi;
#[cfg(windows)]
extern crate kernel32;
macro_rules! vk_make_version {
( $major:expr, $minor:expr, $patch:expr ) => {
$crate::util::VkVersion(($major << 22) | ($minor << 12) | $patch)
};
}
macro_rules! vk_define_bitmask {
( $bitmask_ty:ident, $enum_type:ty, $mask:expr ) => {
pub type $bitmask_ty = VkFlags<$enum_type>;
impl $enum_type {
#[inline]
pub fn flags(self) -> $bitmask_ty {
$bitmask_ty::one(self)
}
}
impl $crate::util::VkFlagBits for $enum_type {
const ALL_VALUE : u32 = $mask;
#[inline]
fn value(self) -> u32 {
self as u32
}
#[inline]
fn from_value(value: u32) -> Option<$enum_type> {
if (value & !Self::ALL_VALUE) != 0 || value.count_ones() != 1 {
return None;
}
unsafe { Some(::std::mem::transmute(value)) }
}
}
impl ::std::ops::BitAnd<$enum_type> for $enum_type {
type Output = $bitmask_ty;
#[inline]
fn bitand(self, rhs: $enum_type) -> $bitmask_ty {
$bitmask_ty::one(self) & rhs
}
}
impl ::std::ops::BitOr<$enum_type> for $enum_type {
type Output = $bitmask_ty;
#[inline]
fn bitor(self, rhs: $enum_type) -> $bitmask_ty {
$bitmask_ty::one(self) | rhs
}
}
impl ::std::ops::BitAnd<$bitmask_ty> for $enum_type {
type Output = $bitmask_ty;
#[inline]
fn bitand(self, rhs: $bitmask_ty) -> $bitmask_ty {
$bitmask_ty::one(self) & rhs
}
}
impl ::std::ops::BitOr<$bitmask_ty> for $enum_type {
type Output = $bitmask_ty;
#[inline]
fn bitor(self, rhs: $bitmask_ty) -> $bitmask_ty {
$bitmask_ty::one(self) | rhs
}
}
};
( $bitmask_ty:ident ) => {
pub type $bitmask_ty = $crate::util::VkFlags;
};
}
macro_rules! vk_define_handle {
( $name:ident ) => {
#[repr(C)]
#[derive(Copy,Clone,PartialEq,Eq,Default,Debug)]
pub struct $name ($crate::util::VkDispatchableHandle);
impl $crate::util::VkNullHandle for $name {
const NULL : $name = $name($crate::util::VkDispatchableHandle::NULL);
}
impl ::std::fmt::Display for $name {
#[inline]
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
write!(f, "{}", self.0)
}
}
impl ::std::fmt::Pointer for $name {
#[inline]
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
write!(f, "{:p}", self.0)
}
}
impl ::std::fmt::LowerHex for $name {
#[inline]
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
write!(f, "{:x}", self.0)
}
}
impl ::std::fmt::UpperHex for $name {
#[inline]
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
write!(f, "{:X}", self.0)
}
}
};
}
macro_rules! vk_define_non_dispatchable_handle {
( $name:ident ) => {
#[repr(C)]
#[derive(Copy,Clone,PartialEq,Eq,Default,Debug)]
pub struct $name ($crate::util::VkNonDispatchableHandle);
impl $crate::util::VkNullHandle for $name {
const NULL : $name = $name($crate::util::VkNonDispatchableHandle::NULL);
}
impl ::std::fmt::Display for $name {
#[inline]
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
write!(f, "{}", self.0)
}
}
impl ::std::fmt::Pointer for $name {
#[inline]
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
write!(f, "{:p}", self.0)
}
}
impl ::std::fmt::LowerHex for $name {
#[inline]
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
write!(f, "{:x}", self.0)
}
}
impl ::std::fmt::UpperHex for $name {
#[inline]
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
write!(f, "{:X}", self.0)
}
}
};
}
pub mod platform;
pub mod util;
pub mod cmds;
mod types {
#![allow(non_snake_case)]
include!(concat!(env!("OUT_DIR"), "/types.rs"));
}
pub mod prelude {
include!(concat!(env!("OUT_DIR"), "/prelude.rs"));
}
#[test]
fn test_type_sizes() {
let ptr_size = ::std::mem::size_of::<extern "system" fn()>();
let fnptr_size = ::std::mem::size_of::<extern "system" fn()>();
assert_eq!(4, ::std::mem::size_of::<util::VkFlags>(), "check flag size");
assert_eq!(4, ::std::mem::size_of::<types::VkColorComponentFlags>(), "check flag size");
assert_eq!(4, ::std::mem::size_of::<types::VkResult>(), "check enum size");
assert_eq!(ptr_size, ::std::mem::size_of::<types::VkDevice>(), "check dispatchable handle size");
assert_eq!(8, ::std::mem::size_of::<types::VkImage>(), "check non-dispatchable handle size");
assert_eq!(fnptr_size, ::std::mem::size_of::<types::PFN_vkVoidFunction>(), "check function pointer size");
}