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: &'static 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_camel_case_types)]
92pub type PFN_vkLayerCreateDevice = unsafe extern "system" fn(
93    instance: vk::Instance,
94    physical_device: vk::PhysicalDevice,
95    p_create_info: *const vk::DeviceCreateInfo,
96    p_allocator: *const vk::AllocationCallbacks,
97    p_device: *mut vk::Device,
98    pfn_layer_GIPA: Option<vk::PFN_vkGetInstanceProcAddr>,
99    p_pfn_next_GDPA: *mut vk::PFN_vkGetDeviceProcAddr,
100) -> vk::Result;
101
102#[allow(non_camel_case_types)]
103pub type PFN_vkLayerDestroyDevice = unsafe extern "system" fn(
104    physical_device: vk::PhysicalDevice,
105    p_allocator: *const vk::AllocationCallbacks,
106    pfn_destroy_function: vk::PFN_vkDestroyDevice,
107) -> ();
108
109#[repr(transparent)]
110#[cfg_attr(feature = "debug", derive(Debug))]
111#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
112pub struct LoaderFeatureFlagBits(pub(crate) vk::Flags);
113ash::vk_bitflags_wrapped!(LoaderFeatureFlagBits, vk::Flags);
114impl LoaderFeatureFlagBits {
115    pub const PHYSICAL_DEVICE_SORTING: Self = Self(0b1);
116}
117
118#[repr(C)]
119#[derive(Copy, Clone)]
120pub struct LayerInstanceCreateInfoLayerDevice {
121    pub pfn_layer_create_device: Option<PFN_vkLayerCreateDevice>,
122    pub pfn_layer_destroy_device: Option<PFN_vkLayerDestroyDevice>,
123}
124
125#[repr(C)]
126#[derive(Copy, Clone)]
127pub union LayerInstanceCreateInfoUnion {
128    pub p_layer_info: *mut LayerInstanceLink,
129    pub pfn_set_instance_loader_data: Option<PFN_vkSetInstanceLoaderData>,
130    pub layer_device: LayerInstanceCreateInfoLayerDevice,
131    pub loader_features: LoaderFeatureFlagBits,
132}
133
134#[repr(C)]
135#[derive(Copy, Clone)]
136pub struct LayerInstanceCreateInfo {
137    pub s_type: vk::StructureType,
138    pub p_next: *const c_void,
139    pub function: LayerFunction,
140    pub u: LayerInstanceCreateInfoUnion,
141}
142unsafe impl TaggedStructure for LayerInstanceCreateInfo {
143    const STRUCTURE_TYPE: vk::StructureType = vk::StructureType::LOADER_INSTANCE_CREATE_INFO;
144}
145impl ::core::default::Default for LayerInstanceCreateInfo {
146    fn default() -> Self {
147        Self {
148            s_type: Self::STRUCTURE_TYPE,
149            p_next: ::core::ptr::null(),
150            function: LayerFunction::LAYER_LINK_INFO,
151            u: LayerInstanceCreateInfoUnion {
152                p_layer_info: ::core::ptr::null_mut(),
153            },
154        }
155    }
156}
157
158#[repr(C)]
159#[derive(Copy, Clone)]
160pub struct LayerDeviceLink {
161    pub p_next: *mut LayerDeviceLink,
162    pub pfn_next_get_instance_proc_addr: Option<vk::PFN_vkGetInstanceProcAddr>,
163    pub pfn_next_get_device_proc_addr: Option<PFN_vkGetDeviceProcAddr>,
164}
165
166#[repr(C)]
167#[derive(Copy, Clone)]
168pub union LayerDeviceCreateInfoUnion {
169    pub p_layer_info: *mut LayerDeviceLink,
170    pub pfn_set_device_loader_data: Option<PFN_vkSetDeviceLoaderData>,
171}
172
173#[repr(C)]
174#[derive(Copy, Clone)]
175pub struct LayerDeviceCreateInfo {
176    pub s_type: vk::StructureType,
177    pub p_next: *const c_void,
178    pub function: LayerFunction,
179    pub u: LayerDeviceCreateInfoUnion,
180}
181unsafe impl TaggedStructure for LayerDeviceCreateInfo {
182    const STRUCTURE_TYPE: vk::StructureType = vk::StructureType::LOADER_DEVICE_CREATE_INFO;
183}
184impl ::core::default::Default for LayerDeviceCreateInfo {
185    fn default() -> Self {
186        Self {
187            s_type: Self::STRUCTURE_TYPE,
188            p_next: ::core::ptr::null(),
189            function: LayerFunction::LAYER_LINK_INFO,
190            u: LayerDeviceCreateInfoUnion {
191                p_layer_info: ::core::ptr::null_mut(),
192            },
193        }
194    }
195}
196
197#[repr(transparent)]
198#[cfg_attr(feature = "debug", derive(Debug))]
199#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
200pub struct ChainType(pub(crate) i32);
201impl ChainType {
202    pub const UNKNOWN: Self = Self(0);
203    pub const ENUMERATE_INSTANCE_EXTENSION_PROPERTIES: Self = Self(1);
204    pub const ENUMERATE_INSTANCE_LAYER_PROPERTIES: Self = Self(2);
205    pub const ENUMERATE_INSTANCE_VERSION: Self = Self(3);
206    #[inline]
207    pub const fn from_raw(x: i32) -> Self {
208        Self(x)
209    }
210    #[inline]
211    pub const fn as_raw(self) -> i32 {
212        self.0
213    }
214}
215
216#[repr(C)]
217#[cfg_attr(feature = "debug", derive(Debug))]
218#[derive(Clone, Copy)]
219pub struct ChainHeader {
220    ty: ChainType,
221    version: u32,
222    size: u32,
223}
224
225#[allow(non_camel_case_types)]
226pub type PFN_layer_vkEnumerateInstanceExtensionProperties = unsafe extern "system" fn(
227    p_chain: *const EnumerateInstanceExtensionPropertiesChain,
228    p_layer_name: *const c_char,
229    p_property_count: *mut u32,
230    p_properties: *mut vk::ExtensionProperties,
231)
232    -> vk::Result;
233
234#[repr(C)]
235#[derive(Clone, Copy)]
236pub struct EnumerateInstanceExtensionPropertiesChain {
237    pub header: ChainHeader,
238    pub pfn_next_layer: Option<PFN_layer_vkEnumerateInstanceExtensionProperties>,
239    pub p_next_link: *const EnumerateInstanceExtensionPropertiesChain,
240}
241impl EnumerateInstanceExtensionPropertiesChain {
242    #[inline]
243    pub unsafe fn call_down(
244        &self,
245        p_layer_name: *const c_char,
246        p_property_count: *mut u32,
247        p_properties: *mut vk::ExtensionProperties,
248    ) -> vk::Result {
249        (self.pfn_next_layer.expect("pfn_next_layer not set"))(
250            self.p_next_link,
251            p_layer_name,
252            p_property_count,
253            p_properties,
254        )
255    }
256}
257
258#[allow(non_camel_case_types)]
259pub type PFN_layer_vkEnumerateInstanceLayerProperties = unsafe extern "system" fn(
260    p_chain: *const EnumerateInstanceLayerPropertiesChain,
261    p_property_count: *mut u32,
262    p_properties: *mut vk::LayerProperties,
263) -> vk::Result;
264
265#[repr(C)]
266#[derive(Clone, Copy)]
267pub struct EnumerateInstanceLayerPropertiesChain {
268    pub header: ChainHeader,
269    pub pfn_next_layer: Option<PFN_layer_vkEnumerateInstanceLayerProperties>,
270    pub p_next_link: *const EnumerateInstanceLayerPropertiesChain,
271}
272impl EnumerateInstanceLayerPropertiesChain {
273    #[inline]
274    pub unsafe fn call_down(
275        &self,
276        p_property_count: *mut u32,
277        p_properties: *mut vk::LayerProperties,
278    ) -> vk::Result {
279        (self.pfn_next_layer.expect("pfn_next_layer not ser"))(
280            self.p_next_link,
281            p_property_count,
282            p_properties,
283        )
284    }
285}
286
287#[allow(non_camel_case_types)]
288pub type PFN_layer_vkEnumerateInstanceVersion = unsafe extern "system" fn(
289    p_chain: *const EnumerateInstanceVersionChain,
290    p_api_version: *mut u32,
291) -> vk::Result;
292
293#[repr(C)]
294#[derive(Clone, Copy)]
295pub struct EnumerateInstanceVersionChain {
296    pub header: ChainHeader,
297    pub pfn_next_layer: Option<PFN_layer_vkEnumerateInstanceVersion>,
298    pub p_next_link: *const EnumerateInstanceVersionChain,
299}
300impl EnumerateInstanceVersionChain {
301    #[inline]
302    pub unsafe fn call_down(&self, p_api_version: *mut u32) -> vk::Result {
303        (self.pfn_next_layer.expect("pfn_next_layer not set"))(self.p_next_link, p_api_version)
304    }
305}