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}