@woosh/meep-engine 3.12.0 → 3.13.1

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 (301) hide show
  1. package/package.json +1 -1
  2. package/src/core/geom/3d/shape/ConvexHullShape3D.d.ts.map +1 -1
  3. package/src/core/geom/3d/shape/ConvexHullShape3D.js +41 -25
  4. package/src/core/geom/3d/shape/PosedShape3D.d.ts.map +1 -1
  5. package/src/core/geom/3d/shape/PosedShape3D.js +7 -2
  6. package/src/engine/graphics3/decal/GPUDecalRenderer.js +3 -3
  7. package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
  8. package/src/engine/graphics3/decal/shader_decal_composite.js +4 -2
  9. package/src/engine/graphics3/highlight/GPUHighlightRenderer.d.ts.map +1 -1
  10. package/src/engine/graphics3/highlight/GPUHighlightRenderer.js +2 -3
  11. package/src/engine/graphics3/highlight/shader_highlight_outline.js +150 -150
  12. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  13. package/src/shade/RENDERER_CONTRACT.md +2 -1
  14. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts +18 -0
  15. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts.map +1 -1
  16. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js +73 -0
  17. package/src/shade/device/PASS_ENCODER_PROPOSAL_2026_08_31.md +755 -0
  18. package/src/shade/device/ShadeGPUCommandContext.d.ts +10 -16
  19. package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
  20. package/src/shade/device/ShadeGPUCommandContext.js +801 -994
  21. package/src/shade/device/pass/ShadeGPUComputePassEncoder.d.ts +107 -0
  22. package/src/shade/device/pass/ShadeGPUComputePassEncoder.d.ts.map +1 -0
  23. package/src/shade/device/pass/ShadeGPUComputePassEncoder.js +222 -0
  24. package/src/shade/device/pass/ShadeGPURenderPassEncoder.d.ts +168 -0
  25. package/src/shade/device/pass/ShadeGPURenderPassEncoder.d.ts.map +1 -0
  26. package/src/shade/device/pass/ShadeGPURenderPassEncoder.js +317 -0
  27. package/src/shade/device/timing/GPUTimerArray.d.ts +4 -9
  28. package/src/shade/device/timing/GPUTimerArray.d.ts.map +1 -1
  29. package/src/shade/device/timing/GPUTimerArray.js +261 -289
  30. package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +20 -2
  31. package/src/shade/device/timing/ShadeGPUContextProfiler.d.ts +59 -0
  32. package/src/shade/device/timing/ShadeGPUContextProfiler.d.ts.map +1 -0
  33. package/src/shade/device/timing/ShadeGPUContextProfiler.js +182 -0
  34. package/src/shade/device/timing/profile/GPUProfileSession.d.ts +4 -4
  35. package/src/shade/device/timing/profile/GPUProfileSession.js +4 -4
  36. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
  37. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +3 -1
  38. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.d.ts.map +1 -1
  39. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.js +3 -1
  40. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts.map +1 -1
  41. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.js +3 -1
  42. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +2 -2
  43. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +2 -2
  44. package/src/shade/renderer/Renderer.d.ts +0 -6
  45. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  46. package/src/shade/renderer/Renderer.js +0 -29
  47. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  48. package/src/shade/renderer/animation/GPUAnimationManager.js +1 -3
  49. package/src/shade/renderer/animation/shader_animation_tick.d.ts.map +1 -1
  50. package/src/shade/renderer/animation/shader_animation_tick.js +128 -125
  51. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  52. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +8 -18
  53. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.d.ts.map +1 -1
  54. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.js +100 -98
  55. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.d.ts.map +1 -1
  56. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js +215 -212
  57. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts +1 -1
  58. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts.map +1 -1
  59. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.js +135 -120
  60. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.d.ts.map +1 -1
  61. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.js +77 -75
  62. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.d.ts.map +1 -1
  63. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js +375 -371
  64. package/src/shade/renderer/atmosphere/shader_transmittance_lut.js +3 -3
  65. package/src/shade/renderer/buffer/graph_inspect_gpu_buffer.js +1 -1
  66. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
  67. package/src/shade/renderer/buffer/table/GPUDatabase.js +14 -19
  68. package/src/shade/renderer/buffer/table/gpu_table_element_upload_shader.d.ts.map +1 -1
  69. package/src/shade/renderer/buffer/table/gpu_table_element_upload_shader.js +7 -2
  70. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
  71. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +325 -319
  72. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.d.ts.map +1 -1
  73. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.js +3 -1
  74. package/src/shade/renderer/deferred/shader_tonemap_HDR.d.ts.map +1 -1
  75. package/src/shade/renderer/deferred/shader_tonemap_HDR.js +4 -1
  76. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts +2 -2
  77. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts.map +1 -1
  78. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +167 -167
  79. package/src/shade/renderer/fow/GPUFogOfWarRenderer.js +3 -3
  80. package/src/shade/renderer/fow/shader_fog_of_war.d.ts.map +1 -1
  81. package/src/shade/renderer/fow/shader_fog_of_war.js +3 -1
  82. package/src/shade/renderer/geometry/bvh/record_blas_refit.js +102 -102
  83. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.d.ts.map +1 -1
  84. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.js +125 -121
  85. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  86. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +766 -774
  87. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
  88. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +72 -69
  89. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
  90. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +5 -10
  91. package/src/shade/renderer/geometry/sdf/shader_build_sdf.js +129 -129
  92. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.d.ts.map +1 -1
  93. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.js +5 -3
  94. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.d.ts.map +1 -1
  95. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.js +4 -1
  96. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_resolve_probes.d.ts.map +1 -1
  97. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_resolve_probes.js +3 -1
  98. package/src/shade/renderer/global_illumination/clipmap/shader_update_clipmap_cascade.d.ts.map +1 -1
  99. package/src/shade/renderer/global_illumination/clipmap/shader_update_clipmap_cascade.js +114 -112
  100. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lpv_store_sh.d.ts.map +1 -1
  101. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lpv_store_sh.js +4 -1
  102. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.d.ts.map +1 -1
  103. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +187 -184
  104. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.d.ts.map +1 -1
  105. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.js +4 -1
  106. package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.d.ts.map +1 -1
  107. package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.js +6 -8
  108. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.d.ts.map +1 -1
  109. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.js +3 -1
  110. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_update.d.ts.map +1 -1
  111. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_update.js +3 -1
  112. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +3 -3
  113. package/src/shade/renderer/gpu_primitive/bvh/PHASE1_HANDOVER.md +3 -3
  114. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +217 -217
  115. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts.map +1 -1
  116. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +145 -142
  117. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts.map +1 -1
  118. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js +87 -82
  119. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.d.ts.map +1 -1
  120. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.js +143 -140
  121. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.d.ts +2 -2
  122. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.d.ts.map +1 -1
  123. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.js +43 -8
  124. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
  125. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +4 -5
  126. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts.map +1 -1
  127. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js +88 -84
  128. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts.map +1 -1
  129. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js +194 -191
  130. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
  131. package/src/shade/renderer/hiz/HierarchicalZBuffer.js +33 -69
  132. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts.map +1 -1
  133. package/src/shade/renderer/hiz/shader_hzb_reduce_any.js +6 -1
  134. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts.map +1 -1
  135. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.js +23 -7
  136. package/src/shade/renderer/light/environment/execute_filter_environment_map.d.ts.map +1 -1
  137. package/src/shade/renderer/light/environment/execute_filter_environment_map.js +1 -2
  138. package/src/shade/renderer/light/environment/shader_convolve_reflection_map.d.ts.map +1 -1
  139. package/src/shade/renderer/light/environment/shader_convolve_reflection_map.js +6 -1
  140. package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.d.ts.map +1 -1
  141. package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.js +234 -219
  142. package/src/shade/renderer/lightmap/bake/raster/shader_lightmap_to_viz_buffer.js +2 -2
  143. package/src/shade/renderer/lightmap/bake/shader_lightmap_denoise_sh.js +191 -191
  144. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_accummulate_tile.d.ts.map +1 -1
  145. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_accummulate_tile.js +85 -82
  146. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  147. package/src/shade/renderer/particles/graph_particles.js +5 -3
  148. package/src/shade/renderer/particles/prototypeParticleSystem.js +3 -4
  149. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  150. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +132 -117
  151. package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
  152. package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +79 -77
  153. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  154. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +111 -99
  155. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
  156. package/src/shade/renderer/particles/sort/shader_particle_sort.js +187 -158
  157. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts.map +1 -1
  158. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +7 -10
  159. package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.d.ts.map +1 -1
  160. package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.js +4 -1
  161. package/src/shade/renderer/postprocess/bloom/shader_bloom_mix.d.ts.map +1 -1
  162. package/src/shade/renderer/postprocess/bloom/shader_bloom_mix.js +3 -1
  163. package/src/shade/renderer/postprocess/cas/shader_ffx_rcas.d.ts.map +1 -1
  164. package/src/shade/renderer/postprocess/cas/shader_ffx_rcas.js +4 -2
  165. package/src/shade/renderer/postprocess/denoise/fragment_shader_denoise_ao.js +147 -147
  166. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.d.ts.map +1 -1
  167. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +121 -119
  168. package/src/shade/renderer/postprocess/dof/gather/graph_postprocess_dof2.d.ts.map +1 -1
  169. package/src/shade/renderer/postprocess/dof/gather/graph_postprocess_dof2.js +1 -2
  170. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_far.d.ts.map +1 -1
  171. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_far.js +4 -1
  172. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_near.d.ts.map +1 -1
  173. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_near.js +4 -1
  174. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.d.ts.map +1 -1
  175. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.js +4 -1
  176. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_setup.d.ts.map +1 -1
  177. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_setup.js +4 -1
  178. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.d.ts.map +1 -1
  179. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.js +2 -4
  180. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_composite.d.ts.map +1 -1
  181. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_composite.js +4 -1
  182. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_prefilter.d.ts.map +1 -1
  183. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_prefilter.js +4 -1
  184. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch.d.ts.map +1 -1
  185. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch.js +4 -1
  186. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.d.ts.map +1 -1
  187. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.js +269 -266
  188. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.d.ts.map +1 -1
  189. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.js +273 -270
  190. package/src/shade/renderer/postprocess/dof/shader_dof_autofocus.d.ts.map +1 -1
  191. package/src/shade/renderer/postprocess/dof/shader_dof_autofocus.js +4 -1
  192. package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.d.ts.map +1 -1
  193. package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.js +8 -11
  194. package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.d.ts.map +1 -1
  195. package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.js +5 -1
  196. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts.map +1 -1
  197. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.js +11 -8
  198. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.d.ts.map +1 -1
  199. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +7 -8
  200. package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.d.ts.map +1 -1
  201. package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.js +3 -1
  202. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  203. package/src/shade/renderer/postprocess/nss/shader_nss_concat.d.ts.map +1 -1
  204. package/src/shade/renderer/postprocess/nss/shader_nss_concat.js +70 -68
  205. package/src/shade/renderer/postprocess/ssr/depth_max_shader.d.ts.map +1 -1
  206. package/src/shade/renderer/postprocess/ssr/depth_max_shader.js +70 -68
  207. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.d.ts.map +1 -1
  208. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.js +3 -1
  209. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.d.ts.map +1 -1
  210. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.js +4 -1
  211. package/src/shade/renderer/postprocess/ssr/shader_downsample_encoded_normal.d.ts.map +1 -1
  212. package/src/shade/renderer/postprocess/ssr/shader_downsample_encoded_normal.js +103 -101
  213. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
  214. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +4 -2
  215. package/src/shade/renderer/postprocess/ssr/ssr_trace_shader.d.ts.map +1 -1
  216. package/src/shade/renderer/postprocess/ssr/ssr_trace_shader.js +3 -1
  217. package/src/shade/renderer/postprocess/taa/shader_taa.d.ts.map +1 -1
  218. package/src/shade/renderer/postprocess/taa/shader_taa.js +4 -1
  219. package/src/shade/renderer/postprocess/upscale-dither/fragment_shader_upscale_dither.js +5 -5
  220. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  221. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +339 -341
  222. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
  223. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +114 -109
  224. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
  225. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +118 -115
  226. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  227. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +69 -65
  228. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +722 -722
  229. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
  230. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +1 -9
  231. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
  232. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +1 -6
  233. package/src/shade/renderer/restir/di/graph_restir_di.d.ts.map +1 -1
  234. package/src/shade/renderer/restir/di/graph_restir_di.js +2 -3
  235. package/src/shade/renderer/restir/di/graph_restir_di_denoise.d.ts.map +1 -1
  236. package/src/shade/renderer/restir/di/graph_restir_di_denoise.js +1 -2
  237. package/src/shade/renderer/restir/di/shader_restir_di_denoise.d.ts.map +1 -1
  238. package/src/shade/renderer/restir/di/shader_restir_di_denoise.js +139 -136
  239. package/src/shade/renderer/restir/di/shader_restir_di_resample.d.ts.map +1 -1
  240. package/src/shade/renderer/restir/di/shader_restir_di_resample.js +131 -129
  241. package/src/shade/renderer/restir/di/shader_restir_di_resolve.d.ts.map +1 -1
  242. package/src/shade/renderer/restir/di/shader_restir_di_resolve.js +101 -99
  243. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts.map +1 -1
  244. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +379 -383
  245. package/src/shade/renderer/scene/Mesh.d.ts.map +1 -1
  246. package/src/shade/renderer/scene/Mesh.js +4 -6
  247. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.d.ts.map +1 -1
  248. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js +147 -144
  249. package/src/shade/renderer/shader/ComputeShader.d.ts +2 -2
  250. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  251. package/src/shade/renderer/shader/ComputeShader.js +14 -17
  252. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts +2 -2
  253. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts.map +1 -1
  254. package/src/shade/renderer/shader/pass/RenderPassDescriptor.js +189 -189
  255. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  256. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +3 -1
  257. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +16 -7
  258. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  259. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +1342 -1326
  260. package/src/shade/renderer/shadow/map/Shadowmap.d.ts +13 -0
  261. package/src/shade/renderer/shadow/map/Shadowmap.d.ts.map +1 -1
  262. package/src/shade/renderer/shadow/map/Shadowmap.js +14 -0
  263. package/src/shade/renderer/shadow/map/ShadowmapDrawSelector.d.ts +79 -0
  264. package/src/shade/renderer/shadow/map/ShadowmapDrawSelector.d.ts.map +1 -0
  265. package/src/shade/renderer/shadow/map/ShadowmapDrawSelector.js +196 -0
  266. package/src/shade/renderer/shadow/map/ShadowmapRegistry.d.ts +91 -0
  267. package/src/shade/renderer/shadow/map/ShadowmapRegistry.d.ts.map +1 -0
  268. package/src/shade/renderer/shadow/map/ShadowmapRegistry.js +156 -0
  269. package/src/shade/renderer/shadow/map/shader/shader_shadowmap_remap_cube_to_octahedral.d.ts.map +1 -1
  270. package/src/shade/renderer/shadow/map/shader/shader_shadowmap_remap_cube_to_octahedral.js +5 -1
  271. package/src/shade/renderer/shadow/ray/shader_shadow_upscale.d.ts.map +1 -1
  272. package/src/shade/renderer/shadow/ray/shader_shadow_upscale.js +3 -1
  273. package/src/shade/renderer/shadow/ray/staged/gen/graph_gen_rays.js +73 -73
  274. package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.d.ts.map +1 -1
  275. package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.js +151 -148
  276. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.d.ts.map +1 -1
  277. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +4 -2
  278. package/src/shade/renderer/shadow/ray/staged/trace/shader_trace_rays.d.ts.map +1 -1
  279. package/src/shade/renderer/shadow/ray/staged/trace/shader_trace_rays.js +18 -4
  280. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.d.ts.map +1 -1
  281. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +7 -8
  282. package/src/shade/renderer/shadow/sdf/cascade/shader_build_scene_sdf_f32.d.ts.map +1 -1
  283. package/src/shade/renderer/shadow/sdf/cascade/shader_build_scene_sdf_f32.js +6 -2
  284. package/src/shade/renderer/shadow/sdf/cascade/shader_scene_sdf_debug_viz.d.ts.map +1 -1
  285. package/src/shade/renderer/shadow/sdf/cascade/shader_scene_sdf_debug_viz.js +129 -127
  286. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.d.ts.map +1 -1
  287. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.js +5 -3
  288. package/src/shade/renderer/texture/virtual/VirtualTextureManager.d.ts.map +1 -1
  289. package/src/shade/renderer/texture/virtual/VirtualTextureManager.js +2 -5
  290. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.d.ts.map +1 -1
  291. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.js +233 -231
  292. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  293. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +2 -4
  294. package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
  295. package/src/shade/wgsl/validate_wgsl_source.js +8 -3
  296. package/src/shade/device/timing/profile/make_profiling_pass_encoder.d.ts +0 -21
  297. package/src/shade/device/timing/profile/make_profiling_pass_encoder.d.ts.map +0 -1
  298. package/src/shade/device/timing/profile/make_profiling_pass_encoder.js +0 -114
  299. package/src/shade/device/timing/profile/parse_workgroup_size.d.ts +0 -20
  300. package/src/shade/device/timing/profile/parse_workgroup_size.d.ts.map +0 -1
  301. package/src/shade/device/timing/profile/parse_workgroup_size.js +0 -43
@@ -1 +1 @@
1
- {"version":3,"file":"Mesh.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/scene/Mesh.js"],"names":[],"mappings":"AAYA;IA2HI;;;;;;OAMG;IACH,mFAFY,IAAI,CAoBf;IAnJD;;OAEG;IACH,0BAAS;IAET;;OAEG;IACH,wBAAS;IAET;;;OAGG;IACH,cAFU,YAAY,CAEa;IAEnC;;;OAGG;IACH,iBAFU,YAAY,CAEgB;IAEtC;;;OAGG;IACH,SAFa,IAAI,CAQhB;IAED;;;OAGG;IACH,YAFW,IAAI,QAiBd;IAED;;;;OAIG;IACH,cAHW,IAAI,GACF,OAAO,CAQnB;IAQD,0BAOC;IAED,0BAqCC;IA+BL,gBAAqB;CAHpB;uBAvJsB,aAAa"}
1
+ {"version":3,"file":"Mesh.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/scene/Mesh.js"],"names":[],"mappings":"AAUA;IA2HI;;;;;;OAMG;IACH,mFAFY,IAAI,CAoBf;IAnJD;;OAEG;IACH,0BAAS;IAET;;OAEG;IACH,wBAAS;IAET;;;OAGG;IACH,cAFU,YAAY,CAEa;IAEnC;;;OAGG;IACH,iBAFU,YAAY,CAEgB;IAEtC;;;OAGG;IACH,SAFa,IAAI,CAQhB;IAED;;;OAGG;IACH,YAFW,IAAI,QAiBd;IAED;;;;OAIG;IACH,cAHW,IAAI,GACF,OAAO,CAQnB;IAQD,0BAOC;IAED,0BAqCC;IA+BL,gBAAqB;CAHpB;uBAvJsB,aAAa"}
@@ -1,10 +1,8 @@
1
1
  import { assert } from "../../../core/assert.js";
2
2
  import { AABB3 } from "../../../core/geom/3d/aabb/AABB3.js";
3
- import {
4
- aabb3_from_v3_array_transformed
5
- } from "../../../core/geom/3d/aabb/aabb3_from_v3_array_transformed.js";
3
+ import { aabb3_from_v3_array_transformed } from "../../../core/geom/3d/aabb/aabb3_from_v3_array_transformed.js";
6
4
  import { aabb3_matrix4_project } from "../../../core/geom/3d/aabb/aabb3_matrix4_project.js";
7
- import { sphere_matrix4_project } from "../../../core/geom/3d/sphere/sphere_matrix4_transform.js";
5
+ import { sphere_matrix4_transform } from "../../../core/geom/3d/sphere/sphere_matrix4_transform.js";
8
6
  import { epsilonEquals } from "../../../core/math/epsilonEquals.js";
9
7
  import { optional_equality } from "../../descriptor/util/optional_equality.js";
10
8
  import { StandardAttributes } from "../geometry/StandardAttributes.js";
@@ -91,7 +89,7 @@ export class Mesh extends Node3D {
91
89
  const m = this.transform_global;
92
90
 
93
91
  aabb3_matrix4_project(this.bounding_box, this.geometry.bounding_box, m);
94
- sphere_matrix4_project(this.bounding_sphere, this.geometry.bounding_sphere, m);
92
+ sphere_matrix4_transform(this.bounding_sphere, this.geometry.bounding_sphere, m);
95
93
  }
96
94
 
97
95
  updateBoundsTight() {
@@ -128,7 +126,7 @@ export class Mesh extends Node3D {
128
126
 
129
127
  {
130
128
  // todo do a tight sphere bounds
131
- sphere_matrix4_project(this.bounding_sphere, this.geometry.bounding_sphere, this.transform_global);
129
+ sphere_matrix4_transform(this.bounding_sphere, this.geometry.bounding_sphere, this.transform_global);
132
130
  }
133
131
  }
134
132
  }
@@ -1 +1 @@
1
- {"version":3,"file":"shader_bvh_extract_instance_leaves.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js"],"names":[],"mappings":"AAUA,4CAA6C;AA+G7C;;;;;;;;;;;;;;;;;GAiBG;AACH,iDAFU,aAAa,CAMpB;8BA1I2B,4BAA4B"}
1
+ {"version":3,"file":"shader_bvh_extract_instance_leaves.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js"],"names":[],"mappings":"AAUA,4CAA6C;AAkH7C;;;;;;;;;;;;;;;;;GAiBG;AACH,iDAFU,aAAa,CAMpB;8BA7I2B,4BAA4B"}
@@ -1,144 +1,147 @@
1
- import { WebGPUExtensionType } from "../../descriptor/WebGPUExtensionType.js";
2
- import { atomic_u32, f32, u32 } from "../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
3
- import { WebGPUArray } from "../shader/type/WebGPUArray.js";
4
- import { chunk_aabb_atomic_f32 } from "../animation/skinning/bounds_refresh/chunk_aabb_atomic_f32.js";
5
- import { CodeChunk } from "../shader/compiler/CodeChunk.js";
6
- import { ComputeShader } from "../shader/ComputeShader.js";
7
- import { ShaderResourceSetDescriptor } from "../shader/resource/ShaderResourceSetDescriptor.js";
8
- import { BVH_BUILD_SETTINGS_STRUCT } from "../gpu_primitive/bvh/BVH_BUILD_SETTINGS_STRUCT.js";
9
- import { chunk_scene_database_access } from "./chunk_scene_database_access.js";
10
-
11
- export const BVH_EXTRACT_WORKGROUP_SIZE = 64;
12
-
13
- /**
14
- * Subgroup size is a runtime value of at least 4, so a workgroup splits into at most this many
15
- * subgroups. The array of per-subgroup partials is sized for the worst case.
16
- *
17
- * @type {number}
18
- */
19
- const MAX_SUBGROUPS = BVH_EXTRACT_WORKGROUP_SIZE / 4;
20
-
21
- const resources = new ShaderResourceSetDescriptor();
22
- resources.createGroup()
23
- .addUniform("settings", BVH_BUILD_SETTINGS_STRUCT)
24
- // occupied rows of the scene database's `meshes` table, compacted — dead and reused rows never
25
- // reach the build
26
- .addStorageBuffer("rows", WebGPUArray.from(u32), false)
27
- .addStorageBuffer("scene_database", WebGPUArray.from(u32), false)
28
- .addStorageBuffer("leaf_bounds", WebGPUArray.from(f32), true)
29
- .addStorageBuffer("leaf_payload", WebGPUArray.from(u32), true)
30
- // six words holding plain f32 bit patterns, seeded to +/-inf before this pass runs
31
- .addStorageBuffer("scene_bounds", WebGPUArray.from(atomic_u32), true);
32
-
33
- const body = CodeChunk.from(
34
- //language=WGSL
35
- `
36
- const WORKGROUP_SIZE = ${BVH_EXTRACT_WORKGROUP_SIZE}u;
37
-
38
- // The scatter sentinels in scene_bounds are true +/-inf, written host-side as u32 bit patterns.
39
- // Here they cannot be: WGSL will not const-fold bitcast<f32>(0x7F800000u), because the result is
40
- // not representable as a literal. The largest finite f32 is the identity element in practice —
41
- // no world-space bound comes within many orders of magnitude of it.
42
- const FLOAT_MAX = 3.4028234e38;
43
-
44
- var<workgroup> wg_low: array<vec3<f32>, ${MAX_SUBGROUPS}>;
45
- var<workgroup> wg_high: array<vec3<f32>, ${MAX_SUBGROUPS}>;
46
-
47
- @compute @workgroup_size(WORKGROUP_SIZE, 1, 1)
48
- fn main(
49
- @builtin(global_invocation_id) gid: vec3<u32>,
50
- @builtin(local_invocation_index) thread_id: u32,
51
- @builtin(subgroup_invocation_id) lane_id: u32,
52
- @builtin(subgroup_size) lane_count: u32,
53
- ) {
54
- let i = gid.x;
55
-
56
- // Threads past the end contribute the identity element rather than returning: the reduction
57
- // below is workgroup-wide and every lane has to reach it.
58
- var low = vec3<f32>(FLOAT_MAX);
59
- var high = vec3<f32>(-FLOAT_MAX);
60
-
61
- if (i < settings.element_count) {
62
- let row = rows[i];
63
-
64
- let mesh = scene_read_mesh(&scene_database, row);
65
-
66
- low = vec3<f32>(mesh.bounding_box[0], mesh.bounding_box[1], mesh.bounding_box[2]);
67
- high = vec3<f32>(mesh.bounding_box[3], mesh.bounding_box[4], mesh.bounding_box[5]);
68
-
69
- let destination = i * 6u;
70
-
71
- leaf_bounds[destination] = low.x;
72
- leaf_bounds[destination + 1u] = low.y;
73
- leaf_bounds[destination + 2u] = low.z;
74
- leaf_bounds[destination + 3u] = high.x;
75
- leaf_bounds[destination + 4u] = high.y;
76
- leaf_bounds[destination + 5u] = high.z;
77
-
78
- // The leaf's payload IS the mesh row — what the traversal hands to scene_read_mesh on a hit.
79
- leaf_payload[i] = row;
80
- }
81
-
82
- // Subgroups first, workgroup memory only across subgroup boundaries.
83
- let subgroup_low = subgroupMin(low);
84
- let subgroup_high = subgroupMax(high);
85
-
86
- let subgroup_id = thread_id / lane_count;
87
- let subgroup_count = WORKGROUP_SIZE / lane_count;
88
-
89
- if (lane_id == 0u) {
90
- wg_low[subgroup_id] = subgroup_low;
91
- wg_high[subgroup_id] = subgroup_high;
92
- }
93
-
94
- workgroupBarrier();
95
-
96
- // At most MAX_SUBGROUPS entries left; one thread walks them, so nothing here depends on the
97
- // subgroup width and no barrier sits under a bound derived from it.
98
- if (thread_id == 0u) {
99
- var group_low = wg_low[0];
100
- var group_high = wg_high[0];
101
-
102
- for (var s = 1u; s < subgroup_count; s += 1u) {
103
- group_low = min(group_low, wg_low[s]);
104
- group_high = max(group_high, wg_high[s]);
105
- }
106
-
107
- aabb_atomic_min_f32(&scene_bounds[0], group_low.x);
108
- aabb_atomic_min_f32(&scene_bounds[1], group_low.y);
109
- aabb_atomic_min_f32(&scene_bounds[2], group_low.z);
110
- aabb_atomic_max_f32(&scene_bounds[3], group_high.x);
111
- aabb_atomic_max_f32(&scene_bounds[4], group_high.y);
112
- aabb_atomic_max_f32(&scene_bounds[5], group_high.z);
113
- }
114
- }
115
- `, [
116
- chunk_scene_database_access,
117
- chunk_aabb_atomic_f32,
118
- ]);
119
-
120
- body.addExtension(WebGPUExtensionType.Subgroups);
121
-
122
- /**
123
- * Turn the TLAS's live instance rows into the flat leaf set {@link graph_bvh_build_lbvh} consumes,
124
- * and reduce their union into the scene-bounds cell the Morton pass quantises against.
125
- *
126
- * World AABBs come from the scene database's `meshes` table rather than from the CPU tree's leaves:
127
- * it is the single source of truth, it is refreshed GPU-side for GPU-authority rows (which the CPU
128
- * never learns about at all), and reading it removes the build's dependency on CPU-side bounds
129
- * bookkeeping.
130
- *
131
- * This is the only scene-aware pass in the build, which is why it lives here with the scene code
132
- * rather than in `gpu_primitive/bvh/` — everything downstream of it takes flat boxes and payloads
133
- * and serves geometry just as well as instances.
134
- *
135
- * `scene_bounds` must be seeded with +/-inf before this runs; a pool-cleared buffer is zeroed, and
136
- * zero is a perfectly good coordinate.
137
- *
138
- * @type {ComputeShader}
139
- */
140
- export const shader_bvh_extract_instance_leaves = ComputeShader.from({
141
- label: "BVHBuild/ExtractInstanceLeaves",
142
- resources,
143
- body,
144
- });
1
+ import { WebGPUExtensionType } from "../../descriptor/WebGPUExtensionType.js";
2
+ import { atomic_u32, f32, u32 } from "../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
3
+ import { WebGPUArray } from "../shader/type/WebGPUArray.js";
4
+ import { chunk_aabb_atomic_f32 } from "../animation/skinning/bounds_refresh/chunk_aabb_atomic_f32.js";
5
+ import { CodeChunk } from "../shader/compiler/CodeChunk.js";
6
+ import { ComputeShader } from "../shader/ComputeShader.js";
7
+ import { ShaderResourceSetDescriptor } from "../shader/resource/ShaderResourceSetDescriptor.js";
8
+ import { BVH_BUILD_SETTINGS_STRUCT } from "../gpu_primitive/bvh/BVH_BUILD_SETTINGS_STRUCT.js";
9
+ import { chunk_scene_database_access } from "./chunk_scene_database_access.js";
10
+
11
+ export const BVH_EXTRACT_WORKGROUP_SIZE = 64;
12
+
13
+ /**
14
+ * Subgroup size is a runtime value of at least 4, so a workgroup splits into at most this many
15
+ * subgroups. The array of per-subgroup partials is sized for the worst case.
16
+ *
17
+ * @type {number}
18
+ */
19
+ const MAX_SUBGROUPS = BVH_EXTRACT_WORKGROUP_SIZE / 4;
20
+
21
+ const resources = new ShaderResourceSetDescriptor();
22
+
23
+ // per-dispatch, 20 bytes, read-only: immediate data rather than a uniform buffer
24
+ resources.setImmediate("settings", BVH_BUILD_SETTINGS_STRUCT);
25
+
26
+ resources.createGroup()
27
+ // occupied rows of the scene database's `meshes` table, compacted — dead and reused rows never
28
+ // reach the build
29
+ .addStorageBuffer("rows", WebGPUArray.from(u32), false)
30
+ .addStorageBuffer("scene_database", WebGPUArray.from(u32), false)
31
+ .addStorageBuffer("leaf_bounds", WebGPUArray.from(f32), true)
32
+ .addStorageBuffer("leaf_payload", WebGPUArray.from(u32), true)
33
+ // six words holding plain f32 bit patterns, seeded to +/-inf before this pass runs
34
+ .addStorageBuffer("scene_bounds", WebGPUArray.from(atomic_u32), true);
35
+
36
+ const body = CodeChunk.from(
37
+ //language=WGSL
38
+ `
39
+ const WORKGROUP_SIZE = ${BVH_EXTRACT_WORKGROUP_SIZE}u;
40
+
41
+ // The scatter sentinels in scene_bounds are true +/-inf, written host-side as u32 bit patterns.
42
+ // Here they cannot be: WGSL will not const-fold bitcast<f32>(0x7F800000u), because the result is
43
+ // not representable as a literal. The largest finite f32 is the identity element in practice —
44
+ // no world-space bound comes within many orders of magnitude of it.
45
+ const FLOAT_MAX = 3.4028234e38;
46
+
47
+ var<workgroup> wg_low: array<vec3<f32>, ${MAX_SUBGROUPS}>;
48
+ var<workgroup> wg_high: array<vec3<f32>, ${MAX_SUBGROUPS}>;
49
+
50
+ @compute @workgroup_size(WORKGROUP_SIZE, 1, 1)
51
+ fn main(
52
+ @builtin(global_invocation_id) gid: vec3<u32>,
53
+ @builtin(local_invocation_index) thread_id: u32,
54
+ @builtin(subgroup_invocation_id) lane_id: u32,
55
+ @builtin(subgroup_size) lane_count: u32,
56
+ ) {
57
+ let i = gid.x;
58
+
59
+ // Threads past the end contribute the identity element rather than returning: the reduction
60
+ // below is workgroup-wide and every lane has to reach it.
61
+ var low = vec3<f32>(FLOAT_MAX);
62
+ var high = vec3<f32>(-FLOAT_MAX);
63
+
64
+ if (i < settings.element_count) {
65
+ let row = rows[i];
66
+
67
+ let mesh = scene_read_mesh(&scene_database, row);
68
+
69
+ low = vec3<f32>(mesh.bounding_box[0], mesh.bounding_box[1], mesh.bounding_box[2]);
70
+ high = vec3<f32>(mesh.bounding_box[3], mesh.bounding_box[4], mesh.bounding_box[5]);
71
+
72
+ let destination = i * 6u;
73
+
74
+ leaf_bounds[destination] = low.x;
75
+ leaf_bounds[destination + 1u] = low.y;
76
+ leaf_bounds[destination + 2u] = low.z;
77
+ leaf_bounds[destination + 3u] = high.x;
78
+ leaf_bounds[destination + 4u] = high.y;
79
+ leaf_bounds[destination + 5u] = high.z;
80
+
81
+ // The leaf's payload IS the mesh row — what the traversal hands to scene_read_mesh on a hit.
82
+ leaf_payload[i] = row;
83
+ }
84
+
85
+ // Subgroups first, workgroup memory only across subgroup boundaries.
86
+ let subgroup_low = subgroupMin(low);
87
+ let subgroup_high = subgroupMax(high);
88
+
89
+ let subgroup_id = thread_id / lane_count;
90
+ let subgroup_count = WORKGROUP_SIZE / lane_count;
91
+
92
+ if (lane_id == 0u) {
93
+ wg_low[subgroup_id] = subgroup_low;
94
+ wg_high[subgroup_id] = subgroup_high;
95
+ }
96
+
97
+ workgroupBarrier();
98
+
99
+ // At most MAX_SUBGROUPS entries left; one thread walks them, so nothing here depends on the
100
+ // subgroup width and no barrier sits under a bound derived from it.
101
+ if (thread_id == 0u) {
102
+ var group_low = wg_low[0];
103
+ var group_high = wg_high[0];
104
+
105
+ for (var s = 1u; s < subgroup_count; s += 1u) {
106
+ group_low = min(group_low, wg_low[s]);
107
+ group_high = max(group_high, wg_high[s]);
108
+ }
109
+
110
+ aabb_atomic_min_f32(&scene_bounds[0], group_low.x);
111
+ aabb_atomic_min_f32(&scene_bounds[1], group_low.y);
112
+ aabb_atomic_min_f32(&scene_bounds[2], group_low.z);
113
+ aabb_atomic_max_f32(&scene_bounds[3], group_high.x);
114
+ aabb_atomic_max_f32(&scene_bounds[4], group_high.y);
115
+ aabb_atomic_max_f32(&scene_bounds[5], group_high.z);
116
+ }
117
+ }
118
+ `, [
119
+ chunk_scene_database_access,
120
+ chunk_aabb_atomic_f32,
121
+ ]);
122
+
123
+ body.addExtension(WebGPUExtensionType.Subgroups);
124
+
125
+ /**
126
+ * Turn the TLAS's live instance rows into the flat leaf set {@link graph_bvh_build_lbvh} consumes,
127
+ * and reduce their union into the scene-bounds cell the Morton pass quantises against.
128
+ *
129
+ * World AABBs come from the scene database's `meshes` table rather than from the CPU tree's leaves:
130
+ * it is the single source of truth, it is refreshed GPU-side for GPU-authority rows (which the CPU
131
+ * never learns about at all), and reading it removes the build's dependency on CPU-side bounds
132
+ * bookkeeping.
133
+ *
134
+ * This is the only scene-aware pass in the build, which is why it lives here with the scene code
135
+ * rather than in `gpu_primitive/bvh/` everything downstream of it takes flat boxes and payloads
136
+ * and serves geometry just as well as instances.
137
+ *
138
+ * `scene_bounds` must be seeded with +/-inf before this runs; a pool-cleared buffer is zeroed, and
139
+ * zero is a perfectly good coordinate.
140
+ *
141
+ * @type {ComputeShader}
142
+ */
143
+ export const shader_bvh_extract_instance_leaves = ComputeShader.from({
144
+ label: "BVHBuild/ExtractInstanceLeaves",
145
+ resources,
146
+ body,
147
+ });
@@ -44,9 +44,9 @@ export class ComputeShader {
44
44
  *
45
45
  * @param {ShadeGPUCommandContext} encoder
46
46
  * @param {Object} bindings
47
- * @return {GPUComputePassEncoder}
47
+ * @return {ShadeGPUComputePassEncoder}
48
48
  */
49
- constructPass({ encoder, bindings }: ShadeGPUCommandContext): GPUComputePassEncoder;
49
+ constructPass({ encoder, bindings }: ShadeGPUCommandContext): ShadeGPUComputePassEncoder;
50
50
  /**
51
51
  * Shortcut to {@link dispatch}, expressed in threads instead of workgroups.
52
52
  *
@@ -1 +1 @@
1
- {"version":3,"file":"ComputeShader.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/shader/ComputeShader.js"],"names":[],"mappings":"AASA;IA8FI;;;;;;;;;OASG;IACH,sDARW,MAAM,GAMJ,aAAa,CAuBzB;IA9DD;;;OAGG;IACH,wBAFW,gBAAgB,EA2B1B;IAhFD;;;OAGG;IACH,0CAEC;IAaD;;;OAGG;IACH,2BAEC;IAED;;;OAGG;IACH,2BAEC;IAED;;;OAGG;IACH,2BAEC;IAED;;;OAGG;IACH,mCAEC;IAkED;;;;;OAKG;IACH,oFAuBC;IAED;;;;;;;;;;;;;;;OAeG;IACH,sHA6BC;IAED;;;;;;;;;;;OAWG;IACH,mFAmBC;IAED;;;;;;;OAOG;IACH,4GAyCC;IAED;;;;;;OAMG;IACH,+FAsCC;IAGL;;;OAGG;IACH,0BAFU,OAAO,CAEsB;;CANtC;0CAvVyC,gEAAgE;iCACzE,uBAAuB"}
1
+ {"version":3,"file":"ComputeShader.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/shader/ComputeShader.js"],"names":[],"mappings":"AAMA;IA8FI;;;;;;;;;OASG;IACH,sDARW,MAAM,GAMJ,aAAa,CAuBzB;IA3DD;;;OAGG;IACH,wBAFW,gBAAgB,EAwB1B;IAhFD;;;OAGG;IACH,0CAEC;IAgBD;;;OAGG;IACH,2BAEC;IAED;;;OAGG;IACH,2BAEC;IAED;;;OAGG;IACH,2BAEC;IAED;;;OAGG;IACH,mCAEC;IA+DD;;;;;OAKG;IACH,yFAuBC;IAED;;;;;;;;;;;;;;;OAeG;IACH,sHA6BC;IAED;;;;;;;;;;;OAWG;IACH,mFAmBC;IAED;;;;;;;OAOG;IACH,4GAyCC;IAED;;;;;;OAMG;IACH,+FAsCC;IAGL;;;OAGG;IACH,0BAFU,OAAO,CAEsB;;CANtC;0CApVyC,gEAAgE;iCACzE,uBAAuB"}
@@ -1,9 +1,6 @@
1
1
  import { assert } from "../../../core/assert.js";
2
2
  import { ComputePipelineDescriptor } from "../../descriptor/pipeline/compute/ComputePipelineDescriptor.js";
3
3
  import { ShaderDescriptor } from "./ShaderDescriptor.js";
4
- import {
5
- compute_infer_workgroup_size_from_source
6
- } from "./util/compute_infer_workgroup_size_from_source.js";
7
4
 
8
5
  const VALIDATION_ENABLED = true;
9
6
 
@@ -34,7 +31,10 @@ export class ComputeShader {
34
31
  * the two to drift. A shader that divides a thread count by a stale copy of this number
35
32
  * dispatches the wrong number of workgroups and says nothing about it.
36
33
  *
37
- * @type {[number, number, number]}
34
+ * Held by {@link ComputePipelineDescriptor}, which reads it as the code is set, so the profiler
35
+ * and the dispatch helpers below are looking at the same array rather than at two parses.
36
+ *
37
+ * @type {readonly number[]}
38
38
  */
39
39
  #group_size;
40
40
 
@@ -78,20 +78,15 @@ export class ComputeShader {
78
78
  this.#descriptor = descriptor;
79
79
 
80
80
  // compiled once here rather than read twice off the descriptor, so that a failure to
81
- // compile stays its own error instead of arriving wrapped in the one below
81
+ // compile stays its own error instead of arriving wrapped in the one from the pipeline
82
82
  const source = descriptor.source;
83
83
 
84
- try {
85
- this.#group_size = compute_infer_workgroup_size_from_source(source);
86
- } catch (e) {
87
- // the source alone says nothing about which shader it belongs to
88
- const error = new Error(`ComputeShader '${descriptor.label}' has no readable workgroup size: ${e.message}`);
89
-
90
- error.cause = e;
91
-
92
- throw error;
93
- }
94
-
84
+ /*
85
+ Throws here, at construction, when the source does not state a readable `@workgroup_size` —
86
+ the pipeline descriptor reads it as the code is set and names this shader in the message.
87
+ Read from there rather than parsed again: it is the same WGSL, the answer cannot differ,
88
+ and a second parse is a second thing that can disagree.
89
+ */
95
90
  this.#pipeline = ComputePipelineDescriptor.simplified({
96
91
  label: descriptor.label,
97
92
  code: source,
@@ -99,6 +94,8 @@ export class ComputeShader {
99
94
  immediate_size: descriptor.resources.immediateSize
100
95
  });
101
96
 
97
+ this.#group_size = this.#pipeline.workgroup_size;
98
+
102
99
  }
103
100
 
104
101
  /**
@@ -138,7 +135,7 @@ export class ComputeShader {
138
135
  *
139
136
  * @param {ShadeGPUCommandContext} encoder
140
137
  * @param {Object} bindings
141
- * @return {GPUComputePassEncoder}
138
+ * @return {ShadeGPUComputePassEncoder}
142
139
  */
143
140
  constructPass({
144
141
  encoder,
@@ -41,9 +41,9 @@ export class RenderPassDescriptor {
41
41
  * @param {PrimitiveState} [primitive_state]
42
42
  * @param {GPULoadOp} [loadOp="clear"] Used for both color targets and depth target
43
43
  * @param {GPUStoreOp} [storeOp="store"] Used for both color targets and depth target
44
- * @returns {GPURenderPassEncoder}
44
+ * @returns {ShadeGPURenderPassEncoder}
45
45
  */
46
- begin({ encoder, colorTargets, depthTarget, bindings, primitive_state, loadOp, storeOp, }: ShadeGPUCommandContext): GPURenderPassEncoder;
46
+ begin({ encoder, colorTargets, depthTarget, bindings, primitive_state, loadOp, storeOp, }: ShadeGPUCommandContext): ShadeGPURenderPassEncoder;
47
47
  /**
48
48
  *
49
49
  * @param {ShadeGPUCommandContext} encoder
@@ -1 +1 @@
1
- {"version":3,"file":"RenderPassDescriptor.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shader/pass/RenderPassDescriptor.js"],"names":[],"mappings":"AAIA;;GAEG;AACH;IACI;;OAEG;IACH,mCAAQ;IAER;;OAEG;IACH,uCAAS;IAET;;;OAGG;IACH,kBAFU,qCAAqC,CAEzB;IAEtB;;;OAGG;IACH,wBAFU,0CAA0C,CAEsB;IAG1E;;;;;;;;;;OAUG;IACH,8GAVW,mBAAmB,2BA+E7B;IAED;;;;;;;;;;OAUG;IACH,yIAkCC;IAED;;;;;;;OAOG;IACH,0GAcC;IAGL;;;OAGG;IACH,iCAFU,OAAO,CAEoC;CANpD;2DArL0D,iDAAiD"}
1
+ {"version":3,"file":"RenderPassDescriptor.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shader/pass/RenderPassDescriptor.js"],"names":[],"mappings":"AAIA;;GAEG;AACH;IACI;;OAEG;IACH,mCAAQ;IAER;;OAEG;IACH,uCAAS;IAET;;;OAGG;IACH,kBAFU,qCAAqC,CAEzB;IAEtB;;;OAGG;IACH,wBAFU,0CAA0C,CAEsB;IAG1E;;;;;;;;;;OAUG;IACH,8GAVW,mBAAmB,2BA+E7B;IAED;;;;;;;;;;OAUG;IACH,8IAkCC;IAED;;;;;;;OAOG;IACH,0GAcC;IAGL;;;OAGG;IACH,iCAFU,OAAO,CAEoC;CANpD;2DArL0D,iDAAiD"}