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
warp/native/version.h ADDED
@@ -0,0 +1,23 @@
1
+ /*
2
+ * SPDX-FileCopyrightText: Copyright (c) 2025 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
+ #ifndef WP_VERSION_H
19
+ #define WP_VERSION_H
20
+
21
+ #define WP_VERSION_STRING "1.10.0"
22
+
23
+ #endif // WP_VERSION_H
warp/native/volume.cpp ADDED
@@ -0,0 +1,501 @@
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 "cuda_util.h"
19
+ #include "volume_builder.h"
20
+ #include "volume_impl.h"
21
+ #include "warp.h"
22
+
23
+ #include <map>
24
+
25
+ using namespace wp;
26
+
27
+ namespace
28
+ {
29
+
30
+ struct VolumeDesc
31
+ {
32
+ // NanoVDB buffer either in device or host memory
33
+ void* buffer;
34
+ uint64_t size_in_bytes;
35
+ bool owner; // whether the buffer should be deallocated when the volume is destroyed
36
+
37
+ pnanovdb_grid_t grid_data;
38
+ pnanovdb_tree_t tree_data;
39
+
40
+ // Host-accessible version of the blind metadata (copy if GPU, alias if CPU)
41
+ pnanovdb_gridblindmetadata_t* blind_metadata;
42
+
43
+ // CUDA context for this volume (NULL if CPU)
44
+ void* context;
45
+
46
+ pnanovdb_buf_t as_pnano() const { return pnanovdb_make_buf(static_cast<uint32_t*>(buffer), size_in_bytes); }
47
+ };
48
+
49
+ // Host-side volume descriptors. Maps each CPU/GPU volume buffer address (id) to a CPU desc
50
+ std::map<uint64_t, VolumeDesc> g_volume_descriptors;
51
+
52
+ bool volume_get_descriptor(uint64_t id, const VolumeDesc*& volumeDesc)
53
+ {
54
+ if (id == 0)
55
+ return false;
56
+
57
+ const auto& iter = g_volume_descriptors.find(id);
58
+ if (iter == g_volume_descriptors.end())
59
+ return false;
60
+ else
61
+ volumeDesc = &iter->second;
62
+ return true;
63
+ }
64
+
65
+ bool volume_exists(const void* id)
66
+ {
67
+ const VolumeDesc* volume;
68
+ return volume_get_descriptor((uint64_t)id, volume);
69
+ }
70
+
71
+ void volume_add_descriptor(uint64_t id, VolumeDesc&& volumeDesc) { g_volume_descriptors[id] = std::move(volumeDesc); }
72
+
73
+ void volume_rem_descriptor(uint64_t id) { g_volume_descriptors.erase(id); }
74
+
75
+ void volume_set_map(nanovdb::Map& map, const float transform[9], const float translation[3])
76
+ {
77
+ // Need to transpose as Map::set is transposing again
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]);
80
+ const mat_t<3, 3, double> inv = inverse(transpose);
81
+
82
+ map.set(transpose.data, inv.data, translation);
83
+ }
84
+
85
+ } // anonymous namespace
86
+
87
+ // NB: buf must be a host pointer
88
+ uint64_t wp_volume_create_host(void* buf, uint64_t size, bool copy, bool owner)
89
+ {
90
+ if (buf == nullptr || (size > 0 && size < sizeof(pnanovdb_grid_t) + sizeof(pnanovdb_tree_t)))
91
+ return 0; // This cannot be a valid NanoVDB grid with data
92
+
93
+ if (!copy && volume_exists(buf))
94
+ {
95
+ // descriptor already created for this volume
96
+ return 0;
97
+ }
98
+
99
+ VolumeDesc volume;
100
+ volume.context = NULL;
101
+
102
+ wp_memcpy_h2h(&volume.grid_data, buf, sizeof(pnanovdb_grid_t));
103
+ wp_memcpy_h2h(&volume.tree_data, (pnanovdb_grid_t*)buf + 1, sizeof(pnanovdb_tree_t));
104
+
105
+ if (volume.grid_data.magic != PNANOVDB_MAGIC_NUMBER && volume.grid_data.magic != PNANOVDB_MAGIC_GRID)
106
+ return 0;
107
+
108
+ if (size == 0)
109
+ {
110
+ size = volume.grid_data.grid_size;
111
+ }
112
+
113
+ // Copy or alias buffer
114
+ volume.size_in_bytes = size;
115
+ if (copy)
116
+ {
117
+ volume.buffer = wp_alloc_host(size);
118
+ wp_memcpy_h2h(volume.buffer, buf, size);
119
+ volume.owner = true;
120
+ }
121
+ else
122
+ {
123
+ volume.buffer = buf;
124
+ volume.owner = owner;
125
+ }
126
+
127
+ // Alias blind metadata
128
+ volume.blind_metadata = reinterpret_cast<pnanovdb_gridblindmetadata_t*>(static_cast<uint8_t*>(volume.buffer) +
129
+ volume.grid_data.blind_metadata_offset);
130
+
131
+ uint64_t id = (uint64_t)volume.buffer;
132
+
133
+ volume_add_descriptor(id, std::move(volume));
134
+
135
+ return id;
136
+ }
137
+
138
+ // NB: buf must be a pointer on the same device
139
+ uint64_t wp_volume_create_device(void* context, void* buf, uint64_t size, bool copy, bool owner)
140
+ {
141
+ if (buf == nullptr || (size > 0 && size < sizeof(pnanovdb_grid_t) + sizeof(pnanovdb_tree_t)))
142
+ return 0; // This cannot be a valid NanoVDB grid with data
143
+
144
+ if (!copy && volume_exists(buf))
145
+ {
146
+ // descriptor already created for this volume
147
+ return 0;
148
+ }
149
+
150
+ ContextGuard guard(context);
151
+
152
+ VolumeDesc volume;
153
+ volume.context = context ? context : wp_cuda_context_get_current();
154
+
155
+ wp_memcpy_d2h(WP_CURRENT_CONTEXT, &volume.grid_data, buf, sizeof(pnanovdb_grid_t));
156
+ wp_memcpy_d2h(WP_CURRENT_CONTEXT, &volume.tree_data, (pnanovdb_grid_t*)buf + 1, sizeof(pnanovdb_tree_t));
157
+ // no sync needed since the above copies are to pageable memory
158
+
159
+ if (volume.grid_data.magic != PNANOVDB_MAGIC_NUMBER && volume.grid_data.magic != PNANOVDB_MAGIC_GRID)
160
+ return 0;
161
+
162
+ if (size == 0)
163
+ {
164
+ size = volume.grid_data.grid_size;
165
+ }
166
+
167
+ // Copy or alias data buffer
168
+ volume.size_in_bytes = size;
169
+ if (copy)
170
+ {
171
+ volume.buffer = wp_alloc_device(WP_CURRENT_CONTEXT, size);
172
+ wp_memcpy_d2d(WP_CURRENT_CONTEXT, volume.buffer, buf, size);
173
+ volume.owner = true;
174
+ }
175
+ else
176
+ {
177
+ volume.buffer = buf;
178
+ volume.owner = owner;
179
+ }
180
+
181
+ // Make blind metadata accessible on host
182
+ const uint64_t blindmetadata_size = volume.grid_data.blind_metadata_count * sizeof(pnanovdb_gridblindmetadata_t);
183
+ volume.blind_metadata = static_cast<pnanovdb_gridblindmetadata_t*>(wp_alloc_pinned(blindmetadata_size));
184
+ wp_memcpy_d2h(WP_CURRENT_CONTEXT, volume.blind_metadata,
185
+ static_cast<uint8_t*>(volume.buffer) + volume.grid_data.blind_metadata_offset, blindmetadata_size);
186
+
187
+ uint64_t id = (uint64_t)volume.buffer;
188
+ volume_add_descriptor(id, std::move(volume));
189
+
190
+ return id;
191
+ }
192
+
193
+ void wp_volume_get_buffer_info(uint64_t id, void** buf, uint64_t* size)
194
+ {
195
+ *buf = 0;
196
+ *size = 0;
197
+
198
+ const VolumeDesc* volume;
199
+ if (volume_get_descriptor(id, volume))
200
+ {
201
+ *buf = volume->buffer;
202
+ *size = volume->size_in_bytes;
203
+ }
204
+ }
205
+
206
+ void wp_volume_get_voxel_size(uint64_t id, float* dx, float* dy, float* dz)
207
+ {
208
+ *dx = *dy = *dz = 0.0f;
209
+
210
+ const VolumeDesc* volume;
211
+ if (volume_get_descriptor(id, volume))
212
+ {
213
+ *dx = (float)volume->grid_data.voxel_size[0];
214
+ *dy = (float)volume->grid_data.voxel_size[1];
215
+ *dz = (float)volume->grid_data.voxel_size[2];
216
+ }
217
+ }
218
+
219
+ void wp_volume_get_tile_and_voxel_count(uint64_t id, uint32_t& tile_count, uint64_t& voxel_count)
220
+ {
221
+ tile_count = 0;
222
+ voxel_count = 0;
223
+
224
+ const VolumeDesc* volume;
225
+ if (volume_get_descriptor(id, volume))
226
+ {
227
+ tile_count = volume->tree_data.node_count_leaf;
228
+
229
+ const uint32_t grid_type = volume->grid_data.grid_type;
230
+
231
+ switch (grid_type)
232
+ {
233
+ case PNANOVDB_GRID_TYPE_ONINDEX:
234
+ case PNANOVDB_GRID_TYPE_ONINDEXMASK:
235
+ // number of indexable voxels is number of active voxels
236
+ voxel_count = volume->tree_data.voxel_count;
237
+ break;
238
+ default:
239
+ // all leaf voxels are indexable
240
+ voxel_count = uint64_t(tile_count) * PNANOVDB_LEAF_TABLE_COUNT;
241
+ }
242
+ }
243
+ }
244
+
245
+ const char* wp_volume_get_grid_info(uint64_t id, uint64_t* grid_size, uint32_t* grid_index, uint32_t* grid_count,
246
+ float translation[3], float transform[9], char type_str[16])
247
+ {
248
+ const VolumeDesc* volume;
249
+ if (volume_get_descriptor(id, volume))
250
+ {
251
+ const pnanovdb_grid_t& grid_data = volume->grid_data;
252
+ *grid_count = grid_data.grid_count;
253
+ *grid_index = grid_data.grid_index;
254
+ *grid_size = grid_data.grid_size;
255
+
256
+ memcpy(translation, grid_data.map.vecf, sizeof(grid_data.map.vecf));
257
+ memcpy(transform, grid_data.map.matf, sizeof(grid_data.map.matf));
258
+
259
+ nanovdb::toStr(type_str, static_cast<nanovdb::GridType>(grid_data.grid_type));
260
+ return reinterpret_cast<const char*>(grid_data.grid_name);
261
+ }
262
+
263
+ *grid_size = 0;
264
+ *grid_index = 0;
265
+ *grid_count = 0;
266
+ type_str[0] = 0;
267
+
268
+ return nullptr;
269
+ }
270
+
271
+ uint32_t wp_volume_get_blind_data_count(uint64_t id)
272
+ {
273
+ const VolumeDesc* volume;
274
+ if (volume_get_descriptor(id, volume))
275
+ {
276
+ return volume->grid_data.blind_metadata_count;
277
+ }
278
+ return 0;
279
+ }
280
+
281
+ const char* wp_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])
283
+ {
284
+ const VolumeDesc* volume;
285
+ if (volume_get_descriptor(id, volume) && data_index < volume->grid_data.blind_metadata_count)
286
+ {
287
+ const pnanovdb_gridblindmetadata_t& metadata = volume->blind_metadata[data_index];
288
+ *value_count = metadata.value_count;
289
+ *value_size = metadata.value_size;
290
+
291
+ nanovdb::toStr(type_str, static_cast<nanovdb::GridType>(metadata.data_type));
292
+ *buf = static_cast<uint8_t*>(volume->buffer) + volume->grid_data.blind_metadata_offset +
293
+ data_index * sizeof(pnanovdb_gridblindmetadata_t) + metadata.data_offset;
294
+ return reinterpret_cast<const char*>(metadata.name);
295
+ }
296
+ *buf = nullptr;
297
+ *value_count = 0;
298
+ *value_size = 0;
299
+ type_str[0] = 0;
300
+ return nullptr;
301
+ }
302
+
303
+ void wp_volume_get_tiles_host(uint64_t id, void* buf)
304
+ {
305
+ static constexpr uint32_t MASK = (1u << 3u) - 1u; // mask for bit operations
306
+
307
+ const VolumeDesc* volume;
308
+ if (volume_get_descriptor(id, volume))
309
+ {
310
+ const uint32_t leaf_count = volume->tree_data.node_count_leaf;
311
+
312
+ pnanovdb_coord_t* leaf_coords = static_cast<pnanovdb_coord_t*>(buf);
313
+
314
+ const uint64_t first_leaf =
315
+ (uint64_t)volume->buffer + sizeof(pnanovdb_grid_t) + volume->tree_data.node_offset_leaf;
316
+ const uint32_t leaf_stride = PNANOVDB_GRID_TYPE_GET(volume->grid_data.grid_type, leaf_size);
317
+
318
+ const pnanovdb_buf_t pnano_buf = volume->as_pnano();
319
+
320
+ for (uint32_t i = 0; i < leaf_count; ++i)
321
+ {
322
+ pnanovdb_leaf_handle_t leaf = volume::get_leaf(pnano_buf, i);
323
+ leaf_coords[i] = volume::leaf_origin(pnano_buf, leaf);
324
+ }
325
+ }
326
+ }
327
+
328
+ void wp_volume_get_voxels_host(uint64_t id, void* buf)
329
+ {
330
+ const VolumeDesc* volume;
331
+ if (volume_get_descriptor(id, volume))
332
+ {
333
+ uint32_t leaf_count;
334
+ uint64_t voxel_count;
335
+ wp_volume_get_tile_and_voxel_count(id, leaf_count, voxel_count);
336
+
337
+ pnanovdb_coord_t* voxel_coords = static_cast<pnanovdb_coord_t*>(buf);
338
+
339
+ const pnanovdb_buf_t pnano_buf = volume->as_pnano();
340
+ for (uint32_t i = 0; i < leaf_count; ++i)
341
+ {
342
+ pnanovdb_leaf_handle_t leaf = volume::get_leaf(pnano_buf, i);
343
+ pnanovdb_coord_t leaf_coords = volume::leaf_origin(pnano_buf, leaf);
344
+
345
+ for (uint32_t n = 0; n < 512; ++n)
346
+ {
347
+ pnanovdb_coord_t loc_ijk = volume::leaf_offset_to_local_coord(n);
348
+ pnanovdb_coord_t ijk = {
349
+ loc_ijk.x + leaf_coords.x,
350
+ loc_ijk.y + leaf_coords.y,
351
+ loc_ijk.z + leaf_coords.z,
352
+ };
353
+
354
+ const uint64_t index = volume::leaf_voxel_index(pnano_buf, i, ijk);
355
+ if (index < voxel_count)
356
+ {
357
+ voxel_coords[index] = ijk;
358
+ }
359
+ }
360
+ }
361
+ }
362
+ }
363
+
364
+ void wp_volume_destroy_host(uint64_t id)
365
+ {
366
+ const VolumeDesc* volume;
367
+ if (volume_get_descriptor(id, volume))
368
+ {
369
+ if (volume->owner)
370
+ {
371
+ wp_free_host(volume->buffer);
372
+ }
373
+ volume_rem_descriptor(id);
374
+ }
375
+ }
376
+
377
+ void wp_volume_destroy_device(uint64_t id)
378
+ {
379
+ const VolumeDesc* volume;
380
+ if (volume_get_descriptor(id, volume))
381
+ {
382
+ ContextGuard guard(volume->context);
383
+ if (volume->owner)
384
+ {
385
+ wp_free_device(WP_CURRENT_CONTEXT, volume->buffer);
386
+ }
387
+ wp_free_pinned(volume->blind_metadata);
388
+ volume_rem_descriptor(id);
389
+ }
390
+ }
391
+
392
+ #if WP_ENABLE_CUDA
393
+
394
+ uint64_t wp_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)
397
+ {
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 wp_volume_create_device(context, grid, gridSize, false, true); \
411
+ }
412
+
413
+ WP_VOLUME_BUILDER_INSTANTIATE_TYPES
414
+ #undef EXPAND_BUILDER_TYPE
415
+
416
+ return 0;
417
+ }
418
+
419
+ uint64_t wp_volume_index_from_tiles_device(void* context, void* points, int num_points, float transform[9],
420
+ float translation[3], bool points_in_world_space)
421
+ {
422
+ nanovdb::IndexGrid* grid;
423
+ size_t gridSize;
424
+ BuildGridParams<nanovdb::ValueIndex> params;
425
+ volume_set_map(params.map, transform, translation);
426
+
427
+ build_grid_from_points(grid, gridSize, points, num_points, points_in_world_space, params);
428
+
429
+ return wp_volume_create_device(context, grid, gridSize, false, true);
430
+ }
431
+
432
+ uint64_t wp_volume_from_active_voxels_device(void* context, void* points, int num_points, float transform[9],
433
+ float translation[3], bool points_in_world_space)
434
+ {
435
+ nanovdb::OnIndexGrid* grid;
436
+ size_t gridSize;
437
+ BuildGridParams<nanovdb::ValueOnIndex> params;
438
+ volume_set_map(params.map, transform, translation);
439
+
440
+ build_grid_from_points(grid, gridSize, points, num_points, points_in_world_space, params);
441
+
442
+ return wp_volume_create_device(context, grid, gridSize, false, true);
443
+ }
444
+
445
+ void launch_get_leaf_coords(void* context, const uint32_t leaf_count, pnanovdb_coord_t* leaf_coords,
446
+ 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);
449
+
450
+ void wp_volume_get_tiles_device(uint64_t id, void* buf)
451
+ {
452
+ const VolumeDesc* volume;
453
+ if (volume_get_descriptor(id, volume))
454
+ {
455
+ const uint32_t leaf_count = volume->tree_data.node_count_leaf;
456
+
457
+ pnanovdb_coord_t* leaf_coords = static_cast<pnanovdb_coord_t*>(buf);
458
+ launch_get_leaf_coords(volume->context, leaf_count, leaf_coords, volume->as_pnano());
459
+ }
460
+ }
461
+
462
+ void wp_volume_get_voxels_device(uint64_t id, void* buf)
463
+ {
464
+ const VolumeDesc* volume;
465
+ if (volume_get_descriptor(id, volume))
466
+ {
467
+ uint32_t leaf_count;
468
+ uint64_t voxel_count;
469
+ wp_volume_get_tile_and_voxel_count(id, leaf_count, voxel_count);
470
+
471
+ pnanovdb_coord_t* voxel_coords = static_cast<pnanovdb_coord_t*>(buf);
472
+ launch_get_voxel_coords(volume->context, leaf_count, voxel_count, voxel_coords, volume->as_pnano());
473
+ }
474
+ }
475
+
476
+ #else
477
+ // stubs for non-CUDA platforms
478
+ uint64_t wp_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)
481
+ {
482
+ return 0;
483
+ }
484
+
485
+ uint64_t wp_volume_index_from_tiles_device(void* context, void* points, int num_points, float transform[9],
486
+ float translation[3], bool points_in_world_space)
487
+ {
488
+ return 0;
489
+ }
490
+
491
+ uint64_t wp_volume_from_active_voxels_device(void* context, void* points, int num_points, float transform[9],
492
+ float translation[3], bool points_in_world_space)
493
+ {
494
+ return 0;
495
+ }
496
+
497
+ void wp_volume_get_tiles_device(uint64_t id, void* buf) {}
498
+
499
+ void wp_volume_get_voxels_device(uint64_t id, void* buf) {}
500
+
501
+ #endif
warp/native/volume.cu ADDED
@@ -0,0 +1,68 @@
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 "cuda_util.h"
19
+ #include "volume_impl.h"
20
+ #include "warp.h"
21
+
22
+ extern CUcontext get_current_context();
23
+
24
+ __global__ void volume_get_leaf_coords(const uint32_t leaf_count, pnanovdb_coord_t *leaf_coords,
25
+ const pnanovdb_buf_t buf)
26
+ {
27
+ const int tid = blockIdx.x * blockDim.x + threadIdx.x;
28
+
29
+ if (tid < leaf_count)
30
+ {
31
+ pnanovdb_leaf_handle_t leaf = wp::volume::get_leaf(buf, tid);
32
+ leaf_coords[tid] = wp::volume::leaf_origin(buf, leaf);
33
+ }
34
+ }
35
+
36
+ __global__ void volume_get_voxel_coords(const uint32_t voxel_count, pnanovdb_coord_t *voxel_coords,
37
+ const pnanovdb_buf_t buf)
38
+ {
39
+ const uint32_t leaf_index = blockIdx.x;
40
+ pnanovdb_leaf_handle_t leaf = wp::volume::get_leaf(buf, leaf_index);
41
+ pnanovdb_coord_t leaf_coords = wp::volume::leaf_origin(buf, leaf);
42
+
43
+ pnanovdb_coord_t ijk = {
44
+ int32_t(threadIdx.x) + leaf_coords.x,
45
+ int32_t(threadIdx.y) + leaf_coords.y,
46
+ int32_t(threadIdx.z) + leaf_coords.z,
47
+ };
48
+
49
+ const uint64_t index = wp::volume::leaf_voxel_index(buf, leaf_index, ijk);
50
+ if (index < voxel_count)
51
+ {
52
+ voxel_coords[index] = ijk;
53
+ }
54
+ }
55
+
56
+ void launch_get_leaf_coords(void *context, const uint32_t leaf_count, pnanovdb_coord_t *leaf_coords, pnanovdb_buf_t buf)
57
+ {
58
+ ContextGuard guard(context);
59
+ wp_launch_device(WP_CURRENT_CONTEXT, volume_get_leaf_coords, leaf_count, (leaf_count, leaf_coords, buf));
60
+ }
61
+
62
+ void launch_get_voxel_coords(void *context, const uint32_t leaf_count, const uint32_t voxel_count,
63
+ pnanovdb_coord_t *voxel_coords, pnanovdb_buf_t buf)
64
+ {
65
+ ContextGuard guard(context);
66
+ cudaStream_t stream = (cudaStream_t)wp_cuda_stream_get_current();
67
+ volume_get_voxel_coords<<<leaf_count, dim3(8, 8, 8), 0, stream>>>(voxel_count, voxel_coords, buf);
68
+ }