@woosh/meep-engine 3.23.0 → 3.24.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/editor/entity_world_bounds.d.ts +9 -3
- package/editor/entity_world_bounds.d.ts.map +1 -1
- package/editor/entity_world_bounds.js +61 -4
- package/package.json +1 -1
- package/src/core/binary/allocator/OffsetAllocator.d.ts +40 -2
- package/src/core/binary/allocator/OffsetAllocator.d.ts.map +1 -1
- package/src/core/binary/allocator/OffsetAllocator.js +124 -29
- package/src/core/collection/map/u32_index.d.ts +83 -0
- package/src/core/collection/map/u32_index.d.ts.map +1 -0
- package/src/core/collection/map/u32_index.js +247 -0
- package/src/engine/asset/loaders/GLTFSceneBundleAssetLoader.d.ts +2 -2
- package/src/engine/asset/loaders/GLTFSceneBundleAssetLoader.js +2 -2
- package/src/engine/asset/loaders/USDSceneBundleAssetLoader.d.ts +1 -2
- package/src/engine/asset/loaders/USDSceneBundleAssetLoader.d.ts.map +1 -1
- package/src/engine/asset/loaders/USDSceneBundleAssetLoader.js +4 -12
- package/src/engine/ecs/gpu/GPUStateAuthority.d.ts +55 -0
- package/src/engine/ecs/gpu/GPUStateAuthority.d.ts.map +1 -0
- package/src/engine/ecs/gpu/GPUStateAuthority.js +72 -0
- package/src/engine/ecs/gpu/GPUStateAuthorityFlags.d.ts +40 -0
- package/src/engine/ecs/gpu/GPUStateAuthorityFlags.d.ts.map +1 -0
- package/src/engine/ecs/gpu/GPUStateAuthorityFlags.js +79 -0
- package/src/engine/ecs/gpu/gpu_authority_assert_cpu.d.ts +18 -0
- package/src/engine/ecs/gpu/gpu_authority_assert_cpu.d.ts.map +1 -0
- package/src/engine/ecs/gpu/gpu_authority_assert_cpu.js +27 -0
- package/src/engine/ecs/gpu/gpu_authority_declare.d.ts +23 -0
- package/src/engine/ecs/gpu/gpu_authority_declare.d.ts.map +1 -0
- package/src/engine/ecs/gpu/gpu_authority_declare.js +39 -0
- package/src/engine/ecs/gpu/gpu_authority_grant.d.ts +15 -0
- package/src/engine/ecs/gpu/gpu_authority_grant.d.ts.map +1 -0
- package/src/engine/ecs/gpu/gpu_authority_grant.js +38 -0
- package/src/engine/ecs/gpu/gpu_authority_has.d.ts +18 -0
- package/src/engine/ecs/gpu/gpu_authority_has.d.ts.map +1 -0
- package/src/engine/ecs/gpu/gpu_authority_has.js +28 -0
- package/src/engine/ecs/gpu/gpu_authority_revoke.d.ts +24 -0
- package/src/engine/ecs/gpu/gpu_authority_revoke.d.ts.map +1 -0
- package/src/engine/ecs/gpu/gpu_authority_revoke.js +49 -0
- package/src/engine/ecs/ik/IKProblem.d.ts +14 -0
- package/src/engine/ecs/ik/IKProblem.d.ts.map +1 -1
- package/src/engine/ecs/ik/IKProblem.js +16 -0
- package/src/engine/ecs/ik/InverseKinematicsSystem.d.ts.map +1 -1
- package/src/engine/ecs/ik/InverseKinematicsSystem.js +19 -0
- package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.js +2 -2
- package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.js +2 -2
- package/src/engine/ecs/ik/ik_bone_chain.d.ts +11 -2
- package/src/engine/ecs/ik/ik_bone_chain.d.ts.map +1 -1
- package/src/engine/ecs/ik/ik_bone_chain.js +47 -2
- package/src/engine/ecs/ik/ik_write_local_rotation.d.ts.map +1 -1
- package/src/engine/ecs/ik/ik_write_local_rotation.js +6 -0
- package/src/engine/ecs/speaker/VoiceSystem.d.ts.map +1 -1
- package/src/engine/ecs/speaker/VoiceSystem.js +6 -0
- package/src/engine/ecs/transform/T64WorldCache.d.ts +50 -0
- package/src/engine/ecs/transform/T64WorldCache.d.ts.map +1 -0
- package/src/engine/ecs/transform/T64WorldCache.js +139 -0
- package/src/engine/ecs/transform/t64_evaluate_world.d.ts +31 -0
- package/src/engine/ecs/transform/t64_evaluate_world.d.ts.map +1 -0
- package/src/engine/ecs/transform/t64_evaluate_world.js +126 -0
- package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts +8 -0
- package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts.map +1 -1
- package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.js +59 -30
- package/src/engine/graphics/ecs/highlight/system/ShadedGeometryHighlightSystem.d.ts.map +1 -1
- package/src/engine/graphics/ecs/highlight/system/ShadedGeometryHighlightSystem.js +4 -11
- package/src/engine/graphics/ecs/mesh-v2/SHADED_GEOMETRY_EVENT_CHANGE.d.ts +14 -0
- package/src/engine/graphics/ecs/mesh-v2/SHADED_GEOMETRY_EVENT_CHANGE.d.ts.map +1 -0
- package/src/engine/graphics/ecs/mesh-v2/SHADED_GEOMETRY_EVENT_CHANGE.js +13 -0
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +2 -14
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts.map +1 -1
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +11 -21
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometryFlags.d.ts +1 -0
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometryFlags.js +7 -0
- package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshHighlightSystem.d.ts +5 -6
- package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshHighlightSystem.d.ts.map +1 -1
- package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshHighlightSystem.js +13 -11
- package/src/engine/graphics/ecs/mesh-v2/shaded_geometry_announce_change.d.ts +14 -0
- package/src/engine/graphics/ecs/mesh-v2/shaded_geometry_announce_change.d.ts.map +1 -0
- package/src/engine/graphics/ecs/mesh-v2/shaded_geometry_announce_change.js +21 -0
- package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts +1 -1
- package/src/engine/graphics/ecs/particles/ParticleEffect.js +1 -1
- package/src/engine/graphics/sh3/path_tracer/populate_path_traced_scene_from_ecd.d.ts +1 -1
- package/src/engine/graphics/sh3/path_tracer/populate_path_traced_scene_from_ecd.js +1 -1
- package/src/engine/graphics3/AnimationGraphSystem.js +3 -3
- package/src/engine/graphics3/AnimationSystem.js +2 -2
- package/src/engine/graphics3/DebugDrawSystem.d.ts.map +1 -1
- package/src/engine/graphics3/DebugDrawSystem.js +2 -4
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +34 -27
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/GPUParticleEmitterSystem.js +185 -85
- package/src/engine/graphics3/HighlightOutlineSystem.d.ts +4 -3
- package/src/engine/graphics3/HighlightOutlineSystem.d.ts.map +1 -1
- package/src/engine/graphics3/HighlightOutlineSystem.js +7 -9
- package/src/engine/graphics3/LightSystem.d.ts +7 -5
- package/src/engine/graphics3/LightSystem.d.ts.map +1 -1
- package/src/engine/graphics3/LightSystem.js +36 -22
- package/src/engine/graphics3/MeshSystem.d.ts +43 -39
- package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
- package/src/engine/graphics3/MeshSystem.js +324 -331
- package/src/engine/graphics3/PathDisplaySystem.d.ts.map +1 -1
- package/src/engine/graphics3/PathDisplaySystem.js +2 -4
- package/src/engine/graphics3/PickingQuery.d.ts +15 -21
- package/src/engine/graphics3/PickingQuery.d.ts.map +1 -1
- package/src/engine/graphics3/PickingQuery.js +21 -25
- package/src/engine/graphics3/PickingSystem.d.ts +60 -31
- package/src/engine/graphics3/PickingSystem.d.ts.map +1 -1
- package/src/engine/graphics3/PickingSystem.js +416 -273
- package/src/engine/graphics3/ShadedGeometrySystem.d.ts +22 -12
- package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
- package/src/engine/graphics3/ShadedGeometrySystem.js +309 -174
- package/src/engine/graphics3/TerrainSystem.d.ts +19 -11
- package/src/engine/graphics3/TerrainSystem.d.ts.map +1 -1
- package/src/engine/graphics3/TerrainSystem.js +102 -53
- package/src/engine/graphics3/TooltipComponentSystem.d.ts.map +1 -1
- package/src/engine/graphics3/TooltipComponentSystem.js +2 -14
- package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -1
- package/src/engine/graphics3/Trail3DSystem.js +2 -4
- package/src/engine/graphics3/animation/ClipListPlayer.d.ts +4 -4
- package/src/engine/graphics3/animation/ClipListPlayer.d.ts.map +1 -1
- package/src/engine/graphics3/animation/ClipListPlayer.js +2 -2
- package/src/engine/graphics3/highlight/pack_highlight_table.d.ts +9 -11
- package/src/engine/graphics3/highlight/pack_highlight_table.d.ts.map +1 -1
- package/src/engine/graphics3/highlight/pack_highlight_table.js +11 -18
- package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +4 -3
- package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts.map +1 -1
- package/src/engine/graphics3/pose/query_entity_node_world_pose.js +75 -74
- package/src/engine/graphics3/prefab/Prefab.d.ts +130 -0
- package/src/engine/graphics3/prefab/Prefab.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/Prefab.js +162 -0
- package/src/engine/graphics3/prefab/PrefabInstance.d.ts +72 -0
- package/src/engine/graphics3/prefab/PrefabInstance.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/PrefabInstance.js +80 -0
- package/src/engine/graphics3/prefab/prefab_compile.d.ts +23 -0
- package/src/engine/graphics3/prefab/prefab_compile.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/prefab_compile.js +334 -0
- package/src/engine/graphics3/prefab/prefab_instantiate.d.ts +46 -0
- package/src/engine/graphics3/prefab/prefab_instantiate.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/prefab_instantiate.js +230 -0
- package/src/engine/graphics3/prefab/prefab_normalize_skin_frames.d.ts +70 -0
- package/src/engine/graphics3/prefab/prefab_normalize_skin_frames.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/prefab_normalize_skin_frames.js +210 -0
- package/src/engine/graphics3/prefab/prefab_place.d.ts +60 -0
- package/src/engine/graphics3/prefab/prefab_place.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/prefab_place.js +130 -0
- package/src/engine/graphics3/prefab/prefab_skin_clip_scale_conflicts.d.ts +60 -0
- package/src/engine/graphics3/prefab/prefab_skin_clip_scale_conflicts.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/prefab_skin_clip_scale_conflicts.js +128 -0
- package/src/engine/graphics3/prefab/prefab_skin_frame.d.ts +40 -0
- package/src/engine/graphics3/prefab/prefab_skin_frame.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/prefab_skin_frame.js +116 -0
- package/src/engine/graphics3/preview/make_model_preview_scene.d.ts +16 -14
- package/src/engine/graphics3/preview/make_model_preview_scene.d.ts.map +1 -1
- package/src/engine/graphics3/preview/make_model_preview_scene.js +126 -154
- package/src/engine/graphics3/preview/make_model_thumbnail.js +1 -1
- package/src/engine/graphics3/register_instance_animation.d.ts +6 -6
- package/src/engine/graphics3/register_instance_animation.d.ts.map +1 -1
- package/src/engine/graphics3/register_instance_animation.js +4 -4
- package/src/engine/graphics3/shade_bundle_bounds.d.ts +2 -6
- package/src/engine/graphics3/shade_bundle_bounds.d.ts.map +1 -1
- package/src/engine/graphics3/shade_bundle_bounds.js +47 -55
- package/src/engine/graphics3/terrain/pack_terrain_row_table.d.ts +11 -18
- package/src/engine/graphics3/terrain/pack_terrain_row_table.d.ts.map +1 -1
- package/src/engine/graphics3/terrain/pack_terrain_row_table.js +48 -53
- package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts +17 -2
- package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts.map +1 -1
- package/src/engine/physics/cloth/build/cloth_proxy_from_joints.js +284 -256
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +13 -15
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothInstance.js +12 -14
- package/src/engine/physics/cloth/ecs/ClothRig.d.ts +7 -8
- package/src/engine/physics/cloth/ecs/ClothRig.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothRig.js +7 -8
- package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +5 -4
- package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothSystem.js +11 -12
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +19 -23
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.js +201 -199
- package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_seed_subtree.js +8 -0
- package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts +18 -34
- package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_write_back_rig.js +58 -115
- package/src/engine/physics/cloth/playground/README.md +11 -11
- package/src/engine/physics/cloth/playground/garment_build.d.ts +0 -1
- package/src/engine/physics/cloth/playground/garment_build.d.ts.map +1 -1
- package/src/engine/physics/cloth/playground/garment_build.js +64 -58
- package/src/engine/physics/cloth/playground/garment_main.js +59 -33
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/shade/RENDERER_CONTRACT.md +85 -53
- package/src/shade/device/ShadeGPUCommandContext.d.ts +23 -0
- package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
- package/src/shade/device/ShadeGPUCommandContext.js +36 -0
- package/src/shade/playground/add_random_meshes.d.ts +4 -4
- package/src/shade/playground/add_random_meshes.d.ts.map +1 -1
- package/src/shade/playground/add_random_meshes.js +20 -16
- package/src/shade/playground/avboit/main.d.ts +1 -0
- package/src/shade/playground/avboit/main.d.ts.map +1 -1
- package/src/shade/playground/avboit/main.js +916 -875
- package/src/shade/playground/basis_textures/main.d.ts.map +1 -1
- package/src/shade/playground/basis_textures/main.js +22 -8
- package/src/shade/playground/basis_textures/texture_inventory.d.ts +2 -2
- package/src/shade/playground/basis_textures/texture_inventory.d.ts.map +1 -1
- package/src/shade/playground/basis_textures/texture_inventory.js +6 -7
- package/src/shade/playground/ground_seam/main.d.ts.map +1 -1
- package/src/shade/playground/ground_seam/main.js +13 -4
- package/src/shade/playground/ground_seam/make_ground.d.ts +13 -4
- package/src/shade/playground/ground_seam/make_ground.d.ts.map +1 -1
- package/src/shade/playground/ground_seam/make_ground.js +21 -16
- package/src/shade/playground/particle_ecs/bonfire_editor.js +3 -3
- package/src/shade/playground/particle_system/main.js +11 -10
- package/src/shade/playground/particle_system/particle_prototype.d.ts +15 -10
- package/src/shade/playground/particle_system/particle_prototype.d.ts.map +1 -1
- package/src/shade/playground/particle_system/particle_prototype.js +56 -15
- package/src/shade/playground/particle_system/particle_scene.d.ts +68 -28
- package/src/shade/playground/particle_system/particle_scene.d.ts.map +1 -1
- package/src/shade/playground/particle_system/particle_scene.js +149 -53
- package/src/shade/playground/readback_crossover/index.html +41 -0
- package/src/shade/playground/readback_crossover/main.d.ts +2 -0
- package/src/shade/playground/readback_crossover/main.d.ts.map +1 -0
- package/src/shade/playground/readback_crossover/main.js +372 -0
- package/src/shade/playground/skinned_blas_refit/README.md +11 -7
- package/src/shade/playground/skinned_blas_refit/add_floor.d.ts +13 -44
- package/src/shade/playground/skinned_blas_refit/add_floor.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/add_floor.js +19 -59
- package/src/shade/playground/skinned_blas_refit/main.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/main.js +67 -58
- package/src/shade/playground/skinned_blas_refit/place_character.d.ts +40 -54
- package/src/shade/playground/skinned_blas_refit/place_character.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/place_character.js +47 -74
- package/src/shade/playground/skinned_blas_refit/sweep_views.d.ts +3 -3
- package/src/shade/playground/skinned_blas_refit/sweep_views.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/sweep_views.js +4 -3
- package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts +3 -3
- package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.js +11 -4
- package/src/shade/playground/skinned_blas_refit/verify_instance_bounds.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/verify_instance_bounds.js +38 -9
- package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts +3 -3
- package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.js +9 -6
- package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.d.ts +3 -3
- package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +3 -3
- package/src/shade/playground/skinned_mesh_soup/README.md +6 -6
- package/src/shade/playground/skinned_mesh_soup/main.d.ts.map +1 -1
- package/src/shade/playground/skinned_mesh_soup/main.js +44 -102
- package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts +5 -5
- package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts.map +1 -1
- package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.js +42 -33
- package/src/shade/playground/sponza_path_trace/main.d.ts +1 -0
- package/src/shade/playground/sponza_path_trace/main.d.ts.map +1 -1
- package/src/shade/playground/sponza_path_trace/main.js +393 -363
- package/src/shade/playground/ssr_reprojection/main.js +11 -9
- package/src/shade/playground/ssr_reprojection/scene.d.ts +15 -4
- package/src/shade/playground/ssr_reprojection/scene.d.ts.map +1 -1
- package/src/shade/playground/ssr_reprojection/scene.js +32 -11
- package/src/shade/playground/ssr_variance/main.js +1 -1
- package/src/shade/playground/ssr_variance/scene.d.ts +10 -4
- package/src/shade/playground/ssr_variance/scene.d.ts.map +1 -1
- package/src/shade/playground/ssr_variance/scene.js +39 -15
- package/src/shade/playground/vgeo_viewer/main.js +6 -2
- package/src/shade/playground/volumetrics_froxel/main.d.ts.map +1 -1
- package/src/shade/playground/volumetrics_froxel/main.js +936 -922
- package/src/shade/renderer/GraphicsContext.d.ts +7 -0
- package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
- package/src/shade/renderer/GraphicsContext.js +11 -0
- package/src/shade/renderer/Renderer.d.ts +3 -2
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +3 -2
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts +39 -47
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
- package/src/shade/renderer/animation/GPUAnimationManager.js +319 -256
- package/src/shade/renderer/animation/ShadeAnimationChannel.d.ts +26 -22
- package/src/shade/renderer/animation/ShadeAnimationChannel.d.ts.map +1 -1
- package/src/shade/renderer/animation/ShadeAnimationChannel.js +28 -23
- package/src/shade/renderer/animation/ShadeAnimationClip.d.ts +14 -6
- package/src/shade/renderer/animation/ShadeAnimationClip.d.ts.map +1 -1
- package/src/shade/renderer/animation/ShadeAnimationClip.js +20 -8
- package/src/shade/renderer/animation/Skin.d.ts +19 -19
- package/src/shade/renderer/animation/Skin.d.ts.map +1 -1
- package/src/shade/renderer/animation/Skin.js +15 -13
- package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts +6 -5
- package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts.map +1 -1
- package/src/shade/renderer/animation/pose/pose_evaluate_local.js +9 -9
- package/src/shade/renderer/animation/skin_clip_scale_conflicts.d.ts +5 -59
- package/src/shade/renderer/animation/skin_clip_scale_conflicts.d.ts.map +1 -1
- package/src/shade/renderer/animation/skin_clip_scale_conflicts.js +8 -132
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts +65 -62
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +148 -194
- package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.js +4 -7
- package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.d.ts +2 -2
- package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.js +2 -2
- package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.d.ts +74 -0
- package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.d.ts.map +1 -0
- package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.js +240 -0
- package/src/shade/renderer/buffer/table/GPUDatabase.d.ts +14 -0
- package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUDatabase.js +64 -6
- package/src/shade/renderer/buffer/table/GPUDatabaseReadback.d.ts +190 -0
- package/src/shade/renderer/buffer/table/GPUDatabaseReadback.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/GPUDatabaseReadback.js +1323 -0
- package/src/shade/renderer/buffer/table/GPUPageMetadata.d.ts +10 -0
- package/src/shade/renderer/buffer/table/GPUPageMetadata.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUPageMetadata.js +12 -0
- package/src/shade/renderer/buffer/table/GPUReadbackStagingRing.d.ts +96 -0
- package/src/shade/renderer/buffer/table/GPUReadbackStagingRing.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/GPUReadbackStatus.d.ts +15 -0
- package/src/shade/renderer/buffer/table/GPUReadbackStatus.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/GPUReadbackStatus.js +34 -0
- package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts +75 -7
- package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUTypedTable.js +518 -135
- package/src/shade/renderer/buffer/table/GPU_TABLE_GATHER_DESCRIPTOR_WORDS.d.ts +19 -0
- package/src/shade/renderer/buffer/table/GPU_TABLE_GATHER_DESCRIPTOR_WORDS.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/GPU_TABLE_GATHER_DESCRIPTOR_WORDS.js +18 -0
- package/src/shade/renderer/buffer/table/WordViews.d.ts +39 -0
- package/src/shade/renderer/buffer/table/WordViews.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/WordViews.js +62 -0
- package/src/shade/renderer/buffer/table/gpu_table_gather_shader.d.ts +27 -0
- package/src/shade/renderer/buffer/table/gpu_table_gather_shader.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/gpu_table_gather_shader.js +117 -0
- package/src/shade/renderer/buffer/table/serde/generate_record_writer.d.ts +121 -0
- package/src/shade/renderer/buffer/table/serde/generate_record_writer.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/serde/generate_record_writer.js +395 -0
- package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +70 -20
- package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +1 -1
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +6 -5
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts +3 -3
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +15 -11
- package/src/shade/renderer/global_illumination/brick4/cpu/brick4_bake_for_scene.d.ts +1 -1
- package/src/shade/renderer/global_illumination/brick4/cpu/brick4_bake_for_scene.js +4 -4
- package/src/shade/renderer/global_illumination/brick4/cpu/brick4_generate_tree_from_scene.d.ts +1 -3
- package/src/shade/renderer/global_illumination/brick4/cpu/brick4_generate_tree_from_scene.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/cpu/brick4_generate_tree_from_scene.js +5 -4
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.js +1 -1
- package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.js +1 -4
- package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts +8 -3
- package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.js +19 -14
- package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.js +9 -1
- package/src/shade/renderer/global_illumination/lpv/placement/software/lpv_generate_probe_locations2.d.ts +3 -3
- package/src/shade/renderer/global_illumination/lpv/placement/software/lpv_generate_probe_locations2.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/placement/software/lpv_generate_probe_locations2.js +12 -5
- package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.js +1 -1
- package/src/shade/renderer/light/GPULightCollection.d.ts +29 -0
- package/src/shade/renderer/light/GPULightCollection.d.ts.map +1 -1
- package/src/shade/renderer/light/GPULightCollection.js +444 -329
- package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.d.ts.map +1 -1
- package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.js +7 -1
- package/src/shade/renderer/light/LightCollection.d.ts +29 -1
- package/src/shade/renderer/light/LightCollection.d.ts.map +1 -1
- package/src/shade/renderer/light/LightCollection.js +50 -1
- package/src/shade/renderer/light/make_sunlight.js +2 -2
- package/src/shade/renderer/light/model/Light.d.ts +29 -2
- package/src/shade/renderer/light/model/Light.d.ts.map +1 -1
- package/src/shade/renderer/light/model/Light.js +30 -2
- package/src/shade/renderer/light/model/io/light_record_directional.d.ts +3 -1
- package/src/shade/renderer/light/model/io/light_record_directional.d.ts.map +1 -1
- package/src/shade/renderer/light/model/io/light_record_directional.js +8 -5
- package/src/shade/renderer/light/model/io/light_record_point.d.ts +3 -1
- package/src/shade/renderer/light/model/io/light_record_point.d.ts.map +1 -1
- package/src/shade/renderer/light/model/io/light_record_point.js +5 -2
- package/src/shade/renderer/light/model/io/light_record_spot.d.ts +4 -1
- package/src/shade/renderer/light/model/io/light_record_spot.d.ts.map +1 -1
- package/src/shade/renderer/light/model/io/light_record_spot.js +10 -6
- package/src/shade/renderer/light/place_light.d.ts +16 -0
- package/src/shade/renderer/light/place_light.d.ts.map +1 -0
- package/src/shade/renderer/light/place_light.js +36 -0
- package/src/shade/renderer/light/shader_refresh_light_poses.d.ts +44 -0
- package/src/shade/renderer/light/shader_refresh_light_poses.d.ts.map +1 -0
- package/src/shade/renderer/light/shader_refresh_light_poses.js +154 -0
- package/src/shade/renderer/lightmap/GPULightMap.js +1 -1
- package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.d.ts.map +1 -1
- package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.js +12 -14
- package/src/shade/renderer/loader/SceneBundle.d.ts +53 -28
- package/src/shade/renderer/loader/SceneBundle.d.ts.map +1 -1
- package/src/shade/renderer/loader/SceneBundle.js +111 -56
- package/src/shade/renderer/loader/SceneNode.d.ts +81 -0
- package/src/shade/renderer/loader/SceneNode.d.ts.map +1 -0
- package/src/shade/renderer/loader/SceneNode.js +114 -0
- package/src/shade/renderer/loader/gltf/load_gltf.d.ts +3 -2
- package/src/shade/renderer/loader/gltf/load_gltf.d.ts.map +1 -1
- package/src/shade/renderer/loader/gltf/load_gltf.js +110 -142
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/loader/usd/UsdExtensionRegistry.d.ts +4 -4
- package/src/shade/renderer/loader/usd/UsdExtensionRegistry.d.ts.map +1 -1
- package/src/shade/renderer/loader/usd/UsdExtensionRegistry.js +2 -2
- package/src/shade/renderer/loader/usd/load_usd.d.ts +3 -2
- package/src/shade/renderer/loader/usd/load_usd.d.ts.map +1 -1
- package/src/shade/renderer/loader/usd/load_usd.js +4 -5
- package/src/shade/renderer/loader/usd/usd_build_scene.d.ts +3 -3
- package/src/shade/renderer/loader/usd/usd_build_scene.d.ts.map +1 -1
- package/src/shade/renderer/loader/usd/usd_build_scene.js +47 -55
- package/src/shade/renderer/material/GPUMaterialManager.js +1 -1
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts +5 -4
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +8 -15
- package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.d.ts +15 -13
- package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.d.ts.map +1 -1
- package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.js +40 -21
- package/src/shade/renderer/particles/DESIGN.md +53 -50
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts +31 -17
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
- package/src/shade/renderer/particles/GPUParticleSystem.js +54 -91
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +12 -11
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/EmitterRegistry.js +12 -11
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts +13 -19
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.js +19 -25
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +34 -24
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/ParticleEmitter.js +53 -40
- package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +1 -1
- package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +1 -1
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_meshes_classify_buckets.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_meshes_classify_buckets.js +2 -1
- package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_scene_meshes_cull_and_classify_buckets.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_scene_meshes_cull_and_classify_buckets.js +5 -2
- package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.js +1 -1
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +1 -1
- package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.js +1 -1
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +1 -1
- package/src/shade/renderer/scene/DynamicMesh.d.ts +13 -4
- package/src/shade/renderer/scene/DynamicMesh.d.ts.map +1 -1
- package/src/shade/renderer/scene/DynamicMesh.js +14 -4
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts +38 -18
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +112 -60
- package/src/shade/renderer/scene/GPUSceneContext.d.ts +55 -48
- package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUSceneContext.js +594 -928
- package/src/shade/renderer/scene/NODE3D_STRUCT.d.ts +5 -5
- package/src/shade/renderer/scene/NODE3D_STRUCT.js +5 -5
- package/src/shade/renderer/scene/Node3D.d.ts +27 -8
- package/src/shade/renderer/scene/Node3D.d.ts.map +1 -1
- package/src/shade/renderer/scene/Node3DDirtyList.d.ts +59 -0
- package/src/shade/renderer/scene/Node3DDirtyList.d.ts.map +1 -0
- package/src/shade/renderer/scene/Scene.d.ts +18 -60
- package/src/shade/renderer/scene/Scene.d.ts.map +1 -1
- package/src/shade/renderer/scene/Scene.js +53 -146
- package/src/shade/renderer/scene/SkinnedMesh.d.ts +10 -93
- package/src/shade/renderer/scene/SkinnedMesh.d.ts.map +1 -1
- package/src/shade/renderer/scene/bvh/StaticSceneBVH.d.ts +24 -3
- package/src/shade/renderer/scene/bvh/StaticSceneBVH.d.ts.map +1 -1
- package/src/shade/renderer/scene/bvh/StaticSceneBVH.js +53 -13
- package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.d.ts +5 -6
- package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.d.ts.map +1 -1
- package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.js +5 -6
- package/src/shade/renderer/scene/optimization/scene_optimize.d.ts +10 -2
- package/src/shade/renderer/scene/optimization/scene_optimize.d.ts.map +1 -1
- package/src/shade/renderer/scene/optimization/scene_optimize.js +266 -230
- package/src/shade/renderer/scene/rows/GPUEntityBoundsReadback.d.ts +53 -0
- package/src/shade/renderer/scene/rows/GPUEntityBoundsReadback.d.ts.map +1 -0
- package/src/shade/renderer/scene/rows/GPUEntityBoundsReadback.js +144 -0
- package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts +227 -0
- package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts.map +1 -0
- package/src/shade/renderer/scene/rows/GPUSceneRows.js +1136 -0
- package/src/shade/renderer/scene/rows/place_primitive.d.ts +48 -0
- package/src/shade/renderer/scene/rows/place_primitive.d.ts.map +1 -0
- package/src/shade/renderer/scene/rows/place_primitive.js +98 -0
- package/src/shade/renderer/scene/serialization/deserialize_scene.d.ts +10 -8
- package/src/shade/renderer/scene/serialization/deserialize_scene.d.ts.map +1 -1
- package/src/shade/renderer/scene/serialization/deserialize_scene.js +24 -27
- package/src/shade/renderer/scene/serialization/serialize_scene.d.ts +9 -2
- package/src/shade/renderer/scene/serialization/serialize_scene.d.ts.map +1 -1
- package/src/shade/renderer/scene/serialization/serialize_scene.js +25 -4
- package/src/shade/renderer/scene/verify_gpu_tlas_build.js +2 -2
- package/src/shade/renderer/shader/chunk/light/DIRECTIONAL_LIGHT_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/light/DIRECTIONAL_LIGHT_STRUCT.js +5 -0
- package/src/shade/renderer/shader/chunk/light/POINT_LIGHT_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/light/POINT_LIGHT_STRUCT.js +5 -0
- package/src/shade/renderer/shader/chunk/light/SPOT_LIGHT_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/light/SPOT_LIGHT_STRUCT.js +5 -0
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts +39 -0
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +112 -64
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +7 -0
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +1541 -1352
- package/src/shade/renderer/shadow/map/PointLightShadowmap.js +1 -1
- package/src/shade/renderer/shadow/map/SpotLightShadowmap.js +1 -1
- package/src/shade/renderer/shadow/map/TetrahedronPointLightShadowmap.js +1 -1
- package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.d.ts +29 -0
- package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.js +43 -0
- package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASTER_RANGE_MARGIN_FRACTION.d.ts +13 -0
- package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASTER_RANGE_MARGIN_FRACTION.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASTER_RANGE_MARGIN_FRACTION.js +12 -0
- package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.d.ts +49 -0
- package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.js +194 -0
- package/src/shade/renderer/shadow/map/csm_debug_draw_preview.js +1 -1
- package/src/shade/renderer/shadow/map/shadowmap_update_score.js +1 -1
- package/src/shade/renderer/shadow/ray/RTXShadows.js +1 -1
- package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +1 -1
- package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.d.ts.map +1 -1
- package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +3 -1
- package/src/shade/renderer/texture/bindless/GPUBindlessTextureManager.js +8 -8
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +4 -3
- package/src/engine/graphics3/instantiate_scene_bundle.js +0 -164
- package/src/engine/graphics3/shade_node_to_entity_composition.js +0 -88
- package/src/shade/renderer/animation/compute_skin_world_bounds.js +0 -146
- package/src/shade/renderer/animation/compute_skinned_mesh_clip_bounding_sphere.js +0 -531
- package/src/shade/renderer/animation/pose/pose_evaluate_world.js +0 -76
- package/src/shade/renderer/animation/skin_bind_transform.js +0 -33
- package/src/shade/renderer/animation/skin_frame_defect.js +0 -132
- package/src/shade/renderer/animation/skin_joint_matrix.js +0 -46
- package/src/shade/renderer/animation/skin_normalize_mesh_frame.js +0 -216
- package/src/shade/renderer/scene/InstanceBatch.js +0 -235
- package/src/shade/renderer/scene/Mesh.js +0 -168
- package/src/shade/renderer/scene/Node3D.js +0 -263
- package/src/shade/renderer/scene/SceneNodeBinding.js +0 -56
- package/src/shade/renderer/scene/SkinnedMesh.js +0 -170
- package/src/shade/renderer/scene/TransformAuthority.js +0 -33
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistent `MAP_READ | COPY_DST` buffers for reading GPU data back — {@link GPUBufferStagingAllocator}
|
|
3
|
+
* run the other way.
|
|
4
|
+
*
|
|
5
|
+
* The same shape on purpose: a size-sorted free list, `get(min_size)` serving the smallest buffer
|
|
6
|
+
* that fits and creating one when none does, `release(buffer)` putting it back. Where the staging
|
|
7
|
+
* pool re-maps a buffer on release because the next writer needs it mapped, this one *unmaps*,
|
|
8
|
+
* because the next copy into it needs it unmapped; the mapping is the holder's, taken after the
|
|
9
|
+
* copy has landed and read at the holder's own apply point.
|
|
10
|
+
*
|
|
11
|
+
* Why not `buffer_allocator_main`: `TransientResourcePool`'s reuse safety rests on transients being
|
|
12
|
+
* GPU-only, and a readback buffer is held by the CPU across frames.
|
|
13
|
+
*
|
|
14
|
+
* Why not a ring: a ring hands out `null` when its slots are busy and leaves the caller to defer a
|
|
15
|
+
* whole frame's work, and growing a slot destroys a perfectly good smaller buffer. A free list makes
|
|
16
|
+
* another buffer and keeps both sizes.
|
|
17
|
+
*
|
|
18
|
+
* @see GPUDatabaseReadback the holder
|
|
19
|
+
*/
|
|
20
|
+
export class GPUBufferReadbackAllocator {
|
|
21
|
+
/**
|
|
22
|
+
* @param {GPUDevice} device
|
|
23
|
+
* @param {Object} [options]
|
|
24
|
+
* @param {number} [options.budget_bytes] free bytes kept before the largest free buffers are destroyed
|
|
25
|
+
*/
|
|
26
|
+
constructor(device: GPUDevice, { budget_bytes }?: {
|
|
27
|
+
budget_bytes?: number;
|
|
28
|
+
});
|
|
29
|
+
/**
|
|
30
|
+
* Bytes in every buffer this pool has made and not destroyed, held or free.
|
|
31
|
+
* @returns {number}
|
|
32
|
+
*/
|
|
33
|
+
get gpu_memory_usage(): number;
|
|
34
|
+
/**
|
|
35
|
+
* Bytes sitting in the free list.
|
|
36
|
+
* @returns {number}
|
|
37
|
+
*/
|
|
38
|
+
get ready_byte_size(): number;
|
|
39
|
+
/**
|
|
40
|
+
* Bytes in buffers currently handed out.
|
|
41
|
+
* @returns {number}
|
|
42
|
+
*/
|
|
43
|
+
get held_byte_size(): number;
|
|
44
|
+
/**
|
|
45
|
+
* Free buffers.
|
|
46
|
+
* @returns {number}
|
|
47
|
+
*/
|
|
48
|
+
get ready_count(): number;
|
|
49
|
+
/**
|
|
50
|
+
* The smallest free buffer of at least `min_size_bytes`, or a new one. **Unmapped**, ready to be
|
|
51
|
+
* the destination of a copy. Contents are whatever the last use left.
|
|
52
|
+
*
|
|
53
|
+
* @param {number} min_size_bytes
|
|
54
|
+
* @returns {GPUBuffer}
|
|
55
|
+
*/
|
|
56
|
+
get(min_size_bytes: number): GPUBuffer;
|
|
57
|
+
/**
|
|
58
|
+
* Give a buffer back. A mapped buffer is unmapped here; a buffer whose mapping is still pending
|
|
59
|
+
* cannot be given back — let the mapping settle, or {@link discard} it.
|
|
60
|
+
*
|
|
61
|
+
* @param {GPUBuffer} buffer
|
|
62
|
+
*/
|
|
63
|
+
release(buffer: GPUBuffer): void;
|
|
64
|
+
/**
|
|
65
|
+
* Destroy a buffer that was handed out, instead of giving it back — for a holder being torn down
|
|
66
|
+
* while a mapping is still pending, which WebGPU lets `destroy()` abort but not `unmap()`.
|
|
67
|
+
*
|
|
68
|
+
* @param {GPUBuffer} buffer
|
|
69
|
+
*/
|
|
70
|
+
discard(buffer: GPUBuffer): void;
|
|
71
|
+
destroy(): void;
|
|
72
|
+
#private;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=GPUBufferReadbackAllocator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GPUBufferReadbackAllocator.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/buffer/GPUBufferReadbackAllocator.js"],"names":[],"mappings":"AAoCA;;;;;;;;;;;;;;;;;;GAkBG;AACH;IA4BI;;;;OAIG;IACH;QAF4B,YAAY,GAA7B,MAAM;OAQhB;IAED;;;OAGG;IACH,+BAEC;IAED;;;OAGG;IACH,8BAEC;IAED;;;OAGG;IACH,6BAEC;IAED;;;OAGG;IACH,0BAEC;IAED;;;;;;OAMG;IACH,oBAHW,MAAM,aAkChB;IAED;;;;;OAKG;IACH,iCAsBC;IAED;;;;;OAKG;IACH,iCAMC;IAkBD,gBAUC;;CACJ"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { assert } from "../../../core/assert.js";
|
|
2
|
+
import { binarySearchHighIndex } from "../../../core/collection/array/binarySearchHighIndex.js";
|
|
3
|
+
import { round_up } from "../../../core/math/round_up.js";
|
|
4
|
+
import { MEGABYTE } from "../../../core/science/units/memory/MEGABYTE.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Sizes are rounded up to this when a buffer is created, so that batches whose byte count breathes
|
|
8
|
+
* by a few rows keep landing in the same buffer instead of each size making a new one.
|
|
9
|
+
*
|
|
10
|
+
* @type {number}
|
|
11
|
+
*/
|
|
12
|
+
const SIZE_GRANULARITY = 256;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* How many bytes of *free* readback buffers are kept. Buffers handed out are the holder's to bound;
|
|
16
|
+
* this bounds what an idle pool pins after a spike — one 50k-row batch is ~3 MB, and without a cap
|
|
17
|
+
* it would stay for the life of the process, which is what the ring this replaced did.
|
|
18
|
+
*
|
|
19
|
+
* @type {number}
|
|
20
|
+
*/
|
|
21
|
+
const DEFAULT_BUDGET_BYTES = 16 * MEGABYTE;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @type {number}
|
|
25
|
+
*/
|
|
26
|
+
let id_count = 0;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @param {{size: number}} a
|
|
30
|
+
* @param {{size: number}} b
|
|
31
|
+
* @returns {number}
|
|
32
|
+
*/
|
|
33
|
+
function by_size(a, b) {
|
|
34
|
+
return a.size - b.size;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Persistent `MAP_READ | COPY_DST` buffers for reading GPU data back — {@link GPUBufferStagingAllocator}
|
|
39
|
+
* run the other way.
|
|
40
|
+
*
|
|
41
|
+
* The same shape on purpose: a size-sorted free list, `get(min_size)` serving the smallest buffer
|
|
42
|
+
* that fits and creating one when none does, `release(buffer)` putting it back. Where the staging
|
|
43
|
+
* pool re-maps a buffer on release because the next writer needs it mapped, this one *unmaps*,
|
|
44
|
+
* because the next copy into it needs it unmapped; the mapping is the holder's, taken after the
|
|
45
|
+
* copy has landed and read at the holder's own apply point.
|
|
46
|
+
*
|
|
47
|
+
* Why not `buffer_allocator_main`: `TransientResourcePool`'s reuse safety rests on transients being
|
|
48
|
+
* GPU-only, and a readback buffer is held by the CPU across frames.
|
|
49
|
+
*
|
|
50
|
+
* Why not a ring: a ring hands out `null` when its slots are busy and leaves the caller to defer a
|
|
51
|
+
* whole frame's work, and growing a slot destroys a perfectly good smaller buffer. A free list makes
|
|
52
|
+
* another buffer and keeps both sizes.
|
|
53
|
+
*
|
|
54
|
+
* @see GPUDatabaseReadback the holder
|
|
55
|
+
*/
|
|
56
|
+
export class GPUBufferReadbackAllocator {
|
|
57
|
+
/**
|
|
58
|
+
* @type {GPUDevice}
|
|
59
|
+
*/
|
|
60
|
+
#device;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Free buffers, ascending by size.
|
|
64
|
+
* @type {GPUBuffer[]}
|
|
65
|
+
*/
|
|
66
|
+
#ready = [];
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* @type {number}
|
|
70
|
+
*/
|
|
71
|
+
#ready_byte_size = 0;
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Bytes in buffers handed out and not yet given back.
|
|
75
|
+
* @type {number}
|
|
76
|
+
*/
|
|
77
|
+
#held_byte_size = 0;
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* @type {number}
|
|
81
|
+
*/
|
|
82
|
+
#budget_bytes;
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* @param {GPUDevice} device
|
|
86
|
+
* @param {Object} [options]
|
|
87
|
+
* @param {number} [options.budget_bytes] free bytes kept before the largest free buffers are destroyed
|
|
88
|
+
*/
|
|
89
|
+
constructor(device, { budget_bytes = DEFAULT_BUDGET_BYTES } = {}) {
|
|
90
|
+
assert.defined(device, 'device');
|
|
91
|
+
assert.isNonNegativeInteger(budget_bytes, 'budget_bytes');
|
|
92
|
+
|
|
93
|
+
this.#device = device;
|
|
94
|
+
this.#budget_bytes = budget_bytes;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Bytes in every buffer this pool has made and not destroyed, held or free.
|
|
99
|
+
* @returns {number}
|
|
100
|
+
*/
|
|
101
|
+
get gpu_memory_usage() {
|
|
102
|
+
return this.#ready_byte_size + this.#held_byte_size;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Bytes sitting in the free list.
|
|
107
|
+
* @returns {number}
|
|
108
|
+
*/
|
|
109
|
+
get ready_byte_size() {
|
|
110
|
+
return this.#ready_byte_size;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Bytes in buffers currently handed out.
|
|
115
|
+
* @returns {number}
|
|
116
|
+
*/
|
|
117
|
+
get held_byte_size() {
|
|
118
|
+
return this.#held_byte_size;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Free buffers.
|
|
123
|
+
* @returns {number}
|
|
124
|
+
*/
|
|
125
|
+
get ready_count() {
|
|
126
|
+
return this.#ready.length;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* The smallest free buffer of at least `min_size_bytes`, or a new one. **Unmapped**, ready to be
|
|
131
|
+
* the destination of a copy. Contents are whatever the last use left.
|
|
132
|
+
*
|
|
133
|
+
* @param {number} min_size_bytes
|
|
134
|
+
* @returns {GPUBuffer}
|
|
135
|
+
*/
|
|
136
|
+
get(min_size_bytes) {
|
|
137
|
+
assert.isNonNegativeInteger(min_size_bytes, 'min_size_bytes');
|
|
138
|
+
assert.greaterThan(min_size_bytes, 0, 'min_size_bytes');
|
|
139
|
+
|
|
140
|
+
const ready = this.#ready;
|
|
141
|
+
const index = binarySearchHighIndex(ready, { size: min_size_bytes }, by_size);
|
|
142
|
+
|
|
143
|
+
let result;
|
|
144
|
+
|
|
145
|
+
if (index < ready.length) {
|
|
146
|
+
result = ready[index];
|
|
147
|
+
|
|
148
|
+
ready.splice(index, 1);
|
|
149
|
+
|
|
150
|
+
this.#ready_byte_size -= result.size;
|
|
151
|
+
} else {
|
|
152
|
+
result = this.#device.createBuffer({
|
|
153
|
+
label: `readback ${id_count++}`,
|
|
154
|
+
size: round_up(min_size_bytes, SIZE_GRANULARITY),
|
|
155
|
+
// the only usage pair WebGPU permits alongside MAP_READ
|
|
156
|
+
usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,
|
|
157
|
+
mappedAtCreation: false,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
assert.greaterThanOrEqual(result.size, min_size_bytes, 'result.size < min_size_bytes');
|
|
162
|
+
assert.equal(result.mapState, "unmapped", 'result.mapState !== "unmapped"');
|
|
163
|
+
|
|
164
|
+
this.#held_byte_size += result.size;
|
|
165
|
+
|
|
166
|
+
return result;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Give a buffer back. A mapped buffer is unmapped here; a buffer whose mapping is still pending
|
|
171
|
+
* cannot be given back — let the mapping settle, or {@link discard} it.
|
|
172
|
+
*
|
|
173
|
+
* @param {GPUBuffer} buffer
|
|
174
|
+
*/
|
|
175
|
+
release(buffer) {
|
|
176
|
+
assert.defined(buffer, 'buffer');
|
|
177
|
+
assert.equal(buffer.usage, GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST, 'buffer.usage !== GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST');
|
|
178
|
+
|
|
179
|
+
const state = buffer.mapState;
|
|
180
|
+
|
|
181
|
+
if (state === "mapped") {
|
|
182
|
+
buffer.unmap();
|
|
183
|
+
} else if (state !== "unmapped") {
|
|
184
|
+
throw new Error(`Invalid map state: ${state}`);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
this.#held_byte_size -= buffer.size;
|
|
188
|
+
|
|
189
|
+
const ready = this.#ready;
|
|
190
|
+
const index = binarySearchHighIndex(ready, buffer, by_size);
|
|
191
|
+
|
|
192
|
+
ready.splice(index, 0, buffer);
|
|
193
|
+
|
|
194
|
+
this.#ready_byte_size += buffer.size;
|
|
195
|
+
|
|
196
|
+
this.#trim();
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Destroy a buffer that was handed out, instead of giving it back — for a holder being torn down
|
|
201
|
+
* while a mapping is still pending, which WebGPU lets `destroy()` abort but not `unmap()`.
|
|
202
|
+
*
|
|
203
|
+
* @param {GPUBuffer} buffer
|
|
204
|
+
*/
|
|
205
|
+
discard(buffer) {
|
|
206
|
+
assert.defined(buffer, 'buffer');
|
|
207
|
+
|
|
208
|
+
this.#held_byte_size -= buffer.size;
|
|
209
|
+
|
|
210
|
+
buffer.destroy();
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Keep the free list under budget, dropping the largest buffers first: they cost the most, and a
|
|
215
|
+
* spike is the least likely size to be asked for again.
|
|
216
|
+
*/
|
|
217
|
+
#trim() {
|
|
218
|
+
const ready = this.#ready;
|
|
219
|
+
|
|
220
|
+
while (this.#ready_byte_size > this.#budget_bytes && ready.length > 0) {
|
|
221
|
+
const largest = ready.pop();
|
|
222
|
+
|
|
223
|
+
this.#ready_byte_size -= largest.size;
|
|
224
|
+
|
|
225
|
+
largest.destroy();
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
destroy() {
|
|
230
|
+
const ready = this.#ready;
|
|
231
|
+
|
|
232
|
+
for (let i = 0; i < ready.length; i++) {
|
|
233
|
+
ready[i].destroy();
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
ready.length = 0;
|
|
237
|
+
|
|
238
|
+
this.#ready_byte_size = 0;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
@@ -49,6 +49,19 @@ export class GPUDatabase {
|
|
|
49
49
|
* @returns {GPUTypedTable|undefined}
|
|
50
50
|
*/
|
|
51
51
|
get(name: string): GPUTypedTable<any> | undefined;
|
|
52
|
+
/**
|
|
53
|
+
* Batched readback of rows, or ranges of rows, into CPU memory.
|
|
54
|
+
*
|
|
55
|
+
* Built on first mention. {@link update} drives it: results are applied at the head of an
|
|
56
|
+
* update and this frame's requests are encoded at its tail, so a caller gets its answers at one
|
|
57
|
+
* stated moment rather than whenever a mapping settles.
|
|
58
|
+
*
|
|
59
|
+
* The single-element {@link debug_table_read_element} is unaffected and stays what it is — a
|
|
60
|
+
* debug affordance that creates and destroys a buffer per call.
|
|
61
|
+
*
|
|
62
|
+
* @returns {GPUDatabaseReadback}
|
|
63
|
+
*/
|
|
64
|
+
get readback(): GPUDatabaseReadback;
|
|
52
65
|
/**
|
|
53
66
|
* Byte offset where the data region starts (after the allocation table).
|
|
54
67
|
* In {@link GPU_DATABASE_BUFFER_ELEMENT_TYPE} units.
|
|
@@ -115,4 +128,5 @@ export class GPUDatabase {
|
|
|
115
128
|
export type ShadeGPUCommandContext = import("../../../device/ShadeGPUCommandContext.js").ShadeGPUCommandContext;
|
|
116
129
|
export type GPUDatabaseDefinition = import("./GPUDatabaseDefinition.js").GPUDatabaseDefinition;
|
|
117
130
|
import { GPUTypedTable } from "./GPUTypedTable.js";
|
|
131
|
+
import { GPUDatabaseReadback } from "./GPUDatabaseReadback.js";
|
|
118
132
|
//# sourceMappingURL=GPUDatabase.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GPUDatabase.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/buffer/table/GPUDatabase.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GPUDatabase.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/buffer/table/GPUDatabase.js"],"names":[],"mappings":"AA2CA;;;;;;;;;GASG;AACH;IAoFI;;;;;;OAMG;IACH;QAL0C,UAAU,EAAzC,qBAAqB;QACF,MAAM;QACR,KAAK,GAAtB,MAAM;QACW,uBAAuB,GAAxC,MAAM;OAuEhB;IA9JD;;;OAGG;IACH,YAFU,qBAAqB,CAEpB;IAEX;;;;OAIG;IACH,QAFU,oBAAe,CAElB;IASP;;;OAGG;IACH,kBAAO;IAmDP;;OAEG;IACH,8BAEC;IAgFD;;;;;OAKG;IACH,UAHW,MAAM,GACJ,qBAAc,SAAS,CAUnC;IAGD;;;;;;;;;;;OAWG;IACH,oCAcC;IAED;;;;;OAKG;IACH,gCAEC;IAoPD;;;OAGG;IACH,gBAFW,sBAAsB,QA6FhC;IA+OD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,2BAJW,MAAM,GACJ,QAAQ,KAAG,CAAC,CA6HxB;IAED;;;;;;;OAOG;IACH,+BAJW,MAAM,iBACN,MAAM,GACJ,YAAU,CAkCtB;IAED;;;OAGG;IACH,+BAQC;IAED;;OAEG;IACH,gBASC;;CACJ;qCAvhCY,OAAO,2CAA2C,EAAE,sBAAsB;oCAC1E,OAAO,4BAA4B,EAAE,qBAAqB;8BANzC,oBAAoB;oCALd,0BAA0B"}
|
|
@@ -10,6 +10,7 @@ import { u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
|
10
10
|
import { inspect_gpu_buffer } from "../inspect_gpu_buffer.js";
|
|
11
11
|
import { inspect_gpu_buffer_typed } from "../inspect_gpu_buffer_typed.js";
|
|
12
12
|
import { GPU_DATABASE_BUFFER_ELEMENT_TYPE } from "./GPU_DATABASE_BUFFER_ELEMENT_TYPE.js";
|
|
13
|
+
import { GPUDatabaseReadback } from "./GPUDatabaseReadback.js";
|
|
13
14
|
import { gpu_table_element_upload_shader } from "./gpu_table_element_upload_shader.js";
|
|
14
15
|
import { gpu_table_partial_upload_shader } from "./gpu_table_partial_upload_shader.js";
|
|
15
16
|
import { GPU_TABLE_PARTIAL_UPLOAD_DESCRIPTOR_WORDS } from "./GPU_TABLE_PARTIAL_UPLOAD_DESCRIPTOR_WORDS.js";
|
|
@@ -117,6 +118,16 @@ export class GPUDatabase {
|
|
|
117
118
|
*/
|
|
118
119
|
#page_buffer_pool;
|
|
119
120
|
|
|
121
|
+
/**
|
|
122
|
+
* Batched row readback, built on first use.
|
|
123
|
+
*
|
|
124
|
+
* Lazy because it owns persistent mappable buffers, and most databases are written and never
|
|
125
|
+
* read: a database nobody asks about must not pay for the ring that would answer.
|
|
126
|
+
*
|
|
127
|
+
* @type {GPUDatabaseReadback|null}
|
|
128
|
+
*/
|
|
129
|
+
#readback = null;
|
|
130
|
+
|
|
120
131
|
/**
|
|
121
132
|
* @return {number}
|
|
122
133
|
*/
|
|
@@ -219,6 +230,34 @@ export class GPUDatabase {
|
|
|
219
230
|
}
|
|
220
231
|
|
|
221
232
|
|
|
233
|
+
/**
|
|
234
|
+
* Batched readback of rows, or ranges of rows, into CPU memory.
|
|
235
|
+
*
|
|
236
|
+
* Built on first mention. {@link update} drives it: results are applied at the head of an
|
|
237
|
+
* update and this frame's requests are encoded at its tail, so a caller gets its answers at one
|
|
238
|
+
* stated moment rather than whenever a mapping settles.
|
|
239
|
+
*
|
|
240
|
+
* The single-element {@link debug_table_read_element} is unaffected and stays what it is — a
|
|
241
|
+
* debug affordance that creates and destroys a buffer per call.
|
|
242
|
+
*
|
|
243
|
+
* @returns {GPUDatabaseReadback}
|
|
244
|
+
*/
|
|
245
|
+
get readback() {
|
|
246
|
+
let readback = this.#readback;
|
|
247
|
+
|
|
248
|
+
if (readback === null) {
|
|
249
|
+
readback = new GPUDatabaseReadback({
|
|
250
|
+
database: this,
|
|
251
|
+
device: this.#device,
|
|
252
|
+
label: `${this.#label}/readback`,
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
this.#readback = readback;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
return readback;
|
|
259
|
+
}
|
|
260
|
+
|
|
222
261
|
/**
|
|
223
262
|
* Byte offset where the data region starts (after the allocation table).
|
|
224
263
|
* In {@link GPU_DATABASE_BUFFER_ELEMENT_TYPE} units.
|
|
@@ -479,6 +518,14 @@ export class GPUDatabase {
|
|
|
479
518
|
const tables = this.tables;
|
|
480
519
|
const table_count = tables.length;
|
|
481
520
|
|
|
521
|
+
// The readback's apply point, and the reason it is here: this is the one moment in a frame
|
|
522
|
+
// where the database is being brought up to date and nothing is midway through reading it.
|
|
523
|
+
// A result that landed on its own promise's timing would change a value underneath whatever
|
|
524
|
+
// was running when the mapping happened to settle.
|
|
525
|
+
if (this.#readback !== null) {
|
|
526
|
+
this.#readback.apply();
|
|
527
|
+
}
|
|
528
|
+
|
|
482
529
|
// Allocate new pages and deallocate empty ones
|
|
483
530
|
for (let i = 0; i < table_count; i++) {
|
|
484
531
|
const table = tables[i];
|
|
@@ -524,12 +571,12 @@ export class GPUDatabase {
|
|
|
524
571
|
for (let i = 0; i < table_count; i++) {
|
|
525
572
|
const table = tables[i];
|
|
526
573
|
|
|
527
|
-
// Whole records first, sub-record ranges second. In one update cycle a row
|
|
528
|
-
//
|
|
529
|
-
//
|
|
530
|
-
//
|
|
531
|
-
//
|
|
532
|
-
//
|
|
574
|
+
// Whole records first, sub-record ranges second. In one update cycle a row has a
|
|
575
|
+
// pending write in one stream or the other, never both — `GPUTypedTable` patches or
|
|
576
|
+
// retires across the two as writes come in, and both streams index a row's pending
|
|
577
|
+
// entries rather than scanning back for them, so neither reconciliation can miss one.
|
|
578
|
+
// The order is what append order already said anyway: a range queued after a record
|
|
579
|
+
// lands on top of it.
|
|
533
580
|
this.#upload_element_records(table, encoder);
|
|
534
581
|
this.#upload_partial_ranges(table, encoder);
|
|
535
582
|
|
|
@@ -552,6 +599,12 @@ export class GPUDatabase {
|
|
|
552
599
|
page.gpu_version = page.cpu_version;
|
|
553
600
|
}
|
|
554
601
|
}
|
|
602
|
+
|
|
603
|
+
// Last, so a row written this frame reads back as what it now holds rather than as what it
|
|
604
|
+
// held before. A frame with no requests records nothing here at all.
|
|
605
|
+
if (this.#readback !== null) {
|
|
606
|
+
this.#readback.encode(encoder);
|
|
607
|
+
}
|
|
555
608
|
}
|
|
556
609
|
|
|
557
610
|
/**
|
|
@@ -1005,6 +1058,11 @@ export class GPUDatabase {
|
|
|
1005
1058
|
* Release GPU resources
|
|
1006
1059
|
*/
|
|
1007
1060
|
destroy() {
|
|
1061
|
+
if (this.#readback !== null) {
|
|
1062
|
+
this.#readback.destroy();
|
|
1063
|
+
this.#readback = null;
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1008
1066
|
this.buffer.destroy();
|
|
1009
1067
|
this.#page_buffer_pool.clear();
|
|
1010
1068
|
this.#device = null;
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reading rows back from a {@link GPUDatabase} in batches: one gather, one copy, one map, and one
|
|
3
|
+
* point in the frame where the answers land — in memory the caller already owns.
|
|
4
|
+
*
|
|
5
|
+
* **Why this is not `debug_table_read_element`.** That resolves one row's byte offset and calls
|
|
6
|
+
* {@link inspect_gpu_buffer_typed}, which creates a `MAP_READ` buffer, copies, submits, maps and
|
|
7
|
+
* destroys it — per call. It is a debug affordance and stays one. Here the buffers persist, the
|
|
8
|
+
* requests of a frame travel together, and the result arrives at a stated moment rather than
|
|
9
|
+
* whenever a promise happens to settle.
|
|
10
|
+
*
|
|
11
|
+
* **The caller names memory, and nothing is called.** A request is a table handle, a row, a byte
|
|
12
|
+
* range of the record, and a `Uint8Array` plus offset to put it in. At the apply point the service
|
|
13
|
+
* copies the bytes there and marks the request's handle in {@link status}; the consumer reads the
|
|
14
|
+
* status when its own system next runs, which is when it wanted the value anyway. There is no
|
|
15
|
+
* callback and no promise, for the same reason: a function called per row is a closure allocated
|
|
16
|
+
* per row and a permanently megamorphic call site, and code running inside the apply point could
|
|
17
|
+
* re-enter this service, or destroy the database, from the middle of `GPUDatabase.update`. The
|
|
18
|
+
* shader packs a batch contiguously in request order, so a consumer's run of rows lands in its
|
|
19
|
+
* destination as one `set` — which a per-row function could never have done.
|
|
20
|
+
*
|
|
21
|
+
* **Gather, then one copy.** Rows sit at scattered offsets across pages, so a compute shader packs
|
|
22
|
+
* the requested ranges contiguously before a single copy into a readback buffer. Packing a *range*
|
|
23
|
+
* rather than a record is what makes it worth doing: an entity's world matrix is 64 bytes of a
|
|
24
|
+
* 176-byte row.
|
|
25
|
+
*
|
|
26
|
+
* **But the request list is itself an upload.** A gather needs its descriptors on the GPU, so every
|
|
27
|
+
* frame with any request writes a buffer, allocates, binds and dispatches. For one row that costs
|
|
28
|
+
* far more than the value retrieved. Below {@link DEFAULT_GATHER_THRESHOLD} — a measured number, see
|
|
29
|
+
* its docblock — the batch degrades to direct `copyBufferToBuffer` calls into the same readback
|
|
30
|
+
* buffer, with no shader at all. A frame with no requests skips the whole path: no buffer, no
|
|
31
|
+
* command.
|
|
32
|
+
*
|
|
33
|
+
* **One apply point, in encode order.** Results are delivered from {@link apply}, at the head of a
|
|
34
|
+
* frame, and never on the timing of the map's own promise. A component that changed value in the
|
|
35
|
+
* middle of an update because a readback happened to settle would be a different world for the
|
|
36
|
+
* systems that ran before it and the ones that ran after. And a batch is delivered only after every
|
|
37
|
+
* older batch has been: `mapAsync` promises are not promised to settle in the order the maps were
|
|
38
|
+
* started, and a consumer asking for the same row every frame must never see a fresh value
|
|
39
|
+
* overwritten by a stale one.
|
|
40
|
+
*
|
|
41
|
+
* **Nothing here may reach simulation state.** A readback is a frame or more late and settles on the
|
|
42
|
+
* GPU's own schedule, so an outcome that depended on one would depend on frame pacing, and the
|
|
43
|
+
* determinism gate with it. This answers tools, sounds and cosmetics. Where the simulation wants a
|
|
44
|
+
* GPU-owned pose it evaluates the chain exactly, on the CPU.
|
|
45
|
+
*
|
|
46
|
+
* @see GPUStateAuthority which says whose value is worth reading back in the first place
|
|
47
|
+
* @see GPUReadbackStatus
|
|
48
|
+
*/
|
|
49
|
+
export class GPUDatabaseReadback {
|
|
50
|
+
/**
|
|
51
|
+
* @param {Object} options
|
|
52
|
+
* @param {import("./GPUDatabase.js").GPUDatabase} options.database
|
|
53
|
+
* @param {GPUDevice} options.device
|
|
54
|
+
* @param {number} [options.gather_threshold] requests at or above which a dispatch is used
|
|
55
|
+
* @param {number} [options.max_in_flight] batches in flight before a frame's requests are dropped
|
|
56
|
+
* @param {string} [options.label]
|
|
57
|
+
*/
|
|
58
|
+
constructor({ database, device, gather_threshold, max_in_flight, label, }: {
|
|
59
|
+
database: import("./GPUDatabase.js").GPUDatabase;
|
|
60
|
+
device: GPUDevice;
|
|
61
|
+
gather_threshold?: number;
|
|
62
|
+
max_in_flight?: number;
|
|
63
|
+
label?: string;
|
|
64
|
+
});
|
|
65
|
+
/**
|
|
66
|
+
* Requests at or above which a batch is gathered rather than copied range by range.
|
|
67
|
+
* @returns {number}
|
|
68
|
+
*/
|
|
69
|
+
get gather_threshold(): number;
|
|
70
|
+
/**
|
|
71
|
+
* Batches in flight before a frame's requests are refused.
|
|
72
|
+
* @returns {number}
|
|
73
|
+
*/
|
|
74
|
+
get max_in_flight(): number;
|
|
75
|
+
/**
|
|
76
|
+
* Per handle, what became of the request — a {@link GPUReadbackStatus}.
|
|
77
|
+
*
|
|
78
|
+
* Read it fresh each time rather than keeping a reference: the array is replaced when the
|
|
79
|
+
* handle space grows. A status is readable for one frame, from the apply point that set it to
|
|
80
|
+
* the next.
|
|
81
|
+
*
|
|
82
|
+
* @returns {Uint8Array}
|
|
83
|
+
*/
|
|
84
|
+
get status(): Uint8Array;
|
|
85
|
+
/**
|
|
86
|
+
* How many handles exist. Grows to the working set of a steady stream of requests and stops:
|
|
87
|
+
* handles are recycled a frame after their result lands.
|
|
88
|
+
*
|
|
89
|
+
* @returns {number}
|
|
90
|
+
*/
|
|
91
|
+
get handle_capacity(): number;
|
|
92
|
+
/**
|
|
93
|
+
* Requests made and not yet encoded.
|
|
94
|
+
* @returns {number}
|
|
95
|
+
*/
|
|
96
|
+
get pending_count(): number;
|
|
97
|
+
/**
|
|
98
|
+
* Batches encoded and not yet delivered or discarded.
|
|
99
|
+
* @returns {number}
|
|
100
|
+
*/
|
|
101
|
+
get in_flight_count(): number;
|
|
102
|
+
/**
|
|
103
|
+
* How many `copyBufferToBuffer` calls this service has encoded, over its life. Read by profiles,
|
|
104
|
+
* and by the specs that assert an empty frame encodes nothing.
|
|
105
|
+
*
|
|
106
|
+
* @returns {number}
|
|
107
|
+
*/
|
|
108
|
+
get copies_encoded(): number;
|
|
109
|
+
/**
|
|
110
|
+
* How many gather dispatches this service has encoded, over its life.
|
|
111
|
+
* @returns {number}
|
|
112
|
+
*/
|
|
113
|
+
get dispatches_encoded(): number;
|
|
114
|
+
/**
|
|
115
|
+
* Requests whose bytes reached their target.
|
|
116
|
+
* @returns {number}
|
|
117
|
+
*/
|
|
118
|
+
get delivered_count(): number;
|
|
119
|
+
/**
|
|
120
|
+
* Requests thrown away because of the row — its page was not resident when the batch was
|
|
121
|
+
* encoded, it was not occupied, or it was freed before the answer landed.
|
|
122
|
+
*
|
|
123
|
+
* Reported rather than swallowed: a consumer whose readbacks are all being dropped is asking
|
|
124
|
+
* about rows that keep dying, and silence reads downstream as "the value did not change".
|
|
125
|
+
*
|
|
126
|
+
* @returns {number}
|
|
127
|
+
*/
|
|
128
|
+
get dropped_count(): number;
|
|
129
|
+
/**
|
|
130
|
+
* Requests thrown away because of the pipeline — {@link max_in_flight} batches were still
|
|
131
|
+
* waiting on the device when the frame's batch was due, or a mapping was refused. Separate
|
|
132
|
+
* from {@link dropped_count} because the cure is different: those rows died, these the device
|
|
133
|
+
* stopped answering about.
|
|
134
|
+
*
|
|
135
|
+
* @returns {number}
|
|
136
|
+
*/
|
|
137
|
+
get stalled_count(): number;
|
|
138
|
+
/**
|
|
139
|
+
* Resolve a table name to the handle {@link request} takes. Once, at setup: a string lookup
|
|
140
|
+
* per row per frame is what this exists to avoid.
|
|
141
|
+
*
|
|
142
|
+
* From here on the table counts how many times each of its rows is freed, which is what lets
|
|
143
|
+
* an answer about a row that died and was reused be told from an answer about the row asked
|
|
144
|
+
* for.
|
|
145
|
+
*
|
|
146
|
+
* @param {string} name
|
|
147
|
+
* @returns {number}
|
|
148
|
+
*/
|
|
149
|
+
table(name: string): number;
|
|
150
|
+
/**
|
|
151
|
+
* Ask for a byte range of a row to be copied into `target`, at a later apply point.
|
|
152
|
+
*
|
|
153
|
+
* Positional, and a few integer stores: this is called once per row per frame by anything that
|
|
154
|
+
* tracks rows, so it takes no options object and allocates nothing.
|
|
155
|
+
*
|
|
156
|
+
* @param {number} table from {@link table}
|
|
157
|
+
* @param {number} row
|
|
158
|
+
* @param {number} byte_offset within the record, word-aligned
|
|
159
|
+
* @param {number} byte_size a positive multiple of the word size
|
|
160
|
+
* @param {Uint8Array} target memory the caller owns and keeps; the bytes are written here at
|
|
161
|
+
* the apply point. A byte view on purpose — a consumer that reads floats holds a
|
|
162
|
+
* `Float32Array` over the same buffer, made once
|
|
163
|
+
* @param {number} [target_byte_offset]
|
|
164
|
+
* @returns {number} a handle into {@link status}, valid until the frame after its result lands
|
|
165
|
+
*/
|
|
166
|
+
request(table: number, row: number, byte_offset: number, byte_size: number, target: Uint8Array, target_byte_offset?: number): number;
|
|
167
|
+
/**
|
|
168
|
+
* Deliver every batch whose bytes have arrived, oldest first and stopping at the first that has
|
|
169
|
+
* not, then start the map for every batch whose frame has been submitted.
|
|
170
|
+
*
|
|
171
|
+
* **This is the apply point.** Call it at the head of a frame, before any system runs. A batch
|
|
172
|
+
* therefore reaches its targets at the first frame head at which its mapping — and every older
|
|
173
|
+
* batch's — has resolved, which is the frame after the one that encoded it at the earliest:
|
|
174
|
+
* never inside an update, and never at two different moments for two requests of the same
|
|
175
|
+
* batch. No caller-supplied code runs here.
|
|
176
|
+
*
|
|
177
|
+
* @returns {number} requests delivered
|
|
178
|
+
*/
|
|
179
|
+
apply(): number;
|
|
180
|
+
/**
|
|
181
|
+
* Record this frame's batch: a gather and one copy, or a handful of copies, or nothing at all.
|
|
182
|
+
*
|
|
183
|
+
* @param {import("../../../device/ShadeGPUCommandContext.js").ShadeGPUCommandContext} encoder
|
|
184
|
+
* @returns {boolean} whether anything was encoded
|
|
185
|
+
*/
|
|
186
|
+
encode(encoder: import("../../../device/ShadeGPUCommandContext.js").ShadeGPUCommandContext): boolean;
|
|
187
|
+
destroy(): void;
|
|
188
|
+
#private;
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=GPUDatabaseReadback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GPUDatabaseReadback.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/buffer/table/GPUDatabaseReadback.js"],"names":[],"mappings":"AA6LA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH;IA+II;;;;;;;OAOG;IACH;QAN2D,QAAQ,EAAxD,OAAO,kBAAkB,EAAE,WAAW;QACnB,MAAM;QACR,gBAAgB,GAAjC,MAAM;QACW,aAAa,GAA9B,MAAM;QACW,KAAK,GAAtB,MAAM;OAuBhB;IAED;;;OAGG;IACH,+BAEC;IAED;;;OAGG;IACH,4BAEC;IAED;;;;;;;;OAQG;IACH,yBAEC;IAED;;;;;OAKG;IACH,8BAEC;IAED;;;OAGG;IACH,4BAEC;IAED;;;OAGG;IACH,8BAEC;IAED;;;;;OAKG;IACH,6BAEC;IAED;;;OAGG;IACH,iCAEC;IAED;;;OAGG;IACH,8BAEC;IAED;;;;;;;;OAQG;IACH,4BAEC;IAED;;;;;;;OAOG;IACH,4BAEC;IAED;;;;;;;;;;OAUG;IACH,YAHW,MAAM,GACJ,MAAM,CAclB;IAED;;;;;;;;;;;;;;;OAeG;IACH,eAVW,MAAM,OACN,MAAM,eACN,MAAM,aACN,MAAM,UACN,UAAU,uBAGV,MAAM,GACJ,MAAM,CAgDlB;IAED;;;;;;;;;;;OAWG;IACH,SAFa,MAAM,CAwDlB;IAED;;;;;OAKG;IACH,gBAHW,OAAO,2CAA2C,EAAE,sBAAsB,GACxE,OAAO,CAyDnB;IAijBD,gBAyBC;;CACJ"}
|