@woosh/meep-engine 3.26.0 → 3.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/core/binary/lz4/LZ4_HIGH_COMPRESSION_PLAN_2026_09_14.md +542 -0
- package/src/core/binary/lz4/LZ4_LEVEL.d.ts +33 -0
- package/src/core/binary/lz4/LZ4_LEVEL.d.ts.map +1 -0
- package/src/core/binary/lz4/LZ4_LEVEL.js +32 -0
- package/src/core/binary/lz4/lz4_compress_block_at_level.d.ts +33 -0
- package/src/core/binary/lz4/lz4_compress_block_at_level.d.ts.map +1 -0
- package/src/core/binary/lz4/lz4_compress_block_at_level.js +47 -0
- package/src/core/binary/lz4/lz4_compress_block_hc.d.ts +40 -0
- package/src/core/binary/lz4/lz4_compress_block_hc.d.ts.map +1 -0
- package/src/core/binary/lz4/lz4_compress_block_hc.js +1382 -0
- package/src/core/binary/lz4/lz4_decompress_block.d.ts +2 -1
- package/src/core/binary/lz4/lz4_decompress_block.d.ts.map +1 -1
- package/src/core/binary/lz4/lz4_decompress_block.js +31 -6
- package/src/core/geom/3d/shape/HeightMapShape3D.d.ts +14 -7
- package/src/core/geom/3d/shape/HeightMapShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/HeightMapShape3D.js +87 -78
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/shade/playground/vgeo_runtime/README.md +167 -22
- package/src/shade/playground/vgeo_runtime/index.html +112 -62
- package/src/shade/playground/vgeo_runtime/main.js +660 -83
- package/src/shade/playground/vgeo_viewer/sample_asset.d.ts.map +1 -1
- package/src/shade/playground/vgeo_viewer/sample_asset.js +19 -2
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts +11 -0
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +16 -8
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +16 -11
- package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +73 -5
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +26 -15
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +5 -3
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts +18 -0
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js +20 -0
- package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.js +56 -9
- package/src/shade/renderer/geometry/virtual/build/vgeo_build.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_build.js +1 -0
- package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts +22 -0
- package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.js +24 -0
- package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.d.ts +12 -0
- package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.js +13 -0
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.d.ts +8 -1
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.js +11 -3
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.d.ts +9 -0
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.js +10 -1
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_ENTRY_COUNT.d.ts +18 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_ENTRY_COUNT.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_ENTRY_COUNT.js +17 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_REF.d.ts +8 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_REF.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_REF.js +7 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.d.ts +3 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.js +16 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_ENTRY_SIZE.d.ts +14 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_ENTRY_SIZE.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_ENTRY_SIZE.js +13 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_PAGE_ENTRY_SIZE.d.ts +11 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_PAGE_ENTRY_SIZE.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_PAGE_ENTRY_SIZE.js +10 -0
- package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.d.ts +20 -0
- package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.js +20 -2
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.d.ts +4 -0
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.js +4 -0
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.d.ts +29 -3
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.js +81 -122
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts +40 -0
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.js +44 -0
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.d.ts +69 -0
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.js +236 -0
- package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.d.ts +14 -0
- package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.js +15 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_byte_source_from_descriptor.d.ts +31 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_byte_source_from_descriptor.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_byte_source_from_descriptor.js +32 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.d.ts +10 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.js +21 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_transfer.d.ts +15 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_transfer.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_transfer.js +84 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.d.ts +22 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.js +96 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.js +55 -0
- package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js +202 -13
- package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.js +147 -10
- package/src/shade/renderer/geometry/virtual/runtime/CUT_PLAN_2026_09_14.md +637 -0
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.d.ts +33 -36
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.js +109 -193
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts +58 -28
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +77 -105
- package/src/shade/renderer/geometry/virtual/runtime/REVIEW_LEDGER.md +37 -0
- package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN.md +105 -22
- package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN_2026_09_14.md +548 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts +29 -50
- package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.js +47 -489
- package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts +84 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.js +393 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.d.ts +234 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.js +1363 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoResidencyOptions.d.ts +81 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoResidencyOptions.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoResidencyOptions.js +89 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.d.ts +53 -34
- package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.js +407 -124
- package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts +100 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.js +219 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_EXPAND.d.ts +17 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_EXPAND.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_EXPAND.js +47 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_COARSEN.d.ts +20 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_COARSEN.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_COARSEN.js +19 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_PARAMS_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_PARAMS_STRUCT.js +30 -12
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.js +15 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.js +18 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_prepare.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_prepare.js +5 -15
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_remainder.d.ts +3 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_remainder.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_remainder.js +77 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_reseed.d.ts +3 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_reseed.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_reseed.js +186 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_seed.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_seed.js +20 -8
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.js +580 -188
- package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.d.ts +15 -18
- package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.js +19 -28
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js +45 -25
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.d.ts +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.js +11 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT_COUNT.js +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_FEEDBACK_OFFSET.d.ts +0 -1
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_FEEDBACK_OFFSET.js +12 -10
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_OFFSET.d.ts +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_OFFSET.js +8 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.d.ts +7 -2
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.js +8 -3
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_OFFSET.d.ts +2 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_OFFSET.js +19 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_WORDS.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_WORDS.js +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_OFFSET.d.ts +5 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_OFFSET.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_OFFSET.js +22 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_WORDS.d.ts +14 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_WORDS.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_WORDS.js +13 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_PARENT_BIT.d.ts +17 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_PARENT_BIT.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_PARENT_BIT.js +16 -0
- package/src/shade/renderer/geometry/virtual/runtime/make_vgeo_page_worker.d.ts +15 -0
- package/src/shade/renderer/geometry/virtual/runtime/make_vgeo_page_worker.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/make_vgeo_page_worker.js +16 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_frontier_words.d.ts +23 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_frontier_words.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_frontier_words.js +28 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_page.worker.d.ts +2 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_page.worker.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_page.worker.js +13 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.d.ts +10 -5
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.js +15 -6
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.d.ts +6 -1
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.js +38 -1
- package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.js +4 -3
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_emit.js +6 -3
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +6 -3
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +12 -4
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts +2 -0
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +58 -57
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +3 -5
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +3 -4
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +3 -4
- package/src/shade/renderer/rasterize/expand/pass0/pass_mesh_cull.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/pass0/pass_mesh_cull.js +7 -7
- package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.js +83 -78
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +7 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +7 -1
- package/src/shade/renderer/scene/GPUSceneContext.d.ts +22 -2
- package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUSceneContext.js +59 -4
- package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +92 -16
- package/src/shade/renderer/view/GPUViewContext.d.ts +5 -0
- package/src/shade/renderer/view/GPUViewContext.d.ts.map +1 -1
- package/src/shade/renderer/view/GPUViewContext.js +21 -0
- package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.js +74 -3
- package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyManager.js +0 -723
- package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.js +0 -50
- package/src/shade/renderer/shader/chunk/jobs/NOTES.md +0 -47
- package/src/shade/renderer/shader/chunk/jobs/chunk_job_system.js +0 -102
|
@@ -10,6 +10,21 @@
|
|
|
10
10
|
>
|
|
11
11
|
> The ledger is still the place to start for what was wrong and how it was found. It is no longer a
|
|
12
12
|
> list of open defects.
|
|
13
|
+
>
|
|
14
|
+
> **And the cut is under review, 2026-09-14.** §4's rule and its proofs stand, but the claim
|
|
15
|
+
> that it is evaluated from the root every frame is what
|
|
16
|
+
> [CUT_PLAN_2026_09_14.md](./CUT_PLAN_2026_09_14.md) proposes to replace, with a per-view cut kept
|
|
17
|
+
> between frames and a `.vgeo` change to make walking up possible. Nothing of it is built: its §0
|
|
18
|
+
> measures what a cut dispatch costs in the runtime as it stands here.
|
|
19
|
+
>
|
|
20
|
+
> **And residency is rewritten, 2026-09-14.** §3.2, §3.3, the touch half of §4.5 and everything
|
|
21
|
+
> `VGeoResidencyManager` did are superseded by
|
|
22
|
+
> [RUNTIME_PLAN_2026_09_14.md](./RUNTIME_PLAN_2026_09_14.md): selectability is kept by a counter in
|
|
23
|
+
> the group row rather than recomputed per install, a touch is one bit, the want stamps are a
|
|
24
|
+
> persistent frame-tagged buffer, both tiers live in one flat `VGeoResidency` with CLOCK eviction
|
|
25
|
+
> under a per-reading test budget, and pages are fetched, verified and decoded on workers. The cut
|
|
26
|
+
> also frustum-tests a cluster before it claims its child page. What is left of this document is
|
|
27
|
+
> still right about the slot layout, the claim, the cut rule and its proofs, and the seam.
|
|
13
28
|
|
|
14
29
|
**Status: built.** This was the plan for what
|
|
15
30
|
[VIRTUAL_GEOMETRY_DESIGN.md](../VIRTUAL_GEOMETRY_DESIGN.md) §7 describes — the selection buffer, the
|
|
@@ -184,20 +199,35 @@ invalid buffer.
|
|
|
184
199
|
|
|
185
200
|
### 4.1 Shape
|
|
186
201
|
|
|
187
|
-
A **
|
|
188
|
-
|
|
189
|
-
|
|
202
|
+
A descent that **lives inside one dispatch**, redistributing its own work across the lanes of a
|
|
203
|
+
subgroup. Not persistent threads: WebGPU gives no forward-progress guarantee across workgroups, and
|
|
204
|
+
an MPMC queue serviced by persistent threads is unbounded cross-workgroup waiting. But a lane may
|
|
205
|
+
wait on the other lanes of *its own* subgroup, and that is enough.
|
|
190
206
|
|
|
191
|
-
A queue item is `(instance_slot, page_row,
|
|
207
|
+
A queue item is `(instance_slot, page_row, visit, aux)` — one lane each, a node index or, above bit
|
|
208
|
+
31, a group index with `aux` naming one cluster inside it.
|
|
192
209
|
|
|
193
210
|
```
|
|
194
211
|
seed: one item per visible VG instance = (instance, root page row, node 0)
|
|
195
|
-
|
|
196
|
-
|
|
212
|
+
step: every lane executes its item and returns a production *count*
|
|
213
|
+
subgroupExclusiveAdd numbers the wave's whole production densely
|
|
214
|
+
the first subgroup_size of them are taken back into the wave's own lanes
|
|
215
|
+
the rest spill to the global queue under one atomicAdd
|
|
216
|
+
dispatch: descent_steps of those, then whatever is still held goes back to the queue
|
|
197
217
|
```
|
|
198
218
|
|
|
199
|
-
Enqueueing a *child page* means enqueueing `(instance, child_page_row, 0)` — its node tree's
|
|
200
|
-
Uniform items, one kernel, no special cases.
|
|
219
|
+
Enqueueing a *child page* means enqueueing `(instance, child_page_row, 0, 0)` — its node tree's
|
|
220
|
+
root. Uniform items, one kernel, no special cases.
|
|
221
|
+
|
|
222
|
+
**This replaces a level-synchronous wavefront**, which ping-ponged through global memory once per
|
|
223
|
+
level of the descent. What killed it was depth rather than geometry: measured on a 28M-face
|
|
224
|
+
container at τ = 1 on a 4090, the descent converged at **39 levels** carrying 15,027 items — an
|
|
225
|
+
average frontier of 385 items, six workgroups of 64 on a 128-SM part — while an empty
|
|
226
|
+
prepare/traverse pair costs 3.9 µs whatever it contains. Page depth grows like log2(triangles), so
|
|
227
|
+
the dispatch count got worse with better assets and never better with a faster GPU.
|
|
228
|
+
|
|
229
|
+
The redistribution is Karis' "Variable sized work" (graphicrants, 2026-03) with its groupshared
|
|
230
|
+
scatter removed; §4.10 records why that half does not port and what replaces it.
|
|
201
231
|
|
|
202
232
|
### 4.2 What one node visit does
|
|
203
233
|
|
|
@@ -326,24 +356,39 @@ lost at the append; `QUEUE_REMAINING` is what was outstanding when the descent s
|
|
|
326
356
|
by one extra prepare pass the seam records after the wavefront loop for exactly this; and
|
|
327
357
|
`WAVEFRONTS` is how deep it went, so reaching `max_iterations` is legible rather than inferred.
|
|
328
358
|
|
|
329
|
-
### 4.6
|
|
359
|
+
### 4.6 One lane per cluster
|
|
330
360
|
|
|
331
|
-
A node leaf covers at most 4 groups
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
the pathological case is bounded instead of unbounded.
|
|
361
|
+
A node leaf covers at most 4 groups and a group may hold up to 4096 clusters (format §11.5), so a
|
|
362
|
+
kernel that walks a leaf's clusters in the lane that popped it can be handed 16,384 of them — legal
|
|
363
|
+
input, and a loop nothing bounds. The answer used to be a **group-chunk item** per
|
|
364
|
+
`VGEO_CUT_CLUSTER_CHUNK` clusters, which bounded the loop at 8 and paid for it in the memory
|
|
365
|
+
pattern: lane *i* walking clusters `8i..8i+8` puts 32 lanes on 32 separate cache lines at every
|
|
366
|
+
step, over rows that are contiguous.
|
|
338
367
|
|
|
339
|
-
|
|
340
|
-
|
|
368
|
+
There is no chunk any more, because the bound now comes from the redistribution. A leaf's
|
|
369
|
+
production is **every cluster its groups hold**, the wave packs them one per lane, and consecutive
|
|
370
|
+
lanes read consecutive cluster rows. `cluster_chunk` is gone from the params.
|
|
341
371
|
|
|
342
|
-
|
|
372
|
+
An item is `(instance, page_row, visit, aux)`, with bit 31 of `visit` distinguishing a node index
|
|
373
|
+
from a group index and `aux` naming the cluster inside that group. One kernel, one queue, two
|
|
374
|
+
shapes.
|
|
343
375
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
376
|
+
### 4.7 Two bounds, and what each one costs
|
|
377
|
+
|
|
378
|
+
Depth along a path is page depth × (node depth + one group step) — 12 and 1–3 when this was
|
|
379
|
+
written, 39 levels measured on the 28M-face container. That depth is now paid **inside** a dispatch:
|
|
380
|
+
`descent_steps` (default 32) steps of the loop above, and `max_iterations` (default 8) dispatches
|
|
381
|
+
for the breadth that spills out of it. Measured on that container, the descent converges in **five**
|
|
382
|
+
dispatches with work, against 39 before.
|
|
383
|
+
|
|
384
|
+
WGSL is what makes `descent_steps` a tuning knob rather than a safety bound. A loop around a
|
|
385
|
+
subgroup operation needs a uniform trip count and nothing launders one — not `subgroupAdd`, not
|
|
386
|
+
`subgroupMax`, not `subgroupBroadcastFirst`, which launders a value for a use but not for control
|
|
387
|
+
flow — and it may not carry a non-uniform `break`, `continue` or `return`. So the descent cannot
|
|
388
|
+
stop when the wave runs dry: it runs the full count and masks, at roughly ten instructions a step
|
|
389
|
+
for a wave with nothing left. Both numbers trade idle steps against dispatches, and neither is safe
|
|
390
|
+
by construction. `VGEO_CUT_STAT.QUEUE_REMAINING` is what says a pair was set too low — measured, it
|
|
391
|
+
reads 207 outstanding at 64×4 and 8,332 at 96×3, where `DRAWN` falls short by the same shape.
|
|
347
392
|
|
|
348
393
|
"Records whether the queue was non-empty at the end" is what this paragraph promised and what it did
|
|
349
394
|
not do: nothing anywhere recorded it, which made the descent's one hole-shaped failure the only one
|
|
@@ -352,6 +397,44 @@ by one extra prepare pass after the loop, and `WAVEFRONTS` says how many iterati
|
|
|
352
397
|
Measured on the playground's 13-page torus through a real adapter: fourteen wavefronts at τ = 0.5,
|
|
353
398
|
eight at τ = 16, and nothing outstanding at any threshold.
|
|
354
399
|
|
|
400
|
+
### 4.10 What WGSL would not let the redistribution be
|
|
401
|
+
|
|
402
|
+
Karis' `DistributeWork` scatters each producer's packed state into a groupshared slot and has every
|
|
403
|
+
consumer ballot for the nearest preceding one. That needs the scatter's writes visible across the
|
|
404
|
+
wave before the gather, and HLSL spells it `GroupMemoryBarrier()` — memory ordering with no
|
|
405
|
+
execution sync, sound because a wave is in lockstep.
|
|
406
|
+
|
|
407
|
+
WGSL has no memory-only workgroup barrier. `workgroupBarrier()` is an execution barrier, the batch
|
|
408
|
+
loop's trip count is per-subgroup, and two subgroups of one workgroup entering it a different number
|
|
409
|
+
of times is a deadlock. Tint refuses it: *"'workgroupBarrier' must only be called from uniform
|
|
410
|
+
control flow"*.
|
|
411
|
+
|
|
412
|
+
So the kernel finds each item's producer by **binary search over the same prefix sums** instead of
|
|
413
|
+
scattering to it — the owner is the largest lane whose base is at or below the index, which stays
|
|
414
|
+
correct when empty lanes repeat a base because a repeat sits at the start of the next producer's run
|
|
415
|
+
rather than the end of the previous one. `log2(subgroup_size)` shuffles, no workgroup memory and no
|
|
416
|
+
barrier anywhere in the file.
|
|
417
|
+
|
|
418
|
+
Probed on Chrome against a real adapter, because two of the rules are not what they look like:
|
|
419
|
+
|
|
420
|
+
| | |
|
|
421
|
+
| --- | --- |
|
|
422
|
+
| a non-uniform `if` that opens and closes | fine — Tint models reconvergence |
|
|
423
|
+
| `workgroupBarrier` after one | fine |
|
|
424
|
+
| `subgroupShuffle` with a non-uniform lane id | fine |
|
|
425
|
+
| a non-uniform-bounded loop with no subgroup op inside | fine, and taints nothing after it |
|
|
426
|
+
| loop bound: literal, `subgroup_size`, uniform buffer field | fine |
|
|
427
|
+
| loop bound through `subgroupAdd` / `subgroupMax` / `subgroupBroadcastFirst` | rejected |
|
|
428
|
+
| non-uniform `break` / `continue` / `return` in a loop with a subgroup op | rejected |
|
|
429
|
+
|
|
430
|
+
The emulator is the other half of this. It runs one invocation at a time and refused the reductions
|
|
431
|
+
and shuffles on the argument that "a reduction over one lane would pass tests a real wave fails" —
|
|
432
|
+
right about what they cover, wrong that there was an alternative. A subgroup kernel must be correct
|
|
433
|
+
at *every* width, WGSL promising nothing about which one a device hands it, so one is a
|
|
434
|
+
configuration rather than a stand-in, and refusing to model it left the kernel with no CPU-tier
|
|
435
|
+
coverage at all. It has them now, at width one, and `vgeo_cut_agreement.spec.js` drives the real
|
|
436
|
+
`main` through them. What that tier cannot see is the redistribution itself; that is a device test.
|
|
437
|
+
|
|
355
438
|
### 4.8 What the review took out: the child-table metric is not a cut structure
|
|
356
439
|
|
|
357
440
|
The plan's first draft claimed the child-table metric copy as the cut's pre-fetch cull, which is
|