@woosh/meep-engine 3.12.0 → 3.13.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.
Files changed (285) hide show
  1. package/package.json +1 -1
  2. package/src/engine/graphics3/decal/GPUDecalRenderer.js +3 -3
  3. package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
  4. package/src/engine/graphics3/decal/shader_decal_composite.js +4 -2
  5. package/src/engine/graphics3/highlight/GPUHighlightRenderer.d.ts.map +1 -1
  6. package/src/engine/graphics3/highlight/GPUHighlightRenderer.js +2 -3
  7. package/src/engine/graphics3/highlight/shader_highlight_outline.js +150 -150
  8. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  9. package/src/shade/RENDERER_CONTRACT.md +2 -1
  10. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts +18 -0
  11. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.d.ts.map +1 -1
  12. package/src/shade/descriptor/pipeline/compute/ComputePipelineDescriptor.js +73 -0
  13. package/src/shade/device/PASS_ENCODER_PROPOSAL_2026_08_31.md +750 -0
  14. package/src/shade/device/ShadeGPUCommandContext.d.ts +10 -16
  15. package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
  16. package/src/shade/device/ShadeGPUCommandContext.js +801 -994
  17. package/src/shade/device/pass/ShadeGPUComputePassEncoder.d.ts +107 -0
  18. package/src/shade/device/pass/ShadeGPUComputePassEncoder.d.ts.map +1 -0
  19. package/src/shade/device/pass/ShadeGPUComputePassEncoder.js +222 -0
  20. package/src/shade/device/pass/ShadeGPURenderPassEncoder.d.ts +168 -0
  21. package/src/shade/device/pass/ShadeGPURenderPassEncoder.d.ts.map +1 -0
  22. package/src/shade/device/pass/ShadeGPURenderPassEncoder.js +317 -0
  23. package/src/shade/device/timing/GPUTimerArray.d.ts +4 -9
  24. package/src/shade/device/timing/GPUTimerArray.d.ts.map +1 -1
  25. package/src/shade/device/timing/GPUTimerArray.js +261 -289
  26. package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +20 -2
  27. package/src/shade/device/timing/ShadeGPUContextProfiler.d.ts +59 -0
  28. package/src/shade/device/timing/ShadeGPUContextProfiler.d.ts.map +1 -0
  29. package/src/shade/device/timing/ShadeGPUContextProfiler.js +182 -0
  30. package/src/shade/device/timing/profile/GPUProfileSession.d.ts +4 -4
  31. package/src/shade/device/timing/profile/GPUProfileSession.js +4 -4
  32. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.d.ts.map +1 -1
  33. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_leaf_triangles.js +3 -1
  34. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.d.ts.map +1 -1
  35. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_points.js +3 -1
  36. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.d.ts.map +1 -1
  37. package/src/shade/playground/skinned_blas_refit/shader_blas_audit_visibility.js +3 -1
  38. package/src/shade/playground/skinned_blas_refit/verify_leaf_triangles.js +2 -2
  39. package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +2 -2
  40. package/src/shade/renderer/Renderer.d.ts +0 -6
  41. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  42. package/src/shade/renderer/Renderer.js +0 -29
  43. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  44. package/src/shade/renderer/animation/GPUAnimationManager.js +1 -3
  45. package/src/shade/renderer/animation/shader_animation_tick.d.ts.map +1 -1
  46. package/src/shade/renderer/animation/shader_animation_tick.js +128 -125
  47. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  48. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +8 -18
  49. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.d.ts.map +1 -1
  50. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_geometry_sphere_derive.js +100 -98
  51. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.d.ts.map +1 -1
  52. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_reduce.js +215 -212
  53. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts +1 -1
  54. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.d.ts.map +1 -1
  55. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_meshlet_bounds_scatter.js +135 -120
  56. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.d.ts.map +1 -1
  57. package/src/shade/renderer/animation/skinning/bounds_refresh/shader_skinned_mesh_bounds_refresh.js +77 -75
  58. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.d.ts.map +1 -1
  59. package/src/shade/renderer/animation/skinning/shader_meshlet_apply_skinning.js +375 -371
  60. package/src/shade/renderer/atmosphere/shader_transmittance_lut.js +3 -3
  61. package/src/shade/renderer/buffer/graph_inspect_gpu_buffer.js +1 -1
  62. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
  63. package/src/shade/renderer/buffer/table/GPUDatabase.js +14 -19
  64. package/src/shade/renderer/buffer/table/gpu_table_element_upload_shader.d.ts.map +1 -1
  65. package/src/shade/renderer/buffer/table/gpu_table_element_upload_shader.js +7 -2
  66. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
  67. package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +325 -319
  68. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.d.ts.map +1 -1
  69. package/src/shade/renderer/buffer/util/shader_buffer_copy_storage_to_storage.js +3 -1
  70. package/src/shade/renderer/deferred/shader_tonemap_HDR.d.ts.map +1 -1
  71. package/src/shade/renderer/deferred/shader_tonemap_HDR.js +4 -1
  72. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts +2 -2
  73. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts.map +1 -1
  74. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +167 -167
  75. package/src/shade/renderer/fow/GPUFogOfWarRenderer.js +3 -3
  76. package/src/shade/renderer/fow/shader_fog_of_war.d.ts.map +1 -1
  77. package/src/shade/renderer/fow/shader_fog_of_war.js +3 -1
  78. package/src/shade/renderer/geometry/bvh/record_blas_refit.js +102 -102
  79. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.d.ts.map +1 -1
  80. package/src/shade/renderer/geometry/bvh/shader_blas_refit_leaf_bounds.js +125 -121
  81. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  82. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +766 -774
  83. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.d.ts.map +1 -1
  84. package/src/shade/renderer/geometry/meshlet/shader_meshlet_metadata_address_patch.js +72 -69
  85. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.d.ts.map +1 -1
  86. package/src/shade/renderer/geometry/sdf/GPUGeometrySDFManager.js +5 -10
  87. package/src/shade/renderer/geometry/sdf/shader_build_sdf.js +129 -129
  88. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.d.ts.map +1 -1
  89. package/src/shade/renderer/geometry/sdf/shader_sdf_visualize.js +5 -3
  90. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.d.ts.map +1 -1
  91. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_probes.js +4 -1
  92. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_resolve_probes.d.ts.map +1 -1
  93. package/src/shade/renderer/global_illumination/brick4/gpu/bake/shader_brick4_bake_resolve_probes.js +3 -1
  94. package/src/shade/renderer/global_illumination/clipmap/shader_update_clipmap_cascade.d.ts.map +1 -1
  95. package/src/shade/renderer/global_illumination/clipmap/shader_update_clipmap_cascade.js +114 -112
  96. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lpv_store_sh.d.ts.map +1 -1
  97. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lpv_store_sh.js +4 -1
  98. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.d.ts.map +1 -1
  99. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +187 -184
  100. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.d.ts.map +1 -1
  101. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_reduce_atlas_to_sh.js +4 -1
  102. package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.d.ts.map +1 -1
  103. package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.js +6 -8
  104. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.d.ts.map +1 -1
  105. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.js +3 -1
  106. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_update.d.ts.map +1 -1
  107. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_update.js +3 -1
  108. package/src/shade/renderer/gpu_primitive/bvh/GPU_BVH_BUILD_PLAN.md +3 -3
  109. package/src/shade/renderer/gpu_primitive/bvh/PHASE1_HANDOVER.md +3 -3
  110. package/src/shade/renderer/gpu_primitive/bvh/graph_bvh_build_lbvh.js +217 -217
  111. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.d.ts.map +1 -1
  112. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_emit_hierarchy.js +145 -142
  113. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.d.ts.map +1 -1
  114. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_morton.js +87 -82
  115. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.d.ts.map +1 -1
  116. package/src/shade/renderer/gpu_primitive/bvh/shader_bvh_refit.js +143 -140
  117. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.d.ts +2 -2
  118. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.d.ts.map +1 -1
  119. package/src/shade/renderer/gpu_primitive/bvh/verify_gpu_bvh_build.js +43 -8
  120. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.d.ts.map +1 -1
  121. package/src/shade/renderer/gpu_primitive/sort/graph_radix_sort.js +4 -5
  122. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.d.ts.map +1 -1
  123. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_histogram.js +88 -84
  124. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.d.ts.map +1 -1
  125. package/src/shade/renderer/gpu_primitive/sort/shader_radix_sort_scatter.js +194 -191
  126. package/src/shade/renderer/hiz/HierarchicalZBuffer.d.ts.map +1 -1
  127. package/src/shade/renderer/hiz/HierarchicalZBuffer.js +33 -69
  128. package/src/shade/renderer/hiz/shader_hzb_reduce_any.d.ts.map +1 -1
  129. package/src/shade/renderer/hiz/shader_hzb_reduce_any.js +6 -1
  130. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.d.ts.map +1 -1
  131. package/src/shade/renderer/hiz/shader_hzb_reduce_mip0_clip.js +23 -7
  132. package/src/shade/renderer/light/environment/execute_filter_environment_map.d.ts.map +1 -1
  133. package/src/shade/renderer/light/environment/execute_filter_environment_map.js +1 -2
  134. package/src/shade/renderer/light/environment/shader_convolve_reflection_map.d.ts.map +1 -1
  135. package/src/shade/renderer/light/environment/shader_convolve_reflection_map.js +6 -1
  136. package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.d.ts.map +1 -1
  137. package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.js +234 -219
  138. package/src/shade/renderer/lightmap/bake/raster/shader_lightmap_to_viz_buffer.js +2 -2
  139. package/src/shade/renderer/lightmap/bake/shader_lightmap_denoise_sh.js +191 -191
  140. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_accummulate_tile.d.ts.map +1 -1
  141. package/src/shade/renderer/lightmap/bake/tile/shader_lightmap_accummulate_tile.js +85 -82
  142. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  143. package/src/shade/renderer/particles/graph_particles.js +5 -3
  144. package/src/shade/renderer/particles/prototypeParticleSystem.js +3 -4
  145. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  146. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +132 -117
  147. package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
  148. package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +79 -77
  149. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  150. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +111 -99
  151. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
  152. package/src/shade/renderer/particles/sort/shader_particle_sort.js +187 -158
  153. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts.map +1 -1
  154. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +7 -10
  155. package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.d.ts.map +1 -1
  156. package/src/shade/renderer/path_tracer/accumulating/shader_accumulating_path_tracer.js +4 -1
  157. package/src/shade/renderer/postprocess/bloom/shader_bloom_mix.d.ts.map +1 -1
  158. package/src/shade/renderer/postprocess/bloom/shader_bloom_mix.js +3 -1
  159. package/src/shade/renderer/postprocess/cas/shader_ffx_rcas.d.ts.map +1 -1
  160. package/src/shade/renderer/postprocess/cas/shader_ffx_rcas.js +4 -2
  161. package/src/shade/renderer/postprocess/denoise/fragment_shader_denoise_ao.js +147 -147
  162. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.d.ts.map +1 -1
  163. package/src/shade/renderer/postprocess/denoise/graph_atorus_denoise_luma.js +121 -119
  164. package/src/shade/renderer/postprocess/dof/gather/graph_postprocess_dof2.d.ts.map +1 -1
  165. package/src/shade/renderer/postprocess/dof/gather/graph_postprocess_dof2.js +1 -2
  166. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_far.d.ts.map +1 -1
  167. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_far.js +4 -1
  168. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_near.d.ts.map +1 -1
  169. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_gather_near.js +4 -1
  170. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.d.ts.map +1 -1
  171. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_recombine.js +4 -1
  172. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_setup.d.ts.map +1 -1
  173. package/src/shade/renderer/postprocess/dof/gather/shader_dof2_setup.js +4 -1
  174. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.d.ts.map +1 -1
  175. package/src/shade/renderer/postprocess/dof/raymarch/graph_postprocess_dof.js +2 -4
  176. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_composite.d.ts.map +1 -1
  177. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_composite.js +4 -1
  178. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_prefilter.d.ts.map +1 -1
  179. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_prefilter.js +4 -1
  180. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch.d.ts.map +1 -1
  181. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch.js +4 -1
  182. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.d.ts.map +1 -1
  183. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_raymarch_compute.js +269 -266
  184. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.d.ts.map +1 -1
  185. package/src/shade/renderer/postprocess/dof/raymarch/shader_dof_slice_compute.js +273 -270
  186. package/src/shade/renderer/postprocess/dof/shader_dof_autofocus.d.ts.map +1 -1
  187. package/src/shade/renderer/postprocess/dof/shader_dof_autofocus.js +4 -1
  188. package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.d.ts.map +1 -1
  189. package/src/shade/renderer/postprocess/eye/GPUCameraExposureManager.js +8 -11
  190. package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.d.ts.map +1 -1
  191. package/src/shade/renderer/postprocess/eye/shader_autoexposure_adapt.js +5 -1
  192. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.d.ts.map +1 -1
  193. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao.js +11 -8
  194. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.d.ts.map +1 -1
  195. package/src/shade/renderer/postprocess/gtao/fragment_shader_gtao_with_irradiance.js +7 -8
  196. package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.d.ts.map +1 -1
  197. package/src/shade/renderer/postprocess/motion_blur/shader_motion_blur_reconstruct.js +3 -1
  198. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  199. package/src/shade/renderer/postprocess/nss/shader_nss_concat.d.ts.map +1 -1
  200. package/src/shade/renderer/postprocess/nss/shader_nss_concat.js +70 -68
  201. package/src/shade/renderer/postprocess/ssr/depth_max_shader.d.ts.map +1 -1
  202. package/src/shade/renderer/postprocess/ssr/depth_max_shader.js +70 -68
  203. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.d.ts.map +1 -1
  204. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_IBL.js +3 -1
  205. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.d.ts.map +1 -1
  206. package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader_LPV.js +4 -1
  207. package/src/shade/renderer/postprocess/ssr/shader_downsample_encoded_normal.d.ts.map +1 -1
  208. package/src/shade/renderer/postprocess/ssr/shader_downsample_encoded_normal.js +103 -101
  209. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.d.ts.map +1 -1
  210. package/src/shade/renderer/postprocess/ssr/ssr_spatial_denoise_shader.js +4 -2
  211. package/src/shade/renderer/postprocess/ssr/ssr_trace_shader.d.ts.map +1 -1
  212. package/src/shade/renderer/postprocess/ssr/ssr_trace_shader.js +3 -1
  213. package/src/shade/renderer/postprocess/taa/shader_taa.d.ts.map +1 -1
  214. package/src/shade/renderer/postprocess/taa/shader_taa.js +4 -1
  215. package/src/shade/renderer/postprocess/upscale-dither/fragment_shader_upscale_dither.js +5 -5
  216. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  217. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +339 -341
  218. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
  219. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +114 -109
  220. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
  221. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +118 -115
  222. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  223. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +69 -65
  224. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +722 -722
  225. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
  226. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +1 -9
  227. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
  228. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +1 -6
  229. package/src/shade/renderer/restir/di/graph_restir_di.d.ts.map +1 -1
  230. package/src/shade/renderer/restir/di/graph_restir_di.js +2 -3
  231. package/src/shade/renderer/restir/di/graph_restir_di_denoise.d.ts.map +1 -1
  232. package/src/shade/renderer/restir/di/graph_restir_di_denoise.js +1 -2
  233. package/src/shade/renderer/restir/di/shader_restir_di_denoise.d.ts.map +1 -1
  234. package/src/shade/renderer/restir/di/shader_restir_di_denoise.js +139 -136
  235. package/src/shade/renderer/restir/di/shader_restir_di_resample.d.ts.map +1 -1
  236. package/src/shade/renderer/restir/di/shader_restir_di_resample.js +131 -129
  237. package/src/shade/renderer/restir/di/shader_restir_di_resolve.d.ts.map +1 -1
  238. package/src/shade/renderer/restir/di/shader_restir_di_resolve.js +101 -99
  239. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts.map +1 -1
  240. package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +379 -383
  241. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.d.ts.map +1 -1
  242. package/src/shade/renderer/scene/shader_bvh_extract_instance_leaves.js +147 -144
  243. package/src/shade/renderer/shader/ComputeShader.d.ts +2 -2
  244. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  245. package/src/shade/renderer/shader/ComputeShader.js +14 -17
  246. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts +2 -2
  247. package/src/shade/renderer/shader/pass/RenderPassDescriptor.d.ts.map +1 -1
  248. package/src/shade/renderer/shader/pass/RenderPassDescriptor.js +189 -189
  249. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  250. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +3 -1
  251. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  252. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +14 -18
  253. package/src/shade/renderer/shadow/map/shader/shader_shadowmap_remap_cube_to_octahedral.d.ts.map +1 -1
  254. package/src/shade/renderer/shadow/map/shader/shader_shadowmap_remap_cube_to_octahedral.js +5 -1
  255. package/src/shade/renderer/shadow/ray/shader_shadow_upscale.d.ts.map +1 -1
  256. package/src/shade/renderer/shadow/ray/shader_shadow_upscale.js +3 -1
  257. package/src/shade/renderer/shadow/ray/staged/gen/graph_gen_rays.js +73 -73
  258. package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.d.ts.map +1 -1
  259. package/src/shade/renderer/shadow/ray/staged/gen/shader_generate_rays.js +151 -148
  260. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.d.ts.map +1 -1
  261. package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +4 -2
  262. package/src/shade/renderer/shadow/ray/staged/trace/shader_trace_rays.d.ts.map +1 -1
  263. package/src/shade/renderer/shadow/ray/staged/trace/shader_trace_rays.js +18 -4
  264. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.d.ts.map +1 -1
  265. package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +7 -8
  266. package/src/shade/renderer/shadow/sdf/cascade/shader_build_scene_sdf_f32.d.ts.map +1 -1
  267. package/src/shade/renderer/shadow/sdf/cascade/shader_build_scene_sdf_f32.js +6 -2
  268. package/src/shade/renderer/shadow/sdf/cascade/shader_scene_sdf_debug_viz.d.ts.map +1 -1
  269. package/src/shade/renderer/shadow/sdf/cascade/shader_scene_sdf_debug_viz.js +129 -127
  270. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.d.ts.map +1 -1
  271. package/src/shade/renderer/shadow/sdf/graph_draw_sdf_shadows.js +5 -3
  272. package/src/shade/renderer/texture/virtual/VirtualTextureManager.d.ts.map +1 -1
  273. package/src/shade/renderer/texture/virtual/VirtualTextureManager.js +2 -5
  274. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.d.ts.map +1 -1
  275. package/src/shade/renderer/texture/virtual/build_shader_vt_feedback.js +233 -231
  276. package/src/shade/renderer/volumetrics/graph_build_volumetrics.d.ts.map +1 -1
  277. package/src/shade/renderer/volumetrics/graph_build_volumetrics.js +2 -4
  278. package/src/shade/wgsl/validate_wgsl_source.d.ts.map +1 -1
  279. package/src/shade/wgsl/validate_wgsl_source.js +8 -3
  280. package/src/shade/device/timing/profile/make_profiling_pass_encoder.d.ts +0 -21
  281. package/src/shade/device/timing/profile/make_profiling_pass_encoder.d.ts.map +0 -1
  282. package/src/shade/device/timing/profile/make_profiling_pass_encoder.js +0 -114
  283. package/src/shade/device/timing/profile/parse_workgroup_size.d.ts +0 -20
  284. package/src/shade/device/timing/profile/parse_workgroup_size.d.ts.map +0 -1
  285. 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"}