@woosh/meep-engine 3.29.0 → 3.31.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/build/bundle-worker-image-decoder.js +1 -1
- package/build/bundle-worker-terrain.js +1 -1
- package/package.json +3 -1
- package/src/core/binary/BinaryBuffer.d.ts.map +1 -1
- package/src/core/binary/BinaryBuffer.js +56 -16
- package/src/core/binary/BitImage2.d.ts.map +1 -1
- package/src/core/binary/BitImage2.js +2 -6
- package/src/core/binary/BitSet.js +5 -5
- package/src/core/binary/compression/chunks_to_stream.d.ts +24 -0
- package/src/core/binary/compression/chunks_to_stream.d.ts.map +1 -0
- package/src/core/binary/compression/chunks_to_stream.js +35 -0
- package/src/core/binary/compression/compress_bytes.d.ts +3 -4
- package/src/core/binary/compression/compress_bytes.d.ts.map +1 -1
- package/src/core/binary/compression/compress_bytes.js +6 -17
- package/src/core/binary/compression/decompress_bytes.d.ts +1 -2
- package/src/core/binary/compression/decompress_bytes.d.ts.map +1 -1
- package/src/core/binary/compression/decompress_bytes.js +4 -15
- package/src/core/binary/compression/decompress_bytes_into.d.ts.map +1 -1
- package/src/core/binary/compression/decompress_bytes_into.js +2 -13
- package/src/core/binary/ctz32.d.ts +12 -4
- package/src/core/binary/ctz32.d.ts.map +1 -1
- package/src/core/binary/ctz32.js +23 -41
- package/src/core/binary/lsb_32.d.ts +10 -2
- package/src/core/binary/lsb_32.d.ts.map +1 -1
- package/src/core/binary/lsb_32.js +17 -12
- package/src/core/binary/lz4/lz4_compress_block_hc.js +2 -2
- package/src/core/binary/type/DataTypeIndices.d.ts +39 -0
- package/src/core/binary/type/DataTypeIndices.d.ts.map +1 -1
- package/src/core/binary/type/DataTypeIndices.js +38 -1
- package/src/core/binary/type/Type.d.ts.map +1 -1
- package/src/core/binary/type/Type.js +6 -1
- package/src/core/bvh2/bvh3/BVH.d.ts.map +1 -1
- package/src/core/bvh2/bvh3/BVH.js +14 -1
- package/src/core/bvh2/bvh3/ebvh_optimize_treelet.js +3 -3
- package/src/core/bvh8/bvh8_geometry_validate.d.ts.map +1 -1
- package/src/core/bvh8/bvh8_geometry_validate.js +2 -88
- package/src/core/bvh8/bvh8_geometry_validate_bounds.d.ts +25 -0
- package/src/core/bvh8/bvh8_geometry_validate_bounds.d.ts.map +1 -0
- package/src/core/bvh8/bvh8_geometry_validate_bounds.js +105 -0
- package/src/core/bvh8/bvh8_geometry_validate_indirect.d.ts.map +1 -1
- package/src/core/bvh8/bvh8_geometry_validate_indirect.js +2 -91
- package/src/core/cache/FrequencySketch.d.ts +3 -1
- package/src/core/cache/FrequencySketch.d.ts.map +1 -1
- package/src/core/cache/FrequencySketch.js +10 -4
- package/src/core/cache/wtinylfu/CacheWTinylfu.d.ts.map +1 -1
- package/src/core/cache/wtinylfu/CacheWTinylfu.js +24 -2
- package/src/core/clipboard/obtainClipBoard.d.ts +4 -0
- package/src/core/clipboard/obtainClipBoard.d.ts.map +1 -1
- package/src/core/clipboard/obtainClipBoard.js +29 -8
- package/src/core/clipboard/safeClipboardReadText.d.ts.map +1 -1
- package/src/core/clipboard/safeClipboardReadText.js +73 -38
- package/src/core/clipboard/safeClipboardWriteText.d.ts.map +1 -1
- package/src/core/clipboard/safeClipboardWriteText.js +11 -9
- package/src/core/collection/array/iterator/ArrayIteratorRandom.d.ts.map +1 -1
- package/src/core/collection/array/iterator/ArrayIteratorRandom.js +6 -0
- package/src/core/collection/heap/IndexedFloatMinHeap.d.ts +6 -0
- package/src/core/collection/heap/IndexedFloatMinHeap.d.ts.map +1 -1
- package/src/core/collection/heap/IndexedFloatMinHeap.js +14 -0
- package/src/core/collection/list/FilteredListProjection.d.ts.map +1 -1
- package/src/core/collection/list/FilteredListProjection.js +7 -54
- package/src/core/collection/list/List.d.ts +4 -0
- package/src/core/collection/list/List.d.ts.map +1 -1
- package/src/core/collection/list/List.js +10 -52
- package/src/core/collection/list/SortedListProjection.d.ts +7 -0
- package/src/core/collection/list/SortedListProjection.d.ts.map +1 -1
- package/src/core/collection/list/SortedListProjection.js +12 -0
- package/src/core/collection/list/list_apply_ordered_diff.d.ts +37 -0
- package/src/core/collection/list/list_apply_ordered_diff.d.ts.map +1 -0
- package/src/core/collection/list/list_apply_ordered_diff.js +87 -0
- package/src/core/collection/map/BiMap.d.ts.map +1 -1
- package/src/core/collection/map/BiMap.js +19 -6
- package/src/core/collection/map/HashMap.d.ts.map +1 -1
- package/src/core/collection/map/HashMap.js +38 -11
- package/src/core/collection/queue/Deque.d.ts +2 -2
- package/src/core/collection/queue/Deque.d.ts.map +1 -1
- package/src/core/collection/queue/Deque.js +12 -1
- package/src/core/collection/table/RowFirstTable.d.ts.map +1 -1
- package/src/core/collection/table/RowFirstTable.js +15 -2
- package/src/core/collection/table/serializeRowFirstTable.d.ts.map +1 -1
- package/src/core/collection/table/serializeRowFirstTable.js +2 -3
- package/src/core/color/operations/color_lerp.d.ts.map +1 -1
- package/src/core/color/operations/color_lerp.js +77 -55
- package/src/core/color/sRGB/linear_to_sRGB.d.ts.map +1 -1
- package/src/core/color/sRGB/linear_to_sRGB.js +3 -1
- package/src/core/debug/matchers/AllOf.d.ts +2 -1
- package/src/core/debug/matchers/AllOf.d.ts.map +1 -1
- package/src/core/debug/matchers/AllOf.js +1 -1
- package/src/core/debug/matchers/AnyOf.d.ts +2 -1
- package/src/core/debug/matchers/AnyOf.d.ts.map +1 -1
- package/src/core/debug/matchers/AnyOf.js +1 -1
- package/src/core/debug/matchers/CombinableMatcher.d.ts +2 -1
- package/src/core/debug/matchers/CombinableMatcher.d.ts.map +1 -1
- package/src/core/debug/matchers/CombinableMatcher.js +1 -1
- package/src/core/debug/matchers/DescribeAs.d.ts +2 -1
- package/src/core/debug/matchers/DescribeAs.d.ts.map +1 -1
- package/src/core/debug/matchers/DescribeAs.js +2 -1
- package/src/core/debug/matchers/IsAnything.d.ts +2 -1
- package/src/core/debug/matchers/IsAnything.d.ts.map +1 -1
- package/src/core/debug/matchers/IsAnything.js +2 -1
- package/src/core/debug/matchers/IsEqual.d.ts +2 -1
- package/src/core/debug/matchers/IsEqual.d.ts.map +1 -1
- package/src/core/debug/matchers/IsEqual.js +2 -1
- package/src/core/debug/matchers/IsFinite.d.ts +2 -1
- package/src/core/debug/matchers/IsFinite.d.ts.map +1 -1
- package/src/core/debug/matchers/IsFinite.js +2 -1
- package/src/core/debug/matchers/IsIn.d.ts +2 -1
- package/src/core/debug/matchers/IsIn.d.ts.map +1 -1
- package/src/core/debug/matchers/IsIn.js +2 -1
- package/src/core/debug/matchers/IsInteger.d.ts +2 -1
- package/src/core/debug/matchers/IsInteger.d.ts.map +1 -1
- package/src/core/debug/matchers/IsInteger.js +2 -1
- package/src/core/debug/matchers/IsIterableContaining.d.ts +2 -1
- package/src/core/debug/matchers/IsIterableContaining.d.ts.map +1 -1
- package/src/core/debug/matchers/IsIterableContaining.js +1 -1
- package/src/core/debug/matchers/IsNot.d.ts +2 -1
- package/src/core/debug/matchers/IsNot.d.ts.map +1 -1
- package/src/core/debug/matchers/IsNot.js +2 -1
- package/src/core/debug/matchers/IsNull.d.ts +2 -1
- package/src/core/debug/matchers/IsNull.d.ts.map +1 -1
- package/src/core/debug/matchers/IsNull.js +2 -1
- package/src/core/debug/matchers/IsUndefined.d.ts +2 -1
- package/src/core/debug/matchers/IsUndefined.d.ts.map +1 -1
- package/src/core/debug/matchers/IsUndefined.js +2 -1
- package/src/core/events/signal/Signal.d.ts +15 -0
- package/src/core/events/signal/Signal.d.ts.map +1 -1
- package/src/core/events/signal/Signal.js +857 -820
- package/src/core/fsm/simple/SimpleStateMachineDescription.d.ts.map +1 -1
- package/src/core/fsm/simple/SimpleStateMachineDescription.js +4 -3
- package/src/core/geom/2d/convex-hull/convex_hull_fixed_count_2d_bruteforce.d.ts.map +1 -1
- package/src/core/geom/2d/convex-hull/convex_hull_fixed_count_2d_bruteforce.js +6 -1
- package/src/core/geom/2d/convex-hull/convex_hull_fixed_count_2d_relaxation.d.ts +1 -1
- package/src/core/geom/2d/convex-hull/convex_hull_fixed_count_2d_relaxation.d.ts.map +1 -1
- package/src/core/geom/2d/convex-hull/convex_hull_fixed_count_2d_relaxation.js +6 -7
- package/src/core/geom/2d/hash-grid/SpatialHashGrid.d.ts.map +1 -1
- package/src/core/geom/2d/hash-grid/SpatialHashGrid.js +23 -6
- package/src/core/geom/2d/line/ray2_ray2_compute_intersection_array_2d.d.ts.map +1 -1
- package/src/core/geom/2d/line/ray2_ray2_compute_intersection_array_2d.js +13 -1
- package/src/core/geom/3d/aabb/aabb3_raycast_hit_point.d.ts.map +1 -1
- package/src/core/geom/3d/aabb/aabb3_raycast_hit_point.js +53 -32
- package/src/core/geom/3d/atlas/segment/atlas_chart_growth_cost.d.ts +40 -0
- package/src/core/geom/3d/atlas/segment/atlas_chart_growth_cost.d.ts.map +1 -0
- package/src/core/geom/3d/atlas/segment/atlas_chart_growth_cost.js +54 -0
- package/src/core/geom/3d/atlas/segment/atlas_segment_charts.d.ts +21 -3
- package/src/core/geom/3d/atlas/segment/atlas_segment_charts.d.ts.map +1 -1
- package/src/core/geom/3d/atlas/segment/atlas_segment_charts.js +24 -15
- package/src/core/geom/3d/atlas/segment/atlas_segment_charts_atomic.d.ts +6 -3
- package/src/core/geom/3d/atlas/segment/atlas_segment_charts_atomic.d.ts.map +1 -1
- package/src/core/geom/3d/atlas/segment/atlas_segment_charts_atomic.js +9 -15
- package/src/core/geom/3d/cone/cone_compute_plane_side.d.ts.map +1 -1
- package/src/core/geom/3d/cone/cone_compute_plane_side.js +31 -19
- package/src/core/geom/3d/equirectangular/equirectangular_direction_to_uv.d.ts +11 -1
- package/src/core/geom/3d/equirectangular/equirectangular_direction_to_uv.d.ts.map +1 -1
- package/src/core/geom/3d/equirectangular/equirectangular_direction_to_uv.js +11 -1
- package/src/core/geom/3d/equirectangular/equirectangular_uv_to_direction.d.ts +11 -1
- package/src/core/geom/3d/equirectangular/equirectangular_uv_to_direction.d.ts.map +1 -1
- package/src/core/geom/3d/equirectangular/equirectangular_uv_to_direction.js +11 -1
- package/src/core/geom/3d/frustum/frustum3_compute_closest_point.d.ts.map +1 -1
- package/src/core/geom/3d/frustum/frustum3_compute_closest_point.js +55 -0
- package/src/core/geom/3d/frustum/frustum_from_projection_matrix_array.d.ts +14 -0
- package/src/core/geom/3d/frustum/frustum_from_projection_matrix_array.d.ts.map +1 -1
- package/src/core/geom/3d/frustum/frustum_from_projection_matrix_array.js +17 -1
- package/src/core/geom/3d/gjk/gjk.d.ts +15 -0
- package/src/core/geom/3d/gjk/gjk.d.ts.map +1 -1
- package/src/core/geom/3d/gjk/gjk.js +15 -0
- package/src/core/geom/3d/gjk/gjk_epa_penetration.d.ts.map +1 -1
- package/src/core/geom/3d/gjk/gjk_epa_penetration.js +18 -0
- package/src/core/geom/3d/hash-grid/PointHashGrid3.d.ts +32 -3
- package/src/core/geom/3d/hash-grid/PointHashGrid3.d.ts.map +1 -1
- package/src/core/geom/3d/hash-grid/PointHashGrid3.js +36 -3
- package/src/core/geom/3d/morton/v3_morton_encode_lut.d.ts.map +1 -1
- package/src/core/geom/3d/morton/v3_morton_encode_lut.js +11 -4
- package/src/core/geom/3d/morton/v3_morton_encode_normalized.d.ts +16 -4
- package/src/core/geom/3d/morton/v3_morton_encode_normalized.d.ts.map +1 -1
- package/src/core/geom/3d/morton/v3_morton_encode_normalized.js +21 -8
- package/src/core/geom/3d/normal/spherical/encode_unit_to_spheremap.d.ts.map +1 -1
- package/src/core/geom/3d/normal/spherical/encode_unit_to_spheremap.js +17 -3
- package/src/core/geom/3d/octahedra/octahedral_direction_to_uv.d.ts +10 -0
- package/src/core/geom/3d/octahedra/octahedral_direction_to_uv.d.ts.map +1 -1
- package/src/core/geom/3d/octahedra/octahedral_direction_to_uv.js +46 -49
- package/src/core/geom/3d/octahedra/octahedral_uv_to_direction.d.ts +13 -1
- package/src/core/geom/3d/octahedra/octahedral_uv_to_direction.d.ts.map +1 -1
- package/src/core/geom/3d/octahedra/octahedral_uv_to_direction.js +36 -39
- package/src/core/geom/3d/quadric/quadric3_to_tensor_m3_inverse.d.ts +4 -1
- package/src/core/geom/3d/quadric/quadric3_to_tensor_m3_inverse.d.ts.map +1 -1
- package/src/core/geom/3d/quadric/quadric3_to_tensor_m3_inverse.js +22 -4
- package/src/core/geom/3d/quaternion/quat3_canonicalize_sign_run.d.ts +38 -0
- package/src/core/geom/3d/quaternion/quat3_canonicalize_sign_run.d.ts.map +1 -0
- package/src/core/geom/3d/quaternion/quat3_canonicalize_sign_run.js +76 -0
- package/src/core/geom/3d/quaternion/quat3_encode_to_uint32.d.ts +11 -0
- package/src/core/geom/3d/quaternion/quat3_encode_to_uint32.d.ts.map +1 -1
- package/src/core/geom/3d/quaternion/quat3_encode_to_uint32.js +14 -34
- package/src/core/geom/3d/shape/PosedShape3D.d.ts +9 -0
- package/src/core/geom/3d/shape/PosedShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/PosedShape3D.js +43 -0
- package/src/core/geom/3d/shape/UnionShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/UnionShape3D.js +20 -3
- package/src/core/geom/3d/shape/json/type_adapters.d.ts +11 -2
- package/src/core/geom/3d/shape/json/type_adapters.d.ts.map +1 -1
- package/src/core/geom/3d/shape/json/type_adapters.js +36 -12
- package/src/core/geom/3d/sphere/harmonics/sh3_sample_irradiance_by_direction.d.ts +13 -0
- package/src/core/geom/3d/sphere/harmonics/sh3_sample_irradiance_by_direction.d.ts.map +1 -1
- package/src/core/geom/3d/sphere/harmonics/sh3_sample_irradiance_by_direction.js +17 -4
- package/src/core/geom/3d/tetrahedra/tetrahedral_flip_layouts.d.ts +88 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_flip_layouts.d.ts.map +1 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_flip_layouts.js +108 -0
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_23.d.ts.map +1 -1
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_23.js +13 -31
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_32.d.ts.map +1 -1
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_32.js +14 -22
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_improve_quality.d.ts.map +1 -1
- package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_improve_quality.js +96 -26
- package/src/core/geom/3d/tetrahedra/tetrahedron_contains_point.d.ts.map +1 -1
- package/src/core/geom/3d/tetrahedra/tetrahedron_contains_point.js +17 -6
- package/src/core/geom/3d/topology/struct/binary/io/bt_boundary_loop.d.ts +27 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_boundary_loop.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_boundary_loop.js +101 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.d.ts +3 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.js +5 -57
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.d.ts +20 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.js +68 -35
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_fill_small_holes.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_fill_small_holes.js +2 -43
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts +72 -21
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.js +452 -99
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill_parallels.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill_parallels.js +4 -15
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_mesh_split_pinched_vertices.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_mesh_split_pinched_vertices.js +13 -1
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_fuse_duplicate_edges.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_fuse_duplicate_edges.js +3 -1
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_replace.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_replace.js +22 -3
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_fold_limit.d.ts +25 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_fold_limit.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_fold_limit.js +228 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_would_fold.d.ts +13 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_would_fold.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_collapse_would_fold.js +10 -128
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_count_faces.d.ts +17 -2
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_count_faces.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_count_faces.js +28 -4
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_get.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_edge_get.js +8 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_edge_adjacent_faces_weighted.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_face_get_edge_adjacent_faces_weighted.js +10 -2
- package/src/core/geom/3d/topology/struct/binary/query/bt_face_island_flood_fill.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_face_island_flood_fill.js +2 -0
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_boundary_distance_field.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_boundary_distance_field.js +25 -5
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_face_bvh.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_build_face_bvh.js +11 -1
- package/src/core/geom/3d/triangle/tri3_compute_normal.d.ts +5 -1
- package/src/core/geom/3d/triangle/tri3_compute_normal.d.ts.map +1 -1
- package/src/core/geom/3d/triangle/tri3_compute_normal.js +8 -1
- package/src/core/geom/3d/triangle/tri3_ray_intersection.d.ts.map +1 -1
- package/src/core/geom/3d/triangle/tri3_ray_intersection.js +15 -3
- package/src/core/geom/3d/triangle/tri3_ray_intersection_barycentric.d.ts +2 -1
- package/src/core/geom/3d/triangle/tri3_ray_intersection_barycentric.d.ts.map +1 -1
- package/src/core/geom/3d/triangle/tri3_ray_intersection_barycentric.js +2 -1
- package/src/core/geom/3d/triangle/tri3_ray_intersection_barycentric_edge.d.ts +1 -1
- package/src/core/geom/3d/triangle/tri3_ray_intersection_barycentric_edge.d.ts.map +1 -1
- package/src/core/geom/3d/triangle/tri3_ray_intersection_barycentric_edge.js +8 -1
- package/src/core/geom/vec/vector_normalize.d.ts.map +1 -1
- package/src/core/geom/vec/vector_normalize.js +5 -1
- package/src/core/geom/vec3/v3_slerp.d.ts.map +1 -1
- package/src/core/geom/vec3/v3_slerp.js +69 -4
- package/src/core/geom/vec4/v4_max_axis.d.ts +28 -0
- package/src/core/geom/vec4/v4_max_axis.d.ts.map +1 -0
- package/src/core/geom/vec4/v4_max_axis.js +41 -0
- package/src/core/graph/coloring/colorizeGraph.js +10 -7
- package/src/core/graph/layout/graph_peel_topological_layer.d.ts.map +1 -1
- package/src/core/graph/layout/graph_peel_topological_layer.js +16 -2
- package/src/core/graph/mn_graph_collapse_weighted_edge.js +6 -6
- package/src/core/json/JsonUtils.d.ts.map +1 -1
- package/src/core/json/JsonUtils.js +6 -2
- package/src/core/json/abstractJSONSerializer.d.ts.map +1 -1
- package/src/core/json/abstractJSONSerializer.js +5 -1
- package/src/core/lang/reactive/ReactiveOperatorType.d.ts +20 -0
- package/src/core/lang/reactive/ReactiveOperatorType.d.ts.map +1 -1
- package/src/core/lang/reactive/ReactiveOperatorType.js +34 -12
- package/src/core/localization/LanguageMetadata.d.ts +2 -1
- package/src/core/localization/LanguageMetadata.d.ts.map +1 -1
- package/src/core/localization/LanguageMetadata.js +6 -0
- package/src/core/localization/Localization.d.ts.map +1 -1
- package/src/core/localization/Localization.js +23 -10
- package/src/core/localization/LocalizationEngine.d.ts.map +1 -1
- package/src/core/localization/LocalizationEngine.js +4 -0
- package/src/core/math/fract.d.ts.map +1 -1
- package/src/core/math/fract.js +4 -3
- package/src/core/math/hash/squirrel3.d.ts +10 -2
- package/src/core/math/hash/squirrel3.d.ts.map +1 -1
- package/src/core/math/hash/squirrel3.js +16 -8
- package/src/core/math/linalg/m2/m2_polar_decomp_noS.d.ts +7 -0
- package/src/core/math/linalg/m2/m2_polar_decomp_noS.d.ts.map +1 -1
- package/src/core/math/linalg/m2/m2_polar_decomp_noS.js +20 -1
- package/src/core/math/lookup/ParameterLookupTable.d.ts.map +1 -1
- package/src/core/math/lookup/ParameterLookupTable.js +10 -5
- package/src/core/math/noise/sdnoise.d.ts.map +1 -1
- package/src/core/math/noise/sdnoise.js +16 -10
- package/src/core/math/physics/pdf/pdf_normal.d.ts +11 -3
- package/src/core/math/physics/pdf/pdf_normal.d.ts.map +1 -1
- package/src/core/math/physics/pdf/pdf_normal.js +25 -11
- package/src/core/math/solveQuadratic.d.ts.map +1 -1
- package/src/core/math/solveQuadratic.js +22 -3
- package/src/core/math/statistics/computeStatisticalPartialMedian.d.ts +9 -2
- package/src/core/math/statistics/computeStatisticalPartialMedian.d.ts.map +1 -1
- package/src/core/math/statistics/computeStatisticalPartialMedian.js +12 -6
- package/src/core/math/statistics/computeStatisticalPercentile.d.ts.map +1 -1
- package/src/core/math/statistics/computeStatisticalPercentile.js +9 -2
- package/src/core/math/statistics/gaussian_amplitude.d.ts +10 -1
- package/src/core/math/statistics/gaussian_amplitude.d.ts.map +1 -1
- package/src/core/math/statistics/gaussian_amplitude.js +20 -15
- package/src/core/model/BooleanVector3.d.ts.map +1 -1
- package/src/core/model/BooleanVector3.js +18 -2
- package/src/core/model/BoundedValue.d.ts +9 -0
- package/src/core/model/BoundedValue.d.ts.map +1 -1
- package/src/core/model/BoundedValue.js +30 -3
- package/src/core/model/ObservedBoolean.d.ts.map +1 -1
- package/src/core/model/ObservedBoolean.js +22 -2
- package/src/core/model/ObservedEnum.d.ts.map +1 -1
- package/src/core/model/ObservedEnum.js +6 -2
- package/src/core/model/node-graph/NodeGraph.d.ts +6 -1
- package/src/core/model/node-graph/NodeGraph.d.ts.map +1 -1
- package/src/core/model/node-graph/NodeGraph.js +22 -4
- package/src/core/model/node-graph/json/deserializeNodeGraphFromJSON.d.ts.map +1 -1
- package/src/core/model/node-graph/json/deserializeNodeGraphFromJSON.js +3 -1
- package/src/core/model/node-graph/json/serializeNodeGraphToJSON.d.ts.map +1 -1
- package/src/core/model/node-graph/json/serializeNodeGraphToJSON.js +5 -0
- package/src/core/model/node-graph/type/DataType.d.ts.map +1 -1
- package/src/core/model/node-graph/type/DataType.js +8 -0
- package/src/core/model/node-graph/type/ParametricDataType.d.ts.map +1 -1
- package/src/core/model/node-graph/type/ParametricDataType.js +19 -0
- package/src/core/model/node-graph/visual/NodeGraphVisualData.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/NodeGraphVisualData.js +5 -0
- package/src/core/model/object/ImmutableObjectPool.d.ts.map +1 -1
- package/src/core/model/object/ImmutableObjectPool.js +17 -7
- package/src/core/model/reactive/js/compileReactiveToJS.d.ts +22 -0
- package/src/core/model/reactive/js/compileReactiveToJS.d.ts.map +1 -1
- package/src/core/model/reactive/js/compileReactiveToJS.js +113 -219
- package/src/core/model/reactive/model/ReactiveBinaryExpression.d.ts.map +1 -1
- package/src/core/model/reactive/model/ReactiveBinaryExpression.js +8 -2
- package/src/core/model/reactive/model/comparative/ReactiveEquals.d.ts.map +1 -1
- package/src/core/model/reactive/model/comparative/ReactiveEquals.js +3 -1
- package/src/core/model/reactive/model/comparative/ReactiveNotEquals.d.ts.map +1 -1
- package/src/core/model/reactive/model/comparative/ReactiveNotEquals.js +2 -1
- package/src/core/model/reactive/model/terminal/ReactiveLiteralString.d.ts.map +1 -1
- package/src/core/model/reactive/model/terminal/ReactiveLiteralString.js +4 -2
- package/src/core/model/stat/Stat.d.ts.map +1 -1
- package/src/core/model/stat/Stat.js +4 -0
- package/src/core/parser/seedVariablesIntoTemplateString.d.ts.map +1 -1
- package/src/core/parser/seedVariablesIntoTemplateString.js +5 -0
- package/src/core/parser/simple/readArrayLiteral.d.ts.map +1 -1
- package/src/core/parser/simple/readArrayLiteral.js +7 -0
- package/src/core/parser/simple/readHexToken.d.ts +3 -0
- package/src/core/parser/simple/readHexToken.d.ts.map +1 -1
- package/src/core/parser/simple/readHexToken.js +39 -106
- package/src/core/parser/simple/readNumberToken.d.ts.map +1 -1
- package/src/core/parser/simple/readNumberToken.js +13 -4
- package/src/core/parser/simple/readUnsignedIntegerToken.d.ts +2 -0
- package/src/core/parser/simple/readUnsignedIntegerToken.d.ts.map +1 -1
- package/src/core/parser/simple/readUnsignedIntegerToken.js +31 -71
- package/src/core/parser/simple/read_digits.d.ts +31 -0
- package/src/core/parser/simple/read_digits.d.ts.map +1 -0
- package/src/core/parser/simple/read_digits.js +74 -0
- package/src/core/primitives/numbers/number_format_by_thousands.d.ts.map +1 -1
- package/src/core/primitives/numbers/number_format_by_thousands.js +16 -1
- package/src/core/primitives/numbers/number_pretty_print.d.ts.map +1 -1
- package/src/core/primitives/numbers/number_pretty_print.js +6 -1
- package/src/core/process/executor/ConcurrentExecutor.d.ts +1 -5
- package/src/core/process/executor/ConcurrentExecutor.d.ts.map +1 -1
- package/src/core/process/executor/ConcurrentExecutor.js +131 -1
- package/src/core/process/task/Task.d.ts +8 -0
- package/src/core/process/task/Task.d.ts.map +1 -1
- package/src/core/process/task/Task.js +12 -1
- package/src/core/process/task/TaskGroup.d.ts +6 -0
- package/src/core/process/task/TaskGroup.d.ts.map +1 -1
- package/src/core/process/task/TaskGroup.js +7 -1
- package/src/core/process/task/task_find_dependency_cycle.d.ts +17 -0
- package/src/core/process/task/task_find_dependency_cycle.d.ts.map +1 -0
- package/src/core/process/task/task_find_dependency_cycle.js +81 -0
- package/src/core/process/undo/ActionProcessor.d.ts +12 -0
- package/src/core/process/undo/ActionProcessor.d.ts.map +1 -1
- package/src/core/process/undo/ActionProcessor.js +41 -15
- package/src/core/process/worker/OnDemandWorkerManager.d.ts.map +1 -1
- package/src/core/process/worker/OnDemandWorkerManager.js +6 -1
- package/src/core/process/worker/WorkerBuilder.d.ts.map +1 -1
- package/src/core/process/worker/WorkerBuilder.js +27 -5
- package/src/core/wfc/WFCCellChoice.d.ts +17 -0
- package/src/core/wfc/WFCCellChoice.d.ts.map +1 -0
- package/src/core/wfc/WFCCellChoice.js +36 -0
- package/src/core/wfc/WFCLattice.d.ts +105 -0
- package/src/core/wfc/WFCLattice.d.ts.map +1 -0
- package/src/core/wfc/WFCLattice.js +235 -0
- package/src/core/wfc/WFCRuleTable.d.ts +172 -0
- package/src/core/wfc/WFCRuleTable.d.ts.map +1 -0
- package/src/core/wfc/WFCRuleTable.js +334 -0
- package/src/core/wfc/WFCState.d.ts +273 -0
- package/src/core/wfc/WFCState.d.ts.map +1 -0
- package/src/core/wfc/WFCState.js +552 -0
- package/src/core/wfc/WFCStatus.d.ts +11 -0
- package/src/core/wfc/WFCStatus.d.ts.map +1 -0
- package/src/core/wfc/WFCStatus.js +28 -0
- package/src/core/wfc/WFCTileWeights.d.ts +48 -0
- package/src/core/wfc/WFCTileWeights.d.ts.map +1 -0
- package/src/core/wfc/WFCTileWeights.js +86 -0
- package/src/core/wfc/WFC_UNRESOLVED.d.ts +12 -0
- package/src/core/wfc/WFC_UNRESOLVED.d.ts.map +1 -0
- package/src/core/wfc/WFC_UNRESOLVED.js +11 -0
- package/src/core/wfc/wfc_estimate_bytes.d.ts +24 -0
- package/src/core/wfc/wfc_estimate_bytes.d.ts.map +1 -0
- package/src/core/wfc/wfc_estimate_bytes.js +47 -0
- package/src/core/wfc/wfc_rule_table_tile_components.d.ts +27 -0
- package/src/core/wfc/wfc_rule_table_tile_components.d.ts.map +1 -0
- package/src/core/wfc/wfc_rule_table_tile_components.js +80 -0
- package/src/core/wfc/wfc_solve.d.ts +21 -0
- package/src/core/wfc/wfc_solve.d.ts.map +1 -0
- package/src/core/wfc/wfc_solve.js +154 -0
- package/src/core/wfc/wfc_state_apply_boundary.d.ts +18 -0
- package/src/core/wfc/wfc_state_apply_boundary.d.ts.map +1 -0
- package/src/core/wfc/wfc_state_apply_boundary.js +61 -0
- package/src/core/wfc/wfc_state_assign.d.ts +11 -0
- package/src/core/wfc/wfc_state_assign.d.ts.map +1 -0
- package/src/core/wfc/wfc_state_assign.js +36 -0
- package/src/core/wfc/wfc_state_ban_bits.d.ts +17 -0
- package/src/core/wfc/wfc_state_ban_bits.d.ts.map +1 -0
- package/src/core/wfc/wfc_state_ban_bits.js +81 -0
- package/src/core/wfc/wfc_state_collapse.d.ts +12 -0
- package/src/core/wfc/wfc_state_collapse.d.ts.map +1 -0
- package/src/core/wfc/wfc_state_collapse.js +73 -0
- package/src/core/wfc/wfc_state_flush_dirty.d.ts +12 -0
- package/src/core/wfc/wfc_state_flush_dirty.d.ts.map +1 -0
- package/src/core/wfc/wfc_state_flush_dirty.js +39 -0
- package/src/core/wfc/wfc_state_propagate.d.ts +14 -0
- package/src/core/wfc/wfc_state_propagate.d.ts.map +1 -0
- package/src/core/wfc/wfc_state_propagate.js +155 -0
- package/src/core/wfc/wfc_state_read.d.ts +11 -0
- package/src/core/wfc/wfc_state_read.d.ts.map +1 -0
- package/src/core/wfc/wfc_state_read.js +38 -0
- package/src/core/wfc/wfc_state_restrict.d.ts +18 -0
- package/src/core/wfc/wfc_state_restrict.d.ts.map +1 -0
- package/src/core/wfc/wfc_state_restrict.js +39 -0
- package/src/core/wfc/wfc_state_set_eligible.d.ts +24 -0
- package/src/core/wfc/wfc_state_set_eligible.d.ts.map +1 -0
- package/src/core/wfc/wfc_state_set_eligible.js +49 -0
- package/src/core/wfc/wfc_state_undo_to.d.ts +13 -0
- package/src/core/wfc/wfc_state_undo_to.d.ts.map +1 -0
- package/src/core/wfc/wfc_state_undo_to.js +84 -0
- package/src/core/wfc/wfc_words_per_cell.d.ts +11 -0
- package/src/core/wfc/wfc_words_per_cell.d.ts.map +1 -0
- package/src/core/wfc/wfc_words_per_cell.js +16 -0
- package/src/engine/Clock.d.ts.map +1 -1
- package/src/engine/Clock.js +11 -0
- package/src/engine/Engine.d.ts.map +1 -1
- package/src/engine/Engine.js +107 -6
- package/src/engine/achievements/AchievementManager.d.ts.map +1 -1
- package/src/engine/achievements/AchievementManager.js +16 -1
- package/src/engine/animation/clip/ecd_bind_animation_curve.d.ts.map +1 -1
- package/src/engine/animation/clip/ecd_bind_animation_curve.js +17 -6
- package/src/engine/animation/clip/hemisphere_align_quaternion_values.d.ts +19 -10
- package/src/engine/animation/clip/hemisphere_align_quaternion_values.d.ts.map +1 -1
- package/src/engine/animation/clip/hemisphere_align_quaternion_values.js +19 -23
- package/src/engine/animation/keyed2/AnimationTrackPlayback.d.ts +1 -1
- package/src/engine/animation/keyed2/AnimationTrackPlayback.d.ts.map +1 -1
- package/src/engine/animation/keyed2/AnimationTrackPlayback.js +21 -4
- package/src/engine/asset/AssetManager.d.ts.map +1 -1
- package/src/engine/asset/AssetManager.js +11 -3
- package/src/engine/control/first-person/FirstPersonPlayerController.d.ts +1 -0
- package/src/engine/control/first-person/FirstPersonPlayerController.d.ts.map +1 -1
- package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts +28 -0
- package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts.map +1 -1
- package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.js +14 -0
- package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts +23 -2
- package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts.map +1 -1
- package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +2122 -2078
- package/src/engine/ecs/Entity.d.ts.map +1 -1
- package/src/engine/ecs/Entity.js +43 -7
- package/src/engine/ecs/EntityBlueprint.d.ts.map +1 -1
- package/src/engine/ecs/EntityBlueprint.js +13 -4
- package/src/engine/ecs/EntityComponentDataset.d.ts +8 -0
- package/src/engine/ecs/EntityComponentDataset.d.ts.map +1 -1
- package/src/engine/ecs/EntityComponentDataset.js +132 -23
- package/src/engine/ecs/EntityManager.d.ts +16 -0
- package/src/engine/ecs/EntityManager.d.ts.map +1 -1
- package/src/engine/ecs/EntityManager.js +112 -37
- package/src/engine/ecs/EntityObserver.d.ts +7 -0
- package/src/engine/ecs/EntityObserver.d.ts.map +1 -1
- package/src/engine/ecs/EntityObserver.js +8 -1
- package/src/engine/ecs/System.d.ts +23 -0
- package/src/engine/ecs/System.d.ts.map +1 -1
- package/src/engine/ecs/System.js +25 -0
- package/src/engine/ecs/components/Tag.d.ts.map +1 -1
- package/src/engine/ecs/components/Tag.js +4 -1
- package/src/engine/ecs/computeComponentClassName.d.ts +13 -1
- package/src/engine/ecs/computeComponentClassName.d.ts.map +1 -1
- package/src/engine/ecs/computeComponentClassName.js +11 -1
- package/src/engine/ecs/dynamic_actions/DynamicActorSystem.d.ts.map +1 -1
- package/src/engine/ecs/dynamic_actions/DynamicActorSystem.js +11 -0
- package/src/engine/ecs/fow/FogOfWar.d.ts.map +1 -1
- package/src/engine/ecs/fow/FogOfWar.js +37 -11
- package/src/engine/ecs/fow/FogOfWarRevealerSystem.d.ts +8 -1
- package/src/engine/ecs/fow/FogOfWarRevealerSystem.d.ts.map +1 -1
- package/src/engine/ecs/fow/FogOfWarRevealerSystem.js +37 -2
- package/src/engine/ecs/guid/UUID.d.ts.map +1 -1
- package/src/engine/ecs/guid/UUID.js +45 -17
- package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.d.ts.map +1 -1
- package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.js +3 -1
- package/src/engine/ecs/parent/EntityNode.d.ts.map +1 -1
- package/src/engine/ecs/parent/EntityNode.js +8 -0
- package/src/engine/ecs/speaker/VoiceSystem.d.ts.map +1 -1
- package/src/engine/ecs/speaker/VoiceSystem.js +9 -0
- package/src/engine/ecs/storage/binary/BinaryClassSerializationAdapter.d.ts +15 -0
- package/src/engine/ecs/storage/binary/BinaryClassSerializationAdapter.d.ts.map +1 -1
- package/src/engine/ecs/storage/binary/BinaryClassSerializationAdapter.js +18 -0
- package/src/engine/ecs/system/AbstractContextSystem.d.ts.map +1 -1
- package/src/engine/ecs/system/AbstractContextSystem.js +14 -4
- package/src/engine/ecs/system/SystemEntityContext.d.ts +12 -0
- package/src/engine/ecs/system/SystemEntityContext.d.ts.map +1 -1
- package/src/engine/ecs/system/SystemEntityContext.js +23 -0
- package/src/engine/ecs/system_validate_class.d.ts.map +1 -1
- package/src/engine/ecs/system_validate_class.js +6 -2
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +395 -360
- package/src/engine/ecs/terrain/tiles/TerrainTile.d.ts.map +1 -1
- package/src/engine/ecs/terrain/tiles/TerrainTile.js +45 -3
- package/src/engine/ecs/terrain/tiles/TerrainTileManager.d.ts.map +1 -1
- package/src/engine/ecs/terrain/tiles/TerrainTileManager.js +5 -8
- package/src/engine/graphics/ecs/camera/pp/PerfectPanner.d.ts.map +1 -1
- package/src/engine/graphics/ecs/camera/pp/PerfectPanner.js +62 -7
- package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMesh.d.ts +9 -0
- package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMesh.d.ts.map +1 -1
- package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMesh.js +13 -0
- package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshAnimationControllerSystem.d.ts +11 -0
- package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshAnimationControllerSystem.d.ts.map +1 -1
- package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshAnimationControllerSystem.js +78 -13
- package/src/engine/graphics/ecs/path/tube/build/make_ring_vertices.d.ts.map +1 -1
- package/src/engine/graphics/ecs/path/tube/build/make_ring_vertices.js +22 -8
- package/src/engine/graphics/geometry/buffered/geometry_compute_vertex_normals_indexed.d.ts.map +1 -1
- package/src/engine/graphics/geometry/buffered/geometry_compute_vertex_normals_indexed.js +18 -2
- package/src/engine/graphics/geometry/geometry_construct_triangle_normal.d.ts +3 -1
- package/src/engine/graphics/geometry/geometry_construct_triangle_normal.d.ts.map +1 -1
- package/src/engine/graphics/geometry/geometry_construct_triangle_normal.js +3 -1
- package/src/engine/graphics/geometry/geometry_construct_triangle_normal_area_weighted.d.ts +32 -0
- package/src/engine/graphics/geometry/geometry_construct_triangle_normal_area_weighted.d.ts.map +1 -0
- package/src/engine/graphics/geometry/geometry_construct_triangle_normal_area_weighted.js +53 -0
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +22 -2
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts.map +1 -1
- package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +1201 -1160
- package/src/engine/graphics/particles/particular/engine/simulator/SimulationStepCurlNoiseVelocity.d.ts +0 -1
- package/src/engine/graphics/particles/particular/engine/simulator/SimulationStepCurlNoiseVelocity.d.ts.map +1 -1
- package/src/engine/graphics/particles/particular/engine/simulator/SimulationStepCurlNoiseVelocity.js +10 -5
- package/src/engine/graphics/particles/particular/engine/simulator/update_parameters.d.ts.map +1 -1
- package/src/engine/graphics/particles/particular/engine/simulator/update_parameters.js +23 -0
- package/src/engine/graphics/particles/particular/group/itemSizeFromAttributeType.d.ts +1 -1
- package/src/engine/graphics/sh3/path_tracer/texture/apply_texture_clamping_to_coordinate.d.ts.map +1 -1
- package/src/engine/graphics/sh3/path_tracer/texture/apply_texture_clamping_to_coordinate.js +6 -1
- package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.d.ts.map +1 -1
- package/src/engine/graphics/texture/atlas/ManagedTextureAtlas.js +20 -0
- package/src/engine/graphics/texture/atlas/TextureAtlas.d.ts +1 -0
- package/src/engine/graphics/texture/atlas/TextureAtlas.d.ts.map +1 -1
- package/src/engine/graphics/texture/atlas/TextureAtlas.js +24 -5
- package/src/engine/graphics/texture/sampler/Sampler2D.d.ts.map +1 -1
- package/src/engine/graphics/texture/sampler/Sampler2D.js +14 -1
- package/src/engine/graphics/texture/sampler/resize/sampler2d_scale_down_linear.d.ts.map +1 -1
- package/src/engine/graphics/texture/sampler/resize/sampler2d_scale_down_linear.js +24 -10
- package/src/engine/graphics/texture/sampler/sampler2d_sub_copy_same_item_size.d.ts.map +1 -1
- package/src/engine/graphics/texture/sampler/sampler2d_sub_copy_same_item_size.js +16 -5
- package/src/engine/graphics/texture/sampler/sampler2d_to_uint8_RGBA.d.ts.map +1 -1
- package/src/engine/graphics/texture/sampler/sampler2d_to_uint8_RGBA.js +29 -8
- package/src/engine/graphics/texture/sampler/serialization/TextureBinaryBufferSerializer.d.ts.map +1 -1
- package/src/engine/graphics/texture/sampler/serialization/TextureBinaryBufferSerializer.js +8 -3
- package/src/engine/graphics3/DecalSystem.d.ts +5 -4
- package/src/engine/graphics3/DecalSystem.d.ts.map +1 -1
- package/src/engine/graphics3/DecalSystem.js +5 -4
- package/src/engine/graphics3/GraphicsEngine.d.ts +40 -7
- package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -1
- package/src/engine/graphics3/GraphicsEngine.js +92 -7
- package/src/engine/graphics3/MeshSystem.d.ts +7 -0
- package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
- package/src/engine/graphics3/MeshSystem.js +681 -661
- package/src/engine/graphics3/ParticleEmitterSystem.d.ts +1 -0
- package/src/engine/graphics3/ParticleEmitterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/ParticleEmitterSystem.js +1 -0
- package/src/engine/graphics3/TerrainSystem.d.ts +10 -40
- package/src/engine/graphics3/TerrainSystem.d.ts.map +1 -1
- package/src/engine/graphics3/TerrainSystem.js +186 -185
- package/src/engine/graphics3/Trail3DSystem.d.ts +28 -19
- package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -1
- package/src/engine/graphics3/Trail3DSystem.js +57 -64
- package/src/engine/graphics3/debug/gizmo_write_geometry.d.ts.map +1 -1
- package/src/engine/graphics3/debug/gizmo_write_geometry.js +7 -59
- package/src/engine/graphics3/decal/GPUDecalRenderer.d.ts.map +1 -1
- package/src/engine/graphics3/decal/GPUDecalRenderer.js +23 -7
- package/src/engine/graphics3/decal/shader_cluster_assign_decals.d.ts.map +1 -1
- package/src/engine/graphics3/decal/shader_cluster_assign_decals.js +29 -6
- package/src/engine/graphics3/path/tube_stream_write_geometry.d.ts.map +1 -1
- package/src/engine/graphics3/path/tube_stream_write_geometry.js +7 -56
- package/src/engine/graphics3/register_instance_animation.d.ts +3 -3
- package/src/engine/graphics3/register_instance_animation.js +3 -3
- package/src/engine/graphics3/terrain/GPUTerrainSplatRenderer.d.ts.map +1 -1
- package/src/engine/graphics3/terrain/TERRAIN_MATERIAL_TEMPLATE.d.ts +77 -0
- package/src/engine/graphics3/terrain/TERRAIN_MATERIAL_TEMPLATE.d.ts.map +1 -0
- package/src/engine/graphics3/terrain/TERRAIN_MATERIAL_TEMPLATE.js +485 -0
- package/src/engine/graphics3/terrain/TerrainShadeMaterial.d.ts +103 -0
- package/src/engine/graphics3/terrain/TerrainShadeMaterial.d.ts.map +1 -0
- package/src/engine/graphics3/terrain/TerrainShadeMaterial.js +130 -0
- package/src/engine/graphics3/terrain/chunk_terrain_material_surface.d.ts +23 -0
- package/src/engine/graphics3/terrain/chunk_terrain_material_surface.d.ts.map +1 -0
- package/src/engine/graphics3/terrain/chunk_terrain_material_surface.js +68 -0
- package/src/engine/graphics3/trail/trail_tube_write_geometry.d.ts.map +1 -1
- package/src/engine/graphics3/trail/trail_tube_write_geometry.js +8 -59
- package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts.map +1 -1
- package/src/engine/grid/grid2transform/GridPosition2TransformSystem.js +24 -5
- package/src/engine/grid/transform2grid/Transform2GridPositionSystem.d.ts.map +1 -1
- package/src/engine/grid/transform2grid/Transform2GridPositionSystem.js +10 -0
- package/src/engine/input/devices/PointerDevice.d.ts.map +1 -1
- package/src/engine/input/devices/PointerDevice.js +58 -5
- package/src/engine/input/ecs/ism/InputMapProgram.d.ts.map +1 -1
- package/src/engine/input/ecs/ism/InputMapProgram.js +13 -0
- package/src/engine/input/ecs/systems/InputControllerSystem.d.ts +1 -0
- package/src/engine/input/ecs/systems/InputControllerSystem.d.ts.map +1 -1
- package/src/engine/input/ecs/systems/InputControllerSystem.js +52 -2
- package/src/engine/intelligence/behavior/composite/ParallelBehavior.d.ts.map +1 -1
- package/src/engine/intelligence/behavior/composite/ParallelBehavior.js +8 -0
- package/src/engine/intelligence/behavior/decorator/RepeatBehavior.d.ts.map +1 -1
- package/src/engine/intelligence/behavior/decorator/RepeatBehavior.js +7 -0
- package/src/engine/intelligence/behavior/decorator/RepeatUntilSuccessBehavior.d.ts.map +1 -1
- package/src/engine/intelligence/behavior/decorator/RepeatUntilSuccessBehavior.js +14 -0
- package/src/engine/intelligence/behavior/ecs/BehaviorSystem.d.ts.map +1 -1
- package/src/engine/intelligence/behavior/ecs/BehaviorSystem.js +13 -0
- package/src/engine/interpolation/Interpoland.d.ts +7 -1
- package/src/engine/interpolation/Interpoland.d.ts.map +1 -1
- package/src/engine/interpolation/Interpoland.js +8 -1
- package/src/engine/interpolation/InterpolationLog.d.ts +51 -4
- package/src/engine/interpolation/InterpolationLog.d.ts.map +1 -1
- package/src/engine/interpolation/InterpolationLog.js +132 -2
- package/src/engine/interpolation/InterpolationSystem.d.ts +113 -35
- package/src/engine/interpolation/InterpolationSystem.d.ts.map +1 -1
- package/src/engine/interpolation/InterpolationSystem.js +677 -50
- package/src/engine/interpolation/TransformPoseSerializationAdapter.d.ts +5 -3
- package/src/engine/interpolation/TransformPoseSerializationAdapter.d.ts.map +1 -1
- package/src/engine/interpolation/TransformPoseSerializationAdapter.js +14 -3
- package/src/engine/interpolation/pose_interpoland.d.ts.map +1 -1
- package/src/engine/interpolation/pose_interpoland.js +2 -0
- package/src/engine/network/NetworkSession.d.ts +176 -47
- package/src/engine/network/NetworkSession.d.ts.map +1 -1
- package/src/engine/network/NetworkSession.js +1462 -272
- package/src/engine/network/README.md +106 -3
- package/src/engine/network/SMOOTHNESS_DESIGN.md +392 -0
- package/src/engine/network/adapters/PoseCorrection.d.ts +50 -0
- package/src/engine/network/adapters/PoseCorrection.d.ts.map +1 -0
- package/src/engine/network/adapters/PoseCorrection.js +211 -0
- package/src/engine/network/adapters/TransformReplicationAdapter.d.ts +1 -0
- package/src/engine/network/adapters/TransformReplicationAdapter.d.ts.map +1 -1
- package/src/engine/network/adapters/TransformReplicationAdapter.js +17 -0
- package/src/engine/network/adapters/VelocityCorrection.d.ts +31 -0
- package/src/engine/network/adapters/VelocityCorrection.d.ts.map +1 -0
- package/src/engine/network/adapters/VelocityCorrection.js +71 -0
- package/src/engine/network/adapters/replicate_transform64.d.ts +13 -0
- package/src/engine/network/adapters/replicate_transform64.d.ts.map +1 -0
- package/src/engine/network/adapters/replicate_transform64.js +18 -0
- package/src/engine/network/adapters/rigid_body_of.d.ts +22 -0
- package/src/engine/network/adapters/rigid_body_of.d.ts.map +1 -0
- package/src/engine/network/adapters/rigid_body_of.js +33 -0
- package/src/engine/network/correction/Correction.d.ts +120 -0
- package/src/engine/network/correction/Correction.d.ts.map +1 -0
- package/src/engine/network/correction/Correction.js +143 -0
- package/src/engine/network/ecs/NetworkSystem.d.ts +36 -7
- package/src/engine/network/ecs/NetworkSystem.d.ts.map +1 -1
- package/src/engine/network/ecs/NetworkSystem.js +49 -7
- package/src/engine/network/orchestrator/NetworkPeer.d.ts +50 -1
- package/src/engine/network/orchestrator/NetworkPeer.d.ts.map +1 -1
- package/src/engine/network/orchestrator/NetworkPeer.js +158 -20
- package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts +38 -2
- package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts.map +1 -1
- package/src/engine/network/orchestrator/ServerAuthoritativeClient.js +58 -10
- package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts +68 -2
- package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts.map +1 -1
- package/src/engine/network/orchestrator/ServerAuthoritativeServer.js +299 -18
- package/src/engine/network/replication/Replicator.d.ts +8 -1
- package/src/engine/network/replication/Replicator.d.ts.map +1 -1
- package/src/engine/network/replication/Replicator.js +50 -6
- package/src/engine/network/sim/ActionLog.d.ts +5 -2
- package/src/engine/network/sim/ActionLog.d.ts.map +1 -1
- package/src/engine/network/sim/ActionLog.js +5 -2
- package/src/engine/network/sim/RewindEngine.d.ts.map +1 -1
- package/src/engine/network/sim/RewindEngine.js +6 -0
- package/src/engine/network/sim/SimActionExecutor.d.ts +48 -3
- package/src/engine/network/sim/SimActionExecutor.d.ts.map +1 -1
- package/src/engine/network/sim/SimActionExecutor.js +152 -6
- package/src/engine/network/sim/SmoothingState.d.ts +54 -2
- package/src/engine/network/sim/SmoothingState.d.ts.map +1 -1
- package/src/engine/network/sim/SmoothingState.js +107 -3
- package/src/engine/network/state/MutationLedger.d.ts.map +1 -1
- package/src/engine/network/state/MutationLedger.js +18 -2
- package/src/engine/network/state/PredictionHistory.d.ts +67 -0
- package/src/engine/network/state/PredictionHistory.d.ts.map +1 -0
- package/src/engine/network/state/PredictionHistory.js +145 -0
- package/src/engine/network/time/RenderPlayout.d.ts +2 -1
- package/src/engine/network/time/RenderPlayout.d.ts.map +1 -1
- package/src/engine/network/time/RenderPlayout.js +174 -163
- package/src/engine/network/transport/DeferredTransport.d.ts +57 -0
- package/src/engine/network/transport/DeferredTransport.d.ts.map +1 -0
- package/src/engine/network/transport/DeferredTransport.js +143 -0
- package/src/engine/network/transport/LoopbackTransport.d.ts +8 -0
- package/src/engine/network/transport/LoopbackTransport.d.ts.map +1 -1
- package/src/engine/network/transport/LoopbackTransport.js +12 -1
- package/src/engine/network/transport/ReliableCommandPipeline.d.ts.map +1 -1
- package/src/engine/network/transport/ReliableCommandPipeline.js +20 -0
- package/src/engine/network/transport/adapters/NodeUDPTransport.d.ts.map +1 -1
- package/src/engine/network/transport/adapters/NodeUDPTransport.js +11 -2
- package/src/engine/network/transport/adapters/WebTransportTransport.d.ts.map +1 -1
- package/src/engine/network/transport/adapters/WebTransportTransport.js +8 -1
- package/src/engine/network/transport/fragments/FragmentAssembler.d.ts +2 -1
- package/src/engine/network/transport/fragments/FragmentAssembler.d.ts.map +1 -1
- package/src/engine/network/transport/fragments/FragmentAssembler.js +67 -3
- package/src/engine/network/transport/fragments/fragment_send.d.ts +8 -0
- package/src/engine/network/transport/fragments/fragment_send.d.ts.map +1 -1
- package/src/engine/network/transport/fragments/fragment_send.js +17 -7
- package/src/engine/network/transport/fragments/packet_size.d.ts +6 -0
- package/src/engine/network/transport/fragments/packet_size.d.ts.map +1 -1
- package/src/engine/network/transport/fragments/packet_size.js +6 -0
- package/src/engine/physics/ccd/linear_sweep.d.ts.map +1 -1
- package/src/engine/physics/ccd/linear_sweep.js +19 -1
- package/src/engine/physics/cloth/ecs/ClothWorld.d.ts +7 -3
- package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothWorld.js +51 -4
- package/src/engine/physics/cloth/solver/cloth_self_find.js +17 -0
- package/src/engine/physics/contact/ManifoldStore.d.ts +20 -1
- package/src/engine/physics/contact/ManifoldStore.d.ts.map +1 -1
- package/src/engine/physics/contact/ManifoldStore.js +24 -2
- package/src/engine/physics/ecs/PhysicsSystem.d.ts +51 -88
- package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
- package/src/engine/physics/ecs/PhysicsSystem.js +82 -217
- package/src/engine/physics/ecs/is_sensor.d.ts +24 -0
- package/src/engine/physics/ecs/is_sensor.d.ts.map +1 -1
- package/src/engine/physics/ecs/is_sensor.js +39 -0
- package/src/engine/physics/fluid/ecs/FluidComponent.d.ts +18 -4
- package/src/engine/physics/fluid/ecs/FluidComponent.d.ts.map +1 -1
- package/src/engine/physics/fluid/ecs/FluidComponent.js +29 -8
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/engine/physics/fluid/effector/AbstractFluidEffector.d.ts +8 -0
- package/src/engine/physics/fluid/effector/AbstractFluidEffector.d.ts.map +1 -1
- package/src/engine/physics/fluid/effector/AbstractFluidEffector.js +8 -0
- package/src/engine/physics/fluid/solver/NOTES.md +46 -0
- package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_scalar.js +1 -1
- package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.js +1 -1
- package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.js +1 -1
- package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.js +1 -1
- package/src/engine/physics/fluid/solver/v3_grid_apply_scalar_advection.js +1 -1
- package/src/engine/physics/fluid/solver/v3_grid_apply_vorticity_confinement.d.ts.map +1 -1
- package/src/engine/physics/fluid/solver/v3_grid_apply_vorticity_confinement.js +8 -0
- package/src/engine/physics/fluid/solver/v3_grid_compute_divergence.d.ts.map +1 -1
- package/src/engine/physics/fluid/solver/v3_grid_compute_divergence.js +8 -0
- package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.d.ts.map +1 -1
- package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.js +8 -0
- package/src/engine/physics/fluid/solver/v3_mac_advect_scalar.d.ts +5 -0
- package/src/engine/physics/fluid/solver/v3_mac_advect_scalar.d.ts.map +1 -1
- package/src/engine/physics/fluid/solver/v3_mac_advect_scalar.js +5 -0
- package/src/engine/physics/integration/integrate_velocity.d.ts +15 -0
- package/src/engine/physics/integration/integrate_velocity.d.ts.map +1 -1
- package/src/engine/physics/integration/integrate_velocity.js +15 -0
- package/src/engine/physics/island/IslandBuilder.d.ts.map +1 -1
- package/src/engine/physics/island/IslandBuilder.js +6 -7
- package/src/engine/physics/mls-mpm/MLS_MPM.d.ts.map +1 -1
- package/src/engine/physics/mls-mpm/MLS_MPM.js +36 -6
- package/src/engine/physics/mls-mpm/mls_mpm_demo_scene.d.ts +29 -0
- package/src/engine/physics/mls-mpm/mls_mpm_demo_scene.d.ts.map +1 -0
- package/src/engine/physics/mls-mpm/mls_mpm_demo_scene.js +44 -0
- package/src/engine/physics/mls-mpm/testMLS_MPM.js +3 -3
- package/src/engine/physics/narrowphase/narrowphase_step.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/narrowphase_step.js +74 -11
- package/src/engine/physics/queries/overlap_shape.d.ts.map +1 -1
- package/src/engine/physics/queries/overlap_shape.js +92 -45
- package/src/engine/physics/queries/raycast.d.ts.map +1 -1
- package/src/engine/physics/queries/raycast.js +55 -43
- package/src/engine/physics/queries/shape_cast.d.ts.map +1 -1
- package/src/engine/physics/queries/shape_cast.js +185 -174
- package/src/engine/physics/solver/solve_contacts.d.ts.map +1 -1
- package/src/engine/physics/solver/solve_contacts.js +42 -19
- package/src/engine/plugin/EnginePluginManager.d.ts +10 -0
- package/src/engine/plugin/EnginePluginManager.d.ts.map +1 -1
- package/src/engine/plugin/EnginePluginManager.js +54 -1
- package/src/engine/plugin/PluginReferenceContext.d.ts.map +1 -1
- package/src/engine/plugin/PluginReferenceContext.js +7 -3
- package/src/engine/reference/v2/Reference.d.ts +9 -0
- package/src/engine/reference/v2/Reference.d.ts.map +1 -1
- package/src/engine/reference/v2/Reference.js +39 -2
- package/src/engine/simulation/Ticker.d.ts.map +1 -1
- package/src/engine/simulation/Ticker.js +20 -1
- package/src/engine/sound/ecs/SoundListenerSystem.d.ts +27 -0
- package/src/engine/sound/ecs/SoundListenerSystem.d.ts.map +1 -1
- package/src/engine/sound/ecs/SoundListenerSystem.js +82 -21
- package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts.map +1 -1
- package/src/engine/sound/ecs/audio/LiveEmitterSet.js +394 -356
- package/src/engine/sound/material/concrete/SoundMaterialComposition.d.ts.map +1 -1
- package/src/engine/sound/material/concrete/SoundMaterialComposition.js +54 -17
- package/src/engine/sound/material/detector/terrain/TerrainSoundMaterialSurfaceDetector.d.ts.map +1 -1
- package/src/engine/sound/material/detector/terrain/TerrainSoundMaterialSurfaceDetector.js +34 -3
- package/src/engine/sound/simulation/core/AcousticSolution.d.ts +5 -0
- package/src/engine/sound/simulation/core/AcousticSolution.d.ts.map +1 -1
- package/src/engine/sound/simulation/core/AcousticSolution.js +5 -0
- package/src/engine/sound/simulation/definition/AcousticMaterial.d.ts +8 -0
- package/src/engine/sound/simulation/definition/AcousticMaterial.d.ts.map +1 -1
- package/src/engine/sound/simulation/definition/AcousticMaterial.js +8 -0
- package/src/engine/sound/simulation/probe/probe_visibility_augment.d.ts +6 -4
- package/src/engine/sound/simulation/probe/probe_visibility_augment.d.ts.map +1 -1
- package/src/engine/sound/simulation/probe/probe_visibility_augment.js +19 -7
- package/src/engine/sound/simulation/render/FoaProbeReverbRenderer.d.ts +39 -0
- package/src/engine/sound/simulation/render/FoaProbeReverbRenderer.d.ts.map +1 -1
- package/src/engine/sound/simulation/render/FoaProbeReverbRenderer.js +130 -1
- package/src/engine/sound/simulation/render/ProbeReverbRenderer.d.ts +3 -2
- package/src/engine/sound/simulation/render/ProbeReverbRenderer.d.ts.map +1 -1
- package/src/engine/sound/simulation/render/ProbeReverbRenderer.js +15 -1
- package/src/engine/sound/sopra/SopraEngine.d.ts +10 -0
- package/src/engine/sound/sopra/SopraEngine.d.ts.map +1 -1
- package/src/engine/sound/sopra/SopraEngine.js +486 -440
- package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.d.ts +2 -1
- package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/clip/AbstractAudioClip.js +1 -1
- package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.d.ts +1 -0
- package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts +1 -0
- package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/clip/SampleAudioClip.d.ts +2 -1
- package/src/engine/sound/sopra/definition/clip/SampleAudioClip.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/clip/SampleAudioClip.js +12 -3
- package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.d.ts +1 -0
- package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.d.ts.map +1 -1
- package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts +1 -0
- package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts.map +1 -1
- package/src/engine/sound/sopra/runtime/BusGraph.d.ts +29 -0
- package/src/engine/sound/sopra/runtime/BusGraph.d.ts.map +1 -1
- package/src/engine/sound/sopra/runtime/BusGraph.js +69 -2
- package/src/engine/sound/sopra/runtime/EventInstance.d.ts.map +1 -1
- package/src/engine/sound/sopra/runtime/EventInstance.js +134 -10
- package/src/engine/ui/GUIEngine.d.ts +14 -0
- package/src/engine/ui/GUIEngine.d.ts.map +1 -1
- package/src/engine/ui/GUIEngine.js +52 -4
- package/src/format/image/avif/api/apply_transformations.d.ts +2 -1
- package/src/format/image/avif/api/apply_transformations.d.ts.map +1 -1
- package/src/format/image/avif/api/apply_transformations.js +129 -120
- package/src/format/image/avif/api/convert_to_rgba.d.ts.map +1 -1
- package/src/format/image/avif/api/convert_to_rgba.js +35 -2
- package/src/format/image/avif/api/decode_image_item.d.ts +2 -1
- package/src/format/image/avif/api/decode_image_item.d.ts.map +1 -1
- package/src/format/image/avif/api/decode_image_item.js +322 -234
- package/src/format/image/avif/av1/decode/decode_av1_still.js +329 -309
- package/src/format/image/avif/av1/decode/decode_coefficients.d.ts.map +1 -1
- package/src/format/image/avif/av1/decode/decode_coefficients.js +248 -259
- package/src/format/image/avif/av1/decode/read_golomb.d.ts +21 -0
- package/src/format/image/avif/av1/decode/read_golomb.d.ts.map +1 -0
- package/src/format/image/avif/av1/decode/read_golomb.js +49 -0
- package/src/format/image/avif/av1/encode/encode_tile.js +2349 -2331
- package/src/format/image/avif/av1/entropy/symbol_cost.d.ts.map +1 -1
- package/src/format/image/avif/av1/entropy/symbol_cost.js +86 -76
- package/src/format/image/avif/av1/filter/loop_restoration.js +461 -451
- package/src/format/image/avif/av1/util/round2.d.ts +19 -2
- package/src/format/image/avif/av1/util/round2.d.ts.map +1 -1
- package/src/format/image/avif/av1/util/round2.js +51 -27
- package/src/format/image/avif/heif/AvifFile.d.ts +11 -0
- package/src/format/image/avif/heif/AvifFile.d.ts.map +1 -1
- package/src/format/image/avif/heif/AvifFile.js +154 -142
- package/src/format/image/avif/heif/find_item_properties.d.ts +23 -0
- package/src/format/image/avif/heif/find_item_properties.d.ts.map +1 -0
- package/src/format/image/avif/heif/find_item_properties.js +36 -0
- package/src/format/image/avif/heif/parse_avif_file.js +30 -3
- package/src/format/image/avif/heif/read_item_data.d.ts.map +1 -1
- package/src/format/image/avif/heif/read_item_data.js +131 -97
- package/src/format/image/jpeg/decodeScan.d.ts.map +1 -1
- package/src/format/image/jpeg/decodeScan.js +17 -0
- package/src/format/scene/gltf/gltf_parse_container.d.ts.map +1 -1
- package/src/format/scene/gltf/gltf_parse_container.js +61 -41
- package/src/format/scene/gltf/gltf_read_accessor.d.ts +21 -0
- package/src/format/scene/gltf/gltf_read_accessor.d.ts.map +1 -1
- package/src/format/scene/gltf/gltf_read_accessor.js +37 -0
- package/src/format/scene/usd/usd_compose_transform.d.ts.map +1 -1
- package/src/format/scene/usd/usd_compose_transform.js +56 -6
- package/src/format/texture/basis/transcode/fit_endpoints.d.ts +6 -0
- package/src/format/texture/basis/transcode/fit_endpoints.d.ts.map +1 -1
- package/src/format/texture/basis/transcode/fit_endpoints.js +33 -39
- package/src/generation/filtering/numeric/CellFilterCache.d.ts +17 -0
- package/src/generation/filtering/numeric/CellFilterCache.d.ts.map +1 -1
- package/src/generation/filtering/numeric/CellFilterCache.js +36 -3
- package/src/generation/grid/actions/ContinuousGridCellActionSetTerrainObstacle.d.ts +9 -0
- package/src/generation/grid/actions/ContinuousGridCellActionSetTerrainObstacle.d.ts.map +1 -1
- package/src/generation/grid/actions/ContinuousGridCellActionSetTerrainObstacle.js +37 -6
- package/src/generation/grid/actions/ContinuousGridCellActionWriteObstacle.d.ts.map +1 -1
- package/src/generation/grid/actions/ContinuousGridCellActionWriteObstacle.js +8 -21
- package/src/generation/grid/actions/grid_obstacle_write_grid_point.d.ts +28 -0
- package/src/generation/grid/actions/grid_obstacle_write_grid_point.d.ts.map +1 -0
- package/src/generation/grid/actions/grid_obstacle_write_grid_point.js +41 -0
- package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.d.ts +15 -1
- package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.d.ts.map +1 -1
- package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.js +17 -3
- package/src/generation/markers/actions/MarkerNodeProcessingRuleSet.d.ts.map +1 -1
- package/src/generation/markers/actions/MarkerNodeProcessingRuleSet.js +16 -1
- package/src/generation/placement/action/GridCellActionWriteFilterToLayer.d.ts.map +1 -1
- package/src/generation/placement/action/GridCellActionWriteFilterToLayer.js +8 -1
- package/src/generation/theme/TerrainTheme.d.ts.map +1 -1
- package/src/generation/theme/TerrainTheme.js +20 -1
- package/src/shade/RENDERER_CONTRACT.md +48 -6
- package/src/shade/descriptor/texture/format/gpu_texture_formats_copy_compatible.d.ts +23 -0
- package/src/shade/descriptor/texture/format/gpu_texture_formats_copy_compatible.d.ts.map +1 -0
- package/src/shade/descriptor/texture/format/gpu_texture_formats_copy_compatible.js +28 -0
- package/src/shade/descriptor/texture/format/gpu_texture_formats_view_compatible.d.ts +25 -0
- package/src/shade/descriptor/texture/format/gpu_texture_formats_view_compatible.d.ts.map +1 -0
- package/src/shade/descriptor/texture/format/gpu_texture_formats_view_compatible.js +42 -0
- package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
- package/src/shade/device/ShadeGPUCommandContext.js +874 -857
- package/src/shade/device/mock/SoftwareGPUBindGroup.d.ts +38 -1
- package/src/shade/device/mock/SoftwareGPUBindGroup.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUBindGroup.js +73 -1
- package/src/shade/device/mock/SoftwareGPUBuffer.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUBuffer.js +5 -0
- package/src/shade/device/mock/SoftwareGPUCommandBuffer.d.ts +34 -0
- package/src/shade/device/mock/SoftwareGPUCommandBuffer.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUCommandBuffer.js +71 -1
- package/src/shade/device/mock/SoftwareGPUCommandEncoder.d.ts +15 -0
- package/src/shade/device/mock/SoftwareGPUCommandEncoder.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUCommandEncoder.js +109 -1
- package/src/shade/device/mock/SoftwareGPUComputePassEncoder.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUComputePassEncoder.js +51 -0
- package/src/shade/device/mock/SoftwareGPUDevice.d.ts +5 -1
- package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUDevice.js +58 -1
- package/src/shade/device/mock/SoftwareGPUPipeline.d.ts +1 -0
- package/src/shade/device/mock/SoftwareGPUPipeline.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUPipeline.js +17 -11
- package/src/shade/device/mock/SoftwareGPUQueue.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUQueue.js +41 -0
- package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPURenderPassEncoder.js +24 -0
- package/src/shade/device/mock/SoftwareGPUTexture.d.ts +11 -1
- package/src/shade/device/mock/SoftwareGPUTexture.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUTexture.js +45 -8
- package/src/shade/device/mock/SoftwareGPUTextureView.d.ts +20 -1
- package/src/shade/device/mock/SoftwareGPUTextureView.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUTextureView.js +28 -1
- package/src/shade/device/mock/recorded_binding_kind_mismatches.d.ts +20 -0
- package/src/shade/device/mock/recorded_binding_kind_mismatches.d.ts.map +1 -0
- package/src/shade/device/mock/recorded_binding_kind_mismatches.js +84 -0
- package/src/shade/device/mock/texture_copy.d.ts.map +1 -1
- package/src/shade/device/mock/texture_copy.js +41 -3
- package/src/shade/device/mock/texture_view_resource.d.ts +26 -0
- package/src/shade/device/mock/texture_view_resource.d.ts.map +1 -0
- package/src/shade/device/mock/texture_view_resource.js +47 -0
- package/src/shade/device/timing/GPUTimer.d.ts.map +1 -1
- package/src/shade/device/timing/GPUTimer.js +35 -21
- package/src/shade/playground/caldera/caldera_format.d.ts +28 -1
- package/src/shade/playground/caldera/caldera_format.d.ts.map +1 -1
- package/src/shade/playground/caldera/caldera_format.js +37 -0
- package/src/shade/playground/caldera/main.js +12 -2
- package/src/shade/playground/frame_rate_meter.d.ts +92 -0
- package/src/shade/playground/frame_rate_meter.d.ts.map +1 -0
- package/src/shade/playground/frame_rate_meter.js +147 -0
- package/src/shade/playground/particle_ecs/main.js +53 -7
- package/src/shade/playground/particle_ecs/moonlit_environment.js +2 -2
- package/src/shade/playground/particle_stats_readback.d.ts +58 -0
- package/src/shade/playground/particle_stats_readback.d.ts.map +1 -0
- package/src/shade/playground/particle_stats_readback.js +83 -0
- package/src/shade/playground/particle_system/main.js +378 -325
- package/src/shade/playground/skinned_blas_refit/main.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/main.js +7 -2
- package/src/shade/playground/sponza_path_trace/main.d.ts.map +1 -1
- package/src/shade/playground/sponza_path_trace/main.js +398 -393
- package/src/shade/playground/volumetrics_froxel/main.d.ts.map +1 -1
- package/src/shade/playground/volumetrics_froxel/main.js +941 -936
- package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
- package/src/shade/renderer/GraphicsContext.js +7 -2
- package/src/shade/renderer/Renderer.d.ts +47 -1
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +224 -27
- package/src/shade/renderer/animation/ANIMATION_CLIP_STATE_STRUCT.d.ts +4 -7
- package/src/shade/renderer/animation/ANIMATION_CLIP_STATE_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/animation/ANIMATION_CLIP_STATE_STRUCT.js +19 -16
- package/src/shade/renderer/animation/ANIMATION_CURVE_HEADER_STRUCT.js +11 -11
- package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.d.ts +14 -18
- package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.d.ts.map +1 -1
- package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.js +95 -24
- package/src/shade/renderer/animation/ANIMATION_SKIN_JOINT_STRUCT.d.ts +5 -4
- package/src/shade/renderer/animation/ANIMATION_SKIN_JOINT_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/animation/ANIMATION_SKIN_JOINT_STRUCT.js +7 -4
- package/src/shade/renderer/animation/ANIMATION_SKIN_STRUCT.d.ts +6 -12
- package/src/shade/renderer/animation/ANIMATION_SKIN_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/animation/ANIMATION_SKIN_STRUCT.js +9 -16
- package/src/shade/renderer/animation/ANIMATION_TRACK_BINDING_STRUCT.d.ts +6 -5
- package/src/shade/renderer/animation/ANIMATION_TRACK_BINDING_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/animation/ANIMATION_TRACK_BINDING_STRUCT.js +12 -5
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts +80 -95
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
- package/src/shade/renderer/animation/GPUAnimationManager.js +371 -606
- package/src/shade/renderer/animation/chunk_animation_curve_evaluate.d.ts +10 -14
- package/src/shade/renderer/animation/chunk_animation_curve_evaluate.d.ts.map +1 -1
- package/src/shade/renderer/animation/chunk_animation_curve_evaluate.js +40 -67
- package/src/shade/renderer/animation/chunk_pose_accumulator.d.ts.map +1 -1
- package/src/shade/renderer/animation/chunk_pose_accumulator.js +13 -4
- package/src/shade/renderer/animation/shader_animation_apply.d.ts +14 -8
- package/src/shade/renderer/animation/shader_animation_apply.d.ts.map +1 -1
- package/src/shade/renderer/animation/shader_animation_apply.js +129 -128
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +2 -2
- package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts +3 -2
- package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.js +3 -2
- package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.d.ts +12 -7
- package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/shader_skin_matrix_prep.js +107 -104
- package/src/shade/renderer/binding/BindingResource.d.ts +36 -1
- package/src/shade/renderer/binding/BindingResource.d.ts.map +1 -1
- package/src/shade/renderer/binding/BindingResource.js +36 -3
- package/src/shade/renderer/binding/BufferBinding.d.ts +8 -0
- package/src/shade/renderer/binding/BufferBinding.d.ts.map +1 -1
- package/src/shade/renderer/binding/BufferBinding.js +21 -0
- package/src/shade/renderer/buffer/table/GPUDatabase.d.ts +19 -0
- package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUDatabase.js +114 -1
- package/src/shade/renderer/buffer/table/GPUDatabaseDefinition.d.ts +132 -1
- package/src/shade/renderer/buffer/table/GPUDatabaseDefinition.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUDatabaseDefinition.js +384 -1
- package/src/shade/renderer/buffer/table/GPUDatabaseReadback.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUDatabaseReadback.js +1332 -1323
- package/src/shade/renderer/buffer/table/GPUTableLink.d.ts +67 -0
- package/src/shade/renderer/buffer/table/GPUTableLink.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/GPUTableLink.js +76 -0
- package/src/shade/renderer/buffer/table/GPUTableRange.d.ts +72 -0
- package/src/shade/renderer/buffer/table/GPUTableRange.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/GPUTableRange.js +82 -0
- package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts +106 -5
- package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUTypedTable.js +458 -28
- package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.js +28 -5
- package/src/shade/renderer/buffer/table/GPU_DATABASE_NULL.d.ts +14 -0
- package/src/shade/renderer/buffer/table/GPU_DATABASE_NULL.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/GPU_DATABASE_NULL.js +13 -0
- package/src/shade/renderer/buffer/table/gpu_database_check_links.d.ts +80 -0
- package/src/shade/renderer/buffer/table/gpu_database_check_links.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/gpu_database_check_links.js +456 -0
- package/src/shade/renderer/buffer/table/gpu_table_field_word.d.ts +17 -0
- package/src/shade/renderer/buffer/table/gpu_table_field_word.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/gpu_table_field_word.js +111 -0
- package/src/shade/renderer/buffer/table/gpu_table_range_well_formed.d.ts +20 -0
- package/src/shade/renderer/buffer/table/gpu_table_range_well_formed.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/gpu_table_range_well_formed.js +27 -0
- package/src/shade/renderer/camera/CameraManager.d.ts +11 -0
- package/src/shade/renderer/camera/CameraManager.d.ts.map +1 -1
- package/src/shade/renderer/camera/CameraManager.js +18 -0
- package/src/shade/renderer/create_frame_loop.d.ts +16 -0
- package/src/shade/renderer/create_frame_loop.d.ts.map +1 -1
- package/src/shade/renderer/create_frame_loop.js +16 -0
- package/src/shade/renderer/deferred/chunk_shade_standard_material_direct.d.ts +23 -0
- package/src/shade/renderer/deferred/chunk_shade_standard_material_direct.d.ts.map +1 -1
- package/src/shade/renderer/deferred/chunk_shade_standard_material_direct.js +27 -32
- package/src/shade/renderer/deferred/chunk_shade_standard_material_direct_heavy.d.ts +9 -7
- package/src/shade/renderer/deferred/chunk_shade_standard_material_direct_heavy.d.ts.map +1 -1
- package/src/shade/renderer/deferred/chunk_shade_standard_material_direct_heavy.js +16 -108
- package/src/shade/renderer/dynamic/DynamicMeshAVBOITChannel.d.ts +135 -0
- package/src/shade/renderer/dynamic/DynamicMeshAVBOITChannel.d.ts.map +1 -0
- package/src/shade/renderer/dynamic/DynamicMeshAVBOITChannel.js +296 -0
- package/src/shade/renderer/dynamic/GPUDynamicMeshRenderer.d.ts +2 -2
- package/src/shade/renderer/dynamic/GPUDynamicMeshRenderer.d.ts.map +1 -1
- package/src/shade/renderer/dynamic/GPUDynamicMeshRenderer.js +10 -131
- package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts.map +1 -1
- package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +185 -167
- package/src/shade/renderer/dynamic/GPUDynamicMeshResidencyTable.d.ts +49 -0
- package/src/shade/renderer/dynamic/GPUDynamicMeshResidencyTable.d.ts.map +1 -0
- package/src/shade/renderer/dynamic/GPUDynamicMeshResidencyTable.js +185 -0
- package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.d.ts +24 -0
- package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.d.ts.map +1 -0
- package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.js +49 -0
- package/src/shade/renderer/dynamic/chunk_dynamic_mesh_vertex.d.ts +18 -0
- package/src/shade/renderer/dynamic/chunk_dynamic_mesh_vertex.d.ts.map +1 -0
- package/src/shade/renderer/dynamic/chunk_dynamic_mesh_vertex.js +54 -0
- package/src/shade/renderer/dynamic/dynamic_mesh_live_bounds.d.ts +26 -0
- package/src/shade/renderer/dynamic/dynamic_mesh_live_bounds.d.ts.map +1 -0
- package/src/shade/renderer/dynamic/dynamic_mesh_live_bounds.js +96 -0
- package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.d.ts +102 -0
- package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.d.ts.map +1 -0
- package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.js +364 -0
- package/src/shade/renderer/dynamic/shader_dynamic_mesh.d.ts.map +1 -1
- package/src/shade/renderer/dynamic/shader_dynamic_mesh.js +153 -177
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.d.ts +20 -0
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.d.ts.map +1 -0
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.js +136 -0
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_occupancy.d.ts +20 -0
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_occupancy.d.ts.map +1 -0
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_occupancy.js +106 -0
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.d.ts +32 -0
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.d.ts.map +1 -0
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.js +163 -0
- package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +13 -2
- package/src/shade/renderer/fow/GPUFogOfWarRenderer.d.ts.map +1 -1
- package/src/shade/renderer/fow/GPUFogOfWarRenderer.js +5 -14
- package/src/shade/renderer/fow/fow_obtain_mask.d.ts +17 -0
- package/src/shade/renderer/fow/fow_obtain_mask.d.ts.map +1 -0
- package/src/shade/renderer/fow/fow_obtain_mask.js +41 -0
- package/src/shade/renderer/frame_jitter_applies.d.ts +21 -0
- package/src/shade/renderer/frame_jitter_applies.d.ts.map +1 -0
- package/src/shade/renderer/frame_jitter_applies.js +23 -0
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +128 -3
- package/src/shade/renderer/geometry/geometry_obtain_attribute.d.ts +42 -0
- package/src/shade/renderer/geometry/geometry_obtain_attribute.d.ts.map +1 -0
- package/src/shade/renderer/geometry/geometry_obtain_attribute.js +83 -0
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts +12 -0
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +65 -0
- package/src/shade/renderer/geometry/meshlet/build/geometry_to_meshlets_greedy.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/build/geometry_to_meshlets_greedy.js +4 -1
- package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.js +4 -1
- package/src/shade/renderer/geometry/normals/encode_normals_to_octahedral_u32.d.ts.map +1 -1
- package/src/shade/renderer/geometry/normals/encode_normals_to_octahedral_u32.js +4 -1
- package/src/shade/renderer/geometry/normals/geometry_build_tangents.d.ts.map +1 -1
- package/src/shade/renderer/geometry/normals/geometry_build_tangents.js +39 -1
- package/src/shade/renderer/geometry/util/geometry_merge.d.ts.map +1 -1
- package/src/shade/renderer/geometry/util/geometry_merge.js +18 -2
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +93 -12
- package/src/shade/renderer/geometry/virtual/WEDGE_PLAN_2026_09_18.md +91 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts +0 -13
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js +0 -15
- package/src/shade/renderer/geometry/virtual/build/gltf/gltf_collect_geometries.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/gltf/gltf_collect_geometries.js +31 -2
- package/src/shade/renderer/geometry/virtual/build/level/VGeoFrontier.d.ts +18 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoFrontier.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/level/VGeoFrontier.js +19 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupStep.d.ts +8 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupStep.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupStep.js +9 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.js +15 -6
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.js +4 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.js +12 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.d.ts +11 -1
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.js +11 -1
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts +18 -9
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.js +20 -26
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts +1 -3
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.js +2 -5
- package/src/shade/renderer/geometry/virtual/build/vgeo_build.js +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.js +10 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.js +21 -0
- package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.js +33 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.js +63 -2
- package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.js +14 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts +17 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.js +39 -0
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js +7 -0
- package/src/shade/renderer/global_illumination/brick4/gpu/encoding/v1/chunk_brick4_sh3_color_decode.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/encoding/v1/chunk_brick4_sh3_color_decode.js +23 -2
- package/src/shade/renderer/global_illumination/brick4/gpu/encoding/v1/chunk_brick4_sh3_color_decode_from_storage.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/encoding/v1/chunk_brick4_sh3_color_decode_from_storage.js +22 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/encoding/v1/chunk_brick4_sh3_color_encode.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/encoding/v1/chunk_brick4_sh3_color_encode.js +23 -2
- package/src/shade/renderer/global_illumination/brick4/gpu/encoding/v1/chunk_brick4_sh3_color_encode_to_storage.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/gpu/encoding/v1/chunk_brick4_sh3_color_encode_to_storage.js +22 -1
- package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts +2 -1
- 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 +12 -53
- package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.js +12 -3
- package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +2 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/sample/chunk_lpv_atlas_patch_texel_coord.d.ts +17 -0
- package/src/shade/renderer/global_illumination/probe/octahedral/sample/chunk_lpv_atlas_patch_texel_coord.d.ts.map +1 -0
- package/src/shade/renderer/global_illumination/probe/octahedral/sample/chunk_lpv_atlas_patch_texel_coord.js +38 -0
- package/src/shade/renderer/global_illumination/probe/octahedral/sample/chunk_lpv_atlas_read_patch_texel.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/sample/chunk_lpv_atlas_read_patch_texel.js +16 -10
- package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.d.ts +1 -1
- package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.js +25 -14
- package/src/shade/renderer/gpu_primitive/indirect/NOTES.md +94 -0
- package/src/shade/renderer/gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.d.ts +10 -7
- package/src/shade/renderer/gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.js +10 -7
- package/src/shade/renderer/light/GPULightCollection.d.ts.map +1 -1
- package/src/shade/renderer/light/GPULightCollection.js +22 -1
- package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.d.ts.map +1 -1
- package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.js +26 -0
- package/src/shade/renderer/light/cluster/chunk_cluster_keep_smallest.d.ts +21 -0
- package/src/shade/renderer/light/cluster/chunk_cluster_keep_smallest.d.ts.map +1 -0
- package/src/shade/renderer/light/cluster/chunk_cluster_keep_smallest.js +47 -0
- package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/shader_cluster_assign_lights.js +12 -8
- package/src/shade/renderer/light/environment/equirectangular_zenith_first_direction_to_uv.d.ts +36 -0
- package/src/shade/renderer/light/environment/equirectangular_zenith_first_direction_to_uv.d.ts.map +1 -0
- package/src/shade/renderer/light/environment/equirectangular_zenith_first_direction_to_uv.js +41 -0
- package/src/shade/renderer/light/environment/execute_filter_environment_map.d.ts.map +1 -1
- package/src/shade/renderer/light/environment/execute_filter_environment_map.js +17 -1
- package/src/shade/renderer/light/environment/octahedral_uv_to_direction.d.ts +5 -13
- package/src/shade/renderer/light/environment/octahedral_uv_to_direction.d.ts.map +1 -1
- package/src/shade/renderer/light/environment/octahedral_uv_to_direction.js +10 -30
- package/src/shade/renderer/light/environment/octahedral_z_pole_uv_to_direction.d.ts +31 -0
- package/src/shade/renderer/light/environment/octahedral_z_pole_uv_to_direction.d.ts.map +1 -0
- package/src/shade/renderer/light/environment/octahedral_z_pole_uv_to_direction.js +45 -0
- package/src/shade/renderer/light/environment/resample_cube_to_octahedral.js +2 -2
- package/src/shade/renderer/light/environment/resample_equirectangular_to_octahedral.d.ts.map +1 -1
- package/src/shade/renderer/light/environment/resample_equirectangular_to_octahedral.js +11 -8
- package/src/shade/renderer/light/environment/rgbe/RGBE_ReadPixels_RLE.d.ts.map +1 -1
- package/src/shade/renderer/light/environment/rgbe/RGBE_ReadPixels_RLE.js +7 -1
- package/src/shade/renderer/light/model/SpotLight.d.ts +10 -1
- package/src/shade/renderer/light/model/SpotLight.d.ts.map +1 -1
- package/src/shade/renderer/light/model/SpotLight.js +11 -3
- 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 +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 +3 -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 +3 -1
- package/src/shade/renderer/lightmap/GPULightMap.d.ts.map +1 -1
- package/src/shade/renderer/lightmap/GPULightMap.js +349 -336
- package/src/shade/renderer/loader/gltf/gltf_base_url.d.ts +20 -0
- package/src/shade/renderer/loader/gltf/gltf_base_url.d.ts.map +1 -0
- package/src/shade/renderer/loader/gltf/gltf_base_url.js +27 -0
- package/src/shade/renderer/loader/gltf/gltf_create_material.d.ts.map +1 -1
- package/src/shade/renderer/loader/gltf/gltf_create_material.js +50 -10
- package/src/shade/renderer/loader/gltf/load_gltf.d.ts +4 -0
- package/src/shade/renderer/loader/gltf/load_gltf.d.ts.map +1 -1
- package/src/shade/renderer/loader/gltf/load_gltf.js +1109 -1128
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts.map +1 -1
- package/src/shade/renderer/loader/gltf/tiny-gltf.js +843 -843
- package/src/shade/renderer/material/GPUMaterialContext.d.ts +63 -26
- package/src/shade/renderer/material/GPUMaterialContext.d.ts.map +1 -1
- package/src/shade/renderer/material/GPUMaterialContext.js +255 -390
- package/src/shade/renderer/material/GPUMaterialManager.d.ts +51 -1
- package/src/shade/renderer/material/GPUMaterialManager.d.ts.map +1 -1
- package/src/shade/renderer/material/GPUMaterialManager.js +345 -91
- package/src/shade/renderer/material/ShadeMaterial.d.ts +21 -0
- package/src/shade/renderer/material/ShadeMaterial.d.ts.map +1 -1
- package/src/shade/renderer/material/ShadeMaterial.js +31 -0
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +25 -6
- package/src/shade/renderer/material/standard/SHADING_MATERIAL_RESOURCE_GROUP.d.ts +10 -0
- package/src/shade/renderer/material/standard/SHADING_MATERIAL_RESOURCE_GROUP.d.ts.map +1 -1
- package/src/shade/renderer/material/standard/SHADING_MATERIAL_RESOURCE_GROUP.js +14 -2
- package/src/shade/renderer/material/standard/STANDARD_MATERIAL_TEMPLATE.d.ts +12 -0
- package/src/shade/renderer/material/standard/STANDARD_MATERIAL_TEMPLATE.d.ts.map +1 -0
- package/src/shade/renderer/material/standard/STANDARD_MATERIAL_TEMPLATE.js +166 -0
- package/src/shade/renderer/material/standard/VT_MATERIAL_TEMPLATE.d.ts +10 -0
- package/src/shade/renderer/material/standard/VT_MATERIAL_TEMPLATE.d.ts.map +1 -0
- package/src/shade/renderer/material/standard/VT_MATERIAL_TEMPLATE.js +141 -0
- package/src/shade/renderer/material/standard/chunk_standard_material_surface.d.ts +29 -0
- package/src/shade/renderer/material/standard/chunk_standard_material_surface.d.ts.map +1 -0
- package/src/shade/renderer/material/standard/chunk_standard_material_surface.js +92 -0
- package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts +74 -28
- package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts.map +1 -1
- package/src/shade/renderer/material/standard/fragment_gbuffer.js +165 -67
- package/src/shade/renderer/material/standard/fragment_gbuffer_vt.d.ts +27 -18
- package/src/shade/renderer/material/standard/fragment_gbuffer_vt.d.ts.map +1 -1
- package/src/shade/renderer/material/standard/fragment_gbuffer_vt.js +70 -91
- package/src/shade/renderer/material/standard/material_gbuffer_vertex.d.ts +9 -6
- package/src/shade/renderer/material/standard/material_gbuffer_vertex.d.ts.map +1 -1
- package/src/shade/renderer/material/standard/material_gbuffer_vertex.js +13 -14
- package/src/shade/renderer/material/template/GPUMaterialServices.d.ts +73 -0
- package/src/shade/renderer/material/template/GPUMaterialServices.d.ts.map +1 -0
- package/src/shade/renderer/material/template/GPUMaterialServices.js +79 -0
- package/src/shade/renderer/material/template/ShadeMaterialTemplate.d.ts +170 -0
- package/src/shade/renderer/material/template/ShadeMaterialTemplate.d.ts.map +1 -0
- package/src/shade/renderer/material/template/ShadeMaterialTemplate.js +234 -0
- package/src/shade/renderer/material/template/chunk_material_surface.d.ts +47 -0
- package/src/shade/renderer/material/template/chunk_material_surface.d.ts.map +1 -0
- package/src/shade/renderer/material/template/chunk_material_surface.js +116 -0
- package/src/shade/renderer/material/template/flat_material_template_spec_support.d.ts +22 -0
- package/src/shade/renderer/material/template/flat_material_template_spec_support.d.ts.map +1 -0
- package/src/shade/renderer/material/template/flat_material_template_spec_support.js +78 -0
- package/src/shade/renderer/material/template/material_metadata_neutral.d.ts +15 -0
- package/src/shade/renderer/material/template/material_metadata_neutral.d.ts.map +1 -0
- package/src/shade/renderer/material/template/material_metadata_neutral.js +46 -0
- package/src/shade/renderer/material/template/material_template_of.d.ts +10 -0
- package/src/shade/renderer/material/template/material_template_of.d.ts.map +1 -0
- package/src/shade/renderer/material/template/material_template_of.js +20 -0
- package/src/shade/renderer/object_property/chunk_write_object_property.d.ts +5 -0
- package/src/shade/renderer/object_property/chunk_write_object_property.d.ts.map +1 -1
- package/src/shade/renderer/object_property/chunk_write_object_property.js +7 -1
- package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts +7 -1
- package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts.map +1 -1
- package/src/shade/renderer/object_property/chunk_write_object_property_node3d.js +9 -2
- package/src/shade/renderer/particles/DESIGN.md +21 -5
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts +25 -10
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
- package/src/shade/renderer/particles/GPUParticleSystem.js +182 -38
- package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.js +81 -68
- package/src/shade/renderer/particles/graph/groups/simplex_reference.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/groups/simplex_reference.js +16 -10
- package/src/shade/renderer/particles/graph_particles.d.ts +4 -2
- package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph_particles.js +8 -2
- package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts +22 -3
- package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/ParticleVMISA.js +30 -3
- package/src/shade/renderer/particles/isa/particle_assembly.js +41 -1
- package/src/shade/renderer/particles/optimizer/particle_program_analysis.d.ts +7 -1
- package/src/shade/renderer/particles/optimizer/particle_program_analysis.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/particle_program_analysis.js +23 -17
- package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/particle_vm_semantics.js +8 -2
- package/src/shade/renderer/particles/optimizer/pass_allocate_registers.js +1 -1
- package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_fold_constants.js +20 -13
- package/src/shade/renderer/particles/optimizer/pass_inline_constants.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_inline_constants.js +4 -3
- package/src/shade/renderer/particles/optimizer/pass_narrow_widths.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_narrow_widths.js +1 -1
- package/src/shade/renderer/particles/optimizer/pass_pack_registers.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_pack_registers.js +12 -4
- package/src/shade/renderer/particles/optimizer/pass_peephole.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_peephole.js +11 -10
- package/src/shade/renderer/particles/optimizer/pass_propagate_copies.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_propagate_copies.js +12 -10
- package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.js +12 -4
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/ParticleEmitter.js +7 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_avboit_contribution.d.ts +4 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_avboit_contribution.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_avboit_contribution.js +47 -88
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_occupancy.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_occupancy.js +22 -68
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.js +5 -3
- package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.d.ts +31 -0
- package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/shader_particle_init_free_list.js +62 -0
- package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts +13 -0
- package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts.map +1 -1
- package/src/shade/renderer/particles/vm/ParticleVMReference.js +112 -18
- package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.js +12 -2
- package/src/shade/renderer/postprocess/TemporalJitterSequence.d.ts +44 -0
- package/src/shade/renderer/postprocess/TemporalJitterSequence.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/TemporalJitterSequence.js +104 -0
- package/src/shade/renderer/postprocess/chunk_find_nearest_depth.d.ts +25 -0
- package/src/shade/renderer/postprocess/chunk_find_nearest_depth.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/chunk_find_nearest_depth.js +74 -0
- package/src/shade/renderer/postprocess/denoise/shader_temporal_reprojection_luma.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/denoise/shader_temporal_reprojection_luma.js +19 -4
- package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.js +12 -1
- package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.js +8 -0
- package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.js +18 -3
- package/src/shade/renderer/postprocess/eye/shader_autoexposure_read_histogram.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/eye/shader_autoexposure_read_histogram.js +17 -4
- package/src/shade/renderer/postprocess/gtao/GTAO_CONSTANTS.d.ts +29 -0
- package/src/shade/renderer/postprocess/gtao/GTAO_CONSTANTS.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/gtao/GTAO_CONSTANTS.js +69 -0
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts +4 -16
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.js +10 -52
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.d.ts +0 -16
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +23 -55
- package/src/shade/renderer/postprocess/motion_blur/MotionBlur.d.ts +4 -1
- package/src/shade/renderer/postprocess/motion_blur/MotionBlur.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/motion_blur/MotionBlur.js +4 -1
- package/src/shade/renderer/postprocess/motion_blur/chunk_motion_blur_resolution.d.ts +18 -0
- package/src/shade/renderer/postprocess/motion_blur/chunk_motion_blur_resolution.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/motion_blur/chunk_motion_blur_resolution.js +43 -0
- package/src/shade/renderer/postprocess/motion_blur/graph_postprocess_motion_blur.d.ts +5 -1
- package/src/shade/renderer/postprocess/motion_blur/graph_postprocess_motion_blur.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/motion_blur/graph_postprocess_motion_blur.js +12 -2
- package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.js +33 -6
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +16 -8
- package/src/shade/renderer/postprocess/nss/NSS.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/nss/NSS.js +37 -35
- package/src/shade/renderer/postprocess/nss/chunk_nss_find_nearest_depth.d.ts +2 -2
- package/src/shade/renderer/postprocess/nss/chunk_nss_find_nearest_depth.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/nss/chunk_nss_find_nearest_depth.js +28 -61
- package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/nss/shader_nss_postprocess.js +296 -291
- package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/nss/shader_nss_preprocess.js +13 -0
- package/src/shade/renderer/postprocess/ssr/SSR.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/SSR.js +9 -7
- package/src/shade/renderer/postprocess/ssr/depth_max_shader.d.ts +14 -0
- package/src/shade/renderer/postprocess/ssr/depth_max_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/depth_max_shader.js +53 -25
- package/src/shade/renderer/postprocess/ssr/graph_build_depth_max_pyramid.d.ts +11 -1
- package/src/shade/renderer/postprocess/ssr/graph_build_depth_max_pyramid.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/graph_build_depth_max_pyramid.js +11 -1
- package/src/shade/renderer/postprocess/ssr/prefilter/NOTES.md +46 -0
- package/src/shade/renderer/postprocess/ssr/prefilter/shader_ssr_prefilter.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/prefilter/shader_ssr_prefilter.js +7 -0
- package/src/shade/renderer/postprocess/ssr/shader/chunk_ssr_depth_thickness.d.ts +32 -0
- package/src/shade/renderer/postprocess/ssr/shader/chunk_ssr_depth_thickness.d.ts.map +1 -0
- package/src/shade/renderer/postprocess/ssr/shader/chunk_ssr_depth_thickness.js +41 -0
- package/src/shade/renderer/postprocess/ssr/ssr_trace_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/ssr_trace_shader.js +11 -6
- package/src/shade/renderer/postprocess/taa/TAA.d.ts +13 -4
- package/src/shade/renderer/postprocess/taa/TAA.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/taa/TAA.js +29 -48
- package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap.d.ts +11 -0
- package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/taa/chunk_taa_tonemap.js +25 -4
- package/src/shade/renderer/postprocess/taa/shader_depth_occlusion_clip.d.ts +8 -0
- package/src/shade/renderer/postprocess/taa/shader_depth_occlusion_clip.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/taa/shader_depth_occlusion_clip.js +14 -42
- package/src/shade/renderer/rasterize/RasterizationJob.d.ts +4 -2
- package/src/shade/renderer/rasterize/RasterizationJob.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/RasterizationJob.js +3 -1
- package/src/shade/renderer/rasterize/TemplatePassDescriptor.d.ts +57 -0
- package/src/shade/renderer/rasterize/TemplatePassDescriptor.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/TemplatePassDescriptor.js +133 -0
- package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/construct_primitive_state.js +17 -0
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +30 -4
- package/src/shade/renderer/rasterize/bucket/rasterization_has_opaque_bucket.d.ts +21 -0
- package/src/shade/renderer/rasterize/bucket/rasterization_has_opaque_bucket.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/bucket/rasterization_has_opaque_bucket.js +28 -0
- package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/shader_count_meshlets_by_material.js +74 -68
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +11 -1
- package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/shader_sort_meshlets_by_material.js +70 -64
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way.js +3 -4
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +8 -2
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.js +3 -4
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +7 -5
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.js +3 -4
- package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.js +3 -4
- package/src/shade/renderer/rasterize/expand/mesh/shader_prefix_sum_to_command.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/mesh/shader_prefix_sum_to_command.js +5 -2
- package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.js +3 -4
- package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.js +19 -2
- package/src/shade/renderer/rasterize/forward/SHADING_SCENE_RESOURCE_GROUP.d.ts +20 -0
- package/src/shade/renderer/rasterize/forward/SHADING_SCENE_RESOURCE_GROUP.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/forward/SHADING_SCENE_RESOURCE_GROUP.js +25 -0
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.js +2 -1
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.js +2 -1
- package/src/shade/renderer/rasterize/forward/forward_template_pipeline.d.ts +40 -0
- package/src/shade/renderer/rasterize/forward/forward_template_pipeline.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/forward/forward_template_pipeline.js +86 -0
- package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.d.ts +11 -0
- package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.js +13 -2
- package/src/shade/renderer/rasterize/native/alpha_tested_pass_resources.d.ts +59 -1
- package/src/shade/renderer/rasterize/native/alpha_tested_pass_resources.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/alpha_tested_pass_resources.js +109 -7
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +16 -1
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +13 -1
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_LEDGER.md +247 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +20 -2
- package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +1 -1
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_coverage.d.ts +17 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_coverage.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_coverage.js +25 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_fold_pairs.d.ts +4 -5
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_fold_pairs.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_fold_pairs.js +7 -6
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_mark.d.ts +17 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_mark.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_mark.js +51 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_premultiplied_contribution.d.ts +23 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_premultiplied_contribution.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_premultiplied_contribution.js +77 -0
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +16 -20
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.d.ts +8 -2
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.js +57 -43
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.d.ts +8 -2
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.js +57 -43
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_occupancy.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_occupancy.js +8 -2
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts +7 -2
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.js +67 -58
- package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.d.ts +8 -2
- package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.js +186 -156
- package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.d.ts +2 -2
- package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.js +36 -28
- package/src/shade/renderer/rasterize/native/material_draw_indirect.d.ts +14 -12
- package/src/shade/renderer/rasterize/native/material_draw_indirect.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/material_draw_indirect.js +29 -23
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +16 -22
- package/src/shade/renderer/rasterize/native/oit/oit_resolve_fragment_body.d.ts +33 -0
- package/src/shade/renderer/rasterize/native/oit/oit_resolve_fragment_body.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/oit/oit_resolve_fragment_body.js +123 -0
- package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.d.ts +7 -2
- package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +227 -218
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.d.ts +8 -2
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +112 -180
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.d.ts +8 -2
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.js +110 -178
- package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.d.ts +7 -2
- package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +242 -204
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +19 -2
- package/src/shade/renderer/restir/reservoir/shader.d.ts.map +1 -1
- package/src/shade/renderer/restir/reservoir/shader.js +27 -1
- package/src/shade/renderer/scene/GPUSceneContext.d.ts +2 -1
- package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUSceneContext.js +11 -9
- package/src/shade/renderer/scene/SCENE_DATABASE_SPEC.js +22 -0
- package/src/shade/renderer/scene/SceneManager.d.ts +10 -0
- package/src/shade/renderer/scene/SceneManager.d.ts.map +1 -1
- package/src/shade/renderer/scene/SceneManager.js +17 -0
- package/src/shade/renderer/scene/rows/GPUEntityBoundsReadback.d.ts.map +1 -1
- package/src/shade/renderer/scene/rows/GPUEntityBoundsReadback.js +164 -144
- package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts +10 -0
- package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts.map +1 -1
- package/src/shade/renderer/scene/rows/GPUSceneRows.js +14 -0
- package/src/shade/renderer/scene/serialization/serialize_scene.d.ts.map +1 -1
- package/src/shade/renderer/scene/serialization/serialize_scene.js +2 -6
- package/src/shade/renderer/shader/ComputeShader.d.ts +5 -0
- package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
- package/src/shade/renderer/shader/ComputeShader.js +358 -353
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_integrate_scattering.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/atmosphere/chunk_integrate_scattering.js +15 -1
- package/src/shade/renderer/shader/chunk/binary/chunk_encode_f16.d.ts +11 -2
- package/src/shade/renderer/shader/chunk/binary/chunk_encode_f16.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/binary/chunk_encode_f16.js +33 -13
- package/src/shade/renderer/shader/chunk/brdf/chunk_D_GGX.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/brdf/chunk_D_GGX.js +31 -3
- package/src/shade/renderer/shader/chunk/bvh/morton/chunk_decode32_morton2.d.ts +10 -1
- package/src/shade/renderer/shader/chunk/bvh/morton/chunk_decode32_morton2.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/bvh/morton/chunk_decode32_morton2.js +23 -8
- package/src/shade/renderer/shader/chunk/camera/chunk_pixel_radius_to_world.d.ts +8 -1
- package/src/shade/renderer/shader/chunk/camera/chunk_pixel_radius_to_world.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/camera/chunk_pixel_radius_to_world.js +12 -5
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_distance_to_ray.d.ts +15 -1
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_distance_to_ray.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_distance_to_ray.js +24 -28
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_distance_to_ray_v2.d.ts +5 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_distance_to_ray_v2.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_distance_to_ray_v2.js +18 -13
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_intersects_ray.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_intersects_ray.js +1 -47
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_raycast.d.ts +10 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_raycast.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_raycast.js +23 -8
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_raycast_positive.d.ts +7 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_raycast_positive.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_raycast_positive.js +12 -25
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_slab_span.d.ts +32 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_slab_span.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_slab_span.js +52 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_view_depth_range.d.ts +20 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_view_depth_range.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/aabb3/chunk_aabb3_view_depth_range.js +42 -0
- package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_octahedral_uv_wrap.d.ts +10 -1
- package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_octahedral_uv_wrap.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/octahedron/chunk_octahedral_uv_wrap.js +18 -3
- package/src/shade/renderer/shader/chunk/geometry/quaternion/chunk_quat_encode_u32.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/quaternion/chunk_quat_encode_u32.js +8 -4
- package/src/shade/renderer/shader/chunk/grid/chunk_folded_workgroup_index.d.ts +24 -0
- package/src/shade/renderer/shader/chunk/grid/chunk_folded_workgroup_index.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/grid/chunk_folded_workgroup_index.js +36 -0
- package/src/shade/renderer/shader/chunk/grid/chunk_grid3d_to_index.d.ts +6 -0
- package/src/shade/renderer/shader/chunk/grid/chunk_grid3d_to_index.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/grid/chunk_grid3d_to_index.js +6 -0
- package/src/shade/renderer/shader/chunk/light/INCIDENT_LIGHT_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/light/INCIDENT_LIGHT_STRUCT.js +6 -1
- package/src/shade/renderer/shader/chunk/light/io/chunk_get_spot_light_info.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/light/io/chunk_get_spot_light_info.js +6 -1
- package/src/shade/renderer/shader/chunk/material/chunk_albedo_unpremultiply.d.ts +24 -0
- package/src/shade/renderer/shader/chunk/material/chunk_albedo_unpremultiply.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/material/chunk_albedo_unpremultiply.js +31 -0
- package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg2d.js +2 -2
- package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg3d16.js +1 -1
- package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg4d.js +1 -1
- package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_validate_hit.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/screen_space/chunk_ffx_sssr_validate_hit.js +8 -4
- package/src/shade/renderer/shader/chunk/sdf/chunk_mesh_sdf_soft_shadow.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/sdf/chunk_mesh_sdf_soft_shadow.js +17 -3
- package/src/shade/renderer/shader/graph/compute/graph_compute_indirect_pass.d.ts +4 -0
- package/src/shade/renderer/shader/graph/compute/graph_compute_indirect_pass.d.ts.map +1 -1
- package/src/shade/renderer/shader/graph/compute/graph_compute_indirect_pass.js +4 -0
- package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts +8 -0
- package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/pass/RenderPassDescriptor.js +203 -192
- package/src/shade/renderer/shader/resource/ShaderResourceGroupDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/resource/ShaderResourceGroupDescriptor.js +12 -0
- package/src/shade/renderer/shader/type/WebGPUArray.d.ts.map +1 -1
- package/src/shade/renderer/shader/type/WebGPUArray.js +25 -1
- package/src/shade/renderer/shader/type/WebGPUStruct.d.ts.map +1 -1
- package/src/shade/renderer/shader/type/WebGPUStruct.js +12 -0
- package/src/shade/renderer/shader/type/queue_typed_buffer_update.d.ts.map +1 -1
- package/src/shade/renderer/shader/type/queue_typed_buffer_update.js +15 -0
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +10 -9
- package/src/shade/renderer/shadow/map/ShadowmapDrawSelector.d.ts +12 -2
- package/src/shade/renderer/shadow/map/ShadowmapDrawSelector.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/ShadowmapDrawSelector.js +210 -196
- package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.d.ts +10 -3
- package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.js +219 -194
- package/src/shade/renderer/shadow/map/shadowmap_budget_carry_over.d.ts +32 -0
- package/src/shade/renderer/shadow/map/shadowmap_budget_carry_over.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/shadowmap_budget_carry_over.js +47 -0
- package/src/shade/renderer/shadow/vsm/VirtualShadowMap.d.ts.map +1 -1
- package/src/shade/renderer/shadow/vsm/VirtualShadowMap.js +11 -1
- package/src/shade/renderer/texture/ShadeTexture.d.ts +16 -0
- package/src/shade/renderer/texture/ShadeTexture.d.ts.map +1 -1
- package/src/shade/renderer/texture/ShadeTexture.js +17 -0
- package/src/shade/renderer/texture/TextureManager.d.ts +22 -5
- package/src/shade/renderer/texture/TextureManager.d.ts.map +1 -1
- package/src/shade/renderer/texture/TextureManager.js +109 -6
- package/src/shade/renderer/texture/bindless/GPUBindlessTextureManager.d.ts.map +1 -1
- package/src/shade/renderer/texture/bindless/GPUBindlessTextureManager.js +8 -2
- package/src/shade/renderer/texture/download_texture_data.d.ts.map +1 -1
- package/src/shade/renderer/texture/download_texture_data.js +12 -4
- package/src/shade/renderer/texture/encode/shader_texture_encode_astc_4x4.d.ts.map +1 -1
- package/src/shade/renderer/texture/encode/shader_texture_encode_astc_4x4.js +66 -63
- package/src/shade/renderer/texture/encode/shader_texture_encode_bc1.d.ts.map +1 -1
- package/src/shade/renderer/texture/encode/shader_texture_encode_bc1.js +63 -60
- package/src/shade/renderer/texture/encode/shader_texture_encode_bc4.d.ts.map +1 -1
- package/src/shade/renderer/texture/encode/shader_texture_encode_bc4.js +79 -76
- package/src/shade/renderer/texture/encode/shader_texture_encode_bc4_snorm.d.ts.map +1 -1
- package/src/shade/renderer/texture/encode/shader_texture_encode_bc4_snorm.js +67 -64
- package/src/shade/renderer/texture/encode/shader_texture_encode_bc5.d.ts.map +1 -1
- package/src/shade/renderer/texture/encode/shader_texture_encode_bc5.js +70 -67
- package/src/shade/renderer/texture/encode/shader_texture_encode_bc5_snorm.d.ts.map +1 -1
- package/src/shade/renderer/texture/encode/shader_texture_encode_bc5_snorm.js +66 -63
- package/src/shade/renderer/texture/encode/shader_texture_encode_bc6h.d.ts.map +1 -1
- package/src/shade/renderer/texture/encode/shader_texture_encode_bc6h.js +65 -62
- package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.d.ts.map +1 -1
- package/src/shade/renderer/texture/encode/shader_texture_encode_bc7.js +61 -58
- package/src/shade/renderer/texture/format/texture_format_from_shade_image.d.ts +7 -1
- package/src/shade/renderer/texture/format/texture_format_from_shade_image.d.ts.map +1 -1
- package/src/shade/renderer/texture/format/texture_format_from_shade_image.js +100 -95
- package/src/shade/renderer/texture/mipmaps/WebGPUMipmapGenerator.d.ts +8 -2
- package/src/shade/renderer/texture/mipmaps/WebGPUMipmapGenerator.d.ts.map +1 -1
- package/src/shade/renderer/texture/mipmaps/WebGPUMipmapGenerator.js +99 -73
- package/src/shade/renderer/texture/mipmaps/filters/mipmap_shader_code_wronski2021.d.ts +30 -1
- package/src/shade/renderer/texture/mipmaps/filters/mipmap_shader_code_wronski2021.d.ts.map +1 -1
- package/src/shade/renderer/texture/mipmaps/filters/mipmap_shader_code_wronski2021.js +37 -20
- package/src/shade/renderer/texture/texture_descriptor_from_texture_shade.js +73 -73
- package/src/shade/renderer/view/ViewManager.d.ts +8 -0
- package/src/shade/renderer/view/ViewManager.d.ts.map +1 -1
- package/src/shade/renderer/view/ViewManager.js +15 -0
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +516 -507
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_scattering_lut.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/shader_volumetrics_build_scattering_lut.js +272 -260
- package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/taa/shader_volumetrics_taa.js +160 -134
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts +3 -0
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +2564 -2356
- package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.js +110 -7
- package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
- package/src/shade/wgsl/validate_wgsl_source.js +57 -0
- package/src/view/asset/AssetLoaderStatusView.d.ts.map +1 -1
- package/src/view/asset/AssetLoaderStatusView.js +8 -0
- package/src/view/common/LabelView.d.ts.map +1 -1
- package/src/view/common/LabelView.js +4 -0
- package/src/view/common/ListView.d.ts +6 -2
- package/src/view/common/ListView.d.ts.map +1 -1
- package/src/view/common/ListView.js +27 -7
- package/src/view/common/TabbedView.d.ts.map +1 -1
- package/src/view/common/TabbedView.js +8 -0
- package/src/view/common/VirtualListView.d.ts.map +1 -1
- package/src/view/common/VirtualListView.js +17 -1
- package/src/view/common/dnd/DropTarget.d.ts.map +1 -1
- package/src/view/common/dnd/DropTarget.js +18 -0
- package/src/view/elements/DropDownSelectionView.d.ts.map +1 -1
- package/src/view/elements/DropDownSelectionView.js +8 -0
- package/src/view/elements/image/SvgImageView.d.ts.map +1 -1
- package/src/view/elements/image/SvgImageView.js +8 -0
- package/src/view/elements/navigation/ViewStack.d.ts.map +1 -1
- package/src/view/elements/navigation/ViewStack.js +4 -0
- package/src/view/elements/notify/NotificationView.d.ts.map +1 -1
- package/src/view/elements/notify/NotificationView.js +4 -0
- package/src/view/elements/progress/segmented/SegmentedResourceBarView.d.ts.map +1 -1
- package/src/view/elements/progress/segmented/SegmentedResourceBarView.js +8 -0
- package/src/view/elements/radial/RadialMenu.d.ts.map +1 -1
- package/src/view/elements/radial/RadialMenu.js +4 -0
- package/src/view/minimap/Minimap.d.ts.map +1 -1
- package/src/view/minimap/Minimap.js +8 -0
- package/src/view/minimap/MinimapCanvasView.d.ts.map +1 -1
- package/src/view/minimap/MinimapCanvasView.js +21 -1
- package/src/view/minimap/dom/MinimapCameraView.d.ts.map +1 -1
- package/src/view/minimap/dom/MinimapCameraView.js +232 -220
- package/src/view/minimap/dom/MinimapMarkerView.d.ts.map +1 -1
- package/src/view/minimap/dom/MinimapMarkerView.js +8 -0
- package/src/view/minimap/minimap_focus_area.d.ts +5 -0
- package/src/view/minimap/minimap_focus_area.d.ts.map +1 -1
- package/src/view/minimap/minimap_focus_area.js +22 -0
- package/src/view/tooltip/DomTooltipManager.d.ts +7 -0
- package/src/view/tooltip/DomTooltipManager.d.ts.map +1 -1
- package/src/view/tooltip/DomTooltipManager.js +22 -0
- package/src/view/tooltip/DomTooltipObserver.d.ts.map +1 -1
- package/src/view/tooltip/DomTooltipObserver.js +13 -3
- package/src/view/tooltip/TooltipManager.d.ts.map +1 -1
- package/src/view/tooltip/TooltipManager.js +16 -4
- package/src/core/geom/3d/atlas/atlas_bench_lib.js +0 -315
- package/src/engine/graphics/ecs/mesh/MeshEvents.d.ts +0 -6
- package/src/engine/graphics/ecs/mesh/MeshEvents.d.ts.map +0 -1
- package/src/engine/graphics/ecs/mesh/MeshEvents.js +0 -16
- package/src/engine/graphics/ecs/mesh/commonObject3DFastMatrixUpdate.d.ts +0 -2
- package/src/engine/graphics/ecs/mesh/commonObject3DFastMatrixUpdate.d.ts.map +0 -1
- package/src/engine/graphics/ecs/mesh/commonObject3DFastMatrixUpdate.js +0 -37
- package/src/engine/graphics/ecs/mesh/copyToVector3.d.ts +0 -8
- package/src/engine/graphics/ecs/mesh/copyToVector3.d.ts.map +0 -1
- package/src/engine/graphics/ecs/mesh/copyToVector3.js +0 -18
- package/src/engine/graphics/ecs/mesh/object3DFastMatrixUpdate.d.ts +0 -6
- package/src/engine/graphics/ecs/mesh/object3DFastMatrixUpdate.d.ts.map +0 -1
- package/src/engine/graphics/ecs/mesh/object3DFastMatrixUpdate.js +0 -18
- package/src/engine/graphics/ecs/mesh/rootObject3DFastMatrixUpdate.d.ts +0 -6
- package/src/engine/graphics/ecs/mesh/rootObject3DFastMatrixUpdate.d.ts.map +0 -1
- package/src/engine/graphics/ecs/mesh/rootObject3DFastMatrixUpdate.js +0 -14
- package/src/engine/graphics/ecs/mesh/setMesh.d.ts +0 -16
- package/src/engine/graphics/ecs/mesh/setMesh.d.ts.map +0 -1
- package/src/engine/graphics/ecs/mesh/setMesh.js +0 -55
- package/src/engine/graphics/ecs/mesh/skeleton/BoneMapping.d.ts +0 -13
- package/src/engine/graphics/ecs/mesh/skeleton/BoneMapping.d.ts.map +0 -1
- package/src/engine/graphics/ecs/mesh/skeleton/BoneMapping.js +0 -99
- package/src/engine/graphics/ecs/mesh/skeleton/HumanoidBoneType.d.ts +0 -25
- package/src/engine/graphics/ecs/mesh/skeleton/HumanoidBoneType.d.ts.map +0 -1
- package/src/engine/graphics/ecs/mesh/skeleton/HumanoidBoneType.js +0 -29
- package/src/engine/graphics/ecs/mesh/updateMeshTransform.d.ts +0 -6
- package/src/engine/graphics/ecs/mesh/updateMeshTransform.d.ts.map +0 -1
- package/src/engine/graphics/ecs/mesh/updateMeshTransform.js +0 -15
- package/src/engine/graphics/ecs/mesh/updateNodeByTransformAndBBB.d.ts +0 -8
- package/src/engine/graphics/ecs/mesh/updateNodeByTransformAndBBB.d.ts.map +0 -1
- package/src/engine/graphics/ecs/mesh/updateNodeByTransformAndBBB.js +0 -14
- package/src/engine/graphics3/terrain/GPUTerrainSplatRenderer.js +0 -481
- package/src/engine/graphics3/terrain/pack_terrain_row_table.js +0 -48
- package/src/engine/graphics3/terrain/shader_terrain_splat.js +0 -215
- package/src/shade/renderer/animation/ANIMATION_BOUND_TRACK_GROUP_STRUCT.js +0 -57
- package/src/shade/renderer/animation/ANIMATION_KEYFRAME_BLOCK_STRUCT.js +0 -50
- package/src/shade/renderer/animation/ANIMATION_SKIN_JOINT_BLOCK_STRUCT.js +0 -62
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.d.ts +0 -46
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.js +0 -45
|
@@ -1,1323 +1,1332 @@
|
|
|
1
|
-
import { assert } from "../../../../core/assert.js";
|
|
2
|
-
import { round_up } from "../../../../core/math/round_up.js";
|
|
3
|
-
import { GPU_DATABASE_BUFFER_ELEMENT_TYPE } from "./GPU_DATABASE_BUFFER_ELEMENT_TYPE.js";
|
|
4
|
-
import { GPU_TABLE_GATHER_DESCRIPTOR_WORDS } from "./GPU_TABLE_GATHER_DESCRIPTOR_WORDS.js";
|
|
5
|
-
import { gpu_table_gather_shader } from "./gpu_table_gather_shader.js";
|
|
6
|
-
import { GPUReadbackStatus } from "./GPUReadbackStatus.js";
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Bytes per {@link GPU_DATABASE_BUFFER_ELEMENT_TYPE}.
|
|
10
|
-
* @type {number}
|
|
11
|
-
*/
|
|
12
|
-
const WORD_SIZE = GPU_DATABASE_BUFFER_ELEMENT_TYPE.size;
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Largest transient descriptor buffer one dispatch will be given, matching the upload path's.
|
|
16
|
-
* @type {number}
|
|
17
|
-
*/
|
|
18
|
-
const DESCRIPTOR_CHUNK_BYTES = 256 * 1024;
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Granularity the gather scratch buffer grows by.
|
|
22
|
-
* @type {number}
|
|
23
|
-
*/
|
|
24
|
-
const GATHER_SIZE_GRANULARITY = 1024;
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Requests at or above which a batch is gathered by a dispatch rather than copied range by range.
|
|
28
|
-
*
|
|
29
|
-
* **Measured, not chosen**, on a real device: Chrome 141 / Dawn, NVIDIA Lovelace, reading a 64-byte
|
|
30
|
-
* range out of each of N 176-byte rows spread across 4 KiB pages. Best of five blocks of a hundred
|
|
31
|
-
* batches, by `src/shade/playground/readback_crossover/`.
|
|
32
|
-
*
|
|
33
|
-
* | rows | encode copies | encode gather | round trip copies | round trip gather |
|
|
34
|
-
* |-----:|--------------:|--------------:|------------------:|------------------:|
|
|
35
|
-
* | 1 | 5.0 µs | 17.0 µs | 63 µs | 79 µs |
|
|
36
|
-
* | 8 | 6.0 µs | 25.0 µs | 75 µs | 125 µs |
|
|
37
|
-
* | 32 | 10.0 µs | 27.0 µs | 111 µs | 130 µs |
|
|
38
|
-
* | 64 | 14.0 µs | 33.0 µs | 135 µs | 129 µs |
|
|
39
|
-
* | 256 | 45.0 µs | 53.0 µs | 230 µs | 116 µs |
|
|
40
|
-
* | 512 | 87.0 µs | 77.0 µs | 307 µs | 115 µs |
|
|
41
|
-
*
|
|
42
|
-
* Fitted: encoding costs `4.5 µs + 0.161 per row` for copies against `21.9 µs + 0.112` for the
|
|
43
|
-
* gather, which crosses at **352 rows** — on CPU encode cost alone the gather is almost never worth
|
|
44
|
-
* it, because appending a descriptor is not much cheaper than appending a copy command.
|
|
45
|
-
*
|
|
46
|
-
* The round trip is where the difference actually lives: `81 µs + 0.480 per row` for copies against
|
|
47
|
-
* `104 µs + 0.037` for the gather. Submitting and executing N scattered copy commands costs about
|
|
48
|
-
* half a microsecond each, and the gather is flat — 512 rows cost it no more than 8 do. Those cross
|
|
49
|
-
* at **51 rows**, and the measured curves cross between 32 and 64. This is 48: inside the measured
|
|
50
|
-
* interval, and on the side of the path whose cost does not grow.
|
|
51
|
-
*
|
|
52
|
-
* The fixed term of the round trip is mostly the wait for `onSubmittedWorkDone` and is not a cost a
|
|
53
|
-
* frame pays synchronously; the slopes are the part that decides, and they differ by 13×.
|
|
54
|
-
*
|
|
55
|
-
* Those numbers were taken against the first, callback-and-objects version of this service. The
|
|
56
|
-
* same page, re-run on the same adapter after the request became a few integer stores (two idle
|
|
57
|
-
* runs, headless Chrome): encode `5.7–5.9 + 0.14 per row` for copies against `23.5–23.8 + 0.10` for
|
|
58
|
-
* the gather; round trip `67–73 + 0.31` against `83–86 + 0.003–0.010`, crossing at 34 and 62 rows
|
|
59
|
-
* with the curves crossing between 16 and 64. The per-row cost fell on both paths and the slopes
|
|
60
|
-
* that decide are further apart than before; 48 is still inside the interval.
|
|
61
|
-
*
|
|
62
|
-
* @see https://claude.ai/code/artifact/88ee4932-ed98-407e-a25b-d379f3cf852a F5, which asked for this
|
|
63
|
-
* number rather than for "batched is better"
|
|
64
|
-
* @type {number}
|
|
65
|
-
*/
|
|
66
|
-
const DEFAULT_GATHER_THRESHOLD = 48;
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Batches allowed in flight before a frame's requests are refused. A mapping normally lands one or
|
|
70
|
-
* two frames after its copy, so this is only reached when the device has stopped answering, and
|
|
71
|
-
* the right thing to do with a frame's requests then is to say so and drop them: a consumer asks
|
|
72
|
-
* every frame anyway, and a value delivered a dozen frames late is not the value it wanted.
|
|
73
|
-
*
|
|
74
|
-
* @type {number}
|
|
75
|
-
*/
|
|
76
|
-
const DEFAULT_MAX_IN_FLIGHT = 4;
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Request records and batch handle lists start at this many entries and double.
|
|
80
|
-
* @type {number}
|
|
81
|
-
*/
|
|
82
|
-
const INITIAL_CAPACITY = 64;
|
|
83
|
-
|
|
84
|
-
/*
|
|
85
|
-
* One request is RECORD_WORDS words of the flat record array, at handle * RECORD_WORDS. The first
|
|
86
|
-
* six are written by `request`, the last two by `encode`.
|
|
87
|
-
*/
|
|
88
|
-
const R_TABLE = 0;
|
|
89
|
-
const R_ROW = 1;
|
|
90
|
-
const R_WORD_OFFSET = 2;
|
|
91
|
-
const R_WORD_COUNT = 3;
|
|
92
|
-
const R_GENERATION = 4;
|
|
93
|
-
const R_TARGET_OFFSET = 5;
|
|
94
|
-
const R_SOURCE_WORD = 6;
|
|
95
|
-
const R_DESTINATION_WORD = 7;
|
|
96
|
-
const RECORD_WORDS = 8;
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* @enum {number}
|
|
100
|
-
*/
|
|
101
|
-
const BatchState = {
|
|
102
|
-
/** taking requests; the one batch in this state is the frame's */
|
|
103
|
-
Assembling: 0,
|
|
104
|
-
/** copy recorded, the frame that recorded it not yet known to be submitted */
|
|
105
|
-
Encoded: 1,
|
|
106
|
-
/** `mapAsync` outstanding */
|
|
107
|
-
Mapping: 2,
|
|
108
|
-
/** mapped, waiting for an apply point */
|
|
109
|
-
Ready: 3,
|
|
110
|
-
/** the map was refused; the batch is discarded without delivering */
|
|
111
|
-
Failed: 4,
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* One frame's worth of requests, travelling together. Pooled: a batch that has been delivered keeps
|
|
116
|
-
* its arrays and takes the next frame's requests, so a steady stream of batches allocates nothing.
|
|
117
|
-
*/
|
|
118
|
-
class GPUReadbackBatch {
|
|
119
|
-
/**
|
|
120
|
-
* Handles in request order.
|
|
121
|
-
* @type {Uint32Array}
|
|
122
|
-
*/
|
|
123
|
-
handles = new Uint32Array(INITIAL_CAPACITY);
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* @type {number}
|
|
127
|
-
*/
|
|
128
|
-
count = 0;
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* Requests whose row was resident when the batch was encoded.
|
|
132
|
-
* @type {number}
|
|
133
|
-
*/
|
|
134
|
-
live = 0;
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* Bytes of the packed image.
|
|
138
|
-
* @type {number}
|
|
139
|
-
*/
|
|
140
|
-
byte_size = 0;
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* The readback buffer the image was copied into. From {@link GPUBufferReadbackAllocator}, and
|
|
144
|
-
* given back when the batch is delivered or discarded.
|
|
145
|
-
*
|
|
146
|
-
* @type {GPUBuffer|null}
|
|
147
|
-
*/
|
|
148
|
-
buffer = null;
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* The mapped image, valid from the mapping settling until the buffer is given back. Read
|
|
152
|
-
* directly at the apply point — the buffer stays mapped until then, which is what makes the
|
|
153
|
-
* copy into the caller's memory the only copy.
|
|
154
|
-
*
|
|
155
|
-
* @type {Uint8Array|null}
|
|
156
|
-
*/
|
|
157
|
-
bytes = null;
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* The command context the copy was recorded on. The mapping may not start until it has been
|
|
161
|
-
* finished, because a map of a buffer whose copy has not been submitted reads the frame before.
|
|
162
|
-
*
|
|
163
|
-
* @type {import("../../../device/ShadeGPUCommandContext.js").ShadeGPUCommandContext|null}
|
|
164
|
-
*/
|
|
165
|
-
context = null;
|
|
166
|
-
|
|
167
|
-
/**
|
|
168
|
-
* @type {BatchState}
|
|
169
|
-
*/
|
|
170
|
-
state = BatchState.Assembling;
|
|
171
|
-
|
|
172
|
-
/**
|
|
173
|
-
* Live handles grouped by table, for the gather path's one dispatch per table.
|
|
174
|
-
* @type {Uint32Array}
|
|
175
|
-
*/
|
|
176
|
-
order = new Uint32Array(0);
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* Reactions to this batch's mapping, bound once per pooled batch rather than once per frame.
|
|
180
|
-
* @type {function(): void}
|
|
181
|
-
*/
|
|
182
|
-
on_mapped = null;
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* @type {function(): void}
|
|
186
|
-
*/
|
|
187
|
-
on_failed = null;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* Reading rows back from a {@link GPUDatabase} in batches: one gather, one copy, one map, and one
|
|
192
|
-
* point in the frame where the answers land — in memory the caller already owns.
|
|
193
|
-
*
|
|
194
|
-
* **Why this is not `debug_table_read_element`.** That resolves one row's byte offset and calls
|
|
195
|
-
* {@link inspect_gpu_buffer_typed}, which creates a `MAP_READ` buffer, copies, submits, maps and
|
|
196
|
-
* destroys it — per call. It is a debug affordance and stays one. Here the buffers persist, the
|
|
197
|
-
* requests of a frame travel together, and the result arrives at a stated moment rather than
|
|
198
|
-
* whenever a promise happens to settle.
|
|
199
|
-
*
|
|
200
|
-
* **The caller names memory, and nothing is called.** A request is a table handle, a row, a byte
|
|
201
|
-
* range of the record, and a `Uint8Array` plus offset to put it in. At the apply point the service
|
|
202
|
-
* copies the bytes there and marks the request's handle in {@link status}; the consumer reads the
|
|
203
|
-
* status when its own system next runs, which is when it wanted the value anyway. There is no
|
|
204
|
-
* callback and no promise, for the same reason: a function called per row is a closure allocated
|
|
205
|
-
* per row and a permanently megamorphic call site, and code running inside the apply point could
|
|
206
|
-
* re-enter this service, or destroy the database, from the middle of `GPUDatabase.update`. The
|
|
207
|
-
* shader packs a batch contiguously in request order, so a consumer's run of rows lands in its
|
|
208
|
-
* destination as one `set` — which a per-row function could never have done.
|
|
209
|
-
*
|
|
210
|
-
* **Gather, then one copy.** Rows sit at scattered offsets across pages, so a compute shader packs
|
|
211
|
-
* the requested ranges contiguously before a single copy into a readback buffer. Packing a *range*
|
|
212
|
-
* rather than a record is what makes it worth doing: an entity's world matrix is 64 bytes of a
|
|
213
|
-
* 176-byte row.
|
|
214
|
-
*
|
|
215
|
-
* **But the request list is itself an upload.** A gather needs its descriptors on the GPU, so every
|
|
216
|
-
* frame with any request writes a buffer, allocates, binds and dispatches. For one row that costs
|
|
217
|
-
* far more than the value retrieved. Below {@link DEFAULT_GATHER_THRESHOLD} — a measured number, see
|
|
218
|
-
* its docblock — the batch degrades to direct `copyBufferToBuffer` calls into the same readback
|
|
219
|
-
* buffer, with no shader at all. A frame with no requests skips the whole path: no buffer, no
|
|
220
|
-
* command.
|
|
221
|
-
*
|
|
222
|
-
* **One apply point, in encode order.** Results are delivered from {@link apply}, at the head of a
|
|
223
|
-
* frame, and never on the timing of the map's own promise. A component that changed value in the
|
|
224
|
-
* middle of an update because a readback happened to settle would be a different world for the
|
|
225
|
-
* systems that ran before it and the ones that ran after. And a batch is delivered only after every
|
|
226
|
-
* older batch has been: `mapAsync` promises are not promised to settle in the order the maps were
|
|
227
|
-
* started, and a consumer asking for the same row every frame must never see a fresh value
|
|
228
|
-
* overwritten by a stale one.
|
|
229
|
-
*
|
|
230
|
-
* **Nothing here may reach simulation state.** A readback is a frame or more late and settles on the
|
|
231
|
-
* GPU's own schedule, so an outcome that depended on one would depend on frame pacing, and the
|
|
232
|
-
* determinism gate with it. This answers tools, sounds and cosmetics. Where the simulation wants a
|
|
233
|
-
* GPU-owned pose it evaluates the chain exactly, on the CPU.
|
|
234
|
-
*
|
|
235
|
-
* @see GPUStateAuthority which says whose value is worth reading back in the first place
|
|
236
|
-
* @see GPUReadbackStatus
|
|
237
|
-
*/
|
|
238
|
-
export class GPUDatabaseReadback {
|
|
239
|
-
/**
|
|
240
|
-
* @type {import("./GPUDatabase.js").GPUDatabase}
|
|
241
|
-
*/
|
|
242
|
-
#database;
|
|
243
|
-
|
|
244
|
-
/**
|
|
245
|
-
* @type {GPUDevice}
|
|
246
|
-
*/
|
|
247
|
-
#device;
|
|
248
|
-
|
|
249
|
-
/**
|
|
250
|
-
* Where readback buffers come from: the graphics context's, shared with every other database
|
|
251
|
-
* on it, and taken from the first command context this service encodes on — the database is
|
|
252
|
-
* built against a device, not a context.
|
|
253
|
-
*
|
|
254
|
-
* @type {import("../GPUBufferReadbackAllocator.js").GPUBufferReadbackAllocator|null}
|
|
255
|
-
*/
|
|
256
|
-
#allocator = null;
|
|
257
|
-
|
|
258
|
-
/**
|
|
259
|
-
* Shader-writable scratch the gather packs into, copied to a readback buffer in one go.
|
|
260
|
-
* Persistent and grown, never per batch, and unlike the readback buffers it needs no pool,
|
|
261
|
-
* because it is written and read inside one submission.
|
|
262
|
-
*
|
|
263
|
-
* @type {GPUBuffer|null}
|
|
264
|
-
*/
|
|
265
|
-
#gather_buffer = null;
|
|
266
|
-
|
|
267
|
-
/**
|
|
268
|
-
* Request records, {@link RECORD_WORDS} words per handle. A request is a few integer stores
|
|
269
|
-
* into this array; the target it names is the only thing that is not an integer, and it sits
|
|
270
|
-
* in {@link #targets} beside it.
|
|
271
|
-
*
|
|
272
|
-
* @type {Uint32Array}
|
|
273
|
-
*/
|
|
274
|
-
#records = new Uint32Array(INITIAL_CAPACITY * RECORD_WORDS);
|
|
275
|
-
|
|
276
|
-
/**
|
|
277
|
-
* Per handle, the memory the bytes are to land in.
|
|
278
|
-
* @type {(Uint8Array|null)[]}
|
|
279
|
-
*/
|
|
280
|
-
#targets = new Array(INITIAL_CAPACITY).fill(null);
|
|
281
|
-
|
|
282
|
-
/**
|
|
283
|
-
* Per handle, a {@link GPUReadbackStatus}. Exposed as {@link status}.
|
|
284
|
-
* @type {Uint8Array}
|
|
285
|
-
*/
|
|
286
|
-
#status = new Uint8Array(INITIAL_CAPACITY);
|
|
287
|
-
|
|
288
|
-
/**
|
|
289
|
-
* Recycled handles. Never longer than the record capacity, so it never overflows.
|
|
290
|
-
* @type {Uint32Array}
|
|
291
|
-
*/
|
|
292
|
-
#free = new Uint32Array(INITIAL_CAPACITY);
|
|
293
|
-
|
|
294
|
-
/**
|
|
295
|
-
* @type {number}
|
|
296
|
-
*/
|
|
297
|
-
#free_count = 0;
|
|
298
|
-
|
|
299
|
-
/**
|
|
300
|
-
* Handles below this have been handed out at least once.
|
|
301
|
-
* @type {number}
|
|
302
|
-
*/
|
|
303
|
-
#fresh = 0;
|
|
304
|
-
|
|
305
|
-
/**
|
|
306
|
-
* The batch taking this frame's requests.
|
|
307
|
-
* @type {GPUReadbackBatch}
|
|
308
|
-
*/
|
|
309
|
-
#assembling;
|
|
310
|
-
|
|
311
|
-
/**
|
|
312
|
-
* Encoded batches, oldest first.
|
|
313
|
-
* @type {GPUReadbackBatch[]}
|
|
314
|
-
*/
|
|
315
|
-
#in_flight = [];
|
|
316
|
-
|
|
317
|
-
/**
|
|
318
|
-
* Batches delivered or dropped since the last apply point. Their handles stay readable until
|
|
319
|
-
* the next one, and are recycled there.
|
|
320
|
-
*
|
|
321
|
-
* @type {GPUReadbackBatch[]}
|
|
322
|
-
*/
|
|
323
|
-
#retiring = [];
|
|
324
|
-
|
|
325
|
-
/**
|
|
326
|
-
* Batches with nothing in them, waiting to be the next frame's.
|
|
327
|
-
* @type {GPUReadbackBatch[]}
|
|
328
|
-
*/
|
|
329
|
-
#spare = [];
|
|
330
|
-
|
|
331
|
-
/**
|
|
332
|
-
* Scratch for bucketing a batch's live requests by table: counts, then starts.
|
|
333
|
-
* @type {Uint32Array}
|
|
334
|
-
*/
|
|
335
|
-
#table_starts;
|
|
336
|
-
|
|
337
|
-
/**
|
|
338
|
-
* @type {number}
|
|
339
|
-
*/
|
|
340
|
-
#gather_threshold;
|
|
341
|
-
|
|
342
|
-
/**
|
|
343
|
-
* @type {number}
|
|
344
|
-
*/
|
|
345
|
-
#max_in_flight;
|
|
346
|
-
|
|
347
|
-
/**
|
|
348
|
-
* Descriptor words for one dispatch, reused. Grown to the largest chunk this service has ever
|
|
349
|
-
* needed and kept.
|
|
350
|
-
*
|
|
351
|
-
* @type {Uint32Array}
|
|
352
|
-
*/
|
|
353
|
-
#descriptor_scratch = new Uint32Array(0);
|
|
354
|
-
|
|
355
|
-
/**
|
|
356
|
-
* Immediate data for the gather dispatch, reused. `dispatchThreads` serialises it at the call,
|
|
357
|
-
* so one object can carry every dispatch of a frame.
|
|
358
|
-
*
|
|
359
|
-
* @type {Object}
|
|
360
|
-
*/
|
|
361
|
-
#gather_settings = {
|
|
362
|
-
count: 0,
|
|
363
|
-
record_size: 0,
|
|
364
|
-
elements_per_page: 0,
|
|
365
|
-
page_lookup_address: 0,
|
|
366
|
-
page_header_words: 0,
|
|
367
|
-
page_limit: 0,
|
|
368
|
-
};
|
|
369
|
-
|
|
370
|
-
/**
|
|
371
|
-
* @type {boolean}
|
|
372
|
-
*/
|
|
373
|
-
#destroyed = false;
|
|
374
|
-
|
|
375
|
-
#copies_encoded = 0;
|
|
376
|
-
#dispatches_encoded = 0;
|
|
377
|
-
#delivered_count = 0;
|
|
378
|
-
#dropped_count = 0;
|
|
379
|
-
#stalled_count = 0;
|
|
380
|
-
|
|
381
|
-
/**
|
|
382
|
-
* @param {Object} options
|
|
383
|
-
* @param {import("./GPUDatabase.js").GPUDatabase} options.database
|
|
384
|
-
* @param {GPUDevice} options.device
|
|
385
|
-
* @param {number} [options.gather_threshold] requests at or above which a dispatch is used
|
|
386
|
-
* @param {number} [options.max_in_flight] batches in flight before a frame's requests are dropped
|
|
387
|
-
* @param {string} [options.label]
|
|
388
|
-
*/
|
|
389
|
-
constructor({
|
|
390
|
-
database,
|
|
391
|
-
device,
|
|
392
|
-
gather_threshold = DEFAULT_GATHER_THRESHOLD,
|
|
393
|
-
max_in_flight = DEFAULT_MAX_IN_FLIGHT,
|
|
394
|
-
label = 'GPUDatabaseReadback',
|
|
395
|
-
}) {
|
|
396
|
-
assert.defined(database, 'database');
|
|
397
|
-
assert.defined(device, 'device');
|
|
398
|
-
assert.isNonNegativeInteger(gather_threshold, 'gather_threshold');
|
|
399
|
-
assert.isPositiveInteger(max_in_flight, 'max_in_flight');
|
|
400
|
-
assert.isString(label, 'label');
|
|
401
|
-
|
|
402
|
-
this.#database = database;
|
|
403
|
-
this.#device = device;
|
|
404
|
-
this.#gather_threshold = gather_threshold;
|
|
405
|
-
this.#max_in_flight = max_in_flight;
|
|
406
|
-
|
|
407
|
-
this.#table_starts = new Uint32Array(database.tables.length + 1);
|
|
408
|
-
|
|
409
|
-
this.#assembling = this.#make_batch();
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
/**
|
|
413
|
-
* Requests at or above which a batch is gathered rather than copied range by range.
|
|
414
|
-
* @returns {number}
|
|
415
|
-
*/
|
|
416
|
-
get gather_threshold() {
|
|
417
|
-
return this.#gather_threshold;
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
/**
|
|
421
|
-
* Batches in flight before a frame's requests are refused.
|
|
422
|
-
* @returns {number}
|
|
423
|
-
*/
|
|
424
|
-
get max_in_flight() {
|
|
425
|
-
return this.#max_in_flight;
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
/**
|
|
429
|
-
* Per handle, what became of the request — a {@link GPUReadbackStatus}.
|
|
430
|
-
*
|
|
431
|
-
* Read it fresh each time rather than keeping a reference: the array is replaced when the
|
|
432
|
-
* handle space grows. A status is readable for one frame, from the apply point that set it to
|
|
433
|
-
* the next.
|
|
434
|
-
*
|
|
435
|
-
* @returns {Uint8Array}
|
|
436
|
-
*/
|
|
437
|
-
get status() {
|
|
438
|
-
return this.#status;
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
/**
|
|
442
|
-
* How many handles exist. Grows to the working set of a steady stream of requests and stops:
|
|
443
|
-
* handles are recycled a frame after their result lands.
|
|
444
|
-
*
|
|
445
|
-
* @returns {number}
|
|
446
|
-
*/
|
|
447
|
-
get handle_capacity() {
|
|
448
|
-
return this.#status.length;
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
/**
|
|
452
|
-
* Requests made and not yet encoded.
|
|
453
|
-
* @returns {number}
|
|
454
|
-
*/
|
|
455
|
-
get pending_count() {
|
|
456
|
-
return this.#assembling.count;
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
/**
|
|
460
|
-
* Batches encoded and not yet delivered or discarded.
|
|
461
|
-
* @returns {number}
|
|
462
|
-
*/
|
|
463
|
-
get in_flight_count() {
|
|
464
|
-
return this.#in_flight.length;
|
|
465
|
-
}
|
|
466
|
-
|
|
467
|
-
/**
|
|
468
|
-
* How many `copyBufferToBuffer` calls this service has encoded, over its life. Read by profiles,
|
|
469
|
-
* and by the specs that assert an empty frame encodes nothing.
|
|
470
|
-
*
|
|
471
|
-
* @returns {number}
|
|
472
|
-
*/
|
|
473
|
-
get copies_encoded() {
|
|
474
|
-
return this.#copies_encoded;
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
/**
|
|
478
|
-
* How many gather dispatches this service has encoded, over its life.
|
|
479
|
-
* @returns {number}
|
|
480
|
-
*/
|
|
481
|
-
get dispatches_encoded() {
|
|
482
|
-
return this.#dispatches_encoded;
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
/**
|
|
486
|
-
* Requests whose bytes reached their target.
|
|
487
|
-
* @returns {number}
|
|
488
|
-
*/
|
|
489
|
-
get delivered_count() {
|
|
490
|
-
return this.#delivered_count;
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
/**
|
|
494
|
-
* Requests thrown away because of the row — its page was not resident when the batch was
|
|
495
|
-
* encoded, it was not occupied, or it was freed before the answer landed.
|
|
496
|
-
*
|
|
497
|
-
* Reported rather than swallowed: a consumer whose readbacks are all being dropped is asking
|
|
498
|
-
* about rows that keep dying, and silence reads downstream as "the value did not change".
|
|
499
|
-
*
|
|
500
|
-
* @returns {number}
|
|
501
|
-
*/
|
|
502
|
-
get dropped_count() {
|
|
503
|
-
return this.#dropped_count;
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
/**
|
|
507
|
-
* Requests thrown away because of the pipeline — {@link max_in_flight} batches were still
|
|
508
|
-
* waiting on the device when the frame's batch was due, or a mapping was refused. Separate
|
|
509
|
-
* from {@link dropped_count} because the cure is different: those rows died, these the device
|
|
510
|
-
* stopped answering about.
|
|
511
|
-
*
|
|
512
|
-
* @returns {number}
|
|
513
|
-
*/
|
|
514
|
-
get stalled_count() {
|
|
515
|
-
return this.#stalled_count;
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
/**
|
|
519
|
-
* Resolve a table name to the handle {@link request} takes. Once, at setup: a string lookup
|
|
520
|
-
* per row per frame is what this exists to avoid.
|
|
521
|
-
*
|
|
522
|
-
* From here on the table counts how many times each of its rows is freed, which is what lets
|
|
523
|
-
* an answer about a row that died and was reused be told from an answer about the row asked
|
|
524
|
-
* for.
|
|
525
|
-
*
|
|
526
|
-
* @param {string} name
|
|
527
|
-
* @returns {number}
|
|
528
|
-
*/
|
|
529
|
-
table(name) {
|
|
530
|
-
assert.isString(name, 'name');
|
|
531
|
-
|
|
532
|
-
const table = this.#database.get(name);
|
|
533
|
-
|
|
534
|
-
if (table === undefined) {
|
|
535
|
-
throw new Error(`Table '${name}' does not exist`);
|
|
536
|
-
}
|
|
537
|
-
|
|
538
|
-
table.track_generations();
|
|
539
|
-
|
|
540
|
-
return table.descriptor.index;
|
|
541
|
-
}
|
|
542
|
-
|
|
543
|
-
/**
|
|
544
|
-
* Ask for a byte range of a row to be copied into `target`, at a later apply point.
|
|
545
|
-
*
|
|
546
|
-
* Positional, and a few integer stores: this is called once per row per frame by anything that
|
|
547
|
-
* tracks rows, so it takes no options object and allocates nothing.
|
|
548
|
-
*
|
|
549
|
-
* @param {number} table from {@link table}
|
|
550
|
-
* @param {number} row
|
|
551
|
-
* @param {number} byte_offset within the record, word-aligned
|
|
552
|
-
* @param {number} byte_size a positive multiple of the word size
|
|
553
|
-
* @param {Uint8Array} target memory the caller owns and keeps; the bytes are written here at
|
|
554
|
-
* the apply point. A byte view on purpose — a consumer that reads floats holds a
|
|
555
|
-
* `Float32Array` over the same buffer, made once
|
|
556
|
-
* @param {number} [target_byte_offset]
|
|
557
|
-
* @returns {number} a handle into {@link status}, valid until the frame after its result lands
|
|
558
|
-
*/
|
|
559
|
-
request(table, row, byte_offset, byte_size, target, target_byte_offset = 0) {
|
|
560
|
-
assert.isNonNegativeInteger(table, 'table');
|
|
561
|
-
assert.isNonNegativeInteger(row, 'row');
|
|
562
|
-
assert.isNonNegativeInteger(byte_offset, 'byte_offset');
|
|
563
|
-
assert.isPositiveInteger(byte_size, 'byte_size');
|
|
564
|
-
assert.isNonNegativeInteger(target_byte_offset, 'target_byte_offset');
|
|
565
|
-
|
|
566
|
-
const tables = this.#database.tables;
|
|
567
|
-
|
|
568
|
-
assert.lessThan(table, tables.length, 'table is not a handle from table()');
|
|
569
|
-
assert.equal(byte_offset % WORD_SIZE, 0, 'byte_offset must be word-aligned');
|
|
570
|
-
assert.equal(byte_size % WORD_SIZE, 0, 'byte_size must be a whole number of words');
|
|
571
|
-
assert.ok(target instanceof Uint8Array, 'target must be a Uint8Array');
|
|
572
|
-
|
|
573
|
-
// constant messages: these run per row per frame, and a template literal built to describe a
|
|
574
|
-
// failure that does not happen is the cost on the path being measured
|
|
575
|
-
assert.lessThanOrEqual(byte_offset + byte_size, tables[table].descriptor.packed_element_size_bytes, 'range reaches past the record');
|
|
576
|
-
assert.lessThanOrEqual(target_byte_offset + byte_size, target.length, 'range reaches past the target');
|
|
577
|
-
|
|
578
|
-
const handle = this.#allocate_handle();
|
|
579
|
-
const base = handle * RECORD_WORDS;
|
|
580
|
-
const records = this.#records;
|
|
581
|
-
|
|
582
|
-
records[base + R_TABLE] = table;
|
|
583
|
-
records[base + R_ROW] = row;
|
|
584
|
-
records[base + R_WORD_OFFSET] = byte_offset / WORD_SIZE;
|
|
585
|
-
records[base + R_WORD_COUNT] = byte_size / WORD_SIZE;
|
|
586
|
-
records[base + R_GENERATION] = tables[table].generation_of(row);
|
|
587
|
-
records[base + R_TARGET_OFFSET] = target_byte_offset;
|
|
588
|
-
|
|
589
|
-
this.#targets[handle] = target;
|
|
590
|
-
this.#status[handle] = GPUReadbackStatus.Pending;
|
|
591
|
-
|
|
592
|
-
const batch = this.#assembling;
|
|
593
|
-
|
|
594
|
-
if (batch.count === batch.handles.length) {
|
|
595
|
-
const grown = new Uint32Array(batch.handles.length * 2);
|
|
596
|
-
|
|
597
|
-
grown.set(batch.handles);
|
|
598
|
-
|
|
599
|
-
batch.handles = grown;
|
|
600
|
-
}
|
|
601
|
-
|
|
602
|
-
batch.handles[batch.count++] = handle;
|
|
603
|
-
|
|
604
|
-
return handle;
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
/**
|
|
608
|
-
* Deliver every batch whose bytes have arrived, oldest first and stopping at the first that has
|
|
609
|
-
* not, then start the map for every batch whose frame has been submitted.
|
|
610
|
-
*
|
|
611
|
-
* **This is the apply point.** Call it at the head of a frame, before any system runs. A batch
|
|
612
|
-
* therefore reaches its targets at the first frame head at which its mapping — and every older
|
|
613
|
-
* batch's — has resolved, which is the frame after the one that encoded it at the earliest:
|
|
614
|
-
* never inside an update, and never at two different moments for two requests of the same
|
|
615
|
-
* batch. No caller-supplied code runs here.
|
|
616
|
-
*
|
|
617
|
-
* @returns {number} requests delivered
|
|
618
|
-
*/
|
|
619
|
-
apply() {
|
|
620
|
-
if (this.#destroyed) {
|
|
621
|
-
return 0;
|
|
622
|
-
}
|
|
623
|
-
|
|
624
|
-
// The handles delivered or dropped at the previous apply point have had their frame of
|
|
625
|
-
// being readable; they go back to the free list before anything is delivered, so nothing
|
|
626
|
-
// delivered now can be recycled before it has been read.
|
|
627
|
-
const retiring = this.#retiring;
|
|
628
|
-
|
|
629
|
-
for (let i = 0; i < retiring.length; i++) {
|
|
630
|
-
this.#recycle(retiring[i]);
|
|
631
|
-
}
|
|
632
|
-
|
|
633
|
-
retiring.length = 0;
|
|
634
|
-
|
|
635
|
-
const in_flight = this.#in_flight;
|
|
636
|
-
|
|
637
|
-
let delivered = 0;
|
|
638
|
-
|
|
639
|
-
while (in_flight.length > 0) {
|
|
640
|
-
const batch = in_flight[0];
|
|
641
|
-
|
|
642
|
-
if (batch.state === BatchState.Ready) {
|
|
643
|
-
delivered += this.#deliver(batch);
|
|
644
|
-
|
|
645
|
-
this.#
|
|
646
|
-
} else {
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
this.#retire(batch);
|
|
717
|
-
|
|
718
|
-
return false;
|
|
719
|
-
}
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
if (live
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
batch.
|
|
731
|
-
|
|
732
|
-
this.#
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
*
|
|
749
|
-
*
|
|
750
|
-
*
|
|
751
|
-
*
|
|
752
|
-
*
|
|
753
|
-
* @
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
const
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
let
|
|
780
|
-
let
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
}
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
*
|
|
890
|
-
*
|
|
891
|
-
*
|
|
892
|
-
*
|
|
893
|
-
*
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
const
|
|
906
|
-
const
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
const
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
}
|
|
941
|
-
|
|
942
|
-
const
|
|
943
|
-
const
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
}
|
|
1059
|
-
|
|
1060
|
-
/**
|
|
1061
|
-
*
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
//
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
run_source
|
|
1126
|
-
|
|
1127
|
-
run_length
|
|
1128
|
-
}
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
*
|
|
1186
|
-
*
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
this.#
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1
|
+
import { assert } from "../../../../core/assert.js";
|
|
2
|
+
import { round_up } from "../../../../core/math/round_up.js";
|
|
3
|
+
import { GPU_DATABASE_BUFFER_ELEMENT_TYPE } from "./GPU_DATABASE_BUFFER_ELEMENT_TYPE.js";
|
|
4
|
+
import { GPU_TABLE_GATHER_DESCRIPTOR_WORDS } from "./GPU_TABLE_GATHER_DESCRIPTOR_WORDS.js";
|
|
5
|
+
import { gpu_table_gather_shader } from "./gpu_table_gather_shader.js";
|
|
6
|
+
import { GPUReadbackStatus } from "./GPUReadbackStatus.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Bytes per {@link GPU_DATABASE_BUFFER_ELEMENT_TYPE}.
|
|
10
|
+
* @type {number}
|
|
11
|
+
*/
|
|
12
|
+
const WORD_SIZE = GPU_DATABASE_BUFFER_ELEMENT_TYPE.size;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Largest transient descriptor buffer one dispatch will be given, matching the upload path's.
|
|
16
|
+
* @type {number}
|
|
17
|
+
*/
|
|
18
|
+
const DESCRIPTOR_CHUNK_BYTES = 256 * 1024;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Granularity the gather scratch buffer grows by.
|
|
22
|
+
* @type {number}
|
|
23
|
+
*/
|
|
24
|
+
const GATHER_SIZE_GRANULARITY = 1024;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Requests at or above which a batch is gathered by a dispatch rather than copied range by range.
|
|
28
|
+
*
|
|
29
|
+
* **Measured, not chosen**, on a real device: Chrome 141 / Dawn, NVIDIA Lovelace, reading a 64-byte
|
|
30
|
+
* range out of each of N 176-byte rows spread across 4 KiB pages. Best of five blocks of a hundred
|
|
31
|
+
* batches, by `src/shade/playground/readback_crossover/`.
|
|
32
|
+
*
|
|
33
|
+
* | rows | encode copies | encode gather | round trip copies | round trip gather |
|
|
34
|
+
* |-----:|--------------:|--------------:|------------------:|------------------:|
|
|
35
|
+
* | 1 | 5.0 µs | 17.0 µs | 63 µs | 79 µs |
|
|
36
|
+
* | 8 | 6.0 µs | 25.0 µs | 75 µs | 125 µs |
|
|
37
|
+
* | 32 | 10.0 µs | 27.0 µs | 111 µs | 130 µs |
|
|
38
|
+
* | 64 | 14.0 µs | 33.0 µs | 135 µs | 129 µs |
|
|
39
|
+
* | 256 | 45.0 µs | 53.0 µs | 230 µs | 116 µs |
|
|
40
|
+
* | 512 | 87.0 µs | 77.0 µs | 307 µs | 115 µs |
|
|
41
|
+
*
|
|
42
|
+
* Fitted: encoding costs `4.5 µs + 0.161 per row` for copies against `21.9 µs + 0.112` for the
|
|
43
|
+
* gather, which crosses at **352 rows** — on CPU encode cost alone the gather is almost never worth
|
|
44
|
+
* it, because appending a descriptor is not much cheaper than appending a copy command.
|
|
45
|
+
*
|
|
46
|
+
* The round trip is where the difference actually lives: `81 µs + 0.480 per row` for copies against
|
|
47
|
+
* `104 µs + 0.037` for the gather. Submitting and executing N scattered copy commands costs about
|
|
48
|
+
* half a microsecond each, and the gather is flat — 512 rows cost it no more than 8 do. Those cross
|
|
49
|
+
* at **51 rows**, and the measured curves cross between 32 and 64. This is 48: inside the measured
|
|
50
|
+
* interval, and on the side of the path whose cost does not grow.
|
|
51
|
+
*
|
|
52
|
+
* The fixed term of the round trip is mostly the wait for `onSubmittedWorkDone` and is not a cost a
|
|
53
|
+
* frame pays synchronously; the slopes are the part that decides, and they differ by 13×.
|
|
54
|
+
*
|
|
55
|
+
* Those numbers were taken against the first, callback-and-objects version of this service. The
|
|
56
|
+
* same page, re-run on the same adapter after the request became a few integer stores (two idle
|
|
57
|
+
* runs, headless Chrome): encode `5.7–5.9 + 0.14 per row` for copies against `23.5–23.8 + 0.10` for
|
|
58
|
+
* the gather; round trip `67–73 + 0.31` against `83–86 + 0.003–0.010`, crossing at 34 and 62 rows
|
|
59
|
+
* with the curves crossing between 16 and 64. The per-row cost fell on both paths and the slopes
|
|
60
|
+
* that decide are further apart than before; 48 is still inside the interval.
|
|
61
|
+
*
|
|
62
|
+
* @see https://claude.ai/code/artifact/88ee4932-ed98-407e-a25b-d379f3cf852a F5, which asked for this
|
|
63
|
+
* number rather than for "batched is better"
|
|
64
|
+
* @type {number}
|
|
65
|
+
*/
|
|
66
|
+
const DEFAULT_GATHER_THRESHOLD = 48;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Batches allowed in flight before a frame's requests are refused. A mapping normally lands one or
|
|
70
|
+
* two frames after its copy, so this is only reached when the device has stopped answering, and
|
|
71
|
+
* the right thing to do with a frame's requests then is to say so and drop them: a consumer asks
|
|
72
|
+
* every frame anyway, and a value delivered a dozen frames late is not the value it wanted.
|
|
73
|
+
*
|
|
74
|
+
* @type {number}
|
|
75
|
+
*/
|
|
76
|
+
const DEFAULT_MAX_IN_FLIGHT = 4;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Request records and batch handle lists start at this many entries and double.
|
|
80
|
+
* @type {number}
|
|
81
|
+
*/
|
|
82
|
+
const INITIAL_CAPACITY = 64;
|
|
83
|
+
|
|
84
|
+
/*
|
|
85
|
+
* One request is RECORD_WORDS words of the flat record array, at handle * RECORD_WORDS. The first
|
|
86
|
+
* six are written by `request`, the last two by `encode`.
|
|
87
|
+
*/
|
|
88
|
+
const R_TABLE = 0;
|
|
89
|
+
const R_ROW = 1;
|
|
90
|
+
const R_WORD_OFFSET = 2;
|
|
91
|
+
const R_WORD_COUNT = 3;
|
|
92
|
+
const R_GENERATION = 4;
|
|
93
|
+
const R_TARGET_OFFSET = 5;
|
|
94
|
+
const R_SOURCE_WORD = 6;
|
|
95
|
+
const R_DESTINATION_WORD = 7;
|
|
96
|
+
const RECORD_WORDS = 8;
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* @enum {number}
|
|
100
|
+
*/
|
|
101
|
+
const BatchState = {
|
|
102
|
+
/** taking requests; the one batch in this state is the frame's */
|
|
103
|
+
Assembling: 0,
|
|
104
|
+
/** copy recorded, the frame that recorded it not yet known to be submitted */
|
|
105
|
+
Encoded: 1,
|
|
106
|
+
/** `mapAsync` outstanding */
|
|
107
|
+
Mapping: 2,
|
|
108
|
+
/** mapped, waiting for an apply point */
|
|
109
|
+
Ready: 3,
|
|
110
|
+
/** the map was refused; the batch is discarded without delivering */
|
|
111
|
+
Failed: 4,
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* One frame's worth of requests, travelling together. Pooled: a batch that has been delivered keeps
|
|
116
|
+
* its arrays and takes the next frame's requests, so a steady stream of batches allocates nothing.
|
|
117
|
+
*/
|
|
118
|
+
class GPUReadbackBatch {
|
|
119
|
+
/**
|
|
120
|
+
* Handles in request order.
|
|
121
|
+
* @type {Uint32Array}
|
|
122
|
+
*/
|
|
123
|
+
handles = new Uint32Array(INITIAL_CAPACITY);
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* @type {number}
|
|
127
|
+
*/
|
|
128
|
+
count = 0;
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Requests whose row was resident when the batch was encoded.
|
|
132
|
+
* @type {number}
|
|
133
|
+
*/
|
|
134
|
+
live = 0;
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Bytes of the packed image.
|
|
138
|
+
* @type {number}
|
|
139
|
+
*/
|
|
140
|
+
byte_size = 0;
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* The readback buffer the image was copied into. From {@link GPUBufferReadbackAllocator}, and
|
|
144
|
+
* given back when the batch is delivered or discarded.
|
|
145
|
+
*
|
|
146
|
+
* @type {GPUBuffer|null}
|
|
147
|
+
*/
|
|
148
|
+
buffer = null;
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* The mapped image, valid from the mapping settling until the buffer is given back. Read
|
|
152
|
+
* directly at the apply point — the buffer stays mapped until then, which is what makes the
|
|
153
|
+
* copy into the caller's memory the only copy.
|
|
154
|
+
*
|
|
155
|
+
* @type {Uint8Array|null}
|
|
156
|
+
*/
|
|
157
|
+
bytes = null;
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* The command context the copy was recorded on. The mapping may not start until it has been
|
|
161
|
+
* finished, because a map of a buffer whose copy has not been submitted reads the frame before.
|
|
162
|
+
*
|
|
163
|
+
* @type {import("../../../device/ShadeGPUCommandContext.js").ShadeGPUCommandContext|null}
|
|
164
|
+
*/
|
|
165
|
+
context = null;
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* @type {BatchState}
|
|
169
|
+
*/
|
|
170
|
+
state = BatchState.Assembling;
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Live handles grouped by table, for the gather path's one dispatch per table.
|
|
174
|
+
* @type {Uint32Array}
|
|
175
|
+
*/
|
|
176
|
+
order = new Uint32Array(0);
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Reactions to this batch's mapping, bound once per pooled batch rather than once per frame.
|
|
180
|
+
* @type {function(): void}
|
|
181
|
+
*/
|
|
182
|
+
on_mapped = null;
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* @type {function(): void}
|
|
186
|
+
*/
|
|
187
|
+
on_failed = null;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Reading rows back from a {@link GPUDatabase} in batches: one gather, one copy, one map, and one
|
|
192
|
+
* point in the frame where the answers land — in memory the caller already owns.
|
|
193
|
+
*
|
|
194
|
+
* **Why this is not `debug_table_read_element`.** That resolves one row's byte offset and calls
|
|
195
|
+
* {@link inspect_gpu_buffer_typed}, which creates a `MAP_READ` buffer, copies, submits, maps and
|
|
196
|
+
* destroys it — per call. It is a debug affordance and stays one. Here the buffers persist, the
|
|
197
|
+
* requests of a frame travel together, and the result arrives at a stated moment rather than
|
|
198
|
+
* whenever a promise happens to settle.
|
|
199
|
+
*
|
|
200
|
+
* **The caller names memory, and nothing is called.** A request is a table handle, a row, a byte
|
|
201
|
+
* range of the record, and a `Uint8Array` plus offset to put it in. At the apply point the service
|
|
202
|
+
* copies the bytes there and marks the request's handle in {@link status}; the consumer reads the
|
|
203
|
+
* status when its own system next runs, which is when it wanted the value anyway. There is no
|
|
204
|
+
* callback and no promise, for the same reason: a function called per row is a closure allocated
|
|
205
|
+
* per row and a permanently megamorphic call site, and code running inside the apply point could
|
|
206
|
+
* re-enter this service, or destroy the database, from the middle of `GPUDatabase.update`. The
|
|
207
|
+
* shader packs a batch contiguously in request order, so a consumer's run of rows lands in its
|
|
208
|
+
* destination as one `set` — which a per-row function could never have done.
|
|
209
|
+
*
|
|
210
|
+
* **Gather, then one copy.** Rows sit at scattered offsets across pages, so a compute shader packs
|
|
211
|
+
* the requested ranges contiguously before a single copy into a readback buffer. Packing a *range*
|
|
212
|
+
* rather than a record is what makes it worth doing: an entity's world matrix is 64 bytes of a
|
|
213
|
+
* 176-byte row.
|
|
214
|
+
*
|
|
215
|
+
* **But the request list is itself an upload.** A gather needs its descriptors on the GPU, so every
|
|
216
|
+
* frame with any request writes a buffer, allocates, binds and dispatches. For one row that costs
|
|
217
|
+
* far more than the value retrieved. Below {@link DEFAULT_GATHER_THRESHOLD} — a measured number, see
|
|
218
|
+
* its docblock — the batch degrades to direct `copyBufferToBuffer` calls into the same readback
|
|
219
|
+
* buffer, with no shader at all. A frame with no requests skips the whole path: no buffer, no
|
|
220
|
+
* command.
|
|
221
|
+
*
|
|
222
|
+
* **One apply point, in encode order.** Results are delivered from {@link apply}, at the head of a
|
|
223
|
+
* frame, and never on the timing of the map's own promise. A component that changed value in the
|
|
224
|
+
* middle of an update because a readback happened to settle would be a different world for the
|
|
225
|
+
* systems that ran before it and the ones that ran after. And a batch is delivered only after every
|
|
226
|
+
* older batch has been: `mapAsync` promises are not promised to settle in the order the maps were
|
|
227
|
+
* started, and a consumer asking for the same row every frame must never see a fresh value
|
|
228
|
+
* overwritten by a stale one.
|
|
229
|
+
*
|
|
230
|
+
* **Nothing here may reach simulation state.** A readback is a frame or more late and settles on the
|
|
231
|
+
* GPU's own schedule, so an outcome that depended on one would depend on frame pacing, and the
|
|
232
|
+
* determinism gate with it. This answers tools, sounds and cosmetics. Where the simulation wants a
|
|
233
|
+
* GPU-owned pose it evaluates the chain exactly, on the CPU.
|
|
234
|
+
*
|
|
235
|
+
* @see GPUStateAuthority which says whose value is worth reading back in the first place
|
|
236
|
+
* @see GPUReadbackStatus
|
|
237
|
+
*/
|
|
238
|
+
export class GPUDatabaseReadback {
|
|
239
|
+
/**
|
|
240
|
+
* @type {import("./GPUDatabase.js").GPUDatabase}
|
|
241
|
+
*/
|
|
242
|
+
#database;
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* @type {GPUDevice}
|
|
246
|
+
*/
|
|
247
|
+
#device;
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Where readback buffers come from: the graphics context's, shared with every other database
|
|
251
|
+
* on it, and taken from the first command context this service encodes on — the database is
|
|
252
|
+
* built against a device, not a context.
|
|
253
|
+
*
|
|
254
|
+
* @type {import("../GPUBufferReadbackAllocator.js").GPUBufferReadbackAllocator|null}
|
|
255
|
+
*/
|
|
256
|
+
#allocator = null;
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Shader-writable scratch the gather packs into, copied to a readback buffer in one go.
|
|
260
|
+
* Persistent and grown, never per batch, and unlike the readback buffers it needs no pool,
|
|
261
|
+
* because it is written and read inside one submission.
|
|
262
|
+
*
|
|
263
|
+
* @type {GPUBuffer|null}
|
|
264
|
+
*/
|
|
265
|
+
#gather_buffer = null;
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Request records, {@link RECORD_WORDS} words per handle. A request is a few integer stores
|
|
269
|
+
* into this array; the target it names is the only thing that is not an integer, and it sits
|
|
270
|
+
* in {@link #targets} beside it.
|
|
271
|
+
*
|
|
272
|
+
* @type {Uint32Array}
|
|
273
|
+
*/
|
|
274
|
+
#records = new Uint32Array(INITIAL_CAPACITY * RECORD_WORDS);
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Per handle, the memory the bytes are to land in.
|
|
278
|
+
* @type {(Uint8Array|null)[]}
|
|
279
|
+
*/
|
|
280
|
+
#targets = new Array(INITIAL_CAPACITY).fill(null);
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Per handle, a {@link GPUReadbackStatus}. Exposed as {@link status}.
|
|
284
|
+
* @type {Uint8Array}
|
|
285
|
+
*/
|
|
286
|
+
#status = new Uint8Array(INITIAL_CAPACITY);
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Recycled handles. Never longer than the record capacity, so it never overflows.
|
|
290
|
+
* @type {Uint32Array}
|
|
291
|
+
*/
|
|
292
|
+
#free = new Uint32Array(INITIAL_CAPACITY);
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* @type {number}
|
|
296
|
+
*/
|
|
297
|
+
#free_count = 0;
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Handles below this have been handed out at least once.
|
|
301
|
+
* @type {number}
|
|
302
|
+
*/
|
|
303
|
+
#fresh = 0;
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* The batch taking this frame's requests.
|
|
307
|
+
* @type {GPUReadbackBatch}
|
|
308
|
+
*/
|
|
309
|
+
#assembling;
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Encoded batches, oldest first.
|
|
313
|
+
* @type {GPUReadbackBatch[]}
|
|
314
|
+
*/
|
|
315
|
+
#in_flight = [];
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Batches delivered or dropped since the last apply point. Their handles stay readable until
|
|
319
|
+
* the next one, and are recycled there.
|
|
320
|
+
*
|
|
321
|
+
* @type {GPUReadbackBatch[]}
|
|
322
|
+
*/
|
|
323
|
+
#retiring = [];
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* Batches with nothing in them, waiting to be the next frame's.
|
|
327
|
+
* @type {GPUReadbackBatch[]}
|
|
328
|
+
*/
|
|
329
|
+
#spare = [];
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Scratch for bucketing a batch's live requests by table: counts, then starts.
|
|
333
|
+
* @type {Uint32Array}
|
|
334
|
+
*/
|
|
335
|
+
#table_starts;
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* @type {number}
|
|
339
|
+
*/
|
|
340
|
+
#gather_threshold;
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* @type {number}
|
|
344
|
+
*/
|
|
345
|
+
#max_in_flight;
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* Descriptor words for one dispatch, reused. Grown to the largest chunk this service has ever
|
|
349
|
+
* needed and kept.
|
|
350
|
+
*
|
|
351
|
+
* @type {Uint32Array}
|
|
352
|
+
*/
|
|
353
|
+
#descriptor_scratch = new Uint32Array(0);
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* Immediate data for the gather dispatch, reused. `dispatchThreads` serialises it at the call,
|
|
357
|
+
* so one object can carry every dispatch of a frame.
|
|
358
|
+
*
|
|
359
|
+
* @type {Object}
|
|
360
|
+
*/
|
|
361
|
+
#gather_settings = {
|
|
362
|
+
count: 0,
|
|
363
|
+
record_size: 0,
|
|
364
|
+
elements_per_page: 0,
|
|
365
|
+
page_lookup_address: 0,
|
|
366
|
+
page_header_words: 0,
|
|
367
|
+
page_limit: 0,
|
|
368
|
+
};
|
|
369
|
+
|
|
370
|
+
/**
|
|
371
|
+
* @type {boolean}
|
|
372
|
+
*/
|
|
373
|
+
#destroyed = false;
|
|
374
|
+
|
|
375
|
+
#copies_encoded = 0;
|
|
376
|
+
#dispatches_encoded = 0;
|
|
377
|
+
#delivered_count = 0;
|
|
378
|
+
#dropped_count = 0;
|
|
379
|
+
#stalled_count = 0;
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* @param {Object} options
|
|
383
|
+
* @param {import("./GPUDatabase.js").GPUDatabase} options.database
|
|
384
|
+
* @param {GPUDevice} options.device
|
|
385
|
+
* @param {number} [options.gather_threshold] requests at or above which a dispatch is used
|
|
386
|
+
* @param {number} [options.max_in_flight] batches in flight before a frame's requests are dropped
|
|
387
|
+
* @param {string} [options.label]
|
|
388
|
+
*/
|
|
389
|
+
constructor({
|
|
390
|
+
database,
|
|
391
|
+
device,
|
|
392
|
+
gather_threshold = DEFAULT_GATHER_THRESHOLD,
|
|
393
|
+
max_in_flight = DEFAULT_MAX_IN_FLIGHT,
|
|
394
|
+
label = 'GPUDatabaseReadback',
|
|
395
|
+
}) {
|
|
396
|
+
assert.defined(database, 'database');
|
|
397
|
+
assert.defined(device, 'device');
|
|
398
|
+
assert.isNonNegativeInteger(gather_threshold, 'gather_threshold');
|
|
399
|
+
assert.isPositiveInteger(max_in_flight, 'max_in_flight');
|
|
400
|
+
assert.isString(label, 'label');
|
|
401
|
+
|
|
402
|
+
this.#database = database;
|
|
403
|
+
this.#device = device;
|
|
404
|
+
this.#gather_threshold = gather_threshold;
|
|
405
|
+
this.#max_in_flight = max_in_flight;
|
|
406
|
+
|
|
407
|
+
this.#table_starts = new Uint32Array(database.tables.length + 1);
|
|
408
|
+
|
|
409
|
+
this.#assembling = this.#make_batch();
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* Requests at or above which a batch is gathered rather than copied range by range.
|
|
414
|
+
* @returns {number}
|
|
415
|
+
*/
|
|
416
|
+
get gather_threshold() {
|
|
417
|
+
return this.#gather_threshold;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
/**
|
|
421
|
+
* Batches in flight before a frame's requests are refused.
|
|
422
|
+
* @returns {number}
|
|
423
|
+
*/
|
|
424
|
+
get max_in_flight() {
|
|
425
|
+
return this.#max_in_flight;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
/**
|
|
429
|
+
* Per handle, what became of the request — a {@link GPUReadbackStatus}.
|
|
430
|
+
*
|
|
431
|
+
* Read it fresh each time rather than keeping a reference: the array is replaced when the
|
|
432
|
+
* handle space grows. A status is readable for one frame, from the apply point that set it to
|
|
433
|
+
* the next.
|
|
434
|
+
*
|
|
435
|
+
* @returns {Uint8Array}
|
|
436
|
+
*/
|
|
437
|
+
get status() {
|
|
438
|
+
return this.#status;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
/**
|
|
442
|
+
* How many handles exist. Grows to the working set of a steady stream of requests and stops:
|
|
443
|
+
* handles are recycled a frame after their result lands.
|
|
444
|
+
*
|
|
445
|
+
* @returns {number}
|
|
446
|
+
*/
|
|
447
|
+
get handle_capacity() {
|
|
448
|
+
return this.#status.length;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
/**
|
|
452
|
+
* Requests made and not yet encoded.
|
|
453
|
+
* @returns {number}
|
|
454
|
+
*/
|
|
455
|
+
get pending_count() {
|
|
456
|
+
return this.#assembling.count;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
/**
|
|
460
|
+
* Batches encoded and not yet delivered or discarded.
|
|
461
|
+
* @returns {number}
|
|
462
|
+
*/
|
|
463
|
+
get in_flight_count() {
|
|
464
|
+
return this.#in_flight.length;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
/**
|
|
468
|
+
* How many `copyBufferToBuffer` calls this service has encoded, over its life. Read by profiles,
|
|
469
|
+
* and by the specs that assert an empty frame encodes nothing.
|
|
470
|
+
*
|
|
471
|
+
* @returns {number}
|
|
472
|
+
*/
|
|
473
|
+
get copies_encoded() {
|
|
474
|
+
return this.#copies_encoded;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/**
|
|
478
|
+
* How many gather dispatches this service has encoded, over its life.
|
|
479
|
+
* @returns {number}
|
|
480
|
+
*/
|
|
481
|
+
get dispatches_encoded() {
|
|
482
|
+
return this.#dispatches_encoded;
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
/**
|
|
486
|
+
* Requests whose bytes reached their target.
|
|
487
|
+
* @returns {number}
|
|
488
|
+
*/
|
|
489
|
+
get delivered_count() {
|
|
490
|
+
return this.#delivered_count;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
/**
|
|
494
|
+
* Requests thrown away because of the row — its page was not resident when the batch was
|
|
495
|
+
* encoded, it was not occupied, or it was freed before the answer landed.
|
|
496
|
+
*
|
|
497
|
+
* Reported rather than swallowed: a consumer whose readbacks are all being dropped is asking
|
|
498
|
+
* about rows that keep dying, and silence reads downstream as "the value did not change".
|
|
499
|
+
*
|
|
500
|
+
* @returns {number}
|
|
501
|
+
*/
|
|
502
|
+
get dropped_count() {
|
|
503
|
+
return this.#dropped_count;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
/**
|
|
507
|
+
* Requests thrown away because of the pipeline — {@link max_in_flight} batches were still
|
|
508
|
+
* waiting on the device when the frame's batch was due, or a mapping was refused. Separate
|
|
509
|
+
* from {@link dropped_count} because the cure is different: those rows died, these the device
|
|
510
|
+
* stopped answering about.
|
|
511
|
+
*
|
|
512
|
+
* @returns {number}
|
|
513
|
+
*/
|
|
514
|
+
get stalled_count() {
|
|
515
|
+
return this.#stalled_count;
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
/**
|
|
519
|
+
* Resolve a table name to the handle {@link request} takes. Once, at setup: a string lookup
|
|
520
|
+
* per row per frame is what this exists to avoid.
|
|
521
|
+
*
|
|
522
|
+
* From here on the table counts how many times each of its rows is freed, which is what lets
|
|
523
|
+
* an answer about a row that died and was reused be told from an answer about the row asked
|
|
524
|
+
* for.
|
|
525
|
+
*
|
|
526
|
+
* @param {string} name
|
|
527
|
+
* @returns {number}
|
|
528
|
+
*/
|
|
529
|
+
table(name) {
|
|
530
|
+
assert.isString(name, 'name');
|
|
531
|
+
|
|
532
|
+
const table = this.#database.get(name);
|
|
533
|
+
|
|
534
|
+
if (table === undefined) {
|
|
535
|
+
throw new Error(`Table '${name}' does not exist`);
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
table.track_generations();
|
|
539
|
+
|
|
540
|
+
return table.descriptor.index;
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
/**
|
|
544
|
+
* Ask for a byte range of a row to be copied into `target`, at a later apply point.
|
|
545
|
+
*
|
|
546
|
+
* Positional, and a few integer stores: this is called once per row per frame by anything that
|
|
547
|
+
* tracks rows, so it takes no options object and allocates nothing.
|
|
548
|
+
*
|
|
549
|
+
* @param {number} table from {@link table}
|
|
550
|
+
* @param {number} row
|
|
551
|
+
* @param {number} byte_offset within the record, word-aligned
|
|
552
|
+
* @param {number} byte_size a positive multiple of the word size
|
|
553
|
+
* @param {Uint8Array} target memory the caller owns and keeps; the bytes are written here at
|
|
554
|
+
* the apply point. A byte view on purpose — a consumer that reads floats holds a
|
|
555
|
+
* `Float32Array` over the same buffer, made once
|
|
556
|
+
* @param {number} [target_byte_offset]
|
|
557
|
+
* @returns {number} a handle into {@link status}, valid until the frame after its result lands
|
|
558
|
+
*/
|
|
559
|
+
request(table, row, byte_offset, byte_size, target, target_byte_offset = 0) {
|
|
560
|
+
assert.isNonNegativeInteger(table, 'table');
|
|
561
|
+
assert.isNonNegativeInteger(row, 'row');
|
|
562
|
+
assert.isNonNegativeInteger(byte_offset, 'byte_offset');
|
|
563
|
+
assert.isPositiveInteger(byte_size, 'byte_size');
|
|
564
|
+
assert.isNonNegativeInteger(target_byte_offset, 'target_byte_offset');
|
|
565
|
+
|
|
566
|
+
const tables = this.#database.tables;
|
|
567
|
+
|
|
568
|
+
assert.lessThan(table, tables.length, 'table is not a handle from table()');
|
|
569
|
+
assert.equal(byte_offset % WORD_SIZE, 0, 'byte_offset must be word-aligned');
|
|
570
|
+
assert.equal(byte_size % WORD_SIZE, 0, 'byte_size must be a whole number of words');
|
|
571
|
+
assert.ok(target instanceof Uint8Array, 'target must be a Uint8Array');
|
|
572
|
+
|
|
573
|
+
// constant messages: these run per row per frame, and a template literal built to describe a
|
|
574
|
+
// failure that does not happen is the cost on the path being measured
|
|
575
|
+
assert.lessThanOrEqual(byte_offset + byte_size, tables[table].descriptor.packed_element_size_bytes, 'range reaches past the record');
|
|
576
|
+
assert.lessThanOrEqual(target_byte_offset + byte_size, target.length, 'range reaches past the target');
|
|
577
|
+
|
|
578
|
+
const handle = this.#allocate_handle();
|
|
579
|
+
const base = handle * RECORD_WORDS;
|
|
580
|
+
const records = this.#records;
|
|
581
|
+
|
|
582
|
+
records[base + R_TABLE] = table;
|
|
583
|
+
records[base + R_ROW] = row;
|
|
584
|
+
records[base + R_WORD_OFFSET] = byte_offset / WORD_SIZE;
|
|
585
|
+
records[base + R_WORD_COUNT] = byte_size / WORD_SIZE;
|
|
586
|
+
records[base + R_GENERATION] = tables[table].generation_of(row);
|
|
587
|
+
records[base + R_TARGET_OFFSET] = target_byte_offset;
|
|
588
|
+
|
|
589
|
+
this.#targets[handle] = target;
|
|
590
|
+
this.#status[handle] = GPUReadbackStatus.Pending;
|
|
591
|
+
|
|
592
|
+
const batch = this.#assembling;
|
|
593
|
+
|
|
594
|
+
if (batch.count === batch.handles.length) {
|
|
595
|
+
const grown = new Uint32Array(batch.handles.length * 2);
|
|
596
|
+
|
|
597
|
+
grown.set(batch.handles);
|
|
598
|
+
|
|
599
|
+
batch.handles = grown;
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
batch.handles[batch.count++] = handle;
|
|
603
|
+
|
|
604
|
+
return handle;
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
/**
|
|
608
|
+
* Deliver every batch whose bytes have arrived, oldest first and stopping at the first that has
|
|
609
|
+
* not, then start the map for every batch whose frame has been submitted.
|
|
610
|
+
*
|
|
611
|
+
* **This is the apply point.** Call it at the head of a frame, before any system runs. A batch
|
|
612
|
+
* therefore reaches its targets at the first frame head at which its mapping — and every older
|
|
613
|
+
* batch's — has resolved, which is the frame after the one that encoded it at the earliest:
|
|
614
|
+
* never inside an update, and never at two different moments for two requests of the same
|
|
615
|
+
* batch. No caller-supplied code runs here.
|
|
616
|
+
*
|
|
617
|
+
* @returns {number} requests delivered
|
|
618
|
+
*/
|
|
619
|
+
apply() {
|
|
620
|
+
if (this.#destroyed) {
|
|
621
|
+
return 0;
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
// The handles delivered or dropped at the previous apply point have had their frame of
|
|
625
|
+
// being readable; they go back to the free list before anything is delivered, so nothing
|
|
626
|
+
// delivered now can be recycled before it has been read.
|
|
627
|
+
const retiring = this.#retiring;
|
|
628
|
+
|
|
629
|
+
for (let i = 0; i < retiring.length; i++) {
|
|
630
|
+
this.#recycle(retiring[i]);
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
retiring.length = 0;
|
|
634
|
+
|
|
635
|
+
const in_flight = this.#in_flight;
|
|
636
|
+
|
|
637
|
+
let delivered = 0;
|
|
638
|
+
|
|
639
|
+
while (in_flight.length > 0) {
|
|
640
|
+
const batch = in_flight[0];
|
|
641
|
+
|
|
642
|
+
if (batch.state === BatchState.Ready) {
|
|
643
|
+
delivered += this.#deliver(batch);
|
|
644
|
+
|
|
645
|
+
this.#allocator.release(batch.buffer);
|
|
646
|
+
} else if (batch.state === BatchState.Failed) {
|
|
647
|
+
this.#drop_pending(batch, true);
|
|
648
|
+
|
|
649
|
+
/*
|
|
650
|
+
A refused mapping is the one case the allocator has discard for, and this used to
|
|
651
|
+
release alongside the delivered ones. release only inspects mapState, and a
|
|
652
|
+
destroyed buffer reports "unmapped", so the corpse went back on the free list in
|
|
653
|
+
size order and the next batch of the same size was handed it — a validation error
|
|
654
|
+
on every copy into it, for as long as the pool kept handing it out.
|
|
655
|
+
*/
|
|
656
|
+
this.#allocator.discard(batch.buffer);
|
|
657
|
+
} else {
|
|
658
|
+
// still on the device, and nothing younger may overtake it
|
|
659
|
+
break;
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
batch.buffer = null;
|
|
663
|
+
batch.bytes = null;
|
|
664
|
+
batch.context = null;
|
|
665
|
+
|
|
666
|
+
in_flight.shift();
|
|
667
|
+
retiring.push(batch);
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
// Start the maps only now, and only for batches whose frame has been submitted. `encode`
|
|
671
|
+
// records a copy into a command context the caller has not finished yet, and mapping a
|
|
672
|
+
// buffer whose copy has not been submitted reads the frame before.
|
|
673
|
+
for (let i = 0; i < in_flight.length; i++) {
|
|
674
|
+
const batch = in_flight[i];
|
|
675
|
+
|
|
676
|
+
if (batch.state === BatchState.Encoded && batch.context.finished) {
|
|
677
|
+
this.#start_map(batch);
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
return delivered;
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
/**
|
|
685
|
+
* Record this frame's batch: a gather and one copy, or a handful of copies, or nothing at all.
|
|
686
|
+
*
|
|
687
|
+
* @param {import("../../../device/ShadeGPUCommandContext.js").ShadeGPUCommandContext} encoder
|
|
688
|
+
* @returns {boolean} whether anything was encoded
|
|
689
|
+
*/
|
|
690
|
+
encode(encoder) {
|
|
691
|
+
if (this.#destroyed) {
|
|
692
|
+
return false;
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
const batch = this.#assembling;
|
|
696
|
+
|
|
697
|
+
if (batch.count === 0) {
|
|
698
|
+
// The point of the whole arrangement: a frame nobody asked anything of costs one
|
|
699
|
+
// comparison. No buffer is taken, no command is recorded.
|
|
700
|
+
return false;
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
if (this.#allocator === null) {
|
|
704
|
+
const allocator = encoder.graphics.buffer_allocator_readback;
|
|
705
|
+
|
|
706
|
+
assert.defined(allocator, 'encoder.graphics.buffer_allocator_readback');
|
|
707
|
+
|
|
708
|
+
this.#allocator = allocator;
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
if (this.#in_flight.length >= this.#max_in_flight) {
|
|
712
|
+
// The device has stopped answering. Refusing the frame's requests, with a status the
|
|
713
|
+
// consumer can see, bounds everything: nothing queues, nothing is re-resolved next
|
|
714
|
+
// frame, and no buffer is taken for bytes that would be a dozen frames stale.
|
|
715
|
+
this.#drop_pending(batch, true);
|
|
716
|
+
this.#retire(batch);
|
|
717
|
+
|
|
718
|
+
return false;
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
const live = this.#resolve(batch);
|
|
722
|
+
|
|
723
|
+
if (live === 0) {
|
|
724
|
+
// every row asked about has gone; nothing to copy and nothing to deliver
|
|
725
|
+
this.#retire(batch);
|
|
726
|
+
|
|
727
|
+
return false;
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
batch.buffer = this.#allocator.get(batch.byte_size);
|
|
731
|
+
|
|
732
|
+
if (live < this.#gather_threshold) {
|
|
733
|
+
this.#encode_copies(encoder, batch);
|
|
734
|
+
} else {
|
|
735
|
+
this.#encode_gather(encoder, batch);
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
batch.context = encoder;
|
|
739
|
+
batch.state = BatchState.Encoded;
|
|
740
|
+
|
|
741
|
+
this.#in_flight.push(batch);
|
|
742
|
+
this.#assembling = this.#take_batch();
|
|
743
|
+
|
|
744
|
+
return true;
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
/**
|
|
748
|
+
* Where each request's range starts in the database buffer and where it lands in the image,
|
|
749
|
+
* for every request whose row is there to be read. A request whose page is not resident, or
|
|
750
|
+
* whose row is not occupied, is dropped here: "the page was gone" is a fact about the moment
|
|
751
|
+
* the batch was encoded and cannot be recovered from the bytes afterwards.
|
|
752
|
+
*
|
|
753
|
+
* The same arithmetic {@link GPUDatabase#debug_table_read_element} does, and the same the gather
|
|
754
|
+
* shader does — the CPU needs it for the copy path, and the residency answer for both.
|
|
755
|
+
*
|
|
756
|
+
* One pass, in request order, so the image is packed in request order and a consumer's run of
|
|
757
|
+
* consecutive rows is one contiguous span of it. Requests cluster by table and by page, so the
|
|
758
|
+
* table and the page are looked up when they change rather than per request. Live requests are
|
|
759
|
+
* counted per table on the way through, which is all the gather path's bucketing needs.
|
|
760
|
+
*
|
|
761
|
+
* @param {GPUReadbackBatch} batch
|
|
762
|
+
* @returns {number} live requests
|
|
763
|
+
*/
|
|
764
|
+
#resolve(batch) {
|
|
765
|
+
const database = this.#database;
|
|
766
|
+
const tables = database.tables;
|
|
767
|
+
const data_start = database.data_start_offset;
|
|
768
|
+
|
|
769
|
+
const records = this.#records;
|
|
770
|
+
const status = this.#status;
|
|
771
|
+
const handles = batch.handles;
|
|
772
|
+
const count = batch.count;
|
|
773
|
+
|
|
774
|
+
const starts = this.#table_starts;
|
|
775
|
+
|
|
776
|
+
starts.fill(0);
|
|
777
|
+
|
|
778
|
+
let destination = 0;
|
|
779
|
+
let live = 0;
|
|
780
|
+
let dropped = 0;
|
|
781
|
+
|
|
782
|
+
let table_index = -1;
|
|
783
|
+
let table = null;
|
|
784
|
+
let descriptor = null;
|
|
785
|
+
let elements_per_page = 0;
|
|
786
|
+
let record_words = 0;
|
|
787
|
+
|
|
788
|
+
let page_index = -1;
|
|
789
|
+
let page_base = -1;
|
|
790
|
+
|
|
791
|
+
for (let i = 0; i < count; i++) {
|
|
792
|
+
const handle = handles[i];
|
|
793
|
+
const base = handle * RECORD_WORDS;
|
|
794
|
+
|
|
795
|
+
const t = records[base + R_TABLE];
|
|
796
|
+
const row = records[base + R_ROW];
|
|
797
|
+
|
|
798
|
+
if (t !== table_index) {
|
|
799
|
+
table_index = t;
|
|
800
|
+
table = tables[t];
|
|
801
|
+
descriptor = table.descriptor;
|
|
802
|
+
elements_per_page = descriptor.elements_per_page;
|
|
803
|
+
record_words = descriptor.packed_element_size_bytes / WORD_SIZE;
|
|
804
|
+
page_index = -1;
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
const p = Math.floor(row / elements_per_page);
|
|
808
|
+
|
|
809
|
+
if (p !== page_index) {
|
|
810
|
+
page_index = p;
|
|
811
|
+
|
|
812
|
+
const page = table.pages.get(p);
|
|
813
|
+
|
|
814
|
+
page_base = (page === undefined || page.slot_offset === -1)
|
|
815
|
+
? -1
|
|
816
|
+
: page.slot_offset + data_start + descriptor.page_header_words;
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
if (page_base === -1 || !table.occupancy.get(row)) {
|
|
820
|
+
// the page is not on the GPU, or the row was removed and its bytes are whatever the
|
|
821
|
+
// last occupant left
|
|
822
|
+
status[handle] = GPUReadbackStatus.Dropped;
|
|
823
|
+
dropped++;
|
|
824
|
+
|
|
825
|
+
continue;
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
records[base + R_SOURCE_WORD] = page_base
|
|
829
|
+
+ (row - page_index * elements_per_page) * record_words
|
|
830
|
+
+ records[base + R_WORD_OFFSET];
|
|
831
|
+
records[base + R_DESTINATION_WORD] = destination;
|
|
832
|
+
|
|
833
|
+
destination += records[base + R_WORD_COUNT];
|
|
834
|
+
|
|
835
|
+
live++;
|
|
836
|
+
starts[t + 1]++;
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
this.#dropped_count += dropped;
|
|
840
|
+
|
|
841
|
+
batch.live = live;
|
|
842
|
+
batch.byte_size = destination * WORD_SIZE;
|
|
843
|
+
|
|
844
|
+
return live;
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
/**
|
|
848
|
+
* Copy each range straight out of the database into its place in the image. No shader, no
|
|
849
|
+
* descriptor upload, no bind group — which below the threshold is cheaper than all three.
|
|
850
|
+
*
|
|
851
|
+
* @param {import("../../../device/ShadeGPUCommandContext.js").ShadeGPUCommandContext} encoder
|
|
852
|
+
* @param {GPUReadbackBatch} batch
|
|
853
|
+
*/
|
|
854
|
+
#encode_copies(encoder, batch) {
|
|
855
|
+
const source = this.#database.buffer;
|
|
856
|
+
const destination = batch.buffer;
|
|
857
|
+
|
|
858
|
+
const records = this.#records;
|
|
859
|
+
const status = this.#status;
|
|
860
|
+
const handles = batch.handles;
|
|
861
|
+
const count = batch.count;
|
|
862
|
+
|
|
863
|
+
let copies = 0;
|
|
864
|
+
|
|
865
|
+
for (let i = 0; i < count; i++) {
|
|
866
|
+
const handle = handles[i];
|
|
867
|
+
|
|
868
|
+
if (status[handle] !== GPUReadbackStatus.Pending) {
|
|
869
|
+
continue;
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
const base = handle * RECORD_WORDS;
|
|
873
|
+
|
|
874
|
+
encoder.copyBufferToBuffer(
|
|
875
|
+
source,
|
|
876
|
+
records[base + R_SOURCE_WORD] * WORD_SIZE,
|
|
877
|
+
destination,
|
|
878
|
+
records[base + R_DESTINATION_WORD] * WORD_SIZE,
|
|
879
|
+
records[base + R_WORD_COUNT] * WORD_SIZE,
|
|
880
|
+
);
|
|
881
|
+
|
|
882
|
+
copies++;
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
this.#copies_encoded += copies;
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
/**
|
|
889
|
+
* Pack every range into the scratch buffer with one dispatch per table, then copy the whole
|
|
890
|
+
* image across in one go.
|
|
891
|
+
*
|
|
892
|
+
* One dispatch per table rather than one for the batch, because the page geometry a thread needs
|
|
893
|
+
* — record size, elements per page, where the table's page addresses live — is per table, and
|
|
894
|
+
* carrying it per descriptor would cost more words than the descriptor has.
|
|
895
|
+
*
|
|
896
|
+
* The live handles are bucketed by table with a counting sort off the per-table counts
|
|
897
|
+
* {@link #resolve} left behind: one pass to scatter, then each table's run is emitted in turn.
|
|
898
|
+
* Linear in the requests plus the tables, where scanning every request once per table was
|
|
899
|
+
* their product.
|
|
900
|
+
*
|
|
901
|
+
* @param {import("../../../device/ShadeGPUCommandContext.js").ShadeGPUCommandContext} encoder
|
|
902
|
+
* @param {GPUReadbackBatch} batch
|
|
903
|
+
*/
|
|
904
|
+
#encode_gather(encoder, batch) {
|
|
905
|
+
const live = batch.live;
|
|
906
|
+
const byte_size = batch.byte_size;
|
|
907
|
+
|
|
908
|
+
const gather_buffer = this.#fit_gather_buffer(byte_size);
|
|
909
|
+
|
|
910
|
+
const tables = this.#database.tables;
|
|
911
|
+
const table_count = tables.length;
|
|
912
|
+
|
|
913
|
+
const records = this.#records;
|
|
914
|
+
const status = this.#status;
|
|
915
|
+
const handles = batch.handles;
|
|
916
|
+
const count = batch.count;
|
|
917
|
+
|
|
918
|
+
// counts to starts
|
|
919
|
+
const starts = this.#table_starts;
|
|
920
|
+
|
|
921
|
+
for (let t = 1; t <= table_count; t++) {
|
|
922
|
+
starts[t] += starts[t - 1];
|
|
923
|
+
}
|
|
924
|
+
|
|
925
|
+
if (batch.order.length < live) {
|
|
926
|
+
batch.order = new Uint32Array(Math.max(live, batch.order.length * 2));
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
const order = batch.order;
|
|
930
|
+
|
|
931
|
+
// scatter, in request order within each table; afterwards starts[t] is the end of table t
|
|
932
|
+
for (let i = 0; i < count; i++) {
|
|
933
|
+
const handle = handles[i];
|
|
934
|
+
|
|
935
|
+
if (status[handle] !== GPUReadbackStatus.Pending) {
|
|
936
|
+
continue;
|
|
937
|
+
}
|
|
938
|
+
|
|
939
|
+
order[starts[records[handle * RECORD_WORDS + R_TABLE]]++] = handle;
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
const descriptor_stride = GPU_TABLE_GATHER_DESCRIPTOR_WORDS;
|
|
943
|
+
const max_per_chunk = Math.max(1, Math.floor(DESCRIPTOR_CHUNK_BYTES / (descriptor_stride * WORD_SIZE)));
|
|
944
|
+
|
|
945
|
+
const scratch_words = Math.min(live, max_per_chunk) * descriptor_stride;
|
|
946
|
+
|
|
947
|
+
if (this.#descriptor_scratch.length < scratch_words) {
|
|
948
|
+
this.#descriptor_scratch = new Uint32Array(scratch_words);
|
|
949
|
+
}
|
|
950
|
+
|
|
951
|
+
const scratch = this.#descriptor_scratch;
|
|
952
|
+
const settings = this.#gather_settings;
|
|
953
|
+
|
|
954
|
+
let run_start = 0;
|
|
955
|
+
|
|
956
|
+
for (let t = 0; t < table_count; t++) {
|
|
957
|
+
const run_end = starts[t];
|
|
958
|
+
|
|
959
|
+
if (run_end === run_start) {
|
|
960
|
+
continue;
|
|
961
|
+
}
|
|
962
|
+
|
|
963
|
+
const table_descriptor = tables[t].descriptor;
|
|
964
|
+
|
|
965
|
+
settings.record_size = table_descriptor.packed_element_size_bytes / WORD_SIZE;
|
|
966
|
+
settings.elements_per_page = table_descriptor.elements_per_page;
|
|
967
|
+
settings.page_lookup_address = table_descriptor.page_lookup_address;
|
|
968
|
+
settings.page_header_words = table_descriptor.page_header_words;
|
|
969
|
+
settings.page_limit = table_descriptor.page_limit;
|
|
970
|
+
|
|
971
|
+
let filled = 0;
|
|
972
|
+
|
|
973
|
+
for (let i = run_start; i < run_end; i++) {
|
|
974
|
+
const base = order[i] * RECORD_WORDS;
|
|
975
|
+
const d = filled * descriptor_stride;
|
|
976
|
+
|
|
977
|
+
scratch[d] = records[base + R_ROW];
|
|
978
|
+
scratch[d + 1] = records[base + R_WORD_OFFSET];
|
|
979
|
+
scratch[d + 2] = records[base + R_WORD_COUNT];
|
|
980
|
+
scratch[d + 3] = records[base + R_DESTINATION_WORD];
|
|
981
|
+
|
|
982
|
+
filled++;
|
|
983
|
+
|
|
984
|
+
if (filled === max_per_chunk) {
|
|
985
|
+
this.#dispatch_gather(encoder, scratch, filled, settings, gather_buffer);
|
|
986
|
+
filled = 0;
|
|
987
|
+
}
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
if (filled > 0) {
|
|
991
|
+
this.#dispatch_gather(encoder, scratch, filled, settings, gather_buffer);
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
run_start = run_end;
|
|
995
|
+
}
|
|
996
|
+
|
|
997
|
+
encoder.copyBufferToBuffer(gather_buffer, 0, batch.buffer, 0, byte_size);
|
|
998
|
+
|
|
999
|
+
this.#copies_encoded++;
|
|
1000
|
+
}
|
|
1001
|
+
|
|
1002
|
+
/**
|
|
1003
|
+
* @param {import("../../../device/ShadeGPUCommandContext.js").ShadeGPUCommandContext} encoder
|
|
1004
|
+
* @param {Uint32Array} scratch
|
|
1005
|
+
* @param {number} count
|
|
1006
|
+
* @param {Object} settings
|
|
1007
|
+
* @param {GPUBuffer} gather_buffer
|
|
1008
|
+
*/
|
|
1009
|
+
#dispatch_gather(encoder, scratch, count, settings, gather_buffer) {
|
|
1010
|
+
settings.count = count;
|
|
1011
|
+
|
|
1012
|
+
const descriptors = encoder.allocateTransientBufferAndLoad(
|
|
1013
|
+
scratch.buffer,
|
|
1014
|
+
GPUBufferUsage.STORAGE,
|
|
1015
|
+
0,
|
|
1016
|
+
count * GPU_TABLE_GATHER_DESCRIPTOR_WORDS * WORD_SIZE,
|
|
1017
|
+
);
|
|
1018
|
+
|
|
1019
|
+
gpu_table_gather_shader.dispatchThreads({
|
|
1020
|
+
encoder,
|
|
1021
|
+
bindings: {
|
|
1022
|
+
settings,
|
|
1023
|
+
descriptors,
|
|
1024
|
+
database: this.#database.buffer,
|
|
1025
|
+
gathered: gather_buffer,
|
|
1026
|
+
},
|
|
1027
|
+
thread_count_x: count,
|
|
1028
|
+
});
|
|
1029
|
+
|
|
1030
|
+
this.#dispatches_encoded++;
|
|
1031
|
+
}
|
|
1032
|
+
|
|
1033
|
+
/**
|
|
1034
|
+
* @param {number} byte_size
|
|
1035
|
+
* @returns {GPUBuffer}
|
|
1036
|
+
*/
|
|
1037
|
+
#fit_gather_buffer(byte_size) {
|
|
1038
|
+
const existing = this.#gather_buffer;
|
|
1039
|
+
|
|
1040
|
+
if (existing !== null && existing.size >= byte_size) {
|
|
1041
|
+
return existing;
|
|
1042
|
+
}
|
|
1043
|
+
|
|
1044
|
+
if (existing !== null) {
|
|
1045
|
+
existing.destroy();
|
|
1046
|
+
}
|
|
1047
|
+
|
|
1048
|
+
const buffer = this.#device.createBuffer({
|
|
1049
|
+
label: 'GPUDatabaseReadback/gather',
|
|
1050
|
+
size: round_up(byte_size, GATHER_SIZE_GRANULARITY),
|
|
1051
|
+
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
|
|
1052
|
+
mappedAtCreation: false,
|
|
1053
|
+
});
|
|
1054
|
+
|
|
1055
|
+
this.#gather_buffer = buffer;
|
|
1056
|
+
|
|
1057
|
+
return buffer;
|
|
1058
|
+
}
|
|
1059
|
+
|
|
1060
|
+
/**
|
|
1061
|
+
* @param {GPUReadbackBatch} batch
|
|
1062
|
+
*/
|
|
1063
|
+
#start_map(batch) {
|
|
1064
|
+
batch.state = BatchState.Mapping;
|
|
1065
|
+
|
|
1066
|
+
batch.buffer.mapAsync(GPUMapMode.READ, 0, batch.byte_size).then(batch.on_mapped, batch.on_failed);
|
|
1067
|
+
}
|
|
1068
|
+
|
|
1069
|
+
/**
|
|
1070
|
+
* Copy a mapped batch into its targets.
|
|
1071
|
+
*
|
|
1072
|
+
* The image is packed in request order, so consecutive live requests are consecutive in it;
|
|
1073
|
+
* when they also name consecutive bytes of one target, the run is one `set`. A consumer that
|
|
1074
|
+
* asks for a hundred rows into one array gets one copy, not a hundred.
|
|
1075
|
+
*
|
|
1076
|
+
* @param {GPUReadbackBatch} batch
|
|
1077
|
+
* @returns {number} requests delivered
|
|
1078
|
+
*/
|
|
1079
|
+
#deliver(batch) {
|
|
1080
|
+
const records = this.#records;
|
|
1081
|
+
const status = this.#status;
|
|
1082
|
+
const targets = this.#targets;
|
|
1083
|
+
const tables = this.#database.tables;
|
|
1084
|
+
|
|
1085
|
+
const bytes = batch.bytes;
|
|
1086
|
+
const handles = batch.handles;
|
|
1087
|
+
const count = batch.count;
|
|
1088
|
+
|
|
1089
|
+
let delivered = 0;
|
|
1090
|
+
let dropped = 0;
|
|
1091
|
+
|
|
1092
|
+
let run_target = null;
|
|
1093
|
+
let run_source = 0;
|
|
1094
|
+
let run_target_offset = 0;
|
|
1095
|
+
let run_length = 0;
|
|
1096
|
+
|
|
1097
|
+
for (let i = 0; i < count; i++) {
|
|
1098
|
+
const handle = handles[i];
|
|
1099
|
+
|
|
1100
|
+
if (status[handle] !== GPUReadbackStatus.Pending) {
|
|
1101
|
+
// dropped at encode; it has no bytes in the image
|
|
1102
|
+
continue;
|
|
1103
|
+
}
|
|
1104
|
+
|
|
1105
|
+
const base = handle * RECORD_WORDS;
|
|
1106
|
+
const row = records[base + R_ROW];
|
|
1107
|
+
|
|
1108
|
+
if (tables[records[base + R_TABLE]].generation_of(row) !== records[base + R_GENERATION]) {
|
|
1109
|
+
// the row was freed while this was in flight, and an id freed is an id already
|
|
1110
|
+
// handed out again — answering would be answering about a stranger
|
|
1111
|
+
status[handle] = GPUReadbackStatus.Dropped;
|
|
1112
|
+
dropped++;
|
|
1113
|
+
|
|
1114
|
+
continue;
|
|
1115
|
+
}
|
|
1116
|
+
|
|
1117
|
+
const source = records[base + R_DESTINATION_WORD] * WORD_SIZE;
|
|
1118
|
+
const length = records[base + R_WORD_COUNT] * WORD_SIZE;
|
|
1119
|
+
const target = targets[handle];
|
|
1120
|
+
const target_offset = records[base + R_TARGET_OFFSET];
|
|
1121
|
+
|
|
1122
|
+
if (
|
|
1123
|
+
target === run_target
|
|
1124
|
+
&& target_offset === run_target_offset + run_length
|
|
1125
|
+
&& source === run_source + run_length
|
|
1126
|
+
) {
|
|
1127
|
+
run_length += length;
|
|
1128
|
+
} else {
|
|
1129
|
+
if (run_length > 0) {
|
|
1130
|
+
run_target.set(bytes.subarray(run_source, run_source + run_length), run_target_offset);
|
|
1131
|
+
}
|
|
1132
|
+
|
|
1133
|
+
run_target = target;
|
|
1134
|
+
run_source = source;
|
|
1135
|
+
run_target_offset = target_offset;
|
|
1136
|
+
run_length = length;
|
|
1137
|
+
}
|
|
1138
|
+
|
|
1139
|
+
status[handle] = GPUReadbackStatus.Delivered;
|
|
1140
|
+
delivered++;
|
|
1141
|
+
}
|
|
1142
|
+
|
|
1143
|
+
if (run_length > 0) {
|
|
1144
|
+
run_target.set(bytes.subarray(run_source, run_source + run_length), run_target_offset);
|
|
1145
|
+
}
|
|
1146
|
+
|
|
1147
|
+
this.#delivered_count += delivered;
|
|
1148
|
+
this.#dropped_count += dropped;
|
|
1149
|
+
|
|
1150
|
+
return delivered;
|
|
1151
|
+
}
|
|
1152
|
+
|
|
1153
|
+
/**
|
|
1154
|
+
* Mark every request of a batch still waiting as dropped.
|
|
1155
|
+
*
|
|
1156
|
+
* @param {GPUReadbackBatch} batch
|
|
1157
|
+
* @param {boolean} stalled whether the pipeline, rather than the rows, is the reason
|
|
1158
|
+
*/
|
|
1159
|
+
#drop_pending(batch, stalled) {
|
|
1160
|
+
const status = this.#status;
|
|
1161
|
+
const handles = batch.handles;
|
|
1162
|
+
const count = batch.count;
|
|
1163
|
+
|
|
1164
|
+
let dropped = 0;
|
|
1165
|
+
|
|
1166
|
+
for (let i = 0; i < count; i++) {
|
|
1167
|
+
const handle = handles[i];
|
|
1168
|
+
|
|
1169
|
+
if (status[handle] === GPUReadbackStatus.Pending) {
|
|
1170
|
+
status[handle] = GPUReadbackStatus.Dropped;
|
|
1171
|
+
dropped++;
|
|
1172
|
+
}
|
|
1173
|
+
}
|
|
1174
|
+
|
|
1175
|
+
if (stalled) {
|
|
1176
|
+
this.#stalled_count += dropped;
|
|
1177
|
+
} else {
|
|
1178
|
+
this.#dropped_count += dropped;
|
|
1179
|
+
}
|
|
1180
|
+
}
|
|
1181
|
+
|
|
1182
|
+
/**
|
|
1183
|
+
* Send the assembling batch straight to retiring — nothing of it is in flight — and take a
|
|
1184
|
+
* fresh one for the requests that follow.
|
|
1185
|
+
*
|
|
1186
|
+
* @param {GPUReadbackBatch} batch
|
|
1187
|
+
*/
|
|
1188
|
+
#retire(batch) {
|
|
1189
|
+
this.#retiring.push(batch);
|
|
1190
|
+
this.#assembling = this.#take_batch();
|
|
1191
|
+
}
|
|
1192
|
+
|
|
1193
|
+
/**
|
|
1194
|
+
* Free a retired batch's handles and put the batch back in the pool.
|
|
1195
|
+
*
|
|
1196
|
+
* @param {GPUReadbackBatch} batch
|
|
1197
|
+
*/
|
|
1198
|
+
#recycle(batch) {
|
|
1199
|
+
const status = this.#status;
|
|
1200
|
+
const targets = this.#targets;
|
|
1201
|
+
const free = this.#free;
|
|
1202
|
+
const handles = batch.handles;
|
|
1203
|
+
const count = batch.count;
|
|
1204
|
+
|
|
1205
|
+
let free_count = this.#free_count;
|
|
1206
|
+
|
|
1207
|
+
for (let i = 0; i < count; i++) {
|
|
1208
|
+
const handle = handles[i];
|
|
1209
|
+
|
|
1210
|
+
status[handle] = GPUReadbackStatus.None;
|
|
1211
|
+
targets[handle] = null;
|
|
1212
|
+
|
|
1213
|
+
free[free_count++] = handle;
|
|
1214
|
+
}
|
|
1215
|
+
|
|
1216
|
+
this.#free_count = free_count;
|
|
1217
|
+
|
|
1218
|
+
batch.count = 0;
|
|
1219
|
+
batch.live = 0;
|
|
1220
|
+
batch.byte_size = 0;
|
|
1221
|
+
batch.state = BatchState.Assembling;
|
|
1222
|
+
|
|
1223
|
+
this.#spare.push(batch);
|
|
1224
|
+
}
|
|
1225
|
+
|
|
1226
|
+
/**
|
|
1227
|
+
* @returns {GPUReadbackBatch}
|
|
1228
|
+
*/
|
|
1229
|
+
#take_batch() {
|
|
1230
|
+
const spare = this.#spare;
|
|
1231
|
+
|
|
1232
|
+
if (spare.length > 0) {
|
|
1233
|
+
return spare.pop();
|
|
1234
|
+
}
|
|
1235
|
+
|
|
1236
|
+
return this.#make_batch();
|
|
1237
|
+
}
|
|
1238
|
+
|
|
1239
|
+
/**
|
|
1240
|
+
* @returns {GPUReadbackBatch}
|
|
1241
|
+
*/
|
|
1242
|
+
#make_batch() {
|
|
1243
|
+
const batch = new GPUReadbackBatch();
|
|
1244
|
+
|
|
1245
|
+
batch.on_mapped = () => {
|
|
1246
|
+
if (this.#destroyed || batch.state !== BatchState.Mapping) {
|
|
1247
|
+
// torn down while the map was out; the buffer went with it
|
|
1248
|
+
return;
|
|
1249
|
+
}
|
|
1250
|
+
|
|
1251
|
+
batch.bytes = new Uint8Array(batch.buffer.getMappedRange(0, batch.byte_size));
|
|
1252
|
+
batch.state = BatchState.Ready;
|
|
1253
|
+
};
|
|
1254
|
+
|
|
1255
|
+
batch.on_failed = () => {
|
|
1256
|
+
if (batch.state === BatchState.Mapping) {
|
|
1257
|
+
// device lost, buffer destroyed — discarded at the next apply point
|
|
1258
|
+
batch.state = BatchState.Failed;
|
|
1259
|
+
}
|
|
1260
|
+
};
|
|
1261
|
+
|
|
1262
|
+
return batch;
|
|
1263
|
+
}
|
|
1264
|
+
|
|
1265
|
+
/**
|
|
1266
|
+
* @returns {number}
|
|
1267
|
+
*/
|
|
1268
|
+
#allocate_handle() {
|
|
1269
|
+
if (this.#free_count > 0) {
|
|
1270
|
+
return this.#free[--this.#free_count];
|
|
1271
|
+
}
|
|
1272
|
+
|
|
1273
|
+
if (this.#fresh === this.#status.length) {
|
|
1274
|
+
this.#grow_handles();
|
|
1275
|
+
}
|
|
1276
|
+
|
|
1277
|
+
return this.#fresh++;
|
|
1278
|
+
}
|
|
1279
|
+
|
|
1280
|
+
/**
|
|
1281
|
+
* Double the handle space. Handles are indices, so nothing moves; a caller keeps the ones it
|
|
1282
|
+
* has.
|
|
1283
|
+
*/
|
|
1284
|
+
#grow_handles() {
|
|
1285
|
+
const capacity = this.#status.length * 2;
|
|
1286
|
+
|
|
1287
|
+
const records = new Uint32Array(capacity * RECORD_WORDS);
|
|
1288
|
+
records.set(this.#records);
|
|
1289
|
+
this.#records = records;
|
|
1290
|
+
|
|
1291
|
+
const status = new Uint8Array(capacity);
|
|
1292
|
+
status.set(this.#status);
|
|
1293
|
+
this.#status = status;
|
|
1294
|
+
|
|
1295
|
+
const free = new Uint32Array(capacity);
|
|
1296
|
+
free.set(this.#free);
|
|
1297
|
+
this.#free = free;
|
|
1298
|
+
|
|
1299
|
+
const targets = this.#targets;
|
|
1300
|
+
|
|
1301
|
+
for (let i = targets.length; i < capacity; i++) {
|
|
1302
|
+
targets.push(null);
|
|
1303
|
+
}
|
|
1304
|
+
}
|
|
1305
|
+
|
|
1306
|
+
destroy() {
|
|
1307
|
+
this.#destroyed = true;
|
|
1308
|
+
|
|
1309
|
+
const in_flight = this.#in_flight;
|
|
1310
|
+
|
|
1311
|
+
for (let i = 0; i < in_flight.length; i++) {
|
|
1312
|
+
const batch = in_flight[i];
|
|
1313
|
+
|
|
1314
|
+
if (batch.buffer !== null) {
|
|
1315
|
+
// may be mid-map, which WebGPU lets destroy() abort but not unmap()
|
|
1316
|
+
this.#allocator.discard(batch.buffer);
|
|
1317
|
+
|
|
1318
|
+
batch.buffer = null;
|
|
1319
|
+
}
|
|
1320
|
+
}
|
|
1321
|
+
|
|
1322
|
+
in_flight.length = 0;
|
|
1323
|
+
this.#retiring.length = 0;
|
|
1324
|
+
this.#spare.length = 0;
|
|
1325
|
+
this.#assembling.count = 0;
|
|
1326
|
+
|
|
1327
|
+
if (this.#gather_buffer !== null) {
|
|
1328
|
+
this.#gather_buffer.destroy();
|
|
1329
|
+
this.#gather_buffer = null;
|
|
1330
|
+
}
|
|
1331
|
+
}
|
|
1332
|
+
}
|