ash/extensions/khr/
external_memory_fd.rs

1use crate::prelude::*;
2use crate::vk;
3use crate::{Device, Instance};
4use std::ffi::CStr;
5use std::mem;
6
7#[derive(Clone)]
8pub struct ExternalMemoryFd {
9    handle: vk::Device,
10    fp: vk::KhrExternalMemoryFdFn,
11}
12
13impl ExternalMemoryFd {
14    pub fn new(instance: &Instance, device: &Device) -> Self {
15        let handle = device.handle();
16        let fp = vk::KhrExternalMemoryFdFn::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/vkGetMemoryFdKHR.html>
23    #[inline]
24    pub unsafe fn get_memory_fd(&self, get_fd_info: &vk::MemoryGetFdInfoKHR) -> VkResult<i32> {
25        let mut fd = -1;
26        (self.fp.get_memory_fd_khr)(self.handle, get_fd_info, &mut fd).result_with_success(fd)
27    }
28
29    /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetMemoryFdPropertiesKHR.html>
30    #[inline]
31    pub unsafe fn get_memory_fd_properties(
32        &self,
33        handle_type: vk::ExternalMemoryHandleTypeFlags,
34        fd: i32,
35    ) -> VkResult<vk::MemoryFdPropertiesKHR> {
36        let mut memory_fd_properties = Default::default();
37        (self.fp.get_memory_fd_properties_khr)(
38            self.handle,
39            handle_type,
40            fd,
41            &mut memory_fd_properties,
42        )
43        .result_with_success(memory_fd_properties)
44    }
45
46    #[inline]
47    pub const fn name() -> &'static CStr {
48        vk::KhrExternalMemoryFdFn::name()
49    }
50
51    #[inline]
52    pub fn fp(&self) -> &vk::KhrExternalMemoryFdFn {
53        &self.fp
54    }
55
56    #[inline]
57    pub fn device(&self) -> vk::Device {
58        self.handle
59    }
60}