1use crate::RawPtr;
4use crate::prelude::*;
5use crate::vk;
6use alloc::vec::Vec;
7use core::mem;
8
9impl crate::khr::acceleration_structure::Device {
10 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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 #[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}