Skip to main content

ash_layer/
sys.rs

1use core::ffi::{c_char, c_void};
2
3use ash::vk::TaggedStructure;
4use ash::vk::{self, PFN_vkGetDeviceProcAddr};
5
6#[allow(non_camel_case_types)]
7pub type PFN_vk_layerGetPhysicalDeviceProcAddr =
8    unsafe extern "system" fn(
9        instance: vk::Instance,
10        p_name: *const c_char,
11    ) -> vk::PFN_vkVoidFunction;
12
13#[repr(transparent)]
14#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
15pub struct NegotiateLayerStructType(pub(crate) i32);
16impl NegotiateLayerStructType {
17    pub const UNINTIALIZED: Self = Self(0);
18    pub const INTERFACE_STRUCT: Self = Self(1);
19    #[inline]
20    pub const fn from_raw(x: i32) -> Self {
21        Self(x)
22    }
23    #[inline]
24    pub const fn as_raw(self) -> i32 {
25        self.0
26    }
27}
28
29#[repr(C)]
30#[derive(Copy, Clone)]
31pub struct NegotiateLayerInterface {
32    pub s_type: NegotiateLayerStructType,
33    pub p_next: *mut c_void,
34    pub loader_layer_interface_version: u32,
35    pub pfn_get_instance_proc_addr: Option<vk::PFN_vkGetInstanceProcAddr>,
36    pub pfn_get_device_proc_addr: Option<vk::PFN_vkGetDeviceProcAddr>,
37    pub pfn_get_physical_device_proc_addr: Option<PFN_vk_layerGetPhysicalDeviceProcAddr>,
38}
39
40#[allow(non_camel_case_types)]
41pub type PFN_vkNegotiateLoaderLayerInterfaceVersion =
42    unsafe extern "system" fn(p_version_struct: *mut NegotiateLayerInterface) -> vk::Result;
43pub const VK_NEGOTIATE_LOADER_LAYER_INTERFACE_VERSION_SYM: &str =
44    "vkNegotiateLoaderLayerInterfaceVersion";
45
46#[allow(non_camel_case_types)]
47pub type PFN_PhysDevExt = unsafe extern "system" fn(phys_device: vk::PhysicalDevice) -> vk::Result;
48
49#[repr(transparent)]
50#[cfg_attr(feature = "debug", derive(Debug))]
51#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
52pub struct LayerFunction(pub(crate) i32);
53impl LayerFunction {
54    pub const LAYER_LINK_INFO: Self = Self(0);
55    pub const LOADER_DATA_CALLBACK: Self = Self(1);
56    pub const LOADER_LAYER_CREATE_DEVICE_CALLBACK: Self = Self(2);
57    pub const LOADER_FEATURES: Self = Self(3);
58    #[inline]
59    pub const fn from_raw(x: i32) -> Self {
60        Self(x)
61    }
62    #[inline]
63    pub const fn as_raw(self) -> i32 {
64        self.0
65    }
66}
67
68#[repr(C)]
69#[derive(Copy, Clone)]
70pub struct LayerInstanceLink {
71    pub p_next: *mut LayerInstanceLink,
72    pub pfn_next_get_instance_proc_addr: Option<vk::PFN_vkGetInstanceProcAddr>,
73    pub pfn_next_get_physical_device_proc_addr: Option<PFN_vk_layerGetPhysicalDeviceProcAddr>,
74}
75
76#[repr(C)]
77#[derive(Copy, Clone)]
78pub struct LayerDeviceInfo {
79    pub p_device_info: *mut c_void,
80    pub pfn_next_get_instance_proc_addr: Option<vk::PFN_vkGetInstanceProcAddr>,
81}
82
83#[allow(non_camel_case_types)]
84pub type PFN_vkSetInstanceLoaderData =
85    unsafe extern "system" fn(instance: vk::Instance, p_object: *mut c_void) -> vk::Result;
86
87#[allow(non_camel_case_types)]
88pub type PFN_vkSetDeviceLoaderData =
89    unsafe extern "system" fn(device: vk::Device, p_object: *mut c_void) -> vk::Result;
90
91#[allow(non_snake_case)]
92#[allow(non_camel_case_types)]
93pub type PFN_vkLayerCreateDevice = unsafe extern "system" fn(
94    instance: vk::Instance,
95    physical_device: vk::PhysicalDevice,
96    p_create_info: *const vk::DeviceCreateInfo,
97    p_allocator: *const vk::AllocationCallbacks,
98    p_device: *mut vk::Device,
99    pfn_layer_GIPA: Option<vk::PFN_vkGetInstanceProcAddr>,
100    p_pfn_next_GDPA: *mut vk::PFN_vkGetDeviceProcAddr,
101) -> vk::Result;
102
103#[allow(non_camel_case_types)]
104pub type PFN_vkLayerDestroyDevice = unsafe extern "system" fn(
105    physical_device: vk::PhysicalDevice,
106    p_allocator: *const vk::AllocationCallbacks,
107    pfn_destroy_function: vk::PFN_vkDestroyDevice,
108) -> ();
109
110#[repr(transparent)]
111#[cfg_attr(feature = "debug", derive(Debug))]
112#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
113pub struct LoaderFeatureFlagBits(pub(crate) vk::Flags);
114ash::vk_bitflags_wrapped!(LoaderFeatureFlagBits, vk::Flags);
115impl LoaderFeatureFlagBits {
116    pub const PHYSICAL_DEVICE_SORTING: Self = Self(0b1);
117}
118
119#[repr(C)]
120#[derive(Copy, Clone)]
121pub struct LayerInstanceCreateInfoLayerDevice {
122    pub pfn_layer_create_device: Option<PFN_vkLayerCreateDevice>,
123    pub pfn_layer_destroy_device: Option<PFN_vkLayerDestroyDevice>,
124}
125
126#[repr(C)]
127#[derive(Copy, Clone)]
128pub union LayerInstanceCreateInfoUnion {
129    pub p_layer_info: *mut LayerInstanceLink,
130    pub pfn_set_instance_loader_data: Option<PFN_vkSetInstanceLoaderData>,
131    pub layer_device: LayerInstanceCreateInfoLayerDevice,
132    pub loader_features: LoaderFeatureFlagBits,
133}
134
135#[repr(C)]
136#[derive(Copy, Clone)]
137pub struct LayerInstanceCreateInfo {
138    pub s_type: vk::StructureType,
139    pub p_next: *const c_void,
140    pub function: LayerFunction,
141    pub u: LayerInstanceCreateInfoUnion,
142}
143unsafe impl TaggedStructure for LayerInstanceCreateInfo {
144    const STRUCTURE_TYPE: vk::StructureType = vk::StructureType::LOADER_INSTANCE_CREATE_INFO;
145}
146impl ::core::default::Default for LayerInstanceCreateInfo {
147    fn default() -> Self {
148        Self {
149            s_type: Self::STRUCTURE_TYPE,
150            p_next: ::core::ptr::null(),
151            function: LayerFunction::LAYER_LINK_INFO,
152            u: LayerInstanceCreateInfoUnion {
153                p_layer_info: ::core::ptr::null_mut(),
154            },
155        }
156    }
157}
158
159#[repr(C)]
160#[derive(Copy, Clone)]
161pub struct LayerDeviceLink {
162    pub p_next: *mut LayerDeviceLink,
163    pub pfn_next_get_instance_proc_addr: Option<vk::PFN_vkGetInstanceProcAddr>,
164    pub pfn_next_get_device_proc_addr: Option<PFN_vkGetDeviceProcAddr>,
165}
166
167#[repr(C)]
168#[derive(Copy, Clone)]
169pub union LayerDeviceCreateInfoUnion {
170    pub p_layer_info: *mut LayerDeviceLink,
171    pub pfn_set_device_loader_data: Option<PFN_vkSetDeviceLoaderData>,
172}
173
174#[repr(C)]
175#[derive(Copy, Clone)]
176pub struct LayerDeviceCreateInfo {
177    pub s_type: vk::StructureType,
178    pub p_next: *const c_void,
179    pub function: LayerFunction,
180    pub u: LayerDeviceCreateInfoUnion,
181}
182unsafe impl TaggedStructure for LayerDeviceCreateInfo {
183    const STRUCTURE_TYPE: vk::StructureType = vk::StructureType::LOADER_DEVICE_CREATE_INFO;
184}
185impl ::core::default::Default for LayerDeviceCreateInfo {
186    fn default() -> Self {
187        Self {
188            s_type: Self::STRUCTURE_TYPE,
189            p_next: ::core::ptr::null(),
190            function: LayerFunction::LAYER_LINK_INFO,
191            u: LayerDeviceCreateInfoUnion {
192                p_layer_info: ::core::ptr::null_mut(),
193            },
194        }
195    }
196}
197
198#[repr(transparent)]
199#[cfg_attr(feature = "debug", derive(Debug))]
200#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
201pub struct ChainType(pub(crate) i32);
202impl ChainType {
203    pub const UNKNOWN: Self = Self(0);
204    pub const ENUMERATE_INSTANCE_EXTENSION_PROPERTIES: Self = Self(1);
205    pub const ENUMERATE_INSTANCE_LAYER_PROPERTIES: Self = Self(2);
206    pub const ENUMERATE_INSTANCE_VERSION: Self = Self(3);
207    #[inline]
208    pub const fn from_raw(x: i32) -> Self {
209        Self(x)
210    }
211    #[inline]
212    pub const fn as_raw(self) -> i32 {
213        self.0
214    }
215}
216
217#[repr(C)]
218#[cfg_attr(feature = "debug", derive(Debug))]
219#[derive(Clone, Copy)]
220pub struct ChainHeader {
221    ty: ChainType,
222    version: u32,
223    size: u32,
224}
225
226#[allow(non_camel_case_types)]
227pub type PFN_layer_vkEnumerateInstanceExtensionProperties = unsafe extern "system" fn(
228    p_chain: *const EnumerateInstanceExtensionPropertiesChain,
229    p_layer_name: *const c_char,
230    p_property_count: *mut u32,
231    p_properties: *mut vk::ExtensionProperties,
232)
233    -> vk::Result;
234
235#[repr(C)]
236#[derive(Clone, Copy)]
237pub struct EnumerateInstanceExtensionPropertiesChain {
238    pub header: ChainHeader,
239    pub pfn_next_layer: Option<PFN_layer_vkEnumerateInstanceExtensionProperties>,
240    pub p_next_link: *const EnumerateInstanceExtensionPropertiesChain,
241}
242impl EnumerateInstanceExtensionPropertiesChain {
243    #[inline]
244    pub unsafe fn call_down(
245        &self,
246        p_layer_name: *const c_char,
247        p_property_count: *mut u32,
248        p_properties: *mut vk::ExtensionProperties,
249    ) -> vk::Result {
250        (self.pfn_next_layer.expect("pfn_next_layer not set"))(
251            self.p_next_link,
252            p_layer_name,
253            p_property_count,
254            p_properties,
255        )
256    }
257}
258
259#[allow(non_camel_case_types)]
260pub type PFN_layer_vkEnumerateInstanceLayerProperties = unsafe extern "system" fn(
261    p_chain: *const EnumerateInstanceLayerPropertiesChain,
262    p_property_count: *mut u32,
263    p_properties: *mut vk::LayerProperties,
264) -> vk::Result;
265
266#[repr(C)]
267#[derive(Clone, Copy)]
268pub struct EnumerateInstanceLayerPropertiesChain {
269    pub header: ChainHeader,
270    pub pfn_next_layer: Option<PFN_layer_vkEnumerateInstanceLayerProperties>,
271    pub p_next_link: *const EnumerateInstanceLayerPropertiesChain,
272}
273impl EnumerateInstanceLayerPropertiesChain {
274    #[inline]
275    pub unsafe fn call_down(
276        &self,
277        p_property_count: *mut u32,
278        p_properties: *mut vk::LayerProperties,
279    ) -> vk::Result {
280        (self.pfn_next_layer.expect("pfn_next_layer not ser"))(
281            self.p_next_link,
282            p_property_count,
283            p_properties,
284        )
285    }
286}
287
288#[allow(non_camel_case_types)]
289pub type PFN_layer_vkEnumerateInstanceVersion = unsafe extern "system" fn(
290    p_chain: *const EnumerateInstanceVersionChain,
291    p_api_version: *mut u32,
292) -> vk::Result;
293
294#[repr(C)]
295#[derive(Clone, Copy)]
296pub struct EnumerateInstanceVersionChain {
297    pub header: ChainHeader,
298    pub pfn_next_layer: Option<PFN_layer_vkEnumerateInstanceVersion>,
299    pub p_next_link: *const EnumerateInstanceVersionChain,
300}
301impl EnumerateInstanceVersionChain {
302    #[inline]
303    pub unsafe fn call_down(&self, p_api_version: *mut u32) -> vk::Result {
304        (self.pfn_next_layer.expect("pfn_next_layer not set"))(self.p_next_link, p_api_version)
305    }
306}