@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,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
  }