Skip to main content

spatialrust_gpu/kernels/
voxel_segments_gpu.rs

1use spatialrust_core::SpatialResult;
2
3use crate::kernels::gpu_segments::GpuVoxelSegments;
4use crate::kernels::voxel_keys::compute_voxel_keys_gpu_buffers;
5use crate::kernels::voxel_segments::VoxelSegments;
6use crate::kernels::voxel_sort::build_voxel_segments_gpu_from_keys_buffer;
7use crate::runtime::WgpuRuntime;
8
9/// Computes voxel keys on the GPU and builds sorted segments using GPU sorting.
10pub fn build_voxel_segments_from_positions_gpu(
11    runtime: &WgpuRuntime,
12    x: &[f32],
13    y: &[f32],
14    z: &[f32],
15    origin: [f32; 3],
16    inv_leaf: f32,
17) -> SpatialResult<VoxelSegments> {
18    let gpu_segments =
19        build_voxel_segments_from_positions_gpu_buffers(runtime, x, y, z, origin, inv_leaf)?;
20    gpu_segments.to_voxel_segments(runtime)
21}
22
23/// Builds GPU-resident voxel segments from positions without intermediate readbacks.
24pub fn build_voxel_segments_from_positions_gpu_buffers(
25    runtime: &WgpuRuntime,
26    x: &[f32],
27    y: &[f32],
28    z: &[f32],
29    origin: [f32; 3],
30    inv_leaf: f32,
31) -> SpatialResult<GpuVoxelSegments> {
32    let positions = compute_voxel_keys_gpu_buffers(runtime, x, y, z, origin, inv_leaf)?;
33    let point_count = positions.point_count();
34    let padded_count = point_count.next_power_of_two();
35    build_voxel_segments_gpu_from_keys_buffer(
36        runtime,
37        positions.keys_buffer(),
38        point_count,
39        padded_count,
40    )
41}