@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
@@ -9,9 +9,11 @@ import {
9
9
  type Result,
10
10
  RhiError,
11
11
  } from '@forgeax/engine-rhi';
12
+ import type { MaterialShaderArtifact } from '@forgeax/engine-shader';
12
13
  import type { Handle, MeshAsset, SamplerAsset, TextureAsset } from '@forgeax/engine-types';
13
14
  import { toShared } from '@forgeax/engine-types';
14
15
  import { standardBloomAdmitted } from '../bloom-admission';
16
+ import { cloudShadowResolutionForQuality } from '../cloud/parameters';
15
17
  import { createClusterBinScratch } from '../cluster-binner';
16
18
  import type { EnvironmentLifecycle } from '../environment/lifecycle';
17
19
  import {
@@ -29,8 +31,12 @@ import {
29
31
  type PostProcessShaderEntry,
30
32
  postProcessShaderEntrySignature,
31
33
  } from '../fullscreen-post-process-pass';
32
- import { collectGpuDrivenMaterialArtifacts } from '../gpu-driven/material-artifacts';
34
+ import {
35
+ collectGpuDrivenMaterialArtifacts,
36
+ requiresProbeBlendRecord,
37
+ } from '../gpu-driven/material-artifacts';
33
38
  import { GpuDrivenProduction } from '../gpu-driven/production-raster';
39
+ import { disposeInstanceBufferChunks, disposeInstanceBuffers } from '../instance-buffer-cache';
34
40
  import { inspectStandardLighting } from '../pipeline/standard-lighting/inspection';
35
41
  import { retireAutoExposureGpuResources } from '../pipeline/standard-output/auto-exposure/gpu';
36
42
  import {
@@ -38,12 +44,16 @@ import {
38
44
  resetStandardOutputForDeviceLoss,
39
45
  } from '../pipeline/standard-output/resources';
40
46
  import type { PipelineBuilderShaderModuleFactory } from '../pipeline-builder';
47
+ import { standardTopologyVariantSet } from '../pipeline-spec';
41
48
  import { inspectPointShadow } from '../point-shadow-inspection';
42
49
  import type { PreparedGraphicsResolver } from '../prepare/prepared-graphics-resolver';
50
+ import type { RenderResourceScope } from '../publication/resource-scope';
43
51
  import { gpuDrivenMeshesForFrame, validateRenderables } from '../record/frame';
44
52
  import { prepareFrameLighting } from '../record/frame-lighting';
45
53
  import type { RenderFrameState, ValidatedRenderable } from '../record/frame-snapshot';
54
+ import { resolveGeometryInstanceBuffer } from '../record/main-pass-geometry';
46
55
  import { computeSplitLdrSprite } from '../record/main-pass-sprite-draws';
56
+ import { ensureProbeBlendRecordBuffer } from '../record/probe-blend-buffer';
47
57
  import {
48
58
  prepareRecoveryPipelineReadiness,
49
59
  type RecoveryPipelineReadiness,
@@ -53,6 +63,8 @@ import {
53
63
  ensureCompiledFrameGraph,
54
64
  getRenderFeatureGraphState,
55
65
  type RenderFeatureGraphCandidate,
66
+ retire as retireCompiledGraph,
67
+ shareRenderGraphGenerationAllocationOwner,
56
68
  } from '../record/typed-frame-graph';
57
69
  import { STANDARD_OUTPUT_TRANSFORM_FEATURE_ID } from '../render-contract';
58
70
  import type {
@@ -62,6 +74,7 @@ import type {
62
74
  } from '../render-system-extract';
63
75
  import type { PersistentGpuDrivenCandidate, PersistentRenderScene } from '../scene/render-scene';
64
76
  import { SHADOW_ATLAS_DEFAULT_LAYERS } from '../shadow-atlas';
77
+ import { ReadonlyDynamicInputPage, type SurfaceDynamicInputFrame } from '../surface/dynamic-input';
65
78
  import { createTemporalFrameTransaction } from '../temporal/frame';
66
79
  import {
67
80
  getTemporalBindGroupResources,
@@ -83,16 +96,24 @@ export interface PreparedResolverCaches {
83
96
  readonly preparedGroup0Pipelines: WeakSet<object>;
84
97
  readonly preparedViewOnlyPipelines: WeakSet<object>;
85
98
  readonly preparedRenderMaterialPipelines: WeakSet<object>;
86
- readonly preparedAssetHandles: WeakMap<World, Map<string, number>>;
99
+ readonly preparedAssetHandles: WeakMap<RenderResourceScope, Map<string, number>>;
87
100
  }
88
101
 
89
102
  export interface RecoveryFrameSeed {
90
103
  readonly frame: ExtractedFrame;
91
- readonly worlds: readonly World[];
104
+ readonly worlds: readonly RenderResourceScope[];
92
105
  readonly cameraOwner: number;
93
106
  readonly resourceOwner: number;
94
107
  readonly width: number;
95
108
  readonly height: number;
109
+ /** Last submitted Surface page is reused while the replacement device warms. */
110
+ readonly surfaceDynamicInput?: SurfaceDynamicInputFrame;
111
+ /** Last submitted RenderResourceScope/App time snapshot for the Surface frame ABI. */
112
+ readonly frameTime?: number;
113
+ /** Exact forward artifacts accepted by the submitted frame. */
114
+ readonly materialArtifacts?: ReadonlyMap<string, MaterialShaderArtifact>;
115
+ /** Exact ShadowCaster artifacts accepted by the submitted frame. */
116
+ readonly shadowMaterialArtifacts?: ReadonlyMap<string, MaterialShaderArtifact>;
96
117
  }
97
118
 
98
119
  export interface RenderSystemRecoveryDependencies {
@@ -124,7 +145,7 @@ export interface RenderSystemRecoveryDependencies {
124
145
  readonly createPreparedResolverFactory: (
125
146
  runtime: RenderSystemInternals,
126
147
  gpuWork: RenderFeatureGpuWorkOwner,
127
- worlds: readonly World[],
148
+ worlds: readonly RenderResourceScope[],
128
149
  caches: PreparedResolverCaches,
129
150
  ) => (input: RenderFeaturePreparedGraphicsResolverInput) => PreparedGraphicsResolver;
130
151
  readonly createPreparedResolverCaches: () => PreparedResolverCaches;
@@ -209,13 +230,18 @@ export function createRenderSystemRecovery(
209
230
  } = deps;
210
231
 
211
232
  // This is a detached CPU projection, retained only after queue submission.
212
- // It is not a World/lease cache and it never carries target or scheduler state.
233
+ // It is not a RenderResourceScope/lease cache and it never carries target or scheduler state.
213
234
  let lastSuccessfulFrameSeed: RecoveryFrameSeed | undefined;
214
235
 
215
236
  const createRecoveryCandidateFrameState = (): RenderFrameState => {
216
- const { probeBlendRecordBuffer: discardedProbeBlendRecordBuffer, ...baseFrameState } =
217
- frameState;
237
+ const {
238
+ probeBlendRecordBuffer: discardedProbeBlendRecordBuffer,
239
+ instanceCollections: discardedInstanceInspection,
240
+ ...baseFrameState
241
+ } = frameState;
218
242
  void discardedProbeBlendRecordBuffer;
243
+ // Candidate uploads must not publish residency into the active inspection.
244
+ void discardedInstanceInspection;
219
245
  return {
220
246
  ...baseFrameState,
221
247
  successfulTemporalFrameIndex: 0,
@@ -256,15 +282,18 @@ export function createRenderSystemRecovery(
256
282
  retiredCompiledFrameGraphs: new Set(),
257
283
  currentFrameObservationSource: undefined,
258
284
  lastSuccessfulCameraAntialias: undefined,
285
+ lastSuccessfulBarrelDistortion: undefined,
259
286
  temporalGpuState: undefined,
260
287
  activeTemporalGpuState: undefined,
261
288
  retiringTemporalGpuStates: new Set(),
289
+ cloudHistoryActive: false,
262
290
  lastSuccessfulTemporalView: undefined,
263
291
  pendingTemporalCommit: { kind: 'none' },
264
292
  environmentGeneration: undefined,
265
293
  currentDirectionalShadowView: null,
266
294
  currentSpotShadowView: null,
267
295
  instanceBuffers: new Map(),
296
+ instanceBufferChunks: new Map(),
268
297
  morphBuffers: new Map(),
269
298
  hdrpClusterBinScratch: createClusterBinScratch(),
270
299
  hdrpClusterGridScratch: null,
@@ -299,6 +328,18 @@ export function createRenderSystemRecovery(
299
328
  candidate.recoveryReadiness.assertPreparedCache();
300
329
  }
301
330
  const previousFeatureHost = internals.featureHost;
331
+ // The candidate graph proves topology and pipeline readiness before the
332
+ // publication boundary, but its imported display view was acquired before
333
+ // the shared canvas context was reconfigured for the replacement device.
334
+ // Retire that frame-bound graph and preserve the prepared owners/caches;
335
+ // the first recovered frame recompiles the same topology against the
336
+ // newly configured context instead of submitting a view from the lost
337
+ // device generation.
338
+ const candidateDisplayGraph = candidate.frameState.compiledFrameGraph;
339
+ candidate.frameState.compiledFrameGraph = null;
340
+ candidate.frameState.compiledFrameGraphTopologyKey = null;
341
+ candidate.frameState.perFrameGraph = null;
342
+ candidateDisplayGraph?.retire().catch(() => undefined);
302
343
  // The caller enters this method only after the active generation swap and
303
344
  // after resetForRecover() has shed every lost-device owner. Replace the
304
345
  // whole device-bound frame projection so no stale cache/map/temporal view
@@ -366,10 +407,13 @@ export function createRenderSystemRecovery(
366
407
  // A successful clear-only draw can have no display camera. There is no
367
408
  // frame graph to rehydrate in that case, but the device generation is
368
409
  // still recoverable; the next camera-bearing draw will build its graph
369
- // from the current World composition.
410
+ // from the current RenderResourceScope composition.
370
411
  if (camera === undefined) return { kind: 'no-seed' };
371
412
 
372
413
  const candidateFrameState = createRecoveryCandidateFrameState();
414
+ // Candidate graph generations are one renderer-owned allocation stream;
415
+ // publication changes their role, not their accounting owner.
416
+ shareRenderGraphGenerationAllocationOwner(frameState, candidateFrameState);
373
417
  resetStandardOutputForDeviceLoss(candidateFrameState, runtime.internals.deviceScope.generation);
374
418
  Object.assign(candidateFrameState, {
375
419
  temporalFrame: undefined,
@@ -382,6 +426,7 @@ export function createRenderSystemRecovery(
382
426
  let candidateFeatureHost: RenderFeatureHost | undefined;
383
427
  let candidateFeatureGpuWork: RenderFeatureGpuWorkOwner | undefined;
384
428
  let candidatePointsLines: RecoveryPointsLinesCandidate | undefined;
429
+ let candidateSurfacePage: ReadonlyDynamicInputPage | undefined;
385
430
  let candidateFeatureGraph: RenderFeatureGraphCandidate = {
386
431
  plans: Object.freeze([]),
387
432
  fullscreenEffects: new Map(),
@@ -401,12 +446,11 @@ export function createRenderSystemRecovery(
401
446
  if (pendingOutput !== undefined) retireAutoExposureGpuResources(pendingOutput);
402
447
  candidateFrameState.pendingAutoExposureGpuResources = undefined;
403
448
  for (const work of setupWorks) work.discard();
404
- setupWorks.length = 0;
405
449
  const graph = candidateFrameState.compiledFrameGraph;
406
450
  candidateFrameState.compiledFrameGraph = null;
407
451
  candidateFrameState.perFrameGraph = null;
408
452
  try {
409
- graph?.retire().catch(() => undefined);
453
+ if (graph !== null) retireCompiledGraph(candidateFrameState, graph);
410
454
  } catch {
411
455
  // Candidate cleanup continues through every independent owner.
412
456
  }
@@ -430,10 +474,21 @@ export function createRenderSystemRecovery(
430
474
  candidateGpuDrivenScene = undefined;
431
475
  candidatePointsLines?.release();
432
476
  candidatePointsLines = undefined;
477
+ candidateSurfacePage?.release();
478
+ candidateSurfacePage = undefined;
479
+ disposeInstanceBuffers(candidateFrameState.instanceBuffers, runtime.internals.errorRegistry);
480
+ if (candidateFrameState.instanceBufferChunks !== undefined) {
481
+ disposeInstanceBufferChunks(
482
+ candidateFrameState.instanceBufferChunks,
483
+ runtime.internals.errorRegistry,
484
+ );
485
+ }
433
486
  candidateGpuStore.destroyAll();
434
487
  };
435
488
  const markPublished = (): void => {
436
489
  candidatePointsLines?.publish();
490
+ candidateSurfacePage?.release();
491
+ candidateSurfacePage = undefined;
437
492
  candidatePublished = true;
438
493
  };
439
494
  const failed = (
@@ -449,7 +504,7 @@ export function createRenderSystemRecovery(
449
504
  candidateFrameState,
450
505
  runtime.internals,
451
506
  camera,
452
- seed.worlds[seed.cameraOwner] as World,
507
+ seed.worlds[seed.cameraOwner] as RenderResourceScope,
453
508
  );
454
509
  if (!output.ok) return failed('candidate Standard output preparation failed', output.error);
455
510
  const gpuScene = persistentRenderScene.prepareRecoveryGpuDrivenCandidate(
@@ -457,11 +512,101 @@ export function createRenderSystemRecovery(
457
512
  );
458
513
  if (!gpuScene.ok) return failed('candidate GPU scene preparation failed', gpuScene.error);
459
514
  candidateGpuDrivenScene = gpuScene.value;
515
+ candidateValidated = validateRenderables(
516
+ runtime.internals,
517
+ seed.worlds[seed.cameraOwner] as RenderResourceScope,
518
+ seed.worlds,
519
+ runtime.pipelineState,
520
+ candidateFrameState,
521
+ seed.frame.renderables,
522
+ seed.frame.dispatch,
523
+ );
524
+ if (candidateValidated.length !== seed.frame.renderables.length) {
525
+ return failed('candidate validation did not retain every LKG-visible renderable');
526
+ }
527
+ const lighting = prepareFrameLighting(
528
+ runtime.internals,
529
+ candidateFrameState,
530
+ seed.frame.lights,
531
+ camera,
532
+ runtime.pipelineState,
533
+ );
534
+ if (!lighting.ok) return failed('candidate lighting preparation failed');
535
+ let recoverySurfaceDynamicInput = seed.surfaceDynamicInput;
536
+ if (
537
+ recoverySurfaceDynamicInput !== undefined &&
538
+ recoverySurfaceDynamicInput.page.deviceGeneration !==
539
+ runtime.internals.deviceScope.generation
540
+ ) {
541
+ const source = recoverySurfaceDynamicInput;
542
+ const created = ReadonlyDynamicInputPage.create({
543
+ sourceId: source.page.sourceId,
544
+ pageId: source.page.pageId,
545
+ schema: source.page.schema,
546
+ });
547
+ if (!created.ok) {
548
+ return failed('candidate Surface recovery page creation failed', created.error);
549
+ }
550
+ candidateSurfacePage = created.value;
551
+ // Preserve CPU-authored parameters before preparing the replacement GPU page.
552
+ candidateSurfacePage.bytes.set(source.page.bytes);
553
+ const reconfigured = candidateSurfacePage.reconfigureDevice(
554
+ runtime.internals.deviceScope.generation,
555
+ );
556
+ if (!reconfigured.ok) {
557
+ return failed('candidate Surface recovery page generation failed', reconfigured.error);
558
+ }
559
+ const ranges = (source.ranges ?? []).map((range) => {
560
+ const reserved = candidateSurfacePage?.reserveRange({
561
+ domain: range.domain,
562
+ recordStart: range.recordStart,
563
+ recordCount: range.recordCount,
564
+ instanceIndex: range.instanceIndex,
565
+ member: range.member,
566
+ });
567
+ if (reserved === undefined || !reserved.ok) {
568
+ throw reserved?.error ?? new Error('candidate Surface recovery range unavailable');
569
+ }
570
+ return reserved.value;
571
+ });
572
+ recoverySurfaceDynamicInput = {
573
+ page: candidateSurfacePage,
574
+ ranges,
575
+ projectionRevision: source.projectionRevision + 1,
576
+ frameTime: source.frameTime,
577
+ };
578
+ }
460
579
  if (candidateGpuDrivenScene.state !== undefined) {
461
580
  candidateGpuDrivenProduction = GpuDrivenProduction.forDevice(
462
581
  runtime.internals.device,
463
582
  gpuDrivenShaderFactory,
464
583
  );
584
+ const clustered = lighting.value.standard?.kind === 'clustered';
585
+ const standardVariantSet = standardTopologyVariantSet(
586
+ lighting.value.standard,
587
+ runtime.internals.device.caps.storageBuffer,
588
+ false,
589
+ );
590
+ const standardPbrArtifact = runtime.internals.getMaterialShaderArtifact?.(
591
+ 'forgeax::default-standard-pbr',
592
+ {
593
+ vertexColorAvailable: false,
594
+ deformation: 'rigid',
595
+ pass: 'forward',
596
+ address: 'scene-index',
597
+ variantSet: standardVariantSet,
598
+ },
599
+ );
600
+ const standardPbrSkinArtifact = runtime.internals.getMaterialShaderArtifact?.(
601
+ 'forgeax::pbr-skin',
602
+ {
603
+ vertexColorAvailable: false,
604
+ deformation: 'skin',
605
+ pass: 'forward',
606
+ address: 'scene-index',
607
+ variantSet: standardVariantSet,
608
+ },
609
+ );
465
610
  const shadowProjection = persistentRenderScene.shadowCasterProjection();
466
611
  // The retained scene owns prepared draw receipts. The extraction seed
467
612
  // precedes GPU admission and must not stand in for that projection.
@@ -482,20 +627,45 @@ export function createRenderSystemRecovery(
482
627
  },
483
628
  renderableIndex,
484
629
  }));
485
- const { materialArtifacts, shadowMaterialArtifacts, firstArtifact, firstSkinArtifact } =
486
- collectGpuDrivenMaterialArtifacts({
487
- rows: artifactRows(seed.frame.renderables),
488
- shadowRows: artifactRows(shadowProjection?.renderables ?? []),
489
- dispatch: seed.frame.dispatch,
490
- shadowDispatch: shadowProjection?.dispatch ?? seed.frame.dispatch,
491
- resolve: runtime.internals.getMaterialShaderArtifact,
492
- clustered:
493
- seed.frame.lights.point.length +
494
- seed.frame.lights.spot.length +
495
- seed.frame.lights.rect.length >
496
- 0 || candidateFrameState.installedPipelineConfig?.ssao?.enabled === true,
497
- reflectionFallback: candidateFrameState.reflectionFallbackDemand === true,
498
- });
630
+ const collectedArtifacts = collectGpuDrivenMaterialArtifacts({
631
+ rows: artifactRows(seed.frame.renderables),
632
+ shadowRows: artifactRows(shadowProjection?.renderables ?? []),
633
+ dispatch: seed.frame.dispatch,
634
+ shadowDispatch: shadowProjection?.dispatch ?? seed.frame.dispatch,
635
+ resolve: runtime.internals.getMaterialShaderArtifact,
636
+ clustered:
637
+ seed.frame.lights.point.length +
638
+ seed.frame.lights.spot.length +
639
+ seed.frame.lights.rect.length >
640
+ 0 || candidateFrameState.installedPipelineConfig?.ssao?.enabled === true,
641
+ reflectionFallback: candidateFrameState.reflectionFallbackDemand === true,
642
+ });
643
+ const materialArtifacts =
644
+ collectedArtifacts.materialArtifacts.size > 0
645
+ ? collectedArtifacts.materialArtifacts
646
+ : (seed.materialArtifacts ?? new Map());
647
+ const shadowMaterialArtifacts =
648
+ collectedArtifacts.shadowMaterialArtifacts.size > 0
649
+ ? collectedArtifacts.shadowMaterialArtifacts
650
+ : (seed.shadowMaterialArtifacts ?? new Map());
651
+ const firstMaterialArtifact = materialArtifacts.values().next().value as
652
+ | MaterialShaderArtifact
653
+ | undefined;
654
+ const firstSkinArtifact = [...materialArtifacts.values()].find(
655
+ (artifact) => artifact.receipt?.skinPaletteAddress !== undefined,
656
+ );
657
+ const firstArtifact = firstMaterialArtifact ?? standardPbrArtifact;
658
+ const materialSkinArtifact = firstSkinArtifact ?? standardPbrSkinArtifact;
659
+ const probeBlendRequested = [...materialArtifacts.values()].some((artifact) =>
660
+ requiresProbeBlendRecord(artifact),
661
+ );
662
+ const probeBlendRecordBuffer = probeBlendRequested
663
+ ? ensureProbeBlendRecordBuffer(
664
+ runtime.internals.device,
665
+ candidateFrameState,
666
+ candidateGpuDrivenScene.state.probeBlend,
667
+ )
668
+ : undefined;
499
669
  const prepared = candidateGpuDrivenProduction.prepare({
500
670
  scene: candidateGpuDrivenScene.state,
501
671
  camera,
@@ -507,11 +677,21 @@ export function createRenderSystemRecovery(
507
677
  ),
508
678
  viewBindGroupLayout: runtime.pipelineState.viewBindGroupLayout,
509
679
  meshResidencyEpoch: runtime.internals.gpuStore.meshResidencyEpoch,
510
-
680
+ hdrp:
681
+ clustered &&
682
+ ((lighting.value.standard?.prepared.local.length ?? 0) > 0 ||
683
+ candidateFrameState.installedPipelineConfig?.ssao?.enabled === true),
684
+ clustered,
511
685
  ...(firstArtifact === undefined ? {} : { materialArtifact: firstArtifact }),
512
- ...(firstSkinArtifact === undefined ? {} : { materialSkinArtifact: firstSkinArtifact }),
686
+ ...(materialSkinArtifact === undefined ? {} : { materialSkinArtifact }),
513
687
  ...(materialArtifacts.size === 0 ? {} : { materialArtifacts }),
514
688
  ...(shadowMaterialArtifacts.size === 0 ? {} : { shadowMaterialArtifacts }),
689
+ ...(probeBlendRecordBuffer === undefined ? {} : { probeBlendRecordBuffer }),
690
+ ...(seed.frameTime === undefined ? {} : { frameTime: seed.frameTime }),
691
+ ...(recoverySurfaceDynamicInput === undefined
692
+ ? {}
693
+ : { surfaceDynamicInput: recoverySurfaceDynamicInput }),
694
+ deviceGeneration: runtime.internals.deviceScope.generation,
515
695
  materialPipelineState: runtime.pipelineState,
516
696
  ...(runtime.internals.getMaterialShaderPipelineEntry === undefined
517
697
  ? {}
@@ -520,6 +700,25 @@ export function createRenderSystemRecovery(
520
700
  if (!prepared.ok) return failed('candidate GPU-driven preparation failed', prepared.error);
521
701
  preparedGpuDriven = prepared.value;
522
702
  }
703
+ // A fully GPU-owned frame recovers through GPU Scene above. Only mixed
704
+ // or direct frames need the legacy instance-buffer closure as well.
705
+ if (!preparedGpuDriven?.ownsAllDrawItems || !preparedGpuDriven.ownsAllShadowCasters) {
706
+ for (const entry of candidateValidated) {
707
+ if (entry.source.instances === undefined) continue;
708
+ const prepared = resolveGeometryInstanceBuffer(
709
+ {
710
+ runtime: runtime.internals,
711
+ pipelineState: runtime.pipelineState,
712
+ frameState: candidateFrameState,
713
+ bindGroupCounts: { createBindGroup: 0, keys: [] },
714
+ },
715
+ entry,
716
+ [],
717
+ false,
718
+ );
719
+ if (prepared === null) return failed('candidate instance preparation failed');
720
+ }
721
+ }
523
722
  candidateFeatureHost = runtime.internals.featureHost;
524
723
  if (candidateFeatureHost !== undefined && candidateFeatureHost.size > 0) {
525
724
  candidateFeatureGpuWork = createFeatureGpuWorkOwner(runtime.internals);
@@ -529,11 +728,13 @@ export function createRenderSystemRecovery(
529
728
  colorAttachmentFormat: runtime.pipelineState.colorAttachmentFormat,
530
729
  storageBuffer: runtime.internals.device.caps.storageBuffer,
531
730
  multisample: runtime.internals.device.caps.backendKind !== 'wgpu-webgl2',
731
+ cloudHistory: seed.frame.cloudLayer !== undefined,
532
732
  });
533
733
  const featureFrame = runRenderFeatureFrame(candidateFeatureHost, {
534
- worlds: seed.worlds,
734
+ worlds: seed.worlds.filter((world): world is World => !('resolveAsset' in world)),
535
735
  owner: seed.resourceOwner,
536
736
  frameNumber: candidateFrameState.frameNumber,
737
+ selectedCamera: camera,
537
738
  frameSize: {
538
739
  width: runtime.internals.canvas.width,
539
740
  height: runtime.internals.canvas.height,
@@ -557,7 +758,7 @@ export function createRenderSystemRecovery(
557
758
  gpuWork: candidateFeatureGpuWork,
558
759
  });
559
760
  if (featureFrame.errors.length > 0) {
560
- return failed('candidate render-feature preparation failed');
761
+ return failed('candidate render-feature preparation failed', featureFrame.errors[0]);
561
762
  }
562
763
  const featurePreparationIncomplete = featureFrame.plans.some((planned) => {
563
764
  const execution = getRenderFeaturePlanExecutionProjection(planned);
@@ -586,6 +787,7 @@ export function createRenderSystemRecovery(
586
787
  candidateFeatureGraph = {
587
788
  plans: featureFrame.plans,
588
789
  fullscreenEffects: featureFrame.fullscreenEffects,
790
+ postProcessIdentities: featureFrame.postProcessIdentities,
589
791
  ...(batches.length === 0
590
792
  ? {}
591
793
  : { preparedResourceKey: `recovery-${runtime.internals.deviceScope.generation}` }),
@@ -678,26 +880,6 @@ export function createRenderSystemRecovery(
678
880
  }
679
881
  }
680
882
  }
681
- candidateValidated = validateRenderables(
682
- runtime.internals,
683
- resourceWorld,
684
- seed.worlds,
685
- runtime.pipelineState,
686
- candidateFrameState,
687
- seed.frame.renderables,
688
- seed.frame.dispatch,
689
- );
690
- if (candidateValidated.length !== seed.frame.renderables.length) {
691
- return failed('candidate validation did not retain every LKG-visible renderable');
692
- }
693
- const lighting = prepareFrameLighting(
694
- runtime.internals,
695
- candidateFrameState,
696
- seed.frame.lights,
697
- camera,
698
- runtime.pipelineState,
699
- );
700
- if (!lighting.ok) return failed('candidate lighting preparation failed');
701
883
  candidatePointsLines = pointsLinesOwner.prepareRecoveryCandidate(
702
884
  candidateValidated,
703
885
  lighting.value.standard?.kind === 'clustered',
@@ -723,7 +905,11 @@ export function createRenderSystemRecovery(
723
905
  });
724
906
  const candidatePostProcessIds = new Set<string>([
725
907
  ...(candidateFrameState.installedPipelineConfig?.postEffects ?? []),
726
- ...candidateFeatureGraph.fullscreenEffects.keys(),
908
+ // Required identities include effects disabled for this frame. Warm only
909
+ // published entries, using their public identity rather than graph aliases.
910
+ ...(candidateFeatureGraph.postProcessIdentities ?? []).filter((id) =>
911
+ candidateFeatureGraph.fullscreenEffects.has(id),
912
+ ),
727
913
  ]);
728
914
  const configuredPostEffects = candidateFrameState.installedPipelineConfig?.postEffects ?? [];
729
915
  const postProcessPipeline = runtime.internals.getPostProcessPipeline;
@@ -855,6 +1041,13 @@ export function createRenderSystemRecovery(
855
1041
  (error) => {
856
1042
  recoveryGraphFailure ??= error;
857
1043
  },
1044
+ undefined,
1045
+ undefined,
1046
+ false,
1047
+ false,
1048
+ seed.frame.cloudLayer === undefined
1049
+ ? undefined
1050
+ : cloudShadowResolutionForQuality(seed.frame.cloudLayer.params.quality),
858
1051
  );
859
1052
  if (graph === null) return failed('candidate frame graph compilation failed');
860
1053
  if (recoveryReadiness === undefined)
@@ -397,9 +397,13 @@ export class ReflectionProbeRecordOwner {
397
397
  this.lastFactCount = facts.length;
398
398
  this.lastScheduledRawFaces = 0;
399
399
  this.lastScheduledFilteredSteps = 0;
400
- const firstSelection = selections.values().next().value as
401
- | ReflectionProbeSelectionResult
402
- | undefined;
400
+ // The fallback MRT has one representative readback, so choose a stable
401
+ // non-neutral probe consumer when the scene contains one. Renderable map
402
+ // order is not a source-selection contract: the first entry is commonly
403
+ // an outside panel while the local probe consumer appears later.
404
+ const firstSelection =
405
+ [...selections.values()].find((selection) => selection.kind === 'probe') ??
406
+ (selections.values().next().value as ReflectionProbeSelectionResult | undefined);
403
407
  this.lastSelection =
404
408
  firstSelection?.kind === 'probe'
405
409
  ? {