warp-lang 1.6.1__py3-none-macosx_10_13_universal2.whl → 1.7.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.

Files changed (401) hide show
  1. warp/__init__.py +21 -7
  2. warp/autograd.py +14 -6
  3. warp/bin/libwarp-clang.dylib +0 -0
  4. warp/bin/libwarp.dylib +0 -0
  5. warp/build.py +424 -6
  6. warp/build_dll.py +20 -20
  7. warp/builtins.py +467 -368
  8. warp/codegen.py +193 -125
  9. warp/config.py +56 -12
  10. warp/constants.py +14 -6
  11. warp/context.py +524 -277
  12. warp/dlpack.py +22 -12
  13. warp/examples/__init__.py +14 -6
  14. warp/examples/assets/nonuniform.usd +0 -0
  15. warp/examples/assets/nvidia_logo.png +0 -0
  16. warp/examples/benchmarks/benchmark_api.py +14 -6
  17. warp/examples/benchmarks/benchmark_cloth.py +14 -6
  18. warp/examples/benchmarks/benchmark_cloth_cupy.py +14 -6
  19. warp/examples/benchmarks/benchmark_cloth_jax.py +14 -6
  20. warp/examples/benchmarks/benchmark_cloth_numba.py +15 -0
  21. warp/examples/benchmarks/benchmark_cloth_numpy.py +14 -6
  22. warp/examples/benchmarks/benchmark_cloth_paddle.py +14 -6
  23. warp/examples/benchmarks/benchmark_cloth_pytorch.py +14 -6
  24. warp/examples/benchmarks/benchmark_cloth_taichi.py +14 -6
  25. warp/examples/benchmarks/benchmark_cloth_warp.py +14 -6
  26. warp/examples/benchmarks/benchmark_gemm.py +82 -48
  27. warp/examples/benchmarks/benchmark_interop_paddle.py +14 -6
  28. warp/examples/benchmarks/benchmark_interop_torch.py +14 -6
  29. warp/examples/benchmarks/benchmark_launches.py +14 -6
  30. warp/examples/benchmarks/benchmark_tile_load_store.py +103 -0
  31. warp/examples/browse.py +14 -6
  32. warp/examples/core/example_cupy.py +14 -6
  33. warp/examples/core/example_dem.py +14 -6
  34. warp/examples/core/example_fluid.py +14 -6
  35. warp/examples/core/example_graph_capture.py +14 -6
  36. warp/examples/core/example_marching_cubes.py +14 -6
  37. warp/examples/core/example_mesh.py +14 -6
  38. warp/examples/core/example_mesh_intersect.py +14 -6
  39. warp/examples/core/example_nvdb.py +14 -6
  40. warp/examples/core/example_raycast.py +14 -6
  41. warp/examples/core/example_raymarch.py +14 -6
  42. warp/examples/core/example_render_opengl.py +14 -6
  43. warp/examples/core/example_sample_mesh.py +300 -0
  44. warp/examples/core/example_sph.py +14 -6
  45. warp/examples/core/example_torch.py +14 -6
  46. warp/examples/core/example_wave.py +14 -6
  47. warp/examples/fem/example_adaptive_grid.py +14 -6
  48. warp/examples/fem/example_apic_fluid.py +15 -7
  49. warp/examples/fem/example_burgers.py +16 -8
  50. warp/examples/fem/example_convection_diffusion.py +14 -6
  51. warp/examples/fem/example_convection_diffusion_dg.py +14 -6
  52. warp/examples/fem/example_deformed_geometry.py +15 -7
  53. warp/examples/fem/example_diffusion.py +14 -6
  54. warp/examples/fem/example_diffusion_3d.py +14 -6
  55. warp/examples/fem/example_diffusion_mgpu.py +14 -6
  56. warp/examples/fem/example_distortion_energy.py +15 -7
  57. warp/examples/fem/example_magnetostatics.py +20 -12
  58. warp/examples/fem/example_mixed_elasticity.py +14 -6
  59. warp/examples/fem/example_navier_stokes.py +14 -6
  60. warp/examples/fem/example_nonconforming_contact.py +14 -6
  61. warp/examples/fem/example_stokes.py +14 -6
  62. warp/examples/fem/example_stokes_transfer.py +14 -6
  63. warp/examples/fem/example_streamlines.py +14 -6
  64. warp/examples/fem/utils.py +24 -3
  65. warp/examples/interop/example_jax_callable.py +116 -0
  66. warp/examples/interop/example_jax_ffi_callback.py +132 -0
  67. warp/examples/interop/example_jax_kernel.py +205 -0
  68. warp/examples/optim/example_bounce.py +14 -6
  69. warp/examples/optim/example_cloth_throw.py +14 -6
  70. warp/examples/optim/example_diffray.py +14 -6
  71. warp/examples/optim/example_drone.py +14 -6
  72. warp/examples/optim/example_fluid_checkpoint.py +497 -0
  73. warp/examples/optim/example_inverse_kinematics.py +14 -6
  74. warp/examples/optim/example_inverse_kinematics_torch.py +14 -6
  75. warp/examples/optim/example_softbody_properties.py +14 -6
  76. warp/examples/optim/example_spring_cage.py +14 -6
  77. warp/examples/optim/example_trajectory.py +14 -6
  78. warp/examples/sim/example_cartpole.py +14 -6
  79. warp/examples/sim/example_cloth.py +14 -6
  80. warp/examples/sim/example_cloth_self_contact.py +14 -6
  81. warp/examples/sim/example_granular.py +14 -6
  82. warp/examples/sim/example_granular_collision_sdf.py +14 -6
  83. warp/examples/sim/example_jacobian_ik.py +14 -6
  84. warp/examples/sim/example_particle_chain.py +14 -6
  85. warp/examples/sim/example_quadruped.py +14 -6
  86. warp/examples/sim/example_rigid_chain.py +14 -6
  87. warp/examples/sim/example_rigid_contact.py +14 -6
  88. warp/examples/sim/example_rigid_force.py +14 -6
  89. warp/examples/sim/example_rigid_gyroscopic.py +14 -6
  90. warp/examples/sim/example_rigid_soft_contact.py +14 -6
  91. warp/examples/sim/example_soft_body.py +14 -6
  92. warp/examples/tile/example_tile_cholesky.py +14 -6
  93. warp/examples/tile/example_tile_convolution.py +14 -6
  94. warp/examples/tile/example_tile_fft.py +14 -6
  95. warp/examples/tile/example_tile_filtering.py +14 -6
  96. warp/examples/tile/example_tile_matmul.py +16 -10
  97. warp/examples/tile/example_tile_mlp.py +14 -6
  98. warp/examples/tile/example_tile_nbody.py +14 -6
  99. warp/examples/tile/example_tile_walker.py +14 -6
  100. warp/fabric.py +15 -0
  101. warp/fem/__init__.py +26 -1
  102. warp/fem/adaptivity.py +19 -4
  103. warp/fem/cache.py +15 -0
  104. warp/fem/dirichlet.py +15 -0
  105. warp/fem/domain.py +15 -0
  106. warp/fem/field/__init__.py +15 -0
  107. warp/fem/field/field.py +15 -0
  108. warp/fem/field/nodal_field.py +37 -68
  109. warp/fem/field/restriction.py +15 -0
  110. warp/fem/field/virtual.py +77 -23
  111. warp/fem/geometry/__init__.py +15 -0
  112. warp/fem/geometry/adaptive_nanogrid.py +24 -10
  113. warp/fem/geometry/closest_point.py +16 -1
  114. warp/fem/geometry/deformed_geometry.py +20 -2
  115. warp/fem/geometry/element.py +15 -0
  116. warp/fem/geometry/geometry.py +20 -0
  117. warp/fem/geometry/grid_2d.py +27 -12
  118. warp/fem/geometry/grid_3d.py +27 -15
  119. warp/fem/geometry/hexmesh.py +20 -7
  120. warp/fem/geometry/nanogrid.py +24 -11
  121. warp/fem/geometry/partition.py +15 -0
  122. warp/fem/geometry/quadmesh.py +28 -13
  123. warp/fem/geometry/tetmesh.py +18 -4
  124. warp/fem/geometry/trimesh.py +18 -8
  125. warp/fem/integrate.py +277 -93
  126. warp/fem/linalg.py +20 -5
  127. warp/fem/operator.py +15 -0
  128. warp/fem/polynomial.py +15 -0
  129. warp/fem/quadrature/__init__.py +15 -0
  130. warp/fem/quadrature/pic_quadrature.py +52 -22
  131. warp/fem/quadrature/quadrature.py +209 -25
  132. warp/fem/space/__init__.py +16 -1
  133. warp/fem/space/basis_function_space.py +19 -2
  134. warp/fem/space/basis_space.py +40 -18
  135. warp/fem/space/dof_mapper.py +15 -0
  136. warp/fem/space/function_space.py +15 -0
  137. warp/fem/space/grid_2d_function_space.py +15 -0
  138. warp/fem/space/grid_3d_function_space.py +15 -0
  139. warp/fem/space/hexmesh_function_space.py +17 -2
  140. warp/fem/space/nanogrid_function_space.py +15 -0
  141. warp/fem/space/partition.py +21 -2
  142. warp/fem/space/quadmesh_function_space.py +23 -8
  143. warp/fem/space/restriction.py +15 -0
  144. warp/fem/space/shape/__init__.py +15 -0
  145. warp/fem/space/shape/cube_shape_function.py +38 -23
  146. warp/fem/space/shape/shape_function.py +15 -0
  147. warp/fem/space/shape/square_shape_function.py +27 -12
  148. warp/fem/space/shape/tet_shape_function.py +15 -0
  149. warp/fem/space/shape/triangle_shape_function.py +16 -1
  150. warp/fem/space/tetmesh_function_space.py +18 -3
  151. warp/fem/space/topology.py +15 -0
  152. warp/fem/space/trimesh_function_space.py +17 -2
  153. warp/fem/types.py +15 -0
  154. warp/fem/utils.py +27 -6
  155. warp/jax.py +28 -7
  156. warp/jax_experimental/__init__.py +16 -0
  157. warp/{jax_experimental.py → jax_experimental/custom_call.py} +28 -33
  158. warp/jax_experimental/ffi.py +698 -0
  159. warp/jax_experimental/xla_ffi.py +602 -0
  160. warp/math.py +103 -6
  161. warp/native/array.h +28 -6
  162. warp/native/builtin.h +44 -9
  163. warp/native/bvh.cpp +18 -7
  164. warp/native/bvh.cu +57 -20
  165. warp/native/bvh.h +17 -7
  166. warp/native/clang/clang.cpp +45 -9
  167. warp/native/coloring.cpp +15 -6
  168. warp/native/crt.cpp +15 -6
  169. warp/native/crt.h +15 -6
  170. warp/native/cuda_crt.h +15 -6
  171. warp/native/cuda_util.cpp +29 -6
  172. warp/native/cuda_util.h +17 -6
  173. warp/native/error.cpp +15 -6
  174. warp/native/error.h +15 -6
  175. warp/native/exports.h +85 -63
  176. warp/native/fabric.h +15 -6
  177. warp/native/hashgrid.cpp +15 -6
  178. warp/native/hashgrid.cu +15 -6
  179. warp/native/hashgrid.h +15 -6
  180. warp/native/initializer_array.h +15 -6
  181. warp/native/intersect.h +41 -32
  182. warp/native/intersect_adj.h +48 -39
  183. warp/native/intersect_tri.h +17 -0
  184. warp/native/marching.cpp +16 -0
  185. warp/native/marching.cu +16 -7
  186. warp/native/marching.h +17 -0
  187. warp/native/mat.h +528 -15
  188. warp/native/mathdx.cpp +15 -6
  189. warp/native/matnn.h +15 -6
  190. warp/native/mesh.cpp +15 -6
  191. warp/native/mesh.cu +15 -6
  192. warp/native/mesh.h +25 -16
  193. warp/native/noise.h +15 -6
  194. warp/native/quat.h +114 -17
  195. warp/native/rand.h +21 -6
  196. warp/native/range.h +15 -6
  197. warp/native/reduce.cpp +15 -6
  198. warp/native/reduce.cu +15 -6
  199. warp/native/runlength_encode.cpp +15 -6
  200. warp/native/runlength_encode.cu +15 -6
  201. warp/native/scan.cpp +15 -6
  202. warp/native/scan.cu +15 -6
  203. warp/native/scan.h +15 -6
  204. warp/native/solid_angle.h +17 -0
  205. warp/native/sort.cpp +137 -65
  206. warp/native/sort.cu +167 -21
  207. warp/native/sort.h +23 -7
  208. warp/native/sparse.cpp +58 -28
  209. warp/native/sparse.cu +67 -23
  210. warp/native/spatial.h +15 -6
  211. warp/native/svd.h +131 -6
  212. warp/native/temp_buffer.h +15 -6
  213. warp/native/tile.h +316 -111
  214. warp/native/tile_reduce.h +61 -9
  215. warp/native/vec.h +83 -13
  216. warp/native/volume.cpp +100 -119
  217. warp/native/volume.cu +15 -6
  218. warp/native/volume.h +15 -6
  219. warp/native/volume_builder.cu +40 -16
  220. warp/native/volume_builder.h +21 -6
  221. warp/native/volume_impl.h +15 -6
  222. warp/native/warp.cpp +20 -12
  223. warp/native/warp.cu +114 -16
  224. warp/native/warp.h +34 -16
  225. warp/optim/__init__.py +14 -6
  226. warp/optim/adam.py +14 -6
  227. warp/optim/linear.py +25 -10
  228. warp/optim/sgd.py +14 -6
  229. warp/paddle.py +14 -6
  230. warp/render/__init__.py +14 -6
  231. warp/render/render_opengl.py +14 -6
  232. warp/render/render_usd.py +14 -6
  233. warp/render/utils.py +14 -6
  234. warp/sim/__init__.py +14 -7
  235. warp/sim/articulation.py +18 -10
  236. warp/sim/collide.py +35 -16
  237. warp/sim/graph_coloring.py +14 -6
  238. warp/sim/import_mjcf.py +463 -162
  239. warp/sim/import_snu.py +14 -7
  240. warp/sim/import_urdf.py +46 -18
  241. warp/sim/import_usd.py +14 -7
  242. warp/sim/inertia.py +14 -6
  243. warp/sim/integrator.py +14 -6
  244. warp/sim/integrator_euler.py +19 -11
  245. warp/sim/integrator_featherstone.py +17 -16
  246. warp/sim/integrator_vbd.py +222 -8
  247. warp/sim/integrator_xpbd.py +19 -11
  248. warp/sim/model.py +56 -19
  249. warp/sim/particles.py +14 -6
  250. warp/sim/render.py +14 -6
  251. warp/sim/utils.py +17 -2
  252. warp/sparse.py +657 -555
  253. warp/stubs.py +231 -19
  254. warp/tape.py +14 -6
  255. warp/tests/aux_test_class_kernel.py +14 -6
  256. warp/tests/aux_test_compile_consts_dummy.py +14 -6
  257. warp/tests/aux_test_conditional_unequal_types_kernels.py +14 -6
  258. warp/tests/aux_test_dependent.py +14 -6
  259. warp/tests/aux_test_grad_customs.py +14 -6
  260. warp/tests/aux_test_instancing_gc.py +14 -6
  261. warp/tests/aux_test_module_unload.py +14 -6
  262. warp/tests/aux_test_name_clash1.py +14 -6
  263. warp/tests/aux_test_name_clash2.py +14 -6
  264. warp/tests/aux_test_unresolved_func.py +14 -6
  265. warp/tests/aux_test_unresolved_symbol.py +14 -6
  266. warp/tests/cuda/__init__.py +0 -0
  267. warp/tests/{test_async.py → cuda/test_async.py} +14 -6
  268. warp/tests/{test_ipc.py → cuda/test_ipc.py} +14 -6
  269. warp/tests/{test_mempool.py → cuda/test_mempool.py} +53 -6
  270. warp/tests/{test_multigpu.py → cuda/test_multigpu.py} +14 -6
  271. warp/tests/{test_peer.py → cuda/test_peer.py} +14 -6
  272. warp/tests/{test_pinned.py → cuda/test_pinned.py} +14 -6
  273. warp/tests/{test_streams.py → cuda/test_streams.py} +85 -6
  274. warp/tests/geometry/__init__.py +0 -0
  275. warp/tests/{test_bvh.py → geometry/test_bvh.py} +14 -6
  276. warp/tests/{test_hash_grid.py → geometry/test_hash_grid.py} +14 -6
  277. warp/tests/{test_marching_cubes.py → geometry/test_marching_cubes.py} +14 -6
  278. warp/tests/{test_mesh.py → geometry/test_mesh.py} +14 -6
  279. warp/tests/{test_mesh_query_aabb.py → geometry/test_mesh_query_aabb.py} +14 -6
  280. warp/tests/{test_mesh_query_point.py → geometry/test_mesh_query_point.py} +80 -69
  281. warp/tests/{test_mesh_query_ray.py → geometry/test_mesh_query_ray.py} +15 -7
  282. warp/tests/{test_volume.py → geometry/test_volume.py} +55 -12
  283. warp/tests/{test_volume_write.py → geometry/test_volume_write.py} +14 -6
  284. warp/tests/interop/__init__.py +0 -0
  285. warp/tests/{test_dlpack.py → interop/test_dlpack.py} +42 -11
  286. warp/tests/{test_jax.py → interop/test_jax.py} +14 -6
  287. warp/tests/{test_paddle.py → interop/test_paddle.py} +14 -6
  288. warp/tests/{test_torch.py → interop/test_torch.py} +14 -6
  289. warp/tests/run_coverage_serial.py +14 -6
  290. warp/tests/sim/__init__.py +0 -0
  291. warp/tests/{disabled_kinematics.py → sim/disabled_kinematics.py} +23 -16
  292. warp/tests/{flaky_test_sim_grad.py → sim/flaky_test_sim_grad.py} +14 -6
  293. warp/tests/{test_collision.py → sim/test_collision.py} +16 -8
  294. warp/tests/{test_coloring.py → sim/test_coloring.py} +14 -7
  295. warp/tests/{test_model.py → sim/test_model.py} +55 -7
  296. warp/tests/{test_sim_grad_bounce_linear.py → sim/test_sim_grad_bounce_linear.py} +14 -6
  297. warp/tests/{test_sim_kinematics.py → sim/test_sim_kinematics.py} +16 -7
  298. warp/tests/sim/test_vbd.py +597 -0
  299. warp/tests/test_adam.py +14 -6
  300. warp/tests/test_arithmetic.py +14 -6
  301. warp/tests/test_array.py +14 -6
  302. warp/tests/test_array_reduce.py +14 -6
  303. warp/tests/test_assert.py +14 -6
  304. warp/tests/test_atomic.py +14 -6
  305. warp/tests/test_bool.py +15 -7
  306. warp/tests/test_builtins_resolution.py +14 -6
  307. warp/tests/test_closest_point_edge_edge.py +14 -6
  308. warp/tests/test_codegen.py +14 -6
  309. warp/tests/test_codegen_instancing.py +14 -6
  310. warp/tests/test_compile_consts.py +14 -6
  311. warp/tests/test_conditional.py +14 -6
  312. warp/tests/test_context.py +14 -6
  313. warp/tests/test_copy.py +14 -6
  314. warp/tests/test_ctypes.py +14 -6
  315. warp/tests/test_dense.py +14 -6
  316. warp/tests/test_devices.py +14 -6
  317. warp/tests/test_examples.py +42 -42
  318. warp/tests/test_fabricarray.py +14 -6
  319. warp/tests/test_fast_math.py +14 -6
  320. warp/tests/test_fem.py +37 -10
  321. warp/tests/test_fp16.py +14 -6
  322. warp/tests/test_func.py +14 -6
  323. warp/tests/test_future_annotations.py +14 -6
  324. warp/tests/test_generics.py +14 -6
  325. warp/tests/test_grad.py +14 -6
  326. warp/tests/test_grad_customs.py +14 -6
  327. warp/tests/test_grad_debug.py +14 -6
  328. warp/tests/test_implicit_init.py +14 -6
  329. warp/tests/test_import.py +14 -6
  330. warp/tests/test_indexedarray.py +14 -6
  331. warp/tests/test_intersect.py +14 -6
  332. warp/tests/test_iter.py +14 -6
  333. warp/tests/test_large.py +14 -6
  334. warp/tests/test_launch.py +14 -6
  335. warp/tests/test_lerp.py +14 -6
  336. warp/tests/test_linear_solvers.py +15 -11
  337. warp/tests/test_lvalue.py +14 -6
  338. warp/tests/test_mat.py +247 -85
  339. warp/tests/test_mat_lite.py +14 -6
  340. warp/tests/test_mat_scalar_ops.py +18 -10
  341. warp/tests/test_math.py +14 -6
  342. warp/tests/test_mlp.py +14 -6
  343. warp/tests/test_module_hashing.py +14 -6
  344. warp/tests/test_modules_lite.py +14 -6
  345. warp/tests/test_noise.py +14 -6
  346. warp/tests/test_operators.py +14 -6
  347. warp/tests/test_options.py +14 -6
  348. warp/tests/test_overwrite.py +15 -60
  349. warp/tests/test_print.py +14 -6
  350. warp/tests/test_quat.py +81 -52
  351. warp/tests/test_rand.py +58 -43
  352. warp/tests/test_reload.py +14 -6
  353. warp/tests/test_rounding.py +14 -6
  354. warp/tests/test_runlength_encode.py +14 -6
  355. warp/tests/test_scalar_ops.py +14 -6
  356. warp/tests/test_smoothstep.py +14 -6
  357. warp/tests/test_snippet.py +15 -0
  358. warp/tests/test_sparse.py +61 -12
  359. warp/tests/test_spatial.py +89 -6
  360. warp/tests/test_special_values.py +14 -6
  361. warp/tests/test_static.py +15 -7
  362. warp/tests/test_struct.py +14 -6
  363. warp/tests/test_tape.py +14 -6
  364. warp/tests/test_transient_module.py +14 -6
  365. warp/tests/test_triangle_closest_point.py +14 -6
  366. warp/tests/test_types.py +14 -6
  367. warp/tests/test_utils.py +98 -10
  368. warp/tests/test_vec.py +60 -40
  369. warp/tests/test_vec_lite.py +14 -6
  370. warp/tests/test_vec_scalar_ops.py +14 -6
  371. warp/tests/test_verify_fp.py +14 -6
  372. warp/tests/tile/__init__.py +0 -0
  373. warp/tests/{test_tile.py → tile/test_tile.py} +150 -57
  374. warp/tests/{test_tile_load.py → tile/test_tile_load.py} +15 -7
  375. warp/tests/{test_tile_mathdx.py → tile/test_tile_mathdx.py} +23 -12
  376. warp/tests/{test_tile_mlp.py → tile/test_tile_mlp.py} +39 -20
  377. warp/tests/{test_tile_reduce.py → tile/test_tile_reduce.py} +74 -7
  378. warp/tests/{test_tile_shared_memory.py → tile/test_tile_shared_memory.py} +14 -6
  379. warp/tests/{test_tile_view.py → tile/test_tile_view.py} +15 -7
  380. warp/tests/unittest_serial.py +15 -6
  381. warp/tests/unittest_suites.py +59 -65
  382. warp/tests/unittest_utils.py +16 -7
  383. warp/tests/walkthrough_debug.py +14 -6
  384. warp/thirdparty/unittest_parallel.py +15 -8
  385. warp/torch.py +14 -6
  386. warp/types.py +124 -664
  387. warp/utils.py +151 -78
  388. {warp_lang-1.6.1.dist-info → warp_lang-1.7.0.dist-info}/METADATA +39 -12
  389. warp_lang-1.7.0.dist-info/RECORD +429 -0
  390. {warp_lang-1.6.1.dist-info → warp_lang-1.7.0.dist-info}/WHEEL +1 -1
  391. warp_lang-1.7.0.dist-info/licenses/LICENSE.md +202 -0
  392. warp/examples/optim/example_walker.py +0 -309
  393. warp/native/cutlass_gemm.cpp +0 -34
  394. warp/native/cutlass_gemm.cu +0 -373
  395. warp/tests/test_matmul.py +0 -503
  396. warp/tests/test_matmul_lite.py +0 -403
  397. warp/tests/test_vbd.py +0 -378
  398. warp/tests/unused_test_misc.py +0 -69
  399. warp_lang-1.6.1.dist-info/LICENSE.md +0 -126
  400. warp_lang-1.6.1.dist-info/RECORD +0 -419
  401. {warp_lang-1.6.1.dist-info → warp_lang-1.7.0.dist-info}/top_level.txt +0 -0
warp/native/volume.cpp CHANGED
@@ -1,9 +1,18 @@
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.
1
+ /*
2
+ * SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
7
16
  */
8
17
 
9
18
  #include "cuda_util.h"
@@ -21,7 +30,7 @@ namespace
21
30
  struct VolumeDesc
22
31
  {
23
32
  // NanoVDB buffer either in device or host memory
24
- void *buffer;
33
+ void* buffer;
25
34
  uint64_t size_in_bytes;
26
35
  bool owner; // whether the buffer should be deallocated when the volume is destroyed
27
36
 
@@ -29,23 +38,23 @@ struct VolumeDesc
29
38
  pnanovdb_tree_t tree_data;
30
39
 
31
40
  // Host-accessible version of the blind metadata (copy if GPU, alias if CPU)
32
- pnanovdb_gridblindmetadata_t *blind_metadata;
41
+ pnanovdb_gridblindmetadata_t* blind_metadata;
33
42
 
34
43
  // CUDA context for this volume (NULL if CPU)
35
- void *context;
44
+ void* context;
36
45
 
37
- pnanovdb_buf_t as_pnano() const { return pnanovdb_make_buf(static_cast<uint32_t *>(buffer), size_in_bytes); }
46
+ pnanovdb_buf_t as_pnano() const { return pnanovdb_make_buf(static_cast<uint32_t*>(buffer), size_in_bytes); }
38
47
  };
39
48
 
40
49
  // Host-side volume descriptors. Maps each CPU/GPU volume buffer address (id) to a CPU desc
41
50
  std::map<uint64_t, VolumeDesc> g_volume_descriptors;
42
51
 
43
- bool volume_get_descriptor(uint64_t id, const VolumeDesc *&volumeDesc)
52
+ bool volume_get_descriptor(uint64_t id, const VolumeDesc*& volumeDesc)
44
53
  {
45
54
  if (id == 0)
46
55
  return false;
47
56
 
48
- const auto &iter = g_volume_descriptors.find(id);
57
+ const auto& iter = g_volume_descriptors.find(id);
49
58
  if (iter == g_volume_descriptors.end())
50
59
  return false;
51
60
  else
@@ -53,21 +62,21 @@ bool volume_get_descriptor(uint64_t id, const VolumeDesc *&volumeDesc)
53
62
  return true;
54
63
  }
55
64
 
56
- bool volume_exists(const void *id)
65
+ bool volume_exists(const void* id)
57
66
  {
58
- const VolumeDesc *volume;
67
+ const VolumeDesc* volume;
59
68
  return volume_get_descriptor((uint64_t)id, volume);
60
69
  }
61
70
 
62
- void volume_add_descriptor(uint64_t id, VolumeDesc &&volumeDesc) { g_volume_descriptors[id] = std::move(volumeDesc); }
71
+ void volume_add_descriptor(uint64_t id, VolumeDesc&& volumeDesc) { g_volume_descriptors[id] = std::move(volumeDesc); }
63
72
 
64
73
  void volume_rem_descriptor(uint64_t id) { g_volume_descriptors.erase(id); }
65
74
 
66
- void volume_set_map(nanovdb::Map &map, const float transform[9], const float translation[3])
75
+ void volume_set_map(nanovdb::Map& map, const float transform[9], const float translation[3])
67
76
  {
68
77
  // Need to transpose as Map::set is transposing again
69
- const mat_t<3, 3, double> transpose(transform[0], transform[3], transform[6], transform[1], transform[4], transform[7],
70
- transform[2], transform[5], transform[8]);
78
+ const mat_t<3, 3, double> transpose(transform[0], transform[3], transform[6], transform[1], transform[4],
79
+ transform[7], transform[2], transform[5], transform[8]);
71
80
  const mat_t<3, 3, double> inv = inverse(transpose);
72
81
 
73
82
  map.set(transpose.data, inv.data, translation);
@@ -76,7 +85,7 @@ void volume_set_map(nanovdb::Map &map, const float transform[9], const float tra
76
85
  } // anonymous namespace
77
86
 
78
87
  // NB: buf must be a host pointer
79
- uint64_t volume_create_host(void *buf, uint64_t size, bool copy, bool owner)
88
+ uint64_t volume_create_host(void* buf, uint64_t size, bool copy, bool owner)
80
89
  {
81
90
  if (size > 0 && size < sizeof(pnanovdb_grid_t) + sizeof(pnanovdb_tree_t))
82
91
  return 0; // This cannot be a valid NanoVDB grid with data
@@ -91,7 +100,7 @@ uint64_t volume_create_host(void *buf, uint64_t size, bool copy, bool owner)
91
100
  volume.context = NULL;
92
101
 
93
102
  memcpy_h2h(&volume.grid_data, buf, sizeof(pnanovdb_grid_t));
94
- memcpy_h2h(&volume.tree_data, (pnanovdb_grid_t *)buf + 1, sizeof(pnanovdb_tree_t));
103
+ memcpy_h2h(&volume.tree_data, (pnanovdb_grid_t*)buf + 1, sizeof(pnanovdb_tree_t));
95
104
 
96
105
  if (volume.grid_data.magic != PNANOVDB_MAGIC_NUMBER && volume.grid_data.magic != PNANOVDB_MAGIC_GRID)
97
106
  return 0;
@@ -116,8 +125,8 @@ uint64_t volume_create_host(void *buf, uint64_t size, bool copy, bool owner)
116
125
  }
117
126
 
118
127
  // Alias blind metadata
119
- volume.blind_metadata = reinterpret_cast<pnanovdb_gridblindmetadata_t *>(static_cast<uint8_t *>(volume.buffer) +
120
- volume.grid_data.blind_metadata_offset);
128
+ volume.blind_metadata = reinterpret_cast<pnanovdb_gridblindmetadata_t*>(static_cast<uint8_t*>(volume.buffer) +
129
+ volume.grid_data.blind_metadata_offset);
121
130
 
122
131
  uint64_t id = (uint64_t)volume.buffer;
123
132
 
@@ -127,7 +136,7 @@ uint64_t volume_create_host(void *buf, uint64_t size, bool copy, bool owner)
127
136
  }
128
137
 
129
138
  // NB: buf must be a pointer on the same device
130
- uint64_t volume_create_device(void *context, void *buf, uint64_t size, bool copy, bool owner)
139
+ uint64_t volume_create_device(void* context, void* buf, uint64_t size, bool copy, bool owner)
131
140
  {
132
141
  if (size > 0 && size < sizeof(pnanovdb_grid_t) + sizeof(pnanovdb_tree_t))
133
142
  return 0; // This cannot be a valid NanoVDB grid with data
@@ -144,7 +153,7 @@ uint64_t volume_create_device(void *context, void *buf, uint64_t size, bool copy
144
153
  volume.context = context ? context : cuda_context_get_current();
145
154
 
146
155
  memcpy_d2h(WP_CURRENT_CONTEXT, &volume.grid_data, buf, sizeof(pnanovdb_grid_t));
147
- memcpy_d2h(WP_CURRENT_CONTEXT, &volume.tree_data, (pnanovdb_grid_t *)buf + 1, sizeof(pnanovdb_tree_t));
156
+ memcpy_d2h(WP_CURRENT_CONTEXT, &volume.tree_data, (pnanovdb_grid_t*)buf + 1, sizeof(pnanovdb_tree_t));
148
157
  // no sync needed since the above copies are to pageable memory
149
158
 
150
159
  if (volume.grid_data.magic != PNANOVDB_MAGIC_NUMBER && volume.grid_data.magic != PNANOVDB_MAGIC_GRID)
@@ -171,9 +180,9 @@ uint64_t volume_create_device(void *context, void *buf, uint64_t size, bool copy
171
180
 
172
181
  // Make blind metadata accessible on host
173
182
  const uint64_t blindmetadata_size = volume.grid_data.blind_metadata_count * sizeof(pnanovdb_gridblindmetadata_t);
174
- volume.blind_metadata = static_cast<pnanovdb_gridblindmetadata_t *>(alloc_pinned(blindmetadata_size));
183
+ volume.blind_metadata = static_cast<pnanovdb_gridblindmetadata_t*>(alloc_pinned(blindmetadata_size));
175
184
  memcpy_d2h(WP_CURRENT_CONTEXT, volume.blind_metadata,
176
- static_cast<uint8_t *>(volume.buffer) + volume.grid_data.blind_metadata_offset, blindmetadata_size);
185
+ static_cast<uint8_t*>(volume.buffer) + volume.grid_data.blind_metadata_offset, blindmetadata_size);
177
186
 
178
187
  uint64_t id = (uint64_t)volume.buffer;
179
188
  volume_add_descriptor(id, std::move(volume));
@@ -181,12 +190,12 @@ uint64_t volume_create_device(void *context, void *buf, uint64_t size, bool copy
181
190
  return id;
182
191
  }
183
192
 
184
- void volume_get_buffer_info(uint64_t id, void **buf, uint64_t *size)
193
+ void volume_get_buffer_info(uint64_t id, void** buf, uint64_t* size)
185
194
  {
186
195
  *buf = 0;
187
196
  *size = 0;
188
197
 
189
- const VolumeDesc *volume;
198
+ const VolumeDesc* volume;
190
199
  if (volume_get_descriptor(id, volume))
191
200
  {
192
201
  *buf = volume->buffer;
@@ -194,11 +203,11 @@ void volume_get_buffer_info(uint64_t id, void **buf, uint64_t *size)
194
203
  }
195
204
  }
196
205
 
197
- void volume_get_voxel_size(uint64_t id, float *dx, float *dy, float *dz)
206
+ void volume_get_voxel_size(uint64_t id, float* dx, float* dy, float* dz)
198
207
  {
199
208
  *dx = *dx = *dz = 0.0f;
200
209
 
201
- const VolumeDesc *volume;
210
+ const VolumeDesc* volume;
202
211
  if (volume_get_descriptor(id, volume))
203
212
  {
204
213
  *dx = (float)volume->grid_data.voxel_size[0];
@@ -207,12 +216,12 @@ void volume_get_voxel_size(uint64_t id, float *dx, float *dy, float *dz)
207
216
  }
208
217
  }
209
218
 
210
- void volume_get_tile_and_voxel_count(uint64_t id, uint32_t &tile_count, uint64_t &voxel_count)
219
+ void volume_get_tile_and_voxel_count(uint64_t id, uint32_t& tile_count, uint64_t& voxel_count)
211
220
  {
212
221
  tile_count = 0;
213
222
  voxel_count = 0;
214
223
 
215
- const VolumeDesc *volume;
224
+ const VolumeDesc* volume;
216
225
  if (volume_get_descriptor(id, volume))
217
226
  {
218
227
  tile_count = volume->tree_data.node_count_leaf;
@@ -233,13 +242,13 @@ void volume_get_tile_and_voxel_count(uint64_t id, uint32_t &tile_count, uint64_t
233
242
  }
234
243
  }
235
244
 
236
- const char *volume_get_grid_info(uint64_t id, uint64_t *grid_size, uint32_t *grid_index, uint32_t *grid_count,
245
+ const char* volume_get_grid_info(uint64_t id, uint64_t* grid_size, uint32_t* grid_index, uint32_t* grid_count,
237
246
  float translation[3], float transform[9], char type_str[16])
238
247
  {
239
- const VolumeDesc *volume;
248
+ const VolumeDesc* volume;
240
249
  if (volume_get_descriptor(id, volume))
241
250
  {
242
- const pnanovdb_grid_t &grid_data = volume->grid_data;
251
+ const pnanovdb_grid_t& grid_data = volume->grid_data;
243
252
  *grid_count = grid_data.grid_count;
244
253
  *grid_index = grid_data.grid_index;
245
254
  *grid_size = grid_data.grid_size;
@@ -248,7 +257,7 @@ const char *volume_get_grid_info(uint64_t id, uint64_t *grid_size, uint32_t *gri
248
257
  memcpy(transform, grid_data.map.matf, sizeof(grid_data.map.matf));
249
258
 
250
259
  nanovdb::toStr(type_str, static_cast<nanovdb::GridType>(grid_data.grid_type));
251
- return (const char *)grid_data.grid_name;
260
+ return (const char*)grid_data.grid_name;
252
261
  }
253
262
 
254
263
  *grid_size = 0;
@@ -261,7 +270,7 @@ const char *volume_get_grid_info(uint64_t id, uint64_t *grid_size, uint32_t *gri
261
270
 
262
271
  uint32_t volume_get_blind_data_count(uint64_t id)
263
272
  {
264
- const VolumeDesc *volume;
273
+ const VolumeDesc* volume;
265
274
  if (volume_get_descriptor(id, volume))
266
275
  {
267
276
  return volume->grid_data.blind_metadata_count;
@@ -269,20 +278,20 @@ uint32_t volume_get_blind_data_count(uint64_t id)
269
278
  return 0;
270
279
  }
271
280
 
272
- const char *volume_get_blind_data_info(uint64_t id, uint32_t data_index, void **buf, uint64_t *value_count,
273
- uint32_t *value_size, char type_str[16])
281
+ const char* volume_get_blind_data_info(uint64_t id, uint32_t data_index, void** buf, uint64_t* value_count,
282
+ uint32_t* value_size, char type_str[16])
274
283
  {
275
- const VolumeDesc *volume;
284
+ const VolumeDesc* volume;
276
285
  if (volume_get_descriptor(id, volume) && data_index < volume->grid_data.blind_metadata_count)
277
286
  {
278
- const pnanovdb_gridblindmetadata_t &metadata = volume->blind_metadata[data_index];
287
+ const pnanovdb_gridblindmetadata_t& metadata = volume->blind_metadata[data_index];
279
288
  *value_count = metadata.value_count;
280
289
  *value_size = metadata.value_size;
281
290
 
282
291
  nanovdb::toStr(type_str, static_cast<nanovdb::GridType>(metadata.data_type));
283
- *buf = static_cast<uint8_t *>(volume->buffer) + volume->grid_data.blind_metadata_offset +
292
+ *buf = static_cast<uint8_t*>(volume->buffer) + volume->grid_data.blind_metadata_offset +
284
293
  data_index * sizeof(pnanovdb_gridblindmetadata_t) + metadata.data_offset;
285
- return (const char *)metadata.name;
294
+ return (const char*)metadata.name;
286
295
  }
287
296
  *buf = nullptr;
288
297
  *value_count = 0;
@@ -291,16 +300,16 @@ const char *volume_get_blind_data_info(uint64_t id, uint32_t data_index, void **
291
300
  return nullptr;
292
301
  }
293
302
 
294
- void volume_get_tiles_host(uint64_t id, void *buf)
303
+ void volume_get_tiles_host(uint64_t id, void* buf)
295
304
  {
296
305
  static constexpr uint32_t MASK = (1u << 3u) - 1u; // mask for bit operations
297
306
 
298
- const VolumeDesc *volume;
307
+ const VolumeDesc* volume;
299
308
  if (volume_get_descriptor(id, volume))
300
309
  {
301
310
  const uint32_t leaf_count = volume->tree_data.node_count_leaf;
302
311
 
303
- pnanovdb_coord_t *leaf_coords = static_cast<pnanovdb_coord_t *>(buf);
312
+ pnanovdb_coord_t* leaf_coords = static_cast<pnanovdb_coord_t*>(buf);
304
313
 
305
314
  const uint64_t first_leaf =
306
315
  (uint64_t)volume->buffer + sizeof(pnanovdb_grid_t) + volume->tree_data.node_offset_leaf;
@@ -316,16 +325,16 @@ void volume_get_tiles_host(uint64_t id, void *buf)
316
325
  }
317
326
  }
318
327
 
319
- void volume_get_voxels_host(uint64_t id, void *buf)
328
+ void volume_get_voxels_host(uint64_t id, void* buf)
320
329
  {
321
- const VolumeDesc *volume;
330
+ const VolumeDesc* volume;
322
331
  if (volume_get_descriptor(id, volume))
323
332
  {
324
333
  uint32_t leaf_count;
325
334
  uint64_t voxel_count;
326
335
  volume_get_tile_and_voxel_count(id, leaf_count, voxel_count);
327
336
 
328
- pnanovdb_coord_t *voxel_coords = static_cast<pnanovdb_coord_t *>(buf);
337
+ pnanovdb_coord_t* voxel_coords = static_cast<pnanovdb_coord_t*>(buf);
329
338
 
330
339
  const pnanovdb_buf_t pnano_buf = volume->as_pnano();
331
340
  for (uint32_t i = 0; i < leaf_count; ++i)
@@ -354,7 +363,7 @@ void volume_get_voxels_host(uint64_t id, void *buf)
354
363
 
355
364
  void volume_destroy_host(uint64_t id)
356
365
  {
357
- const VolumeDesc *volume;
366
+ const VolumeDesc* volume;
358
367
  if (volume_get_descriptor(id, volume))
359
368
  {
360
369
  if (volume->owner)
@@ -367,7 +376,7 @@ void volume_destroy_host(uint64_t id)
367
376
 
368
377
  void volume_destroy_device(uint64_t id)
369
378
  {
370
- const VolumeDesc *volume;
379
+ const VolumeDesc* volume;
371
380
  if (volume_get_descriptor(id, volume))
372
381
  {
373
382
  ContextGuard guard(volume->context);
@@ -382,52 +391,35 @@ void volume_destroy_device(uint64_t id)
382
391
 
383
392
  #if WP_ENABLE_CUDA
384
393
 
385
- uint64_t volume_f_from_tiles_device(void *context, void *points, int num_points, float transform[9],
386
- float translation[3], bool points_in_world_space, float bg_value)
394
+ uint64_t volume_from_tiles_device(void* context, void* points, int num_points, float transform[9], float translation[3],
395
+ bool points_in_world_space, const void* value_ptr, uint32_t value_size,
396
+ const char* value_type)
387
397
  {
388
- nanovdb::FloatGrid *grid;
389
- size_t gridSize;
390
- BuildGridParams<float> params;
391
- params.background_value = bg_value;
392
- volume_set_map(params.map, transform, translation);
393
-
394
- build_grid_from_points(grid, gridSize, points, num_points, points_in_world_space, params);
395
-
396
- return volume_create_device(context, grid, gridSize, false, true);
397
- }
398
-
399
- uint64_t volume_v_from_tiles_device(void *context, void *points, int num_points, float transform[9],
400
- float translation[3], bool points_in_world_space, float bg_value[3])
401
- {
402
- nanovdb::Vec3fGrid *grid;
403
- size_t gridSize;
404
- BuildGridParams<nanovdb::Vec3f> params;
405
- params.background_value = nanovdb::Vec3f{bg_value[0], bg_value[1], bg_value[2]};
406
- volume_set_map(params.map, transform, translation);
407
-
408
- build_grid_from_points(grid, gridSize, points, num_points, points_in_world_space, params);
409
-
410
- return volume_create_device(context, grid, gridSize, false, true);
411
- }
412
-
413
- uint64_t volume_i_from_tiles_device(void *context, void *points, int num_points, float transform[9],
414
- float translation[3], bool points_in_world_space, int bg_value)
415
- {
416
- nanovdb::Int32Grid *grid;
417
- size_t gridSize;
418
- BuildGridParams<int32_t> params;
419
- params.background_value = (int32_t)(bg_value);
420
- volume_set_map(params.map, transform, translation);
398
+ char gridTypeStr[12];
399
+
400
+ #define EXPAND_BUILDER_TYPE(type) \
401
+ nanovdb::toStr(gridTypeStr, nanovdb::toGridType<type>()); \
402
+ if (strncmp(gridTypeStr, value_type, sizeof(gridTypeStr)) == 0) \
403
+ { \
404
+ BuildGridParams<type> params; \
405
+ memcpy(&params.background_value, value_ptr, value_size); \
406
+ volume_set_map(params.map, transform, translation); \
407
+ size_t gridSize; \
408
+ nanovdb::Grid<nanovdb::NanoTree<type>>* grid; \
409
+ build_grid_from_points(grid, gridSize, points, num_points, points_in_world_space, params); \
410
+ return volume_create_device(context, grid, gridSize, false, true); \
411
+ }
421
412
 
422
- build_grid_from_points(grid, gridSize, points, num_points, points_in_world_space, params);
413
+ WP_VOLUME_BUILDER_INSTANTIATE_TYPES
414
+ #undef EXPAND_BUILDER_TYPE
423
415
 
424
- return volume_create_device(context, grid, gridSize, false, true);
416
+ return 0;
425
417
  }
426
418
 
427
- uint64_t volume_index_from_tiles_device(void *context, void *points, int num_points, float transform[9],
419
+ uint64_t volume_index_from_tiles_device(void* context, void* points, int num_points, float transform[9],
428
420
  float translation[3], bool points_in_world_space)
429
421
  {
430
- nanovdb::IndexGrid *grid;
422
+ nanovdb::IndexGrid* grid;
431
423
  size_t gridSize;
432
424
  BuildGridParams<nanovdb::ValueIndex> params;
433
425
  volume_set_map(params.map, transform, translation);
@@ -437,10 +429,10 @@ uint64_t volume_index_from_tiles_device(void *context, void *points, int num_poi
437
429
  return volume_create_device(context, grid, gridSize, false, true);
438
430
  }
439
431
 
440
- uint64_t volume_from_active_voxels_device(void *context, void *points, int num_points, float transform[9],
432
+ uint64_t volume_from_active_voxels_device(void* context, void* points, int num_points, float transform[9],
441
433
  float translation[3], bool points_in_world_space)
442
434
  {
443
- nanovdb::OnIndexGrid *grid;
435
+ nanovdb::OnIndexGrid* grid;
444
436
  size_t gridSize;
445
437
  BuildGridParams<nanovdb::ValueOnIndex> params;
446
438
  volume_set_map(params.map, transform, translation);
@@ -450,71 +442,60 @@ uint64_t volume_from_active_voxels_device(void *context, void *points, int num_p
450
442
  return volume_create_device(context, grid, gridSize, false, true);
451
443
  }
452
444
 
453
- void launch_get_leaf_coords(void *context, const uint32_t leaf_count, pnanovdb_coord_t *leaf_coords,
445
+ void launch_get_leaf_coords(void* context, const uint32_t leaf_count, pnanovdb_coord_t* leaf_coords,
454
446
  pnanovdb_buf_t buf);
455
- void launch_get_voxel_coords(void *context, const uint32_t leaf_count, const uint32_t voxel_count,
456
- pnanovdb_coord_t *voxel_coords, pnanovdb_buf_t buf);
447
+ void launch_get_voxel_coords(void* context, const uint32_t leaf_count, const uint32_t voxel_count,
448
+ pnanovdb_coord_t* voxel_coords, pnanovdb_buf_t buf);
457
449
 
458
- void volume_get_tiles_device(uint64_t id, void *buf)
450
+ void volume_get_tiles_device(uint64_t id, void* buf)
459
451
  {
460
- const VolumeDesc *volume;
452
+ const VolumeDesc* volume;
461
453
  if (volume_get_descriptor(id, volume))
462
454
  {
463
455
  const uint32_t leaf_count = volume->tree_data.node_count_leaf;
464
456
 
465
- pnanovdb_coord_t *leaf_coords = static_cast<pnanovdb_coord_t *>(buf);
457
+ pnanovdb_coord_t* leaf_coords = static_cast<pnanovdb_coord_t*>(buf);
466
458
  launch_get_leaf_coords(volume->context, leaf_count, leaf_coords, volume->as_pnano());
467
459
  }
468
460
  }
469
461
 
470
- void volume_get_voxels_device(uint64_t id, void *buf)
462
+ void volume_get_voxels_device(uint64_t id, void* buf)
471
463
  {
472
- const VolumeDesc *volume;
464
+ const VolumeDesc* volume;
473
465
  if (volume_get_descriptor(id, volume))
474
466
  {
475
467
  uint32_t leaf_count;
476
468
  uint64_t voxel_count;
477
469
  volume_get_tile_and_voxel_count(id, leaf_count, voxel_count);
478
470
 
479
- pnanovdb_coord_t *voxel_coords = static_cast<pnanovdb_coord_t *>(buf);
471
+ pnanovdb_coord_t* voxel_coords = static_cast<pnanovdb_coord_t*>(buf);
480
472
  launch_get_voxel_coords(volume->context, leaf_count, voxel_count, voxel_coords, volume->as_pnano());
481
473
  }
482
474
  }
483
475
 
484
476
  #else
485
477
  // stubs for non-CUDA platforms
486
- uint64_t volume_f_from_tiles_device(void *context, void *points, int num_points, float transform[9],
487
- float translation[3], bool points_in_world_space, float bg_value)
488
- {
489
- return 0;
490
- }
491
-
492
- uint64_t volume_v_from_tiles_device(void *context, void *points, int num_points, float transform[9],
493
- float translation[3], bool points_in_world_space, float bg_value[3])
494
- {
495
- return 0;
496
- }
497
-
498
- uint64_t volume_i_from_tiles_device(void *context, void *points, int num_points, float transform[9],
499
- float translation[3], bool points_in_world_space, int bg_value)
478
+ uint64_t volume_from_tiles_device(void* context, void* points, int num_points, float transform[9],
479
+ float translation[3], bool points_in_world_space, const void* value_ptr, uint32_t value_size,
480
+ const char* value_type)
500
481
  {
501
482
  return 0;
502
483
  }
503
484
 
504
- uint64_t volume_index_from_tiles_device(void *context, void *points, int num_points, float transform[9],
485
+ uint64_t volume_index_from_tiles_device(void* context, void* points, int num_points, float transform[9],
505
486
  float translation[3], bool points_in_world_space)
506
487
  {
507
488
  return 0;
508
489
  }
509
490
 
510
- uint64_t volume_from_active_voxels_device(void *context, void *points, int num_points, float transform[9],
491
+ uint64_t volume_from_active_voxels_device(void* context, void* points, int num_points, float transform[9],
511
492
  float translation[3], bool points_in_world_space)
512
493
  {
513
494
  return 0;
514
495
  }
515
496
 
516
- void volume_get_tiles_device(uint64_t id, void *buf) {}
497
+ void volume_get_tiles_device(uint64_t id, void* buf) {}
517
498
 
518
- void volume_get_voxels_device(uint64_t id, void *buf) {}
499
+ void volume_get_voxels_device(uint64_t id, void* buf) {}
519
500
 
520
501
  #endif
warp/native/volume.cu CHANGED
@@ -1,9 +1,18 @@
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.
1
+ /*
2
+ * SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
7
16
  */
8
17
 
9
18
  #include "cuda_util.h"
warp/native/volume.h CHANGED
@@ -1,9 +1,18 @@
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.
1
+ /*
2
+ * SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
7
16
  */
8
17
 
9
18
  #pragma once
@@ -1,9 +1,18 @@
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.
1
+ /*
2
+ * SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
7
16
  */
8
17
 
9
18
  #include "volume_builder.h"
@@ -258,11 +267,21 @@ __device__ std::enable_if_t<nanovdb::BuildTraits<typename Node::BuildType>::is_i
258
267
  {
259
268
  }
260
269
 
270
+ template <typename T>
271
+ struct alignas(alignof(T)) AlignedProxy
272
+ {
273
+ char data[sizeof(T)];
274
+ };
275
+
261
276
  template <typename Tree, typename NodeT>
262
277
  __global__ void setInternalBBoxAndBackgroundValue(Tree *tree, const typename Tree::BuildType background_value)
263
278
  {
264
279
  using BBox = nanovdb::math::BBox<typename NodeT::CoordT>;
265
- __shared__ BBox bbox;
280
+ using BBoxProxy = AlignedProxy<BBox>;
281
+
282
+ __shared__ BBoxProxy bbox_mem;
283
+
284
+ BBox& bbox = reinterpret_cast<BBox&>(bbox_mem);
266
285
 
267
286
  const unsigned node_count = tree->mNodeCount[NodeT::LEVEL];
268
287
  const unsigned node_id = blockIdx.x;
@@ -272,7 +291,7 @@ __global__ void setInternalBBoxAndBackgroundValue(Tree *tree, const typename Tre
272
291
 
273
292
  if (threadIdx.x == 0)
274
293
  {
275
- bbox = BBox();
294
+ new(&bbox) BBox();
276
295
  }
277
296
 
278
297
  __syncthreads();
@@ -304,14 +323,17 @@ __global__ void setRootBBoxAndBackgroundValue(nanovdb::Grid<Tree> *grid,
304
323
  const typename Tree::BuildType background_value)
305
324
  {
306
325
  using BBox = typename Tree::RootNodeType::BBoxType;
307
- __shared__ BBox bbox;
326
+ using BBoxProxy = AlignedProxy<BBox>;
327
+ __shared__ BBoxProxy bbox_mem;
328
+
329
+ BBox& bbox = reinterpret_cast<BBox&>(bbox_mem);
308
330
 
309
331
  Tree &tree = grid->tree();
310
332
  const unsigned upper_count = tree.mNodeCount[2];
311
333
 
312
334
  if (threadIdx.x == 0)
313
335
  {
314
- bbox = BBox();
336
+ new(&bbox) BBox();
315
337
  }
316
338
 
317
339
  __syncthreads();
@@ -441,12 +463,14 @@ void build_grid_from_points(nanovdb::Grid<nanovdb::NanoTree<BuildT>> *&out_grid,
441
463
  grid_handle.buffer().detachDeviceData();
442
464
  }
443
465
 
444
- template void build_grid_from_points(nanovdb::Grid<nanovdb::NanoTree<float>> *&, size_t &, const void *, size_t, bool,
445
- const BuildGridParams<float> &);
446
- template void build_grid_from_points(nanovdb::Grid<nanovdb::NanoTree<nanovdb::Vec3f>> *&, size_t &, const void *,
447
- size_t, bool, const BuildGridParams<nanovdb::Vec3f> &);
448
- template void build_grid_from_points(nanovdb::Grid<nanovdb::NanoTree<int32_t>> *&, size_t &, const void *, size_t, bool,
449
- const BuildGridParams<int32_t> &);
466
+
467
+ #define EXPAND_BUILDER_TYPE(type) \
468
+ template void build_grid_from_points(nanovdb::Grid<nanovdb::NanoTree<type>> *&, size_t &, const void *, size_t, bool, \
469
+ const BuildGridParams<type> &);
470
+
471
+ WP_VOLUME_BUILDER_INSTANTIATE_TYPES
472
+ #undef EXPAND_BUILDER_TYPE
473
+
450
474
  template void build_grid_from_points(nanovdb::Grid<nanovdb::NanoTree<nanovdb::ValueIndex>> *&, size_t &, const void *,
451
475
  size_t, bool, const BuildGridParams<nanovdb::ValueIndex> &);
452
476
  template void build_grid_from_points(nanovdb::Grid<nanovdb::NanoTree<nanovdb::ValueOnIndex>> *&, size_t &, const void *,