hyperray 0.0.1__py3-none-any.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.
Files changed (788) hide show
  1. hyperdrone/__init__.py +53 -0
  2. hyperdrone/_cuda/__init__.py +76 -0
  3. hyperdrone/_dlpack.py +30 -0
  4. hyperdrone/_jit/__init__.py +131 -0
  5. hyperdrone/_jit/_build.py +113 -0
  6. hyperdrone/_jit/_lock.py +23 -0
  7. hyperdrone/_jit/_patches.py +99 -0
  8. hyperdrone/_jit/_toolchain.py +17 -0
  9. hyperdrone/_jit/_workspace.py +94 -0
  10. hyperdrone/_native/cmake/hyperdrone_jit.cmake +65 -0
  11. hyperdrone/_native/common/bindings.h +39 -0
  12. hyperdrone/_native/common/cuda_staging.h +80 -0
  13. hyperdrone/_native/common/jit_host.h +69 -0
  14. hyperdrone/_native/common/models.h +24 -0
  15. hyperdrone/_native/common/verbosity.h +52 -0
  16. hyperdrone/_native/dynamics/CMakeLists.txt +63 -0
  17. hyperdrone/_native/dynamics/host.cpp +188 -0
  18. hyperdrone/_native/dynamics/iface.h +71 -0
  19. hyperdrone/_native/dynamics/impl.cpp +638 -0
  20. hyperdrone/_native/env/CMakeLists.txt +98 -0
  21. hyperdrone/_native/env/environment.cpp +190 -0
  22. hyperdrone/_native/env/environment.h +282 -0
  23. hyperdrone/_native/env/impl.cpp +779 -0
  24. hyperdrone/_native/env/rotorcraft_bindings.cpp +53 -0
  25. hyperdrone/_native/render/CMakeLists.txt +96 -0
  26. hyperdrone/_native/render/renderer.cpp +973 -0
  27. hyperdrone/_native/render/rig_bindings.h +152 -0
  28. hyperdrone/_native/render/scene_bindings.cpp +515 -0
  29. hyperdrone/_outputs.py +32 -0
  30. hyperdrone/_parameters.py +36 -0
  31. hyperdrone/_vendor/rl-tools/CMakeLists.txt +207 -0
  32. hyperdrone/_vendor/rl-tools/LICENSE +21 -0
  33. hyperdrone/_vendor/rl-tools/cmake/autodetect/all.cmake +34 -0
  34. hyperdrone/_vendor/rl-tools/cmake/autodetect/git-diff.cmake +100 -0
  35. hyperdrone/_vendor/rl-tools/cmake/autodetect/git-hash.cmake +24 -0
  36. hyperdrone/_vendor/rl-tools/cmake/autodetect/summary.cmake +65 -0
  37. hyperdrone/_vendor/rl-tools/cmake/autodetect/tier0-compiler.cmake +18 -0
  38. hyperdrone/_vendor/rl-tools/cmake/autodetect/tier1-blas.cmake +51 -0
  39. hyperdrone/_vendor/rl-tools/cmake/autodetect/tier2-json-hdf5-zlib.cmake +82 -0
  40. hyperdrone/_vendor/rl-tools/cmake/autodetect/tier3-tensorboard.cmake +25 -0
  41. hyperdrone/_vendor/rl-tools/cmake/autodetect/tier4-cuda.cmake +42 -0
  42. hyperdrone/_vendor/rl-tools/cmake/autodetect/tier5-cli11.cmake +24 -0
  43. hyperdrone/_vendor/rl-tools/cmake/dependencies/assimp.cmake +19 -0
  44. hyperdrone/_vendor/rl-tools/cmake/legacy_flags.cmake +33 -0
  45. hyperdrone/_vendor/rl-tools/cmake/optional/assimp.cmake +30 -0
  46. hyperdrone/_vendor/rl-tools/cmake/optional/googletest.cmake +20 -0
  47. hyperdrone/_vendor/rl-tools/cmake/optional/metal.cmake +25 -0
  48. hyperdrone/_vendor/rl-tools/cmake/optional/mujoco.cmake +89 -0
  49. hyperdrone/_vendor/rl-tools/cmake/optional/optix.cmake +25 -0
  50. hyperdrone/_vendor/rl-tools/cmake/optional/raytracing.cmake +105 -0
  51. hyperdrone/_vendor/rl-tools/cmake/optional/raytracing_generic.cmake +2 -0
  52. hyperdrone/_vendor/rl-tools/cmake/optional/vulkan.cmake +4 -0
  53. hyperdrone/_vendor/rl-tools/cmake/optional/webgpu.cmake +24 -0
  54. hyperdrone/_vendor/rl-tools/cmake/scripts/embed_text.cmake +7 -0
  55. hyperdrone/_vendor/rl-tools/cmake/scripts/generate-git-snapshot.cmake +138 -0
  56. hyperdrone/_vendor/rl-tools/include/conta/conta.h +1480 -0
  57. hyperdrone/_vendor/rl-tools/include/metra/metra.h +381 -0
  58. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/matrix.h +143 -0
  59. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_arm.h +33 -0
  60. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_cpu.h +314 -0
  61. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_cpu_accelerate.h +37 -0
  62. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_cpu_blas.h +67 -0
  63. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_cpu_mkl.h +38 -0
  64. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_cpu_openblas.h +34 -0
  65. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_cuda.h +289 -0
  66. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_dummy.h +20 -0
  67. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_esp32.h +29 -0
  68. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_generic.h +944 -0
  69. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_wasm32.h +13 -0
  70. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/persist_code.h +136 -0
  71. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_arm.h +1 -0
  72. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_cpu.h +94 -0
  73. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_cpu_accelerate.h +25 -0
  74. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_cpu_blas.h +115 -0
  75. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_cpu_mkl.h +25 -0
  76. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_cpu_openblas.h +25 -0
  77. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_cuda.h +713 -0
  78. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_generic.h +1356 -0
  79. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/persist_code.h +130 -0
  80. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/tensor.h +490 -0
  81. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/arm.h +91 -0
  82. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cpu.h +210 -0
  83. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cpu_accelerate.h +23 -0
  84. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cpu_blas.h +21 -0
  85. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cpu_emscripten.h +20 -0
  86. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cpu_mkl.h +45 -0
  87. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cpu_openblas.h +56 -0
  88. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cpu_tensorboard.h +34 -0
  89. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cuda.h +464 -0
  90. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cuda_streams.h +23 -0
  91. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/devices.h +105 -0
  92. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/dummy.h +55 -0
  93. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/esp32.h +85 -0
  94. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/generic.h +0 -0
  95. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/wasm32.h +59 -0
  96. hyperdrone/_vendor/rl-tools/include/rl_tools/dyn/model.h +218 -0
  97. hyperdrone/_vendor/rl-tools/include/rl_tools/dyn/operations_generic.h +769 -0
  98. hyperdrone/_vendor/rl-tools/include/rl_tools/dyn/persist.h +278 -0
  99. hyperdrone/_vendor/rl-tools/include/rl_tools/dyn/policy_adapter.h +100 -0
  100. hyperdrone/_vendor/rl-tools/include/rl_tools/dyn/policy_adapter_persist.h +52 -0
  101. hyperdrone/_vendor/rl-tools/include/rl_tools/dyn/tensor_operations_generic.h +55 -0
  102. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/applications/l2f/c_backend.h +117 -0
  103. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/applications/l2f/c_interface.h +36 -0
  104. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/applications/l2f/l2f.h +98 -0
  105. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/applications/l2f/operations_dyn.h +18 -0
  106. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/applications/l2f/operations_generic.h +268 -0
  107. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/debugging_pool/c_backend.h +31 -0
  108. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/debugging_pool/c_interface.h +12 -0
  109. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/executor/c_backend.h +98 -0
  110. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/executor/c_interface.h +50 -0
  111. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/executor/executor.h +133 -0
  112. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/executor/helper.h +109 -0
  113. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/executor/operations_generic.h +219 -0
  114. hyperdrone/_vendor/rl-tools/include/rl_tools/logging/operations_arduino.h +117 -0
  115. hyperdrone/_vendor/rl-tools/include/rl_tools/logging/operations_arm.h +56 -0
  116. hyperdrone/_vendor/rl-tools/include/rl_tools/logging/operations_cpu.h +57 -0
  117. hyperdrone/_vendor/rl-tools/include/rl_tools/logging/operations_cpu_tensorboard.h +151 -0
  118. hyperdrone/_vendor/rl-tools/include/rl_tools/logging/operations_cuda.h +65 -0
  119. hyperdrone/_vendor/rl-tools/include/rl_tools/logging/operations_dummy.h +45 -0
  120. hyperdrone/_vendor/rl-tools/include/rl_tools/logging/operations_wasm32.h +56 -0
  121. hyperdrone/_vendor/rl-tools/include/rl_tools/math/operations_arm.h +98 -0
  122. hyperdrone/_vendor/rl-tools/include/rl_tools/math/operations_cpu.h +138 -0
  123. hyperdrone/_vendor/rl-tools/include/rl_tools/math/operations_cuda.h +380 -0
  124. hyperdrone/_vendor/rl-tools/include/rl_tools/math/operations_dummy.h +93 -0
  125. hyperdrone/_vendor/rl-tools/include/rl_tools/math/operations_esp32.h +92 -0
  126. hyperdrone/_vendor/rl-tools/include/rl_tools/math/operations_generic.h +295 -0
  127. hyperdrone/_vendor/rl-tools/include/rl_tools/math/operations_wasm32.h +230 -0
  128. hyperdrone/_vendor/rl-tools/include/rl_tools/mode/mode.h +98 -0
  129. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/activation_functions.h +113 -0
  130. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/capability/capability.h +61 -0
  131. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/capability/persist_code.h +31 -0
  132. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/group.h +99 -0
  133. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/avg_pool2d/layer.h +122 -0
  134. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/avg_pool2d/operations_cuda.h +64 -0
  135. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/avg_pool2d/operations_generic.h +186 -0
  136. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/avg_pool2d/persist.h +33 -0
  137. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/conv2d/layer.h +300 -0
  138. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/conv2d/operations_cpu_mkl.h +590 -0
  139. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/conv2d/operations_cuda.h +809 -0
  140. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/conv2d/operations_generic.h +1219 -0
  141. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/conv2d/persist.h +99 -0
  142. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/conv2d/persist_code.h +170 -0
  143. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/layer.h +145 -0
  144. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_arm/dsp.h +63 -0
  145. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_arm/opt.h +173 -0
  146. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_cpu.h +13 -0
  147. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_cpu_accelerate.h +66 -0
  148. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_cpu_blas.h +282 -0
  149. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_cpu_mkl.h +66 -0
  150. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_cpu_openblas.h +65 -0
  151. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_cuda.h +519 -0
  152. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_dummy.h +8 -0
  153. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_esp32/dsp.h +58 -0
  154. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_esp32/opt.h +167 -0
  155. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_generic.h +429 -0
  156. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/persist.h +62 -0
  157. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/persist_code.h +178 -0
  158. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/persist_common.h +59 -0
  159. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dynamic_conv2d/layer.h +188 -0
  160. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dynamic_conv2d/operations_cuda.h +356 -0
  161. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dynamic_conv2d/operations_generic.h +536 -0
  162. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dynamic_conv2d/persist.h +32 -0
  163. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/embedding/layer.h +119 -0
  164. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/embedding/operations_generic.h +223 -0
  165. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/embedding/persist.h +46 -0
  166. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/flatten/layer.h +121 -0
  167. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/flatten/operations_generic.h +154 -0
  168. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/flatten/persist.h +44 -0
  169. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/flatten/persist_code.h +106 -0
  170. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/gru/helper_operations_cuda.h +602 -0
  171. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/gru/helper_operations_generic.h +251 -0
  172. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/gru/layer.h +206 -0
  173. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/gru/operations_generic.h +889 -0
  174. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/gru/persist.h +75 -0
  175. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/gru/persist_code.h +199 -0
  176. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/layers.h +3 -0
  177. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/max_pool2d/layer.h +143 -0
  178. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/max_pool2d/operations_cuda.h +80 -0
  179. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/max_pool2d/operations_generic.h +216 -0
  180. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/max_pool2d/persist.h +39 -0
  181. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_cpu.h +1 -0
  182. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_cpu_accelerate.h +1 -0
  183. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_cpu_blas.h +1 -0
  184. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_cpu_mkl.h +3 -0
  185. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_cpu_openblas.h +1 -0
  186. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_cuda.h +9 -0
  187. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_dummy.h +1 -0
  188. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_generic.h +3 -0
  189. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/resnet_block/layer.h +223 -0
  190. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/resnet_block/operations_cuda.h +138 -0
  191. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/resnet_block/operations_generic.h +446 -0
  192. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/resnet_block/persist.h +70 -0
  193. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/sample_and_squash/layer.h +154 -0
  194. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/sample_and_squash/operations_cuda.h +119 -0
  195. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/sample_and_squash/operations_generic.h +502 -0
  196. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/sample_and_squash/persist.h +50 -0
  197. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/sample_and_squash/persist_code.h +173 -0
  198. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/standardize/layer.h +116 -0
  199. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/standardize/operations_cuda.h +156 -0
  200. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/standardize/operations_generic.h +295 -0
  201. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/standardize/persist.h +83 -0
  202. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/standardize/persist_code.h +163 -0
  203. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/td3_sampling/layer.h +123 -0
  204. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/td3_sampling/operations_generic.h +272 -0
  205. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/td3_sampling/persist.h +17 -0
  206. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/td3_sampling/persist_code.h +164 -0
  207. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/unflatten/layer.h +122 -0
  208. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/unflatten/operations_cuda.h +55 -0
  209. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/unflatten/operations_generic.h +160 -0
  210. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/unflatten/persist.h +47 -0
  211. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/unflatten/persist_code.h +106 -0
  212. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/upsample2d/layer.h +132 -0
  213. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/upsample2d/operations_cuda.h +141 -0
  214. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/upsample2d/operations_generic.h +230 -0
  215. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/loss_functions/categorical_cross_entropy/operations_generic.h +102 -0
  216. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/loss_functions/mse/operations_cuda.h +97 -0
  217. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/loss_functions/mse/operations_generic.h +101 -0
  218. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/loss_functions/operations_generic.h +2 -0
  219. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/nn.h +14 -0
  220. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_cpu.h +1 -0
  221. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_cpu_accelerate.h +1 -0
  222. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_cpu_blas.h +1 -0
  223. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_cpu_mkl.h +1 -0
  224. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_cpu_mux.h +16 -0
  225. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_cpu_openblas.h +1 -0
  226. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_cuda.h +2 -0
  227. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_dummy.h +1 -0
  228. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_generic.h +15 -0
  229. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/adam.h +121 -0
  230. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/instance/operations_cuda.h +98 -0
  231. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/instance/operations_generic.h +150 -0
  232. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/instance/persist.h +39 -0
  233. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/instance/persist_code.h +80 -0
  234. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/operations_cuda.h +85 -0
  235. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/operations_generic.h +109 -0
  236. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/persist.h +25 -0
  237. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/lamb/instance/operations_generic.h +107 -0
  238. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/lamb/lamb.h +40 -0
  239. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/lamb/operations_generic.h +68 -0
  240. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/optimizers.h +3 -0
  241. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/sgd/instance/operations_cuda.h +85 -0
  242. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/sgd/instance/operations_generic.h +140 -0
  243. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/sgd/instance/persist.h +37 -0
  244. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/sgd/instance/persist_code.h +72 -0
  245. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/sgd/operations_cuda.h +49 -0
  246. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/sgd/operations_generic.h +50 -0
  247. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/sgd/sgd.h +92 -0
  248. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/update.h +54 -0
  249. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/parameters/operations_cuda.h +0 -0
  250. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/parameters/operations_generic.h +98 -0
  251. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/parameters/parameters.h +79 -0
  252. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/parameters/persist.h +34 -0
  253. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/parameters/persist_code.h +136 -0
  254. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/persist.h +2 -0
  255. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/persist_code.h +27 -0
  256. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/behaviors/skip_parameter_gradients.h +65 -0
  257. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/group/README.md +107 -0
  258. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/group/model.h +19 -0
  259. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/group/persist_code.h +77 -0
  260. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp/network.h +174 -0
  261. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp/operations_cuda.h +10 -0
  262. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp/operations_dummy.h +8 -0
  263. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp/operations_generic.h +407 -0
  264. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp/persist.h +56 -0
  265. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp/persist_code.h +137 -0
  266. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp_unconditional_stddev/network.h +55 -0
  267. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp_unconditional_stddev/operations_generic.h +86 -0
  268. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp_unconditional_stddev/persist.h +43 -0
  269. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp_unconditional_stddev/persist_code.h +142 -0
  270. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/models.h +3 -0
  271. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/multi_agent_wrapper/model.h +148 -0
  272. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/multi_agent_wrapper/operations_generic.h +288 -0
  273. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/multi_agent_wrapper/persist.h +25 -0
  274. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/multi_agent_wrapper/persist_code.h +71 -0
  275. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/operations_cpu.h +0 -0
  276. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/operations_cuda.h +1 -0
  277. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/operations_dummy.h +1 -0
  278. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/operations_generic.h +4 -0
  279. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/parallel/model.h +290 -0
  280. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/parallel/operations_cuda.h +174 -0
  281. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/parallel/operations_generic.h +623 -0
  282. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/parallel/persist.h +80 -0
  283. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/parallel/persist_code.h +200 -0
  284. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/persist.h +1 -0
  285. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/persist_code.h +1 -0
  286. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/random_uniform/model.h +43 -0
  287. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/random_uniform/operations_generic.h +73 -0
  288. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/resnet/resnet.h +97 -0
  289. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/sequential/model.h +270 -0
  290. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/sequential/operations_generic.h +625 -0
  291. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/sequential/persist.h +99 -0
  292. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/sequential/persist_code.h +115 -0
  293. hyperdrone/_vendor/rl-tools/include/rl_tools/numeric_types/bf16.h +28 -0
  294. hyperdrone/_vendor/rl-tools/include/rl_tools/numeric_types/categories.h +22 -0
  295. hyperdrone/_vendor/rl-tools/include/rl_tools/numeric_types/persist_code.h +54 -0
  296. hyperdrone/_vendor/rl-tools/include/rl_tools/numeric_types/policy.h +48 -0
  297. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/arm/group_1.h +18 -0
  298. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/arm/group_2.h +14 -0
  299. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/arm/group_3.h +14 -0
  300. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/arm.h +19 -0
  301. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu/group_1.h +17 -0
  302. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu/group_2.h +12 -0
  303. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu/group_3.h +15 -0
  304. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu.h +19 -0
  305. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_accelerate/group_1.h +16 -0
  306. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_accelerate/group_2.h +12 -0
  307. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_accelerate/group_3.h +15 -0
  308. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_accelerate.h +19 -0
  309. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_mkl/group_1.h +17 -0
  310. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_mkl/group_2.h +12 -0
  311. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_mkl/group_3.h +15 -0
  312. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_mkl.h +18 -0
  313. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_mux.h +158 -0
  314. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_openblas/group_1.h +16 -0
  315. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_openblas/group_2.h +12 -0
  316. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_openblas/group_3.h +15 -0
  317. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_openblas.h +18 -0
  318. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_tensorboard/group_1.h +16 -0
  319. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_tensorboard/group_2.h +12 -0
  320. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_tensorboard/group_3.h +15 -0
  321. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_tensorboard.h +19 -0
  322. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cuda/group_1.h +18 -0
  323. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cuda/group_2.h +12 -0
  324. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cuda/group_3.h +12 -0
  325. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cuda.h +19 -0
  326. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/dummy/group_1.h +15 -0
  327. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/dummy/group_2.h +12 -0
  328. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/dummy/group_3.h +12 -0
  329. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/dummy.h +19 -0
  330. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/esp32/group_1.h +16 -0
  331. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/esp32/group_2.h +12 -0
  332. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/esp32/group_3.h +13 -0
  333. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/esp32.h +19 -0
  334. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/wasm32/group_1.h +15 -0
  335. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/wasm32/group_2.h +12 -0
  336. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/wasm32/group_3.h +12 -0
  337. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/wasm32.h +19 -0
  338. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/backends/hdf5/hdf5.h +54 -0
  339. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/backends/hdf5/operations_cpu.h +419 -0
  340. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/backends/tar/io.h +55 -0
  341. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/backends/tar/operations_cpu.h +58 -0
  342. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/backends/tar/operations_generic.h +620 -0
  343. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/backends/tar/operations_posix.h +63 -0
  344. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/backends/tar/tar.h +74 -0
  345. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/code.h +38 -0
  346. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_arm.h +39 -0
  347. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_cpu.h +81 -0
  348. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_cuda.h +172 -0
  349. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_dummy.h +72 -0
  350. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_esp32.h +45 -0
  351. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_generic.h +133 -0
  352. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_generic_array.h +73 -0
  353. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_wasm32.h +57 -0
  354. hyperdrone/_vendor/rl-tools/include/rl_tools/random/persist.h +77 -0
  355. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/camera.h +105 -0
  356. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/datasets/annotations/cache.h +26 -0
  357. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/datasets/annotations/free_space.h +60 -0
  358. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/datasets/annotations/operations_cpu.h +411 -0
  359. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/datasets/glb/glb.h +25 -0
  360. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/datasets/glb/operations_cpu.h +1288 -0
  361. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/datasets/operations_cpu.h +136 -0
  362. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/datasets/procthor/catalog.h +232 -0
  363. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/datasets/procthor/conversion.h +33 -0
  364. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/datasets/procthor/operations_cpu.h +123 -0
  365. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/datasets/procthor/procthor.h +39 -0
  366. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/generic/operations_cpu.h +717 -0
  367. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/generic/operations_generic.h +1283 -0
  368. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/metal/context.h +193 -0
  369. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/metal/device_source.h +17 -0
  370. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/metal/operations_cpu.h +1123 -0
  371. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/optix/device.h +207 -0
  372. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/optix/device_impl.h +1043 -0
  373. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/optix/operations_cuda.h +1747 -0
  374. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/optix/overlay_accel.h +64 -0
  375. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/specialization.h +37 -0
  376. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/vulkan/context.h +251 -0
  377. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/vulkan/device_source.h +48 -0
  378. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/vulkan/operations_cpu.h +2067 -0
  379. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/webgpu/bvh_sah.h +182 -0
  380. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/webgpu/context.h +280 -0
  381. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/webgpu/device_source.h +17 -0
  382. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/webgpu/operations_cpu.h +1405 -0
  383. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/operations_cpu_common.h +948 -0
  384. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/operations_cpu_mux.h +32 -0
  385. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/operations_cpu_post.h +96 -0
  386. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/renderer.h +484 -0
  387. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/save_cpu.h +314 -0
  388. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/scene.h +44 -0
  389. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/transforms_generic.h +25 -0
  390. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/types.h +45 -0
  391. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/rig/operations_cpu.h +119 -0
  392. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/rig/operations_generic.h +121 -0
  393. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/rig/rig.h +70 -0
  394. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/scene.h +132 -0
  395. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/segmentation_cpu.h +145 -0
  396. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/transforms.h +204 -0
  397. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/types.h +76 -0
  398. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/algorithms.h +6 -0
  399. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/operations_cpu.h +1 -0
  400. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/operations_cpu_mkl.h +1 -0
  401. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/operations_generic.h +1 -0
  402. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/loop/core/config.h +243 -0
  403. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/loop/core/operations_cuda.h +9 -0
  404. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/loop/core/operations_generic.h +205 -0
  405. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/loop/core/persist.h +109 -0
  406. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/loop/core/state.h +51 -0
  407. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/mixed_imitation.h +63 -0
  408. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/operations_cuda.h +190 -0
  409. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/operations_generic.h +332 -0
  410. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/operations_generic_mixed_imitation.h +81 -0
  411. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/persist.h +28 -0
  412. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/ppo.h +105 -0
  413. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/loop/core/approximators_gru.h +84 -0
  414. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/loop/core/approximators_mlp.h +61 -0
  415. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/loop/core/config.h +106 -0
  416. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/loop/core/operations_generic.h +193 -0
  417. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/loop/core/state.h +52 -0
  418. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/operations_cpu.h +9 -0
  419. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/operations_cpu_accelerate.h +2 -0
  420. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/operations_cpu_mkl.h +2 -0
  421. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/operations_cpu_mux.h +9 -0
  422. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/operations_cuda.h +131 -0
  423. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/operations_generic.h +580 -0
  424. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/sac.h +151 -0
  425. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/loop/core/approximators_gru.h +72 -0
  426. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/loop/core/approximators_mlp.h +54 -0
  427. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/loop/core/config.h +107 -0
  428. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/loop/core/operations_generic.h +174 -0
  429. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/loop/core/state.h +46 -0
  430. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/operations_cpu.h +9 -0
  431. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/operations_cpu_accelerate.h +2 -0
  432. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/operations_cpu_mkl.h +2 -0
  433. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/operations_cpu_mux.h +9 -0
  434. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/operations_cuda.h +117 -0
  435. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/operations_generic.h +359 -0
  436. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/td3.h +141 -0
  437. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/components.h +4 -0
  438. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/off_policy_runner/off_policy_runner.h +225 -0
  439. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/off_policy_runner/operations_cpu.h +95 -0
  440. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/off_policy_runner/operations_cpu_accelerate.h +21 -0
  441. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/off_policy_runner/operations_cpu_mkl.h +21 -0
  442. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/off_policy_runner/operations_cuda.h +237 -0
  443. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/off_policy_runner/operations_generic.h +498 -0
  444. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/off_policy_runner/operations_generic_per_env.h +112 -0
  445. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/collection.h +57 -0
  446. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/on_policy_runner.h +122 -0
  447. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/operations_cpu.h +2 -0
  448. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/operations_cpu_accelerate.h +8 -0
  449. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/operations_cpu_mkl.h +8 -0
  450. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/operations_cpu_mux.h +12 -0
  451. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/operations_cuda.h +183 -0
  452. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/operations_generic.h +366 -0
  453. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/operations_generic_common.h +74 -0
  454. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/persist.h +47 -0
  455. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/operations_cpu.h +2 -0
  456. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/operations_cpu_accelerate.h +1 -0
  457. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/operations_cpu_mkl.h +1 -0
  458. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/operations_generic.h +2 -0
  459. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/replay_buffer/operations_cpu.h +9 -0
  460. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/replay_buffer/operations_generic.h +123 -0
  461. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/replay_buffer/persist.h +57 -0
  462. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/replay_buffer/replay_buffer.h +93 -0
  463. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/running_normalizer/operations_generic.h +76 -0
  464. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/running_normalizer/persist.h +31 -0
  465. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/running_normalizer/running_normalizer.h +33 -0
  466. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environment_wrappers/operations_generic.h +58 -0
  467. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environment_wrappers/scale_observations/operations_generic.h +28 -0
  468. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environment_wrappers/scale_observations/wrapper.h +26 -0
  469. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environment_wrappers/wrappers.h +29 -0
  470. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/acrobot/acrobot.h +88 -0
  471. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/acrobot/operations_cpu.h +152 -0
  472. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/acrobot/operations_generic.h +202 -0
  473. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/batch/environment.h +40 -0
  474. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/batch/operations_cuda.h +204 -0
  475. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/batch/operations_generic.h +106 -0
  476. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/batch/operations_generic_common.h +26 -0
  477. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/batch/persist.h +33 -0
  478. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/car/car.h +119 -0
  479. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/car/operations_cpu.h +110 -0
  480. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/car/operations_generic.h +206 -0
  481. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/car/operations_json.h +59 -0
  482. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/car/track.h +23 -0
  483. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/car/ui.h +189 -0
  484. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/environments.h +28 -0
  485. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/flag/environment.h +87 -0
  486. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/flag/operations_cpu.h +212 -0
  487. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/flag/operations_generic.h +215 -0
  488. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/observation.h +75 -0
  489. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/operations_cpu.h +1063 -0
  490. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/operations_cuda.h +564 -0
  491. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/pose.h +253 -0
  492. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/presets.h +154 -0
  493. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/raptor/operations_cpu.h +26 -0
  494. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/raptor/operations_generic.h +91 -0
  495. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/raptor/raptor.h +71 -0
  496. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/rig/operations_cpu.h +190 -0
  497. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/rig/operations_generic.h +32 -0
  498. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/rig/rig.h +25 -0
  499. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/spy/capture_cpu.h +86 -0
  500. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/spy/capture_cuda.h +69 -0
  501. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/spy/capture_optix.h +163 -0
  502. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/spy/operations_cpu.h +223 -0
  503. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/spy/operations_cpu_spectator.h +194 -0
  504. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/spy/operations_cuda.h +1 -0
  505. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/spy/operations_cuda_spectator.h +109 -0
  506. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/spy/spectator.h +82 -0
  507. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/spy/spy.h +107 -0
  508. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/spy/ui.h +30 -0
  509. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/tasks/moving_gate/moving_gate.h +103 -0
  510. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/tasks/moving_gate/operations_cpu.h +279 -0
  511. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/tasks/moving_gate/operations_cuda.h +242 -0
  512. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/tasks/target_frame/operations_cpu.h +322 -0
  513. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/tasks/target_frame/operations_cuda.h +312 -0
  514. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/tasks/target_frame/operations_generic_position_hold.h +128 -0
  515. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/tasks/target_frame/position_hold.h +22 -0
  516. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/tasks/target_frame/target_frame.h +92 -0
  517. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/tasks/visual_inertial_localization/baseline.h +46 -0
  518. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/tasks/visual_inertial_localization/calibration.h +62 -0
  519. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/tasks/visual_inertial_localization/metrics.h +101 -0
  520. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/tasks/visual_inertial_localization/operations_cpu.h +374 -0
  521. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/tasks/visual_inertial_localization/visual_inertial_localization.h +126 -0
  522. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/hyperdrone/world.h +333 -0
  523. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/inertial_velocity.h +27 -0
  524. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/metrics.h +266 -0
  525. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/multirotor.h +1138 -0
  526. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_cpu.h +2252 -0
  527. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/05_state_is_nan.h +148 -0
  528. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/10_sample_initial_parameters.h +228 -0
  529. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/20_initial_state.h +208 -0
  530. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/30_sample_initial_state.h +300 -0
  531. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/35_get_desired_state.h +63 -0
  532. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/40_observe.h +637 -0
  533. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/50_state_algebra.h +57 -0
  534. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/60_dynamics.h +134 -0
  535. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/70_post_integration.h +368 -0
  536. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/80_abs_diff.h +312 -0
  537. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic.h +367 -0
  538. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic_inertial_velocity.h +44 -0
  539. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_helper_generic.h +43 -0
  540. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_multitask_generic.h +70 -0
  541. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_multitask_generic_forward.h +24 -0
  542. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/default.h +209 -0
  543. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/arpl.h +112 -0
  544. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/crazyflie.h +127 -0
  545. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/crazyflie_openmv.h +119 -0
  546. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/flightmare.h +111 -0
  547. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/fs.h +113 -0
  548. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/mrs.h +110 -0
  549. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/soft.h +117 -0
  550. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/soft_rigid.h +118 -0
  551. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/x500.h +88 -0
  552. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/x500_real.h +88 -0
  553. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/x500_sim.h +114 -0
  554. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/init/default.h +56 -0
  555. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/registry.h +96 -0
  556. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/reward_functions/default.h +64 -0
  557. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/reward_functions/reward_functions.h +1 -0
  558. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/reward_functions/squared/operations_generic.h +202 -0
  559. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/reward_functions/squared/squared.h +52 -0
  560. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/termination/default.h +33 -0
  561. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/trajectories/lissajous.h +72 -0
  562. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/trajectories/trajectory.h +78 -0
  563. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/persist.h +21 -0
  564. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/persist_code.h +53 -0
  565. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/quaternion_helper.h +103 -0
  566. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/ui.h +180 -0
  567. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/memory/environment.h +69 -0
  568. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/memory/operations_cpu.h +46 -0
  569. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/memory/operations_generic.h +78 -0
  570. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/mujoco/ant/README.MD +5 -0
  571. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/mujoco/ant/ant.h +77 -0
  572. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/mujoco/ant/model.h +415 -0
  573. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/mujoco/ant/operations_cpu.h +162 -0
  574. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/mujoco/ant/persist.h +86 -0
  575. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/mujoco/ant/ui.h +141 -0
  576. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/mujoco/mujoco.h +1 -0
  577. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/multi_agent/bottleneck/bottleneck.h +113 -0
  578. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/multi_agent/bottleneck/operations_cpu.h +289 -0
  579. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/multi_agent/bottleneck/operations_generic.h +495 -0
  580. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/multi_agent/environments.h +16 -0
  581. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/observation.h +37 -0
  582. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/operations_cpu.h +2 -0
  583. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/operations_generic.h +33 -0
  584. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/pendulum/operations_cpu.h +146 -0
  585. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/pendulum/operations_generic.h +262 -0
  586. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/pendulum/pendulum.h +197 -0
  587. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/pendulum/ui.h +97 -0
  588. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/pendulum/ui_xeus.h +124 -0
  589. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/reacher/operations_cpu.h +426 -0
  590. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/reacher/operations_generic.h +424 -0
  591. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/reacher/reacher.h +137 -0
  592. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/loop.h +15 -0
  593. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/checkpoint/config.h +28 -0
  594. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/checkpoint/operations_cpu.h +233 -0
  595. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/checkpoint/persist.h +30 -0
  596. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/checkpoint/state.h +21 -0
  597. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/curriculum/config.h +25 -0
  598. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/curriculum/operations_generic.h +47 -0
  599. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/curriculum/persist.h +20 -0
  600. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/curriculum/state.h +17 -0
  601. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/evaluation/config.h +47 -0
  602. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/evaluation/operations_generic.h +106 -0
  603. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/evaluation/persist.h +40 -0
  604. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/evaluation/state.h +36 -0
  605. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/extrack/config.h +22 -0
  606. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/extrack/operations_cpu.h +44 -0
  607. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/extrack/persist.h +20 -0
  608. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/extrack/state.h +26 -0
  609. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/nn_analytics/config.h +37 -0
  610. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/nn_analytics/operations_cpu.h +113 -0
  611. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/nn_analytics/persist.h +20 -0
  612. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/nn_analytics/state.h +24 -0
  613. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/save_trajectories/config.h +43 -0
  614. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/save_trajectories/operations_cpu.h +190 -0
  615. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/save_trajectories/persist.h +30 -0
  616. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/save_trajectories/state.h +37 -0
  617. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/steps.h +4 -0
  618. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/timing/config.h +27 -0
  619. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/timing/operations_cpu.h +52 -0
  620. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/timing/persist.h +20 -0
  621. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/timing/state.h +25 -0
  622. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/operations_generic.h +3 -0
  623. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/rl.h +5 -0
  624. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/utils/evaluation/evaluation.h +106 -0
  625. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/utils/evaluation/operations_cpu.h +48 -0
  626. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/utils/evaluation/operations_generic.h +275 -0
  627. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/utils/validation.h +269 -0
  628. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/utils/validation_analysis.h +85 -0
  629. hyperdrone/_vendor/rl-tools/include/rl_tools/rl_tools.h +80 -0
  630. hyperdrone/_vendor/rl-tools/include/rl_tools/ui_server/client/client.h +50 -0
  631. hyperdrone/_vendor/rl-tools/include/rl_tools/ui_server/client/operations_boost.h +92 -0
  632. hyperdrone/_vendor/rl-tools/include/rl_tools/ui_server/client/operations_cpu.h +174 -0
  633. hyperdrone/_vendor/rl-tools/include/rl_tools/ui_server/client/operations_websocket.h +208 -0
  634. hyperdrone/_vendor/rl-tools/include/rl_tools/ui_server/server.h +448 -0
  635. hyperdrone/_vendor/rl-tools/include/rl_tools/universe.h +4 -0
  636. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/declarations_cpu.h +13 -0
  637. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/declarations_cpu_emscripten.h +15 -0
  638. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/operations_arm.h +29 -0
  639. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/operations_cpu.h +24 -0
  640. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/operations_cpu_emscripten.h +28 -0
  641. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/operations_cuda.h +33 -0
  642. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/operations_dummy.h +18 -0
  643. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/operations_esp32.h +20 -0
  644. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/operations_generic.h +19 -0
  645. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/operations_wasm32.h +18 -0
  646. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/env/operations_cpu.h +16 -0
  647. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/env/operations_generic.h +14 -0
  648. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/extrack/extrack.h +129 -0
  649. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/extrack/operations_cpu.h +588 -0
  650. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/generic/integrators.h +103 -0
  651. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/generic/memcpy.h +16 -0
  652. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/generic/tuple/operations_generic.h +48 -0
  653. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/generic/tuple/tuple.h +147 -0
  654. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/generic/typing.h +122 -0
  655. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/generic/vector_operations.h +172 -0
  656. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/polyak/operations_cuda.h +53 -0
  657. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/polyak/operations_generic.h +93 -0
  658. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/string/operations_generic.h +201 -0
  659. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/zlib/operations_cpu.h +45 -0
  660. hyperdrone/_vendor/rl-tools/include/rl_tools/version.h +28 -0
  661. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/CMakeLists.txt +15 -0
  662. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/README.md +214 -0
  663. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/CMakeLists.txt +11 -0
  664. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/generic/CMakeLists.txt +17 -0
  665. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/generic/freestanding_check.cpp +134 -0
  666. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/metal/CMakeLists.txt +31 -0
  667. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/metal/device.metal +912 -0
  668. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/metal/metal_cpp_impl.cpp +6 -0
  669. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/optix/CMakeLists.txt +51 -0
  670. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/optix/device.cu +1 -0
  671. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/optix/overlay_accel.cu +308 -0
  672. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/vulkan/CMakeLists.txt +37 -0
  673. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/vulkan/device.comp +970 -0
  674. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/vulkan/device_spirv.cpp +44 -0
  675. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/webgpu/CMakeLists.txt +31 -0
  676. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/webgpu/device.wgsl +1381 -0
  677. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/CMakeLists.txt +129 -0
  678. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/README.md +131 -0
  679. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/benchmark.cpp +180 -0
  680. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/benchmark_dynamic.cpp +491 -0
  681. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/download_paper_scene.py +74 -0
  682. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/ios_app/CMakeLists.txt +104 -0
  683. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/ios_app/Info.plist +36 -0
  684. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/ios_app/Sources/BenchmarkApp.swift +172 -0
  685. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/ios_app/benchmark.h +10 -0
  686. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/ios_app/benchmark.mm +46 -0
  687. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/ios_app/build.sh +17 -0
  688. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/rig.cpp +119 -0
  689. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/simulator_matrix.cpp +1382 -0
  690. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/simulator_matrix.h +5 -0
  691. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/simulator_matrix_config.h.in +25 -0
  692. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/simulator_matrix_identity.cmake +11 -0
  693. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/simulator_matrix_main.cpp +5 -0
  694. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/simulator_matrix_physics.cu +125 -0
  695. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/simulator_matrix_physics.h +58 -0
  696. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/simulator_matrix_physics_contract.h +179 -0
  697. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/simulator_matrix_physics_cpu.cpp +77 -0
  698. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/camera_orbit.h +51 -0
  699. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/CMakeLists.txt +199 -0
  700. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/antialiasing.cpp +214 -0
  701. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/drone.cpp +320 -0
  702. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/drone_device.cu +359 -0
  703. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/environment/environment.h +96 -0
  704. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/environment/operations_cpu.h +263 -0
  705. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/example.cpp +273 -0
  706. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/fixed_pose.cpp +221 -0
  707. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/flow.cpp +120 -0
  708. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/interactive.cpp +1015 -0
  709. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/make_drone_glb.py +172 -0
  710. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/minimal.cpp +82 -0
  711. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/minimal_overlay.cpp +137 -0
  712. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/motion_blur.cpp +232 -0
  713. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/render_pose_trace.cpp +1829 -0
  714. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/render_pose_trace_motion_blur.cpp +647 -0
  715. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/CMakeLists.txt +147 -0
  716. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/README.md +15 -0
  717. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/job.sbatch +28 -0
  718. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/model.h +260 -0
  719. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/model_config.h +24 -0
  720. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/model_forward_cuda.h +397 -0
  721. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/model_operations.h +418 -0
  722. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/model_persist.h +45 -0
  723. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/model_student.h +70 -0
  724. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/scene.cpp +222 -0
  725. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/scene.h +68 -0
  726. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/.gitignore +4 -0
  727. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/CMakeLists.txt +4 -0
  728. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/Info.plist +24 -0
  729. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/Info_ios.plist +36 -0
  730. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/Sources/CameraManager.swift +120 -0
  731. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/Sources/ContentView.swift +703 -0
  732. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/Sources/DatasetRecorder.swift +285 -0
  733. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/Sources/YawPredictorApp.swift +25 -0
  734. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/YawPredictor.entitlements +8 -0
  735. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/build.sh +66 -0
  736. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/build_ios.sh +133 -0
  737. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/generate.sh +6 -0
  738. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/h5_to_tar.cpp +82 -0
  739. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/inference.cpp +166 -0
  740. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/inference.h +26 -0
  741. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/project.yml +30 -0
  742. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/test_tar_vs_hdf5.cpp +173 -0
  743. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/yaw_prediction_cuda.cu +699 -0
  744. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/yaw_prediction_dataset_overlay.cpp +475 -0
  745. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/yaw_prediction_distill_cuda.cu +995 -0
  746. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/yaw_prediction_eval.cu +457 -0
  747. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/yaw_prediction_real_world_eval.cpp +660 -0
  748. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/yaw_prediction_viewer.cu +443 -0
  749. hyperdrone/_vendor/rl-tools/src/rl/environments/hyperdrone/spy/CMakeLists.txt +63 -0
  750. hyperdrone/_vendor/rl-tools/src/rl/environments/hyperdrone/spy/example.cpp +101 -0
  751. hyperdrone/_vendor/rl-tools/src/rl/environments/hyperdrone/spy/ui.cpp +380 -0
  752. hyperdrone/dynamics/__init__.py +5 -0
  753. hyperdrone/dynamics/_component.py +31 -0
  754. hyperdrone/dynamics/_config.py +46 -0
  755. hyperdrone/dynamics/_sim.py +166 -0
  756. hyperdrone/env/__init__.py +23 -0
  757. hyperdrone/env/_multi_environment.py +566 -0
  758. hyperdrone/env/_rotorcraft.py +29 -0
  759. hyperdrone/env/_spy.py +39 -0
  760. hyperdrone/examples/.gitignore +3 -0
  761. hyperdrone/examples/Benchmark.ipynb +113 -0
  762. hyperdrone/examples/HyperDrone.ipynb +589 -0
  763. hyperdrone/examples/Orbiter.ipynb +496 -0
  764. hyperdrone/examples/Renderer.ipynb +218 -0
  765. hyperdrone/examples/__init__.py +16 -0
  766. hyperdrone/examples/articulation.py +55 -0
  767. hyperdrone/examples/benchmark.py +236 -0
  768. hyperdrone/examples/benchmark_minimal.py +65 -0
  769. hyperdrone/examples/data.py +71 -0
  770. hyperdrone/examples/drone_flythrough.py +169 -0
  771. hyperdrone/examples/hyperdrone_videos/my_world_preview.h +17 -0
  772. hyperdrone/examples/my_world.h +17 -0
  773. hyperdrone/examples/render_procthor.py +40 -0
  774. hyperdrone/examples/shots.py +108 -0
  775. hyperdrone/examples/spy.py +40 -0
  776. hyperdrone/examples/visual_inertial_localization.py +158 -0
  777. hyperdrone/gym/__init__.py +67 -0
  778. hyperdrone/render/__init__.py +57 -0
  779. hyperdrone/render/_component.py +51 -0
  780. hyperdrone/render/_config.py +76 -0
  781. hyperdrone/render/_renderer.py +498 -0
  782. hyperdrone/render/_rig.py +136 -0
  783. hyperdrone/render/_sampling.py +69 -0
  784. hyperdrone/render/_scene.py +38 -0
  785. hyperdrone/render/datasets.py +15 -0
  786. hyperray-0.0.1.dist-info/METADATA +519 -0
  787. hyperray-0.0.1.dist-info/RECORD +788 -0
  788. hyperray-0.0.1.dist-info/WHEEL +4 -0
@@ -0,0 +1,1405 @@
1
+ #include "../../../../version.h"
2
+ #include "../../../../rl_tools.h"
3
+ #if (defined(RL_TOOLS_DISABLE_INCLUDE_GUARDS) || !defined(RL_TOOLS_RENDERING_RAYTRACING_BACKENDS_WEBGPU_OPERATIONS_CPU_H)) && (RL_TOOLS_USE_THIS_VERSION == 1)
4
+ #pragma once
5
+ #define RL_TOOLS_RENDERING_RAYTRACING_BACKENDS_WEBGPU_OPERATIONS_CPU_H
6
+
7
+ // WebGPU backend host: implements the common Renderer interface against the standard webgpu.h
8
+ // (wgpu-native is the reference runtime; Dawn/emscripten are drop-in alternatives). Standard
9
+ // WebGPU exposes no acceleration structures, so the BVHs are built on the host with the generic
10
+ // backend's deterministic builder and traversed in WGSL (device.wgsl); outputs are copied into
11
+ // staging buffers and read back into the host-resident tensors by the *_sync verbs and the
12
+ // renderer memory-domain copy (registered ReadbackTargets let the settle run on the Context
13
+ // alone). The only non-standard calls are wgpuDevicePoll (blocking wait) and
14
+ // wgpuInstanceEnumerateAdapters (RL_TOOLS_WEBGPU_DEVICE_INDEX), both isolated in the helpers
15
+ // below; the __EMSCRIPTEN__ (browser) build replaces them with wgpuInstanceRequestAdapter and
16
+ // ASYNCIFY event-loop yields.
17
+ #include "../../renderer.h"
18
+ #include "../../operations_cpu_common.h"
19
+ #include "../specialization.h"
20
+ #include "../generic/operations_generic.h"
21
+ #include "context.h"
22
+ #include "bvh_sah.h"
23
+ #include "device_source.h"
24
+
25
+ #include <webgpu/webgpu.h>
26
+ #ifdef __EMSCRIPTEN__
27
+ #include <emscripten.h>
28
+ #include <emscripten/promise.h>
29
+ #else
30
+ #include <webgpu/wgpu.h>
31
+ #endif
32
+
33
+ #include <vector>
34
+ #include <cstring>
35
+ #include <cstdlib>
36
+ #include <cstdio>
37
+ #include <string>
38
+ #include <unordered_map>
39
+ #include <cmath>
40
+ #include <utility>
41
+
42
+ RL_TOOLS_NAMESPACE_WRAPPER_START
43
+ namespace rl_tools {
44
+ namespace rendering::raytracing::backends {
45
+ template <typename SPEC>
46
+ struct RendererState<rendering::raytracing::backends::Webgpu, SPEC>: webgpu::Context {};
47
+
48
+ template <typename SPEC>
49
+ struct LibraryState<rendering::raytracing::backends::Webgpu, SPEC> {};
50
+
51
+ template <typename SPEC>
52
+ struct SceneState<rendering::raytracing::backends::Webgpu, SPEC> {};
53
+ }
54
+
55
+ namespace rendering::raytracing::backends::webgpu{
56
+ template <typename SPEC>
57
+ constexpr bool FUSE_AUXILIARY = SPEC::HAS_RGB && !SPEC::ENABLE_ANTI_ALIASING && !SPEC::ENABLE_MOTION_BLUR && (SPEC::HAS_DEPTH || SPEC::HAS_SEGMENTATION || SPEC::HAS_NORMALS || SPEC::HAS_FLOW);
58
+
59
+ template <typename SPEC>
60
+ Context& context(rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Webgpu>& renderer){
61
+ return *renderer.backend;
62
+ }
63
+
64
+ inline WGPUStringView string_view(const char* string){
65
+ return WGPUStringView{string, WGPU_STRLEN};
66
+ }
67
+
68
+ inline void print_string_view(WGPUStringView view){
69
+ if(view.data != nullptr){
70
+ const size_t length = view.length == WGPU_STRLEN ? std::strlen(view.data) : view.length;
71
+ std::fwrite(view.data, 1, length, stderr);
72
+ }
73
+ }
74
+
75
+ inline void uncaptured_error_callback(WGPUDevice const*, WGPUErrorType type, WGPUStringView message, void*, void*){
76
+ std::fprintf(stderr, "#rl_tools::rendering::raytracing: WebGPU uncaptured error (%d): ", (int)type);
77
+ print_string_view(message);
78
+ std::fprintf(stderr, "\n");
79
+ // validation errors are programming errors and would otherwise surface as silent
80
+ // wrong output — fail fast like the Vulkan backend's check()
81
+ std::abort();
82
+ }
83
+
84
+ inline void device_lost_callback(WGPUDevice const*, WGPUDeviceLostReason reason, WGPUStringView message, void*, void*){
85
+ if(reason == WGPUDeviceLostReason_Destroyed){
86
+ return;
87
+ }
88
+ std::fprintf(stderr, "#rl_tools::rendering::raytracing: WebGPU device lost (%d): ", (int)reason);
89
+ print_string_view(message);
90
+ std::fprintf(stderr, "\n");
91
+ }
92
+
93
+ template <typename DEVICE>
94
+ BufferResource create_buffer(DEVICE& device, Context& ctx, uint64_t size, WGPUBufferUsage usage){
95
+ BufferResource resource;
96
+ resource.size = size < 256 ? 256 : size; // covers the largest WGSL binding stride so disabled features can bind placeholders
97
+ if((usage & WGPUBufferUsage_Storage) != 0 && ctx.max_storage_buffer_binding_size > 0){
98
+ utils::assert_exit(device, resource.size <= ctx.max_storage_buffer_binding_size, "WebGPU: buffer exceeds maxStorageBufferBindingSize");
99
+ }
100
+ WGPUBufferDescriptor descriptor{};
101
+ descriptor.usage = usage;
102
+ descriptor.size = resource.size;
103
+ resource.buffer = wgpuDeviceCreateBuffer(ctx.device, &descriptor);
104
+ utils::assert_exit(device, resource.buffer != nullptr, "WebGPU: buffer creation failed");
105
+ return resource;
106
+ }
107
+
108
+ inline void destroy_buffer(BufferResource& resource){
109
+ if(resource.buffer != nullptr){
110
+ wgpuBufferRelease(resource.buffer);
111
+ resource.buffer = nullptr;
112
+ }
113
+ resource.size = 0;
114
+ }
115
+
116
+ struct MapRequest{
117
+ #ifdef __EMSCRIPTEN__
118
+ em_promise_t promise;
119
+ #endif
120
+ bool done = false;
121
+ WGPUMapAsyncStatus status = WGPUMapAsyncStatus_Error;
122
+ };
123
+
124
+ inline void map_callback(WGPUMapAsyncStatus status, WGPUStringView, void* userdata1, void*){
125
+ auto* request = (MapRequest*)userdata1;
126
+ request->status = status;
127
+ request->done = true;
128
+ #ifdef __EMSCRIPTEN__
129
+ emscripten_promise_resolve(request->promise, EM_PROMISE_FULFILL, nullptr);
130
+ #endif
131
+ }
132
+
133
+ template <typename DEVICE>
134
+ void read_back(DEVICE& device, Context& ctx, const std::vector<ReadbackTarget>& targets){
135
+ std::vector<MapRequest> requests(targets.size());
136
+ for(size_t i = 0; i < targets.size(); i++){
137
+ const auto& staging = *targets[i].staging;
138
+ WGPUBufferMapCallbackInfo callback_info{};
139
+ #ifdef __EMSCRIPTEN__
140
+ requests[i].promise = emscripten_promise_create();
141
+ callback_info.mode = WGPUCallbackMode_AllowSpontaneous;
142
+ #else
143
+ callback_info.mode = WGPUCallbackMode_AllowProcessEvents;
144
+ #endif
145
+ callback_info.callback = map_callback;
146
+ callback_info.userdata1 = &requests[i];
147
+ wgpuBufferMapAsync(staging.buffer, WGPUMapMode_Read, 0, (size_t)staging.size, callback_info);
148
+ }
149
+ for(size_t i = 0; i < targets.size(); i++){
150
+ const auto& request = requests[i];
151
+ const auto& target = targets[i];
152
+ const auto& staging = *target.staging;
153
+ while(!request.done){
154
+ #ifdef __EMSCRIPTEN__
155
+ const auto settled = emscripten_promise_await(request.promise);
156
+ utils::assert_exit(device, settled.result == EM_PROMISE_FULFILL, "WebGPU: map promise rejected");
157
+ #else
158
+ wgpuDevicePoll(ctx.device, true, nullptr);
159
+ #endif
160
+ }
161
+ utils::assert_exit(device, request.status == WGPUMapAsyncStatus_Success, "WebGPU: staging buffer map failed");
162
+ const void* mapped = wgpuBufferGetConstMappedRange(staging.buffer, 0, (size_t)staging.size);
163
+ utils::assert_exit(device, mapped != nullptr, "WebGPU: mapped range unavailable");
164
+ std::memcpy(target.destination, mapped, target.bytes);
165
+ wgpuBufferUnmap(staging.buffer);
166
+ #ifdef __EMSCRIPTEN__
167
+ emscripten_promise_destroy(request.promise);
168
+ #endif
169
+ }
170
+ }
171
+
172
+ template <typename DEVICE>
173
+ void settle_render(DEVICE& device, Context& ctx){
174
+ if(!ctx.render_in_flight){
175
+ return;
176
+ }
177
+ read_back(device, ctx, ctx.render_readbacks);
178
+ ctx.render_in_flight = false;
179
+ }
180
+
181
+ template <typename DEVICE>
182
+ void settle_probe(DEVICE& device, Context& ctx){
183
+ if(!ctx.collision_in_flight){
184
+ return;
185
+ }
186
+ read_back(device, ctx, ctx.probe_readbacks);
187
+ ctx.collision_in_flight = false;
188
+ }
189
+
190
+ template <typename DEVICE>
191
+ void wait_in_flight(DEVICE& device, Context& ctx){
192
+ settle_render(device, ctx);
193
+ settle_probe(device, ctx);
194
+ }
195
+
196
+ inline void destroy_scene_resources(Context& ctx){
197
+ if(ctx.bind_group != nullptr){
198
+ wgpuBindGroupRelease(ctx.bind_group);
199
+ ctx.bind_group = nullptr;
200
+ }
201
+ destroy_buffer(ctx.scene_geometry);
202
+ destroy_buffer(ctx.texture_data);
203
+ destroy_buffer(ctx.bvh_nodes);
204
+ destroy_buffer(ctx.triangles);
205
+ destroy_buffer(ctx.instance_data);
206
+ ctx.instance_classes_offset = 0;
207
+ ctx.overlay_node_offset = 0;
208
+ ctx.instance_data_host.clear();
209
+ ctx.instance_classes_host.clear();
210
+ ctx.object_classes.clear();
211
+ ctx.object_node_offset.clear();
212
+ ctx.object_node_count.clear();
213
+ ctx.object_primitive_offset.clear();
214
+ ctx.object_root_bounds_min.clear();
215
+ ctx.object_root_bounds_max.clear();
216
+ ctx.overlay_nodes_host.clear();
217
+ ctx.overlay_primitives_host.clear();
218
+ ctx.overlay_meta_host.clear();
219
+ ctx.overlay_bounds_min.clear();
220
+ ctx.overlay_bounds_max.clear();
221
+ ctx.overlay_centroids.clear();
222
+ ctx.overlay_temp_primitives.clear();
223
+ ctx.num_scene_instances = 0;
224
+ ctx.total_instances = 0;
225
+ }
226
+
227
+ inline uint32_t bvh_max_depth(const BVHNode* nodes, uint32_t num_nodes){
228
+ if(num_nodes == 0){
229
+ return 0;
230
+ }
231
+ uint32_t max_depth = 0;
232
+ std::vector<std::pair<uint32_t, uint32_t>> stack;
233
+ stack.push_back({0, 1});
234
+ while(!stack.empty()){
235
+ const auto [node_i, depth] = stack.back();
236
+ stack.pop_back();
237
+ max_depth = depth > max_depth ? depth : max_depth;
238
+ const auto& node = nodes[node_i];
239
+ if(node.count == 0){
240
+ stack.push_back({node.left_or_first, depth + 1});
241
+ stack.push_back({node.left_or_first + 1, depth + 1});
242
+ }
243
+ }
244
+ return max_depth;
245
+ }
246
+
247
+ // world-space AABB of one instance from its object's BLAS root bounds
248
+ inline void instance_world_bounds(Context& ctx, uint32_t object, const float object_to_world[12], bool identity, float bounds_min[3], float bounds_max[3]){
249
+ for(int axis = 0; axis < 3; axis++){
250
+ bounds_min[axis] = 1e30f;
251
+ bounds_max[axis] = -1e30f;
252
+ }
253
+ if(ctx.object_node_count[object] == 0){
254
+ return;
255
+ }
256
+ const float* root_min = &ctx.object_root_bounds_min[3 * (size_t)object];
257
+ const float* root_max = &ctx.object_root_bounds_max[3 * (size_t)object];
258
+ if(identity){
259
+ for(int axis = 0; axis < 3; axis++){
260
+ bounds_min[axis] = root_min[axis];
261
+ bounds_max[axis] = root_max[axis];
262
+ }
263
+ }
264
+ else{
265
+ for(int corner = 0; corner < 8; corner++){
266
+ const float local[3] = {
267
+ (corner & 1) ? root_max[0] : root_min[0],
268
+ (corner & 2) ? root_max[1] : root_min[1],
269
+ (corner & 4) ? root_max[2] : root_min[2]
270
+ };
271
+ float world[3];
272
+ rendering::raytracing::detail::transform_point(object_to_world, local, world);
273
+ for(int axis = 0; axis < 3; axis++){
274
+ bounds_min[axis] = bounds_min[axis] < world[axis] ? bounds_min[axis] : world[axis];
275
+ bounds_max[axis] = bounds_max[axis] > world[axis] ? bounds_max[axis] : world[axis];
276
+ }
277
+ }
278
+ }
279
+ }
280
+
281
+ inline void fill_instance_entry(Context& ctx, size_t global, uint32_t object, const float world[12]){
282
+ auto& entry = ctx.instance_data_host[global];
283
+ entry = {};
284
+ for(int element = 0; element < 12; element++){
285
+ entry.object_to_world[element] = world[element];
286
+ }
287
+ const bool identity = rendering::raytracing::detail::transform_is_identity(world);
288
+ if(identity){
289
+ std::memcpy(entry.world_to_object, entry.object_to_world, sizeof(entry.world_to_object));
290
+ }
291
+ else{
292
+ rendering::raytracing::detail::invert_transform(world, entry.world_to_object);
293
+ }
294
+ entry.object = object;
295
+ entry.identity = identity ? 1 : 0;
296
+ ctx.instance_classes_host[global] = ctx.object_classes[object];
297
+ }
298
+
299
+ // rebuilds one overlay region (region 0 = shutter close, 1 + s = dynamic-motion-blur
300
+ // sample s) into the host mirrors from a transforms-layout slab; the caller uploads them
301
+ // in one batch
302
+ template <typename DEVICE, typename SPEC, typename BACKEND_TAG>
303
+ void rebuild_overlay_region(DEVICE& device, rendering::raytracing::Renderer<SPEC, BACKEND_TAG>& renderer, Context& ctx, uint32_t region, const float* transforms_base){
304
+ using TI = typename SPEC::TI;
305
+ constexpr size_t num_overlay_slots = (size_t)SPEC::NUM_OVERLAYS * SPEC::MAX_OVERLAY_INSTANCES;
306
+ for(TI overlay = 0; overlay < SPEC::NUM_OVERLAYS; overlay++){
307
+ auto& overlay_state = renderer.overlays[overlay];
308
+ const size_t region_overlay = (size_t)region * SPEC::NUM_OVERLAYS + overlay;
309
+ uint32_t* primitives = ctx.overlay_primitives_host.data() + region_overlay * SPEC::MAX_OVERLAY_INSTANCES;
310
+ uint32_t num_active = 0;
311
+ for(TI slot = 0; slot < SPEC::MAX_OVERLAY_INSTANCES; slot++){
312
+ const auto& host_slot = overlay_state.slots[slot];
313
+ if(!host_slot.active) continue;
314
+ const size_t global = (size_t)ctx.num_scene_instances + num_overlay_slots * region + (size_t)overlay * SPEC::MAX_OVERLAY_INSTANCES + slot;
315
+ const float* world = transforms_base + ((size_t)overlay * SPEC::MAX_OVERLAY_INSTANCES + slot) * 12;
316
+ fill_instance_entry(ctx, global, (uint32_t)host_slot.object, world);
317
+ float bounds_min[3], bounds_max[3];
318
+ instance_world_bounds(ctx, (uint32_t)host_slot.object, world, ctx.instance_data_host[global].identity != 0, bounds_min, bounds_max);
319
+ for(int axis = 0; axis < 3; axis++){
320
+ ctx.overlay_bounds_min[3 * global + axis] = bounds_min[axis];
321
+ ctx.overlay_bounds_max[3 * global + axis] = bounds_max[axis];
322
+ ctx.overlay_centroids[3 * global + axis] = (bounds_min[axis] + bounds_max[axis]) * 0.5f;
323
+ }
324
+ primitives[num_active++] = (uint32_t)global;
325
+ }
326
+ BVHNode* nodes = ctx.overlay_nodes_host.data() + region_overlay * 2 * SPEC::MAX_OVERLAY_INSTANCES;
327
+ const uint32_t num_nodes = generic::build_bvh_nodes(nodes, primitives, ctx.overlay_temp_primitives.data(), ctx.overlay_bounds_min.data(), ctx.overlay_bounds_max.data(), ctx.overlay_centroids.data(), num_active);
328
+ utils::assert_exit(device, bvh_max_depth(nodes, num_nodes) <= TRAVERSAL_STACK_SIZE, "WebGPU: overlay BVH depth exceeds the traversal stack");
329
+ ctx.overlay_meta_host[region_overlay * 2 + 0] = num_active;
330
+ ctx.overlay_meta_host[region_overlay * 2 + 1] = num_nodes;
331
+ }
332
+ }
333
+ }
334
+
335
+ template <typename DEVICE, typename SPEC>
336
+ void render_sync(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Webgpu>& renderer);
337
+ template <typename DEVICE, typename SPEC>
338
+ void probe_sync(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Webgpu>& renderer);
339
+ template <typename DEVICE, typename SPEC>
340
+ void malloc(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Webgpu>& renderer){
341
+ namespace wg = rendering::raytracing::backends::webgpu;
342
+ using TI = typename SPEC::TI;
343
+ static_assert(utils::typing::is_same_v<typename SPEC::T, float>, "The WebGPU raytracing backend requires T = float");
344
+
345
+ malloc(device, renderer.cameras);
346
+ if constexpr (SPEC::HAS_CAMERA_PAIR) {
347
+ malloc(device, renderer.cameras_open);
348
+ }
349
+ if constexpr (SPEC::HAS_RGB) {
350
+ malloc(device, renderer.frame_buffer);
351
+ }
352
+ if constexpr (SPEC::HAS_DEPTH) {
353
+ malloc(device, renderer.depth_buffer);
354
+ }
355
+ if constexpr (SPEC::HAS_SEGMENTATION) {
356
+ malloc(device, renderer.segmentation_buffer);
357
+ }
358
+ if constexpr (SPEC::HAS_NORMALS) {
359
+ malloc(device, renderer.normals_buffer);
360
+ }
361
+ if constexpr (SPEC::HAS_FLOW) {
362
+ malloc(device, renderer.cameras_previous);
363
+ malloc(device, renderer.flow_buffer);
364
+ malloc(device, renderer.flow_status_buffer);
365
+ }
366
+ if constexpr (SPEC::HAS_FLOW_FORWARD) {
367
+ malloc(device, renderer.flow_forward_buffer);
368
+ malloc(device, renderer.flow_forward_status_buffer);
369
+ }
370
+ if constexpr (SPEC::HAS_OBSERVATION) {
371
+ static_assert(utils::typing::is_same_v<typename SPEC::OBSERVATION_T, float>, "The WebGPU raytracing backend requires OBSERVATION_T = float");
372
+ malloc(device, renderer.observation);
373
+ }
374
+ if constexpr (SPEC::ENABLE_OVERLAYS) {
375
+ malloc(device, renderer.transforms);
376
+ rendering::raytracing::detail::malloc_overlay_staging(renderer);
377
+ }
378
+ if constexpr (SPEC::HAS_FLOW_OVERLAYS) {
379
+ malloc(device, renderer.transforms_previous);
380
+ std::memset(data(renderer.transforms_previous), 0, decltype(renderer.transforms_previous)::SPEC::SIZE_BYTES);
381
+ }
382
+ if constexpr (SPEC::ENABLE_DYNAMIC_MOTION_BLUR) {
383
+ malloc(device, renderer.transforms_motion);
384
+ std::memset(data(renderer.transforms_motion), 0, decltype(renderer.transforms_motion)::SPEC::SIZE_BYTES);
385
+ }
386
+ #if !RL_TOOLS_RENDERING_RAYTRACING_DISABLE_PROBE_RAYS
387
+ malloc(device, renderer.collision_results);
388
+ #endif
389
+
390
+ renderer.backend = new rendering::raytracing::backends::RendererState<rendering::raytracing::backends::Webgpu, SPEC>{};
391
+ renderer.device.context = renderer.backend;
392
+ auto* ctx = renderer.backend;
393
+
394
+ ctx->instance = wgpuCreateInstance(nullptr);
395
+ utils::assert_exit(device, ctx->instance != nullptr, "WebGPU: instance creation failed");
396
+
397
+ #ifdef __EMSCRIPTEN__
398
+ {
399
+ struct AdapterRequest{
400
+ bool done = false;
401
+ WGPUAdapter adapter = nullptr;
402
+ } request;
403
+ WGPURequestAdapterOptions options{};
404
+ options.powerPreference = WGPUPowerPreference_HighPerformance;
405
+ WGPURequestAdapterCallbackInfo callback_info{};
406
+ callback_info.mode = WGPUCallbackMode_AllowProcessEvents;
407
+ callback_info.callback = [](WGPURequestAdapterStatus status, WGPUAdapter adapter, WGPUStringView message, void* userdata1, void*){
408
+ auto* request = (AdapterRequest*)userdata1;
409
+ if(status != WGPURequestAdapterStatus_Success){
410
+ std::fprintf(stderr, "#rl_tools::rendering::raytracing: WebGPU adapter request failed: ");
411
+ wg::print_string_view(message);
412
+ std::fprintf(stderr, "\n");
413
+ }
414
+ request->adapter = adapter;
415
+ request->done = true;
416
+ };
417
+ callback_info.userdata1 = &request;
418
+ wgpuInstanceRequestAdapter(ctx->instance, &options, callback_info);
419
+ while(!request.done){
420
+ wgpuInstanceProcessEvents(ctx->instance);
421
+ emscripten_sleep(1);
422
+ }
423
+ ctx->adapter = request.adapter;
424
+ utils::assert_exit(device, ctx->adapter != nullptr, "WebGPU: no suitable adapter available");
425
+ }
426
+ #else
427
+ // adapter selection mirrors the Vulkan backend: filter on capability (a GL adapter only
428
+ // exposes the 8-storage-buffer minimum), prefer discrete GPUs, RL_TOOLS_WEBGPU_DEVICE_INDEX
429
+ // forces an enumeration index. wgpuInstanceEnumerateAdapters is a wgpu-native extension;
430
+ // the browser has no enumeration, so the emscripten path asks via wgpuInstanceRequestAdapter
431
+ const char* device_index_env = std::getenv("RL_TOOLS_WEBGPU_DEVICE_INDEX");
432
+ const int64_t requested_device_index = device_index_env != nullptr ? std::atoll(device_index_env) : -1;
433
+ {
434
+ const size_t adapter_count = wgpuInstanceEnumerateAdapters(ctx->instance, nullptr, nullptr);
435
+ std::vector<WGPUAdapter> adapters(adapter_count);
436
+ wgpuInstanceEnumerateAdapters(ctx->instance, nullptr, adapters.data());
437
+ int64_t selected = -1;
438
+ bool selected_discrete = false;
439
+ for(size_t adapter_i = 0; adapter_i < adapter_count; adapter_i++){
440
+ WGPULimits limits{};
441
+ const bool qualifies = wgpuAdapterGetLimits(adapters[adapter_i], &limits) == WGPUStatus_Success
442
+ && limits.maxStorageBuffersPerShaderStage >= wg::bindings::STORAGE_COUNT;
443
+ if(requested_device_index >= 0){
444
+ if((int64_t)adapter_i == requested_device_index){
445
+ utils::assert_exit(device, qualifies, "WebGPU: the requested adapter supports too few storage buffers per stage");
446
+ selected = (int64_t)adapter_i;
447
+ }
448
+ continue;
449
+ }
450
+ if(!qualifies){
451
+ continue;
452
+ }
453
+ WGPUAdapterInfo info{};
454
+ bool discrete = false;
455
+ if(wgpuAdapterGetInfo(adapters[adapter_i], &info) == WGPUStatus_Success){
456
+ discrete = info.adapterType == WGPUAdapterType_DiscreteGPU;
457
+ wgpuAdapterInfoFreeMembers(info);
458
+ }
459
+ if(selected < 0 || (discrete && !selected_discrete)){
460
+ selected = (int64_t)adapter_i;
461
+ selected_discrete = discrete;
462
+ }
463
+ }
464
+ utils::assert_exit(device, selected >= 0, "WebGPU: no suitable adapter available");
465
+ for(size_t adapter_i = 0; adapter_i < adapter_count; adapter_i++){
466
+ if((int64_t)adapter_i == selected){
467
+ ctx->adapter = adapters[adapter_i];
468
+ }
469
+ else{
470
+ wgpuAdapterRelease(adapters[adapter_i]);
471
+ }
472
+ }
473
+ }
474
+ #endif
475
+
476
+ {
477
+ WGPUAdapterInfo info{};
478
+ if(wgpuAdapterGetInfo(ctx->adapter, &info) == WGPUStatus_Success){
479
+ const size_t length = info.device.data == nullptr ? 0 : (info.device.length == WGPU_STRLEN ? std::strlen(info.device.data) : info.device.length);
480
+ log(device, device.logger, devices::logging::Verbosity::info, rendering::raytracing::LOG_PREFIX, "WebGPU adapter: ", std::string(info.device.data == nullptr ? "" : info.device.data, length), " (backend ", (int)info.backendType, ")");
481
+ wgpuAdapterInfoFreeMembers(info);
482
+ }
483
+ }
484
+
485
+ WGPULimits adapter_limits{};
486
+ utils::assert_exit(device, wgpuAdapterGetLimits(ctx->adapter, &adapter_limits) == WGPUStatus_Success, "WebGPU: adapter limit query failed");
487
+ utils::assert_exit(device, adapter_limits.maxStorageBuffersPerShaderStage >= wg::bindings::STORAGE_COUNT, "WebGPU: adapter supports too few storage buffers per stage");
488
+ ctx->max_storage_buffers_per_shader_stage = adapter_limits.maxStorageBuffersPerShaderStage;
489
+ ctx->max_storage_buffer_binding_size = adapter_limits.maxStorageBufferBindingSize;
490
+
491
+ {
492
+ // request the adapter's own limits: the scene buffers (geometry, textures, BVH) can
493
+ // exceed the spec defaults (128MiB binding / 8 storage buffers per stage)
494
+ WGPULimits required_limits = adapter_limits;
495
+ required_limits.nextInChain = nullptr;
496
+ WGPUDeviceDescriptor descriptor{};
497
+ descriptor.requiredLimits = &required_limits;
498
+ descriptor.deviceLostCallbackInfo.mode = WGPUCallbackMode_AllowSpontaneous;
499
+ descriptor.deviceLostCallbackInfo.callback = wg::device_lost_callback;
500
+ descriptor.uncapturedErrorCallbackInfo.callback = wg::uncaptured_error_callback;
501
+ struct DeviceRequest{
502
+ bool done = false;
503
+ WGPUDevice device = nullptr;
504
+ } request;
505
+ WGPURequestDeviceCallbackInfo callback_info{};
506
+ callback_info.mode = WGPUCallbackMode_AllowProcessEvents;
507
+ callback_info.callback = [](WGPURequestDeviceStatus status, WGPUDevice wgpu_device, WGPUStringView message, void* userdata1, void*){
508
+ auto* request = (DeviceRequest*)userdata1;
509
+ if(status != WGPURequestDeviceStatus_Success){
510
+ std::fprintf(stderr, "#rl_tools::rendering::raytracing: WebGPU device request failed: ");
511
+ wg::print_string_view(message);
512
+ std::fprintf(stderr, "\n");
513
+ }
514
+ request->device = wgpu_device;
515
+ request->done = true;
516
+ };
517
+ callback_info.userdata1 = &request;
518
+ wgpuAdapterRequestDevice(ctx->adapter, &descriptor, callback_info);
519
+ while(!request.done){
520
+ wgpuInstanceProcessEvents(ctx->instance);
521
+ #ifdef __EMSCRIPTEN__
522
+ emscripten_sleep(1);
523
+ #endif
524
+ }
525
+ ctx->device = request.device;
526
+ }
527
+ utils::assert_exit(device, ctx->device != nullptr, "WebGPU: device creation failed");
528
+ ctx->queue = wgpuDeviceGetQueue(ctx->device);
529
+
530
+ {
531
+ WGPUShaderSourceWGSL wgsl{};
532
+ wgsl.chain.sType = WGPUSType_ShaderSourceWGSL;
533
+ wgsl.code = wg::string_view(rendering::raytracing::backends::webgpu::device_source());
534
+ WGPUShaderModuleDescriptor descriptor{};
535
+ descriptor.nextInChain = &wgsl.chain;
536
+ ctx->module = wgpuDeviceCreateShaderModule(ctx->device, &descriptor);
537
+ utils::assert_exit(device, ctx->module != nullptr, "WebGPU: shader module creation failed");
538
+ }
539
+
540
+ {
541
+ WGPUBindGroupLayoutEntry layout_entries[wg::bindings::COUNT]{};
542
+ auto set_entry = [&](uint32_t binding, WGPUBufferBindingType type){
543
+ layout_entries[binding].binding = binding;
544
+ layout_entries[binding].visibility = WGPUShaderStage_Compute;
545
+ layout_entries[binding].buffer.type = type;
546
+ };
547
+ for(uint32_t binding_i = 0; binding_i < wg::bindings::COUNT; binding_i++){
548
+ set_entry(binding_i, WGPUBufferBindingType_ReadOnlyStorage);
549
+ }
550
+ set_entry(wg::bindings::OUTPUTS, WGPUBufferBindingType_Storage);
551
+ WGPUBindGroupLayoutDescriptor layout_descriptor{};
552
+ layout_descriptor.entryCount = wg::bindings::COUNT;
553
+ layout_descriptor.entries = layout_entries;
554
+ ctx->bind_group_layout = wgpuDeviceCreateBindGroupLayout(ctx->device, &layout_descriptor);
555
+ utils::assert_exit(device, ctx->bind_group_layout != nullptr, "WebGPU: bind group layout creation failed");
556
+ WGPUPipelineLayoutDescriptor pipeline_layout_descriptor{};
557
+ pipeline_layout_descriptor.bindGroupLayoutCount = 1;
558
+ pipeline_layout_descriptor.bindGroupLayouts = &ctx->bind_group_layout;
559
+ ctx->pipeline_layout = wgpuDeviceCreatePipelineLayout(ctx->device, &pipeline_layout_descriptor);
560
+ utils::assert_exit(device, ctx->pipeline_layout != nullptr, "WebGPU: pipeline layout creation failed");
561
+ }
562
+
563
+ {
564
+ const auto constant = [](const char* key, double value){
565
+ WGPUConstantEntry entry{};
566
+ entry.key = wg::string_view(key);
567
+ entry.value = value;
568
+ return entry;
569
+ };
570
+ using CONSTANTS = rendering::raytracing::backends::SpecializationConstants<SPEC>;
571
+ // Safari rejects overrides outside the entry point's statically accessed set.
572
+ const std::vector<WGPUConstantEntry> collision_constants = {
573
+ constant("fc_overlay_count", (double)CONSTANTS::OVERLAY_COUNT),
574
+ constant("fc_num_overlays", (double)CONSTANTS::NUM_OVERLAYS),
575
+ constant("fc_overlay_capacity", (double)CONSTANTS::OVERLAY_CAPACITY),
576
+ };
577
+ auto flow_constants = collision_constants;
578
+ flow_constants.insert(flow_constants.end(), {
579
+ constant("fc_motion_samples", (double)CONSTANTS::MOTION_SAMPLES),
580
+ constant("fc_dynamic_motion_blur", CONSTANTS::DYNAMIC_MOTION_BLUR ? 1.0 : 0.0),
581
+ });
582
+ auto auxiliary_constants = flow_constants;
583
+ auxiliary_constants.insert(auxiliary_constants.end(), {
584
+ constant("fc_semantic_segmentation", CONSTANTS::SEMANTIC_SEGMENTATION ? 1.0 : 0.0),
585
+ constant("fc_has_depth", SPEC::HAS_DEPTH ? 1.0 : 0.0),
586
+ constant("fc_has_segmentation", SPEC::HAS_SEGMENTATION ? 1.0 : 0.0),
587
+ constant("fc_has_normals", SPEC::HAS_NORMALS ? 1.0 : 0.0),
588
+ constant("fc_has_flow", SPEC::HAS_FLOW ? 1.0 : 0.0),
589
+ });
590
+ auto rgb_constants = auxiliary_constants;
591
+ rgb_constants.insert(rgb_constants.end(), {
592
+ constant("fc_srgb_output", CONSTANTS::SRGB_OUTPUT ? 1.0 : 0.0),
593
+ constant("fc_motion_blur", CONSTANTS::MOTION_BLUR ? 1.0 : 0.0),
594
+ constant("fc_aa_grid", (double)CONSTANTS::AA_GRID),
595
+ constant("fc_checker_background", CONSTANTS::CHECKER_BACKGROUND ? 1.0 : 0.0),
596
+ constant("fc_load_textures", CONSTANTS::LOAD_TEXTURES ? 1.0 : 0.0),
597
+ constant("fc_normal_shading", CONSTANTS::NORMAL_SHADING ? 1.0 : 0.0),
598
+ constant("fc_metallic_reflections", CONSTANTS::METALLIC_REFLECTIONS ? 1.0 : 0.0),
599
+ constant("fc_pbr_shading", CONSTANTS::PBR_SHADING ? 1.0 : 0.0),
600
+ constant("fc_punctual_light_shadows", CONSTANTS::PUNCTUAL_LIGHT_SHADOWS ? 1.0 : 0.0),
601
+ constant("fc_has_observation", CONSTANTS::HAS_OBSERVATION ? 1.0 : 0.0),
602
+ constant("fc_fuse_auxiliary", wg::FUSE_AUXILIARY<SPEC> ? 1.0 : 0.0),
603
+ });
604
+ auto make_pipeline = [&](const char* entry_point, const std::vector<WGPUConstantEntry>& constants) -> WGPUComputePipeline {
605
+ WGPUComputePipelineDescriptor descriptor{};
606
+ descriptor.layout = ctx->pipeline_layout;
607
+ descriptor.compute.module = ctx->module;
608
+ descriptor.compute.entryPoint = wg::string_view(entry_point);
609
+ descriptor.compute.constantCount = constants.size();
610
+ descriptor.compute.constants = constants.data();
611
+ WGPUComputePipeline pipeline = wgpuDeviceCreateComputePipeline(ctx->device, &descriptor);
612
+ utils::assert_exit(device, pipeline != nullptr, "WebGPU: compute pipeline creation failed");
613
+ return pipeline;
614
+ };
615
+ if constexpr (SPEC::HAS_RGB) {
616
+ ctx->rgb_pipeline = make_pipeline("main_rgb", rgb_constants);
617
+ }
618
+ if constexpr ((SPEC::HAS_DEPTH || SPEC::HAS_SEGMENTATION || SPEC::HAS_NORMALS || SPEC::HAS_FLOW) && !wg::FUSE_AUXILIARY<SPEC>) {
619
+ ctx->auxiliary_pipeline = make_pipeline("main_auxiliary", auxiliary_constants);
620
+ }
621
+ if constexpr (SPEC::HAS_FLOW_FORWARD) {
622
+ ctx->flow_forward_pipeline = make_pipeline("main_flow_forward", flow_constants);
623
+ }
624
+ #if !RL_TOOLS_RENDERING_RAYTRACING_DISABLE_PROBE_RAYS
625
+ ctx->collision_pipeline = make_pipeline("main_collision", collision_constants);
626
+ #endif
627
+ ctx->pipelines_built = true;
628
+ }
629
+
630
+ const WGPUBufferUsage STORAGE_UPLOAD = WGPUBufferUsage_Storage | WGPUBufferUsage_CopyDst;
631
+ const WGPUBufferUsage STORAGE_OUTPUT = WGPUBufferUsage_Storage | WGPUBufferUsage_CopySrc | WGPUBufferUsage_CopyDst;
632
+ const WGPUBufferUsage STAGING = WGPUBufferUsage_MapRead | WGPUBufferUsage_CopyDst;
633
+ using LAYOUT = wg::BufferLayout<SPEC>;
634
+ ctx->launch_params = wg::create_buffer(device, *ctx, sizeof(wg::LaunchParams), STORAGE_UPLOAD);
635
+ ctx->frame_inputs = wg::create_buffer(device, *ctx, (size_t)LAYOUT::FRAME_INPUTS_WORDS * sizeof(uint32_t), STORAGE_UPLOAD);
636
+ ctx->outputs = wg::create_buffer(device, *ctx, (size_t)LAYOUT::OUTPUTS_WORDS * sizeof(uint32_t), STORAGE_OUTPUT);
637
+ if constexpr (SPEC::HAS_RGB) {
638
+ ctx->staging_frame_buffer = wg::create_buffer(device, *ctx, (size_t)LAYOUT::FRAME_BUFFER_WORDS * sizeof(uint32_t), STAGING);
639
+ }
640
+ if constexpr (SPEC::HAS_DEPTH) {
641
+ ctx->staging_depth = wg::create_buffer(device, *ctx, (size_t)LAYOUT::DEPTH_WORDS * sizeof(uint32_t), STAGING);
642
+ }
643
+ if constexpr (SPEC::HAS_SEGMENTATION) {
644
+ ctx->staging_segmentation = wg::create_buffer(device, *ctx, (size_t)LAYOUT::SEGMENTATION_WORDS * sizeof(uint32_t), STAGING);
645
+ }
646
+ if constexpr (SPEC::HAS_NORMALS) {
647
+ ctx->staging_normals = wg::create_buffer(device, *ctx, (size_t)LAYOUT::NORMALS_WORDS * sizeof(uint32_t), STAGING);
648
+ }
649
+ if constexpr (SPEC::HAS_FLOW) {
650
+ ctx->staging_flow = wg::create_buffer(device, *ctx, (size_t)LAYOUT::FLOW_WORDS * sizeof(uint32_t), STAGING);
651
+ ctx->staging_flow_status = wg::create_buffer(device, *ctx, (size_t)LAYOUT::FLOW_STATUS_WORDS * sizeof(uint32_t), STAGING);
652
+ }
653
+ if constexpr (SPEC::HAS_FLOW_FORWARD) {
654
+ ctx->staging_flow_forward = wg::create_buffer(device, *ctx, (size_t)LAYOUT::FLOW_FORWARD_WORDS * sizeof(uint32_t), STAGING);
655
+ ctx->staging_flow_forward_status = wg::create_buffer(device, *ctx, (size_t)LAYOUT::FLOW_FORWARD_STATUS_WORDS * sizeof(uint32_t), STAGING);
656
+ }
657
+ if constexpr (SPEC::HAS_OBSERVATION) {
658
+ ctx->staging_observation = wg::create_buffer(device, *ctx, (size_t)LAYOUT::OBSERVATION_WORDS * sizeof(uint32_t), STAGING);
659
+ }
660
+ #if !RL_TOOLS_RENDERING_RAYTRACING_DISABLE_PROBE_RAYS
661
+ ctx->staging_collision = wg::create_buffer(device, *ctx, (size_t)LAYOUT::COLLISION_WORDS * sizeof(uint32_t), STAGING);
662
+ #endif
663
+ if constexpr (SPEC::HAS_RGB) {
664
+ ctx->render_readbacks.push_back({&ctx->staging_frame_buffer, data(renderer.frame_buffer), decltype(renderer.frame_buffer)::SPEC::SIZE_BYTES});
665
+ }
666
+ if constexpr (SPEC::HAS_DEPTH) {
667
+ ctx->render_readbacks.push_back({&ctx->staging_depth, data(renderer.depth_buffer), decltype(renderer.depth_buffer)::SPEC::SIZE_BYTES});
668
+ }
669
+ if constexpr (SPEC::HAS_SEGMENTATION) {
670
+ ctx->render_readbacks.push_back({&ctx->staging_segmentation, data(renderer.segmentation_buffer), decltype(renderer.segmentation_buffer)::SPEC::SIZE_BYTES});
671
+ }
672
+ if constexpr (SPEC::HAS_NORMALS) {
673
+ ctx->render_readbacks.push_back({&ctx->staging_normals, data(renderer.normals_buffer), decltype(renderer.normals_buffer)::SPEC::SIZE_BYTES});
674
+ }
675
+ if constexpr (SPEC::HAS_FLOW) {
676
+ ctx->render_readbacks.push_back({&ctx->staging_flow, data(renderer.flow_buffer), decltype(renderer.flow_buffer)::SPEC::SIZE_BYTES});
677
+ ctx->render_readbacks.push_back({&ctx->staging_flow_status, data(renderer.flow_status_buffer), decltype(renderer.flow_status_buffer)::SPEC::SIZE_BYTES});
678
+ }
679
+ if constexpr (SPEC::HAS_FLOW_FORWARD) {
680
+ ctx->render_readbacks.push_back({&ctx->staging_flow_forward, data(renderer.flow_forward_buffer), decltype(renderer.flow_forward_buffer)::SPEC::SIZE_BYTES});
681
+ ctx->render_readbacks.push_back({&ctx->staging_flow_forward_status, data(renderer.flow_forward_status_buffer), decltype(renderer.flow_forward_status_buffer)::SPEC::SIZE_BYTES});
682
+ }
683
+ if constexpr (SPEC::HAS_OBSERVATION) {
684
+ ctx->render_readbacks.push_back({&ctx->staging_observation, data(renderer.observation), decltype(renderer.observation)::SPEC::SIZE_BYTES});
685
+ }
686
+ #if !RL_TOOLS_RENDERING_RAYTRACING_DISABLE_PROBE_RAYS
687
+ ctx->probe_readbacks.push_back({&ctx->staging_collision, data(renderer.collision_results), decltype(renderer.collision_results)::SPEC::SIZE_BYTES});
688
+ #endif
689
+ rendering::raytracing::detail::announce_backend(device, renderer);
690
+ }
691
+
692
+ template <typename DEVICE, typename SPEC, typename METADATA_T>
693
+ void init(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Webgpu>& renderer, const rendering::raytracing::Scene& scene, const rendering::raytracing::AssetPool& pool, const rendering::SceneMetadata<METADATA_T>& metadata){
694
+ validate_semantic_segmentation<SPEC>(device, scene, pool);
695
+ renderer.max_ray_length = (typename SPEC::T)metadata.max_ray_length;
696
+ rendering::raytracing::detail::announce_configuration<SPEC>(device);
697
+ rendering::raytracing::detail::resolve_environment<SPEC>(scene.environment, renderer.ambient_color, renderer.miss_color_0, renderer.miss_color_1);
698
+ namespace wg = rendering::raytracing::backends::webgpu;
699
+ namespace generic = rendering::raytracing::backends::generic;
700
+ using TI = typename SPEC::TI;
701
+ auto& ctx = wg::context(renderer);
702
+
703
+
704
+ std::vector<const rendering::raytracing::Object*> all_objects;
705
+ for(const auto& object : scene.objects){
706
+ all_objects.push_back(&object);
707
+ }
708
+ if constexpr (SPEC::ENABLE_OVERLAYS){
709
+ rendering::raytracing::detail::register_pool_assets(device, renderer, pool, all_objects);
710
+ }
711
+ log(device, device.logger, devices::logging::Verbosity::debug, rendering::raytracing::LOG_PREFIX, "building ", all_objects.size(), " objects / ", scene.instances.size(), " instances ...");
712
+
713
+ wg::wait_in_flight(device, ctx);
714
+ wg::destroy_scene_resources(ctx);
715
+
716
+ // both builders are deterministic; median is the shared generic baseline for A/B and
717
+ // debugging, sah the default (the overlay TLAS rebuilds always use the generic builder)
718
+ const char* bvh_builder_env = std::getenv("RL_TOOLS_WEBGPU_BVH");
719
+ const bool median_builder = bvh_builder_env != nullptr && std::strcmp(bvh_builder_env, "median") == 0;
720
+ log(device, device.logger, devices::logging::Verbosity::debug, rendering::raytracing::LOG_PREFIX, "WebGPU BVH builder: ", (median_builder ? "median (baseline)" : "sah"));
721
+ const auto build_bvh = [&](wg::BVHNode* build_nodes, uint32_t* build_primitives, uint32_t* build_temp, const float* build_bounds_min, const float* build_bounds_max, const float* build_centroids, uint32_t build_count) -> uint32_t {
722
+ if(median_builder){
723
+ return generic::build_bvh_nodes(build_nodes, build_primitives, build_temp, build_bounds_min, build_bounds_max, build_centroids, build_count);
724
+ }
725
+ return wg::build_bvh_nodes_sah(build_nodes, build_primitives, build_temp, build_bounds_min, build_bounds_max, build_centroids, build_count);
726
+ };
727
+
728
+ // meshes flattened across all objects (scene objects then pool objects); the global
729
+ // triangle numbering ties the BLAS leaf permutations to the shading tables
730
+ std::vector<const rendering::raytracing::Mesh*> all_meshes;
731
+ std::vector<uint32_t> object_first_triangle;
732
+ std::vector<uint32_t> object_triangle_count;
733
+ std::vector<uint32_t> triangle_mesh;
734
+ std::vector<uint32_t> triangle_local;
735
+ ctx.object_classes.assign(all_objects.size(), 0);
736
+ for(size_t object_i = 0; object_i < all_objects.size(); object_i++){
737
+ ctx.object_classes[object_i] = all_objects[object_i]->segmentation_class;
738
+ object_first_triangle.push_back((uint32_t)triangle_mesh.size());
739
+ for(const auto& mesh : all_objects[object_i]->meshes){
740
+ const uint32_t mesh_i = (uint32_t)all_meshes.size();
741
+ all_meshes.push_back(&mesh);
742
+ const uint32_t mesh_triangles = (uint32_t)(mesh.indices.size() / 3);
743
+ for(uint32_t triangle = 0; triangle < mesh_triangles; triangle++){
744
+ triangle_mesh.push_back(mesh_i);
745
+ triangle_local.push_back(triangle);
746
+ }
747
+ }
748
+ object_triangle_count.push_back((uint32_t)triangle_mesh.size() - object_first_triangle.back());
749
+ }
750
+ const size_t num_meshes = all_meshes.size();
751
+ const size_t num_triangles = triangle_mesh.size();
752
+
753
+ std::vector<float> triangle_bounds_min(num_triangles > 0 ? 3 * num_triangles : 1);
754
+ std::vector<float> triangle_bounds_max(num_triangles > 0 ? 3 * num_triangles : 1);
755
+ std::vector<float> centroids(num_triangles > 0 ? 3 * num_triangles : 1);
756
+ for(size_t triangle = 0; triangle < num_triangles; triangle++){
757
+ const auto& mesh = *all_meshes[triangle_mesh[triangle]];
758
+ const int* index = &mesh.indices[3 * (size_t)triangle_local[triangle]];
759
+ float bounds_min[3] = {1e30f, 1e30f, 1e30f};
760
+ float bounds_max[3] = {-1e30f, -1e30f, -1e30f};
761
+ for(int vertex_i = 0; vertex_i < 3; vertex_i++){
762
+ const float* vertex = &mesh.vertices[3 * (size_t)index[vertex_i]];
763
+ for(int axis = 0; axis < 3; axis++){
764
+ bounds_min[axis] = bounds_min[axis] < vertex[axis] ? bounds_min[axis] : vertex[axis];
765
+ bounds_max[axis] = bounds_max[axis] > vertex[axis] ? bounds_max[axis] : vertex[axis];
766
+ }
767
+ }
768
+ for(int axis = 0; axis < 3; axis++){
769
+ triangle_bounds_min[3 * triangle + axis] = bounds_min[axis];
770
+ triangle_bounds_max[3 * triangle + axis] = bounds_max[axis];
771
+ centroids[3 * triangle + axis] = (bounds_min[axis] + bounds_max[axis]) * 0.5f;
772
+ }
773
+ }
774
+
775
+ // per-object BLAS slices at 2 * first_triangle, same arrangement as the generic backend
776
+ std::vector<wg::BVHNode> blas_nodes(num_triangles > 0 ? 2 * num_triangles : 1);
777
+ std::vector<uint32_t> blas_primitives(num_triangles > 0 ? num_triangles : 1);
778
+ std::vector<uint32_t> temp_primitives(blas_primitives.size());
779
+ ctx.object_node_offset.assign(all_objects.size(), 0);
780
+ ctx.object_node_count.assign(all_objects.size(), 0);
781
+ ctx.object_primitive_offset.assign(all_objects.size(), 0);
782
+ ctx.object_root_bounds_min.assign(3 * all_objects.size() + 1, 0.0f);
783
+ ctx.object_root_bounds_max.assign(3 * all_objects.size() + 1, 0.0f);
784
+ for(size_t object_i = 0; object_i < all_objects.size(); object_i++){
785
+ const uint32_t first = object_first_triangle[object_i];
786
+ const uint32_t count = object_triangle_count[object_i];
787
+ for(uint32_t i = 0; i < count; i++){
788
+ blas_primitives[(size_t)first + i] = first + i;
789
+ }
790
+ const uint32_t num_nodes = build_bvh(blas_nodes.data() + 2 * (size_t)first, blas_primitives.data() + first, temp_primitives.data(), triangle_bounds_min.data(), triangle_bounds_max.data(), centroids.data(), count);
791
+ utils::assert_exit(device, wg::bvh_max_depth(blas_nodes.data() + 2 * (size_t)first, num_nodes) <= wg::TRAVERSAL_STACK_SIZE, "WebGPU: BLAS depth exceeds the traversal stack");
792
+ ctx.object_node_offset[object_i] = 2 * first;
793
+ ctx.object_node_count[object_i] = num_nodes;
794
+ ctx.object_primitive_offset[object_i] = first;
795
+ if(num_nodes > 0){
796
+ const auto& root = blas_nodes[2 * (size_t)first];
797
+ for(int axis = 0; axis < 3; axis++){
798
+ ctx.object_root_bounds_min[3 * object_i + axis] = root.bounds_min[axis];
799
+ ctx.object_root_bounds_max[3 * object_i + axis] = root.bounds_max[axis];
800
+ }
801
+ }
802
+ }
803
+
804
+ // instance side tables: scene instances then the overlay slot pool, one extra overlay id
805
+ // range per dynamic-motion-blur sample (mirrors the Vulkan backend's shifted ids) and one
806
+ // for the flow previous instant, appended last (BufferLayout::FLOW_PREVIOUS_REGION)
807
+ const size_t num_scene_instances = scene.instances.size();
808
+ constexpr size_t num_overlay_slots = SPEC::ENABLE_OVERLAYS ? (size_t)SPEC::NUM_OVERLAYS * SPEC::MAX_OVERLAY_INSTANCES : 0;
809
+ constexpr size_t overlay_id_ranges = SPEC::ENABLE_OVERLAYS ? (size_t)wg::BufferLayout<SPEC>::OVERLAY_REGIONS : 1;
810
+ const size_t total_instances = num_scene_instances + num_overlay_slots * overlay_id_ranges;
811
+ ctx.num_scene_instances = (uint32_t)num_scene_instances;
812
+ ctx.total_instances = (uint32_t)total_instances;
813
+ ctx.instance_data_host.assign(total_instances > 0 ? total_instances : 1, wg::InstanceData{});
814
+ ctx.instance_classes_host.assign(total_instances > 0 ? total_instances : 1, 0);
815
+ for(size_t instance_i = 0; instance_i < num_scene_instances; instance_i++){
816
+ const auto& instance = scene.instances[instance_i];
817
+ float world[12];
818
+ for(int element = 0; element < 12; element++){
819
+ world[element] = instance.transform[element];
820
+ }
821
+ wg::fill_instance_entry(ctx, instance_i, (uint32_t)instance.object, world);
822
+ }
823
+
824
+ // scene TLAS over the shared-world instances; overlay slots live in their own TLASes
825
+ std::vector<wg::BVHNode> tlas_nodes(num_scene_instances > 0 ? 2 * num_scene_instances : 1);
826
+ std::vector<uint32_t> tlas_primitives(num_scene_instances > 0 ? num_scene_instances : 1);
827
+ uint32_t tlas_node_count;
828
+ {
829
+ std::vector<float> instance_bounds_min(num_scene_instances > 0 ? 3 * num_scene_instances : 1);
830
+ std::vector<float> instance_bounds_max(num_scene_instances > 0 ? 3 * num_scene_instances : 1);
831
+ std::vector<float> instance_centroids(num_scene_instances > 0 ? 3 * num_scene_instances : 1);
832
+ for(size_t instance_i = 0; instance_i < num_scene_instances; instance_i++){
833
+ const auto& entry = ctx.instance_data_host[instance_i];
834
+ float bounds_min[3], bounds_max[3];
835
+ wg::instance_world_bounds(ctx, entry.object, entry.object_to_world, entry.identity != 0, bounds_min, bounds_max);
836
+ for(int axis = 0; axis < 3; axis++){
837
+ instance_bounds_min[3 * instance_i + axis] = bounds_min[axis];
838
+ instance_bounds_max[3 * instance_i + axis] = bounds_max[axis];
839
+ instance_centroids[3 * instance_i + axis] = (bounds_min[axis] + bounds_max[axis]) * 0.5f;
840
+ }
841
+ tlas_primitives[instance_i] = (uint32_t)instance_i;
842
+ }
843
+ std::vector<uint32_t> tlas_temp(tlas_primitives.size());
844
+ tlas_node_count = build_bvh(tlas_nodes.data(), tlas_primitives.data(), tlas_temp.data(), instance_bounds_min.data(), instance_bounds_max.data(), instance_centroids.data(), (uint32_t)num_scene_instances);
845
+ utils::assert_exit(device, wg::bvh_max_depth(tlas_nodes.data(), tlas_node_count) <= wg::TRAVERSAL_STACK_SIZE, "WebGPU: TLAS depth exceeds the traversal stack");
846
+ }
847
+
848
+ // one packed u32 buffer for everything the shader addresses by element offset
849
+ std::vector<uint32_t> geometry;
850
+ auto append_section = [&](const void* section_data, size_t bytes) -> uint32_t {
851
+ const uint32_t offset = (uint32_t)geometry.size();
852
+ geometry.resize(geometry.size() + (bytes + 3) / 4);
853
+ if(bytes > 0){
854
+ std::memcpy(geometry.data() + offset, section_data, bytes);
855
+ }
856
+ geometry.resize((geometry.size() + 3) & ~(size_t)3);
857
+ return offset;
858
+ };
859
+ std::vector<wg::MeshRecord> mesh_records(num_meshes > 0 ? num_meshes : 1, wg::MeshRecord{});
860
+ std::vector<const rendering::raytracing::Texture*> texture_uploads;
861
+ size_t texture_texel_count = 0;
862
+ // content-deduplicated: meshes share maps, and the packed buffer must stay inside
863
+ // maxStorageBufferBindingSize (128MiB on lavapipe)
864
+ std::unordered_map<uint64_t, std::pair<wg::TextureRef, const rendering::raytracing::Texture*>> texture_cache;
865
+ auto add_texture = [&](const rendering::raytracing::Texture& texture) -> wg::TextureRef {
866
+ wg::TextureRef reference{wg::ABSENT, 0, 0};
867
+ if(!texture.present()){
868
+ return reference;
869
+ }
870
+ uint64_t hash = 0xcbf29ce484222325ull;
871
+ const auto mix = [&hash](const void* bytes, size_t count){
872
+ const auto* pointer = (const unsigned char*)bytes;
873
+ for(size_t byte_i = 0; byte_i < count; byte_i++){
874
+ hash ^= pointer[byte_i];
875
+ hash *= 0x100000001b3ull;
876
+ }
877
+ };
878
+ mix(&texture.width, sizeof(texture.width));
879
+ mix(&texture.height, sizeof(texture.height));
880
+ mix(texture.pixels->data(), texture.pixels->size());
881
+ const auto hit = texture_cache.find(hash);
882
+ if(hit != texture_cache.end() && *hit->second.second->pixels == *texture.pixels){
883
+ return hit->second.first;
884
+ }
885
+ reference.offset = (uint32_t)texture_texel_count;
886
+ reference.width = (uint32_t)texture.width;
887
+ reference.height = (uint32_t)texture.height;
888
+ texture_texel_count += texture.pixels->size() / 4;
889
+ texture_uploads.push_back(&texture);
890
+ texture_cache.emplace(hash, std::make_pair(reference, &texture));
891
+ return reference;
892
+ };
893
+ for(size_t mesh_i = 0; mesh_i < num_meshes; mesh_i++){
894
+ const auto& mesh = *all_meshes[mesh_i];
895
+ wg::MeshRecord& record = mesh_records[mesh_i];
896
+ record.vertex_offset = append_section(mesh.vertices.data(), mesh.vertices.size() * sizeof(float));
897
+ record.index_offset = append_section(mesh.indices.data(), mesh.indices.size() * sizeof(int));
898
+ record.tex_coord_offset = mesh.tex_coords.empty() ? wg::ABSENT : append_section(mesh.tex_coords.data(), mesh.tex_coords.size() * sizeof(float));
899
+ record.normal_offset = mesh.normals.empty() ? wg::ABSENT : append_section(mesh.normals.data(), mesh.normals.size() * sizeof(float));
900
+ record.texture = add_texture(mesh.texture);
901
+ record.normal_map = add_texture(mesh.normal_map);
902
+ record.metallic_roughness_map = add_texture(mesh.metallic_roughness_map);
903
+ record.emissive_map = add_texture(mesh.emissive_map);
904
+ record.occlusion_map = add_texture(mesh.occlusion_map);
905
+ record.color[0] = mesh.color[0];
906
+ record.color[1] = mesh.color[1];
907
+ record.color[2] = mesh.color[2];
908
+ record.metallic = mesh.metallic;
909
+ record.roughness = mesh.roughness;
910
+ record.opacity = mesh.opacity;
911
+ record.emissive[0] = mesh.emissive[0];
912
+ record.emissive[1] = mesh.emissive[1];
913
+ record.emissive[2] = mesh.emissive[2];
914
+ record.alpha_cutoff = mesh.alpha_cutoff;
915
+ record.alpha_mode = mesh.alpha_mode;
916
+ record.unlit = mesh.unlit;
917
+ }
918
+ const uint32_t triangle_mesh_offset = append_section(triangle_mesh.data(), triangle_mesh.size() * sizeof(uint32_t));
919
+ const uint32_t triangle_local_offset = append_section(triangle_local.data(), triangle_local.size() * sizeof(uint32_t));
920
+ const uint32_t tlas_primitive_offset = append_section(tlas_primitives.data(), tlas_primitives.size() * sizeof(uint32_t));
921
+ std::vector<uint32_t> object_records(4 * (all_objects.size() > 0 ? all_objects.size() : 1), 0);
922
+ for(size_t object_i = 0; object_i < all_objects.size(); object_i++){
923
+ object_records[4 * object_i + 0] = ctx.object_node_offset[object_i];
924
+ object_records[4 * object_i + 1] = ctx.object_node_count[object_i];
925
+ object_records[4 * object_i + 2] = ctx.object_primitive_offset[object_i];
926
+ }
927
+ const uint32_t object_records_offset = append_section(object_records.data(), object_records.size() * sizeof(uint32_t));
928
+ // sRGB texel decode table: replaces the per-texel pow in the shader's bilinear filter
929
+ // (unpack4x8unorm yields exact k/255 values, so the lookup is exact)
930
+ float srgb_lut[256];
931
+ for(int value = 0; value < 256; value++){
932
+ const float x = (float)value / 255.0f;
933
+ srgb_lut[value] = x <= 0.04045f ? x / 12.92f : std::pow((x + 0.055f) / 1.055f, 2.4f);
934
+ }
935
+ const uint32_t srgb_lut_offset = append_section(srgb_lut, sizeof(srgb_lut));
936
+ const uint32_t mesh_records_offset = append_section(mesh_records.data(), mesh_records.size() * sizeof(wg::MeshRecord));
937
+ const auto scene_lights = rendering::raytracing::detail::effective_scene_lights<SPEC::HAS_RGB && SPEC::SHADING::PBR_SHADING>(device, scene);
938
+ const uint32_t scene_lights_offset = append_section(scene_lights.data(), scene_lights.size() * sizeof(rendering::raytracing::SceneLight));
939
+ ctx.instance_classes_offset = append_section(ctx.instance_classes_host.data(), ctx.instance_classes_host.size() * sizeof(uint32_t));
940
+
941
+ // leaf-ordered packed triangles: the BLAS leaf ranges index this stream directly (slot =
942
+ // first_triangle + leaf-relative index), so the hot intersection loop reads 3 contiguous
943
+ // vec4s instead of chasing triangle table -> mesh record -> index -> vertex indirections;
944
+ // the original global triangle id rides in the first w component for the shading tables
945
+ std::vector<float> packed_triangles(12 * (num_triangles > 0 ? num_triangles : 1), 0.0f);
946
+ for(size_t slot = 0; slot < num_triangles; slot++){
947
+ const uint32_t triangle = blas_primitives[slot];
948
+ const auto& mesh = *all_meshes[triangle_mesh[triangle]];
949
+ const int* index = &mesh.indices[3 * (size_t)triangle_local[triangle]];
950
+ for(int vertex_i = 0; vertex_i < 3; vertex_i++){
951
+ const float* vertex = &mesh.vertices[3 * (size_t)index[vertex_i]];
952
+ float* out = &packed_triangles[12 * slot + 4 * (size_t)vertex_i];
953
+ out[0] = vertex[0];
954
+ out[1] = vertex[1];
955
+ out[2] = vertex[2];
956
+ }
957
+ std::memcpy(&packed_triangles[12 * slot + 3], &triangle, sizeof(uint32_t));
958
+ }
959
+
960
+ const WGPUBufferUsage STORAGE_UPLOAD = WGPUBufferUsage_Storage | WGPUBufferUsage_CopyDst;
961
+ auto upload = [&](wg::BufferResource& resource, const void* upload_data, size_t bytes){
962
+ resource = wg::create_buffer(device, ctx, bytes, STORAGE_UPLOAD);
963
+ if(bytes > 0){
964
+ wgpuQueueWriteBuffer(ctx.queue, resource.buffer, 0, upload_data, bytes);
965
+ }
966
+ };
967
+ upload(ctx.scene_geometry, geometry.data(), geometry.size() * sizeof(uint32_t));
968
+ ctx.texture_data = wg::create_buffer(device, ctx, texture_texel_count * sizeof(uint32_t), STORAGE_UPLOAD);
969
+ size_t texture_byte_offset = 0;
970
+ for(const auto* texture : texture_uploads){
971
+ const size_t bytes = texture->pixels->size() / 4 * sizeof(uint32_t);
972
+ wgpuQueueWriteBuffer(ctx.queue, ctx.texture_data.buffer, texture_byte_offset, texture->pixels->data(), bytes);
973
+ texture_byte_offset += bytes;
974
+ }
975
+ upload(ctx.triangles, packed_triangles.data(), packed_triangles.size() * sizeof(float));
976
+
977
+ constexpr size_t regions = SPEC::ENABLE_OVERLAYS ? overlay_id_ranges : 1;
978
+ const size_t region_overlays = regions * (SPEC::ENABLE_OVERLAYS ? SPEC::NUM_OVERLAYS : 1);
979
+ ctx.overlay_nodes_host.assign(region_overlays * 2 * (SPEC::ENABLE_OVERLAYS ? SPEC::MAX_OVERLAY_INSTANCES : 1), wg::BVHNode{});
980
+ ctx.overlay_primitives_host.assign(region_overlays * (SPEC::ENABLE_OVERLAYS ? SPEC::MAX_OVERLAY_INSTANCES : 1), 0);
981
+ ctx.overlay_meta_host.assign(region_overlays * 2, 0);
982
+ ctx.overlay_bounds_min.assign(3 * (total_instances > 0 ? total_instances : 1), 0.0f);
983
+ ctx.overlay_bounds_max.assign(3 * (total_instances > 0 ? total_instances : 1), 0.0f);
984
+ ctx.overlay_centroids.assign(3 * (total_instances > 0 ? total_instances : 1), 0.0f);
985
+ ctx.overlay_temp_primitives.assign(SPEC::ENABLE_OVERLAYS ? SPEC::MAX_OVERLAY_INSTANCES : 1, 0);
986
+
987
+ {
988
+ using LAYOUT = wg::BufferLayout<SPEC>;
989
+ const uint32_t tlas_node_offset = (uint32_t)blas_nodes.size();
990
+ ctx.overlay_node_offset = tlas_node_offset + (uint32_t)tlas_nodes.size();
991
+ const size_t node_count = ctx.overlay_node_offset + (SPEC::ENABLE_OVERLAYS ? ctx.overlay_nodes_host.size() : 0);
992
+ ctx.bvh_nodes = wg::create_buffer(device, ctx, node_count * sizeof(wg::BVHNode), STORAGE_UPLOAD);
993
+ wgpuQueueWriteBuffer(ctx.queue, ctx.bvh_nodes.buffer, 0, blas_nodes.data(), blas_nodes.size() * sizeof(wg::BVHNode));
994
+ wgpuQueueWriteBuffer(ctx.queue, ctx.bvh_nodes.buffer, (uint64_t)tlas_node_offset * sizeof(wg::BVHNode), tlas_nodes.data(), tlas_nodes.size() * sizeof(wg::BVHNode));
995
+ if constexpr (SPEC::ENABLE_OVERLAYS){
996
+ wgpuQueueWriteBuffer(ctx.queue, ctx.bvh_nodes.buffer, (uint64_t)ctx.overlay_node_offset * sizeof(wg::BVHNode), ctx.overlay_nodes_host.data(), ctx.overlay_nodes_host.size() * sizeof(wg::BVHNode));
997
+ }
998
+
999
+ wg::LaunchParams params{};
1000
+ params.fb_width = SPEC::FB_WIDTH;
1001
+ params.fb_height = SPEC::FB_HEIGHT;
1002
+ params.cam_width = SPEC::CAM_WIDTH;
1003
+ params.cam_height = SPEC::CAM_HEIGHT;
1004
+ params.grid_cols = SPEC::GRID_COLS;
1005
+ params.num_cameras = SPEC::NUM_CAMERAS;
1006
+ params.num_probes = SPEC::NUM_PROBES;
1007
+ params.num_scene_lights = (uint32_t)scene_lights.size();
1008
+ params.max_dist = renderer.max_ray_length;
1009
+ for(int component = 0; component < 3; component++){
1010
+ params.ambient_color[component] = (float)renderer.ambient_color[component];
1011
+ params.miss_color_0[component] = (float)renderer.miss_color_0[component];
1012
+ params.miss_color_1[component] = (float)renderer.miss_color_1[component];
1013
+ }
1014
+ params.first_overlay_instance = (uint32_t)num_scene_instances;
1015
+ params.num_overlay_slots = (uint32_t)num_overlay_slots;
1016
+ params.triangle_mesh_offset = triangle_mesh_offset;
1017
+ params.triangle_local_offset = triangle_local_offset;
1018
+ params.object_records_offset = object_records_offset;
1019
+ params.tlas_node_offset = tlas_node_offset;
1020
+ params.tlas_node_count = tlas_node_count;
1021
+ params.tlas_primitive_offset = tlas_primitive_offset;
1022
+ params.srgb_lut_offset = srgb_lut_offset;
1023
+ params.mesh_records_offset = mesh_records_offset;
1024
+ params.scene_lights_offset = scene_lights_offset;
1025
+ params.instance_classes_offset = ctx.instance_classes_offset;
1026
+ params.overlay_node_offset = ctx.overlay_node_offset;
1027
+ params.attachments_offset = LAYOUT::ATTACHMENTS_OFFSET;
1028
+ params.overlay_meta_offset = LAYOUT::OVERLAY_META_OFFSET;
1029
+ params.overlay_primitives_offset = LAYOUT::OVERLAY_PRIMITIVES_OFFSET;
1030
+ params.flow_deltas_offset = LAYOUT::FLOW_DELTAS_OFFSET;
1031
+ params.probe_directions_offset = LAYOUT::PROBE_DIRECTIONS_OFFSET;
1032
+ params.cameras_offset = LAYOUT::CAMERAS_OFFSET;
1033
+ params.cameras_previous_offset = LAYOUT::CAMERAS_PREVIOUS_OFFSET;
1034
+ params.out_frame_buffer = LAYOUT::FRAME_BUFFER_OFFSET;
1035
+ params.out_depth = LAYOUT::DEPTH_OFFSET;
1036
+ params.out_segmentation = LAYOUT::SEGMENTATION_OFFSET;
1037
+ params.out_normals = LAYOUT::NORMALS_OFFSET;
1038
+ params.out_flow = LAYOUT::FLOW_OFFSET;
1039
+ params.out_flow_status = LAYOUT::FLOW_STATUS_OFFSET;
1040
+ params.out_flow_forward = LAYOUT::FLOW_FORWARD_OFFSET;
1041
+ params.out_flow_forward_status = LAYOUT::FLOW_FORWARD_STATUS_OFFSET;
1042
+ params.out_observation = LAYOUT::OBSERVATION_OFFSET;
1043
+ params.out_collision = LAYOUT::COLLISION_OFFSET;
1044
+ wgpuQueueWriteBuffer(ctx.queue, ctx.launch_params.buffer, 0, &params, sizeof(params));
1045
+ }
1046
+ upload(ctx.instance_data, ctx.instance_data_host.data(), ctx.instance_data_host.size() * sizeof(wg::InstanceData));
1047
+
1048
+ if constexpr (SPEC::ENABLE_OVERLAYS){
1049
+ using LAYOUT = wg::BufferLayout<SPEC>;
1050
+ wgpuQueueWriteBuffer(ctx.queue, ctx.frame_inputs.buffer, (uint64_t)LAYOUT::OVERLAY_META_OFFSET * sizeof(uint32_t), ctx.overlay_meta_host.data(), ctx.overlay_meta_host.size() * sizeof(uint32_t));
1051
+ wgpuQueueWriteBuffer(ctx.queue, ctx.frame_inputs.buffer, (uint64_t)LAYOUT::OVERLAY_PRIMITIVES_OFFSET * sizeof(uint32_t), ctx.overlay_primitives_host.data(), ctx.overlay_primitives_host.size() * sizeof(uint32_t));
1052
+ std::vector<uint32_t> attachments((size_t)LAYOUT::ATTACHMENTS_WORDS, wg::ABSENT);
1053
+ wgpuQueueWriteBuffer(ctx.queue, ctx.frame_inputs.buffer, (uint64_t)LAYOUT::ATTACHMENTS_OFFSET * sizeof(uint32_t), attachments.data(), attachments.size() * sizeof(uint32_t));
1054
+ rendering::raytracing::detail::reset_overlay_state(renderer);
1055
+ }
1056
+
1057
+ {
1058
+ WGPUBindGroupEntry entries[wg::bindings::COUNT]{};
1059
+ auto set_entry = [&](uint32_t binding, wg::BufferResource& resource){
1060
+ entries[binding].binding = binding;
1061
+ entries[binding].buffer = resource.buffer;
1062
+ entries[binding].offset = 0;
1063
+ entries[binding].size = WGPU_WHOLE_SIZE;
1064
+ };
1065
+ set_entry(wg::bindings::LAUNCH_PARAMS, ctx.launch_params);
1066
+ set_entry(wg::bindings::SCENE_GEOMETRY, ctx.scene_geometry);
1067
+ set_entry(wg::bindings::TEXTURE_DATA, ctx.texture_data);
1068
+ set_entry(wg::bindings::BVH_NODES, ctx.bvh_nodes);
1069
+ set_entry(wg::bindings::TRIANGLES, ctx.triangles);
1070
+ set_entry(wg::bindings::INSTANCE_DATA, ctx.instance_data);
1071
+ set_entry(wg::bindings::FRAME_INPUTS, ctx.frame_inputs);
1072
+ set_entry(wg::bindings::OUTPUTS, ctx.outputs);
1073
+ WGPUBindGroupDescriptor descriptor{};
1074
+ descriptor.layout = ctx.bind_group_layout;
1075
+ descriptor.entryCount = wg::bindings::COUNT;
1076
+ descriptor.entries = entries;
1077
+ ctx.bind_group = wgpuDeviceCreateBindGroup(ctx.device, &descriptor);
1078
+ utils::assert_exit(device, ctx.bind_group != nullptr, "WebGPU: bind group creation failed");
1079
+ }
1080
+
1081
+ if constexpr (SPEC::ENABLE_OVERLAYS){
1082
+ update(device, renderer); // publish the (empty) overlays and the attachment table
1083
+ }
1084
+ }
1085
+
1086
+
1087
+ template <typename DEVICE, typename SPEC>
1088
+ void update_launch(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Webgpu>& renderer){
1089
+ static_assert(SPEC::ENABLE_OVERLAYS, "update requires an overlay-enabled renderer specification");
1090
+ namespace wg = rendering::raytracing::backends::webgpu;
1091
+ using TI = typename SPEC::TI;
1092
+ auto& ctx = wg::context(renderer);
1093
+
1094
+ using LAYOUT = wg::BufferLayout<SPEC>;
1095
+ rendering::raytracing::detail::publish_overlay_transforms(renderer);
1096
+
1097
+ // rebuilt unconditionally: producers may write the transforms tensors directly, which
1098
+ // leaves no host-observable pending row. queueWriteBuffer is ordered before subsequent
1099
+ // submits, so no synchronization with in-flight renders is needed
1100
+ wg::rebuild_overlay_region(device, renderer, ctx, 0, data(renderer.transforms));
1101
+ if constexpr (SPEC::ENABLE_DYNAMIC_MOTION_BLUR){
1102
+ constexpr size_t SLAB = (size_t)SPEC::NUM_OVERLAYS * SPEC::MAX_OVERLAY_INSTANCES * 12;
1103
+ for(TI sample = 0; sample < SPEC::MOTION_BLUR_SAMPLES; sample++){
1104
+ wg::rebuild_overlay_region(device, renderer, ctx, 1 + (uint32_t)sample, data(renderer.transforms_motion) + sample * SLAB);
1105
+ }
1106
+ }
1107
+ if constexpr (SPEC::HAS_FLOW_OVERLAYS){
1108
+ // the previous instant's BVH region from transforms_previous, plus the per-slot delta
1109
+ // table between the instants
1110
+ wg::rebuild_overlay_region(device, renderer, ctx, LAYOUT::FLOW_PREVIOUS_REGION, data(renderer.transforms_previous));
1111
+ ctx.flow_deltas_host.resize(LAYOUT::FLOW_DELTAS_WORDS);
1112
+ rendering::raytracing::detail::compose_flow_deltas(renderer, data(renderer.transforms), data(renderer.transforms_previous), ctx.flow_deltas_host.data());
1113
+ wgpuQueueWriteBuffer(ctx.queue, ctx.frame_inputs.buffer, (uint64_t)LAYOUT::FLOW_DELTAS_OFFSET * sizeof(uint32_t), ctx.flow_deltas_host.data(), ctx.flow_deltas_host.size() * sizeof(float));
1114
+ }
1115
+ if(renderer.attachments_dirty){
1116
+ std::vector<uint32_t> attachments((size_t)SPEC::NUM_CAMERAS * SPEC::MAX_OVERLAYS_PER_CAMERA);
1117
+ for(size_t index = 0; index < attachments.size(); index++){
1118
+ attachments[index] = (uint32_t)renderer.attachments[index];
1119
+ }
1120
+ wgpuQueueWriteBuffer(ctx.queue, ctx.frame_inputs.buffer, (uint64_t)LAYOUT::ATTACHMENTS_OFFSET * sizeof(uint32_t), attachments.data(), attachments.size() * sizeof(uint32_t));
1121
+ renderer.attachments_dirty = false;
1122
+ }
1123
+ const size_t overlay_tail = (size_t)ctx.total_instances - ctx.num_scene_instances;
1124
+ if(overlay_tail > 0){
1125
+ wgpuQueueWriteBuffer(ctx.queue, ctx.instance_data.buffer, (uint64_t)ctx.num_scene_instances * sizeof(wg::InstanceData), ctx.instance_data_host.data() + ctx.num_scene_instances, overlay_tail * sizeof(wg::InstanceData));
1126
+ wgpuQueueWriteBuffer(ctx.queue, ctx.scene_geometry.buffer, (uint64_t)(ctx.instance_classes_offset + ctx.num_scene_instances) * sizeof(uint32_t), ctx.instance_classes_host.data() + ctx.num_scene_instances, overlay_tail * sizeof(uint32_t));
1127
+ }
1128
+ wgpuQueueWriteBuffer(ctx.queue, ctx.bvh_nodes.buffer, (uint64_t)ctx.overlay_node_offset * sizeof(wg::BVHNode), ctx.overlay_nodes_host.data(), ctx.overlay_nodes_host.size() * sizeof(wg::BVHNode));
1129
+ wgpuQueueWriteBuffer(ctx.queue, ctx.frame_inputs.buffer, (uint64_t)LAYOUT::OVERLAY_PRIMITIVES_OFFSET * sizeof(uint32_t), ctx.overlay_primitives_host.data(), ctx.overlay_primitives_host.size() * sizeof(uint32_t));
1130
+ wgpuQueueWriteBuffer(ctx.queue, ctx.frame_inputs.buffer, (uint64_t)LAYOUT::OVERLAY_META_OFFSET * sizeof(uint32_t), ctx.overlay_meta_host.data(), ctx.overlay_meta_host.size() * sizeof(uint32_t));
1131
+ }
1132
+
1133
+ template <typename DEVICE, typename SPEC>
1134
+ void update_sync(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Webgpu>& renderer){
1135
+ static_assert(SPEC::ENABLE_OVERLAYS, "update requires an overlay-enabled renderer specification");
1136
+ }
1137
+
1138
+ // the previous instant becomes the current one: the inputs are host tensors uploaded at
1139
+ // launch time, so plain copies; rows the host has not yet published reach
1140
+ // transforms_previous through their staging mirror at the next update
1141
+ template <typename DEVICE, typename SPEC>
1142
+ void advance_flow_launch(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Webgpu>& renderer){
1143
+ static_assert(SPEC::HAS_FLOW, "advance_flow requires a flow-capable renderer specification");
1144
+ std::memcpy(data(renderer.cameras_previous), data(renderer.cameras), decltype(renderer.cameras)::SPEC::SIZE_BYTES);
1145
+ if constexpr (SPEC::HAS_FLOW_OVERLAYS){
1146
+ rendering::raytracing::detail::advance_flow_staging(renderer);
1147
+ std::memcpy(data(renderer.transforms_previous), data(renderer.transforms), decltype(renderer.transforms)::SPEC::SIZE_BYTES);
1148
+ }
1149
+ }
1150
+
1151
+ template <typename DEVICE, typename SPEC>
1152
+ void advance_flow_sync(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Webgpu>& renderer){
1153
+ static_assert(SPEC::HAS_FLOW, "advance_flow requires a flow-capable renderer specification");
1154
+ }
1155
+
1156
+ template <typename DEVICE, typename SPEC>
1157
+ void advance_flow(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Webgpu>& renderer){
1158
+ advance_flow_launch(device, renderer);
1159
+ advance_flow_sync(device, renderer);
1160
+ }
1161
+
1162
+ template <typename DEVICE, typename SPEC>
1163
+ void update(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Webgpu>& renderer){
1164
+ update_launch(device, renderer);
1165
+ update_sync(device, renderer);
1166
+ }
1167
+
1168
+
1169
+ // renderer memory-domain copies: the in-flight wait settles the staging readbacks into the
1170
+ // host-resident tensors, so the transfer delegates to the host-device tensor copy
1171
+ template <typename TO_DEVICE, typename FROM_SPEC, typename TO_SPEC>
1172
+ void copy(rendering::raytracing::backends::Device<rendering::raytracing::backends::Webgpu>& from_device, TO_DEVICE& to_device, const Tensor<FROM_SPEC>& from, Tensor<TO_SPEC>& to){
1173
+ rendering::raytracing::backends::webgpu::wait_in_flight(to_device, *from_device.context);
1174
+ copy(to_device, to_device, from, to);
1175
+ }
1176
+ template <typename FROM_DEVICE, typename FROM_SPEC, typename TO_SPEC>
1177
+ void copy(FROM_DEVICE& from_device, rendering::raytracing::backends::Device<rendering::raytracing::backends::Webgpu>& to_device, const Tensor<FROM_SPEC>& from, Tensor<TO_SPEC>& to){
1178
+ rendering::raytracing::backends::webgpu::wait_in_flight(from_device, *to_device.context);
1179
+ copy(from_device, from_device, from, to);
1180
+ }
1181
+
1182
+ template <typename DEVICE, typename SPEC>
1183
+ void generate_probe_directions(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Webgpu>& renderer){
1184
+ #if RL_TOOLS_RENDERING_RAYTRACING_DISABLE_PROBE_RAYS
1185
+ log(device, device.logger, devices::logging::Verbosity::info, rendering::raytracing::LOG_PREFIX, "Probe rays disabled (RL_TOOLS_RENDERING_RAYTRACING_DISABLE_PROBE_RAYS=1)");
1186
+ return;
1187
+ #else
1188
+ namespace wg = rendering::raytracing::backends::webgpu;
1189
+ auto& ctx = wg::context(renderer);
1190
+ std::vector<float> directions = rendering::raytracing::detail::generate_probe_direction_vectors<SPEC>(device);
1191
+ wgpuQueueWriteBuffer(ctx.queue, ctx.frame_inputs.buffer, (uint64_t)wg::BufferLayout<SPEC>::PROBE_DIRECTIONS_OFFSET * sizeof(uint32_t), directions.data(), directions.size() * sizeof(float));
1192
+ #endif
1193
+ }
1194
+
1195
+ template <typename DEVICE, typename SPEC>
1196
+ void render_launch(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Webgpu>& renderer){
1197
+ namespace wg = rendering::raytracing::backends::webgpu;
1198
+ using TI = typename SPEC::TI;
1199
+ auto& ctx = wg::context(renderer);
1200
+ render_sync(device, renderer); // single-buffered: settle a previous launch before reusing the staging buffers
1201
+
1202
+ using LAYOUT = wg::BufferLayout<SPEC>;
1203
+ constexpr size_t camera_bytes = (size_t)SPEC::NUM_CAMERAS * sizeof(rendering::raytracing::Camera<typename SPEC::T>);
1204
+ wgpuQueueWriteBuffer(ctx.queue, ctx.frame_inputs.buffer, (uint64_t)LAYOUT::CAMERAS_OFFSET * sizeof(uint32_t), data(renderer.cameras), camera_bytes);
1205
+ if constexpr (SPEC::HAS_CAMERA_PAIR) {
1206
+ wgpuQueueWriteBuffer(ctx.queue, ctx.frame_inputs.buffer, (uint64_t)LAYOUT::CAMERAS_OFFSET * sizeof(uint32_t) + camera_bytes, data(renderer.cameras_open), camera_bytes);
1207
+ }
1208
+ if constexpr (SPEC::HAS_FLOW) {
1209
+ wgpuQueueWriteBuffer(ctx.queue, ctx.frame_inputs.buffer, (uint64_t)LAYOUT::CAMERAS_PREVIOUS_OFFSET * sizeof(uint32_t), data(renderer.cameras_previous), camera_bytes);
1210
+ }
1211
+
1212
+ constexpr uint32_t fb_groups_x = (SPEC::FB_WIDTH + wg::WORKGROUP_SIZE_X - 1) / wg::WORKGROUP_SIZE_X;
1213
+ constexpr uint32_t fb_groups_y = (SPEC::FB_HEIGHT + wg::WORKGROUP_SIZE_Y - 1) / wg::WORKGROUP_SIZE_Y;
1214
+ WGPUCommandEncoder encoder = wgpuDeviceCreateCommandEncoder(ctx.device, nullptr);
1215
+ {
1216
+ WGPUComputePassEncoder pass = wgpuCommandEncoderBeginComputePass(encoder, nullptr);
1217
+ wgpuComputePassEncoderSetBindGroup(pass, 0, ctx.bind_group, 0, nullptr);
1218
+ const auto dispatch = [&](WGPUComputePipeline pipeline){
1219
+ wgpuComputePassEncoderSetPipeline(pass, pipeline);
1220
+ wgpuComputePassEncoderDispatchWorkgroups(pass, fb_groups_x, fb_groups_y, 1);
1221
+ };
1222
+ if constexpr (SPEC::HAS_RGB){
1223
+ dispatch(ctx.rgb_pipeline);
1224
+ }
1225
+ if constexpr ((SPEC::HAS_DEPTH || SPEC::HAS_SEGMENTATION || SPEC::HAS_NORMALS || SPEC::HAS_FLOW) && !wg::FUSE_AUXILIARY<SPEC>){
1226
+ dispatch(ctx.auxiliary_pipeline);
1227
+ }
1228
+ if constexpr (SPEC::HAS_FLOW_FORWARD){
1229
+ dispatch(ctx.flow_forward_pipeline);
1230
+ }
1231
+ wgpuComputePassEncoderEnd(pass);
1232
+ wgpuComputePassEncoderRelease(pass);
1233
+ }
1234
+ if constexpr (SPEC::HAS_RGB){
1235
+ wgpuCommandEncoderCopyBufferToBuffer(encoder, ctx.outputs.buffer, (uint64_t)LAYOUT::FRAME_BUFFER_OFFSET * sizeof(uint32_t), ctx.staging_frame_buffer.buffer, 0, (uint64_t)LAYOUT::FRAME_BUFFER_WORDS * sizeof(uint32_t));
1236
+ }
1237
+ if constexpr (SPEC::HAS_DEPTH){
1238
+ wgpuCommandEncoderCopyBufferToBuffer(encoder, ctx.outputs.buffer, (uint64_t)LAYOUT::DEPTH_OFFSET * sizeof(uint32_t), ctx.staging_depth.buffer, 0, (uint64_t)LAYOUT::DEPTH_WORDS * sizeof(uint32_t));
1239
+ }
1240
+ if constexpr (SPEC::HAS_SEGMENTATION){
1241
+ wgpuCommandEncoderCopyBufferToBuffer(encoder, ctx.outputs.buffer, (uint64_t)LAYOUT::SEGMENTATION_OFFSET * sizeof(uint32_t), ctx.staging_segmentation.buffer, 0, (uint64_t)LAYOUT::SEGMENTATION_WORDS * sizeof(uint32_t));
1242
+ }
1243
+ if constexpr (SPEC::HAS_NORMALS){
1244
+ wgpuCommandEncoderCopyBufferToBuffer(encoder, ctx.outputs.buffer, (uint64_t)LAYOUT::NORMALS_OFFSET * sizeof(uint32_t), ctx.staging_normals.buffer, 0, (uint64_t)LAYOUT::NORMALS_WORDS * sizeof(uint32_t));
1245
+ }
1246
+ if constexpr (SPEC::HAS_FLOW){
1247
+ wgpuCommandEncoderCopyBufferToBuffer(encoder, ctx.outputs.buffer, (uint64_t)LAYOUT::FLOW_OFFSET * sizeof(uint32_t), ctx.staging_flow.buffer, 0, (uint64_t)LAYOUT::FLOW_WORDS * sizeof(uint32_t));
1248
+ wgpuCommandEncoderCopyBufferToBuffer(encoder, ctx.outputs.buffer, (uint64_t)LAYOUT::FLOW_STATUS_OFFSET * sizeof(uint32_t), ctx.staging_flow_status.buffer, 0, (uint64_t)LAYOUT::FLOW_STATUS_WORDS * sizeof(uint32_t));
1249
+ }
1250
+ if constexpr (SPEC::HAS_FLOW_FORWARD){
1251
+ wgpuCommandEncoderCopyBufferToBuffer(encoder, ctx.outputs.buffer, (uint64_t)LAYOUT::FLOW_FORWARD_OFFSET * sizeof(uint32_t), ctx.staging_flow_forward.buffer, 0, (uint64_t)LAYOUT::FLOW_FORWARD_WORDS * sizeof(uint32_t));
1252
+ wgpuCommandEncoderCopyBufferToBuffer(encoder, ctx.outputs.buffer, (uint64_t)LAYOUT::FLOW_FORWARD_STATUS_OFFSET * sizeof(uint32_t), ctx.staging_flow_forward_status.buffer, 0, (uint64_t)LAYOUT::FLOW_FORWARD_STATUS_WORDS * sizeof(uint32_t));
1253
+ }
1254
+ if constexpr (SPEC::HAS_OBSERVATION){
1255
+ wgpuCommandEncoderCopyBufferToBuffer(encoder, ctx.outputs.buffer, (uint64_t)LAYOUT::OBSERVATION_OFFSET * sizeof(uint32_t), ctx.staging_observation.buffer, 0, (uint64_t)LAYOUT::OBSERVATION_WORDS * sizeof(uint32_t));
1256
+ }
1257
+ WGPUCommandBuffer command_buffer = wgpuCommandEncoderFinish(encoder, nullptr);
1258
+ wgpuCommandEncoderRelease(encoder);
1259
+ wgpuQueueSubmit(ctx.queue, 1, &command_buffer);
1260
+ wgpuCommandBufferRelease(command_buffer);
1261
+ ctx.render_in_flight = true;
1262
+ }
1263
+
1264
+ template <typename DEVICE, typename SPEC>
1265
+ void render_sync(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Webgpu>& renderer){
1266
+ namespace wg = rendering::raytracing::backends::webgpu;
1267
+ wg::settle_render(device, wg::context(renderer));
1268
+ }
1269
+
1270
+ // render produces the image outputs the spec declares; the collision-probe pass is the
1271
+ // separate probe verb so it can be scheduled independently (e.g. alongside update)
1272
+ template <typename DEVICE, typename SPEC>
1273
+ void probe_launch(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Webgpu>& renderer){
1274
+ namespace wg = rendering::raytracing::backends::webgpu;
1275
+ auto& ctx = wg::context(renderer);
1276
+ if(ctx.collision_pipeline == nullptr){
1277
+ return;
1278
+ }
1279
+ probe_sync(device, renderer);
1280
+ constexpr size_t camera_bytes = (size_t)SPEC::NUM_CAMERAS * sizeof(rendering::raytracing::Camera<typename SPEC::T>);
1281
+ wgpuQueueWriteBuffer(ctx.queue, ctx.frame_inputs.buffer, (uint64_t)wg::BufferLayout<SPEC>::CAMERAS_OFFSET * sizeof(uint32_t), data(renderer.cameras), camera_bytes);
1282
+ WGPUCommandEncoder encoder = wgpuDeviceCreateCommandEncoder(ctx.device, nullptr);
1283
+ {
1284
+ WGPUComputePassEncoder pass = wgpuCommandEncoderBeginComputePass(encoder, nullptr);
1285
+ wgpuComputePassEncoderSetPipeline(pass, ctx.collision_pipeline);
1286
+ wgpuComputePassEncoderSetBindGroup(pass, 0, ctx.bind_group, 0, nullptr);
1287
+ wgpuComputePassEncoderDispatchWorkgroups(pass, (SPEC::NUM_CAMERAS + wg::WORKGROUP_SIZE_X - 1) / wg::WORKGROUP_SIZE_X, (SPEC::NUM_PROBES + wg::WORKGROUP_SIZE_Y - 1) / wg::WORKGROUP_SIZE_Y, 1);
1288
+ wgpuComputePassEncoderEnd(pass);
1289
+ wgpuComputePassEncoderRelease(pass);
1290
+ }
1291
+ wgpuCommandEncoderCopyBufferToBuffer(encoder, ctx.outputs.buffer, (uint64_t)wg::BufferLayout<SPEC>::COLLISION_OFFSET * sizeof(uint32_t), ctx.staging_collision.buffer, 0, (uint64_t)wg::BufferLayout<SPEC>::COLLISION_WORDS * sizeof(uint32_t));
1292
+ WGPUCommandBuffer command_buffer = wgpuCommandEncoderFinish(encoder, nullptr);
1293
+ wgpuCommandEncoderRelease(encoder);
1294
+ wgpuQueueSubmit(ctx.queue, 1, &command_buffer);
1295
+ wgpuCommandBufferRelease(command_buffer);
1296
+ ctx.collision_in_flight = true;
1297
+ }
1298
+
1299
+ template <typename DEVICE, typename SPEC>
1300
+ void probe_sync(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Webgpu>& renderer){
1301
+ namespace wg = rendering::raytracing::backends::webgpu;
1302
+ wg::settle_probe(device, wg::context(renderer));
1303
+ }
1304
+
1305
+ template <typename DEVICE, typename SPEC>
1306
+ std::string device_name(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Webgpu>& renderer){
1307
+ WGPUAdapterInfo info{};
1308
+ utils::assert_exit(device, wgpuAdapterGetInfo(renderer.backend->adapter, &info) == WGPUStatus_Success, "WebGPU: cannot query renderer device");
1309
+ const size_t length = info.device.data == nullptr ? 0 : (info.device.length == WGPU_STRLEN ? std::strlen(info.device.data) : info.device.length);
1310
+ const std::string name(info.device.data == nullptr ? "" : info.device.data, length);
1311
+ wgpuAdapterInfoFreeMembers(info);
1312
+ return name;
1313
+ }
1314
+
1315
+ template <typename DEVICE, typename SPEC>
1316
+ void synchronize(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Webgpu>& renderer){
1317
+ rendering::raytracing::backends::webgpu::wait_in_flight(device, rendering::raytracing::backends::webgpu::context(renderer));
1318
+ }
1319
+
1320
+ template <typename DEVICE, typename SPEC>
1321
+ void free(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Webgpu>& renderer){
1322
+ namespace wg = rendering::raytracing::backends::webgpu;
1323
+ if(renderer.backend != nullptr){
1324
+ auto& ctx = wg::context(renderer);
1325
+ wg::wait_in_flight(device, ctx);
1326
+ wg::destroy_scene_resources(ctx);
1327
+ wg::destroy_buffer(ctx.launch_params);
1328
+ wg::destroy_buffer(ctx.frame_inputs);
1329
+ wg::destroy_buffer(ctx.outputs);
1330
+ wg::destroy_buffer(ctx.staging_frame_buffer);
1331
+ wg::destroy_buffer(ctx.staging_depth);
1332
+ wg::destroy_buffer(ctx.staging_segmentation);
1333
+ wg::destroy_buffer(ctx.staging_normals);
1334
+ wg::destroy_buffer(ctx.staging_flow);
1335
+ wg::destroy_buffer(ctx.staging_flow_status);
1336
+ wg::destroy_buffer(ctx.staging_flow_forward);
1337
+ wg::destroy_buffer(ctx.staging_flow_forward_status);
1338
+ wg::destroy_buffer(ctx.staging_observation);
1339
+ wg::destroy_buffer(ctx.staging_collision);
1340
+ if(ctx.rgb_pipeline != nullptr){ wgpuComputePipelineRelease(ctx.rgb_pipeline); }
1341
+ if(ctx.auxiliary_pipeline != nullptr){
1342
+ wgpuComputePipelineRelease(ctx.auxiliary_pipeline);
1343
+ }
1344
+ if(ctx.collision_pipeline != nullptr){ wgpuComputePipelineRelease(ctx.collision_pipeline); }
1345
+ if(ctx.flow_forward_pipeline != nullptr){ wgpuComputePipelineRelease(ctx.flow_forward_pipeline); }
1346
+ if(ctx.pipeline_layout != nullptr){ wgpuPipelineLayoutRelease(ctx.pipeline_layout); }
1347
+ if(ctx.bind_group_layout != nullptr){ wgpuBindGroupLayoutRelease(ctx.bind_group_layout); }
1348
+ if(ctx.module != nullptr){ wgpuShaderModuleRelease(ctx.module); }
1349
+ if(ctx.queue != nullptr){ wgpuQueueRelease(ctx.queue); }
1350
+ if(ctx.device != nullptr){ wgpuDeviceRelease(ctx.device); }
1351
+ if(ctx.adapter != nullptr){ wgpuAdapterRelease(ctx.adapter); }
1352
+ if(ctx.instance != nullptr){ wgpuInstanceRelease(ctx.instance); }
1353
+ delete renderer.backend;
1354
+ renderer.backend = nullptr;
1355
+ renderer.device.context = nullptr;
1356
+ }
1357
+ free(device, renderer.cameras);
1358
+ if constexpr (SPEC::HAS_CAMERA_PAIR) {
1359
+ free(device, renderer.cameras_open);
1360
+ }
1361
+ if constexpr (SPEC::HAS_RGB) {
1362
+ free(device, renderer.frame_buffer);
1363
+ }
1364
+ if constexpr (SPEC::HAS_DEPTH) {
1365
+ free(device, renderer.depth_buffer);
1366
+ }
1367
+ if constexpr (SPEC::HAS_SEGMENTATION) {
1368
+ free(device, renderer.segmentation_buffer);
1369
+ }
1370
+ if constexpr (SPEC::HAS_NORMALS) {
1371
+ free(device, renderer.normals_buffer);
1372
+ }
1373
+ if constexpr (SPEC::HAS_FLOW) {
1374
+ free(device, renderer.cameras_previous);
1375
+ free(device, renderer.flow_buffer);
1376
+ free(device, renderer.flow_status_buffer);
1377
+ }
1378
+ if constexpr (SPEC::HAS_FLOW_FORWARD) {
1379
+ free(device, renderer.flow_forward_buffer);
1380
+ free(device, renderer.flow_forward_status_buffer);
1381
+ }
1382
+ if constexpr (SPEC::HAS_OBSERVATION) {
1383
+ free(device, renderer.observation);
1384
+ }
1385
+ if constexpr (SPEC::ENABLE_OVERLAYS) {
1386
+ free(device, renderer.transforms);
1387
+ }
1388
+ if constexpr (SPEC::HAS_FLOW_OVERLAYS) {
1389
+ free(device, renderer.transforms_previous);
1390
+ }
1391
+ if constexpr (SPEC::ENABLE_DYNAMIC_MOTION_BLUR) {
1392
+ free(device, renderer.transforms_motion);
1393
+ }
1394
+ #if !RL_TOOLS_RENDERING_RAYTRACING_DISABLE_PROBE_RAYS
1395
+ free(device, renderer.collision_results);
1396
+ #endif
1397
+ }
1398
+
1399
+ }
1400
+ RL_TOOLS_NAMESPACE_WRAPPER_END
1401
+
1402
+
1403
+ #include "../../operations_cpu_post.h"
1404
+
1405
+ #endif