@woosh/meep-engine 3.12.0 → 3.13.1

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.
Files changed (301) hide show
  1. package/package.json +1 -1
  2. package/src/core/geom/3d/shape/ConvexHullShape3D.d.ts.map +1 -1
  3. package/src/core/geom/3d/shape/ConvexHullShape3D.js +41 -25
  4. package/src/core/geom/3d/shape/PosedShape3D.d.ts.map +1 -1
  5. package/src/core/geom/3d/shape/PosedShape3D.js +7 -2
  6. package/src/engine/graphics3/decal/GPUDecalRenderer.js +3 -3
  7. package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
  8. package/src/engine/graphics3/decal/shader_decal_composite.js +4 -2
  9. package/src/engine/graphics3/highlight/GPUHighlightRenderer.d.ts.map +1 -1
  10. package/src/engine/graphics3/highlight/GPUHighlightRenderer.js +2 -3
  11. package/src/engine/graphics3/highlight/shader_highlight_outline.js +150 -150
  12. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  13. package/src/shade/RENDERER_CONTRACT.md +2 -1
  14. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts +18 -0
  15. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts.map +1 -1
  16. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js +73 -0
  17. package/src/shade/device/PASS_ENCODER_PROPOSAL_2026_08_31.md +755 -0
  18. package/src/shade/device/ShadeGPUCommandContext.d.ts +10 -16
  19. package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
  20. package/src/shade/device/ShadeGPUCommandContext.js +801 -994
  21. package/src/shade/device/pass/ShadeGPUComputePassEncoder.d.ts +107 -0
  22. package/src/shade/device/pass/ShadeGPUComputePassEncoder.d.ts.map +1 -0
  23. package/src/shade/device/pass/ShadeGPUComputePassEncoder.js +222 -0
  24. package/src/shade/device/pass/ShadeGPURenderPassEncoder.d.ts +168 -0
  25. package/src/shade/device/pass/ShadeGPURenderPassEncoder.d.ts.map +1 -0
  26. package/src/shade/device/pass/ShadeGPURenderPassEncoder.js +317 -0
  27. package/src/shade/device/timing/GPUTimerArray.d.ts +4 -9
  28. package/src/shade/device/timing/GPUTimerArray.d.ts.map +1 -1
  29. package/src/shade/device/timing/GPUTimerArray.js +261 -289
  30. package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +20 -2
  31. package/src/shade/device/timing/ShadeGPUContextProfiler.d.ts +59 -0
  32. package/src/shade/device/timing/ShadeGPUContextProfiler.d.ts.map +1 -0
  33. package/src/shade/device/timing/ShadeGPUContextProfiler.js +182 -0
  34. package/src/shade/device/timing/profile/GPUProfileSession.d.ts +4 -4
  35. package/src/shade/device/timing/profile/GPUProfileSession.js +4 -4
  36. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
  37. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +3 -1
  38. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.d.ts.map +1 -1
  39. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.js +3 -1
  40. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts.map +1 -1
  41. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.js +3 -1
  42. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +2 -2
  43. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +2 -2
  44. package/src/shade/renderer/Renderer.d.ts +0 -6
  45. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  46. package/src/shade/renderer/Renderer.js +0 -29
  47. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  48. package/src/shade/renderer/animation/GPUAnimationManager.js +1 -3
  49. package/src/shade/renderer/animation/shader_animation_tick.d.ts.map +1 -1
  50. package/src/shade/renderer/animation/shader_animation_tick.js +128 -125
  51. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  52. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +8 -18
  53. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.d.ts.map +1 -1
  54. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.js +100 -98
  55. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.d.ts.map +1 -1
  56. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js +215 -212
  57. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts +1 -1
  58. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts.map +1 -1
  59. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.js +135 -120
  60. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.d.ts.map +1 -1
  61. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.js +77 -75
  62. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.d.ts.map +1 -1
  63. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js +375 -371
  64. package/src/shade/renderer/atmosphere/shader_transmittance_lut.js +3 -3
  65. package/src/shade/renderer/buffer/graph_inspect_gpu_buffer.js +1 -1
  66. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
  67. package/src/shade/renderer/buffer/table/GPUDatabase.js +14 -19
  68. package/src/shade/renderer/buffer/table/gpu_table_element_upload_shader.d.ts.map +1 -1
  69. package/src/shade/renderer/buffer/table/gpu_table_element_upload_shader.js +7 -2
  70. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
  71. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +325 -319
  72. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.d.ts.map +1 -1
  73. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.js +3 -1
  74. package/src/shade/renderer/deferred/shader_tonemap_HDR.d.ts.map +1 -1
  75. package/src/shade/renderer/deferred/shader_tonemap_HDR.js +4 -1
  76. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts +2 -2
  77. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts.map +1 -1
  78. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +167 -167
  79. package/src/shade/renderer/fow/GPUFogOfWarRenderer.js +3 -3
  80. package/src/shade/renderer/fow/shader_fog_of_war.d.ts.map +1 -1
  81. package/src/shade/renderer/fow/shader_fog_of_war.js +3 -1
  82. package/src/shade/renderer/geometry/bvh/record_blas_refit.js +102 -102
  83. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.d.ts.map +1 -1
  84. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.js +125 -121
  85. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  86. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +766 -774
  87. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
  88. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +72 -69
  89. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
  90. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +5 -10
  91. package/src/shade/renderer/geometry/sdf/shader_build_sdf.js +129 -129
  92. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.d.ts.map +1 -1
  93. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.js +5 -3
  94. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.d.ts.map +1 -1
  95. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.js +4 -1
  96. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_resolve_probes.d.ts.map +1 -1
  97. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_resolve_probes.js +3 -1
  98. package/src/shade/renderer/global_illumination/clipmap/shader_update_clipmap_cascade.d.ts.map +1 -1
  99. package/src/shade/renderer/global_illumination/clipmap/shader_update_clipmap_cascade.js +114 -112
  100. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lpv_store_sh.d.ts.map +1 -1
  101. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lpv_store_sh.js +4 -1
  102. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.d.ts.map +1 -1
  103. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +187 -184
  104. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.d.ts.map +1 -1
  105. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.js +4 -1
  106. package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.d.ts.map +1 -1
  107. package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.js +6 -8
  108. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.d.ts.map +1 -1
  109. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.js +3 -1
  110. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_update.d.ts.map +1 -1
  111. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_update.js +3 -1
  112. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +3 -3
  113. package/src/shade/renderer/gpu_primitive/bvh/PHASE1_HANDOVER.md +3 -3
  114. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +217 -217
  115. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts.map +1 -1
  116. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +145 -142
  117. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts.map +1 -1
  118. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js +87 -82
  119. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.d.ts.map +1 -1
  120. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.js +143 -140
  121. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.d.ts +2 -2
  122. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.d.ts.map +1 -1
  123. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.js +43 -8
  124. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
  125. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +4 -5
  126. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts.map +1 -1
  127. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js +88 -84
  128. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts.map +1 -1
  129. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js +194 -191
  130. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
  131. package/src/shade/renderer/hiz/HierarchicalZBuffer.js +33 -69
  132. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts.map +1 -1
  133. package/src/shade/renderer/hiz/shader_hzb_reduce_any.js +6 -1
  134. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts.map +1 -1
  135. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.js +23 -7
  136. package/src/shade/renderer/light/environment/execute_filter_environment_map.d.ts.map +1 -1
  137. package/src/shade/renderer/light/environment/execute_filter_environment_map.js +1 -2
  138. package/src/shade/renderer/light/environment/shader_convolve_reflection_map.d.ts.map +1 -1
  139. package/src/shade/renderer/light/environment/shader_convolve_reflection_map.js +6 -1
  140. package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.d.ts.map +1 -1
  141. package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.js +234 -219
  142. package/src/shade/renderer/lightmap/bake/raster/shader_lightmap_to_viz_buffer.js +2 -2
  143. package/src/shade/renderer/lightmap/bake/shader_lightmap_denoise_sh.js +191 -191
  144. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_accummulate_tile.d.ts.map +1 -1
  145. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_accummulate_tile.js +85 -82
  146. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  147. package/src/shade/renderer/particles/graph_particles.js +5 -3
  148. package/src/shade/renderer/particles/prototypeParticleSystem.js +3 -4
  149. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  150. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +132 -117
  151. package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
  152. package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +79 -77
  153. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  154. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +111 -99
  155. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
  156. package/src/shade/renderer/particles/sort/shader_particle_sort.js +187 -158
  157. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts.map +1 -1
  158. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +7 -10
  159. package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.d.ts.map +1 -1
  160. package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.js +4 -1
  161. package/src/shade/renderer/postprocess/bloom/shader_bloom_mix.d.ts.map +1 -1
  162. package/src/shade/renderer/postprocess/bloom/shader_bloom_mix.js +3 -1
  163. package/src/shade/renderer/postprocess/cas/shader_ffx_rcas.d.ts.map +1 -1
  164. package/src/shade/renderer/postprocess/cas/shader_ffx_rcas.js +4 -2
  165. package/src/shade/renderer/postprocess/denoise/fragment_shader_denoise_ao.js +147 -147
  166. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.d.ts.map +1 -1
  167. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +121 -119
  168. package/src/shade/renderer/postprocess/dof/gather/graph_postprocess_dof2.d.ts.map +1 -1
  169. package/src/shade/renderer/postprocess/dof/gather/graph_postprocess_dof2.js +1 -2
  170. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_far.d.ts.map +1 -1
  171. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_far.js +4 -1
  172. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_near.d.ts.map +1 -1
  173. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_near.js +4 -1
  174. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.d.ts.map +1 -1
  175. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.js +4 -1
  176. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_setup.d.ts.map +1 -1
  177. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_setup.js +4 -1
  178. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.d.ts.map +1 -1
  179. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.js +2 -4
  180. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_composite.d.ts.map +1 -1
  181. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_composite.js +4 -1
  182. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_prefilter.d.ts.map +1 -1
  183. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_prefilter.js +4 -1
  184. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch.d.ts.map +1 -1
  185. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch.js +4 -1
  186. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.d.ts.map +1 -1
  187. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.js +269 -266
  188. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.d.ts.map +1 -1
  189. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.js +273 -270
  190. package/src/shade/renderer/postprocess/dof/shader_dof_autofocus.d.ts.map +1 -1
  191. package/src/shade/renderer/postprocess/dof/shader_dof_autofocus.js +4 -1
  192. package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.d.ts.map +1 -1
  193. package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.js +8 -11
  194. package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.d.ts.map +1 -1
  195. package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.js +5 -1
  196. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts.map +1 -1
  197. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.js +11 -8
  198. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.d.ts.map +1 -1
  199. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +7 -8
  200. package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.d.ts.map +1 -1
  201. package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.js +3 -1
  202. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  203. package/src/shade/renderer/postprocess/nss/shader_nss_concat.d.ts.map +1 -1
  204. package/src/shade/renderer/postprocess/nss/shader_nss_concat.js +70 -68
  205. package/src/shade/renderer/postprocess/ssr/depth_max_shader.d.ts.map +1 -1
  206. package/src/shade/renderer/postprocess/ssr/depth_max_shader.js +70 -68
  207. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.d.ts.map +1 -1
  208. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.js +3 -1
  209. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.d.ts.map +1 -1
  210. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.js +4 -1
  211. package/src/shade/renderer/postprocess/ssr/shader_downsample_encoded_normal.d.ts.map +1 -1
  212. package/src/shade/renderer/postprocess/ssr/shader_downsample_encoded_normal.js +103 -101
  213. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
  214. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +4 -2
  215. package/src/shade/renderer/postprocess/ssr/ssr_trace_shader.d.ts.map +1 -1
  216. package/src/shade/renderer/postprocess/ssr/ssr_trace_shader.js +3 -1
  217. package/src/shade/renderer/postprocess/taa/shader_taa.d.ts.map +1 -1
  218. package/src/shade/renderer/postprocess/taa/shader_taa.js +4 -1
  219. package/src/shade/renderer/postprocess/upscale-dither/fragment_shader_upscale_dither.js +5 -5
  220. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  221. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +339 -341
  222. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
  223. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +114 -109
  224. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
  225. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +118 -115
  226. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  227. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +69 -65
  228. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +722 -722
  229. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
  230. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +1 -9
  231. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
  232. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +1 -6
  233. package/src/shade/renderer/restir/di/graph_restir_di.d.ts.map +1 -1
  234. package/src/shade/renderer/restir/di/graph_restir_di.js +2 -3
  235. package/src/shade/renderer/restir/di/graph_restir_di_denoise.d.ts.map +1 -1
  236. package/src/shade/renderer/restir/di/graph_restir_di_denoise.js +1 -2
  237. package/src/shade/renderer/restir/di/shader_restir_di_denoise.d.ts.map +1 -1
  238. package/src/shade/renderer/restir/di/shader_restir_di_denoise.js +139 -136
  239. package/src/shade/renderer/restir/di/shader_restir_di_resample.d.ts.map +1 -1
  240. package/src/shade/renderer/restir/di/shader_restir_di_resample.js +131 -129
  241. package/src/shade/renderer/restir/di/shader_restir_di_resolve.d.ts.map +1 -1
  242. package/src/shade/renderer/restir/di/shader_restir_di_resolve.js +101 -99
  243. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts.map +1 -1
  244. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +379 -383
  245. package/src/shade/renderer/scene/Mesh.d.ts.map +1 -1
  246. package/src/shade/renderer/scene/Mesh.js +4 -6
  247. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.d.ts.map +1 -1
  248. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js +147 -144
  249. package/src/shade/renderer/shader/ComputeShader.d.ts +2 -2
  250. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  251. package/src/shade/renderer/shader/ComputeShader.js +14 -17
  252. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts +2 -2
  253. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts.map +1 -1
  254. package/src/shade/renderer/shader/pass/RenderPassDescriptor.js +189 -189
  255. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  256. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +3 -1
  257. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +16 -7
  258. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  259. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +1342 -1326
  260. package/src/shade/renderer/shadow/map/Shadowmap.d.ts +13 -0
  261. package/src/shade/renderer/shadow/map/Shadowmap.d.ts.map +1 -1
  262. package/src/shade/renderer/shadow/map/Shadowmap.js +14 -0
  263. package/src/shade/renderer/shadow/map/ShadowmapDrawSelector.d.ts +79 -0
  264. package/src/shade/renderer/shadow/map/ShadowmapDrawSelector.d.ts.map +1 -0
  265. package/src/shade/renderer/shadow/map/ShadowmapDrawSelector.js +196 -0
  266. package/src/shade/renderer/shadow/map/ShadowmapRegistry.d.ts +91 -0
  267. package/src/shade/renderer/shadow/map/ShadowmapRegistry.d.ts.map +1 -0
  268. package/src/shade/renderer/shadow/map/ShadowmapRegistry.js +156 -0
  269. package/src/shade/renderer/shadow/map/shader/shader_shadowmap_remap_cube_to_octahedral.d.ts.map +1 -1
  270. package/src/shade/renderer/shadow/map/shader/shader_shadowmap_remap_cube_to_octahedral.js +5 -1
  271. package/src/shade/renderer/shadow/ray/shader_shadow_upscale.d.ts.map +1 -1
  272. package/src/shade/renderer/shadow/ray/shader_shadow_upscale.js +3 -1
  273. package/src/shade/renderer/shadow/ray/staged/gen/graph_gen_rays.js +73 -73
  274. package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.d.ts.map +1 -1
  275. package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.js +151 -148
  276. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.d.ts.map +1 -1
  277. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +4 -2
  278. package/src/shade/renderer/shadow/ray/staged/trace/shader_trace_rays.d.ts.map +1 -1
  279. package/src/shade/renderer/shadow/ray/staged/trace/shader_trace_rays.js +18 -4
  280. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.d.ts.map +1 -1
  281. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +7 -8
  282. package/src/shade/renderer/shadow/sdf/cascade/shader_build_scene_sdf_f32.d.ts.map +1 -1
  283. package/src/shade/renderer/shadow/sdf/cascade/shader_build_scene_sdf_f32.js +6 -2
  284. package/src/shade/renderer/shadow/sdf/cascade/shader_scene_sdf_debug_viz.d.ts.map +1 -1
  285. package/src/shade/renderer/shadow/sdf/cascade/shader_scene_sdf_debug_viz.js +129 -127
  286. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.d.ts.map +1 -1
  287. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.js +5 -3
  288. package/src/shade/renderer/texture/virtual/VirtualTextureManager.d.ts.map +1 -1
  289. package/src/shade/renderer/texture/virtual/VirtualTextureManager.js +2 -5
  290. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.d.ts.map +1 -1
  291. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.js +233 -231
  292. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  293. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +2 -4
  294. package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
  295. package/src/shade/wgsl/validate_wgsl_source.js +8 -3
  296. package/src/shade/device/timing/profile/make_profiling_pass_encoder.d.ts +0 -21
  297. package/src/shade/device/timing/profile/make_profiling_pass_encoder.d.ts.map +0 -1
  298. package/src/shade/device/timing/profile/make_profiling_pass_encoder.js +0 -114
  299. package/src/shade/device/timing/profile/parse_workgroup_size.d.ts +0 -20
  300. package/src/shade/device/timing/profile/parse_workgroup_size.d.ts.map +0 -1
  301. package/src/shade/device/timing/profile/parse_workgroup_size.js +0 -43
@@ -1,320 +1,326 @@
1
- import { assert } from "../../../../../core/assert.js";
2
- import { BinaryBuffer } from "../../../../../core/binary/BinaryBuffer.js";
3
- import { BitSet } from "../../../../../core/binary/BitSet.js";
4
- import { platform_compute_endianness } from "../../../../../core/binary/platform_compute_endianness.js";
5
- import { round_up } from "../../../../../core/math/round_up.js";
6
- import { KILOBYTE } from "../../../../../core/science/units/memory/KILOBYTE.js";
7
- import { write_wgsl_type_value } from "../../../shader/type/serde/write_gpu_typed_buffer.js";
8
- import { u32 } from "../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
9
- import { WebGPUArray } from "../../../shader/type/WebGPUArray.js";
10
- import { WebGPUStruct } from "../../../shader/type/WebGPUStruct.js";
11
- import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
12
- import { ComputeShader } from "../../../shader/ComputeShader.js";
13
- import { ShaderResourceSetDescriptor } from "../../../shader/resource/ShaderResourceSetDescriptor.js";
14
- import { inspect_gpu_buffer_typed } from "../../inspect_gpu_buffer_typed.js";
15
- import { GPU_DATABASE_UPLOAD_DISPATCH_GROUP_SIZE } from "../GPU_DATABASE_UPLOAD_DISPATCH_GROUP_SIZE.js";
16
-
17
- const UPLOAD_BUFFER_LIMIT = 64 * KILOBYTE;
18
- const INITIAL_BUFFER_SIZE = 4 * KILOBYTE;
19
-
20
- // how many recent upload records set() scans for an existing record with the same id
21
- // (see GPUTypedTable's constant of the same name)
22
- const UPLOAD_BUFFER_DEDUP_LOOKBACK = 256;
23
-
24
- const UPDATE_SETTINGS_STRUCT = WebGPUStruct.from({
25
- count: u32,
26
- record_size: u32,
27
- });
28
-
29
- const resources = new ShaderResourceSetDescriptor();
30
- resources.createGroup()
31
- .addUniform('settings', UPDATE_SETTINGS_STRUCT)
32
- .addStorageBuffer('upload_buffer', WebGPUArray.from(u32), false)
33
- .addStorageBuffer('destination', WebGPUArray.from(u32), true);
34
-
35
- const update_shader = ComputeShader.from({
36
- label: 'GPUSingleTypeTable.update',
37
- body: CodeChunk.from(
38
- //language=WGSL
39
- `
40
- @compute @workgroup_size(${GPU_DATABASE_UPLOAD_DISPATCH_GROUP_SIZE},1,1)
41
- fn main(@builtin(global_invocation_id) global_id : vec3<u32>){
42
- let buffer_index = global_id.x;
43
-
44
- if(buffer_index >= settings.count){
45
- return;
46
- }
47
-
48
- let upload_record_offset = buffer_index * ( settings.record_size + 1u );
49
-
50
- let element_id = upload_buffer[upload_record_offset];
51
-
52
- let read_offset = upload_record_offset + 1u;
53
- let write_offset = element_id * settings.record_size;
54
-
55
- // copy data
56
- for(var i = 0u; i < settings.record_size; i++){
57
- // TODO these is a race condition, if the buffer is updated while we are copying, we will overwrite the data
58
- destination[write_offset + i] = upload_buffer[read_offset + i];
59
- }
60
- }
61
- `
62
- ),
63
- resources
64
- });
65
-
66
- /**
67
- * Fully GPU-resident key-value dictionary. The keys are 32-bit unsigned integers.
68
- * @see {GPUDatabase}
69
- */
70
- export class GPUSingleTypeTable {
71
- /**
72
- * @type {WebGPUType}
73
- * @readonly
74
- */
75
- type;
76
-
77
- /**
78
- * @type {GPUBuffer}
79
- * @readonly
80
- */
81
- buffer
82
-
83
- /**
84
- * @private
85
- * @type {BinaryBuffer}
86
- */
87
- upload_buffer = BinaryBuffer.fromEndianness(platform_compute_endianness());
88
-
89
- /**
90
- * @private
91
- * @type {BitSet}
92
- */
93
- occupancy = new BitSet();
94
-
95
- /**
96
- * @type {GPUDevice}
97
- */
98
- #device
99
-
100
- /**
101
- *
102
- * @return {number} in bytes
103
- */
104
- get gpu_memory_usage() {
105
- return this.buffer.size;
106
- }
107
-
108
- /**
109
- *
110
- * @param {GPUDevice} device
111
- * @param {WebGPUType} type
112
- * @param {number} [initial_size] in bytes
113
- */
114
- constructor({
115
- device,
116
- type,
117
- initial_size = INITIAL_BUFFER_SIZE
118
- }) {
119
- assert.defined(device, 'device');
120
- assert.defined(type, 'type');
121
- assert.isNonNegativeInteger(initial_size, 'initial_size');
122
-
123
- this.#device = device;
124
- this.type = type;
125
-
126
- this.buffer = device.createBuffer({
127
- size: round_up(Math.max(1, initial_size), this.type.aligned_size),
128
- usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST,
129
- mappedAtCreation: false
130
- });
131
-
132
- }
133
-
134
- /**
135
- *
136
- * @param {number} id
137
- */
138
- remove(id) {
139
- assert.isNonNegativeInteger(id, 'id');
140
-
141
- this.occupancy.set(id, false);
142
-
143
- // TODO zero out the slot?
144
- }
145
-
146
- /**
147
- * Get the next empty slot. Not reserved, use {@link set} to reserve.
148
- * @return {number}
149
- */
150
- next() {
151
- return this.occupancy.nextClearBit(0);
152
- }
153
-
154
- /**
155
- * @template T
156
- * @param {number} id
157
- * @param {T} value
158
- */
159
- set(id, value) {
160
- assert.isNonNegativeInteger(id, 'id');
161
-
162
- this.occupancy.set(id, true);
163
-
164
- const upload_buffer = this.upload_buffer;
165
-
166
- // records are laid out at fixed strides: [u32 id, value], rounded up
167
- const stride = this.type.aligned_size + u32.size;
168
- const tail = upload_buffer.position;
169
-
170
- // Dedupe against recent records: each record is consumed by its own thread in a
171
- // single update dispatch, so two records for the same id would race
172
- // (last-writer-wins, non-deterministic). Overwrite the previous value in place.
173
- const max_lookback = Math.min(
174
- UPLOAD_BUFFER_DEDUP_LOOKBACK,
175
- Math.floor(tail / stride),
176
- );
177
-
178
- for (let i = 1; i <= max_lookback; i++) {
179
- const candidate_start = tail - i * stride;
180
- upload_buffer.position = candidate_start;
181
- if (upload_buffer.readUint32() === id) {
182
- write_wgsl_type_value(value, upload_buffer, this.type);
183
- upload_buffer.position = tail;
184
- return;
185
- }
186
- }
187
-
188
- upload_buffer.position = tail;
189
- upload_buffer.writeUint32(id);
190
- write_wgsl_type_value(value, upload_buffer, this.type);
191
-
192
- upload_buffer.position = round_up(upload_buffer.position, stride);
193
-
194
- }
195
-
196
- /**
197
- * @template T
198
- * @param {number} id
199
- * @returns {T}
200
- */
201
- async get(id) {
202
- assert.isNonNegativeInteger(id, 'id');
203
-
204
- const type = this.type;
205
-
206
- const values = await inspect_gpu_buffer_typed({
207
- buffer: this.buffer,
208
- device: this.#device,
209
- type,
210
- offset: id * type.aligned_size,
211
- count: 1
212
- });
213
-
214
- return values[0];
215
- }
216
-
217
- /**
218
- *
219
- * @param {ShadeGPUCommandContext} encoder
220
- * @param {number} count
221
- */
222
- #update_capacity(encoder, count) {
223
- const existing_buffer = this.buffer;
224
- const alignment = this.type.aligned_size;
225
- const needed_size_bytes = count * alignment;
226
-
227
- if (existing_buffer.size >= needed_size_bytes) {
228
- // TODO shrink buffer when too small
229
- return;
230
- }
231
-
232
- const GROW_FACTOR = 1.25;
233
-
234
- const new_size = Math.max(
235
- needed_size_bytes,
236
- round_up(existing_buffer.size * GROW_FACTOR, alignment)
237
- );
238
-
239
- const new_buffer = this.#device.createBuffer({
240
- size: new_size,
241
- usage: existing_buffer.usage,
242
- mappedAtCreation: false
243
- });
244
-
245
- encoder.copyBufferToBuffer(existing_buffer, 0, new_buffer, 0, existing_buffer.size);
246
-
247
- encoder.onFinished.add(() => {
248
- existing_buffer.destroy();
249
- });
250
-
251
- this.buffer = new_buffer;
252
- }
253
-
254
- /**
255
- *
256
- * @param {ShadeGPUCommandContext} command_ctx
257
- */
258
- update(command_ctx) {
259
- assert.defined(command_ctx, 'command_ctx');
260
- assert.equal(command_ctx.isGPUCommandContext, true, 'command_ctx.isGPUCommandContext !== true');
261
-
262
-
263
- if (this.upload_buffer.position === 0) {
264
- // nothing to do
265
- return;
266
- }
267
-
268
- // resize the buffer if necessary.
269
- const min_capacity = this.occupancy.size();
270
- this.#update_capacity(command_ctx, min_capacity);
271
-
272
- // execute copy shader.
273
- const count = this.upload_buffer.position / (this.type.aligned_size + u32.size);
274
-
275
- assert.isNonNegativeInteger(count, 'count');
276
-
277
- const settings = command_ctx.allocateTransientValueBuffer(UPDATE_SETTINGS_STRUCT, {
278
- count,
279
- record_size: this.type.aligned_size / u32.size,
280
- });
281
-
282
- const upload_buffer = command_ctx.allocateTransientBufferAndLoad(
283
- this.upload_buffer.data,
284
- GPUBufferUsage.STORAGE,
285
- 0,
286
- this.upload_buffer.position
287
- );
288
-
289
- update_shader.dispatchThreads({
290
- encoder: command_ctx,
291
- thread_count_x: count,
292
- bindings: {
293
- settings,
294
- upload_buffer,
295
- destination: this.buffer,
296
- }
297
- })
298
-
299
- // drop upload buffer
300
- this.upload_buffer.position = 0;
301
- if (this.upload_buffer.capacity > UPLOAD_BUFFER_LIMIT) {
302
- // release memory held by upload buffer
303
- this.upload_buffer.setCapacity(UPLOAD_BUFFER_LIMIT);
304
- }
305
- }
306
-
307
- async debug_dump() {
308
- return inspect_gpu_buffer_typed({
309
- buffer: this.buffer,
310
- device: this.#device,
311
- type: this.type,
312
- offset: 0,
313
- count: this.occupancy.size(),
314
- });
315
- }
316
-
317
- destroy() {
318
- this.buffer.destroy();
319
- }
1
+ import { assert } from "../../../../../core/assert.js";
2
+ import { BinaryBuffer } from "../../../../../core/binary/BinaryBuffer.js";
3
+ import { BitSet } from "../../../../../core/binary/BitSet.js";
4
+ import { platform_compute_endianness } from "../../../../../core/binary/platform_compute_endianness.js";
5
+ import { round_up } from "../../../../../core/math/round_up.js";
6
+ import { KILOBYTE } from "../../../../../core/science/units/memory/KILOBYTE.js";
7
+ import { write_wgsl_type_value } from "../../../shader/type/serde/write_gpu_typed_buffer.js";
8
+ import { u32 } from "../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
9
+ import { WebGPUArray } from "../../../shader/type/WebGPUArray.js";
10
+ import { WebGPUStruct } from "../../../shader/type/WebGPUStruct.js";
11
+ import { CodeChunk } from "../../../shader/compiler/CodeChunk.js";
12
+ import { ComputeShader } from "../../../shader/ComputeShader.js";
13
+ import { ShaderResourceSetDescriptor } from "../../../shader/resource/ShaderResourceSetDescriptor.js";
14
+ import { inspect_gpu_buffer_typed } from "../../inspect_gpu_buffer_typed.js";
15
+ import { GPU_DATABASE_UPLOAD_DISPATCH_GROUP_SIZE } from "../GPU_DATABASE_UPLOAD_DISPATCH_GROUP_SIZE.js";
16
+
17
+ const UPLOAD_BUFFER_LIMIT = 64 * KILOBYTE;
18
+ const INITIAL_BUFFER_SIZE = 4 * KILOBYTE;
19
+
20
+ // how many recent upload records set() scans for an existing record with the same id
21
+ // (see GPUTypedTable's constant of the same name)
22
+ const UPLOAD_BUFFER_DEDUP_LOOKBACK = 256;
23
+
24
+ const UPDATE_SETTINGS_STRUCT = WebGPUStruct.from({
25
+ count: u32,
26
+ record_size: u32,
27
+ });
28
+
29
+ const resources = new ShaderResourceSetDescriptor();
30
+
31
+ // per-dispatch, eight bytes, read-only: immediate data rather than a uniform buffer, which cost a
32
+ // transient buffer, a mapped staging buffer and a copyBufferToBuffer to carry two integers already
33
+ // known on the CPU
34
+ resources.setImmediate('settings', UPDATE_SETTINGS_STRUCT);
35
+
36
+ resources.createGroup()
37
+ .addStorageBuffer('upload_buffer', WebGPUArray.from(u32), false)
38
+ .addStorageBuffer('destination', WebGPUArray.from(u32), true);
39
+
40
+ const update_shader = ComputeShader.from({
41
+ label: 'GPUSingleTypeTable.update',
42
+ body: CodeChunk.from(
43
+ //language=WGSL
44
+ `
45
+ @compute @workgroup_size(${GPU_DATABASE_UPLOAD_DISPATCH_GROUP_SIZE},1,1)
46
+ fn main(@builtin(global_invocation_id) global_id : vec3<u32>){
47
+ let buffer_index = global_id.x;
48
+
49
+ if(buffer_index >= settings.count){
50
+ return;
51
+ }
52
+
53
+ let upload_record_offset = buffer_index * ( settings.record_size + 1u );
54
+
55
+ let element_id = upload_buffer[upload_record_offset];
56
+
57
+ let read_offset = upload_record_offset + 1u;
58
+ let write_offset = element_id * settings.record_size;
59
+
60
+ // copy data
61
+ for(var i = 0u; i < settings.record_size; i++){
62
+ // TODO these is a race condition, if the buffer is updated while we are copying, we will overwrite the data
63
+ destination[write_offset + i] = upload_buffer[read_offset + i];
64
+ }
65
+ }
66
+ `
67
+ ),
68
+ resources
69
+ });
70
+
71
+ /**
72
+ * Fully GPU-resident key-value dictionary. The keys are 32-bit unsigned integers.
73
+ * @see {GPUDatabase}
74
+ */
75
+ export class GPUSingleTypeTable {
76
+ /**
77
+ * @type {WebGPUType}
78
+ * @readonly
79
+ */
80
+ type;
81
+
82
+ /**
83
+ * @type {GPUBuffer}
84
+ * @readonly
85
+ */
86
+ buffer
87
+
88
+ /**
89
+ * @private
90
+ * @type {BinaryBuffer}
91
+ */
92
+ upload_buffer = BinaryBuffer.fromEndianness(platform_compute_endianness());
93
+
94
+ /**
95
+ * @private
96
+ * @type {BitSet}
97
+ */
98
+ occupancy = new BitSet();
99
+
100
+ /**
101
+ * @type {GPUDevice}
102
+ */
103
+ #device
104
+
105
+ /**
106
+ *
107
+ * @return {number} in bytes
108
+ */
109
+ get gpu_memory_usage() {
110
+ return this.buffer.size;
111
+ }
112
+
113
+ /**
114
+ *
115
+ * @param {GPUDevice} device
116
+ * @param {WebGPUType} type
117
+ * @param {number} [initial_size] in bytes
118
+ */
119
+ constructor({
120
+ device,
121
+ type,
122
+ initial_size = INITIAL_BUFFER_SIZE
123
+ }) {
124
+ assert.defined(device, 'device');
125
+ assert.defined(type, 'type');
126
+ assert.isNonNegativeInteger(initial_size, 'initial_size');
127
+
128
+ this.#device = device;
129
+ this.type = type;
130
+
131
+ this.buffer = device.createBuffer({
132
+ size: round_up(Math.max(1, initial_size), this.type.aligned_size),
133
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST,
134
+ mappedAtCreation: false
135
+ });
136
+
137
+ }
138
+
139
+ /**
140
+ *
141
+ * @param {number} id
142
+ */
143
+ remove(id) {
144
+ assert.isNonNegativeInteger(id, 'id');
145
+
146
+ this.occupancy.set(id, false);
147
+
148
+ // TODO zero out the slot?
149
+ }
150
+
151
+ /**
152
+ * Get the next empty slot. Not reserved, use {@link set} to reserve.
153
+ * @return {number}
154
+ */
155
+ next() {
156
+ return this.occupancy.nextClearBit(0);
157
+ }
158
+
159
+ /**
160
+ * @template T
161
+ * @param {number} id
162
+ * @param {T} value
163
+ */
164
+ set(id, value) {
165
+ assert.isNonNegativeInteger(id, 'id');
166
+
167
+ this.occupancy.set(id, true);
168
+
169
+ const upload_buffer = this.upload_buffer;
170
+
171
+ // records are laid out at fixed strides: [u32 id, value], rounded up
172
+ const stride = this.type.aligned_size + u32.size;
173
+ const tail = upload_buffer.position;
174
+
175
+ // Dedupe against recent records: each record is consumed by its own thread in a
176
+ // single update dispatch, so two records for the same id would race
177
+ // (last-writer-wins, non-deterministic). Overwrite the previous value in place.
178
+ const max_lookback = Math.min(
179
+ UPLOAD_BUFFER_DEDUP_LOOKBACK,
180
+ Math.floor(tail / stride),
181
+ );
182
+
183
+ for (let i = 1; i <= max_lookback; i++) {
184
+ const candidate_start = tail - i * stride;
185
+ upload_buffer.position = candidate_start;
186
+ if (upload_buffer.readUint32() === id) {
187
+ write_wgsl_type_value(value, upload_buffer, this.type);
188
+ upload_buffer.position = tail;
189
+ return;
190
+ }
191
+ }
192
+
193
+ upload_buffer.position = tail;
194
+ upload_buffer.writeUint32(id);
195
+ write_wgsl_type_value(value, upload_buffer, this.type);
196
+
197
+ upload_buffer.position = round_up(upload_buffer.position, stride);
198
+
199
+ }
200
+
201
+ /**
202
+ * @template T
203
+ * @param {number} id
204
+ * @returns {T}
205
+ */
206
+ async get(id) {
207
+ assert.isNonNegativeInteger(id, 'id');
208
+
209
+ const type = this.type;
210
+
211
+ const values = await inspect_gpu_buffer_typed({
212
+ buffer: this.buffer,
213
+ device: this.#device,
214
+ type,
215
+ offset: id * type.aligned_size,
216
+ count: 1
217
+ });
218
+
219
+ return values[0];
220
+ }
221
+
222
+ /**
223
+ *
224
+ * @param {ShadeGPUCommandContext} encoder
225
+ * @param {number} count
226
+ */
227
+ #update_capacity(encoder, count) {
228
+ const existing_buffer = this.buffer;
229
+ const alignment = this.type.aligned_size;
230
+ const needed_size_bytes = count * alignment;
231
+
232
+ if (existing_buffer.size >= needed_size_bytes) {
233
+ // TODO shrink buffer when too small
234
+ return;
235
+ }
236
+
237
+ const GROW_FACTOR = 1.25;
238
+
239
+ const new_size = Math.max(
240
+ needed_size_bytes,
241
+ round_up(existing_buffer.size * GROW_FACTOR, alignment)
242
+ );
243
+
244
+ const new_buffer = this.#device.createBuffer({
245
+ size: new_size,
246
+ usage: existing_buffer.usage,
247
+ mappedAtCreation: false
248
+ });
249
+
250
+ encoder.copyBufferToBuffer(existing_buffer, 0, new_buffer, 0, existing_buffer.size);
251
+
252
+ encoder.onFinished.add(() => {
253
+ existing_buffer.destroy();
254
+ });
255
+
256
+ this.buffer = new_buffer;
257
+ }
258
+
259
+ /**
260
+ *
261
+ * @param {ShadeGPUCommandContext} command_ctx
262
+ */
263
+ update(command_ctx) {
264
+ assert.defined(command_ctx, 'command_ctx');
265
+ assert.equal(command_ctx.isGPUCommandContext, true, 'command_ctx.isGPUCommandContext !== true');
266
+
267
+
268
+ if (this.upload_buffer.position === 0) {
269
+ // nothing to do
270
+ return;
271
+ }
272
+
273
+ // resize the buffer if necessary.
274
+ const min_capacity = this.occupancy.size();
275
+ this.#update_capacity(command_ctx, min_capacity);
276
+
277
+ // execute copy shader.
278
+ const count = this.upload_buffer.position / (this.type.aligned_size + u32.size);
279
+
280
+ assert.isNonNegativeInteger(count, 'count');
281
+
282
+ // immediate data — a plain value written straight into the pass, not a buffer
283
+ const settings = {
284
+ count,
285
+ record_size: this.type.aligned_size / u32.size,
286
+ };
287
+
288
+ const upload_buffer = command_ctx.allocateTransientBufferAndLoad(
289
+ this.upload_buffer.data,
290
+ GPUBufferUsage.STORAGE,
291
+ 0,
292
+ this.upload_buffer.position
293
+ );
294
+
295
+ update_shader.dispatchThreads({
296
+ encoder: command_ctx,
297
+ thread_count_x: count,
298
+ bindings: {
299
+ settings,
300
+ upload_buffer,
301
+ destination: this.buffer,
302
+ }
303
+ })
304
+
305
+ // drop upload buffer
306
+ this.upload_buffer.position = 0;
307
+ if (this.upload_buffer.capacity > UPLOAD_BUFFER_LIMIT) {
308
+ // release memory held by upload buffer
309
+ this.upload_buffer.setCapacity(UPLOAD_BUFFER_LIMIT);
310
+ }
311
+ }
312
+
313
+ async debug_dump() {
314
+ return inspect_gpu_buffer_typed({
315
+ buffer: this.buffer,
316
+ device: this.#device,
317
+ type: this.type,
318
+ offset: 0,
319
+ count: this.occupancy.size(),
320
+ });
321
+ }
322
+
323
+ destroy() {
324
+ this.buffer.destroy();
325
+ }
320
326
  }
@@ -1 +1 @@
1
- {"version":3,"file":"shader_buffer_copy_storage_to_storage.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.js"],"names":[],"mappings":"AAgCA;;;;GAIG;AACH,oDAFU,aAAa,CAMpB;8BArC2B,+BAA+B"}
1
+ {"version":3,"file":"shader_buffer_copy_storage_to_storage.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.js"],"names":[],"mappings":"AAkCA;;;;GAIG;AACH,oDAFU,aAAa,CAMpB;8BAvC2B,+BAA+B"}