Skip to main content

jay_ash/extensions/khr/
acceleration_structure.rs

1//! <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_acceleration_structure.html>
2
3use crate::RawPtr;
4use crate::prelude::*;
5use crate::vk;
6use alloc::vec::Vec;
7use core::mem;
8
9impl crate::khr::acceleration_structure::Device {
10    /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkCreateAccelerationStructureKHR.html>
11    #[inline]
12    pub unsafe fn create_acceleration_structure(
13        &self,
14        create_info: &vk::AccelerationStructureCreateInfoKHR<'_>,
15        allocation_callbacks: Option<&vk::AllocationCallbacks<'_>>,
16    ) -> VkResult<vk::AccelerationStructureKHR> {
17        unsafe {
18            let mut accel_struct = mem::MaybeUninit::uninit();
19            (self.fp.create_acceleration_structure_khr)(
20                self.handle,
21                create_info,
22                allocation_callbacks.as_raw_ptr(),
23                accel_struct.as_mut_ptr(),
24            )
25            .assume_init_on_success(accel_struct)
26        }
27    }
28
29    /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkDestroyAccelerationStructureKHR.html>
30    #[inline]
31    pub unsafe fn destroy_acceleration_structure(
32        &self,
33        accel_struct: vk::AccelerationStructureKHR,
34        allocation_callbacks: Option<&vk::AllocationCallbacks<'_>>,
35    ) {
36        unsafe {
37            (self.fp.destroy_acceleration_structure_khr)(
38                self.handle,
39                accel_struct,
40                allocation_callbacks.as_raw_ptr(),
41            );
42        }
43    }
44
45    /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkCmdBuildAccelerationStructuresKHR.html>
46    #[inline]
47    pub unsafe fn cmd_build_acceleration_structures(
48        &self,
49        command_buffer: vk::CommandBuffer,
50        infos: &[vk::AccelerationStructureBuildGeometryInfoKHR<'_>],
51        build_range_infos: &[&[vk::AccelerationStructureBuildRangeInfoKHR]],
52    ) {
53        unsafe {
54            assert_eq!(infos.len(), build_range_infos.len());
55
56            let build_range_infos = build_range_infos
57                .iter()
58                .zip(infos.iter())
59                .map(|(range_info, info)| {
60                    assert_eq!(range_info.len(), info.geometry_count as usize);
61                    range_info.as_ptr()
62                })
63                .collect::<Vec<_>>();
64
65            (self.fp.cmd_build_acceleration_structures_khr)(
66                command_buffer,
67                infos.len() as _,
68                infos.as_ptr(),
69                build_range_infos.as_ptr(),
70            );
71        }
72    }
73
74    /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkCmdBuildAccelerationStructuresIndirectKHR.html>
75    #[inline]
76    pub unsafe fn cmd_build_acceleration_structures_indirect(
77        &self,
78        command_buffer: vk::CommandBuffer,
79        infos: &[vk::AccelerationStructureBuildGeometryInfoKHR<'_>],
80        indirect_device_addresses: &[vk::DeviceAddress],
81        indirect_strides: &[u32],
82        max_primitive_counts: &[&[u32]],
83    ) {
84        unsafe {
85            assert_eq!(infos.len(), indirect_device_addresses.len());
86            assert_eq!(infos.len(), indirect_strides.len());
87            assert_eq!(infos.len(), max_primitive_counts.len());
88
89            let max_primitive_counts = max_primitive_counts
90                .iter()
91                .zip(infos.iter())
92                .map(|(cnt, info)| {
93                    assert_eq!(cnt.len(), info.geometry_count as usize);
94                    cnt.as_ptr()
95                })
96                .collect::<Vec<_>>();
97
98            (self.fp.cmd_build_acceleration_structures_indirect_khr)(
99                command_buffer,
100                infos.len() as _,
101                infos.as_ptr(),
102                indirect_device_addresses.as_ptr(),
103                indirect_strides.as_ptr(),
104                max_primitive_counts.as_ptr(),
105            );
106        }
107    }
108
109    /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkBuildAccelerationStructuresKHR.html>
110    #[inline]
111    pub unsafe fn build_acceleration_structures(
112        &self,
113        deferred_operation: vk::DeferredOperationKHR,
114        infos: &[vk::AccelerationStructureBuildGeometryInfoKHR<'_>],
115        build_range_infos: &[&[vk::AccelerationStructureBuildRangeInfoKHR]],
116    ) -> VkResult<()> {
117        unsafe {
118            assert_eq!(infos.len(), build_range_infos.len());
119
120            let build_range_infos = build_range_infos
121                .iter()
122                .zip(infos.iter())
123                .map(|(range_info, info)| {
124                    assert_eq!(range_info.len(), info.geometry_count as usize);
125                    range_info.as_ptr()
126                })
127                .collect::<Vec<_>>();
128
129            (self.fp.build_acceleration_structures_khr)(
130                self.handle,
131                deferred_operation,
132                infos.len() as _,
133                infos.as_ptr(),
134                build_range_infos.as_ptr(),
135            )
136            .result()
137        }
138    }
139
140    /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkCopyAccelerationStructureKHR.html>
141    #[inline]
142    pub unsafe fn copy_acceleration_structure(
143        &self,
144        deferred_operation: vk::DeferredOperationKHR,
145        info: &vk::CopyAccelerationStructureInfoKHR<'_>,
146    ) -> VkResult<()> {
147        unsafe {
148            (self.fp.copy_acceleration_structure_khr)(self.handle, deferred_operation, info)
149                .result()
150        }
151    }
152
153    /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkCopyAccelerationStructureToMemoryKHR.html>
154    #[inline]
155    pub unsafe fn copy_acceleration_structure_to_memory(
156        &self,
157        deferred_operation: vk::DeferredOperationKHR,
158        info: &vk::CopyAccelerationStructureToMemoryInfoKHR<'_>,
159    ) -> VkResult<()> {
160        unsafe {
161            (self.fp.copy_acceleration_structure_to_memory_khr)(
162                self.handle,
163                deferred_operation,
164                info,
165            )
166            .result()
167        }
168    }
169
170    /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkCopyMemoryToAccelerationStructureKHR.html>
171    #[inline]
172    pub unsafe fn copy_memory_to_acceleration_structure(
173        &self,
174        deferred_operation: vk::DeferredOperationKHR,
175        info: &vk::CopyMemoryToAccelerationStructureInfoKHR<'_>,
176    ) -> VkResult<()> {
177        unsafe {
178            (self.fp.copy_memory_to_acceleration_structure_khr)(
179                self.handle,
180                deferred_operation,
181                info,
182            )
183            .result()
184        }
185    }
186
187    /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkWriteAccelerationStructuresPropertiesKHR.html>
188    #[inline]
189    pub unsafe fn write_acceleration_structures_properties(
190        &self,
191        acceleration_structures: &[vk::AccelerationStructureKHR],
192        query_type: vk::QueryType,
193        data: &mut [u8],
194        stride: usize,
195    ) -> VkResult<()> {
196        unsafe {
197            (self.fp.write_acceleration_structures_properties_khr)(
198                self.handle,
199                acceleration_structures.len() as _,
200                acceleration_structures.as_ptr(),
201                query_type,
202                data.len(),
203                data.as_mut_ptr().cast(),
204                stride,
205            )
206            .result()
207        }
208    }
209
210    /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkCmdCopyAccelerationStructureKHR.html>
211    #[inline]
212    pub unsafe fn cmd_copy_acceleration_structure(
213        &self,
214        command_buffer: vk::CommandBuffer,
215        info: &vk::CopyAccelerationStructureInfoKHR<'_>,
216    ) {
217        unsafe {
218            (self.fp.cmd_copy_acceleration_structure_khr)(command_buffer, info);
219        }
220    }
221
222    /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkCmdCopyAccelerationStructureToMemoryKHR.html>
223    #[inline]
224    pub unsafe fn cmd_copy_acceleration_structure_to_memory(
225        &self,
226        command_buffer: vk::CommandBuffer,
227        info: &vk::CopyAccelerationStructureToMemoryInfoKHR<'_>,
228    ) {
229        unsafe {
230            (self.fp.cmd_copy_acceleration_structure_to_memory_khr)(command_buffer, info);
231        }
232    }
233
234    /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkCmdCopyMemoryToAccelerationStructureKHR.html>
235    #[inline]
236    pub unsafe fn cmd_copy_memory_to_acceleration_structure(
237        &self,
238        command_buffer: vk::CommandBuffer,
239        info: &vk::CopyMemoryToAccelerationStructureInfoKHR<'_>,
240    ) {
241        unsafe {
242            (self.fp.cmd_copy_memory_to_acceleration_structure_khr)(command_buffer, info);
243        }
244    }
245
246    /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkGetAccelerationStructureHandleKHR.html>
247    #[inline]
248    pub unsafe fn get_acceleration_structure_device_address(
249        &self,
250        info: &vk::AccelerationStructureDeviceAddressInfoKHR<'_>,
251    ) -> vk::DeviceAddress {
252        unsafe { (self.fp.get_acceleration_structure_device_address_khr)(self.handle, info) }
253    }
254
255    /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkCmdWriteAccelerationStructuresPropertiesKHR.html>
256    #[inline]
257    pub unsafe fn cmd_write_acceleration_structures_properties(
258        &self,
259        command_buffer: vk::CommandBuffer,
260        structures: &[vk::AccelerationStructureKHR],
261        query_type: vk::QueryType,
262        query_pool: vk::QueryPool,
263        first_query: u32,
264    ) {
265        unsafe {
266            (self.fp.cmd_write_acceleration_structures_properties_khr)(
267                command_buffer,
268                structures.len() as _,
269                structures.as_ptr(),
270                query_type,
271                query_pool,
272                first_query,
273            );
274        }
275    }
276
277    /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkGetDeviceAccelerationStructureCompatibilityKHR.html>
278    #[inline]
279    pub unsafe fn get_device_acceleration_structure_compatibility(
280        &self,
281        version: &vk::AccelerationStructureVersionInfoKHR<'_>,
282    ) -> vk::AccelerationStructureCompatibilityKHR {
283        unsafe {
284            let mut compatibility = mem::MaybeUninit::uninit();
285            (self.fp.get_device_acceleration_structure_compatibility_khr)(
286                self.handle,
287                version,
288                compatibility.as_mut_ptr(),
289            );
290            compatibility.assume_init()
291        }
292    }
293
294    /// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkGetAccelerationStructureBuildSizesKHR.html>
295    #[inline]
296    pub unsafe fn get_acceleration_structure_build_sizes(
297        &self,
298        build_type: vk::AccelerationStructureBuildTypeKHR,
299        build_info: &vk::AccelerationStructureBuildGeometryInfoKHR<'_>,
300        max_primitive_counts: &[u32],
301        size_info: &mut vk::AccelerationStructureBuildSizesInfoKHR<'_>,
302    ) {
303        unsafe {
304            assert_eq!(max_primitive_counts.len(), build_info.geometry_count as _);
305
306            (self.fp.get_acceleration_structure_build_sizes_khr)(
307                self.handle,
308                build_type,
309                build_info,
310                max_primitive_counts.as_ptr(),
311                size_info,
312            )
313        }
314    }
315}