diff --git a/Changelog.md b/Changelog.md index 2b292e09e..189a04754 100644 --- a/Changelog.md +++ b/Changelog.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- Added `VK_NV_coverage_reduction_mode` device extension (#617) - Added `VK_EXT_sample_locations` device extension (#616) - Update Vulkan-Headers to 1.3.211 (#605, #608) diff --git a/ash/src/extensions/ext/calibrated_timestamps.rs b/ash/src/extensions/ext/calibrated_timestamps.rs index c5e8db773..241a9907d 100644 --- a/ash/src/extensions/ext/calibrated_timestamps.rs +++ b/ash/src/extensions/ext/calibrated_timestamps.rs @@ -1,4 +1,4 @@ -use crate::prelude::{read_into_uninitialized_vector, VkResult}; +use crate::prelude::*; use crate::vk; use crate::{Entry, Instance}; use std::ffi::CStr; diff --git a/ash/src/extensions/nv/coverage_reduction_mode.rs b/ash/src/extensions/nv/coverage_reduction_mode.rs new file mode 100644 index 000000000..fa972fa3c --- /dev/null +++ b/ash/src/extensions/nv/coverage_reduction_mode.rs @@ -0,0 +1,66 @@ +use crate::prelude::*; +use crate::vk; +use crate::{Entry, Instance}; +use std::ffi::CStr; +use std::mem; + +/// +#[derive(Clone)] +pub struct CoverageReductionMode { + fp: vk::NvCoverageReductionModeFn, +} + +impl CoverageReductionMode { + pub fn new(entry: &Entry, instance: &Instance) -> Self { + let fp = vk::NvCoverageReductionModeFn::load(|name| unsafe { + mem::transmute(entry.get_instance_proc_addr(instance.handle(), name.as_ptr())) + }); + Self { fp } + } + + /// Retrieve the number of elements to pass to [`get_physical_device_supported_framebuffer_mixed_samples_combinations()`][Self::get_physical_device_supported_framebuffer_mixed_samples_combinations()] + pub unsafe fn get_physical_device_supported_framebuffer_mixed_samples_combinations_len( + &self, + physical_device: vk::PhysicalDevice, + ) -> VkResult { + let mut count = 0; + (self + .fp + .get_physical_device_supported_framebuffer_mixed_samples_combinations_nv)( + physical_device, + &mut count, + std::ptr::null_mut(), + ) + .result_with_success(count as usize) + } + + /// + /// + /// Call [`get_physical_device_supported_framebuffer_mixed_samples_combinations_len()`][Self::get_physical_device_supported_framebuffer_mixed_samples_combinations_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. + pub unsafe fn get_physical_device_supported_framebuffer_mixed_samples_combinations( + &self, + physical_device: vk::PhysicalDevice, + out: &mut [vk::FramebufferMixedSamplesCombinationNV], + ) -> VkResult<()> { + let mut count = out.len() as u32; + (self + .fp + .get_physical_device_supported_framebuffer_mixed_samples_combinations_nv)( + physical_device, + &mut count, + out.as_mut_ptr(), + ) + .result()?; + assert_eq!(count as usize, out.len()); + Ok(()) + } + + pub const fn name() -> &'static CStr { + vk::NvCoverageReductionModeFn::name() + } + + pub fn fp(&self) -> &vk::NvCoverageReductionModeFn { + &self.fp + } +} diff --git a/ash/src/extensions/nv/mod.rs b/ash/src/extensions/nv/mod.rs index 47b952fb1..bfde37a55 100644 --- a/ash/src/extensions/nv/mod.rs +++ b/ash/src/extensions/nv/mod.rs @@ -1,7 +1,9 @@ +pub use self::coverage_reduction_mode::CoverageReductionMode; pub use self::device_diagnostic_checkpoints::DeviceDiagnosticCheckpoints; pub use self::mesh_shader::MeshShader; pub use self::ray_tracing::RayTracing; +mod coverage_reduction_mode; mod device_diagnostic_checkpoints; mod mesh_shader; mod ray_tracing;