Skip to main content

mtl_gpu/mtl4/acceleration_structure/
mod.rs

1//! MTL4 Acceleration Structure implementation.
2//!
3//! Corresponds to `Metal/MTL4AccelerationStructure.hpp`.
4
5mod bounding_box_geometry;
6mod curve_geometry;
7mod descriptor;
8mod geometry_descriptor;
9mod indirect_instance_descriptor;
10mod instance_descriptor;
11mod motion_bounding_box_geometry;
12mod motion_curve_geometry;
13mod motion_triangle_geometry;
14mod primitive_descriptor;
15mod triangle_geometry;
16
17pub use bounding_box_geometry::AccelerationStructureBoundingBoxGeometryDescriptor;
18pub use curve_geometry::AccelerationStructureCurveGeometryDescriptor;
19pub use descriptor::AccelerationStructureDescriptor;
20pub use geometry_descriptor::AccelerationStructureGeometryDescriptor;
21pub use indirect_instance_descriptor::IndirectInstanceAccelerationStructureDescriptor;
22pub use instance_descriptor::InstanceAccelerationStructureDescriptor;
23pub use motion_bounding_box_geometry::AccelerationStructureMotionBoundingBoxGeometryDescriptor;
24pub use motion_curve_geometry::AccelerationStructureMotionCurveGeometryDescriptor;
25pub use motion_triangle_geometry::AccelerationStructureMotionTriangleGeometryDescriptor;
26pub use primitive_descriptor::PrimitiveAccelerationStructureDescriptor;
27pub use triangle_geometry::AccelerationStructureTriangleGeometryDescriptor;
28
29// ============================================================
30// BufferRange
31// ============================================================
32
33/// A buffer range with address and length.
34///
35/// C++ equivalent: `MTL4::BufferRange`
36#[repr(C, packed)]
37#[derive(Copy, Clone, Debug, Default)]
38pub struct BufferRange {
39    /// The GPU address of the buffer.
40    pub buffer_address: u64,
41    /// The length of the buffer range in bytes.
42    pub length: u64,
43}
44
45impl BufferRange {
46    /// Create a new buffer range.
47    pub fn new(buffer_address: u64, length: u64) -> Self {
48        Self {
49            buffer_address,
50            length,
51        }
52    }
53}
54
55#[cfg(test)]
56mod tests {
57    use super::*;
58    use std::ffi::c_void;
59
60    #[test]
61    fn test_buffer_range_size() {
62        assert_eq!(std::mem::size_of::<BufferRange>(), 16);
63    }
64
65    #[test]
66    fn test_acceleration_structure_descriptor_size() {
67        assert_eq!(
68            std::mem::size_of::<AccelerationStructureDescriptor>(),
69            std::mem::size_of::<*mut c_void>()
70        );
71    }
72
73    #[test]
74    fn test_acceleration_structure_geometry_descriptor_size() {
75        assert_eq!(
76            std::mem::size_of::<AccelerationStructureGeometryDescriptor>(),
77            std::mem::size_of::<*mut c_void>()
78        );
79    }
80
81    #[test]
82    fn test_primitive_acceleration_structure_descriptor_size() {
83        assert_eq!(
84            std::mem::size_of::<PrimitiveAccelerationStructureDescriptor>(),
85            std::mem::size_of::<*mut c_void>()
86        );
87    }
88
89    #[test]
90    fn test_triangle_geometry_descriptor_size() {
91        assert_eq!(
92            std::mem::size_of::<AccelerationStructureTriangleGeometryDescriptor>(),
93            std::mem::size_of::<*mut c_void>()
94        );
95    }
96
97    #[test]
98    fn test_bounding_box_geometry_descriptor_size() {
99        assert_eq!(
100            std::mem::size_of::<AccelerationStructureBoundingBoxGeometryDescriptor>(),
101            std::mem::size_of::<*mut c_void>()
102        );
103    }
104
105    #[test]
106    fn test_curve_geometry_descriptor_size() {
107        assert_eq!(
108            std::mem::size_of::<AccelerationStructureCurveGeometryDescriptor>(),
109            std::mem::size_of::<*mut c_void>()
110        );
111    }
112
113    #[test]
114    fn test_instance_acceleration_structure_descriptor_size() {
115        assert_eq!(
116            std::mem::size_of::<InstanceAccelerationStructureDescriptor>(),
117            std::mem::size_of::<*mut c_void>()
118        );
119    }
120
121    #[test]
122    fn test_indirect_instance_acceleration_structure_descriptor_size() {
123        assert_eq!(
124            std::mem::size_of::<IndirectInstanceAccelerationStructureDescriptor>(),
125            std::mem::size_of::<*mut c_void>()
126        );
127    }
128}