• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use crate::device::Device;
2 use crate::prelude::*;
3 use crate::vk;
4 use crate::RawPtr;
5 use std::mem;
6 use std::os::raw::c_char;
7 use std::ptr;
8 
9 #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkInstance.html>"]
10 #[derive(Clone)]
11 pub struct Instance {
12     pub(crate) handle: vk::Instance,
13 
14     pub(crate) instance_fn_1_0: vk::InstanceFnV1_0,
15     pub(crate) instance_fn_1_1: vk::InstanceFnV1_1,
16     pub(crate) instance_fn_1_2: vk::InstanceFnV1_2,
17 }
18 
19 impl Instance {
load(static_fn: &vk::StaticFn, instance: vk::Instance) -> Self20     pub unsafe fn load(static_fn: &vk::StaticFn, instance: vk::Instance) -> Self {
21         let load_fn = |name: &std::ffi::CStr| {
22             mem::transmute(static_fn.get_instance_proc_addr(instance, name.as_ptr()))
23         };
24 
25         Instance {
26             handle: instance,
27 
28             instance_fn_1_0: vk::InstanceFnV1_0::load(load_fn),
29             instance_fn_1_1: vk::InstanceFnV1_1::load(load_fn),
30             instance_fn_1_2: vk::InstanceFnV1_2::load(load_fn),
31         }
32     }
33 
handle(&self) -> vk::Instance34     pub fn handle(&self) -> vk::Instance {
35         self.handle
36     }
37 }
38 
39 /// Vulkan core 1.2
40 #[allow(non_camel_case_types)]
41 impl Instance {
fp_v1_2(&self) -> &vk::InstanceFnV1_242     pub fn fp_v1_2(&self) -> &vk::InstanceFnV1_2 {
43         &self.instance_fn_1_2
44     }
45 }
46 
47 /// Vulkan core 1.1
48 #[allow(non_camel_case_types)]
49 impl Instance {
fp_v1_1(&self) -> &vk::InstanceFnV1_150     pub fn fp_v1_1(&self) -> &vk::InstanceFnV1_1 {
51         &self.instance_fn_1_1
52     }
53 
enumerate_physical_device_groups_len(&self) -> VkResult<usize>54     pub unsafe fn enumerate_physical_device_groups_len(&self) -> VkResult<usize> {
55         let mut group_count = 0;
56         self.instance_fn_1_1
57             .enumerate_physical_device_groups(self.handle(), &mut group_count, ptr::null_mut())
58             .result_with_success(group_count as usize)
59     }
60 
61     #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkEnumeratePhysicalDeviceGroups.html>"]
enumerate_physical_device_groups( &self, out: &mut [vk::PhysicalDeviceGroupProperties], ) -> VkResult<()>62     pub fn enumerate_physical_device_groups(
63         &self,
64         out: &mut [vk::PhysicalDeviceGroupProperties],
65     ) -> VkResult<()> {
66         unsafe {
67             let mut group_count = out.len() as u32;
68             self.instance_fn_1_1
69                 .enumerate_physical_device_groups(self.handle(), &mut group_count, out.as_mut_ptr())
70                 .into()
71         }
72     }
73 
74     #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkGetPhysicalDeviceFeatures2.html>"]
get_physical_device_features2( &self, physical_device: vk::PhysicalDevice, features: &mut vk::PhysicalDeviceFeatures2, )75     pub unsafe fn get_physical_device_features2(
76         &self,
77         physical_device: vk::PhysicalDevice,
78         features: &mut vk::PhysicalDeviceFeatures2,
79     ) {
80         self.instance_fn_1_1
81             .get_physical_device_features2(physical_device, features);
82     }
83 
84     #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkGetPhysicalDeviceProperties2.html>"]
get_physical_device_properties2( &self, physical_device: vk::PhysicalDevice, prop: &mut vk::PhysicalDeviceProperties2, )85     pub unsafe fn get_physical_device_properties2(
86         &self,
87         physical_device: vk::PhysicalDevice,
88         prop: &mut vk::PhysicalDeviceProperties2,
89     ) {
90         self.instance_fn_1_1
91             .get_physical_device_properties2(physical_device, prop);
92     }
93 
94     #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkGetPhysicalDeviceFormatProperties2.html>"]
get_physical_device_format_properties2( &self, physical_device: vk::PhysicalDevice, format: vk::Format, out: &mut vk::FormatProperties2, )95     pub unsafe fn get_physical_device_format_properties2(
96         &self,
97         physical_device: vk::PhysicalDevice,
98         format: vk::Format,
99         out: &mut vk::FormatProperties2,
100     ) {
101         self.instance_fn_1_1
102             .get_physical_device_format_properties2(physical_device, format, out);
103     }
104 
105     #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkGetPhysicalDeviceImageFormatProperties2.html>"]
get_physical_device_image_format_properties2( &self, physical_device: vk::PhysicalDevice, format_info: &vk::PhysicalDeviceImageFormatInfo2, image_format_prop: &mut vk::ImageFormatProperties2, ) -> VkResult<()>106     pub unsafe fn get_physical_device_image_format_properties2(
107         &self,
108         physical_device: vk::PhysicalDevice,
109         format_info: &vk::PhysicalDeviceImageFormatInfo2,
110         image_format_prop: &mut vk::ImageFormatProperties2,
111     ) -> VkResult<()> {
112         self.instance_fn_1_1
113             .get_physical_device_image_format_properties2(
114                 physical_device,
115                 format_info,
116                 image_format_prop,
117             )
118             .into()
119     }
120 
get_physical_device_queue_family_properties2_len( &self, physical_device: vk::PhysicalDevice, ) -> usize121     pub unsafe fn get_physical_device_queue_family_properties2_len(
122         &self,
123         physical_device: vk::PhysicalDevice,
124     ) -> usize {
125         let mut queue_count = 0;
126         self.instance_fn_1_1
127             .get_physical_device_queue_family_properties2(
128                 physical_device,
129                 &mut queue_count,
130                 ptr::null_mut(),
131             );
132         queue_count as usize
133     }
134 
135     #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkGetPhysicalDeviceQueueFamilyProperties2.html>"]
get_physical_device_queue_family_properties2( &self, physical_device: vk::PhysicalDevice, queue_family_props: &mut [vk::QueueFamilyProperties2], )136     pub unsafe fn get_physical_device_queue_family_properties2(
137         &self,
138         physical_device: vk::PhysicalDevice,
139         queue_family_props: &mut [vk::QueueFamilyProperties2],
140     ) {
141         let mut queue_count = queue_family_props.len() as u32;
142         self.instance_fn_1_1
143             .get_physical_device_queue_family_properties2(
144                 physical_device,
145                 &mut queue_count,
146                 queue_family_props.as_mut_ptr(),
147             );
148     }
149 
150     #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkGetPhysicalDeviceMemoryProperties2.html>"]
get_physical_device_memory_properties2( &self, physical_device: vk::PhysicalDevice, out: &mut vk::PhysicalDeviceMemoryProperties2, )151     pub unsafe fn get_physical_device_memory_properties2(
152         &self,
153         physical_device: vk::PhysicalDevice,
154         out: &mut vk::PhysicalDeviceMemoryProperties2,
155     ) {
156         self.instance_fn_1_1
157             .get_physical_device_memory_properties2(physical_device, out);
158     }
159 
get_physical_device_sparse_image_format_properties2_len( &self, physical_device: vk::PhysicalDevice, format_info: &vk::PhysicalDeviceSparseImageFormatInfo2, ) -> usize160     pub unsafe fn get_physical_device_sparse_image_format_properties2_len(
161         &self,
162         physical_device: vk::PhysicalDevice,
163         format_info: &vk::PhysicalDeviceSparseImageFormatInfo2,
164     ) -> usize {
165         let mut format_count = 0;
166         self.instance_fn_1_1
167             .get_physical_device_sparse_image_format_properties2(
168                 physical_device,
169                 format_info,
170                 &mut format_count,
171                 ptr::null_mut(),
172             );
173         format_count as usize
174     }
175 
176     #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkGetPhysicalDeviceSparseImageFormatProperties2.html>"]
get_physical_device_sparse_image_format_properties2( &self, physical_device: vk::PhysicalDevice, format_info: &vk::PhysicalDeviceSparseImageFormatInfo2, out: &mut [vk::SparseImageFormatProperties2], )177     pub unsafe fn get_physical_device_sparse_image_format_properties2(
178         &self,
179         physical_device: vk::PhysicalDevice,
180         format_info: &vk::PhysicalDeviceSparseImageFormatInfo2,
181         out: &mut [vk::SparseImageFormatProperties2],
182     ) {
183         let mut format_count = out.len() as u32;
184         self.instance_fn_1_1
185             .get_physical_device_sparse_image_format_properties2(
186                 physical_device,
187                 format_info,
188                 &mut format_count,
189                 out.as_mut_ptr(),
190             );
191     }
192 
193     #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkGetPhysicalDeviceExternalBufferProperties.html>"]
get_physical_device_external_buffer_properties( &self, physical_device: vk::PhysicalDevice, external_buffer_info: &vk::PhysicalDeviceExternalBufferInfo, out: &mut vk::ExternalBufferProperties, )194     pub unsafe fn get_physical_device_external_buffer_properties(
195         &self,
196         physical_device: vk::PhysicalDevice,
197         external_buffer_info: &vk::PhysicalDeviceExternalBufferInfo,
198         out: &mut vk::ExternalBufferProperties,
199     ) {
200         self.instance_fn_1_1
201             .get_physical_device_external_buffer_properties(
202                 physical_device,
203                 external_buffer_info,
204                 out,
205             );
206     }
207 
208     #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkGetPhysicalDeviceExternalFenceProperties.html>"]
get_physical_device_external_fence_properties( &self, physical_device: vk::PhysicalDevice, external_fence_info: &vk::PhysicalDeviceExternalFenceInfo, out: &mut vk::ExternalFenceProperties, )209     pub unsafe fn get_physical_device_external_fence_properties(
210         &self,
211         physical_device: vk::PhysicalDevice,
212         external_fence_info: &vk::PhysicalDeviceExternalFenceInfo,
213         out: &mut vk::ExternalFenceProperties,
214     ) {
215         self.instance_fn_1_1
216             .get_physical_device_external_fence_properties(
217                 physical_device,
218                 external_fence_info,
219                 out,
220             );
221     }
222 
223     #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkGetPhysicalDeviceExternalSemaphoreProperties.html>"]
get_physical_device_external_semaphore_properties( &self, physical_device: vk::PhysicalDevice, external_semaphore_info: &vk::PhysicalDeviceExternalSemaphoreInfo, out: &mut vk::ExternalSemaphoreProperties, )224     pub unsafe fn get_physical_device_external_semaphore_properties(
225         &self,
226         physical_device: vk::PhysicalDevice,
227         external_semaphore_info: &vk::PhysicalDeviceExternalSemaphoreInfo,
228         out: &mut vk::ExternalSemaphoreProperties,
229     ) {
230         self.instance_fn_1_1
231             .get_physical_device_external_semaphore_properties(
232                 physical_device,
233                 external_semaphore_info,
234                 out,
235             );
236     }
237 }
238 
239 /// Vulkan core 1.0
240 #[allow(non_camel_case_types)]
241 impl Instance {
fp_v1_0(&self) -> &vk::InstanceFnV1_0242     pub fn fp_v1_0(&self) -> &vk::InstanceFnV1_0 {
243         &self.instance_fn_1_0
244     }
245 
246     #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkCreateDevice.html>"]
247     ///
248     /// # Safety
249     /// In order for the created [`Device`] to be valid for the duration of its
250     /// usage, the [`Instance`] this was called on must be dropped later than the
251     /// resulting [`Device`].
create_device( &self, physical_device: vk::PhysicalDevice, create_info: &vk::DeviceCreateInfo, allocation_callbacks: Option<&vk::AllocationCallbacks>, ) -> VkResult<Device>252     pub unsafe fn create_device(
253         &self,
254         physical_device: vk::PhysicalDevice,
255         create_info: &vk::DeviceCreateInfo,
256         allocation_callbacks: Option<&vk::AllocationCallbacks>,
257     ) -> VkResult<Device> {
258         let mut device = mem::zeroed();
259         self.instance_fn_1_0
260             .create_device(
261                 physical_device,
262                 create_info,
263                 allocation_callbacks.as_raw_ptr(),
264                 &mut device,
265             )
266             .result()?;
267         Ok(Device::load(&self.instance_fn_1_0, device))
268     }
269 
270     #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkGetDeviceProcAddr.html>"]
get_device_proc_addr( &self, device: vk::Device, p_name: *const c_char, ) -> vk::PFN_vkVoidFunction271     pub unsafe fn get_device_proc_addr(
272         &self,
273         device: vk::Device,
274         p_name: *const c_char,
275     ) -> vk::PFN_vkVoidFunction {
276         self.instance_fn_1_0.get_device_proc_addr(device, p_name)
277     }
278 
279     #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkDestroyInstance.html>"]
destroy_instance(&self, allocation_callbacks: Option<&vk::AllocationCallbacks>)280     pub unsafe fn destroy_instance(&self, allocation_callbacks: Option<&vk::AllocationCallbacks>) {
281         self.instance_fn_1_0
282             .destroy_instance(self.handle(), allocation_callbacks.as_raw_ptr());
283     }
284 
285     #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkGetPhysicalDeviceFormatProperties.html>"]
get_physical_device_format_properties( &self, physical_device: vk::PhysicalDevice, format: vk::Format, ) -> vk::FormatProperties286     pub unsafe fn get_physical_device_format_properties(
287         &self,
288         physical_device: vk::PhysicalDevice,
289         format: vk::Format,
290     ) -> vk::FormatProperties {
291         let mut format_prop = mem::zeroed();
292         self.instance_fn_1_0.get_physical_device_format_properties(
293             physical_device,
294             format,
295             &mut format_prop,
296         );
297         format_prop
298     }
299 
300     #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkGetPhysicalDeviceImageFormatProperties.html>"]
get_physical_device_image_format_properties( &self, physical_device: vk::PhysicalDevice, format: vk::Format, typ: vk::ImageType, tiling: vk::ImageTiling, usage: vk::ImageUsageFlags, flags: vk::ImageCreateFlags, ) -> VkResult<vk::ImageFormatProperties>301     pub unsafe fn get_physical_device_image_format_properties(
302         &self,
303         physical_device: vk::PhysicalDevice,
304         format: vk::Format,
305         typ: vk::ImageType,
306         tiling: vk::ImageTiling,
307         usage: vk::ImageUsageFlags,
308         flags: vk::ImageCreateFlags,
309     ) -> VkResult<vk::ImageFormatProperties> {
310         let mut image_format_prop = mem::zeroed();
311         self.instance_fn_1_0
312             .get_physical_device_image_format_properties(
313                 physical_device,
314                 format,
315                 typ,
316                 tiling,
317                 usage,
318                 flags,
319                 &mut image_format_prop,
320             )
321             .result_with_success(image_format_prop)
322     }
323 
324     #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkGetPhysicalDeviceMemoryProperties.html>"]
get_physical_device_memory_properties( &self, physical_device: vk::PhysicalDevice, ) -> vk::PhysicalDeviceMemoryProperties325     pub unsafe fn get_physical_device_memory_properties(
326         &self,
327         physical_device: vk::PhysicalDevice,
328     ) -> vk::PhysicalDeviceMemoryProperties {
329         let mut memory_prop = mem::zeroed();
330         self.instance_fn_1_0
331             .get_physical_device_memory_properties(physical_device, &mut memory_prop);
332         memory_prop
333     }
334 
335     #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkGetPhysicalDeviceProperties.html>"]
get_physical_device_properties( &self, physical_device: vk::PhysicalDevice, ) -> vk::PhysicalDeviceProperties336     pub unsafe fn get_physical_device_properties(
337         &self,
338         physical_device: vk::PhysicalDevice,
339     ) -> vk::PhysicalDeviceProperties {
340         let mut prop = mem::zeroed();
341         self.instance_fn_1_0
342             .get_physical_device_properties(physical_device, &mut prop);
343         prop
344     }
345 
346     #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkGetPhysicalDeviceQueueFamilyProperties.html>"]
get_physical_device_queue_family_properties( &self, physical_device: vk::PhysicalDevice, ) -> Vec<vk::QueueFamilyProperties>347     pub unsafe fn get_physical_device_queue_family_properties(
348         &self,
349         physical_device: vk::PhysicalDevice,
350     ) -> Vec<vk::QueueFamilyProperties> {
351         read_into_uninitialized_vector(|count, data| {
352             self.instance_fn_1_0
353                 .get_physical_device_queue_family_properties(physical_device, count, data);
354             vk::Result::SUCCESS
355         })
356         // The closure always returns SUCCESS
357         .unwrap()
358     }
359 
360     #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkGetPhysicalDeviceFeatures.html>"]
get_physical_device_features( &self, physical_device: vk::PhysicalDevice, ) -> vk::PhysicalDeviceFeatures361     pub unsafe fn get_physical_device_features(
362         &self,
363         physical_device: vk::PhysicalDevice,
364     ) -> vk::PhysicalDeviceFeatures {
365         let mut prop = mem::zeroed();
366         self.instance_fn_1_0
367             .get_physical_device_features(physical_device, &mut prop);
368         prop
369     }
370 
371     #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkEnumeratePhysicalDevices.html>"]
enumerate_physical_devices(&self) -> VkResult<Vec<vk::PhysicalDevice>>372     pub unsafe fn enumerate_physical_devices(&self) -> VkResult<Vec<vk::PhysicalDevice>> {
373         read_into_uninitialized_vector(|count, data| {
374             self.instance_fn_1_0
375                 .enumerate_physical_devices(self.handle(), count, data)
376         })
377     }
378 
379     #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkEnumerateDeviceExtensionProperties.html>"]
enumerate_device_extension_properties( &self, device: vk::PhysicalDevice, ) -> VkResult<Vec<vk::ExtensionProperties>>380     pub unsafe fn enumerate_device_extension_properties(
381         &self,
382         device: vk::PhysicalDevice,
383     ) -> VkResult<Vec<vk::ExtensionProperties>> {
384         read_into_uninitialized_vector(|count, data| {
385             self.instance_fn_1_0.enumerate_device_extension_properties(
386                 device,
387                 ptr::null(),
388                 count,
389                 data,
390             )
391         })
392     }
393 
394     #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkEnumerateDeviceLayerProperties.html>"]
enumerate_device_layer_properties( &self, device: vk::PhysicalDevice, ) -> VkResult<Vec<vk::LayerProperties>>395     pub unsafe fn enumerate_device_layer_properties(
396         &self,
397         device: vk::PhysicalDevice,
398     ) -> VkResult<Vec<vk::LayerProperties>> {
399         read_into_uninitialized_vector(|count, data| {
400             self.instance_fn_1_0
401                 .enumerate_device_layer_properties(device, count, data)
402         })
403     }
404 
405     #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkGetPhysicalDeviceSparseImageFormatProperties.html>"]
get_physical_device_sparse_image_format_properties( &self, physical_device: vk::PhysicalDevice, format: vk::Format, typ: vk::ImageType, samples: vk::SampleCountFlags, usage: vk::ImageUsageFlags, tiling: vk::ImageTiling, ) -> Vec<vk::SparseImageFormatProperties>406     pub unsafe fn get_physical_device_sparse_image_format_properties(
407         &self,
408         physical_device: vk::PhysicalDevice,
409         format: vk::Format,
410         typ: vk::ImageType,
411         samples: vk::SampleCountFlags,
412         usage: vk::ImageUsageFlags,
413         tiling: vk::ImageTiling,
414     ) -> Vec<vk::SparseImageFormatProperties> {
415         read_into_uninitialized_vector(|count, data| {
416             self.instance_fn_1_0
417                 .get_physical_device_sparse_image_format_properties(
418                     physical_device,
419                     format,
420                     typ,
421                     samples,
422                     usage,
423                     tiling,
424                     count,
425                     data,
426                 );
427             vk::Result::SUCCESS
428         })
429         // The closure always returns SUCCESS
430         .unwrap()
431     }
432 }
433