Skip to main content

jay_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        unsafe { (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        unsafe { (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        unsafe {
34            let mut count = mem::MaybeUninit::uninit();
35            (self
36                .fp
37                .enumerate_physical_device_queue_family_performance_query_counters_khr)(
38                physical_device,
39                queue_family_index,
40                count.as_mut_ptr(),
41                ptr::null_mut(),
42                ptr::null_mut(),
43            )
44            .assume_init_on_success(count)
45            .map(|c| c as usize)
46        }
47    }
48
49    /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR.html>
50    ///
51    /// 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`.
52    /// Be sure to [`Default::default()`]-initialize these elements and optionally set their `p_next` pointer.
53    #[inline]
54    pub unsafe fn enumerate_physical_device_queue_family_performance_query_counters(
55        &self,
56        physical_device: vk::PhysicalDevice,
57        queue_family_index: u32,
58        out_counters: &mut [vk::PerformanceCounterKHR<'_>],
59        out_counter_descriptions: &mut [vk::PerformanceCounterDescriptionKHR<'_>],
60    ) -> VkResult<()> {
61        unsafe {
62            assert_eq!(out_counters.len(), out_counter_descriptions.len());
63            let mut count = out_counters.len() as u32;
64            (self
65                .fp
66                .enumerate_physical_device_queue_family_performance_query_counters_khr)(
67                physical_device,
68                queue_family_index,
69                &mut count,
70                out_counters.as_mut_ptr(),
71                out_counter_descriptions.as_mut_ptr(),
72            )
73            .result()?;
74            assert_eq!(count as usize, out_counters.len());
75            assert_eq!(count as usize, out_counter_descriptions.len());
76            Ok(())
77        }
78    }
79
80    /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR.html>
81    #[inline]
82    pub unsafe fn get_physical_device_queue_family_performance_query_passes(
83        &self,
84        physical_device: vk::PhysicalDevice,
85        performance_query_create_info: &vk::QueryPoolPerformanceCreateInfoKHR<'_>,
86    ) -> u32 {
87        unsafe {
88            let mut num_passes = mem::MaybeUninit::uninit();
89            (self
90                .fp
91                .get_physical_device_queue_family_performance_query_passes_khr)(
92                physical_device,
93                performance_query_create_info,
94                num_passes.as_mut_ptr(),
95            );
96            num_passes.assume_init()
97        }
98    }
99}