From 5ca5860e45d53e9fc58eafd4ca7a098424949f1f Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Thu, 11 Sep 2025 11:39:23 +0200 Subject: [PATCH] extensions/nv: Add VK_NV_cooperative_vector --- Changelog.md | 1 + ash/src/extensions/nv/cooperative_vector.rs | 70 +++++++++++++++++++++ ash/src/extensions/nv/mod.rs | 1 + 3 files changed, 72 insertions(+) create mode 100644 ash/src/extensions/nv/cooperative_vector.rs diff --git a/Changelog.md b/Changelog.md index 2ec8b61e6..f233b0bc1 100644 --- a/Changelog.md +++ b/Changelog.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added `VK_EXT_metal_objects` device extension (#942) - Added `VK_AMD_anti_lag` device extension (#943) - Added `VK_KHR_video_queue`, `VK_KHR_video_encode_queue`, and `VK_KHR_video_decode_queue` device extensions (#965) +- Added `VK_NV_cooperative_vector` device extension (#1007) ### Changed diff --git a/ash/src/extensions/nv/cooperative_vector.rs b/ash/src/extensions/nv/cooperative_vector.rs new file mode 100644 index 000000000..6a862272d --- /dev/null +++ b/ash/src/extensions/nv/cooperative_vector.rs @@ -0,0 +1,70 @@ +//! + +use crate::vk; +use crate::VkResult; +use core::mem; +use core::ptr; + +impl crate::nv::cooperative_vector::Instance { + /// Retrieve the number of elements to pass to [`get_physical_device_cooperative_vector_properties()`][Self::get_physical_device_cooperative_vector_properties()] + #[inline] + pub unsafe fn get_physical_device_cooperative_vector_properties_len( + &self, + physical_device: vk::PhysicalDevice, + ) -> VkResult { + let mut count = mem::MaybeUninit::uninit(); + (self.fp.get_physical_device_cooperative_vector_properties_nv)( + physical_device, + count.as_mut_ptr(), + ptr::null_mut(), + ) + .assume_init_on_success(count) + .map(|c| c as usize) + } + + /// + /// + /// Call [`get_physical_device_cooperative_vector_properties_len()`][Self::get_physical_device_cooperative_vector_properties_len()] to query the number of elements to pass to `out`. + /// Be sure to [`Default::default()`]-initialize these elements and optionally set their `p_next` pointer. + #[inline] + pub unsafe fn get_physical_device_cooperative_vector_properties( + &self, + physical_device: vk::PhysicalDevice, + out: &mut [vk::CooperativeVectorPropertiesNV<'_>], + ) -> VkResult<()> { + let mut count = out.len() as u32; + (self.fp.get_physical_device_cooperative_vector_properties_nv)( + physical_device, + &mut count, + out.as_mut_ptr(), + ) + .result()?; + assert_eq!(count as usize, out.len()); + Ok(()) + } +} + +impl crate::nv::cooperative_vector::Device { + /// + #[inline] + pub unsafe fn cmd_convert_cooperative_vector_matrix( + &self, + command_buffer: vk::CommandBuffer, + infos: &[vk::ConvertCooperativeVectorMatrixInfoNV<'_>], + ) { + (self.fp.cmd_convert_cooperative_vector_matrix_nv)( + command_buffer, + infos.len() as u32, + infos.as_ptr(), + ) + } + + /// + #[inline] + pub unsafe fn convert_cooperative_vector_matrix( + &self, + info: &vk::ConvertCooperativeVectorMatrixInfoNV<'_>, + ) -> VkResult<()> { + (self.fp.convert_cooperative_vector_matrix_nv)(self.handle, info).result() + } +} diff --git a/ash/src/extensions/nv/mod.rs b/ash/src/extensions/nv/mod.rs index b2b6f9904..a2b4a499c 100644 --- a/ash/src/extensions/nv/mod.rs +++ b/ash/src/extensions/nv/mod.rs @@ -1,3 +1,4 @@ +pub mod cooperative_vector; pub mod copy_memory_indirect; pub mod coverage_reduction_mode; pub mod cuda_kernel_launch;