1 use crate::prelude::*;
2 use crate::vk;
3 use crate::{Entry, Instance};
4 use std::ffi::CStr;
5 use std::mem;
6 
7 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_NV_coverage_reduction_mode.html>
8 #[derive(Clone)]
9 pub struct CoverageReductionMode {
10     fp: vk::NvCoverageReductionModeFn,
11 }
12 
13 impl CoverageReductionMode {
new(entry: &Entry, instance: &Instance) -> Self14     pub fn new(entry: &Entry, instance: &Instance) -> Self {
15         let fp = vk::NvCoverageReductionModeFn::load(|name| unsafe {
16             mem::transmute(entry.get_instance_proc_addr(instance.handle(), name.as_ptr()))
17         });
18         Self { fp }
19     }
20 
21     /// 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()]
22     #[inline]
get_physical_device_supported_framebuffer_mixed_samples_combinations_len( &self, physical_device: vk::PhysicalDevice, ) -> VkResult<usize>23     pub unsafe fn get_physical_device_supported_framebuffer_mixed_samples_combinations_len(
24         &self,
25         physical_device: vk::PhysicalDevice,
26     ) -> VkResult<usize> {
27         let mut count = 0;
28         (self
29             .fp
30             .get_physical_device_supported_framebuffer_mixed_samples_combinations_nv)(
31             physical_device,
32             &mut count,
33             std::ptr::null_mut(),
34         )
35         .result_with_success(count as usize)
36     }
37 
38     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV.html>
39     ///
40     /// 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`.
41     /// Be sure to [`Default::default()`]-initialize these elements and optionally set their `p_next` pointer.
42     #[inline]
get_physical_device_supported_framebuffer_mixed_samples_combinations( &self, physical_device: vk::PhysicalDevice, out: &mut [vk::FramebufferMixedSamplesCombinationNV], ) -> VkResult<()>43     pub unsafe fn get_physical_device_supported_framebuffer_mixed_samples_combinations(
44         &self,
45         physical_device: vk::PhysicalDevice,
46         out: &mut [vk::FramebufferMixedSamplesCombinationNV],
47     ) -> VkResult<()> {
48         let mut count = out.len() as u32;
49         (self
50             .fp
51             .get_physical_device_supported_framebuffer_mixed_samples_combinations_nv)(
52             physical_device,
53             &mut count,
54             out.as_mut_ptr(),
55         )
56         .result()?;
57         assert_eq!(count as usize, out.len());
58         Ok(())
59     }
60 
61     #[inline]
name() -> &'static CStr62     pub const fn name() -> &'static CStr {
63         vk::NvCoverageReductionModeFn::name()
64     }
65 
66     #[inline]
fp(&self) -> &vk::NvCoverageReductionModeFn67     pub fn fp(&self) -> &vk::NvCoverageReductionModeFn {
68         &self.fp
69     }
70 }
71