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