@forgeax/engine-render 0.1.28 → 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 (642) hide show
  1. package/README.md +627 -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 +21 -0
  5. package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -1
  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 +8 -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 +2 -2
  60. package/dist/{chunk-JAASCMXA.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-J52NMQKR.mjs → chunk-BQVQOQJH.mjs} +1086 -838
  65. package/dist/chunk-BQVQOQJH.mjs.map +1 -0
  66. package/dist/{chunk-IQMKJLNU.mjs → chunk-BTWH7BP4.mjs} +386 -17
  67. package/dist/chunk-BTWH7BP4.mjs.map +1 -0
  68. package/dist/{chunk-MBU4ZVE7.mjs → chunk-FUODTTIA.mjs} +3921 -671
  69. package/dist/chunk-FUODTTIA.mjs.map +1 -0
  70. package/dist/{chunk-MYJ5RPJO.mjs → chunk-JQTSEI3Z.mjs} +3 -3
  71. package/dist/{chunk-MYJ5RPJO.mjs.map → chunk-JQTSEI3Z.mjs.map} +1 -1
  72. package/dist/{chunk-GE3SDD72.mjs → chunk-NICXSHAT.mjs} +16 -38
  73. package/dist/chunk-NICXSHAT.mjs.map +1 -0
  74. package/dist/{chunk-J6KACNOH.mjs → chunk-NRNXBLIJ.mjs} +577 -7
  75. package/dist/chunk-NRNXBLIJ.mjs.map +1 -0
  76. package/dist/{chunk-RBDBZ5R7.mjs → chunk-PA5DRJNI.mjs} +2 -2
  77. package/dist/chunk-PA5DRJNI.mjs.map +1 -0
  78. package/dist/{chunk-VSL23LZE.mjs → chunk-S4DNKQYQ.mjs} +1117 -445
  79. package/dist/chunk-S4DNKQYQ.mjs.map +1 -0
  80. package/dist/components/camera.d.ts +62 -2
  81. package/dist/components/camera.d.ts.map +1 -1
  82. package/dist/components/index.d.ts +1 -0
  83. package/dist/components/index.d.ts.map +1 -1
  84. package/dist/components/instances.d.ts +6 -20
  85. package/dist/components/instances.d.ts.map +1 -1
  86. package/dist/components/scene-instance.d.ts +2 -1
  87. package/dist/components/scene-instance.d.ts.map +1 -1
  88. package/dist/components/screen-space-reflection.d.ts +14 -0
  89. package/dist/components/screen-space-reflection.d.ts.map +1 -0
  90. package/dist/construct-renderer.mjs +12888 -7025
  91. package/dist/construct-renderer.mjs.map +1 -1
  92. package/dist/device/gpu-residency.d.ts +1 -12
  93. package/dist/device/gpu-residency.d.ts.map +1 -1
  94. package/dist/environment/background.d.ts +6 -0
  95. package/dist/environment/background.d.ts.map +1 -0
  96. package/dist/errors/gpu-driven.d.ts +6 -3
  97. package/dist/errors/gpu-driven.d.ts.map +1 -1
  98. package/dist/errors/render.d.ts +7 -4
  99. package/dist/errors/render.d.ts.map +1 -1
  100. package/dist/extract/camera.d.ts.map +1 -1
  101. package/dist/extract/gpu-driven.d.ts +33 -3
  102. package/dist/extract/gpu-driven.d.ts.map +1 -1
  103. package/dist/features/host.d.ts +23 -1
  104. package/dist/features/host.d.ts.map +1 -1
  105. package/dist/features/noise-texture.d.ts +17 -0
  106. package/dist/features/noise-texture.d.ts.map +1 -0
  107. package/dist/features/plan.d.ts +83 -2
  108. package/dist/features/plan.d.ts.map +1 -1
  109. package/dist/features/prepared-gpu-work.d.ts +37 -4
  110. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  111. package/dist/features/prepared-graphics-store.d.ts.map +1 -1
  112. package/dist/features/prepared-graphics.d.ts +5 -0
  113. package/dist/features/prepared-graphics.d.ts.map +1 -1
  114. package/dist/features/render-graph-compute.d.ts +5 -3
  115. package/dist/features/render-graph-compute.d.ts.map +1 -1
  116. package/dist/features/render-graph-contribution.d.ts +11 -3
  117. package/dist/features/render-graph-contribution.d.ts.map +1 -1
  118. package/dist/features/render-graph-raster.d.ts +19 -3
  119. package/dist/features/render-graph-raster.d.ts.map +1 -1
  120. package/dist/features/types.d.ts +11 -0
  121. package/dist/features/types.d.ts.map +1 -1
  122. package/dist/fullscreen-post-process-pass.d.ts +2 -0
  123. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  124. package/dist/gpu-driven/batch-topology.d.ts +34 -1
  125. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  126. package/dist/gpu-driven/pbr-program.d.ts +10 -0
  127. package/dist/gpu-driven/pbr-program.d.ts.map +1 -0
  128. package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
  129. package/dist/gpu-driven/production-raster.d.ts +144 -23
  130. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  131. package/dist/gpu-driven/shadow-views.d.ts +126 -0
  132. package/dist/gpu-driven/shadow-views.d.ts.map +1 -0
  133. package/dist/gpu-driven/view-gpu.d.ts +18 -2
  134. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  135. package/dist/gpu-scene-schema.d.ts +2 -8
  136. package/dist/gpu-scene-schema.d.ts.map +1 -1
  137. package/dist/gpu-scene.d.ts +14 -0
  138. package/dist/gpu-scene.d.ts.map +1 -1
  139. package/dist/gpu-texture-usage.d.ts +1 -0
  140. package/dist/gpu-texture-usage.d.ts.map +1 -1
  141. package/dist/hdrp-buffers.d.ts +6 -0
  142. package/dist/hdrp-buffers.d.ts.map +1 -1
  143. package/dist/ibl/frame-resources.d.ts +8 -0
  144. package/dist/ibl/frame-resources.d.ts.map +1 -0
  145. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  146. package/dist/index.d.ts +18 -8
  147. package/dist/index.d.ts.map +1 -1
  148. package/dist/index.mjs +8 -8
  149. package/dist/inspection-types.d.ts +164 -0
  150. package/dist/inspection-types.d.ts.map +1 -1
  151. package/dist/instances-derived-bounds.d.ts +11 -0
  152. package/dist/instances-derived-bounds.d.ts.map +1 -1
  153. package/dist/instances.d.ts +89 -44
  154. package/dist/instances.d.ts.map +1 -1
  155. package/dist/internal.d.ts +3 -0
  156. package/dist/internal.d.ts.map +1 -1
  157. package/dist/internal.mjs +117 -9
  158. package/dist/internal.mjs.map +1 -1
  159. package/dist/lifecycle.d.ts +2 -1
  160. package/dist/lifecycle.d.ts.map +1 -1
  161. package/dist/material-row.d.ts +5 -0
  162. package/dist/material-row.d.ts.map +1 -0
  163. package/dist/materials.d.ts +15 -0
  164. package/dist/materials.d.ts.map +1 -1
  165. package/dist/pbr-pipeline.d.ts +21 -5
  166. package/dist/pbr-pipeline.d.ts.map +1 -1
  167. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  168. package/dist/pipeline/standard-output/auto-exposure/capability.d.ts +12 -0
  169. package/dist/pipeline/standard-output/auto-exposure/capability.d.ts.map +1 -0
  170. package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts +70 -0
  171. package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts.map +1 -0
  172. package/dist/pipeline/standard-output/auto-exposure/graph.d.ts +75 -0
  173. package/dist/pipeline/standard-output/auto-exposure/graph.d.ts.map +1 -0
  174. package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts +111 -0
  175. package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts.map +1 -0
  176. package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts +16 -0
  177. package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts.map +1 -0
  178. package/dist/pipeline/standard-output/auto-exposure/preset.d.ts +14 -0
  179. package/dist/pipeline/standard-output/auto-exposure/preset.d.ts.map +1 -0
  180. package/dist/pipeline/standard-output/auto-exposure/state.d.ts +46 -0
  181. package/dist/pipeline/standard-output/auto-exposure/state.d.ts.map +1 -0
  182. package/dist/pipeline/standard-output/color-transform.d.ts +27 -0
  183. package/dist/pipeline/standard-output/color-transform.d.ts.map +1 -0
  184. package/dist/pipeline/standard-output/graph.d.ts +15 -0
  185. package/dist/pipeline/standard-output/graph.d.ts.map +1 -0
  186. package/dist/pipeline/standard-output/lut-admission.d.ts +29 -0
  187. package/dist/pipeline/standard-output/lut-admission.d.ts.map +1 -0
  188. package/dist/pipeline/standard-output/lut-gpu.d.ts +48 -0
  189. package/dist/pipeline/standard-output/lut-gpu.d.ts.map +1 -0
  190. package/dist/pipeline/standard-output/lut-state.d.ts +68 -0
  191. package/dist/pipeline/standard-output/lut-state.d.ts.map +1 -0
  192. package/dist/pipeline/standard-output/resources.d.ts +10 -0
  193. package/dist/pipeline/standard-output/resources.d.ts.map +1 -0
  194. package/dist/pipeline/standard-output/types.d.ts +39 -0
  195. package/dist/pipeline/standard-output/types.d.ts.map +1 -0
  196. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  197. package/dist/pipeline/standard-post.d.ts +2 -2
  198. package/dist/pipeline/standard-post.d.ts.map +1 -1
  199. package/dist/pipeline-builder.d.ts +2 -1
  200. package/dist/pipeline-builder.d.ts.map +1 -1
  201. package/dist/pipeline-spec-types.d.ts +4 -0
  202. package/dist/pipeline-spec-types.d.ts.map +1 -1
  203. package/dist/pipeline-spec.d.ts +1 -9
  204. package/dist/pipeline-spec.d.ts.map +1 -1
  205. package/dist/points-lines/standard-owner.d.ts +1 -1
  206. package/dist/points-lines/standard-owner.d.ts.map +1 -1
  207. package/dist/prepare/prepared-graphics-resolver.d.ts +6 -1
  208. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
  209. package/dist/record/dynamic-geometry-consumption.d.ts +15 -0
  210. package/dist/record/dynamic-geometry-consumption.d.ts.map +1 -0
  211. package/dist/record/frame-lighting.d.ts +3 -3
  212. package/dist/record/frame-lighting.d.ts.map +1 -1
  213. package/dist/record/frame-snapshot.d.ts +106 -5
  214. package/dist/record/frame-snapshot.d.ts.map +1 -1
  215. package/dist/record/frame-targets.d.ts.map +1 -1
  216. package/dist/record/frame.d.ts +39 -4
  217. package/dist/record/frame.d.ts.map +1 -1
  218. package/dist/record/main-pass-geometry.d.ts +7 -8
  219. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  220. package/dist/record/main-pass-material.d.ts +38 -1
  221. package/dist/record/main-pass-material.d.ts.map +1 -1
  222. package/dist/record/main-pass-sprite-draws.d.ts +2 -10
  223. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  224. package/dist/record/main-pass.d.ts +12 -2
  225. package/dist/record/main-pass.d.ts.map +1 -1
  226. package/dist/record/mesh-ssbo.d.ts +15 -6
  227. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  228. package/dist/record/prepared-material-bindings.d.ts +19 -0
  229. package/dist/record/prepared-material-bindings.d.ts.map +1 -0
  230. package/dist/record/recovery-pipeline.d.ts +2 -9
  231. package/dist/record/recovery-pipeline.d.ts.map +1 -1
  232. package/dist/record/render-context.d.ts +74 -26
  233. package/dist/record/render-context.d.ts.map +1 -1
  234. package/dist/record/shadow-pass.d.ts +62 -7
  235. package/dist/record/shadow-pass.d.ts.map +1 -1
  236. package/dist/record/skybox-post-pass.d.ts +1 -1
  237. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  238. package/dist/record/typed-frame-graph.d.ts +35 -7
  239. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  240. package/dist/record/view-ubo.d.ts +1 -0
  241. package/dist/record/view-ubo.d.ts.map +1 -1
  242. package/dist/recovery/render-system-candidate.d.ts +10 -2
  243. package/dist/recovery/render-system-candidate.d.ts.map +1 -1
  244. package/dist/recovery/render-system-roots.d.ts +11 -0
  245. package/dist/recovery/render-system-roots.d.ts.map +1 -0
  246. package/dist/recovery/types.d.ts +76 -0
  247. package/dist/recovery/types.d.ts.map +1 -0
  248. package/dist/reflection/record-owner.d.ts +0 -2
  249. package/dist/reflection/record-owner.d.ts.map +1 -1
  250. package/dist/render-contract.d.ts +173 -30
  251. package/dist/render-contract.d.ts.map +1 -1
  252. package/dist/render-graph-primitives.d.ts +1 -0
  253. package/dist/render-graph-primitives.d.ts.map +1 -1
  254. package/dist/render-pipeline.d.ts +64 -5
  255. package/dist/render-pipeline.d.ts.map +1 -1
  256. package/dist/render-system-extract-tail.d.ts +7 -5
  257. package/dist/render-system-extract-tail.d.ts.map +1 -1
  258. package/dist/render-system-extract.d.ts +101 -41
  259. package/dist/render-system-extract.d.ts.map +1 -1
  260. package/dist/render-system-projections.d.ts +22 -0
  261. package/dist/render-system-projections.d.ts.map +1 -0
  262. package/dist/render-system.d.ts +27 -77
  263. package/dist/render-system.d.ts.map +1 -1
  264. package/dist/scene/render-scene-types.d.ts +14 -7
  265. package/dist/scene/render-scene-types.d.ts.map +1 -1
  266. package/dist/scene/render-scene.d.ts +29 -11
  267. package/dist/scene/render-scene.d.ts.map +1 -1
  268. package/dist/scene/shadow-visibility.d.ts +5 -0
  269. package/dist/scene/shadow-visibility.d.ts.map +1 -0
  270. package/dist/ssr/admission.d.ts +70 -1
  271. package/dist/ssr/admission.d.ts.map +1 -1
  272. package/dist/ssr/compose.d.ts +13 -0
  273. package/dist/ssr/compose.d.ts.map +1 -0
  274. package/dist/ssr/errors.d.ts +35 -0
  275. package/dist/ssr/errors.d.ts.map +1 -1
  276. package/dist/ssr/graph.d.ts +60 -0
  277. package/dist/ssr/graph.d.ts.map +1 -0
  278. package/dist/ssr/history.d.ts +97 -0
  279. package/dist/ssr/history.d.ts.map +1 -0
  280. package/dist/ssr/hiz.d.ts +37 -0
  281. package/dist/ssr/hiz.d.ts.map +1 -0
  282. package/dist/ssr/inspection.d.ts +42 -0
  283. package/dist/ssr/inspection.d.ts.map +1 -0
  284. package/dist/ssr/resources.d.ts +58 -0
  285. package/dist/ssr/resources.d.ts.map +1 -0
  286. package/dist/ssr/temporal.d.ts +38 -0
  287. package/dist/ssr/temporal.d.ts.map +1 -0
  288. package/dist/systems/skin-palette-allocator.d.ts +32 -10
  289. package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
  290. package/dist/systems/skin-palette-types.d.ts +15 -0
  291. package/dist/systems/skin-palette-types.d.ts.map +1 -1
  292. package/dist/systems/transparent-dispatch.d.ts +9 -0
  293. package/dist/systems/transparent-dispatch.d.ts.map +1 -0
  294. package/dist/targets/material-source.d.ts +7 -0
  295. package/dist/targets/material-source.d.ts.map +1 -1
  296. package/dist/temporal/frame-coordinator.d.ts +7 -0
  297. package/dist/temporal/frame-coordinator.d.ts.map +1 -1
  298. package/dist/temporal/gpu.d.ts +8 -0
  299. package/dist/temporal/gpu.d.ts.map +1 -1
  300. package/dist/temporal/history.d.ts.map +1 -1
  301. package/dist/temporal/index.mjs +6 -6
  302. package/dist/temporal/inspection.d.ts.map +1 -1
  303. package/dist/temporal/standard-scene-data.d.ts +2 -1
  304. package/dist/temporal/standard-scene-data.d.ts.map +1 -1
  305. package/dist/temporal/temporal-view.d.ts +2 -0
  306. package/dist/temporal/temporal-view.d.ts.map +1 -1
  307. package/dist/typed-render-graph-primitives.d.ts +35 -1
  308. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  309. package/dist/typed-shadow-passes.d.ts +3 -1
  310. package/dist/typed-shadow-passes.d.ts.map +1 -1
  311. package/dist/volume/temporal.d.ts +6 -0
  312. package/dist/volume/temporal.d.ts.map +1 -1
  313. package/package.json +21 -20
  314. package/src/__tests__/auto-exposure-gpu-evidence.ts +291 -0
  315. package/src/__tests__/auto-exposure-inspection.unit.test.ts +80 -0
  316. package/src/__tests__/auto-exposure-transaction.integration.test.ts +99 -0
  317. package/src/__tests__/auto-exposure.browser.test.ts +33 -0
  318. package/src/__tests__/auto-exposure.dawn.test.ts +33 -0
  319. package/src/__tests__/detached-inspection.integration.test.ts +5 -0
  320. package/src/__tests__/device-scope-lifecycle.unit.test.ts +18 -0
  321. package/src/__tests__/device-scope-stale-matrix.unit.test.ts +18 -0
  322. package/src/__tests__/docs-gate-green.unit.test.ts +3 -3
  323. package/src/__tests__/factory-contract.integration.test.ts +67 -8
  324. package/src/__tests__/fallback-row-stride-surface.unit.test.ts +19 -0
  325. package/src/__tests__/feature-depth-input.dawn.test.ts +121 -0
  326. package/src/__tests__/feature-noise.unit.test.ts +38 -0
  327. package/src/__tests__/fixtures/taa-resolve-pinned-baseline.wgsl +301 -0
  328. package/src/__tests__/frame-camera-selection.unit.test.ts +131 -0
  329. package/src/__tests__/frame-plan-contract.unit.test.ts +24 -0
  330. package/src/__tests__/frame-targets.unit.test.ts +24 -0
  331. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +3 -0
  332. package/src/__tests__/gpu-driven-baseline.characterization.test.ts +79 -0
  333. package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +287 -6
  334. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +122 -142
  335. package/src/__tests__/gpu-driven-indirect-raster.browser.test.ts +10 -1
  336. package/src/__tests__/gpu-driven-lod-cache.unit.test.ts +264 -0
  337. package/src/__tests__/gpu-driven-mesh-world-identity.unit.test.ts +349 -0
  338. package/src/__tests__/gpu-driven-pbr.dawn.test.ts +1417 -0
  339. package/src/__tests__/gpu-driven-pbr.integration.test.ts +21 -0
  340. package/src/__tests__/gpu-driven-production-fixture.ts +96 -0
  341. package/src/__tests__/gpu-driven-production.integration.test.ts +1075 -93
  342. package/src/__tests__/gpu-driven-scaling.unit.test.ts +1 -3
  343. package/src/__tests__/gpu-driven-shadow-views.browser.test.ts +63 -0
  344. package/src/__tests__/gpu-driven-shadow-views.dawn.test.ts +294 -0
  345. package/src/__tests__/gpu-driven-shadow-views.integration.test.ts +97 -0
  346. package/src/__tests__/gpu-driven-shadow-views.unit.test.ts +168 -0
  347. package/src/__tests__/gpu-driven-skin-contract.test-d.ts +11 -0
  348. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +72 -20
  349. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +30 -9
  350. package/src/__tests__/gpu-driven-view.unit.test.ts +159 -52
  351. package/src/__tests__/gpu-pass-timing.browser.test.ts +6 -1
  352. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +42 -0
  353. package/src/__tests__/gpu-scene-render-graph-gpu.ts +19 -5
  354. package/src/__tests__/gpu-scene.dawn.test.ts +40 -13
  355. package/src/__tests__/gpu-scene.unit.test.ts +559 -33
  356. package/src/__tests__/instances-culling.integration.test.ts +36 -10
  357. package/src/__tests__/instances-derived-bounds.unit.test.ts +54 -0
  358. package/src/__tests__/instances-store.unit.test.ts +242 -39
  359. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +6 -0
  360. package/src/__tests__/lighting-scene-roundtrip.integration.test.ts +13 -16
  361. package/src/__tests__/lut-lkg-transaction.integration.test.ts +122 -0
  362. package/src/__tests__/material-contract-inventory.unit.test.ts +5 -6
  363. package/src/__tests__/material-dispatch-shader-id.unit.test.ts +51 -0
  364. package/src/__tests__/material-lane-selection.unit.test.ts +60 -0
  365. package/src/__tests__/material-numeric-upload.unit.test.ts +53 -0
  366. package/src/__tests__/material-texture-handles.unit.test.ts +18 -0
  367. package/src/__tests__/material-texture-source.unit.test.ts +87 -0
  368. package/src/__tests__/materials-authoring-validation.unit.test.ts +41 -0
  369. package/src/__tests__/materials-standard-contract.unit.test.ts +52 -2
  370. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +4 -0
  371. package/src/__tests__/normal-fallback.dawn.test.ts +122 -0
  372. package/src/__tests__/particle-material-input-layout.unit.test.ts +104 -0
  373. package/src/__tests__/physical-clearcoat.integration.test.ts +37 -3
  374. package/src/__tests__/pipeline-texture-specialization.unit.test.ts +138 -0
  375. package/src/__tests__/point-shadow-inspection.unit.test.ts +2 -0
  376. package/src/__tests__/prepared-gpu-driven-pbr-contract.test-d.ts +31 -0
  377. package/src/__tests__/prepared-gpu-driven-pbr-contract.unit.test.ts +39 -0
  378. package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +35 -4
  379. package/src/__tests__/prepared-graphics-capability.unit.test.ts +21 -0
  380. package/src/__tests__/prepared-graphics-pipeline-warmup.unit.test.ts +6 -2
  381. package/src/__tests__/profiler-phase-catalog.test.ts +5 -0
  382. package/src/__tests__/public-surface.test-d.ts +3 -0
  383. package/src/__tests__/recovery-candidate-prepare.contract.test.ts +30 -12
  384. package/src/__tests__/reflection-fallback-async-publication.unit.test.ts +104 -0
  385. package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +2 -1
  386. package/src/__tests__/render-error-code-owner.test-d.ts +4 -0
  387. package/src/__tests__/render-error-detail-ssot.test-d.ts +22 -0
  388. package/src/__tests__/render-error-exhaustive.test-d.ts +15 -0
  389. package/src/__tests__/render-feature-gpu-work.integration.test.ts +285 -2
  390. package/src/__tests__/render-feature-plan.unit.test.ts +245 -0
  391. package/src/__tests__/render-feature-shadow-order.unit.test.ts +228 -0
  392. package/src/__tests__/render-feature-zero-work.unit.test.ts +35 -1
  393. package/src/__tests__/render-graph-fallback.integration.test.ts +2 -2
  394. package/src/__tests__/render-owner-cohesion.unit.test.ts +55 -0
  395. package/src/__tests__/render-scene-mixed-updates.integration.test.ts +426 -0
  396. package/src/__tests__/render-scene-projection.unit.test.ts +914 -23
  397. package/src/__tests__/render-scene-resource-updates.integration.test.ts +214 -0
  398. package/src/__tests__/render-scene-skin-lifecycle.integration.test.ts +173 -0
  399. package/src/__tests__/render-scene-temporal-retry.unit.test.ts +133 -0
  400. package/src/__tests__/render-target-material-source.test-d.ts +27 -3
  401. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +60 -0
  402. package/src/__tests__/renderer-frame-transaction.integration.test.ts +923 -5
  403. package/src/__tests__/shader-manifest-fixture.ts +39 -0
  404. package/src/__tests__/skin-motion-regression.unit.test.ts +0 -33
  405. package/src/__tests__/skin-palette-persistent.integration.test.ts +28 -0
  406. package/src/__tests__/skin-palette-persistent.unit.test.ts +247 -0
  407. package/src/__tests__/skinned-shadow-caster.test.ts +118 -14
  408. package/src/__tests__/specular-environment-scale.dawn.test.ts +156 -0
  409. package/src/__tests__/ssr-admission-matrix.integration.test.ts +7 -1
  410. package/src/__tests__/ssr-confidence-compose.unit.test.ts +84 -0
  411. package/src/__tests__/ssr-coordinate-oracle.unit.test.ts +28 -0
  412. package/src/__tests__/ssr-format-probe-gating.integration.test.ts +82 -0
  413. package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +91 -0
  414. package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +112 -0
  415. package/src/__tests__/ssr-gpu-dispatch.ts +946 -0
  416. package/src/__tests__/ssr-graph-topology.unit.test.ts +104 -0
  417. package/src/__tests__/ssr-history-filter.dawn.test.ts +198 -0
  418. package/src/__tests__/ssr-hit-color.dawn.test.ts +273 -0
  419. package/src/__tests__/ssr-hiz-odd-reduction.dawn.test.ts +569 -0
  420. package/src/__tests__/ssr-hiz-rescue.dawn.test.ts +279 -0
  421. package/src/__tests__/ssr-hiz.browser.test.ts +150 -0
  422. package/src/__tests__/ssr-hiz.dawn.test.ts +150 -0
  423. package/src/__tests__/ssr-hiz.unit.test.ts +56 -0
  424. package/src/__tests__/ssr-inspection.unit.test.ts +105 -0
  425. package/src/__tests__/ssr-memory-budget.unit.test.ts +45 -0
  426. package/src/__tests__/ssr-performance-sequence-aggregation.unit.test.ts +15 -0
  427. package/src/__tests__/ssr-public-surface.test-d.ts +37 -0
  428. package/src/__tests__/ssr-receiver-coverage.dawn.test.ts +387 -0
  429. package/src/__tests__/ssr-reflection-mip-reducer.dawn.test.ts +309 -0
  430. package/src/__tests__/ssr-reprojection-probe.ts +90 -0
  431. package/src/__tests__/ssr-roughness-mip.dawn.test.ts +163 -0
  432. package/src/__tests__/ssr-shader-prewarm.unit.test.ts +59 -0
  433. package/src/__tests__/ssr-spatial.integration.test.ts +141 -0
  434. package/src/__tests__/ssr-stable-lattice.dawn.test.ts +475 -0
  435. package/src/__tests__/ssr-temporal-history.unit.test.ts +202 -0
  436. package/src/__tests__/ssr-texel-crossing.dawn.test.ts +448 -0
  437. package/src/__tests__/ssr-zero-work.integration.test.ts +87 -0
  438. package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +44 -12
  439. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +29 -0
  440. package/src/__tests__/standard-output-chain-contract.unit.test.ts +99 -0
  441. package/src/__tests__/standard-output-chain.integration.test.ts +73 -0
  442. package/src/__tests__/standard-output-gpu-evidence.ts +205 -0
  443. package/src/__tests__/standard-output.browser.test.ts +15 -0
  444. package/src/__tests__/standard-output.dawn.test.ts +15 -0
  445. package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +38 -0
  446. package/src/__tests__/standard-pipeline.integration.test.ts +320 -3
  447. package/src/__tests__/standard-profile-oracle.unit.test.ts +22 -0
  448. package/src/__tests__/standard-surface-lighting.unit.test.ts +41 -0
  449. package/src/__tests__/standard-texture-specialization.dawn.test.ts +141 -0
  450. package/src/__tests__/surface-adjacent-regressions.integration.test.ts +6 -3
  451. package/src/__tests__/taa-coverage-edge.dawn.test.ts +193 -0
  452. package/src/__tests__/taa-history-clipping.dawn.test.ts +328 -0
  453. package/src/__tests__/taa-neighborhood-equivalence.dawn.test.ts +778 -0
  454. package/src/__tests__/taa-stability-feedback.browser.test.ts +23 -0
  455. package/src/__tests__/taa-stability-feedback.dawn.test.ts +68 -0
  456. package/src/__tests__/taa-stability-feedback.ts +341 -0
  457. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +49 -7
  458. package/src/__tests__/temporal-reset-matrix.unit.test.ts +9 -0
  459. package/src/__tests__/temporal-transaction.integration.test.ts +28 -0
  460. package/src/__tests__/texture-usage-surface.unit.test.ts +4 -2
  461. package/src/__tests__/typed-pipeline-topology.unit.test.ts +109 -4
  462. package/src/__tests__/typed-scene-pass-material-cache.integration.test.ts +126 -0
  463. package/src/__tests__/vertex-layouts-ssot.unit.test.ts +47 -0
  464. package/src/__tests__/visibility-extract.perf.test.ts +20 -8
  465. package/src/__tests__/visibility-instances.integration.test.ts +19 -7
  466. package/src/__tests__/visibility-producer-matrix.integration.test.ts +20 -9
  467. package/src/assembly/atmosphere-shader-prewarm.ts +38 -0
  468. package/src/assembly/dynamic-geometry-host.ts +48 -0
  469. package/src/assembly/dynamic-geometry-runtime.ts +71 -0
  470. package/src/assembly/factory.ts +4 -0
  471. package/src/assembly/gpu-driven-owner.ts +29 -0
  472. package/src/assembly/host-contract.ts +10 -0
  473. package/src/assembly/material/assembly.ts +38 -0
  474. package/src/assembly/material-shader-policy.ts +71 -28
  475. package/src/assembly/recovery/failure-location.ts +62 -0
  476. package/src/assembly/recovery/renderer-recover.ts +19 -17
  477. package/src/assembly/renderer-facade.ts +12 -0
  478. package/src/assembly/renderer-feature-inspection.ts +13 -0
  479. package/src/assembly/renderer-frame-transaction.ts +63 -0
  480. package/src/assembly/renderer-helpers.ts +26 -0
  481. package/src/assembly/renderer-inspection.ts +6 -0
  482. package/src/assembly/shader-prewarm-policy.ts +32 -0
  483. package/src/assembly/skin-palette-owner.ts +21 -0
  484. package/src/assembly/ssr-shader-prewarm.ts +41 -0
  485. package/src/assembly/webgpu-device-loss.ts +75 -0
  486. package/src/assembly/webgpu-pbr-ready.ts +232 -0
  487. package/src/assembly/webgpu-ready-mipmap.ts +26 -0
  488. package/src/assembly/webgpu-ready.ts +142 -121
  489. package/src/assembly/webgpu-renderer-bootstrap.ts +85 -0
  490. package/src/assembly/webgpu-renderer-contract.ts +69 -0
  491. package/src/assembly/webgpu-renderer-guards.ts +32 -0
  492. package/src/assembly/webgpu-renderer-observation.ts +43 -0
  493. package/src/assembly/webgpu-renderer-recovery-failure.ts +62 -0
  494. package/src/assembly/webgpu-renderer.ts +666 -652
  495. package/src/assembly/webgpu-vertex-layouts.ts +233 -87
  496. package/src/components/__tests__/camera-exposure.contract.unit.test.ts +153 -0
  497. package/src/components/camera.ts +287 -7
  498. package/src/components/index.ts +1 -0
  499. package/src/components/instances.ts +45 -18
  500. package/src/components/scene-instance.ts +2 -1
  501. package/src/components/screen-space-reflection.ts +21 -0
  502. package/src/components/sprite-animation.ts +2 -2
  503. package/src/components/sprite-instances.ts +1 -1
  504. package/src/device/gpu-residency.ts +34 -31
  505. package/src/environment/background.ts +263 -0
  506. package/src/errors/gpu-driven.ts +39 -5
  507. package/src/errors/render.ts +27 -3
  508. package/src/extract/camera.ts +26 -1
  509. package/src/extract/gpu-driven.ts +185 -10
  510. package/src/features/host.ts +237 -19
  511. package/src/features/noise-texture.ts +91 -0
  512. package/src/features/plan.ts +553 -24
  513. package/src/features/prepared-gpu-work.ts +631 -49
  514. package/src/features/prepared-graphics-store.ts +31 -0
  515. package/src/features/prepared-graphics.ts +5 -0
  516. package/src/features/render-graph-compute.ts +41 -8
  517. package/src/features/render-graph-contribution.ts +141 -3
  518. package/src/features/render-graph-raster.ts +143 -30
  519. package/src/features/types.ts +11 -0
  520. package/src/fullscreen-post-process-pass.ts +3 -0
  521. package/src/gpu-driven/batch-topology.ts +424 -102
  522. package/src/gpu-driven/pbr-program.ts +31 -0
  523. package/src/gpu-driven/prepared-draw.ts +29 -4
  524. package/src/gpu-driven/production-raster.ts +2267 -694
  525. package/src/gpu-driven/shadow-views.ts +539 -0
  526. package/src/gpu-driven/view-gpu.ts +188 -41
  527. package/src/gpu-scene-schema.ts +52 -11
  528. package/src/gpu-scene.ts +186 -99
  529. package/src/gpu-texture-usage.ts +1 -0
  530. package/src/hdrp-buffers.ts +72 -36
  531. package/src/ibl/frame-resources.ts +38 -0
  532. package/src/ibl/skylight-bind-group.ts +5 -4
  533. package/src/index.ts +109 -1
  534. package/src/inspection-types.ts +191 -0
  535. package/src/instances-derived-bounds.ts +258 -34
  536. package/src/instances.ts +459 -150
  537. package/src/internal.ts +22 -0
  538. package/src/lifecycle.ts +2 -0
  539. package/src/material-row.ts +145 -0
  540. package/src/materials.ts +44 -8
  541. package/src/pbr-pipeline.ts +159 -17
  542. package/src/pipeline/standard-forward-lane.ts +52 -24
  543. package/src/pipeline/standard-output/__tests__/lut-admission.unit.test.ts +103 -0
  544. package/src/pipeline/standard-output/auto-exposure/__tests__/capability.unit.test.ts +40 -0
  545. package/src/pipeline/standard-output/auto-exposure/__tests__/gpu.contract.unit.test.ts +125 -0
  546. package/src/pipeline/standard-output/auto-exposure/__tests__/graph.contract.unit.test.ts +94 -0
  547. package/src/pipeline/standard-output/auto-exposure/__tests__/oracle.test.ts +108 -0
  548. package/src/pipeline/standard-output/auto-exposure/__tests__/preset.test.ts +26 -0
  549. package/src/pipeline/standard-output/auto-exposure/capability.ts +38 -0
  550. package/src/pipeline/standard-output/auto-exposure/gpu.ts +567 -0
  551. package/src/pipeline/standard-output/auto-exposure/graph.ts +221 -0
  552. package/src/pipeline/standard-output/auto-exposure/inspection.ts +231 -0
  553. package/src/pipeline/standard-output/auto-exposure/oracle.ts +291 -0
  554. package/src/pipeline/standard-output/auto-exposure/preset.ts +28 -0
  555. package/src/pipeline/standard-output/auto-exposure/state.ts +156 -0
  556. package/src/pipeline/standard-output/color-transform.ts +124 -0
  557. package/src/pipeline/standard-output/graph.ts +139 -0
  558. package/src/pipeline/standard-output/lut-admission.ts +121 -0
  559. package/src/pipeline/standard-output/lut-gpu.ts +399 -0
  560. package/src/pipeline/standard-output/lut-state.ts +176 -0
  561. package/src/pipeline/standard-output/resources.ts +121 -0
  562. package/src/pipeline/standard-output/types.ts +58 -0
  563. package/src/pipeline/standard-pipeline.ts +192 -59
  564. package/src/pipeline/standard-post.ts +186 -27
  565. package/src/pipeline-builder.ts +16 -6
  566. package/src/pipeline-spec-types.ts +4 -0
  567. package/src/pipeline-spec.ts +37 -29
  568. package/src/points-lines/standard-owner.ts +6 -14
  569. package/src/prepare/prepared-graphics-resolver.ts +9 -2
  570. package/src/record/__tests__/material-slot-plan.unit.test.ts +48 -0
  571. package/src/record/__tests__/mesh-ssbo.unit.test.ts +40 -1
  572. package/src/record/__tests__/recovery-pipeline.unit.test.ts +2 -29
  573. package/src/record/__tests__/sprite-material-abi.unit.test.ts +36 -5
  574. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +45 -0
  575. package/src/record/__tests__/view-ubo-layout.unit.test.ts +5 -0
  576. package/src/record/dynamic-geometry-consumption.ts +59 -0
  577. package/src/record/frame-lighting.ts +12 -11
  578. package/src/record/frame-snapshot.ts +133 -23
  579. package/src/record/frame-targets.ts +9 -0
  580. package/src/record/frame.ts +725 -133
  581. package/src/record/main-pass-geometry.ts +149 -94
  582. package/src/record/main-pass-material.ts +115 -26
  583. package/src/record/main-pass-sprite-draws.ts +16 -107
  584. package/src/record/main-pass.ts +78 -8
  585. package/src/record/material-uniforms.ts +1 -1
  586. package/src/record/mesh-ssbo.ts +59 -15
  587. package/src/record/prepared-material-bindings.ts +234 -0
  588. package/src/record/recovery-pipeline.ts +59 -136
  589. package/src/record/render-context.ts +90 -22
  590. package/src/record/shadow-pass.ts +1231 -209
  591. package/src/record/skybox-post-pass.ts +14 -3
  592. package/src/record/typed-frame-graph.ts +1004 -44
  593. package/src/record/view-ubo.ts +11 -0
  594. package/src/recovery/render-system-candidate.ts +90 -66
  595. package/src/recovery/render-system-roots.ts +113 -0
  596. package/src/recovery/types.ts +77 -0
  597. package/src/reflection/record-owner.ts +26 -54
  598. package/src/render-contract.ts +195 -25
  599. package/src/render-graph-primitives.ts +6 -2
  600. package/src/render-pipeline.ts +70 -1
  601. package/src/render-system-extract-tail.ts +409 -160
  602. package/src/render-system-extract.ts +376 -102
  603. package/src/render-system-projections.ts +241 -0
  604. package/src/render-system.ts +681 -822
  605. package/src/scene/render-scene-types.ts +13 -4
  606. package/src/scene/render-scene.ts +569 -355
  607. package/src/scene/shadow-visibility.ts +21 -0
  608. package/src/ssr/admission.ts +380 -14
  609. package/src/ssr/compose.ts +144 -0
  610. package/src/ssr/errors.ts +48 -0
  611. package/src/ssr/graph.ts +777 -0
  612. package/src/ssr/history.ts +436 -0
  613. package/src/ssr/hiz.ts +124 -0
  614. package/src/ssr/inspection.ts +124 -0
  615. package/src/ssr/resources.ts +202 -0
  616. package/src/ssr/temporal.ts +164 -0
  617. package/src/systems/skin-palette-allocator.ts +495 -148
  618. package/src/systems/skin-palette-types.ts +17 -0
  619. package/src/systems/transparent-dispatch.ts +90 -0
  620. package/src/targets/material-source.ts +34 -0
  621. package/src/temporal/coverage.ts +1 -1
  622. package/src/temporal/frame-coordinator.ts +23 -2
  623. package/src/temporal/gpu.ts +74 -12
  624. package/src/temporal/history.ts +3 -1
  625. package/src/temporal/inspection.ts +2 -1
  626. package/src/temporal/standard-scene-data.ts +3 -1
  627. package/src/temporal/temporal-view.ts +3 -0
  628. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +204 -139
  629. package/src/typed-render-graph-primitives.ts +266 -74
  630. package/src/typed-shadow-passes.ts +122 -12
  631. package/src/volume/temporal.ts +10 -0
  632. package/dist/chunk-GE3SDD72.mjs.map +0 -1
  633. package/dist/chunk-GF523LHF.mjs.map +0 -1
  634. package/dist/chunk-IQMKJLNU.mjs.map +0 -1
  635. package/dist/chunk-J52NMQKR.mjs.map +0 -1
  636. package/dist/chunk-J6KACNOH.mjs.map +0 -1
  637. package/dist/chunk-JAASCMXA.mjs.map +0 -1
  638. package/dist/chunk-MBU4ZVE7.mjs.map +0 -1
  639. package/dist/chunk-RBDBZ5R7.mjs.map +0 -1
  640. package/dist/chunk-VSL23LZE.mjs.map +0 -1
  641. package/src/__tests__/instances-world-ownership.integration.test.ts +0 -62
  642. package/src/scene/__tests__/changed-block-summary.candidate.test.ts +0 -36
@@ -130,12 +130,10 @@ export class ReflectionProbeRecordOwner {
130
130
  private outputFormat: TextureFormat;
131
131
  private fallbackFormatAvailable: boolean;
132
132
  private nextFallbackTicket = 0;
133
- // Readback completion is asynchronous and can overlap the next frame's
134
- // prepare. Key tickets by immutable id and retain only the latest ticket
135
- // per renderable; an older completion is stale by definition once a newer
136
- // candidate has been staged, but cannot erase the newer ticket.
137
- private pendingFallback = new Map<number, PendingFallback>();
138
- private latestFallbackTickets = new Map<string, number>();
133
+ // Submitted frames own their immutable candidates until completion. Keep
134
+ // only the current projection here: preparing a source-identical frame
135
+ // must not starve an earlier asynchronous readback of publication.
136
+ private latestFallbackTickets = new Map<string, PendingFallback>();
139
137
  private fallbackRetiredFrames = new Map<string, number>();
140
138
  private fallbackCommittedFrames = new Map<string, number>();
141
139
  private fallbackGenerations = new Map<
@@ -283,14 +281,13 @@ export class ReflectionProbeRecordOwner {
283
281
  }
284
282
 
285
283
  private retireFallbackState(frameId: number): void {
286
- for (const pending of this.pendingFallback.values()) {
284
+ for (const pending of this.latestFallbackTickets.values()) {
287
285
  const key = pending.projection.renderableKey;
288
286
  if (key !== undefined) this.fallbackRetiredFrames.set(key, frameId);
289
287
  }
290
288
  for (const key of this.fallbackReceipts.keys()) {
291
289
  this.fallbackRetiredFrames.set(key, frameId);
292
290
  }
293
- this.pendingFallback.clear();
294
291
  this.latestFallbackTickets.clear();
295
292
  this.fallbackReceipts.clear();
296
293
  this.fallbackSignatures.clear();
@@ -561,7 +558,6 @@ export class ReflectionProbeRecordOwner {
561
558
  // producer's second output, so the graph intentionally omits the MRT.
562
559
  // Retire only this frame's candidate tickets; keep any previously
563
560
  // committed LKG receipt without manufacturing a readback failure.
564
- this.discardFallbackTickets(fallbackTickets);
565
561
  return;
566
562
  }
567
563
  let completionFailure: ReflectionFallbackFailureInput | undefined;
@@ -650,6 +646,13 @@ export class ReflectionProbeRecordOwner {
650
646
  continue;
651
647
  }
652
648
  const signature = reflectionFallbackProjectionSignature(projection.value);
649
+ const previousCandidate = this.latestFallbackTickets.get(renderableKey);
650
+ if (
651
+ previousCandidate !== undefined &&
652
+ reflectionFallbackProjectionSignature(previousCandidate.projection) !== signature
653
+ ) {
654
+ this.fallbackRetiredFrames.set(renderableKey, frameId);
655
+ }
653
656
  const previousSignature = this.fallbackSignatures.get(renderableKey);
654
657
  if (previousSignature !== undefined && previousSignature !== signature) {
655
658
  // A changed source, coverage, extent, or BRDF is not a compatible LKG.
@@ -668,11 +671,8 @@ export class ReflectionProbeRecordOwner {
668
671
  deviceGeneration: this.internals.deviceScope.generation,
669
672
  projection: projection.value,
670
673
  };
671
- const previousTicket = this.latestFallbackTickets.get(renderableKey);
672
- if (previousTicket !== undefined) this.pendingFallback.delete(previousTicket);
673
674
  tickets.set(renderableKey, pending);
674
- this.pendingFallback.set(pending.ticket, pending);
675
- this.latestFallbackTickets.set(renderableKey, pending.ticket);
675
+ this.latestFallbackTickets.set(renderableKey, pending);
676
676
  }
677
677
  // Retire rows that disappeared from this frame's main-pass selection.
678
678
  // Keeping them would make a detached inspection row outlive its source.
@@ -688,23 +688,12 @@ export class ReflectionProbeRecordOwner {
688
688
  for (const renderableKey of this.fallbackGenerations.keys()) {
689
689
  if (!tickets.has(renderableKey)) this.fallbackGenerations.delete(renderableKey);
690
690
  }
691
- // An in-flight ticket for a row that disappeared is no longer admissible.
692
- // Remove it eagerly so the map remains bounded; completion still sees the
693
- // missing ticket and safely rejects it as stale.
694
- for (const [ticket, pending] of this.pendingFallback) {
695
- const key = pending.projection.renderableKey;
696
- const current = key === undefined ? undefined : tickets.get(key);
697
- if (
698
- key !== undefined &&
699
- pending.frameId < frameId &&
700
- (current === undefined ||
701
- current.projection.source === 'neutral' ||
702
- reflectionFallbackProjectionSignature(current.projection) !==
703
- reflectionFallbackProjectionSignature(pending.projection))
704
- ) {
705
- this.pendingFallback.delete(ticket);
706
- if (current === undefined) this.fallbackRetiredFrames.set(key, frameId);
707
- }
691
+ // Retire even uncommitted rows, so disappear/reappear cannot revive an
692
+ // old completion. Storage stays bounded by current renderables.
693
+ for (const key of this.latestFallbackTickets.keys()) {
694
+ if (tickets.has(key)) continue;
695
+ this.latestFallbackTickets.delete(key);
696
+ this.fallbackRetiredFrames.set(key, frameId);
708
697
  }
709
698
  if (tickets.size === 0 && facts.length === 0) {
710
699
  const neutralKey = '__frame__';
@@ -723,11 +712,8 @@ export class ReflectionProbeRecordOwner {
723
712
  deviceGeneration: this.internals.deviceScope.generation,
724
713
  projection: projection.value,
725
714
  };
726
- const previousTicket = this.latestFallbackTickets.get(neutralKey);
727
- if (previousTicket !== undefined) this.pendingFallback.delete(previousTicket);
728
715
  tickets.set(neutralKey, pending);
729
- this.pendingFallback.set(pending.ticket, pending);
730
- this.latestFallbackTickets.set(neutralKey, pending.ticket);
716
+ this.latestFallbackTickets.set(neutralKey, pending);
731
717
  }
732
718
  }
733
719
  this.selectFallbackReceiptKey(tickets, skylight !== undefined);
@@ -778,19 +764,13 @@ export class ReflectionProbeRecordOwner {
778
764
  this.fallbackReceiptKey = firstKey;
779
765
  }
780
766
 
781
- private discardFallbackTickets(fallbackTickets: ReadonlyMap<string, PendingFallback>): void {
782
- for (const pending of fallbackTickets.values()) {
783
- this.pendingFallback.delete(pending.ticket);
784
- }
785
- }
786
-
787
767
  /** Commit exact-zero neutral rows even when a non-neutral MRT readback fails. */
788
768
  private commitNeutralFallbacks(fallbackTickets: ReadonlyMap<string, PendingFallback>): number {
789
769
  let committed = 0;
790
770
  for (const [renderableKey, pending] of fallbackTickets) {
791
771
  if (
792
772
  pending.projection.source === 'neutral' &&
793
- this.latestFallbackTickets.get(renderableKey) === pending.ticket &&
773
+ this.latestFallbackTickets.get(renderableKey) === pending &&
794
774
  pending.deviceGeneration === this.internals.deviceScope.generation
795
775
  ) {
796
776
  this.commitFallbackProjection(renderableKey, pending, 'neutral');
@@ -839,7 +819,7 @@ export class ReflectionProbeRecordOwner {
839
819
  /** Retain only a source-identical committed row after candidate failure. */
840
820
  private preserveFallbackLkg(fallbackTickets: ReadonlyMap<string, PendingFallback>): void {
841
821
  for (const [renderableKey, pending] of fallbackTickets) {
842
- if (this.latestFallbackTickets.get(renderableKey) !== pending.ticket) continue;
822
+ if (this.latestFallbackTickets.get(renderableKey) !== pending) continue;
843
823
  const previous = this.fallbackReceipts.get(renderableKey);
844
824
  const signature = reflectionFallbackProjectionSignature(pending.projection);
845
825
  const compatible =
@@ -887,7 +867,6 @@ export class ReflectionProbeRecordOwner {
887
867
  // fallback attachment probe. The prepare phase already published the
888
868
  // structured capability failure and retired all current rows.
889
869
  if (!this.fallbackFormatAvailable) {
890
- this.discardFallbackTickets(fallbackTickets);
891
870
  return;
892
871
  }
893
872
  // A graph attachment descriptor is not a producer receipt. Until the
@@ -906,7 +885,6 @@ export class ReflectionProbeRecordOwner {
906
885
  );
907
886
  this.preserveFallbackLkg(fallbackTickets);
908
887
  }
909
- this.discardFallbackTickets(fallbackTickets);
910
888
  return;
911
889
  }
912
890
  if (fallbackOutput?.readback === undefined) {
@@ -930,7 +908,6 @@ export class ReflectionProbeRecordOwner {
930
908
  });
931
909
  }
932
910
  this.preserveFallbackLkg(nonNeutral);
933
- this.discardFallbackTickets(fallbackTickets);
934
911
  return;
935
912
  }
936
913
  let readback: {
@@ -954,7 +931,6 @@ export class ReflectionProbeRecordOwner {
954
931
  [...fallbackTickets].filter(([, pending]) => pending.projection.source !== 'neutral'),
955
932
  ),
956
933
  );
957
- this.discardFallbackTickets(fallbackTickets);
958
934
  return;
959
935
  }
960
936
  if (
@@ -979,25 +955,23 @@ export class ReflectionProbeRecordOwner {
979
955
  [...fallbackTickets].filter(([, pending]) => pending.projection.source !== 'neutral'),
980
956
  ),
981
957
  );
982
- this.discardFallbackTickets(fallbackTickets);
983
958
  return;
984
959
  }
985
960
  const eligible: Array<[string, PendingFallback]> = [];
986
961
  let staleCount = 0;
987
962
  for (const [renderableKey, pending] of fallbackTickets) {
988
- const staged = this.pendingFallback.get(pending.ticket);
989
963
  const latest = this.latestFallbackTickets.get(renderableKey);
990
964
  const retiredAt = this.fallbackRetiredFrames.get(renderableKey);
991
965
  const committedFrame = this.fallbackCommittedFrames.get(renderableKey);
992
966
  if (
993
- staged !== pending ||
994
- latest !== pending.ticket ||
967
+ latest === undefined ||
968
+ reflectionFallbackProjectionSignature(latest.projection) !==
969
+ reflectionFallbackProjectionSignature(pending.projection) ||
995
970
  pending.frameId !== fallbackOutput.frameId ||
996
971
  pending.deviceGeneration !== this.internals.deviceScope.generation ||
997
972
  (retiredAt !== undefined && pending.frameId < retiredAt) ||
998
973
  (committedFrame !== undefined && pending.frameId <= committedFrame)
999
974
  ) {
1000
- this.pendingFallback.delete(pending.ticket);
1001
975
  staleCount += 1;
1002
976
  continue;
1003
977
  }
@@ -1009,7 +983,7 @@ export class ReflectionProbeRecordOwner {
1009
983
  stage: 'completion',
1010
984
  code: 'reflection-fallback-stale-ticket',
1011
985
  expected:
1012
- 'the fallback completion ticket to match the latest frame and device generation',
986
+ 'the completed fallback to match the current projection and device without rolling back a committed frame',
1013
987
  detail: { staleCount },
1014
988
  });
1015
989
  }
@@ -1042,7 +1016,6 @@ export class ReflectionProbeRecordOwner {
1042
1016
  });
1043
1017
  }
1044
1018
  for (const [renderableKey, pending] of eligible) {
1045
- this.pendingFallback.delete(pending.ticket);
1046
1019
  this.commitFallbackProjection(
1047
1020
  renderableKey,
1048
1021
  pending,
@@ -1058,7 +1031,6 @@ export class ReflectionProbeRecordOwner {
1058
1031
  this.destroyProbeResource(resource);
1059
1032
  }
1060
1033
  this.resources.clear();
1061
- this.pendingFallback.clear();
1062
1034
  this.latestFallbackTickets.clear();
1063
1035
  this.fallbackRetiredFrames.clear();
1064
1036
  this.fallbackCommittedFrames.clear();
@@ -24,8 +24,10 @@ import type {
24
24
  import type { SkinError } from '@forgeax/engine-skinning';
25
25
  import type { ImageError } from '@forgeax/engine-types';
26
26
  import type { RhiBackendInstrumentation } from './assembly/backend-contract';
27
- import type { Antialias, BloomEnabled, Tonemap } from './components/camera';
27
+ import type { Antialias, BloomEnabled, CameraExposure, Tonemap } from './components/camera';
28
+ import type { ScreenSpaceReflectionData } from './components/screen-space-reflection';
28
29
  import type { EnvironmentInspection } from './environment/inspection';
30
+ import type { GpuDrivenPreparationError } from './errors/gpu-driven';
29
31
  import type { RecoveryOutcome, RecoveryPhase } from './errors/recover';
30
32
  import type { RenderError } from './errors/render';
31
33
  import type { RenderFeature, RenderFeatureDiagnostics } from './features/types';
@@ -37,12 +39,16 @@ import type {
37
39
  LodOcclusionInspection,
38
40
  MotionBlurInspection,
39
41
  ReflectionProbeInspection,
42
+ RenderFeatureGraphInspection,
43
+ RenderFeatureHostInspection,
40
44
  RenderSceneInspection,
41
45
  SsrDependenciesInspection,
46
+ SsrSpatialInspection,
42
47
  TemporalTargetInspection,
43
48
  TransmissionInspection,
44
49
  } from './inspection-types';
45
- import type { InstanceCollectionInspection } from './instances';
50
+ import type { InstanceCollectionInspection, InstanceCollectionStore } from './instances';
51
+ import type { RenderSceneBounds } from './scene/render-scene-types';
46
52
  import type { SsrAdmissionIdentity } from './ssr/identity';
47
53
  import type {
48
54
  RenderTarget,
@@ -71,6 +77,8 @@ import type {
71
77
  MeshMaterialBindingObservation,
72
78
  } from './mesh-material-bindings';
73
79
  import type { StandardLightingInspection } from './pipeline/standard-lighting/inspection';
80
+ import type { AutoExposureInspection } from './pipeline/standard-output/auto-exposure/inspection';
81
+ import type { StandardLutInspection } from './pipeline/standard-output/lut-state';
74
82
  import type { StandardProfile } from './pipeline/standard-profile';
75
83
  import type { PointShadowInspection } from './point-shadow-inspection';
76
84
  import type { PostProcessError } from './post-process-errors';
@@ -105,6 +113,15 @@ export type RenderResult<T, E> =
105
113
  /** The only World data boundary accepted by the M6 renderer contract. */
106
114
  export type RenderWorldLease = RenderReadLease;
107
115
 
116
+ /** Camera-owned color/exposure facts projected once at the frame boundary. */
117
+ export interface CameraOutputSnapshot {
118
+ readonly exposure: CameraExposure;
119
+ readonly temperature: number;
120
+ readonly tint: number;
121
+ readonly colorLut: number;
122
+ readonly colorLutStrength: number;
123
+ }
124
+
108
125
  /**
109
126
  * Camera facts shared by extract, record, and scene owners.
110
127
  *
@@ -138,12 +155,16 @@ export interface CameraSnapshot {
138
155
  readonly tonemap: Tonemap;
139
156
  readonly exposure: number;
140
157
  readonly whitePoint: number;
158
+ /** Camera schema output projection consumed by Standard prepare/inspection. */
159
+ readonly output?: CameraOutputSnapshot;
141
160
  readonly antialias: Antialias;
142
161
  readonly bloom: BloomEnabled;
143
162
  readonly bloomThreshold: number;
144
163
  readonly bloomIntensity: number;
145
164
  readonly bloomBlurRadius: number;
146
165
  readonly clearColor: readonly [number, number, number, number];
166
+ /** Optional active-camera SSR authoring fact, copied from the ECS schema. */
167
+ readonly screenSpaceReflection?: ScreenSpaceReflectionData;
147
168
  /** Renderer-owned temporal projection used by Standard's TAA producer. */
148
169
  readonly temporal?: TemporalView;
149
170
  /** Active-camera motion blur parameters, present only when demanded. */
@@ -188,8 +209,43 @@ interface RenderPipelineStateView {
188
209
  * RenderSystemRuntime structurally satisfies this contract, but the public
189
210
  * frame surface does not depend on that assembly owner.
190
211
  */
212
+ interface RenderPipelineObservationCapture {
213
+ readonly domain: 'linear-hdr' | 'linear-ldr' | 'final-srgb';
214
+ readonly format: TextureFormat;
215
+ readonly device: RhiDevice;
216
+ readonly texture: Texture;
217
+ readonly buffer: Buffer;
218
+ readonly frameNumber: number;
219
+ readonly deviceGeneration: number;
220
+ readonly graphGeneration: number;
221
+ readonly backendId: string;
222
+ readonly width: number;
223
+ readonly height: number;
224
+ readonly bytesPerRow: number;
225
+ }
226
+
227
+ interface RenderPipelineObservationCaptureOwner {
228
+ readonly register: (capture: RenderPipelineObservationCapture) => void;
229
+ readonly consume: (frameNumber: number) => readonly RenderPipelineObservationCapture[];
230
+ readonly drain: () => readonly RenderPipelineObservationCapture[];
231
+ }
232
+
191
233
  interface RenderPipelineRuntime {
192
234
  readonly device: RhiDevice;
235
+ /** Current renderer device generation used to fence graph captures. */
236
+ readonly deviceGeneration?: number | undefined;
237
+ /** Public receipt identity reserved for the frame currently being encoded. */
238
+ readonly observationFrameId?: number | undefined;
239
+ /** Renderer-issued graph fence populated by the graph owner during encoding. */
240
+ observationGraphGeneration?: number | undefined;
241
+ /** Per-renderer bridge for receipt-bound graph color captures. */
242
+ readonly observationCaptureOwner?: RenderPipelineObservationCaptureOwner | undefined;
243
+ /**
244
+ * Domains armed for the frame currently being encoded. An absent or empty
245
+ * set is the normal zero-cost path; typed graph capture passes remain
246
+ * declared for topology inspection but do not allocate or copy anything.
247
+ */
248
+ readonly observationCaptureDomains?: readonly FrameObservationDomain[] | undefined;
193
249
  /** Runtime-owned shader module factory used by built-in graph producers. */
194
250
  readonly shaderModuleFactory?: {
195
251
  createShaderModule(input: {
@@ -200,6 +256,16 @@ interface RenderPipelineRuntime {
200
256
  RhiError
201
257
  >;
202
258
  };
259
+ /** Immediate factory used by same-frame built-in producers after runtime warm-up. */
260
+ readonly immediateShaderModuleFactory?: {
261
+ createShaderModule(input: {
262
+ readonly code: string;
263
+ readonly label?: string | undefined;
264
+ }): import('@forgeax/engine-types').Result<
265
+ import('@forgeax/engine-rhi').ShaderModule,
266
+ RhiError
267
+ >;
268
+ };
203
269
  readonly errorRegistry: { fire(error: RendererError): void };
204
270
  readonly debugOverlay?: RenderDebugOverlay | undefined;
205
271
  readonly lookupPostProcess?: (id: string) => PostProcessShaderEntry | undefined;
@@ -207,7 +273,7 @@ interface RenderPipelineRuntime {
207
273
  readonly getPostProcessPipeline?: (
208
274
  id: string,
209
275
  bgl: BindGroupLayout,
210
- colorFormat: GPUTextureFormat,
276
+ colorFormats: readonly GPUTextureFormat[],
211
277
  entry?: PostProcessShaderEntry,
212
278
  ) => RhiRenderPipeline | null;
213
279
  }
@@ -250,6 +316,10 @@ export interface RenderPipelineContext {
250
316
  readonly spotLightProjector?: SpotLightProjectorFrameContext;
251
317
  /** Build-time composed utility sources for the renderer-owned volume passes. */
252
318
  readonly volumetricFogShaders?: VolumetricFogShaderSources;
319
+ /** Build-time composed utility sources for the renderer-owned SSR passes. */
320
+ readonly ssrShaders?: SsrShaderSources;
321
+ /** Build-time composed utility sources for the renderer-owned atmosphere passes. */
322
+ readonly atmosphereShaders?: AtmosphereShaderSources;
253
323
  }
254
324
 
255
325
  /** Stable utility entry-point sources emitted by the shader manifest. */
@@ -260,6 +330,21 @@ export interface VolumetricFogShaderSources {
260
330
  readonly composite: string;
261
331
  }
262
332
 
333
+ /** Stable utility entry-point sources emitted by the shader manifest. */
334
+ export interface SsrShaderSources {
335
+ readonly hiz: string;
336
+ readonly hizReduce: string;
337
+ readonly trace: string;
338
+ readonly temporal: string;
339
+ readonly compose: string;
340
+ }
341
+
342
+ /** Stable analytic-atmosphere entry-point sources emitted by the shader manifest. */
343
+ export interface AtmosphereShaderSources {
344
+ readonly cube: string;
345
+ readonly background: string;
346
+ }
347
+
263
348
  /**
264
349
  * GPU resources for one validated volumetric-fog candidate. The record stage
265
350
  * owns residency and parameter uploads; graph passes consume this narrow view
@@ -304,6 +389,7 @@ export interface SpotLightProjectorFrameContext {
304
389
  */
305
390
  export interface Renderer {
306
391
  /** Renderer-owned authoring and update path for large instance collections. */
392
+ readonly instances: InstanceCollectionStore;
307
393
  attach(world: World): RenderResult<RenderWorldLease, RenderError>;
308
394
  /** Prepare a standard MeshAsset for the active device generation. */
309
395
  prepareDynamicGeometry(
@@ -318,6 +404,18 @@ export interface Renderer {
318
404
  cancelDynamicGeometry(candidate: DynamicGeometryCandidate): Result<void, DynamicGeometryError>;
319
405
  retireDynamicGeometry(candidate: DynamicGeometryCandidate): Result<void, DynamicGeometryError>;
320
406
  draw(input: RenderFrameInput): RenderResult<FrameReceipt, RenderError>;
407
+ /**
408
+ * Arm one upcoming submitted frame for explicit color-domain observation.
409
+ * Observation buffers are not created, copied, mapped, or retained until a
410
+ * host calls this method before `draw()`. The demand is consumed only by a
411
+ * successful submit; a failed frame keeps it armed for a retry.
412
+ *
413
+ * This optional extension keeps older injected Renderer test doubles source
414
+ * compatible while concrete Engine renderers always implement it.
415
+ */
416
+ requestObservation?: (
417
+ domains: readonly FrameObservationDomain[],
418
+ ) => RenderResult<void, RenderError>;
321
419
  createRenderTarget(descriptor: RenderTargetDescriptor): RenderResult<RenderTarget, RenderError>;
322
420
  resizeRenderTarget(
323
421
  target: RenderTarget,
@@ -334,6 +432,8 @@ export interface Renderer {
334
432
  destroyRenderTarget(target: RenderTarget): RenderResult<void, RenderError>;
335
433
  setProfile(profile: RenderProfile): RenderResult<void, RenderError>;
336
434
  state(): RendererState;
435
+ /** Detached world bounds for one record in the last extracted World; undefined if unavailable. */
436
+ bounds(world: World, entity: number): RenderSceneBounds | undefined;
337
437
  inspect(): RenderInspection;
338
438
  observe(
339
439
  receipt: FrameReceipt,
@@ -371,6 +471,8 @@ export type RendererEvent =
371
471
  readonly kind: 'frame-submitted';
372
472
  readonly frameId: number;
373
473
  readonly deviceGeneration: number;
474
+ /** The exact receipt returned by the renderer's submit boundary. */
475
+ readonly receipt: FrameReceipt;
374
476
  };
375
477
 
376
478
  /** Package-local listener alias used by the renderer assembly implementation. */
@@ -400,8 +502,17 @@ export interface FrameEnvironment {
400
502
  * only with the matching FrameReceipt after `receipt.completed` and returns a
401
503
  * structured Result error when the generation or frame identity is stale.
402
504
  */
505
+ export type FrameObservationDomain = 'linear-hdr' | 'linear-ldr' | 'final-srgb';
506
+
507
+ export type FrameObservationInclude =
508
+ | 'timings'
509
+ | 'draws'
510
+ | 'bindings'
511
+ | 'target-readbacks'
512
+ | FrameObservationDomain;
513
+
403
514
  export interface FrameObservationRequest {
404
- readonly include: readonly ('timings' | 'draws' | 'bindings' | 'target-readbacks')[];
515
+ readonly include: readonly FrameObservationInclude[];
405
516
  readonly targetReadbacks?: readonly RenderTargetReadbackTicket[];
406
517
  }
407
518
 
@@ -414,6 +525,10 @@ export interface FrameObservationRequest {
414
525
  export interface FrameReceipt {
415
526
  readonly frameId: number;
416
527
  readonly deviceGeneration: number;
528
+ /** Backend identity captured at submit and checked before observation. */
529
+ readonly backendId?: RhiCaps['backendKind'];
530
+ /** Monotonic compiled graph identity used by renderer-issued observations. */
531
+ readonly graphGeneration?: number;
417
532
  readonly completed: Promise<RenderResult<void, RenderError>>;
418
533
  }
419
534
 
@@ -436,16 +551,44 @@ export interface RenderFrameInput {
436
551
  export interface FrameReceiptObservation {
437
552
  readonly frameId: number;
438
553
  readonly deviceGeneration: number;
439
- readonly include: readonly ('timings' | 'draws' | 'bindings' | 'target-readbacks')[];
554
+ readonly include: readonly FrameObservationInclude[];
440
555
  /** Receipt-bound Render-owned GPU pass facts; absent when not requested. */
441
556
  readonly timings?: GpuPassTimingObservation | undefined;
442
557
  /** Receipt-bound volume GPU timing facts; absent when not requested. */
443
558
  readonly volumeTimings?: VolumeTimingObservation | undefined;
444
559
  readonly targetReadbacks?: readonly RenderTargetReadbackData[];
560
+ /** Independent raw bytes captured from the requested linear/display domains. */
561
+ readonly observations?: readonly FrameDomainObservation[] | undefined;
562
+ }
563
+
564
+ export interface FrameDomainObservation {
565
+ readonly domain: FrameObservationDomain;
566
+ readonly bytes: Uint8Array;
567
+ readonly metadata: {
568
+ readonly frameId: number;
569
+ readonly deviceGeneration: number;
570
+ readonly backendId?: RhiCaps['backendKind'];
571
+ /** Native texture format of the copied attachment, including BGRA order. */
572
+ readonly format: TextureFormat;
573
+ readonly graphGeneration: number;
574
+ readonly textureIdentity: number;
575
+ readonly readbackIdentity: number;
576
+ readonly width: number;
577
+ readonly height: number;
578
+ readonly bytesPerRow: number;
579
+ readonly footprint: {
580
+ readonly resourceCount: number;
581
+ readonly bindGroupCount: number;
582
+ };
583
+ };
445
584
  }
446
585
 
447
586
  /** Stable backend facts for the Standard output transform projection. */
448
587
  export interface RenderOutputInspection {
588
+ /** Camera-owned auto-exposure facts, detached from GPU state when available. */
589
+ readonly autoExposure?: AutoExposureInspection;
590
+ /** Renderer-owned detached LUT residency and receipt facts. */
591
+ readonly standardLut?: StandardLutInspection;
449
592
  readonly outputTransform?: typeof STANDARD_OUTPUT_TRANSFORM_FEATURE_ID;
450
593
  readonly displayEncoded: boolean;
451
594
  readonly intermediateFormat?: TextureFormat;
@@ -493,6 +636,15 @@ export interface RenderObservationInspection {
493
636
  /** Exact pass names and target descriptor from the committed graph. */
494
637
  readonly passNames: readonly string[];
495
638
  readonly standardOutputColor?: RenderStandardOutputColorInspection;
639
+ /** Monotonic, renderer-owned observation resource facts; no GPU handles. */
640
+ readonly resourceStats?: {
641
+ readonly allocationCount: number;
642
+ readonly liveCount: number;
643
+ readonly peakLiveCount: number;
644
+ readonly mapCount: number;
645
+ readonly readbackCount: number;
646
+ readonly liveByteLength: number;
647
+ };
496
648
  }
497
649
 
498
650
  /**
@@ -531,6 +683,12 @@ export interface RenderInspection {
531
683
  readonly features: readonly string[];
532
684
  /** Truthful lifecycle facts for every registered declarative feature. */
533
685
  readonly featureDiagnostics: readonly RenderFeatureDiagnostics[];
686
+ /** Detached signature and prepared-resource counters for feature planning. */
687
+ readonly featureHost?: RenderFeatureHostInspection;
688
+ /** Detached typed-graph compile/reuse and candidate lifecycle counters. */
689
+ readonly featureGraph?: RenderFeatureGraphInspection;
690
+ /** Detached material texture-source probe counters from the last extract. */
691
+ readonly materialTextureSources?: import('./inspection-types').MaterialTextureSourceInspection;
534
692
  readonly frustumStats: { readonly culled: number; readonly total: number };
535
693
  readonly visibilityStats: { readonly explicitlyHidden: number };
536
694
  /** Renderer-owned large-instance residency and upload facts. */
@@ -541,6 +699,8 @@ export interface RenderInspection {
541
699
  readonly reflectionProbes: ReflectionProbeInspection;
542
700
  /** Renderer-owned SSR dependency seam; consumer facts are projected from live owners. */
543
701
  readonly ssrDependencies: SsrDependenciesInspection;
702
+ /** Renderer-owned SSR spatial status and bounded execution facts. */
703
+ readonly ssr: SsrSpatialInspection;
544
704
  /** Last completed transmission candidate facts, detached from GPU handles. */
545
705
  readonly transmission?: TransmissionInspection;
546
706
  /** Last prepared Standard transport facts, detached from GPU handles. */
@@ -583,16 +743,12 @@ export interface RenderInspection {
583
743
  readonly lastGeneration: number | undefined;
584
744
  };
585
745
  };
586
- /** Output transform facts; never includes fixture metrics or pixel bytes. */
587
- readonly outputTransform?: typeof STANDARD_OUTPUT_TRANSFORM_FEATURE_ID;
588
- readonly displayEncoded: boolean;
589
- readonly intermediateFormat?: TextureFormat;
590
- readonly surfaceStorage: TextureFormat;
591
- readonly surfaceDisplay: TextureFormat;
592
- readonly endpoint: 'surface.storage.raw';
593
- readonly capability: RenderOutputInspection['capability'];
594
- readonly presentationProof?: RhiCanvasSurfacePresentationProof;
595
- readonly error: RenderOutputInspection['error'];
746
+ /**
747
+ * Output-transform facts from the same committed graph and physical surface.
748
+ * Keep this as one named subtree so AI consumers do not have to guess which
749
+ * detached fields belong to the output contract versus renderer lifecycle.
750
+ */
751
+ readonly output: RenderOutputInspection;
596
752
  readonly observation: RenderObservationInspection;
597
753
  readonly environment: EnvironmentInspection;
598
754
  readonly temporal: TemporalInspection;
@@ -626,6 +782,8 @@ export interface RenderInspection {
626
782
  export type DrawOwnerOptions = {
627
783
  readonly cameraOwner: number;
628
784
  readonly resourceOwner: number;
785
+ /** Optional FrameCamera entity selection; absent preserves ActiveCamera semantics. */
786
+ readonly cameraEntityKey?: number;
629
787
  readonly profileFrame?: ProfileFrameToken;
630
788
  };
631
789
 
@@ -649,17 +807,18 @@ export type RendererLostListener = (info: RendererLostInfo) => void;
649
807
  * exception), NOT the eliminated cross-cluster `RuntimeError` SSOT (D-3).
650
808
  *
651
809
  * Composition = `RhiError | RenderError | AssetRuntimeError | SkinError |
652
- * PostProcessError`. This equals the pre-decomposition
653
- * `RhiError | RuntimeError | PostProcessError` exactly: `RuntimeError` was
654
- * `RenderError | AssetRuntimeError | SkinError` (27 classes). `RecoverError`
655
- * and `EngineEnvironmentError` are intentionally excluded neither is ever
656
- * emitted through the Renderer event stream (`RecoverError` returns from `recover()`,
657
- * `EngineEnvironmentError` throws at construction), matching the original
658
- * `RuntimeError` union which excluded both (OOS-3 behavior equivalence).
810
+ * GpuDrivenPreparationError | PostProcessError`. The GPU preparation arm is
811
+ * the renderer-owned producer contract: its closed `code` and typed `detail`
812
+ * identify the material, geometry, skin, generation, or shadow owner without making
813
+ * RHI errors carry render policy. `RecoverError` and `EngineEnvironmentError`
814
+ * are intentionally excluded neither is ever emitted through the Renderer
815
+ * event stream (`RecoverError` returns from `recover()`,
816
+ * `EngineEnvironmentError` throws at construction).
659
817
  *
660
818
  * AI consumers do `switch (err.code)` over the union: the disjoint
661
819
  * `RhiErrorCode` / `RenderErrorCode` / `AssetRuntimeErrorCode` / `SkinErrorCode`
662
- * / `PostProcessErrorCode` literal sets let TS narrow each arm to the concrete
820
+ * / `GpuDrivenPreparationErrorCode` / `PostProcessErrorCode` literal sets let
821
+ * TS narrow each arm to the concrete
663
822
  * class (charter P3 union discoverability — every fan-out member is reachable
664
823
  * in an exhaustive switch, no untyped escape). Example:
665
824
  *
@@ -670,7 +829,8 @@ export type RendererLostListener = (info: RendererLostInfo) => void;
670
829
  * case 'asset-not-registered': // AssetRuntimeError arm, err narrowed here
671
830
  * return report(err.hint);
672
831
  * // ...one arm per RhiErrorCode | RenderErrorCode | AssetRuntimeErrorCode
673
- * // | SkinErrorCode | PostProcessErrorCode member; no default needed,
832
+ * // | SkinErrorCode | GpuDrivenPreparationErrorCode |
833
+ * // PostProcessErrorCode member; no default needed,
674
834
  * // TS flags every unhandled code at compile time.
675
835
  * }
676
836
  * });
@@ -681,6 +841,7 @@ export type RendererError =
681
841
  | RenderGraphError
682
842
  | ImageError
683
843
  | RenderError
844
+ | GpuDrivenPreparationError
684
845
  | AssetRuntimeError
685
846
  | SkinError
686
847
  | PostProcessError;
@@ -725,6 +886,11 @@ export const RENDER_GRAPH_EXECUTION_PHASE_CATALOG = [
725
886
  'record/graph-execute/bloom-blur-h',
726
887
  'record/graph-execute/bloom-blur-v',
727
888
  'record/graph-execute/bloom-composite',
889
+ 'record/graph-execute/ssr-hiz',
890
+ 'record/graph-execute/ssr-trace',
891
+ 'record/graph-execute/ssr-temporal',
892
+ 'record/graph-execute/ssr-reflection-mip',
893
+ 'record/graph-execute/ssr-compose',
728
894
  'record/graph-execute/other',
729
895
  ] as const;
730
896
 
@@ -818,7 +984,11 @@ export interface RendererOptions {
818
984
  readonly rhiInstrumentation?: RhiBackendInstrumentation | undefined;
819
985
  /** Optional bounded GPU pass timing facts; this is not frame latency. */
820
986
  readonly gpuPassTiming?: GpuPassTimingOptions | undefined;
821
- /** Exact source/tree/lock/build identity binding for the renderer-owned SSR seam. */
987
+ /**
988
+ * Exact source/tree/lock/build identity binding for the renderer-owned SSR seam.
989
+ * Opts into one format-capability probe during device-generation initialization;
990
+ * camera ScreenSpaceReflection still controls all per-frame SSR work.
991
+ */
822
992
  readonly ssrIdentity?: SsrAdmissionIdentity | undefined;
823
993
  // feat-20260608-create-app-param-surface-trim / M1 / AC-02: `clearColor`
824
994
  // was deleted as a one-cut breaking change (AGENTS.md Change stance +