@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
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { WebGPUExtensionType } from "../../../descriptor/WebGPUExtensionType.js";
|
|
2
|
+
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
3
|
+
import { ShaderResourceDescriptor } from "../../shader/resource/ShaderResourceDescriptor.js";
|
|
4
|
+
import { u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
5
|
+
import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
|
|
6
|
+
import { chunk_sort_constants } from "./chunk_sort_constants.js";
|
|
7
|
+
import { chunk_sort_digit } from "./chunk_sort_digit.js";
|
|
8
|
+
import { chunk_sort_rank } from "./chunk_sort_rank.js";
|
|
9
|
+
import { chunk_sort_workgroup_scan } from "./chunk_sort_workgroup_scan.js";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @type {ShaderResourceDescriptor}
|
|
13
|
+
*/
|
|
14
|
+
export const SORT_SCATTER_IN_KEYS_RESOURCE = ShaderResourceDescriptor.storageBuffer("in_keys", WebGPUArray.from(u32), false);
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @type {ShaderResourceDescriptor}
|
|
18
|
+
*/
|
|
19
|
+
export const SORT_SCATTER_IN_VALUES_RESOURCE = ShaderResourceDescriptor.storageBuffer("in_values", WebGPUArray.from(u32), false);
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @type {ShaderResourceDescriptor}
|
|
23
|
+
*/
|
|
24
|
+
export const SORT_SCATTER_OUT_KEYS_RESOURCE = ShaderResourceDescriptor.storageBuffer("out_keys", WebGPUArray.from(u32), true);
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @type {ShaderResourceDescriptor}
|
|
28
|
+
*/
|
|
29
|
+
export const SORT_SCATTER_OUT_VALUES_RESOURCE = ShaderResourceDescriptor.storageBuffer("out_values", WebGPUArray.from(u32), true);
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* The scanned spine, read flat past its `{count, elements}` header.
|
|
33
|
+
* @type {ShaderResourceDescriptor}
|
|
34
|
+
*/
|
|
35
|
+
export const SORT_SCATTER_SPINE_RESOURCE = ShaderResourceDescriptor.storageBuffer("spine", WebGPUArray.from(u32), false);
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* One tile's rank-and-scatter — the body of both {@link shader_radix_sort_scatter} and
|
|
39
|
+
* {@link shader_radix_sort_scatter_indirect}, which differ only in where the tile and the sort's size
|
|
40
|
+
* come from.
|
|
41
|
+
*
|
|
42
|
+
* ```wgsl
|
|
43
|
+
* fn sort_scatter_tile(tile: u32, element_count: u32, tile_count: u32, shift: u32, key_mask: u32,
|
|
44
|
+
* thread_id: u32, lane_id: u32, lane_count: u32)
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
47
|
+
* The tile is sorted by the current digit in workgroup memory (stability is what an LSD radix sort's
|
|
48
|
+
* correctness rests on, and it is also what lets the tail tile's padding be identified by position),
|
|
49
|
+
* the tile's own histogram is re-derived rather than carried over from the histogram pass — the scan
|
|
50
|
+
* is inclusive-only, and re-counting is cheaper than preserving pre-scan counts — and each key is
|
|
51
|
+
* written to `spine_inclusive[bin] - local_count[bin] - bin_start[bin] + sorted_position`.
|
|
52
|
+
*
|
|
53
|
+
* Call from workgroup-uniform control flow, every thread of a {@link SORT_WORKGROUP_SIZE}-wide
|
|
54
|
+
* workgroup with its `local_invocation_index` and subgroup builtins: it holds barriers and subgroup
|
|
55
|
+
* operations. `tile` must be below `tile_count`.
|
|
56
|
+
*
|
|
57
|
+
* @type {CodeChunk}
|
|
58
|
+
*/
|
|
59
|
+
export const chunk_sort_scatter_tile = CodeChunk.from(
|
|
60
|
+
//language=WGSL
|
|
61
|
+
`
|
|
62
|
+
/**
|
|
63
|
+
* The key a slot past the end of the input is filled with. Every bit of it is set, so its digit is the
|
|
64
|
+
* largest any key can have in every pass, whatever the key's width, and the stable in-tile sort
|
|
65
|
+
* parks every one of them behind every real key — which is what makes "sorted position < the tile's
|
|
66
|
+
* real key count" a sufficient test for whether a slot holds a real key.
|
|
67
|
+
*/
|
|
68
|
+
const SORT_PADDING_KEY = 0xffffffffu;
|
|
69
|
+
|
|
70
|
+
var<workgroup> wg_sort_keys: array<u32, SORT_TILE_SIZE>;
|
|
71
|
+
var<workgroup> wg_sort_values: array<u32, SORT_TILE_SIZE>;
|
|
72
|
+
// one bin per thread; RADIX == WORKGROUP_SIZE
|
|
73
|
+
var<workgroup> wg_sort_histogram: array<atomic<u32>, SORT_RADIX>;
|
|
74
|
+
var<workgroup> wg_sort_base: array<u32, SORT_RADIX>;
|
|
75
|
+
|
|
76
|
+
fn sort_scatter_tile(
|
|
77
|
+
tile: u32,
|
|
78
|
+
element_count: u32,
|
|
79
|
+
tile_count: u32,
|
|
80
|
+
shift: u32,
|
|
81
|
+
key_mask: u32,
|
|
82
|
+
thread_id: u32,
|
|
83
|
+
lane_id: u32,
|
|
84
|
+
lane_count: u32,
|
|
85
|
+
) {
|
|
86
|
+
let tile_base = tile * SORT_TILE_SIZE;
|
|
87
|
+
|
|
88
|
+
atomicStore(&wg_sort_histogram[thread_id], 0u);
|
|
89
|
+
|
|
90
|
+
// Striped load, so neighbouring threads read neighbouring addresses.
|
|
91
|
+
for (var k = 0u; k < SORT_KEYS_PER_THREAD; k += 1u) {
|
|
92
|
+
let slot = k * SORT_WORKGROUP_SIZE + thread_id;
|
|
93
|
+
let source = tile_base + slot;
|
|
94
|
+
|
|
95
|
+
var key = SORT_PADDING_KEY;
|
|
96
|
+
var value = 0u;
|
|
97
|
+
|
|
98
|
+
if (source < element_count) {
|
|
99
|
+
key = in_keys[source];
|
|
100
|
+
value = in_values[source];
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
wg_sort_keys[slot] = key;
|
|
104
|
+
wg_sort_values[slot] = value;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
workgroupBarrier();
|
|
108
|
+
|
|
109
|
+
// Local histogram over the real keys only — it has to agree with what the histogram pass
|
|
110
|
+
// counted, because the spine value this tile reads back was built from that count.
|
|
111
|
+
for (var k = 0u; k < SORT_KEYS_PER_THREAD; k += 1u) {
|
|
112
|
+
let slot = k * SORT_WORKGROUP_SIZE + thread_id;
|
|
113
|
+
|
|
114
|
+
if (tile_base + slot < element_count) {
|
|
115
|
+
atomicAdd(&wg_sort_histogram[sort_extract_key_digit(wg_sort_keys[slot], shift, key_mask)], 1u);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
workgroupBarrier();
|
|
120
|
+
|
|
121
|
+
// this thread's bin, captured before the in-tile sort touches anything
|
|
122
|
+
let local_count = atomicLoad(&wg_sort_histogram[thread_id]);
|
|
123
|
+
|
|
124
|
+
// Order the tile by this pass's digit, one bit at a time, least significant first. Eight stable
|
|
125
|
+
// binary splits are a sort by the whole 8-bit digit; ranking a key against its same-digit peers
|
|
126
|
+
// then costs nothing, because the rank IS the sorted position, and the device writes that
|
|
127
|
+
// follow come out contiguous per bin.
|
|
128
|
+
for (var bit_index = 0u; bit_index < SORT_RADIX_LOG; bit_index += 1u) {
|
|
129
|
+
|
|
130
|
+
// Blocked ownership for the permutation: thread t owns the tile's slots
|
|
131
|
+
// [t*KEYS_PER_THREAD, (t+1)*KEYS_PER_THREAD), so the offsets a thread hands its own keys
|
|
132
|
+
// are consecutive and the scan below only has to run over one value per thread.
|
|
133
|
+
var keys: array<u32, SORT_KEYS_PER_THREAD>;
|
|
134
|
+
var values: array<u32, SORT_KEYS_PER_THREAD>;
|
|
135
|
+
var ones = 0u;
|
|
136
|
+
|
|
137
|
+
for (var j = 0u; j < SORT_KEYS_PER_THREAD; j += 1u) {
|
|
138
|
+
let slot = thread_id * SORT_KEYS_PER_THREAD + j;
|
|
139
|
+
|
|
140
|
+
keys[j] = wg_sort_keys[slot];
|
|
141
|
+
values[j] = wg_sort_values[slot];
|
|
142
|
+
ones += (sort_extract_key_digit(keys[j], shift, key_mask) >> bit_index) & 1u;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// The scan's first barrier is what fences every thread's reads above against the writes
|
|
146
|
+
// below — by the time it returns, no read of wg_sort_keys/wg_sort_values is outstanding.
|
|
147
|
+
let scan = sort_workgroup_exclusive_scan(ones, thread_id, lane_id, lane_count);
|
|
148
|
+
|
|
149
|
+
let total_zeros = SORT_TILE_SIZE - scan.y;
|
|
150
|
+
|
|
151
|
+
var ones_before = scan.x;
|
|
152
|
+
var zeros_before = thread_id * SORT_KEYS_PER_THREAD - scan.x;
|
|
153
|
+
|
|
154
|
+
for (var j = 0u; j < SORT_KEYS_PER_THREAD; j += 1u) {
|
|
155
|
+
let is_one = ((sort_extract_key_digit(keys[j], shift, key_mask) >> bit_index) & 1u) != 0u;
|
|
156
|
+
let destination = sort_split_destination(is_one, zeros_before, ones_before, total_zeros);
|
|
157
|
+
|
|
158
|
+
if (is_one) {
|
|
159
|
+
ones_before += 1u;
|
|
160
|
+
} else {
|
|
161
|
+
zeros_before += 1u;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
wg_sort_keys[destination] = keys[j];
|
|
165
|
+
wg_sort_values[destination] = values[j];
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
workgroupBarrier();
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Exclusive prefix of the local histogram — for a tile now sorted by digit this is exactly the
|
|
172
|
+
// slot each bin's run begins at, and the total is the tile's real key count, because the
|
|
173
|
+
// padding was never counted.
|
|
174
|
+
let histogram_scan = sort_workgroup_exclusive_scan(local_count, thread_id, lane_id, lane_count);
|
|
175
|
+
|
|
176
|
+
let bin_start = histogram_scan.x;
|
|
177
|
+
let valid_count = histogram_scan.y;
|
|
178
|
+
|
|
179
|
+
let spine_inclusive = spine[sort_spine_index(thread_id, tile, tile_count)];
|
|
180
|
+
|
|
181
|
+
wg_sort_base[thread_id] = sort_scatter_base(spine_inclusive, local_count, bin_start);
|
|
182
|
+
|
|
183
|
+
workgroupBarrier();
|
|
184
|
+
|
|
185
|
+
for (var k = 0u; k < SORT_KEYS_PER_THREAD; k += 1u) {
|
|
186
|
+
let slot = k * SORT_WORKGROUP_SIZE + thread_id;
|
|
187
|
+
|
|
188
|
+
if (slot < valid_count) {
|
|
189
|
+
let key = wg_sort_keys[slot];
|
|
190
|
+
let destination = wg_sort_base[sort_extract_key_digit(key, shift, key_mask)] + slot;
|
|
191
|
+
|
|
192
|
+
out_keys[destination] = key;
|
|
193
|
+
out_values[destination] = wg_sort_values[slot];
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
`, [
|
|
198
|
+
chunk_sort_constants,
|
|
199
|
+
chunk_sort_digit,
|
|
200
|
+
chunk_sort_rank,
|
|
201
|
+
chunk_sort_workgroup_scan,
|
|
202
|
+
]);
|
|
203
|
+
|
|
204
|
+
chunk_sort_scatter_tile.addExtension(WebGPUExtensionType.Subgroups);
|
|
205
|
+
|
|
206
|
+
chunk_sort_scatter_tile.requireResource(SORT_SCATTER_IN_KEYS_RESOURCE);
|
|
207
|
+
chunk_sort_scatter_tile.requireResource(SORT_SCATTER_IN_VALUES_RESOURCE);
|
|
208
|
+
chunk_sort_scatter_tile.requireResource(SORT_SCATTER_OUT_KEYS_RESOURCE);
|
|
209
|
+
chunk_sort_scatter_tile.requireResource(SORT_SCATTER_OUT_VALUES_RESOURCE);
|
|
210
|
+
chunk_sort_scatter_tile.requireResource(SORT_SCATTER_SPINE_RESOURCE);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared configuration for the key-value radix sort.
|
|
3
3
|
*
|
|
4
|
-
* The sort is LSD reduce-then-scan: four 8-bit digit passes, each of them a per-tile histogram,
|
|
4
|
+
* The sort is LSD reduce-then-scan: up to four 8-bit digit passes, each of them a per-tile histogram,
|
|
5
5
|
* a spine scan through {@link graph_prefix_scan_csdldf}, and a rank-and-scatter. The numbers below
|
|
6
6
|
* are what the three stages have to agree on, so they live in one place rather than in each
|
|
7
7
|
* shader's template literal.
|
|
@@ -17,10 +17,11 @@ export const RADIX: number;
|
|
|
17
17
|
*/
|
|
18
18
|
export const RADIX_LOG: number;
|
|
19
19
|
/**
|
|
20
|
-
*
|
|
20
|
+
* 32 / RADIX_LOG: the digit passes a whole 32-bit key takes, and the most any sort runs. A narrower
|
|
21
|
+
* key takes `ceil(key_bits / RADIX_LOG)` — see {@link graph_radix_sort}.
|
|
21
22
|
*
|
|
22
|
-
* Even, which is what puts
|
|
23
|
-
* scratch
|
|
23
|
+
* Even, which is what puts a whole-key sort's result back in the caller's buffers rather than in the
|
|
24
|
+
* ping-pong scratch.
|
|
24
25
|
* @type {number}
|
|
25
26
|
*/
|
|
26
27
|
export const RADIX_PASSES: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defs.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/gpu_primitive/sort/defs.js"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;GAGG;AACH,oBAFU,MAAM,CAES;AAEzB;;;GAGG;AACH,wBAFU,MAAM,CAEW;AAE3B
|
|
1
|
+
{"version":3,"file":"defs.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/gpu_primitive/sort/defs.js"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;GAGG;AACH,oBAFU,MAAM,CAES;AAEzB;;;GAGG;AACH,wBAFU,MAAM,CAEW;AAE3B;;;;;;;GAOG;AACH,2BAFU,MAAM,CAEc;AAE9B;;;;;;;GAOG;AACH,kCAFU,MAAM,CAEuB;AAEvC;;;GAGG;AACH,mCAFU,MAAM,CAEsB;AAEtC;;;;GAIG;AACH,6BAFU,MAAM,CAEyD;AAEzE;;;;;;;;;GASG;AACH,gCAFU,MAAM,CAEmB;AAEnC;;GAEG;AACH,0CAFU,MAAM,CAEmE;AAEnF;;;;;;;GAOG;AACH,iCAFU,MAAM,CAEoB"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared configuration for the key-value radix sort.
|
|
3
3
|
*
|
|
4
|
-
* The sort is LSD reduce-then-scan: four 8-bit digit passes, each of them a per-tile histogram,
|
|
4
|
+
* The sort is LSD reduce-then-scan: up to four 8-bit digit passes, each of them a per-tile histogram,
|
|
5
5
|
* a spine scan through {@link graph_prefix_scan_csdldf}, and a rank-and-scatter. The numbers below
|
|
6
6
|
* are what the three stages have to agree on, so they live in one place rather than in each
|
|
7
7
|
* shader's template literal.
|
|
@@ -20,10 +20,11 @@ export const RADIX = 256;
|
|
|
20
20
|
export const RADIX_LOG = 8;
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
|
-
*
|
|
23
|
+
* 32 / RADIX_LOG: the digit passes a whole 32-bit key takes, and the most any sort runs. A narrower
|
|
24
|
+
* key takes `ceil(key_bits / RADIX_LOG)` — see {@link graph_radix_sort}.
|
|
24
25
|
*
|
|
25
|
-
* Even, which is what puts
|
|
26
|
-
* scratch
|
|
26
|
+
* Even, which is what puts a whole-key sort's result back in the caller's buffers rather than in the
|
|
27
|
+
* ping-pong scratch.
|
|
27
28
|
* @type {number}
|
|
28
29
|
*/
|
|
29
30
|
export const RADIX_PASSES = 4;
|
|
@@ -2,21 +2,49 @@
|
|
|
2
2
|
* @typedef {import("../../../device/pipeline/PipelineEnquiry.js").PipelineEnquiry} PipelineEnquiry
|
|
3
3
|
*/
|
|
4
4
|
/**
|
|
5
|
-
* Offer the pipelines {@link graph_radix_sort} dispatches — see
|
|
5
|
+
* Offer the pipelines {@link graph_radix_sort} dispatches over a host `element_count` — see
|
|
6
|
+
* {@link PipelineEnquiry}.
|
|
6
7
|
*
|
|
7
8
|
* @param {PipelineEnquiry} enquiry
|
|
8
9
|
*/
|
|
9
10
|
export function enquire_radix_sort_pipelines(enquiry: PipelineEnquiry): void;
|
|
11
|
+
/**
|
|
12
|
+
* Offer the pipelines {@link graph_radix_sort} dispatches over a device count, a `count_buffer` —
|
|
13
|
+
* see {@link PipelineEnquiry}.
|
|
14
|
+
*
|
|
15
|
+
* @param {PipelineEnquiry} enquiry
|
|
16
|
+
*/
|
|
17
|
+
export function enquire_radix_sort_indirect_pipelines(enquiry: PipelineEnquiry): void;
|
|
10
18
|
/**
|
|
11
19
|
* Key-value LSD radix sort, reduce-then-scan, built on the CSDLDF spine.
|
|
12
20
|
*
|
|
13
21
|
* Keys are 32-bit unsigned integers, values are 32-bit unsigned integers, sorting is always
|
|
14
22
|
* ASCENDING and STABLE — equal keys come out in their input order, which is what an LSD radix sort
|
|
15
23
|
* needs of each of its own digit passes and what a caller sorting Morton codes needs of the whole
|
|
16
|
-
* thing.
|
|
17
|
-
*
|
|
24
|
+
* thing.
|
|
25
|
+
*
|
|
26
|
+
* **Key width.** The order is by the key's low `key_bits`, in `ceil(key_bits / 8)` digit passes from
|
|
27
|
+
* the least significant byte: a 24-bit key is three passes, a 32-bit one four. The bits above
|
|
28
|
+
* `key_bits` are ignored, not required to be zero — every pass selects its digit from the key with
|
|
29
|
+
* them cleared — and each key comes out as it went in, those bits and all.
|
|
30
|
+
*
|
|
31
|
+
* **The result is in the returned handles — use them.** The digit passes ping-pong between the
|
|
32
|
+
* caller's buffers and a pair of transients the sort creates, so an even number of passes ends in the
|
|
33
|
+
* caller's buffers and an odd number in the transients. The caller's buffers are the sort's scratch
|
|
34
|
+
* either way: from the second pass on, the entries below the sorted count hold whatever the last pass
|
|
35
|
+
* to write them left there. No buffer is written at or past the sorted count.
|
|
36
|
+
*
|
|
37
|
+
* **The count** is one of:
|
|
38
|
+
* - `element_count`, known on the host: the histogram and scatter are dispatched directly, a
|
|
39
|
+
* workgroup a tile of keys;
|
|
40
|
+
* - a count on the device, the `u32` at byte `count_offset` of `count_buffer`, with
|
|
41
|
+
* `element_max_count` sizing the memory — the spine, the transients, and what the caller's buffers
|
|
42
|
+
* must hold. One thread, {@link shader_radix_sort_prepare}, reads the count and writes the command
|
|
43
|
+
* every histogram and scatter is dispatched through, the live size they read and the spine's count
|
|
44
|
+
* every scan is dispatched over. No work follows `element_max_count`: a count of 0 dispatches no
|
|
45
|
+
* tile and leaves an empty result. A count above it sorts the first `element_max_count` keys.
|
|
18
46
|
*
|
|
19
|
-
* One digit pass is three
|
|
47
|
+
* One digit pass is three stages:
|
|
20
48
|
*
|
|
21
49
|
* 1. {@link shader_radix_sort_histogram} — a 256-bin histogram per tile, written into the spine
|
|
22
50
|
* bin-major;
|
|
@@ -27,24 +55,37 @@ export function enquire_radix_sort_pipelines(enquiry: PipelineEnquiry): void;
|
|
|
27
55
|
* its keys anyway);
|
|
28
56
|
* 3. {@link shader_radix_sort_scatter} — rank within the tile, then scatter.
|
|
29
57
|
*
|
|
30
|
-
* Twelve
|
|
31
|
-
* commit `b6049214c` removed. What that buys is the absence of any unbounded
|
|
32
|
-
* the only spin anywhere is CSDLDF's own bounded-spin-then-fallback, so the sort
|
|
33
|
-
* a scheduler that offers no fairness guarantee at all. The single-pass upgrade is
|
|
34
|
-
* `GPU_BVH_BUILD_PLAN.md` §4.2.1 as v2, gated on a measurement from a real consumer.
|
|
58
|
+
* Twelve stages for a whole 32-bit key, against the seven dispatches of the single-pass one-sweep
|
|
59
|
+
* formulation that commit `b6049214c` removed. What that buys is the absence of any unbounded
|
|
60
|
+
* cross-workgroup wait: the only spin anywhere is CSDLDF's own bounded-spin-then-fallback, so the sort
|
|
61
|
+
* makes progress on a scheduler that offers no fairness guarantee at all. The single-pass upgrade is
|
|
62
|
+
* recorded in `GPU_BVH_BUILD_PLAN.md` §4.2.1 as v2, gated on a measurement from a real consumer.
|
|
35
63
|
*
|
|
36
64
|
* @param {Object} options
|
|
37
65
|
* @param {FrameGraph} options.graph
|
|
38
|
-
* @param {number} options.keys buffer resource ID, `array<u32>`, at least `element_count`
|
|
39
|
-
*
|
|
40
|
-
* @param {number} options.
|
|
41
|
-
* @
|
|
66
|
+
* @param {number} options.keys buffer resource ID, `array<u32>`, at least `element_count` (or
|
|
67
|
+
* `element_max_count`) entries
|
|
68
|
+
* @param {number} options.values buffer resource ID, `array<u32>`, as many entries as `keys`
|
|
69
|
+
* @param {number} [options.element_count] number of input elements, known on the host. Give this or
|
|
70
|
+
* `count_buffer`, not both
|
|
71
|
+
* @param {number} [options.count_buffer] buffer resource ID holding the number of input elements,
|
|
72
|
+
* written on the device; bound whole, read-only, so it needs `STORAGE`
|
|
73
|
+
* @param {number} [options.count_offset] with `count_buffer`: byte offset of the count, a multiple of 4
|
|
74
|
+
* @param {number} [options.element_max_count] with `count_buffer`: the most elements it can count,
|
|
75
|
+
* which sizes memory and nothing else
|
|
76
|
+
* @param {number} [options.key_bits=32] how many of the key's low bits it is sorted by, 1 to 32
|
|
77
|
+
* @returns {{keys:number, values:number}} the sorted keys and values: the caller's buffers or the
|
|
78
|
+
* sort's transients, see above
|
|
42
79
|
*/
|
|
43
|
-
export function graph_radix_sort({ graph, keys, values, element_count, }: {
|
|
80
|
+
export function graph_radix_sort({ graph, keys, values, element_count, count_buffer, count_offset, element_max_count, key_bits, }: {
|
|
44
81
|
graph: FrameGraph;
|
|
45
82
|
keys: number;
|
|
46
83
|
values: number;
|
|
47
|
-
element_count
|
|
84
|
+
element_count?: number;
|
|
85
|
+
count_buffer?: number;
|
|
86
|
+
count_offset?: number;
|
|
87
|
+
element_max_count?: number;
|
|
88
|
+
key_bits?: number;
|
|
48
89
|
}): {
|
|
49
90
|
keys: number;
|
|
50
91
|
values: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph_radix_sort.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"graph_radix_sort.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js"],"names":[],"mappings":"AAoBA;;GAEG;AAEH;;;;;GAKG;AACH,sDAFW,eAAe,QAMzB;AAED;;;;;GAKG;AACH,+DAFW,eAAe,QAOzB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AACH;IAf+B,KAAK;IACT,IAAI,EAApB,MAAM;IAEU,MAAM,EAAtB,MAAM;IACW,aAAa,GAA9B,MAAM;IAEW,YAAY,GAA7B,MAAM;IAEW,YAAY,GAA7B,MAAM;IACW,iBAAiB,GAAlC,MAAM;IAEW,QAAQ,GAAzB,MAAM;IACJ;IAAC,IAAI,EAAC,MAAM,CAAC;IAAC,MAAM,EAAC,MAAM,CAAA;CAAC,CA4DxC;8BAnJY,OAAO,6CAA6C,EAAE,eAAe"}
|