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    pub unsafe fn get_memory_fd(&self, create_info: &vk::MemoryGetFdInfoKHR) -> VkResult<i32> {
24        let mut fd = -1;
25        (self.fp.get_memory_fd_khr)(self.handle, create_info, &mut fd).result_with_success(fd)
26    }
27
28    /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetMemoryFdPropertiesKHR.html>
29    pub unsafe fn get_memory_fd_properties(
30        &self,
31        handle_type: vk::ExternalMemoryHandleTypeFlags,
32        fd: i32,
33    ) -> VkResult<vk::MemoryFdPropertiesKHR> {
34        let mut memory_fd_properties = Default::default();
35        (self.fp.get_memory_fd_properties_khr)(
36            self.handle,
37            handle_type,
38            fd,
39            &mut memory_fd_properties,
40        )
41        .result_with_success(memory_fd_properties)
42    }
43
44    pub const fn name() -> &'static CStr {
45        vk::KhrExternalMemoryFdFn::name()
46    }
47
48    pub fn fp(&self) -> &vk::KhrExternalMemoryFdFn {
49        &self.fp
50    }
51
52    pub fn device(&self) -> vk::Device {
53        self.handle
54    }
55}