From 9c9552b8a43dc2ca46cd05286d00758bb84879c3 Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Fri, 1 Jul 2022 22:19:56 +0200 Subject: [PATCH] extensions/khr: Add VK_KHR_device_group (#631) --- Changelog.md | 1 + ash/src/extensions/khr/device_group.rs | 159 ++++++++++++++++++ .../extensions/khr/device_group_creation.rs | 1 + ash/src/extensions/khr/mod.rs | 2 + ash/src/extensions/khr/swapchain.rs | 34 +++- 5 files changed, 193 insertions(+), 4 deletions(-) create mode 100644 ash/src/extensions/khr/device_group.rs diff --git a/Changelog.md b/Changelog.md index d60b59f..1059337 100644 --- a/Changelog.md +++ b/Changelog.md @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added `VK_EXT_image_drm_format_modifier` device extension (#603) - Added new functions to `VK_KHR_swapchain`, available since Vulkan 1.1 (#629) - Added `VK_KHR_device_group_creation` instance extension (#630) +- Added `VK_KHR_device_group` device extension (#631) ## [0.37.0] - 2022-03-23 diff --git a/ash/src/extensions/khr/device_group.rs b/ash/src/extensions/khr/device_group.rs new file mode 100644 index 0000000..2926347 --- /dev/null +++ b/ash/src/extensions/khr/device_group.rs @@ -0,0 +1,159 @@ +#[cfg(doc)] +use super::Swapchain; +use crate::prelude::*; +use crate::vk; +use crate::{Device, Instance}; +use std::ffi::CStr; +use std::mem; + +/// +#[derive(Clone)] +pub struct DeviceGroup { + handle: vk::Device, + fp: vk::KhrDeviceGroupFn, +} + +impl DeviceGroup { + pub fn new(instance: &Instance, device: &Device) -> Self { + let handle = device.handle(); + let fp = vk::KhrDeviceGroupFn::load(|name| unsafe { + mem::transmute(instance.get_device_proc_addr(handle, name.as_ptr())) + }); + Self { handle, fp } + } + + /// + pub unsafe fn get_device_group_peer_memory_features( + &self, + heap_index: u32, + local_device_index: u32, + remote_device_index: u32, + ) -> vk::PeerMemoryFeatureFlags { + let mut peer_memory_features = mem::zeroed(); + (self.fp.get_device_group_peer_memory_features_khr)( + self.handle, + heap_index, + local_device_index, + remote_device_index, + &mut peer_memory_features, + ); + peer_memory_features + } + + /// + pub unsafe fn cmd_set_device_mask(&self, command_buffer: vk::CommandBuffer, device_mask: u32) { + (self.fp.cmd_set_device_mask_khr)(command_buffer, device_mask) + } + + /// + pub unsafe fn cmd_dispatch_base( + &self, + command_buffer: vk::CommandBuffer, + base_group: (u32, u32, u32), + group_count: (u32, u32, u32), + ) { + (self.fp.cmd_dispatch_base_khr)( + command_buffer, + base_group.0, + base_group.1, + base_group.2, + group_count.0, + group_count.1, + group_count.2, + ) + } + + /// Requires [`VK_KHR_surface`] to be enabled. + /// + /// Also available as [`Swapchain::get_device_group_present_capabilities()`] since [Vulkan 1.1]. + /// + /// + /// + /// [Vulkan 1.1]: https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_VERSION_1_1.html + /// [`VK_KHR_surface`]: https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_KHR_surface.html + pub unsafe fn get_device_group_present_capabilities( + &self, + device_group_present_capabilities: &mut vk::DeviceGroupPresentCapabilitiesKHR, + ) -> VkResult<()> { + (self.fp.get_device_group_present_capabilities_khr)( + self.handle, + device_group_present_capabilities, + ) + .result() + } + + /// Requires [`VK_KHR_surface`] to be enabled. + /// + /// Also available as [`Swapchain::get_device_group_surface_present_modes()`] since [Vulkan 1.1]. + /// + /// + /// + /// [Vulkan 1.1]: https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_VERSION_1_1.html + /// [`VK_KHR_surface`]: https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_KHR_surface.html + pub unsafe fn get_device_group_surface_present_modes( + &self, + surface: vk::SurfaceKHR, + ) -> VkResult { + let mut modes = mem::zeroed(); + (self.fp.get_device_group_surface_present_modes_khr)(self.handle, surface, &mut modes) + .result_with_success(modes) + } + + /// Requires [`VK_KHR_surface`] to be enabled. + /// + /// Also available as [`Swapchain::get_physical_device_present_rectangles()`] since [Vulkan 1.1]. + /// + /// + /// + /// [Vulkan 1.1]: https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_VERSION_1_1.html + /// [`VK_KHR_surface`]: https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_KHR_surface.html + pub unsafe fn get_physical_device_present_rectangles( + &self, + physical_device: vk::PhysicalDevice, + surface: vk::SurfaceKHR, + ) -> VkResult> { + read_into_uninitialized_vector(|count, data| { + (self.fp.get_physical_device_present_rectangles_khr)( + physical_device, + surface, + count, + data, + ) + }) + } + + /// On success, returns the next image's index and whether the swapchain is suboptimal for the surface. + /// + /// Requires [`VK_KHR_swapchain`] to be enabled. + /// + /// Also available as [`Swapchain::acquire_next_image2()`] since [Vulkan 1.1]. + /// + /// + /// + /// [Vulkan 1.1]: https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_VERSION_1_1.html + /// [`VK_KHR_swapchain`]: https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_KHR_swapchain.html + pub unsafe fn acquire_next_image2( + &self, + acquire_info: &vk::AcquireNextImageInfoKHR, + ) -> VkResult<(u32, bool)> { + let mut index = 0; + let err_code = (self.fp.acquire_next_image2_khr)(self.handle, acquire_info, &mut index); + match err_code { + vk::Result::SUCCESS => Ok((index, false)), + vk::Result::SUBOPTIMAL_KHR => Ok((index, true)), + _ => Err(err_code), + } + } + + pub const fn name() -> &'static CStr { + vk::KhrDeviceGroupFn::name() + } + + pub fn fp(&self) -> &vk::KhrDeviceGroupFn { + &self.fp + } + + pub fn device(&self) -> vk::Device { + self.handle + } +} diff --git a/ash/src/extensions/khr/device_group_creation.rs b/ash/src/extensions/khr/device_group_creation.rs index f6c72b4..28c6089 100644 --- a/ash/src/extensions/khr/device_group_creation.rs +++ b/ash/src/extensions/khr/device_group_creation.rs @@ -5,6 +5,7 @@ use std::ffi::CStr; use std::mem; use std::ptr; +/// #[derive(Clone)] pub struct DeviceGroupCreation { handle: vk::Instance, diff --git a/ash/src/extensions/khr/mod.rs b/ash/src/extensions/khr/mod.rs index fe1c5cf..babb062 100644 --- a/ash/src/extensions/khr/mod.rs +++ b/ash/src/extensions/khr/mod.rs @@ -4,6 +4,7 @@ pub use self::buffer_device_address::BufferDeviceAddress; pub use self::copy_commands2::CopyCommands2; pub use self::create_render_pass2::CreateRenderPass2; pub use self::deferred_host_operations::DeferredHostOperations; +pub use self::device_group::DeviceGroup; pub use self::device_group_creation::DeviceGroupCreation; pub use self::display::Display; pub use self::display_swapchain::DisplaySwapchain; @@ -40,6 +41,7 @@ mod buffer_device_address; mod copy_commands2; mod create_render_pass2; mod deferred_host_operations; +mod device_group; mod device_group_creation; mod display; mod display_swapchain; diff --git a/ash/src/extensions/khr/swapchain.rs b/ash/src/extensions/khr/swapchain.rs index d375538..5c1797f 100755 --- a/ash/src/extensions/khr/swapchain.rs +++ b/ash/src/extensions/khr/swapchain.rs @@ -1,3 +1,5 @@ +#[cfg(doc)] +use super::DeviceGroup; use crate::prelude::*; use crate::vk; use crate::RawPtr; @@ -97,9 +99,15 @@ impl Swapchain { } } - /// Only available since Vulkan 1.1. + /// Only available since [Vulkan 1.1]. + /// + /// Also available as [`DeviceGroup::get_device_group_present_capabilities()`] + /// when [`VK_KHR_surface`] is enabled. /// /// + /// + /// [Vulkan 1.1]: https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_VERSION_1_1.html + /// [`VK_KHR_surface`]: https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_KHR_surface.html pub unsafe fn get_device_group_present_capabilities( &self, device_group_present_capabilities: &mut vk::DeviceGroupPresentCapabilitiesKHR, @@ -111,9 +119,15 @@ impl Swapchain { .result() } - /// Only available since Vulkan 1.1. + /// Only available since [Vulkan 1.1]. + /// + /// Also available as [`DeviceGroup::get_device_group_surface_present_modes()`] + /// when [`VK_KHR_surface`] is enabled. /// /// + /// + /// [Vulkan 1.1]: https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_VERSION_1_1.html + /// [`VK_KHR_surface`]: https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_KHR_surface.html pub unsafe fn get_device_group_surface_present_modes( &self, surface: vk::SurfaceKHR, @@ -123,9 +137,15 @@ impl Swapchain { .result_with_success(modes) } - /// Only available since Vulkan 1.1. + /// Only available since [Vulkan 1.1]. + /// + /// Also available as [`DeviceGroup::get_physical_device_present_rectangles()`] + /// when [`VK_KHR_surface`] is enabled. /// /// + /// + /// [Vulkan 1.1]: https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_VERSION_1_1.html + /// [`VK_KHR_surface`]: https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_KHR_surface.html pub unsafe fn get_physical_device_present_rectangles( &self, physical_device: vk::PhysicalDevice, @@ -143,9 +163,15 @@ impl Swapchain { /// On success, returns the next image's index and whether the swapchain is suboptimal for the surface. /// - /// Only available since Vulkan 1.1. + /// Only available since [Vulkan 1.1]. + /// + /// Also available as [`DeviceGroup::acquire_next_image2()`] + /// when [`VK_KHR_swapchain`] is enabled. /// /// + /// + /// [Vulkan 1.1]: https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_VERSION_1_1.html + /// [`VK_KHR_swapchain`]: https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_KHR_swapchain.html pub unsafe fn acquire_next_image2( &self, acquire_info: &vk::AcquireNextImageInfoKHR,