@forgeax/engine-render 0.1.28 → 0.1.30

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 (768) hide show
  1. package/README.md +856 -126
  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/device-feature-admission.d.ts +4 -3
  5. package/dist/assembly/device-feature-admission.d.ts.map +1 -1
  6. package/dist/assembly/dynamic-geometry-host.d.ts +27 -0
  7. package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -1
  8. package/dist/assembly/dynamic-geometry-runtime.d.ts +20 -0
  9. package/dist/assembly/dynamic-geometry-runtime.d.ts.map +1 -0
  10. package/dist/assembly/factory.d.ts +3 -1
  11. package/dist/assembly/factory.d.ts.map +1 -1
  12. package/dist/assembly/gpu-driven-owner.d.ts +10 -0
  13. package/dist/assembly/gpu-driven-owner.d.ts.map +1 -0
  14. package/dist/assembly/host-contract.d.ts +14 -0
  15. package/dist/assembly/host-contract.d.ts.map +1 -1
  16. package/dist/assembly/material/assembly.d.ts +31 -1
  17. package/dist/assembly/material/assembly.d.ts.map +1 -1
  18. package/dist/assembly/material/pipeline-helpers.d.ts +24 -0
  19. package/dist/assembly/material/pipeline-helpers.d.ts.map +1 -0
  20. package/dist/assembly/material-shader-policy.d.ts +3 -1
  21. package/dist/assembly/material-shader-policy.d.ts.map +1 -1
  22. package/dist/assembly/recovery/device-loss-fanout.d.ts.map +1 -1
  23. package/dist/assembly/recovery/failure-location.d.ts +12 -0
  24. package/dist/assembly/recovery/failure-location.d.ts.map +1 -0
  25. package/dist/assembly/recovery/recovery-attempt.d.ts +1 -6
  26. package/dist/assembly/recovery/recovery-attempt.d.ts.map +1 -1
  27. package/dist/assembly/recovery/renderer-recover.d.ts +7 -4
  28. package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
  29. package/dist/assembly/renderer-facade.d.ts.map +1 -1
  30. package/dist/assembly/renderer-feature-inspection.d.ts +5 -0
  31. package/dist/assembly/renderer-feature-inspection.d.ts.map +1 -0
  32. package/dist/assembly/renderer-frame-transaction.d.ts +19 -0
  33. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
  34. package/dist/assembly/renderer-helpers.d.ts +3 -0
  35. package/dist/assembly/renderer-helpers.d.ts.map +1 -1
  36. package/dist/assembly/renderer-inspection.d.ts +4 -0
  37. package/dist/assembly/renderer-inspection.d.ts.map +1 -1
  38. package/dist/assembly/shader-prewarm-policy.d.ts +7 -1
  39. package/dist/assembly/shader-prewarm-policy.d.ts.map +1 -1
  40. package/dist/assembly/skin-palette-owner.d.ts +8 -0
  41. package/dist/assembly/skin-palette-owner.d.ts.map +1 -0
  42. package/dist/assembly/ssr-shader-prewarm.d.ts +6 -0
  43. package/dist/assembly/ssr-shader-prewarm.d.ts.map +1 -0
  44. package/dist/assembly/webgpu-device-loss.d.ts +15 -0
  45. package/dist/assembly/webgpu-device-loss.d.ts.map +1 -0
  46. package/dist/assembly/webgpu-pbr-ready.d.ts +38 -0
  47. package/dist/assembly/webgpu-pbr-ready.d.ts.map +1 -0
  48. package/dist/assembly/webgpu-ready-mipmap.d.ts +11 -0
  49. package/dist/assembly/webgpu-ready-mipmap.d.ts.map +1 -0
  50. package/dist/assembly/webgpu-ready.d.ts +7 -3
  51. package/dist/assembly/webgpu-ready.d.ts.map +1 -1
  52. package/dist/assembly/webgpu-renderer-bootstrap.d.ts +10 -0
  53. package/dist/assembly/webgpu-renderer-bootstrap.d.ts.map +1 -0
  54. package/dist/assembly/webgpu-renderer-contract.d.ts +62 -0
  55. package/dist/assembly/webgpu-renderer-contract.d.ts.map +1 -0
  56. package/dist/assembly/webgpu-renderer-guards.d.ts +9 -0
  57. package/dist/assembly/webgpu-renderer-guards.d.ts.map +1 -0
  58. package/dist/assembly/webgpu-renderer-observation.d.ts +6 -0
  59. package/dist/assembly/webgpu-renderer-observation.d.ts.map +1 -0
  60. package/dist/assembly/webgpu-renderer-recovery-failure.d.ts +12 -0
  61. package/dist/assembly/webgpu-renderer-recovery-failure.d.ts.map +1 -0
  62. package/dist/assembly/webgpu-renderer.d.ts +7 -141
  63. package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
  64. package/dist/assembly/webgpu-vertex-layouts.d.ts +28 -84
  65. package/dist/assembly/webgpu-vertex-layouts.d.ts.map +1 -1
  66. package/dist/authoring.mjs +2 -2
  67. package/dist/capture/scene-projection.d.ts +41 -0
  68. package/dist/capture/scene-projection.d.ts.map +1 -0
  69. package/dist/{chunk-J52NMQKR.mjs → chunk-7MQ3XBSP.mjs} +1098 -844
  70. package/dist/chunk-7MQ3XBSP.mjs.map +1 -0
  71. package/dist/{chunk-GF523LHF.mjs → chunk-BLXGONR2.mjs} +30 -12
  72. package/dist/chunk-BLXGONR2.mjs.map +1 -0
  73. package/dist/{chunk-VSL23LZE.mjs → chunk-C3DDSXYK.mjs} +1188 -463
  74. package/dist/chunk-C3DDSXYK.mjs.map +1 -0
  75. package/dist/{chunk-IQMKJLNU.mjs → chunk-FUUO4UND.mjs} +443 -30
  76. package/dist/chunk-FUUO4UND.mjs.map +1 -0
  77. package/dist/{chunk-J6KACNOH.mjs → chunk-JRBDO2KB.mjs} +617 -7
  78. package/dist/chunk-JRBDO2KB.mjs.map +1 -0
  79. package/dist/{chunk-GE3SDD72.mjs → chunk-MDQJPY3T.mjs} +20 -40
  80. package/dist/chunk-MDQJPY3T.mjs.map +1 -0
  81. package/dist/{chunk-MYJ5RPJO.mjs → chunk-NO4WZCAH.mjs} +3 -3
  82. package/dist/chunk-NO4WZCAH.mjs.map +1 -0
  83. package/dist/{chunk-RBDBZ5R7.mjs → chunk-PA5DRJNI.mjs} +2 -2
  84. package/dist/chunk-PA5DRJNI.mjs.map +1 -0
  85. package/dist/{chunk-MBU4ZVE7.mjs → chunk-PSEQ6QPH.mjs} +4655 -892
  86. package/dist/chunk-PSEQ6QPH.mjs.map +1 -0
  87. package/dist/{chunk-JAASCMXA.mjs → chunk-S5UE2T5P.mjs} +289 -41
  88. package/dist/chunk-S5UE2T5P.mjs.map +1 -0
  89. package/dist/components/camera.d.ts +62 -2
  90. package/dist/components/camera.d.ts.map +1 -1
  91. package/dist/components/directional-light.d.ts +2 -2
  92. package/dist/components/dynamic-resolution.d.ts +15 -0
  93. package/dist/components/dynamic-resolution.d.ts.map +1 -0
  94. package/dist/components/index.d.ts +2 -0
  95. package/dist/components/index.d.ts.map +1 -1
  96. package/dist/components/instances.d.ts +6 -20
  97. package/dist/components/instances.d.ts.map +1 -1
  98. package/dist/components/light-helpers.d.ts.map +1 -1
  99. package/dist/components/reflection-probe.d.ts +1 -0
  100. package/dist/components/reflection-probe.d.ts.map +1 -1
  101. package/dist/components/scene-instance.d.ts +2 -1
  102. package/dist/components/scene-instance.d.ts.map +1 -1
  103. package/dist/components/screen-space-reflection.d.ts +14 -0
  104. package/dist/components/screen-space-reflection.d.ts.map +1 -0
  105. package/dist/components/skylight.d.ts +4 -1
  106. package/dist/components/skylight.d.ts.map +1 -1
  107. package/dist/construct-renderer.mjs +14809 -7570
  108. package/dist/construct-renderer.mjs.map +1 -1
  109. package/dist/device/device-scope.d.ts +2 -0
  110. package/dist/device/device-scope.d.ts.map +1 -1
  111. package/dist/device/gpu-residency.d.ts +3 -14
  112. package/dist/device/gpu-residency.d.ts.map +1 -1
  113. package/dist/dynamic-geometry.d.ts.map +1 -1
  114. package/dist/environment/background.d.ts +7 -0
  115. package/dist/environment/background.d.ts.map +1 -0
  116. package/dist/environment/ibl.d.ts +11 -0
  117. package/dist/environment/ibl.d.ts.map +1 -0
  118. package/dist/environment/storage.d.ts +14 -0
  119. package/dist/environment/storage.d.ts.map +1 -0
  120. package/dist/errors/gpu-driven.d.ts +6 -3
  121. package/dist/errors/gpu-driven.d.ts.map +1 -1
  122. package/dist/errors/render.d.ts +41 -4
  123. package/dist/errors/render.d.ts.map +1 -1
  124. package/dist/extract/camera.d.ts.map +1 -1
  125. package/dist/extract/contracts.d.ts +7 -0
  126. package/dist/extract/contracts.d.ts.map +1 -1
  127. package/dist/extract/gpu-driven.d.ts +50 -3
  128. package/dist/extract/gpu-driven.d.ts.map +1 -1
  129. package/dist/features/host.d.ts +23 -1
  130. package/dist/features/host.d.ts.map +1 -1
  131. package/dist/features/noise-texture.d.ts +17 -0
  132. package/dist/features/noise-texture.d.ts.map +1 -0
  133. package/dist/features/plan.d.ts +83 -2
  134. package/dist/features/plan.d.ts.map +1 -1
  135. package/dist/features/prepared-gpu-work.d.ts +37 -4
  136. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  137. package/dist/features/prepared-graphics-store.d.ts.map +1 -1
  138. package/dist/features/prepared-graphics.d.ts +5 -0
  139. package/dist/features/prepared-graphics.d.ts.map +1 -1
  140. package/dist/features/render-graph-compute.d.ts +5 -3
  141. package/dist/features/render-graph-compute.d.ts.map +1 -1
  142. package/dist/features/render-graph-contribution.d.ts +11 -3
  143. package/dist/features/render-graph-contribution.d.ts.map +1 -1
  144. package/dist/features/render-graph-raster.d.ts +19 -3
  145. package/dist/features/render-graph-raster.d.ts.map +1 -1
  146. package/dist/features/types.d.ts +11 -0
  147. package/dist/features/types.d.ts.map +1 -1
  148. package/dist/fullscreen-post-process-pass.d.ts +2 -0
  149. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  150. package/dist/gpu-driven/batch-topology.d.ts +34 -1
  151. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  152. package/dist/gpu-driven/material-artifacts.d.ts +24 -0
  153. package/dist/gpu-driven/material-artifacts.d.ts.map +1 -0
  154. package/dist/gpu-driven/material-bindings.d.ts +7 -0
  155. package/dist/gpu-driven/material-bindings.d.ts.map +1 -0
  156. package/dist/gpu-driven/pbr-program.d.ts +10 -0
  157. package/dist/gpu-driven/pbr-program.d.ts.map +1 -0
  158. package/dist/gpu-driven/prepared-draw.d.ts +2 -0
  159. package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
  160. package/dist/gpu-driven/production-raster.d.ts +169 -27
  161. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  162. package/dist/gpu-driven/shadow-views.d.ts +126 -0
  163. package/dist/gpu-driven/shadow-views.d.ts.map +1 -0
  164. package/dist/gpu-driven/view-gpu.d.ts +18 -2
  165. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  166. package/dist/gpu-resource.d.ts +5 -2
  167. package/dist/gpu-resource.d.ts.map +1 -1
  168. package/dist/gpu-scene-schema.d.ts +2 -8
  169. package/dist/gpu-scene-schema.d.ts.map +1 -1
  170. package/dist/gpu-scene.d.ts +14 -0
  171. package/dist/gpu-scene.d.ts.map +1 -1
  172. package/dist/gpu-texture-usage.d.ts +1 -0
  173. package/dist/gpu-texture-usage.d.ts.map +1 -1
  174. package/dist/hdrp-buffers.d.ts +9 -0
  175. package/dist/hdrp-buffers.d.ts.map +1 -1
  176. package/dist/ibl/IblPipelineCache.d.ts +2 -0
  177. package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
  178. package/dist/ibl/frame-resources.d.ts +8 -0
  179. package/dist/ibl/frame-resources.d.ts.map +1 -0
  180. package/dist/ibl/skylight-bind-group.d.ts +3 -1
  181. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  182. package/dist/index.d.ts +87 -75
  183. package/dist/index.d.ts.map +1 -1
  184. package/dist/index.mjs +10 -8
  185. package/dist/index.mjs.map +1 -1
  186. package/dist/inspection-types.d.ts +180 -1
  187. package/dist/inspection-types.d.ts.map +1 -1
  188. package/dist/instances-derived-bounds.d.ts +11 -0
  189. package/dist/instances-derived-bounds.d.ts.map +1 -1
  190. package/dist/instances.d.ts +89 -44
  191. package/dist/instances.d.ts.map +1 -1
  192. package/dist/internal.d.ts +3 -0
  193. package/dist/internal.d.ts.map +1 -1
  194. package/dist/internal.mjs +117 -9
  195. package/dist/internal.mjs.map +1 -1
  196. package/dist/lifecycle.d.ts +2 -1
  197. package/dist/lifecycle.d.ts.map +1 -1
  198. package/dist/material-row.d.ts +15 -0
  199. package/dist/material-row.d.ts.map +1 -0
  200. package/dist/materials.d.ts +15 -0
  201. package/dist/materials.d.ts.map +1 -1
  202. package/dist/pbr-pipeline.d.ts +23 -5
  203. package/dist/pbr-pipeline.d.ts.map +1 -1
  204. package/dist/pipeline/render-extent.d.ts +51 -0
  205. package/dist/pipeline/render-extent.d.ts.map +1 -0
  206. package/dist/pipeline/standard-build-context.d.ts +7 -0
  207. package/dist/pipeline/standard-build-context.d.ts.map +1 -0
  208. package/dist/pipeline/standard-forward-lane.d.ts +3 -2
  209. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  210. package/dist/pipeline/standard-output/auto-exposure/capability.d.ts +12 -0
  211. package/dist/pipeline/standard-output/auto-exposure/capability.d.ts.map +1 -0
  212. package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts +70 -0
  213. package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts.map +1 -0
  214. package/dist/pipeline/standard-output/auto-exposure/graph.d.ts +75 -0
  215. package/dist/pipeline/standard-output/auto-exposure/graph.d.ts.map +1 -0
  216. package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts +111 -0
  217. package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts.map +1 -0
  218. package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts +16 -0
  219. package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts.map +1 -0
  220. package/dist/pipeline/standard-output/auto-exposure/preset.d.ts +14 -0
  221. package/dist/pipeline/standard-output/auto-exposure/preset.d.ts.map +1 -0
  222. package/dist/pipeline/standard-output/auto-exposure/state.d.ts +46 -0
  223. package/dist/pipeline/standard-output/auto-exposure/state.d.ts.map +1 -0
  224. package/dist/pipeline/standard-output/color-transform.d.ts +27 -0
  225. package/dist/pipeline/standard-output/color-transform.d.ts.map +1 -0
  226. package/dist/pipeline/standard-output/graph.d.ts +15 -0
  227. package/dist/pipeline/standard-output/graph.d.ts.map +1 -0
  228. package/dist/pipeline/standard-output/lut-admission.d.ts +29 -0
  229. package/dist/pipeline/standard-output/lut-admission.d.ts.map +1 -0
  230. package/dist/pipeline/standard-output/lut-gpu.d.ts +48 -0
  231. package/dist/pipeline/standard-output/lut-gpu.d.ts.map +1 -0
  232. package/dist/pipeline/standard-output/lut-state.d.ts +68 -0
  233. package/dist/pipeline/standard-output/lut-state.d.ts.map +1 -0
  234. package/dist/pipeline/standard-output/resources.d.ts +10 -0
  235. package/dist/pipeline/standard-output/resources.d.ts.map +1 -0
  236. package/dist/pipeline/standard-output/types.d.ts +39 -0
  237. package/dist/pipeline/standard-output/types.d.ts.map +1 -0
  238. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  239. package/dist/pipeline/standard-post.d.ts +2 -2
  240. package/dist/pipeline/standard-post.d.ts.map +1 -1
  241. package/dist/pipeline/standard-profile.d.ts +2 -1
  242. package/dist/pipeline/standard-profile.d.ts.map +1 -1
  243. package/dist/pipeline-builder.d.ts +5 -2
  244. package/dist/pipeline-builder.d.ts.map +1 -1
  245. package/dist/pipeline-spec-types.d.ts +4 -0
  246. package/dist/pipeline-spec-types.d.ts.map +1 -1
  247. package/dist/pipeline-spec.d.ts +1 -9
  248. package/dist/pipeline-spec.d.ts.map +1 -1
  249. package/dist/plugin.d.ts.map +1 -1
  250. package/dist/points-lines/standard-owner.d.ts +1 -1
  251. package/dist/points-lines/standard-owner.d.ts.map +1 -1
  252. package/dist/post-process-errors.d.ts +9 -2
  253. package/dist/post-process-errors.d.ts.map +1 -1
  254. package/dist/prepare/extended-lighting/resources.d.ts +3 -3
  255. package/dist/prepare/prepared-graphics-resolver.d.ts +6 -1
  256. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
  257. package/dist/record/dynamic-geometry-consumption.d.ts +15 -0
  258. package/dist/record/dynamic-geometry-consumption.d.ts.map +1 -0
  259. package/dist/record/frame-lighting.d.ts +3 -3
  260. package/dist/record/frame-lighting.d.ts.map +1 -1
  261. package/dist/record/frame-snapshot.d.ts +109 -13
  262. package/dist/record/frame-snapshot.d.ts.map +1 -1
  263. package/dist/record/frame-targets.d.ts.map +1 -1
  264. package/dist/record/frame.d.ts +41 -5
  265. package/dist/record/frame.d.ts.map +1 -1
  266. package/dist/record/main-pass-geometry.d.ts +13 -9
  267. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  268. package/dist/record/main-pass-material.d.ts +43 -3
  269. package/dist/record/main-pass-material.d.ts.map +1 -1
  270. package/dist/record/main-pass-sprite-draws.d.ts +2 -10
  271. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  272. package/dist/record/main-pass.d.ts +14 -2
  273. package/dist/record/main-pass.d.ts.map +1 -1
  274. package/dist/record/mesh-ssbo.d.ts +15 -6
  275. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  276. package/dist/record/prepared-material-bindings.d.ts +19 -0
  277. package/dist/record/prepared-material-bindings.d.ts.map +1 -0
  278. package/dist/record/recovery-pipeline.d.ts +1 -0
  279. package/dist/record/recovery-pipeline.d.ts.map +1 -1
  280. package/dist/record/render-context.d.ts +101 -22
  281. package/dist/record/render-context.d.ts.map +1 -1
  282. package/dist/record/shadow-pass.d.ts +62 -7
  283. package/dist/record/shadow-pass.d.ts.map +1 -1
  284. package/dist/record/skybox-post-pass.d.ts +1 -1
  285. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  286. package/dist/record/typed-frame-graph.d.ts +39 -8
  287. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  288. package/dist/record/view-ubo.d.ts +1 -0
  289. package/dist/record/view-ubo.d.ts.map +1 -1
  290. package/dist/recovery/render-system-candidate.d.ts +10 -2
  291. package/dist/recovery/render-system-candidate.d.ts.map +1 -1
  292. package/dist/recovery/render-system-roots.d.ts +11 -0
  293. package/dist/recovery/render-system-roots.d.ts.map +1 -0
  294. package/dist/recovery/types.d.ts +76 -0
  295. package/dist/recovery/types.d.ts.map +1 -0
  296. package/dist/reflection/background.d.ts +14 -0
  297. package/dist/reflection/background.d.ts.map +1 -0
  298. package/dist/reflection/filter.d.ts.map +1 -1
  299. package/dist/reflection/projection.d.ts +1 -0
  300. package/dist/reflection/projection.d.ts.map +1 -1
  301. package/dist/reflection/record-owner.d.ts +4 -4
  302. package/dist/reflection/record-owner.d.ts.map +1 -1
  303. package/dist/render-contract.d.ts +211 -53
  304. package/dist/render-contract.d.ts.map +1 -1
  305. package/dist/render-graph-primitives.d.ts +1 -0
  306. package/dist/render-graph-primitives.d.ts.map +1 -1
  307. package/dist/render-pipeline.d.ts +81 -6
  308. package/dist/render-pipeline.d.ts.map +1 -1
  309. package/dist/render-system-extract-tail.d.ts +15 -6
  310. package/dist/render-system-extract-tail.d.ts.map +1 -1
  311. package/dist/render-system-extract.d.ts +128 -41
  312. package/dist/render-system-extract.d.ts.map +1 -1
  313. package/dist/render-system-projections.d.ts +22 -0
  314. package/dist/render-system-projections.d.ts.map +1 -0
  315. package/dist/render-system.d.ts +27 -77
  316. package/dist/render-system.d.ts.map +1 -1
  317. package/dist/scene/render-scene-types.d.ts +14 -7
  318. package/dist/scene/render-scene-types.d.ts.map +1 -1
  319. package/dist/scene/render-scene.d.ts +31 -11
  320. package/dist/scene/render-scene.d.ts.map +1 -1
  321. package/dist/scene/shadow-visibility.d.ts +5 -0
  322. package/dist/scene/shadow-visibility.d.ts.map +1 -0
  323. package/dist/ssao-config.d.ts +8 -6
  324. package/dist/ssao-config.d.ts.map +1 -1
  325. package/dist/ssr/admission.d.ts +70 -1
  326. package/dist/ssr/admission.d.ts.map +1 -1
  327. package/dist/ssr/compose.d.ts +13 -0
  328. package/dist/ssr/compose.d.ts.map +1 -0
  329. package/dist/ssr/errors.d.ts +35 -0
  330. package/dist/ssr/errors.d.ts.map +1 -1
  331. package/dist/ssr/graph.d.ts +60 -0
  332. package/dist/ssr/graph.d.ts.map +1 -0
  333. package/dist/ssr/history.d.ts +97 -0
  334. package/dist/ssr/history.d.ts.map +1 -0
  335. package/dist/ssr/hiz.d.ts +37 -0
  336. package/dist/ssr/hiz.d.ts.map +1 -0
  337. package/dist/ssr/inspection.d.ts +42 -0
  338. package/dist/ssr/inspection.d.ts.map +1 -0
  339. package/dist/ssr/resources.d.ts +58 -0
  340. package/dist/ssr/resources.d.ts.map +1 -0
  341. package/dist/ssr/temporal.d.ts +38 -0
  342. package/dist/ssr/temporal.d.ts.map +1 -0
  343. package/dist/systems/skin-palette-allocator.d.ts +32 -10
  344. package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
  345. package/dist/systems/skin-palette-types.d.ts +15 -0
  346. package/dist/systems/skin-palette-types.d.ts.map +1 -1
  347. package/dist/systems/transparent-dispatch.d.ts +9 -0
  348. package/dist/systems/transparent-dispatch.d.ts.map +1 -0
  349. package/dist/targets/material-source.d.ts +7 -0
  350. package/dist/targets/material-source.d.ts.map +1 -1
  351. package/dist/temporal/frame-coordinator.d.ts +7 -0
  352. package/dist/temporal/frame-coordinator.d.ts.map +1 -1
  353. package/dist/temporal/gpu.d.ts +8 -0
  354. package/dist/temporal/gpu.d.ts.map +1 -1
  355. package/dist/temporal/history.d.ts.map +1 -1
  356. package/dist/temporal/index.mjs +6 -6
  357. package/dist/temporal/inspection.d.ts.map +1 -1
  358. package/dist/temporal/standard-scene-data.d.ts +4 -2
  359. package/dist/temporal/standard-scene-data.d.ts.map +1 -1
  360. package/dist/temporal/target-coverage-attachment.d.ts +15 -0
  361. package/dist/temporal/target-coverage-attachment.d.ts.map +1 -0
  362. package/dist/temporal/temporal-view.d.ts +6 -0
  363. package/dist/temporal/temporal-view.d.ts.map +1 -1
  364. package/dist/temporal/view.d.ts +6 -0
  365. package/dist/temporal/view.d.ts.map +1 -1
  366. package/dist/typed-render-graph-primitives.d.ts +41 -1
  367. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  368. package/dist/typed-shadow-passes.d.ts +3 -1
  369. package/dist/typed-shadow-passes.d.ts.map +1 -1
  370. package/dist/volume/component.d.ts +1 -0
  371. package/dist/volume/component.d.ts.map +1 -1
  372. package/dist/volume/temporal.d.ts +6 -0
  373. package/dist/volume/temporal.d.ts.map +1 -1
  374. package/package.json +21 -20
  375. package/src/__tests__/auto-exposure-gpu-evidence.ts +291 -0
  376. package/src/__tests__/auto-exposure-inspection.unit.test.ts +80 -0
  377. package/src/__tests__/auto-exposure-transaction.integration.test.ts +99 -0
  378. package/src/__tests__/auto-exposure.browser.test.ts +33 -0
  379. package/src/__tests__/auto-exposure.dawn.test.ts +33 -0
  380. package/src/__tests__/capture-scene-projection.unit.test.ts +24 -0
  381. package/src/__tests__/detached-inspection.integration.test.ts +5 -0
  382. package/src/__tests__/device-feature-admission.unit.test.ts +15 -24
  383. package/src/__tests__/device-loss-fanout.unit.test.ts +43 -0
  384. package/src/__tests__/device-scope-lifecycle.unit.test.ts +18 -0
  385. package/src/__tests__/device-scope-stale-matrix.unit.test.ts +18 -0
  386. package/src/__tests__/docs-gate-green.unit.test.ts +3 -3
  387. package/src/__tests__/dynamic-geometry-batch.unit.test.ts +157 -0
  388. package/src/__tests__/dynamic-geometry.unit.test.ts +36 -0
  389. package/src/__tests__/dynamic-resolution-plugin.integration.test.ts +81 -0
  390. package/src/__tests__/factory-contract.integration.test.ts +231 -9
  391. package/src/__tests__/fallback-row-stride-surface.unit.test.ts +19 -0
  392. package/src/__tests__/feature-depth-input.dawn.test.ts +121 -0
  393. package/src/__tests__/feature-noise.unit.test.ts +38 -0
  394. package/src/__tests__/fixtures/taa-resolve-pinned-baseline.wgsl +301 -0
  395. package/src/__tests__/frame-camera-selection.unit.test.ts +131 -0
  396. package/src/__tests__/frame-observation.contract.test.ts +21 -0
  397. package/src/__tests__/frame-plan-contract.unit.test.ts +24 -0
  398. package/src/__tests__/frame-targets.unit.test.ts +24 -0
  399. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +3 -0
  400. package/src/__tests__/gpu-driven-baseline.characterization.test.ts +79 -0
  401. package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +307 -7
  402. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +122 -142
  403. package/src/__tests__/gpu-driven-indirect-raster.browser.test.ts +10 -1
  404. package/src/__tests__/gpu-driven-lod-cache.unit.test.ts +261 -0
  405. package/src/__tests__/gpu-driven-mesh-world-identity.unit.test.ts +346 -0
  406. package/src/__tests__/gpu-driven-pbr.dawn.test.ts +1422 -0
  407. package/src/__tests__/gpu-driven-pbr.integration.test.ts +21 -0
  408. package/src/__tests__/gpu-driven-production-fixture.ts +96 -0
  409. package/src/__tests__/gpu-driven-production.integration.test.ts +1076 -106
  410. package/src/__tests__/gpu-driven-scaling.unit.test.ts +1 -3
  411. package/src/__tests__/gpu-driven-shadow-views.browser.test.ts +63 -0
  412. package/src/__tests__/gpu-driven-shadow-views.dawn.test.ts +294 -0
  413. package/src/__tests__/gpu-driven-shadow-views.integration.test.ts +97 -0
  414. package/src/__tests__/gpu-driven-shadow-views.unit.test.ts +168 -0
  415. package/src/__tests__/gpu-driven-skin-contract.test-d.ts +11 -0
  416. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +72 -20
  417. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +30 -9
  418. package/src/__tests__/gpu-driven-view.unit.test.ts +160 -52
  419. package/src/__tests__/gpu-pass-timing-browser-runner.ts +15 -0
  420. package/src/__tests__/gpu-pass-timing.browser.test.ts +20 -2
  421. package/src/__tests__/gpu-resource-scope.unit.test.ts +71 -0
  422. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +42 -0
  423. package/src/__tests__/gpu-scene-render-graph-gpu.ts +19 -5
  424. package/src/__tests__/gpu-scene.dawn.test.ts +40 -13
  425. package/src/__tests__/gpu-scene.unit.test.ts +613 -33
  426. package/src/__tests__/instances-culling.integration.test.ts +36 -10
  427. package/src/__tests__/instances-derived-bounds.unit.test.ts +54 -0
  428. package/src/__tests__/instances-store.unit.test.ts +242 -39
  429. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +6 -0
  430. package/src/__tests__/lighting-scene-roundtrip.integration.test.ts +13 -16
  431. package/src/__tests__/lut-lkg-transaction.integration.test.ts +122 -0
  432. package/src/__tests__/material-contract-inventory.unit.test.ts +5 -6
  433. package/src/__tests__/material-dispatch-shader-id.unit.test.ts +51 -0
  434. package/src/__tests__/material-lane-selection.unit.test.ts +60 -0
  435. package/src/__tests__/material-numeric-upload.unit.test.ts +53 -0
  436. package/src/__tests__/material-texture-handles.unit.test.ts +18 -0
  437. package/src/__tests__/material-texture-source.unit.test.ts +87 -0
  438. package/src/__tests__/materials-authoring-validation.unit.test.ts +41 -0
  439. package/src/__tests__/materials-standard-contract.unit.test.ts +57 -3
  440. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +4 -0
  441. package/src/__tests__/mesh-submission-lifetime.unit.test.ts +8 -0
  442. package/src/__tests__/morph-neutral-admission.unit.test.ts +19 -0
  443. package/src/__tests__/normal-fallback.dawn.test.ts +122 -0
  444. package/src/__tests__/particle-material-input-layout.unit.test.ts +104 -0
  445. package/src/__tests__/physical-clearcoat.integration.test.ts +42 -3
  446. package/src/__tests__/pipeline-texture-specialization.unit.test.ts +138 -0
  447. package/src/__tests__/point-shadow-inspection.unit.test.ts +2 -0
  448. package/src/__tests__/post-process-error-policy-owner.unit.test.ts +6 -5
  449. package/src/__tests__/prepared-gpu-driven-pbr-contract.test-d.ts +31 -0
  450. package/src/__tests__/prepared-gpu-driven-pbr-contract.unit.test.ts +39 -0
  451. package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +251 -9
  452. package/src/__tests__/prepared-graphics-capability.unit.test.ts +21 -0
  453. package/src/__tests__/prepared-graphics-pipeline-warmup.unit.test.ts +6 -2
  454. package/src/__tests__/profiler-phase-catalog.test.ts +5 -0
  455. package/src/__tests__/public-surface.test-d.ts +3 -0
  456. package/src/__tests__/recovery-candidate-prepare.contract.test.ts +30 -12
  457. package/src/__tests__/reflection-fallback-async-publication.unit.test.ts +171 -0
  458. package/src/__tests__/reflection-probe-authoring.unit.test.ts +12 -10
  459. package/src/__tests__/reflection-probe-box.dawn.test.ts +71 -0
  460. package/src/__tests__/reflection-probe-filter.unit.test.ts +9 -0
  461. package/src/__tests__/reflection-probe-orientation.dawn.test.ts +294 -0
  462. package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +5 -14
  463. package/src/__tests__/reflection-probe-updates.unit.test.ts +129 -0
  464. package/src/__tests__/render-error-code-owner.test-d.ts +7 -0
  465. package/src/__tests__/render-error-detail-ssot.test-d.ts +27 -1
  466. package/src/__tests__/render-error-exhaustive.test-d.ts +15 -0
  467. package/src/__tests__/render-extent.unit.test.ts +63 -0
  468. package/src/__tests__/render-feature-gpu-work.integration.test.ts +285 -2
  469. package/src/__tests__/render-feature-plan.unit.test.ts +245 -0
  470. package/src/__tests__/render-feature-shadow-order.unit.test.ts +228 -0
  471. package/src/__tests__/render-feature-zero-work.unit.test.ts +35 -1
  472. package/src/__tests__/render-graph-fallback.integration.test.ts +2 -2
  473. package/src/__tests__/render-owner-cohesion.unit.test.ts +55 -0
  474. package/src/__tests__/render-scene-mixed-updates.integration.test.ts +426 -0
  475. package/src/__tests__/render-scene-projection.unit.test.ts +915 -23
  476. package/src/__tests__/render-scene-resource-updates.integration.test.ts +214 -0
  477. package/src/__tests__/render-scene-skin-lifecycle.integration.test.ts +173 -0
  478. package/src/__tests__/render-scene-temporal-retry.unit.test.ts +133 -0
  479. package/src/__tests__/render-target-material-source.test-d.ts +27 -3
  480. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +233 -9
  481. package/src/__tests__/renderer-frame-transaction.integration.test.ts +923 -5
  482. package/src/__tests__/shader-manifest-fixture.ts +45 -0
  483. package/src/__tests__/skin-motion-regression.unit.test.ts +0 -33
  484. package/src/__tests__/skin-palette-persistent.integration.test.ts +28 -0
  485. package/src/__tests__/skin-palette-persistent.unit.test.ts +247 -0
  486. package/src/__tests__/skinned-shadow-caster.test.ts +125 -14
  487. package/src/__tests__/specular-environment-scale.dawn.test.ts +158 -0
  488. package/src/__tests__/ssao-config.unit.test.ts +7 -0
  489. package/src/__tests__/ssao-surface.dawn.test.ts +252 -0
  490. package/src/__tests__/ssr-admission-matrix.integration.test.ts +7 -1
  491. package/src/__tests__/ssr-confidence-compose.unit.test.ts +84 -0
  492. package/src/__tests__/ssr-coordinate-oracle.unit.test.ts +28 -0
  493. package/src/__tests__/ssr-cube-silhouette.dawn.test.ts +270 -0
  494. package/src/__tests__/ssr-format-probe-gating.integration.test.ts +82 -0
  495. package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +99 -0
  496. package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +116 -0
  497. package/src/__tests__/ssr-gpu-dispatch.ts +951 -0
  498. package/src/__tests__/ssr-graph-topology.unit.test.ts +104 -0
  499. package/src/__tests__/ssr-history-filter.dawn.test.ts +198 -0
  500. package/src/__tests__/ssr-hit-color.dawn.test.ts +273 -0
  501. package/src/__tests__/ssr-hiz-odd-reduction.dawn.test.ts +569 -0
  502. package/src/__tests__/ssr-hiz-rescue.dawn.test.ts +279 -0
  503. package/src/__tests__/ssr-hiz.browser.test.ts +150 -0
  504. package/src/__tests__/ssr-hiz.dawn.test.ts +150 -0
  505. package/src/__tests__/ssr-hiz.unit.test.ts +56 -0
  506. package/src/__tests__/ssr-inspection.unit.test.ts +105 -0
  507. package/src/__tests__/ssr-memory-budget.unit.test.ts +45 -0
  508. package/src/__tests__/ssr-performance-sequence-aggregation.unit.test.ts +15 -0
  509. package/src/__tests__/ssr-public-surface.test-d.ts +37 -0
  510. package/src/__tests__/ssr-receiver-coverage.dawn.test.ts +387 -0
  511. package/src/__tests__/ssr-reflection-mip-reducer.dawn.test.ts +309 -0
  512. package/src/__tests__/ssr-reprojection-probe.ts +90 -0
  513. package/src/__tests__/ssr-roughness-mip.dawn.test.ts +163 -0
  514. package/src/__tests__/ssr-shader-prewarm.unit.test.ts +59 -0
  515. package/src/__tests__/ssr-spatial.integration.test.ts +141 -0
  516. package/src/__tests__/ssr-stable-lattice.dawn.test.ts +475 -0
  517. package/src/__tests__/ssr-temporal-history.unit.test.ts +202 -0
  518. package/src/__tests__/ssr-texel-crossing.dawn.test.ts +448 -0
  519. package/src/__tests__/ssr-zero-work.integration.test.ts +87 -0
  520. package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +84 -12
  521. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +29 -0
  522. package/src/__tests__/standard-output-chain-contract.unit.test.ts +99 -0
  523. package/src/__tests__/standard-output-chain.integration.test.ts +73 -0
  524. package/src/__tests__/standard-output-gpu-evidence.ts +205 -0
  525. package/src/__tests__/standard-output.browser.test.ts +15 -0
  526. package/src/__tests__/standard-output.dawn.test.ts +15 -0
  527. package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +275 -0
  528. package/src/__tests__/standard-pipeline.integration.test.ts +320 -3
  529. package/src/__tests__/standard-profile-oracle.unit.test.ts +49 -0
  530. package/src/__tests__/standard-surface-lighting.unit.test.ts +41 -0
  531. package/src/__tests__/standard-texture-specialization.dawn.test.ts +141 -0
  532. package/src/__tests__/surface-adjacent-regressions.integration.test.ts +6 -3
  533. package/src/__tests__/taa-coverage-edge.dawn.test.ts +199 -0
  534. package/src/__tests__/taa-history-clipping.dawn.test.ts +328 -0
  535. package/src/__tests__/taa-neighborhood-equivalence.dawn.test.ts +782 -0
  536. package/src/__tests__/taa-stability-feedback.browser.test.ts +23 -0
  537. package/src/__tests__/taa-stability-feedback.dawn.test.ts +68 -0
  538. package/src/__tests__/taa-stability-feedback.ts +342 -0
  539. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +49 -7
  540. package/src/__tests__/temporal-reset-matrix.unit.test.ts +9 -0
  541. package/src/__tests__/temporal-transaction.integration.test.ts +28 -0
  542. package/src/__tests__/temporal-view.unit.test.ts +17 -0
  543. package/src/__tests__/texture-usage-surface.unit.test.ts +4 -2
  544. package/src/__tests__/transmission-prewarm.unit.test.ts +57 -0
  545. package/src/__tests__/typed-pipeline-topology.unit.test.ts +109 -4
  546. package/src/__tests__/typed-scene-pass-material-cache.integration.test.ts +126 -0
  547. package/src/__tests__/vertex-layouts-ssot.unit.test.ts +47 -0
  548. package/src/__tests__/visibility-extract.perf.test.ts +20 -8
  549. package/src/__tests__/visibility-instances.integration.test.ts +19 -7
  550. package/src/__tests__/visibility-producer-matrix.integration.test.ts +20 -9
  551. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +62 -13
  552. package/src/__tests__/volumetric-fog-topology.unit.test.ts +7 -7
  553. package/src/assembly/atmosphere-shader-prewarm.ts +39 -0
  554. package/src/assembly/device-feature-admission.ts +9 -4
  555. package/src/assembly/dynamic-geometry-host.ts +284 -163
  556. package/src/assembly/dynamic-geometry-runtime.ts +71 -0
  557. package/src/assembly/factory.ts +4 -0
  558. package/src/assembly/gpu-driven-owner.ts +29 -0
  559. package/src/assembly/host-contract.ts +19 -0
  560. package/src/assembly/material/assembly.ts +383 -1
  561. package/src/assembly/material/pipeline-helpers.ts +100 -0
  562. package/src/assembly/material-shader-policy.ts +110 -46
  563. package/src/assembly/recovery/device-loss-fanout.ts +5 -0
  564. package/src/assembly/recovery/failure-location.ts +62 -0
  565. package/src/assembly/recovery/recovery-attempt.ts +2 -29
  566. package/src/assembly/recovery/renderer-recover.ts +16 -17
  567. package/src/assembly/renderer-facade.ts +34 -1
  568. package/src/assembly/renderer-feature-inspection.ts +13 -0
  569. package/src/assembly/renderer-frame-transaction.ts +63 -0
  570. package/src/assembly/renderer-helpers.ts +26 -0
  571. package/src/assembly/renderer-inspection.ts +6 -0
  572. package/src/assembly/shader-prewarm-policy.ts +46 -1
  573. package/src/assembly/skin-palette-owner.ts +21 -0
  574. package/src/assembly/ssr-shader-prewarm.ts +41 -0
  575. package/src/assembly/webgpu-device-loss.ts +75 -0
  576. package/src/assembly/webgpu-pbr-ready.ts +232 -0
  577. package/src/assembly/webgpu-ready-mipmap.ts +26 -0
  578. package/src/assembly/webgpu-ready.ts +161 -131
  579. package/src/assembly/webgpu-renderer-bootstrap.ts +85 -0
  580. package/src/assembly/webgpu-renderer-contract.ts +69 -0
  581. package/src/assembly/webgpu-renderer-guards.ts +32 -0
  582. package/src/assembly/webgpu-renderer-observation.ts +43 -0
  583. package/src/assembly/webgpu-renderer-recovery-failure.ts +62 -0
  584. package/src/assembly/webgpu-renderer.ts +744 -730
  585. package/src/assembly/webgpu-vertex-layouts.ts +233 -87
  586. package/src/capture/scene-projection.ts +37 -0
  587. package/src/components/__tests__/camera-exposure.contract.unit.test.ts +153 -0
  588. package/src/components/__tests__/dynamic-resolution-schema.unit.test.ts +65 -0
  589. package/src/components/__tests__/light-radius.integration.test.ts +59 -0
  590. package/src/components/camera.ts +287 -7
  591. package/src/components/directional-light.ts +3 -3
  592. package/src/components/dynamic-resolution.ts +67 -0
  593. package/src/components/index.ts +2 -0
  594. package/src/components/instances.ts +45 -18
  595. package/src/components/light-helpers.ts +6 -1
  596. package/src/components/reflection-probe.ts +1 -0
  597. package/src/components/scene-instance.ts +2 -1
  598. package/src/components/screen-space-reflection.ts +21 -0
  599. package/src/components/skylight.ts +4 -1
  600. package/src/components/sprite-animation.ts +2 -2
  601. package/src/components/sprite-instances.ts +1 -1
  602. package/src/device/device-scope.ts +13 -7
  603. package/src/device/gpu-residency.ts +45 -42
  604. package/src/dynamic-geometry.ts +13 -8
  605. package/src/environment/background.ts +281 -0
  606. package/src/environment/ibl.ts +211 -0
  607. package/src/environment/storage.ts +63 -0
  608. package/src/errors/gpu-driven.ts +49 -8
  609. package/src/errors/render.ts +91 -3
  610. package/src/extract/camera.ts +37 -1
  611. package/src/extract/contracts.ts +10 -0
  612. package/src/extract/gpu-driven.ts +240 -10
  613. package/src/features/host.ts +237 -19
  614. package/src/features/noise-texture.ts +91 -0
  615. package/src/features/plan.ts +553 -24
  616. package/src/features/prepared-gpu-work.ts +631 -49
  617. package/src/features/prepared-graphics-store.ts +31 -0
  618. package/src/features/prepared-graphics.ts +5 -0
  619. package/src/features/render-graph-compute.ts +41 -8
  620. package/src/features/render-graph-contribution.ts +141 -3
  621. package/src/features/render-graph-raster.ts +143 -30
  622. package/src/features/types.ts +11 -0
  623. package/src/fullscreen-post-process-pass.ts +3 -0
  624. package/src/gpu-driven/batch-topology.ts +452 -108
  625. package/src/gpu-driven/material-artifacts.ts +179 -0
  626. package/src/gpu-driven/material-bindings.ts +41 -0
  627. package/src/gpu-driven/pbr-program.ts +31 -0
  628. package/src/gpu-driven/prepared-draw.ts +42 -6
  629. package/src/gpu-driven/production-raster.ts +2806 -716
  630. package/src/gpu-driven/shadow-views.ts +539 -0
  631. package/src/gpu-driven/view-gpu.ts +188 -41
  632. package/src/gpu-resource.ts +21 -2
  633. package/src/gpu-scene-schema.ts +61 -11
  634. package/src/gpu-scene.ts +197 -99
  635. package/src/gpu-texture-usage.ts +1 -0
  636. package/src/hdrp-buffers.ts +141 -36
  637. package/src/ibl/IblPipelineCache.ts +5 -0
  638. package/src/ibl/frame-resources.ts +38 -0
  639. package/src/ibl/skylight-bind-group.ts +32 -21
  640. package/src/index.ts +194 -75
  641. package/src/inspection-types.ts +207 -1
  642. package/src/instances-derived-bounds.ts +258 -34
  643. package/src/instances.ts +459 -150
  644. package/src/internal.ts +22 -0
  645. package/src/lifecycle.ts +2 -0
  646. package/src/material-row.ts +194 -0
  647. package/src/materials.ts +44 -8
  648. package/src/pbr-pipeline.ts +172 -19
  649. package/src/pipeline/render-extent.ts +111 -0
  650. package/src/pipeline/standard-build-context.ts +7 -0
  651. package/src/pipeline/standard-forward-lane.ts +74 -29
  652. package/src/pipeline/standard-output/__tests__/lut-admission.unit.test.ts +103 -0
  653. package/src/pipeline/standard-output/auto-exposure/__tests__/capability.unit.test.ts +40 -0
  654. package/src/pipeline/standard-output/auto-exposure/__tests__/gpu.contract.unit.test.ts +125 -0
  655. package/src/pipeline/standard-output/auto-exposure/__tests__/graph.contract.unit.test.ts +94 -0
  656. package/src/pipeline/standard-output/auto-exposure/__tests__/oracle.test.ts +108 -0
  657. package/src/pipeline/standard-output/auto-exposure/__tests__/preset.test.ts +26 -0
  658. package/src/pipeline/standard-output/auto-exposure/capability.ts +38 -0
  659. package/src/pipeline/standard-output/auto-exposure/gpu.ts +567 -0
  660. package/src/pipeline/standard-output/auto-exposure/graph.ts +221 -0
  661. package/src/pipeline/standard-output/auto-exposure/inspection.ts +231 -0
  662. package/src/pipeline/standard-output/auto-exposure/oracle.ts +291 -0
  663. package/src/pipeline/standard-output/auto-exposure/preset.ts +28 -0
  664. package/src/pipeline/standard-output/auto-exposure/state.ts +156 -0
  665. package/src/pipeline/standard-output/color-transform.ts +124 -0
  666. package/src/pipeline/standard-output/graph.ts +139 -0
  667. package/src/pipeline/standard-output/lut-admission.ts +121 -0
  668. package/src/pipeline/standard-output/lut-gpu.ts +399 -0
  669. package/src/pipeline/standard-output/lut-state.ts +176 -0
  670. package/src/pipeline/standard-output/resources.ts +121 -0
  671. package/src/pipeline/standard-output/types.ts +58 -0
  672. package/src/pipeline/standard-pipeline.ts +232 -70
  673. package/src/pipeline/standard-post.ts +190 -27
  674. package/src/pipeline/standard-profile.ts +2 -1
  675. package/src/pipeline-builder.ts +28 -9
  676. package/src/pipeline-spec-types.ts +4 -0
  677. package/src/pipeline-spec.ts +37 -29
  678. package/src/plugin.ts +4 -0
  679. package/src/points-lines/standard-owner.ts +6 -14
  680. package/src/post-process-errors.ts +26 -18
  681. package/src/prepare/__tests__/extended-lighting-capability.unit.test.ts +2 -2
  682. package/src/prepare/extended-lighting/resources.ts +3 -3
  683. package/src/prepare/prepared-graphics-resolver.ts +9 -2
  684. package/src/record/__tests__/main-pass-geometry.unit.test.ts +68 -0
  685. package/src/record/__tests__/material-bg-cache.unit.test.ts +45 -0
  686. package/src/record/__tests__/material-slot-plan.unit.test.ts +57 -0
  687. package/src/record/__tests__/mesh-ssbo.unit.test.ts +40 -1
  688. package/src/record/__tests__/recovery-pipeline.unit.test.ts +20 -1
  689. package/src/record/__tests__/sprite-material-abi.unit.test.ts +41 -6
  690. package/src/record/__tests__/temporal-payload.unit.test.ts +2 -0
  691. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +45 -0
  692. package/src/record/__tests__/view-ubo-layout.unit.test.ts +5 -0
  693. package/src/record/dynamic-geometry-consumption.ts +59 -0
  694. package/src/record/frame-lighting.ts +15 -12
  695. package/src/record/frame-snapshot.ts +146 -34
  696. package/src/record/frame-targets.ts +9 -0
  697. package/src/record/frame.ts +838 -170
  698. package/src/record/main-pass-geometry.ts +209 -103
  699. package/src/record/main-pass-material.ts +157 -40
  700. package/src/record/main-pass-sprite-draws.ts +16 -107
  701. package/src/record/main-pass.ts +141 -12
  702. package/src/record/material-uniforms.ts +1 -1
  703. package/src/record/mesh-ssbo.ts +59 -15
  704. package/src/record/prepared-material-bindings.ts +238 -0
  705. package/src/record/recovery-pipeline.ts +69 -90
  706. package/src/record/render-context.ts +123 -24
  707. package/src/record/shadow-pass.ts +1389 -230
  708. package/src/record/skybox-post-pass.ts +14 -3
  709. package/src/record/typed-frame-graph.ts +1064 -47
  710. package/src/record/view-ubo.ts +12 -1
  711. package/src/recovery/render-system-candidate.ts +135 -68
  712. package/src/recovery/render-system-roots.ts +113 -0
  713. package/src/recovery/types.ts +77 -0
  714. package/src/reflection/background.ts +151 -0
  715. package/src/reflection/filter.ts +3 -0
  716. package/src/reflection/projection.ts +16 -6
  717. package/src/reflection/record-owner.ts +308 -140
  718. package/src/render-contract.ts +237 -49
  719. package/src/render-graph-primitives.ts +34 -5
  720. package/src/render-pipeline.ts +90 -2
  721. package/src/render-system-extract-tail.ts +431 -162
  722. package/src/render-system-extract.ts +478 -119
  723. package/src/render-system-projections.ts +241 -0
  724. package/src/render-system.ts +715 -828
  725. package/src/scene/render-scene-types.ts +13 -4
  726. package/src/scene/render-scene.ts +577 -355
  727. package/src/scene/shadow-visibility.ts +21 -0
  728. package/src/ssao-config.ts +25 -8
  729. package/src/ssr/admission.ts +380 -14
  730. package/src/ssr/compose.ts +144 -0
  731. package/src/ssr/errors.ts +48 -0
  732. package/src/ssr/graph.ts +797 -0
  733. package/src/ssr/history.ts +436 -0
  734. package/src/ssr/hiz.ts +124 -0
  735. package/src/ssr/inspection.ts +124 -0
  736. package/src/ssr/resources.ts +202 -0
  737. package/src/ssr/temporal.ts +164 -0
  738. package/src/systems/skin-palette-allocator.ts +495 -148
  739. package/src/systems/skin-palette-types.ts +17 -0
  740. package/src/systems/transparent-dispatch.ts +90 -0
  741. package/src/targets/material-source.ts +34 -0
  742. package/src/temporal/coverage.ts +1 -1
  743. package/src/temporal/frame-coordinator.ts +23 -2
  744. package/src/temporal/gpu.ts +79 -12
  745. package/src/temporal/history.ts +3 -1
  746. package/src/temporal/inspection.ts +2 -1
  747. package/src/temporal/standard-scene-data.ts +10 -2
  748. package/src/temporal/target-coverage-attachment.ts +72 -0
  749. package/src/temporal/temporal-view.ts +11 -2
  750. package/src/temporal/view.ts +12 -2
  751. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +219 -139
  752. package/src/typed-render-graph-primitives.ts +304 -74
  753. package/src/typed-shadow-passes.ts +122 -12
  754. package/src/volume/component.ts +1 -0
  755. package/src/volume/passes.ts +3 -3
  756. package/src/volume/temporal.ts +10 -0
  757. package/dist/chunk-GE3SDD72.mjs.map +0 -1
  758. package/dist/chunk-GF523LHF.mjs.map +0 -1
  759. package/dist/chunk-IQMKJLNU.mjs.map +0 -1
  760. package/dist/chunk-J52NMQKR.mjs.map +0 -1
  761. package/dist/chunk-J6KACNOH.mjs.map +0 -1
  762. package/dist/chunk-JAASCMXA.mjs.map +0 -1
  763. package/dist/chunk-MBU4ZVE7.mjs.map +0 -1
  764. package/dist/chunk-MYJ5RPJO.mjs.map +0 -1
  765. package/dist/chunk-RBDBZ5R7.mjs.map +0 -1
  766. package/dist/chunk-VSL23LZE.mjs.map +0 -1
  767. package/src/__tests__/instances-world-ownership.integration.test.ts +0 -62
  768. 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,17 @@ 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
+ },
254
+ {
255
+ binding: 11,
256
+ visibility: 2,
257
+ texture: { sampleType: 'unfilterable-float', viewDimension: '2d' },
258
+ },
203
259
  ],
204
260
  });
205
261
  if (!layout.ok) throw layout.error;
@@ -207,19 +263,29 @@ export function getTemporalBindGroupResources(state: TemporalGpuState): {
207
263
  const sampler = state.device.createSampler({
208
264
  addressModeU: 'clamp-to-edge',
209
265
  addressModeV: 'clamp-to-edge',
210
- magFilter: 'nearest',
211
- minFilter: 'nearest',
266
+ magFilter: 'linear',
267
+ minFilter: 'linear',
212
268
  });
213
269
  if (!sampler.ok) throw sampler.error;
214
270
  state.childScope._adopt('binding', sampler.value, () => undefined);
271
+ const temporalSampler = state.device.createSampler({
272
+ addressModeU: 'clamp-to-edge',
273
+ addressModeV: 'clamp-to-edge',
274
+ magFilter: 'nearest',
275
+ minFilter: 'nearest',
276
+ });
277
+ if (!temporalSampler.ok) throw temporalSampler.error;
278
+ state.childScope._adopt('binding', temporalSampler.value, () => undefined);
215
279
  state.bindGroupLayout = layout.value;
216
280
  state.sampler = sampler.value;
217
- return { layout: layout.value, sampler: sampler.value };
281
+ state.temporalSampler = temporalSampler.value;
282
+ return { layout: layout.value, sampler: sampler.value, temporalSampler: temporalSampler.value };
218
283
  } catch (cause) {
219
284
  if (!state.committed) {
220
285
  state.childScope.abandon();
221
286
  state.bindGroupLayout = undefined;
222
287
  state.sampler = undefined;
288
+ state.temporalSampler = undefined;
223
289
  }
224
290
  throw cause;
225
291
  }
@@ -261,6 +327,7 @@ export function retireTemporalGpuState(state: TemporalGpuState): void {
261
327
  state.committed = false;
262
328
  state.bindGroupLayout = undefined;
263
329
  state.sampler = undefined;
330
+ state.temporalSampler = undefined;
264
331
  state.paramsBuffer = undefined;
265
332
  }
266
333
 
@@ -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 {
@@ -4,6 +4,8 @@ import type {
4
4
  RenderGraphError,
5
5
  } from '@forgeax/engine-render-graph';
6
6
  import { ok, type Result } from '@forgeax/engine-types';
7
+ import type { RenderExtent } from '../pipeline/render-extent';
8
+ import { renderExtentSize } from '../pipeline/render-extent';
7
9
  import type { RenderPipelineFrame, RenderPipelineTarget } from '../render-pipeline';
8
10
  import { createRenderPipelineTarget } from '../render-pipeline';
9
11
  import { addTypedFullscreenPass, addTypedScenePass } from '../typed-render-graph-primitives';
@@ -11,10 +13,11 @@ import { addTypedFullscreenPass, addTypedScenePass } from '../typed-render-graph
11
13
  export interface StandardTemporalDemandInput {
12
14
  readonly taa: boolean;
13
15
  readonly motionBlur: boolean;
16
+ readonly ssr?: boolean;
14
17
  }
15
18
 
16
19
  export interface StandardTemporalDemand {
17
- readonly consumerIds: readonly ('taa' | 'motion-blur')[];
20
+ readonly consumerIds: readonly ('taa' | 'motion-blur' | 'ssr')[];
18
21
  readonly targetCount: 0 | 1;
19
22
  readonly producerPassCount: 0 | 1;
20
23
  readonly historyCount: 0 | 1;
@@ -35,6 +38,7 @@ export function aggregateTemporalDemand(
35
38
  const consumerIds = [
36
39
  ...(input.taa ? (['taa'] as const) : []),
37
40
  ...(input.motionBlur ? (['motion-blur'] as const) : []),
41
+ ...(input.ssr ? (['ssr'] as const) : []),
38
42
  ];
39
43
  const requested = consumerIds.length > 0;
40
44
  return Object.freeze({
@@ -133,8 +137,12 @@ const TEMPORAL_TARGET: GraphTextureDescriptor = {
133
137
  /** The single Standard TAA current-frame producer target. */
134
138
  export function createStandardSceneDataTarget(
135
139
  graph: RenderGraphBuilder<RenderPipelineFrame>,
140
+ extent?: RenderExtent,
136
141
  ): Result<StandardSceneDataTargets, RenderGraphError> {
137
- const temporal = createRenderPipelineTarget(graph, 'standard-scene-temporal', TEMPORAL_TARGET);
142
+ const temporal = createRenderPipelineTarget(graph, 'standard-scene-temporal', {
143
+ ...TEMPORAL_TARGET,
144
+ size: extent === undefined ? TEMPORAL_TARGET.size : renderExtentSize(extent, 'internal'),
145
+ });
138
146
  return temporal.ok ? ok({ temporal: temporal.value }) : temporal;
139
147
  }
140
148
 
@@ -0,0 +1,72 @@
1
+ import type {
2
+ GraphTextureDescriptor,
3
+ RenderGraphBuilder,
4
+ RenderGraphError,
5
+ } from '@forgeax/engine-render-graph';
6
+ import { ok, type Result } from '@forgeax/engine-types';
7
+ import { GPU_TEXTURE_USAGE_COPY_SRC } from '../gpu-texture-usage';
8
+ import type { RenderExtent } from '../pipeline/render-extent';
9
+ import type { RenderPipelineFrame, RenderPipelineTarget } from '../render-pipeline';
10
+ import { createRenderPipelineTarget } from '../render-pipeline';
11
+ import { addTypedScenePass } from '../typed-render-graph-primitives';
12
+
13
+ export interface TargetCoverageAttachment {
14
+ readonly coverage: RenderPipelineTarget;
15
+ readonly depth: RenderPipelineTarget;
16
+ readonly outputWidth: number;
17
+ readonly outputHeight: number;
18
+ }
19
+
20
+ const COVERAGE_DESCRIPTOR: GraphTextureDescriptor = {
21
+ format: 'r8unorm',
22
+ size: 'surface',
23
+ sampleCount: 1,
24
+ usage: GPU_TEXTURE_USAGE_COPY_SRC,
25
+ };
26
+
27
+ const COVERAGE_DEPTH_DESCRIPTOR: GraphTextureDescriptor = {
28
+ format: 'depth24plus-stencil8',
29
+ size: 'surface',
30
+ sampleCount: 1,
31
+ };
32
+
33
+ /** Create the per-generation output-domain coverage/depth pair. */
34
+ export function createTargetCoverageAttachment(
35
+ graph: RenderGraphBuilder<RenderPipelineFrame>,
36
+ extent: RenderExtent,
37
+ ): Result<TargetCoverageAttachment, RenderGraphError> {
38
+ const coverage = createRenderPipelineTarget(graph, 'standard-scene-coverage', {
39
+ ...COVERAGE_DESCRIPTOR,
40
+ size: { width: extent.outputWidth, height: extent.outputHeight },
41
+ });
42
+ if (!coverage.ok) return coverage;
43
+ const depth = createRenderPipelineTarget(graph, 'standard-scene-coverage-depth', {
44
+ ...COVERAGE_DEPTH_DESCRIPTOR,
45
+ size: { width: extent.outputWidth, height: extent.outputHeight },
46
+ });
47
+ if (!depth.ok) return depth;
48
+ return ok({
49
+ coverage: coverage.value,
50
+ depth: depth.value,
51
+ outputWidth: extent.outputWidth,
52
+ outputHeight: extent.outputHeight,
53
+ });
54
+ }
55
+
56
+ /** Rasterize the real Standard draw list into binary output-domain coverage. */
57
+ export function addTargetCoveragePass(
58
+ graph: RenderGraphBuilder<RenderPipelineFrame>,
59
+ target: TargetCoverageAttachment,
60
+ ): Result<void, RenderGraphError> {
61
+ return addTypedScenePass(graph, {
62
+ name: 'standard-scene-coverage',
63
+ color: target.coverage,
64
+ colorTargets: [target.coverage],
65
+ depth: target.depth,
66
+ selector: { LightMode: ['Deferred', 'Forward'] },
67
+ passKind: 'temporal',
68
+ clearColor: [0, 0, 0, 0],
69
+ depthLoadOp: 'clear',
70
+ coverageOnly: true,
71
+ });
72
+ }
@@ -4,6 +4,9 @@ import type { CameraSnapshot } from '../render-contract';
4
4
 
5
5
  export const TEMPORAL_JITTER_SAMPLE_COUNT = 8;
6
6
 
7
+ /** TAAU shares the temporal view owner; its internal dimensions are optional. */
8
+ export const TEMPORAL_TAAU_DEPENDENCY_STATUS = 'available' as const;
9
+
7
10
  export type TemporalViewResetReason =
8
11
  | 'first-frame'
9
12
  | 'camera-switch'
@@ -28,6 +31,8 @@ export interface TemporalView {
28
31
  readonly historyValid: boolean;
29
32
  readonly resetReason: TemporalViewResetReason | undefined;
30
33
  readonly currentJitterUv: readonly [number, number];
34
+ readonly internalWidth: number;
35
+ readonly internalHeight: number;
31
36
  readonly previousJitterUv: readonly [number, number];
32
37
  readonly currentJitteredViewProjection: Float32Array;
33
38
  readonly currentUnjitteredViewProjection: Float32Array;
@@ -42,6 +47,8 @@ export interface TemporalViewInput {
42
47
  readonly temporalFrameIndex: number;
43
48
  readonly surfaceWidth: number;
44
49
  readonly surfaceHeight: number;
50
+ readonly internalWidth?: number;
51
+ readonly internalHeight?: number;
45
52
  readonly lastSubmitted?: SubmittedTemporalView;
46
53
  }
47
54
 
@@ -122,8 +129,8 @@ export function projectTemporalView(input: TemporalViewInput): TemporalView {
122
129
  const viewId = temporalViewId(camera.worldId ?? 0, camera.entityKey ?? 0);
123
130
  const currentJitterUv = temporalJitterUv(
124
131
  input.temporalFrameIndex,
125
- input.surfaceWidth,
126
- input.surfaceHeight,
132
+ input.internalWidth ?? input.surfaceWidth,
133
+ input.internalHeight ?? input.surfaceHeight,
127
134
  );
128
135
  const view = mat4.invert(mat4.create(), camera.world);
129
136
  const projection = cameraProjection(camera);
@@ -142,6 +149,8 @@ export function projectTemporalView(input: TemporalViewInput): TemporalView {
142
149
  historyValid,
143
150
  resetReason: reason,
144
151
  currentJitterUv,
152
+ internalWidth: input.internalWidth ?? input.surfaceWidth,
153
+ internalHeight: input.internalHeight ?? input.surfaceHeight,
145
154
  previousJitterUv: historyValid
146
155
  ? (input.lastSubmitted?.jitterUv ?? currentJitterUv)
147
156
  : currentJitterUv,