@woosh/meep-engine 3.12.0 → 3.13.0

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 (285) hide show
  1. package/package.json +1 -1
  2. package/src/engine/graphics3/decal/GPUDecalRenderer.js +3 -3
  3. package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
  4. package/src/engine/graphics3/decal/shader_decal_composite.js +4 -2
  5. package/src/engine/graphics3/highlight/GPUHighlightRenderer.d.ts.map +1 -1
  6. package/src/engine/graphics3/highlight/GPUHighlightRenderer.js +2 -3
  7. package/src/engine/graphics3/highlight/shader_highlight_outline.js +150 -150
  8. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  9. package/src/shade/RENDERER_CONTRACT.md +2 -1
  10. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts +18 -0
  11. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts.map +1 -1
  12. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js +73 -0
  13. package/src/shade/device/PASS_ENCODER_PROPOSAL_2026_08_31.md +750 -0
  14. package/src/shade/device/ShadeGPUCommandContext.d.ts +10 -16
  15. package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
  16. package/src/shade/device/ShadeGPUCommandContext.js +801 -994
  17. package/src/shade/device/pass/ShadeGPUComputePassEncoder.d.ts +107 -0
  18. package/src/shade/device/pass/ShadeGPUComputePassEncoder.d.ts.map +1 -0
  19. package/src/shade/device/pass/ShadeGPUComputePassEncoder.js +222 -0
  20. package/src/shade/device/pass/ShadeGPURenderPassEncoder.d.ts +168 -0
  21. package/src/shade/device/pass/ShadeGPURenderPassEncoder.d.ts.map +1 -0
  22. package/src/shade/device/pass/ShadeGPURenderPassEncoder.js +317 -0
  23. package/src/shade/device/timing/GPUTimerArray.d.ts +4 -9
  24. package/src/shade/device/timing/GPUTimerArray.d.ts.map +1 -1
  25. package/src/shade/device/timing/GPUTimerArray.js +261 -289
  26. package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +20 -2
  27. package/src/shade/device/timing/ShadeGPUContextProfiler.d.ts +59 -0
  28. package/src/shade/device/timing/ShadeGPUContextProfiler.d.ts.map +1 -0
  29. package/src/shade/device/timing/ShadeGPUContextProfiler.js +182 -0
  30. package/src/shade/device/timing/profile/GPUProfileSession.d.ts +4 -4
  31. package/src/shade/device/timing/profile/GPUProfileSession.js +4 -4
  32. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
  33. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +3 -1
  34. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.d.ts.map +1 -1
  35. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.js +3 -1
  36. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts.map +1 -1
  37. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.js +3 -1
  38. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +2 -2
  39. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +2 -2
  40. package/src/shade/renderer/Renderer.d.ts +0 -6
  41. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  42. package/src/shade/renderer/Renderer.js +0 -29
  43. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  44. package/src/shade/renderer/animation/GPUAnimationManager.js +1 -3
  45. package/src/shade/renderer/animation/shader_animation_tick.d.ts.map +1 -1
  46. package/src/shade/renderer/animation/shader_animation_tick.js +128 -125
  47. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  48. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +8 -18
  49. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.d.ts.map +1 -1
  50. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.js +100 -98
  51. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.d.ts.map +1 -1
  52. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js +215 -212
  53. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts +1 -1
  54. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts.map +1 -1
  55. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.js +135 -120
  56. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.d.ts.map +1 -1
  57. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.js +77 -75
  58. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.d.ts.map +1 -1
  59. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js +375 -371
  60. package/src/shade/renderer/atmosphere/shader_transmittance_lut.js +3 -3
  61. package/src/shade/renderer/buffer/graph_inspect_gpu_buffer.js +1 -1
  62. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
  63. package/src/shade/renderer/buffer/table/GPUDatabase.js +14 -19
  64. package/src/shade/renderer/buffer/table/gpu_table_element_upload_shader.d.ts.map +1 -1
  65. package/src/shade/renderer/buffer/table/gpu_table_element_upload_shader.js +7 -2
  66. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
  67. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +325 -319
  68. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.d.ts.map +1 -1
  69. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.js +3 -1
  70. package/src/shade/renderer/deferred/shader_tonemap_HDR.d.ts.map +1 -1
  71. package/src/shade/renderer/deferred/shader_tonemap_HDR.js +4 -1
  72. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts +2 -2
  73. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts.map +1 -1
  74. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +167 -167
  75. package/src/shade/renderer/fow/GPUFogOfWarRenderer.js +3 -3
  76. package/src/shade/renderer/fow/shader_fog_of_war.d.ts.map +1 -1
  77. package/src/shade/renderer/fow/shader_fog_of_war.js +3 -1
  78. package/src/shade/renderer/geometry/bvh/record_blas_refit.js +102 -102
  79. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.d.ts.map +1 -1
  80. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.js +125 -121
  81. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  82. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +766 -774
  83. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
  84. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +72 -69
  85. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
  86. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +5 -10
  87. package/src/shade/renderer/geometry/sdf/shader_build_sdf.js +129 -129
  88. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.d.ts.map +1 -1
  89. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.js +5 -3
  90. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.d.ts.map +1 -1
  91. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.js +4 -1
  92. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_resolve_probes.d.ts.map +1 -1
  93. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_resolve_probes.js +3 -1
  94. package/src/shade/renderer/global_illumination/clipmap/shader_update_clipmap_cascade.d.ts.map +1 -1
  95. package/src/shade/renderer/global_illumination/clipmap/shader_update_clipmap_cascade.js +114 -112
  96. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lpv_store_sh.d.ts.map +1 -1
  97. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lpv_store_sh.js +4 -1
  98. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.d.ts.map +1 -1
  99. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +187 -184
  100. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.d.ts.map +1 -1
  101. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.js +4 -1
  102. package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.d.ts.map +1 -1
  103. package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.js +6 -8
  104. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.d.ts.map +1 -1
  105. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.js +3 -1
  106. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_update.d.ts.map +1 -1
  107. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_update.js +3 -1
  108. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +3 -3
  109. package/src/shade/renderer/gpu_primitive/bvh/PHASE1_HANDOVER.md +3 -3
  110. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +217 -217
  111. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts.map +1 -1
  112. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +145 -142
  113. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts.map +1 -1
  114. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js +87 -82
  115. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.d.ts.map +1 -1
  116. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.js +143 -140
  117. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.d.ts +2 -2
  118. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.d.ts.map +1 -1
  119. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.js +43 -8
  120. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
  121. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +4 -5
  122. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts.map +1 -1
  123. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js +88 -84
  124. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts.map +1 -1
  125. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js +194 -191
  126. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
  127. package/src/shade/renderer/hiz/HierarchicalZBuffer.js +33 -69
  128. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts.map +1 -1
  129. package/src/shade/renderer/hiz/shader_hzb_reduce_any.js +6 -1
  130. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts.map +1 -1
  131. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.js +23 -7
  132. package/src/shade/renderer/light/environment/execute_filter_environment_map.d.ts.map +1 -1
  133. package/src/shade/renderer/light/environment/execute_filter_environment_map.js +1 -2
  134. package/src/shade/renderer/light/environment/shader_convolve_reflection_map.d.ts.map +1 -1
  135. package/src/shade/renderer/light/environment/shader_convolve_reflection_map.js +6 -1
  136. package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.d.ts.map +1 -1
  137. package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.js +234 -219
  138. package/src/shade/renderer/lightmap/bake/raster/shader_lightmap_to_viz_buffer.js +2 -2
  139. package/src/shade/renderer/lightmap/bake/shader_lightmap_denoise_sh.js +191 -191
  140. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_accummulate_tile.d.ts.map +1 -1
  141. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_accummulate_tile.js +85 -82
  142. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  143. package/src/shade/renderer/particles/graph_particles.js +5 -3
  144. package/src/shade/renderer/particles/prototypeParticleSystem.js +3 -4
  145. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  146. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +132 -117
  147. package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
  148. package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +79 -77
  149. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  150. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +111 -99
  151. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
  152. package/src/shade/renderer/particles/sort/shader_particle_sort.js +187 -158
  153. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts.map +1 -1
  154. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +7 -10
  155. package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.d.ts.map +1 -1
  156. package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.js +4 -1
  157. package/src/shade/renderer/postprocess/bloom/shader_bloom_mix.d.ts.map +1 -1
  158. package/src/shade/renderer/postprocess/bloom/shader_bloom_mix.js +3 -1
  159. package/src/shade/renderer/postprocess/cas/shader_ffx_rcas.d.ts.map +1 -1
  160. package/src/shade/renderer/postprocess/cas/shader_ffx_rcas.js +4 -2
  161. package/src/shade/renderer/postprocess/denoise/fragment_shader_denoise_ao.js +147 -147
  162. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.d.ts.map +1 -1
  163. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +121 -119
  164. package/src/shade/renderer/postprocess/dof/gather/graph_postprocess_dof2.d.ts.map +1 -1
  165. package/src/shade/renderer/postprocess/dof/gather/graph_postprocess_dof2.js +1 -2
  166. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_far.d.ts.map +1 -1
  167. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_far.js +4 -1
  168. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_near.d.ts.map +1 -1
  169. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_near.js +4 -1
  170. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.d.ts.map +1 -1
  171. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.js +4 -1
  172. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_setup.d.ts.map +1 -1
  173. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_setup.js +4 -1
  174. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.d.ts.map +1 -1
  175. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.js +2 -4
  176. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_composite.d.ts.map +1 -1
  177. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_composite.js +4 -1
  178. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_prefilter.d.ts.map +1 -1
  179. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_prefilter.js +4 -1
  180. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch.d.ts.map +1 -1
  181. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch.js +4 -1
  182. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.d.ts.map +1 -1
  183. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.js +269 -266
  184. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.d.ts.map +1 -1
  185. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.js +273 -270
  186. package/src/shade/renderer/postprocess/dof/shader_dof_autofocus.d.ts.map +1 -1
  187. package/src/shade/renderer/postprocess/dof/shader_dof_autofocus.js +4 -1
  188. package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.d.ts.map +1 -1
  189. package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.js +8 -11
  190. package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.d.ts.map +1 -1
  191. package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.js +5 -1
  192. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts.map +1 -1
  193. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.js +11 -8
  194. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.d.ts.map +1 -1
  195. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +7 -8
  196. package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.d.ts.map +1 -1
  197. package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.js +3 -1
  198. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  199. package/src/shade/renderer/postprocess/nss/shader_nss_concat.d.ts.map +1 -1
  200. package/src/shade/renderer/postprocess/nss/shader_nss_concat.js +70 -68
  201. package/src/shade/renderer/postprocess/ssr/depth_max_shader.d.ts.map +1 -1
  202. package/src/shade/renderer/postprocess/ssr/depth_max_shader.js +70 -68
  203. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.d.ts.map +1 -1
  204. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.js +3 -1
  205. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.d.ts.map +1 -1
  206. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.js +4 -1
  207. package/src/shade/renderer/postprocess/ssr/shader_downsample_encoded_normal.d.ts.map +1 -1
  208. package/src/shade/renderer/postprocess/ssr/shader_downsample_encoded_normal.js +103 -101
  209. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
  210. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +4 -2
  211. package/src/shade/renderer/postprocess/ssr/ssr_trace_shader.d.ts.map +1 -1
  212. package/src/shade/renderer/postprocess/ssr/ssr_trace_shader.js +3 -1
  213. package/src/shade/renderer/postprocess/taa/shader_taa.d.ts.map +1 -1
  214. package/src/shade/renderer/postprocess/taa/shader_taa.js +4 -1
  215. package/src/shade/renderer/postprocess/upscale-dither/fragment_shader_upscale_dither.js +5 -5
  216. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  217. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +339 -341
  218. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
  219. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +114 -109
  220. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
  221. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +118 -115
  222. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  223. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +69 -65
  224. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +722 -722
  225. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
  226. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +1 -9
  227. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
  228. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +1 -6
  229. package/src/shade/renderer/restir/di/graph_restir_di.d.ts.map +1 -1
  230. package/src/shade/renderer/restir/di/graph_restir_di.js +2 -3
  231. package/src/shade/renderer/restir/di/graph_restir_di_denoise.d.ts.map +1 -1
  232. package/src/shade/renderer/restir/di/graph_restir_di_denoise.js +1 -2
  233. package/src/shade/renderer/restir/di/shader_restir_di_denoise.d.ts.map +1 -1
  234. package/src/shade/renderer/restir/di/shader_restir_di_denoise.js +139 -136
  235. package/src/shade/renderer/restir/di/shader_restir_di_resample.d.ts.map +1 -1
  236. package/src/shade/renderer/restir/di/shader_restir_di_resample.js +131 -129
  237. package/src/shade/renderer/restir/di/shader_restir_di_resolve.d.ts.map +1 -1
  238. package/src/shade/renderer/restir/di/shader_restir_di_resolve.js +101 -99
  239. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts.map +1 -1
  240. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +379 -383
  241. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.d.ts.map +1 -1
  242. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js +147 -144
  243. package/src/shade/renderer/shader/ComputeShader.d.ts +2 -2
  244. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  245. package/src/shade/renderer/shader/ComputeShader.js +14 -17
  246. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts +2 -2
  247. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts.map +1 -1
  248. package/src/shade/renderer/shader/pass/RenderPassDescriptor.js +189 -189
  249. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  250. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +3 -1
  251. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  252. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +14 -18
  253. package/src/shade/renderer/shadow/map/shader/shader_shadowmap_remap_cube_to_octahedral.d.ts.map +1 -1
  254. package/src/shade/renderer/shadow/map/shader/shader_shadowmap_remap_cube_to_octahedral.js +5 -1
  255. package/src/shade/renderer/shadow/ray/shader_shadow_upscale.d.ts.map +1 -1
  256. package/src/shade/renderer/shadow/ray/shader_shadow_upscale.js +3 -1
  257. package/src/shade/renderer/shadow/ray/staged/gen/graph_gen_rays.js +73 -73
  258. package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.d.ts.map +1 -1
  259. package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.js +151 -148
  260. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.d.ts.map +1 -1
  261. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +4 -2
  262. package/src/shade/renderer/shadow/ray/staged/trace/shader_trace_rays.d.ts.map +1 -1
  263. package/src/shade/renderer/shadow/ray/staged/trace/shader_trace_rays.js +18 -4
  264. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.d.ts.map +1 -1
  265. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +7 -8
  266. package/src/shade/renderer/shadow/sdf/cascade/shader_build_scene_sdf_f32.d.ts.map +1 -1
  267. package/src/shade/renderer/shadow/sdf/cascade/shader_build_scene_sdf_f32.js +6 -2
  268. package/src/shade/renderer/shadow/sdf/cascade/shader_scene_sdf_debug_viz.d.ts.map +1 -1
  269. package/src/shade/renderer/shadow/sdf/cascade/shader_scene_sdf_debug_viz.js +129 -127
  270. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.d.ts.map +1 -1
  271. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.js +5 -3
  272. package/src/shade/renderer/texture/virtual/VirtualTextureManager.d.ts.map +1 -1
  273. package/src/shade/renderer/texture/virtual/VirtualTextureManager.js +2 -5
  274. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.d.ts.map +1 -1
  275. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.js +233 -231
  276. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  277. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +2 -4
  278. package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
  279. package/src/shade/wgsl/validate_wgsl_source.js +8 -3
  280. package/src/shade/device/timing/profile/make_profiling_pass_encoder.d.ts +0 -21
  281. package/src/shade/device/timing/profile/make_profiling_pass_encoder.d.ts.map +0 -1
  282. package/src/shade/device/timing/profile/make_profiling_pass_encoder.js +0 -114
  283. package/src/shade/device/timing/profile/parse_workgroup_size.d.ts +0 -20
  284. package/src/shade/device/timing/profile/parse_workgroup_size.d.ts.map +0 -1
  285. package/src/shade/device/timing/profile/parse_workgroup_size.js +0 -43
@@ -1,342 +1,340 @@
1
- import { assert } from "../../../../core/assert.js";
2
- import { ceilPowerOfTwo } from "../../../../core/binary/operations/ceilPowerOfTwo.js";
3
- import { round_up } from "../../../../core/math/round_up.js";
4
- import { BufferResourceDescriptor } from "../../../device/graph/BufferResourceDescriptor.js";
5
- import { u32, vec2u } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
6
- import { STRUCT_UNINDEXED_DRAW_COMMAND } from "../../gpu_primitive/indirect/STRUCT_UNINDEXED_DRAW_COMMAND.js";
7
- import { cpu_build_hash_table } from "../../gpu_primitive/hash_table/cpu_build_hash_table.js";
8
- import { graph_prefix_scan_csdldf } from "../../gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js";
9
- import { shader_hzb_meshlet_filter_1way_full } from "../cull/hzb/shader_hzb_meshlet_filter_1way_full.js";
10
- import { COMPUTE_SHADER_DEFAULT_GROUP_SIZE } from "../../shader/COMPUTE_SHADER_DEFAULT_GROUP_SIZE.js";
11
- import { graph_import_raw_buffer } from "../../shader/graph/graph_import_raw_buffer.js";
12
- import { graph_record_stat } from "../../util/graph_record_stat.js";
13
- import {
14
- build_indirect_compute_dispatch_command,
15
- graph_build_indirect_dispatch_command,
16
- INDIRECT_COMPUTE_COMMAND_DESCRIPTOR
17
- } from "../../gpu_primitive/indirect/IndirectComputeCommandBuildPass.js";
18
- import { graph_mesh_filter_one_way } from "../expand/graph_mesh_filter_one_way.js";
19
- import { graph_expand_meshes_to_meshlets } from "../expand/mesh/graph_expand_meshes_to_meshlets.js";
20
- import { RasterizationCollectionType } from "../expand/RasterizationCollectionType.js";
21
- import { shader_count_meshlets_by_material } from "./shader_count_meshlets_by_material.js";
22
- import {
23
- shader_make_meshlet_indirect_draw_commands_by_material
24
- } from "./shader_make_meshlet_indirect_draw_commands_by_material.js";
25
- import { shader_read_out_bucket } from "./shader_read_out_bucket.js";
26
- import { shader_sort_meshlets_by_material } from "./shader_sort_meshlets_by_material.js";
27
-
28
- /**
29
- *
30
- * @param {FrameGraph} graph
31
- * @param {ShadeMaterial[]} materials
32
- * @param {number} bucket_index
33
- * @param {GPUCollectionLimits} limits
34
- * @param {number} buckets resource ID
35
- * @param {number} [camera] camera resource ID, optional
36
- * @param {number} [hzb] hierarchical z-buffer resource ID, optional
37
- * @param {number[]} resolution
38
- * @param {string} [label] used for debug
39
- * @param {GPUSceneContext} scene
40
- */
41
- export function graph_prepare_meshlet_draw_commands_by_material({
42
- graph,
43
- materials,
44
- bucket_id,
45
- limits,
46
- buckets,
47
- hzb = -1,
48
- camera = -1,
49
- scene,
50
- resolution,
51
- label,
52
- }) {
53
-
54
- assert.defined(limits, 'limits');
55
- assert.defined(materials, 'materials');
56
- assert.isNonNegativeInteger(bucket_id, 'bucket_index');
57
-
58
- const copy_bucket_data = {};
59
-
60
- /**
61
- *
62
- * @param data
63
- * @param {FramePassResources} resources
64
- * @param {GraphicsExecutionContext} context
65
- */
66
- function copy_bucket(data, resources, context) {
67
- const encoder = context.encoder;
68
-
69
- const buckets_buffer = resources.get(data.buckets);
70
- const command = resources.get(data.command);
71
- const output = resources.get(data.output);
72
-
73
- build_indirect_compute_dispatch_command(
74
- COMPUTE_SHADER_DEFAULT_GROUP_SIZE,
75
- encoder,
76
- buckets_buffer,
77
- // the bucketed buffer header consists of pairs of u32 values (count,offset)
78
- bucket_id * (u32.size * 2),
79
- command,
80
- 0
81
- );
82
-
83
- shader_read_out_bucket.dispatchIndirect({
84
- encoder,
85
- command,
86
- bindings: {
87
- settings: { bucket_id },
88
- input: buckets_buffer,
89
- output,
90
- }
91
- });
92
- }
93
-
94
- const copy_bucket_pass = graph.add('copy bucket', copy_bucket_data, copy_bucket);
95
-
96
- copy_bucket_data.buckets = copy_bucket_pass.read(buckets);
97
- copy_bucket_data.command = copy_bucket_pass.create("command", INDIRECT_COMPUTE_COMMAND_DESCRIPTOR);
98
- const mesh_buffer_size = limits.compute_buffer_size(RasterizationCollectionType.Meshes);
99
- copy_bucket_data.output = copy_bucket_pass.create("output", BufferResourceDescriptor.from(
100
- mesh_buffer_size,
101
- GPUBufferUsage.STORAGE,
102
- 0, 16 // clear count; an empty bucket dispatches zero workgroups and writes nothing
103
- ));
104
- let meshes = copy_bucket_data.output;
105
-
106
- if (hzb !== -1 && camera !== -1) {
107
- // filter source meshes
108
- meshes = graph_mesh_filter_one_way({
109
- graph,
110
- scene,
111
- camera,
112
- hzb,
113
- input: meshes,
114
- output_size: mesh_buffer_size
115
- });
116
- }
117
-
118
- // 1. expand meshes
119
- const meshlet_buffer_size = limits.compute_buffer_size(RasterizationCollectionType.Meshlets);
120
- let meshlets = graph_expand_meshes_to_meshlets({
121
- graph,
122
- input_meshes: meshes,
123
- scene,
124
- stats: limits.stats,
125
- limits,
126
- expected_output_size: meshlet_buffer_size,
127
- });
128
-
129
- graph_record_stat(graph, limits.stats, RasterizationCollectionType.Meshlets, meshlets);
130
-
131
- if (hzb !== -1 && camera !== -1) {
132
- // filter meshlets
133
- const command = graph_build_indirect_dispatch_command(graph, meshlets, COMPUTE_SHADER_DEFAULT_GROUP_SIZE)
134
-
135
-
136
- /**
137
- *
138
- * @param data
139
- * @param {FramePassResources} resources
140
- * @param {GraphicsExecutionContext} context
141
- */
142
- function filter_meshlets(data, resources, context) {
143
- const encoder = context.encoder;
144
-
145
- const camera_state = resources.get(data.camera);
146
- const input = resources.get(data.input_meshlets);
147
- const output = resources.get(data.output_meshlets);
148
- const hzb = resources.get(data.texture_hzb);
149
- const command = resources.get(data.command);
150
-
151
- const uResolution = encoder.allocateTransientValueBuffer(vec2u, resolution);
152
-
153
- shader_hzb_meshlet_filter_1way_full.dispatchIndirect({
154
- encoder,
155
- command,
156
- bindings: {
157
- camera: camera_state,
158
- resolution: uResolution,
159
- scene_database: scene.scene_database_buffer,
160
- meshlet_metadata: scene.geometries.meshlets.buffer_metadata,
161
- texture_hzb: hzb.obtainView(),
162
- input,
163
- output
164
- }
165
- })
166
- }
167
-
168
- const data = {};
169
-
170
- const pass = graph.add('filter meshlets', data, filter_meshlets);
171
-
172
- data.scene = scene;
173
- data.command = pass.read(command);
174
- data.texture_hzb = pass.read(hzb);
175
- data.input_meshlets = pass.read(meshlets);
176
- data.output_meshlets = pass.create("filtered", BufferResourceDescriptor.from(
177
- meshlet_buffer_size,
178
- GPUBufferUsage.STORAGE,
179
- 0, 16
180
- ));
181
- data.camera = pass.read(camera);
182
-
183
-
184
- meshlets = data.output_meshlets;
185
-
186
- }
187
-
188
- // 2. build material lookup table
189
- const material_ids = materials.map(m => m.id);
190
- const material_count = material_ids.length;
191
- const HASH_TABLE_SLACK = 1.3;
192
- const material_table_size = ceilPowerOfTwo(Math.max(1, material_count * HASH_TABLE_SLACK));
193
- const material_lookup_data = new ArrayBuffer((material_table_size * 2 + 2) * 4)
194
- const material_lookup = new Uint32Array(material_lookup_data);
195
- cpu_build_hash_table(
196
- material_lookup, 0,
197
- material_table_size,
198
- material_ids,
199
- material_count,
200
- );
201
-
202
- // TODO build the table on the GPU
203
- const gr_material_lookup = graph_import_raw_buffer({
204
- graph,
205
- value: material_lookup_data,
206
- usage: GPUBufferUsage.STORAGE,
207
- });
208
-
209
- // 3. Build meshlet iterator command to be used in later passes
210
- const meshlet_iterator_command = graph_build_indirect_dispatch_command(graph, meshlets, COMPUTE_SHADER_DEFAULT_GROUP_SIZE);
211
-
212
- // 4. build meshlet counts by material
213
- const count_by_material_data = {};
214
-
215
- /**
216
- *
217
- * @param data
218
- * @param {FramePassResources} resources
219
- * @param {GraphicsExecutionContext} context
220
- */
221
- function count_by_material(data, resources, context) {
222
- const input_meshlets = resources.get(data.meshlets);
223
- const output_counts = resources.get(data.counts);
224
- const command = resources.get(data.command);
225
- const material_lookup = resources.get(data.material_lookup);
226
-
227
- //
228
- shader_count_meshlets_by_material.dispatchIndirect({
229
- encoder: context.encoder,
230
- command,
231
- bindings: {
232
- input: input_meshlets,
233
- output: output_counts,
234
- scene_database: scene.scene_database_buffer,
235
- material_lookup,
236
- }
237
- })
238
- }
239
-
240
- const count_by_material_pass = graph.add('meshlet counts by material', count_by_material_data, count_by_material);
241
- count_by_material_data.meshlets = count_by_material_pass.read(meshlets);
242
- count_by_material_data.counts = count_by_material_pass.create("counts", BufferResourceDescriptor.empty(
243
- round_up((material_count + 4) * u32.size, 1024),
244
- GPUBufferUsage.STORAGE
245
- ));
246
- count_by_material_data.material_lookup = count_by_material_pass.read(gr_material_lookup);
247
- count_by_material_data.command = count_by_material_pass.read(meshlet_iterator_command);
248
-
249
- // 5. prefix scan meshlets by material
250
- const prefix_sum = graph_prefix_scan_csdldf({
251
- graph,
252
- data: count_by_material_data.counts,
253
- element_max_count: Math.max(1, material_count),
254
- });
255
- // 6. Sort meshlets by material, using the prefix sum
256
- const sort_meshlets_by_material_data = {};
257
-
258
- /**
259
- *
260
- * @param data
261
- * @param {FramePassResources} resources
262
- * @param {GraphicsExecutionContext} context
263
- */
264
- function sort_meshlets_by_material(data, resources, context) {
265
- const prefix_sums = resources.get(data.prefix_sums);
266
- const input_meshlets = resources.get(data.input);
267
- const output_meshlets = resources.get(data.output);
268
- const command = resources.get(data.command);
269
- const material_lookup = resources.get(data.material_lookup);
270
- const counters = resources.get(data.counters);
271
-
272
- const encoder = context.encoder;
273
-
274
- shader_sort_meshlets_by_material.dispatchIndirect({
275
- encoder,
276
- command,
277
- bindings: {
278
- prefix_sums,
279
- input: input_meshlets,
280
- output: output_meshlets,
281
- scene_database: scene.scene_database_buffer,
282
- material_lookup,
283
- counters,
284
- }
285
- });
286
- }
287
-
288
- const sort_meshlets_by_material_pass = graph.add('sort meshlets by material', sort_meshlets_by_material_data, sort_meshlets_by_material);
289
- sort_meshlets_by_material_data.prefix_sums = sort_meshlets_by_material_pass.read(prefix_sum);
290
- sort_meshlets_by_material_data.input = sort_meshlets_by_material_pass.read(meshlets);
291
- sort_meshlets_by_material_data.material_lookup = sort_meshlets_by_material_pass.read(gr_material_lookup);
292
- sort_meshlets_by_material_data.counters = sort_meshlets_by_material_pass.create("counters", BufferResourceDescriptor.empty(
293
- round_up(Math.max(1, material_count) * u32.size, 1024),
294
- GPUBufferUsage.STORAGE
295
- ));
296
- sort_meshlets_by_material_data.command = sort_meshlets_by_material_pass.read(meshlet_iterator_command);
297
- sort_meshlets_by_material_data.output = sort_meshlets_by_material_pass.create("sorted meshlets", BufferResourceDescriptor.from(
298
- limits.compute_buffer_size(RasterizationCollectionType.Meshlets),
299
- GPUBufferUsage.STORAGE,
300
- ));
301
-
302
- // 7. Build draw commands
303
- const draw_commands_data = {};
304
-
305
- /**
306
- *
307
- * @param data
308
- * @param {FramePassResources} resources
309
- * @param {GraphicsExecutionContext} context
310
- */
311
- function build_draw_commands(data, resources, context) {
312
- if (material_count === 0) {
313
- return;
314
- }
315
-
316
- const prefix_sums = resources.get(data.prefix_sums);
317
- const commands = resources.get(data.commands);
318
-
319
- shader_make_meshlet_indirect_draw_commands_by_material.dispatchThreads({
320
- encoder: context.encoder,
321
- thread_count_x: material_count,
322
- bindings: {
323
- commands,
324
- prefix_sums,
325
- }
326
- })
327
- }
328
-
329
- const build_draw_commands_pass = graph.add('build draw commands', draw_commands_data, build_draw_commands);
330
- draw_commands_data.prefix_sums = build_draw_commands_pass.read(prefix_sum);
331
-
332
- // NOTE: clearing is critical. We might end up with no writes which would produce garbage without clearing
333
- draw_commands_data.commands = build_draw_commands_pass.create("commands", BufferResourceDescriptor.empty(
334
- STRUCT_UNINDEXED_DRAW_COMMAND.size * material_count,
335
- GPUBufferUsage.STORAGE | GPUBufferUsage.INDIRECT,
336
- ));
337
-
338
- return {
339
- meshlets: sort_meshlets_by_material_data.output,
340
- draw_commands: draw_commands_data.commands
341
- }
1
+ import { assert } from "../../../../core/assert.js";
2
+ import { ceilPowerOfTwo } from "../../../../core/binary/operations/ceilPowerOfTwo.js";
3
+ import { round_up } from "../../../../core/math/round_up.js";
4
+ import { BufferResourceDescriptor } from "../../../device/graph/BufferResourceDescriptor.js";
5
+ import { u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
6
+ import { STRUCT_UNINDEXED_DRAW_COMMAND } from "../../gpu_primitive/indirect/STRUCT_UNINDEXED_DRAW_COMMAND.js";
7
+ import { cpu_build_hash_table } from "../../gpu_primitive/hash_table/cpu_build_hash_table.js";
8
+ import { graph_prefix_scan_csdldf } from "../../gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js";
9
+ import { shader_hzb_meshlet_filter_1way_full } from "../cull/hzb/shader_hzb_meshlet_filter_1way_full.js";
10
+ import { COMPUTE_SHADER_DEFAULT_GROUP_SIZE } from "../../shader/COMPUTE_SHADER_DEFAULT_GROUP_SIZE.js";
11
+ import { graph_import_raw_buffer } from "../../shader/graph/graph_import_raw_buffer.js";
12
+ import { graph_record_stat } from "../../util/graph_record_stat.js";
13
+ import {
14
+ build_indirect_compute_dispatch_command,
15
+ graph_build_indirect_dispatch_command,
16
+ INDIRECT_COMPUTE_COMMAND_DESCRIPTOR
17
+ } from "../../gpu_primitive/indirect/IndirectComputeCommandBuildPass.js";
18
+ import { graph_mesh_filter_one_way } from "../expand/graph_mesh_filter_one_way.js";
19
+ import { graph_expand_meshes_to_meshlets } from "../expand/mesh/graph_expand_meshes_to_meshlets.js";
20
+ import { RasterizationCollectionType } from "../expand/RasterizationCollectionType.js";
21
+ import { shader_count_meshlets_by_material } from "./shader_count_meshlets_by_material.js";
22
+ import {
23
+ shader_make_meshlet_indirect_draw_commands_by_material
24
+ } from "./shader_make_meshlet_indirect_draw_commands_by_material.js";
25
+ import { shader_read_out_bucket } from "./shader_read_out_bucket.js";
26
+ import { shader_sort_meshlets_by_material } from "./shader_sort_meshlets_by_material.js";
27
+
28
+ /**
29
+ *
30
+ * @param {FrameGraph} graph
31
+ * @param {ShadeMaterial[]} materials
32
+ * @param {number} bucket_index
33
+ * @param {GPUCollectionLimits} limits
34
+ * @param {number} buckets resource ID
35
+ * @param {number} [camera] camera resource ID, optional
36
+ * @param {number} [hzb] hierarchical z-buffer resource ID, optional
37
+ * @param {number[]} resolution
38
+ * @param {string} [label] used for debug
39
+ * @param {GPUSceneContext} scene
40
+ */
41
+ export function graph_prepare_meshlet_draw_commands_by_material({
42
+ graph,
43
+ materials,
44
+ bucket_id,
45
+ limits,
46
+ buckets,
47
+ hzb = -1,
48
+ camera = -1,
49
+ scene,
50
+ resolution,
51
+ label,
52
+ }) {
53
+
54
+ assert.defined(limits, 'limits');
55
+ assert.defined(materials, 'materials');
56
+ assert.isNonNegativeInteger(bucket_id, 'bucket_index');
57
+
58
+ const copy_bucket_data = {};
59
+
60
+ /**
61
+ *
62
+ * @param data
63
+ * @param {FramePassResources} resources
64
+ * @param {GraphicsExecutionContext} context
65
+ */
66
+ function copy_bucket(data, resources, context) {
67
+ const encoder = context.encoder;
68
+
69
+ const buckets_buffer = resources.get(data.buckets);
70
+ const command = resources.get(data.command);
71
+ const output = resources.get(data.output);
72
+
73
+ build_indirect_compute_dispatch_command(
74
+ COMPUTE_SHADER_DEFAULT_GROUP_SIZE,
75
+ encoder,
76
+ buckets_buffer,
77
+ // the bucketed buffer header consists of pairs of u32 values (count,offset)
78
+ bucket_id * (u32.size * 2),
79
+ command,
80
+ 0
81
+ );
82
+
83
+ shader_read_out_bucket.dispatchIndirect({
84
+ encoder,
85
+ command,
86
+ bindings: {
87
+ settings: { bucket_id },
88
+ input: buckets_buffer,
89
+ output,
90
+ }
91
+ });
92
+ }
93
+
94
+ const copy_bucket_pass = graph.add('copy bucket', copy_bucket_data, copy_bucket);
95
+
96
+ copy_bucket_data.buckets = copy_bucket_pass.read(buckets);
97
+ copy_bucket_data.command = copy_bucket_pass.create("command", INDIRECT_COMPUTE_COMMAND_DESCRIPTOR);
98
+ const mesh_buffer_size = limits.compute_buffer_size(RasterizationCollectionType.Meshes);
99
+ copy_bucket_data.output = copy_bucket_pass.create("output", BufferResourceDescriptor.from(
100
+ mesh_buffer_size,
101
+ GPUBufferUsage.STORAGE,
102
+ 0, 16 // clear count; an empty bucket dispatches zero workgroups and writes nothing
103
+ ));
104
+ let meshes = copy_bucket_data.output;
105
+
106
+ if (hzb !== -1 && camera !== -1) {
107
+ // filter source meshes
108
+ meshes = graph_mesh_filter_one_way({
109
+ graph,
110
+ scene,
111
+ camera,
112
+ hzb,
113
+ input: meshes,
114
+ output_size: mesh_buffer_size
115
+ });
116
+ }
117
+
118
+ // 1. expand meshes
119
+ const meshlet_buffer_size = limits.compute_buffer_size(RasterizationCollectionType.Meshlets);
120
+ let meshlets = graph_expand_meshes_to_meshlets({
121
+ graph,
122
+ input_meshes: meshes,
123
+ scene,
124
+ stats: limits.stats,
125
+ limits,
126
+ expected_output_size: meshlet_buffer_size,
127
+ });
128
+
129
+ graph_record_stat(graph, limits.stats, RasterizationCollectionType.Meshlets, meshlets);
130
+
131
+ if (hzb !== -1 && camera !== -1) {
132
+ // filter meshlets
133
+ const command = graph_build_indirect_dispatch_command(graph, meshlets, COMPUTE_SHADER_DEFAULT_GROUP_SIZE)
134
+
135
+
136
+ /**
137
+ *
138
+ * @param data
139
+ * @param {FramePassResources} resources
140
+ * @param {GraphicsExecutionContext} context
141
+ */
142
+ function filter_meshlets(data, resources, context) {
143
+ const encoder = context.encoder;
144
+
145
+ const camera_state = resources.get(data.camera);
146
+ const input = resources.get(data.input_meshlets);
147
+ const output = resources.get(data.output_meshlets);
148
+ const hzb = resources.get(data.texture_hzb);
149
+ const command = resources.get(data.command);
150
+
151
+ shader_hzb_meshlet_filter_1way_full.dispatchIndirect({
152
+ encoder,
153
+ command,
154
+ bindings: {
155
+ camera: camera_state,
156
+ resolution,
157
+ scene_database: scene.scene_database_buffer,
158
+ meshlet_metadata: scene.geometries.meshlets.buffer_metadata,
159
+ texture_hzb: hzb.obtainView(),
160
+ input,
161
+ output
162
+ }
163
+ })
164
+ }
165
+
166
+ const data = {};
167
+
168
+ const pass = graph.add('filter meshlets', data, filter_meshlets);
169
+
170
+ data.scene = scene;
171
+ data.command = pass.read(command);
172
+ data.texture_hzb = pass.read(hzb);
173
+ data.input_meshlets = pass.read(meshlets);
174
+ data.output_meshlets = pass.create("filtered", BufferResourceDescriptor.from(
175
+ meshlet_buffer_size,
176
+ GPUBufferUsage.STORAGE,
177
+ 0, 16
178
+ ));
179
+ data.camera = pass.read(camera);
180
+
181
+
182
+ meshlets = data.output_meshlets;
183
+
184
+ }
185
+
186
+ // 2. build material lookup table
187
+ const material_ids = materials.map(m => m.id);
188
+ const material_count = material_ids.length;
189
+ const HASH_TABLE_SLACK = 1.3;
190
+ const material_table_size = ceilPowerOfTwo(Math.max(1, material_count * HASH_TABLE_SLACK));
191
+ const material_lookup_data = new ArrayBuffer((material_table_size * 2 + 2) * 4)
192
+ const material_lookup = new Uint32Array(material_lookup_data);
193
+ cpu_build_hash_table(
194
+ material_lookup, 0,
195
+ material_table_size,
196
+ material_ids,
197
+ material_count,
198
+ );
199
+
200
+ // TODO build the table on the GPU
201
+ const gr_material_lookup = graph_import_raw_buffer({
202
+ graph,
203
+ value: material_lookup_data,
204
+ usage: GPUBufferUsage.STORAGE,
205
+ });
206
+
207
+ // 3. Build meshlet iterator command to be used in later passes
208
+ const meshlet_iterator_command = graph_build_indirect_dispatch_command(graph, meshlets, COMPUTE_SHADER_DEFAULT_GROUP_SIZE);
209
+
210
+ // 4. build meshlet counts by material
211
+ const count_by_material_data = {};
212
+
213
+ /**
214
+ *
215
+ * @param data
216
+ * @param {FramePassResources} resources
217
+ * @param {GraphicsExecutionContext} context
218
+ */
219
+ function count_by_material(data, resources, context) {
220
+ const input_meshlets = resources.get(data.meshlets);
221
+ const output_counts = resources.get(data.counts);
222
+ const command = resources.get(data.command);
223
+ const material_lookup = resources.get(data.material_lookup);
224
+
225
+ //
226
+ shader_count_meshlets_by_material.dispatchIndirect({
227
+ encoder: context.encoder,
228
+ command,
229
+ bindings: {
230
+ input: input_meshlets,
231
+ output: output_counts,
232
+ scene_database: scene.scene_database_buffer,
233
+ material_lookup,
234
+ }
235
+ })
236
+ }
237
+
238
+ const count_by_material_pass = graph.add('meshlet counts by material', count_by_material_data, count_by_material);
239
+ count_by_material_data.meshlets = count_by_material_pass.read(meshlets);
240
+ count_by_material_data.counts = count_by_material_pass.create("counts", BufferResourceDescriptor.empty(
241
+ round_up((material_count + 4) * u32.size, 1024),
242
+ GPUBufferUsage.STORAGE
243
+ ));
244
+ count_by_material_data.material_lookup = count_by_material_pass.read(gr_material_lookup);
245
+ count_by_material_data.command = count_by_material_pass.read(meshlet_iterator_command);
246
+
247
+ // 5. prefix scan meshlets by material
248
+ const prefix_sum = graph_prefix_scan_csdldf({
249
+ graph,
250
+ data: count_by_material_data.counts,
251
+ element_max_count: Math.max(1, material_count),
252
+ });
253
+ // 6. Sort meshlets by material, using the prefix sum
254
+ const sort_meshlets_by_material_data = {};
255
+
256
+ /**
257
+ *
258
+ * @param data
259
+ * @param {FramePassResources} resources
260
+ * @param {GraphicsExecutionContext} context
261
+ */
262
+ function sort_meshlets_by_material(data, resources, context) {
263
+ const prefix_sums = resources.get(data.prefix_sums);
264
+ const input_meshlets = resources.get(data.input);
265
+ const output_meshlets = resources.get(data.output);
266
+ const command = resources.get(data.command);
267
+ const material_lookup = resources.get(data.material_lookup);
268
+ const counters = resources.get(data.counters);
269
+
270
+ const encoder = context.encoder;
271
+
272
+ shader_sort_meshlets_by_material.dispatchIndirect({
273
+ encoder,
274
+ command,
275
+ bindings: {
276
+ prefix_sums,
277
+ input: input_meshlets,
278
+ output: output_meshlets,
279
+ scene_database: scene.scene_database_buffer,
280
+ material_lookup,
281
+ counters,
282
+ }
283
+ });
284
+ }
285
+
286
+ const sort_meshlets_by_material_pass = graph.add('sort meshlets by material', sort_meshlets_by_material_data, sort_meshlets_by_material);
287
+ sort_meshlets_by_material_data.prefix_sums = sort_meshlets_by_material_pass.read(prefix_sum);
288
+ sort_meshlets_by_material_data.input = sort_meshlets_by_material_pass.read(meshlets);
289
+ sort_meshlets_by_material_data.material_lookup = sort_meshlets_by_material_pass.read(gr_material_lookup);
290
+ sort_meshlets_by_material_data.counters = sort_meshlets_by_material_pass.create("counters", BufferResourceDescriptor.empty(
291
+ round_up(Math.max(1, material_count) * u32.size, 1024),
292
+ GPUBufferUsage.STORAGE
293
+ ));
294
+ sort_meshlets_by_material_data.command = sort_meshlets_by_material_pass.read(meshlet_iterator_command);
295
+ sort_meshlets_by_material_data.output = sort_meshlets_by_material_pass.create("sorted meshlets", BufferResourceDescriptor.from(
296
+ limits.compute_buffer_size(RasterizationCollectionType.Meshlets),
297
+ GPUBufferUsage.STORAGE,
298
+ ));
299
+
300
+ // 7. Build draw commands
301
+ const draw_commands_data = {};
302
+
303
+ /**
304
+ *
305
+ * @param data
306
+ * @param {FramePassResources} resources
307
+ * @param {GraphicsExecutionContext} context
308
+ */
309
+ function build_draw_commands(data, resources, context) {
310
+ if (material_count === 0) {
311
+ return;
312
+ }
313
+
314
+ const prefix_sums = resources.get(data.prefix_sums);
315
+ const commands = resources.get(data.commands);
316
+
317
+ shader_make_meshlet_indirect_draw_commands_by_material.dispatchThreads({
318
+ encoder: context.encoder,
319
+ thread_count_x: material_count,
320
+ bindings: {
321
+ commands,
322
+ prefix_sums,
323
+ }
324
+ })
325
+ }
326
+
327
+ const build_draw_commands_pass = graph.add('build draw commands', draw_commands_data, build_draw_commands);
328
+ draw_commands_data.prefix_sums = build_draw_commands_pass.read(prefix_sum);
329
+
330
+ // NOTE: clearing is critical. We might end up with no writes which would produce garbage without clearing
331
+ draw_commands_data.commands = build_draw_commands_pass.create("commands", BufferResourceDescriptor.empty(
332
+ STRUCT_UNINDEXED_DRAW_COMMAND.size * material_count,
333
+ GPUBufferUsage.STORAGE | GPUBufferUsage.INDIRECT,
334
+ ));
335
+
336
+ return {
337
+ meshlets: sort_meshlets_by_material_data.output,
338
+ draw_commands: draw_commands_data.commands
339
+ }
342
340
  }