vkgen

Generates Rust source code from vk.xml

Benefits

General information

Usage

Step 1

Download vk.xml from the official Vulkan-Headers repository (https://github.com/KhronosGroup/Vulkan-Headers/blob/master/registry/vk.xml)

Step 2

Generate Rust source code from vk.xml

$ vkgen <input file> <output file>

Arguments
Example

$ vkgen ./vk.xml ./vk.rs

Parse a file called vk.xml which contains the Vulkan registry and output the generated code to vk.rs.

Step 3

Add libloading to your project's cargo.toml [dependencies] libloading = "0.5.0" libloading is used to load vkGetInstanceProcAddr from the Vulkan shared library.

Step 4

Load libvulkan in order to use the generated functions rust unsafe { vkLoad(); } Note: vkLoad() only loads vkGetInstanceProcAddr from the shared library, all other functions are loaded dynamically via vkGetInstanceProcAddr and vkGetDeviceProcAddr to avoid additional dispatch overhead.

Examples

This simple example demonstrates how to load libvulkan on linux, output the instance version (1.1.0) and create an instance. vk.rs is the file containing the generated Rust source code. ```rust mod vk;

use self::vk::*; use std::ptr::null;

fn main() { unsafe { vkLoad(); }

let mut v: u32 = 0;
enumerateInstanceVersion(&mut v);
println!("vulkan instance version is {}.{}.{}", VK_VERSION_MAJOR(v), VK_VERSION_MINOR(v), VK_VERSION_PATCH(v));

let instance_info = VkInstanceCreateInfo {
    sType:                   VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
    pNext:                   null(),
    flags:                   0,
    pApplicationInfo: &VkApplicationInfo {
        sType:              VK_STRUCTURE_TYPE_APPLICATION_INFO,
        pNext:              null(),
        pApplicationName:   b"test app\0".as_ptr(),
        applicationVersion: VK_MAKE_VERSION(0, 0, 1),
        pEngineName:        b"test engine\0".as_ptr(),
        engineVersion:      VK_MAKE_VERSION(0, 0, 1),
        apiVersion:         VK_MAKE_VERSION(1, 1, 0),
    },
    enabledLayerCount:       0,
    ppEnabledLayerNames:     null(),
    enabledExtensionCount:   0,
    ppEnabledExtensionNames: null()
};

let mut instance = VK_NULL_HANDLE;
if createInstance(&instance_info, null(), &mut instance) != VK_SUCCESS {
    panic!("something went wrong :-/");
};
let instance = unsafe { VkInstanceImpl::new(instance) };

}

```