Crates.io | vulkan_raw |
lib.rs | vulkan_raw |
version | 0.1.9 |
source | src |
created_at | 2020-02-18 15:40:00.884022 |
updated_at | 2022-03-27 09:04:43.719896 |
description | A raw Vulkan API bindings for Rust. |
homepage | |
repository | https://github.com/aisinker/vulkan_raw |
max_upload_size | |
id | 210338 |
size | 21,452,093 |
Almost names are the same as the Vulkan C API. But for some simplification reasons, a little change must be taken. The enum
variant name is changed to without VK_
prefix and enum name. For example the VkFormat.VK_FORMAT_UNDEFINED
is changed to VkFormat::UNDEFINED
. Because of language limitations, some exceptions exist. They are the following:
C version | Corresponding vulkan_raw version |
---|---|
VkImageCreateFlagBits.VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT |
VkImageCreateFlagBits::IC_2D_ARRAY_COMPATIBLE_BIT |
VkQueryResultFlagBits.VK_QUERY_RESULT_64_BIT |
VkQueryResultFlagBits::U64_BIT |
VkSampleCountFlagBits.VK_SAMPLE_COUNT_1_BIT |
VkSampleCountFlagBits::SC_1_BIT |
VkSampleCountFlagBits.VK_SAMPLE_COUNT_2_BIT |
VkSampleCountFlagBits::SC_2_BIT |
VkSampleCountFlagBits.VK_SAMPLE_COUNT_4_BIT |
VkSampleCountFlagBits::SC_4_BIT |
VkSampleCountFlagBits.VK_SAMPLE_COUNT_8_BIT |
VkSampleCountFlagBits::SC_8_BIT |
VkSampleCountFlagBits.VK_SAMPLE_COUNT_16_BIT |
VkSampleCountFlagBits::SC_16_BIT |
VkSampleCountFlagBits.VK_SAMPLE_COUNT_32_BIT |
VkSampleCountFlagBits::SC_32_BIT |
VkSampleCountFlagBits.VK_SAMPLE_COUNT_64_BIT |
VkSampleCountFlagBits::SC_64_BIT |
VkImageType.VK_IMAGE_TYPE_1D |
VkImageType::IT_1D |
VkImageType.VK_IMAGE_TYPE_2D |
VkImageType::IT_2D |
VkImageType.VK_IMAGE_TYPE_3D |
VkImageType::IT_3D |
VkImageViewType.VK_IMAGE_VIEW_TYPE_1D |
VkImageViewType::IVT_1D |
VkImageViewType.VK_IMAGE_VIEW_TYPE_2D |
VkImageViewType::IVT_2D |
VkImageViewType.VK_IMAGE_VIEW_TYPE_3D |
VkImageViewType::IVT_3D |
VkImageViewType.VK_IMAGE_VIEW_TYPE_1D_ARRAY |
VkImageViewType::IVT_1D_ARRAY |
VkImageViewType.VK_IMAGE_VIEW_TYPE_2D_ARRAY |
VkImageViewType::IVT_2D_ARRAY |
VkShaderFloatControlsIndependence.VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY |
VkShaderFloatControlsIndependence::F32_BIT_ONLY |
Most functions must need to obtain a corresponding function pointer before use. We provide InstanceLevelFunctions
object and/or DeviceLevelFunctions
object to do this on every module, each one corresponding to the module's functions set. The InstanceLevelFunctions
only can be loaded from VkInstance
, but the DeviceLevelFunctions
also can be loaded from VkDevice
.
All structures have Debug
trait and Default
trait. You don't need to set the sType
field manually if it contains.
use std::ffi::CStr;
use std::ptr;
use vulkan_raw::*;
fn main() {
let mut instance_version: u32 = 0;
unsafe { vkEnumerateInstanceVersion(&mut instance_version) };
println!("Instance version: {}", ApiVersion::from(instance_version));
// Create Vulkan instance
let app_info = VkApplicationInfo {
apiVersion: ApiVersion::new(1, 2, 0).into(),
..Default::default()
};
let create_info = VkInstanceCreateInfo {
pApplicationInfo: &app_info,
..Default::default()
};
let mut instance: VkInstance = VkInstance::none();
let result = unsafe { vkCreateInstance(&create_info, ptr::null(), &mut instance) };
assert_eq!(result, VkResult::SUCCESS);
let functions = InstanceLevelFunctions::load_from_instance(instance);
// Enumerate all devices
let mut count: u32 = 0;
let result =
unsafe { functions.vkEnumeratePhysicalDevices(instance, &mut count, ptr::null_mut()) };
assert_eq!(result, VkResult::SUCCESS);
let mut physical_devices: Vec<VkPhysicalDevice> = Vec::with_capacity(count as usize);
let result = unsafe {
functions.vkEnumeratePhysicalDevices(instance, &mut count, physical_devices.as_mut_ptr())
};
assert_eq!(result, VkResult::SUCCESS);
unsafe {
physical_devices.set_len(count as usize);
}
let mut physical_device_properties = Default::default();
for physical_device in physical_devices {
unsafe {
functions
.vkGetPhysicalDeviceProperties2(physical_device, &mut physical_device_properties);
}
println!(
"Physical Device: {}; \
Supported vulkan version: {}",
unsafe { CStr::from_ptr(physical_device_properties.properties.deviceName.as_ptr()) }
.to_str()
.unwrap(),
ApiVersion::from(physical_device_properties.properties.apiVersion)
);
}
unsafe { functions.vkDestroyInstance(instance, ptr::null()) };
}