@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,231 +1,233 @@
1
- import { atomic_u32, f32, u32, vec2u } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
- import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
3
- import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
4
- import { GEOMETRY_ATTRIBUTE_DATA_TYPE } from "../../geometry/GEOMETRY_ATTRIBUTE_DATA_TYPE.js";
5
- import { MESHLET_METADATA_STRUCT } from "../../geometry/meshlet/encoding/MESHLET_METADATA_STRUCT.js";
6
- import {
7
- VIZ_BUFFER_INVALID_MESH_VALUE
8
- } from "../../rasterize/native/viz/VIZ_BUFFER_INVALID_MESH_VALUE.js";
9
- import { MATERIAL_METADATA_STRUCT } from "../../material/MATERIAL_METADATA_STRUCT.js";
10
- import { chunk_scene_database_access } from "../../scene/chunk_scene_database_access.js";
11
- import { RENDER_GLOBAL_MIP_BIAS } from "../../postprocess/taa/RENDER_GLOBAL_MIP_BIAS.js";
12
- import { chunk_barycentric_full } from "../../shader/chunk/geometry/triangle/chunk_barycentric_full.js";
13
- import { chunk_barycentric_interpolate_uv } from "../../shader/chunk/geometry/triangle/chunk_barycentric_interpolate_uv.js";
14
- import { chunk_decode_meshlet_element } from "../../shader/chunk/geometry/meshlet/chunk_decode_meshlet_element.js";
15
- import {
16
- chunk_read_meshlet_triangle_vertices
17
- } from "../../shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_vertices.js";
18
- import { chunk_hash_lowbias32 } from "../../shader/chunk/random/chunk_hash_lowbias32.js";
19
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
20
- import { ComputeShader } from "../../shader/ComputeShader.js";
21
- import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
22
- import { VIEW_UNIFORM_STRUCT } from "../../view/VIEW_UNIFORM_STRUCT.js";
23
- import { chunk_vt_request_key } from "./chunk_vt_request_key.js";
24
- import { VT_STACK_ID_INVALID } from "./VT_CONSTANTS.js";
25
- import { VT_STACK_INFO_STRUCT } from "./VT_STACK_INFO_STRUCT.js";
26
-
27
- /**
28
- * Uniform parameters of the feedback pass.
29
- *
30
- * `stride` — the pass samples one pixel per stride×stride block;
31
- * `jitter` — which pixel of the block this frame (cycled by the manager so
32
- * coverage integrates to every pixel over stride² frames);
33
- * `mip_bias` — added to the requested LOD; carries the residency
34
- * (over-subscription) bias so pressure degrades to blur instead of thrash.
35
- */
36
- export const VT_FEEDBACK_PARAMS_STRUCT = WebGPUStruct.from({
37
- stride: u32,
38
- jitter: vec2u,
39
- mip_bias: f32,
40
- }, "VTFeedbackParams").pack();
41
-
42
- /**
43
- * Matches the fragment_gbuffer derivative bias so feedback requests the mips
44
- * the material pass actually samples.
45
- * @type {number}
46
- */
47
- const MIP_DERIVATIVE_BIAS = 1 / (1 - RENDER_GLOBAL_MIP_BIAS);
48
-
49
- export const VT_FEEDBACK_WORKGROUP_SIZE = 8;
50
-
51
- /**
52
- * Builds the feedback compute shader: one thread per sampled pixel, reading
53
- * the visibility buffer and reproducing the material pass's UV + analytic
54
- * gradient math (vertex pulling + perspective-correct barycentric
55
- * derivatives), then inserting the touched (stack, mip, page) key into a
56
- * global hash set of unique requests.
57
- *
58
- * This is the "no second geometry pass" property: the viz buffer already
59
- * identifies the triangle per pixel, so usage detection is a bounded-cost
60
- * screen-space compute pass regardless of scene complexity, shared by every
61
- * virtual texture in the frame.
62
- *
63
- * The hash set is insert-only and cleared each frame; the CPU reads the raw
64
- * table back and treats presence as "touched this frame" — both residency
65
- * touches (LRU) and misses (load requests) fall out of the same data.
66
- *
67
- * @param {Object} config
68
- * @param {CodeChunk} config.chunk_vt_lookup from {@link build_chunk_vt_lookup}
69
- * @param {number} config.hash_capacity power of two
70
- * @returns {ComputeShader}
71
- */
72
- export function build_shader_vt_feedback({ chunk_vt_lookup, hash_capacity }) {
73
-
74
- const resources = new ShaderResourceSetDescriptor();
75
-
76
- resources.createGroup()
77
- .addTexture("viz_buffer_triangle", "uint")
78
- .addTexture("viz_buffer_mesh", "uint")
79
- .addUniform("view", VIEW_UNIFORM_STRUCT)
80
- .addUniform("vt_params", VT_FEEDBACK_PARAMS_STRUCT)
81
- .addStorageBuffer("scene_database", WebGPUArray.from(u32))
82
- .addStorageBuffer("meshlet_metadata", WebGPUArray.from(MESHLET_METADATA_STRUCT))
83
- .addStorageBuffer("meshlet_data", GEOMETRY_ATTRIBUTE_DATA_TYPE)
84
- .addStorageBuffer("material_metadata", WebGPUArray.from(MATERIAL_METADATA_STRUCT))
85
- .addStorageBuffer("vt_stacks", WebGPUArray.from(VT_STACK_INFO_STRUCT))
86
- .addStorageBuffer("vt_requests", WebGPUArray.from(atomic_u32), true);
87
-
88
- const body = CodeChunk.from(
89
- //language=WGSL
90
- `
91
- const VT_HASH_CAPACITY_MASK: u32 = ${hash_capacity - 1}u;
92
- const VT_HASH_MAX_PROBES: u32 = 32u;
93
-
94
- const MIP_BIAS: f32 = ${MIP_DERIVATIVE_BIAS.toFixed(8)};
95
-
96
- // Insert-only open-addressing hash set. Values are stored as key+1 so a
97
- // zero-cleared buffer means "all empty" (same conventions as
98
- // common/hash_table, which is the CPU-build/GPU-read counterpart of this
99
- // GPU-insert/CPU-read set; see also the SHARC hash map for the bucketed
100
- // key->index variant).
101
- //
102
- // Forward-progress note: this loop never waits on another invocation's
103
- // progress. The atomicCompareExchangeWeak retry only re-tests a *local*
104
- // spurious failure, every iteration consumes the shared probe budget, and
105
- // the loop is hard-bounded at VT_HASH_MAX_PROBES regardless of what other
106
- // threads do. On exhaustion the fallback is to DROP the request benign,
107
- // feedback re-emits it next frame. Contrast with the decoupled-lookback
108
- // spin in common/prefix_sum/v1/shader_prefix_scan_csdldf.js, where the
109
- // awaited value is required for correctness and the bounded spin
110
- // (MAX_SPIN_COUNT) must therefore pair with a local recompute fallback.
111
- fn vt_request_insert(key: u32) {
112
- let stored = key + 1u;
113
-
114
- var h = hash_lowbias32(key) & VT_HASH_CAPACITY_MASK;
115
-
116
- for (var i = 0u; i < VT_HASH_MAX_PROBES; i++) {
117
- let existing = atomicLoad(&vt_requests[h]);
118
-
119
- if (existing == stored) {
120
- return;
121
- }
122
-
123
- if (existing == 0u) {
124
- let r = atomicCompareExchangeWeak(&vt_requests[h], 0u, stored);
125
-
126
- if (r.exchanged || r.old_value == stored) {
127
- return;
128
- }
129
-
130
- if (r.old_value == 0u) {
131
- // spurious weak failure — retry the same slot
132
- continue;
133
- }
134
- }
135
-
136
- h = (h + 1u) & VT_HASH_CAPACITY_MASK;
137
- }
138
- }
139
-
140
- @compute @workgroup_size(${VT_FEEDBACK_WORKGROUP_SIZE}, ${VT_FEEDBACK_WORKGROUP_SIZE}, 1)
141
- fn main(
142
- @builtin(global_invocation_id) gid: vec3<u32>,
143
- ) {
144
- let pixel = gid.xy * vt_params.stride + vt_params.jitter;
145
-
146
- if (pixel.x >= view.width || pixel.y >= view.height) {
147
- return;
148
- }
149
-
150
- let mesh_index = textureLoad(viz_buffer_mesh, vec2<i32>(pixel), 0).r;
151
-
152
- if (mesh_index == ${VIZ_BUFFER_INVALID_MESH_VALUE}u) {
153
- return;
154
- }
155
-
156
- let mesh = scene_read_mesh(&scene_database, mesh_index);
157
-
158
- let stack_id = material_metadata[mesh.material].vt_stack;
159
-
160
- if (stack_id == ${VT_STACK_ID_INVALID}u) {
161
- return;
162
- }
163
-
164
- let info = vt_stacks[stack_id];
165
-
166
- // ── UV + gradients, mirroring fragment_gbuffer ──────────────────
167
- let encoded_meshlet_triangle = textureLoad(viz_buffer_triangle, vec2<i32>(pixel), 0).r;
168
-
169
- let decoded = decode_meshlet_element(encoded_meshlet_triangle);
170
- let meshlet_id = decoded[0];
171
- let meshlet_triangle_id = decoded[1];
172
-
173
- let node = scene_read_node(&scene_database, mesh.node);
174
-
175
- let triangle = read_meshlet_triangle_vertices(meshlet_id, meshlet_triangle_id);
176
-
177
- let mesh_transform = node.global;
178
-
179
- let p0 = view.projection_matrix * (mesh_transform * vec4<f32>(triangle.a.position, 1.0));
180
- let p1 = view.projection_matrix * (mesh_transform * vec4<f32>(triangle.b.position, 1.0));
181
- let p2 = view.projection_matrix * (mesh_transform * vec4<f32>(triangle.c.position, 1.0));
182
-
183
- let pixel_center = vec2<f32>(pixel) + 0.5;
184
-
185
- let barycentric = barycentric_full(p0, p1, p2, pixel_center);
186
-
187
- var uv0 = triangle.a.uv;
188
- var uv1 = triangle.b.uv;
189
- var uv2 = triangle.c.uv;
190
-
191
- if ((info.flags & VT_STACK_FLAG_UV_SET_1) != 0u) {
192
- uv0 = triangle.a.uv1;
193
- uv1 = triangle.b.uv1;
194
- uv2 = triangle.c.uv1;
195
- }
196
-
197
- var uv_info = barycentric_interpolate_uv(barycentric, uv0, uv1, uv2);
198
-
199
- let uv_derivative_bias = MIP_BIAS / view.upscale_ratio;
200
-
201
- uv_info.ddx *= uv_derivative_bias.x;
202
- uv_info.ddy *= uv_derivative_bias.y;
203
-
204
- // ── request ─────────────────────────────────────────────────────
205
- let uv_wrapped = vt_stack_wrap_uv(uv_info.uv, info.flags);
206
-
207
- let mip = vt_mip_select(info, uv_info.ddx, uv_info.ddy, vt_params.mip_bias);
208
-
209
- let page = vt_page_coord(info, uv_wrapped, mip);
210
-
211
- vt_request_insert(vt_request_key_pack(stack_id, mip, page));
212
- }
213
- `,
214
- [
215
- chunk_vt_lookup,
216
- chunk_vt_request_key,
217
- chunk_hash_lowbias32,
218
- chunk_scene_database_access,
219
- chunk_decode_meshlet_element,
220
- chunk_read_meshlet_triangle_vertices,
221
- chunk_barycentric_full,
222
- chunk_barycentric_interpolate_uv,
223
- ]
224
- );
225
-
226
- return ComputeShader.from({
227
- label: 'vt/feedback',
228
- body,
229
- resources,
230
- });
231
- }
1
+ import { atomic_u32, f32, u32, vec2u } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
+ import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
3
+ import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
4
+ import { GEOMETRY_ATTRIBUTE_DATA_TYPE } from "../../geometry/GEOMETRY_ATTRIBUTE_DATA_TYPE.js";
5
+ import { MESHLET_METADATA_STRUCT } from "../../geometry/meshlet/encoding/MESHLET_METADATA_STRUCT.js";
6
+ import {
7
+ VIZ_BUFFER_INVALID_MESH_VALUE
8
+ } from "../../rasterize/native/viz/VIZ_BUFFER_INVALID_MESH_VALUE.js";
9
+ import { MATERIAL_METADATA_STRUCT } from "../../material/MATERIAL_METADATA_STRUCT.js";
10
+ import { chunk_scene_database_access } from "../../scene/chunk_scene_database_access.js";
11
+ import { RENDER_GLOBAL_MIP_BIAS } from "../../postprocess/taa/RENDER_GLOBAL_MIP_BIAS.js";
12
+ import { chunk_barycentric_full } from "../../shader/chunk/geometry/triangle/chunk_barycentric_full.js";
13
+ import { chunk_barycentric_interpolate_uv } from "../../shader/chunk/geometry/triangle/chunk_barycentric_interpolate_uv.js";
14
+ import { chunk_decode_meshlet_element } from "../../shader/chunk/geometry/meshlet/chunk_decode_meshlet_element.js";
15
+ import {
16
+ chunk_read_meshlet_triangle_vertices
17
+ } from "../../shader/chunk/geometry/meshlet/chunk_read_meshlet_triangle_vertices.js";
18
+ import { chunk_hash_lowbias32 } from "../../shader/chunk/random/chunk_hash_lowbias32.js";
19
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
20
+ import { ComputeShader } from "../../shader/ComputeShader.js";
21
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
22
+ import { VIEW_UNIFORM_STRUCT } from "../../view/VIEW_UNIFORM_STRUCT.js";
23
+ import { chunk_vt_request_key } from "./chunk_vt_request_key.js";
24
+ import { VT_STACK_ID_INVALID } from "./VT_CONSTANTS.js";
25
+ import { VT_STACK_INFO_STRUCT } from "./VT_STACK_INFO_STRUCT.js";
26
+
27
+ /**
28
+ * Uniform parameters of the feedback pass.
29
+ *
30
+ * `stride` — the pass samples one pixel per stride×stride block;
31
+ * `jitter` — which pixel of the block this frame (cycled by the manager so
32
+ * coverage integrates to every pixel over stride² frames);
33
+ * `mip_bias` — added to the requested LOD; carries the residency
34
+ * (over-subscription) bias so pressure degrades to blur instead of thrash.
35
+ */
36
+ export const VT_FEEDBACK_PARAMS_STRUCT = WebGPUStruct.from({
37
+ stride: u32,
38
+ jitter: vec2u,
39
+ mip_bias: f32,
40
+ }, "VTFeedbackParams").pack();
41
+
42
+ /**
43
+ * Matches the fragment_gbuffer derivative bias so feedback requests the mips
44
+ * the material pass actually samples.
45
+ * @type {number}
46
+ */
47
+ const MIP_DERIVATIVE_BIAS = 1 / (1 - RENDER_GLOBAL_MIP_BIAS);
48
+
49
+ export const VT_FEEDBACK_WORKGROUP_SIZE = 8;
50
+
51
+ /**
52
+ * Builds the feedback compute shader: one thread per sampled pixel, reading
53
+ * the visibility buffer and reproducing the material pass's UV + analytic
54
+ * gradient math (vertex pulling + perspective-correct barycentric
55
+ * derivatives), then inserting the touched (stack, mip, page) key into a
56
+ * global hash set of unique requests.
57
+ *
58
+ * This is the "no second geometry pass" property: the viz buffer already
59
+ * identifies the triangle per pixel, so usage detection is a bounded-cost
60
+ * screen-space compute pass regardless of scene complexity, shared by every
61
+ * virtual texture in the frame.
62
+ *
63
+ * The hash set is insert-only and cleared each frame; the CPU reads the raw
64
+ * table back and treats presence as "touched this frame" — both residency
65
+ * touches (LRU) and misses (load requests) fall out of the same data.
66
+ *
67
+ * @param {Object} config
68
+ * @param {CodeChunk} config.chunk_vt_lookup from {@link build_chunk_vt_lookup}
69
+ * @param {number} config.hash_capacity power of two
70
+ * @returns {ComputeShader}
71
+ */
72
+ export function build_shader_vt_feedback({ chunk_vt_lookup, hash_capacity }) {
73
+
74
+ const resources = new ShaderResourceSetDescriptor();
75
+
76
+ // per-dispatch, 16 bytes, read-only: immediate data rather than a uniform buffer
77
+ resources.setImmediate("vt_params", VT_FEEDBACK_PARAMS_STRUCT);
78
+
79
+ resources.createGroup()
80
+ .addTexture("viz_buffer_triangle", "uint")
81
+ .addTexture("viz_buffer_mesh", "uint")
82
+ .addUniform("view", VIEW_UNIFORM_STRUCT)
83
+ .addStorageBuffer("scene_database", WebGPUArray.from(u32))
84
+ .addStorageBuffer("meshlet_metadata", WebGPUArray.from(MESHLET_METADATA_STRUCT))
85
+ .addStorageBuffer("meshlet_data", GEOMETRY_ATTRIBUTE_DATA_TYPE)
86
+ .addStorageBuffer("material_metadata", WebGPUArray.from(MATERIAL_METADATA_STRUCT))
87
+ .addStorageBuffer("vt_stacks", WebGPUArray.from(VT_STACK_INFO_STRUCT))
88
+ .addStorageBuffer("vt_requests", WebGPUArray.from(atomic_u32), true);
89
+
90
+ const body = CodeChunk.from(
91
+ //language=WGSL
92
+ `
93
+ const VT_HASH_CAPACITY_MASK: u32 = ${hash_capacity - 1}u;
94
+ const VT_HASH_MAX_PROBES: u32 = 32u;
95
+
96
+ const MIP_BIAS: f32 = ${MIP_DERIVATIVE_BIAS.toFixed(8)};
97
+
98
+ // Insert-only open-addressing hash set. Values are stored as key+1 so a
99
+ // zero-cleared buffer means "all empty" (same conventions as
100
+ // common/hash_table, which is the CPU-build/GPU-read counterpart of this
101
+ // GPU-insert/CPU-read set; see also the SHARC hash map for the bucketed
102
+ // key->index variant).
103
+ //
104
+ // Forward-progress note: this loop never waits on another invocation's
105
+ // progress. The atomicCompareExchangeWeak retry only re-tests a *local*
106
+ // spurious failure, every iteration consumes the shared probe budget, and
107
+ // the loop is hard-bounded at VT_HASH_MAX_PROBES regardless of what other
108
+ // threads do. On exhaustion the fallback is to DROP the request — benign,
109
+ // feedback re-emits it next frame. Contrast with the decoupled-lookback
110
+ // spin in common/prefix_sum/v1/shader_prefix_scan_csdldf.js, where the
111
+ // awaited value is required for correctness and the bounded spin
112
+ // (MAX_SPIN_COUNT) must therefore pair with a local recompute fallback.
113
+ fn vt_request_insert(key: u32) {
114
+ let stored = key + 1u;
115
+
116
+ var h = hash_lowbias32(key) & VT_HASH_CAPACITY_MASK;
117
+
118
+ for (var i = 0u; i < VT_HASH_MAX_PROBES; i++) {
119
+ let existing = atomicLoad(&vt_requests[h]);
120
+
121
+ if (existing == stored) {
122
+ return;
123
+ }
124
+
125
+ if (existing == 0u) {
126
+ let r = atomicCompareExchangeWeak(&vt_requests[h], 0u, stored);
127
+
128
+ if (r.exchanged || r.old_value == stored) {
129
+ return;
130
+ }
131
+
132
+ if (r.old_value == 0u) {
133
+ // spurious weak failure — retry the same slot
134
+ continue;
135
+ }
136
+ }
137
+
138
+ h = (h + 1u) & VT_HASH_CAPACITY_MASK;
139
+ }
140
+ }
141
+
142
+ @compute @workgroup_size(${VT_FEEDBACK_WORKGROUP_SIZE}, ${VT_FEEDBACK_WORKGROUP_SIZE}, 1)
143
+ fn main(
144
+ @builtin(global_invocation_id) gid: vec3<u32>,
145
+ ) {
146
+ let pixel = gid.xy * vt_params.stride + vt_params.jitter;
147
+
148
+ if (pixel.x >= view.width || pixel.y >= view.height) {
149
+ return;
150
+ }
151
+
152
+ let mesh_index = textureLoad(viz_buffer_mesh, vec2<i32>(pixel), 0).r;
153
+
154
+ if (mesh_index == ${VIZ_BUFFER_INVALID_MESH_VALUE}u) {
155
+ return;
156
+ }
157
+
158
+ let mesh = scene_read_mesh(&scene_database, mesh_index);
159
+
160
+ let stack_id = material_metadata[mesh.material].vt_stack;
161
+
162
+ if (stack_id == ${VT_STACK_ID_INVALID}u) {
163
+ return;
164
+ }
165
+
166
+ let info = vt_stacks[stack_id];
167
+
168
+ // ── UV + gradients, mirroring fragment_gbuffer ──────────────────
169
+ let encoded_meshlet_triangle = textureLoad(viz_buffer_triangle, vec2<i32>(pixel), 0).r;
170
+
171
+ let decoded = decode_meshlet_element(encoded_meshlet_triangle);
172
+ let meshlet_id = decoded[0];
173
+ let meshlet_triangle_id = decoded[1];
174
+
175
+ let node = scene_read_node(&scene_database, mesh.node);
176
+
177
+ let triangle = read_meshlet_triangle_vertices(meshlet_id, meshlet_triangle_id);
178
+
179
+ let mesh_transform = node.global;
180
+
181
+ let p0 = view.projection_matrix * (mesh_transform * vec4<f32>(triangle.a.position, 1.0));
182
+ let p1 = view.projection_matrix * (mesh_transform * vec4<f32>(triangle.b.position, 1.0));
183
+ let p2 = view.projection_matrix * (mesh_transform * vec4<f32>(triangle.c.position, 1.0));
184
+
185
+ let pixel_center = vec2<f32>(pixel) + 0.5;
186
+
187
+ let barycentric = barycentric_full(p0, p1, p2, pixel_center);
188
+
189
+ var uv0 = triangle.a.uv;
190
+ var uv1 = triangle.b.uv;
191
+ var uv2 = triangle.c.uv;
192
+
193
+ if ((info.flags & VT_STACK_FLAG_UV_SET_1) != 0u) {
194
+ uv0 = triangle.a.uv1;
195
+ uv1 = triangle.b.uv1;
196
+ uv2 = triangle.c.uv1;
197
+ }
198
+
199
+ var uv_info = barycentric_interpolate_uv(barycentric, uv0, uv1, uv2);
200
+
201
+ let uv_derivative_bias = MIP_BIAS / view.upscale_ratio;
202
+
203
+ uv_info.ddx *= uv_derivative_bias.x;
204
+ uv_info.ddy *= uv_derivative_bias.y;
205
+
206
+ // ── request ─────────────────────────────────────────────────────
207
+ let uv_wrapped = vt_stack_wrap_uv(uv_info.uv, info.flags);
208
+
209
+ let mip = vt_mip_select(info, uv_info.ddx, uv_info.ddy, vt_params.mip_bias);
210
+
211
+ let page = vt_page_coord(info, uv_wrapped, mip);
212
+
213
+ vt_request_insert(vt_request_key_pack(stack_id, mip, page));
214
+ }
215
+ `,
216
+ [
217
+ chunk_vt_lookup,
218
+ chunk_vt_request_key,
219
+ chunk_hash_lowbias32,
220
+ chunk_scene_database_access,
221
+ chunk_decode_meshlet_element,
222
+ chunk_read_meshlet_triangle_vertices,
223
+ chunk_barycentric_full,
224
+ chunk_barycentric_interpolate_uv,
225
+ ]
226
+ );
227
+
228
+ return ComputeShader.from({
229
+ label: 'vt/feedback',
230
+ body,
231
+ resources,
232
+ });
233
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"graph_build_volumetrics.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/volumetrics/graph_build_volumetrics.js"],"names":[],"mappings":"AAyBA;;;;;;;GAOG;AACH,4DAFa;IAAC,iBAAiB,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAC,CAgEjE;AAqTD;;;;;;;;;;;;;;;;;;GAkBG;AACH;;;;;EAwKC"}
1
+ {"version":3,"file":"graph_build_volumetrics.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/volumetrics/graph_build_volumetrics.js"],"names":[],"mappings":"AAyBA;;;;;;;GAOG;AACH,4DAFa;IAAC,iBAAiB,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAC,CA8DjE;AAqTD;;;;;;;;;;;;;;;;;;GAkBG;AACH;;;;;EAwKC"}
@@ -43,14 +43,12 @@ export function graph_integrate_sky({ graph }) {
43
43
 
44
44
  const encoder = context.encoder;
45
45
 
46
- const settings_type = shader_transmittance_lut.descriptor.resources.getResourceByName("settings").buffer_type;
47
-
48
- const settings = encoder.allocateTransientValueBuffer(settings_type, {
46
+ const settings = {
49
47
  steps: 40,
50
48
  // taken off the target being drawn into, so the generator cannot be told a size
51
49
  // the texture does not have
52
50
  resolution: [output.width, output.height],
53
- });
51
+ };
54
52
 
55
53
  shader_transmittance_lut.draw({
56
54
  encoder: encoder,
@@ -1 +1 @@
1
- {"version":3,"file":"validate_wgsl_source.d.ts","sourceRoot":"","sources":["../../../../src/shade/wgsl/validate_wgsl_source.js"],"names":[],"mappings":"AA8JA;;;;;;GAMG;AACH,6CAJW,MAAM,UACN,OAAO,iBAAiB,EAAE,UAAU,GAClC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAwJ7D"}
1
+ {"version":3,"file":"validate_wgsl_source.d.ts","sourceRoot":"","sources":["../../../../src/shade/wgsl/validate_wgsl_source.js"],"names":[],"mappings":"AAmKA;;;;;;GAMG;AACH,6CAJW,MAAM,UACN,OAAO,iBAAiB,EAAE,UAAU,GAClC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAwJ7D"}
@@ -37,7 +37,10 @@ const WGSL_BUILTIN_NAMES = new Set([
37
37
  'vec2f', 'vec3f', 'vec4f', 'vec2h', 'vec3h', 'vec4h',
38
38
  'mat2x2', 'mat2x3', 'mat2x4', 'mat3x2', 'mat3x3', 'mat3x4', 'mat4x2', 'mat4x3', 'mat4x4',
39
39
  'mat2x2f', 'mat2x3f', 'mat2x4f', 'mat3x2f', 'mat3x3f', 'mat3x4f', 'mat4x2f', 'mat4x3f', 'mat4x4f',
40
+ 'mat2x2h', 'mat2x3h', 'mat2x4h', 'mat3x2h', 'mat3x3h', 'mat3x4h', 'mat4x2h', 'mat4x3h', 'mat4x4h',
40
41
  'array', 'bitcast',
42
+ // array
43
+ 'arrayLength',
41
44
  // numeric
42
45
  'abs', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atanh', 'atan2', 'ceil', 'clamp',
43
46
  'cos', 'cosh', 'countLeadingZeros', 'countOneBits', 'countTrailingZeros', 'cross',
@@ -71,9 +74,11 @@ const WGSL_BUILTIN_NAMES = new Set([
71
74
  'subgroupAdd', 'subgroupExclusiveAdd', 'subgroupInclusiveAdd', 'subgroupAll',
72
75
  'subgroupAnd', 'subgroupAny', 'subgroupBallot', 'subgroupBroadcast',
73
76
  'subgroupBroadcastFirst', 'subgroupElect', 'subgroupMax', 'subgroupMin', 'subgroupMul',
74
- 'subgroupOr', 'subgroupShuffle', 'subgroupShuffleDown', 'subgroupShuffleUp',
75
- 'subgroupShuffleXor', 'subgroupXor', 'quadBroadcast', 'quadSwapDiagonal', 'quadSwapX',
76
- 'quadSwapY',
77
+ 'subgroupExclusiveMul', 'subgroupInclusiveMul', 'subgroupOr', 'subgroupShuffle',
78
+ 'subgroupShuffleDown', 'subgroupShuffleUp', 'subgroupShuffleXor', 'subgroupXor',
79
+ 'quadBroadcast', 'quadSwapDiagonal', 'quadSwapX', 'quadSwapY',
80
+ // buffer views
81
+ 'bufferView', 'bufferArrayView', 'bufferLength',
77
82
  ]);
78
83
 
79
84
  const SWIZZLE_COMPONENTS = /^[xyzwrgba]+$/;
@@ -1,21 +0,0 @@
1
- /**
2
- * Wrap a pass encoder so that the work encoded into it is recorded.
3
- *
4
- * **A `Proxy` rather than a hand-written forwarder.** A pass encoder has around twenty methods and
5
- * WebGPU keeps adding them; a forwarding class that misses one does not fail loudly, it silently
6
- * drops a call that the renderer needed, and only while profiling — the worst possible shape for a
7
- * bug. Everything not named below is forwarded untouched, including anything added later.
8
- *
9
- * The cost is a `Proxy` on the hot encoding path, which is why this exists only while a capture is
10
- * running at {@link GPUProfileLevel.WORKLOAD} or above. Bound methods are cached per encoder so the
11
- * `get` trap does not allocate a new closure on every `setBindGroup`.
12
- *
13
- * @param {GPUComputePassEncoder|GPURenderPassEncoder} encoder
14
- * @param {GPUProfileWork} work accumulated into
15
- * @returns {GPUComputePassEncoder|GPURenderPassEncoder}
16
- *
17
- * @author Alex Goldring
18
- * @copyright Company Named Limited (c) 2026
19
- */
20
- export function make_profiling_pass_encoder(encoder: GPUComputePassEncoder | GPURenderPassEncoder, work: GPUProfileWork): GPUComputePassEncoder | GPURenderPassEncoder;
21
- //# sourceMappingURL=make_profiling_pass_encoder.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"make_profiling_pass_encoder.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/device/timing/profile/make_profiling_pass_encoder.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AACH,qDAPW,4CAA0C,yBAExC,4CAA0C,CAiGtD"}