# covk
[](LICENSE-MIT)
[](https://blog.rust-lang.org/2023/04/20/Rust-1.93.0.html)
Unsafe Vulkan bindings for Rust
- `no_std` support
- Vulkan `1.0` `1.1` `1.2` `1.3` `1.4`
- `covk_sys`
[](https://crates.io/crates/covk_sys)
[](https://docs.rs/covk_sys)
Original bindings, pure vulkan style.
- `covk`
[](https://crates.io/crates/covk)
[](https://docs.rs/covk)
- Rust style wrapping
- Prelude
```rust
use covk::prelude::*;
```
- The vulkan loader
```rust
let vk = Vulkan::new()?;
```
- Return the `Result`
```rust
pub unsafe fn create_instance(
&self, create_info: &vk::InstanceCreateInfo,
) -> Result<vk::Instance>;
let inst: vk::Instance = vk.create_instance(&info)?;
```
- NonNull handles
```rust
pub struct Instance(pub NonNull<void>);
```
- RAII handles
```rust
let inst: hnd::Instance = vk.create_instance(&info)?.hnd(&vk);
let _inst = inst.clone();
let raw: vk::Instance = inst.raw();
```
- Query the ext
```rust
let sf: hnd::Instance<vk::khr::surface> = inst.ext::<vk::khr::surface>();
```
- `Vec` on enumerate like api
```rust
pub unsafe fn enumerate_instance_layer_properties(
&self,
properties: Option<&mut Vec<vk::LayerProperties>>,
) -> Result<(u32, vk::Result)>;
let mut layers = vec![];
vk.enumerate_instance_layer_properties(Some(&mut layers))?;
```
- Struct builder
```rust
let app_info: vk::ApplicationInfo = vk::new::ApplicationInfo {
application_version: 0,
engine_version: 0,
api_version: vk::API_VERSION_1_4,
}.new();
let mut info = vk::new::InstanceCreateInfo {
p_enabled_layer_names: &enable_layers,
p_enabled_extension_names: &enabled_exts,
}
.application_info(&app_info);
let mut info = vk::DeviceCreateInfo::default()
.queue_create_infos(&queue_infos)
.p_enabled_extension_names(&enabled_exts)
.enabled_features(&mut features.features);
info.push_next(&mut features_1_4);
let device: hnd::Device = inst.create_device(adapter, &info)?.hnd(&inst.hnd);
let sc: hnd::Device<vk::khr::swapchain> = device.ext::<vk::khr::swapchain>();
let queue: vk::Queue = device.get_queue(main_queue_family, 0);
```
- Object style traits
```rust
pub trait CoreCommandBuffer {
fn raw(&self) -> vk::CommandBuffer;
fn commands(&self) -> &Device;
...
unsafe fn set_viewport(
&self,
first_viewport: uint32_t,
viewports: &[Viewport],
) -> () {
unsafe {
self.commands().cmd_set_viewport(
self.raw(),
first_viewport,
viewports,
)
}
}
...
}
cmd.set_viewport(
0,
&[vk::Viewport {
x: 0.0,
y: height as f32,
width: width as f32,
height: -(height as f32),
min_depth: 0.0,
max_depth: 1.0,
}],
);
```
### Examples
- [covk/examples/cube.rs](./covk/examples/cube.rs)
- [covk_sys/examples/cube.rs](./covk_sys/examples/sys_cube.rs)

### Gen
- Require rust
- Require pwsh
- Require .NET 10
- Require `cargo-edit`
```shell
cargo install cargo-edit
```
```pwsh
./gen.ps1
```