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