1 use crate::prelude::*;
2 use crate::vk;
3 use crate::{Device, Instance};
4 use std::ffi::CStr;
5 use std::mem;
6 
7 #[derive(Clone)]
8 pub struct PresentWait {
9     handle: vk::Device,
10     fp: vk::KhrPresentWaitFn,
11 }
12 
13 impl PresentWait {
new(instance: &Instance, device: &Device) -> Self14     pub fn new(instance: &Instance, device: &Device) -> Self {
15         let handle = device.handle();
16         let fp = vk::KhrPresentWaitFn::load(|name| unsafe {
17             mem::transmute(instance.get_device_proc_addr(handle, name.as_ptr()))
18         });
19         Self { handle, fp }
20     }
21 
22     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkWaitForPresentKHR.html>
23     #[inline]
wait_for_present( &self, swapchain: vk::SwapchainKHR, present_id: u64, timeout: u64, ) -> VkResult<()>24     pub unsafe fn wait_for_present(
25         &self,
26         swapchain: vk::SwapchainKHR,
27         present_id: u64,
28         timeout: u64,
29     ) -> VkResult<()> {
30         (self.fp.wait_for_present_khr)(self.handle, swapchain, present_id, timeout).result()
31     }
32 
33     #[inline]
name() -> &'static CStr34     pub const fn name() -> &'static CStr {
35         vk::KhrPresentWaitFn::name()
36     }
37 
38     #[inline]
fp(&self) -> &vk::KhrPresentWaitFn39     pub fn fp(&self) -> &vk::KhrPresentWaitFn {
40         &self.fp
41     }
42 
43     #[inline]
device(&self) -> vk::Device44     pub fn device(&self) -> vk::Device {
45         self.handle
46     }
47 }
48