diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cd2915449..8661aacf3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,22 +5,31 @@ name: CI jobs: check: name: Check - runs-on: ubuntu-latest + strategy: + matrix: + os: [windows-latest, ubuntu-latest] + runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v1 - run: cargo check --workspace --all-targets --all-features check_msrv: - name: Check ash MSRV (1.60.0) - runs-on: ubuntu-latest + name: Check ash MSRV (1.63.0) + strategy: + matrix: + os: [windows-latest, ubuntu-latest] + runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v1 - - uses: dtolnay/rust-toolchain@1.60.0 + - uses: dtolnay/rust-toolchain@1.63.0 - run: cargo check -p ash -p ash-rewrite --all-features check_ash_window_msrv: name: Check ash-window MSRV (1.64.0) - runs-on: ubuntu-latest + strategy: + matrix: + os: [windows-latest, ubuntu-latest] + runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v1 - uses: dtolnay/rust-toolchain@1.64.0 diff --git a/Changelog.md b/Changelog.md index 55059a908..561c53c3f 100644 --- a/Changelog.md +++ b/Changelog.md @@ -42,6 +42,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Define `Display` as `c_void` instead of `*mut c_void` to match Xlib (#751) - `VK_KHR_device_group_creation`: Take borrow of `Entry` in `fn new()` (#753) - `VK_KHR_device_group_creation`: Rename `vk::Instance`-returning function from `device()` to `instance()` (#759) +- extensions: Use Rust IO-safety types (`OwnedFd`, `BorrowedFd`, `OwnedHandle`, `BorrowedHandle`) in function signatures to signify ownership transfer (#791) ### Removed diff --git a/ash/Cargo.toml b/ash/Cargo.toml index db8516987..e4834acb6 100644 --- a/ash/Cargo.toml +++ b/ash/Cargo.toml @@ -13,7 +13,7 @@ readme = "../README.md" keywords = ["vulkan", "graphic"] documentation = "https://docs.rs/ash" edition = "2021" -rust-version = "1.60.0" +rust-version = "1.63.0" [dependencies] libloading = { version = "0.7", optional = true } diff --git a/ash/src/extensions/ext/acquire_drm_display.rs b/ash/src/extensions/ext/acquire_drm_display.rs index 03362c6ab..9c57f9f85 100644 --- a/ash/src/extensions/ext/acquire_drm_display.rs +++ b/ash/src/extensions/ext/acquire_drm_display.rs @@ -1,8 +1,11 @@ +#![cfg(unix)] + use crate::prelude::*; use crate::vk; use crate::{Entry, Instance}; use std::ffi::CStr; use std::mem; +use std::os::unix::io::{AsRawFd, BorrowedFd}; /// #[derive(Clone)] @@ -24,10 +27,10 @@ impl AcquireDrmDisplay { pub unsafe fn acquire_drm_display( &self, physical_device: vk::PhysicalDevice, - drm_fd: i32, + drm_fd: BorrowedFd<'_>, display: vk::DisplayKHR, ) -> VkResult<()> { - (self.fp.acquire_drm_display_ext)(physical_device, drm_fd, display).result() + (self.fp.acquire_drm_display_ext)(physical_device, drm_fd.as_raw_fd(), display).result() } /// @@ -35,12 +38,17 @@ impl AcquireDrmDisplay { pub unsafe fn get_drm_display( &self, physical_device: vk::PhysicalDevice, - drm_fd: i32, + drm_fd: BorrowedFd<'_>, connector_id: u32, ) -> VkResult { let mut display = mem::MaybeUninit::uninit(); - (self.fp.get_drm_display_ext)(physical_device, drm_fd, connector_id, display.as_mut_ptr()) - .assume_init_on_success(display) + (self.fp.get_drm_display_ext)( + physical_device, + drm_fd.as_raw_fd(), + connector_id, + display.as_mut_ptr(), + ) + .assume_init_on_success(display) } pub const NAME: &'static CStr = vk::ExtAcquireDrmDisplayFn::NAME; diff --git a/ash/src/extensions/ext/mod.rs b/ash/src/extensions/ext/mod.rs index 680a99761..658ae837f 100644 --- a/ash/src/extensions/ext/mod.rs +++ b/ash/src/extensions/ext/mod.rs @@ -1,3 +1,4 @@ +#[cfg(unix)] pub use self::acquire_drm_display::AcquireDrmDisplay; pub use self::buffer_device_address::BufferDeviceAddress; pub use self::calibrated_timestamps::CalibratedTimestamps; diff --git a/ash/src/extensions/khr/external_fence_fd.rs b/ash/src/extensions/khr/external_fence_fd.rs index 9bb8659eb..896fe529f 100644 --- a/ash/src/extensions/khr/external_fence_fd.rs +++ b/ash/src/extensions/khr/external_fence_fd.rs @@ -1,8 +1,12 @@ +#![cfg(unix)] + use crate::prelude::*; use crate::vk; use crate::{Device, Instance}; use std::ffi::CStr; use std::mem; +// use std::os::fd::OwnedFd; +use std::os::unix::io::{FromRawFd, OwnedFd}; #[derive(Clone)] pub struct ExternalFenceFd { @@ -26,10 +30,20 @@ impl ExternalFenceFd { } /// + /// + /// May return [`None`] if the fence has already been signaled at the time this function is + /// called. #[inline] - pub unsafe fn get_fence_fd(&self, get_info: &vk::FenceGetFdInfoKHR) -> VkResult { + pub unsafe fn get_fence_fd( + &self, + get_info: &vk::FenceGetFdInfoKHR, + ) -> VkResult> { let mut fd = -1; - (self.fp.get_fence_fd_khr)(self.handle, get_info, &mut fd).result_with_success(fd) + (self.fp.get_fence_fd_khr)(self.handle, get_info, &mut fd).result()?; + Ok(match fd { + -1 => None, + fd => Some(OwnedFd::from_raw_fd(fd)), + }) } pub const NAME: &'static CStr = vk::KhrExternalFenceFdFn::NAME; diff --git a/ash/src/extensions/khr/external_fence_win32.rs b/ash/src/extensions/khr/external_fence_win32.rs index 7dde56092..63b564917 100644 --- a/ash/src/extensions/khr/external_fence_win32.rs +++ b/ash/src/extensions/khr/external_fence_win32.rs @@ -1,8 +1,11 @@ +#![cfg(windows)] + use crate::prelude::*; use crate::vk; use crate::{Device, Instance}; use std::ffi::CStr; use std::mem; +use std::os::windows::io::{FromRawHandle, OwnedHandle}; use std::ptr; /// @@ -35,10 +38,10 @@ impl ExternalFenceWin32 { pub unsafe fn get_fence_win32_handle( &self, get_info: &vk::FenceGetWin32HandleInfoKHR, - ) -> VkResult { + ) -> VkResult { let mut handle = ptr::null_mut(); - (self.fp.get_fence_win32_handle_khr)(self.handle, get_info, &mut handle) - .result_with_success(handle) + (self.fp.get_fence_win32_handle_khr)(self.handle, get_info, &mut handle).result()?; + Ok(OwnedHandle::from_raw_handle(handle)) } pub const NAME: &'static CStr = vk::KhrExternalFenceWin32Fn::NAME; diff --git a/ash/src/extensions/khr/external_memory_fd.rs b/ash/src/extensions/khr/external_memory_fd.rs index 00e35a101..399eac50c 100644 --- a/ash/src/extensions/khr/external_memory_fd.rs +++ b/ash/src/extensions/khr/external_memory_fd.rs @@ -1,8 +1,11 @@ +#![cfg(unix)] + use crate::prelude::*; use crate::vk; use crate::{Device, Instance}; use std::ffi::CStr; use std::mem; +use std::os::unix::io::{AsRawFd, BorrowedFd, FromRawFd, OwnedFd}; /// #[derive(Clone)] @@ -22,9 +25,10 @@ impl ExternalMemoryFd { /// #[inline] - pub unsafe fn get_memory_fd(&self, get_fd_info: &vk::MemoryGetFdInfoKHR) -> VkResult { + pub unsafe fn get_memory_fd(&self, get_fd_info: &vk::MemoryGetFdInfoKHR) -> VkResult { let mut fd = -1; - (self.fp.get_memory_fd_khr)(self.handle, get_fd_info, &mut fd).result_with_success(fd) + (self.fp.get_memory_fd_khr)(self.handle, get_fd_info, &mut fd).result()?; + Ok(OwnedFd::from_raw_fd(fd)) } /// @@ -32,11 +36,16 @@ impl ExternalMemoryFd { pub unsafe fn get_memory_fd_properties( &self, handle_type: vk::ExternalMemoryHandleTypeFlags, - fd: i32, + fd: BorrowedFd<'_>, memory_fd_properties: &mut vk::MemoryFdPropertiesKHR, ) -> VkResult<()> { - (self.fp.get_memory_fd_properties_khr)(self.handle, handle_type, fd, memory_fd_properties) - .result() + (self.fp.get_memory_fd_properties_khr)( + self.handle, + handle_type, + fd.as_raw_fd(), + memory_fd_properties, + ) + .result() } pub const NAME: &'static CStr = vk::KhrExternalMemoryFdFn::NAME; diff --git a/ash/src/extensions/khr/external_memory_win32.rs b/ash/src/extensions/khr/external_memory_win32.rs index 53316b2cb..83856661e 100644 --- a/ash/src/extensions/khr/external_memory_win32.rs +++ b/ash/src/extensions/khr/external_memory_win32.rs @@ -1,8 +1,11 @@ +#![cfg(windows)] + use crate::prelude::*; use crate::vk; use crate::{Device, Instance}; use std::ffi::CStr; use std::mem; +use std::os::windows::io::{AsRawHandle, BorrowedHandle, FromRawHandle, OwnedHandle}; use std::ptr; /// @@ -26,10 +29,10 @@ impl ExternalMemoryWin32 { pub unsafe fn get_memory_win32_handle( &self, create_info: &vk::MemoryGetWin32HandleInfoKHR, - ) -> VkResult { + ) -> VkResult { let mut handle = ptr::null_mut(); - (self.fp.get_memory_win32_handle_khr)(self.handle, create_info, &mut handle) - .result_with_success(handle) + (self.fp.get_memory_win32_handle_khr)(self.handle, create_info, &mut handle).result()?; + Ok(OwnedHandle::from_raw_handle(handle)) } /// @@ -37,13 +40,13 @@ impl ExternalMemoryWin32 { pub unsafe fn get_memory_win32_handle_properties( &self, handle_type: vk::ExternalMemoryHandleTypeFlags, - handle: vk::HANDLE, + handle: BorrowedHandle<'_>, memory_win32_handle_properties: &mut vk::MemoryWin32HandlePropertiesKHR, ) -> VkResult<()> { (self.fp.get_memory_win32_handle_properties_khr)( self.handle, handle_type, - handle, + handle.as_raw_handle(), memory_win32_handle_properties, ) .result() diff --git a/ash/src/extensions/khr/external_semaphore_fd.rs b/ash/src/extensions/khr/external_semaphore_fd.rs index a96059da0..cc821c359 100644 --- a/ash/src/extensions/khr/external_semaphore_fd.rs +++ b/ash/src/extensions/khr/external_semaphore_fd.rs @@ -1,8 +1,11 @@ +#![cfg(unix)] + use crate::prelude::*; use crate::vk; use crate::{Device, Instance}; use std::ffi::CStr; use std::mem; +use std::os::unix::io::{FromRawFd, OwnedFd}; #[derive(Clone)] pub struct ExternalSemaphoreFd { @@ -30,9 +33,13 @@ impl ExternalSemaphoreFd { /// #[inline] - pub unsafe fn get_semaphore_fd(&self, get_info: &vk::SemaphoreGetFdInfoKHR) -> VkResult { + pub unsafe fn get_semaphore_fd( + &self, + get_info: &vk::SemaphoreGetFdInfoKHR, + ) -> VkResult { let mut fd = -1; - (self.fp.get_semaphore_fd_khr)(self.handle, get_info, &mut fd).result_with_success(fd) + (self.fp.get_semaphore_fd_khr)(self.handle, get_info, &mut fd).result()?; + Ok(OwnedFd::from_raw_fd(fd)) } pub const NAME: &'static CStr = vk::KhrExternalSemaphoreFdFn::NAME; diff --git a/ash/src/extensions/khr/external_semaphore_win32.rs b/ash/src/extensions/khr/external_semaphore_win32.rs index c567b242e..76b610b41 100644 --- a/ash/src/extensions/khr/external_semaphore_win32.rs +++ b/ash/src/extensions/khr/external_semaphore_win32.rs @@ -1,8 +1,11 @@ +#![cfg(windows)] + use crate::prelude::*; use crate::vk; use crate::{Device, Instance}; use std::ffi::CStr; use std::mem; +use std::os::windows::io::{FromRawHandle, OwnedHandle}; use std::ptr; /// @@ -35,10 +38,10 @@ impl ExternalSemaphoreWin32 { pub unsafe fn get_semaphore_win32_handle( &self, get_info: &vk::SemaphoreGetWin32HandleInfoKHR, - ) -> VkResult { + ) -> VkResult { let mut handle = ptr::null_mut(); - (self.fp.get_semaphore_win32_handle_khr)(self.handle, get_info, &mut handle) - .result_with_success(handle) + (self.fp.get_semaphore_win32_handle_khr)(self.handle, get_info, &mut handle).result()?; + Ok(OwnedHandle::from_raw_handle(handle)) } pub const NAME: &'static CStr = vk::KhrExternalSemaphoreWin32Fn::NAME; diff --git a/ash/src/extensions/khr/mod.rs b/ash/src/extensions/khr/mod.rs index e62ad54ac..860d8d107 100644 --- a/ash/src/extensions/khr/mod.rs +++ b/ash/src/extensions/khr/mod.rs @@ -11,11 +11,17 @@ pub use self::display::Display; pub use self::display_swapchain::DisplaySwapchain; pub use self::draw_indirect_count::DrawIndirectCount; pub use self::dynamic_rendering::DynamicRendering; +#[cfg(unix)] pub use self::external_fence_fd::ExternalFenceFd; +#[cfg(windows)] pub use self::external_fence_win32::ExternalFenceWin32; +#[cfg(unix)] pub use self::external_memory_fd::ExternalMemoryFd; +#[cfg(windows)] pub use self::external_memory_win32::ExternalMemoryWin32; +#[cfg(unix)] pub use self::external_semaphore_fd::ExternalSemaphoreFd; +#[cfg(windows)] pub use self::external_semaphore_win32::ExternalSemaphoreWin32; pub use self::get_memory_requirements2::GetMemoryRequirements2; pub use self::get_physical_device_properties2::GetPhysicalDeviceProperties2;