@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
@@ -12,3 +12,20 @@ export interface SkinPaletteSlice {
12
12
  /** GPU buffer containing the slice's joint matrices. */
13
13
  readonly buffer: Buffer;
14
14
  }
15
+
16
+ export interface SkinPaletteDirtyRange {
17
+ readonly startJoint: number;
18
+ readonly jointCount: number;
19
+ }
20
+
21
+ export interface SkinPaletteReceipt extends SkinPaletteSlice {
22
+ readonly identity: string;
23
+ readonly generation: number;
24
+ readonly fence: number;
25
+ readonly customDataStart: number;
26
+ readonly storageOrUniform: 'storage' | 'uniform';
27
+ readonly bounds?: Float32Array;
28
+ readonly dirtyRanges: readonly SkinPaletteDirtyRange[];
29
+ readonly uploadBytes: number;
30
+ readonly retiredByteOffset?: number;
31
+ }
@@ -0,0 +1,90 @@
1
+ import type { World } from '@forgeax/engine-ecs';
2
+ import { RenderQueue } from '@forgeax/engine-types';
3
+ import type { CameraSnapshot } from '../render-contract';
4
+ import type { DispatchEntry, RenderableSnapshot } from '../render-system-extract';
5
+ import {
6
+ getTransparentSortConfig,
7
+ TRANSPARENT_SORT_MODE_DISTANCE,
8
+ TRANSPARENT_SORT_MODE_LAYER_Y,
9
+ TRANSPARENT_SORT_MODE_LAYER_YZ,
10
+ TRANSPARENT_SORT_MODE_LAYER_Z,
11
+ } from './transparent-sort-config';
12
+
13
+ /**
14
+ * Reorder only the transparent queue while preserving every opaque slot.
15
+ * Equal depth/layer values use material identity as a fold-friendly tie break.
16
+ */
17
+ export function sortTransparentDispatch(
18
+ dispatch: DispatchEntry[],
19
+ world: World,
20
+ cameras: readonly CameraSnapshot[],
21
+ renderables: readonly RenderableSnapshot[],
22
+ ): DispatchEntry[] {
23
+ const cfg = getTransparentSortConfig(world);
24
+ const mode = cfg.mode;
25
+ const transparentSlots: number[] = [];
26
+ for (let i = 0; i < dispatch.length; i++) {
27
+ if (dispatch[i]?.queue === RenderQueue.Transparent) transparentSlots.push(i);
28
+ }
29
+ if (transparentSlots.length <= 1) return dispatch;
30
+
31
+ let sortedSlotOrder: number[];
32
+ if (mode === TRANSPARENT_SORT_MODE_DISTANCE) {
33
+ const camera = cameras[0];
34
+ if (camera === undefined) return dispatch;
35
+ const camPos = camera.position;
36
+ const negDistSq = (entry: DispatchEntry): number => {
37
+ const tx = renderables[entry.renderableIndex]?.transform;
38
+ if (tx === undefined) return 0;
39
+ const w = tx.world;
40
+ const dx = (w[12] ?? 0) - (camPos[0] ?? 0);
41
+ const dy = (w[13] ?? 0) - (camPos[1] ?? 0);
42
+ const dz = (w[14] ?? 0) - (camPos[2] ?? 0);
43
+ return -(dx * dx + dy * dy + dz * dz);
44
+ };
45
+ sortedSlotOrder = transparentSlots.slice().sort((a, b) => {
46
+ const da = negDistSq(dispatch[a] as DispatchEntry);
47
+ const db = negDistSq(dispatch[b] as DispatchEntry);
48
+ if (da < db) return -1;
49
+ if (da > db) return 1;
50
+ return 0;
51
+ });
52
+ } else {
53
+ const sortVal = (entry: DispatchEntry): number => {
54
+ const tx = renderables[entry.renderableIndex]?.transform;
55
+ const w = tx?.world;
56
+ const posY = (w?.[13] ?? 0) as number;
57
+ const posZ = (w?.[14] ?? 0) as number;
58
+ if (mode === TRANSPARENT_SORT_MODE_LAYER_Z) return posZ;
59
+ const mat = renderables[entry.renderableIndex]?.material;
60
+ const pivotAndSize = mat?.paramSnapshot?.pivotAndSize as readonly number[] | undefined;
61
+ const pivotY = (pivotAndSize?.[1] ?? 0.5) as number;
62
+ const wy4 = (w?.[4] ?? 0) as number;
63
+ const wy5 = (w?.[5] ?? 1) as number;
64
+ const wy6 = (w?.[6] ?? 0) as number;
65
+ const sizeY = Math.sqrt(wy4 * wy4 + wy5 * wy5 + wy6 * wy6);
66
+ const footY = posY - pivotY * sizeY;
67
+ if (mode === TRANSPARENT_SORT_MODE_LAYER_Y) return -footY;
68
+ if (mode === TRANSPARENT_SORT_MODE_LAYER_YZ) return footY + cfg.yzAlpha * posZ;
69
+ return posZ;
70
+ };
71
+ sortedSlotOrder = transparentSlots.slice().sort((a, b) => {
72
+ const da = dispatch[a] as DispatchEntry;
73
+ const db = dispatch[b] as DispatchEntry;
74
+ if (da.layer !== db.layer) return da.layer - db.layer;
75
+ const va = sortVal(da);
76
+ const vb = sortVal(db);
77
+ if (va < vb) return -1;
78
+ if (va > vb) return 1;
79
+ return da.materialHandle - db.materialHandle;
80
+ });
81
+ }
82
+
83
+ const result = dispatch.slice();
84
+ for (let k = 0; k < transparentSlots.length; k++) {
85
+ const targetSlot = transparentSlots[k] as number;
86
+ const sourceSlot = sortedSlotOrder[k] as number;
87
+ result[targetSlot] = dispatch[sourceSlot] as DispatchEntry;
88
+ }
89
+ return result;
90
+ }
@@ -39,6 +39,18 @@ export interface RenderTargetMaterialSourceExpectation {
39
39
  }
40
40
 
41
41
  const sourceBindings = new WeakMap<object, RenderTargetMaterialSourceBinding>();
42
+ const targetIdentities = new WeakMap<object, number>();
43
+ let nextTargetIdentity = 1;
44
+
45
+ function targetIdentity(target: RenderTarget): number {
46
+ const object = target as object;
47
+ const existing = targetIdentities.get(object);
48
+ if (existing !== undefined) return existing;
49
+ const identity = nextTargetIdentity;
50
+ nextTargetIdentity += 1;
51
+ targetIdentities.set(object, identity);
52
+ return identity;
53
+ }
42
54
 
43
55
  function sourceToken(): RenderTargetTextureSource {
44
56
  return Object.freeze({}) as RenderTargetTextureSource;
@@ -51,6 +63,28 @@ export function resolveRenderTargetMaterialSource(
51
63
  return sourceBindings.get(source as object);
52
64
  }
53
65
 
66
+ /**
67
+ * Returns the stable renderer-local resource identity used by batch grouping.
68
+ * The opaque source object is intentionally not stringified: target identity,
69
+ * device generation, and view subresource are the producer-owned facts that
70
+ * determine whether two draws may share one material bind group.
71
+ */
72
+ export function renderTargetMaterialSourceIdentity(
73
+ source: RenderTargetTextureSource,
74
+ ): string | undefined {
75
+ const binding = resolveRenderTargetMaterialSource(source);
76
+ if (binding === undefined) return undefined;
77
+ return [
78
+ targetIdentity(binding.target),
79
+ binding.generation,
80
+ binding.shape,
81
+ binding.format,
82
+ binding.view.dimension,
83
+ binding.view.mipLevel,
84
+ binding.view.resolveRequired ? 1 : 0,
85
+ ].join(':');
86
+ }
87
+
54
88
  function invalid(
55
89
  field: string,
56
90
  value: unknown,
@@ -23,7 +23,7 @@ export function createTemporalCoverage(width: number, height: number): TemporalC
23
23
  if (!Number.isSafeInteger(width) || width <= 0) throw new RangeError('width must be positive.');
24
24
  if (!Number.isSafeInteger(height) || height <= 0)
25
25
  throw new RangeError('height must be positive.');
26
- return Object.freeze({ width, height, bytes: 32 * width * height, fullScreen: true as const });
26
+ return Object.freeze({ width, height, bytes: 34 * width * height, fullScreen: true as const });
27
27
  }
28
28
 
29
29
  export type SceneDataContributorKind = 'exact' | 'reactive';
@@ -12,6 +12,9 @@ import {
12
12
  /** The only stages that may publish a temporal frame. */
13
13
  export type TemporalFrameStage = 'build' | 'encode' | 'finish' | 'submit';
14
14
 
15
+ /** Closed list of consumers that share the renderer temporal transaction. */
16
+ export type TemporalFrameConsumerId = 'taa' | 'motion-blur' | 'ssr';
17
+
15
18
  export type TemporalFrameErrorCode = 'taa-unavailable' | 'temporal-active' | 'temporal-not-active';
16
19
 
17
20
  export interface TemporalFrameError {
@@ -24,6 +27,7 @@ export interface TemporalFrameError {
24
27
  export interface TemporalFrameSnapshot<T = unknown> {
25
28
  readonly epoch: number;
26
29
  readonly previous: T | undefined;
30
+ readonly consumerIds: readonly TemporalFrameConsumerId[];
27
31
  readonly historyAttempt: 'none' | 'active' | 'committed' | 'aborted';
28
32
  readonly attempt: 'none' | 'active' | 'committed' | 'aborted';
29
33
  readonly lastFailure: TemporalFrameStage | undefined;
@@ -40,6 +44,8 @@ export interface TemporalFrameBeginInput<T = unknown> {
40
44
  readonly antialias: 'none' | 'fxaa' | 'msaa' | 'taa';
41
45
  /** Enables the shared transaction for a temporal feature without TAA. */
42
46
  readonly temporalDemand?: boolean;
47
+ /** Consumers registered on this one renderer-owned frame transaction. */
48
+ readonly consumerIds?: readonly TemporalFrameConsumerId[];
43
49
  readonly available?: boolean;
44
50
  readonly contributors?: readonly SceneDataContributor[];
45
51
  readonly requiredContributorIds?: readonly string[];
@@ -54,6 +60,7 @@ export interface TemporalFrameCandidate<T = unknown> {
54
60
  readonly history: { readonly direction: 'a-to-b' | 'b-to-a'; readonly valid: boolean };
55
61
  readonly contributors: readonly SceneDataContributor[];
56
62
  readonly requiredContributorIds: readonly string[];
63
+ readonly consumerIds: readonly TemporalFrameConsumerId[];
57
64
  readonly temporalView?: TemporalView;
58
65
  }
59
66
 
@@ -116,6 +123,7 @@ export class TemporalFrameCoordinator<T = unknown> {
116
123
  readonly historyStore: TaaHistoryStore;
117
124
  private epoch: number;
118
125
  private previous: T | undefined;
126
+ private consumerIds: readonly TemporalFrameConsumerId[] = [];
119
127
  private active: TemporalFrameCandidate<T> | undefined;
120
128
  private attempt: TemporalFrameSnapshot<T>['attempt'] = 'none';
121
129
  private historyAttempt: TemporalFrameSnapshot<T>['historyAttempt'] = 'none';
@@ -144,7 +152,9 @@ export class TemporalFrameCoordinator<T = unknown> {
144
152
  }
145
153
 
146
154
  begin(input: TemporalFrameBeginInput<T>): Result<TemporalFrameCandidate<T>, TemporalFrameError> {
147
- const demanded = input.antialias === 'taa' || input.temporalDemand === true;
155
+ const consumerIds = Object.freeze([...(input.consumerIds ?? [])]);
156
+ const demanded =
157
+ input.antialias === 'taa' || input.temporalDemand === true || consumerIds.length > 0;
148
158
  if (!demanded) {
149
159
  return ok({
150
160
  epoch: this.epoch,
@@ -153,6 +163,7 @@ export class TemporalFrameCoordinator<T = unknown> {
153
163
  history: { direction: this.historyDirection, valid: false },
154
164
  contributors: Object.freeze([...(input.contributors ?? [])]),
155
165
  requiredContributorIds: Object.freeze([...(input.requiredContributorIds ?? [])]),
166
+ consumerIds,
156
167
  ...(input.temporalView === undefined ? {} : { temporalView: input.temporalView }),
157
168
  });
158
169
  }
@@ -176,6 +187,7 @@ export class TemporalFrameCoordinator<T = unknown> {
176
187
  history: { direction: this.historyDirection, valid: this.previous !== undefined },
177
188
  contributors: Object.freeze([...(input.contributors ?? [])]),
178
189
  requiredContributorIds: Object.freeze([...(input.requiredContributorIds ?? [])]),
190
+ consumerIds,
179
191
  ...(input.temporalView === undefined ? {} : { temporalView: input.temporalView }),
180
192
  };
181
193
  if (input.antialias === 'taa') {
@@ -201,6 +213,7 @@ export class TemporalFrameCoordinator<T = unknown> {
201
213
  this.temporalFrameIndex += 1;
202
214
  }
203
215
  this.historyDirection = candidate.history.direction === 'a-to-b' ? 'b-to-a' : 'a-to-b';
216
+ this.consumerIds = candidate.consumerIds;
204
217
  const historyAttempt = this.historyAttempts.get(candidate);
205
218
  historyAttempt?.commit({
206
219
  deviceGeneration: this.historyStore.inspect().deviceGeneration,
@@ -239,7 +252,13 @@ export class TemporalFrameCoordinator<T = unknown> {
239
252
  const started = this.begin(input);
240
253
  if (!started.ok) return started;
241
254
  const candidate = started.value;
242
- if (input.antialias !== 'taa' && input.temporalDemand !== true) return ok(undefined);
255
+ if (
256
+ input.antialias !== 'taa' &&
257
+ input.temporalDemand !== true &&
258
+ (input.consumerIds?.length ?? 0) === 0
259
+ ) {
260
+ return ok(undefined);
261
+ }
243
262
  try {
244
263
  const built = phases.build();
245
264
  phases.encode(built);
@@ -262,6 +281,7 @@ export class TemporalFrameCoordinator<T = unknown> {
262
281
  return {
263
282
  epoch: this.epoch,
264
283
  previous: this.previous,
284
+ consumerIds: this.consumerIds,
265
285
  historyAttempt: this.historyAttempt,
266
286
  attempt: this.attempt,
267
287
  lastFailure: this.lastFailure,
@@ -327,6 +347,7 @@ export class TemporalFrameCoordinator<T = unknown> {
327
347
  missingContributorIds: [],
328
348
  omittedMissingContributorCount: 0,
329
349
  };
350
+ this.consumerIds = [];
330
351
  }
331
352
 
332
353
  private stageFromError(cause: unknown): TemporalFrameStage {
@@ -5,6 +5,7 @@ import type {
5
5
  RhiQueue,
6
6
  Sampler,
7
7
  Texture,
8
+ TextureFormat,
8
9
  TextureView,
9
10
  } from '@forgeax/engine-rhi';
10
11
  import type { DeviceScope } from '../device/device-scope';
@@ -16,6 +17,12 @@ import {
16
17
  import { GPU_BUFFER_USAGE_COPY_DST, GPU_BUFFER_USAGE_UNIFORM } from '../gpu-usage';
17
18
  import type { RenderFrameState } from '../record/frame-snapshot';
18
19
 
20
+ export const TEMPORAL_HISTORY_FORMATS = Object.freeze({
21
+ color: 'rgba16float',
22
+ temporal: 'rgba16float',
23
+ stability: 'r8unorm',
24
+ } as const);
25
+
19
26
  interface TemporalSurface {
20
27
  readonly texture: Texture;
21
28
  readonly view: TextureView;
@@ -32,8 +39,10 @@ export interface TemporalGpuState {
32
39
  pendingIndex: 0 | 1 | undefined;
33
40
  readonly color: [TemporalSurface, TemporalSurface];
34
41
  readonly temporal: [TemporalSurface, TemporalSurface];
42
+ readonly stability: [TemporalSurface, TemporalSurface];
35
43
  bindGroupLayout: BindGroupLayout | undefined;
36
44
  sampler: Sampler | undefined;
45
+ temporalSampler: Sampler | undefined;
37
46
  paramsBuffer: Buffer | undefined;
38
47
  committed: boolean;
39
48
  }
@@ -44,11 +53,12 @@ function createSurface(
44
53
  label: string,
45
54
  width: number,
46
55
  height: number,
56
+ format: TextureFormat = TEMPORAL_HISTORY_FORMATS.color,
47
57
  ): TemporalSurface {
48
58
  const texture = device.createTexture({
49
59
  label,
50
60
  size: { width, height, depthOrArrayLayers: 1 },
51
- format: 'rgba16float',
61
+ format,
52
62
  textureBindingViewDimension: undefined,
53
63
  usage:
54
64
  GPU_TEXTURE_USAGE_COPY_SRC |
@@ -93,11 +103,44 @@ function createState(
93
103
  createSurface(device, childScope, 'taa-history-color-b', width, height),
94
104
  ],
95
105
  temporal: [
96
- createSurface(device, childScope, 'taa-history-temporal-a', width, height),
97
- createSurface(device, childScope, 'taa-history-temporal-b', width, height),
106
+ createSurface(
107
+ device,
108
+ childScope,
109
+ 'taa-history-temporal-a',
110
+ width,
111
+ height,
112
+ TEMPORAL_HISTORY_FORMATS.temporal,
113
+ ),
114
+ createSurface(
115
+ device,
116
+ childScope,
117
+ 'taa-history-temporal-b',
118
+ width,
119
+ height,
120
+ TEMPORAL_HISTORY_FORMATS.temporal,
121
+ ),
122
+ ],
123
+ stability: [
124
+ createSurface(
125
+ device,
126
+ childScope,
127
+ 'taa-history-stability-a',
128
+ width,
129
+ height,
130
+ TEMPORAL_HISTORY_FORMATS.stability,
131
+ ),
132
+ createSurface(
133
+ device,
134
+ childScope,
135
+ 'taa-history-stability-b',
136
+ width,
137
+ height,
138
+ TEMPORAL_HISTORY_FORMATS.stability,
139
+ ),
98
140
  ],
99
141
  bindGroupLayout: undefined,
100
142
  sampler: undefined,
143
+ temporalSampler: undefined,
101
144
  paramsBuffer: undefined,
102
145
  committed: false,
103
146
  };
@@ -111,7 +154,7 @@ export function getTemporalParamsBuffer(state: TemporalGpuState): Buffer {
111
154
  if (state.paramsBuffer !== undefined) return state.paramsBuffer;
112
155
  const created = state.device.createBuffer({
113
156
  label: 'taa-resolve-params',
114
- size: 16,
157
+ size: 32,
115
158
  usage: GPU_BUFFER_USAGE_UNIFORM | GPU_BUFFER_USAGE_COPY_DST,
116
159
  mappedAtCreation: false,
117
160
  });
@@ -122,7 +165,7 @@ export function getTemporalParamsBuffer(state: TemporalGpuState): Buffer {
122
165
  state.childScope._adopt('buffer', created.value, (value) => {
123
166
  state.device.destroyBuffer(value);
124
167
  });
125
- const written = state.device.queue.writeBuffer(created.value, 0, new Uint8Array(16));
168
+ const written = state.device.queue.writeBuffer(created.value, 0, new Uint8Array(32));
126
169
  if (!written.ok) {
127
170
  if (!state.committed) state.childScope.abandon();
128
171
  throw written.error;
@@ -164,11 +207,13 @@ export function getTemporalGpuState(
164
207
  export function getTemporalBindGroupResources(state: TemporalGpuState): {
165
208
  readonly layout: BindGroupLayout;
166
209
  readonly sampler: Sampler | null;
210
+ readonly temporalSampler: Sampler | null;
167
211
  } {
168
212
  if (state.bindGroupLayout !== undefined) {
169
213
  return {
170
214
  layout: state.bindGroupLayout,
171
215
  sampler: state.sampler ?? null,
216
+ temporalSampler: state.temporalSampler ?? null,
172
217
  };
173
218
  }
174
219
  try {
@@ -178,15 +223,15 @@ export function getTemporalBindGroupResources(state: TemporalGpuState): {
178
223
  {
179
224
  binding: 0,
180
225
  visibility: 2,
181
- texture: { sampleType: 'unfilterable-float', viewDimension: '2d' },
226
+ texture: { sampleType: 'float', viewDimension: '2d' },
182
227
  },
183
- { binding: 1, visibility: 2, sampler: { type: 'non-filtering' } },
228
+ { binding: 1, visibility: 2, sampler: { type: 'filtering' } },
184
229
  {
185
230
  binding: 2,
186
231
  visibility: 2,
187
- texture: { sampleType: 'unfilterable-float', viewDimension: '2d' },
232
+ texture: { sampleType: 'float', viewDimension: '2d' },
188
233
  },
189
- { binding: 3, visibility: 2, sampler: { type: 'non-filtering' } },
234
+ { binding: 3, visibility: 2, sampler: { type: 'filtering' } },
190
235
  {
191
236
  binding: 4,
192
237
  visibility: 2,
@@ -200,6 +245,12 @@ export function getTemporalBindGroupResources(state: TemporalGpuState): {
200
245
  },
201
246
  { binding: 7, visibility: 2, sampler: { type: 'non-filtering' } },
202
247
  { binding: 8, visibility: 2, buffer: { type: 'uniform' } },
248
+ { binding: 9, visibility: 2, texture: { sampleType: 'float', viewDimension: '2d' } },
249
+ {
250
+ binding: 10,
251
+ visibility: 2,
252
+ texture: { sampleType: 'unfilterable-float', viewDimension: '2d' },
253
+ },
203
254
  ],
204
255
  });
205
256
  if (!layout.ok) throw layout.error;
@@ -207,19 +258,29 @@ export function getTemporalBindGroupResources(state: TemporalGpuState): {
207
258
  const sampler = state.device.createSampler({
208
259
  addressModeU: 'clamp-to-edge',
209
260
  addressModeV: 'clamp-to-edge',
210
- magFilter: 'nearest',
211
- minFilter: 'nearest',
261
+ magFilter: 'linear',
262
+ minFilter: 'linear',
212
263
  });
213
264
  if (!sampler.ok) throw sampler.error;
214
265
  state.childScope._adopt('binding', sampler.value, () => undefined);
266
+ const temporalSampler = state.device.createSampler({
267
+ addressModeU: 'clamp-to-edge',
268
+ addressModeV: 'clamp-to-edge',
269
+ magFilter: 'nearest',
270
+ minFilter: 'nearest',
271
+ });
272
+ if (!temporalSampler.ok) throw temporalSampler.error;
273
+ state.childScope._adopt('binding', temporalSampler.value, () => undefined);
215
274
  state.bindGroupLayout = layout.value;
216
275
  state.sampler = sampler.value;
217
- return { layout: layout.value, sampler: sampler.value };
276
+ state.temporalSampler = temporalSampler.value;
277
+ return { layout: layout.value, sampler: sampler.value, temporalSampler: temporalSampler.value };
218
278
  } catch (cause) {
219
279
  if (!state.committed) {
220
280
  state.childScope.abandon();
221
281
  state.bindGroupLayout = undefined;
222
282
  state.sampler = undefined;
283
+ state.temporalSampler = undefined;
223
284
  }
224
285
  throw cause;
225
286
  }
@@ -261,6 +322,7 @@ export function retireTemporalGpuState(state: TemporalGpuState): void {
261
322
  state.committed = false;
262
323
  state.bindGroupLayout = undefined;
263
324
  state.sampler = undefined;
325
+ state.temporalSampler = undefined;
264
326
  state.paramsBuffer = undefined;
265
327
  }
266
328
 
@@ -41,7 +41,7 @@ export class TemporalHistory {
41
41
  bytes: 0,
42
42
  fullScreen: true as const,
43
43
  });
44
- this.historyCount = taa ? 4 : 0;
44
+ this.historyCount = taa ? 6 : 0;
45
45
  this.historyBytes = this.coverage.bytes;
46
46
  if (!taa) {
47
47
  this.resources = [];
@@ -54,6 +54,8 @@ export class TemporalHistory {
54
54
  child.ref('texture', Object.freeze({ slot: 'color-b' })),
55
55
  child.ref('texture', Object.freeze({ slot: 'temporal-a' })),
56
56
  child.ref('texture', Object.freeze({ slot: 'temporal-b' })),
57
+ child.ref('texture', Object.freeze({ slot: 'stability-a' })),
58
+ child.ref('texture', Object.freeze({ slot: 'stability-b' })),
57
59
  ]);
58
60
  }
59
61
 
@@ -1,3 +1,4 @@
1
+ import { createTemporalCoverage } from './coverage';
1
2
  import type { TemporalGpuState } from './gpu';
2
3
  import type { TemporalHistory } from './history';
3
4
  import type { TemporalView } from './view';
@@ -28,7 +29,7 @@ export interface TemporalInspection {
28
29
  }
29
30
 
30
31
  function gpuBytes(state: TemporalGpuState | undefined): number {
31
- return state === undefined ? 0 : state.width * state.height * 32;
32
+ return state === undefined ? 0 : createTemporalCoverage(state.width, state.height).bytes;
32
33
  }
33
34
 
34
35
  function gpuResources(state: TemporalGpuState | undefined): number {
@@ -11,10 +11,11 @@ import { addTypedFullscreenPass, addTypedScenePass } from '../typed-render-graph
11
11
  export interface StandardTemporalDemandInput {
12
12
  readonly taa: boolean;
13
13
  readonly motionBlur: boolean;
14
+ readonly ssr?: boolean;
14
15
  }
15
16
 
16
17
  export interface StandardTemporalDemand {
17
- readonly consumerIds: readonly ('taa' | 'motion-blur')[];
18
+ readonly consumerIds: readonly ('taa' | 'motion-blur' | 'ssr')[];
18
19
  readonly targetCount: 0 | 1;
19
20
  readonly producerPassCount: 0 | 1;
20
21
  readonly historyCount: 0 | 1;
@@ -35,6 +36,7 @@ export function aggregateTemporalDemand(
35
36
  const consumerIds = [
36
37
  ...(input.taa ? (['taa'] as const) : []),
37
38
  ...(input.motionBlur ? (['motion-blur'] as const) : []),
39
+ ...(input.ssr ? (['ssr'] as const) : []),
38
40
  ];
39
41
  const requested = consumerIds.length > 0;
40
42
  return Object.freeze({
@@ -4,6 +4,9 @@ import type { CameraSnapshot } from '../render-contract';
4
4
 
5
5
  export const TEMPORAL_JITTER_SAMPLE_COUNT = 8;
6
6
 
7
+ /** Current temporal view owns fixed surface dimensions; dynamic TAAU is deferred. */
8
+ export const TEMPORAL_TAAU_DEPENDENCY_STATUS = 'dependency-deferred' as const;
9
+
7
10
  export type TemporalViewResetReason =
8
11
  | 'first-frame'
9
12
  | 'camera-switch'