@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
@@ -1,10 +1,35 @@
1
1
  import { describe, expect, it } from 'vitest';
2
2
  import {
3
+ buildDispatchPlan,
3
4
  buildMaterialSlotPlan,
4
5
  findRenderablePrefixForSlotCapacity,
5
6
  materialSlotCountForPrefix,
6
7
  } from '../frame';
7
8
 
9
+ function validatedRow(renderableIndex: number) {
10
+ return {
11
+ source: {
12
+ material: { materialShaderId: 'forgeax::default-unlit' },
13
+ materials: [{ materialShaderId: 'forgeax::default-unlit' }],
14
+ },
15
+ mesh: {},
16
+ renderableIndex,
17
+ renderState: undefined,
18
+ stencilReference: undefined,
19
+ } as never;
20
+ }
21
+
22
+ function ceilingInternals(slotCount: number) {
23
+ return {
24
+ growMeshSsbo: () => ({
25
+ ok: false as const,
26
+ code: 'mesh-ssbo-ceiling-reached' as const,
27
+ degradedToSlotCount: slotCount,
28
+ }),
29
+ meshSsboState: { slotCount },
30
+ } as never;
31
+ }
32
+
8
33
  describe('material slot plan', () => {
9
34
  it('interns repeated snapshot identities across renderables', () => {
10
35
  const a = {};
@@ -41,4 +66,27 @@ describe('material slot plan', () => {
41
66
  expect(findRenderablePrefixForSlotCapacity(indices, 5)).toBe(3);
42
67
  expect(materialSlotCountForPrefix(indices, 3)).toBe(5);
43
68
  });
69
+
70
+ it('keeps retained shadow rows inside the ceiling when the primary view is empty', () => {
71
+ const shadowRows = [validatedRow(0), validatedRow(1), validatedRow(2)];
72
+ const plan = buildDispatchPlan(ceilingInternals(2), [], [], [], shadowRows);
73
+
74
+ expect(plan.validatedOrdered).toHaveLength(0);
75
+ expect(plan.shadowValidatedOrdered).toEqual(shadowRows.slice(0, 2));
76
+ expect(plan.validatedOrdered.length + plan.shadowValidatedOrdered.length).toBeLessThanOrEqual(
77
+ 2,
78
+ );
79
+ });
80
+
81
+ it('reserves the primary rows before retained shadow rows on a mixed ceiling', () => {
82
+ const primaryRows = [validatedRow(0), validatedRow(1)];
83
+ const shadowRows = [validatedRow(2), validatedRow(3)];
84
+ const plan = buildDispatchPlan(ceilingInternals(3), primaryRows, [], [], shadowRows);
85
+
86
+ expect(plan.validatedOrdered).toEqual(primaryRows);
87
+ expect(plan.shadowValidatedOrdered).toEqual(shadowRows.slice(0, 1));
88
+ expect(plan.validatedOrdered.length + plan.shadowValidatedOrdered.length).toBeLessThanOrEqual(
89
+ 3,
90
+ );
91
+ });
44
92
  });
@@ -1,5 +1,6 @@
1
+ import { err, ok } from '@forgeax/engine-types';
1
2
  import { describe, expect, it } from 'vitest';
2
- import { getOrCreateFromChain } from '../mesh-ssbo';
3
+ import { getOrCreateFromChain, getOrCreateFromChainResult } from '../mesh-ssbo';
3
4
 
4
5
  describe('mesh bind-group cache chains', () => {
5
6
  it('keeps variable-depth material resource chains isolated', () => {
@@ -35,4 +36,42 @@ describe('mesh bind-group cache chains', () => {
35
36
  expect(long).not.toBe(short);
36
37
  expect(counts.createBindGroup).toBe(2);
37
38
  });
39
+
40
+ it('propagates bind-group creation failures without poisoning the cache', () => {
41
+ const root = new WeakMap<object, unknown>();
42
+ const resource = {};
43
+ const counts = { createBindGroup: 0, keys: [] as string[] };
44
+ const failure = { code: 'rhi-device-lost' };
45
+ const failed = getOrCreateFromChainResult(
46
+ root,
47
+ [resource],
48
+ 'retryable',
49
+ () => err(failure),
50
+ counts,
51
+ );
52
+ expect(failed).toEqual({ ok: false, error: failure });
53
+ expect(counts.createBindGroup).toBe(0);
54
+
55
+ const created = { id: 'created' } as never;
56
+ const recovered = getOrCreateFromChainResult(
57
+ root,
58
+ [resource],
59
+ 'retryable',
60
+ () => ok(created),
61
+ counts,
62
+ );
63
+ expect(recovered).toEqual({ ok: true, value: created });
64
+ expect(counts.createBindGroup).toBe(1);
65
+ expect(
66
+ getOrCreateFromChainResult(
67
+ root,
68
+ [resource],
69
+ 'retryable',
70
+ () => {
71
+ throw new Error('cache miss after recovery');
72
+ },
73
+ counts,
74
+ ),
75
+ ).toEqual({ ok: true, value: created });
76
+ });
38
77
  });
@@ -1,10 +1,7 @@
1
1
  import { deriveVertexLayoutProjection } from '@forgeax/engine-geometry';
2
2
  import { describe, expect, it } from 'vitest';
3
3
  import { makeZeroCameraFallbackSnapshot, type ValidatedRenderable } from '../frame-snapshot';
4
- import {
5
- createRecoveryColdWorkGuard,
6
- prepareRecoveryPipelineReadiness,
7
- } from '../recovery-pipeline';
4
+ import { prepareRecoveryPipelineReadiness } from '../recovery-pipeline';
8
5
  import type { PipelineState, RenderSystemInternals } from '../render-context';
9
6
 
10
7
  function probeRenderable(probe: boolean): ValidatedRenderable {
@@ -69,7 +66,7 @@ function recoveryReadinessFor(
69
66
  });
70
67
  }
71
68
 
72
- describe('recovery first-frame cold-work guard', () => {
69
+ describe('recovery prepared pipeline cache', () => {
73
70
  it('prepares the probe-enabled Standard PBR variant used by the live record path', () => {
74
71
  const readiness = recoveryReadinessFor(probeRenderable(true));
75
72
  const standardPbr = readiness.pipelineSpecs.find(
@@ -97,28 +94,4 @@ describe('recovery first-frame cold-work guard', () => {
97
94
  expect(standardPbr?.shader.variantSet).toContain('REFLECTION_FALLBACK_AVAILABLE=true');
98
95
  expect(standardPbr?.attachments.colorFormats).toEqual(['rgba16float', 'rgba16float']);
99
96
  });
100
-
101
- it('accepts a prepared candidate with no first-frame cold work', () => {
102
- const guard = createRecoveryColdWorkGuard();
103
-
104
- guard.arm();
105
- expect(() => guard.finish()).not.toThrow();
106
- expect(() => guard.finish()).not.toThrow();
107
- });
108
-
109
- it.each([
110
- [
111
- 'pipeline',
112
- (guard: ReturnType<typeof createRecoveryColdWorkGuard>) => guard.notePipelineColdWork(),
113
- ],
114
- [
115
- 'upload',
116
- (guard: ReturnType<typeof createRecoveryColdWorkGuard>) => guard.noteUploadColdWork(),
117
- ],
118
- ] as const)('hard-fails a first-frame %s miss before submission', (_kind, note) => {
119
- const guard = createRecoveryColdWorkGuard();
120
-
121
- guard.arm();
122
- expect(() => note(guard)).toThrow(/recovery first frame performed cold/);
123
- });
124
97
  });
@@ -1,8 +1,10 @@
1
- import type { Buffer, Sampler, TextureView } from '@forgeax/engine-rhi';
1
+ import type { BindGroupEntry, Buffer, Sampler, TextureView } from '@forgeax/engine-rhi';
2
2
  import { describe, expect, it } from 'vitest';
3
3
  import { assembleMaterialWithSkylightEntries } from '../../ibl/skylight-bind-group';
4
- import { defaultViewForUserRegionField } from '../main-pass-material';
5
- import { buildSpritePassBaseMaterialEntries } from '../main-pass-sprite-draws';
4
+ import {
5
+ BUILTIN_USER_REGION_TEXTURE_FIELDS,
6
+ defaultViewForUserRegionField,
7
+ } from '../main-pass-material';
6
8
  import type { PipelineState } from '../render-context';
7
9
 
8
10
  describe('sprite Standard material ABI', () => {
@@ -27,7 +29,6 @@ describe('sprite Standard material ABI', () => {
27
29
  const white = {} as TextureView;
28
30
  const pipelineState = {
29
31
  materialUniformBuffer: { buffer: {} },
30
- nearestSampler: sampler,
31
32
  defaultSampler: sampler,
32
33
  defaultWhiteTextureView: white,
33
34
  defaultNormalTextureView: {} as TextureView,
@@ -35,7 +36,27 @@ describe('sprite Standard material ABI', () => {
35
36
  } as PipelineState;
36
37
  const spriteTexture = {} as TextureView;
37
38
 
38
- const entries = buildSpritePassBaseMaterialEntries(pipelineState, spriteTexture);
39
+ // Sprite no longer owns a parallel material-entry builder. Preserve the
40
+ // shared user-region/IBL layout gate; actual sampler selection is covered
41
+ // by the source-derived 300-frame Sprite raster smoke in both tone lanes.
42
+ const entries: BindGroupEntry[] = [
43
+ { binding: 0, resource: { kind: 'buffer', value: { buffer: {} as Buffer } } },
44
+ ];
45
+ for (const [index, field] of BUILTIN_USER_REGION_TEXTURE_FIELDS.entries()) {
46
+ entries.push(
47
+ { binding: 1 + index * 2, resource: { kind: 'sampler', value: sampler } },
48
+ {
49
+ binding: 2 + index * 2,
50
+ resource: {
51
+ kind: 'textureView',
52
+ value:
53
+ field === 'baseColorTexture'
54
+ ? spriteTexture
55
+ : defaultViewForUserRegionField(field, pipelineState),
56
+ },
57
+ },
58
+ );
59
+ }
39
60
 
40
61
  expect(entries.map((entry) => entry.binding)).toEqual([
41
62
  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
@@ -68,6 +89,16 @@ describe('sprite Standard material ABI', () => {
68
89
  });
69
90
  expect(merged).toHaveLength(24);
70
91
 
92
+ const complete = [
93
+ ...merged,
94
+ {
95
+ binding: 46,
96
+ resource: { kind: 'buffer' as const, value: { buffer: {} as Buffer } },
97
+ },
98
+ ];
99
+ expect(complete).toHaveLength(25);
100
+ expect(complete[24]).toMatchObject({ binding: 46, resource: { kind: 'buffer' } });
101
+
71
102
  const backdrop = {} as TextureView;
72
103
  const active = assembleMaterialWithSkylightEntries(
73
104
  entries,
@@ -2,11 +2,13 @@ import { ok } from '@forgeax/engine-types';
2
2
  import { describe, expect, it } from 'vitest';
3
3
  import type { RenderFeaturePlannedFrame } from '../../features/plan';
4
4
  import { GPU_TEXTURE_USAGE_COPY_SRC } from '../../gpu-texture-usage';
5
+ import { createAutoExposureGraphPlan } from '../../pipeline/standard-output/auto-exposure/graph';
5
6
  import { getTextureIdentity, validateGraphTargetCaptureReadback } from '../frame-snapshot';
6
7
  import {
7
8
  executeCompiledFrameGraph,
8
9
  type RenderFeatureGraphCandidate,
9
10
  renderFeatureGraphPlanSignature,
11
+ updateRenderFeaturePlanRevision,
10
12
  } from '../typed-frame-graph';
11
13
 
12
14
  const captureDescriptor = {
@@ -101,6 +103,13 @@ function planned(generation: number, signature: string): RenderFeaturePlannedFra
101
103
  }
102
104
 
103
105
  describe('typed frame graph feature plan authority', () => {
106
+ it('carries auto exposure as one frame-local candidate plan', () => {
107
+ const plan = createAutoExposureGraphPlan({ width: 17, height: 9 });
108
+ expect(plan.candidateAvailableSameFrame).toBe(true);
109
+ expect(plan.cpuReadbackCount).toBe(0);
110
+ expect(plan.cpuUploadCount).toBe(0);
111
+ });
112
+
104
113
  it('keys topology and last-known-good candidates by stable plan signature and generation', () => {
105
114
  const first = renderFeatureGraphPlanSignature([planned(1, 'plan-a')]);
106
115
  expect(renderFeatureGraphPlanSignature([planned(1, 'plan-a')])).toBe(first);
@@ -116,6 +125,42 @@ describe('typed frame graph feature plan authority', () => {
116
125
  expect(candidate.plans).toHaveLength(1);
117
126
  });
118
127
 
128
+ it('keeps the compact revision stable for equivalent plan objects', () => {
129
+ const first = updateRenderFeaturePlanRevision(
130
+ { revision: 0, entries: [] },
131
+ [planned(1, 'plan-a')],
132
+ [{ featureIdentity: 'synthetic.feature', order: 0, passes: [] }],
133
+ );
134
+ const equivalent = updateRenderFeaturePlanRevision(
135
+ first,
136
+ [planned(1, 'plan-a')],
137
+ [{ featureIdentity: 'synthetic.feature', order: 0, passes: [] }],
138
+ );
139
+ expect(equivalent).toBe(first);
140
+ expect(equivalent.revision).toBe(1);
141
+
142
+ const changedSignature = updateRenderFeaturePlanRevision(
143
+ equivalent,
144
+ [planned(1, 'plan-b')],
145
+ [{ featureIdentity: 'synthetic.feature', order: 0, passes: [] }],
146
+ );
147
+ expect(changedSignature.revision).toBe(2);
148
+ expect(
149
+ updateRenderFeaturePlanRevision(
150
+ changedSignature,
151
+ [planned(2, 'plan-b')],
152
+ [{ featureIdentity: 'synthetic.feature', order: 0, passes: [] }],
153
+ ).revision,
154
+ ).toBe(3);
155
+ expect(
156
+ updateRenderFeaturePlanRevision(
157
+ changedSignature,
158
+ [planned(1, 'plan-b')],
159
+ [{ featureIdentity: 'synthetic.feature', order: 1, passes: [] }],
160
+ ).revision,
161
+ ).toBe(3);
162
+ });
163
+
119
164
  it('keeps execution projection out of the public planned-frame vocabulary', () => {
120
165
  const invalid: RenderFeaturePlannedFrame = {
121
166
  ...planned(1, 'plan-a'),
@@ -34,6 +34,11 @@ describe('View UBO directional shadow ABI', () => {
34
34
  it('declares one shared View binding with a vec4 directional filter carrier', () => {
35
35
  const viewStruct = commonWgslSrc.match(/struct View \{[\s\S]*?\n\};/)?.[0] ?? '';
36
36
  expect(viewStruct).toMatch(/directionalShadowFilter\s*:\s*vec4<f32>/);
37
+ expect(viewStruct).toMatch(/ssrParams\s*:\s*vec4<f32>/);
38
+ expect(viewUboSrc).toMatch(/viewPayload\[236\]\s*=\s*ssr\.maxDistance/);
39
+ expect(viewUboSrc).toMatch(/viewPayload\[237\]\s*=\s*ssr\.thickness/);
40
+ expect(viewUboSrc).toMatch(/viewPayload\[238\]\s*=\s*ssr\.maxRoughness/);
41
+ expect(viewUboSrc).toMatch(/viewPayload\[239\]\s*=\s*1/);
37
42
  expect(viewStruct).not.toMatch(/pcfKernelSize/);
38
43
  expect(commonWgslSrc.match(/@group\(0\) @binding\(0\) var<uniform> view/g)).toHaveLength(1);
39
44
  });
@@ -0,0 +1,59 @@
1
+ import type { World } from '@forgeax/engine-ecs';
2
+ import type { RenderFrameState, ValidatedRenderable } from './frame-snapshot';
3
+
4
+ /** Capture the render-stage mesh binding used by the current submitted frame. */
5
+ export function createDynamicGeometryConsumptionRecorder(
6
+ worlds: readonly World[],
7
+ bindings: WeakMap<World, Map<number, number>>,
8
+ ): (entry: ValidatedRenderable) => void {
9
+ return (entry) => {
10
+ const renderable = entry.source;
11
+ const world = worlds[renderable.worldId];
12
+ if (world === undefined) return;
13
+ let worldBindings = bindings.get(world);
14
+ if (worldBindings === undefined) {
15
+ worldBindings = new Map();
16
+ bindings.set(world, worldBindings);
17
+ }
18
+ worldBindings.set(renderable.entityKey, renderable.assetHandle);
19
+ };
20
+ }
21
+
22
+ export interface DynamicGeometryFrameBindings {
23
+ begin(): void;
24
+ onRenderableDraw(worlds: readonly World[]): (entry: ValidatedRenderable) => void;
25
+ commit(submitted: boolean): void;
26
+ isConsumed(world: World, entity: number, meshHandle: number | undefined): boolean;
27
+ }
28
+
29
+ /** Own the submitted-frame receipt used by dynamic-geometry publication. */
30
+ export function createDynamicGeometryFrameBindings(): DynamicGeometryFrameBindings {
31
+ let submitted = new WeakMap<World, ReadonlyMap<number, number>>();
32
+ let pending = new WeakMap<World, Map<number, number>>();
33
+ return {
34
+ begin(): void {
35
+ submitted = new WeakMap();
36
+ pending = new WeakMap();
37
+ },
38
+ onRenderableDraw(worlds): (entry: ValidatedRenderable) => void {
39
+ return createDynamicGeometryConsumptionRecorder(worlds, pending);
40
+ },
41
+ commit(didSubmit): void {
42
+ if (didSubmit) submitted = pending;
43
+ },
44
+ isConsumed(world, entity, meshHandle): boolean {
45
+ if (!Number.isInteger(entity) || meshHandle === undefined) return false;
46
+ return submitted.get(world)?.get(entity) === meshHandle;
47
+ },
48
+ };
49
+ }
50
+
51
+ /** Drop temporal history after a dynamic-geometry topology replacement. */
52
+ export function resetDynamicGeometryTemporalHistory(frameState: RenderFrameState): void {
53
+ frameState.temporalFrameTransaction.reset('signature-change');
54
+ frameState.temporalFrame = undefined;
55
+ frameState.temporalFrameInput = undefined;
56
+ frameState.lastSuccessfulTemporalView = undefined;
57
+ frameState.successfulTemporalFrameIndex = 0;
58
+ frameState.pendingTemporalCommit = { kind: 'none' };
59
+ }
@@ -137,8 +137,8 @@ function mapClusterUploadFailure(
137
137
  * verbatim from `recordFrame`. Walks the handle-identity WeakMap caches
138
138
  * (feat-20260531 M2 + feat-20260622 M3) to resolve or lazily create the view
139
139
  * (@group 0), mesh (@group 2), and — when HDRP is active — HDRP-unified cluster
140
- * bind groups. Returns all three (null when `hasValidated` is false, the Case E
141
- * clear-pass-only path). No new mutable state: `bindGroupCounts` accounting +
140
+ * bind groups. Raster groups may be null with no validated meshes; the Cluster
141
+ * producer follows the accepted lighting topology independently. `bindGroupCounts` accounting +
142
142
  * cache maps are threaded through explicitly.
143
143
  *
144
144
  * @internal
@@ -181,10 +181,12 @@ export function buildPerFrameBindGroups(
181
181
  const clusteredLighting = standardLighting?.kind === 'clustered';
182
182
  const membershipLayout = pipelineState.hdrpClusterMembershipBindGroupLayout;
183
183
  const membership = frameState.hdrpClusterMembership;
184
- const expectedHdrpBuffers =
185
- hasValidated && clusteredLighting
186
- ? getOrCreateHdrpBuffers(internals, frameState.installedPipelineConfig?.clusterGrid)
187
- : null;
184
+ // The graph's Cluster producer also serves RenderFeature consumers and
185
+ // warmup frames with no ordinary meshes. Its lifetime follows the accepted
186
+ // lighting topology, not the ordinary raster validation count.
187
+ const expectedHdrpBuffers = clusteredLighting
188
+ ? getOrCreateHdrpBuffers(internals, frameState.installedPipelineConfig?.clusterGrid)
189
+ : null;
188
190
  const currentMembership =
189
191
  expectedHdrpBuffers !== null &&
190
192
  membership?.clusterGridBuffer === expectedHdrpBuffers.clusterGridBuffer
@@ -332,7 +334,7 @@ export function buildPerFrameBindGroups(
332
334
  },
333
335
  // feat-20260612-point-light-shadows-urp-hdrp Round-2 F-1:
334
336
  // shadowParams UBO (`array<vec4<f32>, 4>` = 64 B). Lane N
335
- // stores `(near, far, 1/(far-near), 0)` for the point light
337
+ // stores `(near, far, depthBias, normalBias)` for the point light
336
338
  // with shadowAtlasLayer === N. Updated per frame from
337
339
  // `pointShadowSnapshots` below.
338
340
  {
@@ -829,7 +831,7 @@ export function writeSpotModifierTextures(
829
831
  * binding 6), extracted verbatim from `recordFrame`.
830
832
  *
831
833
  * feat-20260612-point-light-shadows-urp-hdrp Round-2 F-1: 4 lanes x vec4<f32>;
832
- * lane[shadowAtlasLayer] = (near, far, 1/(far-near), 0). Lanes for non-shadow
834
+ * lane[shadowAtlasLayer] = (near, far, depthBias, normalBias). Lanes for non-shadow
833
835
  * slots stay zero (the WGSL sample path is gated by PointLight.shadowAtlasLayer
834
836
  * >= 0). Always writes the full 64 B so stale non-zero lanes from a previous
835
837
  * frame's allocation cannot poison the current frame.
@@ -854,11 +856,10 @@ export function writeShadowParamsBuffer(
854
856
  const base = layer * SHADOW_PARAMS_FLOATS_PER_LANE;
855
857
  const near = ps.nearPlane;
856
858
  const far = ps.farPlane;
857
- const invSpan = far > near ? 1 / (far - near) : 0;
858
859
  shadowParamsArr[base] = near;
859
860
  shadowParamsArr[base + 1] = far;
860
- shadowParamsArr[base + 2] = invSpan;
861
- shadowParamsArr[base + 3] = 0;
861
+ shadowParamsArr[base + 2] = ps.depthBias;
862
+ shadowParamsArr[base + 3] = ps.normalBias;
862
863
  }
863
864
  const shadowParamsWriteRes = internals.device.queue.writeBuffer(
864
865
  pipelineState.shadowParamsBuffer,
@@ -18,10 +18,16 @@ import type { DirectionalShadowQuality } from '../components/directional-shadow-
18
18
  import type { EnvironmentGeneration } from '../environment/generation';
19
19
  import type { EnvironmentLifecycle } from '../environment/lifecycle';
20
20
  import type { GpuBuffer } from '../gpu-resource';
21
- import type { InstanceCollectionId, InstanceResidency } from '../instances';
21
+ import type { InstanceCollectionStore } from '../instances';
22
22
  import type { IblBindingInspection } from '../mesh-material-bindings';
23
23
  import type { StandardLightingInspection } from '../pipeline/standard-lighting/inspection';
24
+ import type { AutoExposureGpuResources } from '../pipeline/standard-output/auto-exposure/gpu';
25
+ import type { AutoExposureState } from '../pipeline/standard-output/auto-exposure/state';
26
+ import type { StandardLutGpuResources } from '../pipeline/standard-output/lut-gpu';
27
+ import type { StandardLutCandidate, StandardLutState } from '../pipeline/standard-output/lut-state';
24
28
  import type { PointShadowInspection } from '../point-shadow-inspection';
29
+ import type { SsrSpatialAdmission } from '../ssr/admission';
30
+ import type { SsrHistoryCandidate, SsrHistoryOwner } from '../ssr/history';
25
31
  import type { TemporalGpuState } from '../temporal/gpu';
26
32
  import type { TemporalView } from '../temporal/view';
27
33
 
@@ -30,6 +36,23 @@ export type TemporalCommitOutcome =
30
36
  | { readonly kind: 'off'; readonly view: TemporalView }
31
37
  | { readonly kind: 'taa'; readonly view: TemporalView };
32
38
 
39
+ /** CPU transaction metadata staged beside the renderer-owned GPU candidate. */
40
+ export interface PendingAutoExposureState {
41
+ readonly state: AutoExposureState;
42
+ readonly generation: number;
43
+ readonly deviceEpoch: number;
44
+ readonly frameId: number;
45
+ }
46
+
47
+ /** CPU POD staged beside the renderer-owned LUT resources until submit. */
48
+ export interface PendingStandardLutState {
49
+ readonly state: StandardLutState;
50
+ readonly candidate?: StandardLutCandidate;
51
+ readonly remove: boolean;
52
+ readonly targetGeneration: number;
53
+ readonly deviceEpoch: number;
54
+ }
55
+
33
56
  /**
34
57
  * feat-20260708-composited-multi-world-rendering M1 / D-1 / D-9:
35
58
  * worldId-entityKey composite key helper. Formula: `worldId * 2^32 + entityKey`.
@@ -53,7 +76,14 @@ export function worldEntityKey(worldId: number, entityKey: number): number {
53
76
  return worldId * 4294967296 + entityKey; // 2^32 = 4294967296
54
77
  }
55
78
 
56
- /** Per-renderer projection identity, with entity keys for sprite/fold snapshots. */
79
+ /**
80
+ * Cache identity for a renderer-owned instance collection.
81
+ *
82
+ * A collection can be rebound from one entity to another while retaining the
83
+ * same count, revision, and extraction archetype. The collection id is the
84
+ * owner identity in that case; the entity cache key is only the compatibility
85
+ * fallback for legacy snapshots that predate the collection field.
86
+ */
57
87
  export function instanceCollectionCacheKey(
58
88
  worldId: number,
59
89
  instance: { readonly cacheKey: number; readonly collectionId?: number },
@@ -211,27 +241,78 @@ export function validateGraphTargetCaptureReadback(input: {
211
241
  return { ok: true };
212
242
  }
213
243
 
244
+ /**
245
+ * Receipt delivered after a selected pass-replay raster pass has encoded.
246
+ * The depth view and target handles are the frame-resolved objects used by
247
+ * the graph; the numeric texture identity is derived by getTextureIdentity.
248
+ */
249
+ export interface GraphTargetPassReplayReceipt {
250
+ readonly passName: string;
251
+ readonly executionIndex: number;
252
+ readonly resolvedDepthStencilAttachmentView: TextureView;
253
+ readonly graphGeneration: number;
254
+ readonly targetName: string;
255
+ readonly targetView: TextureView;
256
+ readonly targetTexture: Texture;
257
+ readonly targetTextureIdentity: number;
258
+ }
259
+
260
+ export type GraphTargetPassReplayCallback = (receipt: GraphTargetPassReplayReceipt) => void;
261
+
262
+ /** Receipt delivered once after a complete selected prefix reaches its boundary pass. */
263
+ export interface GraphTargetPassReplayPrefixReceipt extends GraphTargetPassReplayReceipt {
264
+ /** The compiled-order prefix that was replayed. */
265
+ readonly replayPassNames: readonly string[];
266
+ /** The unique depth-bearing raster pass used as the observation anchor. */
267
+ readonly depthAttachmentPassName: string;
268
+ /** The final pass in the selected prefix. */
269
+ readonly observeAfterPassName: string;
270
+ readonly depthAttachmentExecutionIndex: number;
271
+ }
272
+
273
+ export type GraphTargetPassReplayPrefixCallback = (
274
+ receipt: GraphTargetPassReplayPrefixReceipt,
275
+ ) => void;
276
+
214
277
  /** Internal readback request consumed by the record encoder in the same submit. */
215
- export interface GraphTargetCaptureRequest {
216
- readonly name: string;
217
- readonly buffer: Buffer;
218
- readonly bytesPerRow: number;
219
- readonly width: number;
220
- readonly height: number;
221
- /** Descriptor contract checked against the resolved target at copy time. */
222
- readonly expected: {
223
- readonly format: ResolvedColorTargetDescriptor['format'];
224
- readonly width: number;
225
- readonly height: number;
226
- readonly usage: number;
227
- /** Optional caller binding; when present it is checked at copy time. */
228
- readonly identity?: {
229
- readonly graphGeneration: number;
230
- readonly frameId: number;
231
- readonly textureIdentity: number;
278
+ export type GraphTargetCaptureRequest =
279
+ | {
280
+ /** The default preserves the original target-copy request shape. */
281
+ readonly kind?: 'target-copy';
282
+ readonly name: string;
283
+ /** Optional one-shot pass selection for internal graph-target diagnostics. */
284
+ readonly replayPassNames?: readonly string[];
285
+ readonly buffer: Buffer;
286
+ readonly bytesPerRow: number;
287
+ readonly width: number;
288
+ readonly height: number;
289
+ /** Descriptor contract checked against the resolved target at copy time. */
290
+ readonly expected: {
291
+ readonly format: ResolvedColorTargetDescriptor['format'];
292
+ readonly width: number;
293
+ readonly height: number;
294
+ readonly usage: number;
295
+ /** Optional caller binding; when present it is checked at copy time. */
296
+ readonly identity?: {
297
+ readonly graphGeneration: number;
298
+ readonly frameId: number;
299
+ readonly textureIdentity: number;
300
+ };
301
+ };
302
+ }
303
+ | {
304
+ /** Execute selected compiled passes without requesting a target copy. */
305
+ readonly kind: 'pass-replay';
306
+ readonly replayPassNames: readonly string[];
307
+ /** Optional graph target used to validate the selected pass attachment. */
308
+ readonly targetName?: string;
309
+ /** Optional callback invoked after each selected pass encodes. */
310
+ readonly onPassEncoded?: GraphTargetPassReplayCallback;
311
+ /** Optional one-shot callback invoked after the selected prefix boundary encodes. */
312
+ readonly depthAttachmentPassName?: string;
313
+ readonly observeAfterPassName?: string;
314
+ readonly onPrefixEncoded?: GraphTargetPassReplayPrefixCallback;
232
315
  };
233
- };
234
- }
235
316
 
236
317
  /** Renderer-private readback request for the Standard fallback MRT. */
237
318
  export interface ReflectionFallbackReadbackRequest {
@@ -251,7 +332,6 @@ export interface ReflectionFallbackReadbackRequest {
251
332
  };
252
333
  encoded: boolean;
253
334
  }
254
-
255
335
  /**
256
336
  * Build a synthetic CameraSnapshot the record stage uses when the world
257
337
  * carries no Camera entity. Identity-shaped projection / view inputs
@@ -319,6 +399,18 @@ export interface RenderFrameState {
319
399
  iblBindingInspection?: IblBindingInspection;
320
400
  /** Demand for the frame-local Standard fallback MRT. */
321
401
  reflectionFallbackDemand?: boolean;
402
+ /** Whether the active camera explicitly requested SSR this frame. */
403
+ ssrRequested?: boolean | undefined;
404
+ /** Current renderer-owned SSR spatial admission projection. */
405
+ ssrSpatialAdmission?: SsrSpatialAdmission | undefined;
406
+ /** Persistent SSR history owner; candidate is promoted only after submit. */
407
+ ssrHistoryOwner?: SsrHistoryOwner | undefined;
408
+ ssrHistoryCandidate?: SsrHistoryCandidate | undefined;
409
+ /** Reused CPU parameter payload for the SSR temporal resolve. */
410
+ ssrTemporalParamsPayload?: Uint8Array | undefined;
411
+ /** Last camera identity used by the SSR history reset seam. */
412
+ ssrLastCameraEntity?: number | undefined;
413
+ ssrLastHistoryVersion?: number | undefined;
322
414
  /** Monotonic compiled-graph identity used by diagnostic readbacks. */
323
415
  graphGeneration: number;
324
416
  /** Number of successfully submitted TAA frames; failed attempts do not advance it. */
@@ -390,6 +482,22 @@ export interface RenderFrameState {
390
482
  lastSuccessfulCameraAntialias: CameraSnapshot['antialias'] | undefined;
391
483
  /** Staged TAA GPU state is promoted only after queue.submit succeeds. */
392
484
  temporalGpuState: TemporalGpuState | undefined;
485
+ /** Device-scoped auto-exposure buffers imported by the Standard graph. */
486
+ autoExposureGpuResources?: AutoExposureGpuResources | undefined;
487
+ /** Candidate auto-exposure buffers; promoted only after queue.submit succeeds. */
488
+ pendingAutoExposureGpuResources?: AutoExposureGpuResources | undefined;
489
+ /** Accepted auto-exposure inspection state; promoted only after submit. */
490
+ autoExposureState?: AutoExposureState | undefined;
491
+ /** Candidate auto-exposure inspection state; cleared on any failed frame. */
492
+ pendingAutoExposureState?: PendingAutoExposureState | undefined;
493
+ /** Prepared ordinary TextureAsset LUT candidate for the Standard graph. */
494
+ standardLutGpuResources?: StandardLutGpuResources | undefined;
495
+ /** Candidate LUT resources; promoted only after queue.submit succeeds. */
496
+ pendingStandardLutGpuResources?: StandardLutGpuResources | undefined;
497
+ /** Accepted LUT inspection state; promoted only after submit. */
498
+ standardLutState: StandardLutState;
499
+ /** Candidate LUT inspection state; cleared on any failed frame. */
500
+ pendingStandardLutState?: PendingStandardLutState | undefined;
393
501
  /** Last successful TAA GPU state; candidate replacement stays staged until submit. */
394
502
  activeTemporalGpuState: TemporalGpuState | undefined;
395
503
  /** Submitted temporal generations retained until their queue fence resolves. */
@@ -399,12 +507,14 @@ export interface RenderFrameState {
399
507
  pendingTemporalCommit: TemporalCommitOutcome;
400
508
  /** Staged environment generation is promoted only after queue.submit succeeds. */
401
509
  environmentGeneration: EnvironmentGeneration | undefined;
510
+ environmentFrame?: import('../environment/frame').SelectedEnvironmentFrame | undefined;
511
+ pendingAtmospherePublish?: (() => void) | undefined;
402
512
  readonly environmentLifecycle: EnvironmentLifecycle | undefined;
403
513
  currentDirectionalShadowView: TextureView | null;
404
514
  currentSpotShadowView: TextureView | null;
405
515
  readonly instanceBuffers: Map<number, InstanceBufferCacheEntry>;
406
516
  /** Renderer-owned collection owner used for record-stage residency facts. */
407
- readonly instanceResidency?: Map<InstanceCollectionId, InstanceResidency>;
517
+ readonly instanceCollections?: InstanceCollectionStore;
408
518
  /** Stable buffers for renderer-owned collections split by device cap. */
409
519
  readonly instanceBufferChunks?: Map<string, InstanceBufferCacheEntry>;
410
520
  /** Per-object ProbeBlendRecord buffers; upload is one atomic 160B write. */