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