use std::intrinsics::transmute;
use crate::types::*;
use crate::error::Result;
use crate::instance::Instance;
use super::khr_surface::SurfaceKHR;
pub struct EXTMetalSurface {
fun: MetalSurfaceFn,
instance: Arc<Instance>,
}
impl EXTMetalSurface {
pub fn new(instance: &Arc<Instance>) -> Self {
Self { fun: MetalSurfaceFn::new(instance), instance: instance.clone() }
}
#[doc = crate::man_link!(vkCreateMetalSurfaceEXT)]
pub unsafe fn create_metal_surface_ext(
&self, info: &MetalSurfaceCreateInfoEXT,
) -> Result<SurfaceKHR> {
let mut handle = None;
(self.fun.create_metal_surface_ext)(
self.instance.handle(),
info,
None,
&mut handle,
)?;
Ok(SurfaceKHR::new(handle.unwrap(), self.instance.clone()))
}
}
pub struct MetalSurfaceFn {
pub create_metal_surface_ext: unsafe extern "system" fn(
Ref<VkInstance>,
&MetalSurfaceCreateInfoEXT,
Option<&'_ AllocationCallbacks>,
&mut Option<Handle<VkSurfaceKHR>>,
) -> VkResult,
}
impl MetalSurfaceFn {
pub fn new(inst: &Instance) -> Self {
Self {
create_metal_surface_ext: unsafe {
transmute(inst.get_proc_addr("vkCreateMetalSurfaceEXT\0"))
},
}
}
}