warp-lang 1.10.0__py3-none-macosx_11_0_arm64.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 (468) hide show
  1. warp/__init__.py +334 -0
  2. warp/__init__.pyi +5856 -0
  3. warp/_src/__init__.py +14 -0
  4. warp/_src/autograd.py +1077 -0
  5. warp/_src/build.py +620 -0
  6. warp/_src/build_dll.py +642 -0
  7. warp/_src/builtins.py +10555 -0
  8. warp/_src/codegen.py +4361 -0
  9. warp/_src/config.py +178 -0
  10. warp/_src/constants.py +59 -0
  11. warp/_src/context.py +8352 -0
  12. warp/_src/dlpack.py +464 -0
  13. warp/_src/fabric.py +362 -0
  14. warp/_src/fem/__init__.py +14 -0
  15. warp/_src/fem/adaptivity.py +510 -0
  16. warp/_src/fem/cache.py +689 -0
  17. warp/_src/fem/dirichlet.py +190 -0
  18. warp/_src/fem/domain.py +553 -0
  19. warp/_src/fem/field/__init__.py +131 -0
  20. warp/_src/fem/field/field.py +703 -0
  21. warp/_src/fem/field/nodal_field.py +403 -0
  22. warp/_src/fem/field/restriction.py +39 -0
  23. warp/_src/fem/field/virtual.py +1021 -0
  24. warp/_src/fem/geometry/__init__.py +32 -0
  25. warp/_src/fem/geometry/adaptive_nanogrid.py +782 -0
  26. warp/_src/fem/geometry/closest_point.py +99 -0
  27. warp/_src/fem/geometry/deformed_geometry.py +277 -0
  28. warp/_src/fem/geometry/element.py +854 -0
  29. warp/_src/fem/geometry/geometry.py +693 -0
  30. warp/_src/fem/geometry/grid_2d.py +478 -0
  31. warp/_src/fem/geometry/grid_3d.py +539 -0
  32. warp/_src/fem/geometry/hexmesh.py +956 -0
  33. warp/_src/fem/geometry/nanogrid.py +660 -0
  34. warp/_src/fem/geometry/partition.py +483 -0
  35. warp/_src/fem/geometry/quadmesh.py +597 -0
  36. warp/_src/fem/geometry/tetmesh.py +762 -0
  37. warp/_src/fem/geometry/trimesh.py +588 -0
  38. warp/_src/fem/integrate.py +2507 -0
  39. warp/_src/fem/linalg.py +385 -0
  40. warp/_src/fem/operator.py +398 -0
  41. warp/_src/fem/polynomial.py +231 -0
  42. warp/_src/fem/quadrature/__init__.py +17 -0
  43. warp/_src/fem/quadrature/pic_quadrature.py +318 -0
  44. warp/_src/fem/quadrature/quadrature.py +665 -0
  45. warp/_src/fem/space/__init__.py +248 -0
  46. warp/_src/fem/space/basis_function_space.py +499 -0
  47. warp/_src/fem/space/basis_space.py +681 -0
  48. warp/_src/fem/space/dof_mapper.py +253 -0
  49. warp/_src/fem/space/function_space.py +312 -0
  50. warp/_src/fem/space/grid_2d_function_space.py +179 -0
  51. warp/_src/fem/space/grid_3d_function_space.py +229 -0
  52. warp/_src/fem/space/hexmesh_function_space.py +255 -0
  53. warp/_src/fem/space/nanogrid_function_space.py +199 -0
  54. warp/_src/fem/space/partition.py +435 -0
  55. warp/_src/fem/space/quadmesh_function_space.py +222 -0
  56. warp/_src/fem/space/restriction.py +221 -0
  57. warp/_src/fem/space/shape/__init__.py +152 -0
  58. warp/_src/fem/space/shape/cube_shape_function.py +1107 -0
  59. warp/_src/fem/space/shape/shape_function.py +134 -0
  60. warp/_src/fem/space/shape/square_shape_function.py +928 -0
  61. warp/_src/fem/space/shape/tet_shape_function.py +829 -0
  62. warp/_src/fem/space/shape/triangle_shape_function.py +674 -0
  63. warp/_src/fem/space/tetmesh_function_space.py +270 -0
  64. warp/_src/fem/space/topology.py +461 -0
  65. warp/_src/fem/space/trimesh_function_space.py +193 -0
  66. warp/_src/fem/types.py +114 -0
  67. warp/_src/fem/utils.py +488 -0
  68. warp/_src/jax.py +188 -0
  69. warp/_src/jax_experimental/__init__.py +14 -0
  70. warp/_src/jax_experimental/custom_call.py +389 -0
  71. warp/_src/jax_experimental/ffi.py +1286 -0
  72. warp/_src/jax_experimental/xla_ffi.py +658 -0
  73. warp/_src/marching_cubes.py +710 -0
  74. warp/_src/math.py +416 -0
  75. warp/_src/optim/__init__.py +14 -0
  76. warp/_src/optim/adam.py +165 -0
  77. warp/_src/optim/linear.py +1608 -0
  78. warp/_src/optim/sgd.py +114 -0
  79. warp/_src/paddle.py +408 -0
  80. warp/_src/render/__init__.py +14 -0
  81. warp/_src/render/imgui_manager.py +291 -0
  82. warp/_src/render/render_opengl.py +3638 -0
  83. warp/_src/render/render_usd.py +939 -0
  84. warp/_src/render/utils.py +162 -0
  85. warp/_src/sparse.py +2718 -0
  86. warp/_src/tape.py +1208 -0
  87. warp/_src/thirdparty/__init__.py +0 -0
  88. warp/_src/thirdparty/appdirs.py +598 -0
  89. warp/_src/thirdparty/dlpack.py +145 -0
  90. warp/_src/thirdparty/unittest_parallel.py +676 -0
  91. warp/_src/torch.py +393 -0
  92. warp/_src/types.py +5888 -0
  93. warp/_src/utils.py +1695 -0
  94. warp/autograd.py +33 -0
  95. warp/bin/libwarp-clang.dylib +0 -0
  96. warp/bin/libwarp.dylib +0 -0
  97. warp/build.py +29 -0
  98. warp/build_dll.py +24 -0
  99. warp/codegen.py +24 -0
  100. warp/constants.py +24 -0
  101. warp/context.py +33 -0
  102. warp/dlpack.py +24 -0
  103. warp/examples/__init__.py +24 -0
  104. warp/examples/assets/bear.usd +0 -0
  105. warp/examples/assets/bunny.usd +0 -0
  106. warp/examples/assets/cube.usd +0 -0
  107. warp/examples/assets/nonuniform.usd +0 -0
  108. warp/examples/assets/nvidia_logo.png +0 -0
  109. warp/examples/assets/pixel.jpg +0 -0
  110. warp/examples/assets/rocks.nvdb +0 -0
  111. warp/examples/assets/rocks.usd +0 -0
  112. warp/examples/assets/sphere.usd +0 -0
  113. warp/examples/assets/square_cloth.usd +0 -0
  114. warp/examples/benchmarks/benchmark_api.py +389 -0
  115. warp/examples/benchmarks/benchmark_cloth.py +296 -0
  116. warp/examples/benchmarks/benchmark_cloth_cupy.py +96 -0
  117. warp/examples/benchmarks/benchmark_cloth_jax.py +105 -0
  118. warp/examples/benchmarks/benchmark_cloth_numba.py +161 -0
  119. warp/examples/benchmarks/benchmark_cloth_numpy.py +85 -0
  120. warp/examples/benchmarks/benchmark_cloth_paddle.py +94 -0
  121. warp/examples/benchmarks/benchmark_cloth_pytorch.py +94 -0
  122. warp/examples/benchmarks/benchmark_cloth_taichi.py +120 -0
  123. warp/examples/benchmarks/benchmark_cloth_warp.py +153 -0
  124. warp/examples/benchmarks/benchmark_gemm.py +164 -0
  125. warp/examples/benchmarks/benchmark_interop_paddle.py +166 -0
  126. warp/examples/benchmarks/benchmark_interop_torch.py +166 -0
  127. warp/examples/benchmarks/benchmark_launches.py +301 -0
  128. warp/examples/benchmarks/benchmark_tile_load_store.py +103 -0
  129. warp/examples/benchmarks/benchmark_tile_sort.py +155 -0
  130. warp/examples/browse.py +37 -0
  131. warp/examples/core/example_cupy.py +86 -0
  132. warp/examples/core/example_dem.py +241 -0
  133. warp/examples/core/example_fluid.py +299 -0
  134. warp/examples/core/example_graph_capture.py +150 -0
  135. warp/examples/core/example_marching_cubes.py +195 -0
  136. warp/examples/core/example_mesh.py +180 -0
  137. warp/examples/core/example_mesh_intersect.py +211 -0
  138. warp/examples/core/example_nvdb.py +182 -0
  139. warp/examples/core/example_raycast.py +111 -0
  140. warp/examples/core/example_raymarch.py +205 -0
  141. warp/examples/core/example_render_opengl.py +290 -0
  142. warp/examples/core/example_sample_mesh.py +300 -0
  143. warp/examples/core/example_sph.py +411 -0
  144. warp/examples/core/example_spin_lock.py +93 -0
  145. warp/examples/core/example_torch.py +211 -0
  146. warp/examples/core/example_wave.py +269 -0
  147. warp/examples/core/example_work_queue.py +118 -0
  148. warp/examples/distributed/example_jacobi_mpi.py +506 -0
  149. warp/examples/fem/example_adaptive_grid.py +286 -0
  150. warp/examples/fem/example_apic_fluid.py +469 -0
  151. warp/examples/fem/example_burgers.py +261 -0
  152. warp/examples/fem/example_convection_diffusion.py +181 -0
  153. warp/examples/fem/example_convection_diffusion_dg.py +225 -0
  154. warp/examples/fem/example_darcy_ls_optimization.py +489 -0
  155. warp/examples/fem/example_deformed_geometry.py +172 -0
  156. warp/examples/fem/example_diffusion.py +196 -0
  157. warp/examples/fem/example_diffusion_3d.py +225 -0
  158. warp/examples/fem/example_diffusion_mgpu.py +225 -0
  159. warp/examples/fem/example_distortion_energy.py +228 -0
  160. warp/examples/fem/example_elastic_shape_optimization.py +387 -0
  161. warp/examples/fem/example_magnetostatics.py +242 -0
  162. warp/examples/fem/example_mixed_elasticity.py +293 -0
  163. warp/examples/fem/example_navier_stokes.py +263 -0
  164. warp/examples/fem/example_nonconforming_contact.py +300 -0
  165. warp/examples/fem/example_stokes.py +213 -0
  166. warp/examples/fem/example_stokes_transfer.py +262 -0
  167. warp/examples/fem/example_streamlines.py +357 -0
  168. warp/examples/fem/utils.py +1047 -0
  169. warp/examples/interop/example_jax_callable.py +146 -0
  170. warp/examples/interop/example_jax_ffi_callback.py +132 -0
  171. warp/examples/interop/example_jax_kernel.py +232 -0
  172. warp/examples/optim/example_diffray.py +561 -0
  173. warp/examples/optim/example_fluid_checkpoint.py +497 -0
  174. warp/examples/tile/example_tile_block_cholesky.py +502 -0
  175. warp/examples/tile/example_tile_cholesky.py +88 -0
  176. warp/examples/tile/example_tile_convolution.py +66 -0
  177. warp/examples/tile/example_tile_fft.py +55 -0
  178. warp/examples/tile/example_tile_filtering.py +113 -0
  179. warp/examples/tile/example_tile_matmul.py +85 -0
  180. warp/examples/tile/example_tile_mcgp.py +191 -0
  181. warp/examples/tile/example_tile_mlp.py +385 -0
  182. warp/examples/tile/example_tile_nbody.py +199 -0
  183. warp/fabric.py +24 -0
  184. warp/fem/__init__.py +173 -0
  185. warp/fem/adaptivity.py +26 -0
  186. warp/fem/cache.py +30 -0
  187. warp/fem/dirichlet.py +24 -0
  188. warp/fem/field/__init__.py +24 -0
  189. warp/fem/field/field.py +26 -0
  190. warp/fem/geometry/__init__.py +21 -0
  191. warp/fem/geometry/closest_point.py +31 -0
  192. warp/fem/linalg.py +38 -0
  193. warp/fem/operator.py +32 -0
  194. warp/fem/polynomial.py +29 -0
  195. warp/fem/space/__init__.py +22 -0
  196. warp/fem/space/basis_space.py +24 -0
  197. warp/fem/space/shape/__init__.py +68 -0
  198. warp/fem/space/topology.py +24 -0
  199. warp/fem/types.py +24 -0
  200. warp/fem/utils.py +32 -0
  201. warp/jax.py +29 -0
  202. warp/jax_experimental/__init__.py +29 -0
  203. warp/jax_experimental/custom_call.py +29 -0
  204. warp/jax_experimental/ffi.py +39 -0
  205. warp/jax_experimental/xla_ffi.py +24 -0
  206. warp/marching_cubes.py +24 -0
  207. warp/math.py +37 -0
  208. warp/native/array.h +1687 -0
  209. warp/native/builtin.h +2327 -0
  210. warp/native/bvh.cpp +562 -0
  211. warp/native/bvh.cu +826 -0
  212. warp/native/bvh.h +555 -0
  213. warp/native/clang/clang.cpp +541 -0
  214. warp/native/coloring.cpp +622 -0
  215. warp/native/crt.cpp +51 -0
  216. warp/native/crt.h +568 -0
  217. warp/native/cuda_crt.h +1058 -0
  218. warp/native/cuda_util.cpp +677 -0
  219. warp/native/cuda_util.h +313 -0
  220. warp/native/error.cpp +77 -0
  221. warp/native/error.h +36 -0
  222. warp/native/exports.h +2023 -0
  223. warp/native/fabric.h +246 -0
  224. warp/native/hashgrid.cpp +311 -0
  225. warp/native/hashgrid.cu +89 -0
  226. warp/native/hashgrid.h +240 -0
  227. warp/native/initializer_array.h +41 -0
  228. warp/native/intersect.h +1253 -0
  229. warp/native/intersect_adj.h +375 -0
  230. warp/native/intersect_tri.h +348 -0
  231. warp/native/mat.h +5189 -0
  232. warp/native/mathdx.cpp +93 -0
  233. warp/native/matnn.h +221 -0
  234. warp/native/mesh.cpp +266 -0
  235. warp/native/mesh.cu +406 -0
  236. warp/native/mesh.h +2097 -0
  237. warp/native/nanovdb/GridHandle.h +533 -0
  238. warp/native/nanovdb/HostBuffer.h +591 -0
  239. warp/native/nanovdb/NanoVDB.h +6246 -0
  240. warp/native/nanovdb/NodeManager.h +323 -0
  241. warp/native/nanovdb/PNanoVDB.h +3390 -0
  242. warp/native/noise.h +859 -0
  243. warp/native/quat.h +1664 -0
  244. warp/native/rand.h +342 -0
  245. warp/native/range.h +145 -0
  246. warp/native/reduce.cpp +174 -0
  247. warp/native/reduce.cu +363 -0
  248. warp/native/runlength_encode.cpp +79 -0
  249. warp/native/runlength_encode.cu +61 -0
  250. warp/native/scan.cpp +47 -0
  251. warp/native/scan.cu +55 -0
  252. warp/native/scan.h +23 -0
  253. warp/native/solid_angle.h +466 -0
  254. warp/native/sort.cpp +251 -0
  255. warp/native/sort.cu +286 -0
  256. warp/native/sort.h +35 -0
  257. warp/native/sparse.cpp +241 -0
  258. warp/native/sparse.cu +435 -0
  259. warp/native/spatial.h +1306 -0
  260. warp/native/svd.h +727 -0
  261. warp/native/temp_buffer.h +46 -0
  262. warp/native/tile.h +4124 -0
  263. warp/native/tile_radix_sort.h +1112 -0
  264. warp/native/tile_reduce.h +838 -0
  265. warp/native/tile_scan.h +240 -0
  266. warp/native/tuple.h +189 -0
  267. warp/native/vec.h +2199 -0
  268. warp/native/version.h +23 -0
  269. warp/native/volume.cpp +501 -0
  270. warp/native/volume.cu +68 -0
  271. warp/native/volume.h +970 -0
  272. warp/native/volume_builder.cu +483 -0
  273. warp/native/volume_builder.h +52 -0
  274. warp/native/volume_impl.h +70 -0
  275. warp/native/warp.cpp +1143 -0
  276. warp/native/warp.cu +4604 -0
  277. warp/native/warp.h +358 -0
  278. warp/optim/__init__.py +20 -0
  279. warp/optim/adam.py +24 -0
  280. warp/optim/linear.py +35 -0
  281. warp/optim/sgd.py +24 -0
  282. warp/paddle.py +24 -0
  283. warp/py.typed +0 -0
  284. warp/render/__init__.py +22 -0
  285. warp/render/imgui_manager.py +29 -0
  286. warp/render/render_opengl.py +24 -0
  287. warp/render/render_usd.py +24 -0
  288. warp/render/utils.py +24 -0
  289. warp/sparse.py +51 -0
  290. warp/tape.py +24 -0
  291. warp/tests/__init__.py +1 -0
  292. warp/tests/__main__.py +4 -0
  293. warp/tests/assets/curlnoise_golden.npy +0 -0
  294. warp/tests/assets/mlp_golden.npy +0 -0
  295. warp/tests/assets/pixel.npy +0 -0
  296. warp/tests/assets/pnoise_golden.npy +0 -0
  297. warp/tests/assets/spiky.usd +0 -0
  298. warp/tests/assets/test_grid.nvdb +0 -0
  299. warp/tests/assets/test_index_grid.nvdb +0 -0
  300. warp/tests/assets/test_int32_grid.nvdb +0 -0
  301. warp/tests/assets/test_vec_grid.nvdb +0 -0
  302. warp/tests/assets/torus.nvdb +0 -0
  303. warp/tests/assets/torus.usda +105 -0
  304. warp/tests/aux_test_class_kernel.py +34 -0
  305. warp/tests/aux_test_compile_consts_dummy.py +18 -0
  306. warp/tests/aux_test_conditional_unequal_types_kernels.py +29 -0
  307. warp/tests/aux_test_dependent.py +29 -0
  308. warp/tests/aux_test_grad_customs.py +29 -0
  309. warp/tests/aux_test_instancing_gc.py +26 -0
  310. warp/tests/aux_test_module_aot.py +7 -0
  311. warp/tests/aux_test_module_unload.py +23 -0
  312. warp/tests/aux_test_name_clash1.py +40 -0
  313. warp/tests/aux_test_name_clash2.py +40 -0
  314. warp/tests/aux_test_reference.py +9 -0
  315. warp/tests/aux_test_reference_reference.py +8 -0
  316. warp/tests/aux_test_square.py +16 -0
  317. warp/tests/aux_test_unresolved_func.py +22 -0
  318. warp/tests/aux_test_unresolved_symbol.py +22 -0
  319. warp/tests/cuda/__init__.py +0 -0
  320. warp/tests/cuda/test_async.py +676 -0
  321. warp/tests/cuda/test_conditional_captures.py +1147 -0
  322. warp/tests/cuda/test_ipc.py +124 -0
  323. warp/tests/cuda/test_mempool.py +233 -0
  324. warp/tests/cuda/test_multigpu.py +169 -0
  325. warp/tests/cuda/test_peer.py +139 -0
  326. warp/tests/cuda/test_pinned.py +84 -0
  327. warp/tests/cuda/test_streams.py +691 -0
  328. warp/tests/geometry/__init__.py +0 -0
  329. warp/tests/geometry/test_bvh.py +335 -0
  330. warp/tests/geometry/test_hash_grid.py +259 -0
  331. warp/tests/geometry/test_marching_cubes.py +294 -0
  332. warp/tests/geometry/test_mesh.py +318 -0
  333. warp/tests/geometry/test_mesh_query_aabb.py +392 -0
  334. warp/tests/geometry/test_mesh_query_point.py +935 -0
  335. warp/tests/geometry/test_mesh_query_ray.py +323 -0
  336. warp/tests/geometry/test_volume.py +1103 -0
  337. warp/tests/geometry/test_volume_write.py +346 -0
  338. warp/tests/interop/__init__.py +0 -0
  339. warp/tests/interop/test_dlpack.py +730 -0
  340. warp/tests/interop/test_jax.py +1673 -0
  341. warp/tests/interop/test_paddle.py +800 -0
  342. warp/tests/interop/test_torch.py +1001 -0
  343. warp/tests/run_coverage_serial.py +39 -0
  344. warp/tests/test_adam.py +162 -0
  345. warp/tests/test_arithmetic.py +1096 -0
  346. warp/tests/test_array.py +3756 -0
  347. warp/tests/test_array_reduce.py +156 -0
  348. warp/tests/test_assert.py +303 -0
  349. warp/tests/test_atomic.py +336 -0
  350. warp/tests/test_atomic_bitwise.py +209 -0
  351. warp/tests/test_atomic_cas.py +312 -0
  352. warp/tests/test_bool.py +220 -0
  353. warp/tests/test_builtins_resolution.py +732 -0
  354. warp/tests/test_closest_point_edge_edge.py +327 -0
  355. warp/tests/test_codegen.py +974 -0
  356. warp/tests/test_codegen_instancing.py +1495 -0
  357. warp/tests/test_compile_consts.py +215 -0
  358. warp/tests/test_conditional.py +298 -0
  359. warp/tests/test_context.py +35 -0
  360. warp/tests/test_copy.py +319 -0
  361. warp/tests/test_ctypes.py +618 -0
  362. warp/tests/test_dense.py +73 -0
  363. warp/tests/test_devices.py +127 -0
  364. warp/tests/test_enum.py +136 -0
  365. warp/tests/test_examples.py +424 -0
  366. warp/tests/test_fabricarray.py +998 -0
  367. warp/tests/test_fast_math.py +72 -0
  368. warp/tests/test_fem.py +2204 -0
  369. warp/tests/test_fixedarray.py +229 -0
  370. warp/tests/test_fp16.py +136 -0
  371. warp/tests/test_func.py +501 -0
  372. warp/tests/test_future_annotations.py +100 -0
  373. warp/tests/test_generics.py +656 -0
  374. warp/tests/test_grad.py +893 -0
  375. warp/tests/test_grad_customs.py +339 -0
  376. warp/tests/test_grad_debug.py +341 -0
  377. warp/tests/test_implicit_init.py +411 -0
  378. warp/tests/test_import.py +45 -0
  379. warp/tests/test_indexedarray.py +1140 -0
  380. warp/tests/test_intersect.py +103 -0
  381. warp/tests/test_iter.py +76 -0
  382. warp/tests/test_large.py +177 -0
  383. warp/tests/test_launch.py +411 -0
  384. warp/tests/test_lerp.py +151 -0
  385. warp/tests/test_linear_solvers.py +223 -0
  386. warp/tests/test_lvalue.py +427 -0
  387. warp/tests/test_map.py +526 -0
  388. warp/tests/test_mat.py +3515 -0
  389. warp/tests/test_mat_assign_copy.py +178 -0
  390. warp/tests/test_mat_constructors.py +573 -0
  391. warp/tests/test_mat_lite.py +122 -0
  392. warp/tests/test_mat_scalar_ops.py +2913 -0
  393. warp/tests/test_math.py +212 -0
  394. warp/tests/test_module_aot.py +287 -0
  395. warp/tests/test_module_hashing.py +258 -0
  396. warp/tests/test_modules_lite.py +70 -0
  397. warp/tests/test_noise.py +252 -0
  398. warp/tests/test_operators.py +299 -0
  399. warp/tests/test_options.py +129 -0
  400. warp/tests/test_overwrite.py +551 -0
  401. warp/tests/test_print.py +408 -0
  402. warp/tests/test_quat.py +2653 -0
  403. warp/tests/test_quat_assign_copy.py +145 -0
  404. warp/tests/test_rand.py +339 -0
  405. warp/tests/test_reload.py +303 -0
  406. warp/tests/test_rounding.py +157 -0
  407. warp/tests/test_runlength_encode.py +196 -0
  408. warp/tests/test_scalar_ops.py +133 -0
  409. warp/tests/test_smoothstep.py +108 -0
  410. warp/tests/test_snippet.py +318 -0
  411. warp/tests/test_sparse.py +845 -0
  412. warp/tests/test_spatial.py +2859 -0
  413. warp/tests/test_spatial_assign_copy.py +160 -0
  414. warp/tests/test_special_values.py +361 -0
  415. warp/tests/test_static.py +640 -0
  416. warp/tests/test_struct.py +901 -0
  417. warp/tests/test_tape.py +242 -0
  418. warp/tests/test_transient_module.py +93 -0
  419. warp/tests/test_triangle_closest_point.py +192 -0
  420. warp/tests/test_tuple.py +361 -0
  421. warp/tests/test_types.py +615 -0
  422. warp/tests/test_utils.py +594 -0
  423. warp/tests/test_vec.py +1408 -0
  424. warp/tests/test_vec_assign_copy.py +143 -0
  425. warp/tests/test_vec_constructors.py +325 -0
  426. warp/tests/test_vec_lite.py +80 -0
  427. warp/tests/test_vec_scalar_ops.py +2327 -0
  428. warp/tests/test_verify_fp.py +100 -0
  429. warp/tests/test_version.py +75 -0
  430. warp/tests/tile/__init__.py +0 -0
  431. warp/tests/tile/test_tile.py +1519 -0
  432. warp/tests/tile/test_tile_atomic_bitwise.py +403 -0
  433. warp/tests/tile/test_tile_cholesky.py +608 -0
  434. warp/tests/tile/test_tile_load.py +724 -0
  435. warp/tests/tile/test_tile_mathdx.py +156 -0
  436. warp/tests/tile/test_tile_matmul.py +179 -0
  437. warp/tests/tile/test_tile_mlp.py +400 -0
  438. warp/tests/tile/test_tile_reduce.py +950 -0
  439. warp/tests/tile/test_tile_shared_memory.py +376 -0
  440. warp/tests/tile/test_tile_sort.py +121 -0
  441. warp/tests/tile/test_tile_view.py +173 -0
  442. warp/tests/unittest_serial.py +47 -0
  443. warp/tests/unittest_suites.py +430 -0
  444. warp/tests/unittest_utils.py +469 -0
  445. warp/tests/walkthrough_debug.py +95 -0
  446. warp/torch.py +24 -0
  447. warp/types.py +51 -0
  448. warp/utils.py +31 -0
  449. warp_lang-1.10.0.dist-info/METADATA +459 -0
  450. warp_lang-1.10.0.dist-info/RECORD +468 -0
  451. warp_lang-1.10.0.dist-info/WHEEL +5 -0
  452. warp_lang-1.10.0.dist-info/licenses/LICENSE.md +176 -0
  453. warp_lang-1.10.0.dist-info/licenses/licenses/Gaia-LICENSE.txt +6 -0
  454. warp_lang-1.10.0.dist-info/licenses/licenses/appdirs-LICENSE.txt +22 -0
  455. warp_lang-1.10.0.dist-info/licenses/licenses/asset_pixel_jpg-LICENSE.txt +3 -0
  456. warp_lang-1.10.0.dist-info/licenses/licenses/cuda-LICENSE.txt +1582 -0
  457. warp_lang-1.10.0.dist-info/licenses/licenses/dlpack-LICENSE.txt +201 -0
  458. warp_lang-1.10.0.dist-info/licenses/licenses/fp16-LICENSE.txt +28 -0
  459. warp_lang-1.10.0.dist-info/licenses/licenses/libmathdx-LICENSE.txt +220 -0
  460. warp_lang-1.10.0.dist-info/licenses/licenses/llvm-LICENSE.txt +279 -0
  461. warp_lang-1.10.0.dist-info/licenses/licenses/moller-LICENSE.txt +16 -0
  462. warp_lang-1.10.0.dist-info/licenses/licenses/nanovdb-LICENSE.txt +2 -0
  463. warp_lang-1.10.0.dist-info/licenses/licenses/nvrtc-LICENSE.txt +1592 -0
  464. warp_lang-1.10.0.dist-info/licenses/licenses/svd-LICENSE.txt +23 -0
  465. warp_lang-1.10.0.dist-info/licenses/licenses/unittest_parallel-LICENSE.txt +21 -0
  466. warp_lang-1.10.0.dist-info/licenses/licenses/usd-LICENSE.txt +213 -0
  467. warp_lang-1.10.0.dist-info/licenses/licenses/windingnumber-LICENSE.txt +21 -0
  468. warp_lang-1.10.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,483 @@
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.
16
+ */
17
+
18
+ #include "volume_builder.h"
19
+ #include "cuda_util.h"
20
+ #include "warp.h"
21
+
22
+ #include <nanovdb/tools/cuda/PointsToGrid.cuh>
23
+
24
+ #include <cuda.h>
25
+ #include <cuda_runtime_api.h>
26
+
27
+ #include <cub/cub.cuh>
28
+
29
+ #if defined(__NVCC_DIAG_PRAGMA_SUPPORT__)
30
+ // dynamic initialization is not supported for a function-scope static __shared__ variable within a
31
+ // __device__/__global__ function
32
+ #pragma nv_diag_suppress 20054
33
+ #elif defined(__NVCC__)
34
+ #pragma diag_suppress 20054
35
+ #endif
36
+ namespace
37
+ {
38
+ /// Resource class following interface of nanovdb::DeviceResource as expected by nanovdb::PointsToGrid
39
+ class Resource
40
+ {
41
+ public:
42
+ // cudaMalloc aligns memory to 256 bytes by default
43
+ static constexpr size_t DEFAULT_ALIGNMENT = 256;
44
+
45
+ static void* allocateAsync(size_t bytes, size_t, cudaStream_t stream) {
46
+ // In PointsToGrid, the stream argument always coincides with current stream, ignore
47
+ void *d_ptr = wp_alloc_device(WP_CURRENT_CONTEXT, bytes);
48
+ cudaCheckError();
49
+ return d_ptr;
50
+ }
51
+
52
+ static void deallocateAsync(void *d_ptr, size_t, size_t, cudaStream_t stream) {
53
+ wp_free_device(WP_CURRENT_CONTEXT, d_ptr);
54
+ }
55
+ };
56
+
57
+ /// @brief Implementation of NanoVDB's DeviceBuffer that uses warp allocators
58
+ class DeviceBuffer
59
+ {
60
+ uint64_t mSize; // total number of bytes managed by this buffer (assumed to be identical for host and device)
61
+ void *mCpuData, *mGpuData; // raw pointers to the host and device buffers
62
+ bool mManaged;
63
+
64
+ public:
65
+ /// @brief Static factory method that return an instance of this buffer
66
+ /// @param size byte size of buffer to be initialized
67
+ /// @param dummy this argument is currently ignored but required to match the API of the HostBuffer
68
+ /// @param device id of the device on which to initialize the buffer
69
+ /// @param stream optional stream argument (defaults to stream NULL)
70
+ /// @return An instance of this class using move semantics
71
+ static DeviceBuffer create(uint64_t size, const DeviceBuffer *dummy = nullptr, int device = cudaCpuDeviceId,
72
+ cudaStream_t stream = nullptr)
73
+ {
74
+ return DeviceBuffer(size, device, stream);
75
+ }
76
+
77
+ /// @brief Static factory method that return an instance of this buffer that wraps externally managed memory
78
+ /// @param size byte size of buffer specified by external memory
79
+ /// @param cpuData pointer to externally managed host memory
80
+ /// @param gpuData pointer to externally managed device memory
81
+ /// @return An instance of this class using move semantics
82
+ static DeviceBuffer create(uint64_t size, void *cpuData, void *gpuData)
83
+ {
84
+ return DeviceBuffer(size, cpuData, gpuData);
85
+ }
86
+
87
+ /// @brief Constructor
88
+ /// @param size byte size of buffer to be initialized
89
+ /// @param host If true buffer is initialized only on the host/CPU, else on the device/GPU
90
+ /// @param stream optional stream argument (defaults to stream NULL)
91
+ DeviceBuffer(uint64_t size = 0, int device = cudaCpuDeviceId, cudaStream_t stream = nullptr)
92
+ : mSize(0), mCpuData(nullptr), mGpuData(nullptr), mManaged(false)
93
+ {
94
+ if (size > 0)
95
+ this->init(size, device, stream);
96
+ }
97
+
98
+ DeviceBuffer(uint64_t size, void *cpuData, void *gpuData)
99
+ : mSize(size), mCpuData(cpuData), mGpuData(gpuData), mManaged(false)
100
+ {
101
+ }
102
+
103
+ /// @brief Disallow copy-construction
104
+ DeviceBuffer(const DeviceBuffer &) = delete;
105
+
106
+ /// @brief Move copy-constructor
107
+ DeviceBuffer(DeviceBuffer &&other) noexcept
108
+ : mSize(other.mSize), mCpuData(other.mCpuData), mGpuData(other.mGpuData), mManaged(other.mManaged)
109
+ {
110
+ other.mSize = 0;
111
+ other.mCpuData = nullptr;
112
+ other.mGpuData = nullptr;
113
+ other.mManaged = false;
114
+ }
115
+
116
+ /// @brief Disallow copy assignment operation
117
+ DeviceBuffer &operator=(const DeviceBuffer &) = delete;
118
+
119
+ /// @brief Move copy assignment operation
120
+ DeviceBuffer &operator=(DeviceBuffer &&other) noexcept
121
+ {
122
+ this->clear();
123
+ mSize = other.mSize;
124
+ mCpuData = other.mCpuData;
125
+ mGpuData = other.mGpuData;
126
+ mManaged = other.mManaged;
127
+ other.mSize = 0;
128
+ other.mCpuData = nullptr;
129
+ other.mGpuData = nullptr;
130
+ other.mManaged = false;
131
+ return *this;
132
+ }
133
+
134
+ /// @brief Destructor frees memory on both the host and device
135
+ ~DeviceBuffer()
136
+ {
137
+ this->clear();
138
+ };
139
+
140
+ /// @brief Initialize buffer
141
+ /// @param size byte size of buffer to be initialized
142
+ /// @param device id of the device on which to initialize the buffer
143
+ /// @note All existing buffers are first cleared
144
+ /// @warning size is expected to be non-zero. Use clear() clear buffer!
145
+ void init(uint64_t size, int device = cudaCpuDeviceId, void *stream = nullptr)
146
+ {
147
+ if (mSize > 0)
148
+ this->clear(stream);
149
+ NANOVDB_ASSERT(size > 0);
150
+ if (device == cudaCpuDeviceId)
151
+ {
152
+ mCpuData =
153
+ wp_alloc_pinned(size); // un-managed pinned memory on the host (can be slow to access!). Always 32B aligned
154
+ }
155
+ else
156
+ {
157
+ mGpuData = wp_alloc_device(WP_CURRENT_CONTEXT, size);
158
+ }
159
+ cudaCheckError();
160
+ mSize = size;
161
+ mManaged = true;
162
+ }
163
+
164
+ /// @brief Returns a raw pointer to the host/CPU buffer managed by this allocator.
165
+ /// @warning Note that the pointer can be NULL!
166
+ void *data() const
167
+ {
168
+ return mCpuData;
169
+ }
170
+
171
+ /// @brief Returns a raw pointer to the device/GPU buffer managed by this allocator.
172
+ /// @warning Note that the pointer can be NULL!
173
+ void *deviceData() const
174
+ {
175
+ return mGpuData;
176
+ }
177
+
178
+ /// @brief Returns the size in bytes of the raw memory buffer managed by this allocator.
179
+ uint64_t size() const
180
+ {
181
+ return mSize;
182
+ }
183
+
184
+ //@{
185
+ /// @brief Returns true if this allocator is empty, i.e. has no allocated memory
186
+ bool empty() const
187
+ {
188
+ return mSize == 0;
189
+ }
190
+ bool isEmpty() const
191
+ {
192
+ return mSize == 0;
193
+ }
194
+ //@}
195
+
196
+ /// @brief Detach device data so it is not dealloced when this buffer is destroyed
197
+ void detachDeviceData()
198
+ {
199
+ mGpuData = nullptr;
200
+ if (!mCpuData)
201
+ {
202
+ mSize = 0;
203
+ }
204
+ }
205
+
206
+ /// @brief De-allocate all memory managed by this allocator and set all pointers to NULL
207
+ void clear(void *stream = nullptr)
208
+ {
209
+ if (mManaged && mGpuData)
210
+ wp_free_device(WP_CURRENT_CONTEXT, mGpuData);
211
+ if (mManaged && mCpuData)
212
+ wp_free_pinned(mCpuData);
213
+ mCpuData = mGpuData = nullptr;
214
+ mSize = 0;
215
+ mManaged = false;
216
+ }
217
+
218
+ }; // DeviceBuffer class
219
+
220
+ template <typename Tree> __global__ void activateAllLeafVoxels(Tree *tree)
221
+ {
222
+ const unsigned leaf_count = tree->mNodeCount[0];
223
+
224
+ const unsigned tid = blockIdx.x * blockDim.x + threadIdx.x;
225
+
226
+ if (tid < leaf_count)
227
+ {
228
+ // activate all leaf voxels
229
+ typename Tree::LeafNodeType *const leaf_nodes = tree->getFirstLeaf();
230
+ typename Tree::LeafNodeType &leaf = leaf_nodes[tid];
231
+ leaf.mValueMask.setOn();
232
+ leaf.updateBBox();
233
+ }
234
+
235
+ if (tid == 0)
236
+ {
237
+ tree->mVoxelCount = Tree::LeafNodeType::SIZE * leaf_count; // full leaves
238
+ }
239
+ }
240
+
241
+ template <typename Node>
242
+ __device__ std::enable_if_t<!nanovdb::BuildTraits<typename Node::BuildType>::is_index> setBackgroundValue(
243
+ Node &node, unsigned tile_id, const typename Node::BuildType background_value)
244
+ {
245
+ node.setValue(tile_id, background_value);
246
+ }
247
+
248
+ template <typename Node>
249
+ __device__ std::enable_if_t<nanovdb::BuildTraits<typename Node::BuildType>::is_index> setBackgroundValue(
250
+ Node &node, unsigned tile_id, const typename Node::BuildType background_value)
251
+ {
252
+ }
253
+
254
+ template <typename Node>
255
+ __device__ std::enable_if_t<!nanovdb::BuildTraits<typename Node::BuildType>::is_index> setBackgroundValue(
256
+ Node &node, const typename Node::BuildType background_value)
257
+ {
258
+ node.mBackground = background_value;
259
+ }
260
+
261
+ template <typename Node>
262
+ __device__ std::enable_if_t<nanovdb::BuildTraits<typename Node::BuildType>::is_index> setBackgroundValue(
263
+ Node &node, const typename Node::BuildType background_value)
264
+ {
265
+ }
266
+
267
+ template <typename T>
268
+ struct alignas(alignof(T)) AlignedProxy
269
+ {
270
+ char data[sizeof(T)];
271
+ };
272
+
273
+ template <typename Tree, typename NodeT>
274
+ __global__ void setInternalBBoxAndBackgroundValue(Tree *tree, const typename Tree::BuildType background_value)
275
+ {
276
+ using BBox = nanovdb::math::BBox<typename NodeT::CoordT>;
277
+ using BBoxProxy = AlignedProxy<BBox>;
278
+
279
+ __shared__ BBoxProxy bbox_mem;
280
+
281
+ BBox& bbox = reinterpret_cast<BBox&>(bbox_mem);
282
+
283
+ const unsigned node_count = tree->mNodeCount[NodeT::LEVEL];
284
+ const unsigned node_id = blockIdx.x;
285
+
286
+ if (node_id < node_count)
287
+ {
288
+
289
+ if (threadIdx.x == 0)
290
+ {
291
+ new(&bbox) BBox();
292
+ }
293
+
294
+ __syncthreads();
295
+
296
+ NodeT &node = tree->template getFirstNode<NodeT>()[node_id];
297
+ for (unsigned child_id = threadIdx.x; child_id < NodeT::SIZE; child_id += blockDim.x)
298
+ {
299
+ if (node.isChild(child_id))
300
+ {
301
+ bbox.expandAtomic(node.getChild(child_id)->bbox());
302
+ }
303
+ else
304
+ {
305
+ setBackgroundValue(node, child_id, background_value);
306
+ }
307
+ }
308
+
309
+ __syncthreads();
310
+
311
+ if (threadIdx.x == 0)
312
+ {
313
+ node.mBBox = bbox;
314
+ }
315
+ }
316
+ }
317
+
318
+ template <typename Tree>
319
+ __global__ void setRootBBoxAndBackgroundValue(nanovdb::Grid<Tree> *grid,
320
+ const typename Tree::BuildType background_value)
321
+ {
322
+ using BBox = typename Tree::RootNodeType::BBoxType;
323
+ using BBoxProxy = AlignedProxy<BBox>;
324
+ __shared__ BBoxProxy bbox_mem;
325
+
326
+ BBox& bbox = reinterpret_cast<BBox&>(bbox_mem);
327
+
328
+ Tree &tree = grid->tree();
329
+ const unsigned upper_count = tree.mNodeCount[2];
330
+
331
+ if (threadIdx.x == 0)
332
+ {
333
+ new(&bbox) BBox();
334
+ }
335
+
336
+ __syncthreads();
337
+
338
+ for (unsigned upper_id = threadIdx.x; upper_id < upper_count; upper_id += blockDim.x)
339
+ {
340
+ typename Tree::UpperNodeType &upper = tree.getFirstUpper()[upper_id];
341
+ bbox.expandAtomic(upper.bbox());
342
+ }
343
+
344
+ __syncthreads();
345
+
346
+ if (threadIdx.x == 0)
347
+ {
348
+ typename Tree::RootNodeType &root = tree.root();
349
+ setBackgroundValue(root, background_value);
350
+ root.mBBox = bbox;
351
+
352
+ grid->mWorldBBox = root.mBBox.transform(grid->map());
353
+ }
354
+ }
355
+
356
+ template <typename BuildT>
357
+ void finalize_grid(nanovdb::Grid<nanovdb::NanoTree<BuildT>> &out_grid, const BuildGridParams<BuildT> &params)
358
+ {
359
+ // set background value, activate all voxels for allocated tiles and update bbox
360
+
361
+ using Tree = nanovdb::NanoTree<BuildT>;
362
+ Tree *tree = &out_grid.tree();
363
+
364
+ int node_counts[3];
365
+ wp_memcpy_d2h(WP_CURRENT_CONTEXT, node_counts, tree->mNodeCount, sizeof(node_counts));
366
+ // synchronization below is unnecessary as node_counts is in pageable memory.
367
+ // keep it for clarity
368
+ cudaStream_t stream = static_cast<cudaStream_t>(wp_cuda_stream_get_current());
369
+ wp_cuda_stream_synchronize(stream);
370
+
371
+ const unsigned int leaf_count = node_counts[0];
372
+ const unsigned int lower_count = node_counts[1];
373
+ const unsigned int upper_count = node_counts[2];
374
+
375
+ constexpr unsigned NUM_THREADS = 256;
376
+ const unsigned leaf_blocks = (leaf_count + NUM_THREADS - 1) / NUM_THREADS;
377
+ activateAllLeafVoxels<Tree><<<leaf_blocks, NUM_THREADS, 0, stream>>>(tree);
378
+
379
+ setInternalBBoxAndBackgroundValue<Tree, typename Tree::LowerNodeType>
380
+ <<<lower_count, NUM_THREADS, 0, stream>>>(tree, params.background_value);
381
+ setInternalBBoxAndBackgroundValue<Tree, typename Tree::UpperNodeType>
382
+ <<<upper_count, NUM_THREADS, 0, stream>>>(tree, params.background_value);
383
+ setRootBBoxAndBackgroundValue<Tree><<<1, NUM_THREADS, 0, stream>>>(&out_grid, params.background_value);
384
+
385
+ check_cuda(wp_cuda_context_check(WP_CURRENT_CONTEXT));
386
+ }
387
+
388
+ template <>
389
+ void finalize_grid(nanovdb::Grid<nanovdb::NanoTree<nanovdb::ValueOnIndex>> &out_grid,
390
+ const BuildGridParams<nanovdb::ValueOnIndex> &params)
391
+ {
392
+ // nothing to do for OnIndex grids
393
+ }
394
+
395
+ /// "fancy-pointer" that transforms from world to index coordinates
396
+ struct WorldSpacePointsPtr
397
+ {
398
+ const nanovdb::Vec3f *points;
399
+ const nanovdb::Map map;
400
+
401
+ __device__ nanovdb::Vec3f operator[](int idx) const
402
+ {
403
+ return map.applyInverseMapF(points[idx]);
404
+ }
405
+
406
+ __device__ nanovdb::Vec3f operator*() const
407
+ {
408
+ return (*this)[0];
409
+ }
410
+ };
411
+
412
+ } // namespace
413
+
414
+ namespace nanovdb
415
+ {
416
+ template <> struct BufferTraits<DeviceBuffer>
417
+ {
418
+ static constexpr bool hasDeviceDual = true;
419
+ };
420
+
421
+ } // namespace nanovdb
422
+
423
+ template <typename BuildT>
424
+ void build_grid_from_points(nanovdb::Grid<nanovdb::NanoTree<BuildT>> *&out_grid, size_t &out_grid_size,
425
+ const void *points, size_t num_points, bool points_in_world_space,
426
+ const BuildGridParams<BuildT> &params)
427
+ {
428
+
429
+ out_grid = nullptr;
430
+ out_grid_size = 0;
431
+
432
+ try
433
+ {
434
+
435
+ cudaStream_t stream = static_cast<cudaStream_t>(wp_cuda_stream_get_current());
436
+ nanovdb::tools::cuda::PointsToGrid<BuildT, Resource> p2g(params.map, stream);
437
+
438
+ // p2g.setVerbose(2);
439
+ p2g.setGridName(params.name);
440
+ p2g.setChecksum(nanovdb::CheckMode::Disable);
441
+
442
+ // Only compute bbox for OnIndex grids. Otherwise bbox will be computed after activating all leaf voxels
443
+ p2g.includeBBox(nanovdb::BuildTraits<BuildT>::is_onindex);
444
+
445
+ nanovdb::GridHandle<DeviceBuffer> grid_handle;
446
+
447
+ if (points_in_world_space)
448
+ {
449
+ grid_handle = p2g.getHandle(WorldSpacePointsPtr{static_cast<const nanovdb::Vec3f*>(points), params.map},
450
+ num_points, DeviceBuffer());
451
+ }
452
+ else
453
+ {
454
+ grid_handle = p2g.getHandle(static_cast<const nanovdb::Coord*>(points), num_points, DeviceBuffer());
455
+ }
456
+
457
+ out_grid = grid_handle.deviceGrid<BuildT>();
458
+ out_grid_size = grid_handle.gridSize();
459
+
460
+ finalize_grid(*out_grid, params);
461
+
462
+ // So that buffer is not destroyed when handles goes out of scope
463
+ grid_handle.buffer().detachDeviceData();
464
+ }
465
+ catch (const std::runtime_error& exc)
466
+ {
467
+ out_grid = nullptr;
468
+ out_grid_size = 0;
469
+ }
470
+ }
471
+
472
+
473
+ #define EXPAND_BUILDER_TYPE(type) \
474
+ template void build_grid_from_points(nanovdb::Grid<nanovdb::NanoTree<type>> *&, size_t &, const void *, size_t, bool, \
475
+ const BuildGridParams<type> &);
476
+
477
+ WP_VOLUME_BUILDER_INSTANTIATE_TYPES
478
+ #undef EXPAND_BUILDER_TYPE
479
+
480
+ template void build_grid_from_points(nanovdb::Grid<nanovdb::NanoTree<nanovdb::ValueIndex>> *&, size_t &, const void *,
481
+ size_t, bool, const BuildGridParams<nanovdb::ValueIndex> &);
482
+ template void build_grid_from_points(nanovdb::Grid<nanovdb::NanoTree<nanovdb::ValueOnIndex>> *&, size_t &, const void *,
483
+ size_t, bool, const BuildGridParams<nanovdb::ValueOnIndex> &);
@@ -0,0 +1,52 @@
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.
16
+ */
17
+
18
+ #pragma once
19
+
20
+ #include <nanovdb/NanoVDB.h>
21
+
22
+ #define WP_VOLUME_BUILDER_INSTANTIATE_TYPES \
23
+ EXPAND_BUILDER_TYPE(int32_t) \
24
+ EXPAND_BUILDER_TYPE(float) \
25
+ EXPAND_BUILDER_TYPE(nanovdb::Vec3f) \
26
+ EXPAND_BUILDER_TYPE(nanovdb::Vec4f) \
27
+
28
+ template <typename BuildT> struct BuildGridParams
29
+ {
30
+ nanovdb::Map map;
31
+ BuildT background_value{0};
32
+ char name[256] = "";
33
+ };
34
+
35
+ template <> struct BuildGridParams<nanovdb::ValueIndex>
36
+ {
37
+ nanovdb::Map map;
38
+ nanovdb::ValueIndex background_value;
39
+ char name[256] = "";
40
+ };
41
+
42
+ template <> struct BuildGridParams<nanovdb::ValueOnIndex>
43
+ {
44
+ nanovdb::Map map;
45
+ double voxel_size = 1.0;
46
+ char name[256] = "";
47
+ };
48
+
49
+ template <typename BuildT>
50
+ void build_grid_from_points(nanovdb::Grid<nanovdb::NanoTree<BuildT>>*& out_grid, size_t& out_grid_size,
51
+ const void* points, size_t num_points, bool points_in_world_space,
52
+ const BuildGridParams<BuildT>& params);
@@ -0,0 +1,70 @@
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.
16
+ */
17
+
18
+ #pragma once
19
+
20
+ #include "volume.h"
21
+
22
+ // Helper functions for cpp/cu files, not to be exposed to user kernels
23
+
24
+ namespace wp
25
+ {
26
+
27
+ namespace volume
28
+ {
29
+
30
+ inline CUDA_CALLABLE pnanovdb_leaf_handle_t get_leaf(const pnanovdb_buf_t buf, const uint32_t leaf_id)
31
+ {
32
+ const pnanovdb_tree_handle_t tree = get_tree(buf);
33
+ const uint64_t first_leaf_offset = pnanovdb_tree_get_node_offset_leaf(buf, tree);
34
+ const uint32_t leaf_stride = PNANOVDB_GRID_TYPE_GET(get_grid_type(buf), leaf_size);
35
+ return {pnanovdb_address_offset64(tree.address, first_leaf_offset + uint64_t(leaf_id) * leaf_stride)};
36
+ }
37
+
38
+ inline CUDA_CALLABLE pnanovdb_coord_t leaf_origin(const pnanovdb_buf_t buf, const pnanovdb_leaf_handle_t leaf)
39
+ {
40
+ pnanovdb_coord_t origin = pnanovdb_leaf_get_bbox_min(buf, leaf);
41
+ // mask out last three bits corresponding to voxel coordinates within leaf
42
+ constexpr uint32_t MASK = (1u << 3u) - 1u;
43
+ origin.x &= ~MASK;
44
+ origin.y &= ~MASK;
45
+ origin.z &= ~MASK;
46
+ return origin;
47
+ }
48
+
49
+ inline CUDA_CALLABLE uint64_t leaf_voxel_index(const pnanovdb_buf_t buf, const uint32_t leaf_id,
50
+ const pnanovdb_coord_t &ijk)
51
+ {
52
+ const uint32_t grid_type = get_grid_type(buf);
53
+
54
+ const pnanovdb_leaf_handle_t leaf = get_leaf(buf, leaf_id);
55
+ const pnanovdb_address_t value_address = pnanovdb_leaf_get_value_address(grid_type, buf, leaf, &ijk);
56
+ return volume::get_grid_voxel_index(grid_type, buf, value_address, ijk) - 1;
57
+ }
58
+
59
+ inline CUDA_CALLABLE pnanovdb_coord_t leaf_offset_to_local_coord(uint32_t offset)
60
+ {
61
+ pnanovdb_coord_t coord;
62
+ coord.x = (offset >> 6) & 7;
63
+ coord.y = (offset >> 3) & 7;
64
+ coord.z = (offset >> 0) & 7;
65
+ return coord;
66
+ }
67
+
68
+ } // namespace volume
69
+
70
+ } // namespace wp