@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
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { assert } from "../../../../../core/assert.js";
|
|
1
2
|
import { u32 } from "../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
2
3
|
import { shader_hzb_mesh_filter_2way } from "../../cull/hzb/shader_hzb_mesh_filter_2way.js"
|
|
3
4
|
import { U32_CONTAINER_STRUCT } from "../../../shader/type/U32_CONTAINER_STRUCT.js";
|
|
@@ -44,6 +45,7 @@ export function pass_mesh_cull(data, resources, context) {
|
|
|
44
45
|
|
|
45
46
|
const bucket_id = data.bucket_index;
|
|
46
47
|
|
|
48
|
+
assert.isNonNegativeInteger(bucket_id, 'bucket_id');
|
|
47
49
|
|
|
48
50
|
build_indirect_compute_dispatch_command(
|
|
49
51
|
COMPUTE_SHADER_DEFAULT_GROUP_SIZE,
|
|
@@ -55,17 +57,15 @@ export function pass_mesh_cull(data, resources, context) {
|
|
|
55
57
|
0
|
|
56
58
|
);
|
|
57
59
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
}
|
|
63
|
-
);
|
|
60
|
+
// TODO(chrome-153): transient uniform, not an immediate value — see the shader.
|
|
61
|
+
const u_bucket_index = encoder.allocateTransientValueBuffer(U32_CONTAINER_STRUCT, {
|
|
62
|
+
value: bucket_id,
|
|
63
|
+
});
|
|
64
64
|
|
|
65
65
|
shader_hzb_mesh_filter_2way.dispatchIndirect({
|
|
66
66
|
encoder,
|
|
67
67
|
bindings: {
|
|
68
|
-
bucket_index,
|
|
68
|
+
bucket_index: u_bucket_index,
|
|
69
69
|
camera_previous: view_ctx.gpu_previous_camera_state.buffer,
|
|
70
70
|
bucket_data,
|
|
71
71
|
scene_database: gpu_scene.scene_database_buffer,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph_extract_meshes_from_bucket.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.js"],"names":[],"mappings":"AAUA;;;;;;;;;;GAUG;AACH;IAN+B,KAAK;IACT,OAAO,EAAvB,MAAM;IACU,SAAS,EAAzB,MAAM;IACuB,MAAM;IACjC,MAAM,
|
|
1
|
+
{"version":3,"file":"graph_extract_meshes_from_bucket.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.js"],"names":[],"mappings":"AAUA;;;;;;;;;;GAUG;AACH;IAN+B,KAAK;IACT,OAAO,EAAvB,MAAM;IACU,SAAS,EAAzB,MAAM;IACuB,MAAM;IACjC,MAAM,CAgElB"}
|
|
@@ -1,79 +1,84 @@
|
|
|
1
|
-
import { BufferResourceDescriptor } from "../../../device/graph/BufferResourceDescriptor.js";
|
|
2
|
-
import { u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
3
|
-
import { COMPUTE_SHADER_DEFAULT_GROUP_SIZE } from "../../shader/COMPUTE_SHADER_DEFAULT_GROUP_SIZE.js";
|
|
4
|
-
import {
|
|
5
|
-
build_indirect_compute_dispatch_command,
|
|
6
|
-
INDIRECT_COMPUTE_COMMAND_DESCRIPTOR
|
|
7
|
-
} from "../../gpu_primitive/indirect/IndirectComputeCommandBuildPass.js";
|
|
8
|
-
import { RasterizationCollectionType } from "../expand/RasterizationCollectionType.js";
|
|
9
|
-
import { shader_read_out_bucket } from "../bucket/shader_read_out_bucket.js";
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Extract a single bucket's mesh indices out of a bucket-sorted mesh buffer.
|
|
13
|
-
* Produces a flat {@link COLLECTION_U32_STRUCT_READ} buffer.
|
|
14
|
-
*
|
|
15
|
-
* @param {Object} options
|
|
16
|
-
* @param {FrameGraph} options.graph
|
|
17
|
-
* @param {number} options.buckets bucket-sorted meshes resource ID
|
|
18
|
-
* @param {number} options.bucket_id
|
|
19
|
-
* @param {GPUCollectionLimits} options.limits
|
|
20
|
-
* @returns {number} resource ID of extracted mesh list
|
|
21
|
-
*/
|
|
22
|
-
export function graph_extract_meshes_from_bucket({
|
|
23
|
-
graph,
|
|
24
|
-
buckets,
|
|
25
|
-
bucket_id,
|
|
26
|
-
limits,
|
|
27
|
-
}) {
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
*
|
|
31
|
-
* @param data
|
|
32
|
-
* @param {FramePassResources} resources
|
|
33
|
-
* @param {GraphicsExecutionContext} context
|
|
34
|
-
*/
|
|
35
|
-
function execute(data, resources, context) {
|
|
36
|
-
const encoder = context.encoder;
|
|
37
|
-
|
|
38
|
-
const buckets = resources.get(data.buckets);
|
|
39
|
-
const output = resources.get(data.output);
|
|
40
|
-
const command = resources.get(data.command);
|
|
41
|
-
|
|
42
|
-
const bucket_id = data.bucket_id;
|
|
43
|
-
|
|
44
|
-
build_indirect_compute_dispatch_command(
|
|
45
|
-
COMPUTE_SHADER_DEFAULT_GROUP_SIZE,
|
|
46
|
-
encoder,
|
|
47
|
-
buckets,
|
|
48
|
-
// the bucketed buffer header consists of pairs of u32 values (count,offset)
|
|
49
|
-
bucket_id * (u32.size * 2),
|
|
50
|
-
command,
|
|
51
|
-
0
|
|
52
|
-
);
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
data
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
)
|
|
77
|
-
|
|
78
|
-
|
|
1
|
+
import { BufferResourceDescriptor } from "../../../device/graph/BufferResourceDescriptor.js";
|
|
2
|
+
import { u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
3
|
+
import { COMPUTE_SHADER_DEFAULT_GROUP_SIZE } from "../../shader/COMPUTE_SHADER_DEFAULT_GROUP_SIZE.js";
|
|
4
|
+
import {
|
|
5
|
+
build_indirect_compute_dispatch_command,
|
|
6
|
+
INDIRECT_COMPUTE_COMMAND_DESCRIPTOR
|
|
7
|
+
} from "../../gpu_primitive/indirect/IndirectComputeCommandBuildPass.js";
|
|
8
|
+
import { RasterizationCollectionType } from "../expand/RasterizationCollectionType.js";
|
|
9
|
+
import { PUSH_CONSTANTS, shader_read_out_bucket } from "../bucket/shader_read_out_bucket.js";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Extract a single bucket's mesh indices out of a bucket-sorted mesh buffer.
|
|
13
|
+
* Produces a flat {@link COLLECTION_U32_STRUCT_READ} buffer.
|
|
14
|
+
*
|
|
15
|
+
* @param {Object} options
|
|
16
|
+
* @param {FrameGraph} options.graph
|
|
17
|
+
* @param {number} options.buckets bucket-sorted meshes resource ID
|
|
18
|
+
* @param {number} options.bucket_id
|
|
19
|
+
* @param {GPUCollectionLimits} options.limits
|
|
20
|
+
* @returns {number} resource ID of extracted mesh list
|
|
21
|
+
*/
|
|
22
|
+
export function graph_extract_meshes_from_bucket({
|
|
23
|
+
graph,
|
|
24
|
+
buckets,
|
|
25
|
+
bucket_id,
|
|
26
|
+
limits,
|
|
27
|
+
}) {
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
*
|
|
31
|
+
* @param data
|
|
32
|
+
* @param {FramePassResources} resources
|
|
33
|
+
* @param {GraphicsExecutionContext} context
|
|
34
|
+
*/
|
|
35
|
+
function execute(data, resources, context) {
|
|
36
|
+
const encoder = context.encoder;
|
|
37
|
+
|
|
38
|
+
const buckets = resources.get(data.buckets);
|
|
39
|
+
const output = resources.get(data.output);
|
|
40
|
+
const command = resources.get(data.command);
|
|
41
|
+
|
|
42
|
+
const bucket_id = data.bucket_id;
|
|
43
|
+
|
|
44
|
+
build_indirect_compute_dispatch_command(
|
|
45
|
+
COMPUTE_SHADER_DEFAULT_GROUP_SIZE,
|
|
46
|
+
encoder,
|
|
47
|
+
buckets,
|
|
48
|
+
// the bucketed buffer header consists of pairs of u32 values (count,offset)
|
|
49
|
+
bucket_id * (u32.size * 2),
|
|
50
|
+
command,
|
|
51
|
+
0
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
// TODO(chrome-153): transient uniform, not an immediate value — see the shader.
|
|
55
|
+
const u_settings = encoder.allocateTransientValueBuffer(PUSH_CONSTANTS, {
|
|
56
|
+
bucket_id,
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
shader_read_out_bucket.dispatchIndirect({
|
|
60
|
+
encoder,
|
|
61
|
+
command,
|
|
62
|
+
bindings: {
|
|
63
|
+
settings: u_settings,
|
|
64
|
+
input: buckets,
|
|
65
|
+
output,
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const data = {};
|
|
71
|
+
|
|
72
|
+
const pass = graph.add("extract meshes from bucket", data, execute);
|
|
73
|
+
|
|
74
|
+
data.buckets = pass.read(buckets);
|
|
75
|
+
data.bucket_id = bucket_id;
|
|
76
|
+
data.command = pass.create("command", INDIRECT_COMPUTE_COMMAND_DESCRIPTOR);
|
|
77
|
+
data.output = pass.create("output", BufferResourceDescriptor.from(
|
|
78
|
+
limits.compute_buffer_size(RasterizationCollectionType.Meshes),
|
|
79
|
+
GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
|
|
80
|
+
0, 16 // clear count
|
|
81
|
+
));
|
|
82
|
+
|
|
83
|
+
return data.output;
|
|
79
84
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph_rasterize_partial_opaque.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"graph_rasterize_partial_opaque.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js"],"names":[],"mappings":"AAyBA;;;;;;;;;;;;;;;GAeG;AACH,gMAFa;IAAC,eAAe,EAAC,MAAM,CAAC;IAAC,cAAc,EAAC,MAAM,CAAC;IAAC,KAAK,EAAC,MAAM,CAAC;IAAC,aAAa,EAAC,MAAM,EAAE,CAAA;CAAC,CA6MjG"}
|
|
@@ -3,6 +3,7 @@ import { noop } from "../../../../core/function/noop.js";
|
|
|
3
3
|
import { BufferResourceDescriptor } from "../../../device/graph/BufferResourceDescriptor.js";
|
|
4
4
|
import { u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
5
5
|
import { shader_hzb_mesh_filter_2way } from "../cull/hzb/shader_hzb_mesh_filter_2way.js";
|
|
6
|
+
import { U32_CONTAINER_STRUCT } from "../../shader/type/U32_CONTAINER_STRUCT.js";
|
|
6
7
|
import { ShadeDrawMode } from "../../material/ShadeDrawMode.js";
|
|
7
8
|
import { ShadeDrawSide } from "../../material/ShadeDrawSide.js";
|
|
8
9
|
import { TransparencyMode } from "../../material/TransparencyMode.js";
|
|
@@ -95,11 +96,16 @@ export function graph_rasterize_partial_opaque({
|
|
|
95
96
|
0
|
|
96
97
|
);
|
|
97
98
|
|
|
99
|
+
// TODO(chrome-153): transient uniform, not an immediate value — see the shader.
|
|
100
|
+
const u_bucket_index = encoder.allocateTransientValueBuffer(U32_CONTAINER_STRUCT, {
|
|
101
|
+
value: bucket_index,
|
|
102
|
+
});
|
|
103
|
+
|
|
98
104
|
// split 2 ways
|
|
99
105
|
shader_hzb_mesh_filter_2way.dispatchIndirect({
|
|
100
106
|
encoder,
|
|
101
107
|
bindings: {
|
|
102
|
-
bucket_index:
|
|
108
|
+
bucket_index: u_bucket_index,
|
|
103
109
|
camera_previous,
|
|
104
110
|
bucket_data: buckets,
|
|
105
111
|
scene_database: scene_ctx.scene_database_buffer,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph_rasterize_remaining_opaque.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"graph_rasterize_remaining_opaque.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js"],"names":[],"mappings":"AAgGA;;;;;;;;;;;;;;;;;GAiBG;AACH,kOAFa;IAAC,KAAK,EAAC,MAAM,CAAC;IAAC,aAAa,EAAC,MAAM,EAAE,CAAA;CAAC,CA4GlD"}
|
|
@@ -10,6 +10,7 @@ import { build_indirect_compute_dispatch_command } from "../../gpu_primitive/ind
|
|
|
10
10
|
import { rasterization_material_bucket } from "../expand/bucket/chunk_rasterization_material_bucket.js";
|
|
11
11
|
import { graph_sort_meshlets_by_bucket_id } from "../expand/bucket/meshlet/graph_sort_meshlets_by_bucket_id.js";
|
|
12
12
|
import { shader_meshlets_extract_bucket } from "../expand/bucket/meshlet/shader_meshlets_extract_bucket.js";
|
|
13
|
+
import { U32_CONTAINER_STRUCT } from "../../shader/type/U32_CONTAINER_STRUCT.js";
|
|
13
14
|
import { graph_mesh_filter_one_way } from "../expand/graph_mesh_filter_one_way.js";
|
|
14
15
|
import { graph_meshlets_filter_one_way } from "../expand/graph_meshlets_filter_one_way.js";
|
|
15
16
|
import { graph_meshlets_rasterize } from "../expand/graph_meshlets_rasterize.js";
|
|
@@ -58,11 +59,16 @@ function graph_extract_meshlets_from_bucket({
|
|
|
58
59
|
0
|
|
59
60
|
);
|
|
60
61
|
|
|
62
|
+
// TODO(chrome-153): transient uniform, not an immediate value — see the shader.
|
|
63
|
+
const u_bucket_index = encoder.allocateTransientValueBuffer(U32_CONTAINER_STRUCT, {
|
|
64
|
+
value: bucket_id,
|
|
65
|
+
});
|
|
66
|
+
|
|
61
67
|
shader_meshlets_extract_bucket.dispatchIndirect({
|
|
62
68
|
encoder,
|
|
63
69
|
command,
|
|
64
70
|
bindings: {
|
|
65
|
-
bucket_index:
|
|
71
|
+
bucket_index: u_bucket_index,
|
|
66
72
|
bucket_data: buckets,
|
|
67
73
|
output: output,
|
|
68
74
|
}
|
|
@@ -57,6 +57,14 @@ export class GPUSceneContext {
|
|
|
57
57
|
* @returns {GPUVirtualGeometryRuntime|undefined}
|
|
58
58
|
*/
|
|
59
59
|
get virtual_geometry(): GPUVirtualGeometryRuntime;
|
|
60
|
+
/**
|
|
61
|
+
* @returns {VGeoResidency|undefined}
|
|
62
|
+
*/
|
|
63
|
+
get virtual_geometry_residency(): VGeoResidency;
|
|
64
|
+
/**
|
|
65
|
+
* @returns {VGeoFeedbackLoop|undefined}
|
|
66
|
+
*/
|
|
67
|
+
get virtual_geometry_feedback(): VGeoFeedbackLoop;
|
|
60
68
|
/**
|
|
61
69
|
* Give this scene a virtual-geometry runtime, sharing the meshlet pool with everything else it
|
|
62
70
|
* draws.
|
|
@@ -65,11 +73,20 @@ export class GPUSceneContext {
|
|
|
65
73
|
* records naming rows of the same metadata buffer a static mesh's meshlets live in, so nothing
|
|
66
74
|
* downstream of the expansion has to know which kind of geometry it is looking at.
|
|
67
75
|
*
|
|
76
|
+
* And the residency and the feedback loop with it, so that an engine host gets the whole
|
|
77
|
+
* streaming loop by enabling virtual geometry rather than by wiring four objects itself
|
|
78
|
+
* (REVIEW_LEDGER U1): `register` a container with {@link virtual_geometry_residency}, call
|
|
79
|
+
* {@link virtual_geometry_feedback}'s `read` once a frame after the last rasterization path,
|
|
80
|
+
* and every page after the root arrives because the cut asked for it.
|
|
81
|
+
*
|
|
68
82
|
* @param {Object} [options] passed to {@link GPUVirtualGeometryPool} and
|
|
69
|
-
* {@link GPUVirtualGeometryRuntime}
|
|
83
|
+
* {@link GPUVirtualGeometryRuntime}, except for `residency`
|
|
84
|
+
* @param {VGeoResidencyOptions} [options.residency] every knob of both residency tiers
|
|
70
85
|
* @returns {GPUVirtualGeometryRuntime}
|
|
71
86
|
*/
|
|
72
|
-
enable_virtual_geometry(options?:
|
|
87
|
+
enable_virtual_geometry(options?: {
|
|
88
|
+
residency?: VGeoResidencyOptions;
|
|
89
|
+
}): GPUVirtualGeometryRuntime;
|
|
73
90
|
/**
|
|
74
91
|
* @returns {GPUAnimationManager}
|
|
75
92
|
*/
|
|
@@ -183,6 +200,9 @@ import { GPULightCollection } from "../light/GPULightCollection.js";
|
|
|
183
200
|
import { GPULightProbeVolume } from "../global_illumination/lpv/GPULightProbeVolume.js";
|
|
184
201
|
import { GPUInstancesAccelerationStructure } from "./GPUInstancesAccelerationStructure.js";
|
|
185
202
|
import { GPUVirtualGeometryRuntime } from "../geometry/virtual/runtime/GPUVirtualGeometryRuntime.js";
|
|
203
|
+
import { VGeoResidency } from "../geometry/virtual/runtime/VGeoResidency.js";
|
|
204
|
+
import { VGeoFeedbackLoop } from "../geometry/virtual/runtime/VGeoFeedbackLoop.js";
|
|
205
|
+
import { VGeoResidencyOptions } from "../geometry/virtual/runtime/VGeoResidencyOptions.js";
|
|
186
206
|
import { GPUAnimationManager } from "../animation/GPUAnimationManager.js";
|
|
187
207
|
import { GPUDatabase } from "../buffer/table/GPUDatabase.js";
|
|
188
208
|
import { GPUMeshSkinningContext } from "../animation/skinning/GPUMeshSkinningContext.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GPUSceneContext.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/scene/GPUSceneContext.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GPUSceneContext.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/scene/GPUSceneContext.js"],"names":[],"mappings":"AAmEA;;;;;;;;;GASG;AACH;IA0II;;;;OAIG;IACH,sBAHW,eAAe,SACf,KAAK,EAiCf;IA5KD;;;OAGG;IACH,aAFU,MAAM,CAEE;IAElB;;OAEG;IACH,YAFU,kBAAkB,CAEjB;IAEX;;OAEG;IACH,WAFU,kBAAkB,CAElB;IAGV;;OAEG;IACH,sBAFU,cAAc,CAEH;IASrB;;;OAGG;IACH,mBAEC;IAOD,uCAEC;IAQD;;;OAGG;IACH,iCAEC;IAOD;;;OAGG;IACH,8CAEC;IAOD;;;OAGG;IACH,8CAEC;IAoHD;;OAEG;IACH,kDAEC;IAED;;OAEG;IACH,gDAEC;IAED;;OAEG;IACH,kDAEC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH;QAH0C,SAAS,GAAxC,oBAAoB;QAClB,yBAAyB,CAmCrC;IAED;;OAEG;IACH,6CAEC;IAYD;;;OAGG;IACH,kCAEC;IAED;;;;;OAKG;IACH,uCAEC;IAED;;;;;;;;;;;OAWG;IACH,uCAUC;IAED,+BAUC;IAED;;;;;;;;;;OAUG;IACH,yBAEC;IAED;;;;;OAKG;IACH,sCAMC;IAOD;;;;;;;OAOG;IACH,8EAEC;IA0BD;;;;OAIG;IACH,cAqEC;IAED;;;OAGG;IACH,YAFW,eAAe,QA0BzB;IAED;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,cAHW,sBAAsB,cACtB,MAAM,QAuBhB;IAoCD,gBAYC;IAIL;;;OAGG;IACH,4BAFU,OAAO,CAE0B;;CAN1C;8BA1pBY,OAAO,uBAAuB,EAAE,eAAe;iCAC/C,OAAO,mCAAmC,EAAE,kBAAkB;iCAC9D,OAAO,mCAAmC,EAAE,kBAAkB;4BAC9D,OAAO,8BAA8B,EAAE,aAAa;8BACpD,OAAO,iDAAiD,EAAE,eAAe;+BAtBvD,iDAAiD;sBAI1D,YAAY;oCADE,uCAAuC;mCADxC,gCAAgC;oCAD/B,mDAAmD;kDAIrC,wCAAwC;0CAfhD,0DAA0D;8BAItE,8CAA8C;iCAF3C,iDAAiD;qCAG7C,qDAAqD;oCAGtD,qCAAqC;4BAC7C,gCAAgC;uCAOrB,iDAAiD;6BAM3D,wBAAwB;wCADb,mCAAmC;uCAdpC,wCAAwC"}
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { GPUVirtualGeometryPool } from "../geometry/virtual/runtime/GPUVirtualGeometryPool.js";
|
|
2
2
|
import { GPUVirtualGeometryRuntime } from "../geometry/virtual/runtime/GPUVirtualGeometryRuntime.js";
|
|
3
|
+
import { make_vgeo_page_worker } from "../geometry/virtual/runtime/make_vgeo_page_worker.js";
|
|
4
|
+
import { VGeoFeedbackLoop } from "../geometry/virtual/runtime/VGeoFeedbackLoop.js";
|
|
5
|
+
import { VGeoPageFetcher } from "../geometry/virtual/runtime/VGeoPageFetcher.js";
|
|
6
|
+
import { VGeoResidency } from "../geometry/virtual/runtime/VGeoResidency.js";
|
|
7
|
+
import { VGeoResidencyOptions } from "../geometry/virtual/runtime/VGeoResidencyOptions.js";
|
|
3
8
|
import { assert } from "../../../core/assert.js";
|
|
4
9
|
import { ShadeGPUCommandContext } from "../../device/ShadeGPUCommandContext.js";
|
|
5
10
|
import { GPUAnimationManager } from "../animation/GPUAnimationManager.js";
|
|
@@ -258,6 +263,20 @@ export class GPUSceneContext {
|
|
|
258
263
|
*/
|
|
259
264
|
#virtual_geometry;
|
|
260
265
|
|
|
266
|
+
/**
|
|
267
|
+
* Both tiers of virtual-geometry residency, once {@link enable_virtual_geometry} has run.
|
|
268
|
+
* @type {VGeoResidency|undefined}
|
|
269
|
+
*/
|
|
270
|
+
#virtual_geometry_residency;
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* The feedback loop that carries the cut's readings into the residency, once
|
|
274
|
+
* {@link enable_virtual_geometry} has run. A host calls its `read` once a frame after every
|
|
275
|
+
* rasterization path has cut.
|
|
276
|
+
* @type {VGeoFeedbackLoop|undefined}
|
|
277
|
+
*/
|
|
278
|
+
#virtual_geometry_feedback;
|
|
279
|
+
|
|
261
280
|
/**
|
|
262
281
|
* @returns {GPUVirtualGeometryRuntime|undefined}
|
|
263
282
|
*/
|
|
@@ -265,6 +284,20 @@ export class GPUSceneContext {
|
|
|
265
284
|
return this.#virtual_geometry;
|
|
266
285
|
}
|
|
267
286
|
|
|
287
|
+
/**
|
|
288
|
+
* @returns {VGeoResidency|undefined}
|
|
289
|
+
*/
|
|
290
|
+
get virtual_geometry_residency() {
|
|
291
|
+
return this.#virtual_geometry_residency;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* @returns {VGeoFeedbackLoop|undefined}
|
|
296
|
+
*/
|
|
297
|
+
get virtual_geometry_feedback() {
|
|
298
|
+
return this.#virtual_geometry_feedback;
|
|
299
|
+
}
|
|
300
|
+
|
|
268
301
|
/**
|
|
269
302
|
* Give this scene a virtual-geometry runtime, sharing the meshlet pool with everything else it
|
|
270
303
|
* draws.
|
|
@@ -273,8 +306,15 @@ export class GPUSceneContext {
|
|
|
273
306
|
* records naming rows of the same metadata buffer a static mesh's meshlets live in, so nothing
|
|
274
307
|
* downstream of the expansion has to know which kind of geometry it is looking at.
|
|
275
308
|
*
|
|
309
|
+
* And the residency and the feedback loop with it, so that an engine host gets the whole
|
|
310
|
+
* streaming loop by enabling virtual geometry rather than by wiring four objects itself
|
|
311
|
+
* (REVIEW_LEDGER U1): `register` a container with {@link virtual_geometry_residency}, call
|
|
312
|
+
* {@link virtual_geometry_feedback}'s `read` once a frame after the last rasterization path,
|
|
313
|
+
* and every page after the root arrives because the cut asked for it.
|
|
314
|
+
*
|
|
276
315
|
* @param {Object} [options] passed to {@link GPUVirtualGeometryPool} and
|
|
277
|
-
* {@link GPUVirtualGeometryRuntime}
|
|
316
|
+
* {@link GPUVirtualGeometryRuntime}, except for `residency`
|
|
317
|
+
* @param {VGeoResidencyOptions} [options.residency] every knob of both residency tiers
|
|
278
318
|
* @returns {GPUVirtualGeometryRuntime}
|
|
279
319
|
*/
|
|
280
320
|
enable_virtual_geometry(options = {}) {
|
|
@@ -282,16 +322,31 @@ export class GPUSceneContext {
|
|
|
282
322
|
return this.#virtual_geometry;
|
|
283
323
|
}
|
|
284
324
|
|
|
325
|
+
const { residency = new VGeoResidencyOptions(), ...rest } = options;
|
|
326
|
+
|
|
285
327
|
const pool = new GPUVirtualGeometryPool({
|
|
286
328
|
device: this.#device,
|
|
287
329
|
meshlets: this.geometries.meshlets,
|
|
288
|
-
...
|
|
330
|
+
...rest,
|
|
289
331
|
});
|
|
290
332
|
|
|
291
333
|
this.#virtual_geometry = new GPUVirtualGeometryRuntime({
|
|
292
334
|
pool,
|
|
293
|
-
|
|
294
|
-
|
|
335
|
+
...rest,
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
// pages are fetched, verified and decoded on workers, spawned on first use; a host with no
|
|
339
|
+
// Worker gets the same fetch in-process
|
|
340
|
+
const fetcher = new VGeoPageFetcher({
|
|
341
|
+
worker_count: residency.worker_count,
|
|
342
|
+
make_worker: typeof Worker === 'undefined' ? undefined : make_vgeo_page_worker,
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
this.#virtual_geometry_residency = new VGeoResidency({ pool, options: residency, fetcher });
|
|
346
|
+
|
|
347
|
+
this.#virtual_geometry_feedback = new VGeoFeedbackLoop({
|
|
348
|
+
runtime: this.#virtual_geometry,
|
|
349
|
+
residency: this.#virtual_geometry_residency,
|
|
295
350
|
});
|
|
296
351
|
|
|
297
352
|
return this.#virtual_geometry;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ShaderResourceSetDescriptor.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ShaderResourceSetDescriptor.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js"],"names":[],"mappings":"AAuIA;IAoBI;;OAEG;IACH;cAFoB,MAAM;cAAQ,UAAU;MAI3C;IAED;;;;;OAKG;IACH,4BAMC;IAED;;;;;;;;;;;;OAYG;IACH,mBALW,MAAM,SACN,UAAU,GAAC,MAAM,GAEf,IAAI,CAoDhB;IAED;;;OAGG;IACH,8CAEC;IAGD;;;OAGG;IACH,6CAEC;IAaD;;;;OAIG;IACH;;;;;;;;;;;OAWG;IACH,sBAHW,MAAM,GACJ,OAAO,CAInB;IAED,+FAYC;IAED;;;;;;OAMG;IACH;QAJ4B,KAAK,GAAtB,MAAM;QACW,KAAK,GAAtB,MAAM;QACJ,6BAA6B,CAsBzC;IAED;;;;OAIG;IACH,gBAHW,6BAA6B,GAC3B,OAAO,CAQnB;IAED;;;OAGG;IACH,qBAFW,iBAAe,MAAM,QAW/B;IAED;;OAEG;IACH,oCAFa,wBAAwB,CAiBpC;IAED;;;OAGG;IACH,yBAFY,EAAE,EAAE,CAcf;IAED;;;;OAIG;IACH,8BAHW,iBAAe,MAAM,GACnB,wBAAwB,CAMpC;IAED;;;;;OAKG;IACH,qCAHW,sBAAsB,GACpB,oBAAoB,EAAE,CAgBlC;IAED;;;OAGG;IACH,qBAFY,SAAS,CAwGpB;IAED;;;;;;;;;;;;;;;OAeG;IACH,iCAHW,YAAY,GACV,OAAO,CAwFnB;;CACJ;;eA2BS,SAAS,2BAA2B,CAAC;;2BA1oBlC,OAAO,yCAAyC,EAAE,YAAY;qCAC9D,OAAO,2CAA2C,EAAE,sBAAsB;yBAC1E,OAAO,uBAAuB,EAAE,UAAU;8CALT,oCAAoC;yCAZzC,0DAA0D;0BAIzE,0BAA0B"}
|
|
@@ -11,6 +11,7 @@ import { CodeChunk } from "../compiler/CodeChunk.js";
|
|
|
11
11
|
import { parse_wgsl_type } from "../type/parse_wgsl_type.js";
|
|
12
12
|
import { type_has_arrays } from "../type/type_has_arrays.js";
|
|
13
13
|
import { type_has_atomics } from "../type/type_has_atomics.js";
|
|
14
|
+
import { WebGPUStruct } from "../type/WebGPUStruct.js";
|
|
14
15
|
import { write_wgsl_type_value } from "../type/serde/write_gpu_typed_buffer.js";
|
|
15
16
|
import { IMMEDIATE_ADDRESS_SPACE_EXTENSION, IMMEDIATE_SIZE_FLOOR } from "./IMMEDIATE_DATA.js";
|
|
16
17
|
import { ResourceType } from "./ResourceType.js";
|
|
@@ -226,7 +227,14 @@ export class ShaderResourceSetDescriptor {
|
|
|
226
227
|
);
|
|
227
228
|
}
|
|
228
229
|
|
|
229
|
-
|
|
230
|
+
// The top-level member names, kept so that `writeImmediate` can tell a value of this type
|
|
231
|
+
// from something that merely happens to be an object. `undefined` for a scalar, vector or
|
|
232
|
+
// matrix immediate, which has no members to name.
|
|
233
|
+
const field_names = type instanceof WebGPUStruct
|
|
234
|
+
? type.fields.map(field => field.name)
|
|
235
|
+
: undefined;
|
|
236
|
+
|
|
237
|
+
this.#immediate = { name, type, field_names };
|
|
230
238
|
|
|
231
239
|
return this;
|
|
232
240
|
}
|
|
@@ -561,27 +569,73 @@ export class ShaderResourceSetDescriptor {
|
|
|
561
569
|
);
|
|
562
570
|
}
|
|
563
571
|
|
|
572
|
+
// Refuse a value of the wrong shape rather than serialise what it does not contain.
|
|
573
|
+
//
|
|
574
|
+
// The whole declared range travels every dispatch, and the zeroes this method clears it to are
|
|
575
|
+
// indistinguishable from deliberate ones: every slot ends up *set*, so WebGPU's immediate
|
|
576
|
+
// validation — and the software device's copy of it — has nothing to report. A wrong-shaped
|
|
577
|
+
// value therefore reaches the shader as zeroes, silently, and the only symptom is wrong
|
|
578
|
+
// output. That is what a call site left behind by the uniform -> immediate migration does: it
|
|
579
|
+
// keeps handing over the transient GPUBuffer the uniform needed, `generateBindings` ignores
|
|
580
|
+
// the extra key so the buffer is never bound, and nothing on a GPUBuffer matches the type.
|
|
581
|
+
//
|
|
582
|
+
// A value that names *some* of the members is left alone. Structs carry explicit padding
|
|
583
|
+
// members the CPU side has no value for, and skipping absent fields is load-bearing anyway
|
|
584
|
+
// (GPUTypedTable#set_range writes one member of a record through the same serialiser). Only a
|
|
585
|
+
// value that could not have populated the type at all is an unambiguous mistake.
|
|
586
|
+
const field_names = immediate.field_names;
|
|
587
|
+
|
|
588
|
+
if (field_names === undefined) {
|
|
589
|
+
// Scalar, vector or matrix: the serialiser reads the value as a number or indexes it.
|
|
590
|
+
const usable = typeof value === "number"
|
|
591
|
+
|| typeof value === "boolean"
|
|
592
|
+
|| typeof value[0] === "number";
|
|
593
|
+
|
|
594
|
+
if (!usable) {
|
|
595
|
+
throw new Error(
|
|
596
|
+
`Immediate data '${immediate.name}' of type '${immediate.type}' was given a value the`
|
|
597
|
+
+ ` serialiser cannot read as a number: '${value}'. An immediate takes the plain value,`
|
|
598
|
+
+ ` not something bindable — a GPUBuffer is what a *uniform* binding wants, and one`
|
|
599
|
+
+ ` passed here is ignored by generateBindings and would serialise as zeroes.`
|
|
600
|
+
);
|
|
601
|
+
}
|
|
602
|
+
} else if (!value_names_a_member(value, field_names)) {
|
|
603
|
+
// Note: no `${immediate.type}` in the message. Interpolating a struct type runs its whole
|
|
604
|
+
// WGSL declaration through the code generator, and the member list is the actionable half
|
|
605
|
+
// of that anyway.
|
|
606
|
+
throw new Error(
|
|
607
|
+
`Immediate data '${immediate.name}' was given a value naming none of its members`
|
|
608
|
+
+ ` (${field_names.join(', ')}), so the dispatch would have read zeroes. An immediate`
|
|
609
|
+
+ ` takes the plain value — '{ ${field_names[0]}: ... }' — not`
|
|
610
|
+
+ ` something bindable: a GPUBuffer is what a *uniform* binding wants, and one passed`
|
|
611
|
+
+ ` here is ignored by generateBindings and serialises to nothing.`
|
|
612
|
+
);
|
|
613
|
+
}
|
|
614
|
+
|
|
564
615
|
const start = buffer.position;
|
|
565
616
|
const size = this.immediateSize;
|
|
566
617
|
|
|
567
618
|
buffer.ensureCapacity(start + size);
|
|
568
619
|
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
// Zero-fill out to the declared size rather than stopping where the last member ended.
|
|
620
|
+
// Clear the whole declared range up front, rather than filling in from wherever the
|
|
621
|
+
// serialiser's cursor stopped.
|
|
572
622
|
//
|
|
573
|
-
//
|
|
574
|
-
// `{vec4f, u32}`, 20 bytes written of a
|
|
575
|
-
//
|
|
576
|
-
//
|
|
577
|
-
// the pipeline layout declares,
|
|
578
|
-
// nobody changes how either number is derived.
|
|
579
|
-
//
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
623
|
+
// Two reasons, and the second is the one that bites. The first: the serialiser stops after the
|
|
624
|
+
// final member, so a struct with trailing padding — say `{vec4f, u32}`, 20 bytes written of a
|
|
625
|
+
// 32-byte type — leaves a tail. That tail is padding, WebGPU's AccessibleSlots excludes
|
|
626
|
+
// padding, and a short write would in fact validate; it would also make the bytes handed to
|
|
627
|
+
// `setImmediates` shorter than the `immediateSize` the pipeline layout declares, true-but-subtle
|
|
628
|
+
// in a way that only holds as long as nobody changes how either number is derived.
|
|
629
|
+
//
|
|
630
|
+
// The second: this buffer is one scratch region reused by every dispatch of a context, and it
|
|
631
|
+
// is only ever written over, never cleared. A member the value did not name is skipped, and a
|
|
632
|
+
// skipped member before the final one is not in the tail — filling from the cursor left it
|
|
633
|
+
// holding the bytes the *previous* dispatch put at that offset. A partial value is legal (see
|
|
634
|
+
// above), so that made one dispatch's immediate data a function of the one before it. Clearing
|
|
635
|
+
// first closes the holes and the tail together, and costs at most 64 bytes of memset.
|
|
636
|
+
buffer.raw_bytes.fill(0, start, start + size);
|
|
637
|
+
|
|
638
|
+
write_wgsl_type_value(value, buffer, immediate.type);
|
|
585
639
|
|
|
586
640
|
buffer.position = start + size;
|
|
587
641
|
|
|
@@ -589,6 +643,28 @@ export class ShaderResourceSetDescriptor {
|
|
|
589
643
|
}
|
|
590
644
|
}
|
|
591
645
|
|
|
646
|
+
/**
|
|
647
|
+
* Whether `value` carries at least one of `field_names`.
|
|
648
|
+
*
|
|
649
|
+
* A plain loop, and a free function rather than a closure over `value`, because
|
|
650
|
+
* {@link ShaderResourceSetDescriptor#writeImmediate} runs once per dispatch and allocates nothing.
|
|
651
|
+
*
|
|
652
|
+
* @param {Object} value
|
|
653
|
+
* @param {string[]} field_names
|
|
654
|
+
* @returns {boolean}
|
|
655
|
+
*/
|
|
656
|
+
function value_names_a_member(value, field_names) {
|
|
657
|
+
const count = field_names.length;
|
|
658
|
+
|
|
659
|
+
for (let i = 0; i < count; i++) {
|
|
660
|
+
if (value[field_names[i]] !== undefined) {
|
|
661
|
+
return true;
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
return false;
|
|
666
|
+
}
|
|
667
|
+
|
|
592
668
|
/**
|
|
593
669
|
* Special immutable empty set
|
|
594
670
|
* @readonly
|
|
@@ -90,6 +90,10 @@ export class GPUViewContext {
|
|
|
90
90
|
* @returns {GPUCameraContext}
|
|
91
91
|
*/
|
|
92
92
|
get gpu_previous_camera_state(): GPUCameraContext;
|
|
93
|
+
/**
|
|
94
|
+
* @return {VGeoViewCut}
|
|
95
|
+
*/
|
|
96
|
+
get virtual_geometry_cut(): VGeoViewCut;
|
|
93
97
|
/**
|
|
94
98
|
*
|
|
95
99
|
* @return {GPUCameraContext}
|
|
@@ -136,4 +140,5 @@ import { HierarchicalZBuffer } from "../hiz/HierarchicalZBuffer.js";
|
|
|
136
140
|
import { GPUTypedBuffer } from "../buffer/GPUTypedBuffer.js";
|
|
137
141
|
import { GPUViewVolumetrics } from "../volumetrics/GPUViewVolumetrics.js";
|
|
138
142
|
import { GPUCameraContext } from "../camera/GPUCameraContext.js";
|
|
143
|
+
import { VGeoViewCut } from "../geometry/virtual/runtime/VGeoViewCut.js";
|
|
139
144
|
//# sourceMappingURL=GPUViewContext.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GPUViewContext.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/view/GPUViewContext.js"],"names":[],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"GPUViewContext.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/view/GPUViewContext.js"],"names":[],"mappings":";;;;;;;;AAgCA;;GAEG;AACH;IAiPI;;;;;OAKG;IACH,sBAJW,eAAe,SACf,eAAe,UACf,gBAAgB,EAyB1B;IA5QD;;;OAGG;IACH,aAFU,MAAM,CAEE;IAElB;;;OAGG;IACH,OAFU,MAAM,CAEL;IAuBX;;;;OAIG;IACH,mBAHW,MAAM,KACN,MAAM,QAiBhB;IAED;;;;OAIG;IACH,aAHW,MAAM,KACN,MAAM,QAQhB;IAED;;;;OAIG;IACH,kBAHW,MAAM,KACN,MAAM,QAOhB;IAED,wEAAwE;IACxE,2BAAqC;IAErC,6BAA6B;IAC7B,8BAEC;IAQD;;;OAGG;IACH,0BAEC;IAED;;;;OAIG;IACH,mBAHW,MAAM,KACN,MAAM,QAUhB;IAgBD;;;OAGG;IACH,kDAEC;IAdD;;;OAGG;IACH,iDAEC;IAgBD;;;OAGG;IACH,qCAEC;IAQD;;;OAGG;IACH,sCAEC;IA4BD;;;OAGG;IACH,mDAEC;IAdD;;;OAGG;IACH,kDAEC;IAyBD;;OAEG;IACH,wCAEC;IAED;;;OAGG;IACH,+BAEC;IAED;;;OAGG;IACH,mEAEC;IAiCD;;;;OAIG;IACH,cAHW,cAAc,GACZ,OAAO,CAWnB;IAED;;;OAGG;IACH,QAFY,MAAM,CAIjB;IAED,wBA6BC;IAGD;;;OAGG;IACH,YAFW,eAAe,QAWzB;IAED;;OAEG;IACH,0BAFW,sBAAsB,QAShC;IAED,gBAkBC;IAGL;;;OAGG;IACH,2BAFU,OAAO,CAEwB;;CANxC;qCA1YY,OAAO,wCAAwC,EAAE,sBAAsB;8BACvE,OAAO,uBAAuB,EAAE,eAAe;8BAC/C,OAAO,6BAA6B,EAAE,eAAe;oCAP9B,+BAA+B;+BAHpC,6BAA6B;mCAIzB,sCAAsC;iCAHxC,+BAA+B;4BACpC,4CAA4C"}
|