hyperdrone 0.1.0__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 (660) hide show
  1. hyperdrone/__init__.py +28 -0
  2. hyperdrone/_native/cmake/hyperdrone_jit.cmake +43 -0
  3. hyperdrone/_native/common/bindings.h +39 -0
  4. hyperdrone/_native/common/cuda_staging.h +68 -0
  5. hyperdrone/_native/common/jit_host.h +69 -0
  6. hyperdrone/_native/dynamics/CMakeLists.txt +66 -0
  7. hyperdrone/_native/dynamics/host.cpp +191 -0
  8. hyperdrone/_native/dynamics/iface.h +81 -0
  9. hyperdrone/_native/dynamics/impl.cpp +659 -0
  10. hyperdrone/_native/render/CMakeLists.txt +96 -0
  11. hyperdrone/_native/render/host.cpp +276 -0
  12. hyperdrone/_native/render/iface.h +132 -0
  13. hyperdrone/_native/render/impl.cpp +620 -0
  14. hyperdrone/_native/render/scene_bindings.cpp +279 -0
  15. hyperdrone/_vendor/rl-tools/CMakeLists.txt +159 -0
  16. hyperdrone/_vendor/rl-tools/LICENSE +21 -0
  17. hyperdrone/_vendor/rl-tools/cmake/autodetect/all.cmake +14 -0
  18. hyperdrone/_vendor/rl-tools/cmake/autodetect/git-diff.cmake +103 -0
  19. hyperdrone/_vendor/rl-tools/cmake/autodetect/git-hash.cmake +13 -0
  20. hyperdrone/_vendor/rl-tools/cmake/autodetect/tier1-blas.cmake +43 -0
  21. hyperdrone/_vendor/rl-tools/cmake/autodetect/tier2-json-hdf5-zlib.cmake +84 -0
  22. hyperdrone/_vendor/rl-tools/cmake/autodetect/tier3-tensorboard.cmake +29 -0
  23. hyperdrone/_vendor/rl-tools/cmake/autodetect/tier4-cuda.cmake +33 -0
  24. hyperdrone/_vendor/rl-tools/cmake/autodetect/tier5-cli11.cmake +26 -0
  25. hyperdrone/_vendor/rl-tools/cmake/optional/assimp_fixup.cmake +16 -0
  26. hyperdrone/_vendor/rl-tools/cmake/optional/googletest.cmake +17 -0
  27. hyperdrone/_vendor/rl-tools/cmake/optional/metal.cmake +27 -0
  28. hyperdrone/_vendor/rl-tools/cmake/optional/mujoco.cmake +32 -0
  29. hyperdrone/_vendor/rl-tools/cmake/optional/optix.cmake +17 -0
  30. hyperdrone/_vendor/rl-tools/cmake/optional/raytracing_generic.cmake +4 -0
  31. hyperdrone/_vendor/rl-tools/cmake/optional/vulkan.cmake +6 -0
  32. hyperdrone/_vendor/rl-tools/cmake/scripts/embed_text.cmake +7 -0
  33. hyperdrone/_vendor/rl-tools/cmake/scripts/generate-git-snapshot.cmake +138 -0
  34. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/matrix.h +143 -0
  35. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_arm.h +33 -0
  36. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_cpu.h +314 -0
  37. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_cpu_accelerate.h +37 -0
  38. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_cpu_blas.h +67 -0
  39. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_cpu_mkl.h +38 -0
  40. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_cpu_openblas.h +34 -0
  41. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_cuda.h +289 -0
  42. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_dummy.h +20 -0
  43. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_esp32.h +29 -0
  44. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_generic.h +946 -0
  45. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/operations_wasm32.h +13 -0
  46. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/matrix/persist_code.h +136 -0
  47. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_arm.h +1 -0
  48. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_cpu.h +94 -0
  49. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_cpu_accelerate.h +25 -0
  50. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_cpu_blas.h +115 -0
  51. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_cpu_mkl.h +25 -0
  52. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_cpu_openblas.h +25 -0
  53. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_cuda.h +703 -0
  54. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/operations_generic.h +1334 -0
  55. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/persist_code.h +130 -0
  56. hyperdrone/_vendor/rl-tools/include/rl_tools/containers/tensor/tensor.h +490 -0
  57. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/arm.h +91 -0
  58. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cpu.h +205 -0
  59. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cpu_accelerate.h +23 -0
  60. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cpu_blas.h +21 -0
  61. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cpu_mkl.h +45 -0
  62. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cpu_openblas.h +56 -0
  63. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cpu_tensorboard.h +34 -0
  64. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/cuda.h +411 -0
  65. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/devices.h +92 -0
  66. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/dummy.h +55 -0
  67. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/esp32.h +85 -0
  68. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/generic.h +0 -0
  69. hyperdrone/_vendor/rl-tools/include/rl_tools/devices/wasm32.h +59 -0
  70. hyperdrone/_vendor/rl-tools/include/rl_tools/dyn/model.h +218 -0
  71. hyperdrone/_vendor/rl-tools/include/rl_tools/dyn/operations_generic.h +771 -0
  72. hyperdrone/_vendor/rl-tools/include/rl_tools/dyn/persist.h +278 -0
  73. hyperdrone/_vendor/rl-tools/include/rl_tools/dyn/policy_adapter.h +100 -0
  74. hyperdrone/_vendor/rl-tools/include/rl_tools/dyn/policy_adapter_persist.h +52 -0
  75. hyperdrone/_vendor/rl-tools/include/rl_tools/dyn/tensor_operations_generic.h +55 -0
  76. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/applications/l2f/c_backend.h +112 -0
  77. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/applications/l2f/c_interface.h +36 -0
  78. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/applications/l2f/l2f.h +98 -0
  79. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/applications/l2f/operations_dyn.h +18 -0
  80. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/applications/l2f/operations_generic.h +268 -0
  81. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/debugging_pool/c_backend.h +31 -0
  82. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/debugging_pool/c_interface.h +12 -0
  83. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/executor/c_backend.h +98 -0
  84. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/executor/c_interface.h +50 -0
  85. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/executor/executor.h +133 -0
  86. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/executor/helper.h +109 -0
  87. hyperdrone/_vendor/rl-tools/include/rl_tools/inference/executor/operations_generic.h +219 -0
  88. hyperdrone/_vendor/rl-tools/include/rl_tools/logging/operations_arduino.h +117 -0
  89. hyperdrone/_vendor/rl-tools/include/rl_tools/logging/operations_arm.h +56 -0
  90. hyperdrone/_vendor/rl-tools/include/rl_tools/logging/operations_cpu.h +93 -0
  91. hyperdrone/_vendor/rl-tools/include/rl_tools/logging/operations_cpu_tensorboard.h +151 -0
  92. hyperdrone/_vendor/rl-tools/include/rl_tools/logging/operations_cuda.h +65 -0
  93. hyperdrone/_vendor/rl-tools/include/rl_tools/logging/operations_dummy.h +45 -0
  94. hyperdrone/_vendor/rl-tools/include/rl_tools/logging/operations_wasm32.h +56 -0
  95. hyperdrone/_vendor/rl-tools/include/rl_tools/math/operations_arm.h +98 -0
  96. hyperdrone/_vendor/rl-tools/include/rl_tools/math/operations_cpu.h +139 -0
  97. hyperdrone/_vendor/rl-tools/include/rl_tools/math/operations_cuda.h +382 -0
  98. hyperdrone/_vendor/rl-tools/include/rl_tools/math/operations_dummy.h +93 -0
  99. hyperdrone/_vendor/rl-tools/include/rl_tools/math/operations_esp32.h +92 -0
  100. hyperdrone/_vendor/rl-tools/include/rl_tools/math/operations_generic.h +297 -0
  101. hyperdrone/_vendor/rl-tools/include/rl_tools/math/operations_wasm32.h +225 -0
  102. hyperdrone/_vendor/rl-tools/include/rl_tools/mode/mode.h +75 -0
  103. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/activation_functions.h +115 -0
  104. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/capability/capability.h +63 -0
  105. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/capability/persist_code.h +27 -0
  106. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/avg_pool2d/layer.h +122 -0
  107. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/avg_pool2d/operations_cuda.h +64 -0
  108. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/avg_pool2d/operations_generic.h +184 -0
  109. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/avg_pool2d/persist.h +33 -0
  110. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/conv2d/layer.h +300 -0
  111. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/conv2d/operations_cpu_mkl.h +590 -0
  112. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/conv2d/operations_cuda.h +739 -0
  113. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/conv2d/operations_generic.h +1185 -0
  114. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/conv2d/persist.h +99 -0
  115. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/conv2d/persist_code.h +170 -0
  116. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/layer.h +145 -0
  117. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_arm/dsp.h +63 -0
  118. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_arm/opt.h +173 -0
  119. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_cpu.h +13 -0
  120. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_cpu_accelerate.h +66 -0
  121. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_cpu_blas.h +282 -0
  122. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_cpu_mkl.h +66 -0
  123. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_cpu_openblas.h +65 -0
  124. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_cuda.h +519 -0
  125. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_dummy.h +8 -0
  126. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_esp32/dsp.h +58 -0
  127. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_esp32/opt.h +167 -0
  128. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/operations_generic.h +421 -0
  129. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/persist.h +62 -0
  130. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/persist_code.h +178 -0
  131. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dense/persist_common.h +55 -0
  132. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dynamic_conv2d/layer.h +188 -0
  133. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dynamic_conv2d/operations_cuda.h +356 -0
  134. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dynamic_conv2d/operations_generic.h +534 -0
  135. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/dynamic_conv2d/persist.h +32 -0
  136. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/embedding/layer.h +119 -0
  137. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/embedding/operations_generic.h +217 -0
  138. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/embedding/persist.h +46 -0
  139. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/flatten/layer.h +121 -0
  140. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/flatten/operations_generic.h +152 -0
  141. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/flatten/persist.h +44 -0
  142. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/flatten/persist_code.h +106 -0
  143. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/gru/helper_operations_cuda.h +375 -0
  144. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/gru/helper_operations_generic.h +158 -0
  145. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/gru/layer.h +218 -0
  146. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/gru/operations_generic.h +947 -0
  147. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/gru/persist.h +75 -0
  148. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/gru/persist_code.h +199 -0
  149. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/layers.h +3 -0
  150. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/max_pool2d/layer.h +143 -0
  151. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/max_pool2d/operations_cuda.h +80 -0
  152. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/max_pool2d/operations_generic.h +214 -0
  153. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/max_pool2d/persist.h +39 -0
  154. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_cpu.h +1 -0
  155. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_cpu_accelerate.h +1 -0
  156. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_cpu_blas.h +1 -0
  157. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_cpu_mkl.h +3 -0
  158. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_cpu_openblas.h +1 -0
  159. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_cuda.h +9 -0
  160. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_dummy.h +1 -0
  161. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/operations_generic.h +3 -0
  162. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/resnet_block/layer.h +223 -0
  163. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/resnet_block/operations_cuda.h +138 -0
  164. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/resnet_block/operations_generic.h +428 -0
  165. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/resnet_block/persist.h +70 -0
  166. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/sample_and_squash/layer.h +154 -0
  167. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/sample_and_squash/operations_cuda.h +119 -0
  168. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/sample_and_squash/operations_generic.h +494 -0
  169. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/sample_and_squash/persist.h +50 -0
  170. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/sample_and_squash/persist_code.h +173 -0
  171. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/standardize/layer.h +116 -0
  172. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/standardize/operations_cuda.h +156 -0
  173. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/standardize/operations_generic.h +291 -0
  174. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/standardize/persist.h +83 -0
  175. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/standardize/persist_code.h +163 -0
  176. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/td3_sampling/layer.h +123 -0
  177. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/td3_sampling/operations_generic.h +268 -0
  178. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/td3_sampling/persist.h +17 -0
  179. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/td3_sampling/persist_code.h +164 -0
  180. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/unflatten/layer.h +122 -0
  181. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/unflatten/operations_cuda.h +55 -0
  182. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/unflatten/operations_generic.h +158 -0
  183. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/unflatten/persist.h +47 -0
  184. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/unflatten/persist_code.h +106 -0
  185. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/upsample2d/layer.h +132 -0
  186. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/upsample2d/operations_cuda.h +141 -0
  187. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/layers/upsample2d/operations_generic.h +228 -0
  188. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/loss_functions/categorical_cross_entropy/operations_generic.h +102 -0
  189. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/loss_functions/mse/operations_cuda.h +97 -0
  190. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/loss_functions/mse/operations_generic.h +101 -0
  191. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/loss_functions/operations_generic.h +2 -0
  192. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/nn.h +16 -0
  193. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_cpu.h +1 -0
  194. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_cpu_accelerate.h +1 -0
  195. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_cpu_blas.h +1 -0
  196. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_cpu_mkl.h +1 -0
  197. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_cpu_mux.h +16 -0
  198. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_cpu_openblas.h +1 -0
  199. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_cuda.h +2 -0
  200. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_dummy.h +1 -0
  201. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/operations_generic.h +17 -0
  202. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/adam.h +120 -0
  203. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/instance/operations_cuda.h +90 -0
  204. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/instance/operations_generic.h +144 -0
  205. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/instance/persist.h +39 -0
  206. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/instance/persist_code.h +79 -0
  207. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/operations_cuda.h +72 -0
  208. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/operations_generic.h +102 -0
  209. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/adam/persist.h +25 -0
  210. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/lamb/instance/operations_generic.h +101 -0
  211. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/lamb/lamb.h +40 -0
  212. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/lamb/operations_generic.h +61 -0
  213. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/optimizers.h +3 -0
  214. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/sgd/instance/operations_cuda.h +77 -0
  215. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/sgd/instance/operations_generic.h +134 -0
  216. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/sgd/instance/persist.h +37 -0
  217. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/sgd/instance/persist_code.h +71 -0
  218. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/sgd/operations_cuda.h +40 -0
  219. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/sgd/operations_generic.h +43 -0
  220. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/optimizers/sgd/sgd.h +91 -0
  221. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/parameters/operations_cuda.h +0 -0
  222. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/parameters/operations_generic.h +90 -0
  223. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/parameters/parameters.h +78 -0
  224. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/parameters/persist.h +34 -0
  225. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/parameters/persist_code.h +133 -0
  226. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/persist.h +2 -0
  227. hyperdrone/_vendor/rl-tools/include/rl_tools/nn/persist_code.h +27 -0
  228. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp/network.h +174 -0
  229. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp/operations_cuda.h +10 -0
  230. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp/operations_dummy.h +8 -0
  231. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp/operations_generic.h +381 -0
  232. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp/persist.h +56 -0
  233. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp/persist_code.h +137 -0
  234. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp_unconditional_stddev/network.h +45 -0
  235. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp_unconditional_stddev/operations_generic.h +76 -0
  236. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp_unconditional_stddev/persist.h +43 -0
  237. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/mlp_unconditional_stddev/persist_code.h +135 -0
  238. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/models.h +3 -0
  239. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/multi_agent_wrapper/model.h +148 -0
  240. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/multi_agent_wrapper/operations_generic.h +280 -0
  241. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/multi_agent_wrapper/persist.h +25 -0
  242. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/multi_agent_wrapper/persist_code.h +71 -0
  243. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/operations_cpu.h +0 -0
  244. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/operations_cuda.h +1 -0
  245. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/operations_dummy.h +1 -0
  246. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/operations_generic.h +6 -0
  247. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/parallel/model.h +276 -0
  248. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/parallel/operations_cuda.h +165 -0
  249. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/parallel/operations_generic.h +571 -0
  250. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/parallel/persist.h +80 -0
  251. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/parallel/persist_code.h +196 -0
  252. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/persist.h +1 -0
  253. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/persist_code.h +1 -0
  254. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/random_uniform/model.h +43 -0
  255. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/random_uniform/operations_generic.h +73 -0
  256. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/resnet/resnet.h +97 -0
  257. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/sequential/model.h +256 -0
  258. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/sequential/operations_generic.h +564 -0
  259. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/sequential/persist.h +99 -0
  260. hyperdrone/_vendor/rl-tools/include/rl_tools/nn_models/sequential/persist_code.h +107 -0
  261. hyperdrone/_vendor/rl-tools/include/rl_tools/numeric_types/bf16.h +28 -0
  262. hyperdrone/_vendor/rl-tools/include/rl_tools/numeric_types/categories.h +22 -0
  263. hyperdrone/_vendor/rl-tools/include/rl_tools/numeric_types/persist_code.h +54 -0
  264. hyperdrone/_vendor/rl-tools/include/rl_tools/numeric_types/policy.h +48 -0
  265. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/arm/group_1.h +18 -0
  266. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/arm/group_2.h +14 -0
  267. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/arm/group_3.h +14 -0
  268. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/arm.h +19 -0
  269. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu/group_1.h +16 -0
  270. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu/group_2.h +12 -0
  271. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu/group_3.h +15 -0
  272. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu.h +19 -0
  273. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_accelerate/group_1.h +16 -0
  274. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_accelerate/group_2.h +12 -0
  275. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_accelerate/group_3.h +15 -0
  276. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_accelerate.h +19 -0
  277. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_mkl/group_1.h +17 -0
  278. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_mkl/group_2.h +12 -0
  279. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_mkl/group_3.h +15 -0
  280. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_mkl.h +18 -0
  281. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_mux.h +148 -0
  282. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_openblas/group_1.h +16 -0
  283. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_openblas/group_2.h +12 -0
  284. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_openblas/group_3.h +15 -0
  285. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_openblas.h +18 -0
  286. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_tensorboard/group_1.h +16 -0
  287. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_tensorboard/group_2.h +12 -0
  288. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_tensorboard/group_3.h +15 -0
  289. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cpu_tensorboard.h +19 -0
  290. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cuda/group_1.h +18 -0
  291. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cuda/group_2.h +12 -0
  292. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cuda/group_3.h +12 -0
  293. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/cuda.h +19 -0
  294. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/dummy/group_1.h +15 -0
  295. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/dummy/group_2.h +12 -0
  296. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/dummy/group_3.h +12 -0
  297. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/dummy.h +19 -0
  298. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/esp32/group_1.h +16 -0
  299. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/esp32/group_2.h +12 -0
  300. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/esp32/group_3.h +13 -0
  301. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/esp32.h +19 -0
  302. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/wasm32/group_1.h +15 -0
  303. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/wasm32/group_2.h +12 -0
  304. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/wasm32/group_3.h +12 -0
  305. hyperdrone/_vendor/rl-tools/include/rl_tools/operations/wasm32.h +19 -0
  306. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/backends/hdf5/hdf5.h +54 -0
  307. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/backends/hdf5/operations_cpu.h +419 -0
  308. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/backends/tar/io.h +55 -0
  309. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/backends/tar/operations_cpu.h +58 -0
  310. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/backends/tar/operations_generic.h +620 -0
  311. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/backends/tar/operations_posix.h +63 -0
  312. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/backends/tar/tar.h +74 -0
  313. hyperdrone/_vendor/rl-tools/include/rl_tools/persist/code.h +38 -0
  314. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_arm.h +39 -0
  315. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_cpu.h +61 -0
  316. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_cuda.h +164 -0
  317. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_dummy.h +72 -0
  318. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_esp32.h +45 -0
  319. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_generic.h +133 -0
  320. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_generic_array.h +64 -0
  321. hyperdrone/_vendor/rl-tools/include/rl_tools/random/operations_wasm32.h +57 -0
  322. hyperdrone/_vendor/rl-tools/include/rl_tools/random/persist.h +77 -0
  323. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/README.md +149 -0
  324. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/generic/operations_cpu.h +768 -0
  325. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/generic/operations_generic.h +1173 -0
  326. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/metal/context.h +177 -0
  327. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/metal/device_source.h +17 -0
  328. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/metal/operations_cpu.h +1122 -0
  329. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/optix/device.h +212 -0
  330. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/optix/device_impl.h +934 -0
  331. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/optix/operations_cuda.h +1678 -0
  332. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/optix/overlay_accel.h +57 -0
  333. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/vulkan/context.h +220 -0
  334. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/vulkan/device_source.h +40 -0
  335. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/backends/vulkan/operations_cpu.h +1967 -0
  336. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/operations_cpu_common.h +1986 -0
  337. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/operations_cpu_mux.h +19 -0
  338. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/renderer.h +376 -0
  339. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/scene/procthor/operations_cpu.h +226 -0
  340. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/scene/procthor/scene.h +25 -0
  341. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/scene/scene.h +31 -0
  342. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/scene.h +107 -0
  343. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/transforms_generic.h +159 -0
  344. hyperdrone/_vendor/rl-tools/include/rl_tools/rendering/raytracing/types.h +39 -0
  345. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/algorithms.h +6 -0
  346. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/operations_cpu.h +1 -0
  347. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/operations_cpu_mkl.h +1 -0
  348. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/operations_generic.h +1 -0
  349. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/loop/core/config.h +240 -0
  350. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/loop/core/operations_cuda.h +62 -0
  351. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/loop/core/operations_generic.h +245 -0
  352. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/loop/core/persist.h +102 -0
  353. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/loop/core/state.h +52 -0
  354. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/operations_cuda.h +193 -0
  355. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/operations_generic.h +334 -0
  356. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/operations_generic_extensions.h +244 -0
  357. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/persist.h +28 -0
  358. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/ppo/ppo.h +105 -0
  359. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/loop/core/approximators_gru.h +84 -0
  360. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/loop/core/approximators_mlp.h +61 -0
  361. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/loop/core/config.h +106 -0
  362. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/loop/core/operations_generic.h +193 -0
  363. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/loop/core/state.h +52 -0
  364. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/operations_cpu.h +9 -0
  365. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/operations_cpu_accelerate.h +2 -0
  366. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/operations_cpu_mkl.h +2 -0
  367. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/operations_cpu_mux.h +9 -0
  368. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/operations_cuda.h +131 -0
  369. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/operations_generic.h +580 -0
  370. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/sac/sac.h +151 -0
  371. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/loop/core/approximators_gru.h +72 -0
  372. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/loop/core/approximators_mlp.h +54 -0
  373. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/loop/core/config.h +107 -0
  374. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/loop/core/operations_generic.h +172 -0
  375. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/loop/core/state.h +46 -0
  376. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/operations_cpu.h +9 -0
  377. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/operations_cpu_accelerate.h +2 -0
  378. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/operations_cpu_mkl.h +2 -0
  379. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/operations_cpu_mux.h +9 -0
  380. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/operations_cuda.h +111 -0
  381. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/operations_generic.h +359 -0
  382. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/algorithms/td3/td3.h +141 -0
  383. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/components.h +4 -0
  384. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/off_policy_runner/off_policy_runner.h +225 -0
  385. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/off_policy_runner/operations_cpu.h +95 -0
  386. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/off_policy_runner/operations_cpu_accelerate.h +21 -0
  387. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/off_policy_runner/operations_cpu_mkl.h +21 -0
  388. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/off_policy_runner/operations_cuda.h +237 -0
  389. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/off_policy_runner/operations_generic.h +498 -0
  390. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/off_policy_runner/operations_generic_per_env.h +112 -0
  391. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/on_policy_runner.h +106 -0
  392. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/operations_cpu.h +16 -0
  393. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/operations_cpu_accelerate.h +28 -0
  394. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/operations_cpu_mkl.h +15 -0
  395. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/operations_cuda.h +195 -0
  396. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/operations_generic.h +197 -0
  397. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/operations_generic_extensions.h +98 -0
  398. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/operations_generic_per_env.h +91 -0
  399. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/on_policy_runner/persist.h +61 -0
  400. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/operations_cpu.h +2 -0
  401. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/operations_cpu_accelerate.h +1 -0
  402. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/operations_cpu_mkl.h +1 -0
  403. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/operations_generic.h +2 -0
  404. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/replay_buffer/operations_cpu.h +9 -0
  405. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/replay_buffer/operations_generic.h +123 -0
  406. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/replay_buffer/persist.h +57 -0
  407. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/replay_buffer/replay_buffer.h +93 -0
  408. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/running_normalizer/operations_generic.h +76 -0
  409. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/running_normalizer/persist.h +31 -0
  410. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/components/running_normalizer/running_normalizer.h +33 -0
  411. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environment_wrappers/operations_generic.h +58 -0
  412. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environment_wrappers/scale_observations/operations_generic.h +28 -0
  413. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environment_wrappers/scale_observations/wrapper.h +26 -0
  414. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environment_wrappers/wrappers.h +29 -0
  415. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/acrobot/acrobot.h +88 -0
  416. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/acrobot/operations_cpu.h +152 -0
  417. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/acrobot/operations_generic.h +202 -0
  418. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/car/car.h +119 -0
  419. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/car/operations_cpu.h +110 -0
  420. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/car/operations_generic.h +206 -0
  421. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/car/operations_json.h +59 -0
  422. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/car/track.h +23 -0
  423. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/car/ui.h +189 -0
  424. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/environments.h +28 -0
  425. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/flag/environment.h +87 -0
  426. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/flag/operations_cpu.h +212 -0
  427. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/flag/operations_generic.h +215 -0
  428. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/metrics.h +266 -0
  429. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/multirotor.h +1083 -0
  430. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_cpu.h +2119 -0
  431. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_cuda.h +38 -0
  432. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/05_state_is_nan.h +126 -0
  433. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/10_sample_initial_parameters.h +228 -0
  434. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/20_initial_state.h +189 -0
  435. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/30_sample_initial_state.h +276 -0
  436. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/35_get_desired_state.h +63 -0
  437. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/40_observe.h +625 -0
  438. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/50_state_algebra.h +57 -0
  439. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/60_dynamics.h +134 -0
  440. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/70_post_integration.h +329 -0
  441. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic/80_abs_diff.h +290 -0
  442. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_generic.h +369 -0
  443. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_helper_generic.h +45 -0
  444. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_multitask_generic.h +72 -0
  445. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/operations_multitask_generic_forward.h +26 -0
  446. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/default.h +202 -0
  447. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/arpl.h +112 -0
  448. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/crazyflie.h +127 -0
  449. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/crazyflie_openmv.h +119 -0
  450. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/flightmare.h +111 -0
  451. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/fs.h +113 -0
  452. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/mrs.h +110 -0
  453. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/soft.h +117 -0
  454. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/soft_rigid.h +118 -0
  455. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/x500_real.h +88 -0
  456. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/dynamics/x500_sim.h +114 -0
  457. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/init/default.h +56 -0
  458. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/registry.h +90 -0
  459. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/reward_functions/default.h +64 -0
  460. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/reward_functions/reward_functions.h +1 -0
  461. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/reward_functions/squared/operations_generic.h +202 -0
  462. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/reward_functions/squared/squared.h +52 -0
  463. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/termination/default.h +33 -0
  464. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/trajectories/lissajous.h +72 -0
  465. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/parameters/trajectories/trajectory.h +78 -0
  466. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/persist_code.h +53 -0
  467. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/quaternion_helper.h +94 -0
  468. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f/ui.h +180 -0
  469. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f_visual/multirotor_visual.h +135 -0
  470. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f_visual/operations_cpu.h +244 -0
  471. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f_visual/operations_cuda.h +180 -0
  472. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/l2f_visual/operations_generic.h +149 -0
  473. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/memory/environment.h +69 -0
  474. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/memory/operations_cpu.h +46 -0
  475. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/memory/operations_generic.h +78 -0
  476. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/mujoco/ant/README.MD +5 -0
  477. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/mujoco/ant/ant.h +77 -0
  478. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/mujoco/ant/model.h +415 -0
  479. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/mujoco/ant/operations_cpu.h +160 -0
  480. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/mujoco/ant/ui.h +141 -0
  481. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/mujoco/mujoco.h +1 -0
  482. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/multi_agent/bottleneck/bottleneck.h +113 -0
  483. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/multi_agent/bottleneck/operations_cpu.h +289 -0
  484. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/multi_agent/bottleneck/operations_generic.h +495 -0
  485. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/multi_agent/environments.h +16 -0
  486. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/observation.h +37 -0
  487. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/operations_cpu.h +2 -0
  488. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/operations_generic.h +33 -0
  489. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/pendulum/operations_cpu.h +146 -0
  490. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/pendulum/operations_generic.h +262 -0
  491. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/pendulum/pendulum.h +197 -0
  492. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/pendulum/ui.h +97 -0
  493. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/pendulum/ui_xeus.h +124 -0
  494. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/reacher/operations_cpu.h +426 -0
  495. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/reacher/operations_generic.h +424 -0
  496. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/environments/reacher/reacher.h +137 -0
  497. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/loop.h +15 -0
  498. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/checkpoint/config.h +28 -0
  499. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/checkpoint/operations_cpu.h +233 -0
  500. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/checkpoint/persist.h +30 -0
  501. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/checkpoint/state.h +21 -0
  502. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/curriculum/config.h +25 -0
  503. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/curriculum/operations_generic.h +47 -0
  504. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/curriculum/persist.h +20 -0
  505. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/curriculum/state.h +17 -0
  506. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/evaluation/config.h +47 -0
  507. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/evaluation/operations_generic.h +106 -0
  508. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/evaluation/persist.h +40 -0
  509. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/evaluation/state.h +36 -0
  510. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/extrack/config.h +22 -0
  511. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/extrack/operations_cpu.h +44 -0
  512. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/extrack/persist.h +20 -0
  513. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/extrack/state.h +26 -0
  514. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/nn_analytics/config.h +37 -0
  515. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/nn_analytics/operations_cpu.h +113 -0
  516. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/nn_analytics/persist.h +20 -0
  517. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/nn_analytics/state.h +24 -0
  518. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/save_trajectories/config.h +43 -0
  519. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/save_trajectories/operations_cpu.h +190 -0
  520. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/save_trajectories/persist.h +30 -0
  521. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/save_trajectories/state.h +37 -0
  522. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/steps.h +4 -0
  523. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/timing/config.h +27 -0
  524. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/timing/operations_cpu.h +52 -0
  525. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/timing/persist.h +20 -0
  526. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/loop/steps/timing/state.h +25 -0
  527. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/operations_generic.h +3 -0
  528. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/rl.h +5 -0
  529. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/utils/evaluation/evaluation.h +106 -0
  530. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/utils/evaluation/operations_cpu.h +48 -0
  531. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/utils/evaluation/operations_generic.h +275 -0
  532. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/utils/validation.h +269 -0
  533. hyperdrone/_vendor/rl-tools/include/rl_tools/rl/utils/validation_analysis.h +85 -0
  534. hyperdrone/_vendor/rl-tools/include/rl_tools/rl_tools.h +37 -0
  535. hyperdrone/_vendor/rl-tools/include/rl_tools/ui_server/client/client.h +50 -0
  536. hyperdrone/_vendor/rl-tools/include/rl_tools/ui_server/client/operations_boost.h +92 -0
  537. hyperdrone/_vendor/rl-tools/include/rl_tools/ui_server/client/operations_cpu.h +174 -0
  538. hyperdrone/_vendor/rl-tools/include/rl_tools/ui_server/client/operations_websocket.h +208 -0
  539. hyperdrone/_vendor/rl-tools/include/rl_tools/ui_server/server.h +448 -0
  540. hyperdrone/_vendor/rl-tools/include/rl_tools/universe.h +4 -0
  541. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/declarations_cpu.h +13 -0
  542. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/operations_arm.h +25 -0
  543. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/operations_cpu.h +21 -0
  544. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/operations_cuda.h +25 -0
  545. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/operations_dummy.h +18 -0
  546. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/operations_esp32.h +20 -0
  547. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/operations_generic.h +19 -0
  548. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/assert/operations_wasm32.h +18 -0
  549. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/env/operations_cpu.h +16 -0
  550. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/env/operations_generic.h +14 -0
  551. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/extrack/extrack.h +129 -0
  552. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/extrack/operations_cpu.h +588 -0
  553. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/generic/integrators.h +105 -0
  554. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/generic/memcpy.h +16 -0
  555. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/generic/tuple/operations_generic.h +48 -0
  556. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/generic/tuple/tuple.h +149 -0
  557. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/generic/typing.h +118 -0
  558. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/generic/vector_operations.h +174 -0
  559. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/polyak/operations_cuda.h +53 -0
  560. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/polyak/operations_generic.h +93 -0
  561. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/string/operations_generic.h +201 -0
  562. hyperdrone/_vendor/rl-tools/include/rl_tools/utils/zlib/operations_cpu.h +45 -0
  563. hyperdrone/_vendor/rl-tools/include/rl_tools/version.h +28 -0
  564. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/CMakeLists.txt +15 -0
  565. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/CMakeLists.txt +9 -0
  566. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/generic/CMakeLists.txt +17 -0
  567. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/generic/freestanding_check.cpp +113 -0
  568. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/metal/CMakeLists.txt +31 -0
  569. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/metal/device.metal +815 -0
  570. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/metal/metal_cpp_impl.cpp +6 -0
  571. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/optix/CMakeLists.txt +51 -0
  572. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/optix/device.cu +1 -0
  573. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/optix/overlay_accel.cu +275 -0
  574. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/vulkan/CMakeLists.txt +37 -0
  575. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/vulkan/device.comp +865 -0
  576. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/backends/vulkan/device_spirv.cpp +34 -0
  577. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/CMakeLists.txt +205 -0
  578. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/README.md +281 -0
  579. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/benchmark.cpp +175 -0
  580. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/benchmark_dynamic.cpp +494 -0
  581. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/simulator_matrix.cpp +1629 -0
  582. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/simulator_matrix_physics.cu +523 -0
  583. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/benchmark/simulator_matrix_physics.h +37 -0
  584. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/CMakeLists.txt +164 -0
  585. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/antialiasing.cpp +213 -0
  586. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/drone.cpp +367 -0
  587. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/drone_device.cu +385 -0
  588. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/environment/environment.h +85 -0
  589. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/environment/operations_cpu.h +270 -0
  590. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/example.cpp +276 -0
  591. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/fixed_pose.cpp +218 -0
  592. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/interactive.cpp +866 -0
  593. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/make_drone_glb.py +172 -0
  594. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/motion_blur.cpp +232 -0
  595. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/render_pose_trace.cpp +1833 -0
  596. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/example/render_pose_trace_motion_blur.cpp +646 -0
  597. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/CMakeLists.txt +147 -0
  598. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/README.md +15 -0
  599. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/job.sbatch +28 -0
  600. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/model.h +260 -0
  601. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/model_config.h +24 -0
  602. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/model_forward_cuda.h +397 -0
  603. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/model_operations.h +418 -0
  604. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/model_persist.h +45 -0
  605. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/model_student.h +70 -0
  606. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/scene.cpp +221 -0
  607. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/scene.h +68 -0
  608. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/.build-check/inference_ios.o +0 -0
  609. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/.build-check/libinference_ios.a +0 -0
  610. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/.gitignore +4 -0
  611. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/CMakeLists.txt +4 -0
  612. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/Info.plist +24 -0
  613. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/Info_ios.plist +36 -0
  614. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/Sources/CameraManager.swift +120 -0
  615. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/Sources/ContentView.swift +703 -0
  616. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/Sources/DatasetRecorder.swift +285 -0
  617. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/Sources/YawPredictorApp.swift +25 -0
  618. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/YawPredictor.entitlements +8 -0
  619. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/build.sh +66 -0
  620. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/build_ios.sh +133 -0
  621. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/generate.sh +6 -0
  622. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/h5_to_tar.cpp +82 -0
  623. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/inference.cpp +166 -0
  624. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/inference.h +26 -0
  625. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/project.yml +30 -0
  626. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/swift_app/test_tar_vs_hdf5.cpp +173 -0
  627. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/yaw_prediction_cuda.cu +699 -0
  628. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/yaw_prediction_dataset_overlay.cpp +475 -0
  629. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/yaw_prediction_distill_cuda.cu +995 -0
  630. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/yaw_prediction_eval.cu +456 -0
  631. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/yaw_prediction_real_world_eval.cpp +660 -0
  632. hyperdrone/_vendor/rl-tools/src/rendering/raytracing/yaw_prediction/yaw_prediction_viewer.cu +445 -0
  633. hyperdrone/cuda/__init__.py +78 -0
  634. hyperdrone/dynamics/__init__.py +22 -0
  635. hyperdrone/dynamics/_component.py +40 -0
  636. hyperdrone/dynamics/_config.py +47 -0
  637. hyperdrone/dynamics/_sim.py +201 -0
  638. hyperdrone/env/__init__.py +15 -0
  639. hyperdrone/env/_sampling.py +67 -0
  640. hyperdrone/env/_world.py +60 -0
  641. hyperdrone/examples/__init__.py +11 -0
  642. hyperdrone/examples/benchmark.py +236 -0
  643. hyperdrone/examples/benchmark_minimal.py +66 -0
  644. hyperdrone/examples/data.py +42 -0
  645. hyperdrone/examples/drone_flythrough.py +142 -0
  646. hyperdrone/examples/render_procthor.py +41 -0
  647. hyperdrone/jit/__init__.py +111 -0
  648. hyperdrone/jit/_build.py +94 -0
  649. hyperdrone/jit/_lock.py +23 -0
  650. hyperdrone/jit/_patches.py +95 -0
  651. hyperdrone/jit/_toolchain.py +13 -0
  652. hyperdrone/jit/_workspace.py +70 -0
  653. hyperdrone/render/__init__.py +48 -0
  654. hyperdrone/render/_component.py +35 -0
  655. hyperdrone/render/_config.py +90 -0
  656. hyperdrone/render/_renderer.py +306 -0
  657. hyperdrone/render/_scene.py +34 -0
  658. hyperdrone-0.1.0.dist-info/METADATA +15 -0
  659. hyperdrone-0.1.0.dist-info/RECORD +660 -0
  660. hyperdrone-0.1.0.dist-info/WHEEL +4 -0
@@ -0,0 +1,1967 @@
1
+ #include "../../../../version.h"
2
+ #include "../../../../rl_tools.h"
3
+ #if (defined(RL_TOOLS_DISABLE_INCLUDE_GUARDS) || !defined(RL_TOOLS_RENDERING_RAYTRACING_BACKENDS_VULKAN_OPERATIONS_CPU_H)) && (RL_TOOLS_USE_THIS_VERSION == 1)
4
+ #pragma once
5
+ #define RL_TOOLS_RENDERING_RAYTRACING_BACKENDS_VULKAN_OPERATIONS_CPU_H
6
+
7
+ #include "../../renderer.h"
8
+ #include "../../operations_cpu_common.h"
9
+ #include "context.h"
10
+ #include "device_source.h"
11
+
12
+ #include <vector>
13
+ #include <cstring>
14
+ #include <cstdlib>
15
+ #include <string>
16
+
17
+ RL_TOOLS_NAMESPACE_WRAPPER_START
18
+ namespace rl_tools {
19
+ namespace rendering::raytracing::backends {
20
+ template <typename SPEC>
21
+ struct RendererState<rendering::raytracing::backends::Vulkan, SPEC>: vulkan::Context {};
22
+
23
+ template <typename SPEC>
24
+ struct LibraryState<rendering::raytracing::backends::Vulkan, SPEC> {};
25
+
26
+ template <typename SPEC>
27
+ struct SceneState<rendering::raytracing::backends::Vulkan, SPEC> {};
28
+ }
29
+
30
+ namespace rendering::raytracing::backends::vulkan{
31
+ template <typename SPEC>
32
+ Context& context(rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer){
33
+ return *renderer.backend;
34
+ }
35
+
36
+ template <typename DEVICE>
37
+ void check(DEVICE& device, VkResult result, const char* message){
38
+ if(result != VK_SUCCESS){
39
+ RL_TOOLS_RENDERING_RAYTRACING_LOG_ERR(message << " (VkResult " << (int)result << ")");
40
+ utils::assert_exit(device, false, message);
41
+ }
42
+ }
43
+
44
+ template <typename DEVICE>
45
+ uint32_t find_memory_type(DEVICE& device, Context& ctx, uint32_t type_bits, VkMemoryPropertyFlags properties){
46
+ VkPhysicalDeviceMemoryProperties memory_properties;
47
+ vkGetPhysicalDeviceMemoryProperties(ctx.physical_device, &memory_properties);
48
+ for(uint32_t i = 0; i < memory_properties.memoryTypeCount; i++){
49
+ if((type_bits & (1u << i)) != 0 && (memory_properties.memoryTypes[i].propertyFlags & properties) == properties){
50
+ return i;
51
+ }
52
+ }
53
+ if((properties & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) != 0){
54
+ return find_memory_type(device, ctx, type_bits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
55
+ }
56
+ utils::assert_exit(device, false, "Vulkan: no suitable memory type");
57
+ return 0;
58
+ }
59
+
60
+ template <typename DEVICE>
61
+ BufferResource create_buffer(DEVICE& device, Context& ctx, VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, bool map){
62
+ BufferResource resource;
63
+ resource.size = size;
64
+ VkBufferCreateInfo buffer_info{};
65
+ buffer_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
66
+ buffer_info.size = size;
67
+ buffer_info.usage = usage;
68
+ buffer_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
69
+ check(device, vkCreateBuffer(ctx.device, &buffer_info, nullptr, &resource.buffer), "Vulkan: buffer creation failed");
70
+ VkMemoryRequirements requirements;
71
+ vkGetBufferMemoryRequirements(ctx.device, resource.buffer, &requirements);
72
+ VkMemoryAllocateFlagsInfo flags_info{};
73
+ flags_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO;
74
+ flags_info.flags = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT;
75
+ VkMemoryAllocateInfo allocate_info{};
76
+ allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
77
+ if((usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT) != 0){
78
+ allocate_info.pNext = &flags_info;
79
+ }
80
+ allocate_info.allocationSize = requirements.size;
81
+ allocate_info.memoryTypeIndex = find_memory_type(device, ctx, requirements.memoryTypeBits, properties);
82
+ VkResult allocation_result = vkAllocateMemory(ctx.device, &allocate_info, nullptr, &resource.memory);
83
+ // BAR-preferred allocations fall back to plain host memory when the host-visible VRAM heap is exhausted (non-ReBAR systems)
84
+ if(allocation_result != VK_SUCCESS && (properties & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) != 0 && (properties & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0){
85
+ allocate_info.memoryTypeIndex = find_memory_type(device, ctx, requirements.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
86
+ allocation_result = vkAllocateMemory(ctx.device, &allocate_info, nullptr, &resource.memory);
87
+ }
88
+ check(device, allocation_result, "Vulkan: buffer memory allocation failed");
89
+ check(device, vkBindBufferMemory(ctx.device, resource.buffer, resource.memory, 0), "Vulkan: buffer memory bind failed");
90
+ if(map){
91
+ check(device, vkMapMemory(ctx.device, resource.memory, 0, VK_WHOLE_SIZE, 0, &resource.mapped), "Vulkan: buffer memory map failed");
92
+ }
93
+ return resource;
94
+ }
95
+
96
+ inline void destroy_buffer(Context& ctx, BufferResource& resource){
97
+ if(resource.buffer != VK_NULL_HANDLE){
98
+ vkDestroyBuffer(ctx.device, resource.buffer, nullptr);
99
+ resource.buffer = VK_NULL_HANDLE;
100
+ }
101
+ if(resource.memory != VK_NULL_HANDLE){
102
+ vkFreeMemory(ctx.device, resource.memory, nullptr);
103
+ resource.memory = VK_NULL_HANDLE;
104
+ }
105
+ resource.mapped = nullptr;
106
+ resource.size = 0;
107
+ }
108
+
109
+ inline VkDeviceAddress buffer_address(Context& ctx, const BufferResource& resource){
110
+ VkBufferDeviceAddressInfo address_info{};
111
+ address_info.sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO;
112
+ address_info.buffer = resource.buffer;
113
+ return vkGetBufferDeviceAddress(ctx.device, &address_info);
114
+ }
115
+
116
+ template <typename DEVICE>
117
+ VkCommandBuffer one_shot_begin(DEVICE& device, Context& ctx){
118
+ VkCommandBufferAllocateInfo allocate_info{};
119
+ allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
120
+ allocate_info.commandPool = ctx.command_pool;
121
+ allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
122
+ allocate_info.commandBufferCount = 1;
123
+ VkCommandBuffer command_buffer;
124
+ check(device, vkAllocateCommandBuffers(ctx.device, &allocate_info, &command_buffer), "Vulkan: one-shot command buffer allocation failed");
125
+ VkCommandBufferBeginInfo begin_info{};
126
+ begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
127
+ begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
128
+ check(device, vkBeginCommandBuffer(command_buffer, &begin_info), "Vulkan: one-shot command buffer begin failed");
129
+ return command_buffer;
130
+ }
131
+
132
+ template <typename DEVICE>
133
+ void one_shot_end(DEVICE& device, Context& ctx, VkCommandBuffer command_buffer){
134
+ check(device, vkEndCommandBuffer(command_buffer), "Vulkan: one-shot command buffer end failed");
135
+ VkSubmitInfo submit_info{};
136
+ submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
137
+ submit_info.commandBufferCount = 1;
138
+ submit_info.pCommandBuffers = &command_buffer;
139
+ check(device, vkQueueSubmit(ctx.queue, 1, &submit_info, VK_NULL_HANDLE), "Vulkan: one-shot submit failed");
140
+ check(device, vkQueueWaitIdle(ctx.queue), "Vulkan: one-shot wait failed");
141
+ vkFreeCommandBuffers(ctx.device, ctx.command_pool, 1, &command_buffer);
142
+ }
143
+
144
+ template <typename DEVICE>
145
+ void upload_buffer(DEVICE& device, Context& ctx, BufferResource& destination, const void* data, VkDeviceSize size){
146
+ BufferResource staging = create_buffer(device, ctx, size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, true);
147
+ std::memcpy(staging.mapped, data, size);
148
+ VkCommandBuffer command_buffer = one_shot_begin(device, ctx);
149
+ VkBufferCopy region{};
150
+ region.size = size;
151
+ vkCmdCopyBuffer(command_buffer, staging.buffer, destination.buffer, 1, &region);
152
+ one_shot_end(device, ctx, command_buffer);
153
+ destroy_buffer(ctx, staging);
154
+ }
155
+
156
+ template <typename DEVICE>
157
+ ImageResource create_texture_image(DEVICE& device, Context& ctx, int width, int height, bool srgb){
158
+ ImageResource resource;
159
+ VkImageCreateInfo image_info{};
160
+ image_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
161
+ image_info.imageType = VK_IMAGE_TYPE_2D;
162
+ image_info.format = srgb ? VK_FORMAT_R8G8B8A8_SRGB : VK_FORMAT_R8G8B8A8_UNORM;
163
+ image_info.extent = {(uint32_t)width, (uint32_t)height, 1};
164
+ image_info.mipLevels = 1;
165
+ image_info.arrayLayers = 1;
166
+ image_info.samples = VK_SAMPLE_COUNT_1_BIT;
167
+ image_info.tiling = VK_IMAGE_TILING_OPTIMAL;
168
+ image_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
169
+ image_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
170
+ check(device, vkCreateImage(ctx.device, &image_info, nullptr, &resource.image), "Vulkan: image creation failed");
171
+ VkMemoryRequirements requirements;
172
+ vkGetImageMemoryRequirements(ctx.device, resource.image, &requirements);
173
+ VkMemoryAllocateInfo allocate_info{};
174
+ allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
175
+ allocate_info.allocationSize = requirements.size;
176
+ allocate_info.memoryTypeIndex = find_memory_type(device, ctx, requirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
177
+ check(device, vkAllocateMemory(ctx.device, &allocate_info, nullptr, &resource.memory), "Vulkan: image memory allocation failed");
178
+ check(device, vkBindImageMemory(ctx.device, resource.image, resource.memory, 0), "Vulkan: image memory bind failed");
179
+ VkImageViewCreateInfo view_info{};
180
+ view_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
181
+ view_info.image = resource.image;
182
+ view_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
183
+ view_info.format = image_info.format;
184
+ view_info.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
185
+ check(device, vkCreateImageView(ctx.device, &view_info, nullptr, &resource.view), "Vulkan: image view creation failed");
186
+ return resource;
187
+ }
188
+
189
+ inline void record_texture_upload(VkCommandBuffer command_buffer, ImageResource& image, BufferResource& staging, int width, int height){
190
+ VkImageMemoryBarrier to_transfer{};
191
+ to_transfer.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
192
+ to_transfer.srcAccessMask = 0;
193
+ to_transfer.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
194
+ to_transfer.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
195
+ to_transfer.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
196
+ to_transfer.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
197
+ to_transfer.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
198
+ to_transfer.image = image.image;
199
+ to_transfer.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
200
+ vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, 1, &to_transfer);
201
+ VkBufferImageCopy region{};
202
+ region.imageSubresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1};
203
+ region.imageExtent = {(uint32_t)width, (uint32_t)height, 1};
204
+ vkCmdCopyBufferToImage(command_buffer, staging.buffer, image.image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
205
+ VkImageMemoryBarrier to_sampled = to_transfer;
206
+ to_sampled.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
207
+ to_sampled.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
208
+ to_sampled.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
209
+ to_sampled.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
210
+ vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &to_sampled);
211
+ }
212
+
213
+ inline void destroy_image(Context& ctx, ImageResource& resource){
214
+ if(resource.view != VK_NULL_HANDLE){
215
+ vkDestroyImageView(ctx.device, resource.view, nullptr);
216
+ resource.view = VK_NULL_HANDLE;
217
+ }
218
+ if(resource.image != VK_NULL_HANDLE){
219
+ vkDestroyImage(ctx.device, resource.image, nullptr);
220
+ resource.image = VK_NULL_HANDLE;
221
+ }
222
+ if(resource.memory != VK_NULL_HANDLE){
223
+ vkFreeMemory(ctx.device, resource.memory, nullptr);
224
+ resource.memory = VK_NULL_HANDLE;
225
+ }
226
+ }
227
+
228
+ template <typename DEVICE>
229
+ void wait_render_in_flight(DEVICE& device, Context& ctx){
230
+ if(ctx.render_in_flight){
231
+ check(device, vkWaitForFences(ctx.device, 1, &ctx.fence_render, VK_TRUE, UINT64_MAX), "Vulkan: render fence wait failed");
232
+ check(device, vkResetFences(ctx.device, 1, &ctx.fence_render), "Vulkan: render fence reset failed");
233
+ ctx.render_in_flight = false;
234
+ }
235
+ }
236
+
237
+ template <typename DEVICE>
238
+ void wait_collision_in_flight(DEVICE& device, Context& ctx){
239
+ if(ctx.collision_in_flight){
240
+ check(device, vkWaitForFences(ctx.device, 1, &ctx.fence_collision, VK_TRUE, UINT64_MAX), "Vulkan: collision fence wait failed");
241
+ check(device, vkResetFences(ctx.device, 1, &ctx.fence_collision), "Vulkan: collision fence reset failed");
242
+ ctx.collision_in_flight = false;
243
+ }
244
+ }
245
+
246
+ template <typename DEVICE>
247
+ void wait_update_in_flight(DEVICE& device, Context& ctx){
248
+ if(ctx.update_command_buffer != VK_NULL_HANDLE){
249
+ check(device, vkWaitForFences(ctx.device, 1, &ctx.fence_update, VK_TRUE, UINT64_MAX), "Vulkan: update fence wait failed");
250
+ check(device, vkResetFences(ctx.device, 1, &ctx.fence_update), "Vulkan: update fence reset failed");
251
+ vkFreeCommandBuffers(ctx.device, ctx.command_pool, 1, &ctx.update_command_buffer);
252
+ ctx.update_command_buffer = VK_NULL_HANDLE;
253
+ }
254
+ }
255
+
256
+ template <typename DEVICE>
257
+ void wait_in_flight(DEVICE& device, Context& ctx){
258
+ wait_render_in_flight(device, ctx);
259
+ wait_collision_in_flight(device, ctx);
260
+ wait_update_in_flight(device, ctx);
261
+ }
262
+
263
+ inline void destroy_scene_resources(Context& ctx){
264
+ if(ctx.descriptor_pool != VK_NULL_HANDLE){
265
+ vkDestroyDescriptorPool(ctx.device, ctx.descriptor_pool, nullptr);
266
+ ctx.descriptor_pool = VK_NULL_HANDLE;
267
+ ctx.descriptor_set = VK_NULL_HANDLE;
268
+ }
269
+ if(ctx.tlas != VK_NULL_HANDLE){
270
+ ctx.vkDestroyAccelerationStructureKHR(ctx.device, ctx.tlas, nullptr);
271
+ ctx.tlas = VK_NULL_HANDLE;
272
+ }
273
+ for(auto& blas : ctx.blas_list){
274
+ ctx.vkDestroyAccelerationStructureKHR(ctx.device, blas, nullptr);
275
+ }
276
+ ctx.blas_list.clear();
277
+ for(auto& buffer : ctx.blas_buffers){
278
+ destroy_buffer(ctx, buffer);
279
+ }
280
+ ctx.blas_buffers.clear();
281
+ ctx.blas_addresses.clear();
282
+ ctx.object_record_base.clear();
283
+ ctx.object_classes.clear();
284
+ ctx.num_scene_instances = 0;
285
+ for(auto& overlay : ctx.overlay_tlas){
286
+ ctx.vkDestroyAccelerationStructureKHR(ctx.device, overlay, nullptr);
287
+ }
288
+ ctx.overlay_tlas.clear();
289
+ for(auto& buffer : ctx.overlay_tlas_buffers){
290
+ destroy_buffer(ctx, buffer);
291
+ }
292
+ ctx.overlay_tlas_buffers.clear();
293
+ for(auto& buffer : ctx.overlay_instance_buffers){
294
+ destroy_buffer(ctx, buffer);
295
+ }
296
+ ctx.overlay_instance_buffers.clear();
297
+ for(auto& buffer : ctx.overlay_sample_instance_buffers){
298
+ destroy_buffer(ctx, buffer);
299
+ }
300
+ ctx.overlay_sample_instance_buffers.clear();
301
+ destroy_buffer(ctx, ctx.overlay_scratch);
302
+ ctx.overlay_scratch_stride = 0;
303
+ destroy_buffer(ctx, ctx.instance_data);
304
+ destroy_buffer(ctx, ctx.instance_record_base);
305
+ destroy_buffer(ctx, ctx.instance_classes);
306
+ destroy_buffer(ctx, ctx.overlay_attachments);
307
+ destroy_buffer(ctx, ctx.overlay_num_active);
308
+ destroy_buffer(ctx, ctx.tlas_buffer);
309
+ destroy_buffer(ctx, ctx.instance_buffer);
310
+ destroy_buffer(ctx, ctx.mesh_data);
311
+ destroy_buffer(ctx, ctx.mesh_records);
312
+ destroy_buffer(ctx, ctx.scene_lights);
313
+ for(auto& texture : ctx.mesh_textures){
314
+ destroy_image(ctx, texture);
315
+ }
316
+ ctx.mesh_textures.clear();
317
+ }
318
+
319
+ template <typename DEVICE>
320
+ void submit_render(DEVICE& device, Context& ctx, VkCommandBuffer first, VkCommandBuffer second = VK_NULL_HANDLE, VkCommandBuffer third = VK_NULL_HANDLE, VkCommandBuffer fourth = VK_NULL_HANDLE){
321
+ wait_render_in_flight(device, ctx);
322
+ const VkCommandBuffer inputs[4] = {first, second, third, fourth};
323
+ VkCommandBuffer command_buffers[4];
324
+ uint32_t count = 0;
325
+ for(int input_i = 0; input_i < 4; input_i++){
326
+ if(inputs[input_i] != VK_NULL_HANDLE){
327
+ command_buffers[count++] = inputs[input_i];
328
+ }
329
+ }
330
+ if(count == 0){
331
+ return;
332
+ }
333
+ VkSubmitInfo submit_info{};
334
+ submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
335
+ submit_info.commandBufferCount = count;
336
+ submit_info.pCommandBuffers = command_buffers;
337
+ check(device, vkQueueSubmit(ctx.queue, 1, &submit_info, ctx.fence_render), "Vulkan: render submit failed");
338
+ ctx.render_in_flight = true;
339
+ }
340
+ }
341
+
342
+ template <typename DEVICE, typename SPEC>
343
+ void malloc(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer){
344
+ namespace vk = rendering::raytracing::backends::vulkan;
345
+ using TI = typename SPEC::TI;
346
+ static_assert(utils::typing::is_same_v<typename SPEC::T, float>, "The Vulkan raytracing backend requires T = float");
347
+
348
+ if constexpr (SPEC::ENABLE_OVERLAYS) {
349
+ malloc(device, renderer.transforms);
350
+ }
351
+ if constexpr (SPEC::ENABLE_DYNAMIC_MOTION_BLUR) {
352
+ malloc(device, renderer.transforms_motion);
353
+ std::memset(data(renderer.transforms_motion), 0, decltype(renderer.transforms_motion)::SPEC::SIZE_BYTES);
354
+ malloc(device, renderer.transforms_pair);
355
+ std::memset(data(renderer.transforms_pair), 0, decltype(renderer.transforms_pair)::SPEC::SIZE_BYTES);
356
+ renderer.transforms_motion_staging.assign((size_t)SPEC::MOTION_BLUR_SAMPLES * SPEC::NUM_OVERLAYS * SPEC::MAX_OVERLAY_INSTANCES * 12, 0.0f);
357
+ }
358
+
359
+ renderer.backend = new rendering::raytracing::backends::RendererState<rendering::raytracing::backends::Vulkan, SPEC>{};
360
+ auto* ctx = renderer.backend;
361
+
362
+ VkApplicationInfo application_info{};
363
+ application_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
364
+ application_info.pApplicationName = "rl_tools";
365
+ application_info.apiVersion = VK_API_VERSION_1_2;
366
+ VkInstanceCreateInfo instance_info{};
367
+ instance_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
368
+ instance_info.pApplicationInfo = &application_info;
369
+ vk::check(device, vkCreateInstance(&instance_info, nullptr, &ctx->instance), "Vulkan: instance creation failed");
370
+
371
+ uint32_t physical_device_count = 0;
372
+ vkEnumeratePhysicalDevices(ctx->instance, &physical_device_count, nullptr);
373
+ utils::assert_exit(device, physical_device_count > 0, "Vulkan: no devices available");
374
+ std::vector<VkPhysicalDevice> physical_devices(physical_device_count);
375
+ vkEnumeratePhysicalDevices(ctx->instance, &physical_device_count, physical_devices.data());
376
+
377
+ const char* required_extensions[] = {
378
+ VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME,
379
+ VK_KHR_RAY_QUERY_EXTENSION_NAME,
380
+ VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME
381
+ };
382
+ const char* device_index_env = std::getenv("RL_TOOLS_VULKAN_DEVICE_INDEX");
383
+ int64_t requested_device_index = device_index_env != nullptr ? std::atoll(device_index_env) : -1;
384
+ int64_t selected = -1;
385
+ bool selected_discrete = false;
386
+ for(uint32_t physical_device_i = 0; physical_device_i < physical_device_count; physical_device_i++){
387
+ VkPhysicalDeviceProperties properties;
388
+ vkGetPhysicalDeviceProperties(physical_devices[physical_device_i], &properties);
389
+ if(properties.apiVersion < VK_API_VERSION_1_2){
390
+ continue;
391
+ }
392
+ uint32_t extension_count = 0;
393
+ vkEnumerateDeviceExtensionProperties(physical_devices[physical_device_i], nullptr, &extension_count, nullptr);
394
+ std::vector<VkExtensionProperties> extensions(extension_count);
395
+ vkEnumerateDeviceExtensionProperties(physical_devices[physical_device_i], nullptr, &extension_count, extensions.data());
396
+ bool extensions_present = true;
397
+ for(const char* required : required_extensions){
398
+ bool found = false;
399
+ for(const auto& extension : extensions){
400
+ if(std::strcmp(extension.extensionName, required) == 0){
401
+ found = true;
402
+ break;
403
+ }
404
+ }
405
+ extensions_present = extensions_present && found;
406
+ }
407
+ if(!extensions_present){
408
+ continue;
409
+ }
410
+ VkPhysicalDeviceAccelerationStructureFeaturesKHR acceleration_structure_features{};
411
+ acceleration_structure_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR;
412
+ VkPhysicalDeviceRayQueryFeaturesKHR ray_query_features{};
413
+ ray_query_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR;
414
+ ray_query_features.pNext = &acceleration_structure_features;
415
+ VkPhysicalDeviceVulkan12Features features_1_2{};
416
+ features_1_2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES;
417
+ features_1_2.pNext = &ray_query_features;
418
+ VkPhysicalDeviceFeatures2 features{};
419
+ features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
420
+ features.pNext = &features_1_2;
421
+ vkGetPhysicalDeviceFeatures2(physical_devices[physical_device_i], &features);
422
+ bool features_present = acceleration_structure_features.accelerationStructure && ray_query_features.rayQuery
423
+ && features_1_2.bufferDeviceAddress && features_1_2.runtimeDescriptorArray
424
+ && features_1_2.shaderSampledImageArrayNonUniformIndexing
425
+ && features_1_2.descriptorBindingPartiallyBound && features_1_2.descriptorBindingVariableDescriptorCount;
426
+ if(!features_present){
427
+ continue;
428
+ }
429
+ if(requested_device_index >= 0){
430
+ if((int64_t)physical_device_i == requested_device_index){
431
+ selected = physical_device_i;
432
+ break;
433
+ }
434
+ continue;
435
+ }
436
+ bool discrete = properties.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU;
437
+ if(selected < 0 || (discrete && !selected_discrete)){
438
+ selected = physical_device_i;
439
+ selected_discrete = discrete;
440
+ }
441
+ }
442
+ utils::assert_exit(device, selected >= 0, "Vulkan: no device with ray query support found");
443
+ ctx->physical_device = physical_devices[selected];
444
+ {
445
+ VkPhysicalDeviceAccelerationStructurePropertiesKHR acceleration_structure_properties{};
446
+ acceleration_structure_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR;
447
+ VkPhysicalDeviceProperties2 properties{};
448
+ properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
449
+ properties.pNext = &acceleration_structure_properties;
450
+ vkGetPhysicalDeviceProperties2(ctx->physical_device, &properties);
451
+ ctx->min_scratch_alignment = acceleration_structure_properties.minAccelerationStructureScratchOffsetAlignment;
452
+ RL_TOOLS_RENDERING_RAYTRACING_LOG("Vulkan device: " << properties.properties.deviceName);
453
+ }
454
+
455
+ uint32_t queue_family_count = 0;
456
+ vkGetPhysicalDeviceQueueFamilyProperties(ctx->physical_device, &queue_family_count, nullptr);
457
+ std::vector<VkQueueFamilyProperties> queue_families(queue_family_count);
458
+ vkGetPhysicalDeviceQueueFamilyProperties(ctx->physical_device, &queue_family_count, queue_families.data());
459
+ bool queue_family_found = false;
460
+ for(uint32_t queue_family_i = 0; queue_family_i < queue_family_count; queue_family_i++){
461
+ if((queue_families[queue_family_i].queueFlags & VK_QUEUE_COMPUTE_BIT) != 0){
462
+ ctx->queue_family_index = queue_family_i;
463
+ queue_family_found = true;
464
+ break;
465
+ }
466
+ }
467
+ utils::assert_exit(device, queue_family_found, "Vulkan: no compute queue family");
468
+
469
+ float queue_priority = 1.0f;
470
+ VkDeviceQueueCreateInfo queue_info{};
471
+ queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
472
+ queue_info.queueFamilyIndex = ctx->queue_family_index;
473
+ queue_info.queueCount = 1;
474
+ queue_info.pQueuePriorities = &queue_priority;
475
+ VkPhysicalDeviceAccelerationStructureFeaturesKHR acceleration_structure_features{};
476
+ acceleration_structure_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR;
477
+ acceleration_structure_features.accelerationStructure = VK_TRUE;
478
+ VkPhysicalDeviceRayQueryFeaturesKHR ray_query_features{};
479
+ ray_query_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR;
480
+ ray_query_features.pNext = &acceleration_structure_features;
481
+ ray_query_features.rayQuery = VK_TRUE;
482
+ VkPhysicalDeviceVulkan12Features features_1_2{};
483
+ features_1_2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES;
484
+ features_1_2.pNext = &ray_query_features;
485
+ features_1_2.bufferDeviceAddress = VK_TRUE;
486
+ features_1_2.descriptorIndexing = VK_TRUE;
487
+ features_1_2.runtimeDescriptorArray = VK_TRUE;
488
+ features_1_2.shaderSampledImageArrayNonUniformIndexing = VK_TRUE;
489
+ features_1_2.descriptorBindingPartiallyBound = VK_TRUE;
490
+ features_1_2.descriptorBindingVariableDescriptorCount = VK_TRUE;
491
+ VkDeviceCreateInfo device_info{};
492
+ device_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
493
+ device_info.pNext = &features_1_2;
494
+ device_info.queueCreateInfoCount = 1;
495
+ device_info.pQueueCreateInfos = &queue_info;
496
+ device_info.enabledExtensionCount = 3;
497
+ device_info.ppEnabledExtensionNames = required_extensions;
498
+ vk::check(device, vkCreateDevice(ctx->physical_device, &device_info, nullptr, &ctx->device), "Vulkan: device creation failed");
499
+ vkGetDeviceQueue(ctx->device, ctx->queue_family_index, 0, &ctx->queue);
500
+
501
+ ctx->vkCreateAccelerationStructureKHR = (PFN_vkCreateAccelerationStructureKHR)vkGetDeviceProcAddr(ctx->device, "vkCreateAccelerationStructureKHR");
502
+ ctx->vkDestroyAccelerationStructureKHR = (PFN_vkDestroyAccelerationStructureKHR)vkGetDeviceProcAddr(ctx->device, "vkDestroyAccelerationStructureKHR");
503
+ ctx->vkGetAccelerationStructureBuildSizesKHR = (PFN_vkGetAccelerationStructureBuildSizesKHR)vkGetDeviceProcAddr(ctx->device, "vkGetAccelerationStructureBuildSizesKHR");
504
+ ctx->vkCmdBuildAccelerationStructuresKHR = (PFN_vkCmdBuildAccelerationStructuresKHR)vkGetDeviceProcAddr(ctx->device, "vkCmdBuildAccelerationStructuresKHR");
505
+ ctx->vkGetAccelerationStructureDeviceAddressKHR = (PFN_vkGetAccelerationStructureDeviceAddressKHR)vkGetDeviceProcAddr(ctx->device, "vkGetAccelerationStructureDeviceAddressKHR");
506
+ utils::assert_exit(device, ctx->vkCmdBuildAccelerationStructuresKHR != nullptr, "Vulkan: acceleration structure entry points unavailable");
507
+
508
+ VkCommandPoolCreateInfo pool_info{};
509
+ pool_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
510
+ pool_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
511
+ pool_info.queueFamilyIndex = ctx->queue_family_index;
512
+ vk::check(device, vkCreateCommandPool(ctx->device, &pool_info, nullptr, &ctx->command_pool), "Vulkan: command pool creation failed");
513
+
514
+ VkCommandBufferAllocateInfo command_buffer_info{};
515
+ command_buffer_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
516
+ command_buffer_info.commandPool = ctx->command_pool;
517
+ command_buffer_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
518
+ command_buffer_info.commandBufferCount = 1;
519
+ vk::check(device, vkAllocateCommandBuffers(ctx->device, &command_buffer_info, &ctx->cb_rgb), "Vulkan: command buffer allocation failed");
520
+ vk::check(device, vkAllocateCommandBuffers(ctx->device, &command_buffer_info, &ctx->cb_depth), "Vulkan: command buffer allocation failed");
521
+ vk::check(device, vkAllocateCommandBuffers(ctx->device, &command_buffer_info, &ctx->cb_collision), "Vulkan: command buffer allocation failed");
522
+ vk::check(device, vkAllocateCommandBuffers(ctx->device, &command_buffer_info, &ctx->cb_segmentation), "Vulkan: command buffer allocation failed");
523
+ vk::check(device, vkAllocateCommandBuffers(ctx->device, &command_buffer_info, &ctx->cb_normals), "Vulkan: command buffer allocation failed");
524
+ if constexpr (SPEC::ENABLE_DYNAMIC_MOTION_BLUR) {
525
+ vk::check(device, vkAllocateCommandBuffers(ctx->device, &command_buffer_info, &ctx->cb_dynamic), "Vulkan: command buffer allocation failed");
526
+ }
527
+
528
+ VkFenceCreateInfo fence_info{};
529
+ fence_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
530
+ vk::check(device, vkCreateFence(ctx->device, &fence_info, nullptr, &ctx->fence_render), "Vulkan: fence creation failed");
531
+ vk::check(device, vkCreateFence(ctx->device, &fence_info, nullptr, &ctx->fence_collision), "Vulkan: fence creation failed");
532
+ vk::check(device, vkCreateFence(ctx->device, &fence_info, nullptr, &ctx->fence_update), "Vulkan: fence creation failed");
533
+
534
+ VkSamplerCreateInfo sampler_info{};
535
+ sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
536
+ sampler_info.magFilter = VK_FILTER_LINEAR;
537
+ sampler_info.minFilter = VK_FILTER_LINEAR;
538
+ sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
539
+ sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT;
540
+ sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT;
541
+ sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT;
542
+ vk::check(device, vkCreateSampler(ctx->device, &sampler_info, nullptr, &ctx->sampler), "Vulkan: sampler creation failed");
543
+
544
+ {
545
+ VkDescriptorSetLayoutBinding layout_bindings[vk::bindings::COUNT]{};
546
+ VkDescriptorBindingFlags binding_flags[vk::bindings::COUNT]{};
547
+ for(uint32_t binding_i = 0; binding_i < vk::bindings::COUNT; binding_i++){
548
+ layout_bindings[binding_i].binding = binding_i;
549
+ layout_bindings[binding_i].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
550
+ layout_bindings[binding_i].descriptorCount = 1;
551
+ layout_bindings[binding_i].stageFlags = VK_SHADER_STAGE_COMPUTE_BIT;
552
+ }
553
+ layout_bindings[vk::bindings::ACCELERATION_STRUCTURE].descriptorType = VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR;
554
+ layout_bindings[vk::bindings::OVERLAY_TLAS].descriptorType = VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR;
555
+ layout_bindings[vk::bindings::OVERLAY_TLAS].descriptorCount = SPEC::ENABLE_OVERLAYS ? (uint32_t)SPEC::NUM_OVERLAYS : 1;
556
+ layout_bindings[vk::bindings::TEXTURES].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
557
+ layout_bindings[vk::bindings::TEXTURES].descriptorCount = vk::MAX_TEXTURE_DESCRIPTORS;
558
+ binding_flags[vk::bindings::TEXTURES] = VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT | VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT;
559
+ VkDescriptorSetLayoutBindingFlagsCreateInfo binding_flags_info{};
560
+ binding_flags_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO;
561
+ binding_flags_info.bindingCount = vk::bindings::COUNT;
562
+ binding_flags_info.pBindingFlags = binding_flags;
563
+ VkDescriptorSetLayoutCreateInfo layout_info{};
564
+ layout_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
565
+ layout_info.pNext = &binding_flags_info;
566
+ layout_info.bindingCount = vk::bindings::COUNT;
567
+ layout_info.pBindings = layout_bindings;
568
+ vk::check(device, vkCreateDescriptorSetLayout(ctx->device, &layout_info, nullptr, &ctx->descriptor_set_layout), "Vulkan: descriptor set layout creation failed");
569
+ VkPipelineLayoutCreateInfo pipeline_layout_info{};
570
+ pipeline_layout_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
571
+ pipeline_layout_info.setLayoutCount = 1;
572
+ pipeline_layout_info.pSetLayouts = &ctx->descriptor_set_layout;
573
+ // per-pass shutter time for the dynamic-motion-blur dispatches; harmless for entry
574
+ // points that do not declare the push-constant block
575
+ VkPushConstantRange push_constant_range{VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(float)};
576
+ pipeline_layout_info.pushConstantRangeCount = 1;
577
+ pipeline_layout_info.pPushConstantRanges = &push_constant_range;
578
+ vk::check(device, vkCreatePipelineLayout(ctx->device, &pipeline_layout_info, nullptr, &ctx->pipeline_layout), "Vulkan: pipeline layout creation failed");
579
+ }
580
+
581
+ auto make_module = [&](const uint32_t* words, size_t size_bytes) -> VkShaderModule {
582
+ VkShaderModuleCreateInfo module_info{};
583
+ module_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
584
+ module_info.codeSize = size_bytes;
585
+ module_info.pCode = words;
586
+ VkShaderModule module;
587
+ vk::check(device, vkCreateShaderModule(ctx->device, &module_info, nullptr, &module), "Vulkan: shader module creation failed");
588
+ return module;
589
+ };
590
+ size_t spirv_size = 0;
591
+ const uint32_t* spirv = nullptr;
592
+ if constexpr (SPEC::HAS_RGB) {
593
+ spirv = rendering::raytracing::backends::vulkan::device_spirv_rgb(spirv_size);
594
+ ctx->module_rgb = make_module(spirv, spirv_size);
595
+ }
596
+ if constexpr (SPEC::HAS_DEPTH) {
597
+ spirv = rendering::raytracing::backends::vulkan::device_spirv_depth(spirv_size);
598
+ ctx->module_depth = make_module(spirv, spirv_size);
599
+ }
600
+ if constexpr (SPEC::HAS_SEGMENTATION) {
601
+ spirv = rendering::raytracing::backends::vulkan::device_spirv_segmentation(spirv_size);
602
+ ctx->module_segmentation = make_module(spirv, spirv_size);
603
+ }
604
+ if constexpr (SPEC::HAS_NORMALS) {
605
+ spirv = rendering::raytracing::backends::vulkan::device_spirv_normals(spirv_size);
606
+ ctx->module_normals = make_module(spirv, spirv_size);
607
+ }
608
+ if constexpr (SPEC::ENABLE_DYNAMIC_MOTION_BLUR) {
609
+ spirv = rendering::raytracing::backends::vulkan::device_spirv_resolve(spirv_size);
610
+ ctx->module_resolve = make_module(spirv, spirv_size);
611
+ }
612
+ #if !RL_TOOLS_RENDERING_RAYTRACING_DISABLE_PROBE_RAYS
613
+ spirv = rendering::raytracing::backends::vulkan::device_spirv_collision(spirv_size);
614
+ ctx->module_collision = make_module(spirv, spirv_size);
615
+ #endif
616
+
617
+ // mapped like Metal's StorageModeShared, but preferring host-visible VRAM (BAR/ReBAR) so per-frame shader access stays at device speed
618
+ constexpr VkMemoryPropertyFlags HOST_MEMORY = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
619
+ constexpr VkBufferUsageFlags STORAGE = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
620
+ constexpr typename SPEC::TI cam_pixels = SPEC::CAM_PIXELS;
621
+ constexpr size_t camera_bytes = (size_t)SPEC::NUM_CAMERAS * sizeof(rendering::raytracing::Camera<typename SPEC::T>);
622
+ ctx->launch_params = vk::create_buffer(device, *ctx, sizeof(vk::LaunchParams), STORAGE, HOST_MEMORY, true);
623
+ ctx->cameras = vk::create_buffer(device, *ctx, camera_bytes, STORAGE, HOST_MEMORY, true);
624
+ // camera tensors alias the mapped shader buffers (see cameras(device, renderer)):
625
+ // host writes are consumed by the next launch with no staging copy
626
+ renderer.cameras._data = (rendering::raytracing::Camera<typename SPEC::T>*)ctx->cameras.mapped;
627
+ if constexpr (SPEC::ENABLE_MOTION_BLUR) {
628
+ ctx->cameras_open = vk::create_buffer(device, *ctx, camera_bytes, STORAGE, HOST_MEMORY, true);
629
+ renderer.cameras_open._data = (rendering::raytracing::Camera<typename SPEC::T>*)ctx->cameras_open.mapped;
630
+ }
631
+ // the output tensors alias the mapped shader buffers (see frame_buffer/depth_buffer/
632
+ // segmentation_buffer/collision_results/observation accessors) — consumers read in place
633
+ if constexpr (SPEC::HAS_RGB) {
634
+ ctx->frame_buffer = vk::create_buffer(device, *ctx, (size_t)SPEC::NUM_CAMERAS * cam_pixels * sizeof(uint32_t), STORAGE, HOST_MEMORY, true);
635
+ renderer.frame_buffer._data = (uint32_t*)ctx->frame_buffer.mapped;
636
+ }
637
+ if constexpr (SPEC::HAS_DEPTH) {
638
+ ctx->depth_buffer = vk::create_buffer(device, *ctx, (size_t)SPEC::NUM_CAMERAS * cam_pixels * sizeof(float), STORAGE, HOST_MEMORY, true);
639
+ renderer.depth_buffer._data = (float*)ctx->depth_buffer.mapped;
640
+ }
641
+ if constexpr (SPEC::HAS_SEGMENTATION) {
642
+ ctx->segmentation_buffer = vk::create_buffer(device, *ctx, (size_t)SPEC::NUM_CAMERAS * cam_pixels * sizeof(uint32_t), STORAGE, HOST_MEMORY, true);
643
+ renderer.segmentation_buffer._data = (uint32_t*)ctx->segmentation_buffer.mapped;
644
+ }
645
+ if constexpr (SPEC::HAS_NORMALS) {
646
+ ctx->normals_buffer = vk::create_buffer(device, *ctx, (size_t)SPEC::NUM_CAMERAS * cam_pixels * 3 * sizeof(float), STORAGE, HOST_MEMORY, true);
647
+ renderer.normals_buffer._data = (float*)ctx->normals_buffer.mapped;
648
+ }
649
+ if constexpr (SPEC::HAS_OBSERVATION) {
650
+ static_assert(utils::typing::is_same_v<typename SPEC::OBSERVATION_T, float>, "The Vulkan raytracing backend requires OBSERVATION_T = float");
651
+ ctx->observation = vk::create_buffer(device, *ctx, (size_t)SPEC::NUM_CAMERAS * cam_pixels * SPEC::OBSERVATION_CHANNELS * sizeof(float), STORAGE, HOST_MEMORY, true);
652
+ renderer.observation._data = (float*)ctx->observation.mapped;
653
+ }
654
+ if constexpr (SPEC::ENABLE_DYNAMIC_MOTION_BLUR) {
655
+ constexpr VkBufferUsageFlags ACCUMULATOR = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; // vkCmdFillBuffer zeroes them at frame start
656
+ if constexpr (SPEC::HAS_RGB) {
657
+ ctx->rgb_accumulator = vk::create_buffer(device, *ctx, (size_t)SPEC::NUM_CAMERAS * cam_pixels * 3 * sizeof(float), ACCUMULATOR, HOST_MEMORY, true);
658
+ renderer.rgb_accumulator._data = (float*)ctx->rgb_accumulator.mapped;
659
+ }
660
+ if constexpr (SPEC::HAS_DEPTH) {
661
+ ctx->depth_accumulator = vk::create_buffer(device, *ctx, (size_t)SPEC::NUM_CAMERAS * cam_pixels * sizeof(float), ACCUMULATOR, HOST_MEMORY, true);
662
+ renderer.depth_accumulator._data = (float*)ctx->depth_accumulator.mapped;
663
+ }
664
+ }
665
+ #if !RL_TOOLS_RENDERING_RAYTRACING_DISABLE_PROBE_RAYS
666
+ ctx->collision_results = vk::create_buffer(device, *ctx, (size_t)SPEC::NUM_CAMERAS * SPEC::NUM_PROBES * sizeof(rendering::raytracing::CollisionResult), STORAGE, HOST_MEMORY, true);
667
+ renderer.collision_results._data = (rendering::raytracing::CollisionResult*)ctx->collision_results.mapped;
668
+ ctx->probe_directions = vk::create_buffer(device, *ctx, (size_t)SPEC::NUM_PROBES * 3 * sizeof(float), STORAGE, HOST_MEMORY, true);
669
+ #endif
670
+ ctx->dummy = vk::create_buffer(device, *ctx, 64, STORAGE, HOST_MEMORY, false);
671
+ rendering::raytracing::detail::announce_backend(renderer);
672
+ }
673
+
674
+ template <typename DEVICE, typename SPEC>
675
+ void update(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer);
676
+
677
+ template <typename DEVICE, typename SPEC>
678
+ void init(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer, const rendering::raytracing::Scene& scene, const rendering::raytracing::AssetPool& pool){
679
+ namespace vk = rendering::raytracing::backends::vulkan;
680
+ using TI = typename SPEC::TI;
681
+ auto& ctx = vk::context(renderer);
682
+
683
+ rendering::raytracing::detail::compute_scene_bounds(renderer, scene);
684
+
685
+ std::vector<const rendering::raytracing::Object*> all_objects;
686
+ for(const auto& object : scene.objects){
687
+ all_objects.push_back(&object);
688
+ }
689
+ if constexpr (SPEC::ENABLE_OVERLAYS){
690
+ rendering::raytracing::detail::register_pool_assets(device, renderer, pool, all_objects);
691
+ }
692
+ RL_TOOLS_RENDERING_RAYTRACING_LOG("building " << all_objects.size() << " objects / " << scene.instances.size() << " instances ...");
693
+
694
+ // scene-dependent resources from a previous init are released here; the pipelines are
695
+ // spec-dependent and survive re-init
696
+ vk::check(device, vkDeviceWaitIdle(ctx.device), "Vulkan: device wait idle failed");
697
+ ctx.render_in_flight = false;
698
+ ctx.collision_in_flight = false;
699
+ vkResetFences(ctx.device, 1, &ctx.fence_render);
700
+ vkResetFences(ctx.device, 1, &ctx.fence_collision);
701
+ vk::destroy_scene_resources(ctx);
702
+
703
+ constexpr VkMemoryPropertyFlags HOST_MEMORY = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
704
+ constexpr VkMemoryPropertyFlags STAGING_MEMORY = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
705
+
706
+ // meshes flattened across all objects; object_record_base[object] is the first index of
707
+ // that object's meshes in the flat order (mesh_records, offsets, BLAS geometry all agree)
708
+ std::vector<const rendering::raytracing::Mesh*> all_meshes;
709
+ ctx.object_record_base.assign(all_objects.size(), 0);
710
+ ctx.object_classes.assign(all_objects.size(), 0);
711
+ for(size_t object_i = 0; object_i < all_objects.size(); object_i++){
712
+ ctx.object_record_base[object_i] = (uint32_t)all_meshes.size();
713
+ ctx.object_classes[object_i] = all_objects[object_i]->segmentation_class;
714
+ for(const auto& mesh : all_objects[object_i]->meshes){
715
+ all_meshes.push_back(&mesh);
716
+ }
717
+ }
718
+ const size_t num_meshes = all_meshes.size();
719
+ std::vector<size_t> vertex_offsets(num_meshes), index_offsets(num_meshes), tex_coord_offsets(num_meshes), normal_offsets(num_meshes);
720
+ size_t mesh_data_size = 0;
721
+ auto append_section = [&](size_t bytes) -> size_t {
722
+ size_t offset = mesh_data_size;
723
+ mesh_data_size += (bytes + 15) & ~(size_t)15;
724
+ return offset;
725
+ };
726
+ for(size_t mesh_i = 0; mesh_i < num_meshes; mesh_i++){
727
+ const auto& mesh = *all_meshes[mesh_i];
728
+ vertex_offsets[mesh_i] = append_section(mesh.vertices.size() * sizeof(float));
729
+ index_offsets[mesh_i] = append_section(mesh.indices.size() * sizeof(int));
730
+ tex_coord_offsets[mesh_i] = mesh.tex_coords.empty() ? 0 : append_section(mesh.tex_coords.size() * sizeof(float));
731
+ normal_offsets[mesh_i] = mesh.normals.empty() ? 0 : append_section(mesh.normals.size() * sizeof(float));
732
+ }
733
+ std::vector<uint8_t> mesh_data_host(mesh_data_size);
734
+ for(size_t mesh_i = 0; mesh_i < num_meshes; mesh_i++){
735
+ const auto& mesh = *all_meshes[mesh_i];
736
+ std::memcpy(mesh_data_host.data() + vertex_offsets[mesh_i], mesh.vertices.data(), mesh.vertices.size() * sizeof(float));
737
+ std::memcpy(mesh_data_host.data() + index_offsets[mesh_i], mesh.indices.data(), mesh.indices.size() * sizeof(int));
738
+ if(!mesh.tex_coords.empty()){
739
+ std::memcpy(mesh_data_host.data() + tex_coord_offsets[mesh_i], mesh.tex_coords.data(), mesh.tex_coords.size() * sizeof(float));
740
+ }
741
+ if(!mesh.normals.empty()){
742
+ std::memcpy(mesh_data_host.data() + normal_offsets[mesh_i], mesh.normals.data(), mesh.normals.size() * sizeof(float));
743
+ }
744
+ }
745
+ ctx.mesh_data = vk::create_buffer(device, ctx, mesh_data_size,
746
+ VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR,
747
+ VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, false);
748
+ vk::upload_buffer(device, ctx, ctx.mesh_data, mesh_data_host.data(), mesh_data_size);
749
+ const VkDeviceAddress mesh_data_address = vk::buffer_address(ctx, ctx.mesh_data);
750
+
751
+ std::vector<vk::MeshRecord> mesh_records(num_meshes);
752
+ std::vector<vk::BufferResource> texture_stagings;
753
+ ctx.mesh_textures.clear();
754
+ {
755
+ const uint8_t dummy_pixel[4] = {255, 255, 255, 255};
756
+ ctx.mesh_textures.push_back(vk::create_texture_image(device, ctx, 1, 1, false));
757
+ vk::BufferResource staging = vk::create_buffer(device, ctx, 4, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, STAGING_MEMORY, true);
758
+ std::memcpy(staging.mapped, dummy_pixel, 4);
759
+ texture_stagings.push_back(staging);
760
+ }
761
+ std::vector<int> texture_widths = {1}, texture_heights = {1};
762
+ auto add_texture = [&](const rendering::raytracing::Texture& texture, bool srgb) -> uint32_t {
763
+ uint32_t texture_index = (uint32_t)ctx.mesh_textures.size();
764
+ ctx.mesh_textures.push_back(vk::create_texture_image(device, ctx, texture.width, texture.height, srgb));
765
+ vk::BufferResource staging = vk::create_buffer(device, ctx, texture.pixels.size(), VK_BUFFER_USAGE_TRANSFER_SRC_BIT, STAGING_MEMORY, true);
766
+ std::memcpy(staging.mapped, texture.pixels.data(), texture.pixels.size());
767
+ texture_stagings.push_back(staging);
768
+ texture_widths.push_back(texture.width);
769
+ texture_heights.push_back(texture.height);
770
+ return texture_index;
771
+ };
772
+ for(size_t mesh_i = 0; mesh_i < num_meshes; mesh_i++){
773
+ const auto& mesh = *all_meshes[mesh_i];
774
+ vk::MeshRecord& record = mesh_records[mesh_i];
775
+ record = {};
776
+ record.vertices = mesh_data_address + vertex_offsets[mesh_i];
777
+ record.index = mesh_data_address + index_offsets[mesh_i];
778
+ record.has_tex_coord = mesh.tex_coords.empty() ? 0 : 1;
779
+ record.tex_coord = record.has_tex_coord ? mesh_data_address + tex_coord_offsets[mesh_i] : 0;
780
+ record.has_normals = mesh.normals.empty() ? 0 : 1;
781
+ record.normal = record.has_normals ? mesh_data_address + normal_offsets[mesh_i] : 0;
782
+ record.color[0] = mesh.color[0];
783
+ record.color[1] = mesh.color[1];
784
+ record.color[2] = mesh.color[2];
785
+ record.metallic = mesh.metallic;
786
+ record.roughness = mesh.roughness;
787
+ record.opacity = mesh.opacity;
788
+ record.emissive[0] = mesh.emissive[0];
789
+ record.emissive[1] = mesh.emissive[1];
790
+ record.emissive[2] = mesh.emissive[2];
791
+ record.alpha_cutoff = mesh.alpha_cutoff;
792
+ record.alpha_mode = mesh.alpha_mode;
793
+ if(mesh.texture.present()){
794
+ record.texture = add_texture(mesh.texture, true);
795
+ record.has_texture = 1;
796
+ }
797
+ if(mesh.normal_map.present()){
798
+ record.normal_map = add_texture(mesh.normal_map, false);
799
+ record.has_normal_map = 1;
800
+ }
801
+ if(mesh.metallic_roughness_map.present()){
802
+ record.metallic_roughness_map = add_texture(mesh.metallic_roughness_map, false);
803
+ record.has_metallic_roughness_map = 1;
804
+ }
805
+ if(mesh.emissive_map.present()){
806
+ record.emissive_map = add_texture(mesh.emissive_map, true);
807
+ record.has_emissive_map = 1;
808
+ }
809
+ if(mesh.occlusion_map.present()){
810
+ record.occlusion_map = add_texture(mesh.occlusion_map, false);
811
+ record.has_occlusion_map = 1;
812
+ }
813
+ }
814
+ {
815
+ VkCommandBuffer command_buffer = vk::one_shot_begin(device, ctx);
816
+ for(size_t texture_i = 0; texture_i < ctx.mesh_textures.size(); texture_i++){
817
+ vk::record_texture_upload(command_buffer, ctx.mesh_textures[texture_i], texture_stagings[texture_i], texture_widths[texture_i], texture_heights[texture_i]);
818
+ }
819
+ vk::one_shot_end(device, ctx, command_buffer);
820
+ for(auto& staging : texture_stagings){
821
+ vk::destroy_buffer(ctx, staging);
822
+ }
823
+ }
824
+
825
+ ctx.mesh_records = vk::create_buffer(device, ctx, mesh_records.size() * sizeof(vk::MeshRecord), VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, HOST_MEMORY, true);
826
+ std::memcpy(ctx.mesh_records.mapped, mesh_records.data(), mesh_records.size() * sizeof(vk::MeshRecord));
827
+
828
+ const auto scene_lights = rendering::raytracing::detail::effective_scene_lights<SPEC::HAS_RGB && SPEC::SHADING::PBR_SHADING>(scene);
829
+ {
830
+ const size_t scene_lights_bytes = scene_lights.empty() ? sizeof(rendering::raytracing::SceneLight) : scene_lights.size() * sizeof(rendering::raytracing::SceneLight);
831
+ ctx.scene_lights = vk::create_buffer(device, ctx, scene_lights_bytes, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, HOST_MEMORY, true);
832
+ if(!scene_lights.empty()){
833
+ std::memcpy(ctx.scene_lights.mapped, scene_lights.data(), scene_lights.size() * sizeof(rendering::raytracing::SceneLight));
834
+ }
835
+ }
836
+
837
+ auto* params = (vk::LaunchParams*)ctx.launch_params.mapped;
838
+ *params = {};
839
+ params->fb_width = SPEC::FB_WIDTH;
840
+ params->fb_height = SPEC::FB_HEIGHT;
841
+ params->cam_width = SPEC::CAM_WIDTH;
842
+ params->cam_height = SPEC::CAM_HEIGHT;
843
+ params->grid_cols = SPEC::GRID_COLS;
844
+ params->num_cameras = SPEC::NUM_CAMERAS;
845
+ params->num_probes = SPEC::NUM_PROBES;
846
+ params->num_scene_lights = (uint32_t)scene_lights.size();
847
+ params->max_depth = renderer.camera_radius > 0 ? renderer.camera_radius * 2.0f : 1e30f;
848
+ params->max_dist = renderer.camera_radius * 2.0f;
849
+ params->ambient_color[0] = 0.10f;
850
+ params->ambient_color[1] = 0.10f;
851
+ params->ambient_color[2] = 0.10f;
852
+ if constexpr (SPEC::HAS_RGB && SPEC::SHADING::PBR_SHADING) {
853
+ params->miss_color_0[0] = 0.f; params->miss_color_0[1] = 0.f; params->miss_color_0[2] = 0.f;
854
+ params->miss_color_1[0] = 0.f; params->miss_color_1[1] = 0.f; params->miss_color_1[2] = 0.f;
855
+ } else {
856
+ params->miss_color_0[0] = .8f; params->miss_color_0[1] = 0.f; params->miss_color_0[2] = 0.f;
857
+ params->miss_color_1[0] = .8f; params->miss_color_1[1] = .8f; params->miss_color_1[2] = .8f;
858
+ }
859
+
860
+ const size_t num_objects = all_objects.size();
861
+ const size_t num_scene_instances = scene.instances.size();
862
+ // dynamic motion blur appends one extra overlay id range per motion sample: sample s's
863
+ // instances carry shifted custom indices (num_scene + num_overlay_slots * (1 + s) + slot)
864
+ // so each pass's hits index a private slice of the instance side tables with no shader
865
+ // changes; the contract ids [num_scene, num_scene + num_overlay_slots) stay exclusive to
866
+ // the shutter-close state that segmentation reads
867
+ constexpr size_t num_overlay_slots = SPEC::ENABLE_OVERLAYS ? (size_t)SPEC::NUM_OVERLAYS * SPEC::MAX_OVERLAY_INSTANCES : 0;
868
+ constexpr size_t overlay_id_ranges = SPEC::ENABLE_DYNAMIC_MOTION_BLUR ? (size_t)1 + SPEC::MOTION_BLUR_SAMPLES : 1;
869
+ const size_t total_instances = num_scene_instances + num_overlay_slots * overlay_id_ranges;
870
+ utils::assert_exit(device, total_instances < ((size_t)1 << 24), "Vulkan: instanceCustomIndex limits instance ids to 24 bits");
871
+ ctx.num_scene_instances = (uint32_t)num_scene_instances;
872
+ {
873
+ const VkDeviceSize scratch_alignment = ctx.min_scratch_alignment;
874
+ // one BLAS per object (one geometry per mesh, so geometry_index = mesh index within
875
+ // the object), all built in one command buffer from a shared scratch buffer
876
+ std::vector<std::vector<VkAccelerationStructureGeometryKHR>> object_geometries(num_objects);
877
+ std::vector<std::vector<VkAccelerationStructureBuildRangeInfoKHR>> object_ranges(num_objects);
878
+ std::vector<VkAccelerationStructureBuildGeometryInfoKHR> blas_build_infos(num_objects);
879
+ std::vector<const VkAccelerationStructureBuildRangeInfoKHR*> blas_range_pointers(num_objects);
880
+ std::vector<VkDeviceSize> blas_scratch_offsets(num_objects);
881
+ VkDeviceSize blas_scratch_size = 0;
882
+ ctx.blas_list.resize(num_objects, VK_NULL_HANDLE);
883
+ ctx.blas_buffers.resize(num_objects);
884
+ ctx.blas_addresses.resize(num_objects, 0);
885
+ for(size_t object_i = 0; object_i < num_objects; object_i++){
886
+ const size_t first_mesh = ctx.object_record_base[object_i];
887
+ const size_t object_num_meshes = all_objects[object_i]->meshes.size();
888
+ auto& geometries = object_geometries[object_i];
889
+ auto& ranges = object_ranges[object_i];
890
+ geometries.resize(object_num_meshes);
891
+ ranges.resize(object_num_meshes);
892
+ std::vector<uint32_t> primitive_counts(object_num_meshes);
893
+ for(size_t mesh_local = 0; mesh_local < object_num_meshes; mesh_local++){
894
+ const size_t mesh_i = first_mesh + mesh_local;
895
+ const auto& mesh = *all_meshes[mesh_i];
896
+ VkAccelerationStructureGeometryKHR& geometry = geometries[mesh_local];
897
+ geometry = {};
898
+ geometry.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR;
899
+ geometry.geometryType = VK_GEOMETRY_TYPE_TRIANGLES_KHR;
900
+ geometry.flags = VK_GEOMETRY_OPAQUE_BIT_KHR;
901
+ geometry.geometry.triangles = {};
902
+ geometry.geometry.triangles.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR;
903
+ geometry.geometry.triangles.vertexFormat = VK_FORMAT_R32G32B32_SFLOAT;
904
+ geometry.geometry.triangles.vertexData.deviceAddress = mesh_data_address + vertex_offsets[mesh_i];
905
+ geometry.geometry.triangles.vertexStride = 3 * sizeof(float);
906
+ geometry.geometry.triangles.maxVertex = (uint32_t)(mesh.vertices.size() / 3) - 1;
907
+ geometry.geometry.triangles.indexType = VK_INDEX_TYPE_UINT32;
908
+ geometry.geometry.triangles.indexData.deviceAddress = mesh_data_address + index_offsets[mesh_i];
909
+ ranges[mesh_local] = {};
910
+ ranges[mesh_local].primitiveCount = (uint32_t)(mesh.indices.size() / 3);
911
+ primitive_counts[mesh_local] = ranges[mesh_local].primitiveCount;
912
+ }
913
+ VkAccelerationStructureBuildGeometryInfoKHR& build_info = blas_build_infos[object_i];
914
+ build_info = {};
915
+ build_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR;
916
+ build_info.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR;
917
+ build_info.flags = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR;
918
+ build_info.mode = VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR;
919
+ build_info.geometryCount = (uint32_t)geometries.size();
920
+ build_info.pGeometries = geometries.data();
921
+ VkAccelerationStructureBuildSizesInfoKHR blas_sizes{};
922
+ blas_sizes.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_SIZES_INFO_KHR;
923
+ ctx.vkGetAccelerationStructureBuildSizesKHR(ctx.device, VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR, &build_info, primitive_counts.data(), &blas_sizes);
924
+
925
+ ctx.blas_buffers[object_i] = vk::create_buffer(device, ctx, blas_sizes.accelerationStructureSize,
926
+ VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
927
+ VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, false);
928
+ VkAccelerationStructureCreateInfoKHR blas_info{};
929
+ blas_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_KHR;
930
+ blas_info.buffer = ctx.blas_buffers[object_i].buffer;
931
+ blas_info.size = blas_sizes.accelerationStructureSize;
932
+ blas_info.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR;
933
+ vk::check(device, ctx.vkCreateAccelerationStructureKHR(ctx.device, &blas_info, nullptr, &ctx.blas_list[object_i]), "Vulkan: BLAS creation failed");
934
+
935
+ VkAccelerationStructureDeviceAddressInfoKHR blas_address_info{};
936
+ blas_address_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_DEVICE_ADDRESS_INFO_KHR;
937
+ blas_address_info.accelerationStructure = ctx.blas_list[object_i];
938
+ ctx.blas_addresses[object_i] = ctx.vkGetAccelerationStructureDeviceAddressKHR(ctx.device, &blas_address_info);
939
+
940
+ blas_scratch_offsets[object_i] = blas_scratch_size;
941
+ blas_scratch_size += (blas_sizes.buildScratchSize + scratch_alignment - 1) & ~(VkDeviceSize)(scratch_alignment - 1);
942
+
943
+ build_info.dstAccelerationStructure = ctx.blas_list[object_i];
944
+ blas_range_pointers[object_i] = ranges.data();
945
+ }
946
+
947
+ // base-scene TLAS over scene.instances; VkTransformMatrixKHR is 3x4 row-major [R|t],
948
+ // the same layout as Instance::transform — no transposition
949
+ ctx.instance_buffer = vk::create_buffer(device, ctx, (num_scene_instances > 0 ? num_scene_instances : 1) * sizeof(VkAccelerationStructureInstanceKHR),
950
+ VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
951
+ HOST_MEMORY, true);
952
+ auto* instance_descriptors = (VkAccelerationStructureInstanceKHR*)ctx.instance_buffer.mapped;
953
+ for(size_t instance_i = 0; instance_i < num_scene_instances; instance_i++){
954
+ const auto& instance = scene.instances[instance_i];
955
+ VkAccelerationStructureInstanceKHR& descriptor = instance_descriptors[instance_i];
956
+ descriptor = {};
957
+ std::memcpy(descriptor.transform.matrix, instance.transform, sizeof(descriptor.transform.matrix));
958
+ descriptor.instanceCustomIndex = (uint32_t)instance_i;
959
+ descriptor.mask = 0xFF;
960
+ descriptor.accelerationStructureReference = ctx.blas_addresses[instance.object];
961
+ }
962
+
963
+ VkAccelerationStructureGeometryKHR tlas_geometry{};
964
+ tlas_geometry.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR;
965
+ tlas_geometry.geometryType = VK_GEOMETRY_TYPE_INSTANCES_KHR;
966
+ tlas_geometry.geometry.instances = {};
967
+ tlas_geometry.geometry.instances.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR;
968
+ tlas_geometry.geometry.instances.data.deviceAddress = vk::buffer_address(ctx, ctx.instance_buffer);
969
+ VkAccelerationStructureBuildGeometryInfoKHR tlas_build_info{};
970
+ tlas_build_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR;
971
+ tlas_build_info.type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR;
972
+ tlas_build_info.flags = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR;
973
+ tlas_build_info.mode = VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR;
974
+ tlas_build_info.geometryCount = 1;
975
+ tlas_build_info.pGeometries = &tlas_geometry;
976
+ uint32_t tlas_primitive_count = (uint32_t)num_scene_instances;
977
+ VkAccelerationStructureBuildSizesInfoKHR tlas_sizes{};
978
+ tlas_sizes.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_SIZES_INFO_KHR;
979
+ ctx.vkGetAccelerationStructureBuildSizesKHR(ctx.device, VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR, &tlas_build_info, &tlas_primitive_count, &tlas_sizes);
980
+
981
+ ctx.tlas_buffer = vk::create_buffer(device, ctx, tlas_sizes.accelerationStructureSize,
982
+ VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
983
+ VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, false);
984
+ VkAccelerationStructureCreateInfoKHR tlas_info{};
985
+ tlas_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_KHR;
986
+ tlas_info.buffer = ctx.tlas_buffer.buffer;
987
+ tlas_info.size = tlas_sizes.accelerationStructureSize;
988
+ tlas_info.type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR;
989
+ vk::check(device, ctx.vkCreateAccelerationStructureKHR(ctx.device, &tlas_info, nullptr, &ctx.tlas), "Vulkan: TLAS creation failed");
990
+
991
+ const VkDeviceSize tlas_scratch_offset = blas_scratch_size;
992
+ const VkDeviceSize scratch_size = blas_scratch_size + tlas_sizes.buildScratchSize + scratch_alignment;
993
+ vk::BufferResource scratch = vk::create_buffer(device, ctx, scratch_size,
994
+ VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
995
+ VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, false);
996
+ VkDeviceAddress scratch_address = vk::buffer_address(ctx, scratch);
997
+ scratch_address = (scratch_address + scratch_alignment - 1) & ~(VkDeviceAddress)(scratch_alignment - 1);
998
+ for(size_t object_i = 0; object_i < num_objects; object_i++){
999
+ blas_build_infos[object_i].scratchData.deviceAddress = scratch_address + blas_scratch_offsets[object_i];
1000
+ }
1001
+ tlas_build_info.dstAccelerationStructure = ctx.tlas;
1002
+ tlas_build_info.scratchData.deviceAddress = scratch_address + tlas_scratch_offset;
1003
+
1004
+ VkCommandBuffer command_buffer = vk::one_shot_begin(device, ctx);
1005
+ if(num_objects > 0){
1006
+ ctx.vkCmdBuildAccelerationStructuresKHR(command_buffer, (uint32_t)num_objects, blas_build_infos.data(), blas_range_pointers.data());
1007
+ }
1008
+ VkMemoryBarrier build_barrier{};
1009
+ build_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
1010
+ build_barrier.srcAccessMask = VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR;
1011
+ build_barrier.dstAccessMask = VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR;
1012
+ vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, 0, 1, &build_barrier, 0, nullptr, 0, nullptr);
1013
+ VkAccelerationStructureBuildRangeInfoKHR tlas_range{};
1014
+ tlas_range.primitiveCount = (uint32_t)num_scene_instances;
1015
+ const VkAccelerationStructureBuildRangeInfoKHR* tlas_ranges = &tlas_range;
1016
+ ctx.vkCmdBuildAccelerationStructuresKHR(command_buffer, 1, &tlas_build_info, &tlas_ranges);
1017
+ vk::one_shot_end(device, ctx, command_buffer);
1018
+ vk::destroy_buffer(ctx, scratch);
1019
+ }
1020
+ // global instance-id-indexed side tables covering the scene instances and the whole
1021
+ // overlay pool; the shading code needs no overlay-vs-base branch
1022
+ ctx.instance_data = vk::create_buffer(device, ctx, (total_instances > 0 ? total_instances : 1) * sizeof(vk::InstanceData), VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, HOST_MEMORY, true);
1023
+ ctx.instance_record_base = vk::create_buffer(device, ctx, (total_instances > 0 ? total_instances : 1) * sizeof(uint32_t), VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, HOST_MEMORY, true);
1024
+ ctx.instance_classes = vk::create_buffer(device, ctx, (total_instances > 0 ? total_instances : 1) * sizeof(uint32_t), VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, HOST_MEMORY, true);
1025
+ {
1026
+ auto* instance_data = (vk::InstanceData*)ctx.instance_data.mapped;
1027
+ auto* instance_record_base = (uint32_t*)ctx.instance_record_base.mapped;
1028
+ auto* instance_classes = (uint32_t*)ctx.instance_classes.mapped;
1029
+ std::memset(instance_data, 0, ctx.instance_data.size);
1030
+ std::memset(instance_record_base, 0, ctx.instance_record_base.size);
1031
+ std::memset(instance_classes, 0, ctx.instance_classes.size);
1032
+ for(size_t instance_i = 0; instance_i < num_scene_instances; instance_i++){
1033
+ const auto& instance = scene.instances[instance_i];
1034
+ auto& data = instance_data[instance_i];
1035
+ for(int element = 0; element < 12; element++){
1036
+ data.object_to_world[element] = instance.transform[element];
1037
+ }
1038
+ if(instance.identity){
1039
+ std::memcpy(data.world_to_object, data.object_to_world, sizeof(data.world_to_object));
1040
+ }
1041
+ else{
1042
+ rendering::raytracing::detail::invert_transform(instance.transform, data.world_to_object);
1043
+ }
1044
+ data.identity = instance.identity ? 1 : 0;
1045
+ instance_record_base[instance_i] = ctx.object_record_base[instance.object];
1046
+ instance_classes[instance_i] = ctx.object_classes[instance.object];
1047
+ }
1048
+ }
1049
+
1050
+ if constexpr (SPEC::ENABLE_OVERLAYS){
1051
+ const VkDeviceSize scratch_alignment = ctx.min_scratch_alignment;
1052
+ // per-overlay TLAS sized for the full slot capacity and rebuilt IN PLACE by update():
1053
+ // the VkAccelerationStructureKHR handle never changes, so the descriptor array below
1054
+ // and the pre-recorded command buffers stay valid across rebuilds
1055
+ VkAccelerationStructureGeometryKHR overlay_geometry{};
1056
+ overlay_geometry.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR;
1057
+ overlay_geometry.geometryType = VK_GEOMETRY_TYPE_INSTANCES_KHR;
1058
+ overlay_geometry.geometry.instances = {};
1059
+ overlay_geometry.geometry.instances.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR;
1060
+ VkAccelerationStructureBuildGeometryInfoKHR overlay_build_info{};
1061
+ overlay_build_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR;
1062
+ overlay_build_info.type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR;
1063
+ overlay_build_info.flags = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR;
1064
+ overlay_build_info.mode = VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR;
1065
+ overlay_build_info.geometryCount = 1;
1066
+ overlay_build_info.pGeometries = &overlay_geometry;
1067
+ uint32_t overlay_capacity = (uint32_t)SPEC::MAX_OVERLAY_INSTANCES;
1068
+ VkAccelerationStructureBuildSizesInfoKHR overlay_sizes{};
1069
+ overlay_sizes.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_SIZES_INFO_KHR;
1070
+ ctx.vkGetAccelerationStructureBuildSizesKHR(ctx.device, VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR, &overlay_build_info, &overlay_capacity, &overlay_sizes);
1071
+ ctx.overlay_scratch_stride = (overlay_sizes.buildScratchSize + scratch_alignment - 1) & ~(VkDeviceSize)(scratch_alignment - 1);
1072
+ ctx.overlay_scratch = vk::create_buffer(device, ctx, (VkDeviceSize)SPEC::NUM_OVERLAYS * ctx.overlay_scratch_stride + scratch_alignment,
1073
+ VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
1074
+ VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, false);
1075
+ for(size_t overlay = 0; overlay < SPEC::NUM_OVERLAYS; overlay++){
1076
+ ctx.overlay_instance_buffers.push_back(vk::create_buffer(device, ctx, (size_t)SPEC::MAX_OVERLAY_INSTANCES * sizeof(VkAccelerationStructureInstanceKHR),
1077
+ VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
1078
+ HOST_MEMORY, true));
1079
+ ctx.overlay_tlas_buffers.push_back(vk::create_buffer(device, ctx, overlay_sizes.accelerationStructureSize,
1080
+ VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
1081
+ VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, false));
1082
+ VkAccelerationStructureCreateInfoKHR overlay_info{};
1083
+ overlay_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_KHR;
1084
+ overlay_info.buffer = ctx.overlay_tlas_buffers.back().buffer;
1085
+ overlay_info.size = overlay_sizes.accelerationStructureSize;
1086
+ overlay_info.type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR;
1087
+ VkAccelerationStructureKHR overlay_tlas = VK_NULL_HANDLE;
1088
+ vk::check(device, ctx.vkCreateAccelerationStructureKHR(ctx.device, &overlay_info, nullptr, &overlay_tlas), "Vulkan: overlay TLAS creation failed");
1089
+ ctx.overlay_tlas.push_back(overlay_tlas);
1090
+ }
1091
+ {
1092
+ // defensive empty build: the descriptor array must never reference an unbuilt AS
1093
+ // (the shader's num_active == 0 skip is the primary guard, this is the backstop)
1094
+ VkDeviceAddress scratch_address = vk::buffer_address(ctx, ctx.overlay_scratch);
1095
+ scratch_address = (scratch_address + scratch_alignment - 1) & ~(VkDeviceAddress)(scratch_alignment - 1);
1096
+ std::vector<VkAccelerationStructureGeometryKHR> empty_geometries(SPEC::NUM_OVERLAYS, overlay_geometry);
1097
+ std::vector<VkAccelerationStructureBuildGeometryInfoKHR> empty_build_infos(SPEC::NUM_OVERLAYS, overlay_build_info);
1098
+ std::vector<VkAccelerationStructureBuildRangeInfoKHR> empty_ranges(SPEC::NUM_OVERLAYS, VkAccelerationStructureBuildRangeInfoKHR{});
1099
+ std::vector<const VkAccelerationStructureBuildRangeInfoKHR*> empty_range_pointers(SPEC::NUM_OVERLAYS);
1100
+ for(size_t overlay = 0; overlay < SPEC::NUM_OVERLAYS; overlay++){
1101
+ empty_geometries[overlay].geometry.instances.data.deviceAddress = vk::buffer_address(ctx, ctx.overlay_instance_buffers[overlay]);
1102
+ empty_build_infos[overlay].pGeometries = &empty_geometries[overlay];
1103
+ empty_build_infos[overlay].dstAccelerationStructure = ctx.overlay_tlas[overlay];
1104
+ empty_build_infos[overlay].scratchData.deviceAddress = scratch_address + (VkDeviceAddress)overlay * ctx.overlay_scratch_stride;
1105
+ empty_range_pointers[overlay] = &empty_ranges[overlay];
1106
+ }
1107
+ VkCommandBuffer command_buffer = vk::one_shot_begin(device, ctx);
1108
+ ctx.vkCmdBuildAccelerationStructuresKHR(command_buffer, (uint32_t)SPEC::NUM_OVERLAYS, empty_build_infos.data(), empty_range_pointers.data());
1109
+ vk::one_shot_end(device, ctx, command_buffer);
1110
+ }
1111
+ if constexpr (SPEC::ENABLE_DYNAMIC_MOTION_BLUR){
1112
+ for(size_t sample = 0; sample < SPEC::MOTION_BLUR_SAMPLES; sample++){
1113
+ ctx.overlay_sample_instance_buffers.push_back(vk::create_buffer(device, ctx, (size_t)SPEC::NUM_OVERLAYS * SPEC::MAX_OVERLAY_INSTANCES * sizeof(VkAccelerationStructureInstanceKHR),
1114
+ VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
1115
+ HOST_MEMORY, true));
1116
+ }
1117
+ }
1118
+ ctx.overlay_num_active = vk::create_buffer(device, ctx, (size_t)SPEC::NUM_OVERLAYS * sizeof(uint32_t), VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, HOST_MEMORY, true);
1119
+ std::memset(ctx.overlay_num_active.mapped, 0, ctx.overlay_num_active.size);
1120
+ ctx.overlay_attachments = vk::create_buffer(device, ctx, (size_t)SPEC::NUM_CAMERAS * SPEC::MAX_OVERLAYS_PER_CAMERA * sizeof(uint32_t), VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, HOST_MEMORY, true);
1121
+ {
1122
+ auto* attachments = (uint32_t*)ctx.overlay_attachments.mapped;
1123
+ for(size_t index = 0; index < (size_t)SPEC::NUM_CAMERAS * SPEC::MAX_OVERLAYS_PER_CAMERA; index++){
1124
+ attachments[index] = 0xFFFFFFFFu;
1125
+ }
1126
+ }
1127
+ rendering::raytracing::detail::reset_overlay_state(renderer);
1128
+ }
1129
+
1130
+ if(!ctx.pipelines_built){
1131
+ struct SpecializationData{
1132
+ VkBool32 srgb_output;
1133
+ VkBool32 motion_blur;
1134
+ int32_t motion_samples;
1135
+ int32_t aa_grid;
1136
+ VkBool32 checker_background;
1137
+ VkBool32 load_textures;
1138
+ VkBool32 normal_shading;
1139
+ VkBool32 metallic_reflections;
1140
+ VkBool32 pbr_shading;
1141
+ VkBool32 punctual_light_shadows;
1142
+ int32_t overlay_count;
1143
+ VkBool32 semantic_segmentation;
1144
+ VkBool32 has_observation;
1145
+ VkBool32 dynamic_motion_blur;
1146
+ VkBool32 resolve_rgb;
1147
+ VkBool32 resolve_depth;
1148
+ };
1149
+ static_assert(sizeof(SpecializationData) == vk::specialization_constants::COUNT * 4);
1150
+ SpecializationData specialization_data{};
1151
+ specialization_data.srgb_output = SPEC::SHADING::SRGB_OUTPUT ? VK_TRUE : VK_FALSE;
1152
+ specialization_data.motion_blur = SPEC::ENABLE_MOTION_BLUR ? VK_TRUE : VK_FALSE;
1153
+ specialization_data.motion_samples = SPEC::ENABLE_MOTION_BLUR ? (int32_t)SPEC::MOTION_BLUR_SAMPLES : 1;
1154
+ specialization_data.aa_grid = SPEC::ENABLE_ANTI_ALIASING ? (int32_t)SPEC::ANTI_ALIASING_GRID_SIZE : 1;
1155
+ specialization_data.checker_background = SPEC::SHADING::CHECKER_BACKGROUND ? VK_TRUE : VK_FALSE;
1156
+ specialization_data.load_textures = SPEC::SHADING::LOAD_TEXTURES ? VK_TRUE : VK_FALSE;
1157
+ specialization_data.normal_shading = SPEC::SHADING::NORMAL_SHADING ? VK_TRUE : VK_FALSE;
1158
+ specialization_data.metallic_reflections = SPEC::SHADING::METALLIC_REFLECTIONS ? VK_TRUE : VK_FALSE;
1159
+ specialization_data.pbr_shading = SPEC::SHADING::PBR_SHADING ? VK_TRUE : VK_FALSE;
1160
+ specialization_data.punctual_light_shadows = SPEC::SHADING::PUNCTUAL_LIGHT_SHADOWS ? VK_TRUE : VK_FALSE;
1161
+ specialization_data.overlay_count = SPEC::ENABLE_OVERLAYS ? (int32_t)SPEC::MAX_OVERLAYS_PER_CAMERA : 0;
1162
+ specialization_data.semantic_segmentation = SPEC::SEMANTIC_SEGMENTATION ? VK_TRUE : VK_FALSE;
1163
+ specialization_data.has_observation = SPEC::HAS_OBSERVATION ? VK_TRUE : VK_FALSE;
1164
+ specialization_data.dynamic_motion_blur = SPEC::ENABLE_DYNAMIC_MOTION_BLUR ? VK_TRUE : VK_FALSE;
1165
+ specialization_data.resolve_rgb = (SPEC::ENABLE_DYNAMIC_MOTION_BLUR && SPEC::HAS_RGB) ? VK_TRUE : VK_FALSE;
1166
+ specialization_data.resolve_depth = (SPEC::ENABLE_DYNAMIC_MOTION_BLUR && SPEC::HAS_DEPTH) ? VK_TRUE : VK_FALSE;
1167
+ VkSpecializationMapEntry map_entries[vk::specialization_constants::COUNT];
1168
+ for(uint32_t constant_i = 0; constant_i < vk::specialization_constants::COUNT; constant_i++){
1169
+ map_entries[constant_i] = {constant_i, constant_i * 4, 4};
1170
+ }
1171
+ VkSpecializationInfo specialization_info{};
1172
+ specialization_info.mapEntryCount = vk::specialization_constants::COUNT;
1173
+ specialization_info.pMapEntries = map_entries;
1174
+ specialization_info.dataSize = sizeof(specialization_data);
1175
+ specialization_info.pData = &specialization_data;
1176
+
1177
+ auto make_pipeline = [&](VkShaderModule module) -> VkPipeline {
1178
+ VkComputePipelineCreateInfo pipeline_info{};
1179
+ pipeline_info.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO;
1180
+ pipeline_info.stage = {};
1181
+ pipeline_info.stage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
1182
+ pipeline_info.stage.stage = VK_SHADER_STAGE_COMPUTE_BIT;
1183
+ pipeline_info.stage.module = module;
1184
+ pipeline_info.stage.pName = "main";
1185
+ pipeline_info.stage.pSpecializationInfo = &specialization_info;
1186
+ pipeline_info.layout = ctx.pipeline_layout;
1187
+ VkPipeline pipeline;
1188
+ vk::check(device, vkCreateComputePipelines(ctx.device, VK_NULL_HANDLE, 1, &pipeline_info, nullptr, &pipeline), "Vulkan: compute pipeline creation failed");
1189
+ return pipeline;
1190
+ };
1191
+ if constexpr (SPEC::HAS_RGB) {
1192
+ ctx.rgb_pipeline = make_pipeline(ctx.module_rgb);
1193
+ }
1194
+ if constexpr (SPEC::HAS_DEPTH) {
1195
+ ctx.depth_pipeline = make_pipeline(ctx.module_depth);
1196
+ }
1197
+ if constexpr (SPEC::HAS_SEGMENTATION) {
1198
+ ctx.segmentation_pipeline = make_pipeline(ctx.module_segmentation);
1199
+ }
1200
+ if constexpr (SPEC::HAS_NORMALS) {
1201
+ ctx.normals_pipeline = make_pipeline(ctx.module_normals);
1202
+ }
1203
+ if constexpr (SPEC::ENABLE_DYNAMIC_MOTION_BLUR) {
1204
+ ctx.resolve_pipeline = make_pipeline(ctx.module_resolve);
1205
+ }
1206
+ #if !RL_TOOLS_RENDERING_RAYTRACING_DISABLE_PROBE_RAYS
1207
+ ctx.collision_pipeline = make_pipeline(ctx.module_collision);
1208
+ #endif
1209
+ ctx.pipelines_built = true;
1210
+ }
1211
+
1212
+ {
1213
+ const uint32_t texture_count = (uint32_t)ctx.mesh_textures.size();
1214
+ utils::assert_exit(device, texture_count <= vk::MAX_TEXTURE_DESCRIPTORS, "Vulkan: scene exceeds MAX_TEXTURE_DESCRIPTORS");
1215
+ constexpr uint32_t overlay_tlas_count = SPEC::ENABLE_OVERLAYS ? (uint32_t)SPEC::NUM_OVERLAYS : 1;
1216
+ VkDescriptorPoolSize pool_sizes[3];
1217
+ pool_sizes[0] = {VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, vk::bindings::COUNT};
1218
+ pool_sizes[1] = {VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 1 + overlay_tlas_count};
1219
+ pool_sizes[2] = {VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, texture_count};
1220
+ VkDescriptorPoolCreateInfo pool_info{};
1221
+ pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
1222
+ pool_info.maxSets = 1;
1223
+ pool_info.poolSizeCount = 3;
1224
+ pool_info.pPoolSizes = pool_sizes;
1225
+ vk::check(device, vkCreateDescriptorPool(ctx.device, &pool_info, nullptr, &ctx.descriptor_pool), "Vulkan: descriptor pool creation failed");
1226
+
1227
+ VkDescriptorSetVariableDescriptorCountAllocateInfo variable_count_info{};
1228
+ variable_count_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO;
1229
+ variable_count_info.descriptorSetCount = 1;
1230
+ variable_count_info.pDescriptorCounts = &texture_count;
1231
+ VkDescriptorSetAllocateInfo set_info{};
1232
+ set_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
1233
+ set_info.pNext = &variable_count_info;
1234
+ set_info.descriptorPool = ctx.descriptor_pool;
1235
+ set_info.descriptorSetCount = 1;
1236
+ set_info.pSetLayouts = &ctx.descriptor_set_layout;
1237
+ vk::check(device, vkAllocateDescriptorSets(ctx.device, &set_info, &ctx.descriptor_set), "Vulkan: descriptor set allocation failed");
1238
+
1239
+ auto buffer_or_dummy = [&](const vk::BufferResource& resource) -> VkDescriptorBufferInfo {
1240
+ const vk::BufferResource& source = resource.buffer != VK_NULL_HANDLE ? resource : ctx.dummy;
1241
+ return {source.buffer, 0, VK_WHOLE_SIZE};
1242
+ };
1243
+ VkDescriptorBufferInfo buffer_infos[vk::bindings::COUNT];
1244
+ buffer_infos[vk::bindings::LAUNCH_PARAMS] = buffer_or_dummy(ctx.launch_params);
1245
+ buffer_infos[vk::bindings::CAMERAS_CLOSE] = buffer_or_dummy(ctx.cameras);
1246
+ buffer_infos[vk::bindings::CAMERAS_OPEN] = ctx.cameras_open.buffer != VK_NULL_HANDLE ? buffer_or_dummy(ctx.cameras_open) : buffer_or_dummy(ctx.cameras);
1247
+ buffer_infos[vk::bindings::FRAME_BUFFER] = buffer_or_dummy(ctx.frame_buffer);
1248
+ buffer_infos[vk::bindings::MESH_RECORDS] = buffer_or_dummy(ctx.mesh_records);
1249
+ buffer_infos[vk::bindings::SCENE_LIGHTS] = buffer_or_dummy(ctx.scene_lights);
1250
+ buffer_infos[vk::bindings::PROBE_DIRECTIONS] = buffer_or_dummy(ctx.probe_directions);
1251
+ buffer_infos[vk::bindings::COLLISION_RESULTS] = buffer_or_dummy(ctx.collision_results);
1252
+ buffer_infos[vk::bindings::DEPTH_BUFFER] = buffer_or_dummy(ctx.depth_buffer);
1253
+ buffer_infos[vk::bindings::SEGMENTATION_BUFFER] = buffer_or_dummy(ctx.segmentation_buffer);
1254
+ buffer_infos[vk::bindings::OBSERVATION] = buffer_or_dummy(ctx.observation);
1255
+ buffer_infos[vk::bindings::INSTANCE_RECORD_BASE] = buffer_or_dummy(ctx.instance_record_base);
1256
+ buffer_infos[vk::bindings::INSTANCE_DATA] = buffer_or_dummy(ctx.instance_data);
1257
+ buffer_infos[vk::bindings::INSTANCE_CLASSES] = buffer_or_dummy(ctx.instance_classes);
1258
+ buffer_infos[vk::bindings::OVERLAY_ATTACHMENTS] = buffer_or_dummy(ctx.overlay_attachments);
1259
+ buffer_infos[vk::bindings::OVERLAY_NUM_ACTIVE] = buffer_or_dummy(ctx.overlay_num_active);
1260
+ buffer_infos[vk::bindings::RGB_ACCUMULATOR] = buffer_or_dummy(ctx.rgb_accumulator);
1261
+ buffer_infos[vk::bindings::DEPTH_ACCUMULATOR] = buffer_or_dummy(ctx.depth_accumulator);
1262
+ buffer_infos[vk::bindings::NORMALS_BUFFER] = buffer_or_dummy(ctx.normals_buffer);
1263
+
1264
+ std::vector<VkWriteDescriptorSet> writes;
1265
+ for(uint32_t binding_i = 0; binding_i < vk::bindings::COUNT; binding_i++){
1266
+ if(binding_i == vk::bindings::ACCELERATION_STRUCTURE || binding_i == vk::bindings::OVERLAY_TLAS || binding_i == vk::bindings::TEXTURES){
1267
+ continue;
1268
+ }
1269
+ VkWriteDescriptorSet write{};
1270
+ write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1271
+ write.dstSet = ctx.descriptor_set;
1272
+ write.dstBinding = binding_i;
1273
+ write.descriptorCount = 1;
1274
+ write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
1275
+ write.pBufferInfo = &buffer_infos[binding_i];
1276
+ writes.push_back(write);
1277
+ }
1278
+ VkWriteDescriptorSetAccelerationStructureKHR tlas_write_info{};
1279
+ tlas_write_info.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR;
1280
+ tlas_write_info.accelerationStructureCount = 1;
1281
+ tlas_write_info.pAccelerationStructures = &ctx.tlas;
1282
+ VkWriteDescriptorSet tlas_write{};
1283
+ tlas_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1284
+ tlas_write.pNext = &tlas_write_info;
1285
+ tlas_write.dstSet = ctx.descriptor_set;
1286
+ tlas_write.dstBinding = vk::bindings::ACCELERATION_STRUCTURE;
1287
+ tlas_write.descriptorCount = 1;
1288
+ tlas_write.descriptorType = VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR;
1289
+ writes.push_back(tlas_write);
1290
+ // written once per init and never touched by update(): overlay rebuilds happen in
1291
+ // place, so the handles below stay valid; when overlays are disabled the base TLAS
1292
+ // fills the single slot (a valid handle that is never traversed — fc_overlay_count == 0)
1293
+ std::vector<VkAccelerationStructureKHR> overlay_tlas_handles(overlay_tlas_count, ctx.tlas);
1294
+ if constexpr (SPEC::ENABLE_OVERLAYS){
1295
+ for(uint32_t overlay = 0; overlay < overlay_tlas_count; overlay++){
1296
+ overlay_tlas_handles[overlay] = ctx.overlay_tlas[overlay];
1297
+ }
1298
+ }
1299
+ VkWriteDescriptorSetAccelerationStructureKHR overlay_tlas_write_info{};
1300
+ overlay_tlas_write_info.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR;
1301
+ overlay_tlas_write_info.accelerationStructureCount = overlay_tlas_count;
1302
+ overlay_tlas_write_info.pAccelerationStructures = overlay_tlas_handles.data();
1303
+ VkWriteDescriptorSet overlay_tlas_write{};
1304
+ overlay_tlas_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1305
+ overlay_tlas_write.pNext = &overlay_tlas_write_info;
1306
+ overlay_tlas_write.dstSet = ctx.descriptor_set;
1307
+ overlay_tlas_write.dstBinding = vk::bindings::OVERLAY_TLAS;
1308
+ overlay_tlas_write.descriptorCount = overlay_tlas_count;
1309
+ overlay_tlas_write.descriptorType = VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR;
1310
+ writes.push_back(overlay_tlas_write);
1311
+ std::vector<VkDescriptorImageInfo> image_infos(texture_count);
1312
+ for(uint32_t texture_i = 0; texture_i < texture_count; texture_i++){
1313
+ image_infos[texture_i] = {ctx.sampler, ctx.mesh_textures[texture_i].view, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL};
1314
+ }
1315
+ VkWriteDescriptorSet textures_write{};
1316
+ textures_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
1317
+ textures_write.dstSet = ctx.descriptor_set;
1318
+ textures_write.dstBinding = vk::bindings::TEXTURES;
1319
+ textures_write.descriptorCount = texture_count;
1320
+ textures_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
1321
+ textures_write.pImageInfo = image_infos.data();
1322
+ writes.push_back(textures_write);
1323
+ vkUpdateDescriptorSets(ctx.device, (uint32_t)writes.size(), writes.data(), 0, nullptr);
1324
+ }
1325
+
1326
+ {
1327
+ auto record = [&](VkCommandBuffer command_buffer, VkPipeline pipeline, uint32_t groups_x, uint32_t groups_y){
1328
+ vk::check(device, vkResetCommandBuffer(command_buffer, 0), "Vulkan: command buffer reset failed");
1329
+ VkCommandBufferBeginInfo begin_info{};
1330
+ begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1331
+ vk::check(device, vkBeginCommandBuffer(command_buffer, &begin_info), "Vulkan: command buffer begin failed");
1332
+ vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipeline);
1333
+ vkCmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, ctx.pipeline_layout, 0, 1, &ctx.descriptor_set, 0, nullptr);
1334
+ vkCmdDispatch(command_buffer, groups_x, groups_y, 1);
1335
+ VkMemoryBarrier to_host{};
1336
+ to_host.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
1337
+ to_host.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
1338
+ to_host.dstAccessMask = VK_ACCESS_HOST_READ_BIT;
1339
+ vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 1, &to_host, 0, nullptr, 0, nullptr);
1340
+ vk::check(device, vkEndCommandBuffer(command_buffer), "Vulkan: command buffer end failed");
1341
+ };
1342
+ constexpr uint32_t fb_groups_x = (SPEC::FB_WIDTH + vk::WORKGROUP_SIZE - 1) / vk::WORKGROUP_SIZE;
1343
+ constexpr uint32_t fb_groups_y = (SPEC::FB_HEIGHT + vk::WORKGROUP_SIZE - 1) / vk::WORKGROUP_SIZE;
1344
+ if constexpr (SPEC::HAS_RGB) {
1345
+ record(ctx.cb_rgb, ctx.rgb_pipeline, fb_groups_x, fb_groups_y);
1346
+ }
1347
+ if constexpr (SPEC::HAS_DEPTH) {
1348
+ record(ctx.cb_depth, ctx.depth_pipeline, fb_groups_x, fb_groups_y);
1349
+ }
1350
+ if constexpr (SPEC::HAS_SEGMENTATION) {
1351
+ record(ctx.cb_segmentation, ctx.segmentation_pipeline, fb_groups_x, fb_groups_y);
1352
+ }
1353
+ if constexpr (SPEC::HAS_NORMALS) {
1354
+ record(ctx.cb_normals, ctx.normals_pipeline, fb_groups_x, fb_groups_y);
1355
+ }
1356
+ if(ctx.collision_pipeline != VK_NULL_HANDLE){
1357
+ record(ctx.cb_collision, ctx.collision_pipeline, (SPEC::NUM_CAMERAS + vk::WORKGROUP_SIZE - 1) / vk::WORKGROUP_SIZE, (SPEC::NUM_PROBES + vk::WORKGROUP_SIZE - 1) / vk::WORKGROUP_SIZE);
1358
+ }
1359
+ }
1360
+
1361
+ if constexpr (SPEC::ENABLE_OVERLAYS){
1362
+ update(device, renderer); // publish the (empty) overlays and the attachment table
1363
+ }
1364
+ }
1365
+
1366
+ template <typename DEVICE, typename SPEC>
1367
+ void init(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer, const rendering::raytracing::Scene& scene){
1368
+ static const rendering::raytracing::AssetPool empty_pool{};
1369
+ init(device, renderer, scene, empty_pool);
1370
+ }
1371
+
1372
+ template <typename DEVICE, typename SPEC>
1373
+ void update_launch(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer){
1374
+ static_assert(SPEC::ENABLE_OVERLAYS, "update requires an overlay-enabled renderer specification");
1375
+ namespace vk = rendering::raytracing::backends::vulkan;
1376
+ using TI = typename SPEC::TI;
1377
+ auto& ctx = vk::context(renderer);
1378
+ vk::wait_in_flight(device, ctx); // single-buffered renderer: mapped writes below cannot race the GPU or a previous in-flight build
1379
+
1380
+ auto* instance_data = (vk::InstanceData*)ctx.instance_data.mapped;
1381
+ auto* instance_record_base = (uint32_t*)ctx.instance_record_base.mapped;
1382
+ auto* instance_classes = (uint32_t*)ctx.instance_classes.mapped;
1383
+ auto* overlay_num_active = (uint32_t*)ctx.overlay_num_active.mapped;
1384
+ rendering::raytracing::detail::flush_overlay_transforms(renderer);
1385
+
1386
+ // no allocation, no descriptor writes, no command-buffer re-recording: overlays are
1387
+ // rebuilt in place from their mapped descriptor buffers and preallocated scratch slices.
1388
+ // Rebuilt unconditionally: producers may write the transforms tensor directly, which
1389
+ // leaves no host-observable dirty flag
1390
+ std::vector<VkAccelerationStructureGeometryKHR> build_geometries;
1391
+ std::vector<VkAccelerationStructureBuildGeometryInfoKHR> build_infos;
1392
+ std::vector<VkAccelerationStructureBuildRangeInfoKHR> build_ranges;
1393
+ std::vector<size_t> build_overlays;
1394
+
1395
+ for(TI overlay = 0; overlay < SPEC::NUM_OVERLAYS; overlay++){
1396
+ auto& overlay_state = renderer.overlays[overlay];
1397
+ const size_t base = (size_t)ctx.num_scene_instances + (size_t)overlay * SPEC::MAX_OVERLAY_INSTANCES;
1398
+ auto* descriptors = (VkAccelerationStructureInstanceKHR*)ctx.overlay_instance_buffers[overlay].mapped;
1399
+ uint32_t num_active = 0;
1400
+ for(TI slot = 0; slot < SPEC::MAX_OVERLAY_INSTANCES; slot++){
1401
+ const auto& host_slot = overlay_state.slots[slot];
1402
+ if(!host_slot.active) continue;
1403
+ const size_t global = base + slot;
1404
+ float world[12];
1405
+ rendering::raytracing::detail::compose_overlay_slot_transform(renderer, overlay, slot, world);
1406
+ VkAccelerationStructureInstanceKHR& descriptor = descriptors[num_active];
1407
+ descriptor = {};
1408
+ std::memcpy(descriptor.transform.matrix, world, sizeof(descriptor.transform.matrix));
1409
+ descriptor.instanceCustomIndex = (uint32_t)global;
1410
+ descriptor.mask = 0xFF;
1411
+ descriptor.accelerationStructureReference = ctx.blas_addresses[host_slot.object];
1412
+
1413
+ auto& data = instance_data[global];
1414
+ data = {};
1415
+ for(int element = 0; element < 12; element++){
1416
+ data.object_to_world[element] = world[element];
1417
+ }
1418
+ const bool identity = rendering::raytracing::detail::transform_is_identity(world);
1419
+ if(identity){
1420
+ std::memcpy(data.world_to_object, data.object_to_world, sizeof(data.world_to_object));
1421
+ }
1422
+ else{
1423
+ rendering::raytracing::detail::invert_transform(world, data.world_to_object);
1424
+ }
1425
+ data.identity = identity ? 1 : 0;
1426
+ instance_record_base[global] = ctx.object_record_base[host_slot.object];
1427
+ instance_classes[global] = ctx.object_classes[host_slot.object];
1428
+ num_active++;
1429
+ }
1430
+ overlay_num_active[overlay] = num_active;
1431
+ if(num_active > 0){
1432
+ VkAccelerationStructureGeometryKHR geometry{};
1433
+ geometry.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR;
1434
+ geometry.geometryType = VK_GEOMETRY_TYPE_INSTANCES_KHR;
1435
+ geometry.geometry.instances = {};
1436
+ geometry.geometry.instances.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR;
1437
+ geometry.geometry.instances.data.deviceAddress = vk::buffer_address(ctx, ctx.overlay_instance_buffers[overlay]);
1438
+ build_geometries.push_back(geometry);
1439
+ VkAccelerationStructureBuildGeometryInfoKHR build_info{};
1440
+ build_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR;
1441
+ build_info.type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR;
1442
+ build_info.flags = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR;
1443
+ build_info.mode = VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR;
1444
+ build_info.geometryCount = 1;
1445
+ build_infos.push_back(build_info);
1446
+ VkAccelerationStructureBuildRangeInfoKHR range{};
1447
+ range.primitiveCount = num_active;
1448
+ build_ranges.push_back(range);
1449
+ build_overlays.push_back(overlay);
1450
+ }
1451
+ }
1452
+ if constexpr (SPEC::ENABLE_DYNAMIC_MOTION_BLUR){
1453
+ // per-sample overlay instance descriptors + shifted-id side-table slices consumed by
1454
+ // render_launch's per-sample builds; layout mirrors the shutter-close path above
1455
+ rendering::raytracing::detail::flush_overlay_motion_transforms(renderer);
1456
+ constexpr size_t SLAB = (size_t)SPEC::NUM_OVERLAYS * SPEC::MAX_OVERLAY_INSTANCES * 12;
1457
+ constexpr size_t num_overlay_slots = (size_t)SPEC::NUM_OVERLAYS * SPEC::MAX_OVERLAY_INSTANCES;
1458
+ for(TI sample = 0; sample < SPEC::MOTION_BLUR_SAMPLES; sample++){
1459
+ const float* transforms_base = data(renderer.transforms_motion) + sample * SLAB;
1460
+ auto* sample_descriptors = (VkAccelerationStructureInstanceKHR*)ctx.overlay_sample_instance_buffers[sample].mapped;
1461
+ for(TI overlay = 0; overlay < SPEC::NUM_OVERLAYS; overlay++){
1462
+ auto& overlay_state = renderer.overlays[overlay];
1463
+ auto* descriptors = sample_descriptors + (size_t)overlay * SPEC::MAX_OVERLAY_INSTANCES;
1464
+ uint32_t num_active = 0;
1465
+ for(TI slot = 0; slot < SPEC::MAX_OVERLAY_INSTANCES; slot++){
1466
+ const auto& host_slot = overlay_state.slots[slot];
1467
+ if(!host_slot.active) continue;
1468
+ const size_t global = (size_t)ctx.num_scene_instances + num_overlay_slots * (1 + (size_t)sample) + (size_t)overlay * SPEC::MAX_OVERLAY_INSTANCES + slot;
1469
+ float world[12];
1470
+ rendering::raytracing::detail::compose_overlay_slot_transform(renderer, transforms_base, overlay, slot, world);
1471
+ VkAccelerationStructureInstanceKHR& descriptor = descriptors[num_active];
1472
+ descriptor = {};
1473
+ std::memcpy(descriptor.transform.matrix, world, sizeof(descriptor.transform.matrix));
1474
+ descriptor.instanceCustomIndex = (uint32_t)global;
1475
+ descriptor.mask = 0xFF;
1476
+ descriptor.accelerationStructureReference = ctx.blas_addresses[host_slot.object];
1477
+
1478
+ auto& data_entry = instance_data[global];
1479
+ data_entry = {};
1480
+ for(int element = 0; element < 12; element++){
1481
+ data_entry.object_to_world[element] = world[element];
1482
+ }
1483
+ const bool identity = rendering::raytracing::detail::transform_is_identity(world);
1484
+ if(identity){
1485
+ std::memcpy(data_entry.world_to_object, data_entry.object_to_world, sizeof(data_entry.world_to_object));
1486
+ }
1487
+ else{
1488
+ rendering::raytracing::detail::invert_transform(world, data_entry.world_to_object);
1489
+ }
1490
+ data_entry.identity = identity ? 1 : 0;
1491
+ instance_record_base[global] = ctx.object_record_base[host_slot.object];
1492
+ instance_classes[global] = ctx.object_classes[host_slot.object];
1493
+ num_active++;
1494
+ }
1495
+ }
1496
+ }
1497
+ }
1498
+ if(renderer.attachments_dirty){
1499
+ auto* attachments = (uint32_t*)ctx.overlay_attachments.mapped;
1500
+ for(size_t index = 0; index < (size_t)SPEC::NUM_CAMERAS * SPEC::MAX_OVERLAYS_PER_CAMERA; index++){
1501
+ attachments[index] = (uint32_t)renderer.attachments[index];
1502
+ }
1503
+ renderer.attachments_dirty = false;
1504
+ }
1505
+ if(!build_infos.empty()){
1506
+ VkDeviceAddress scratch_address = vk::buffer_address(ctx, ctx.overlay_scratch);
1507
+ scratch_address = (scratch_address + ctx.min_scratch_alignment - 1) & ~(VkDeviceAddress)(ctx.min_scratch_alignment - 1);
1508
+ std::vector<const VkAccelerationStructureBuildRangeInfoKHR*> range_pointers(build_infos.size());
1509
+ for(size_t build_i = 0; build_i < build_infos.size(); build_i++){
1510
+ build_infos[build_i].pGeometries = &build_geometries[build_i];
1511
+ build_infos[build_i].dstAccelerationStructure = ctx.overlay_tlas[build_overlays[build_i]];
1512
+ build_infos[build_i].scratchData.deviceAddress = scratch_address + (VkDeviceAddress)build_overlays[build_i] * ctx.overlay_scratch_stride;
1513
+ range_pointers[build_i] = &build_ranges[build_i];
1514
+ }
1515
+ VkCommandBuffer command_buffer = vk::one_shot_begin(device, ctx);
1516
+ ctx.vkCmdBuildAccelerationStructuresKHR(command_buffer, (uint32_t)build_infos.size(), build_infos.data(), range_pointers.data());
1517
+ // make the rebuilt overlay TLAS contents available to the ray queries of subsequent renders
1518
+ VkMemoryBarrier build_barrier{};
1519
+ build_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
1520
+ build_barrier.srcAccessMask = VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR;
1521
+ build_barrier.dstAccessMask = VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR;
1522
+ vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, 1, &build_barrier, 0, nullptr, 0, nullptr);
1523
+ // genuinely asynchronous: fenced submit, no queue-idle wait — the in-cb barrier
1524
+ // orders subsequent same-queue render dispatches after the build, and update_sync
1525
+ // (or the next launch's wait_update_in_flight) reclaims the command buffer
1526
+ vk::check(device, vkEndCommandBuffer(command_buffer), "Vulkan: update command buffer end failed");
1527
+ VkSubmitInfo submit_info{};
1528
+ submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1529
+ submit_info.commandBufferCount = 1;
1530
+ submit_info.pCommandBuffers = &command_buffer;
1531
+ vk::check(device, vkQueueSubmit(ctx.queue, 1, &submit_info, ctx.fence_update), "Vulkan: update submit failed");
1532
+ ctx.update_command_buffer = command_buffer;
1533
+ }
1534
+ }
1535
+
1536
+ template <typename DEVICE, typename SPEC>
1537
+ void update_sync(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer){
1538
+ static_assert(SPEC::ENABLE_OVERLAYS, "update requires an overlay-enabled renderer specification");
1539
+ namespace vk = rendering::raytracing::backends::vulkan;
1540
+ vk::wait_update_in_flight(device, vk::context(renderer));
1541
+ }
1542
+
1543
+ // CPU expansion into the host-resident tensors (residency is a backend property; the
1544
+ // device-resident path is the OptiX backend)
1545
+ template <typename DEVICE, typename SPEC>
1546
+ void expand_motion_transforms_launch(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer){
1547
+ static_assert(SPEC::ENABLE_DYNAMIC_MOTION_BLUR, "expand_motion_transforms requires a dynamic-motion-blur renderer specification");
1548
+ namespace vk = rendering::raytracing::backends::vulkan;
1549
+ vk::wait_in_flight(device, vk::context(renderer));
1550
+ rendering::raytracing::detail::expand_motion_transforms_host(renderer);
1551
+ }
1552
+
1553
+ template <typename DEVICE, typename SPEC>
1554
+ void expand_motion_transforms_sync(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer){
1555
+ static_assert(SPEC::ENABLE_DYNAMIC_MOTION_BLUR, "expand_motion_transforms requires a dynamic-motion-blur renderer specification");
1556
+ }
1557
+
1558
+ template <typename DEVICE, typename SPEC>
1559
+ void expand_motion_transforms(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer){
1560
+ expand_motion_transforms_launch(device, renderer);
1561
+ expand_motion_transforms_sync(device, renderer);
1562
+ }
1563
+
1564
+ template <typename DEVICE, typename SPEC>
1565
+ void update(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer){
1566
+ update_launch(device, renderer);
1567
+ update_sync(device, renderer);
1568
+ }
1569
+
1570
+ template <typename DEVICE, typename SPEC>
1571
+ void generate_cameras(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer,
1572
+ const typename SPEC::T center[3], typename SPEC::T radius,
1573
+ const typename SPEC::T up[3], typename SPEC::T fov){
1574
+ namespace vk = rendering::raytracing::backends::vulkan;
1575
+ auto& ctx = vk::context(renderer);
1576
+ vk::wait_in_flight(device, ctx);
1577
+ rendering::raytracing::detail::generate_camera_poses<SPEC>(device, data(renderer.cameras), center, radius, up, fov);
1578
+ if constexpr (SPEC::ENABLE_MOTION_BLUR) {
1579
+ std::memcpy(data(renderer.cameras_open), data(renderer.cameras), (size_t)SPEC::NUM_CAMERAS * sizeof(rendering::raytracing::Camera<typename SPEC::T>));
1580
+ }
1581
+ }
1582
+
1583
+ template <typename DEVICE, typename SPEC, typename T>
1584
+ void copy_to_renderer(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer, const T* source, T* destination, size_t count){
1585
+ auto& context = rendering::raytracing::backends::vulkan::context(renderer);
1586
+ rendering::raytracing::backends::vulkan::wait_in_flight(device, context);
1587
+ std::memcpy(destination, source, count * sizeof(T));
1588
+ }
1589
+
1590
+ template <typename DEVICE, typename SPEC, typename T>
1591
+ void copy_from_renderer(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer, const T* source, T* destination, size_t count){
1592
+ auto& context = rendering::raytracing::backends::vulkan::context(renderer);
1593
+ rendering::raytracing::backends::vulkan::wait_in_flight(device, context);
1594
+ std::memcpy(destination, source, count * sizeof(T));
1595
+ }
1596
+
1597
+ template <typename DEVICE, typename SPEC>
1598
+ void generate_probe_directions(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer){
1599
+ #if RL_TOOLS_RENDERING_RAYTRACING_DISABLE_PROBE_RAYS
1600
+ RL_TOOLS_RENDERING_RAYTRACING_LOG("Probe rays disabled (RL_TOOLS_RENDERING_RAYTRACING_DISABLE_PROBE_RAYS=1)");
1601
+ return;
1602
+ #else
1603
+ namespace vk = rendering::raytracing::backends::vulkan;
1604
+ auto& ctx = vk::context(renderer);
1605
+ std::vector<float> dirs = rendering::raytracing::detail::generate_probe_direction_vectors<SPEC>();
1606
+ std::memcpy(ctx.probe_directions.mapped, dirs.data(), dirs.size() * sizeof(float));
1607
+ #endif
1608
+ }
1609
+
1610
+ template <typename DEVICE, typename SPEC>
1611
+ void render_launch(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer){
1612
+ namespace vk = rendering::raytracing::backends::vulkan;
1613
+ using TI = typename SPEC::TI;
1614
+ auto& ctx = vk::context(renderer);
1615
+ if constexpr (SPEC::ENABLE_DYNAMIC_MOTION_BLUR){
1616
+ // one command buffer per frame, re-recorded because the build ranges track the live
1617
+ // instance counts: zero the accumulators, then per motion sample build the overlay
1618
+ // TLASes in place from that sample's descriptor slice and run the accumulate
1619
+ // dispatches, then restore the shutter-close state (segmentation, probes, steady
1620
+ // state) and resolve — a single fenced submit, no host work in between
1621
+ vk::wait_render_in_flight(device, ctx);
1622
+ uint32_t num_active_per_overlay[SPEC::NUM_OVERLAYS];
1623
+ for(TI overlay = 0; overlay < SPEC::NUM_OVERLAYS; overlay++){
1624
+ uint32_t num_active = 0;
1625
+ for(TI slot = 0; slot < SPEC::MAX_OVERLAY_INSTANCES; slot++){
1626
+ num_active += renderer.overlays[overlay].slots[slot].active ? 1 : 0;
1627
+ }
1628
+ num_active_per_overlay[overlay] = num_active;
1629
+ }
1630
+ VkCommandBuffer command_buffer = ctx.cb_dynamic;
1631
+ vk::check(device, vkResetCommandBuffer(command_buffer, 0), "Vulkan: dynamic command buffer reset failed");
1632
+ VkCommandBufferBeginInfo begin_info{};
1633
+ begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1634
+ vk::check(device, vkBeginCommandBuffer(command_buffer, &begin_info), "Vulkan: dynamic command buffer begin failed");
1635
+
1636
+ const auto barrier = [&](VkPipelineStageFlags src_stage, VkAccessFlags src_access, VkPipelineStageFlags dst_stage, VkAccessFlags dst_access){
1637
+ VkMemoryBarrier memory_barrier{};
1638
+ memory_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
1639
+ memory_barrier.srcAccessMask = src_access;
1640
+ memory_barrier.dstAccessMask = dst_access;
1641
+ vkCmdPipelineBarrier(command_buffer, src_stage, dst_stage, 0, 1, &memory_barrier, 0, nullptr, 0, nullptr);
1642
+ };
1643
+ // order behind a possibly in-flight update build and clear the accumulators
1644
+ barrier(VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
1645
+ VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR | VK_ACCESS_SHADER_WRITE_BIT,
1646
+ VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR,
1647
+ VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR);
1648
+ if constexpr (SPEC::HAS_RGB){
1649
+ vkCmdFillBuffer(command_buffer, ctx.rgb_accumulator.buffer, 0, VK_WHOLE_SIZE, 0);
1650
+ }
1651
+ if constexpr (SPEC::HAS_DEPTH){
1652
+ vkCmdFillBuffer(command_buffer, ctx.depth_accumulator.buffer, 0, VK_WHOLE_SIZE, 0);
1653
+ }
1654
+ barrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
1655
+ VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT);
1656
+
1657
+ VkDeviceAddress scratch_address = vk::buffer_address(ctx, ctx.overlay_scratch);
1658
+ scratch_address = (scratch_address + ctx.min_scratch_alignment - 1) & ~(VkDeviceAddress)(ctx.min_scratch_alignment - 1);
1659
+ const auto record_builds = [&](auto&& instance_address_for_overlay){
1660
+ std::vector<VkAccelerationStructureGeometryKHR> geometries;
1661
+ std::vector<VkAccelerationStructureBuildGeometryInfoKHR> build_infos;
1662
+ std::vector<VkAccelerationStructureBuildRangeInfoKHR> ranges;
1663
+ std::vector<size_t> overlays;
1664
+ for(TI overlay = 0; overlay < SPEC::NUM_OVERLAYS; overlay++){
1665
+ if(num_active_per_overlay[overlay] == 0) continue;
1666
+ VkAccelerationStructureGeometryKHR geometry{};
1667
+ geometry.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR;
1668
+ geometry.geometryType = VK_GEOMETRY_TYPE_INSTANCES_KHR;
1669
+ geometry.geometry.instances = {};
1670
+ geometry.geometry.instances.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR;
1671
+ geometry.geometry.instances.data.deviceAddress = instance_address_for_overlay(overlay);
1672
+ geometries.push_back(geometry);
1673
+ VkAccelerationStructureBuildGeometryInfoKHR build_info{};
1674
+ build_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR;
1675
+ build_info.type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR;
1676
+ build_info.flags = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR;
1677
+ build_info.mode = VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR;
1678
+ build_info.geometryCount = 1;
1679
+ build_infos.push_back(build_info);
1680
+ VkAccelerationStructureBuildRangeInfoKHR range{};
1681
+ range.primitiveCount = num_active_per_overlay[overlay];
1682
+ ranges.push_back(range);
1683
+ overlays.push_back(overlay);
1684
+ }
1685
+ if(build_infos.empty()){
1686
+ return;
1687
+ }
1688
+ std::vector<const VkAccelerationStructureBuildRangeInfoKHR*> range_pointers(build_infos.size());
1689
+ for(size_t build_i = 0; build_i < build_infos.size(); build_i++){
1690
+ build_infos[build_i].pGeometries = &geometries[build_i];
1691
+ build_infos[build_i].dstAccelerationStructure = ctx.overlay_tlas[overlays[build_i]];
1692
+ build_infos[build_i].scratchData.deviceAddress = scratch_address + (VkDeviceAddress)overlays[build_i] * ctx.overlay_scratch_stride;
1693
+ range_pointers[build_i] = &ranges[build_i];
1694
+ }
1695
+ ctx.vkCmdBuildAccelerationStructuresKHR(command_buffer, (uint32_t)build_infos.size(), build_infos.data(), range_pointers.data());
1696
+ };
1697
+ constexpr uint32_t fb_groups_x = (SPEC::FB_WIDTH + vk::WORKGROUP_SIZE - 1) / vk::WORKGROUP_SIZE;
1698
+ constexpr uint32_t fb_groups_y = (SPEC::FB_HEIGHT + vk::WORKGROUP_SIZE - 1) / vk::WORKGROUP_SIZE;
1699
+ vkCmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, ctx.pipeline_layout, 0, 1, &ctx.descriptor_set, 0, nullptr);
1700
+ constexpr VkDeviceSize sample_overlay_stride = (VkDeviceSize)SPEC::MAX_OVERLAY_INSTANCES * sizeof(VkAccelerationStructureInstanceKHR);
1701
+ for(TI sample = 0; sample < SPEC::MOTION_BLUR_SAMPLES; sample++){
1702
+ const VkDeviceAddress sample_base = vk::buffer_address(ctx, ctx.overlay_sample_instance_buffers[sample]);
1703
+ record_builds([&](TI overlay){ return sample_base + (VkDeviceAddress)overlay * sample_overlay_stride; });
1704
+ barrier(VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR,
1705
+ VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR);
1706
+ const float shutter_t = ((float)sample + 0.5f) / (float)SPEC::MOTION_BLUR_SAMPLES;
1707
+ vkCmdPushConstants(command_buffer, ctx.pipeline_layout, VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(float), &shutter_t);
1708
+ if constexpr (SPEC::HAS_RGB){
1709
+ vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, ctx.rgb_pipeline);
1710
+ vkCmdDispatch(command_buffer, fb_groups_x, fb_groups_y, 1);
1711
+ }
1712
+ if constexpr (SPEC::HAS_DEPTH){
1713
+ vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, ctx.depth_pipeline);
1714
+ vkCmdDispatch(command_buffer, fb_groups_x, fb_groups_y, 1);
1715
+ }
1716
+ // WAR: the in-place rebuild of the next sample must wait for this pass's ray
1717
+ // queries, and its accumulator writes must be visible to the next pass
1718
+ barrier(VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT,
1719
+ VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
1720
+ VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT);
1721
+ }
1722
+ record_builds([&](TI overlay){ return vk::buffer_address(ctx, ctx.overlay_instance_buffers[overlay]); });
1723
+ barrier(VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR,
1724
+ VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR);
1725
+ if constexpr (SPEC::HAS_SEGMENTATION){
1726
+ vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, ctx.segmentation_pipeline);
1727
+ vkCmdDispatch(command_buffer, fb_groups_x, fb_groups_y, 1);
1728
+ }
1729
+ if constexpr (SPEC::HAS_NORMALS){
1730
+ vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, ctx.normals_pipeline);
1731
+ vkCmdDispatch(command_buffer, fb_groups_x, fb_groups_y, 1);
1732
+ }
1733
+ vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, ctx.resolve_pipeline);
1734
+ vkCmdDispatch(command_buffer, fb_groups_x, fb_groups_y, 1);
1735
+ VkMemoryBarrier to_host{};
1736
+ to_host.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
1737
+ to_host.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
1738
+ to_host.dstAccessMask = VK_ACCESS_HOST_READ_BIT;
1739
+ vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 1, &to_host, 0, nullptr, 0, nullptr);
1740
+ vk::check(device, vkEndCommandBuffer(command_buffer), "Vulkan: dynamic command buffer end failed");
1741
+ VkSubmitInfo submit_info{};
1742
+ submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1743
+ submit_info.commandBufferCount = 1;
1744
+ submit_info.pCommandBuffers = &command_buffer;
1745
+ vk::check(device, vkQueueSubmit(ctx.queue, 1, &submit_info, ctx.fence_render), "Vulkan: dynamic render submit failed");
1746
+ ctx.render_in_flight = true;
1747
+ return;
1748
+ }
1749
+ vk::submit_render(device, ctx,
1750
+ SPEC::HAS_RGB ? ctx.cb_rgb : VK_NULL_HANDLE,
1751
+ SPEC::HAS_DEPTH ? ctx.cb_depth : VK_NULL_HANDLE,
1752
+ SPEC::HAS_SEGMENTATION ? ctx.cb_segmentation : VK_NULL_HANDLE,
1753
+ SPEC::HAS_NORMALS ? ctx.cb_normals : VK_NULL_HANDLE);
1754
+ }
1755
+
1756
+ template <typename DEVICE, typename SPEC>
1757
+ void render_sync(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer){
1758
+ namespace vk = rendering::raytracing::backends::vulkan;
1759
+ auto& ctx = vk::context(renderer);
1760
+ vk::wait_in_flight(device, ctx);
1761
+ }
1762
+
1763
+ template <typename DEVICE, typename SPEC>
1764
+ void render(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer){
1765
+ render_launch(device, renderer);
1766
+ render_sync(device, renderer);
1767
+ }
1768
+
1769
+ // render produces the image outputs the spec declares; the collision-probe pass is the
1770
+ // separate probe verb so it can be scheduled independently (e.g. alongside update)
1771
+ template <typename DEVICE, typename SPEC>
1772
+ void probe_launch(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer){
1773
+ namespace vk = rendering::raytracing::backends::vulkan;
1774
+ auto& ctx = vk::context(renderer);
1775
+ if(ctx.collision_pipeline != VK_NULL_HANDLE){
1776
+ vk::wait_collision_in_flight(device, ctx);
1777
+ VkSubmitInfo submit_info{};
1778
+ submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1779
+ submit_info.commandBufferCount = 1;
1780
+ submit_info.pCommandBuffers = &ctx.cb_collision;
1781
+ vk::check(device, vkQueueSubmit(ctx.queue, 1, &submit_info, ctx.fence_collision), "Vulkan: collision submit failed");
1782
+ ctx.collision_in_flight = true;
1783
+ }
1784
+ }
1785
+
1786
+ template <typename DEVICE, typename SPEC>
1787
+ void probe_sync(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer){
1788
+ namespace vk = rendering::raytracing::backends::vulkan;
1789
+ auto& ctx = vk::context(renderer);
1790
+ vk::wait_collision_in_flight(device, ctx);
1791
+ }
1792
+
1793
+ template <typename DEVICE, typename SPEC>
1794
+ void probe(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer){
1795
+ probe_launch(device, renderer);
1796
+ probe_sync(device, renderer);
1797
+ }
1798
+
1799
+ template <typename DEVICE, typename SPEC>
1800
+ void save_image(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer, const char* filename){
1801
+ static_assert(SPEC::HAS_RGB, "save_image requires an RGB-capable renderer specification");
1802
+ namespace vk = rendering::raytracing::backends::vulkan;
1803
+ rendering::raytracing::detail::write_grid_png<SPEC>(data(renderer.frame_buffer), filename);
1804
+ }
1805
+
1806
+ template <typename DEVICE, typename SPEC>
1807
+ void save_segmentation_image(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer, const char* filename){
1808
+ static_assert(SPEC::HAS_SEGMENTATION, "save_segmentation_image requires a segmentation-capable renderer specification");
1809
+ namespace vk = rendering::raytracing::backends::vulkan;
1810
+ rendering::raytracing::detail::write_segmentation_grid_png<SPEC>(data(renderer.segmentation_buffer), filename);
1811
+ }
1812
+
1813
+ template <typename DEVICE, typename SPEC>
1814
+ void save_normals_image(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer, const char* filename){
1815
+ static_assert(SPEC::HAS_NORMALS, "save_normals_image requires a normals-capable renderer specification");
1816
+ namespace vk = rendering::raytracing::backends::vulkan;
1817
+ rendering::raytracing::detail::write_normals_grid_png<SPEC>(data(renderer.normals_buffer), filename);
1818
+ }
1819
+
1820
+ template <typename DEVICE, typename SPEC>
1821
+ void save_depth_image(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer, const char* filename){
1822
+ static_assert(SPEC::HAS_DEPTH, "save_depth_image requires a depth-capable renderer specification");
1823
+ namespace vk = rendering::raytracing::backends::vulkan;
1824
+ rendering::raytracing::detail::write_depth_grid_png<SPEC>(data(renderer.depth_buffer), renderer.camera_radius, filename);
1825
+ }
1826
+
1827
+ template <typename DEVICE, typename SPEC>
1828
+ void save_depth(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer, const char* filename){
1829
+ static_assert(SPEC::HAS_DEPTH, "save_depth requires a depth-capable renderer specification");
1830
+ namespace vk = rendering::raytracing::backends::vulkan;
1831
+ rendering::raytracing::detail::write_depth_bin<SPEC>(data(renderer.depth_buffer), filename);
1832
+ }
1833
+
1834
+ template <typename DEVICE, typename SPEC>
1835
+ void save_probes(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer, const char* filename){
1836
+ #if RL_TOOLS_RENDERING_RAYTRACING_DISABLE_PROBE_RAYS
1837
+ RL_TOOLS_RENDERING_RAYTRACING_LOG("save_probes skipped: probe rays are disabled.");
1838
+ (void)filename;
1839
+ return;
1840
+ #else
1841
+ namespace vk = rendering::raytracing::backends::vulkan;
1842
+ rendering::raytracing::detail::write_probes_bin_and_log<SPEC>(data(renderer.collision_results), filename);
1843
+ #endif
1844
+ }
1845
+
1846
+ template <typename DEVICE, typename SPEC>
1847
+ void synchronize(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer){
1848
+ namespace vk = rendering::raytracing::backends::vulkan;
1849
+ auto& ctx = vk::context(renderer);
1850
+ vk::wait_in_flight(device, ctx);
1851
+ }
1852
+
1853
+ template <typename DEVICE, typename SPEC>
1854
+ void free(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer){
1855
+ namespace vk = rendering::raytracing::backends::vulkan;
1856
+ if(renderer.backend != nullptr){
1857
+ auto& ctx = vk::context(renderer);
1858
+ vkDeviceWaitIdle(ctx.device);
1859
+ vk::destroy_scene_resources(ctx);
1860
+ vk::destroy_buffer(ctx, ctx.launch_params);
1861
+ vk::destroy_buffer(ctx, ctx.cameras);
1862
+ vk::destroy_buffer(ctx, ctx.cameras_open);
1863
+ vk::destroy_buffer(ctx, ctx.frame_buffer);
1864
+ vk::destroy_buffer(ctx, ctx.depth_buffer);
1865
+ vk::destroy_buffer(ctx, ctx.segmentation_buffer);
1866
+ vk::destroy_buffer(ctx, ctx.normals_buffer);
1867
+ vk::destroy_buffer(ctx, ctx.observation);
1868
+ vk::destroy_buffer(ctx, ctx.collision_results);
1869
+ vk::destroy_buffer(ctx, ctx.probe_directions);
1870
+ vk::destroy_buffer(ctx, ctx.rgb_accumulator);
1871
+ vk::destroy_buffer(ctx, ctx.depth_accumulator);
1872
+ vk::destroy_buffer(ctx, ctx.dummy);
1873
+ if(ctx.rgb_pipeline != VK_NULL_HANDLE){ vkDestroyPipeline(ctx.device, ctx.rgb_pipeline, nullptr); }
1874
+ if(ctx.depth_pipeline != VK_NULL_HANDLE){ vkDestroyPipeline(ctx.device, ctx.depth_pipeline, nullptr); }
1875
+ if(ctx.collision_pipeline != VK_NULL_HANDLE){ vkDestroyPipeline(ctx.device, ctx.collision_pipeline, nullptr); }
1876
+ if(ctx.segmentation_pipeline != VK_NULL_HANDLE){ vkDestroyPipeline(ctx.device, ctx.segmentation_pipeline, nullptr); }
1877
+ if(ctx.normals_pipeline != VK_NULL_HANDLE){ vkDestroyPipeline(ctx.device, ctx.normals_pipeline, nullptr); }
1878
+ if(ctx.resolve_pipeline != VK_NULL_HANDLE){ vkDestroyPipeline(ctx.device, ctx.resolve_pipeline, nullptr); }
1879
+ if(ctx.module_rgb != VK_NULL_HANDLE){ vkDestroyShaderModule(ctx.device, ctx.module_rgb, nullptr); }
1880
+ if(ctx.module_depth != VK_NULL_HANDLE){ vkDestroyShaderModule(ctx.device, ctx.module_depth, nullptr); }
1881
+ if(ctx.module_collision != VK_NULL_HANDLE){ vkDestroyShaderModule(ctx.device, ctx.module_collision, nullptr); }
1882
+ if(ctx.module_segmentation != VK_NULL_HANDLE){ vkDestroyShaderModule(ctx.device, ctx.module_segmentation, nullptr); }
1883
+ if(ctx.module_normals != VK_NULL_HANDLE){ vkDestroyShaderModule(ctx.device, ctx.module_normals, nullptr); }
1884
+ if(ctx.module_resolve != VK_NULL_HANDLE){ vkDestroyShaderModule(ctx.device, ctx.module_resolve, nullptr); }
1885
+ vkDestroyPipelineLayout(ctx.device, ctx.pipeline_layout, nullptr);
1886
+ vkDestroyDescriptorSetLayout(ctx.device, ctx.descriptor_set_layout, nullptr);
1887
+ vkDestroySampler(ctx.device, ctx.sampler, nullptr);
1888
+ vkDestroyFence(ctx.device, ctx.fence_render, nullptr);
1889
+ vkDestroyFence(ctx.device, ctx.fence_collision, nullptr);
1890
+ vkDestroyFence(ctx.device, ctx.fence_update, nullptr);
1891
+ vkDestroyCommandPool(ctx.device, ctx.command_pool, nullptr);
1892
+ vkDestroyDevice(ctx.device, nullptr);
1893
+ vkDestroyInstance(ctx.instance, nullptr);
1894
+ delete renderer.backend;
1895
+ renderer.backend = nullptr;
1896
+ }
1897
+ // the input and output tensors alias mapped buffers destroyed with the context
1898
+ renderer.cameras._data = nullptr;
1899
+ if constexpr (SPEC::ENABLE_MOTION_BLUR) {
1900
+ renderer.cameras_open._data = nullptr;
1901
+ }
1902
+ if constexpr (SPEC::HAS_RGB) {
1903
+ renderer.frame_buffer._data = nullptr;
1904
+ }
1905
+ if constexpr (SPEC::HAS_DEPTH) {
1906
+ renderer.depth_buffer._data = nullptr;
1907
+ }
1908
+ if constexpr (SPEC::HAS_SEGMENTATION) {
1909
+ renderer.segmentation_buffer._data = nullptr;
1910
+ }
1911
+ if constexpr (SPEC::HAS_NORMALS) {
1912
+ renderer.normals_buffer._data = nullptr;
1913
+ }
1914
+ if constexpr (SPEC::HAS_OBSERVATION) {
1915
+ renderer.observation._data = nullptr;
1916
+ }
1917
+ renderer.collision_results._data = nullptr;
1918
+ if constexpr (SPEC::ENABLE_OVERLAYS) {
1919
+ free(device, renderer.transforms);
1920
+ }
1921
+ if constexpr (SPEC::ENABLE_DYNAMIC_MOTION_BLUR) {
1922
+ free(device, renderer.transforms_motion);
1923
+ free(device, renderer.transforms_pair);
1924
+ if constexpr (SPEC::HAS_RGB) {
1925
+ renderer.rgb_accumulator._data = nullptr;
1926
+ }
1927
+ if constexpr (SPEC::HAS_DEPTH) {
1928
+ renderer.depth_accumulator._data = nullptr;
1929
+ }
1930
+ }
1931
+ }
1932
+
1933
+ // shared-asset-library fallbacks: this backend has no cross-renderer sharing, so the
1934
+ // library is empty and every renderer builds its own copy — the API stays uniform
1935
+ template <typename DEVICE, typename SPEC>
1936
+ void malloc(DEVICE& device, rendering::raytracing::AssetLibrary<SPEC, rendering::raytracing::backends::Vulkan>& library){
1937
+ library.backend = new rendering::raytracing::backends::LibraryState<rendering::raytracing::backends::Vulkan, SPEC>{};
1938
+ }
1939
+
1940
+ template <typename DEVICE, typename SPEC>
1941
+ void free(DEVICE& device, rendering::raytracing::AssetLibrary<SPEC, rendering::raytracing::backends::Vulkan>& library){
1942
+ for(auto* assets : library.assets){
1943
+ delete assets;
1944
+ }
1945
+ library.assets.clear();
1946
+ library.scenes.clear();
1947
+ library.hashes.clear();
1948
+ delete library.backend;
1949
+ library.backend = nullptr;
1950
+ }
1951
+
1952
+ template <typename DEVICE, typename SPEC>
1953
+ void malloc(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer, rendering::raytracing::AssetLibrary<SPEC, rendering::raytracing::backends::Vulkan>& library){
1954
+ malloc(device, renderer);
1955
+ }
1956
+
1957
+ template <typename DEVICE, typename SPEC>
1958
+ typename SPEC::TI init(DEVICE& device, rendering::raytracing::Renderer<SPEC, rendering::raytracing::backends::Vulkan>& renderer, rendering::raytracing::AssetLibrary<SPEC, rendering::raytracing::backends::Vulkan>& library, const char* scene_path){
1959
+ bool is_new = false;
1960
+ const auto scene_id = rendering::raytracing::detail::library_lookup_or_load(device, library, scene_path, is_new);
1961
+ init(device, renderer, library.scenes[scene_id], library.pool);
1962
+ return scene_id;
1963
+ }
1964
+ }
1965
+ RL_TOOLS_NAMESPACE_WRAPPER_END
1966
+
1967
+ #endif