# `Ash Bootstrap`  [![Latest Version]][crates.io] [![Rustc Version 1.36+]][rustc] ![license]
[Latest Version]: https://img.shields.io/crates/v/ash_bootstrap.svg
[crates.io]: https://crates.io/crates/ash\_bootstrap
[Rustc Version 1.36+]: https://img.shields.io/badge/rustc-1.85+-lightgray.svg
[rustc]: https://blog.rust-lang.org/2025/02/20/Rust-1.85.0/
[license]: https://img.shields.io/badge/license-Apache--2.0_OR_MIT-blue
**Ash Bootstrap** is a utility library that jump starts initialization of Vulkan via the Ash bindings.
```toml
[dependencies]
ash_bootstrap = "0.1.2"
```
## Features
- Streamlined Vulkan initialization: Simplifies instance, device, and queue setup
- Window integration: Built-in support for surface creation via ash-window
- Tracing support: Optional integration with tracing crate
- Portability: macOS compatibility via portability feature
## Usage examples
```rust
fn main() -> anyhow::Result<()> {
let instance = InstanceBuilder::new(None)
.app_name("Example Vulkan Application")
.engine_name("Example Vulkan Engine")
.request_validation_layers(true)
.use_default_tracing_messenger()
.build()?;
let physical_device = PhysicalDeviceSelector::new(instance.clone())
.preferred_device_type(PreferredDeviceType::Discrete)
.select()?;
let device = Arc::new(DeviceBuilder::new(physical_device, instance.clone()).build()?);
// You can get the inner handle that is used by vulkan
// Or you can just pass it where the device handle is expected, because it implements AsRef.
let _device_handle = device.handle();
let (_graphics_queue_index, _graphics_queue) = device.get_queue(QueueType::Graphics)?;
let swapchain_builder = SwapchainBuilder::new(instance.clone(), device.clone());
let swapchain = swapchain_builder.build()?;
// And right now we got rid of 400-500 lines of vulkan boilerplate just like that.
// Now let's cleanup.
swapchain.destroy();
device.destroy();
instance.destroy();
}
```
For more examples make sure to check `examples` directory.