1 use crate::prelude::*; 2 use crate::vk; 3 use crate::RawPtr; 4 use crate::{Entry, Instance}; 5 use std::ffi::CStr; 6 use std::mem; 7 8 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_EXT_headless_surface.html> 9 #[derive(Clone)] 10 pub struct HeadlessSurface { 11 handle: vk::Instance, 12 fp: vk::ExtHeadlessSurfaceFn, 13 } 14 15 impl HeadlessSurface { new(entry: &Entry, instance: &Instance) -> Self16 pub fn new(entry: &Entry, instance: &Instance) -> Self { 17 let handle = instance.handle(); 18 let fp = vk::ExtHeadlessSurfaceFn::load(|name| unsafe { 19 mem::transmute(entry.get_instance_proc_addr(handle, name.as_ptr())) 20 }); 21 Self { handle, fp } 22 } 23 24 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCreateHeadlessSurfaceEXT.html> 25 #[inline] create_headless_surface( &self, create_info: &vk::HeadlessSurfaceCreateInfoEXT, allocation_callbacks: Option<&vk::AllocationCallbacks>, ) -> VkResult<vk::SurfaceKHR>26 pub unsafe fn create_headless_surface( 27 &self, 28 create_info: &vk::HeadlessSurfaceCreateInfoEXT, 29 allocation_callbacks: Option<&vk::AllocationCallbacks>, 30 ) -> VkResult<vk::SurfaceKHR> { 31 let mut surface = mem::zeroed(); 32 (self.fp.create_headless_surface_ext)( 33 self.handle, 34 create_info, 35 allocation_callbacks.as_raw_ptr(), 36 &mut surface, 37 ) 38 .result_with_success(surface) 39 } 40 41 #[inline] name() -> &'static CStr42 pub const fn name() -> &'static CStr { 43 vk::ExtHeadlessSurfaceFn::name() 44 } 45 46 #[inline] fp(&self) -> &vk::ExtHeadlessSurfaceFn47 pub fn fp(&self) -> &vk::ExtHeadlessSurfaceFn { 48 &self.fp 49 } 50 51 #[inline] instance(&self) -> vk::Instance52 pub fn instance(&self) -> vk::Instance { 53 self.handle 54 } 55 } 56