@forgeax/engine-render 0.1.32 → 0.1.34

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 (624) hide show
  1. package/README.md +1374 -142
  2. package/dist/assembly/analytic-fog-registration.d.ts +3 -0
  3. package/dist/assembly/analytic-fog-registration.d.ts.map +1 -0
  4. package/dist/assembly/backend-contract.d.ts +2 -0
  5. package/dist/assembly/backend-contract.d.ts.map +1 -1
  6. package/dist/assembly/barrel-distortion-inspection.d.ts +3 -0
  7. package/dist/assembly/barrel-distortion-inspection.d.ts.map +1 -0
  8. package/dist/assembly/canvas-draw-guard.d.ts +3 -0
  9. package/dist/assembly/canvas-draw-guard.d.ts.map +1 -0
  10. package/dist/assembly/cloud-shadow-entry.d.ts +4 -0
  11. package/dist/assembly/cloud-shadow-entry.d.ts.map +1 -0
  12. package/dist/assembly/dynamic-geometry-host.d.ts +4 -1
  13. package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -1
  14. package/dist/assembly/dynamic-geometry-runtime.d.ts +1 -1
  15. package/dist/assembly/dynamic-geometry-runtime.d.ts.map +1 -1
  16. package/dist/assembly/factory.d.ts +1 -1
  17. package/dist/assembly/factory.d.ts.map +1 -1
  18. package/dist/assembly/fxaa-registration.d.ts +4 -0
  19. package/dist/assembly/fxaa-registration.d.ts.map +1 -0
  20. package/dist/assembly/host-contract.d.ts +3 -3
  21. package/dist/assembly/host-contract.d.ts.map +1 -1
  22. package/dist/assembly/lod-observation.d.ts +4 -0
  23. package/dist/assembly/lod-observation.d.ts.map +1 -0
  24. package/dist/assembly/material/assembly.d.ts.map +1 -1
  25. package/dist/assembly/material/pipeline-helpers.d.ts +5 -0
  26. package/dist/assembly/material/pipeline-helpers.d.ts.map +1 -1
  27. package/dist/assembly/material-shader-policy.d.ts +16 -2
  28. package/dist/assembly/material-shader-policy.d.ts.map +1 -1
  29. package/dist/assembly/material-shader-prewarm.d.ts.map +1 -1
  30. package/dist/assembly/motion-blur-registration.d.ts +3 -0
  31. package/dist/assembly/motion-blur-registration.d.ts.map +1 -0
  32. package/dist/assembly/recovery/device-loss-fanout.d.ts.map +1 -1
  33. package/dist/assembly/recovery/renderer-recover.d.ts +2 -0
  34. package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
  35. package/dist/assembly/render-feature-post-processes.d.ts +6 -0
  36. package/dist/assembly/render-feature-post-processes.d.ts.map +1 -0
  37. package/dist/assembly/renderer-facade.d.ts.map +1 -1
  38. package/dist/assembly/renderer-feature-inspection.d.ts +1 -1
  39. package/dist/assembly/renderer-feature-inspection.d.ts.map +1 -1
  40. package/dist/assembly/renderer-frame-transaction.d.ts +12 -0
  41. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
  42. package/dist/assembly/renderer-inspection.d.ts +11 -0
  43. package/dist/assembly/renderer-inspection.d.ts.map +1 -1
  44. package/dist/assembly/temporal-post-process-prewarm.d.ts +13 -0
  45. package/dist/assembly/temporal-post-process-prewarm.d.ts.map +1 -0
  46. package/dist/assembly/webgpu-pbr-ready.d.ts +1 -0
  47. package/dist/assembly/webgpu-pbr-ready.d.ts.map +1 -1
  48. package/dist/assembly/webgpu-ready-contract.d.ts +4 -3
  49. package/dist/assembly/webgpu-ready-contract.d.ts.map +1 -1
  50. package/dist/assembly/webgpu-ready-per-pass.d.ts +39 -0
  51. package/dist/assembly/webgpu-ready-per-pass.d.ts.map +1 -0
  52. package/dist/assembly/webgpu-ready.d.ts +2 -2
  53. package/dist/assembly/webgpu-ready.d.ts.map +1 -1
  54. package/dist/assembly/webgpu-renderer-bootstrap.d.ts.map +1 -1
  55. package/dist/assembly/webgpu-renderer-observation-owner.d.ts +35 -0
  56. package/dist/assembly/webgpu-renderer-observation-owner.d.ts.map +1 -0
  57. package/dist/assembly/webgpu-renderer.d.ts +1 -1
  58. package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
  59. package/dist/authoring.mjs +1 -1
  60. package/dist/barrel-distortion.d.ts +47 -0
  61. package/dist/barrel-distortion.d.ts.map +1 -0
  62. package/dist/bloom-admission.d.ts +13 -0
  63. package/dist/bloom-admission.d.ts.map +1 -0
  64. package/dist/{chunk-PA5DRJNI.mjs → chunk-ELJFJ2BU.mjs} +2 -2
  65. package/dist/chunk-ELJFJ2BU.mjs.map +1 -0
  66. package/dist/{chunk-JCIRYQ4V.mjs → chunk-HEB564WF.mjs} +10 -4
  67. package/dist/chunk-HEB564WF.mjs.map +1 -0
  68. package/dist/{chunk-JRIPCMYC.mjs → chunk-MKDIT2EM.mjs} +1584 -375
  69. package/dist/chunk-MKDIT2EM.mjs.map +1 -0
  70. package/dist/{chunk-S665NJNF.mjs → chunk-OCDLEI6I.mjs} +3 -3
  71. package/dist/{chunk-S665NJNF.mjs.map → chunk-OCDLEI6I.mjs.map} +1 -1
  72. package/dist/chunk-ODZWR6JQ.mjs +4927 -0
  73. package/dist/chunk-ODZWR6JQ.mjs.map +1 -0
  74. package/dist/{chunk-DRR7D3KX.mjs → chunk-SHFUFJ5N.mjs} +192 -18
  75. package/dist/chunk-SHFUFJ5N.mjs.map +1 -0
  76. package/dist/{chunk-4NNZQCL3.mjs → chunk-UI5SFODX.mjs} +223 -277
  77. package/dist/chunk-UI5SFODX.mjs.map +1 -0
  78. package/dist/{chunk-GWCEMDVR.mjs → chunk-UINHLCZA.mjs} +787 -80
  79. package/dist/chunk-UINHLCZA.mjs.map +1 -0
  80. package/dist/{chunk-6TFBXLRJ.mjs → chunk-WEX45HKH.mjs} +222 -337
  81. package/dist/chunk-WEX45HKH.mjs.map +1 -0
  82. package/dist/cloud/density.d.ts +55 -0
  83. package/dist/cloud/density.d.ts.map +1 -0
  84. package/dist/cloud/extract.d.ts +25 -0
  85. package/dist/cloud/extract.d.ts.map +1 -0
  86. package/dist/cloud/feature.d.ts +57 -0
  87. package/dist/cloud/feature.d.ts.map +1 -0
  88. package/dist/cloud/frame-context.d.ts +8 -0
  89. package/dist/cloud/frame-context.d.ts.map +1 -0
  90. package/dist/cloud/inspection.d.ts +59 -0
  91. package/dist/cloud/inspection.d.ts.map +1 -0
  92. package/dist/cloud/optics.d.ts +56 -0
  93. package/dist/cloud/optics.d.ts.map +1 -0
  94. package/dist/cloud/parameters.d.ts +73 -0
  95. package/dist/cloud/parameters.d.ts.map +1 -0
  96. package/dist/cloud/resources.d.ts +60 -0
  97. package/dist/cloud/resources.d.ts.map +1 -0
  98. package/dist/cloud/shadow.d.ts +42 -0
  99. package/dist/cloud/shadow.d.ts.map +1 -0
  100. package/dist/cloud/temporal.d.ts +74 -0
  101. package/dist/cloud/temporal.d.ts.map +1 -0
  102. package/dist/components/atmosphere.d.ts +2 -0
  103. package/dist/components/atmosphere.d.ts.map +1 -1
  104. package/dist/components/barrel-distortion.d.ts +13 -0
  105. package/dist/components/barrel-distortion.d.ts.map +1 -0
  106. package/dist/components/camera.d.ts +20 -4
  107. package/dist/components/camera.d.ts.map +1 -1
  108. package/dist/components/cloud-layer.d.ts +29 -0
  109. package/dist/components/cloud-layer.d.ts.map +1 -0
  110. package/dist/components/index.d.ts +2 -0
  111. package/dist/components/index.d.ts.map +1 -1
  112. package/dist/components/instances.d.ts +20 -6
  113. package/dist/components/instances.d.ts.map +1 -1
  114. package/dist/components/mesh-filter.d.ts +6 -5
  115. package/dist/components/mesh-filter.d.ts.map +1 -1
  116. package/dist/components/motion-blur.d.ts +1 -0
  117. package/dist/components/motion-blur.d.ts.map +1 -1
  118. package/dist/construct-renderer.d.ts +1 -1
  119. package/dist/construct-renderer.d.ts.map +1 -1
  120. package/dist/construct-renderer.mjs +9751 -3528
  121. package/dist/construct-renderer.mjs.map +1 -1
  122. package/dist/device/gpu-residency.d.ts +6 -0
  123. package/dist/device/gpu-residency.d.ts.map +1 -1
  124. package/dist/dynamic-geometry.d.ts +5 -1
  125. package/dist/dynamic-geometry.d.ts.map +1 -1
  126. package/dist/environment/analytic-fog.d.ts +6 -0
  127. package/dist/environment/analytic-fog.d.ts.map +1 -0
  128. package/dist/errors/cloud.d.ts +59 -0
  129. package/dist/errors/cloud.d.ts.map +1 -0
  130. package/dist/errors/render.d.ts +23 -5
  131. package/dist/errors/render.d.ts.map +1 -1
  132. package/dist/examples/single-layer-medium-surface.d.ts +47 -0
  133. package/dist/examples/single-layer-medium-surface.d.ts.map +1 -0
  134. package/dist/extract/camera.d.ts.map +1 -1
  135. package/dist/extract/contracts.d.ts +12 -1
  136. package/dist/extract/contracts.d.ts.map +1 -1
  137. package/dist/extract/environment.d.ts +2 -0
  138. package/dist/extract/environment.d.ts.map +1 -1
  139. package/dist/features/barrel-distortion.d.ts +29 -0
  140. package/dist/features/barrel-distortion.d.ts.map +1 -0
  141. package/dist/features/error-reporting.d.ts +17 -0
  142. package/dist/features/error-reporting.d.ts.map +1 -0
  143. package/dist/features/host.d.ts +15 -0
  144. package/dist/features/host.d.ts.map +1 -1
  145. package/dist/features/motion-blur/motion-blur-feature.d.ts +20 -2
  146. package/dist/features/motion-blur/motion-blur-feature.d.ts.map +1 -1
  147. package/dist/features/motion-blur/motion-blur-params.d.ts +21 -0
  148. package/dist/features/motion-blur/motion-blur-params.d.ts.map +1 -1
  149. package/dist/features/motion-blur/motion-blur-runtime.d.ts +54 -0
  150. package/dist/features/motion-blur/motion-blur-runtime.d.ts.map +1 -0
  151. package/dist/features/plan.d.ts +15 -4
  152. package/dist/features/plan.d.ts.map +1 -1
  153. package/dist/features/prepared-gpu-work.d.ts +9 -5
  154. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  155. package/dist/features/render-graph-compute.d.ts.map +1 -1
  156. package/dist/features/render-graph-contribution.d.ts +5 -0
  157. package/dist/features/render-graph-contribution.d.ts.map +1 -1
  158. package/dist/features/render-graph-raster.d.ts +1 -0
  159. package/dist/features/render-graph-raster.d.ts.map +1 -1
  160. package/dist/features/targets.d.ts +2 -0
  161. package/dist/features/targets.d.ts.map +1 -1
  162. package/dist/features/types.d.ts +44 -0
  163. package/dist/features/types.d.ts.map +1 -1
  164. package/dist/fullscreen-post-process-pass.d.ts +15 -7
  165. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  166. package/dist/gpu-dirty-ranges.d.ts +11 -0
  167. package/dist/gpu-dirty-ranges.d.ts.map +1 -0
  168. package/dist/gpu-driven/batch-topology.d.ts +17 -0
  169. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  170. package/dist/gpu-driven/material-artifacts.d.ts +6 -0
  171. package/dist/gpu-driven/material-artifacts.d.ts.map +1 -1
  172. package/dist/gpu-driven/prepared-draw.d.ts +7 -0
  173. package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
  174. package/dist/gpu-driven/production-raster-material.d.ts +178 -0
  175. package/dist/gpu-driven/production-raster-material.d.ts.map +1 -0
  176. package/dist/gpu-driven/production-raster.d.ts +50 -4
  177. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  178. package/dist/gpu-driven/resource-allocation.d.ts +31 -0
  179. package/dist/gpu-driven/resource-allocation.d.ts.map +1 -0
  180. package/dist/gpu-driven/shadow-ownership.d.ts +14 -0
  181. package/dist/gpu-driven/shadow-ownership.d.ts.map +1 -0
  182. package/dist/gpu-driven/view-gpu.d.ts +35 -2
  183. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  184. package/dist/gpu-scene.d.ts +11 -1
  185. package/dist/gpu-scene.d.ts.map +1 -1
  186. package/dist/hdrp-buffers.d.ts +2 -2
  187. package/dist/hdrp-buffers.d.ts.map +1 -1
  188. package/dist/ibl/skylight-bind-group.d.ts +10 -1
  189. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  190. package/dist/index.d.ts +31 -8
  191. package/dist/index.d.ts.map +1 -1
  192. package/dist/index.mjs +258 -8
  193. package/dist/index.mjs.map +1 -1
  194. package/dist/inspection-types.d.ts +178 -3
  195. package/dist/inspection-types.d.ts.map +1 -1
  196. package/dist/instance-buffer-cache.d.ts +4 -4
  197. package/dist/instance-buffer-cache.d.ts.map +1 -1
  198. package/dist/instances.d.ts +49 -94
  199. package/dist/instances.d.ts.map +1 -1
  200. package/dist/internal.mjs +7 -7
  201. package/dist/pbr-pipeline.d.ts +19 -1
  202. package/dist/pbr-pipeline.d.ts.map +1 -1
  203. package/dist/pipeline/single-layer-medium-passes.d.ts +73 -0
  204. package/dist/pipeline/single-layer-medium-passes.d.ts.map +1 -0
  205. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  206. package/dist/pipeline/standard-output/graph.d.ts.map +1 -1
  207. package/dist/pipeline/standard-output/types.d.ts +4 -2
  208. package/dist/pipeline/standard-output/types.d.ts.map +1 -1
  209. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  210. package/dist/pipeline/standard-post.d.ts +28 -19
  211. package/dist/pipeline/standard-post.d.ts.map +1 -1
  212. package/dist/pipeline-builder.d.ts +1 -1
  213. package/dist/pipeline-builder.d.ts.map +1 -1
  214. package/dist/pipeline-spec.d.ts +2 -2
  215. package/dist/plugin.d.ts.map +1 -1
  216. package/dist/prepare/prepared-graphics-resolver.d.ts +2 -0
  217. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
  218. package/dist/record/barrel-distortion-frame.d.ts +15 -0
  219. package/dist/record/barrel-distortion-frame.d.ts.map +1 -0
  220. package/dist/record/dynamic-geometry-consumption.d.ts +10 -2
  221. package/dist/record/dynamic-geometry-consumption.d.ts.map +1 -1
  222. package/dist/record/fold-buckets.d.ts +95 -0
  223. package/dist/record/fold-buckets.d.ts.map +1 -0
  224. package/dist/record/fold-instance-buffer.d.ts +6 -0
  225. package/dist/record/fold-instance-buffer.d.ts.map +1 -0
  226. package/dist/record/frame-lighting.d.ts +1 -0
  227. package/dist/record/frame-lighting.d.ts.map +1 -1
  228. package/dist/record/frame-snapshot.d.ts +40 -3
  229. package/dist/record/frame-snapshot.d.ts.map +1 -1
  230. package/dist/record/frame-targets.d.ts.map +1 -1
  231. package/dist/record/frame.d.ts +14 -62
  232. package/dist/record/frame.d.ts.map +1 -1
  233. package/dist/record/gpu-draw-receipts.d.ts +11 -0
  234. package/dist/record/gpu-draw-receipts.d.ts.map +1 -0
  235. package/dist/record/gpu-timing.d.ts +8 -0
  236. package/dist/record/gpu-timing.d.ts.map +1 -1
  237. package/dist/record/main-pass-geometry.d.ts +21 -5
  238. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  239. package/dist/record/main-pass-material.d.ts +7 -1
  240. package/dist/record/main-pass-material.d.ts.map +1 -1
  241. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  242. package/dist/record/main-pass.d.ts +13 -2
  243. package/dist/record/main-pass.d.ts.map +1 -1
  244. package/dist/record/mesh-ssbo.d.ts +6 -5
  245. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  246. package/dist/record/motion-blur-receipt.d.ts +11 -0
  247. package/dist/record/motion-blur-receipt.d.ts.map +1 -0
  248. package/dist/record/probe-blend-buffer.d.ts +16 -0
  249. package/dist/record/probe-blend-buffer.d.ts.map +1 -0
  250. package/dist/record/recovery-pipeline.d.ts.map +1 -1
  251. package/dist/record/render-context.d.ts +34 -31
  252. package/dist/record/render-context.d.ts.map +1 -1
  253. package/dist/record/shadow-pass.d.ts +2 -0
  254. package/dist/record/shadow-pass.d.ts.map +1 -1
  255. package/dist/record/skybox-post-pass.d.ts +6 -4
  256. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  257. package/dist/record/typed-frame-graph.d.ts +22 -2
  258. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  259. package/dist/record/view-ubo.d.ts +11 -3
  260. package/dist/record/view-ubo.d.ts.map +1 -1
  261. package/dist/record/volume-params.d.ts +9 -0
  262. package/dist/record/volume-params.d.ts.map +1 -0
  263. package/dist/recovery/render-system-candidate.d.ts +10 -0
  264. package/dist/recovery/render-system-candidate.d.ts.map +1 -1
  265. package/dist/reflection/record-owner.d.ts.map +1 -1
  266. package/dist/render-contract.d.ts +66 -8
  267. package/dist/render-contract.d.ts.map +1 -1
  268. package/dist/render-graph-primitives.d.ts.map +1 -1
  269. package/dist/render-pipeline.d.ts +106 -3
  270. package/dist/render-pipeline.d.ts.map +1 -1
  271. package/dist/render-system-extract-tail.d.ts +3 -2
  272. package/dist/render-system-extract-tail.d.ts.map +1 -1
  273. package/dist/render-system-extract.d.ts +24 -10
  274. package/dist/render-system-extract.d.ts.map +1 -1
  275. package/dist/render-system-presentation.d.ts +23 -0
  276. package/dist/render-system-presentation.d.ts.map +1 -0
  277. package/dist/render-system-producer-roots.d.ts +10 -0
  278. package/dist/render-system-producer-roots.d.ts.map +1 -0
  279. package/dist/render-system-residency.d.ts +12 -0
  280. package/dist/render-system-residency.d.ts.map +1 -0
  281. package/dist/render-system.d.ts +26 -15
  282. package/dist/render-system.d.ts.map +1 -1
  283. package/dist/scene/probe-blend.d.ts +27 -0
  284. package/dist/scene/probe-blend.d.ts.map +1 -1
  285. package/dist/scene/render-scene.d.ts +14 -5
  286. package/dist/scene/render-scene.d.ts.map +1 -1
  287. package/dist/ssao-buffers.d.ts +9 -0
  288. package/dist/ssao-buffers.d.ts.map +1 -1
  289. package/dist/surface/dynamic-input.d.ts +133 -0
  290. package/dist/surface/dynamic-input.d.ts.map +1 -0
  291. package/dist/surface/gpu-driven.d.ts +41 -0
  292. package/dist/surface/gpu-driven.d.ts.map +1 -0
  293. package/dist/surface/submission-observation.d.ts +136 -0
  294. package/dist/surface/submission-observation.d.ts.map +1 -0
  295. package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
  296. package/dist/temporal/frame-coordinator.d.ts.map +1 -1
  297. package/dist/temporal/frame.d.ts +7 -0
  298. package/dist/temporal/frame.d.ts.map +1 -1
  299. package/dist/temporal/gpu.d.ts +13 -1
  300. package/dist/temporal/gpu.d.ts.map +1 -1
  301. package/dist/temporal/index.mjs +5 -5
  302. package/dist/temporal/inspection.d.ts.map +1 -1
  303. package/dist/temporal/standard-scene-data.d.ts.map +1 -1
  304. package/dist/temporal/target-coverage-attachment.d.ts.map +1 -1
  305. package/dist/temporal/view.d.ts +6 -1
  306. package/dist/temporal/view.d.ts.map +1 -1
  307. package/dist/transmission/single-layer-medium.d.ts +89 -0
  308. package/dist/transmission/single-layer-medium.d.ts.map +1 -0
  309. package/dist/typed-render-graph-primitives.d.ts +24 -9
  310. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  311. package/dist/volume/component.d.ts +9 -5
  312. package/dist/volume/component.d.ts.map +1 -1
  313. package/dist/volume/extract.d.ts +1 -1
  314. package/dist/volume/extract.d.ts.map +1 -1
  315. package/dist/volume/inspection.d.ts +2 -0
  316. package/dist/volume/inspection.d.ts.map +1 -1
  317. package/dist/volume/passes.d.ts +4 -1
  318. package/dist/volume/passes.d.ts.map +1 -1
  319. package/dist/volume/resources.d.ts.map +1 -1
  320. package/dist/volume/temporal.d.ts +3 -1
  321. package/dist/volume/temporal.d.ts.map +1 -1
  322. package/package.json +22 -21
  323. package/src/__tests__/analytic-fog-graph.unit.test.ts +199 -0
  324. package/src/__tests__/analytic-fog-optics.unit.test.ts +38 -0
  325. package/src/__tests__/atmosphere-daylight.dawn.test.ts +72 -0
  326. package/src/__tests__/barrel-distortion-lkg.integration.test.ts +353 -0
  327. package/src/__tests__/barrel-distortion.dawn.test.ts +41 -0
  328. package/src/__tests__/barrel-distortion.unit.test.ts +364 -0
  329. package/src/__tests__/bloom-exact-zero.unit.test.ts +112 -18
  330. package/src/__tests__/bloom-lifecycle.integration.test.ts +17 -4
  331. package/src/__tests__/construct-renderer-identity.unit.test.ts +49 -0
  332. package/src/__tests__/detached-recovery-graph.unit.test.ts +277 -0
  333. package/src/__tests__/device-loss-fanout.unit.test.ts +36 -1
  334. package/src/__tests__/docs-gate-green.unit.test.ts +112 -1
  335. package/src/__tests__/dynamic-resolution-plugin.integration.test.ts +20 -0
  336. package/src/__tests__/environment-fog-lanes.integration.test.ts +14 -0
  337. package/src/__tests__/environment-selection.unit.test.ts +12 -0
  338. package/src/__tests__/factory-contract.integration.test.ts +626 -113
  339. package/src/__tests__/feature-depth-input.dawn.test.ts +129 -2
  340. package/src/__tests__/frame-camera-selection.unit.test.ts +39 -1
  341. package/src/__tests__/frame-plan-contract.unit.test.ts +2 -0
  342. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +14 -3
  343. package/src/__tests__/gpu-dirty-ranges.unit.test.ts +22 -0
  344. package/src/__tests__/gpu-driven-baseline.characterization.test.ts +16 -3
  345. package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +12 -0
  346. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +2 -1
  347. package/src/__tests__/gpu-driven-material-artifacts.unit.test.ts +143 -0
  348. package/src/__tests__/gpu-driven-pbr.dawn.test.ts +2 -2
  349. package/src/__tests__/gpu-driven-production.integration.test.ts +482 -3
  350. package/src/__tests__/gpu-driven-shadow-views.dawn.test.ts +7 -6
  351. package/src/__tests__/gpu-driven-shadow-views.integration.test.ts +1 -1
  352. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +103 -4
  353. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +18 -2
  354. package/src/__tests__/gpu-driven-view.browser.test.ts +5 -8
  355. package/src/__tests__/gpu-driven-view.dawn.test.ts +6 -2
  356. package/src/__tests__/gpu-driven-view.unit.test.ts +1 -1
  357. package/src/__tests__/gpu-pass-timing-lifecycle.integration.test.ts +1 -0
  358. package/src/__tests__/gpu-pass-timing.browser.test.ts +6 -4
  359. package/src/__tests__/gpu-pass-timing.rhi-null.unit.test.ts +1 -0
  360. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +12 -0
  361. package/src/__tests__/gpu-scene.unit.test.ts +210 -9
  362. package/src/__tests__/instance-allocation-failure.unit.test.ts +57 -0
  363. package/src/__tests__/instances-culling.integration.test.ts +10 -36
  364. package/src/__tests__/instances-store.unit.test.ts +105 -238
  365. package/src/__tests__/instances-world-ownership.integration.test.ts +62 -0
  366. package/src/__tests__/main-pass-material-medium-selection.unit.test.ts +146 -0
  367. package/src/__tests__/material-shader-prewarm.unit.test.ts +59 -0
  368. package/src/__tests__/material-snapshot-mutation.integration.test.ts +39 -1
  369. package/src/__tests__/mesh-submission-lifetime.unit.test.ts +31 -0
  370. package/src/__tests__/morph-culling-reentry.dawn.test.ts +5 -5
  371. package/src/__tests__/morph-visual-evidence.integration.test.ts +8 -7
  372. package/src/__tests__/motion-blur-compute.dawn.test.ts +589 -0
  373. package/src/__tests__/motion-blur.pixel.integration.test.ts +2 -2
  374. package/src/__tests__/nineslice-handle-surface.unit.test.ts +4 -4
  375. package/src/__tests__/pbr-view-layout.unit.test.ts +9 -0
  376. package/src/__tests__/physical-clearcoat.integration.test.ts +58 -0
  377. package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +21 -0
  378. package/src/__tests__/prepared-graphics-capability.unit.test.ts +66 -2
  379. package/src/__tests__/prepared-graphics-lifecycle.unit.test.ts +86 -0
  380. package/src/__tests__/probe-bindings.unit.test.ts +582 -1
  381. package/src/__tests__/probe-scene-dirty.integration.test.ts +28 -1
  382. package/src/__tests__/public-surface.test-d.ts +8 -0
  383. package/src/__tests__/receipt-observation-retirement.unit.test.ts +65 -0
  384. package/src/__tests__/recovery-candidate-prepare.contract.test.ts +69 -0
  385. package/src/__tests__/render-error-code-owner.test-d.ts +9 -0
  386. package/src/__tests__/render-feature-diagnostics.unit.test.ts +15 -2
  387. package/src/__tests__/render-feature-error-reporting.unit.test.ts +44 -0
  388. package/src/__tests__/render-feature-prepared-diagnostics.unit.test.ts +10 -1
  389. package/src/__tests__/render-feature-retry.unit.test.ts +12 -1
  390. package/src/__tests__/render-feature-stage-fault-recovery.unit.test.ts +23 -0
  391. package/src/__tests__/render-scene-mixed-updates.integration.test.ts +145 -19
  392. package/src/__tests__/render-scene-projection.unit.test.ts +36 -11
  393. package/src/__tests__/render-scene-temporal-retry.unit.test.ts +37 -6
  394. package/src/__tests__/render-target-probe-soak.perf.test.ts +2 -2
  395. package/src/__tests__/render-temporal-environment-consumer.browser.test.ts +3 -3
  396. package/src/__tests__/render-temporal-environment-consumer.dawn.test.ts +5 -2
  397. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +41 -7
  398. package/src/__tests__/renderer-frame-generation-fence.integration.test.ts +16 -0
  399. package/src/__tests__/renderer-frame-transaction.integration.test.ts +33 -11
  400. package/src/__tests__/resource-allocation.unit.test.ts +123 -0
  401. package/src/__tests__/shader-manifest-fixture.ts +4 -4
  402. package/src/__tests__/single-layer-medium-passes.unit.test.ts +275 -0
  403. package/src/__tests__/skin-motion-regression.unit.test.ts +70 -1
  404. package/src/__tests__/skin-palette-recycling.dawn.test.ts +97 -0
  405. package/src/__tests__/skinned-shadow-caster.test.ts +17 -0
  406. package/src/__tests__/ssr-carrier-public-contract.unit.test.ts +21 -0
  407. package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +4 -4
  408. package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +2 -2
  409. package/src/__tests__/ssr-gpu-dispatch.ts +1 -1
  410. package/src/__tests__/ssr-receiver-coverage.dawn.test.ts +6 -2
  411. package/src/__tests__/standard-lighting-write.unit.test.ts +2 -1
  412. package/src/__tests__/standard-output-chain-contract.unit.test.ts +28 -0
  413. package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +46 -1
  414. package/src/__tests__/standard-pipeline.dawn.test.ts +1 -1
  415. package/src/__tests__/standard-pipeline.integration.test.ts +200 -9
  416. package/src/__tests__/surface-dynamic-buffer-lifecycle.unit.test.ts +506 -0
  417. package/src/__tests__/surface-submission-observation.unit.test.ts +812 -0
  418. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +32 -0
  419. package/src/__tests__/temporal-performance.integration.test.ts +3 -3
  420. package/src/__tests__/temporal-reset-matrix.unit.test.ts +10 -0
  421. package/src/__tests__/temporal-view.unit.test.ts +2 -1
  422. package/src/__tests__/typed-pipeline-topology.unit.test.ts +20 -4
  423. package/src/__tests__/visibility-instances.integration.test.ts +7 -19
  424. package/src/__tests__/visibility-producer-matrix.integration.test.ts +9 -20
  425. package/src/__tests__/volume-optics-oracle.unit.test.ts +7 -3
  426. package/src/__tests__/volumetric-fog-budget-recovery.integration.test.ts +189 -15
  427. package/src/__tests__/volumetric-fog-errors.unit.test.ts +4 -3
  428. package/src/__tests__/volumetric-fog-multiple.unit.test.ts +55 -0
  429. package/src/__tests__/volumetric-fog-spot-frame-optics.integration.test.ts +1 -1
  430. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +558 -68
  431. package/src/__tests__/volumetric-fog-temporal.unit.test.ts +27 -0
  432. package/src/__tests__/volumetric-fog-topology.unit.test.ts +23 -5
  433. package/src/assembly/analytic-fog-registration.ts +14 -0
  434. package/src/assembly/backend-contract.ts +30 -0
  435. package/src/assembly/barrel-distortion-inspection.ts +22 -0
  436. package/src/assembly/canvas-draw-guard.ts +11 -0
  437. package/src/assembly/cloud-shadow-entry.ts +22 -0
  438. package/src/assembly/dynamic-geometry-host.ts +65 -37
  439. package/src/assembly/dynamic-geometry-runtime.ts +7 -1
  440. package/src/assembly/factory.ts +2 -30
  441. package/src/assembly/fxaa-registration.ts +17 -0
  442. package/src/assembly/host-contract.ts +3 -3
  443. package/src/assembly/lod-observation.ts +12 -0
  444. package/src/assembly/material/assembly.ts +25 -13
  445. package/src/assembly/material/pipeline-helpers.ts +53 -12
  446. package/src/assembly/material-shader-policy.ts +55 -0
  447. package/src/assembly/material-shader-prewarm.ts +21 -10
  448. package/src/assembly/motion-blur-registration.ts +17 -0
  449. package/src/assembly/recovery/device-loss-fanout.ts +13 -0
  450. package/src/assembly/recovery/renderer-recover.ts +41 -18
  451. package/src/assembly/render-feature-post-processes.ts +54 -0
  452. package/src/assembly/renderer-facade.ts +6 -1
  453. package/src/assembly/renderer-feature-inspection.ts +8 -2
  454. package/src/assembly/renderer-frame-transaction.ts +23 -0
  455. package/src/assembly/renderer-inspection.ts +28 -0
  456. package/src/assembly/skin-palette-owner.ts +1 -1
  457. package/src/assembly/temporal-post-process-prewarm.ts +40 -0
  458. package/src/assembly/webgpu-pbr-ready.ts +9 -1
  459. package/src/assembly/webgpu-ready-contract.ts +8 -3
  460. package/src/assembly/webgpu-ready-per-pass.ts +104 -0
  461. package/src/assembly/webgpu-ready.ts +296 -306
  462. package/src/assembly/webgpu-renderer-bootstrap.ts +0 -12
  463. package/src/assembly/webgpu-renderer-observation-owner.ts +222 -0
  464. package/src/assembly/webgpu-renderer.ts +228 -281
  465. package/src/assembly/webgpu-vertex-layouts.ts +1 -1
  466. package/src/barrel-distortion.ts +247 -0
  467. package/src/bloom-admission.ts +21 -0
  468. package/src/cloud/__tests__/cloud-density-parity.dawn.test.ts +173 -0
  469. package/src/cloud/__tests__/cloud-layer-framebuffer-y.dawn.test.ts +265 -0
  470. package/src/cloud/__tests__/cloud-layer.browser.test.ts +432 -0
  471. package/src/cloud/__tests__/cloud-layer.unit.test.ts +634 -0
  472. package/src/cloud/density.ts +600 -0
  473. package/src/cloud/extract.ts +110 -0
  474. package/src/cloud/feature.ts +1810 -0
  475. package/src/cloud/frame-context.ts +42 -0
  476. package/src/cloud/inspection.ts +130 -0
  477. package/src/cloud/optics.ts +285 -0
  478. package/src/cloud/parameters.ts +255 -0
  479. package/src/cloud/resources.ts +122 -0
  480. package/src/cloud/shadow.ts +167 -0
  481. package/src/cloud/temporal.ts +226 -0
  482. package/src/components/__tests__/motion-blur.unit.test.ts +1 -0
  483. package/src/components/atmosphere.ts +4 -0
  484. package/src/components/barrel-distortion.ts +46 -0
  485. package/src/components/camera.ts +66 -10
  486. package/src/components/cloud-layer.ts +47 -0
  487. package/src/components/index.ts +2 -0
  488. package/src/components/instances.ts +18 -45
  489. package/src/components/mesh-filter.ts +11 -9
  490. package/src/components/motion-blur.ts +1 -0
  491. package/src/components/sprite-instances.ts +1 -1
  492. package/src/construct-renderer.ts +1 -1
  493. package/src/device/gpu-residency.ts +56 -12
  494. package/src/dynamic-geometry.ts +12 -1
  495. package/src/environment/analytic-fog.ts +44 -0
  496. package/src/environment/background.ts +2 -2
  497. package/src/errors/cloud.ts +103 -0
  498. package/src/errors/render.ts +58 -8
  499. package/src/examples/single-layer-medium-surface.ts +59 -0
  500. package/src/extract/camera.ts +35 -8
  501. package/src/extract/contracts.ts +12 -0
  502. package/src/extract/environment.ts +4 -0
  503. package/src/features/barrel-distortion.ts +172 -0
  504. package/src/features/error-reporting.ts +98 -0
  505. package/src/features/host.ts +138 -24
  506. package/src/features/motion-blur/__tests__/motion-blur-feature.unit.test.ts +111 -1
  507. package/src/features/motion-blur/__tests__/motion-blur-params.unit.test.ts +58 -3
  508. package/src/features/motion-blur/motion-blur-feature.ts +1519 -15
  509. package/src/features/motion-blur/motion-blur-params.ts +70 -2
  510. package/src/features/motion-blur/motion-blur-runtime.ts +176 -0
  511. package/src/features/plan.ts +33 -8
  512. package/src/features/prepared-gpu-work.ts +86 -35
  513. package/src/features/render-graph-compute.ts +13 -5
  514. package/src/features/render-graph-contribution.ts +11 -0
  515. package/src/features/render-graph-raster.ts +45 -3
  516. package/src/features/targets.ts +66 -0
  517. package/src/features/types.ts +47 -0
  518. package/src/fullscreen-post-process-pass.ts +41 -9
  519. package/src/gpu-dirty-ranges.ts +48 -0
  520. package/src/gpu-driven/batch-topology.ts +53 -0
  521. package/src/gpu-driven/material-artifacts.ts +35 -32
  522. package/src/gpu-driven/prepared-draw.ts +27 -14
  523. package/src/gpu-driven/production-raster-material.ts +1894 -0
  524. package/src/gpu-driven/production-raster.ts +904 -787
  525. package/src/gpu-driven/resource-allocation.ts +142 -0
  526. package/src/gpu-driven/shadow-ownership.ts +71 -0
  527. package/src/gpu-driven/view-gpu.ts +181 -10
  528. package/src/gpu-scene.ts +259 -101
  529. package/src/hdrp-buffers.ts +4 -3
  530. package/src/ibl/skylight-bind-group.ts +49 -7
  531. package/src/index.ts +228 -9
  532. package/src/inspection-types.ts +222 -2
  533. package/src/instance-buffer-cache.ts +4 -4
  534. package/src/instances.ts +151 -492
  535. package/src/pbr-pipeline.ts +219 -13
  536. package/src/pipeline/single-layer-medium-passes.ts +267 -0
  537. package/src/pipeline/standard-forward-lane.ts +313 -57
  538. package/src/pipeline/standard-output/graph.ts +8 -2
  539. package/src/pipeline/standard-output/types.ts +12 -1
  540. package/src/pipeline/standard-pipeline.ts +291 -18
  541. package/src/pipeline/standard-post.ts +397 -102
  542. package/src/pipeline-builder.ts +1 -1
  543. package/src/pipeline-spec.ts +5 -5
  544. package/src/plugin.ts +4 -0
  545. package/src/points-lines/__tests__/points-lines.bench.ts +17 -8
  546. package/src/points-lines/__tests__/view-ubo.unit.test.ts +2 -1
  547. package/src/prepare/prepared-graphics-resolver.ts +2 -0
  548. package/src/record/__tests__/main-pass-geometry.unit.test.ts +30 -0
  549. package/src/record/__tests__/sprite-material-abi.unit.test.ts +1 -1
  550. package/src/record/__tests__/temporal-payload.unit.test.ts +3 -2
  551. package/src/record/__tests__/transparent-group2-selection.unit.test.ts +11 -0
  552. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +1 -0
  553. package/src/record/__tests__/view-ubo-layout.unit.test.ts +4 -3
  554. package/src/record/barrel-distortion-frame.ts +110 -0
  555. package/src/record/dynamic-geometry-consumption.ts +39 -9
  556. package/src/record/fold-buckets.ts +852 -0
  557. package/src/record/fold-instance-buffer.ts +51 -0
  558. package/src/record/frame-lighting.ts +36 -2
  559. package/src/record/frame-snapshot.ts +44 -4
  560. package/src/record/frame-targets.ts +10 -6
  561. package/src/record/frame.ts +373 -1099
  562. package/src/record/gpu-draw-receipts.ts +38 -0
  563. package/src/record/gpu-timing.ts +48 -5
  564. package/src/record/main-pass-geometry.ts +281 -83
  565. package/src/record/main-pass-material.ts +66 -4
  566. package/src/record/main-pass-sprite-draws.ts +13 -66
  567. package/src/record/main-pass.ts +156 -20
  568. package/src/record/mesh-ssbo.ts +43 -6
  569. package/src/record/motion-blur-receipt.ts +91 -0
  570. package/src/record/probe-blend-buffer.ts +180 -0
  571. package/src/record/recovery-pipeline.ts +35 -3
  572. package/src/record/render-context.ts +51 -31
  573. package/src/record/shadow-pass.ts +36 -2
  574. package/src/record/skybox-post-pass.ts +150 -200
  575. package/src/record/typed-frame-graph.ts +824 -44
  576. package/src/record/view-ubo.ts +26 -3
  577. package/src/record/volume-params.ts +225 -0
  578. package/src/recovery/render-system-candidate.ts +257 -52
  579. package/src/reflection/record-owner.ts +7 -3
  580. package/src/render-contract.ts +71 -8
  581. package/src/render-graph-primitives.ts +7 -1
  582. package/src/render-pipeline.ts +136 -1
  583. package/src/render-system-extract-tail.ts +72 -60
  584. package/src/render-system-extract.ts +117 -87
  585. package/src/render-system-presentation.ts +56 -0
  586. package/src/render-system-producer-roots.ts +96 -0
  587. package/src/render-system-residency.ts +159 -0
  588. package/src/render-system.ts +601 -482
  589. package/src/scene/probe-blend.ts +96 -4
  590. package/src/scene/render-scene.ts +431 -281
  591. package/src/ssao-buffers.ts +95 -2
  592. package/src/surface/__tests__/dynamic-input.unit.test.ts +374 -0
  593. package/src/surface/__tests__/gpu-driven.unit.test.ts +87 -0
  594. package/src/surface/dynamic-input.ts +658 -0
  595. package/src/surface/gpu-driven.ts +147 -0
  596. package/src/surface/submission-observation.ts +517 -0
  597. package/src/systems/skin-palette-allocator.ts +4 -1
  598. package/src/temporal/__tests__/temporal-frame-transaction.unit.test.ts +36 -0
  599. package/src/temporal/frame-coordinator.ts +8 -1
  600. package/src/temporal/frame.ts +20 -0
  601. package/src/temporal/gpu.ts +101 -17
  602. package/src/temporal/inspection.ts +7 -1
  603. package/src/temporal/standard-scene-data.ts +5 -0
  604. package/src/temporal/target-coverage-attachment.ts +4 -0
  605. package/src/temporal/view.ts +13 -2
  606. package/src/transmission/__tests__/single-layer-medium.unit.test.ts +149 -0
  607. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +12 -11
  608. package/src/transmission/single-layer-medium.ts +322 -0
  609. package/src/typed-render-graph-primitives.ts +191 -50
  610. package/src/volume/component.ts +10 -10
  611. package/src/volume/extract.ts +11 -5
  612. package/src/volume/inspection.ts +3 -0
  613. package/src/volume/passes.ts +95 -8
  614. package/src/volume/resources.ts +2 -1
  615. package/src/volume/temporal.ts +11 -0
  616. package/dist/chunk-4NNZQCL3.mjs.map +0 -1
  617. package/dist/chunk-6TFBXLRJ.mjs.map +0 -1
  618. package/dist/chunk-DRR7D3KX.mjs.map +0 -1
  619. package/dist/chunk-GWCEMDVR.mjs.map +0 -1
  620. package/dist/chunk-JCIRYQ4V.mjs.map +0 -1
  621. package/dist/chunk-JRIPCMYC.mjs.map +0 -1
  622. package/dist/chunk-LULCA3OF.mjs +0 -1713
  623. package/dist/chunk-LULCA3OF.mjs.map +0 -1
  624. package/dist/chunk-PA5DRJNI.mjs.map +0 -1
@@ -1,6 +1,8 @@
1
1
  import type { ResolveContext } from '@forgeax/engine-render-graph';
2
2
  import { RhiError, type RhiRenderPassEncoder, type TextureView } from '@forgeax/engine-rhi';
3
3
  import { toShared } from '@forgeax/engine-types';
4
+ import { BLOOM_UNIFORM_PARAMS_STRIDE_BYTES } from '../assembly/webgpu-ready-contract';
5
+ import { standardBloomAdmitted } from '../bloom-admission';
4
6
  import { buildBeginRenderPassDescriptor } from '../pipeline-spec';
5
7
  import { FXAA_POST_PROCESS_ID } from '../render-contract';
6
8
  import { resolveOutputDither } from '../render-pipeline';
@@ -177,7 +179,7 @@ export function encodeSkyboxPass(
177
179
  // The graph must declare execute callbacks for addPass; these empty stubs
178
180
  // keep compile() satisfied until w15 fills in the actual record logic.
179
181
  //
180
- // Gate: bloom === 'off' || !tonemapActive => early-return (AC-04/AC-05).
182
+ // Gate: Bloom off, zero intensity, or !tonemapActive => early-return.
181
183
  // The closures receive RenderPipelineContext and route to w15 record functions.
182
184
 
183
185
  const EMPTY_BLOOM_RECEIPTS: BloomFrameReceipts = {
@@ -217,168 +219,94 @@ function throwBloomRecordFailure(expected: string): never {
217
219
  });
218
220
  }
219
221
 
220
- export function recordBloomBrightPass(
221
- _c: _InternalRenderPipelineContext,
222
- resolve?: ResolveContext,
223
- graphPass?: RhiRenderPassEncoder,
224
- ): void {
225
- const { runtime, encoder, camera, tonemapActive, frameState, bindGroupCounts } = _c;
226
- const pp = _c.bloomResources;
227
-
228
- // Double gate: bloom=off => zero-overhead; tonemap=none => no HDR domain
229
- if (camera.bloom !== 'on' || !tonemapActive) return;
230
- if (pp === null || pp === undefined) {
231
- throwBloomRecordFailure('Bloom persistent resources are ready before bright-pass encoding');
232
- }
233
- if (
234
- pp.bloomBrightPipeline === null ||
235
- pp.bloomBrightBindGroupLayout === null ||
236
- pp.bloomSampler === null ||
237
- pp.bloomBrightParamsBuffer === null
238
- ) {
239
- throwBloomRecordFailure('Bloom bright pass has pipeline, layout, sampler, and params buffer');
240
- }
241
-
242
- // M1 / w7: bloom intermediate textures owned by render-graph. Resolve
243
- // the GPU TextureView via the resolve context passed by graph.execute().
244
- const bloomBrightView = resolve?.resolve('bloomBright') as TextureView | undefined;
245
- const hdrColorView = resolve?.resolve('hdrColor') as TextureView | undefined;
246
- if (!bloomBrightView || !hdrColorView) {
247
- throwBloomRecordFailure('Bloom bright pass resolves its source and target views');
248
- }
249
- const bglBright = pp.bloomBrightBindGroupLayout;
250
- const bloomSampler = pp.bloomSampler;
251
- const paramsBuffer = pp.bloomBrightParamsBuffer;
252
-
253
- // 2. Write threshold UBO (16 B std140: threshold f32 + 12 B pad).
254
- const brightParams = new Float32Array(4);
255
- brightParams[0] = camera.bloomThreshold;
256
- brightParams[1] = 0;
257
- brightParams[2] = 0;
258
- brightParams[3] = 0;
259
- const paramsWrite = runtime.device.queue.writeBuffer(paramsBuffer, 0, brightParams);
260
- if (!paramsWrite.ok) throw paramsWrite.error;
261
- stageBloomUpload(_c);
262
-
263
- // 3. Identity-cached BindGroup (1 tex + 1 sampler + 1 UBO). Keyed on the
264
- // graph-resolved hdrColor TextureView: resize retires hdrColor and the new
265
- // view yields a WeakMap miss -> rebuild referencing the live texture.
266
- const bindGroup = getOrCreateFromChain(
267
- frameState.postProcessBgCache,
268
- [hdrColorView],
269
- 'bloom-bright',
270
- () => {
271
- const bgRes = runtime.device.createBindGroup({
272
- label: 'bloom-bright-bg',
273
- layout: bglBright,
274
- entries: [
275
- { binding: 0, resource: { kind: 'textureView', value: hdrColorView } },
276
- { binding: 1, resource: { kind: 'sampler', value: bloomSampler } },
277
- { binding: 2, resource: { kind: 'buffer', value: { buffer: paramsBuffer } } },
278
- ],
279
- });
280
- if (!bgRes.ok) throw bgRes.error;
281
- return bgRes.value;
282
- },
283
- bindGroupCounts,
284
- );
285
-
286
- // 4. Render pass into the 1/2-res intermediate.
287
- const pass: RhiRenderPassEncoder =
288
- graphPass ??
289
- encoder.beginRenderPass(
290
- buildBeginRenderPassDescriptor(
291
- { colorFormats: ['rgba16float'], depthFormat: undefined, sampleCount: 1 },
292
- { colorViews: [bloomBrightView] },
293
- 'bloom-bright',
294
- ) as never,
295
- );
296
- pass.setPipeline(pp.bloomBrightPipeline);
297
- pass.setBindGroup(0, bindGroup);
298
- stageBloomBindGroup(_c);
299
- pass.draw(3, 1, 0, 0);
300
- stageBloomEncode(_c);
301
- if (graphPass === undefined) pass.end();
222
+ function bloomRecordActive(c: _InternalRenderPipelineContext): boolean {
223
+ return standardBloomAdmitted(c.camera) && c.tonemapActive;
302
224
  }
303
225
 
304
- export function recordBloomBlurHPass(
226
+ export function recordBloomDownsamplePass(
305
227
  _c: _InternalRenderPipelineContext,
306
228
  resolve?: ResolveContext,
307
229
  graphPass?: RhiRenderPassEncoder,
230
+ level = 0,
231
+ destinationSize?: { readonly width: number; readonly height: number },
308
232
  ): void {
309
- const { runtime, encoder, camera, targetW, tonemapActive, frameState, bindGroupCounts } = _c;
233
+ const { runtime, encoder, camera, frameState, bindGroupCounts } = _c;
310
234
  const pp = _c.bloomResources;
311
-
312
- if (camera.bloom !== 'on' || !tonemapActive) return;
313
- if (pp === null || pp === undefined) {
314
- throwBloomRecordFailure('Bloom persistent resources are ready before blur-H encoding');
315
- }
235
+ if (!bloomRecordActive(_c)) return;
316
236
  if (
317
- pp.bloomBlurHPipeline === null ||
318
- pp.bloomBlurBindGroupLayout === null ||
237
+ pp === undefined ||
238
+ pp === null ||
239
+ pp.bloomDownsamplePipeline === null ||
240
+ pp.bloomDownsampleBindGroupLayout === null ||
319
241
  pp.bloomSampler === null ||
320
- pp.bloomBlurHParamsBuffer === null
242
+ pp.bloomDownsampleParamsBuffer === null
321
243
  ) {
322
- throwBloomRecordFailure('Bloom blur-H pass has pipeline, layout, sampler, and params buffer');
323
- }
324
-
325
- // M1 / w7: bloom intermediate textures owned by render-graph. Resolve
326
- // via the resolve context passed by graph.execute().
327
- const bloomBlurHView = resolve?.resolve('bloomBlurH') as TextureView | undefined;
328
- const bloomBrightView = resolve?.resolve('bloomBright') as TextureView | undefined;
329
- if (!bloomBlurHView || !bloomBrightView) {
330
- throwBloomRecordFailure('Bloom blur-H pass resolves its source and target views');
244
+ throwBloomRecordFailure('Bloom downsample resources are ready before encoding');
331
245
  }
332
- const bglBlur = pp.bloomBlurBindGroupLayout;
246
+ const downsamplePipeline = pp.bloomDownsamplePipeline;
247
+ const downsampleLayout = pp.bloomDownsampleBindGroupLayout;
333
248
  const bloomSampler = pp.bloomSampler;
334
- const paramsBuffer = pp.bloomBlurHParamsBuffer;
335
-
336
- // 2. Write H-axis blur params into the H-only UBO (bug-20260625: a separate
337
- // buffer per axis so V's write cannot clobber H's before the GPU runs).
338
- // H-axis: texel offset along x only.
339
- const bw = Math.floor(targetW / 2);
340
- const blurParams = new Float32Array(4);
341
- blurParams[0] = bw > 0 ? 1.0 / bw : 1.0; // texelSize.x
342
- blurParams[1] = 0; // texelSize.y = 0 for H pass
343
- blurParams[2] = camera.bloomBlurRadius;
344
- blurParams[3] = 0;
345
- const paramsWrite = runtime.device.queue.writeBuffer(paramsBuffer, 0, blurParams);
346
- if (!paramsWrite.ok) throw paramsWrite.error;
249
+ const downsampleParamsBuffer = pp.bloomDownsampleParamsBuffer;
250
+ const sourceName = level === 0 ? 'hdrColor' : `bloomDownsample${level - 1}`;
251
+ const targetName = `bloomDownsample${level}`;
252
+ const sourceView = resolve?.resolve(sourceName) as TextureView | undefined;
253
+ const targetView = resolve?.resolve(targetName) as TextureView | undefined;
254
+ if (sourceView === undefined || targetView === undefined) {
255
+ throwBloomRecordFailure(`Bloom downsample level ${level} resolves source and target views`);
256
+ }
257
+ const size = destinationSize ?? {
258
+ width: Math.max(1, Math.ceil(_c.targetW / 2)),
259
+ height: Math.max(1, Math.ceil(_c.targetH / 2)),
260
+ };
261
+ const params = new Float32Array([
262
+ camera.bloomThreshold,
263
+ camera.bloomSoftKnee,
264
+ size.width,
265
+ size.height,
266
+ level,
267
+ 0,
268
+ 0,
269
+ 0,
270
+ ]);
271
+ const offset = level * BLOOM_UNIFORM_PARAMS_STRIDE_BYTES;
272
+ const upload = runtime.device.queue.writeBuffer(pp.bloomDownsampleParamsBuffer, offset, params);
273
+ if (!upload.ok) throw upload.error;
347
274
  stageBloomUpload(_c);
348
-
349
- // 3. Identity-cached BindGroup (reads bloomBright from graph). Keyed on the
350
- // graph-resolved bloomBright view so resize rebuilds against the new texture.
351
275
  const bindGroup = getOrCreateFromChain(
352
276
  frameState.postProcessBgCache,
353
- [bloomBrightView],
354
- 'bloom-blur-h',
277
+ [sourceView, downsampleParamsBuffer],
278
+ `bloom-downsample-${level}`,
355
279
  () => {
356
- const bgRes = runtime.device.createBindGroup({
357
- label: 'bloom-blur-h-bg',
358
- layout: bglBlur,
280
+ const created = runtime.device.createBindGroup({
281
+ label: `bloom-downsample-${level}-bg`,
282
+ layout: downsampleLayout,
359
283
  entries: [
360
- { binding: 0, resource: { kind: 'textureView', value: bloomBrightView } },
284
+ { binding: 0, resource: { kind: 'textureView', value: sourceView } },
361
285
  { binding: 1, resource: { kind: 'sampler', value: bloomSampler } },
362
- { binding: 2, resource: { kind: 'buffer', value: { buffer: paramsBuffer } } },
286
+ {
287
+ binding: 2,
288
+ resource: {
289
+ kind: 'buffer',
290
+ value: { buffer: downsampleParamsBuffer, offset, size: 32 },
291
+ },
292
+ },
363
293
  ],
364
294
  });
365
- if (!bgRes.ok) throw bgRes.error;
366
- return bgRes.value;
295
+ if (!created.ok) throw created.error;
296
+ return created.value;
367
297
  },
368
298
  bindGroupCounts,
369
299
  );
370
-
371
- // 4. Render pass into bloomBlurH intermediate (graph-owned).
372
- const pass: RhiRenderPassEncoder =
300
+ const pass =
373
301
  graphPass ??
374
302
  encoder.beginRenderPass(
375
303
  buildBeginRenderPassDescriptor(
376
304
  { colorFormats: ['rgba16float'], depthFormat: undefined, sampleCount: 1 },
377
- { colorViews: [bloomBlurHView] },
378
- 'bloom-blur',
305
+ { colorViews: [targetView] },
306
+ 'bloom-downsample',
379
307
  ) as never,
380
308
  );
381
- pass.setPipeline(pp.bloomBlurHPipeline);
309
+ pass.setPipeline(downsamplePipeline);
382
310
  pass.setBindGroup(0, bindGroup);
383
311
  stageBloomBindGroup(_c);
384
312
  pass.draw(3, 1, 0, 0);
@@ -386,84 +314,80 @@ export function recordBloomBlurHPass(
386
314
  if (graphPass === undefined) pass.end();
387
315
  }
388
316
 
389
- export function recordBloomBlurVPass(
317
+ export function recordBloomUpsamplePass(
390
318
  _c: _InternalRenderPipelineContext,
391
319
  resolve?: ResolveContext,
392
320
  graphPass?: RhiRenderPassEncoder,
321
+ level = 0,
393
322
  ): void {
394
- const { runtime, encoder, camera, targetH, tonemapActive, frameState, bindGroupCounts } = _c;
323
+ const { runtime, encoder, frameState, bindGroupCounts } = _c;
395
324
  const pp = _c.bloomResources;
396
-
397
- if (camera.bloom !== 'on' || !tonemapActive) return;
398
- if (pp === null || pp === undefined) {
399
- throwBloomRecordFailure('Bloom persistent resources are ready before blur-V encoding');
400
- }
325
+ if (!bloomRecordActive(_c)) return;
401
326
  if (
402
- pp.bloomBlurVPipeline === null ||
403
- pp.bloomBlurBindGroupLayout === null ||
327
+ pp === undefined ||
328
+ pp === null ||
329
+ pp.bloomUpsamplePipeline === null ||
330
+ pp.bloomUpsampleBindGroupLayout === null ||
404
331
  pp.bloomSampler === null ||
405
- pp.bloomBlurVParamsBuffer === null
332
+ pp.bloomUpsampleParamsBuffer === null
406
333
  ) {
407
- throwBloomRecordFailure('Bloom blur-V pass has pipeline, layout, sampler, and params buffer');
334
+ throwBloomRecordFailure('Bloom upsample resources are ready before encoding');
408
335
  }
409
-
410
- // M1 / w7: bloom intermediate textures owned by render-graph. Resolve
411
- // via the resolve context passed by graph.execute().
412
- const bloomBlurVView = resolve?.resolve('bloomBlurV') as TextureView | undefined;
413
- const bloomBlurHView = resolve?.resolve('bloomBlurH') as TextureView | undefined;
414
- if (!bloomBlurVView || !bloomBlurHView) {
415
- throwBloomRecordFailure('Bloom blur-V pass resolves its source and target views');
416
- }
417
- const bglBlur = pp.bloomBlurBindGroupLayout;
336
+ const upsamplePipeline = pp.bloomUpsamplePipeline;
337
+ const upsampleLayout = pp.bloomUpsampleBindGroupLayout;
418
338
  const bloomSampler = pp.bloomSampler;
419
- const paramsBuffer = pp.bloomBlurVParamsBuffer;
420
-
421
- // 2. Write V-axis blur params into the V-only UBO (bug-20260625: separate
422
- // buffer per axis -- see the H pass comment).
423
- // V-axis: texel offset along y only.
424
- const bh = Math.floor(targetH / 2);
425
- const blurParams = new Float32Array(4);
426
- blurParams[0] = 0; // texelSize.x = 0 for V pass
427
- blurParams[1] = bh > 0 ? 1.0 / bh : 1.0; // texelSize.y
428
- blurParams[2] = camera.bloomBlurRadius;
429
- blurParams[3] = 0;
430
- const paramsWrite = runtime.device.queue.writeBuffer(paramsBuffer, 0, blurParams);
431
- if (!paramsWrite.ok) throw paramsWrite.error;
339
+ const upsampleParamsBuffer = pp.bloomUpsampleParamsBuffer;
340
+ const currentView = resolve?.resolve(`bloomDownsample${level}`) as TextureView | undefined;
341
+ // The top upsample edge reconstructs from the next downsample level. Every
342
+ // finer edge then consumes the already reconstructed coarser upsample. A
343
+ // resolver miss is the single source of truth for the one-level pyramid
344
+ // boundary; no alternate level-count or legacy H/V path is needed.
345
+ const nextUpsampleView = resolve?.resolve(`bloomUpsample${level + 1}`) as TextureView | undefined;
346
+ const coarseView =
347
+ nextUpsampleView ??
348
+ (resolve?.resolve(`bloomDownsample${level + 1}`) as TextureView | undefined);
349
+ const targetView = resolve?.resolve(`bloomUpsample${level}`) as TextureView | undefined;
350
+ if (currentView === undefined || coarseView === undefined || targetView === undefined) {
351
+ throwBloomRecordFailure(`Bloom upsample level ${level} resolves adjacent pyramid views`);
352
+ }
353
+ const params = new Float32Array([_c.camera.bloomScatter, 0, 0, 0]);
354
+ const offset = level * BLOOM_UNIFORM_PARAMS_STRIDE_BYTES;
355
+ const upload = runtime.device.queue.writeBuffer(pp.bloomUpsampleParamsBuffer, offset, params);
356
+ if (!upload.ok) throw upload.error;
432
357
  stageBloomUpload(_c);
433
-
434
- // 3. Identity-cached BindGroup (reads bloomBlurH from graph). Keyed on the
435
- // graph-resolved bloomBlurH view so resize rebuilds against the new texture.
436
358
  const bindGroup = getOrCreateFromChain(
437
359
  frameState.postProcessBgCache,
438
- [bloomBlurHView],
439
- 'bloom-blur-v',
360
+ [currentView, coarseView, upsampleParamsBuffer],
361
+ `bloom-upsample-${level}`,
440
362
  () => {
441
- const bgRes = runtime.device.createBindGroup({
442
- label: 'bloom-blur-v-bg',
443
- layout: bglBlur,
363
+ const created = runtime.device.createBindGroup({
364
+ label: `bloom-upsample-${level}-bg`,
365
+ layout: upsampleLayout,
444
366
  entries: [
445
- { binding: 0, resource: { kind: 'textureView', value: bloomBlurHView } },
446
- { binding: 1, resource: { kind: 'sampler', value: bloomSampler } },
447
- { binding: 2, resource: { kind: 'buffer', value: { buffer: paramsBuffer } } },
367
+ { binding: 0, resource: { kind: 'textureView', value: currentView } },
368
+ { binding: 1, resource: { kind: 'textureView', value: coarseView } },
369
+ { binding: 2, resource: { kind: 'sampler', value: bloomSampler } },
370
+ {
371
+ binding: 3,
372
+ resource: { kind: 'buffer', value: { buffer: upsampleParamsBuffer, offset, size: 16 } },
373
+ },
448
374
  ],
449
375
  });
450
- if (!bgRes.ok) throw bgRes.error;
451
- return bgRes.value;
376
+ if (!created.ok) throw created.error;
377
+ return created.value;
452
378
  },
453
379
  bindGroupCounts,
454
380
  );
455
-
456
- // 4. Render pass into bloomBlurV intermediate (graph-owned).
457
- const pass: RhiRenderPassEncoder =
381
+ const pass =
458
382
  graphPass ??
459
383
  encoder.beginRenderPass(
460
384
  buildBeginRenderPassDescriptor(
461
385
  { colorFormats: ['rgba16float'], depthFormat: undefined, sampleCount: 1 },
462
- { colorViews: [bloomBlurVView] },
463
- 'bloom-blur',
386
+ { colorViews: [targetView] },
387
+ 'bloom-upsample',
464
388
  ) as never,
465
389
  );
466
- pass.setPipeline(pp.bloomBlurVPipeline);
390
+ pass.setPipeline(upsamplePipeline);
467
391
  pass.setBindGroup(0, bindGroup);
468
392
  stageBloomBindGroup(_c);
469
393
  pass.draw(3, 1, 0, 0);
@@ -476,10 +400,10 @@ export function recordBloomCompositePass(
476
400
  resolve?: ResolveContext,
477
401
  graphPass?: RhiRenderPassEncoder,
478
402
  ): void {
479
- const { runtime, encoder, camera, tonemapActive, frameState, bindGroupCounts } = _c;
403
+ const { runtime, encoder, camera, frameState, bindGroupCounts } = _c;
480
404
  const pp = _c.bloomResources;
481
405
 
482
- if (camera.bloom !== 'on' || !tonemapActive) return;
406
+ if (!bloomRecordActive(_c)) return;
483
407
  if (pp === null || pp === undefined) {
484
408
  throwBloomRecordFailure('Bloom persistent resources are ready before composite encoding');
485
409
  }
@@ -494,14 +418,16 @@ export function recordBloomCompositePass(
494
418
  );
495
419
  }
496
420
 
497
- // M1 / w7: hdrColor + bloomBlurV textures owned by render-graph.
421
+ // hdrColor + reconstructed Bloom textures are owned by render-graph.
498
422
  // bug-20260625: composite READS hdrColor (scene, binding 0) and WRITES the
499
423
  // separate hdrComposited target -- never the same texture in one pass.
500
424
  const hdrColorView = resolve?.resolve('hdrColor') as TextureView | undefined;
501
- const bloomBlurVView = resolve?.resolve('bloomBlurV') as TextureView | undefined;
425
+ const bloomView = resolve?.resolve('bloomUpsample0') as TextureView | undefined;
426
+ const finestBloomView =
427
+ bloomView ?? (resolve?.resolve('bloomDownsample0') as TextureView | undefined);
502
428
  const hdrCompositedView = resolve?.resolve('hdrComposited') as TextureView | undefined;
503
- if (!hdrColorView || !bloomBlurVView || !hdrCompositedView) {
504
- throwBloomRecordFailure('Bloom composite pass resolves its source and target views');
429
+ if (!hdrColorView || !finestBloomView || !hdrCompositedView) {
430
+ throwBloomRecordFailure('Bloom composite pass resolves scene, finest Bloom, and target views');
505
431
  }
506
432
  const bglComposite = pp.bloomCompositeBindGroupLayout;
507
433
  const bloomSampler = pp.bloomSampler;
@@ -517,12 +443,12 @@ export function recordBloomCompositePass(
517
443
  if (!paramsWrite.ok) throw paramsWrite.error;
518
444
  stageBloomUpload(_c);
519
445
 
520
- // 2. Identity-cached BindGroup (2 tex: hdrColor + bloomBlurV, 1 sampler,
446
+ // 2. Identity-cached BindGroup (2 tex: hdrColor + finest Bloom, 1 sampler,
521
447
  // 1 UBO). Keys on both sampled views: resize retires both hdrColor and
522
- // bloomBlurV, so a two-node chain rebuilds when either identity changes.
448
+ // finest Bloom view, so a two-node chain rebuilds when either identity changes.
523
449
  const bindGroup = getOrCreateFromChain(
524
450
  frameState.postProcessBgCache,
525
- [hdrColorView, bloomBlurVView],
451
+ [hdrColorView, finestBloomView],
526
452
  'bloom-composite',
527
453
  () => {
528
454
  const bgRes = runtime.device.createBindGroup({
@@ -530,7 +456,7 @@ export function recordBloomCompositePass(
530
456
  layout: bglComposite,
531
457
  entries: [
532
458
  { binding: 0, resource: { kind: 'textureView', value: hdrColorView } },
533
- { binding: 1, resource: { kind: 'textureView', value: bloomBlurVView } },
459
+ { binding: 1, resource: { kind: 'textureView', value: finestBloomView } },
534
460
  { binding: 2, resource: { kind: 'sampler', value: bloomSampler } },
535
461
  {
536
462
  binding: 3,
@@ -572,6 +498,7 @@ export function recordFxaaPass(
572
498
  resolve: ResolveContext,
573
499
  graphPass?: RhiRenderPassEncoder,
574
500
  paramsOverride?: Uint8Array,
501
+ graphOutputFormat?: GPUTextureFormat,
575
502
  ): void {
576
503
  const { runtime, pipelineState, encoder, camera, currentTexture } = c;
577
504
  // FXAA samples the graph-owned LDR target and writes the current surface.
@@ -644,9 +571,17 @@ export function recordFxaaPass(
644
571
  c.bindGroupCounts,
645
572
  );
646
573
 
647
- const fxaaColorFormat = runtime.device.caps.storageBuffer
648
- ? pipelineState.format
649
- : pipelineState.colorAttachmentFormat;
574
+ // Typed graph passes own their attachment format. In particular, the
575
+ // barrel/LUT split keeps FXAA in the graph-owned rgba16float domain before
576
+ // the final output encoding; falling back to the swapchain format here
577
+ // builds a BGRA pipeline against an RGBA16F attachment and invalidates the
578
+ // command buffer on WebGPU.
579
+ const fxaaColorFormat =
580
+ graphPass !== undefined && graphOutputFormat !== undefined
581
+ ? graphOutputFormat
582
+ : runtime.device.caps.storageBuffer
583
+ ? pipelineState.format
584
+ : pipelineState.colorAttachmentFormat;
650
585
  let fxaaPass = graphPass;
651
586
  if (fxaaPass === undefined) {
652
587
  const fxaaOutputView = runtime.device.createTextureView(currentTexture, {
@@ -668,7 +603,22 @@ export function recordFxaaPass(
668
603
  ) as never,
669
604
  );
670
605
  }
671
- fxaaPass.setPipeline(pipelineState.perPassResources.fxaaPipeline);
606
+ let fxaaPipeline = pipelineState.perPassResources.fxaaPipeline;
607
+ if (graphPass !== undefined && graphOutputFormat !== undefined) {
608
+ const entry = runtime.lookupPostProcess?.(FXAA_POST_PROCESS_ID);
609
+ const rebuilt =
610
+ entry === undefined || runtime.getPostProcessPipeline === undefined
611
+ ? null
612
+ : runtime.getPostProcessPipeline(
613
+ FXAA_POST_PROCESS_ID,
614
+ fxaaBglLayout,
615
+ [graphOutputFormat],
616
+ entry,
617
+ );
618
+ if (rebuilt !== null) fxaaPipeline = rebuilt;
619
+ }
620
+ if (fxaaPipeline === null) return;
621
+ fxaaPass.setPipeline(fxaaPipeline);
672
622
  fxaaPass.setBindGroup(0, fxaaBg);
673
623
  fxaaPass.draw(3, 1, 0, 0);
674
624
  if (graphPass === undefined) fxaaPass.end();