use super::{Error, Result, Semaphore, check};
use crate::raw::bindings::*;
#[cfg(windows)]
#[derive(Debug, Clone, Copy)]
pub struct SemaphoreImportWin32 {
pub handle_type: VkExternalSemaphoreHandleTypeFlagBits,
pub flags: VkSemaphoreImportFlags,
pub handle: HANDLE,
}
#[cfg(unix)]
#[derive(Debug)]
pub struct SemaphoreImportFd {
pub handle_type: VkExternalSemaphoreHandleTypeFlagBits,
pub flags: VkSemaphoreImportFlags,
pub fd: std::os::fd::OwnedFd,
}
impl Semaphore {
#[cfg(windows)]
pub fn get_win32_handle(
&self,
handle_type: VkExternalSemaphoreHandleTypeFlagBits,
) -> Result<super::Win32Handle> {
let f = self
.device
.dispatch
.vkGetSemaphoreWin32HandleKHR
.ok_or(Error::MissingFunction("vkGetSemaphoreWin32HandleKHR"))?;
let info = VkSemaphoreGetWin32HandleInfoKHR {
sType: VkStructureType::STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR,
pNext: std::ptr::null(),
semaphore: self.handle,
handleType: handle_type,
};
let mut raw: HANDLE = std::ptr::null_mut();
check(unsafe { f(self.device.handle, &info, &mut raw) })?;
Ok(super::Win32Handle {
raw,
handle_type,
})
}
#[cfg(windows)]
pub fn import_win32_handle(&self, params: SemaphoreImportWin32) -> Result<()> {
let f = self
.device
.dispatch
.vkImportSemaphoreWin32HandleKHR
.ok_or(Error::MissingFunction("vkImportSemaphoreWin32HandleKHR"))?;
let info = VkImportSemaphoreWin32HandleInfoKHR {
sType: VkStructureType::STRUCTURE_TYPE_IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR,
pNext: std::ptr::null(),
semaphore: self.handle,
flags: params.flags,
handleType: params.handle_type,
handle: params.handle,
name: std::ptr::null_mut(),
};
check(unsafe { f(self.device.handle, &info) })
}
#[cfg(unix)]
pub fn get_fd(
&self,
handle_type: VkExternalSemaphoreHandleTypeFlagBits,
) -> Result<std::os::fd::OwnedFd> {
use std::os::fd::{FromRawFd, OwnedFd};
let f = self
.device
.dispatch
.vkGetSemaphoreFdKHR
.ok_or(Error::MissingFunction("vkGetSemaphoreFdKHR"))?;
let info = VkSemaphoreGetFdInfoKHR {
sType: VkStructureType::STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR,
pNext: std::ptr::null(),
semaphore: self.handle,
handleType: handle_type,
};
let mut fd: i32 = -1;
check(unsafe { f(self.device.handle, &info, &mut fd) })?;
if fd < 0 {
return Err(Error::InvalidArgument(
"driver returned a negative file descriptor on success",
));
}
Ok(unsafe { OwnedFd::from_raw_fd(fd) })
}
#[cfg(unix)]
pub fn import_fd(&self, params: SemaphoreImportFd) -> Result<()> {
use std::os::fd::{FromRawFd, IntoRawFd, OwnedFd};
let f = self
.device
.dispatch
.vkImportSemaphoreFdKHR
.ok_or(Error::MissingFunction("vkImportSemaphoreFdKHR"))?;
let raw_fd = params.fd.into_raw_fd();
let info = VkImportSemaphoreFdInfoKHR {
sType: VkStructureType::STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR,
pNext: std::ptr::null(),
semaphore: self.handle,
flags: params.flags,
handleType: params.handle_type,
fd: raw_fd,
};
let r = unsafe { f(self.device.handle, &info) };
if (r as i32) < 0 {
drop(unsafe { OwnedFd::from_raw_fd(raw_fd) });
return Err(Error::Vk(r));
}
Ok(())
}
}