@woosh/meep-engine 3.59.0 → 3.60.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.
- package/package.json +1 -1
- package/src/shade/playground/probe_clipmap/index.html +12 -0
- package/src/shade/playground/probe_clipmap/main.d.ts.map +1 -1
- package/src/shade/playground/probe_clipmap/main.js +5 -0
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +4 -6
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts +63 -1
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +228 -16
- package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts +27 -4
- package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/cards/GPUMeshCardSets.js +526 -23
- package/src/shade/renderer/geometry/sdf/cards/MeshCardCaptureMode.d.ts +11 -0
- package/src/shade/renderer/geometry/sdf/cards/MeshCardCaptureMode.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/cards/MeshCardCaptureMode.js +21 -0
- package/src/shade/renderer/geometry/sdf/cards/mesh_cards_raster_pass_descriptor.d.ts +65 -0
- package/src/shade/renderer/geometry/sdf/cards/mesh_cards_raster_pass_descriptor.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/cards/mesh_cards_raster_pass_descriptor.js +376 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.d.ts +7 -3
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.d.ts.map +1 -1
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_capture.js +70 -6
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_args.d.ts +20 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_args.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_args.js +80 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_scatter.d.ts +18 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_scatter.d.ts.map +1 -0
- package/src/shade/renderer/geometry/sdf/cards/shader_mesh_cards_raster_scatter.js +113 -0
- package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.d.ts +47 -0
- package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/sdf/VGEO_SDF.js +80 -0
- package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.d.ts +91 -0
- package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/sdf/VGeoSDFProxies.js +902 -0
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.d.ts +16 -0
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_collect.js +67 -0
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.d.ts +17 -0
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_decode.js +145 -0
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.d.ts +12 -0
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/sdf/shader_vgeo_sdf_traverse.js +105 -0
- package/src/shade/renderer/global_illumination/probe/octahedral/shader_lpv_build_gbuffer.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/shader_lpv_build_gbuffer.js +2 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts +3 -9
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/GPUProbeClipmapGI.js +13 -31
- package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_CLIPMAP_PROPOSAL_2026_10_27.md +764 -48
- package/src/shade/renderer/global_illumination/probe_clipmap/PROBE_RAYS_VARIABLE_AND_SORTED_SCOPE_2026_10_30.md +410 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts +3 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSceneHolds.js +4 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts +41 -17
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/ProbeClipmapSettings.js +57 -33
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.d.ts +11 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/BRICK_CLIPMAP.js +13 -4
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts +9 -18
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/GPUBrickClipmap.js +8 -10
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.d.ts +12 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap.js +28 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.d.ts +1 -29
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/chunk_brick_clipmap_trace.js +1 -74
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.d.ts +161 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK.js +219 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.d.ts +1 -8
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MESH_BRICK_INSTANCE_STRUCT.js +1 -9
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.d.ts +40 -12
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/MeshSDFBrickProvider.js +373 -31
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts +2 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_instance.js +2 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.d.ts +15 -8
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_texel.js +28 -14
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.d.ts +23 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/chunk_mesh_brick_walk.js +66 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_batch.d.ts +29 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_batch.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_batch.js +210 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_command.d.ts +29 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_command.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_command.js +86 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.d.ts +41 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_gather.js +439 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_resolve.d.ts +23 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_resolve.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_resolve.js +135 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.d.ts +3 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/shader_brick_clipmap_free.js +12 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts +21 -18
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/GPUProbeClipmap.js +254 -73
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts +149 -8
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/PROBE_CLIPMAP.js +181 -13
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts +179 -7
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap.js +412 -31
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_pick.js +4 -4
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/chunk_probe_clipmap_sample_radiance.js +4 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts +36 -10
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_accumulate.js +218 -29
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.d.ts +5 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_admit.js +24 -14
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts +15 -6
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_due.js +21 -22
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_guide.d.ts +36 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_guide.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_guide.js +257 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts +18 -7
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_light.js +157 -51
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_order.d.ts +23 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_order.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_order.js +110 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.d.ts +24 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_project.js +90 -10
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_ray_layout.d.ts +45 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_ray_layout.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_ray_layout.js +205 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_relocate.js +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.d.ts +16 -3
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_retire.js +55 -10
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.d.ts +19 -4
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_schedule.js +60 -6
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts +10 -9
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_shade.js +32 -39
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts +21 -14
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace.js +100 -30
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.d.ts +6 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_trace_command.js +26 -10
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.d.ts +3 -2
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/probe/shader_probe_clipmap_want_hits.js +12 -12
- package/src/shade/renderer/gpu_primitive/sort/SORT_DIGIT_SETTINGS_STRUCT.d.ts +10 -0
- package/src/shade/renderer/gpu_primitive/sort/SORT_DIGIT_SETTINGS_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/SORT_DIGIT_SETTINGS_STRUCT.js +21 -0
- package/src/shade/renderer/gpu_primitive/sort/SORT_PASS_SETTINGS_STRUCT.d.ts +5 -2
- package/src/shade/renderer/gpu_primitive/sort/SORT_PASS_SETTINGS_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/SORT_PASS_SETTINGS_STRUCT.js +31 -23
- package/src/shade/renderer/gpu_primitive/sort/SORT_SIZE_STRUCT.d.ts +10 -0
- package/src/shade/renderer/gpu_primitive/sort/SORT_SIZE_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/SORT_SIZE_STRUCT.js +22 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_constants.d.ts +9 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_constants.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_constants.js +18 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_digit.d.ts +8 -3
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_digit.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_digit.js +41 -32
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_histogram_tile.d.ts +31 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_histogram_tile.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_histogram_tile.js +71 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_scatter_tile.d.ts +47 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_scatter_tile.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/chunk_sort_scatter_tile.js +210 -0
- package/src/shade/renderer/gpu_primitive/sort/defs.d.ts +5 -4
- package/src/shade/renderer/gpu_primitive/sort/defs.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/defs.js +5 -4
- package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts +56 -15
- package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +410 -61
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts +4 -1
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js +16 -42
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram_indirect.d.ts +15 -0
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram_indirect.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram_indirect.js +60 -0
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_prepare.d.ts +25 -0
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_prepare.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_prepare.js +89 -0
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts +3 -8
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js +28 -160
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter_indirect.d.ts +12 -0
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter_indirect.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter_indirect.js +74 -0
- package/src/shade/renderer/gpu_primitive/sort/verify_radix_sort.d.ts +3 -1
- package/src/shade/renderer/gpu_primitive/sort/verify_radix_sort.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/sort/verify_radix_sort.js +387 -188
- package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_irradiance_flat.js +1 -1
- package/src/shade/renderer/lightmap/bake/shader_lightmap_viz_to_sh.js +1 -1
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +90 -72
- package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.d.ts +5 -0
- package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.d.ts.map +1 -1
- package/src/shade/renderer/material/resident/RESIDENT_MATERIAL_TEXTURE_LAYOUT.js +9 -0
- package/src/shade/renderer/path_tracer/shader/INDIRECT_TEXTURE_FILTER.d.ts +13 -0
- package/src/shade/renderer/path_tracer/shader/INDIRECT_TEXTURE_FILTER.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/INDIRECT_TEXTURE_FILTER.js +14 -0
- package/src/shade/renderer/path_tracer/shader/IndirectTextureFilter.d.ts +10 -0
- package/src/shade/renderer/path_tracer/shader/IndirectTextureFilter.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/IndirectTextureFilter.js +15 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_tangent_normal.d.ts +4 -3
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_tangent_normal.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_tangent_normal.js +6 -5
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture.d.ts +17 -2
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture.js +25 -57
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_exact.d.ts +13 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_exact.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_exact.js +70 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_stochastic.d.ts +10 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_stochastic.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_sample_texture_stochastic.js +59 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_texture_load.d.ts +12 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_texture_load.d.ts.map +1 -0
- package/src/shade/renderer/path_tracer/shader/chunk_indirect_texture_load.js +49 -0
- package/src/shade/renderer/path_tracer/shader/chunk_ray_hit_to_opacity.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/shader/chunk_ray_hit_to_opacity.js +1 -0
- package/src/shade/renderer/path_tracer/shader/chunk_render_trace_path.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/shader/chunk_render_trace_path.js +1 -0
- package/src/shade/renderer/path_tracer/shader/chunk_sample_material.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/shader/chunk_sample_material.js +2 -1
- package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.d.ts +7 -0
- package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.js +15 -6
- package/src/shade/renderer/scene/GPUSceneContext.d.ts +7 -1
- package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUSceneContext.js +26 -1
- package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.d.ts +7 -7
- package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/bvh/chunk_bvh_query_aabb_cooperative.js +262 -294
- package/src/shade/renderer/shader/chunk/filter/MULTISCALE_MEAN_STRUCT.d.ts +9 -0
- package/src/shade/renderer/shader/chunk/filter/MULTISCALE_MEAN_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/filter/MULTISCALE_MEAN_STRUCT.js +21 -0
- package/src/shade/renderer/shader/chunk/filter/chunk_multiscale_mean.d.ts +43 -0
- package/src/shade/renderer/shader/chunk/filter/chunk_multiscale_mean.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/filter/chunk_multiscale_mean.js +87 -0
- package/src/shade/renderer/shader/chunk/noise/r/chunk_r2_canonical.d.ts +7 -1
- package/src/shade/renderer/shader/chunk/noise/r/chunk_r2_canonical.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/noise/r/chunk_r2_canonical.js +1 -1
- package/src/shade/renderer/shader/chunk/subgroup/chunk_subgroup_reserve_workgroup.d.ts +21 -0
- package/src/shade/renderer/shader/chunk/subgroup/chunk_subgroup_reserve_workgroup.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/subgroup/chunk_subgroup_reserve_workgroup.js +42 -0
- package/src/shade/renderer/wind/GPUSceneWind.d.ts +1 -1
- package/src/shade/wgsl/emulator/CPUBitmapData.d.ts +19 -0
- package/src/shade/wgsl/emulator/CPUBitmapData.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/CPUBitmapData.js +27 -0
- package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.js +65 -19
- package/src/view/elements/progress/segmented/GhostTrail.d.ts +116 -0
- package/src/view/elements/progress/segmented/GhostTrail.d.ts.map +1 -0
- package/src/view/elements/progress/segmented/GhostTrail.js +280 -0
- package/src/view/elements/progress/segmented/RESOURCE_BAR_SEGMENTS.d.ts +3 -1
- package/src/view/elements/progress/segmented/RESOURCE_BAR_SEGMENTS.d.ts.map +1 -1
- package/src/view/elements/progress/segmented/RESOURCE_BAR_SEGMENTS.js +3 -1
- package/src/view/elements/progress/segmented/SEGMENT_TIERS_DEFAULT.d.ts +11 -0
- package/src/view/elements/progress/segmented/SEGMENT_TIERS_DEFAULT.d.ts.map +1 -0
- package/src/view/elements/progress/segmented/SEGMENT_TIERS_DEFAULT.js +15 -0
- package/src/view/elements/progress/segmented/SegmentDefinition.d.ts +3 -0
- package/src/view/elements/progress/segmented/SegmentDefinition.d.ts.map +1 -1
- package/src/view/elements/progress/segmented/SegmentDefinition.js +3 -0
- package/src/view/elements/progress/segmented/SegmentTier.d.ts +38 -0
- package/src/view/elements/progress/segmented/SegmentTier.d.ts.map +1 -0
- package/src/view/elements/progress/segmented/SegmentTier.js +50 -0
- package/src/view/elements/progress/segmented/SegmentedResourceBarView.d.ts +163 -10
- package/src/view/elements/progress/segmented/SegmentedResourceBarView.d.ts.map +1 -1
- package/src/view/elements/progress/segmented/SegmentedResourceBarView.js +442 -101
- package/src/view/elements/progress/segmented/playground/index.html +78 -0
- package/src/view/elements/progress/segmented/playground/main.d.ts +2 -0
- package/src/view/elements/progress/segmented/playground/main.d.ts.map +1 -0
- package/src/view/elements/progress/segmented/playground/main.js +173 -0
- package/src/view/elements/progress/segmented/segment_cell_layout.d.ts +48 -0
- package/src/view/elements/progress/segmented/segment_cell_layout.d.ts.map +1 -0
- package/src/view/elements/progress/segmented/segment_cell_layout.js +75 -0
- package/src/view/elements/progress/segmented/segment_notch_place.d.ts +18 -0
- package/src/view/elements/progress/segmented/segment_notch_place.d.ts.map +1 -0
- package/src/view/elements/progress/segmented/segment_notch_place.js +28 -0
- package/src/view/elements/progress/segmented/segment_tick_positions.d.ts +32 -0
- package/src/view/elements/progress/segmented/segment_tick_positions.d.ts.map +1 -0
- package/src/view/elements/progress/segmented/segment_tick_positions.js +103 -0
- package/src/view/elements/progress/segmented/segmented-resource-bar.css +142 -0
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.d.ts +0 -35
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.d.ts.map +0 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/mesh/shader_mesh_brick_provider.js +0 -238
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.d.ts +0 -99
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.d.ts.map +0 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGEO_BRICK.js +0 -139
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.d.ts +0 -65
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.d.ts.map +0 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/VGeoBrickProvider.js +0 -393
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.d.ts +0 -17
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.d.ts.map +0 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_box.js +0 -36
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.d.ts +0 -29
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.d.ts.map +0 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_pair.js +0 -108
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.d.ts +0 -31
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.d.ts.map +0 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_texel.js +0 -113
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.d.ts +0 -36
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.d.ts.map +0 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/chunk_vgeo_brick_triangle.js +0 -85
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.d.ts +0 -23
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.d.ts.map +0 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_distance.js +0 -273
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.d.ts +0 -13
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.d.ts.map +0 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_gather.js +0 -151
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.d.ts +0 -13
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.d.ts.map +0 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_traverse.js +0 -133
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_wait.d.ts +0 -22
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_wait.d.ts.map +0 -1
- package/src/shade/renderer/global_illumination/probe_clipmap/brick/vgeo/shader_vgeo_brick_wait.js +0 -135
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { assert } from "../../../../core/assert.js";
|
|
2
|
+
import { noop } from "../../../../core/function/noop.js";
|
|
2
3
|
import { round_up } from "../../../../core/math/round_up.js";
|
|
3
4
|
import { warn_limited } from "../../../util/warn_limited.js";
|
|
4
5
|
import { BufferResourceDescriptor } from "../../../device/graph/BufferResourceDescriptor.js";
|
|
5
6
|
import { graph_create_buffer } from "../../shader/graph/graph_create_buffer.js";
|
|
7
|
+
import { INDIRECT_COMPUTE_COMMAND_DESCRIPTOR } from "../indirect/IndirectComputeCommandBuildPass.js";
|
|
6
8
|
import {
|
|
7
9
|
enquire_prefix_scan_csdldf_pipelines,
|
|
8
10
|
graph_prefix_scan_csdldf,
|
|
@@ -10,14 +12,19 @@ import {
|
|
|
10
12
|
} from "../prefix_sum/v1/graph_prefix_scan_csdldf.js";
|
|
11
13
|
import { RADIX, RADIX_LOG, RADIX_PASSES, SORT_TILE_SIZE, SPINE_HEADER_WORDS } from "./defs.js";
|
|
12
14
|
import { shader_radix_sort_histogram } from "./shader_radix_sort_histogram.js";
|
|
15
|
+
import { shader_radix_sort_histogram_indirect } from "./shader_radix_sort_histogram_indirect.js";
|
|
16
|
+
import { shader_radix_sort_prepare } from "./shader_radix_sort_prepare.js";
|
|
13
17
|
import { shader_radix_sort_scatter } from "./shader_radix_sort_scatter.js";
|
|
18
|
+
import { shader_radix_sort_scatter_indirect } from "./shader_radix_sort_scatter_indirect.js";
|
|
19
|
+
import { SORT_SIZE_STRUCT } from "./SORT_SIZE_STRUCT.js";
|
|
14
20
|
|
|
15
21
|
/**
|
|
16
22
|
* @typedef {import("../../../device/pipeline/PipelineEnquiry.js").PipelineEnquiry} PipelineEnquiry
|
|
17
23
|
*/
|
|
18
24
|
|
|
19
25
|
/**
|
|
20
|
-
* Offer the pipelines {@link graph_radix_sort} dispatches — see
|
|
26
|
+
* Offer the pipelines {@link graph_radix_sort} dispatches over a host `element_count` — see
|
|
27
|
+
* {@link PipelineEnquiry}.
|
|
21
28
|
*
|
|
22
29
|
* @param {PipelineEnquiry} enquiry
|
|
23
30
|
*/
|
|
@@ -27,16 +34,49 @@ export function enquire_radix_sort_pipelines(enquiry) {
|
|
|
27
34
|
enquiry.compute.push(shader_radix_sort_scatter.pipeline);
|
|
28
35
|
}
|
|
29
36
|
|
|
37
|
+
/**
|
|
38
|
+
* Offer the pipelines {@link graph_radix_sort} dispatches over a device count, a `count_buffer` —
|
|
39
|
+
* see {@link PipelineEnquiry}.
|
|
40
|
+
*
|
|
41
|
+
* @param {PipelineEnquiry} enquiry
|
|
42
|
+
*/
|
|
43
|
+
export function enquire_radix_sort_indirect_pipelines(enquiry) {
|
|
44
|
+
enquiry.compute.push(shader_radix_sort_prepare.pipeline);
|
|
45
|
+
enquiry.compute.push(shader_radix_sort_histogram_indirect.pipeline);
|
|
46
|
+
enquire_prefix_scan_csdldf_pipelines(enquiry);
|
|
47
|
+
enquiry.compute.push(shader_radix_sort_scatter_indirect.pipeline);
|
|
48
|
+
}
|
|
49
|
+
|
|
30
50
|
/**
|
|
31
51
|
* Key-value LSD radix sort, reduce-then-scan, built on the CSDLDF spine.
|
|
32
52
|
*
|
|
33
53
|
* Keys are 32-bit unsigned integers, values are 32-bit unsigned integers, sorting is always
|
|
34
54
|
* ASCENDING and STABLE — equal keys come out in their input order, which is what an LSD radix sort
|
|
35
55
|
* needs of each of its own digit passes and what a caller sorting Morton codes needs of the whole
|
|
36
|
-
* thing.
|
|
37
|
-
* them and a pair of transients, and four is even.
|
|
56
|
+
* thing.
|
|
38
57
|
*
|
|
39
|
-
*
|
|
58
|
+
* **Key width.** The order is by the key's low `key_bits`, in `ceil(key_bits / 8)` digit passes from
|
|
59
|
+
* the least significant byte: a 24-bit key is three passes, a 32-bit one four. The bits above
|
|
60
|
+
* `key_bits` are ignored, not required to be zero — every pass selects its digit from the key with
|
|
61
|
+
* them cleared — and each key comes out as it went in, those bits and all.
|
|
62
|
+
*
|
|
63
|
+
* **The result is in the returned handles — use them.** The digit passes ping-pong between the
|
|
64
|
+
* caller's buffers and a pair of transients the sort creates, so an even number of passes ends in the
|
|
65
|
+
* caller's buffers and an odd number in the transients. The caller's buffers are the sort's scratch
|
|
66
|
+
* either way: from the second pass on, the entries below the sorted count hold whatever the last pass
|
|
67
|
+
* to write them left there. No buffer is written at or past the sorted count.
|
|
68
|
+
*
|
|
69
|
+
* **The count** is one of:
|
|
70
|
+
* - `element_count`, known on the host: the histogram and scatter are dispatched directly, a
|
|
71
|
+
* workgroup a tile of keys;
|
|
72
|
+
* - a count on the device, the `u32` at byte `count_offset` of `count_buffer`, with
|
|
73
|
+
* `element_max_count` sizing the memory — the spine, the transients, and what the caller's buffers
|
|
74
|
+
* must hold. One thread, {@link shader_radix_sort_prepare}, reads the count and writes the command
|
|
75
|
+
* every histogram and scatter is dispatched through, the live size they read and the spine's count
|
|
76
|
+
* every scan is dispatched over. No work follows `element_max_count`: a count of 0 dispatches no
|
|
77
|
+
* tile and leaves an empty result. A count above it sorts the first `element_max_count` keys.
|
|
78
|
+
*
|
|
79
|
+
* One digit pass is three stages:
|
|
40
80
|
*
|
|
41
81
|
* 1. {@link shader_radix_sort_histogram} — a 256-bin histogram per tile, written into the spine
|
|
42
82
|
* bin-major;
|
|
@@ -47,36 +87,211 @@ export function enquire_radix_sort_pipelines(enquiry) {
|
|
|
47
87
|
* its keys anyway);
|
|
48
88
|
* 3. {@link shader_radix_sort_scatter} — rank within the tile, then scatter.
|
|
49
89
|
*
|
|
50
|
-
* Twelve
|
|
51
|
-
* commit `b6049214c` removed. What that buys is the absence of any unbounded
|
|
52
|
-
* the only spin anywhere is CSDLDF's own bounded-spin-then-fallback, so the sort
|
|
53
|
-
* a scheduler that offers no fairness guarantee at all. The single-pass upgrade is
|
|
54
|
-
* `GPU_BVH_BUILD_PLAN.md` §4.2.1 as v2, gated on a measurement from a real consumer.
|
|
90
|
+
* Twelve stages for a whole 32-bit key, against the seven dispatches of the single-pass one-sweep
|
|
91
|
+
* formulation that commit `b6049214c` removed. What that buys is the absence of any unbounded
|
|
92
|
+
* cross-workgroup wait: the only spin anywhere is CSDLDF's own bounded-spin-then-fallback, so the sort
|
|
93
|
+
* makes progress on a scheduler that offers no fairness guarantee at all. The single-pass upgrade is
|
|
94
|
+
* recorded in `GPU_BVH_BUILD_PLAN.md` §4.2.1 as v2, gated on a measurement from a real consumer.
|
|
55
95
|
*
|
|
56
96
|
* @param {Object} options
|
|
57
97
|
* @param {FrameGraph} options.graph
|
|
58
|
-
* @param {number} options.keys buffer resource ID, `array<u32>`, at least `element_count`
|
|
59
|
-
*
|
|
60
|
-
* @param {number} options.
|
|
61
|
-
* @
|
|
98
|
+
* @param {number} options.keys buffer resource ID, `array<u32>`, at least `element_count` (or
|
|
99
|
+
* `element_max_count`) entries
|
|
100
|
+
* @param {number} options.values buffer resource ID, `array<u32>`, as many entries as `keys`
|
|
101
|
+
* @param {number} [options.element_count] number of input elements, known on the host. Give this or
|
|
102
|
+
* `count_buffer`, not both
|
|
103
|
+
* @param {number} [options.count_buffer] buffer resource ID holding the number of input elements,
|
|
104
|
+
* written on the device; bound whole, read-only, so it needs `STORAGE`
|
|
105
|
+
* @param {number} [options.count_offset] with `count_buffer`: byte offset of the count, a multiple of 4
|
|
106
|
+
* @param {number} [options.element_max_count] with `count_buffer`: the most elements it can count,
|
|
107
|
+
* which sizes memory and nothing else
|
|
108
|
+
* @param {number} [options.key_bits=32] how many of the key's low bits it is sorted by, 1 to 32
|
|
109
|
+
* @returns {{keys:number, values:number}} the sorted keys and values: the caller's buffers or the
|
|
110
|
+
* sort's transients, see above
|
|
62
111
|
*/
|
|
63
112
|
export function graph_radix_sort({
|
|
64
113
|
graph,
|
|
65
114
|
keys,
|
|
66
115
|
values,
|
|
67
116
|
element_count,
|
|
117
|
+
count_buffer,
|
|
118
|
+
count_offset,
|
|
119
|
+
element_max_count,
|
|
120
|
+
key_bits = 32,
|
|
68
121
|
}) {
|
|
69
122
|
|
|
70
123
|
assert.defined(graph, 'graph');
|
|
71
124
|
assert.isNonNegativeInteger(keys, 'keys');
|
|
72
125
|
assert.isNonNegativeInteger(values, 'values');
|
|
73
|
-
assert.isNonNegativeInteger(
|
|
126
|
+
assert.isNonNegativeInteger(key_bits, 'key_bits');
|
|
127
|
+
assert.greaterThanOrEqual(key_bits, 1, 'key_bits');
|
|
128
|
+
assert.lessThanOrEqual(key_bits, RADIX_PASSES * RADIX_LOG, 'key_bits');
|
|
129
|
+
|
|
130
|
+
const pass_count = Math.ceil(key_bits / RADIX_LOG);
|
|
131
|
+
|
|
132
|
+
// the key's low key_bits, all a digit is ever selected from: 2^32 - 1 is the whole key
|
|
133
|
+
const key_mask = 2 ** key_bits - 1;
|
|
134
|
+
|
|
135
|
+
if (count_buffer === undefined) {
|
|
136
|
+
assert.isNonNegativeInteger(element_count, 'element_count');
|
|
137
|
+
assert.equal(count_offset, undefined, 'count_offset is only read with a count_buffer');
|
|
138
|
+
assert.equal(element_max_count, undefined, 'element_max_count is only read with a count_buffer');
|
|
74
139
|
|
|
75
|
-
|
|
76
|
-
|
|
140
|
+
if (element_count <= 1) {
|
|
141
|
+
// nothing a sort could change
|
|
142
|
+
return { keys, values };
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return record_host_count_sort({ graph, keys, values, element_count, pass_count, key_mask });
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
assert.equal(element_count, undefined, 'element_count is the host count; with a count_buffer the count is on the device');
|
|
149
|
+
assert.isNonNegativeInteger(count_buffer, 'count_buffer');
|
|
150
|
+
assert.isNonNegativeInteger(count_offset, 'count_offset');
|
|
151
|
+
assert.equal(count_offset % Uint32Array.BYTES_PER_ELEMENT, 0, 'count_offset must address a whole u32');
|
|
152
|
+
assert.isNonNegativeInteger(element_max_count, 'element_max_count');
|
|
153
|
+
|
|
154
|
+
if (element_max_count <= 1) {
|
|
155
|
+
// nothing a sort could change, whatever the device counted
|
|
77
156
|
return { keys, values };
|
|
78
157
|
}
|
|
79
158
|
|
|
159
|
+
return record_device_count_sort({
|
|
160
|
+
graph,
|
|
161
|
+
keys,
|
|
162
|
+
values,
|
|
163
|
+
count_buffer,
|
|
164
|
+
count_offset,
|
|
165
|
+
element_max_count,
|
|
166
|
+
pass_count,
|
|
167
|
+
key_mask,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Transients the digit passes ping-pong through, for up to `element_count` keys or values.
|
|
173
|
+
*
|
|
174
|
+
* @param {number} element_count
|
|
175
|
+
* @returns {BufferResourceDescriptor}
|
|
176
|
+
*/
|
|
177
|
+
function ping_pong_descriptor(element_count) {
|
|
178
|
+
// aligned on a 1k boundary to lower memory fragmentation, as the deleted port did
|
|
179
|
+
return BufferResourceDescriptor.from(
|
|
180
|
+
round_up(element_count * Uint32Array.BYTES_PER_ELEMENT, 1024),
|
|
181
|
+
GPUBufferUsage.STORAGE
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* The digit passes, as both counts record them: histogram, scan and scatter for each 8-bit digit from
|
|
187
|
+
* the least significant, ping-ponging between the caller's pair and a pair of transients the first
|
|
188
|
+
* scatter creates. How a stage is dispatched, and what else it reads, is the count's: `declare_*` adds
|
|
189
|
+
* that to a pass, and `execute_*` dispatches it.
|
|
190
|
+
*
|
|
191
|
+
* @param {Object} options
|
|
192
|
+
* @param {FrameGraph} options.graph
|
|
193
|
+
* @param {number} options.keys
|
|
194
|
+
* @param {number} options.values
|
|
195
|
+
* @param {number} options.pass_count
|
|
196
|
+
* @param {number} options.spine_element_max_count cells of the largest spine a histogram writes
|
|
197
|
+
* @param {BufferResourceDescriptor} options.PING_PONG_DESCRIPTOR
|
|
198
|
+
* @param {function(Object, FramePassResources, GraphicsExecutionContext)} options.execute_histogram
|
|
199
|
+
* @param {function(FramePassBuilder, Object, number)} options.declare_histogram sets the data's `spine` to what the pass writes
|
|
200
|
+
* @param {function(Object, FramePassResources, GraphicsExecutionContext)} options.execute_scatter
|
|
201
|
+
* @param {function(FramePassBuilder, Object)} options.declare_scatter
|
|
202
|
+
* @returns {{keys:number, values:number}} what the last scatter wrote
|
|
203
|
+
*/
|
|
204
|
+
function record_digit_passes({
|
|
205
|
+
graph,
|
|
206
|
+
keys,
|
|
207
|
+
values,
|
|
208
|
+
pass_count,
|
|
209
|
+
spine_element_max_count,
|
|
210
|
+
PING_PONG_DESCRIPTOR,
|
|
211
|
+
execute_histogram,
|
|
212
|
+
declare_histogram,
|
|
213
|
+
execute_scatter,
|
|
214
|
+
declare_scatter,
|
|
215
|
+
}) {
|
|
216
|
+
|
|
217
|
+
const SCANNED_SPINE_DESCRIPTOR = prefix_scan_csdldf_output_descriptor(spine_element_max_count);
|
|
218
|
+
|
|
219
|
+
let read_keys = keys;
|
|
220
|
+
let read_values = values;
|
|
221
|
+
|
|
222
|
+
// the ping-pong halves, created by the first scatter and then alternated into
|
|
223
|
+
let write_keys;
|
|
224
|
+
let write_values;
|
|
225
|
+
|
|
226
|
+
for (let pass_index = 0; pass_index < pass_count; pass_index++) {
|
|
227
|
+
|
|
228
|
+
const shift = pass_index * RADIX_LOG;
|
|
229
|
+
|
|
230
|
+
const histogram_data = { shift };
|
|
231
|
+
const histogram_pass = graph.add(`radix sort/histogram ${pass_index}`, histogram_data, execute_histogram);
|
|
232
|
+
|
|
233
|
+
histogram_data.keys = histogram_pass.read(read_keys);
|
|
234
|
+
declare_histogram(histogram_pass, histogram_data, pass_index);
|
|
235
|
+
|
|
236
|
+
const scanned_spine = graph_prefix_scan_csdldf({
|
|
237
|
+
graph,
|
|
238
|
+
input: histogram_data.spine,
|
|
239
|
+
output: graph_create_buffer(graph, `radix sort/scanned spine ${pass_index}`, SCANNED_SPINE_DESCRIPTOR),
|
|
240
|
+
element_max_count: spine_element_max_count,
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
const scatter_data = { shift };
|
|
244
|
+
const scatter_pass = graph.add(`radix sort/scatter ${pass_index}`, scatter_data, execute_scatter);
|
|
245
|
+
|
|
246
|
+
scatter_data.in_keys = scatter_pass.read(read_keys);
|
|
247
|
+
scatter_data.in_values = scatter_pass.read(read_values);
|
|
248
|
+
scatter_data.spine = scatter_pass.read(scanned_spine);
|
|
249
|
+
declare_scatter(scatter_pass, scatter_data);
|
|
250
|
+
|
|
251
|
+
if (write_keys === undefined) {
|
|
252
|
+
write_keys = scatter_pass.create("radix sort/ping-pong keys", PING_PONG_DESCRIPTOR);
|
|
253
|
+
write_values = scatter_pass.create("radix sort/ping-pong values", PING_PONG_DESCRIPTOR);
|
|
254
|
+
} else {
|
|
255
|
+
write_keys = scatter_pass.write(write_keys);
|
|
256
|
+
write_values = scatter_pass.write(write_values);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
scatter_data.out_keys = write_keys;
|
|
260
|
+
scatter_data.out_values = write_values;
|
|
261
|
+
|
|
262
|
+
// what this pass wrote is what the next one sorts
|
|
263
|
+
[read_keys, write_keys] = [write_keys, read_keys];
|
|
264
|
+
[read_values, write_values] = [write_values, read_values];
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
return {
|
|
268
|
+
keys: read_keys,
|
|
269
|
+
values: read_values,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* {@link graph_radix_sort} over a count the host knows: the histogram and scatter are dispatched
|
|
275
|
+
* directly over its tiles, and each digit pass has a spine of its own.
|
|
276
|
+
*
|
|
277
|
+
* @param {Object} options
|
|
278
|
+
* @param {FrameGraph} options.graph
|
|
279
|
+
* @param {number} options.keys
|
|
280
|
+
* @param {number} options.values
|
|
281
|
+
* @param {number} options.element_count at least 2
|
|
282
|
+
* @param {number} options.pass_count
|
|
283
|
+
* @param {number} options.key_mask
|
|
284
|
+
* @returns {{keys:number, values:number}}
|
|
285
|
+
*/
|
|
286
|
+
function record_host_count_sort({
|
|
287
|
+
graph,
|
|
288
|
+
keys,
|
|
289
|
+
values,
|
|
290
|
+
element_count,
|
|
291
|
+
pass_count,
|
|
292
|
+
key_mask,
|
|
293
|
+
}) {
|
|
294
|
+
|
|
80
295
|
const tile_count = Math.ceil(element_count / SORT_TILE_SIZE);
|
|
81
296
|
|
|
82
297
|
const spine_element_count = tile_count * RADIX;
|
|
@@ -91,14 +306,6 @@ export function graph_radix_sort({
|
|
|
91
306
|
0, spine_size
|
|
92
307
|
);
|
|
93
308
|
|
|
94
|
-
const SCANNED_SPINE_DESCRIPTOR = prefix_scan_csdldf_output_descriptor(spine_element_count);
|
|
95
|
-
|
|
96
|
-
// aligned on a 1k boundary to lower memory fragmentation, as the deleted port did
|
|
97
|
-
const PING_PONG_DESCRIPTOR = BufferResourceDescriptor.from(
|
|
98
|
-
round_up(element_count * Uint32Array.BYTES_PER_ELEMENT, 1024),
|
|
99
|
-
GPUBufferUsage.STORAGE
|
|
100
|
-
);
|
|
101
|
-
|
|
102
309
|
/**
|
|
103
310
|
* @param pass_data
|
|
104
311
|
* @param {FramePassResources} resources
|
|
@@ -121,6 +328,7 @@ export function graph_radix_sort({
|
|
|
121
328
|
shift: pass_data.shift,
|
|
122
329
|
element_count,
|
|
123
330
|
tile_count,
|
|
331
|
+
key_mask,
|
|
124
332
|
},
|
|
125
333
|
keys: resources.get(pass_data.keys),
|
|
126
334
|
spine: resources.get(pass_data.spine),
|
|
@@ -128,6 +336,15 @@ export function graph_radix_sort({
|
|
|
128
336
|
});
|
|
129
337
|
}
|
|
130
338
|
|
|
339
|
+
/**
|
|
340
|
+
* @param {FramePassBuilder} pass
|
|
341
|
+
* @param {Object} pass_data
|
|
342
|
+
* @param {number} pass_index
|
|
343
|
+
*/
|
|
344
|
+
function declare_histogram(pass, pass_data, pass_index) {
|
|
345
|
+
pass_data.spine = pass.create(`radix sort/spine ${pass_index}`, SPINE_DESCRIPTOR);
|
|
346
|
+
}
|
|
347
|
+
|
|
131
348
|
/**
|
|
132
349
|
* @param pass_data
|
|
133
350
|
* @param {FramePassResources} resources
|
|
@@ -156,6 +373,7 @@ export function graph_radix_sort({
|
|
|
156
373
|
shift: pass_data.shift,
|
|
157
374
|
element_count,
|
|
158
375
|
tile_count,
|
|
376
|
+
key_mask,
|
|
159
377
|
},
|
|
160
378
|
in_keys,
|
|
161
379
|
in_values,
|
|
@@ -166,55 +384,186 @@ export function graph_radix_sort({
|
|
|
166
384
|
});
|
|
167
385
|
}
|
|
168
386
|
|
|
169
|
-
|
|
170
|
-
|
|
387
|
+
return record_digit_passes({
|
|
388
|
+
graph,
|
|
389
|
+
keys,
|
|
390
|
+
values,
|
|
391
|
+
pass_count,
|
|
392
|
+
spine_element_max_count: spine_element_count,
|
|
393
|
+
PING_PONG_DESCRIPTOR: ping_pong_descriptor(element_count),
|
|
394
|
+
execute_histogram,
|
|
395
|
+
declare_histogram,
|
|
396
|
+
execute_scatter,
|
|
397
|
+
// reads nothing past the ping-pong and the spine every scatter reads
|
|
398
|
+
declare_scatter: noop,
|
|
399
|
+
});
|
|
400
|
+
}
|
|
171
401
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
402
|
+
/**
|
|
403
|
+
* {@link graph_radix_sort} over a count on the device: one thread reads it, and the histogram and
|
|
404
|
+
* scatter of every digit pass are dispatched indirectly through the command it writes, over the live
|
|
405
|
+
* tiles alone. Every digit pass reuses the one spine, whose count word that thread writes.
|
|
406
|
+
*
|
|
407
|
+
* Nothing is sized by `element_max_count` but memory. The command is a buffer of its own, which no
|
|
408
|
+
* dispatch that reads it binds: Dawn refuses a dispatch whose indirect buffer it also binds.
|
|
409
|
+
*
|
|
410
|
+
* @param {Object} options
|
|
411
|
+
* @param {FrameGraph} options.graph
|
|
412
|
+
* @param {number} options.keys
|
|
413
|
+
* @param {number} options.values
|
|
414
|
+
* @param {number} options.count_buffer
|
|
415
|
+
* @param {number} options.count_offset
|
|
416
|
+
* @param {number} options.element_max_count at least 2
|
|
417
|
+
* @param {number} options.pass_count
|
|
418
|
+
* @param {number} options.key_mask
|
|
419
|
+
* @returns {{keys:number, values:number}}
|
|
420
|
+
*/
|
|
421
|
+
function record_device_count_sort({
|
|
422
|
+
graph,
|
|
423
|
+
keys,
|
|
424
|
+
values,
|
|
425
|
+
count_buffer,
|
|
426
|
+
count_offset,
|
|
427
|
+
element_max_count,
|
|
428
|
+
pass_count,
|
|
429
|
+
key_mask,
|
|
430
|
+
}) {
|
|
175
431
|
|
|
176
|
-
|
|
432
|
+
const tile_max_count = Math.ceil(element_max_count / SORT_TILE_SIZE);
|
|
177
433
|
|
|
178
|
-
|
|
434
|
+
const spine_element_max_count = tile_max_count * RADIX;
|
|
435
|
+
const spine_size = (SPINE_HEADER_WORDS + spine_element_max_count) * Uint32Array.BYTES_PER_ELEMENT;
|
|
179
436
|
|
|
180
|
-
|
|
181
|
-
|
|
437
|
+
// Not cleared, which would be work by capacity: the prepare writes the count word, the histograms
|
|
438
|
+
// every cell below the live count, and the scan reads no further.
|
|
439
|
+
const SPINE_DESCRIPTOR = BufferResourceDescriptor.from(spine_size, GPUBufferUsage.STORAGE);
|
|
182
440
|
|
|
183
|
-
|
|
184
|
-
histogram_data.spine = histogram_pass.create(`radix sort/spine ${pass_index}`, SPINE_DESCRIPTOR);
|
|
441
|
+
const SIZE_DESCRIPTOR = BufferResourceDescriptor.from(SORT_SIZE_STRUCT.size, GPUBufferUsage.STORAGE);
|
|
185
442
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
443
|
+
// what the caller's buffers and the transients must hold, as many keys as can be counted
|
|
444
|
+
const required = element_max_count * Uint32Array.BYTES_PER_ELEMENT;
|
|
445
|
+
|
|
446
|
+
/**
|
|
447
|
+
* @param pass_data
|
|
448
|
+
* @param {FramePassResources} resources
|
|
449
|
+
* @param {GraphicsExecutionContext} context
|
|
450
|
+
*/
|
|
451
|
+
function execute_prepare(pass_data, resources, context) {
|
|
452
|
+
const count_source = resources.get(pass_data.count);
|
|
453
|
+
|
|
454
|
+
assert.notEqual(count_source.usage & GPUBufferUsage.STORAGE, 0, 'count_buffer needs STORAGE usage');
|
|
455
|
+
assert.greaterThanOrEqual(count_source.size, count_offset + Uint32Array.BYTES_PER_ELEMENT, 'count_buffer ends before count_offset');
|
|
456
|
+
|
|
457
|
+
shader_radix_sort_prepare.dispatch({
|
|
458
|
+
encoder: context.encoder,
|
|
459
|
+
bindings: {
|
|
460
|
+
settings: {
|
|
461
|
+
count_word: count_offset / Uint32Array.BYTES_PER_ELEMENT,
|
|
462
|
+
element_max_count,
|
|
463
|
+
},
|
|
464
|
+
count_source,
|
|
465
|
+
sort_size: resources.get(pass_data.size),
|
|
466
|
+
command: resources.get(pass_data.command),
|
|
467
|
+
spine: resources.get(pass_data.spine),
|
|
468
|
+
}
|
|
191
469
|
});
|
|
470
|
+
}
|
|
192
471
|
|
|
193
|
-
|
|
194
|
-
|
|
472
|
+
const prepare_data = {};
|
|
473
|
+
const prepare_pass = graph.add("radix sort/prepare", prepare_data, execute_prepare);
|
|
195
474
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
475
|
+
prepare_data.count = prepare_pass.read(count_buffer);
|
|
476
|
+
prepare_data.size = prepare_pass.create("radix sort/size", SIZE_DESCRIPTOR);
|
|
477
|
+
prepare_data.command = prepare_pass.create("radix sort/command", INDIRECT_COMPUTE_COMMAND_DESCRIPTOR);
|
|
478
|
+
prepare_data.spine = prepare_pass.create("radix sort/spine", SPINE_DESCRIPTOR);
|
|
199
479
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
write_values = scatter_pass.create("radix sort/ping-pong values", PING_PONG_DESCRIPTOR);
|
|
203
|
-
} else {
|
|
204
|
-
write_keys = scatter_pass.write(write_keys);
|
|
205
|
-
write_values = scatter_pass.write(write_values);
|
|
206
|
-
}
|
|
480
|
+
// the one spine, as the last histogram to write it left it
|
|
481
|
+
let spine = prepare_data.spine;
|
|
207
482
|
|
|
208
|
-
|
|
209
|
-
|
|
483
|
+
/**
|
|
484
|
+
* @param pass_data
|
|
485
|
+
* @param {FramePassResources} resources
|
|
486
|
+
* @param {GraphicsExecutionContext} context
|
|
487
|
+
*/
|
|
488
|
+
function execute_histogram(pass_data, resources, context) {
|
|
489
|
+
shader_radix_sort_histogram_indirect.dispatchIndirect({
|
|
490
|
+
encoder: context.encoder,
|
|
491
|
+
command: resources.get(pass_data.command),
|
|
492
|
+
bindings: {
|
|
493
|
+
settings: {
|
|
494
|
+
shift: pass_data.shift,
|
|
495
|
+
key_mask,
|
|
496
|
+
},
|
|
497
|
+
keys: resources.get(pass_data.keys),
|
|
498
|
+
spine: resources.get(pass_data.spine),
|
|
499
|
+
sort_size: resources.get(pass_data.size),
|
|
500
|
+
}
|
|
501
|
+
});
|
|
502
|
+
}
|
|
210
503
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
504
|
+
/**
|
|
505
|
+
* @param {FramePassBuilder} pass
|
|
506
|
+
* @param {Object} pass_data
|
|
507
|
+
*/
|
|
508
|
+
function declare_histogram(pass, pass_data) {
|
|
509
|
+
pass_data.size = pass.read(prepare_data.size);
|
|
510
|
+
pass_data.command = pass.read(prepare_data.command);
|
|
511
|
+
pass_data.spine = spine = pass.write(spine);
|
|
214
512
|
}
|
|
215
513
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
514
|
+
/**
|
|
515
|
+
* @param pass_data
|
|
516
|
+
* @param {FramePassResources} resources
|
|
517
|
+
* @param {GraphicsExecutionContext} context
|
|
518
|
+
*/
|
|
519
|
+
function execute_scatter(pass_data, resources, context) {
|
|
520
|
+
const in_keys = resources.get(pass_data.in_keys);
|
|
521
|
+
const in_values = resources.get(pass_data.in_values);
|
|
522
|
+
const out_keys = resources.get(pass_data.out_keys);
|
|
523
|
+
const out_values = resources.get(pass_data.out_values);
|
|
524
|
+
|
|
525
|
+
assert.greaterThanOrEqual(in_keys.size, required, 'key buffer underflow');
|
|
526
|
+
assert.greaterThanOrEqual(in_values.size, required, 'value buffer underflow');
|
|
527
|
+
assert.greaterThanOrEqual(out_keys.size, required, 'key output buffer underflow');
|
|
528
|
+
assert.greaterThanOrEqual(out_values.size, required, 'value output buffer underflow');
|
|
529
|
+
|
|
530
|
+
shader_radix_sort_scatter_indirect.dispatchIndirect({
|
|
531
|
+
encoder: context.encoder,
|
|
532
|
+
command: resources.get(pass_data.command),
|
|
533
|
+
bindings: {
|
|
534
|
+
settings: {
|
|
535
|
+
shift: pass_data.shift,
|
|
536
|
+
key_mask,
|
|
537
|
+
},
|
|
538
|
+
in_keys,
|
|
539
|
+
in_values,
|
|
540
|
+
out_keys,
|
|
541
|
+
out_values,
|
|
542
|
+
spine: resources.get(pass_data.spine),
|
|
543
|
+
sort_size: resources.get(pass_data.size),
|
|
544
|
+
}
|
|
545
|
+
});
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
/**
|
|
549
|
+
* @param {FramePassBuilder} pass
|
|
550
|
+
* @param {Object} pass_data
|
|
551
|
+
*/
|
|
552
|
+
function declare_scatter(pass, pass_data) {
|
|
553
|
+
pass_data.size = pass.read(prepare_data.size);
|
|
554
|
+
pass_data.command = pass.read(prepare_data.command);
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
return record_digit_passes({
|
|
558
|
+
graph,
|
|
559
|
+
keys,
|
|
560
|
+
values,
|
|
561
|
+
pass_count,
|
|
562
|
+
spine_element_max_count,
|
|
563
|
+
PING_PONG_DESCRIPTOR: ping_pong_descriptor(element_max_count),
|
|
564
|
+
execute_histogram,
|
|
565
|
+
declare_histogram,
|
|
566
|
+
execute_scatter,
|
|
567
|
+
declare_scatter,
|
|
568
|
+
});
|
|
220
569
|
}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Per-tile 256-bin digit histogram — stage (a) of one digit pass of {@link graph_radix_sort}
|
|
2
|
+
* Per-tile 256-bin digit histogram — stage (a) of one digit pass of {@link graph_radix_sort} over a
|
|
3
|
+
* host count, which it dispatches directly, a workgroup per tile. The tile's work is
|
|
4
|
+
* {@link chunk_sort_histogram_tile}; {@link shader_radix_sort_histogram_indirect} is the same work
|
|
5
|
+
* over a device count.
|
|
3
6
|
*
|
|
4
7
|
* One workgroup per tile; the counts land in the spine bin-major, so that the single scan that
|
|
5
8
|
* follows produces global digit offsets and per-tile offsets in one traversal.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_radix_sort_histogram.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shader_radix_sort_histogram.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js"],"names":[],"mappings":"AAyCA;;;;;;;;;;;;;;;GAeG;AACH,0CAFU,aAAa,CAMpB;8BA5D2B,+BAA+B"}
|