@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,395 @@
|
|
|
1
|
+
import { assert } from "../../../../../core/assert.js";
|
|
2
|
+
import LineBuilder from "../../../../../core/codegen/LineBuilder.js";
|
|
3
|
+
import {
|
|
4
|
+
atomic_i32,
|
|
5
|
+
atomic_u32,
|
|
6
|
+
bool,
|
|
7
|
+
f32,
|
|
8
|
+
i32,
|
|
9
|
+
mat3x2f,
|
|
10
|
+
mat4x4f,
|
|
11
|
+
u32,
|
|
12
|
+
vec2f,
|
|
13
|
+
vec2i,
|
|
14
|
+
vec2u,
|
|
15
|
+
vec3f,
|
|
16
|
+
vec3i,
|
|
17
|
+
vec3u,
|
|
18
|
+
vec4f,
|
|
19
|
+
vec4i,
|
|
20
|
+
vec4u
|
|
21
|
+
} from "../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
22
|
+
import { GPU_DATABASE_BUFFER_ELEMENT_TYPE } from "../GPU_DATABASE_BUFFER_ELEMENT_TYPE.js";
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @typedef {import("../../../shader/type/WebGPUType.js").WebGPUType} WebGPUType
|
|
26
|
+
* @typedef {import("../../../shader/type/WebGPUStruct.js").WebGPUStruct} WebGPUStruct
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
const WORD_SIZE = GPU_DATABASE_BUFFER_ELEMENT_TYPE.size;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* How many words a primitive occupies, and which of the two views takes them — or `undefined` for
|
|
33
|
+
* a type this generator will not emit.
|
|
34
|
+
*
|
|
35
|
+
* The refusals are deliberate and they are all the same refusal: a matrix whose columns are
|
|
36
|
+
* `vec3` (`mat3x3f`, `mat2x3f`, `mat4x3f`) pads each column out to 16 bytes in WGSL, and
|
|
37
|
+
* {@link write_wgsl_type_value} writes its floats end to end instead. One of the two is wrong
|
|
38
|
+
* about where the second column starts, and generating code that agrees with the CPU writer would
|
|
39
|
+
* only pin the disagreement in a second place. `f16` is out for the same reason — half the views
|
|
40
|
+
* here are the wrong width for it.
|
|
41
|
+
*
|
|
42
|
+
* @type {Map<WebGPUType, {words: number, view: string}>}
|
|
43
|
+
*/
|
|
44
|
+
const PRIMITIVE_LAYOUT = new Map([
|
|
45
|
+
[bool, { words: 1, view: 'u32' }],
|
|
46
|
+
[u32, { words: 1, view: 'u32' }],
|
|
47
|
+
[atomic_u32, { words: 1, view: 'u32' }],
|
|
48
|
+
// An i32 goes through the u32 view: assignment into a `Uint32Array` is a `ToUint32`, which is
|
|
49
|
+
// the same thirty-two bits a two's-complement `Int32Array` store would leave.
|
|
50
|
+
[i32, { words: 1, view: 'u32' }],
|
|
51
|
+
[atomic_i32, { words: 1, view: 'u32' }],
|
|
52
|
+
[f32, { words: 1, view: 'f32' }],
|
|
53
|
+
|
|
54
|
+
[vec2i, { words: 2, view: 'u32' }],
|
|
55
|
+
[vec3i, { words: 3, view: 'u32' }],
|
|
56
|
+
[vec4i, { words: 4, view: 'u32' }],
|
|
57
|
+
|
|
58
|
+
[vec2u, { words: 2, view: 'u32' }],
|
|
59
|
+
[vec3u, { words: 3, view: 'u32' }],
|
|
60
|
+
[vec4u, { words: 4, view: 'u32' }],
|
|
61
|
+
|
|
62
|
+
[vec2f, { words: 2, view: 'f32' }],
|
|
63
|
+
[vec3f, { words: 3, view: 'f32' }],
|
|
64
|
+
[vec4f, { words: 4, view: 'f32' }],
|
|
65
|
+
|
|
66
|
+
// 16 floats end to end, which is both what WGSL lays out for a vec4-column matrix and what
|
|
67
|
+
// the CPU writer produces
|
|
68
|
+
[mat4x4f, { words: 16, view: 'f32' }],
|
|
69
|
+
// likewise: vec2 columns, 8 bytes each, no padding between them
|
|
70
|
+
[mat3x2f, { words: 6, view: 'f32' }],
|
|
71
|
+
]);
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* One destination the generated code stores into: a pair of views and the expression giving the
|
|
75
|
+
* word the record (or the range blob) starts at.
|
|
76
|
+
*
|
|
77
|
+
* @typedef {object} WriterTarget
|
|
78
|
+
* @property {string} f32 name of the `Float32Array` parameter
|
|
79
|
+
* @property {string} u32 name of the `Uint32Array` parameter
|
|
80
|
+
* @property {string} base name of the base-word parameter
|
|
81
|
+
* @property {function(number):number} word_of maps a byte offset within the record to a word index
|
|
82
|
+
* relative to `base`
|
|
83
|
+
*/
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Emit the stores that put `value_expr` — already bound to a local — at `byte_offset` within the
|
|
87
|
+
* record, into every target.
|
|
88
|
+
*
|
|
89
|
+
* @param {LineBuilder} builder
|
|
90
|
+
* @param {WriterTarget[]} targets
|
|
91
|
+
* @param {number} byte_offset within the record
|
|
92
|
+
* @param {WebGPUType} type
|
|
93
|
+
* @param {string} value_expr
|
|
94
|
+
*/
|
|
95
|
+
function emit_value(builder, targets, byte_offset, type, value_expr) {
|
|
96
|
+
if (type.isStruct === true) {
|
|
97
|
+
const fields = type.fields;
|
|
98
|
+
|
|
99
|
+
for (let i = 0; i < fields.length; i++) {
|
|
100
|
+
const field = fields[i];
|
|
101
|
+
|
|
102
|
+
emit_value(builder, targets, byte_offset + field.offset, field.type, `${value_expr}.${field.name}`);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (type.isArray === true) {
|
|
109
|
+
assert.notOk(type.runtime_sized, `'${type}' is runtime sized — a record is fixed width`);
|
|
110
|
+
|
|
111
|
+
const element_type = type.type;
|
|
112
|
+
const element_stride = element_type.aligned_size;
|
|
113
|
+
|
|
114
|
+
for (let i = 0; i < type.count; i++) {
|
|
115
|
+
emit_value(builder, targets, byte_offset + i * element_stride, element_type, `${value_expr}[${i}]`);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const layout = PRIMITIVE_LAYOUT.get(type);
|
|
122
|
+
|
|
123
|
+
if (layout === undefined) {
|
|
124
|
+
throw new Error(`Unsupported type '${type}' — see PRIMITIVE_LAYOUT for which types a record writer will emit and why`);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
assert.equal(byte_offset % WORD_SIZE, 0, `'${value_expr}' sits at byte ${byte_offset}, which is not a whole number of ${WORD_SIZE}-byte words into the record`);
|
|
128
|
+
|
|
129
|
+
const word = byte_offset / WORD_SIZE;
|
|
130
|
+
|
|
131
|
+
if (layout.words === 1) {
|
|
132
|
+
for (const target of targets) {
|
|
133
|
+
builder.add(`${target[layout.view]}[${target.base} + ${target.word_of(word)}] = ${value_expr};`);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
for (let i = 0; i < layout.words; i++) {
|
|
140
|
+
for (const target of targets) {
|
|
141
|
+
builder.add(`${target[layout.view]}[${target.base} + ${target.word_of(word + i)}] = ${value_expr}[${i}];`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Byte ranges covering `fields`, ascending, with touching or overlapping ones merged.
|
|
148
|
+
*
|
|
149
|
+
* Merging is what makes the result worth generating from rather than iterating: `NODE3D_STRUCT`'s
|
|
150
|
+
* four CPU-owned fields are three separate spans in the source declaration and two ranges once
|
|
151
|
+
* `pack()` and this have had their say, so a row's update costs two descriptors rather than four.
|
|
152
|
+
*
|
|
153
|
+
* @param {WGSLStructField[]} fields
|
|
154
|
+
* @returns {number[]} `[byte_offset, byte_length]` pairs
|
|
155
|
+
*/
|
|
156
|
+
function cover_fields(fields) {
|
|
157
|
+
const spans = fields
|
|
158
|
+
.map(field => [field.offset, field.offset + field.size])
|
|
159
|
+
.sort((a, b) => a[0] - b[0]);
|
|
160
|
+
|
|
161
|
+
const ranges = [];
|
|
162
|
+
|
|
163
|
+
let lo = spans[0][0];
|
|
164
|
+
let hi = spans[0][1];
|
|
165
|
+
|
|
166
|
+
for (let i = 1; i < spans.length; i++) {
|
|
167
|
+
const span = spans[i];
|
|
168
|
+
|
|
169
|
+
if (span[0] > hi) {
|
|
170
|
+
ranges.push(lo, hi - lo);
|
|
171
|
+
|
|
172
|
+
lo = span[0];
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
hi = Math.max(hi, span[1]);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
ranges.push(lo, hi - lo);
|
|
179
|
+
|
|
180
|
+
return ranges;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* A compiled writer for some subset of a record's fields — what {@link GPUTypedTable.set_record}
|
|
185
|
+
* and {@link GPUTypedTable.set_fields} take in place of walking the type.
|
|
186
|
+
*
|
|
187
|
+
* Built by {@link generate_record_writer}; there is no reason to construct one directly.
|
|
188
|
+
*/
|
|
189
|
+
export class GPURecordWriter {
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* The record type this writer was generated against. A table only accepts a writer whose type
|
|
193
|
+
* is its own — a writer carries hard-coded offsets, so handing one to the wrong table would
|
|
194
|
+
* scatter fields across a record that has nothing to do with them.
|
|
195
|
+
*
|
|
196
|
+
* @type {WebGPUStruct}
|
|
197
|
+
*/
|
|
198
|
+
type;
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Names of the fields this writer sets, in ascending offset order. Anything else in the record
|
|
202
|
+
* is left exactly as it was found, on every destination.
|
|
203
|
+
*
|
|
204
|
+
* @type {string[]}
|
|
205
|
+
*/
|
|
206
|
+
fields;
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* `[byte_offset, byte_length]` pairs covering {@link fields}, ascending and non-touching — the
|
|
210
|
+
* ranges {@link write_record_and_ranges} lays out, and the descriptors a partial upload
|
|
211
|
+
* queues for them.
|
|
212
|
+
*
|
|
213
|
+
* @type {number[]}
|
|
214
|
+
*/
|
|
215
|
+
ranges;
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Total words across {@link ranges} — what one row's update adds to a partial stream's data
|
|
219
|
+
* blob.
|
|
220
|
+
*
|
|
221
|
+
* @type {number}
|
|
222
|
+
*/
|
|
223
|
+
range_word_count;
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Write the owned fields of `value` into the record starting at word `word_base`.
|
|
227
|
+
*
|
|
228
|
+
* The destination is named as a pair of views rather than a buffer because it is not always a
|
|
229
|
+
* page: the same call patches a whole record already pending in an upload buffer, where the
|
|
230
|
+
* record starts one word past the element id.
|
|
231
|
+
*
|
|
232
|
+
* @type {function(Float32Array, Uint32Array, number, *):void}
|
|
233
|
+
* @param {Float32Array} f32
|
|
234
|
+
* @param {Uint32Array} u32
|
|
235
|
+
* @param {number} word_base word the record starts at
|
|
236
|
+
* @param {*} value
|
|
237
|
+
*/
|
|
238
|
+
write_record;
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* As {@link write_record}, and in the same pass lay {@link ranges} out end to end starting at
|
|
242
|
+
* `data_word_base` of a partial stream's data blob.
|
|
243
|
+
*
|
|
244
|
+
* One pass rather than a write followed by a copy: the ranges of a given struct are fixed when
|
|
245
|
+
* the writer is generated, so the two destinations of every field are both constants and the
|
|
246
|
+
* value is only read once.
|
|
247
|
+
*
|
|
248
|
+
* @type {function(Float32Array, Uint32Array, number, Float32Array, Uint32Array, number, *):void}
|
|
249
|
+
* @param {Float32Array} f32
|
|
250
|
+
* @param {Uint32Array} u32
|
|
251
|
+
* @param {number} word_base word the record starts at
|
|
252
|
+
* @param {Float32Array} data_f32
|
|
253
|
+
* @param {Uint32Array} data_u32
|
|
254
|
+
* @param {number} data_word_base word the first range is laid out at
|
|
255
|
+
* @param {*} value
|
|
256
|
+
*/
|
|
257
|
+
write_record_and_ranges;
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Source of the two generated functions, for a spec to read and a developer to print. Not used
|
|
261
|
+
* at runtime — the functions are already compiled.
|
|
262
|
+
*
|
|
263
|
+
* @type {string}
|
|
264
|
+
*/
|
|
265
|
+
source;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Compile a writer for `field_names` of `type`.
|
|
270
|
+
*
|
|
271
|
+
* {@link write_wgsl_type_value} walks the type on every record: a property lookup, a type
|
|
272
|
+
* dispatch and a `BinaryBuffer` cursor advance per field, per write. The offsets it arrives at are
|
|
273
|
+
* the same ones every time, so this arrives at them once and emits the stores.
|
|
274
|
+
*
|
|
275
|
+
* The fields a caller does *not* name matter as much as the ones it does. A consumer that owns
|
|
276
|
+
* part of a record — `GPUSceneContext` owns a node's local TRS and its parent row, the GPU owns
|
|
277
|
+
* the composed matrices — names its own, and gets both a writer that leaves the rest alone and
|
|
278
|
+
* the byte ranges to tell the GPU about. Naming every field instead gives a whole-record writer,
|
|
279
|
+
* which is what {@link GPUTypedTable.set} would have produced reflectively.
|
|
280
|
+
*
|
|
281
|
+
* @param {WebGPUStruct} type packed struct; offsets are read off its fields as they stand
|
|
282
|
+
* @param {string[]} [field_names] defaults to every field, in declaration order
|
|
283
|
+
* @returns {GPURecordWriter}
|
|
284
|
+
*/
|
|
285
|
+
export function generate_record_writer(type, field_names) {
|
|
286
|
+
assert.defined(type, 'type');
|
|
287
|
+
assert.equal(type.isWebGPUType, true, 'type.isWebGPUType !== true');
|
|
288
|
+
assert.equal(type.isStruct, true, `'${type}' is not a struct — a record writer is named fields, and there are none to name`);
|
|
289
|
+
assert.equal(type.size % WORD_SIZE, 0, `'${type}' is ${type.size} bytes, not a whole number of ${WORD_SIZE}-byte words`);
|
|
290
|
+
|
|
291
|
+
const names = field_names === undefined
|
|
292
|
+
? type.fields.map(field => field.name)
|
|
293
|
+
: field_names;
|
|
294
|
+
|
|
295
|
+
assert.isArray(names, 'field_names');
|
|
296
|
+
assert.greaterThan(names.length, 0, 'field_names.length');
|
|
297
|
+
|
|
298
|
+
const fields = names.map(name => type.get(name));
|
|
299
|
+
|
|
300
|
+
// Ascending offset, so the generated stores run forward through the record and the ranges they
|
|
301
|
+
// fill are laid out in the order the descriptors will name them.
|
|
302
|
+
fields.sort((a, b) => a.offset - b.offset);
|
|
303
|
+
|
|
304
|
+
const ranges = cover_fields(fields);
|
|
305
|
+
|
|
306
|
+
// Word index within the blob of each range's first word — the running total of the ranges
|
|
307
|
+
// before it.
|
|
308
|
+
const range_word_starts = [];
|
|
309
|
+
let range_word_count = 0;
|
|
310
|
+
|
|
311
|
+
for (let i = 0; i < ranges.length; i += 2) {
|
|
312
|
+
assert.equal(ranges[i] % WORD_SIZE, 0, `range starting at byte ${ranges[i]} of '${type}' is not word-aligned`);
|
|
313
|
+
assert.equal(ranges[i + 1] % WORD_SIZE, 0, `range of ${ranges[i + 1]} bytes in '${type}' is not a whole number of words`);
|
|
314
|
+
|
|
315
|
+
range_word_starts.push(range_word_count);
|
|
316
|
+
|
|
317
|
+
range_word_count += ranges[i + 1] / WORD_SIZE;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* Word index within the blob for a word index within the record.
|
|
322
|
+
*
|
|
323
|
+
* @param {number} word
|
|
324
|
+
* @returns {number}
|
|
325
|
+
*/
|
|
326
|
+
function blob_word_of(word) {
|
|
327
|
+
for (let i = 0; i < ranges.length; i += 2) {
|
|
328
|
+
const start = ranges[i] / WORD_SIZE;
|
|
329
|
+
const end = start + ranges[i + 1] / WORD_SIZE;
|
|
330
|
+
|
|
331
|
+
if (word >= start && word < end) {
|
|
332
|
+
return range_word_starts[i / 2] + (word - start);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
throw new Error(`word ${word} of '${type}' is not covered by any range — the cover is built from the same fields the stores are`);
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* @type {WriterTarget}
|
|
341
|
+
*/
|
|
342
|
+
const record_target = { f32: 'f32', u32: 'u32', base: 'word_base', word_of: word => word };
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* @type {WriterTarget}
|
|
346
|
+
*/
|
|
347
|
+
const blob_target = { f32: 'data_f32', u32: 'data_u32', base: 'data_word_base', word_of: blob_word_of };
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* @param {WriterTarget[]} targets
|
|
351
|
+
* @returns {string}
|
|
352
|
+
*/
|
|
353
|
+
function body(targets) {
|
|
354
|
+
const builder = new LineBuilder();
|
|
355
|
+
|
|
356
|
+
for (const field of fields) {
|
|
357
|
+
const local = `_${field.name}`;
|
|
358
|
+
|
|
359
|
+
builder.add(`const ${local} = value.${field.name};`);
|
|
360
|
+
|
|
361
|
+
emit_value(builder, targets, field.offset, field.type, local);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
return builder.build();
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
const record_body = body([record_target]);
|
|
368
|
+
const both_body = body([record_target, blob_target]);
|
|
369
|
+
|
|
370
|
+
const writer = new GPURecordWriter();
|
|
371
|
+
|
|
372
|
+
writer.type = type;
|
|
373
|
+
writer.fields = fields.map(field => field.name);
|
|
374
|
+
writer.ranges = ranges;
|
|
375
|
+
writer.range_word_count = range_word_count;
|
|
376
|
+
|
|
377
|
+
writer.write_record = new Function('f32', 'u32', 'word_base', 'value', record_body);
|
|
378
|
+
writer.write_record_and_ranges = new Function(
|
|
379
|
+
'f32', 'u32', 'word_base',
|
|
380
|
+
'data_f32', 'data_u32', 'data_word_base',
|
|
381
|
+
'value',
|
|
382
|
+
both_body
|
|
383
|
+
);
|
|
384
|
+
|
|
385
|
+
writer.source = [
|
|
386
|
+
`function write_record(f32, u32, word_base, value){`,
|
|
387
|
+
record_body,
|
|
388
|
+
`}`,
|
|
389
|
+
`function write_record_and_ranges(f32, u32, word_base, data_f32, data_u32, data_word_base, value){`,
|
|
390
|
+
both_body,
|
|
391
|
+
`}`,
|
|
392
|
+
].join('\n');
|
|
393
|
+
|
|
394
|
+
return writer;
|
|
395
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GPUSingleTypeTable.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GPUSingleTypeTable.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js"],"names":[],"mappings":"AA6EA;;;GAGG;AACH;IA4DI;;;;;;OAMG;IACH;QAJ8B,MAAM;QACL,IAAI,EAAxB,UAAU;QACO,YAAY,GAA7B,MAAM;OAoBhB;IApFD;;;OAGG;IACH,eAHU,UAAU,CAGf;IAEL;;;OAGG;IACH,2BAAM;IAEN;;;OAGG;IACH,sBAA2E;IAE3E;;;OAGG;IACH,kBAAyB;IA6BzB;;;OAGG;IACH,+BAEC;IA6BD;;;OAGG;IACH,WAFW,MAAM,QAQhB;IAED;;;OAGG;IACH,QAFY,MAAM,CAIjB;IAED;;;;OAIG;IACH,WAHW,MAAM,kBAyChB;IAgCD;;;;OAIG;IACH,aAHW,MAAM,OAiBhB;IAuCD;;;OAGG;IACH,oBAFW,sBAAsB,QAkDhC;IAED,0BAQC;IAED,gBAEC;;CACJ;qCA7WY,OAAO,8CAA8C,EAAE,sBAAsB;yBAC7E,OAAO,oCAAoC,EAAE,UAAU"}
|
|
@@ -2,6 +2,12 @@ import { assert } from "../../../../../core/assert.js";
|
|
|
2
2
|
import { BinaryBuffer } from "../../../../../core/binary/BinaryBuffer.js";
|
|
3
3
|
import { BitSet } from "../../../../../core/binary/BitSet.js";
|
|
4
4
|
import { platform_compute_endianness } from "../../../../../core/binary/platform_compute_endianness.js";
|
|
5
|
+
import {
|
|
6
|
+
u32_index_clear,
|
|
7
|
+
u32_index_count,
|
|
8
|
+
u32_index_get,
|
|
9
|
+
u32_index_set,
|
|
10
|
+
} from "../../../../../core/collection/map/u32_index.js";
|
|
5
11
|
import { round_up } from "../../../../../core/math/round_up.js";
|
|
6
12
|
import { KILOBYTE } from "../../../../../core/science/units/memory/KILOBYTE.js";
|
|
7
13
|
import { write_wgsl_type_value } from "../../../shader/type/serde/write_gpu_typed_buffer.js";
|
|
@@ -22,10 +28,6 @@ import { GPU_DATABASE_UPLOAD_DISPATCH_GROUP_SIZE } from "../GPU_DATABASE_UPLOAD_
|
|
|
22
28
|
const UPLOAD_BUFFER_LIMIT = 64 * KILOBYTE;
|
|
23
29
|
const INITIAL_BUFFER_SIZE = 4 * KILOBYTE;
|
|
24
30
|
|
|
25
|
-
// how many recent upload records set() scans for an existing record with the same id
|
|
26
|
-
// (see GPUTypedTable's constant of the same name)
|
|
27
|
-
const UPLOAD_BUFFER_DEDUP_LOOKBACK = 256;
|
|
28
|
-
|
|
29
31
|
const UPDATE_SETTINGS_STRUCT = WebGPUStruct.from({
|
|
30
32
|
count: u32,
|
|
31
33
|
record_size: u32,
|
|
@@ -102,6 +104,28 @@ export class GPUSingleTypeTable {
|
|
|
102
104
|
*/
|
|
103
105
|
occupancy = new BitSet();
|
|
104
106
|
|
|
107
|
+
/**
|
|
108
|
+
* Byte offset in {@link upload_buffer} of the record pending for an id, for every id that has
|
|
109
|
+
* one.
|
|
110
|
+
*
|
|
111
|
+
* Every record is consumed by its own thread of a single {@link update} dispatch, so two
|
|
112
|
+
* records aimed at one id are last-writer-wins across workgroups that have no ordering between
|
|
113
|
+
* them — the buffer must therefore hold at most one record per id. This was a backwards scan
|
|
114
|
+
* over the last 256 records, and a window is not a guarantee: a record further back than the
|
|
115
|
+
* scan reached stayed queued alongside the one that replaced it. The sibling
|
|
116
|
+
* {@link GPUTypedTable} was found doing exactly that, through a downstream report of corrupted
|
|
117
|
+
* animation bindings.
|
|
118
|
+
*
|
|
119
|
+
* No consumer of this table has reached it — each writes an id once per frame — which is the
|
|
120
|
+
* only reason it was latent rather than live here.
|
|
121
|
+
*
|
|
122
|
+
* `null` until the table takes its first write.
|
|
123
|
+
*
|
|
124
|
+
* @private
|
|
125
|
+
* @type {Uint32Array|null}
|
|
126
|
+
*/
|
|
127
|
+
#pending_records = null;
|
|
128
|
+
|
|
105
129
|
/**
|
|
106
130
|
* @type {GPUDevice}
|
|
107
131
|
*/
|
|
@@ -178,25 +202,20 @@ export class GPUSingleTypeTable {
|
|
|
178
202
|
const stride = this.type.aligned_size + u32.size;
|
|
179
203
|
const tail = upload_buffer.position;
|
|
180
204
|
|
|
181
|
-
// Dedupe against
|
|
182
|
-
// single update dispatch, so two records for the same id would race
|
|
205
|
+
// Dedupe against everything queued, not a window of it: each record is consumed by its own
|
|
206
|
+
// thread in a single update dispatch, so two records for the same id would race
|
|
183
207
|
// (last-writer-wins, non-deterministic). Overwrite the previous value in place.
|
|
184
|
-
const
|
|
185
|
-
UPLOAD_BUFFER_DEDUP_LOOKBACK,
|
|
186
|
-
Math.floor(tail / stride),
|
|
187
|
-
);
|
|
208
|
+
const pending_record = this.#pending_record_offset(id);
|
|
188
209
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
upload_buffer.position = candidate_start;
|
|
192
|
-
if (upload_buffer.readUint32() === id) {
|
|
193
|
-
write_wgsl_type_value(value, upload_buffer, this.type);
|
|
194
|
-
upload_buffer.position = tail;
|
|
195
|
-
return;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
210
|
+
if (pending_record >= 0) {
|
|
211
|
+
upload_buffer.position = pending_record + u32.size;
|
|
198
212
|
|
|
199
|
-
|
|
213
|
+
write_wgsl_type_value(value, upload_buffer, this.type);
|
|
214
|
+
|
|
215
|
+
upload_buffer.position = tail;
|
|
216
|
+
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
200
219
|
|
|
201
220
|
// Reserve the whole stride up front. The writes below only reach the last field,
|
|
202
221
|
// so on a type that pads out to `aligned_size` they would leave the buffer short
|
|
@@ -209,6 +228,37 @@ export class GPUSingleTypeTable {
|
|
|
209
228
|
|
|
210
229
|
upload_buffer.position = round_up(upload_buffer.position, stride);
|
|
211
230
|
|
|
231
|
+
this.#pending_records = u32_index_set(this.#pending_records, id, tail);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Byte offset of the record already pending for an id, or -1. One record per id is the
|
|
236
|
+
* invariant that keeps the update dispatch race-free — see {@link #pending_records}.
|
|
237
|
+
*
|
|
238
|
+
* Also where a stream dispatched since the last write gets noticed: {@link update} rewinds
|
|
239
|
+
* {@link upload_buffer} by moving its position back to zero and tells nobody, so the index can
|
|
240
|
+
* outlive the records it points at. {@link set} consults this before appending, which is what
|
|
241
|
+
* the staleness check rests on.
|
|
242
|
+
*
|
|
243
|
+
* @private
|
|
244
|
+
* @param {number} id
|
|
245
|
+
* @returns {number} byte offset of the pending record, or -1
|
|
246
|
+
*/
|
|
247
|
+
#pending_record_offset(id) {
|
|
248
|
+
const pending = this.#pending_records;
|
|
249
|
+
|
|
250
|
+
if (pending === null || u32_index_count(pending) === 0) {
|
|
251
|
+
return -1;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
if (this.upload_buffer.position === 0) {
|
|
255
|
+
// the stream was dispatched and rewound since these were recorded
|
|
256
|
+
u32_index_clear(pending);
|
|
257
|
+
|
|
258
|
+
return -1;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
return u32_index_get(pending, id);
|
|
212
262
|
}
|
|
213
263
|
|
|
214
264
|
/**
|
|
@@ -125,7 +125,7 @@ export class GPUDynamicMeshResidency {
|
|
|
125
125
|
*/
|
|
126
126
|
create_bindings(encoder, mesh, camera) {
|
|
127
127
|
const draw_buffer = encoder.allocateTransientValueBuffer(DYNAMIC_MESH_DRAW_STRUCT, {
|
|
128
|
-
model: mesh.
|
|
128
|
+
model: mesh.transform.matrix,
|
|
129
129
|
color: mesh.color,
|
|
130
130
|
});
|
|
131
131
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GPUGeometryBVHManager.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js"],"names":[],"mappings":"AAmBA;;;GAGG;AAEH;;;;;GAKG;AACH,gDAGG;AAEH;;;;;;;;;;;GAWG;AACH,sCAFU,MAAM,CAEyB;AAoBzC;;;;;;;;;;;;;;GAcG;AACH;IA0II;;;OAGG;IACH,+BAoDC;IA1LD;;;OAGG;IACH,iCAEC;IAOD;;;OAGG;IACH,6BAEC;IAuCD;;OAEG;IACH,gCAEC;IAOD;;OAEG;IACH,mCAEC;IA+BD;;OAEG;IACH,gCAEC;IA6ED;;;;OAIG;IACH,iCAEC;IAED,+BAoBC;IAED;;;;;;;;;;;;;;OAcG;IACH,cALW,MAAM,UACN,eAAe,GAEb,sBAAsB,CAalC;IA8DD;;;;;;;;;;;;OAYG;IACH,wBAHW,MAAM,GACJ;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAC,GAAC,SAAS,CAqB3I;IAED;;;;;;OAMG;IACH,mBAHW,MAAM,GACJ,MAAM,GAAC,SAAS,CAU5B;IAED;;;;;;;;;OASG;IACH,0BAFW,WAAW,QAQrB;IAED;;;;;;;;;;;OAWG;IACH,cAHW,MAAM,GACJ,OAAO,CA8BnB;
|
|
1
|
+
{"version":3,"file":"GPUGeometryBVHManager.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js"],"names":[],"mappings":"AAmBA;;;GAGG;AAEH;;;;;GAKG;AACH,gDAGG;AAEH;;;;;;;;;;;GAWG;AACH,sCAFU,MAAM,CAEyB;AAoBzC;;;;;;;;;;;;;;GAcG;AACH;IA0II;;;OAGG;IACH,+BAoDC;IA1LD;;;OAGG;IACH,iCAEC;IAOD;;;OAGG;IACH,6BAEC;IAuCD;;OAEG;IACH,gCAEC;IAOD;;OAEG;IACH,mCAEC;IA+BD;;OAEG;IACH,gCAEC;IA6ED;;;;OAIG;IACH,iCAEC;IAED,+BAoBC;IAED;;;;;;;;;;;;;;OAcG;IACH,cALW,MAAM,UACN,eAAe,GAEb,sBAAsB,CAalC;IA8DD;;;;;;;;;;;;OAYG;IACH,wBAHW,MAAM,GACJ;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAC,GAAC,SAAS,CAqB3I;IAED;;;;;;OAMG;IACH,mBAHW,MAAM,GACJ,MAAM,GAAC,SAAS,CAU5B;IAED;;;;;;;;;OASG;IACH,0BAFW,WAAW,QAQrB;IAED;;;;;;;;;;;OAWG;IACH,cAHW,MAAM,GACJ,OAAO,CA8BnB;IA4LD;;;;;;;OAOG;IACH,eAOC;;CAuIJ;8BAxzBY,OAAO,uBAAuB,EAAE,eAAe;yBAC/C,OAAO,sDAAsD,EAAE,UAAU;6BAbzD,mCAAmC;uCASzB,6BAA6B"}
|
|
@@ -584,11 +584,12 @@ export class GPUGeometryBVHManager {
|
|
|
584
584
|
return first_attempt;
|
|
585
585
|
}
|
|
586
586
|
|
|
587
|
-
//
|
|
588
|
-
//
|
|
589
|
-
//
|
|
590
|
-
// headroom
|
|
591
|
-
|
|
587
|
+
// What the allocation is waiting for is a free run reaching a whole bin, which is more
|
|
588
|
+
// than the shortfall and is the allocator's arithmetic to do rather than this caller's.
|
|
589
|
+
// #ensure_data_capacity rounds the answer up to a buffer alignment and applies its own
|
|
590
|
+
// growth step on top, which is amortisation and not headroom: both are relative to the
|
|
591
|
+
// buffer as it stands, so neither adds anything to a request that dwarfs it.
|
|
592
|
+
this.#ensure_data_capacity(this.#allocator.grow_target_for(node_count));
|
|
592
593
|
|
|
593
594
|
const second_attempt = this.#allocator.allocate(node_count);
|
|
594
595
|
|
|
@@ -26,9 +26,9 @@ export class GPUMeshletManager {
|
|
|
26
26
|
* Growing closes no holes, which is why it leaves {@link #deallocations_since_last_rebuild}
|
|
27
27
|
* alone: the holes it did not close are still there for a later {@link compact} to close.
|
|
28
28
|
*
|
|
29
|
-
* The arena an allocator is asked for is
|
|
30
|
-
*
|
|
31
|
-
*
|
|
29
|
+
* The arena an allocator is asked for is {@link OffsetAllocator#grow_target_for}, not the
|
|
30
|
+
* shortfall: room for exactly `extra_data_size` can still be refused the allocation that asked
|
|
31
|
+
* for it, and how much more than that it takes is the allocator's to say. And no larger than
|
|
32
32
|
* `maxBufferSize`: growth stops at what the device will hand out, so an arena that cannot
|
|
33
33
|
* hold the request reports that through the caller's failed allocation rather than through a
|
|
34
34
|
* buffer that is not there.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GPUMeshletManager.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/meshlet/GPUMeshletManager.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GPUMeshletManager.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/geometry/meshlet/GPUMeshletManager.js"],"names":[],"mappings":"AAuFA;IAqEI;;;;;;OAMG;IACH;QAJ8B,MAAM;QACR,qBAAqB,GAAtC,MAAM;QACW,yBAAyB,GAA1C,MAAM;OAkChB;IAzFD,6BAEC;IAOD,iCAEC;IAgFD,gBAKC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,sBAHW,MAAM,uBACN,MAAM,QAuHhB;IAqRD;;;;;;;;;;;OAWG;IACH,qBAJW,4BAA4B,GAE1B,OAAO,CAmBnB;IAgCD;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,+BAHW,4BAA4B,GAC1B,4BAA4B,CA8BxC;IAED;;;;;;;;;;;;OAYG;IACH,gBAFW,sBAAsB,QA8GhC;IAED,gBAGC;IAED;;;;OAIG;IACH,iBAHW,YAAY,GACV,4BAA4B,CA6BxC;IAED,mCASC;IAED,wCAQC;IAED,+BAYC;;CACJ;yBA/4BY,OAAO,sDAAsD,EAAE,UAAU;qCACzE,OAAO,2CAA2C,EAAE,sBAAsB;2BAC1E,OAAO,mBAAmB,EAAE,YAAY;AA6BrD;IACI;;OAEG;IACH,UAFU,UAAU,CAEZ;IACR;;OAEG;IACH,MAFU,UAAU,CAEhB;IAEJ;;;OAGG;IACH,WAFU,MAAM,CAEF;IAEd;;;OAGG;IACH,eAFU,MAAM,CAEE;IAElB;;;OAGG;IACH,0BAFU,WAAW,CAEI;IAEzB;;;OAGG;IACH,aAAsB;CACzB"}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { assert } from "../../../../core/assert.js";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
ALLOCATOR_NO_SPACE,
|
|
4
|
+
allocator_run_size_for,
|
|
5
|
+
OffsetAllocator
|
|
6
|
+
} from "../../../../core/binary/allocator/OffsetAllocator.js";
|
|
3
7
|
import { BinaryBuffer } from "../../../../core/binary/BinaryBuffer.js";
|
|
4
8
|
import { platform_compute_endianness } from "../../../../core/binary/platform_compute_endianness.js";
|
|
5
9
|
import Signal from "../../../../core/events/signal/Signal.js";
|
|
@@ -210,9 +214,9 @@ export class GPUMeshletManager {
|
|
|
210
214
|
* Growing closes no holes, which is why it leaves {@link #deallocations_since_last_rebuild}
|
|
211
215
|
* alone: the holes it did not close are still there for a later {@link compact} to close.
|
|
212
216
|
*
|
|
213
|
-
* The arena an allocator is asked for is
|
|
214
|
-
*
|
|
215
|
-
*
|
|
217
|
+
* The arena an allocator is asked for is {@link OffsetAllocator#grow_target_for}, not the
|
|
218
|
+
* shortfall: room for exactly `extra_data_size` can still be refused the allocation that asked
|
|
219
|
+
* for it, and how much more than that it takes is the allocator's to say. And no larger than
|
|
216
220
|
* `maxBufferSize`: growth stops at what the device will hand out, so an arena that cannot
|
|
217
221
|
* hold the request reports that through the caller's failed allocation rather than through a
|
|
218
222
|
* buffer that is not there.
|
|
@@ -247,7 +251,7 @@ export class GPUMeshletManager {
|
|
|
247
251
|
} else {
|
|
248
252
|
// grow
|
|
249
253
|
new_data_size = Math.max(
|
|
250
|
-
|
|
254
|
+
this.#allocator_data.grow_target_for(extra_data_size),
|
|
251
255
|
current_buffer_size_words + DATA_GROWTH_STEP,
|
|
252
256
|
Math.ceil(current_buffer_size_words * GROWTH_MULTIPLIER)
|
|
253
257
|
);
|
|
@@ -259,7 +263,7 @@ export class GPUMeshletManager {
|
|
|
259
263
|
} else {
|
|
260
264
|
// grow
|
|
261
265
|
new_metadata_size = Math.max(
|
|
262
|
-
|
|
266
|
+
this.#allocator_metadata.grow_target_for(extra_metadata_size),
|
|
263
267
|
current_metadata_buffer_size_elements + METADATA_GROWTH_STEP,
|
|
264
268
|
Math.ceil(current_metadata_buffer_size_elements * GROWTH_MULTIPLIER)
|
|
265
269
|
);
|
|
@@ -549,14 +553,14 @@ export class GPUMeshletManager {
|
|
|
549
553
|
|
|
550
554
|
// An allocator holding enough free space for the request it just refused is one whose
|
|
551
555
|
// space is scattered, and closing the holes is the only thing that helps. Anything else
|
|
552
|
-
// is a shortfall, which growth covers by appending.
|
|
553
|
-
//
|
|
554
|
-
//
|
|
556
|
+
// is a shortfall, which growth covers by appending. "Enough" is what a compaction would
|
|
557
|
+
// hand back — every hole as one run — measured against the run the request is accepted
|
|
558
|
+
// from, or a compaction could return the whole arena as one run and still be refused.
|
|
555
559
|
const data_is_fragmented = !data_ok
|
|
556
|
-
&& this.#allocator_data.freeStorage >=
|
|
560
|
+
&& this.#allocator_data.freeStorage >= allocator_run_size_for(data_size_words);
|
|
557
561
|
|
|
558
562
|
const metadata_is_fragmented = !metadata_ok
|
|
559
|
-
&& this.#allocator_metadata.freeStorage >=
|
|
563
|
+
&& this.#allocator_metadata.freeStorage >= allocator_run_size_for(meshlet_count);
|
|
560
564
|
|
|
561
565
|
// #rebuild zeroes the counter, so a compaction that does not free the request through
|
|
562
566
|
// leaves the next pass to grow — the loop always makes progress
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Requires a fairly beefy GPU to run, confirmed to work on RTX 4090.
|
|
3
3
|
* @param {Object} options
|
|
4
|
-
* @param {Scene} options.scene
|
|
4
|
+
* @param {Scene} options.scene the scene the renderer holds a context for — what is baked
|
|
5
5
|
* @param {Renderer} options.renderer
|
|
6
6
|
* @param {number} [options.cell_size=0.5] desired cell size for the voxel grid
|
|
7
7
|
* @param {number} [options.max_memory_usage_bytes] maximum memory usage in bytes, default is 16MB
|