ash/
lib.rs

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))]
9//! # Vulkan API
10//!
11//! <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/html/index.html>
12//!
13//! ## Examples
14//!
15//! ```no_run
16//! use ash::{vk, Entry};
17//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
18//! let entry = Entry::linked();
19//! let app_info = vk::ApplicationInfo {
20//!     api_version: vk::make_api_version(0, 1, 0, 0),
21//!     ..Default::default()
22//! };
23//! let create_info = vk::InstanceCreateInfo {
24//!     p_application_info: &app_info,
25//!     ..Default::default()
26//! };
27//! let instance = unsafe { entry.create_instance(&create_info, None)? };
28//! # Ok(()) }
29//! ```
30//!
31//! ## Getting started
32//!
33//! Load the Vulkan library linked at compile time using [`Entry::linked()`], or load it at runtime
34//! using [`Entry::load()`], which uses `libloading`. If you want to perform entry point loading
35//! yourself, call [`Entry::from_static_fn()`].
36
37pub 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/// Raw Vulkan bindings and types, generated from `vk.xml`
49#[macro_use]
50pub mod vk;
51
52// macros of vk need to be defined beforehand
53/// Wrappers for Vulkan extensions
54pub 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}