1 use crate::vk;
2 use crate::{Device, Instance};
3 use std::ffi::CStr;
4 use std::mem;
5 
6 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_KHR_ray_tracing_maintenance1.html>
7 #[derive(Clone)]
8 pub struct RayTracingMaintenance1 {
9     fp: vk::KhrRayTracingMaintenance1Fn,
10 }
11 
12 impl RayTracingMaintenance1 {
new(instance: &Instance, device: &Device) -> Self13     pub fn new(instance: &Instance, device: &Device) -> Self {
14         let handle = device.handle();
15         let fp = vk::KhrRayTracingMaintenance1Fn::load(|name| unsafe {
16             mem::transmute(instance.get_device_proc_addr(handle, name.as_ptr()))
17         });
18         Self { fp }
19     }
20 
21     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdTraceRaysIndirect2KHR.html>
22     ///
23     /// `indirect_device_address` is a buffer device address which is a pointer to a [`vk::TraceRaysIndirectCommand2KHR`] structure containing the trace ray parameters.
24     #[inline]
cmd_trace_rays_indirect2( &self, command_buffer: vk::CommandBuffer, indirect_device_address: vk::DeviceAddress, )25     pub unsafe fn cmd_trace_rays_indirect2(
26         &self,
27         command_buffer: vk::CommandBuffer,
28         indirect_device_address: vk::DeviceAddress,
29     ) {
30         (self.fp.cmd_trace_rays_indirect2_khr)(command_buffer, indirect_device_address);
31     }
32 
33     #[inline]
name() -> &'static CStr34     pub const fn name() -> &'static CStr {
35         vk::KhrRayTracingMaintenance1Fn::name()
36     }
37 
38     #[inline]
fp(&self) -> &vk::KhrRayTracingMaintenance1Fn39     pub fn fp(&self) -> &vk::KhrRayTracingMaintenance1Fn {
40         &self.fp
41     }
42 }
43