ash_layer/
utils.rs

1use crate::*;
2
3use ash::vk;
4use ash::vk::TaggedStructure;
5
6use core::ptr::NonNull;
7
8pub unsafe fn get_instance_chain_info(
9    create_info: &vk::InstanceCreateInfo,
10    function: LayerFunction,
11) -> Option<NonNull<LayerInstanceCreateInfo>> {
12    let mut chain_info_ptr = create_info.p_next.cast::<LayerInstanceCreateInfo>();
13    while !chain_info_ptr.is_null() {
14        let chain_info = chain_info_ptr.read();
15        if chain_info.s_type == LayerInstanceCreateInfo::STRUCTURE_TYPE
16            && chain_info.function == function
17        {
18            return Some(NonNull::new_unchecked(chain_info_ptr as _));
19        }
20        chain_info_ptr = chain_info.p_next.cast()
21    }
22    None
23}
24
25pub unsafe fn get_device_chain_info(
26    create_info: &vk::DeviceCreateInfo,
27    function: LayerFunction,
28) -> Option<NonNull<LayerDeviceCreateInfo>> {
29    let mut chain_info_ptr = create_info.p_next.cast::<LayerDeviceCreateInfo>();
30    while !chain_info_ptr.is_null() {
31        let chain_info = chain_info_ptr.read();
32        if chain_info.s_type == LayerDeviceCreateInfo::STRUCTURE_TYPE
33            && chain_info.function == function
34        {
35            return Some(NonNull::new_unchecked(chain_info_ptr as _));
36        }
37        chain_info_ptr = chain_info.p_next.cast()
38    }
39    None
40}