Module vulkanalia::chain

source ·
Expand description

Pointer chain handling.

§Input Pointer Chains

Input pointer chains are singly linked lists of Vulkan structs that implement vk::InputChainStruct such as vk::InstanceCreateInfo. These pointer chains are used to provide input data to Vulkan commands. A pointer in such a chain can be represented with InputChainPtr and can be easily iterated over using input_chain.

§Example

// Build an input pointer chain.

let mut features = vk::ValidationFeaturesEXT::default();
let mut flags = vk::ValidationFlagsEXT::default();
let info = vk::InstanceCreateInfo::builder()
    .push_next(&mut features)
    .push_next(&mut flags)
    .build();

// Iterate over the input pointer chain.

let structs = unsafe { input_chain(info.next) }.collect::<Vec<_>>();
assert_eq!(structs.len(), 2);

// Inspect the pointers in the input pointer chain.

let base = unsafe { structs[0].as_base_ref() };
assert_eq!(base.s_type, vk::StructureType::VALIDATION_FLAGS_EXT);
let full = unsafe { structs[0].as_ref::<vk::ValidationFlagsEXT>() };
assert_eq!(full, &flags);

let base = unsafe { structs[1].as_base_ref() };
assert_eq!(base.s_type, vk::StructureType::VALIDATION_FEATURES_EXT);
let full = unsafe { structs[1].as_ref::<vk::ValidationFeaturesEXT>() };
assert_eq!(full, &features);

§Output Pointer Chain

Output pointer chains are singly linked lists of Vulkan structs that implement vk::OutputChainStruct such as vk::PhysicalDeviceFeatures2. These pointer chains are used by Vulkan to provide output data to the application. A pointer in such a chain can be represented with OutputChainPtr and can be easily iterated over using output_chain.

§Example

// Call a command that populates an output pointer chain.

let mut features_11 = vk::PhysicalDeviceVulkan11Features::default();
let mut features_12 = vk::PhysicalDeviceVulkan12Features::default();
let mut features = vk::PhysicalDeviceFeatures2::builder()
    .push_next(&mut features_11)
    .push_next(&mut features_12);

unsafe { instance.get_physical_device_features2_khr(physical_device, &mut features) };

// Iterate over the pointers in the output pointer chain.

let structs = unsafe { output_chain(features.next) }.collect::<Vec<_>>();
assert_eq!(structs.len(), 2);

// Inspect the pointers in the output pointer chain.

let base = unsafe { structs[0].as_base_ref() };
assert_eq!(base.s_type, vk::StructureType::PHYSICAL_DEVICE_VULKAN_1_2_FEATURES);
let full = unsafe { structs[0].as_ref::<vk::PhysicalDeviceVulkan12Features>() };
assert_eq!(full.descriptor_indexing, 1);       

let base = unsafe { structs[1].as_base_ref() };
assert_eq!(base.s_type, vk::StructureType::PHYSICAL_DEVICE_VULKAN_1_1_FEATURES);
let full = unsafe { structs[1].as_ref::<vk::PhysicalDeviceVulkan11Features>() };
assert_eq!(full.protected_memory, 1);

Structs§

Functions§

  • Creates an iterator over a Vulkan input pointer chain.
  • Creates an iterator over a Vulkan output pointer chain.