1#![deny(clippy::use_self)]
2#![warn(trivial_casts, trivial_numeric_casts)]
3#![allow(
4 clippy::too_many_arguments,
5 clippy::missing_safety_doc,
6 clippy::upper_case_acronyms
7)]
8#![cfg_attr(docsrs, feature(doc_cfg))]
9pub use crate::device::Device;
38pub use crate::entry::Entry;
39#[cfg(feature = "loaded")]
40pub use crate::entry::LoadingError;
41pub use crate::instance::Instance;
42
43mod device;
44mod entry;
45mod instance;
46pub mod prelude;
47pub mod util;
48#[macro_use]
50pub mod vk;
51
52pub mod extensions;
55
56pub trait RawPtr<T> {
57 fn as_raw_ptr(&self) -> *const T;
58}
59
60impl<'r, T> RawPtr<T> for Option<&'r T> {
61 fn as_raw_ptr(&self) -> *const T {
62 match *self {
63 Some(inner) => inner,
64 _ => ::std::ptr::null(),
65 }
66 }
67}
68
69#[cfg(test)]
70mod tests {
71 use super::vk;
72 #[test]
73 fn test_ptr_chains() {
74 let mut variable_pointers = vk::PhysicalDeviceVariablePointerFeatures::builder();
75 let mut corner = vk::PhysicalDeviceCornerSampledImageFeaturesNV::builder();
76 let chain = vec![
77 <*mut _>::cast(&mut variable_pointers),
78 <*mut _>::cast(&mut corner),
79 ];
80 let mut device_create_info = vk::DeviceCreateInfo::builder()
81 .push_next(&mut corner)
82 .push_next(&mut variable_pointers);
83 let chain2: Vec<*mut vk::BaseOutStructure> = unsafe {
84 vk::ptr_chain_iter(&mut device_create_info)
85 .skip(1)
86 .collect()
87 };
88 assert_eq!(chain, chain2);
89 }
90}