@forgeax/engine-render 0.1.27 → 0.1.29

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 (655) hide show
  1. package/README.md +842 -124
  2. package/dist/assembly/atmosphere-shader-prewarm.d.ts +6 -0
  3. package/dist/assembly/atmosphere-shader-prewarm.d.ts.map +1 -0
  4. package/dist/assembly/dynamic-geometry-host.d.ts +52 -0
  5. package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -0
  6. package/dist/assembly/dynamic-geometry-runtime.d.ts +20 -0
  7. package/dist/assembly/dynamic-geometry-runtime.d.ts.map +1 -0
  8. package/dist/assembly/factory.d.ts +3 -1
  9. package/dist/assembly/factory.d.ts.map +1 -1
  10. package/dist/assembly/gpu-driven-owner.d.ts +10 -0
  11. package/dist/assembly/gpu-driven-owner.d.ts.map +1 -0
  12. package/dist/assembly/host-contract.d.ts +19 -0
  13. package/dist/assembly/host-contract.d.ts.map +1 -1
  14. package/dist/assembly/material/assembly.d.ts +7 -0
  15. package/dist/assembly/material/assembly.d.ts.map +1 -1
  16. package/dist/assembly/material-shader-policy.d.ts +3 -1
  17. package/dist/assembly/material-shader-policy.d.ts.map +1 -1
  18. package/dist/assembly/recovery/failure-location.d.ts +12 -0
  19. package/dist/assembly/recovery/failure-location.d.ts.map +1 -0
  20. package/dist/assembly/recovery/renderer-recover.d.ts +6 -4
  21. package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
  22. package/dist/assembly/renderer-facade.d.ts.map +1 -1
  23. package/dist/assembly/renderer-feature-inspection.d.ts +5 -0
  24. package/dist/assembly/renderer-feature-inspection.d.ts.map +1 -0
  25. package/dist/assembly/renderer-frame-transaction.d.ts +19 -0
  26. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
  27. package/dist/assembly/renderer-helpers.d.ts +3 -0
  28. package/dist/assembly/renderer-helpers.d.ts.map +1 -1
  29. package/dist/assembly/renderer-inspection.d.ts +4 -0
  30. package/dist/assembly/renderer-inspection.d.ts.map +1 -1
  31. package/dist/assembly/shader-prewarm-policy.d.ts +6 -0
  32. package/dist/assembly/shader-prewarm-policy.d.ts.map +1 -1
  33. package/dist/assembly/skin-palette-owner.d.ts +8 -0
  34. package/dist/assembly/skin-palette-owner.d.ts.map +1 -0
  35. package/dist/assembly/ssr-shader-prewarm.d.ts +6 -0
  36. package/dist/assembly/ssr-shader-prewarm.d.ts.map +1 -0
  37. package/dist/assembly/webgpu-device-loss.d.ts +15 -0
  38. package/dist/assembly/webgpu-device-loss.d.ts.map +1 -0
  39. package/dist/assembly/webgpu-pbr-ready.d.ts +38 -0
  40. package/dist/assembly/webgpu-pbr-ready.d.ts.map +1 -0
  41. package/dist/assembly/webgpu-ready-mipmap.d.ts +11 -0
  42. package/dist/assembly/webgpu-ready-mipmap.d.ts.map +1 -0
  43. package/dist/assembly/webgpu-ready.d.ts +7 -3
  44. package/dist/assembly/webgpu-ready.d.ts.map +1 -1
  45. package/dist/assembly/webgpu-renderer-bootstrap.d.ts +10 -0
  46. package/dist/assembly/webgpu-renderer-bootstrap.d.ts.map +1 -0
  47. package/dist/assembly/webgpu-renderer-contract.d.ts +62 -0
  48. package/dist/assembly/webgpu-renderer-contract.d.ts.map +1 -0
  49. package/dist/assembly/webgpu-renderer-guards.d.ts +9 -0
  50. package/dist/assembly/webgpu-renderer-guards.d.ts.map +1 -0
  51. package/dist/assembly/webgpu-renderer-observation.d.ts +6 -0
  52. package/dist/assembly/webgpu-renderer-observation.d.ts.map +1 -0
  53. package/dist/assembly/webgpu-renderer-recovery-failure.d.ts +12 -0
  54. package/dist/assembly/webgpu-renderer-recovery-failure.d.ts.map +1 -0
  55. package/dist/assembly/webgpu-renderer.d.ts +7 -141
  56. package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
  57. package/dist/assembly/webgpu-vertex-layouts.d.ts +28 -84
  58. package/dist/assembly/webgpu-vertex-layouts.d.ts.map +1 -1
  59. package/dist/authoring.mjs +3 -3
  60. package/dist/{chunk-ADHHVYLW.mjs → chunk-33XZFTQU.mjs} +245 -39
  61. package/dist/chunk-33XZFTQU.mjs.map +1 -0
  62. package/dist/{chunk-GF523LHF.mjs → chunk-BLXGONR2.mjs} +30 -12
  63. package/dist/chunk-BLXGONR2.mjs.map +1 -0
  64. package/dist/{chunk-KM2NOX2I.mjs → chunk-BQVQOQJH.mjs} +958 -254
  65. package/dist/chunk-BQVQOQJH.mjs.map +1 -0
  66. package/dist/{chunk-HKXTW355.mjs → chunk-BTWH7BP4.mjs} +386 -17
  67. package/dist/chunk-BTWH7BP4.mjs.map +1 -0
  68. package/dist/{chunk-TMIASV2N.mjs → chunk-FUODTTIA.mjs} +3934 -676
  69. package/dist/chunk-FUODTTIA.mjs.map +1 -0
  70. package/dist/{chunk-FJ6P52EE.mjs → chunk-ILQ5MEZF.mjs} +3 -17
  71. package/dist/chunk-ILQ5MEZF.mjs.map +1 -0
  72. package/dist/{chunk-E34VL5VI.mjs → chunk-JQTSEI3Z.mjs} +3 -3
  73. package/dist/{chunk-E34VL5VI.mjs.map → chunk-JQTSEI3Z.mjs.map} +1 -1
  74. package/dist/{chunk-GE3SDD72.mjs → chunk-NICXSHAT.mjs} +16 -38
  75. package/dist/chunk-NICXSHAT.mjs.map +1 -0
  76. package/dist/{chunk-ZZ4YQ474.mjs → chunk-NRNXBLIJ.mjs} +577 -7
  77. package/dist/chunk-NRNXBLIJ.mjs.map +1 -0
  78. package/dist/{chunk-JDWARUOI.mjs → chunk-PA5DRJNI.mjs} +17 -3
  79. package/dist/chunk-PA5DRJNI.mjs.map +1 -0
  80. package/dist/{chunk-XDP6XE5V.mjs → chunk-S4DNKQYQ.mjs} +1118 -446
  81. package/dist/chunk-S4DNKQYQ.mjs.map +1 -0
  82. package/dist/components/camera.d.ts +62 -2
  83. package/dist/components/camera.d.ts.map +1 -1
  84. package/dist/components/index.d.ts +1 -0
  85. package/dist/components/index.d.ts.map +1 -1
  86. package/dist/components/instances.d.ts +6 -20
  87. package/dist/components/instances.d.ts.map +1 -1
  88. package/dist/components/scene-instance.d.ts +2 -1
  89. package/dist/components/scene-instance.d.ts.map +1 -1
  90. package/dist/components/screen-space-reflection.d.ts +14 -0
  91. package/dist/components/screen-space-reflection.d.ts.map +1 -0
  92. package/dist/construct-renderer.mjs +13805 -7186
  93. package/dist/construct-renderer.mjs.map +1 -1
  94. package/dist/device/gpu-residency.d.ts +11 -17
  95. package/dist/device/gpu-residency.d.ts.map +1 -1
  96. package/dist/device/mesh-residency-lifetime.d.ts +21 -0
  97. package/dist/device/mesh-residency-lifetime.d.ts.map +1 -0
  98. package/dist/dynamic-geometry.d.ts +125 -0
  99. package/dist/dynamic-geometry.d.ts.map +1 -0
  100. package/dist/environment/background.d.ts +6 -0
  101. package/dist/environment/background.d.ts.map +1 -0
  102. package/dist/errors/gpu-driven.d.ts +6 -3
  103. package/dist/errors/gpu-driven.d.ts.map +1 -1
  104. package/dist/errors/render.d.ts +7 -4
  105. package/dist/errors/render.d.ts.map +1 -1
  106. package/dist/extract/camera.d.ts.map +1 -1
  107. package/dist/extract/gpu-driven.d.ts +33 -3
  108. package/dist/extract/gpu-driven.d.ts.map +1 -1
  109. package/dist/features/host.d.ts +23 -1
  110. package/dist/features/host.d.ts.map +1 -1
  111. package/dist/features/noise-texture.d.ts +17 -0
  112. package/dist/features/noise-texture.d.ts.map +1 -0
  113. package/dist/features/plan.d.ts +83 -2
  114. package/dist/features/plan.d.ts.map +1 -1
  115. package/dist/features/prepared-gpu-work.d.ts +37 -4
  116. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  117. package/dist/features/prepared-graphics-store.d.ts.map +1 -1
  118. package/dist/features/prepared-graphics.d.ts +5 -0
  119. package/dist/features/prepared-graphics.d.ts.map +1 -1
  120. package/dist/features/render-graph-compute.d.ts +5 -3
  121. package/dist/features/render-graph-compute.d.ts.map +1 -1
  122. package/dist/features/render-graph-contribution.d.ts +11 -3
  123. package/dist/features/render-graph-contribution.d.ts.map +1 -1
  124. package/dist/features/render-graph-raster.d.ts +19 -3
  125. package/dist/features/render-graph-raster.d.ts.map +1 -1
  126. package/dist/features/types.d.ts +11 -0
  127. package/dist/features/types.d.ts.map +1 -1
  128. package/dist/fullscreen-post-process-pass.d.ts +2 -0
  129. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  130. package/dist/gpu-driven/batch-topology.d.ts +34 -1
  131. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  132. package/dist/gpu-driven/pbr-program.d.ts +10 -0
  133. package/dist/gpu-driven/pbr-program.d.ts.map +1 -0
  134. package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
  135. package/dist/gpu-driven/production-raster.d.ts +144 -23
  136. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  137. package/dist/gpu-driven/shadow-views.d.ts +126 -0
  138. package/dist/gpu-driven/shadow-views.d.ts.map +1 -0
  139. package/dist/gpu-driven/view-gpu.d.ts +18 -2
  140. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  141. package/dist/gpu-scene-schema.d.ts +2 -8
  142. package/dist/gpu-scene-schema.d.ts.map +1 -1
  143. package/dist/gpu-scene.d.ts +14 -0
  144. package/dist/gpu-scene.d.ts.map +1 -1
  145. package/dist/gpu-texture-usage.d.ts +1 -0
  146. package/dist/gpu-texture-usage.d.ts.map +1 -1
  147. package/dist/hdrp-buffers.d.ts +6 -0
  148. package/dist/hdrp-buffers.d.ts.map +1 -1
  149. package/dist/ibl/frame-resources.d.ts +8 -0
  150. package/dist/ibl/frame-resources.d.ts.map +1 -0
  151. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  152. package/dist/index.d.ts +21 -8
  153. package/dist/index.d.ts.map +1 -1
  154. package/dist/index.mjs +8 -7
  155. package/dist/index.mjs.map +1 -1
  156. package/dist/inspection-types.d.ts +164 -0
  157. package/dist/inspection-types.d.ts.map +1 -1
  158. package/dist/instances-derived-bounds.d.ts +11 -0
  159. package/dist/instances-derived-bounds.d.ts.map +1 -1
  160. package/dist/instances.d.ts +89 -44
  161. package/dist/instances.d.ts.map +1 -1
  162. package/dist/internal.d.ts +3 -0
  163. package/dist/internal.d.ts.map +1 -1
  164. package/dist/internal.mjs +118 -10
  165. package/dist/internal.mjs.map +1 -1
  166. package/dist/lifecycle.d.ts +2 -1
  167. package/dist/lifecycle.d.ts.map +1 -1
  168. package/dist/material-row.d.ts +5 -0
  169. package/dist/material-row.d.ts.map +1 -0
  170. package/dist/materials.d.ts +15 -0
  171. package/dist/materials.d.ts.map +1 -1
  172. package/dist/pbr-pipeline.d.ts +21 -5
  173. package/dist/pbr-pipeline.d.ts.map +1 -1
  174. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  175. package/dist/pipeline/standard-output/auto-exposure/capability.d.ts +12 -0
  176. package/dist/pipeline/standard-output/auto-exposure/capability.d.ts.map +1 -0
  177. package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts +70 -0
  178. package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts.map +1 -0
  179. package/dist/pipeline/standard-output/auto-exposure/graph.d.ts +75 -0
  180. package/dist/pipeline/standard-output/auto-exposure/graph.d.ts.map +1 -0
  181. package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts +111 -0
  182. package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts.map +1 -0
  183. package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts +16 -0
  184. package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts.map +1 -0
  185. package/dist/pipeline/standard-output/auto-exposure/preset.d.ts +14 -0
  186. package/dist/pipeline/standard-output/auto-exposure/preset.d.ts.map +1 -0
  187. package/dist/pipeline/standard-output/auto-exposure/state.d.ts +46 -0
  188. package/dist/pipeline/standard-output/auto-exposure/state.d.ts.map +1 -0
  189. package/dist/pipeline/standard-output/color-transform.d.ts +27 -0
  190. package/dist/pipeline/standard-output/color-transform.d.ts.map +1 -0
  191. package/dist/pipeline/standard-output/graph.d.ts +15 -0
  192. package/dist/pipeline/standard-output/graph.d.ts.map +1 -0
  193. package/dist/pipeline/standard-output/lut-admission.d.ts +29 -0
  194. package/dist/pipeline/standard-output/lut-admission.d.ts.map +1 -0
  195. package/dist/pipeline/standard-output/lut-gpu.d.ts +48 -0
  196. package/dist/pipeline/standard-output/lut-gpu.d.ts.map +1 -0
  197. package/dist/pipeline/standard-output/lut-state.d.ts +68 -0
  198. package/dist/pipeline/standard-output/lut-state.d.ts.map +1 -0
  199. package/dist/pipeline/standard-output/resources.d.ts +10 -0
  200. package/dist/pipeline/standard-output/resources.d.ts.map +1 -0
  201. package/dist/pipeline/standard-output/types.d.ts +39 -0
  202. package/dist/pipeline/standard-output/types.d.ts.map +1 -0
  203. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  204. package/dist/pipeline/standard-post.d.ts +2 -2
  205. package/dist/pipeline/standard-post.d.ts.map +1 -1
  206. package/dist/pipeline-builder.d.ts +2 -1
  207. package/dist/pipeline-builder.d.ts.map +1 -1
  208. package/dist/pipeline-spec-types.d.ts +4 -0
  209. package/dist/pipeline-spec-types.d.ts.map +1 -1
  210. package/dist/pipeline-spec.d.ts +1 -9
  211. package/dist/pipeline-spec.d.ts.map +1 -1
  212. package/dist/points-lines/standard-owner.d.ts +1 -1
  213. package/dist/points-lines/standard-owner.d.ts.map +1 -1
  214. package/dist/prepare/prepared-graphics-resolver.d.ts +6 -1
  215. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
  216. package/dist/record/dynamic-geometry-consumption.d.ts +15 -0
  217. package/dist/record/dynamic-geometry-consumption.d.ts.map +1 -0
  218. package/dist/record/frame-lighting.d.ts +3 -3
  219. package/dist/record/frame-lighting.d.ts.map +1 -1
  220. package/dist/record/frame-snapshot.d.ts +106 -5
  221. package/dist/record/frame-snapshot.d.ts.map +1 -1
  222. package/dist/record/frame-targets.d.ts.map +1 -1
  223. package/dist/record/frame.d.ts +39 -4
  224. package/dist/record/frame.d.ts.map +1 -1
  225. package/dist/record/main-pass-geometry.d.ts +7 -8
  226. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  227. package/dist/record/main-pass-material.d.ts +38 -1
  228. package/dist/record/main-pass-material.d.ts.map +1 -1
  229. package/dist/record/main-pass-sprite-draws.d.ts +2 -10
  230. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  231. package/dist/record/main-pass.d.ts +12 -2
  232. package/dist/record/main-pass.d.ts.map +1 -1
  233. package/dist/record/mesh-ssbo.d.ts +15 -6
  234. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  235. package/dist/record/prepared-material-bindings.d.ts +19 -0
  236. package/dist/record/prepared-material-bindings.d.ts.map +1 -0
  237. package/dist/record/recovery-pipeline.d.ts +2 -9
  238. package/dist/record/recovery-pipeline.d.ts.map +1 -1
  239. package/dist/record/render-context.d.ts +76 -26
  240. package/dist/record/render-context.d.ts.map +1 -1
  241. package/dist/record/shadow-pass.d.ts +62 -7
  242. package/dist/record/shadow-pass.d.ts.map +1 -1
  243. package/dist/record/skybox-post-pass.d.ts +1 -1
  244. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  245. package/dist/record/typed-frame-graph.d.ts +35 -7
  246. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  247. package/dist/record/view-ubo.d.ts +1 -0
  248. package/dist/record/view-ubo.d.ts.map +1 -1
  249. package/dist/recovery/render-system-candidate.d.ts +10 -2
  250. package/dist/recovery/render-system-candidate.d.ts.map +1 -1
  251. package/dist/recovery/render-system-roots.d.ts +11 -0
  252. package/dist/recovery/render-system-roots.d.ts.map +1 -0
  253. package/dist/recovery/types.d.ts +76 -0
  254. package/dist/recovery/types.d.ts.map +1 -0
  255. package/dist/reflection/record-owner.d.ts +0 -2
  256. package/dist/reflection/record-owner.d.ts.map +1 -1
  257. package/dist/render-contract.d.ts +185 -30
  258. package/dist/render-contract.d.ts.map +1 -1
  259. package/dist/render-graph-primitives.d.ts +1 -0
  260. package/dist/render-graph-primitives.d.ts.map +1 -1
  261. package/dist/render-pipeline.d.ts +64 -5
  262. package/dist/render-pipeline.d.ts.map +1 -1
  263. package/dist/render-system-extract-tail.d.ts +7 -5
  264. package/dist/render-system-extract-tail.d.ts.map +1 -1
  265. package/dist/render-system-extract.d.ts +101 -41
  266. package/dist/render-system-extract.d.ts.map +1 -1
  267. package/dist/render-system-projections.d.ts +22 -0
  268. package/dist/render-system-projections.d.ts.map +1 -0
  269. package/dist/render-system.d.ts +34 -77
  270. package/dist/render-system.d.ts.map +1 -1
  271. package/dist/scene/render-scene-types.d.ts +14 -7
  272. package/dist/scene/render-scene-types.d.ts.map +1 -1
  273. package/dist/scene/render-scene.d.ts +29 -11
  274. package/dist/scene/render-scene.d.ts.map +1 -1
  275. package/dist/scene/shadow-visibility.d.ts +5 -0
  276. package/dist/scene/shadow-visibility.d.ts.map +1 -0
  277. package/dist/ssr/admission.d.ts +70 -1
  278. package/dist/ssr/admission.d.ts.map +1 -1
  279. package/dist/ssr/compose.d.ts +13 -0
  280. package/dist/ssr/compose.d.ts.map +1 -0
  281. package/dist/ssr/errors.d.ts +35 -0
  282. package/dist/ssr/errors.d.ts.map +1 -1
  283. package/dist/ssr/graph.d.ts +60 -0
  284. package/dist/ssr/graph.d.ts.map +1 -0
  285. package/dist/ssr/history.d.ts +97 -0
  286. package/dist/ssr/history.d.ts.map +1 -0
  287. package/dist/ssr/hiz.d.ts +37 -0
  288. package/dist/ssr/hiz.d.ts.map +1 -0
  289. package/dist/ssr/inspection.d.ts +42 -0
  290. package/dist/ssr/inspection.d.ts.map +1 -0
  291. package/dist/ssr/resources.d.ts +58 -0
  292. package/dist/ssr/resources.d.ts.map +1 -0
  293. package/dist/ssr/temporal.d.ts +38 -0
  294. package/dist/ssr/temporal.d.ts.map +1 -0
  295. package/dist/systems/skin-palette-allocator.d.ts +32 -10
  296. package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
  297. package/dist/systems/skin-palette-types.d.ts +15 -0
  298. package/dist/systems/skin-palette-types.d.ts.map +1 -1
  299. package/dist/systems/transparent-dispatch.d.ts +9 -0
  300. package/dist/systems/transparent-dispatch.d.ts.map +1 -0
  301. package/dist/targets/material-source.d.ts +7 -0
  302. package/dist/targets/material-source.d.ts.map +1 -1
  303. package/dist/temporal/frame-coordinator.d.ts +7 -0
  304. package/dist/temporal/frame-coordinator.d.ts.map +1 -1
  305. package/dist/temporal/gpu.d.ts +8 -0
  306. package/dist/temporal/gpu.d.ts.map +1 -1
  307. package/dist/temporal/history.d.ts.map +1 -1
  308. package/dist/temporal/index.mjs +6 -6
  309. package/dist/temporal/inspection.d.ts.map +1 -1
  310. package/dist/temporal/standard-scene-data.d.ts +2 -1
  311. package/dist/temporal/standard-scene-data.d.ts.map +1 -1
  312. package/dist/temporal/temporal-view.d.ts +2 -0
  313. package/dist/temporal/temporal-view.d.ts.map +1 -1
  314. package/dist/typed-render-graph-primitives.d.ts +35 -1
  315. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  316. package/dist/typed-shadow-passes.d.ts +3 -1
  317. package/dist/typed-shadow-passes.d.ts.map +1 -1
  318. package/dist/volume/temporal.d.ts +6 -0
  319. package/dist/volume/temporal.d.ts.map +1 -1
  320. package/package.json +21 -20
  321. package/src/__tests__/auto-exposure-gpu-evidence.ts +291 -0
  322. package/src/__tests__/auto-exposure-inspection.unit.test.ts +80 -0
  323. package/src/__tests__/auto-exposure-transaction.integration.test.ts +99 -0
  324. package/src/__tests__/auto-exposure.browser.test.ts +33 -0
  325. package/src/__tests__/auto-exposure.dawn.test.ts +33 -0
  326. package/src/__tests__/detached-inspection.integration.test.ts +5 -0
  327. package/src/__tests__/device-scope-lifecycle.unit.test.ts +18 -0
  328. package/src/__tests__/device-scope-stale-matrix.unit.test.ts +18 -0
  329. package/src/__tests__/docs-gate-green.unit.test.ts +3 -3
  330. package/src/__tests__/dynamic-geometry-host.unit.test.ts +1123 -0
  331. package/src/__tests__/dynamic-geometry.unit.test.ts +233 -0
  332. package/src/__tests__/factory-contract.integration.test.ts +73 -22
  333. package/src/__tests__/fallback-row-stride-surface.unit.test.ts +19 -0
  334. package/src/__tests__/feature-depth-input.dawn.test.ts +121 -0
  335. package/src/__tests__/feature-noise.unit.test.ts +38 -0
  336. package/src/__tests__/fixtures/taa-resolve-pinned-baseline.wgsl +301 -0
  337. package/src/__tests__/frame-camera-selection.unit.test.ts +131 -0
  338. package/src/__tests__/frame-plan-contract.unit.test.ts +24 -0
  339. package/src/__tests__/frame-targets.unit.test.ts +24 -0
  340. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +3 -0
  341. package/src/__tests__/gpu-driven-baseline.characterization.test.ts +79 -0
  342. package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +287 -6
  343. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +122 -142
  344. package/src/__tests__/gpu-driven-indirect-raster.browser.test.ts +10 -1
  345. package/src/__tests__/gpu-driven-lod-cache.unit.test.ts +264 -0
  346. package/src/__tests__/gpu-driven-mesh-world-identity.unit.test.ts +349 -0
  347. package/src/__tests__/gpu-driven-pbr.dawn.test.ts +1417 -0
  348. package/src/__tests__/gpu-driven-pbr.integration.test.ts +21 -0
  349. package/src/__tests__/gpu-driven-production-fixture.ts +96 -0
  350. package/src/__tests__/gpu-driven-production.integration.test.ts +1075 -93
  351. package/src/__tests__/gpu-driven-scaling.unit.test.ts +1 -3
  352. package/src/__tests__/gpu-driven-shadow-views.browser.test.ts +63 -0
  353. package/src/__tests__/gpu-driven-shadow-views.dawn.test.ts +294 -0
  354. package/src/__tests__/gpu-driven-shadow-views.integration.test.ts +97 -0
  355. package/src/__tests__/gpu-driven-shadow-views.unit.test.ts +168 -0
  356. package/src/__tests__/gpu-driven-skin-contract.test-d.ts +11 -0
  357. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +72 -20
  358. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +30 -9
  359. package/src/__tests__/gpu-driven-view.unit.test.ts +159 -52
  360. package/src/__tests__/gpu-pass-timing.browser.test.ts +6 -1
  361. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +42 -0
  362. package/src/__tests__/gpu-scene-render-graph-gpu.ts +19 -5
  363. package/src/__tests__/gpu-scene.dawn.test.ts +40 -13
  364. package/src/__tests__/gpu-scene.unit.test.ts +559 -33
  365. package/src/__tests__/instances-culling.integration.test.ts +36 -10
  366. package/src/__tests__/instances-derived-bounds.unit.test.ts +54 -0
  367. package/src/__tests__/instances-store.unit.test.ts +242 -39
  368. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +6 -0
  369. package/src/__tests__/lighting-scene-roundtrip.integration.test.ts +13 -16
  370. package/src/__tests__/lut-lkg-transaction.integration.test.ts +122 -0
  371. package/src/__tests__/material-contract-inventory.unit.test.ts +5 -6
  372. package/src/__tests__/material-dispatch-shader-id.unit.test.ts +51 -0
  373. package/src/__tests__/material-lane-selection.unit.test.ts +60 -0
  374. package/src/__tests__/material-numeric-upload.unit.test.ts +53 -0
  375. package/src/__tests__/material-texture-handles.unit.test.ts +18 -0
  376. package/src/__tests__/material-texture-source.unit.test.ts +87 -0
  377. package/src/__tests__/materials-authoring-validation.unit.test.ts +41 -0
  378. package/src/__tests__/materials-standard-contract.unit.test.ts +52 -2
  379. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +4 -0
  380. package/src/__tests__/mesh-submission-lifetime.unit.test.ts +53 -0
  381. package/src/__tests__/normal-fallback.dawn.test.ts +122 -0
  382. package/src/__tests__/particle-material-input-layout.unit.test.ts +104 -0
  383. package/src/__tests__/physical-clearcoat.integration.test.ts +37 -3
  384. package/src/__tests__/pipeline-texture-specialization.unit.test.ts +138 -0
  385. package/src/__tests__/point-shadow-inspection.unit.test.ts +2 -0
  386. package/src/__tests__/prepared-gpu-driven-pbr-contract.test-d.ts +31 -0
  387. package/src/__tests__/prepared-gpu-driven-pbr-contract.unit.test.ts +39 -0
  388. package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +35 -4
  389. package/src/__tests__/prepared-graphics-capability.unit.test.ts +21 -0
  390. package/src/__tests__/prepared-graphics-pipeline-warmup.unit.test.ts +6 -2
  391. package/src/__tests__/profiler-phase-catalog.test.ts +5 -0
  392. package/src/__tests__/public-surface.test-d.ts +3 -0
  393. package/src/__tests__/recovery-candidate-prepare.contract.test.ts +30 -12
  394. package/src/__tests__/reflection-fallback-async-publication.unit.test.ts +104 -0
  395. package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +2 -1
  396. package/src/__tests__/render-error-code-owner.test-d.ts +4 -0
  397. package/src/__tests__/render-error-detail-ssot.test-d.ts +22 -0
  398. package/src/__tests__/render-error-exhaustive.test-d.ts +15 -0
  399. package/src/__tests__/render-feature-gpu-work.integration.test.ts +285 -2
  400. package/src/__tests__/render-feature-plan.unit.test.ts +245 -0
  401. package/src/__tests__/render-feature-shadow-order.unit.test.ts +228 -0
  402. package/src/__tests__/render-feature-zero-work.unit.test.ts +35 -1
  403. package/src/__tests__/render-graph-fallback.integration.test.ts +2 -2
  404. package/src/__tests__/render-owner-cohesion.unit.test.ts +55 -0
  405. package/src/__tests__/render-scene-mixed-updates.integration.test.ts +426 -0
  406. package/src/__tests__/render-scene-projection.unit.test.ts +914 -23
  407. package/src/__tests__/render-scene-resource-updates.integration.test.ts +214 -0
  408. package/src/__tests__/render-scene-skin-lifecycle.integration.test.ts +173 -0
  409. package/src/__tests__/render-scene-temporal-retry.unit.test.ts +133 -0
  410. package/src/__tests__/render-target-material-source.test-d.ts +27 -3
  411. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +61 -1
  412. package/src/__tests__/renderer-frame-transaction.integration.test.ts +923 -5
  413. package/src/__tests__/shader-manifest-fixture.ts +39 -0
  414. package/src/__tests__/skin-motion-regression.unit.test.ts +0 -33
  415. package/src/__tests__/skin-palette-persistent.integration.test.ts +28 -0
  416. package/src/__tests__/skin-palette-persistent.unit.test.ts +247 -0
  417. package/src/__tests__/skinned-shadow-caster.test.ts +118 -14
  418. package/src/__tests__/specular-environment-scale.dawn.test.ts +156 -0
  419. package/src/__tests__/ssr-admission-matrix.integration.test.ts +7 -1
  420. package/src/__tests__/ssr-confidence-compose.unit.test.ts +84 -0
  421. package/src/__tests__/ssr-coordinate-oracle.unit.test.ts +28 -0
  422. package/src/__tests__/ssr-format-probe-gating.integration.test.ts +82 -0
  423. package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +91 -0
  424. package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +112 -0
  425. package/src/__tests__/ssr-gpu-dispatch.ts +946 -0
  426. package/src/__tests__/ssr-graph-topology.unit.test.ts +104 -0
  427. package/src/__tests__/ssr-history-filter.dawn.test.ts +198 -0
  428. package/src/__tests__/ssr-hit-color.dawn.test.ts +273 -0
  429. package/src/__tests__/ssr-hiz-odd-reduction.dawn.test.ts +569 -0
  430. package/src/__tests__/ssr-hiz-rescue.dawn.test.ts +279 -0
  431. package/src/__tests__/ssr-hiz.browser.test.ts +150 -0
  432. package/src/__tests__/ssr-hiz.dawn.test.ts +150 -0
  433. package/src/__tests__/ssr-hiz.unit.test.ts +56 -0
  434. package/src/__tests__/ssr-inspection.unit.test.ts +105 -0
  435. package/src/__tests__/ssr-memory-budget.unit.test.ts +45 -0
  436. package/src/__tests__/ssr-performance-sequence-aggregation.unit.test.ts +15 -0
  437. package/src/__tests__/ssr-public-surface.test-d.ts +37 -0
  438. package/src/__tests__/ssr-receiver-coverage.dawn.test.ts +387 -0
  439. package/src/__tests__/ssr-reflection-mip-reducer.dawn.test.ts +309 -0
  440. package/src/__tests__/ssr-reprojection-probe.ts +90 -0
  441. package/src/__tests__/ssr-roughness-mip.dawn.test.ts +163 -0
  442. package/src/__tests__/ssr-shader-prewarm.unit.test.ts +59 -0
  443. package/src/__tests__/ssr-spatial.integration.test.ts +141 -0
  444. package/src/__tests__/ssr-stable-lattice.dawn.test.ts +475 -0
  445. package/src/__tests__/ssr-temporal-history.unit.test.ts +202 -0
  446. package/src/__tests__/ssr-texel-crossing.dawn.test.ts +448 -0
  447. package/src/__tests__/ssr-zero-work.integration.test.ts +87 -0
  448. package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +44 -12
  449. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +29 -0
  450. package/src/__tests__/standard-output-chain-contract.unit.test.ts +99 -0
  451. package/src/__tests__/standard-output-chain.integration.test.ts +73 -0
  452. package/src/__tests__/standard-output-gpu-evidence.ts +205 -0
  453. package/src/__tests__/standard-output.browser.test.ts +15 -0
  454. package/src/__tests__/standard-output.dawn.test.ts +15 -0
  455. package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +38 -0
  456. package/src/__tests__/standard-pipeline.integration.test.ts +320 -3
  457. package/src/__tests__/standard-profile-oracle.unit.test.ts +22 -0
  458. package/src/__tests__/standard-surface-lighting.unit.test.ts +41 -0
  459. package/src/__tests__/standard-texture-specialization.dawn.test.ts +141 -0
  460. package/src/__tests__/surface-adjacent-regressions.integration.test.ts +6 -3
  461. package/src/__tests__/taa-coverage-edge.dawn.test.ts +193 -0
  462. package/src/__tests__/taa-history-clipping.dawn.test.ts +328 -0
  463. package/src/__tests__/taa-neighborhood-equivalence.dawn.test.ts +778 -0
  464. package/src/__tests__/taa-stability-feedback.browser.test.ts +23 -0
  465. package/src/__tests__/taa-stability-feedback.dawn.test.ts +68 -0
  466. package/src/__tests__/taa-stability-feedback.ts +341 -0
  467. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +49 -7
  468. package/src/__tests__/temporal-reset-matrix.unit.test.ts +9 -0
  469. package/src/__tests__/temporal-transaction.integration.test.ts +28 -0
  470. package/src/__tests__/texture-usage-surface.unit.test.ts +4 -2
  471. package/src/__tests__/typed-pipeline-topology.unit.test.ts +109 -4
  472. package/src/__tests__/typed-scene-pass-material-cache.integration.test.ts +126 -0
  473. package/src/__tests__/vertex-layouts-ssot.unit.test.ts +47 -0
  474. package/src/__tests__/visibility-extract.perf.test.ts +20 -8
  475. package/src/__tests__/visibility-instances.integration.test.ts +19 -7
  476. package/src/__tests__/visibility-producer-matrix.integration.test.ts +20 -9
  477. package/src/assembly/atmosphere-shader-prewarm.ts +38 -0
  478. package/src/assembly/dynamic-geometry-host.ts +887 -0
  479. package/src/assembly/dynamic-geometry-runtime.ts +71 -0
  480. package/src/assembly/factory.ts +4 -0
  481. package/src/assembly/gpu-driven-owner.ts +29 -0
  482. package/src/assembly/host-contract.ts +36 -0
  483. package/src/assembly/material/assembly.ts +38 -0
  484. package/src/assembly/material-shader-policy.ts +71 -28
  485. package/src/assembly/recovery/failure-location.ts +62 -0
  486. package/src/assembly/recovery/renderer-recover.ts +19 -17
  487. package/src/assembly/renderer-facade.ts +29 -0
  488. package/src/assembly/renderer-feature-inspection.ts +13 -0
  489. package/src/assembly/renderer-frame-transaction.ts +63 -0
  490. package/src/assembly/renderer-helpers.ts +26 -0
  491. package/src/assembly/renderer-inspection.ts +6 -0
  492. package/src/assembly/shader-prewarm-policy.ts +32 -0
  493. package/src/assembly/skin-palette-owner.ts +21 -0
  494. package/src/assembly/ssr-shader-prewarm.ts +41 -0
  495. package/src/assembly/webgpu-device-loss.ts +75 -0
  496. package/src/assembly/webgpu-pbr-ready.ts +232 -0
  497. package/src/assembly/webgpu-ready-mipmap.ts +26 -0
  498. package/src/assembly/webgpu-ready.ts +142 -121
  499. package/src/assembly/webgpu-renderer-bootstrap.ts +85 -0
  500. package/src/assembly/webgpu-renderer-contract.ts +69 -0
  501. package/src/assembly/webgpu-renderer-guards.ts +32 -0
  502. package/src/assembly/webgpu-renderer-observation.ts +43 -0
  503. package/src/assembly/webgpu-renderer-recovery-failure.ts +62 -0
  504. package/src/assembly/webgpu-renderer.ts +675 -614
  505. package/src/assembly/webgpu-vertex-layouts.ts +233 -87
  506. package/src/components/__tests__/camera-exposure.contract.unit.test.ts +153 -0
  507. package/src/components/camera.ts +287 -7
  508. package/src/components/index.ts +1 -0
  509. package/src/components/instances.ts +45 -18
  510. package/src/components/scene-instance.ts +2 -1
  511. package/src/components/screen-space-reflection.ts +21 -0
  512. package/src/components/sprite-animation.ts +3 -3
  513. package/src/components/sprite-instances.ts +1 -1
  514. package/src/device/gpu-residency.ts +96 -93
  515. package/src/device/mesh-residency-lifetime.ts +73 -0
  516. package/src/dynamic-geometry.ts +736 -0
  517. package/src/environment/background.ts +263 -0
  518. package/src/errors/gpu-driven.ts +39 -5
  519. package/src/errors/render.ts +27 -3
  520. package/src/extract/camera.ts +26 -1
  521. package/src/extract/gpu-driven.ts +185 -10
  522. package/src/features/host.ts +237 -19
  523. package/src/features/noise-texture.ts +91 -0
  524. package/src/features/plan.ts +553 -24
  525. package/src/features/prepared-gpu-work.ts +631 -49
  526. package/src/features/prepared-graphics-store.ts +31 -0
  527. package/src/features/prepared-graphics.ts +5 -0
  528. package/src/features/render-graph-compute.ts +41 -8
  529. package/src/features/render-graph-contribution.ts +141 -3
  530. package/src/features/render-graph-raster.ts +143 -30
  531. package/src/features/types.ts +11 -0
  532. package/src/fullscreen-post-process-pass.ts +3 -0
  533. package/src/gpu-driven/batch-topology.ts +424 -102
  534. package/src/gpu-driven/pbr-program.ts +31 -0
  535. package/src/gpu-driven/prepared-draw.ts +29 -4
  536. package/src/gpu-driven/production-raster.ts +2267 -694
  537. package/src/gpu-driven/shadow-views.ts +539 -0
  538. package/src/gpu-driven/view-gpu.ts +188 -41
  539. package/src/gpu-scene-schema.ts +52 -11
  540. package/src/gpu-scene.ts +186 -99
  541. package/src/gpu-texture-usage.ts +1 -0
  542. package/src/hdrp-buffers.ts +72 -36
  543. package/src/ibl/frame-resources.ts +38 -0
  544. package/src/ibl/skylight-bind-group.ts +5 -4
  545. package/src/index.ts +125 -1
  546. package/src/inspection-types.ts +191 -0
  547. package/src/instances-derived-bounds.ts +258 -34
  548. package/src/instances.ts +459 -150
  549. package/src/internal.ts +22 -0
  550. package/src/lifecycle.ts +2 -0
  551. package/src/material-row.ts +145 -0
  552. package/src/materials.ts +44 -8
  553. package/src/pbr-pipeline.ts +159 -17
  554. package/src/pipeline/standard-forward-lane.ts +52 -24
  555. package/src/pipeline/standard-output/__tests__/lut-admission.unit.test.ts +103 -0
  556. package/src/pipeline/standard-output/auto-exposure/__tests__/capability.unit.test.ts +40 -0
  557. package/src/pipeline/standard-output/auto-exposure/__tests__/gpu.contract.unit.test.ts +125 -0
  558. package/src/pipeline/standard-output/auto-exposure/__tests__/graph.contract.unit.test.ts +94 -0
  559. package/src/pipeline/standard-output/auto-exposure/__tests__/oracle.test.ts +108 -0
  560. package/src/pipeline/standard-output/auto-exposure/__tests__/preset.test.ts +26 -0
  561. package/src/pipeline/standard-output/auto-exposure/capability.ts +38 -0
  562. package/src/pipeline/standard-output/auto-exposure/gpu.ts +567 -0
  563. package/src/pipeline/standard-output/auto-exposure/graph.ts +221 -0
  564. package/src/pipeline/standard-output/auto-exposure/inspection.ts +231 -0
  565. package/src/pipeline/standard-output/auto-exposure/oracle.ts +291 -0
  566. package/src/pipeline/standard-output/auto-exposure/preset.ts +28 -0
  567. package/src/pipeline/standard-output/auto-exposure/state.ts +156 -0
  568. package/src/pipeline/standard-output/color-transform.ts +124 -0
  569. package/src/pipeline/standard-output/graph.ts +139 -0
  570. package/src/pipeline/standard-output/lut-admission.ts +121 -0
  571. package/src/pipeline/standard-output/lut-gpu.ts +399 -0
  572. package/src/pipeline/standard-output/lut-state.ts +176 -0
  573. package/src/pipeline/standard-output/resources.ts +121 -0
  574. package/src/pipeline/standard-output/types.ts +58 -0
  575. package/src/pipeline/standard-pipeline.ts +192 -59
  576. package/src/pipeline/standard-post.ts +186 -27
  577. package/src/pipeline-builder.ts +16 -6
  578. package/src/pipeline-spec-types.ts +4 -0
  579. package/src/pipeline-spec.ts +37 -29
  580. package/src/points-lines/standard-owner.ts +6 -14
  581. package/src/prepare/prepared-graphics-resolver.ts +9 -2
  582. package/src/record/__tests__/material-slot-plan.unit.test.ts +48 -0
  583. package/src/record/__tests__/mesh-ssbo.unit.test.ts +40 -1
  584. package/src/record/__tests__/recovery-pipeline.unit.test.ts +2 -29
  585. package/src/record/__tests__/sprite-material-abi.unit.test.ts +36 -5
  586. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +45 -0
  587. package/src/record/__tests__/view-ubo-layout.unit.test.ts +5 -0
  588. package/src/record/dynamic-geometry-consumption.ts +59 -0
  589. package/src/record/frame-lighting.ts +12 -11
  590. package/src/record/frame-snapshot.ts +133 -23
  591. package/src/record/frame-targets.ts +9 -0
  592. package/src/record/frame.ts +727 -133
  593. package/src/record/main-pass-geometry.ts +162 -98
  594. package/src/record/main-pass-material.ts +115 -26
  595. package/src/record/main-pass-sprite-draws.ts +18 -107
  596. package/src/record/main-pass.ts +78 -8
  597. package/src/record/material-uniforms.ts +1 -1
  598. package/src/record/mesh-ssbo.ts +59 -15
  599. package/src/record/prepared-material-bindings.ts +234 -0
  600. package/src/record/recovery-pipeline.ts +59 -136
  601. package/src/record/render-context.ts +92 -22
  602. package/src/record/shadow-pass.ts +1231 -209
  603. package/src/record/skybox-post-pass.ts +14 -3
  604. package/src/record/typed-frame-graph.ts +1006 -53
  605. package/src/record/view-ubo.ts +11 -0
  606. package/src/recovery/render-system-candidate.ts +90 -66
  607. package/src/recovery/render-system-roots.ts +113 -0
  608. package/src/recovery/types.ts +77 -0
  609. package/src/reflection/record-owner.ts +26 -54
  610. package/src/render-contract.ts +219 -25
  611. package/src/render-graph-primitives.ts +6 -2
  612. package/src/render-pipeline.ts +70 -1
  613. package/src/render-system-extract-tail.ts +409 -160
  614. package/src/render-system-extract.ts +376 -102
  615. package/src/render-system-projections.ts +241 -0
  616. package/src/render-system.ts +692 -791
  617. package/src/scene/render-scene-types.ts +13 -4
  618. package/src/scene/render-scene.ts +569 -355
  619. package/src/scene/shadow-visibility.ts +21 -0
  620. package/src/ssr/admission.ts +380 -14
  621. package/src/ssr/compose.ts +144 -0
  622. package/src/ssr/errors.ts +48 -0
  623. package/src/ssr/graph.ts +777 -0
  624. package/src/ssr/history.ts +436 -0
  625. package/src/ssr/hiz.ts +124 -0
  626. package/src/ssr/inspection.ts +124 -0
  627. package/src/ssr/resources.ts +202 -0
  628. package/src/ssr/temporal.ts +164 -0
  629. package/src/systems/skin-palette-allocator.ts +495 -148
  630. package/src/systems/skin-palette-types.ts +17 -0
  631. package/src/systems/transparent-dispatch.ts +90 -0
  632. package/src/targets/material-source.ts +34 -0
  633. package/src/temporal/coverage.ts +1 -1
  634. package/src/temporal/frame-coordinator.ts +23 -2
  635. package/src/temporal/gpu.ts +74 -12
  636. package/src/temporal/history.ts +3 -1
  637. package/src/temporal/inspection.ts +2 -1
  638. package/src/temporal/standard-scene-data.ts +3 -1
  639. package/src/temporal/temporal-view.ts +3 -0
  640. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +204 -139
  641. package/src/typed-render-graph-primitives.ts +266 -74
  642. package/src/typed-shadow-passes.ts +122 -12
  643. package/src/volume/temporal.ts +10 -0
  644. package/dist/chunk-ADHHVYLW.mjs.map +0 -1
  645. package/dist/chunk-FJ6P52EE.mjs.map +0 -1
  646. package/dist/chunk-GE3SDD72.mjs.map +0 -1
  647. package/dist/chunk-GF523LHF.mjs.map +0 -1
  648. package/dist/chunk-HKXTW355.mjs.map +0 -1
  649. package/dist/chunk-JDWARUOI.mjs.map +0 -1
  650. package/dist/chunk-KM2NOX2I.mjs.map +0 -1
  651. package/dist/chunk-TMIASV2N.mjs.map +0 -1
  652. package/dist/chunk-XDP6XE5V.mjs.map +0 -1
  653. package/dist/chunk-ZZ4YQ474.mjs.map +0 -1
  654. package/src/__tests__/instances-world-ownership.integration.test.ts +0 -62
  655. package/src/scene/__tests__/changed-block-summary.candidate.test.ts +0 -36
@@ -129,6 +129,7 @@ export function writePointsLinesViewUbo(
129
129
  * folded from standalone binding 9 to fix WebGL2 fragment uniform-buffer
130
130
  * overflow; lane N = spot with shadowAtlasTile === N, 16 f32 / lane,
131
131
  * 16 B-aligned at byte 528 = float 132).
132
+ * [236..239] ssrParams (maxDistance, thickness, maxRoughness, enabled).
132
133
  *
133
134
  * @internal
134
135
  */
@@ -218,6 +219,16 @@ export function writeViewUbo(
218
219
  viewPayload[234] = previousCameraPosition[2] ?? 0;
219
220
  viewPayload[235] = 1;
220
221
  }
222
+ // SSR uses the fixed View tail as its single per-camera parameter carrier.
223
+ // Admission has already validated these values; the enabled lane remains
224
+ // zero when the component is absent so disabled frames carry no demand.
225
+ const ssr = camera.screenSpaceReflection;
226
+ if (ssr !== undefined) {
227
+ viewPayload[236] = ssr.maxDistance;
228
+ viewPayload[237] = ssr.thickness;
229
+ viewPayload[238] = ssr.maxRoughness;
230
+ viewPayload[239] = 1;
231
+ }
221
232
  // splitPlanes at [108..123] (four vec4 lanes: split/world texel/depth span/reserved).
222
233
  if (lights.splitPlanes !== undefined) {
223
234
  for (let s = 0; s < 4; s++) {
@@ -28,15 +28,18 @@ import {
28
28
  postProcessShaderEntrySignature,
29
29
  } from '../fullscreen-post-process-pass';
30
30
  import { GpuDrivenProduction } from '../gpu-driven/production-raster';
31
- import { disposeInstanceBufferChunks, disposeInstanceBuffers } from '../instance-buffer-cache';
32
31
  import { inspectStandardLighting } from '../pipeline/standard-lighting/inspection';
32
+ import { retireAutoExposureGpuResources } from '../pipeline/standard-output/auto-exposure/gpu';
33
+ import {
34
+ prepareStandardOutputResources,
35
+ resetStandardOutputForDeviceLoss,
36
+ } from '../pipeline/standard-output/resources';
33
37
  import type { PipelineBuilderShaderModuleFactory } from '../pipeline-builder';
34
38
  import { inspectPointShadow } from '../point-shadow-inspection';
35
39
  import type { PreparedGraphicsResolver } from '../prepare/prepared-graphics-resolver';
36
- import { validateRenderables } from '../record/frame';
40
+ import { gpuDrivenMeshesForFrame, validateRenderables } from '../record/frame';
37
41
  import { prepareFrameLighting } from '../record/frame-lighting';
38
42
  import type { RenderFrameState, ValidatedRenderable } from '../record/frame-snapshot';
39
- import { resolveGeometryInstanceBuffer } from '../record/main-pass-geometry';
40
43
  import { computeSplitLdrSprite } from '../record/main-pass-sprite-draws';
41
44
  import {
42
45
  prepareRecoveryPipelineReadiness,
@@ -49,13 +52,6 @@ import {
49
52
  type RenderFeatureGraphCandidate,
50
53
  } from '../record/typed-frame-graph';
51
54
  import { STANDARD_OUTPUT_TRANSFORM_FEATURE_ID } from '../render-contract';
52
- import type {
53
- RecoveryGraphCandidate,
54
- RecoveryGraphCandidatePreparation,
55
- RecoveryGraphCandidateRuntime,
56
- RecoveryGraphSetupSubmission,
57
- RecoveryPointsLinesCandidate,
58
- } from '../render-system';
59
55
  import type { ExtractedFrame, MaterialSnapshot } from '../render-system-extract';
60
56
  import type { PersistentGpuDrivenCandidate, PersistentRenderScene } from '../scene/render-scene';
61
57
  import { SHADOW_ATLAS_DEFAULT_LAYERS } from '../shadow-atlas';
@@ -64,7 +60,15 @@ import {
64
60
  getTemporalBindGroupResources,
65
61
  getTemporalGpuState,
66
62
  getTemporalParamsBuffer,
63
+ TEMPORAL_HISTORY_FORMATS,
67
64
  } from '../temporal/gpu';
65
+ import type {
66
+ RecoveryGraphCandidate,
67
+ RecoveryGraphCandidatePreparation,
68
+ RecoveryGraphCandidateRuntime,
69
+ RecoveryGraphSetupSubmission,
70
+ RecoveryPointsLinesCandidate,
71
+ } from './types';
68
72
 
69
73
  export interface PreparedResolverCaches {
70
74
  readonly preparedPipelineIds: WeakMap<object, string>;
@@ -123,7 +127,7 @@ export interface RenderSystemRecoveryOwner {
123
127
  setLastSuccessfulFrameSeed(seed: RecoveryFrameSeed): void;
124
128
  prepareRecoveryGraphCandidate(
125
129
  runtime: RecoveryGraphCandidateRuntime,
126
- ): Promise<RecoveryGraphCandidatePreparation>;
130
+ ): RecoveryGraphCandidatePreparation;
127
131
  submitCandidateSetup(
128
132
  candidate: RecoveryGraphCandidate,
129
133
  isValid: () => boolean,
@@ -132,22 +136,36 @@ export interface RenderSystemRecoveryOwner {
132
136
  discardRecoveryGraphCandidate(candidate: RecoveryGraphCandidate): void;
133
137
  }
134
138
 
135
- export function materialTextureHandles(
136
- material: MaterialSnapshot,
139
+ /**
140
+ * Keep the missing-texture sentinel out of residency preparation. A zero
141
+ * handle is the same absent-reference value used by materialHandle; resolving
142
+ * it as a real TextureAsset would otherwise pass an undefined pod to the GPU
143
+ * store and fail before the renderer can produce a structured readiness
144
+ * result.
145
+ */
146
+ export function materialTextureHandlesForResidency(
147
+ candidates: Iterable<Handle<'TextureAsset', 'shared'> | undefined>,
137
148
  ): readonly Handle<'TextureAsset', 'shared'>[] {
138
149
  const handles = new Map<number, Handle<'TextureAsset', 'shared'>>();
139
- const add = (handle: Handle<'TextureAsset', 'shared'> | undefined): void => {
140
- if (handle !== undefined) handles.set(Number(handle), handle);
141
- };
142
- for (const handle of material.textureHandles?.values() ?? []) add(handle);
143
- add(material.baseColorTexture);
144
- add(material.metallicRoughnessTexture);
145
- add(material.normalTexture);
146
- add(material.emissiveTexture);
147
- add(material.occlusionTexture);
150
+ for (const handle of candidates) {
151
+ if (handle !== undefined && Number(handle) !== 0) handles.set(Number(handle), handle);
152
+ }
148
153
  return [...handles.values()];
149
154
  }
150
155
 
156
+ export function materialTextureHandles(
157
+ material: MaterialSnapshot,
158
+ ): readonly Handle<'TextureAsset', 'shared'>[] {
159
+ return materialTextureHandlesForResidency([
160
+ ...(material.textureHandles?.values() ?? []),
161
+ material.baseColorTexture,
162
+ material.metallicRoughnessTexture,
163
+ material.normalTexture,
164
+ material.emissiveTexture,
165
+ material.occlusionTexture,
166
+ ]);
167
+ }
168
+
151
169
  export function materialSamplerHandles(
152
170
  material: MaterialSnapshot,
153
171
  ): readonly Handle<'SamplerAsset', 'shared'>[] {
@@ -196,6 +214,13 @@ export function createRenderSystemRecovery(
196
214
  successfulTemporalFrameIndex: 0,
197
215
  temporalFrameTransaction: createTemporalFrameTransaction({ deviceEpoch: 0 }),
198
216
  temporalFrameInput: undefined,
217
+ ssrRequested: false,
218
+ ssrSpatialAdmission: undefined,
219
+ ssrHistoryOwner: undefined,
220
+ ssrHistoryCandidate: undefined,
221
+ ssrTemporalParamsPayload: undefined,
222
+ ssrLastCameraEntity: undefined,
223
+ ssrLastHistoryVersion: undefined,
199
224
  graphTargetCapture: undefined,
200
225
  perFrameGraph: null,
201
226
  directionalShadowCache: null,
@@ -227,8 +252,6 @@ export function createRenderSystemRecovery(
227
252
  currentDirectionalShadowView: null,
228
253
  currentSpotShadowView: null,
229
254
  instanceBuffers: new Map(),
230
- instanceBufferChunks: new Map(),
231
- instanceResidency: new Map(),
232
255
  morphBuffers: new Map(),
233
256
  hdrpClusterBinScratch: createClusterBinScratch(),
234
257
  hdrpClusterGridScratch: null,
@@ -257,7 +280,7 @@ export function createRenderSystemRecovery(
257
280
  };
258
281
 
259
282
  const publishRecoveryGraphCandidate = (candidate: RecoveryGraphCandidate): void => {
260
- candidate.recoveryReadiness.assertFirstRecoveryFrame();
283
+ candidate.recoveryReadiness.assertPreparedCache();
261
284
  const previousFeatureHost = internals.featureHost;
262
285
  // The caller enters this method only after the active generation swap and
263
286
  // after resetForRecover() has shed every lost-device owner. Replace the
@@ -317,9 +340,9 @@ export function createRenderSystemRecovery(
317
340
  candidate.release();
318
341
  };
319
342
 
320
- const prepareRecoveryGraphCandidate = async (
343
+ const prepareRecoveryGraphCandidate = (
321
344
  runtime: RecoveryGraphCandidateRuntime,
322
- ): Promise<RecoveryGraphCandidatePreparation> => {
345
+ ): RecoveryGraphCandidatePreparation => {
323
346
  const seed = lastSuccessfulFrameSeed;
324
347
  if (seed === undefined) return { kind: 'no-seed' };
325
348
  const camera = seed.frame.cameras[0];
@@ -330,6 +353,7 @@ export function createRenderSystemRecovery(
330
353
  if (camera === undefined) return { kind: 'no-seed' };
331
354
 
332
355
  const candidateFrameState = createRecoveryCandidateFrameState();
356
+ resetStandardOutputForDeviceLoss(candidateFrameState, runtime.internals.deviceScope.generation);
333
357
  Object.assign(candidateFrameState, {
334
358
  temporalFrame: undefined,
335
359
  bloomFrameReceipts: undefined,
@@ -356,6 +380,9 @@ export function createRenderSystemRecovery(
356
380
  const releaseCandidate = (): void => {
357
381
  if (candidateReleased || candidatePublished) return;
358
382
  candidateReleased = true;
383
+ const pendingOutput = candidateFrameState.pendingAutoExposureGpuResources;
384
+ if (pendingOutput !== undefined) retireAutoExposureGpuResources(pendingOutput);
385
+ candidateFrameState.pendingAutoExposureGpuResources = undefined;
359
386
  for (const work of setupWorks) work.discard();
360
387
  setupWorks.length = 0;
361
388
  const graph = candidateFrameState.compiledFrameGraph;
@@ -386,13 +413,6 @@ export function createRenderSystemRecovery(
386
413
  candidateGpuDrivenScene = undefined;
387
414
  candidatePointsLines?.release();
388
415
  candidatePointsLines = undefined;
389
- disposeInstanceBuffers(candidateFrameState.instanceBuffers, runtime.internals.errorRegistry);
390
- if (candidateFrameState.instanceBufferChunks !== undefined) {
391
- disposeInstanceBufferChunks(
392
- candidateFrameState.instanceBufferChunks,
393
- runtime.internals.errorRegistry,
394
- );
395
- }
396
416
  candidateGpuStore.destroyAll();
397
417
  };
398
418
  const markPublished = (): void => {
@@ -408,30 +428,43 @@ export function createRenderSystemRecovery(
408
428
  };
409
429
 
410
430
  try {
431
+ const output = prepareStandardOutputResources(
432
+ candidateFrameState,
433
+ runtime.internals,
434
+ camera,
435
+ seed.worlds[seed.cameraOwner] as World,
436
+ );
437
+ if (!output.ok) return failed('candidate Standard output preparation failed', output.error);
411
438
  const gpuScene = persistentRenderScene.prepareRecoveryGpuDrivenCandidate(
412
439
  runtime.internals.device,
413
440
  );
414
441
  if (!gpuScene.ok) return failed('candidate GPU scene preparation failed', gpuScene.error);
415
442
  candidateGpuDrivenScene = gpuScene.value;
416
443
  if (candidateGpuDrivenScene.state !== undefined) {
417
- const production = await GpuDrivenProduction.forRecoveryDevice(
444
+ candidateGpuDrivenProduction = GpuDrivenProduction.forDevice(
418
445
  runtime.internals.device,
419
446
  gpuDrivenShaderFactory,
420
- (descriptor) =>
421
- internals.createShaderModule === undefined
422
- ? Promise.resolve(gpuDrivenShaderFactory.createShaderModule(descriptor))
423
- : internals.createShaderModule(runtime.internals.device, descriptor),
424
447
  );
425
- if (!production.ok)
426
- return failed('candidate GPU-driven shader preparation failed', production.error);
427
- candidateGpuDrivenProduction = production.value;
448
+ const standardPbrArtifact = runtime.internals.getMaterialShaderArtifact?.(
449
+ 'forgeax::default-standard-pbr',
450
+ );
451
+ const standardPbrSkinArtifact =
452
+ runtime.internals.getMaterialShaderArtifact?.('forgeax::pbr-skin');
428
453
  const prepared = candidateGpuDrivenProduction.prepare({
429
454
  scene: candidateGpuDrivenScene.state,
430
455
  camera,
431
- meshes: runtime.pipelineState.meshes,
456
+ meshBySlot: gpuDrivenMeshesForFrame(
457
+ runtime.internals,
458
+ runtime.pipelineState,
459
+ seed.worlds,
460
+ candidateGpuDrivenScene.state,
461
+ ),
432
462
  viewBindGroupLayout: runtime.pipelineState.viewBindGroupLayout,
433
463
  meshResidencyEpoch: runtime.internals.gpuStore.meshResidencyEpoch,
434
464
  hdrp: false,
465
+ ...(standardPbrArtifact === undefined ? {} : { standardPbrArtifact }),
466
+ ...(standardPbrSkinArtifact === undefined ? {} : { standardPbrSkinArtifact }),
467
+ standardPbrPipelineState: runtime.pipelineState,
435
468
  });
436
469
  if (!prepared.ok) return failed('candidate GPU-driven preparation failed', prepared.error);
437
470
  preparedGpuDriven = prepared.value;
@@ -501,8 +534,14 @@ export function createRenderSystemRecovery(
501
534
  ...(batches.length === 0
502
535
  ? {}
503
536
  : { preparedResourceKey: `recovery-${runtime.internals.deviceScope.generation}` }),
504
- onRejected: releaseBatches,
505
- onAbandoned: releaseBatches,
537
+ onRejected: () => {
538
+ featureFrame.onAborted();
539
+ releaseBatches();
540
+ },
541
+ onAbandoned: () => {
542
+ featureFrame.onAborted();
543
+ releaseBatches();
544
+ },
506
545
  };
507
546
  }
508
547
  for (const renderable of seed.frame.renderables) {
@@ -596,25 +635,6 @@ export function createRenderSystemRecovery(
596
635
  if (candidateValidated.length !== seed.frame.renderables.length) {
597
636
  return failed('candidate validation did not retain every LKG-visible renderable');
598
637
  }
599
- for (const entry of candidateValidated) {
600
- if (entry.source.instances === undefined) continue;
601
- const prepared = resolveGeometryInstanceBuffer(
602
- {
603
- runtime: runtime.internals,
604
- pipelineState: runtime.pipelineState,
605
- frameState: candidateFrameState,
606
- bindGroupCounts: { createBindGroup: 0, keys: [] },
607
- },
608
- entry,
609
- [],
610
- false,
611
- );
612
- if (prepared === null) return failed('candidate instance preparation failed');
613
- }
614
- // These uploads belong to recovery preparation, never to a rendered frame.
615
- for (const [id, residency] of candidateFrameState.instanceResidency ?? []) {
616
- candidateFrameState.instanceResidency?.set(id, { ...residency, frameNumber: -1 });
617
- }
618
638
  const lighting = prepareFrameLighting(
619
639
  runtime.internals,
620
640
  candidateFrameState,
@@ -680,7 +700,7 @@ export function createRenderSystemRecovery(
680
700
  ) {
681
701
  throw new Error(`recovery post-process bindings are unavailable: ${id}`);
682
702
  }
683
- const pipeline = postProcessPipeline(id, built.bindGroupLayout, colorFormat, entry);
703
+ const pipeline = postProcessPipeline(id, built.bindGroupLayout, [colorFormat], entry);
684
704
  if (pipeline === null) {
685
705
  throw new Error(`recovery post-process pipeline is unavailable: ${id}`);
686
706
  }
@@ -714,7 +734,11 @@ export function createRenderSystemRecovery(
714
734
  const taaPipeline = postProcessPipeline(
715
735
  'forgeax.taa-resolve',
716
736
  temporalBindings.layout,
717
- 'rgba16float',
737
+ [
738
+ TEMPORAL_HISTORY_FORMATS.color,
739
+ TEMPORAL_HISTORY_FORMATS.temporal,
740
+ TEMPORAL_HISTORY_FORMATS.stability,
741
+ ],
718
742
  taaEntry,
719
743
  );
720
744
  if (taaPipeline === null) {
@@ -0,0 +1,113 @@
1
+ import type { LifecycleResourceSpec } from '../device/device-scope';
2
+ import type { EnvironmentGeneration } from '../environment/generation';
3
+ import type { EnvironmentLifecycle } from '../environment/lifecycle';
4
+ import type { RenderFrameState } from '../record/frame-snapshot';
5
+ import type { RecoveryRootBundle, RecoveryRootRuntime } from '../render-system';
6
+
7
+ /**
8
+ * Assemble replacement-device roots without letting candidate construction
9
+ * publish through the active RenderSystem owner. The caller supplies the
10
+ * small state handoff explicitly so this recovery seam remains independent
11
+ * from frame orchestration.
12
+ */
13
+ export function prepareRenderSystemRecoveryRoots(
14
+ runtime: RecoveryRootRuntime,
15
+ environmentLifecycle: EnvironmentLifecycle,
16
+ frameState: RenderFrameState,
17
+ publishEnvironmentLifecycle: (lifecycle: EnvironmentLifecycle) => void,
18
+ ): RecoveryRootBundle {
19
+ const candidateEnvironmentLifecycle = environmentLifecycle.createRecoveryCandidate(runtime.scope);
20
+ const roots: LifecycleResourceSpec<unknown>[] = [];
21
+ let candidateEnvironmentGeneration: EnvironmentGeneration | undefined;
22
+ let environmentRootCleaned = false;
23
+ let published = false;
24
+ if (candidateEnvironmentLifecycle.hasRecoveryFrame()) {
25
+ const environmentRoot = candidateEnvironmentLifecycle.createRecoveryRoot(runtime.scope);
26
+ roots.push({
27
+ ...environmentRoot,
28
+ create: async () => {
29
+ const generation = (await environmentRoot.create()) as EnvironmentGeneration;
30
+ candidateEnvironmentGeneration = generation;
31
+ return generation;
32
+ },
33
+ cleanup: (value) => {
34
+ if (environmentRootCleaned) return;
35
+ environmentRootCleaned = true;
36
+ if (candidateEnvironmentGeneration === value) candidateEnvironmentGeneration = undefined;
37
+ if (published) {
38
+ candidateEnvironmentLifecycle.retirePublishedGeneration(value as EnvironmentGeneration);
39
+ } else {
40
+ environmentRoot.cleanup(value);
41
+ }
42
+ },
43
+ });
44
+ }
45
+ const graphCandidate = runtime.graphCandidate;
46
+ if (graphCandidate !== undefined) {
47
+ const releaseGraphCandidate = (): void => graphCandidate.release();
48
+ const compiledGraph = graphCandidate.frameState.compiledFrameGraph;
49
+ if (compiledGraph !== null) {
50
+ roots.push({
51
+ kind: 'pipeline',
52
+ create: () => {
53
+ if (!runtime.scope.isAlive())
54
+ throw new Error('Recovery graph candidate scope is not active.');
55
+ if (graphCandidate.frameState.compiledFrameGraph !== compiledGraph) {
56
+ throw new Error('Recovery graph candidate was changed before aggregate assembly.');
57
+ }
58
+ return compiledGraph;
59
+ },
60
+ cleanup: releaseGraphCandidate,
61
+ });
62
+ }
63
+ if (graphCandidate.featureHost !== undefined) {
64
+ const featureRoot = graphCandidate.featureHost.createRecoveryRoot(runtime.scope);
65
+ roots.push({ ...featureRoot, cleanup: releaseGraphCandidate });
66
+ }
67
+ if (graphCandidate.featureGpuWork !== undefined) {
68
+ const featureWorkRoot = graphCandidate.featureGpuWork.createRecoveryRoot(runtime.scope);
69
+ roots.push({ ...featureWorkRoot, cleanup: releaseGraphCandidate });
70
+ }
71
+ if (graphCandidate.gpuDrivenProduction !== undefined) {
72
+ const productionRoot = graphCandidate.gpuDrivenProduction.createRecoveryRoot(runtime.scope);
73
+ roots.push({ ...productionRoot, cleanup: releaseGraphCandidate });
74
+ }
75
+ if (graphCandidate.gpuDrivenScene?.state !== undefined) {
76
+ const sceneRoot = graphCandidate.gpuDrivenScene.createRecoveryRoot(runtime.scope);
77
+ roots.push({ ...sceneRoot, cleanup: releaseGraphCandidate });
78
+ }
79
+ if (graphCandidate.pointsLines !== undefined) {
80
+ const pointsLinesRoot = graphCandidate.pointsLines.createRecoveryRoot(runtime.scope);
81
+ roots.push({ ...pointsLinesRoot, cleanup: releaseGraphCandidate });
82
+ }
83
+ if (runtime.gpuStore.recoveryResourceCount() > 0) {
84
+ const gpuStoreRoot = runtime.gpuStore.createRecoveryRoot(runtime.scope);
85
+ roots.push({ ...gpuStoreRoot, cleanup: releaseGraphCandidate });
86
+ }
87
+ }
88
+ let discarded = false;
89
+ return {
90
+ roots: Object.freeze(roots),
91
+ publish: () => {
92
+ if (published || discarded) return;
93
+ if (candidateEnvironmentGeneration !== undefined && !candidateEnvironmentGeneration.retired) {
94
+ environmentLifecycle.retireActiveForReplacement();
95
+ candidateEnvironmentLifecycle.publish(candidateEnvironmentGeneration);
96
+ }
97
+ published = true;
98
+ publishEnvironmentLifecycle(candidateEnvironmentLifecycle);
99
+ Object.assign(frameState, { environmentLifecycle: candidateEnvironmentLifecycle });
100
+ },
101
+ discard: () => {
102
+ if (published || discarded) return;
103
+ discarded = true;
104
+ if (candidateEnvironmentGeneration !== undefined) {
105
+ candidateEnvironmentLifecycle.discard(candidateEnvironmentGeneration);
106
+ candidateEnvironmentGeneration = undefined;
107
+ }
108
+ candidateEnvironmentLifecycle.discardRecoveryCandidates();
109
+ graphCandidate?.release();
110
+ runtime.scope.abandon();
111
+ },
112
+ };
113
+ }
@@ -0,0 +1,77 @@
1
+ import type { MipmapEncoderWork } from '@forgeax/engine-assets-runtime';
2
+ import type { Buffer, RenderPipeline, RhiDevice } from '@forgeax/engine-rhi';
3
+ import type { DeviceScope, LifecycleResourceSpec } from '../device/device-scope';
4
+ import type { GpuResidencyCache } from '../device/gpu-residency';
5
+ import type { RenderFeatureHost } from '../features/host';
6
+ import type { RenderFeatureGpuWorkOwner } from '../features/prepared-gpu-work';
7
+ import type { GpuDrivenProduction } from '../gpu-driven/production-raster';
8
+ import type { RenderFrameState } from '../record/frame-snapshot';
9
+ import type { RecoveryPipelineReadiness } from '../record/recovery-pipeline';
10
+ import type { PipelineState, RenderSystemInternals } from '../record/render-context';
11
+ import type { RenderFeatureGraphCandidate } from '../record/typed-frame-graph';
12
+ import type { PersistentGpuDrivenCandidate } from '../scene/render-scene';
13
+
14
+ /** The single Points/Lines owner's staged device-generation handoff. */
15
+ export interface RecoveryPointsLinesCandidate {
16
+ createRecoveryRoot(scope: DeviceScope): LifecycleResourceSpec<unknown>;
17
+ publish(): void;
18
+ release(): void;
19
+ }
20
+
21
+ /** Candidate-only device/runtime inputs used by the recovery prepare seam. */
22
+ export interface RecoveryGraphCandidateRuntime {
23
+ readonly internals: RenderSystemInternals;
24
+ readonly pipelineState: PipelineState;
25
+ }
26
+
27
+ /** Detached graph state prepared on a replacement device, before publication. */
28
+ export interface RecoveryGraphCandidate {
29
+ readonly frameState: RenderFrameState;
30
+ readonly setupWorks: readonly MipmapEncoderWork[];
31
+ readonly device: RhiDevice;
32
+ readonly generation: number;
33
+ readonly gpuDrivenProduction?: GpuDrivenProduction;
34
+ readonly gpuDrivenScene?: PersistentGpuDrivenCandidate;
35
+ /** Staged CPU-expanded Points/Lines buffers owned by the same RenderSystem. */
36
+ readonly pointsLines?: RecoveryPointsLinesCandidate;
37
+ readonly featureHost?: RenderFeatureHost;
38
+ readonly featureGpuWork?: RenderFeatureGpuWorkOwner;
39
+ readonly featureGraphCandidate?: RenderFeatureGraphCandidate;
40
+ readonly postProcessPipelines?: ReadonlyMap<string, RenderPipeline>;
41
+ readonly recoveryReadiness: RecoveryPipelineReadiness;
42
+ /** Release all candidate roots before publication; safe to call repeatedly. */
43
+ readonly release: () => void;
44
+ /** Transfer candidate-root ownership to the published RenderSystem. */
45
+ readonly markPublished: () => void;
46
+ }
47
+
48
+ /** Candidate setup completion; completion is bounded by the recovery owner. */
49
+ export interface RecoveryGraphSetupSubmission {
50
+ readonly completion?: PromiseLike<unknown>;
51
+ }
52
+
53
+ export type RecoveryGraphCandidatePreparation =
54
+ | { readonly kind: 'no-seed' }
55
+ | { readonly kind: 'ready'; readonly candidate: RecoveryGraphCandidate }
56
+ | { readonly kind: 'failed'; readonly reason: string; readonly cause?: unknown };
57
+
58
+ /** Explicit candidate-owned inputs for lifecycle-root preparation. */
59
+ export interface RecoveryRootRuntime {
60
+ readonly scope: DeviceScope;
61
+ readonly device: RhiDevice;
62
+ readonly gpuStore: GpuResidencyCache;
63
+ readonly graphCandidate?: RecoveryGraphCandidate | undefined;
64
+ }
65
+
66
+ /** Candidate roots plus the one synchronous owner switch at publication. */
67
+ export interface RecoveryRootBundle {
68
+ readonly roots: readonly LifecycleResourceSpec<unknown>[];
69
+ publish(): void;
70
+ discard(): void;
71
+ }
72
+
73
+ /** Device-bound post-process resources prepared off to the side of the active renderer. */
74
+ export interface RecoveryPostProcessResources {
75
+ readonly device: RhiDevice;
76
+ readonly paramsBuffers: Map<string, Buffer>;
77
+ }