ash/extensions/khr/
performance_query.rs

1//! <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_performance_query.html>
2
3use crate::prelude::*;
4use crate::vk;
5use core::mem;
6use core::ptr;
7
8impl crate::khr::performance_query::Device {
9    /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkAcquireProfilingLockKHR.html>
10    #[inline]
11    pub unsafe fn acquire_profiling_lock(
12        &self,
13        info: &vk::AcquireProfilingLockInfoKHR<'_>,
14    ) -> VkResult<()> {
15        (self.fp.acquire_profiling_lock_khr)(self.handle, info).result()
16    }
17
18    /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkReleaseProfilingLockKHR.html>
19    #[inline]
20    pub unsafe fn release_profiling_lock(&self) {
21        (self.fp.release_profiling_lock_khr)(self.handle)
22    }
23}
24
25impl crate::khr::performance_query::Instance {
26    /// Retrieve the number of elements to pass to [`enumerate_physical_device_queue_family_performance_query_counters()`][Self::enumerate_physical_device_queue_family_performance_query_counters()]
27    #[inline]
28    pub unsafe fn enumerate_physical_device_queue_family_performance_query_counters_len(
29        &self,
30        physical_device: vk::PhysicalDevice,
31        queue_family_index: u32,
32    ) -> VkResult<usize> {
33        let mut count = mem::MaybeUninit::uninit();
34        (self
35            .fp
36            .enumerate_physical_device_queue_family_performance_query_counters_khr)(
37            physical_device,
38            queue_family_index,
39            count.as_mut_ptr(),
40            ptr::null_mut(),
41            ptr::null_mut(),
42        )
43        .assume_init_on_success(count)
44        .map(|c| c as usize)
45    }
46
47    /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR.html>
48    ///
49    /// Call [`enumerate_physical_device_queue_family_performance_query_counters_len()`][Self::enumerate_physical_device_queue_family_performance_query_counters_len()] to query the number of elements to pass to `out_counters` and `out_counter_descriptions`.
50    /// Be sure to [`Default::default()`]-initialize these elements and optionally set their `p_next` pointer.
51    #[inline]
52    pub unsafe fn enumerate_physical_device_queue_family_performance_query_counters(
53        &self,
54        physical_device: vk::PhysicalDevice,
55        queue_family_index: u32,
56        out_counters: &mut [vk::PerformanceCounterKHR<'_>],
57        out_counter_descriptions: &mut [vk::PerformanceCounterDescriptionKHR<'_>],
58    ) -> VkResult<()> {
59        assert_eq!(out_counters.len(), out_counter_descriptions.len());
60        let mut count = out_counters.len() as u32;
61        (self
62            .fp
63            .enumerate_physical_device_queue_family_performance_query_counters_khr)(
64            physical_device,
65            queue_family_index,
66            &mut count,
67            out_counters.as_mut_ptr(),
68            out_counter_descriptions.as_mut_ptr(),
69        )
70        .result()?;
71        assert_eq!(count as usize, out_counters.len());
72        assert_eq!(count as usize, out_counter_descriptions.len());
73        Ok(())
74    }
75
76    /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR.html>
77    #[inline]
78    pub unsafe fn get_physical_device_queue_family_performance_query_passes(
79        &self,
80        physical_device: vk::PhysicalDevice,
81        performance_query_create_info: &vk::QueryPoolPerformanceCreateInfoKHR<'_>,
82    ) -> u32 {
83        let mut num_passes = mem::MaybeUninit::uninit();
84        (self
85            .fp
86            .get_physical_device_queue_family_performance_query_passes_khr)(
87            physical_device,
88            performance_query_create_info,
89            num_passes.as_mut_ptr(),
90        );
91        num_passes.assume_init()
92    }
93}