@forgeax/engine-render 0.1.33 → 0.1.35

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 +1062 -127
  2. package/dist/assembly/backend-contract.d.ts +2 -0
  3. package/dist/assembly/backend-contract.d.ts.map +1 -1
  4. package/dist/assembly/barrel-distortion-inspection.d.ts +3 -0
  5. package/dist/assembly/barrel-distortion-inspection.d.ts.map +1 -0
  6. package/dist/assembly/canvas-draw-guard.d.ts +3 -0
  7. package/dist/assembly/canvas-draw-guard.d.ts.map +1 -0
  8. package/dist/assembly/cloud-shadow-entry.d.ts +4 -0
  9. package/dist/assembly/cloud-shadow-entry.d.ts.map +1 -0
  10. package/dist/assembly/device-feature-admission.d.ts +2 -2
  11. package/dist/assembly/dynamic-geometry-host.d.ts +4 -1
  12. package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -1
  13. package/dist/assembly/dynamic-geometry-runtime.d.ts +1 -1
  14. package/dist/assembly/dynamic-geometry-runtime.d.ts.map +1 -1
  15. package/dist/assembly/factory.d.ts +1 -1
  16. package/dist/assembly/factory.d.ts.map +1 -1
  17. package/dist/assembly/host-contract.d.ts +6 -5
  18. package/dist/assembly/host-contract.d.ts.map +1 -1
  19. package/dist/assembly/material/assembly.d.ts.map +1 -1
  20. package/dist/assembly/material/pipeline-helpers.d.ts +5 -0
  21. package/dist/assembly/material/pipeline-helpers.d.ts.map +1 -1
  22. package/dist/assembly/material-shader-policy.d.ts +16 -2
  23. package/dist/assembly/material-shader-policy.d.ts.map +1 -1
  24. package/dist/assembly/material-shader-prewarm.d.ts.map +1 -1
  25. package/dist/assembly/recovery/device-loss-fanout.d.ts.map +1 -1
  26. package/dist/assembly/recovery/renderer-recover.d.ts +2 -0
  27. package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
  28. package/dist/assembly/render-feature-post-processes.d.ts +6 -0
  29. package/dist/assembly/render-feature-post-processes.d.ts.map +1 -0
  30. package/dist/assembly/render-target-host.d.ts +5 -0
  31. package/dist/assembly/render-target-host.d.ts.map +1 -1
  32. package/dist/assembly/renderer-facade.d.ts.map +1 -1
  33. package/dist/assembly/renderer-feature-inspection.d.ts +1 -1
  34. package/dist/assembly/renderer-feature-inspection.d.ts.map +1 -1
  35. package/dist/assembly/renderer-frame-transaction.d.ts +12 -0
  36. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
  37. package/dist/assembly/renderer-inspection.d.ts +11 -0
  38. package/dist/assembly/renderer-inspection.d.ts.map +1 -1
  39. package/dist/assembly/webgpu-pbr-ready.d.ts +1 -0
  40. package/dist/assembly/webgpu-pbr-ready.d.ts.map +1 -1
  41. package/dist/assembly/webgpu-ready-per-pass.d.ts +39 -0
  42. package/dist/assembly/webgpu-ready-per-pass.d.ts.map +1 -0
  43. package/dist/assembly/webgpu-ready.d.ts +1 -1
  44. package/dist/assembly/webgpu-ready.d.ts.map +1 -1
  45. package/dist/assembly/webgpu-renderer-bootstrap.d.ts.map +1 -1
  46. package/dist/assembly/webgpu-renderer-observation-owner.d.ts +35 -0
  47. package/dist/assembly/webgpu-renderer-observation-owner.d.ts.map +1 -0
  48. package/dist/assembly/webgpu-renderer.d.ts +2 -1
  49. package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
  50. package/dist/authoring.mjs +2 -4
  51. package/dist/authoring.mjs.map +1 -1
  52. package/dist/barrel-distortion.d.ts +47 -0
  53. package/dist/barrel-distortion.d.ts.map +1 -0
  54. package/dist/chunk-3XUBWRY2.mjs +1842 -0
  55. package/dist/chunk-3XUBWRY2.mjs.map +1 -0
  56. package/dist/{chunk-OO3DRYK7.mjs → chunk-G6HDNGY7.mjs} +2400 -1767
  57. package/dist/chunk-G6HDNGY7.mjs.map +1 -0
  58. package/dist/{chunk-ZDQWGQW7.mjs → chunk-LM5IE7GF.mjs} +4 -4
  59. package/dist/{chunk-ZDQWGQW7.mjs.map → chunk-LM5IE7GF.mjs.map} +1 -1
  60. package/dist/{chunk-VOZWDM3L.mjs → chunk-LNIUIKQ7.mjs} +1514 -498
  61. package/dist/chunk-LNIUIKQ7.mjs.map +1 -0
  62. package/dist/chunk-MXTWKZO4.mjs +3268 -0
  63. package/dist/chunk-MXTWKZO4.mjs.map +1 -0
  64. package/dist/chunk-MZ4C7EHF.mjs +6942 -0
  65. package/dist/chunk-MZ4C7EHF.mjs.map +1 -0
  66. package/dist/chunk-RIPAEGI6.mjs +48 -0
  67. package/dist/chunk-RIPAEGI6.mjs.map +1 -0
  68. package/dist/{chunk-LEAXOMYJ.mjs → chunk-SGPUJW3F.mjs} +117 -5
  69. package/dist/chunk-SGPUJW3F.mjs.map +1 -0
  70. package/dist/{chunk-PA5DRJNI.mjs → chunk-X2KA6WHM.mjs} +29 -4
  71. package/dist/chunk-X2KA6WHM.mjs.map +1 -0
  72. package/dist/{chunk-BLXGONR2.mjs → chunk-XSFB7XXQ.mjs} +51 -4
  73. package/dist/chunk-XSFB7XXQ.mjs.map +1 -0
  74. package/dist/cloud/density.d.ts +55 -0
  75. package/dist/cloud/density.d.ts.map +1 -0
  76. package/dist/cloud/extract.d.ts +25 -0
  77. package/dist/cloud/extract.d.ts.map +1 -0
  78. package/dist/cloud/feature.d.ts +57 -0
  79. package/dist/cloud/feature.d.ts.map +1 -0
  80. package/dist/cloud/frame-context.d.ts +8 -0
  81. package/dist/cloud/frame-context.d.ts.map +1 -0
  82. package/dist/cloud/inspection.d.ts +59 -0
  83. package/dist/cloud/inspection.d.ts.map +1 -0
  84. package/dist/cloud/optics.d.ts +56 -0
  85. package/dist/cloud/optics.d.ts.map +1 -0
  86. package/dist/cloud/parameters.d.ts +73 -0
  87. package/dist/cloud/parameters.d.ts.map +1 -0
  88. package/dist/cloud/resources.d.ts +60 -0
  89. package/dist/cloud/resources.d.ts.map +1 -0
  90. package/dist/cloud/shadow.d.ts +42 -0
  91. package/dist/cloud/shadow.d.ts.map +1 -0
  92. package/dist/cloud/temporal.d.ts +74 -0
  93. package/dist/cloud/temporal.d.ts.map +1 -0
  94. package/dist/components/barrel-distortion.d.ts +13 -0
  95. package/dist/components/barrel-distortion.d.ts.map +1 -0
  96. package/dist/components/cloud-layer.d.ts +29 -0
  97. package/dist/components/cloud-layer.d.ts.map +1 -0
  98. package/dist/components/index.d.ts +2 -0
  99. package/dist/components/index.d.ts.map +1 -1
  100. package/dist/components/instances.d.ts +20 -6
  101. package/dist/components/instances.d.ts.map +1 -1
  102. package/dist/construct-renderer.d.ts +1 -1
  103. package/dist/construct-renderer.d.ts.map +1 -1
  104. package/dist/construct-renderer.mjs +8406 -5785
  105. package/dist/construct-renderer.mjs.map +1 -1
  106. package/dist/device/gpu-residency.d.ts +19 -19
  107. package/dist/device/gpu-residency.d.ts.map +1 -1
  108. package/dist/dynamic-geometry.d.ts +5 -1
  109. package/dist/dynamic-geometry.d.ts.map +1 -1
  110. package/dist/errors/cloud.d.ts +59 -0
  111. package/dist/errors/cloud.d.ts.map +1 -0
  112. package/dist/errors/render.d.ts +20 -5
  113. package/dist/errors/render.d.ts.map +1 -1
  114. package/dist/examples/single-layer-medium-surface.d.ts +47 -0
  115. package/dist/examples/single-layer-medium-surface.d.ts.map +1 -0
  116. package/dist/extract/camera.d.ts.map +1 -1
  117. package/dist/extract/contracts.d.ts +5 -1
  118. package/dist/extract/contracts.d.ts.map +1 -1
  119. package/dist/extract/material-context.d.ts +7 -0
  120. package/dist/extract/material-context.d.ts.map +1 -0
  121. package/dist/features/barrel-distortion.d.ts +29 -0
  122. package/dist/features/barrel-distortion.d.ts.map +1 -0
  123. package/dist/features/error-reporting.d.ts +6 -2
  124. package/dist/features/error-reporting.d.ts.map +1 -1
  125. package/dist/features/host.d.ts +15 -0
  126. package/dist/features/host.d.ts.map +1 -1
  127. package/dist/features/plan.d.ts +10 -0
  128. package/dist/features/plan.d.ts.map +1 -1
  129. package/dist/features/render-graph-contribution.d.ts +5 -0
  130. package/dist/features/render-graph-contribution.d.ts.map +1 -1
  131. package/dist/features/render-graph-raster.d.ts +1 -0
  132. package/dist/features/render-graph-raster.d.ts.map +1 -1
  133. package/dist/features/targets.d.ts +2 -0
  134. package/dist/features/targets.d.ts.map +1 -1
  135. package/dist/features/types.d.ts +48 -0
  136. package/dist/features/types.d.ts.map +1 -1
  137. package/dist/fullscreen-post-process-pass.d.ts +15 -7
  138. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  139. package/dist/glyph-text-layout-system.d.ts +1 -1
  140. package/dist/glyph-text-layout-system.d.ts.map +1 -1
  141. package/dist/gpu-dirty-ranges.d.ts +11 -0
  142. package/dist/gpu-dirty-ranges.d.ts.map +1 -0
  143. package/dist/gpu-driven/batch-topology.d.ts +17 -0
  144. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  145. package/dist/gpu-driven/material-artifacts.d.ts +6 -0
  146. package/dist/gpu-driven/material-artifacts.d.ts.map +1 -1
  147. package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
  148. package/dist/gpu-driven/production-raster-material.d.ts +178 -0
  149. package/dist/gpu-driven/production-raster-material.d.ts.map +1 -0
  150. package/dist/gpu-driven/production-raster.d.ts +47 -3
  151. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  152. package/dist/gpu-driven/resource-allocation.d.ts +31 -0
  153. package/dist/gpu-driven/resource-allocation.d.ts.map +1 -0
  154. package/dist/gpu-driven/shadow-ownership.d.ts +14 -0
  155. package/dist/gpu-driven/shadow-ownership.d.ts.map +1 -0
  156. package/dist/gpu-driven/view-gpu.d.ts +26 -2
  157. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  158. package/dist/gpu-scene.d.ts +5 -0
  159. package/dist/gpu-scene.d.ts.map +1 -1
  160. package/dist/hdrp-buffers.d.ts +2 -2
  161. package/dist/hdrp-buffers.d.ts.map +1 -1
  162. package/dist/ibl/frame-resources.d.ts.map +1 -1
  163. package/dist/ibl/skylight-bind-group.d.ts +14 -5
  164. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  165. package/dist/index.d.ts +30 -7
  166. package/dist/index.d.ts.map +1 -1
  167. package/dist/index.mjs +780 -9
  168. package/dist/index.mjs.map +1 -1
  169. package/dist/inspection-types.d.ts +135 -1
  170. package/dist/inspection-types.d.ts.map +1 -1
  171. package/dist/instance-buffer-cache.d.ts +4 -4
  172. package/dist/instance-buffer-cache.d.ts.map +1 -1
  173. package/dist/instances.d.ts +47 -100
  174. package/dist/instances.d.ts.map +1 -1
  175. package/dist/internal.mjs +7 -8
  176. package/dist/internal.mjs.map +1 -1
  177. package/dist/pbr-pipeline.d.ts +22 -4
  178. package/dist/pbr-pipeline.d.ts.map +1 -1
  179. package/dist/pipeline/single-layer-medium-passes.d.ts +73 -0
  180. package/dist/pipeline/single-layer-medium-passes.d.ts.map +1 -0
  181. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  182. package/dist/pipeline/standard-output/graph.d.ts.map +1 -1
  183. package/dist/pipeline/standard-output/lut-gpu.d.ts +2 -2
  184. package/dist/pipeline/standard-output/lut-gpu.d.ts.map +1 -1
  185. package/dist/pipeline/standard-output/resources.d.ts +2 -2
  186. package/dist/pipeline/standard-output/resources.d.ts.map +1 -1
  187. package/dist/pipeline/standard-output/types.d.ts +4 -2
  188. package/dist/pipeline/standard-output/types.d.ts.map +1 -1
  189. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  190. package/dist/pipeline/standard-post.d.ts.map +1 -1
  191. package/dist/pipeline-builder.d.ts +1 -1
  192. package/dist/pipeline-builder.d.ts.map +1 -1
  193. package/dist/plugin.d.ts.map +1 -1
  194. package/dist/prepare/prepared-graphics-resolver.d.ts +2 -0
  195. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
  196. package/dist/publication/contract.d.ts +77 -0
  197. package/dist/publication/contract.d.ts.map +1 -0
  198. package/dist/publication/dependencies.d.ts +7 -0
  199. package/dist/publication/dependencies.d.ts.map +1 -0
  200. package/dist/publication/prepare-geometry.d.ts +9 -0
  201. package/dist/publication/prepare-geometry.d.ts.map +1 -0
  202. package/dist/publication/programs.d.ts +5 -0
  203. package/dist/publication/programs.d.ts.map +1 -0
  204. package/dist/publication/publisher.d.ts +33 -0
  205. package/dist/publication/publisher.d.ts.map +1 -0
  206. package/dist/publication/receiver.d.ts +29 -0
  207. package/dist/publication/receiver.d.ts.map +1 -0
  208. package/dist/publication/resource-scope.d.ts +18 -0
  209. package/dist/publication/resource-scope.d.ts.map +1 -0
  210. package/dist/publication/targets.d.ts +33 -0
  211. package/dist/publication/targets.d.ts.map +1 -0
  212. package/dist/publication/video.d.ts +5 -0
  213. package/dist/publication/video.d.ts.map +1 -0
  214. package/dist/record/barrel-distortion-frame.d.ts +15 -0
  215. package/dist/record/barrel-distortion-frame.d.ts.map +1 -0
  216. package/dist/record/dynamic-geometry-consumption.d.ts +10 -2
  217. package/dist/record/dynamic-geometry-consumption.d.ts.map +1 -1
  218. package/dist/record/fold-buckets.d.ts +95 -0
  219. package/dist/record/fold-buckets.d.ts.map +1 -0
  220. package/dist/record/fold-instance-buffer.d.ts +6 -0
  221. package/dist/record/fold-instance-buffer.d.ts.map +1 -0
  222. package/dist/record/frame-lighting.d.ts +1 -0
  223. package/dist/record/frame-lighting.d.ts.map +1 -1
  224. package/dist/record/frame-snapshot.d.ts +43 -9
  225. package/dist/record/frame-snapshot.d.ts.map +1 -1
  226. package/dist/record/frame.d.ts +15 -65
  227. package/dist/record/frame.d.ts.map +1 -1
  228. package/dist/record/gpu-draw-receipts.d.ts +11 -0
  229. package/dist/record/gpu-draw-receipts.d.ts.map +1 -0
  230. package/dist/record/gpu-timing.d.ts +8 -0
  231. package/dist/record/gpu-timing.d.ts.map +1 -1
  232. package/dist/record/helpers.d.ts +2 -2
  233. package/dist/record/helpers.d.ts.map +1 -1
  234. package/dist/record/main-pass-geometry.d.ts +22 -6
  235. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  236. package/dist/record/main-pass-material.d.ts +14 -10
  237. package/dist/record/main-pass-material.d.ts.map +1 -1
  238. package/dist/record/main-pass-sprite-draws.d.ts +3 -16
  239. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  240. package/dist/record/main-pass.d.ts +13 -2
  241. package/dist/record/main-pass.d.ts.map +1 -1
  242. package/dist/record/motion-blur-receipt.d.ts +11 -0
  243. package/dist/record/motion-blur-receipt.d.ts.map +1 -0
  244. package/dist/record/prepared-material-bindings.d.ts +3 -3
  245. package/dist/record/prepared-material-bindings.d.ts.map +1 -1
  246. package/dist/record/probe-blend-buffer.d.ts +16 -0
  247. package/dist/record/probe-blend-buffer.d.ts.map +1 -0
  248. package/dist/record/recovery-pipeline.d.ts.map +1 -1
  249. package/dist/record/render-context.d.ts +24 -5
  250. package/dist/record/render-context.d.ts.map +1 -1
  251. package/dist/record/shadow-pass.d.ts +2 -0
  252. package/dist/record/shadow-pass.d.ts.map +1 -1
  253. package/dist/record/skybox-post-pass.d.ts +1 -1
  254. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  255. package/dist/record/sprite-instance-buffer.d.ts +31 -0
  256. package/dist/record/sprite-instance-buffer.d.ts.map +1 -0
  257. package/dist/record/target-capture-graph.d.ts +19 -0
  258. package/dist/record/target-capture-graph.d.ts.map +1 -0
  259. package/dist/record/typed-frame-graph.d.ts +24 -15
  260. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  261. package/dist/record/view-ubo.d.ts +11 -3
  262. package/dist/record/view-ubo.d.ts.map +1 -1
  263. package/dist/record/volume-params.d.ts +9 -0
  264. package/dist/record/volume-params.d.ts.map +1 -0
  265. package/dist/recovery/render-system-candidate.d.ts +14 -4
  266. package/dist/recovery/render-system-candidate.d.ts.map +1 -1
  267. package/dist/reflection/record-owner.d.ts.map +1 -1
  268. package/dist/render-contract.d.ts +46 -5
  269. package/dist/render-contract.d.ts.map +1 -1
  270. package/dist/render-graph-primitives.d.ts.map +1 -1
  271. package/dist/render-pipeline.d.ts +103 -2
  272. package/dist/render-pipeline.d.ts.map +1 -1
  273. package/dist/render-system-extract-tail.d.ts +3 -2
  274. package/dist/render-system-extract-tail.d.ts.map +1 -1
  275. package/dist/render-system-extract.d.ts +18 -9
  276. package/dist/render-system-extract.d.ts.map +1 -1
  277. package/dist/render-system-presentation.d.ts +23 -0
  278. package/dist/render-system-presentation.d.ts.map +1 -0
  279. package/dist/render-system-producer-roots.d.ts +10 -0
  280. package/dist/render-system-producer-roots.d.ts.map +1 -0
  281. package/dist/render-system-projections.d.ts +3 -2
  282. package/dist/render-system-projections.d.ts.map +1 -1
  283. package/dist/render-system-residency.d.ts +12 -0
  284. package/dist/render-system-residency.d.ts.map +1 -0
  285. package/dist/render-system.d.ts +22 -21
  286. package/dist/render-system.d.ts.map +1 -1
  287. package/dist/scene/probe-blend.d.ts +27 -0
  288. package/dist/scene/probe-blend.d.ts.map +1 -1
  289. package/dist/scene/render-scene.d.ts +18 -7
  290. package/dist/scene/render-scene.d.ts.map +1 -1
  291. package/dist/scene/render-source.d.ts +42 -0
  292. package/dist/scene/render-source.d.ts.map +1 -0
  293. package/dist/scene/source-systems.d.ts +6 -0
  294. package/dist/scene/source-systems.d.ts.map +1 -0
  295. package/dist/ssao-buffers.d.ts +9 -0
  296. package/dist/ssao-buffers.d.ts.map +1 -1
  297. package/dist/surface/dynamic-input.d.ts +133 -0
  298. package/dist/surface/dynamic-input.d.ts.map +1 -0
  299. package/dist/surface/gpu-driven.d.ts +41 -0
  300. package/dist/surface/gpu-driven.d.ts.map +1 -0
  301. package/dist/surface/submission-observation.d.ts +136 -0
  302. package/dist/surface/submission-observation.d.ts.map +1 -0
  303. package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
  304. package/dist/systems/skin-palette-types.d.ts +10 -0
  305. package/dist/systems/skin-palette-types.d.ts.map +1 -1
  306. package/dist/systems/transparent-dispatch.d.ts +2 -2
  307. package/dist/systems/transparent-dispatch.d.ts.map +1 -1
  308. package/dist/systems/transparent-sort-config.d.ts +2 -1
  309. package/dist/systems/transparent-sort-config.d.ts.map +1 -1
  310. package/dist/temporal/gpu.d.ts +13 -1
  311. package/dist/temporal/gpu.d.ts.map +1 -1
  312. package/dist/temporal/index.mjs +6 -7
  313. package/dist/temporal/inspection.d.ts.map +1 -1
  314. package/dist/temporal/standard-scene-data.d.ts.map +1 -1
  315. package/dist/temporal/target-coverage-attachment.d.ts.map +1 -1
  316. package/dist/transmission/single-layer-medium.d.ts +89 -0
  317. package/dist/transmission/single-layer-medium.d.ts.map +1 -0
  318. package/dist/typed-render-graph-primitives.d.ts +14 -2
  319. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  320. package/dist/volume/component.d.ts +9 -4
  321. package/dist/volume/component.d.ts.map +1 -1
  322. package/dist/volume/extract.d.ts +1 -1
  323. package/dist/volume/extract.d.ts.map +1 -1
  324. package/dist/volume/inspection.d.ts +2 -0
  325. package/dist/volume/inspection.d.ts.map +1 -1
  326. package/dist/volume/passes.d.ts +4 -1
  327. package/dist/volume/passes.d.ts.map +1 -1
  328. package/dist/volume/resources.d.ts.map +1 -1
  329. package/package.json +22 -21
  330. package/src/__tests__/atmosphere-daylight.dawn.test.ts +72 -0
  331. package/src/__tests__/auto-exposure-transaction.integration.test.ts +4 -9
  332. package/src/__tests__/barrel-distortion-lkg.integration.test.ts +353 -0
  333. package/src/__tests__/barrel-distortion.dawn.test.ts +41 -0
  334. package/src/__tests__/barrel-distortion.unit.test.ts +364 -0
  335. package/src/__tests__/construct-renderer-identity.unit.test.ts +49 -0
  336. package/src/__tests__/detached-recovery-graph.unit.test.ts +277 -0
  337. package/src/__tests__/device-feature-admission.unit.test.ts +3 -2
  338. package/src/__tests__/device-loss-fanout.unit.test.ts +36 -1
  339. package/src/__tests__/docs-gate-green.unit.test.ts +112 -1
  340. package/src/__tests__/factory-contract.integration.test.ts +295 -45
  341. package/src/__tests__/feature-depth-input.dawn.test.ts +129 -2
  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-material-artifacts.unit.test.ts +143 -0
  347. package/src/__tests__/gpu-driven-pbr.dawn.test.ts +5 -6
  348. package/src/__tests__/gpu-driven-production.integration.test.ts +482 -3
  349. package/src/__tests__/gpu-driven-shadow-views.dawn.test.ts +6 -5
  350. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +94 -6
  351. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +18 -2
  352. package/src/__tests__/gpu-driven-view.browser.test.ts +5 -8
  353. package/src/__tests__/gpu-driven-view.dawn.test.ts +6 -2
  354. package/src/__tests__/gpu-driven-view.unit.test.ts +1 -1
  355. package/src/__tests__/gpu-pass-timing-lifecycle.integration.test.ts +1 -0
  356. package/src/__tests__/gpu-pass-timing.browser.test.ts +6 -4
  357. package/src/__tests__/gpu-pass-timing.rhi-null.unit.test.ts +1 -0
  358. package/src/__tests__/gpu-scene.unit.test.ts +119 -9
  359. package/src/__tests__/instance-allocation-failure.unit.test.ts +57 -0
  360. package/src/__tests__/instances-culling.integration.test.ts +10 -36
  361. package/src/__tests__/instances-store.unit.test.ts +97 -305
  362. package/src/__tests__/instances-world-ownership.integration.test.ts +62 -0
  363. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +4 -1
  364. package/src/__tests__/main-pass-material-medium-selection.unit.test.ts +145 -0
  365. package/src/__tests__/material-shader-prewarm.unit.test.ts +59 -0
  366. package/src/__tests__/material-snapshot-mutation.integration.test.ts +39 -1
  367. package/src/__tests__/materials-standard-contract.unit.test.ts +0 -1
  368. package/src/__tests__/morph-culling-reentry.dawn.test.ts +5 -5
  369. package/src/__tests__/morph-visual-evidence.integration.test.ts +8 -7
  370. package/src/__tests__/motion-blur-compute.dawn.test.ts +13 -7
  371. package/src/__tests__/motion-blur.pixel.integration.test.ts +2 -2
  372. package/src/__tests__/nineslice-handle-surface.unit.test.ts +4 -4
  373. package/src/__tests__/pbr-view-layout.unit.test.ts +9 -0
  374. package/src/__tests__/physical-clearcoat.integration.test.ts +66 -8
  375. package/src/__tests__/physical-material-budget.unit.test.ts +40 -0
  376. package/src/__tests__/prepared-graphics-capability.unit.test.ts +66 -2
  377. package/src/__tests__/probe-bindings.unit.test.ts +582 -1
  378. package/src/__tests__/probe-scene-dirty.integration.test.ts +28 -1
  379. package/src/__tests__/receipt-observation-retirement.unit.test.ts +65 -0
  380. package/src/__tests__/recovery-candidate-prepare.contract.test.ts +69 -0
  381. package/src/__tests__/render-error-code-owner.test-d.ts +8 -0
  382. package/src/__tests__/render-feature-diagnostics.unit.test.ts +15 -2
  383. package/src/__tests__/render-feature-error-reporting.unit.test.ts +21 -1
  384. package/src/__tests__/render-feature-prepared-diagnostics.unit.test.ts +10 -1
  385. package/src/__tests__/render-feature-retry.unit.test.ts +12 -1
  386. package/src/__tests__/render-scene-mixed-updates.integration.test.ts +145 -19
  387. package/src/__tests__/render-scene-projection.unit.test.ts +36 -11
  388. package/src/__tests__/render-scene-temporal-retry.unit.test.ts +20 -20
  389. package/src/__tests__/render-target-probe-soak.perf.test.ts +2 -2
  390. package/src/__tests__/render-temporal-environment-consumer.browser.test.ts +3 -3
  391. package/src/__tests__/render-temporal-environment-consumer.dawn.test.ts +5 -2
  392. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +42 -8
  393. package/src/__tests__/renderer-frame-generation-fence.integration.test.ts +16 -0
  394. package/src/__tests__/renderer-frame-transaction.integration.test.ts +26 -10
  395. package/src/__tests__/resource-allocation.unit.test.ts +123 -0
  396. package/src/__tests__/single-layer-medium-passes.unit.test.ts +275 -0
  397. package/src/__tests__/skin-motion-regression.unit.test.ts +70 -1
  398. package/src/__tests__/skin-palette-recycling.dawn.test.ts +97 -0
  399. package/src/__tests__/skinned-shadow-caster.test.ts +15 -0
  400. package/src/__tests__/ssr-carrier-public-contract.unit.test.ts +21 -0
  401. package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +4 -4
  402. package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +2 -2
  403. package/src/__tests__/ssr-gpu-dispatch.ts +1 -1
  404. package/src/__tests__/ssr-receiver-coverage.dawn.test.ts +6 -2
  405. package/src/__tests__/standard-output-chain-contract.unit.test.ts +28 -0
  406. package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +46 -1
  407. package/src/__tests__/standard-pipeline.integration.test.ts +182 -1
  408. package/src/__tests__/surface-dynamic-buffer-lifecycle.unit.test.ts +506 -0
  409. package/src/__tests__/surface-submission-observation.unit.test.ts +812 -0
  410. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +32 -0
  411. package/src/__tests__/temporal-performance.integration.test.ts +3 -3
  412. package/src/__tests__/visibility-instances.integration.test.ts +7 -19
  413. package/src/__tests__/visibility-producer-matrix.integration.test.ts +9 -20
  414. package/src/__tests__/volume-optics-oracle.unit.test.ts +4 -2
  415. package/src/__tests__/volumetric-fog-budget-recovery.integration.test.ts +30 -20
  416. package/src/__tests__/volumetric-fog-errors.unit.test.ts +4 -3
  417. package/src/__tests__/volumetric-fog-multiple.unit.test.ts +55 -0
  418. package/src/__tests__/volumetric-fog-spot-frame-optics.integration.test.ts +1 -1
  419. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +113 -9
  420. package/src/__tests__/volumetric-fog-topology.unit.test.ts +5 -3
  421. package/src/assembly/backend-contract.ts +30 -0
  422. package/src/assembly/barrel-distortion-inspection.ts +22 -0
  423. package/src/assembly/canvas-draw-guard.ts +11 -0
  424. package/src/assembly/cloud-shadow-entry.ts +22 -0
  425. package/src/assembly/device-feature-admission.ts +2 -2
  426. package/src/assembly/dynamic-geometry-host.ts +65 -37
  427. package/src/assembly/dynamic-geometry-runtime.ts +7 -1
  428. package/src/assembly/factory.ts +2 -30
  429. package/src/assembly/host-contract.ts +8 -5
  430. package/src/assembly/material/assembly.ts +25 -13
  431. package/src/assembly/material/pipeline-helpers.ts +53 -12
  432. package/src/assembly/material-shader-policy.ts +55 -0
  433. package/src/assembly/material-shader-prewarm.ts +21 -10
  434. package/src/assembly/recovery/device-loss-fanout.ts +13 -0
  435. package/src/assembly/recovery/renderer-recover.ts +50 -18
  436. package/src/assembly/render-feature-post-processes.ts +54 -0
  437. package/src/assembly/render-target-host.ts +57 -47
  438. package/src/assembly/renderer-facade.ts +7 -2
  439. package/src/assembly/renderer-feature-inspection.ts +8 -2
  440. package/src/assembly/renderer-frame-transaction.ts +23 -0
  441. package/src/assembly/renderer-inspection.ts +28 -0
  442. package/src/assembly/skin-palette-owner.ts +1 -1
  443. package/src/assembly/temporal-post-process-prewarm.ts +3 -3
  444. package/src/assembly/webgpu-pbr-ready.ts +9 -1
  445. package/src/assembly/webgpu-ready-per-pass.ts +104 -0
  446. package/src/assembly/webgpu-ready.ts +116 -62
  447. package/src/assembly/webgpu-renderer-bootstrap.ts +0 -12
  448. package/src/assembly/webgpu-renderer-observation-owner.ts +222 -0
  449. package/src/assembly/webgpu-renderer.ts +303 -313
  450. package/src/assembly/webgpu-vertex-layouts.ts +1 -1
  451. package/src/barrel-distortion.ts +247 -0
  452. package/src/cloud/__tests__/cloud-density-parity.dawn.test.ts +173 -0
  453. package/src/cloud/__tests__/cloud-layer-framebuffer-y.dawn.test.ts +265 -0
  454. package/src/cloud/__tests__/cloud-layer.browser.test.ts +432 -0
  455. package/src/cloud/__tests__/cloud-layer.unit.test.ts +634 -0
  456. package/src/cloud/density.ts +600 -0
  457. package/src/cloud/extract.ts +110 -0
  458. package/src/cloud/feature.ts +1810 -0
  459. package/src/cloud/frame-context.ts +42 -0
  460. package/src/cloud/inspection.ts +130 -0
  461. package/src/cloud/optics.ts +285 -0
  462. package/src/cloud/parameters.ts +255 -0
  463. package/src/cloud/resources.ts +122 -0
  464. package/src/cloud/shadow.ts +167 -0
  465. package/src/cloud/temporal.ts +226 -0
  466. package/src/components/barrel-distortion.ts +46 -0
  467. package/src/components/cloud-layer.ts +47 -0
  468. package/src/components/index.ts +2 -0
  469. package/src/components/instances.ts +18 -45
  470. package/src/components/sprite-instances.ts +1 -1
  471. package/src/construct-renderer.ts +1 -1
  472. package/src/device/gpu-residency.ts +26 -25
  473. package/src/dynamic-geometry.ts +12 -1
  474. package/src/errors/cloud.ts +103 -0
  475. package/src/errors/render.ts +47 -8
  476. package/src/examples/single-layer-medium-surface.ts +59 -0
  477. package/src/extract/camera.ts +15 -1
  478. package/src/extract/contracts.ts +5 -0
  479. package/src/extract/material-context.ts +21 -0
  480. package/src/features/barrel-distortion.ts +172 -0
  481. package/src/features/error-reporting.ts +26 -6
  482. package/src/features/host.ts +128 -19
  483. package/src/features/plan.ts +10 -0
  484. package/src/features/render-graph-contribution.ts +9 -0
  485. package/src/features/render-graph-raster.ts +45 -3
  486. package/src/features/targets.ts +66 -0
  487. package/src/features/types.ts +51 -0
  488. package/src/fullscreen-post-process-pass.ts +41 -9
  489. package/src/glyph-text-layout-system.ts +2 -2
  490. package/src/gpu-dirty-ranges.ts +48 -0
  491. package/src/gpu-driven/batch-topology.ts +53 -0
  492. package/src/gpu-driven/material-artifacts.ts +33 -25
  493. package/src/gpu-driven/prepared-draw.ts +12 -4
  494. package/src/gpu-driven/production-raster-material.ts +1894 -0
  495. package/src/gpu-driven/production-raster.ts +825 -784
  496. package/src/gpu-driven/resource-allocation.ts +142 -0
  497. package/src/gpu-driven/shadow-ownership.ts +71 -0
  498. package/src/gpu-driven/view-gpu.ts +164 -10
  499. package/src/gpu-scene.ts +75 -84
  500. package/src/hdrp-buffers.ts +4 -3
  501. package/src/ibl/frame-resources.ts +0 -1
  502. package/src/ibl/skylight-bind-group.ts +62 -32
  503. package/src/index.ts +205 -9
  504. package/src/inspection-types.ts +162 -0
  505. package/src/instance-buffer-cache.ts +4 -4
  506. package/src/instances.ts +152 -569
  507. package/src/pbr-pipeline.ts +230 -30
  508. package/src/pipeline/single-layer-medium-passes.ts +267 -0
  509. package/src/pipeline/standard-forward-lane.ts +313 -57
  510. package/src/pipeline/standard-output/graph.ts +8 -2
  511. package/src/pipeline/standard-output/lut-gpu.ts +3 -3
  512. package/src/pipeline/standard-output/resources.ts +2 -2
  513. package/src/pipeline/standard-output/types.ts +12 -1
  514. package/src/pipeline/standard-pipeline.ts +291 -18
  515. package/src/pipeline/standard-post.ts +90 -24
  516. package/src/pipeline-builder.ts +1 -1
  517. package/src/plugin.ts +4 -0
  518. package/src/points-lines/__tests__/points-lines.bench.ts +17 -8
  519. package/src/prepare/prepared-graphics-resolver.ts +2 -0
  520. package/src/publication/__tests__/derived-geometry.integration.test.ts +177 -0
  521. package/src/publication/__tests__/features.integration.test.ts +122 -0
  522. package/src/publication/__tests__/programs.unit.test.ts +25 -0
  523. package/src/publication/__tests__/publication.integration.test.ts +370 -0
  524. package/src/publication/__tests__/targets.integration.test.ts +120 -0
  525. package/src/publication/__tests__/video.browser.test.ts +50 -0
  526. package/src/publication/contract.ts +104 -0
  527. package/src/publication/dependencies.ts +54 -0
  528. package/src/publication/prepare-geometry.ts +94 -0
  529. package/src/publication/programs.ts +45 -0
  530. package/src/publication/publisher.ts +618 -0
  531. package/src/publication/receiver.ts +297 -0
  532. package/src/publication/resource-scope.ts +31 -0
  533. package/src/publication/targets.ts +182 -0
  534. package/src/publication/video.ts +33 -0
  535. package/src/record/__tests__/main-pass-geometry.unit.test.ts +30 -0
  536. package/src/record/__tests__/material-bg-cache.unit.test.ts +15 -1
  537. package/src/record/__tests__/sprite-material-abi.unit.test.ts +9 -11
  538. package/src/record/__tests__/temporal-payload.unit.test.ts +1 -1
  539. package/src/record/__tests__/transparent-group2-selection.unit.test.ts +11 -0
  540. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +1 -0
  541. package/src/record/__tests__/video-texture-view.unit.test.ts +9 -9
  542. package/src/record/__tests__/view-ubo-layout.unit.test.ts +4 -3
  543. package/src/record/barrel-distortion-frame.ts +110 -0
  544. package/src/record/dynamic-geometry-consumption.ts +39 -9
  545. package/src/record/fold-buckets.ts +855 -0
  546. package/src/record/fold-instance-buffer.ts +51 -0
  547. package/src/record/frame-lighting.ts +36 -2
  548. package/src/record/frame-snapshot.ts +45 -9
  549. package/src/record/frame.ts +258 -1105
  550. package/src/record/gpu-draw-receipts.ts +38 -0
  551. package/src/record/gpu-timing.ts +48 -5
  552. package/src/record/helpers.ts +2 -2
  553. package/src/record/main-pass-geometry.ts +272 -84
  554. package/src/record/main-pass-material.ts +102 -36
  555. package/src/record/main-pass-sprite-draws.ts +13 -217
  556. package/src/record/main-pass.ts +164 -27
  557. package/src/record/motion-blur-receipt.ts +91 -0
  558. package/src/record/prepared-material-bindings.ts +11 -6
  559. package/src/record/probe-blend-buffer.ts +180 -0
  560. package/src/record/recovery-pipeline.ts +35 -3
  561. package/src/record/render-context.ts +41 -5
  562. package/src/record/shadow-pass.ts +30 -4
  563. package/src/record/skybox-post-pass.ts +28 -4
  564. package/src/record/sprite-instance-buffer.ts +155 -0
  565. package/src/record/target-capture-graph.ts +258 -0
  566. package/src/record/typed-frame-graph.ts +776 -340
  567. package/src/record/view-ubo.ts +27 -4
  568. package/src/record/volume-params.ts +225 -0
  569. package/src/recovery/render-system-candidate.ts +243 -50
  570. package/src/reflection/record-owner.ts +7 -3
  571. package/src/render-contract.ts +54 -5
  572. package/src/render-graph-primitives.ts +7 -1
  573. package/src/render-pipeline.ts +130 -0
  574. package/src/render-system-extract-tail.ts +90 -78
  575. package/src/render-system-extract.ts +76 -76
  576. package/src/render-system-presentation.ts +56 -0
  577. package/src/render-system-producer-roots.ts +96 -0
  578. package/src/render-system-projections.ts +3 -2
  579. package/src/render-system-residency.ts +159 -0
  580. package/src/render-system.ts +421 -408
  581. package/src/scene/probe-blend.ts +96 -4
  582. package/src/scene/render-scene.ts +416 -337
  583. package/src/scene/render-source.ts +90 -0
  584. package/src/scene/source-systems.ts +33 -0
  585. package/src/ssao-buffers.ts +95 -2
  586. package/src/surface/__tests__/dynamic-input.unit.test.ts +374 -0
  587. package/src/surface/__tests__/gpu-driven.unit.test.ts +87 -0
  588. package/src/surface/dynamic-input.ts +658 -0
  589. package/src/surface/gpu-driven.ts +147 -0
  590. package/src/surface/submission-observation.ts +517 -0
  591. package/src/systems/skin-palette-allocator.ts +5 -1
  592. package/src/systems/skin-palette-types.ts +11 -0
  593. package/src/systems/transparent-dispatch.ts +2 -2
  594. package/src/systems/transparent-sort-config.ts +3 -1
  595. package/src/temporal/gpu.ts +101 -17
  596. package/src/temporal/inspection.ts +7 -1
  597. package/src/temporal/standard-scene-data.ts +5 -0
  598. package/src/temporal/target-coverage-attachment.ts +4 -0
  599. package/src/transmission/__tests__/single-layer-medium.unit.test.ts +149 -0
  600. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +12 -11
  601. package/src/transmission/single-layer-medium.ts +322 -0
  602. package/src/typed-render-graph-primitives.ts +70 -2
  603. package/src/volume/component.ts +10 -9
  604. package/src/volume/extract.ts +11 -5
  605. package/src/volume/inspection.ts +3 -0
  606. package/src/volume/passes.ts +87 -4
  607. package/src/volume/resources.ts +2 -1
  608. package/dist/chunk-3RTCJTH4.mjs +0 -1610
  609. package/dist/chunk-3RTCJTH4.mjs.map +0 -1
  610. package/dist/chunk-BLXGONR2.mjs.map +0 -1
  611. package/dist/chunk-ILQ5MEZF.mjs +0 -32
  612. package/dist/chunk-ILQ5MEZF.mjs.map +0 -1
  613. package/dist/chunk-LEAXOMYJ.mjs.map +0 -1
  614. package/dist/chunk-NB2S7ZRX.mjs +0 -1783
  615. package/dist/chunk-NB2S7ZRX.mjs.map +0 -1
  616. package/dist/chunk-NNQL7CB3.mjs +0 -1713
  617. package/dist/chunk-NNQL7CB3.mjs.map +0 -1
  618. package/dist/chunk-OO3DRYK7.mjs.map +0 -1
  619. package/dist/chunk-PA5DRJNI.mjs.map +0 -1
  620. package/dist/chunk-PLAXOOX5.mjs +0 -1907
  621. package/dist/chunk-PLAXOOX5.mjs.map +0 -1
  622. package/dist/chunk-RXZ3RGOU.mjs +0 -53
  623. package/dist/chunk-RXZ3RGOU.mjs.map +0 -1
  624. package/dist/chunk-VOZWDM3L.mjs.map +0 -1
@@ -48,14 +48,14 @@ const FULLSCREEN_DEFAULT_SPEC: PipelineSpec = Object.freeze({
48
48
  /**
49
49
  * Declared sample type for a post-process read entry.
50
50
  *
51
- * Closed union (plan-strategy D-7): only `'depth'` is an explicit sampleType
52
- * discriminant; color inputs are the default (bare `string` or un-suffixed
53
- * `{ key }`). Future texture types (`r32float`, etc.) are add-only.
51
+ * Closed union (plan-strategy D-7): `'depth'` identifies a depth input and
52
+ * `'multisampled-float'` identifies the explicit 4x paired-resolve color
53
+ * input. Color inputs otherwise use the default bare string / `{ key }` form.
54
54
  *
55
55
  * AI-user affordance: IDE autocomplete exposes `'depth'` at the register call
56
56
  * site; misspellings are caught by the type system (AC-08).
57
57
  */
58
- export type PostProcessReadSampleType = 'depth';
58
+ export type PostProcessReadSampleType = 'depth' | 'multisampled-float';
59
59
 
60
60
  // ─── Post-process shader entry (owned by the fullscreen feature host) ──────
61
61
 
@@ -105,6 +105,10 @@ export interface PostProcessShaderEntry {
105
105
  * represent a color input (plan-strategy D-1 / D-7).
106
106
  */
107
107
  readonly reads?: readonly (string | PostProcessReadEntry)[] | undefined;
108
+ /** Use the renderer-owned View bind group at group(0). */
109
+ readonly usesView?: boolean | undefined;
110
+ /** Read-only storage buffers appended to the fullscreen bind group. */
111
+ readonly storageBindings?: readonly number[] | undefined;
108
112
  }
109
113
 
110
114
  function postProcessSourceDigest(source: string): string {
@@ -124,8 +128,10 @@ export function postProcessShaderPipelineLabel(identity: string, source: string)
124
128
  }
125
129
 
126
130
  /** Content-addressed shader-module label shared by prewarm and lazy paths. */
127
- export function postProcessShaderModuleLabel(identity: string, source: string): string {
128
- return `${postProcessShaderPipelineLabel(identity, source)}-module`;
131
+ export function postProcessShaderModuleLabel(source: string): string {
132
+ // Graph-local names and public feature identities may alias the same source.
133
+ // Share the prewarmed module, while pipelines retain their own layouts/targets.
134
+ return `post-process-module-${postProcessSourceDigest(source)}`;
129
135
  }
130
136
 
131
137
  /**
@@ -145,6 +151,8 @@ export function postProcessShaderEntrySignature(entry: PostProcessShaderEntry):
145
151
  defaultValue: Array.from(entry.params.defaultValue),
146
152
  },
147
153
  reads: entry.reads,
154
+ usesView: entry.usesView,
155
+ storageBindings: entry.storageBindings,
148
156
  });
149
157
  }
150
158
 
@@ -161,8 +169,8 @@ export function isTemporalFullscreenBinding(values: Readonly<Record<string, unkn
161
169
  * Structured read entry for a post-process shader.
162
170
  *
163
171
  * `key` is the graph resource key (matching a graph color target).
164
- * `sampleType` is an optional type discriminant (D-1 SSOT); when omitted
165
- * the entry is treated as a color input (same as a bare string).
172
+ * `sampleType` is an optional type discriminant (D-1 SSOT); when omitted the
173
+ * entry is treated as a single-sample color input (same as a bare string).
166
174
  */
167
175
  export interface PostProcessReadEntry {
168
176
  readonly key: string;
@@ -307,6 +315,7 @@ export function buildFullscreenPostProcessPass(
307
315
  sampler: Sampler | null;
308
316
  depthSampler: Sampler | null;
309
317
  extraColorBindings: readonly number[];
318
+ extraStorageBindings: readonly number[];
310
319
  createHandle: (
311
320
  name: string,
312
321
  pipeline: unknown,
@@ -327,9 +336,14 @@ export function buildFullscreenPostProcessPass(
327
336
  // texture variant for a 4-sample scene target. params@2 is always present to
328
337
  // avoid 2x2 kind explosion.
329
338
  const hasDepth = entryHasDepthRead(entry);
339
+ const hasMultisampledColor = (entry.reads ?? []).some(
340
+ (read) => typeof read !== 'string' && read.sampleType === 'multisampled-float',
341
+ );
330
342
  const bglKind: BglKind = hasDepth
331
343
  ? depthMultisampled
332
- ? 'fullscreen-post-with-scene-depth-msaa'
344
+ ? hasMultisampledColor
345
+ ? 'fullscreen-post-with-paired-msaa'
346
+ : 'fullscreen-post-with-scene-depth-msaa'
333
347
  : 'fullscreen-post-with-scene-depth'
334
348
  : entry.params !== undefined
335
349
  ? 'fullscreen-post-with-params'
@@ -347,6 +361,14 @@ export function buildFullscreenPostProcessPass(
347
361
  texture: { sampleType: 'float', viewDimension: '2d' },
348
362
  });
349
363
  }
364
+ const firstStorageBinding = firstExtraBinding + extraColorCount;
365
+ for (const [index, binding] of (entry.storageBindings ?? []).entries()) {
366
+ descriptor.entries.push({
367
+ binding: binding ?? firstStorageBinding + index,
368
+ visibility: GPU_SHADER_STAGE_FRAGMENT,
369
+ buffer: { type: 'read-only-storage' },
370
+ });
371
+ }
350
372
  const bglRes = device.createBindGroupLayout(descriptor);
351
373
  if (!bglRes.ok) {
352
374
  ctx.errorRegistry.fire(bglRes.error);
@@ -364,6 +386,9 @@ export function buildFullscreenPostProcessPass(
364
386
  extraColorBindings: Object.freeze(
365
387
  Array.from({ length: extraColorCount }, (_, index) => firstExtraBinding + index),
366
388
  ),
389
+ extraStorageBindings: Object.freeze(
390
+ (entry.storageBindings ?? []).map((binding, index) => binding ?? firstStorageBinding + index),
391
+ ),
367
392
  createHandle: (name, pipeline, paramsBuffer) => ({
368
393
  name,
369
394
  paramsBuffer,
@@ -402,6 +427,7 @@ export function createFullscreenBindGroup(
402
427
  depthTexView?: TextureView | null,
403
428
  depthSampler?: Sampler | null,
404
429
  additionalViews: readonly { readonly binding: number; readonly view: TextureView }[] = [],
430
+ additionalBuffers: readonly { readonly binding: number; readonly buffer: Buffer }[] = [],
405
431
  ): BindGroup | null {
406
432
  const entries: { binding: number; resource: { kind: string; value: unknown } }[] = [
407
433
  { binding: 0, resource: { kind: 'textureView', value: inputView } },
@@ -427,6 +453,12 @@ export function createFullscreenBindGroup(
427
453
  resource: { kind: 'textureView', value: additional.view },
428
454
  });
429
455
  }
456
+ for (const additional of additionalBuffers) {
457
+ entries.push({
458
+ binding: additional.binding,
459
+ resource: { kind: 'buffer', value: { buffer: additional.buffer } },
460
+ });
461
+ }
430
462
  const res = device.createBindGroup({
431
463
  label: 'fullscreen-post-process-bg',
432
464
  layout: bgl,
@@ -158,7 +158,7 @@ interface GlyphTextData {
158
158
  */
159
159
  export function glyphTextLayoutSystem(
160
160
  world: World,
161
- gpuStore: GpuResidencyCache,
161
+ gpuStore: Pick<GpuResidencyCache, 'updateMesh'>,
162
162
  ): Result<void, TextError> {
163
163
  resetFontConcurrency();
164
164
 
@@ -200,7 +200,7 @@ function collectGlyphEntities(world: World): EntityHandle[] {
200
200
  */
201
201
  function processEntity(
202
202
  world: World,
203
- gpuStore: GpuResidencyCache,
203
+ gpuStore: Pick<GpuResidencyCache, 'updateMesh'>,
204
204
  entity: EntityHandle,
205
205
  ): TextError | null {
206
206
  const gtRes = world.get(entity, GlyphText);
@@ -0,0 +1,48 @@
1
+ /** Renderer-local linear ordering of fixed-width GPU row addresses. */
2
+ export class GpuDirtyRanges {
3
+ private first = new Uint32Array(0);
4
+ private second = new Uint32Array(0);
5
+ private readonly counts = new Uint32Array(256);
6
+
7
+ coalesce(slots: readonly number[]): readonly { readonly start: number; readonly end: number }[] {
8
+ if (slots.length === 0) return [];
9
+ if (slots.length > this.first.length) {
10
+ const capacity = 2 ** Math.ceil(Math.log2(slots.length));
11
+ this.first = new Uint32Array(capacity);
12
+ this.second = new Uint32Array(capacity);
13
+ }
14
+ this.first.set(slots);
15
+ let source = this.first;
16
+ let target = this.second;
17
+ for (let shift = 0; shift < 32; shift += 8) {
18
+ this.counts.fill(0);
19
+ for (let i = 0; i < slots.length; i++) {
20
+ const bucket = ((source[i] ?? 0) >>> shift) & 255;
21
+ this.counts[bucket] = (this.counts[bucket] ?? 0) + 1;
22
+ }
23
+ let offset = 0;
24
+ for (let i = 0; i < 256; i++) {
25
+ const count = this.counts[i] ?? 0;
26
+ this.counts[i] = offset;
27
+ offset += count;
28
+ }
29
+ for (let i = 0; i < slots.length; i++) {
30
+ const value = source[i] ?? 0;
31
+ const bucket = (value >>> shift) & 255;
32
+ const index = this.counts[bucket] ?? 0;
33
+ target[index] = value;
34
+ this.counts[bucket] = index + 1;
35
+ }
36
+ [source, target] = [target, source];
37
+ }
38
+ const ranges: { start: number; end: number }[] = [];
39
+ for (let i = 0; i < slots.length; i++) {
40
+ const slot = source[i] ?? 0;
41
+ const previous = ranges.at(-1);
42
+ if (previous !== undefined && slot <= previous.end)
43
+ previous.end = Math.max(previous.end, slot + 1);
44
+ else ranges.push({ start: slot, end: slot + 1 });
45
+ }
46
+ return ranges;
47
+ }
48
+ }
@@ -28,6 +28,8 @@ export interface GpuDrivenBatchKey {
28
28
  readonly resourceIdentity?: string;
29
29
  /** Closed admission lane for the prepared Standard PBR draw. */
30
30
  readonly admission?: 'opaque' | 'alpha-mask';
31
+ /** Graph lane that owns this material after the G-buffer projection. */
32
+ readonly materialPass?: 'deferred' | 'forward-only';
31
33
  }
32
34
 
33
35
  export interface GpuDrivenCandidate {
@@ -66,6 +68,52 @@ export interface SubmissionPlan {
66
68
  readonly visibleCapacity: number;
67
69
  }
68
70
 
71
+ export interface ResourceClassSplitInspection {
72
+ readonly resourceClassCount: number;
73
+ readonly resourceClassSplits: readonly {
74
+ readonly resourceIdentity: string;
75
+ readonly batchIds: readonly number[];
76
+ readonly candidateCount: number;
77
+ }[];
78
+ readonly resourceClassSplitReasons: readonly string[];
79
+ }
80
+
81
+ /**
82
+ * Attribute batch splits to the prepared resource identity. Draw ranges and
83
+ * dynamic page ranges are deliberately absent from this grouping, so they can
84
+ * never be reported as a resource-class split.
85
+ */
86
+ export function inspectResourceClassSplits(
87
+ plan: Pick<SubmissionPlan, 'batches'>,
88
+ ): ResourceClassSplitInspection {
89
+ const groups = new Map<string, { readonly batchIds: number[]; candidateCount: number }>();
90
+ for (const batch of plan.batches) {
91
+ const resourceIdentity = batch.key.resourceIdentity ?? batch.key.materialResourceClass;
92
+ const group = groups.get(resourceIdentity) ?? { batchIds: [], candidateCount: 0 };
93
+ group.batchIds.push(batch.batchId);
94
+ group.candidateCount += batch.candidates.length;
95
+ groups.set(resourceIdentity, group);
96
+ }
97
+ const resourceClassSplits = [...groups.entries()]
98
+ .sort(([left], [right]) => left.localeCompare(right))
99
+ .map(([resourceIdentity, group]) =>
100
+ Object.freeze({
101
+ resourceIdentity,
102
+ batchIds: Object.freeze([...group.batchIds].sort((left, right) => left - right)),
103
+ candidateCount: group.candidateCount,
104
+ }),
105
+ );
106
+ const resourceClassSplitReasons =
107
+ resourceClassSplits.length <= 1
108
+ ? []
109
+ : resourceClassSplits.map(({ resourceIdentity }) => `resource-class:${resourceIdentity}`);
110
+ return Object.freeze({
111
+ resourceClassCount: resourceClassSplits.length,
112
+ resourceClassSplits: Object.freeze(resourceClassSplits),
113
+ resourceClassSplitReasons: Object.freeze(resourceClassSplitReasons),
114
+ });
115
+ }
116
+
69
117
  export interface GpuLodCandidateInput {
70
118
  readonly candidate: GpuDrivenCandidate;
71
119
  readonly rows: readonly GpuLodRow[];
@@ -298,6 +346,7 @@ function eligibleDraws(slot: RenderSceneSlot): readonly EligibleGpuDrivenDraw[]
298
346
  preparedIdentity,
299
347
  resourceIdentity: draw.materialResourceClass,
300
348
  admission,
349
+ materialPass: material.deferredPass === true ? 'deferred' : 'forward-only',
301
350
  },
302
351
  prepared,
303
352
  ...candidatePayload(draw, snapshot),
@@ -657,6 +706,7 @@ export class BatchTopology {
657
706
  inspect(): BatchTopologyInspection {
658
707
  let candidateCount = 0;
659
708
  for (const batch of this.batches.values()) candidateCount += batch.candidates.size;
709
+ const resourceClasses = inspectResourceClassSplits(this.plan());
660
710
  return {
661
711
  revision: this.revision,
662
712
  batchCount: this.batches.size,
@@ -669,6 +719,9 @@ export class BatchTopology {
669
719
  membershipAllocations: this.membershipAllocations,
670
720
  candidateAdds: this.candidateAdds,
671
721
  candidateRemoves: this.candidateRemoves,
722
+ resourceClassCount: resourceClasses.resourceClassCount,
723
+ resourceClassSplits: resourceClasses.resourceClassSplits,
724
+ resourceClassSplitReasons: resourceClasses.resourceClassSplitReasons,
672
725
  };
673
726
  }
674
727
 
@@ -6,6 +6,18 @@ import { hasRequiredVertexInputs } from './prepared-draw';
6
6
 
7
7
  type ArtifactRow = { readonly source: RenderableSnapshot; readonly renderableIndex: number };
8
8
 
9
+ /**
10
+ * Resolve the producer fact that group(3) binding(1) needs a ProbeBlend page.
11
+ * Single-layer medium artifacts are compiled with the ProbeBlend ABI even
12
+ * when their runtime artifact variantSet is intentionally absent.
13
+ */
14
+ export function requiresProbeBlendRecord(artifact: MaterialShaderArtifact): boolean {
15
+ return (
16
+ artifact.variantSet?.includes('PROBE_BLEND_AVAILABLE=true') === true ||
17
+ artifact.receipt?.surface?.model === 'single-layer-medium'
18
+ );
19
+ }
20
+
9
21
  /** Resolve the same producer programs for normal frames and replacement devices. */
10
22
  export function collectGpuDrivenMaterialArtifacts({
11
23
  rows,
@@ -26,7 +38,7 @@ export function collectGpuDrivenMaterialArtifacts({
26
38
  }) {
27
39
  const materialArtifacts = new Map<string, MaterialShaderArtifact>();
28
40
  const shadowMaterialArtifacts = new Map<string, MaterialShaderArtifact>();
29
- const shadowProgramIds = new Map<string, string>();
41
+ const shadowProgramEntries = new Map<string, DispatchEntry>();
30
42
  const forwardProgramEntries = new Map<
31
43
  string,
32
44
  { readonly vertexEntry?: string; readonly fragmentEntry?: string }
@@ -42,10 +54,7 @@ export function collectGpuDrivenMaterialArtifacts({
42
54
  }
43
55
  for (const entry of shadowDispatch) {
44
56
  if (entry.tags.LightMode !== 'ShadowCaster' || entry.materialShaderId === undefined) continue;
45
- shadowProgramIds.set(
46
- `${entry.renderableIndex}:${entry.materialHandle}`,
47
- entry.materialShaderId,
48
- );
57
+ shadowProgramEntries.set(`${entry.renderableIndex}:${entry.materialHandle}`, entry);
49
58
  }
50
59
  const collectArtifacts = (
51
60
  rows: readonly ArtifactRow[],
@@ -58,20 +67,26 @@ export function collectGpuDrivenMaterialArtifacts({
58
67
  const prepared = draw.prepared;
59
68
  if (prepared === undefined) continue;
60
69
  const material = row.source.materials[draw.materialSlot] ?? row.source.material;
70
+ const programKey = `${row.renderableIndex}:${material.materialHandle ?? -1}`;
71
+ // Keep program identity and entry points on the same selected dispatch.
72
+ // Looking this up per draw must not scan the scene's dispatch roster.
73
+ const shadowProgramEntry = shadowProgramEntries.get(programKey);
61
74
  const logicalMaterialShaderId = material.materialShaderId ?? prepared.identity.material;
62
75
  const sceneIndexProgramKeys = material.materialSceneIndexProgramKeys;
63
76
  const directMaterialShaderId =
64
- pass === 'shadow'
65
- ? shadowProgramIds.get(`${row.renderableIndex}:${material.materialHandle ?? -1}`)
66
- : logicalMaterialShaderId;
67
- const directPassNames = new Set(
68
- Object.entries(material.materialProgramKeys ?? {})
69
- .filter(([, key]) => key === directMaterialShaderId)
70
- .map(([passName]) => passName),
71
- );
72
- const sceneIndexProgramKey = Object.entries(sceneIndexProgramKeys ?? {}).find(
73
- ([passName, program]) => program.pass === pass && directPassNames.has(passName),
74
- )?.[1]?.specializationKey;
77
+ pass === 'shadow' ? shadowProgramEntry?.materialShaderId : logicalMaterialShaderId;
78
+ let sceneIndexProgramKey: string | undefined;
79
+ for (const passName in sceneIndexProgramKeys) {
80
+ const program = sceneIndexProgramKeys[passName];
81
+ if (
82
+ program?.pass === pass &&
83
+ directMaterialShaderId !== undefined &&
84
+ material.materialProgramKeys?.[passName] === directMaterialShaderId
85
+ ) {
86
+ sceneIndexProgramKey = program.specializationKey;
87
+ break;
88
+ }
89
+ }
75
90
  // A modern publication may expose a scene-index pair for its
76
91
  // forward Pass but omit ShadowCaster. Keep that material on its
77
92
  // explicit CPU shadow lane; do not reinterpret its direct WGSL
@@ -82,7 +97,7 @@ export function collectGpuDrivenMaterialArtifacts({
82
97
  const materialShaderId =
83
98
  pass === 'shadow'
84
99
  ? (sceneIndexProgramKey ??
85
- shadowProgramIds.get(`${row.renderableIndex}:${material.materialHandle ?? -1}`) ??
100
+ shadowProgramEntry?.materialShaderId ??
86
101
  logicalMaterialShaderId)
87
102
  : (sceneIndexProgramKey ?? logicalMaterialShaderId);
88
103
  const artifact = resolve(materialShaderId, {
@@ -98,14 +113,7 @@ export function collectGpuDrivenMaterialArtifacts({
98
113
  : {}),
99
114
  });
100
115
  const programEntry =
101
- pass === 'shadow'
102
- ? shadowDispatch.find(
103
- (entry) =>
104
- entry.tags.LightMode === 'ShadowCaster' &&
105
- entry.renderableIndex === row.renderableIndex &&
106
- entry.materialHandle === (material.materialHandle ?? -1),
107
- )
108
- : forwardProgramEntries.get(`${row.renderableIndex}:${material.materialHandle ?? -1}`);
116
+ pass === 'shadow' ? shadowProgramEntry : forwardProgramEntries.get(programKey);
109
117
  const selectedArtifact =
110
118
  artifact === undefined
111
119
  ? undefined
@@ -118,10 +118,18 @@ function hasMaterialResources(
118
118
  // is a readiness requirement; this keeps numeric-only PBR on the same GPU
119
119
  // lane while still rejecting an authored handle that failed to resolve.
120
120
  return receipt.resourceSlots.every((slot) => {
121
- // Storage-buffer resources have no MaterialSnapshot handle surface yet;
122
- // admitting them as samplers would silently turn an authored resource
123
- // failure into a prepared draw with an unrelated binding.
124
- if (slot.kind === 'storage-buffer') return false;
121
+ // The renderer-owned Surface page is the one storage resource that is
122
+ // intentionally available to a scene-index draw. Its address is
123
+ // published in the Surface ABI; every other storage declaration still
124
+ // fails closed because MaterialSnapshot has no generic storage handle.
125
+ if (slot.kind === 'storage-buffer') {
126
+ return (
127
+ receipt.surface?.dynamicInput?.group === slot.group &&
128
+ receipt.surface.dynamicInput.binding === slot.binding &&
129
+ slot.group === 3 &&
130
+ slot.binding === 3
131
+ );
132
+ }
125
133
  if (slot.kind === 'texture') {
126
134
  if (!authoredTextures?.has(slot.parameter)) return true;
127
135
  return (