warp-lang 1.0.2__py3-none-macosx_10_13_universal2.whl → 1.1.0__py3-none-macosx_10_13_universal2.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of warp-lang might be problematic. Click here for more details.
- warp/__init__.py +108 -97
- warp/__init__.pyi +1 -1
- warp/bin/libwarp-clang.dylib +0 -0
- warp/bin/libwarp.dylib +0 -0
- warp/build.py +115 -113
- warp/build_dll.py +383 -375
- warp/builtins.py +3425 -3354
- warp/codegen.py +2878 -2792
- warp/config.py +40 -36
- warp/constants.py +45 -45
- warp/context.py +5194 -5102
- warp/dlpack.py +442 -442
- warp/examples/__init__.py +16 -16
- warp/examples/assets/bear.usd +0 -0
- warp/examples/assets/bunny.usd +0 -0
- warp/examples/assets/cartpole.urdf +110 -110
- warp/examples/assets/crazyflie.usd +0 -0
- warp/examples/assets/cube.usd +0 -0
- warp/examples/assets/nv_ant.xml +92 -92
- warp/examples/assets/nv_humanoid.xml +183 -183
- warp/examples/assets/quadruped.urdf +267 -267
- warp/examples/assets/rocks.nvdb +0 -0
- warp/examples/assets/rocks.usd +0 -0
- warp/examples/assets/sphere.usd +0 -0
- warp/examples/benchmarks/benchmark_api.py +383 -383
- warp/examples/benchmarks/benchmark_cloth.py +278 -277
- warp/examples/benchmarks/benchmark_cloth_cupy.py +88 -88
- warp/examples/benchmarks/benchmark_cloth_jax.py +97 -100
- warp/examples/benchmarks/benchmark_cloth_numba.py +146 -142
- warp/examples/benchmarks/benchmark_cloth_numpy.py +77 -77
- warp/examples/benchmarks/benchmark_cloth_pytorch.py +86 -86
- warp/examples/benchmarks/benchmark_cloth_taichi.py +112 -112
- warp/examples/benchmarks/benchmark_cloth_warp.py +146 -146
- warp/examples/benchmarks/benchmark_launches.py +295 -295
- warp/examples/browse.py +29 -29
- warp/examples/core/example_dem.py +234 -219
- warp/examples/core/example_fluid.py +293 -267
- warp/examples/core/example_graph_capture.py +144 -126
- warp/examples/core/example_marching_cubes.py +188 -174
- warp/examples/core/example_mesh.py +174 -155
- warp/examples/core/example_mesh_intersect.py +205 -193
- warp/examples/core/example_nvdb.py +176 -170
- warp/examples/core/example_raycast.py +105 -90
- warp/examples/core/example_raymarch.py +199 -178
- warp/examples/core/example_render_opengl.py +185 -141
- warp/examples/core/example_sph.py +405 -387
- warp/examples/core/example_torch.py +222 -181
- warp/examples/core/example_wave.py +263 -248
- warp/examples/fem/bsr_utils.py +378 -380
- warp/examples/fem/example_apic_fluid.py +407 -389
- warp/examples/fem/example_convection_diffusion.py +182 -168
- warp/examples/fem/example_convection_diffusion_dg.py +219 -209
- warp/examples/fem/example_convection_diffusion_dg0.py +204 -194
- warp/examples/fem/example_deformed_geometry.py +177 -159
- warp/examples/fem/example_diffusion.py +201 -173
- warp/examples/fem/example_diffusion_3d.py +177 -152
- warp/examples/fem/example_diffusion_mgpu.py +221 -214
- warp/examples/fem/example_mixed_elasticity.py +244 -222
- warp/examples/fem/example_navier_stokes.py +259 -243
- warp/examples/fem/example_stokes.py +220 -192
- warp/examples/fem/example_stokes_transfer.py +265 -249
- warp/examples/fem/mesh_utils.py +133 -109
- warp/examples/fem/plot_utils.py +292 -287
- warp/examples/optim/example_bounce.py +260 -246
- warp/examples/optim/example_cloth_throw.py +222 -209
- warp/examples/optim/example_diffray.py +566 -536
- warp/examples/optim/example_drone.py +864 -835
- warp/examples/optim/example_inverse_kinematics.py +176 -168
- warp/examples/optim/example_inverse_kinematics_torch.py +185 -169
- warp/examples/optim/example_spring_cage.py +239 -231
- warp/examples/optim/example_trajectory.py +223 -199
- warp/examples/optim/example_walker.py +306 -293
- warp/examples/sim/example_cartpole.py +139 -129
- warp/examples/sim/example_cloth.py +196 -186
- warp/examples/sim/example_granular.py +124 -111
- warp/examples/sim/example_granular_collision_sdf.py +197 -186
- warp/examples/sim/example_jacobian_ik.py +236 -214
- warp/examples/sim/example_particle_chain.py +118 -105
- warp/examples/sim/example_quadruped.py +193 -180
- warp/examples/sim/example_rigid_chain.py +197 -187
- warp/examples/sim/example_rigid_contact.py +189 -177
- warp/examples/sim/example_rigid_force.py +127 -125
- warp/examples/sim/example_rigid_gyroscopic.py +109 -95
- warp/examples/sim/example_rigid_soft_contact.py +134 -122
- warp/examples/sim/example_soft_body.py +190 -177
- warp/fabric.py +337 -335
- warp/fem/__init__.py +60 -27
- warp/fem/cache.py +401 -388
- warp/fem/dirichlet.py +178 -179
- warp/fem/domain.py +262 -263
- warp/fem/field/__init__.py +100 -101
- warp/fem/field/field.py +148 -149
- warp/fem/field/nodal_field.py +298 -299
- warp/fem/field/restriction.py +22 -21
- warp/fem/field/test.py +180 -181
- warp/fem/field/trial.py +183 -183
- warp/fem/geometry/__init__.py +15 -19
- warp/fem/geometry/closest_point.py +69 -70
- warp/fem/geometry/deformed_geometry.py +270 -271
- warp/fem/geometry/element.py +744 -744
- warp/fem/geometry/geometry.py +184 -186
- warp/fem/geometry/grid_2d.py +380 -373
- warp/fem/geometry/grid_3d.py +441 -435
- warp/fem/geometry/hexmesh.py +953 -953
- warp/fem/geometry/partition.py +374 -376
- warp/fem/geometry/quadmesh_2d.py +532 -532
- warp/fem/geometry/tetmesh.py +840 -840
- warp/fem/geometry/trimesh_2d.py +577 -577
- warp/fem/integrate.py +1630 -1615
- warp/fem/operator.py +190 -191
- warp/fem/polynomial.py +214 -213
- warp/fem/quadrature/__init__.py +2 -2
- warp/fem/quadrature/pic_quadrature.py +243 -245
- warp/fem/quadrature/quadrature.py +295 -294
- warp/fem/space/__init__.py +294 -292
- warp/fem/space/basis_space.py +488 -489
- warp/fem/space/collocated_function_space.py +100 -105
- warp/fem/space/dof_mapper.py +236 -236
- warp/fem/space/function_space.py +148 -145
- warp/fem/space/grid_2d_function_space.py +267 -267
- warp/fem/space/grid_3d_function_space.py +305 -306
- warp/fem/space/hexmesh_function_space.py +350 -352
- warp/fem/space/partition.py +350 -350
- warp/fem/space/quadmesh_2d_function_space.py +368 -369
- warp/fem/space/restriction.py +158 -160
- warp/fem/space/shape/__init__.py +13 -15
- warp/fem/space/shape/cube_shape_function.py +738 -738
- warp/fem/space/shape/shape_function.py +102 -103
- warp/fem/space/shape/square_shape_function.py +611 -611
- warp/fem/space/shape/tet_shape_function.py +565 -567
- warp/fem/space/shape/triangle_shape_function.py +429 -429
- warp/fem/space/tetmesh_function_space.py +294 -292
- warp/fem/space/topology.py +297 -295
- warp/fem/space/trimesh_2d_function_space.py +223 -221
- warp/fem/types.py +77 -77
- warp/fem/utils.py +495 -495
- warp/jax.py +166 -141
- warp/jax_experimental.py +341 -339
- warp/native/array.h +1072 -1025
- warp/native/builtin.h +1560 -1560
- warp/native/bvh.cpp +398 -398
- warp/native/bvh.cu +525 -525
- warp/native/bvh.h +429 -429
- warp/native/clang/clang.cpp +495 -464
- warp/native/crt.cpp +31 -31
- warp/native/crt.h +334 -334
- warp/native/cuda_crt.h +1049 -1049
- warp/native/cuda_util.cpp +549 -540
- warp/native/cuda_util.h +288 -203
- warp/native/cutlass_gemm.cpp +34 -34
- warp/native/cutlass_gemm.cu +372 -372
- warp/native/error.cpp +66 -66
- warp/native/error.h +27 -27
- warp/native/fabric.h +228 -228
- warp/native/hashgrid.cpp +301 -278
- warp/native/hashgrid.cu +78 -77
- warp/native/hashgrid.h +227 -227
- warp/native/initializer_array.h +32 -32
- warp/native/intersect.h +1204 -1204
- warp/native/intersect_adj.h +365 -365
- warp/native/intersect_tri.h +322 -322
- warp/native/marching.cpp +2 -2
- warp/native/marching.cu +497 -497
- warp/native/marching.h +2 -2
- warp/native/mat.h +1498 -1498
- warp/native/matnn.h +333 -333
- warp/native/mesh.cpp +203 -203
- warp/native/mesh.cu +293 -293
- warp/native/mesh.h +1887 -1887
- warp/native/nanovdb/NanoVDB.h +4782 -4782
- warp/native/nanovdb/PNanoVDB.h +2553 -2553
- warp/native/nanovdb/PNanoVDBWrite.h +294 -294
- warp/native/noise.h +850 -850
- warp/native/quat.h +1084 -1084
- warp/native/rand.h +299 -299
- warp/native/range.h +108 -108
- warp/native/reduce.cpp +156 -156
- warp/native/reduce.cu +348 -348
- warp/native/runlength_encode.cpp +61 -61
- warp/native/runlength_encode.cu +46 -46
- warp/native/scan.cpp +30 -30
- warp/native/scan.cu +36 -36
- warp/native/scan.h +7 -7
- warp/native/solid_angle.h +442 -442
- warp/native/sort.cpp +94 -94
- warp/native/sort.cu +97 -97
- warp/native/sort.h +14 -14
- warp/native/sparse.cpp +337 -337
- warp/native/sparse.cu +544 -544
- warp/native/spatial.h +630 -630
- warp/native/svd.h +562 -562
- warp/native/temp_buffer.h +30 -30
- warp/native/vec.h +1132 -1132
- warp/native/volume.cpp +297 -297
- warp/native/volume.cu +32 -32
- warp/native/volume.h +538 -538
- warp/native/volume_builder.cu +425 -425
- warp/native/volume_builder.h +19 -19
- warp/native/warp.cpp +1057 -1052
- warp/native/warp.cu +2943 -2828
- warp/native/warp.h +313 -305
- warp/optim/__init__.py +9 -9
- warp/optim/adam.py +120 -120
- warp/optim/linear.py +1104 -939
- warp/optim/sgd.py +104 -92
- warp/render/__init__.py +10 -10
- warp/render/render_opengl.py +3217 -3204
- warp/render/render_usd.py +768 -749
- warp/render/utils.py +152 -150
- warp/sim/__init__.py +52 -59
- warp/sim/articulation.py +685 -685
- warp/sim/collide.py +1594 -1590
- warp/sim/import_mjcf.py +489 -481
- warp/sim/import_snu.py +220 -221
- warp/sim/import_urdf.py +536 -516
- warp/sim/import_usd.py +887 -881
- warp/sim/inertia.py +316 -317
- warp/sim/integrator.py +234 -233
- warp/sim/integrator_euler.py +1956 -1956
- warp/sim/integrator_featherstone.py +1910 -1991
- warp/sim/integrator_xpbd.py +3294 -3312
- warp/sim/model.py +4473 -4314
- warp/sim/particles.py +113 -112
- warp/sim/render.py +417 -403
- warp/sim/utils.py +413 -410
- warp/sparse.py +1227 -1227
- warp/stubs.py +2109 -2469
- warp/tape.py +1162 -225
- warp/tests/__init__.py +1 -1
- warp/tests/__main__.py +4 -4
- warp/tests/assets/torus.usda +105 -105
- warp/tests/aux_test_class_kernel.py +26 -26
- warp/tests/aux_test_compile_consts_dummy.py +10 -10
- warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -21
- warp/tests/aux_test_dependent.py +22 -22
- warp/tests/aux_test_grad_customs.py +23 -23
- warp/tests/aux_test_reference.py +11 -11
- warp/tests/aux_test_reference_reference.py +10 -10
- warp/tests/aux_test_square.py +17 -17
- warp/tests/aux_test_unresolved_func.py +14 -14
- warp/tests/aux_test_unresolved_symbol.py +14 -14
- warp/tests/disabled_kinematics.py +239 -239
- warp/tests/run_coverage_serial.py +31 -31
- warp/tests/test_adam.py +157 -157
- warp/tests/test_arithmetic.py +1124 -1124
- warp/tests/test_array.py +2417 -2326
- warp/tests/test_array_reduce.py +150 -150
- warp/tests/test_async.py +668 -656
- warp/tests/test_atomic.py +141 -141
- warp/tests/test_bool.py +204 -149
- warp/tests/test_builtins_resolution.py +1292 -1292
- warp/tests/test_bvh.py +164 -171
- warp/tests/test_closest_point_edge_edge.py +228 -228
- warp/tests/test_codegen.py +566 -553
- warp/tests/test_compile_consts.py +97 -101
- warp/tests/test_conditional.py +246 -246
- warp/tests/test_copy.py +232 -215
- warp/tests/test_ctypes.py +632 -632
- warp/tests/test_dense.py +67 -67
- warp/tests/test_devices.py +91 -98
- warp/tests/test_dlpack.py +530 -529
- warp/tests/test_examples.py +400 -378
- warp/tests/test_fabricarray.py +955 -955
- warp/tests/test_fast_math.py +62 -54
- warp/tests/test_fem.py +1277 -1278
- warp/tests/test_fp16.py +130 -130
- warp/tests/test_func.py +338 -337
- warp/tests/test_generics.py +571 -571
- warp/tests/test_grad.py +746 -640
- warp/tests/test_grad_customs.py +333 -336
- warp/tests/test_hash_grid.py +210 -164
- warp/tests/test_import.py +39 -39
- warp/tests/test_indexedarray.py +1134 -1134
- warp/tests/test_intersect.py +67 -67
- warp/tests/test_jax.py +307 -307
- warp/tests/test_large.py +167 -164
- warp/tests/test_launch.py +354 -354
- warp/tests/test_lerp.py +261 -261
- warp/tests/test_linear_solvers.py +191 -171
- warp/tests/test_lvalue.py +421 -493
- warp/tests/test_marching_cubes.py +65 -65
- warp/tests/test_mat.py +1801 -1827
- warp/tests/test_mat_lite.py +115 -115
- warp/tests/test_mat_scalar_ops.py +2907 -2889
- warp/tests/test_math.py +126 -193
- warp/tests/test_matmul.py +500 -499
- warp/tests/test_matmul_lite.py +410 -410
- warp/tests/test_mempool.py +188 -190
- warp/tests/test_mesh.py +284 -324
- warp/tests/test_mesh_query_aabb.py +228 -241
- warp/tests/test_mesh_query_point.py +692 -702
- warp/tests/test_mesh_query_ray.py +292 -303
- warp/tests/test_mlp.py +276 -276
- warp/tests/test_model.py +110 -110
- warp/tests/test_modules_lite.py +39 -39
- warp/tests/test_multigpu.py +163 -163
- warp/tests/test_noise.py +248 -248
- warp/tests/test_operators.py +250 -250
- warp/tests/test_options.py +123 -125
- warp/tests/test_peer.py +133 -137
- warp/tests/test_pinned.py +78 -78
- warp/tests/test_print.py +54 -54
- warp/tests/test_quat.py +2086 -2086
- warp/tests/test_rand.py +288 -288
- warp/tests/test_reload.py +217 -217
- warp/tests/test_rounding.py +179 -179
- warp/tests/test_runlength_encode.py +190 -190
- warp/tests/test_sim_grad.py +243 -0
- warp/tests/test_sim_kinematics.py +91 -97
- warp/tests/test_smoothstep.py +168 -168
- warp/tests/test_snippet.py +305 -266
- warp/tests/test_sparse.py +468 -460
- warp/tests/test_spatial.py +2148 -2148
- warp/tests/test_streams.py +486 -473
- warp/tests/test_struct.py +710 -675
- warp/tests/test_tape.py +173 -148
- warp/tests/test_torch.py +743 -743
- warp/tests/test_transient_module.py +87 -87
- warp/tests/test_types.py +556 -659
- warp/tests/test_utils.py +490 -499
- warp/tests/test_vec.py +1264 -1268
- warp/tests/test_vec_lite.py +73 -73
- warp/tests/test_vec_scalar_ops.py +2099 -2099
- warp/tests/test_verify_fp.py +94 -94
- warp/tests/test_volume.py +737 -736
- warp/tests/test_volume_write.py +255 -265
- warp/tests/unittest_serial.py +37 -37
- warp/tests/unittest_suites.py +363 -359
- warp/tests/unittest_utils.py +603 -578
- warp/tests/unused_test_misc.py +71 -71
- warp/tests/walkthrough_debug.py +85 -85
- warp/thirdparty/appdirs.py +598 -598
- warp/thirdparty/dlpack.py +143 -143
- warp/thirdparty/unittest_parallel.py +566 -561
- warp/torch.py +321 -295
- warp/types.py +4504 -4450
- warp/utils.py +1008 -821
- {warp_lang-1.0.2.dist-info → warp_lang-1.1.0.dist-info}/LICENSE.md +126 -126
- {warp_lang-1.0.2.dist-info → warp_lang-1.1.0.dist-info}/METADATA +338 -400
- warp_lang-1.1.0.dist-info/RECORD +352 -0
- warp/examples/assets/cube.usda +0 -42
- warp/examples/assets/sphere.usda +0 -56
- warp/examples/assets/torus.usda +0 -105
- warp_lang-1.0.2.dist-info/RECORD +0 -352
- {warp_lang-1.0.2.dist-info → warp_lang-1.1.0.dist-info}/WHEEL +0 -0
- {warp_lang-1.0.2.dist-info → warp_lang-1.1.0.dist-info}/top_level.txt +0 -0
warp/native/volume.cpp
CHANGED
|
@@ -1,297 +1,297 @@
|
|
|
1
|
-
/** Copyright (c) 2022 NVIDIA CORPORATION. All rights reserved.
|
|
2
|
-
* NVIDIA CORPORATION and its licensors retain all intellectual property
|
|
3
|
-
* and proprietary rights in and to this software, related documentation
|
|
4
|
-
* and any modifications thereto. Any use, reproduction, disclosure or
|
|
5
|
-
* distribution of this software and related documentation without an express
|
|
6
|
-
* license agreement from NVIDIA CORPORATION is strictly prohibited.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
#include "volume.h"
|
|
10
|
-
#include "volume_builder.h"
|
|
11
|
-
#include "warp.h"
|
|
12
|
-
#include "cuda_util.h"
|
|
13
|
-
|
|
14
|
-
#include <map>
|
|
15
|
-
|
|
16
|
-
using namespace wp;
|
|
17
|
-
|
|
18
|
-
namespace
|
|
19
|
-
{
|
|
20
|
-
|
|
21
|
-
struct VolumeDesc
|
|
22
|
-
{
|
|
23
|
-
// NanoVDB buffer either in device or host memory
|
|
24
|
-
void* buffer;
|
|
25
|
-
uint64_t size_in_bytes;
|
|
26
|
-
|
|
27
|
-
// offset to the voxel values of the first leaf node relative to buffer
|
|
28
|
-
uint64_t first_voxel_data_offs;
|
|
29
|
-
|
|
30
|
-
// copy of the grids's metadata to keep on the host for device volumes
|
|
31
|
-
pnanovdb_grid_t grid_data;
|
|
32
|
-
|
|
33
|
-
// copy of the tree's metadata to keep on the host for device volumes
|
|
34
|
-
pnanovdb_tree_t tree_data;
|
|
35
|
-
|
|
36
|
-
// CUDA context for this volume (NULL if CPU)
|
|
37
|
-
void* context;
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
// Host-side volume descriptors. Maps each CPU/GPU volume buffer address (id) to a CPU desc
|
|
41
|
-
std::map<uint64_t, VolumeDesc> g_volume_descriptors;
|
|
42
|
-
|
|
43
|
-
bool volume_get_descriptor(uint64_t id, VolumeDesc& volumeDesc)
|
|
44
|
-
{
|
|
45
|
-
if (id == 0) return false;
|
|
46
|
-
|
|
47
|
-
const auto& iter = g_volume_descriptors.find(id);
|
|
48
|
-
if (iter == g_volume_descriptors.end())
|
|
49
|
-
return false;
|
|
50
|
-
else
|
|
51
|
-
volumeDesc = iter->second;
|
|
52
|
-
return true;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
void volume_add_descriptor(uint64_t id, const VolumeDesc& volumeDesc)
|
|
56
|
-
{
|
|
57
|
-
g_volume_descriptors[id] = volumeDesc;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
void volume_rem_descriptor(uint64_t id)
|
|
61
|
-
{
|
|
62
|
-
g_volume_descriptors.erase(id);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
} // anonymous namespace
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
// NB: buf must be a host pointer
|
|
69
|
-
uint64_t volume_create_host(void* buf, uint64_t size)
|
|
70
|
-
{
|
|
71
|
-
if (size < sizeof(pnanovdb_grid_t) + sizeof(pnanovdb_tree_t))
|
|
72
|
-
return 0; // This cannot be a valid NanoVDB grid with data
|
|
73
|
-
|
|
74
|
-
VolumeDesc volume;
|
|
75
|
-
|
|
76
|
-
volume.context = NULL;
|
|
77
|
-
|
|
78
|
-
memcpy_h2h(&volume.grid_data, buf, sizeof(pnanovdb_grid_t));
|
|
79
|
-
memcpy_h2h(&volume.tree_data, (pnanovdb_grid_t*)buf + 1, sizeof(pnanovdb_tree_t));
|
|
80
|
-
|
|
81
|
-
if (volume.grid_data.magic != PNANOVDB_MAGIC_NUMBER)
|
|
82
|
-
return 0;
|
|
83
|
-
|
|
84
|
-
volume.size_in_bytes = size;
|
|
85
|
-
volume.buffer = alloc_host(size);
|
|
86
|
-
memcpy_h2h(volume.buffer, buf, size);
|
|
87
|
-
|
|
88
|
-
volume.first_voxel_data_offs =
|
|
89
|
-
sizeof(pnanovdb_grid_t) + volume.tree_data.node_offset_leaf + PNANOVDB_GRID_TYPE_GET(PNANOVDB_GRID_TYPE_FLOAT, leaf_off_table);
|
|
90
|
-
|
|
91
|
-
uint64_t id = (uint64_t)volume.buffer;
|
|
92
|
-
|
|
93
|
-
volume_add_descriptor(id, volume);
|
|
94
|
-
|
|
95
|
-
return id;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// NB: buf must be a pointer on the same device
|
|
99
|
-
uint64_t volume_create_device(void* context, void* buf, uint64_t size)
|
|
100
|
-
{
|
|
101
|
-
if (size < sizeof(pnanovdb_grid_t) + sizeof(pnanovdb_tree_t))
|
|
102
|
-
return 0; // This cannot be a valid NanoVDB grid with data
|
|
103
|
-
|
|
104
|
-
ContextGuard guard(context);
|
|
105
|
-
|
|
106
|
-
VolumeDesc volume;
|
|
107
|
-
|
|
108
|
-
volume.context = context ? context : cuda_context_get_current();
|
|
109
|
-
|
|
110
|
-
memcpy_d2h(WP_CURRENT_CONTEXT, &volume.grid_data, buf, sizeof(pnanovdb_grid_t));
|
|
111
|
-
memcpy_d2h(WP_CURRENT_CONTEXT, &volume.tree_data, (pnanovdb_grid_t*)buf + 1, sizeof(pnanovdb_tree_t));
|
|
112
|
-
|
|
113
|
-
if (volume.grid_data.magic != PNANOVDB_MAGIC_NUMBER)
|
|
114
|
-
return 0;
|
|
115
|
-
|
|
116
|
-
volume.size_in_bytes = size;
|
|
117
|
-
volume.buffer = alloc_device(WP_CURRENT_CONTEXT, size);
|
|
118
|
-
memcpy_d2d(WP_CURRENT_CONTEXT, volume.buffer, buf, size);
|
|
119
|
-
|
|
120
|
-
volume.first_voxel_data_offs =
|
|
121
|
-
sizeof(pnanovdb_grid_t) + volume.tree_data.node_offset_leaf + PNANOVDB_GRID_TYPE_GET(PNANOVDB_GRID_TYPE_FLOAT, leaf_off_table);
|
|
122
|
-
|
|
123
|
-
uint64_t id = (uint64_t)volume.buffer;
|
|
124
|
-
|
|
125
|
-
volume_add_descriptor(id, volume);
|
|
126
|
-
|
|
127
|
-
return id;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
static void volume_get_buffer_info(uint64_t id, void** buf, uint64_t* size)
|
|
131
|
-
{
|
|
132
|
-
*buf = 0;
|
|
133
|
-
*size = 0;
|
|
134
|
-
|
|
135
|
-
VolumeDesc volume;
|
|
136
|
-
if (volume_get_descriptor(id, volume))
|
|
137
|
-
{
|
|
138
|
-
*buf = volume.buffer;
|
|
139
|
-
*size = volume.size_in_bytes;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
void volume_get_buffer_info_host(uint64_t id, void** buf, uint64_t* size)
|
|
144
|
-
{
|
|
145
|
-
volume_get_buffer_info(id, buf, size);
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
void volume_get_buffer_info_device(uint64_t id, void** buf, uint64_t* size)
|
|
149
|
-
{
|
|
150
|
-
volume_get_buffer_info(id, buf, size);
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
void volume_get_voxel_size(uint64_t id, float* dx, float* dy, float* dz)
|
|
154
|
-
{
|
|
155
|
-
*dx = *dx = *dz = 0.0f;
|
|
156
|
-
|
|
157
|
-
VolumeDesc volume;
|
|
158
|
-
if (volume_get_descriptor(id, volume))
|
|
159
|
-
{
|
|
160
|
-
*dx = (float)volume.grid_data.voxel_size[0];
|
|
161
|
-
*dy = (float)volume.grid_data.voxel_size[1];
|
|
162
|
-
*dz = (float)volume.grid_data.voxel_size[2];
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
void volume_get_tiles_host(uint64_t id, void** buf, uint64_t* size)
|
|
167
|
-
{
|
|
168
|
-
static constexpr uint32_t MASK = (1u << 3u) - 1u; // mask for bit operations
|
|
169
|
-
|
|
170
|
-
*buf = 0;
|
|
171
|
-
*size = 0;
|
|
172
|
-
|
|
173
|
-
VolumeDesc volume;
|
|
174
|
-
if (volume_get_descriptor(id, volume))
|
|
175
|
-
{
|
|
176
|
-
const uint32_t leaf_count = volume.tree_data.node_count_leaf;
|
|
177
|
-
*size = leaf_count * sizeof(pnanovdb_coord_t);
|
|
178
|
-
|
|
179
|
-
pnanovdb_coord_t *leaf_coords = (pnanovdb_coord_t*)alloc_host(*size);
|
|
180
|
-
*buf = leaf_coords;
|
|
181
|
-
|
|
182
|
-
const uint64_t first_leaf = (uint64_t)volume.buffer + sizeof(pnanovdb_grid_t) + volume.tree_data.node_offset_leaf;
|
|
183
|
-
const uint32_t leaf_stride = PNANOVDB_GRID_TYPE_GET(volume.grid_data.grid_type, leaf_size);
|
|
184
|
-
|
|
185
|
-
for (uint32_t i = 0; i < leaf_count; ++i)
|
|
186
|
-
{
|
|
187
|
-
leaf_coords[i] = ((pnanovdb_leaf_t*)(first_leaf + leaf_stride * i))->bbox_min;
|
|
188
|
-
leaf_coords[i].x &= ~MASK;
|
|
189
|
-
leaf_coords[i].y &= ~MASK;
|
|
190
|
-
leaf_coords[i].z &= ~MASK;
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
void volume_destroy_host(uint64_t id)
|
|
196
|
-
{
|
|
197
|
-
free_host((void*)id);
|
|
198
|
-
volume_rem_descriptor(id);
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
void volume_destroy_device(uint64_t id)
|
|
202
|
-
{
|
|
203
|
-
VolumeDesc volume;
|
|
204
|
-
if (volume_get_descriptor(id, volume))
|
|
205
|
-
{
|
|
206
|
-
ContextGuard guard(volume.context);
|
|
207
|
-
free_device(WP_CURRENT_CONTEXT, volume.buffer);
|
|
208
|
-
volume_rem_descriptor(id);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
#if WP_ENABLE_CUDA
|
|
214
|
-
uint64_t volume_f_from_tiles_device(void* context, void* points, int num_points, float voxel_size, float bg_value, float tx, float ty, float tz, bool points_in_world_space)
|
|
215
|
-
{
|
|
216
|
-
nanovdb::FloatGrid* grid;
|
|
217
|
-
size_t gridSize;
|
|
218
|
-
BuildGridParams<float> params;
|
|
219
|
-
params.voxel_size = voxel_size;
|
|
220
|
-
params.background_value = bg_value;
|
|
221
|
-
params.translation = nanovdb::Vec3f{tx, ty, tz};
|
|
222
|
-
|
|
223
|
-
build_grid_from_tiles(grid, gridSize, points, num_points, points_in_world_space, params);
|
|
224
|
-
|
|
225
|
-
return volume_create_device(context, grid, gridSize);
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
uint64_t volume_v_from_tiles_device(void* context, void* points, int num_points, float voxel_size, float bg_value_x, float bg_value_y, float bg_value_z, float tx, float ty, float tz, bool points_in_world_space)
|
|
229
|
-
{
|
|
230
|
-
nanovdb::Vec3fGrid* grid;
|
|
231
|
-
size_t gridSize;
|
|
232
|
-
BuildGridParams<nanovdb::Vec3f> params;
|
|
233
|
-
params.voxel_size = voxel_size;
|
|
234
|
-
params.background_value = nanovdb::Vec3f{bg_value_x, bg_value_y, bg_value_z};
|
|
235
|
-
params.translation = nanovdb::Vec3f{tx, ty, tz};
|
|
236
|
-
|
|
237
|
-
build_grid_from_tiles(grid, gridSize, points, num_points, points_in_world_space, params);
|
|
238
|
-
|
|
239
|
-
return volume_create_device(context, grid, gridSize);
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
uint64_t volume_i_from_tiles_device(void* context, void* points, int num_points, float voxel_size, int bg_value, float tx, float ty, float tz, bool points_in_world_space)
|
|
243
|
-
{
|
|
244
|
-
nanovdb::Int32Grid* grid;
|
|
245
|
-
size_t gridSize;
|
|
246
|
-
BuildGridParams<int32_t> params;
|
|
247
|
-
params.voxel_size = voxel_size;
|
|
248
|
-
params.background_value = (int32_t)(bg_value);
|
|
249
|
-
params.translation = nanovdb::Vec3f{tx, ty, tz};
|
|
250
|
-
|
|
251
|
-
build_grid_from_tiles(grid, gridSize, points, num_points, points_in_world_space, params);
|
|
252
|
-
|
|
253
|
-
return volume_create_device(context, grid, gridSize);
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
void launch_get_leaf_coords(void* context, const uint32_t leaf_count, pnanovdb_coord_t *leaf_coords, const uint64_t first_leaf, const uint32_t leaf_stride);
|
|
257
|
-
|
|
258
|
-
void volume_get_tiles_device(uint64_t id, void** buf, uint64_t* size)
|
|
259
|
-
{
|
|
260
|
-
*buf = 0;
|
|
261
|
-
*size = 0;
|
|
262
|
-
|
|
263
|
-
VolumeDesc volume;
|
|
264
|
-
if (volume_get_descriptor(id, volume))
|
|
265
|
-
{
|
|
266
|
-
const uint32_t leaf_count = volume.tree_data.node_count_leaf;
|
|
267
|
-
*size = leaf_count * sizeof(pnanovdb_coord_t);
|
|
268
|
-
|
|
269
|
-
pnanovdb_coord_t *leaf_coords = (pnanovdb_coord_t*)alloc_device(volume.context, *size);
|
|
270
|
-
*buf = leaf_coords;
|
|
271
|
-
|
|
272
|
-
const uint64_t first_leaf = (uint64_t)volume.buffer + sizeof(pnanovdb_grid_t) + volume.tree_data.node_offset_leaf;
|
|
273
|
-
const uint32_t leaf_stride = PNANOVDB_GRID_TYPE_GET(volume.grid_data.grid_type, leaf_size);
|
|
274
|
-
|
|
275
|
-
launch_get_leaf_coords(volume.context, leaf_count, leaf_coords, first_leaf, leaf_stride);
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
#else
|
|
279
|
-
// stubs for non-CUDA platforms
|
|
280
|
-
uint64_t volume_f_from_tiles_device(void* context, void* points, int num_points, float voxel_size, float bg_value, float tx, float ty, float tz, bool points_in_world_space)
|
|
281
|
-
{
|
|
282
|
-
return 0;
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
uint64_t volume_v_from_tiles_device(void* context, void* points, int num_points, float voxel_size, float bg_value_x, float bg_value_y, float bg_value_z, float tx, float ty, float tz, bool points_in_world_space)
|
|
286
|
-
{
|
|
287
|
-
return 0;
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
uint64_t volume_i_from_tiles_device(void* context, void* points, int num_points, float voxel_size, int bg_value, float tx, float ty, float tz, bool points_in_world_space)
|
|
291
|
-
{
|
|
292
|
-
return 0;
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
void volume_get_tiles_device(uint64_t id, void** buf, uint64_t* size) {}
|
|
296
|
-
|
|
297
|
-
#endif
|
|
1
|
+
/** Copyright (c) 2022 NVIDIA CORPORATION. All rights reserved.
|
|
2
|
+
* NVIDIA CORPORATION and its licensors retain all intellectual property
|
|
3
|
+
* and proprietary rights in and to this software, related documentation
|
|
4
|
+
* and any modifications thereto. Any use, reproduction, disclosure or
|
|
5
|
+
* distribution of this software and related documentation without an express
|
|
6
|
+
* license agreement from NVIDIA CORPORATION is strictly prohibited.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
#include "volume.h"
|
|
10
|
+
#include "volume_builder.h"
|
|
11
|
+
#include "warp.h"
|
|
12
|
+
#include "cuda_util.h"
|
|
13
|
+
|
|
14
|
+
#include <map>
|
|
15
|
+
|
|
16
|
+
using namespace wp;
|
|
17
|
+
|
|
18
|
+
namespace
|
|
19
|
+
{
|
|
20
|
+
|
|
21
|
+
struct VolumeDesc
|
|
22
|
+
{
|
|
23
|
+
// NanoVDB buffer either in device or host memory
|
|
24
|
+
void* buffer;
|
|
25
|
+
uint64_t size_in_bytes;
|
|
26
|
+
|
|
27
|
+
// offset to the voxel values of the first leaf node relative to buffer
|
|
28
|
+
uint64_t first_voxel_data_offs;
|
|
29
|
+
|
|
30
|
+
// copy of the grids's metadata to keep on the host for device volumes
|
|
31
|
+
pnanovdb_grid_t grid_data;
|
|
32
|
+
|
|
33
|
+
// copy of the tree's metadata to keep on the host for device volumes
|
|
34
|
+
pnanovdb_tree_t tree_data;
|
|
35
|
+
|
|
36
|
+
// CUDA context for this volume (NULL if CPU)
|
|
37
|
+
void* context;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
// Host-side volume descriptors. Maps each CPU/GPU volume buffer address (id) to a CPU desc
|
|
41
|
+
std::map<uint64_t, VolumeDesc> g_volume_descriptors;
|
|
42
|
+
|
|
43
|
+
bool volume_get_descriptor(uint64_t id, VolumeDesc& volumeDesc)
|
|
44
|
+
{
|
|
45
|
+
if (id == 0) return false;
|
|
46
|
+
|
|
47
|
+
const auto& iter = g_volume_descriptors.find(id);
|
|
48
|
+
if (iter == g_volume_descriptors.end())
|
|
49
|
+
return false;
|
|
50
|
+
else
|
|
51
|
+
volumeDesc = iter->second;
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
void volume_add_descriptor(uint64_t id, const VolumeDesc& volumeDesc)
|
|
56
|
+
{
|
|
57
|
+
g_volume_descriptors[id] = volumeDesc;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
void volume_rem_descriptor(uint64_t id)
|
|
61
|
+
{
|
|
62
|
+
g_volume_descriptors.erase(id);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
} // anonymous namespace
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
// NB: buf must be a host pointer
|
|
69
|
+
uint64_t volume_create_host(void* buf, uint64_t size)
|
|
70
|
+
{
|
|
71
|
+
if (size < sizeof(pnanovdb_grid_t) + sizeof(pnanovdb_tree_t))
|
|
72
|
+
return 0; // This cannot be a valid NanoVDB grid with data
|
|
73
|
+
|
|
74
|
+
VolumeDesc volume;
|
|
75
|
+
|
|
76
|
+
volume.context = NULL;
|
|
77
|
+
|
|
78
|
+
memcpy_h2h(&volume.grid_data, buf, sizeof(pnanovdb_grid_t));
|
|
79
|
+
memcpy_h2h(&volume.tree_data, (pnanovdb_grid_t*)buf + 1, sizeof(pnanovdb_tree_t));
|
|
80
|
+
|
|
81
|
+
if (volume.grid_data.magic != PNANOVDB_MAGIC_NUMBER)
|
|
82
|
+
return 0;
|
|
83
|
+
|
|
84
|
+
volume.size_in_bytes = size;
|
|
85
|
+
volume.buffer = alloc_host(size);
|
|
86
|
+
memcpy_h2h(volume.buffer, buf, size);
|
|
87
|
+
|
|
88
|
+
volume.first_voxel_data_offs =
|
|
89
|
+
sizeof(pnanovdb_grid_t) + volume.tree_data.node_offset_leaf + PNANOVDB_GRID_TYPE_GET(PNANOVDB_GRID_TYPE_FLOAT, leaf_off_table);
|
|
90
|
+
|
|
91
|
+
uint64_t id = (uint64_t)volume.buffer;
|
|
92
|
+
|
|
93
|
+
volume_add_descriptor(id, volume);
|
|
94
|
+
|
|
95
|
+
return id;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// NB: buf must be a pointer on the same device
|
|
99
|
+
uint64_t volume_create_device(void* context, void* buf, uint64_t size)
|
|
100
|
+
{
|
|
101
|
+
if (size < sizeof(pnanovdb_grid_t) + sizeof(pnanovdb_tree_t))
|
|
102
|
+
return 0; // This cannot be a valid NanoVDB grid with data
|
|
103
|
+
|
|
104
|
+
ContextGuard guard(context);
|
|
105
|
+
|
|
106
|
+
VolumeDesc volume;
|
|
107
|
+
|
|
108
|
+
volume.context = context ? context : cuda_context_get_current();
|
|
109
|
+
|
|
110
|
+
memcpy_d2h(WP_CURRENT_CONTEXT, &volume.grid_data, buf, sizeof(pnanovdb_grid_t));
|
|
111
|
+
memcpy_d2h(WP_CURRENT_CONTEXT, &volume.tree_data, (pnanovdb_grid_t*)buf + 1, sizeof(pnanovdb_tree_t));
|
|
112
|
+
|
|
113
|
+
if (volume.grid_data.magic != PNANOVDB_MAGIC_NUMBER)
|
|
114
|
+
return 0;
|
|
115
|
+
|
|
116
|
+
volume.size_in_bytes = size;
|
|
117
|
+
volume.buffer = alloc_device(WP_CURRENT_CONTEXT, size);
|
|
118
|
+
memcpy_d2d(WP_CURRENT_CONTEXT, volume.buffer, buf, size);
|
|
119
|
+
|
|
120
|
+
volume.first_voxel_data_offs =
|
|
121
|
+
sizeof(pnanovdb_grid_t) + volume.tree_data.node_offset_leaf + PNANOVDB_GRID_TYPE_GET(PNANOVDB_GRID_TYPE_FLOAT, leaf_off_table);
|
|
122
|
+
|
|
123
|
+
uint64_t id = (uint64_t)volume.buffer;
|
|
124
|
+
|
|
125
|
+
volume_add_descriptor(id, volume);
|
|
126
|
+
|
|
127
|
+
return id;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
static void volume_get_buffer_info(uint64_t id, void** buf, uint64_t* size)
|
|
131
|
+
{
|
|
132
|
+
*buf = 0;
|
|
133
|
+
*size = 0;
|
|
134
|
+
|
|
135
|
+
VolumeDesc volume;
|
|
136
|
+
if (volume_get_descriptor(id, volume))
|
|
137
|
+
{
|
|
138
|
+
*buf = volume.buffer;
|
|
139
|
+
*size = volume.size_in_bytes;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
void volume_get_buffer_info_host(uint64_t id, void** buf, uint64_t* size)
|
|
144
|
+
{
|
|
145
|
+
volume_get_buffer_info(id, buf, size);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
void volume_get_buffer_info_device(uint64_t id, void** buf, uint64_t* size)
|
|
149
|
+
{
|
|
150
|
+
volume_get_buffer_info(id, buf, size);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
void volume_get_voxel_size(uint64_t id, float* dx, float* dy, float* dz)
|
|
154
|
+
{
|
|
155
|
+
*dx = *dx = *dz = 0.0f;
|
|
156
|
+
|
|
157
|
+
VolumeDesc volume;
|
|
158
|
+
if (volume_get_descriptor(id, volume))
|
|
159
|
+
{
|
|
160
|
+
*dx = (float)volume.grid_data.voxel_size[0];
|
|
161
|
+
*dy = (float)volume.grid_data.voxel_size[1];
|
|
162
|
+
*dz = (float)volume.grid_data.voxel_size[2];
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
void volume_get_tiles_host(uint64_t id, void** buf, uint64_t* size)
|
|
167
|
+
{
|
|
168
|
+
static constexpr uint32_t MASK = (1u << 3u) - 1u; // mask for bit operations
|
|
169
|
+
|
|
170
|
+
*buf = 0;
|
|
171
|
+
*size = 0;
|
|
172
|
+
|
|
173
|
+
VolumeDesc volume;
|
|
174
|
+
if (volume_get_descriptor(id, volume))
|
|
175
|
+
{
|
|
176
|
+
const uint32_t leaf_count = volume.tree_data.node_count_leaf;
|
|
177
|
+
*size = leaf_count * sizeof(pnanovdb_coord_t);
|
|
178
|
+
|
|
179
|
+
pnanovdb_coord_t *leaf_coords = (pnanovdb_coord_t*)alloc_host(*size);
|
|
180
|
+
*buf = leaf_coords;
|
|
181
|
+
|
|
182
|
+
const uint64_t first_leaf = (uint64_t)volume.buffer + sizeof(pnanovdb_grid_t) + volume.tree_data.node_offset_leaf;
|
|
183
|
+
const uint32_t leaf_stride = PNANOVDB_GRID_TYPE_GET(volume.grid_data.grid_type, leaf_size);
|
|
184
|
+
|
|
185
|
+
for (uint32_t i = 0; i < leaf_count; ++i)
|
|
186
|
+
{
|
|
187
|
+
leaf_coords[i] = ((pnanovdb_leaf_t*)(first_leaf + leaf_stride * i))->bbox_min;
|
|
188
|
+
leaf_coords[i].x &= ~MASK;
|
|
189
|
+
leaf_coords[i].y &= ~MASK;
|
|
190
|
+
leaf_coords[i].z &= ~MASK;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
void volume_destroy_host(uint64_t id)
|
|
196
|
+
{
|
|
197
|
+
free_host((void*)id);
|
|
198
|
+
volume_rem_descriptor(id);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
void volume_destroy_device(uint64_t id)
|
|
202
|
+
{
|
|
203
|
+
VolumeDesc volume;
|
|
204
|
+
if (volume_get_descriptor(id, volume))
|
|
205
|
+
{
|
|
206
|
+
ContextGuard guard(volume.context);
|
|
207
|
+
free_device(WP_CURRENT_CONTEXT, volume.buffer);
|
|
208
|
+
volume_rem_descriptor(id);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
#if WP_ENABLE_CUDA
|
|
214
|
+
uint64_t volume_f_from_tiles_device(void* context, void* points, int num_points, float voxel_size, float bg_value, float tx, float ty, float tz, bool points_in_world_space)
|
|
215
|
+
{
|
|
216
|
+
nanovdb::FloatGrid* grid;
|
|
217
|
+
size_t gridSize;
|
|
218
|
+
BuildGridParams<float> params;
|
|
219
|
+
params.voxel_size = voxel_size;
|
|
220
|
+
params.background_value = bg_value;
|
|
221
|
+
params.translation = nanovdb::Vec3f{tx, ty, tz};
|
|
222
|
+
|
|
223
|
+
build_grid_from_tiles(grid, gridSize, points, num_points, points_in_world_space, params);
|
|
224
|
+
|
|
225
|
+
return volume_create_device(context, grid, gridSize);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
uint64_t volume_v_from_tiles_device(void* context, void* points, int num_points, float voxel_size, float bg_value_x, float bg_value_y, float bg_value_z, float tx, float ty, float tz, bool points_in_world_space)
|
|
229
|
+
{
|
|
230
|
+
nanovdb::Vec3fGrid* grid;
|
|
231
|
+
size_t gridSize;
|
|
232
|
+
BuildGridParams<nanovdb::Vec3f> params;
|
|
233
|
+
params.voxel_size = voxel_size;
|
|
234
|
+
params.background_value = nanovdb::Vec3f{bg_value_x, bg_value_y, bg_value_z};
|
|
235
|
+
params.translation = nanovdb::Vec3f{tx, ty, tz};
|
|
236
|
+
|
|
237
|
+
build_grid_from_tiles(grid, gridSize, points, num_points, points_in_world_space, params);
|
|
238
|
+
|
|
239
|
+
return volume_create_device(context, grid, gridSize);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
uint64_t volume_i_from_tiles_device(void* context, void* points, int num_points, float voxel_size, int bg_value, float tx, float ty, float tz, bool points_in_world_space)
|
|
243
|
+
{
|
|
244
|
+
nanovdb::Int32Grid* grid;
|
|
245
|
+
size_t gridSize;
|
|
246
|
+
BuildGridParams<int32_t> params;
|
|
247
|
+
params.voxel_size = voxel_size;
|
|
248
|
+
params.background_value = (int32_t)(bg_value);
|
|
249
|
+
params.translation = nanovdb::Vec3f{tx, ty, tz};
|
|
250
|
+
|
|
251
|
+
build_grid_from_tiles(grid, gridSize, points, num_points, points_in_world_space, params);
|
|
252
|
+
|
|
253
|
+
return volume_create_device(context, grid, gridSize);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
void launch_get_leaf_coords(void* context, const uint32_t leaf_count, pnanovdb_coord_t *leaf_coords, const uint64_t first_leaf, const uint32_t leaf_stride);
|
|
257
|
+
|
|
258
|
+
void volume_get_tiles_device(uint64_t id, void** buf, uint64_t* size)
|
|
259
|
+
{
|
|
260
|
+
*buf = 0;
|
|
261
|
+
*size = 0;
|
|
262
|
+
|
|
263
|
+
VolumeDesc volume;
|
|
264
|
+
if (volume_get_descriptor(id, volume))
|
|
265
|
+
{
|
|
266
|
+
const uint32_t leaf_count = volume.tree_data.node_count_leaf;
|
|
267
|
+
*size = leaf_count * sizeof(pnanovdb_coord_t);
|
|
268
|
+
|
|
269
|
+
pnanovdb_coord_t *leaf_coords = (pnanovdb_coord_t*)alloc_device(volume.context, *size);
|
|
270
|
+
*buf = leaf_coords;
|
|
271
|
+
|
|
272
|
+
const uint64_t first_leaf = (uint64_t)volume.buffer + sizeof(pnanovdb_grid_t) + volume.tree_data.node_offset_leaf;
|
|
273
|
+
const uint32_t leaf_stride = PNANOVDB_GRID_TYPE_GET(volume.grid_data.grid_type, leaf_size);
|
|
274
|
+
|
|
275
|
+
launch_get_leaf_coords(volume.context, leaf_count, leaf_coords, first_leaf, leaf_stride);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
#else
|
|
279
|
+
// stubs for non-CUDA platforms
|
|
280
|
+
uint64_t volume_f_from_tiles_device(void* context, void* points, int num_points, float voxel_size, float bg_value, float tx, float ty, float tz, bool points_in_world_space)
|
|
281
|
+
{
|
|
282
|
+
return 0;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
uint64_t volume_v_from_tiles_device(void* context, void* points, int num_points, float voxel_size, float bg_value_x, float bg_value_y, float bg_value_z, float tx, float ty, float tz, bool points_in_world_space)
|
|
286
|
+
{
|
|
287
|
+
return 0;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
uint64_t volume_i_from_tiles_device(void* context, void* points, int num_points, float voxel_size, int bg_value, float tx, float ty, float tz, bool points_in_world_space)
|
|
291
|
+
{
|
|
292
|
+
return 0;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
void volume_get_tiles_device(uint64_t id, void** buf, uint64_t* size) {}
|
|
296
|
+
|
|
297
|
+
#endif
|
warp/native/volume.cu
CHANGED
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
/** Copyright (c) 2022 NVIDIA CORPORATION. All rights reserved.
|
|
2
|
-
* NVIDIA CORPORATION and its licensors retain all intellectual property
|
|
3
|
-
* and proprietary rights in and to this software, related documentation
|
|
4
|
-
* and any modifications thereto. Any use, reproduction, disclosure or
|
|
5
|
-
* distribution of this software and related documentation without an express
|
|
6
|
-
* license agreement from NVIDIA CORPORATION is strictly prohibited.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
#include "volume.h"
|
|
10
|
-
#include "warp.h"
|
|
11
|
-
#include "cuda_util.h"
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
__global__ void volume_get_leaf_coords(const uint32_t leaf_count, pnanovdb_coord_t *leaf_coords, const uint64_t first_leaf, const uint32_t leaf_stride)
|
|
15
|
-
{
|
|
16
|
-
static constexpr uint32_t MASK = (1u << 3u) - 1u; // mask for bit operations
|
|
17
|
-
|
|
18
|
-
const int tid = blockIdx.x*blockDim.x + threadIdx.x;
|
|
19
|
-
|
|
20
|
-
if (tid < leaf_count) {
|
|
21
|
-
leaf_coords[tid] = ((pnanovdb_leaf_t*)(first_leaf + leaf_stride * tid))->bbox_min;
|
|
22
|
-
leaf_coords[tid].x &= ~MASK;
|
|
23
|
-
leaf_coords[tid].y &= ~MASK;
|
|
24
|
-
leaf_coords[tid].z &= ~MASK;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
void launch_get_leaf_coords(void* context, const uint32_t leaf_count, pnanovdb_coord_t *leaf_coords, const uint64_t first_leaf, const uint32_t leaf_stride)
|
|
29
|
-
{
|
|
30
|
-
ContextGuard guard(context);
|
|
31
|
-
wp_launch_device(WP_CURRENT_CONTEXT, volume_get_leaf_coords, leaf_count, (leaf_count, leaf_coords, first_leaf, leaf_stride));
|
|
32
|
-
}
|
|
1
|
+
/** Copyright (c) 2022 NVIDIA CORPORATION. All rights reserved.
|
|
2
|
+
* NVIDIA CORPORATION and its licensors retain all intellectual property
|
|
3
|
+
* and proprietary rights in and to this software, related documentation
|
|
4
|
+
* and any modifications thereto. Any use, reproduction, disclosure or
|
|
5
|
+
* distribution of this software and related documentation without an express
|
|
6
|
+
* license agreement from NVIDIA CORPORATION is strictly prohibited.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
#include "volume.h"
|
|
10
|
+
#include "warp.h"
|
|
11
|
+
#include "cuda_util.h"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
__global__ void volume_get_leaf_coords(const uint32_t leaf_count, pnanovdb_coord_t *leaf_coords, const uint64_t first_leaf, const uint32_t leaf_stride)
|
|
15
|
+
{
|
|
16
|
+
static constexpr uint32_t MASK = (1u << 3u) - 1u; // mask for bit operations
|
|
17
|
+
|
|
18
|
+
const int tid = blockIdx.x*blockDim.x + threadIdx.x;
|
|
19
|
+
|
|
20
|
+
if (tid < leaf_count) {
|
|
21
|
+
leaf_coords[tid] = ((pnanovdb_leaf_t*)(first_leaf + leaf_stride * tid))->bbox_min;
|
|
22
|
+
leaf_coords[tid].x &= ~MASK;
|
|
23
|
+
leaf_coords[tid].y &= ~MASK;
|
|
24
|
+
leaf_coords[tid].z &= ~MASK;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
void launch_get_leaf_coords(void* context, const uint32_t leaf_count, pnanovdb_coord_t *leaf_coords, const uint64_t first_leaf, const uint32_t leaf_stride)
|
|
29
|
+
{
|
|
30
|
+
ContextGuard guard(context);
|
|
31
|
+
wp_launch_device(WP_CURRENT_CONTEXT, volume_get_leaf_coords, leaf_count, (leaf_count, leaf_coords, first_leaf, leaf_stride));
|
|
32
|
+
}
|