mtl_gpu/mtl4/acceleration_structure/
descriptor.rs1use std::ffi::c_void;
4use std::ptr::NonNull;
5
6use mtl_foundation::Referencing;
7use mtl_sys::{msg_send_0, sel};
8
9#[repr(transparent)]
13pub struct AccelerationStructureDescriptor(NonNull<c_void>);
14
15impl AccelerationStructureDescriptor {
16 #[inline]
18 pub unsafe fn from_raw(ptr: *mut c_void) -> Option<Self> {
19 NonNull::new(ptr).map(Self)
20 }
21
22 #[inline]
24 pub fn as_raw(&self) -> *mut c_void {
25 self.0.as_ptr()
26 }
27
28 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}