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}