Skip to main content

mtl_gpu/mtl4/acceleration_structure/
descriptor.rs

1//! Base descriptor for creating an acceleration structure.
2
3use std::ffi::c_void;
4use std::ptr::NonNull;
5
6use mtl_foundation::Referencing;
7use mtl_sys::{msg_send_0, sel};
8
9/// Base descriptor for creating an acceleration structure.
10///
11/// C++ equivalent: `MTL4::AccelerationStructureDescriptor`
12#[repr(transparent)]
13pub struct AccelerationStructureDescriptor(NonNull<c_void>);
14
15impl AccelerationStructureDescriptor {
16    /// Create an AccelerationStructureDescriptor from a raw pointer.
17    #[inline]
18    pub unsafe fn from_raw(ptr: *mut c_void) -> Option<Self> {
19        NonNull::new(ptr).map(Self)
20    }
21
22    /// Get the raw pointer.
23    #[inline]
24    pub fn as_raw(&self) -> *mut c_void {
25        self.0.as_ptr()
26    }
27
28    /// Create a new acceleration structure descriptor.
29    pub fn new() -> Option<Self> {
30        unsafe {
31            let class = mtl_sys::Class::get("MTL4AccelerationStructureDescriptor")?;
32            let ptr: *mut c_void = msg_send_0(class.as_ptr(), sel!(alloc));
33            if ptr.is_null() {
34                return None;
35            }
36            let ptr: *mut c_void = msg_send_0(ptr, sel!(init));
37            Self::from_raw(ptr)
38        }
39    }
40}
41
42impl Default for AccelerationStructureDescriptor {
43    fn default() -> Self {
44        Self::new().expect("Failed to create MTL4AccelerationStructureDescriptor")
45    }
46}
47
48impl Clone for AccelerationStructureDescriptor {
49    fn clone(&self) -> Self {
50        unsafe {
51            mtl_sys::msg_send_0::<*mut c_void>(self.as_ptr(), mtl_sys::sel!(retain));
52        }
53        Self(self.0)
54    }
55}
56
57impl Drop for AccelerationStructureDescriptor {
58    fn drop(&mut self) {
59        unsafe {
60            mtl_sys::msg_send_0::<()>(self.as_ptr(), mtl_sys::sel!(release));
61        }
62    }
63}
64
65impl Referencing for AccelerationStructureDescriptor {
66    #[inline]
67    fn as_ptr(&self) -> *const c_void {
68        self.0.as_ptr()
69    }
70}
71
72unsafe impl Send for AccelerationStructureDescriptor {}
73unsafe impl Sync for AccelerationStructureDescriptor {}
74
75impl std::fmt::Debug for AccelerationStructureDescriptor {
76    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
77        f.debug_struct("AccelerationStructureDescriptor").finish()
78    }
79}