@forgeax/engine-render 0.1.7 → 0.1.20

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 (777) hide show
  1. package/README.md +140 -2
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/assembly/backend-contract.d.ts +12 -0
  4. package/dist/assembly/backend-contract.d.ts.map +1 -1
  5. package/dist/assembly/factory.d.ts +26 -5
  6. package/dist/assembly/factory.d.ts.map +1 -1
  7. package/dist/assembly/host-contract.d.ts +4 -0
  8. package/dist/assembly/host-contract.d.ts.map +1 -1
  9. package/dist/assembly/renderer-frame-transaction.d.ts +39 -0
  10. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -0
  11. package/dist/assembly/renderer-inspection.d.ts +22 -0
  12. package/dist/assembly/renderer-inspection.d.ts.map +1 -0
  13. package/dist/assembly/renderer-lifecycle.d.ts +4 -0
  14. package/dist/assembly/renderer-lifecycle.d.ts.map +1 -0
  15. package/dist/authoring.mjs +4 -2
  16. package/dist/authoring.mjs.map +1 -1
  17. package/dist/chunk-4XINDLAY.mjs +9404 -0
  18. package/dist/chunk-4XINDLAY.mjs.map +1 -0
  19. package/dist/chunk-CDTWTHZR.mjs +752 -0
  20. package/dist/chunk-CDTWTHZR.mjs.map +1 -0
  21. package/dist/chunk-FJ6P52EE.mjs +46 -0
  22. package/dist/chunk-FJ6P52EE.mjs.map +1 -0
  23. package/dist/chunk-JDWARUOI.mjs +44 -0
  24. package/dist/chunk-JDWARUOI.mjs.map +1 -0
  25. package/dist/chunk-M2MP4ZOU.mjs +73 -0
  26. package/dist/chunk-M2MP4ZOU.mjs.map +1 -0
  27. package/dist/chunk-PCHBPYML.mjs +385 -0
  28. package/dist/chunk-PCHBPYML.mjs.map +1 -0
  29. package/dist/chunk-RXZ3RGOU.mjs +53 -0
  30. package/dist/chunk-RXZ3RGOU.mjs.map +1 -0
  31. package/dist/{chunk-YEJIUW7D.mjs → chunk-TBQJOK2L.mjs} +356 -543
  32. package/dist/chunk-TBQJOK2L.mjs.map +1 -0
  33. package/dist/{chunk-CQXZC5XI.mjs → chunk-VFPLTKCU.mjs} +79 -69
  34. package/dist/chunk-VFPLTKCU.mjs.map +1 -0
  35. package/dist/components/atmosphere.d.ts +9 -0
  36. package/dist/components/atmosphere.d.ts.map +1 -0
  37. package/dist/components/camera.d.ts +2 -1
  38. package/dist/components/camera.d.ts.map +1 -1
  39. package/dist/components/fog.d.ts +8 -0
  40. package/dist/components/fog.d.ts.map +1 -0
  41. package/dist/components/index.d.ts +3 -0
  42. package/dist/components/index.d.ts.map +1 -1
  43. package/dist/components/light-helpers.d.ts.map +1 -1
  44. package/dist/components/motion-blur.d.ts +7 -0
  45. package/dist/components/motion-blur.d.ts.map +1 -0
  46. package/dist/components/spot-light.d.ts +12 -0
  47. package/dist/components/spot-light.d.ts.map +1 -1
  48. package/dist/construct-renderer.d.ts +2 -2
  49. package/dist/construct-renderer.d.ts.map +1 -1
  50. package/dist/construct-renderer.mjs +11146 -14507
  51. package/dist/construct-renderer.mjs.map +1 -1
  52. package/dist/device/device-scope.d.ts +4 -0
  53. package/dist/device/device-scope.d.ts.map +1 -1
  54. package/dist/device/gpu-residency.d.ts +19 -2
  55. package/dist/device/gpu-residency.d.ts.map +1 -1
  56. package/dist/environment/frame.d.ts +60 -0
  57. package/dist/environment/frame.d.ts.map +1 -0
  58. package/dist/environment/generation.d.ts +21 -0
  59. package/dist/environment/generation.d.ts.map +1 -0
  60. package/dist/environment/graph.d.ts +4 -0
  61. package/dist/environment/graph.d.ts.map +1 -0
  62. package/dist/environment/inspection.d.ts +48 -0
  63. package/dist/environment/inspection.d.ts.map +1 -0
  64. package/dist/environment/lifecycle.d.ts +39 -0
  65. package/dist/environment/lifecycle.d.ts.map +1 -0
  66. package/dist/environment/signature.d.ts +25 -0
  67. package/dist/environment/signature.d.ts.map +1 -0
  68. package/dist/errors/render.d.ts +204 -1
  69. package/dist/errors/render.d.ts.map +1 -1
  70. package/dist/extract/camera.d.ts +5 -0
  71. package/dist/extract/camera.d.ts.map +1 -0
  72. package/dist/extract/environment.d.ts +74 -0
  73. package/dist/extract/environment.d.ts.map +1 -0
  74. package/dist/extract/visibility.d.ts +1 -1
  75. package/dist/extract/visibility.d.ts.map +1 -1
  76. package/dist/features/host.d.ts +9 -2
  77. package/dist/features/host.d.ts.map +1 -1
  78. package/dist/features/motion-blur/motion-blur-feature.d.ts +16 -0
  79. package/dist/features/motion-blur/motion-blur-feature.d.ts.map +1 -0
  80. package/dist/features/motion-blur/motion-blur-params.d.ts +25 -0
  81. package/dist/features/motion-blur/motion-blur-params.d.ts.map +1 -0
  82. package/dist/features/plan.d.ts +17 -2
  83. package/dist/features/plan.d.ts.map +1 -1
  84. package/dist/features/prepared-gpu-work.d.ts +3 -1
  85. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  86. package/dist/features/prepared-graphics.d.ts +2 -1
  87. package/dist/features/prepared-graphics.d.ts.map +1 -1
  88. package/dist/features/render-graph-raster.d.ts +2 -1
  89. package/dist/features/render-graph-raster.d.ts.map +1 -1
  90. package/dist/features/targets.d.ts +3 -0
  91. package/dist/features/targets.d.ts.map +1 -1
  92. package/dist/features/types.d.ts +12 -0
  93. package/dist/features/types.d.ts.map +1 -1
  94. package/dist/fullscreen-post-process-pass.d.ts +7 -1
  95. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  96. package/dist/gpu-scene.d.ts +2 -0
  97. package/dist/gpu-scene.d.ts.map +1 -1
  98. package/dist/gpu-usage.d.ts +2 -0
  99. package/dist/gpu-usage.d.ts.map +1 -1
  100. package/dist/ibl/skylight-bind-group.d.ts +5 -6
  101. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  102. package/dist/index.d.ts +24 -7
  103. package/dist/index.d.ts.map +1 -1
  104. package/dist/index.mjs +6 -4
  105. package/dist/index.mjs.map +1 -1
  106. package/dist/inspection-types.d.ts +43 -1
  107. package/dist/inspection-types.d.ts.map +1 -1
  108. package/dist/internal.d.ts +2 -0
  109. package/dist/internal.d.ts.map +1 -1
  110. package/dist/internal.mjs +2 -0
  111. package/dist/light-buffer-layout.d.ts +20 -12
  112. package/dist/light-buffer-layout.d.ts.map +1 -1
  113. package/dist/materials.d.ts +22 -0
  114. package/dist/materials.d.ts.map +1 -1
  115. package/dist/pbr-pipeline.d.ts +16 -9
  116. package/dist/pbr-pipeline.d.ts.map +1 -1
  117. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  118. package/dist/pipeline/standard-pipeline.d.ts +3 -0
  119. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  120. package/dist/pipeline/standard-post.d.ts +48 -0
  121. package/dist/pipeline/standard-post.d.ts.map +1 -0
  122. package/dist/pipeline/standard-profile.d.ts +12 -2
  123. package/dist/pipeline/standard-profile.d.ts.map +1 -1
  124. package/dist/pipeline-builder.d.ts +18 -0
  125. package/dist/pipeline-builder.d.ts.map +1 -1
  126. package/dist/pipeline-spec.d.ts.map +1 -1
  127. package/dist/plugin.d.ts.map +1 -1
  128. package/dist/record/frame-lighting.d.ts +2 -0
  129. package/dist/record/frame-lighting.d.ts.map +1 -1
  130. package/dist/record/frame-snapshot.d.ts +137 -6
  131. package/dist/record/frame-snapshot.d.ts.map +1 -1
  132. package/dist/record/frame-targets.d.ts.map +1 -1
  133. package/dist/record/frame.d.ts +6 -3
  134. package/dist/record/frame.d.ts.map +1 -1
  135. package/dist/record/gpu-timing.d.ts +32 -0
  136. package/dist/record/gpu-timing.d.ts.map +1 -0
  137. package/dist/record/main-pass-geometry.d.ts +11 -0
  138. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  139. package/dist/record/main-pass-material.d.ts +9 -6
  140. package/dist/record/main-pass-material.d.ts.map +1 -1
  141. package/dist/record/main-pass-sprite-draws.d.ts +8 -1
  142. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  143. package/dist/record/main-pass.d.ts +2 -0
  144. package/dist/record/main-pass.d.ts.map +1 -1
  145. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  146. package/dist/record/render-context.d.ts +81 -19
  147. package/dist/record/render-context.d.ts.map +1 -1
  148. package/dist/record/shadow-pass.d.ts.map +1 -1
  149. package/dist/record/skybox-post-pass.d.ts +1 -11
  150. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  151. package/dist/record/typed-frame-graph.d.ts +36 -4
  152. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  153. package/dist/record/view-ubo.d.ts +4 -1
  154. package/dist/record/view-ubo.d.ts.map +1 -1
  155. package/dist/render-contract.d.ts +157 -8
  156. package/dist/render-contract.d.ts.map +1 -1
  157. package/dist/render-data.d.ts +10 -6
  158. package/dist/render-data.d.ts.map +1 -1
  159. package/dist/render-graph-primitives.d.ts.map +1 -1
  160. package/dist/render-pipeline.d.ts +86 -6
  161. package/dist/render-pipeline.d.ts.map +1 -1
  162. package/dist/render-system-extract.d.ts +84 -8
  163. package/dist/render-system-extract.d.ts.map +1 -1
  164. package/dist/render-system.d.ts +30 -5
  165. package/dist/render-system.d.ts.map +1 -1
  166. package/dist/renderer-inspect.d.ts +29 -0
  167. package/dist/renderer-inspect.d.ts.map +1 -0
  168. package/dist/scene/render-scene.d.ts +36 -2
  169. package/dist/scene/render-scene.d.ts.map +1 -1
  170. package/dist/temporal/coverage.d.ts +42 -0
  171. package/dist/temporal/coverage.d.ts.map +1 -0
  172. package/dist/temporal/frame-coordinator.d.ts +99 -0
  173. package/dist/temporal/frame-coordinator.d.ts.map +1 -0
  174. package/dist/temporal/frame.d.ts +44 -0
  175. package/dist/temporal/frame.d.ts.map +1 -0
  176. package/dist/temporal/gpu.d.ts +39 -0
  177. package/dist/temporal/gpu.d.ts.map +1 -0
  178. package/dist/temporal/history.d.ts +37 -0
  179. package/dist/temporal/history.d.ts.map +1 -0
  180. package/dist/temporal/index.d.ts +7 -0
  181. package/dist/temporal/index.d.ts.map +1 -0
  182. package/dist/temporal/index.mjs +8 -0
  183. package/dist/temporal/index.mjs.map +1 -0
  184. package/dist/temporal/inspection.d.ts +36 -0
  185. package/dist/temporal/inspection.d.ts.map +1 -0
  186. package/dist/temporal/scene-data-catalog.d.ts +48 -0
  187. package/dist/temporal/scene-data-catalog.d.ts.map +1 -0
  188. package/dist/temporal/scene-data.d.ts +43 -0
  189. package/dist/temporal/scene-data.d.ts.map +1 -0
  190. package/dist/temporal/standard-scene-data.d.ts +61 -0
  191. package/dist/temporal/standard-scene-data.d.ts.map +1 -0
  192. package/dist/temporal/taa-history-resources.d.ts +22 -0
  193. package/dist/temporal/taa-history-resources.d.ts.map +1 -0
  194. package/dist/temporal/taa-history-store.d.ts +27 -0
  195. package/dist/temporal/taa-history-store.d.ts.map +1 -0
  196. package/dist/temporal/taa-resolve.d.ts +15 -0
  197. package/dist/temporal/taa-resolve.d.ts.map +1 -0
  198. package/dist/temporal/temporal-view.d.ts +40 -0
  199. package/dist/temporal/temporal-view.d.ts.map +1 -0
  200. package/dist/temporal/transaction.d.ts +9 -0
  201. package/dist/temporal/transaction.d.ts.map +1 -0
  202. package/dist/temporal/view.d.ts +56 -0
  203. package/dist/temporal/view.d.ts.map +1 -0
  204. package/dist/transmission/backdrop.d.ts +147 -0
  205. package/dist/transmission/backdrop.d.ts.map +1 -0
  206. package/dist/transmission/inspection.d.ts +57 -0
  207. package/dist/transmission/inspection.d.ts.map +1 -0
  208. package/dist/transmission/oracle.d.ts +42 -0
  209. package/dist/transmission/oracle.d.ts.map +1 -0
  210. package/dist/transmission/projection.d.ts +37 -0
  211. package/dist/transmission/projection.d.ts.map +1 -0
  212. package/dist/typed-render-graph-primitives.d.ts +30 -2
  213. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  214. package/dist/typed-shadow-atlas.d.ts +10 -0
  215. package/dist/typed-shadow-atlas.d.ts.map +1 -0
  216. package/dist/typed-shadow-passes.d.ts.map +1 -1
  217. package/dist/volume/capability.d.ts +57 -0
  218. package/dist/volume/capability.d.ts.map +1 -0
  219. package/dist/volume/component.d.ts +61 -0
  220. package/dist/volume/component.d.ts.map +1 -0
  221. package/dist/volume/extract.d.ts +11 -0
  222. package/dist/volume/extract.d.ts.map +1 -0
  223. package/dist/volume/inspection.d.ts +38 -0
  224. package/dist/volume/inspection.d.ts.map +1 -0
  225. package/dist/volume/passes.d.ts +38 -0
  226. package/dist/volume/passes.d.ts.map +1 -0
  227. package/dist/volume/recovery.d.ts +38 -0
  228. package/dist/volume/recovery.d.ts.map +1 -0
  229. package/dist/volume/resources.d.ts +57 -0
  230. package/dist/volume/resources.d.ts.map +1 -0
  231. package/dist/volume/temporal.d.ts +35 -0
  232. package/dist/volume/temporal.d.ts.map +1 -0
  233. package/package.json +24 -19
  234. package/src/__tests__/ai-user-cold-start.integration.test.ts +59 -0
  235. package/src/__tests__/ai-user-public-surface.test-d.ts +45 -0
  236. package/src/__tests__/bloom-exact-zero.unit.test.ts +202 -0
  237. package/src/__tests__/bloom-lifecycle.integration.test.ts +125 -0
  238. package/src/__tests__/construct-renderer-identity.unit.test.ts +4 -3
  239. package/src/__tests__/detached-inspection.integration.test.ts +177 -0
  240. package/src/__tests__/environment-fog-lanes.integration.test.ts +219 -0
  241. package/src/__tests__/environment-generation.integration.test.ts +141 -0
  242. package/src/__tests__/environment-selection.unit.test.ts +245 -0
  243. package/src/__tests__/factory-contract.integration.test.ts +1380 -9
  244. package/src/__tests__/frame-plan-contract.unit.test.ts +90 -0
  245. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +7 -0
  246. package/src/__tests__/gpu-driven-production.integration.test.ts +74 -22
  247. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +37 -0
  248. package/src/__tests__/gpu-scene.unit.test.ts +10 -0
  249. package/src/__tests__/injection-kind-owner.test-d.ts +2 -1
  250. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +14 -14
  251. package/src/__tests__/material-contract-inventory.unit.test.ts +62 -0
  252. package/src/__tests__/material-cooked-projection.unit.test.ts +18 -146
  253. package/src/__tests__/materials-transmission-validation.unit.test.ts +36 -0
  254. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +1 -1
  255. package/src/__tests__/morph-feature-plan.unit.test.ts +7 -0
  256. package/src/__tests__/motion-blur.pixel.integration.test.ts +121 -0
  257. package/src/__tests__/public-surface.test-d.ts +15 -1
  258. package/src/__tests__/render-error-code-owner.test-d.ts +14 -0
  259. package/src/__tests__/render-error-detail-ssot.test-d.ts +11 -2
  260. package/src/__tests__/render-error-exhaustive.test-d.ts +3 -0
  261. package/src/__tests__/render-feature-errors.unit.test.ts +33 -3
  262. package/src/__tests__/render-feature-gpu-work.integration.test.ts +44 -0
  263. package/src/__tests__/render-feature-plan.test-d.ts +22 -89
  264. package/src/__tests__/render-scene-projection.unit.test.ts +28 -0
  265. package/src/__tests__/render-temporal-environment-consumer.browser.test.ts +26 -0
  266. package/src/__tests__/render-temporal-environment-consumer.dawn.test.ts +21 -0
  267. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +423 -1
  268. package/src/__tests__/renderer-frame-transaction.integration.test.ts +405 -0
  269. package/src/__tests__/renderer-lifecycle.integration.test.ts +22 -0
  270. package/src/__tests__/scene-data-catalog.unit.test.ts +59 -0
  271. package/src/__tests__/scene-data-consumer.integration.test.ts +67 -0
  272. package/src/__tests__/scene-data-contract.test-d.ts +35 -0
  273. package/src/__tests__/scene-data-inspection.unit.test.ts +41 -0
  274. package/src/__tests__/scene-data-public-surface.test-d.ts +34 -0
  275. package/src/__tests__/shader-manifest-fixture.ts +111 -0
  276. package/src/__tests__/skinned-shadow-caster.test.ts +123 -0
  277. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +24 -3
  278. package/src/__tests__/standard-pipeline.dawn.test.ts +15 -0
  279. package/src/__tests__/standard-pipeline.integration.test.ts +543 -1
  280. package/src/__tests__/standard-profile-oracle.unit.test.ts +12 -2
  281. package/src/__tests__/standard-temporal-producer.integration.test.ts +35 -0
  282. package/src/__tests__/surface-configuration.unit.test.ts +211 -12
  283. package/src/__tests__/taa-transaction.integration.test.ts +30 -0
  284. package/src/__tests__/temporal-admission.integration.test.ts +40 -0
  285. package/src/__tests__/temporal-coverage.unit.test.ts +35 -0
  286. package/src/__tests__/temporal-demand.unit.test.ts +44 -0
  287. package/src/__tests__/temporal-frame-coordinator.unit.test.ts +64 -0
  288. package/src/__tests__/temporal-graph-topology.unit.test.ts +51 -0
  289. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +170 -0
  290. package/src/__tests__/temporal-performance.integration.test.ts +615 -0
  291. package/src/__tests__/temporal-reset-matrix.unit.test.ts +97 -0
  292. package/src/__tests__/temporal-transaction.integration.test.ts +60 -0
  293. package/src/__tests__/temporal-view.unit.test.ts +152 -0
  294. package/src/__tests__/transmission-prewarm.unit.test.ts +93 -0
  295. package/src/__tests__/typed-pipeline-topology.unit.test.ts +230 -1
  296. package/src/__tests__/urp-pipeline-targets.unit.test.ts +25 -1
  297. package/src/__tests__/urp-pipeline.unit.test.ts +4 -3
  298. package/src/__tests__/visibility-extract.integration.test.ts +27 -1
  299. package/src/__tests__/visibility-producer-matrix.integration.test.ts +10 -0
  300. package/src/__tests__/volume-optics-oracle.unit.test.ts +85 -0
  301. package/src/__tests__/volumetric-fog-budget-recovery.integration.test.ts +655 -0
  302. package/src/__tests__/volumetric-fog-component.unit.test.ts +71 -0
  303. package/src/__tests__/volumetric-fog-composite-stage-readback.dawn.test.ts +376 -0
  304. package/src/__tests__/volumetric-fog-errors.unit.test.ts +51 -0
  305. package/src/__tests__/volumetric-fog-inspection.unit.test.ts +77 -0
  306. package/src/__tests__/volumetric-fog-light-capability.unit.test.ts +19 -0
  307. package/src/__tests__/volumetric-fog-light-consumers.integration.test.ts +18 -0
  308. package/src/__tests__/volumetric-fog-light-errors.unit.test.ts +17 -0
  309. package/src/__tests__/volumetric-fog-light-topology.unit.test.ts +21 -0
  310. package/src/__tests__/volumetric-fog-light-transaction.integration.test.ts +53 -0
  311. package/src/__tests__/volumetric-fog-m9-watcher.integration.test.ts +27 -0
  312. package/src/__tests__/volumetric-fog-point-light-owner.integration.test.ts +44 -0
  313. package/src/__tests__/volumetric-fog-point-spot-accumulation.integration.test.ts +49 -0
  314. package/src/__tests__/volumetric-fog-point-spot-contract.unit.test.ts +28 -0
  315. package/src/__tests__/volumetric-fog-point-spot-lkg.integration.test.ts +65 -0
  316. package/src/__tests__/volumetric-fog-point-spot-selection.integration.test.ts +49 -0
  317. package/src/__tests__/volumetric-fog-point-spot-temporal.unit.test.ts +55 -0
  318. package/src/__tests__/volumetric-fog-projector-contract.unit.test.ts +22 -0
  319. package/src/__tests__/volumetric-fog-projector-inspection.unit.test.ts +12 -0
  320. package/src/__tests__/volumetric-fog-projector-surface-volume.integration.test.ts +11 -0
  321. package/src/__tests__/volumetric-fog-projector-transaction.integration.test.ts +26 -0
  322. package/src/__tests__/volumetric-fog-recovery.integration.test.ts +47 -0
  323. package/src/__tests__/volumetric-fog-selected-light-resolution.integration.test.ts +63 -0
  324. package/src/__tests__/volumetric-fog-spot-closure.integration.test.ts +26 -0
  325. package/src/__tests__/volumetric-fog-spot-contract.test-d.ts +21 -0
  326. package/src/__tests__/volumetric-fog-spot-contract.unit.test.ts +27 -0
  327. package/src/__tests__/volumetric-fog-spot-frame-optics.integration.test.ts +14 -0
  328. package/src/__tests__/volumetric-fog-spot-optics.integration.test.ts +29 -0
  329. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +550 -0
  330. package/src/__tests__/volumetric-fog-temporal-selected-light.unit.test.ts +33 -0
  331. package/src/__tests__/volumetric-fog-temporal.unit.test.ts +45 -0
  332. package/src/__tests__/volumetric-fog-topology.unit.test.ts +237 -0
  333. package/src/__tests__/volumetric-fog-transparent.integration.test.ts +27 -0
  334. package/src/assembly/backend-contract.ts +47 -1
  335. package/src/assembly/factory.ts +1480 -505
  336. package/src/assembly/host-contract.ts +4 -0
  337. package/src/assembly/renderer-frame-transaction.ts +75 -0
  338. package/src/assembly/renderer-inspection.ts +112 -0
  339. package/src/assembly/renderer-lifecycle.ts +6 -0
  340. package/src/components/__tests__/motion-blur.unit.test.ts +14 -0
  341. package/src/components/__tests__/schema-contract.unit.test.ts +6 -1
  342. package/src/components/atmosphere.ts +10 -0
  343. package/src/components/camera.ts +2 -1
  344. package/src/components/fog.ts +9 -0
  345. package/src/components/index.ts +3 -0
  346. package/src/components/light-helpers.ts +4 -0
  347. package/src/components/motion-blur.ts +8 -0
  348. package/src/components/spot-light.ts +22 -3
  349. package/src/construct-renderer.ts +40 -3
  350. package/src/device/device-scope.ts +15 -1
  351. package/src/device/gpu-residency.ts +168 -58
  352. package/src/environment/frame.ts +185 -0
  353. package/src/environment/generation.ts +23 -0
  354. package/src/environment/graph.ts +9 -0
  355. package/src/environment/inspection.ts +87 -0
  356. package/src/environment/lifecycle.ts +250 -0
  357. package/src/environment/signature.ts +55 -0
  358. package/src/errors/render.ts +404 -1
  359. package/src/extract/camera.ts +78 -0
  360. package/src/extract/environment.ts +171 -0
  361. package/src/extract/visibility.ts +38 -19
  362. package/src/features/host.ts +36 -5
  363. package/src/features/motion-blur/__tests__/motion-blur-feature.unit.test.ts +67 -0
  364. package/src/features/motion-blur/__tests__/motion-blur-params.unit.test.ts +53 -0
  365. package/src/features/motion-blur/motion-blur-feature.ts +119 -0
  366. package/src/features/motion-blur/motion-blur-params.ts +89 -0
  367. package/src/features/plan.ts +32 -3
  368. package/src/features/prepared-gpu-work.ts +21 -6
  369. package/src/features/prepared-graphics.ts +2 -1
  370. package/src/features/render-graph-raster.ts +2 -1
  371. package/src/features/targets.ts +24 -2
  372. package/src/features/types.ts +13 -0
  373. package/src/fullscreen-post-process-pass.ts +34 -4
  374. package/src/gpu-scene.ts +24 -0
  375. package/src/gpu-usage.ts +2 -0
  376. package/src/ibl/skylight-bind-group.ts +30 -38
  377. package/src/index.ts +104 -7
  378. package/src/inspection-types.ts +48 -0
  379. package/src/internal.ts +5 -0
  380. package/src/light-buffer-layout.ts +59 -26
  381. package/src/materials.ts +119 -24
  382. package/src/pbr-pipeline.ts +91 -29
  383. package/src/pipeline/standard-forward-lane.ts +178 -101
  384. package/src/pipeline/standard-pipeline.ts +176 -105
  385. package/src/pipeline/standard-post.ts +373 -0
  386. package/src/pipeline/standard-profile.ts +26 -3
  387. package/src/pipeline-builder.ts +102 -12
  388. package/src/pipeline-spec.ts +9 -0
  389. package/src/plugin.ts +2 -0
  390. package/src/record/__tests__/fullscreen-temporal-routing.unit.test.ts +25 -0
  391. package/src/record/__tests__/main-pass-geometry.unit.test.ts +47 -0
  392. package/src/record/__tests__/material-bg-cache.unit.test.ts +12 -1
  393. package/src/record/__tests__/material-pipeline-pending-cache.unit.test.ts +22 -0
  394. package/src/record/__tests__/sprite-material-abi.unit.test.ts +75 -0
  395. package/src/record/__tests__/standard-pbr-ubo-layout.unit.test.ts +67 -0
  396. package/src/record/__tests__/temporal-payload.unit.test.ts +164 -0
  397. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +127 -0
  398. package/src/record/frame-lighting.ts +103 -89
  399. package/src/record/frame-snapshot.ts +170 -6
  400. package/src/record/frame-targets.ts +21 -8
  401. package/src/record/frame.ts +1014 -7
  402. package/src/record/gpu-timing.ts +224 -0
  403. package/src/record/main-pass-geometry.ts +86 -40
  404. package/src/record/main-pass-material.ts +120 -68
  405. package/src/record/main-pass-sprite-draws.ts +78 -101
  406. package/src/record/main-pass.ts +77 -4
  407. package/src/record/mesh-ssbo.ts +22 -3
  408. package/src/record/render-context.ts +194 -23
  409. package/src/record/shadow-pass.ts +197 -58
  410. package/src/record/skybox-post-pass.ts +97 -41
  411. package/src/record/typed-frame-graph.ts +704 -30
  412. package/src/record/view-ubo.ts +52 -4
  413. package/src/render-contract.ts +181 -6
  414. package/src/render-data.ts +50 -22
  415. package/src/render-graph-primitives.ts +18 -1
  416. package/src/render-pipeline.ts +144 -27
  417. package/src/render-system-extract.ts +522 -72
  418. package/src/render-system.ts +561 -41
  419. package/src/renderer-inspect.ts +66 -0
  420. package/src/scene/render-scene.ts +252 -7
  421. package/src/temporal/__tests__/taa-history-resources.unit.test.ts +45 -0
  422. package/src/temporal/coverage.ts +76 -0
  423. package/src/temporal/frame-coordinator.ts +311 -0
  424. package/src/temporal/frame.ts +128 -0
  425. package/src/temporal/gpu.ts +287 -0
  426. package/src/temporal/history.ts +92 -0
  427. package/src/temporal/index.ts +6 -0
  428. package/src/temporal/inspection.ts +97 -0
  429. package/src/temporal/scene-data-catalog.ts +200 -0
  430. package/src/temporal/scene-data.ts +149 -0
  431. package/src/temporal/standard-scene-data.ts +182 -0
  432. package/src/temporal/taa-history-resources.ts +128 -0
  433. package/src/temporal/taa-history-store.ts +79 -0
  434. package/src/temporal/taa-resolve.ts +34 -0
  435. package/src/temporal/temporal-view.ts +169 -0
  436. package/src/temporal/transaction.ts +17 -0
  437. package/src/temporal/view.ts +161 -0
  438. package/src/transmission/__tests__/capability.unit.test.ts +83 -0
  439. package/src/transmission/__tests__/composition.integration.test.ts +161 -0
  440. package/src/transmission/__tests__/inspection.unit.test.ts +241 -0
  441. package/src/transmission/__tests__/lifecycle.integration.test.ts +96 -0
  442. package/src/transmission/__tests__/oracle.unit.test.ts +131 -0
  443. package/src/transmission/__tests__/projection.unit.test.ts +71 -0
  444. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +437 -0
  445. package/src/transmission/__tests__/transmission-backdrop-topology.unit.test.ts +109 -0
  446. package/src/transmission/__tests__/transmission-backdrop.dawn.test.ts +105 -0
  447. package/src/transmission/backdrop.ts +572 -0
  448. package/src/transmission/inspection.ts +190 -0
  449. package/src/transmission/oracle.ts +141 -0
  450. package/src/transmission/projection.ts +83 -0
  451. package/src/typed-render-graph-primitives.ts +194 -11
  452. package/src/typed-shadow-atlas.ts +17 -0
  453. package/src/typed-shadow-passes.ts +6 -5
  454. package/src/volume/capability.ts +173 -0
  455. package/src/volume/component.ts +110 -0
  456. package/src/volume/extract.ts +21 -0
  457. package/src/volume/inspection.ts +78 -0
  458. package/src/volume/passes.ts +680 -0
  459. package/src/volume/recovery.ts +86 -0
  460. package/src/volume/resources.ts +236 -0
  461. package/src/volume/temporal.ts +89 -0
  462. package/dist/__tests__/authoring-path.unit.test.d.ts +0 -2
  463. package/dist/__tests__/authoring-path.unit.test.d.ts.map +0 -1
  464. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts +0 -2
  465. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts.map +0 -1
  466. package/dist/__tests__/callback-inference.test-d.d.ts +0 -2
  467. package/dist/__tests__/callback-inference.test-d.d.ts.map +0 -1
  468. package/dist/__tests__/cluster-binner.test.d.ts +0 -2
  469. package/dist/__tests__/cluster-binner.test.d.ts.map +0 -1
  470. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts +0 -2
  471. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts.map +0 -1
  472. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts +0 -2
  473. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts.map +0 -1
  474. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts +0 -2
  475. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts.map +0 -1
  476. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts +0 -2
  477. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts.map +0 -1
  478. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts +0 -2
  479. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts.map +0 -1
  480. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts +0 -2
  481. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts.map +0 -1
  482. package/dist/__tests__/factory-contract.integration.test.d.ts +0 -2
  483. package/dist/__tests__/factory-contract.integration.test.d.ts.map +0 -1
  484. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts +0 -2
  485. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts.map +0 -1
  486. package/dist/__tests__/frame-observation.contract.test.d.ts +0 -2
  487. package/dist/__tests__/frame-observation.contract.test.d.ts.map +0 -1
  488. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts +0 -2
  489. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts.map +0 -1
  490. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts +0 -2
  491. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts.map +0 -1
  492. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts +0 -6
  493. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +0 -1
  494. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts +0 -2
  495. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts.map +0 -1
  496. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts +0 -2
  497. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts.map +0 -1
  498. package/dist/__tests__/gpu-driven-production.integration.test.d.ts +0 -2
  499. package/dist/__tests__/gpu-driven-production.integration.test.d.ts.map +0 -1
  500. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts +0 -2
  501. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts.map +0 -1
  502. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +0 -18
  503. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +0 -1
  504. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts +0 -2
  505. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts.map +0 -1
  506. package/dist/__tests__/gpu-driven-view-reference.d.ts +0 -15
  507. package/dist/__tests__/gpu-driven-view-reference.d.ts.map +0 -1
  508. package/dist/__tests__/gpu-driven-view.browser.test.d.ts +0 -2
  509. package/dist/__tests__/gpu-driven-view.browser.test.d.ts.map +0 -1
  510. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts +0 -2
  511. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts.map +0 -1
  512. package/dist/__tests__/gpu-driven-view.unit.test.d.ts +0 -2
  513. package/dist/__tests__/gpu-driven-view.unit.test.d.ts.map +0 -1
  514. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts +0 -2
  515. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts.map +0 -1
  516. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts +0 -7
  517. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +0 -1
  518. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts +0 -2
  519. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts.map +0 -1
  520. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts +0 -2
  521. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts.map +0 -1
  522. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts +0 -2
  523. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts.map +0 -1
  524. package/dist/__tests__/gpu-scene.dawn.test.d.ts +0 -2
  525. package/dist/__tests__/gpu-scene.dawn.test.d.ts.map +0 -1
  526. package/dist/__tests__/gpu-scene.unit.test.d.ts +0 -2
  527. package/dist/__tests__/gpu-scene.unit.test.d.ts.map +0 -1
  528. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts +0 -2
  529. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts.map +0 -1
  530. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts +0 -2
  531. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts.map +0 -1
  532. package/dist/__tests__/injection-kind-owner.test-d.d.ts +0 -2
  533. package/dist/__tests__/injection-kind-owner.test-d.d.ts.map +0 -1
  534. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts +0 -2
  535. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts.map +0 -1
  536. package/dist/__tests__/light-buffer-layout.unit.test.d.ts +0 -2
  537. package/dist/__tests__/light-buffer-layout.unit.test.d.ts.map +0 -1
  538. package/dist/__tests__/material-contract-inventory.unit.test.d.ts +0 -2
  539. package/dist/__tests__/material-contract-inventory.unit.test.d.ts.map +0 -1
  540. package/dist/__tests__/material-cooked-projection.unit.test.d.ts +0 -2
  541. package/dist/__tests__/material-cooked-projection.unit.test.d.ts.map +0 -1
  542. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts +0 -2
  543. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts.map +0 -1
  544. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts +0 -2
  545. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts.map +0 -1
  546. package/dist/__tests__/material-stride-surface.unit.test.d.ts +0 -2
  547. package/dist/__tests__/material-stride-surface.unit.test.d.ts.map +0 -1
  548. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts +0 -2
  549. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts.map +0 -1
  550. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts +0 -2
  551. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts.map +0 -1
  552. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts +0 -2
  553. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts.map +0 -1
  554. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts +0 -2
  555. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts.map +0 -1
  556. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts +0 -2
  557. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts.map +0 -1
  558. package/dist/__tests__/morph-feature-plan.unit.test.d.ts +0 -2
  559. package/dist/__tests__/morph-feature-plan.unit.test.d.ts.map +0 -1
  560. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts +0 -2
  561. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts.map +0 -1
  562. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts +0 -2
  563. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts.map +0 -1
  564. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts +0 -2
  565. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts.map +0 -1
  566. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts +0 -2
  567. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts.map +0 -1
  568. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts +0 -2
  569. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts.map +0 -1
  570. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts +0 -2
  571. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts.map +0 -1
  572. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts +0 -2
  573. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts.map +0 -1
  574. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts +0 -2
  575. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts.map +0 -1
  576. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts +0 -2
  577. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts.map +0 -1
  578. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts +0 -2
  579. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts.map +0 -1
  580. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts +0 -2
  581. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts.map +0 -1
  582. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts +0 -2
  583. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts.map +0 -1
  584. package/dist/__tests__/profiler-default-off.test.d.ts +0 -2
  585. package/dist/__tests__/profiler-default-off.test.d.ts.map +0 -1
  586. package/dist/__tests__/profiler-phase-catalog.test.d.ts +0 -2
  587. package/dist/__tests__/profiler-phase-catalog.test.d.ts.map +0 -1
  588. package/dist/__tests__/profiler-phase-integration.test.d.ts +0 -2
  589. package/dist/__tests__/profiler-phase-integration.test.d.ts.map +0 -1
  590. package/dist/__tests__/profiler-phase-token.test.d.ts +0 -2
  591. package/dist/__tests__/profiler-phase-token.test.d.ts.map +0 -1
  592. package/dist/__tests__/public-surface.test-d.d.ts +0 -2
  593. package/dist/__tests__/public-surface.test-d.d.ts.map +0 -1
  594. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts +0 -2
  595. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts.map +0 -1
  596. package/dist/__tests__/render-error-code-owner.test-d.d.ts +0 -2
  597. package/dist/__tests__/render-error-code-owner.test-d.d.ts.map +0 -1
  598. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts +0 -2
  599. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts.map +0 -1
  600. package/dist/__tests__/render-error-exhaustive.test-d.d.ts +0 -2
  601. package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +0 -1
  602. package/dist/__tests__/render-feature-assembly.test-d.d.ts +0 -2
  603. package/dist/__tests__/render-feature-assembly.test-d.d.ts.map +0 -1
  604. package/dist/__tests__/render-feature-context.test-d.d.ts +0 -2
  605. package/dist/__tests__/render-feature-context.test-d.d.ts.map +0 -1
  606. package/dist/__tests__/render-feature-contract.test-d.d.ts +0 -2
  607. package/dist/__tests__/render-feature-contract.test-d.d.ts.map +0 -1
  608. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts +0 -2
  609. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts.map +0 -1
  610. package/dist/__tests__/render-feature-docs.unit.test.d.ts +0 -2
  611. package/dist/__tests__/render-feature-docs.unit.test.d.ts.map +0 -1
  612. package/dist/__tests__/render-feature-errors.unit.test.d.ts +0 -2
  613. package/dist/__tests__/render-feature-errors.unit.test.d.ts.map +0 -1
  614. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts +0 -2
  615. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts.map +0 -1
  616. package/dist/__tests__/render-feature-plan.test-d.d.ts +0 -2
  617. package/dist/__tests__/render-feature-plan.test-d.d.ts.map +0 -1
  618. package/dist/__tests__/render-feature-plan.unit.test.d.ts +0 -2
  619. package/dist/__tests__/render-feature-plan.unit.test.d.ts.map +0 -1
  620. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts +0 -2
  621. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts.map +0 -1
  622. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts +0 -2
  623. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts.map +0 -1
  624. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts +0 -2
  625. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts.map +0 -1
  626. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts +0 -2
  627. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts.map +0 -1
  628. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts +0 -2
  629. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts.map +0 -1
  630. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts +0 -2
  631. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts.map +0 -1
  632. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts +0 -2
  633. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts.map +0 -1
  634. package/dist/__tests__/render-feature-public-surface.test-d.d.ts +0 -2
  635. package/dist/__tests__/render-feature-public-surface.test-d.d.ts.map +0 -1
  636. package/dist/__tests__/render-feature-retry.unit.test.d.ts +0 -2
  637. package/dist/__tests__/render-feature-retry.unit.test.d.ts.map +0 -1
  638. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts +0 -2
  639. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts.map +0 -1
  640. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts +0 -2
  641. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts.map +0 -1
  642. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts +0 -2
  643. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts.map +0 -1
  644. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts +0 -2
  645. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts.map +0 -1
  646. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts +0 -2
  647. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts.map +0 -1
  648. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts +0 -2
  649. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts.map +0 -1
  650. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts +0 -7
  651. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts.map +0 -1
  652. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts +0 -2
  653. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts.map +0 -1
  654. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts +0 -2
  655. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts.map +0 -1
  656. package/dist/__tests__/render-graph-hzb-gpu.d.ts +0 -7
  657. package/dist/__tests__/render-graph-hzb-gpu.d.ts.map +0 -1
  658. package/dist/__tests__/render-graph-hzb.browser.test.d.ts +0 -2
  659. package/dist/__tests__/render-graph-hzb.browser.test.d.ts.map +0 -1
  660. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts +0 -2
  661. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts.map +0 -1
  662. package/dist/__tests__/render-graph-primitives.unit.test.d.ts +0 -2
  663. package/dist/__tests__/render-graph-primitives.unit.test.d.ts.map +0 -1
  664. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts +0 -12
  665. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts.map +0 -1
  666. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts +0 -2
  667. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts.map +0 -1
  668. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts +0 -2
  669. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts.map +0 -1
  670. package/dist/__tests__/render-scene-projection.unit.test.d.ts +0 -2
  671. package/dist/__tests__/render-scene-projection.unit.test.d.ts.map +0 -1
  672. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts +0 -2
  673. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts.map +0 -1
  674. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts +0 -2
  675. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts.map +0 -1
  676. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts +0 -2
  677. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts.map +0 -1
  678. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts +0 -2
  679. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts.map +0 -1
  680. package/dist/__tests__/shader-stage-surface.unit.test.d.ts +0 -2
  681. package/dist/__tests__/shader-stage-surface.unit.test.d.ts.map +0 -1
  682. package/dist/__tests__/ssao-config.unit.test.d.ts +0 -2
  683. package/dist/__tests__/ssao-config.unit.test.d.ts.map +0 -1
  684. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts +0 -2
  685. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts.map +0 -1
  686. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts +0 -2
  687. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts.map +0 -1
  688. package/dist/__tests__/standard-descriptors.test-d.d.ts +0 -2
  689. package/dist/__tests__/standard-descriptors.test-d.d.ts.map +0 -1
  690. package/dist/__tests__/standard-pipeline.dawn.test.d.ts +0 -2
  691. package/dist/__tests__/standard-pipeline.dawn.test.d.ts.map +0 -1
  692. package/dist/__tests__/standard-pipeline.integration.test.d.ts +0 -2
  693. package/dist/__tests__/standard-pipeline.integration.test.d.ts.map +0 -1
  694. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts +0 -2
  695. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts.map +0 -1
  696. package/dist/__tests__/surface-configuration.unit.test.d.ts +0 -2
  697. package/dist/__tests__/surface-configuration.unit.test.d.ts.map +0 -1
  698. package/dist/__tests__/texture-usage-surface.unit.test.d.ts +0 -2
  699. package/dist/__tests__/texture-usage-surface.unit.test.d.ts.map +0 -1
  700. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts +0 -2
  701. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts.map +0 -1
  702. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts +0 -2
  703. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts.map +0 -1
  704. package/dist/__tests__/urp-pipeline.unit.test.d.ts +0 -2
  705. package/dist/__tests__/urp-pipeline.unit.test.d.ts.map +0 -1
  706. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts +0 -2
  707. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts.map +0 -1
  708. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts +0 -2
  709. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts.map +0 -1
  710. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts +0 -2
  711. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts.map +0 -1
  712. package/dist/__tests__/visibility-extract.integration.test.d.ts +0 -2
  713. package/dist/__tests__/visibility-extract.integration.test.d.ts.map +0 -1
  714. package/dist/__tests__/visibility-extract.perf.test.d.ts +0 -2
  715. package/dist/__tests__/visibility-extract.perf.test.d.ts.map +0 -1
  716. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts +0 -2
  717. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts.map +0 -1
  718. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts +0 -2
  719. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts.map +0 -1
  720. package/dist/__tests__/visibility-instances.integration.test.d.ts +0 -2
  721. package/dist/__tests__/visibility-instances.integration.test.d.ts.map +0 -1
  722. package/dist/__tests__/visibility-multi-world.integration.test.d.ts +0 -2
  723. package/dist/__tests__/visibility-multi-world.integration.test.d.ts.map +0 -1
  724. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts +0 -2
  725. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts.map +0 -1
  726. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts +0 -2
  727. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts.map +0 -1
  728. package/dist/__tests__/visibility-public-surface.test-d.d.ts +0 -2
  729. package/dist/__tests__/visibility-public-surface.test-d.d.ts.map +0 -1
  730. package/dist/__tests__/visibility-resolver.unit.test.d.ts +0 -2
  731. package/dist/__tests__/visibility-resolver.unit.test.d.ts.map +0 -1
  732. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts +0 -2
  733. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts.map +0 -1
  734. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts +0 -2
  735. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts.map +0 -1
  736. package/dist/__tests__/vocabulary.unit.test.d.ts +0 -2
  737. package/dist/__tests__/vocabulary.unit.test.d.ts.map +0 -1
  738. package/dist/chunk-CQXZC5XI.mjs.map +0 -1
  739. package/dist/chunk-HCOGPHKS.mjs +0 -93
  740. package/dist/chunk-HCOGPHKS.mjs.map +0 -1
  741. package/dist/chunk-YEJIUW7D.mjs.map +0 -1
  742. package/dist/components/__tests__/points-lines-admission.unit.test.d.ts +0 -2
  743. package/dist/components/__tests__/points-lines-admission.unit.test.d.ts.map +0 -1
  744. package/dist/components/__tests__/points-lines-schema.unit.test.d.ts +0 -2
  745. package/dist/components/__tests__/points-lines-schema.unit.test.d.ts.map +0 -1
  746. package/dist/components/__tests__/schema-contract.unit.test.d.ts +0 -2
  747. package/dist/components/__tests__/schema-contract.unit.test.d.ts.map +0 -1
  748. package/dist/components/__tests__/schema-parity.unit.test.d.ts +0 -2
  749. package/dist/components/__tests__/schema-parity.unit.test.d.ts.map +0 -1
  750. package/dist/components/__tests__/visibility-schema.unit.test.d.ts +0 -2
  751. package/dist/components/__tests__/visibility-schema.unit.test.d.ts.map +0 -1
  752. package/dist/points-lines/__tests__/bounds.unit.test.d.ts +0 -2
  753. package/dist/points-lines/__tests__/bounds.unit.test.d.ts.map +0 -1
  754. package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts +0 -2
  755. package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts.map +0 -1
  756. package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts +0 -2
  757. package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts.map +0 -1
  758. package/dist/points-lines/__tests__/inspection.unit.test.d.ts +0 -2
  759. package/dist/points-lines/__tests__/inspection.unit.test.d.ts.map +0 -1
  760. package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts +0 -2
  761. package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts.map +0 -1
  762. package/dist/points-lines/__tests__/points-lines.bench.d.ts +0 -2
  763. package/dist/points-lines/__tests__/points-lines.bench.d.ts.map +0 -1
  764. package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts +0 -2
  765. package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts.map +0 -1
  766. package/dist/points-lines/__tests__/snapshot.unit.test.d.ts +0 -2
  767. package/dist/points-lines/__tests__/snapshot.unit.test.d.ts.map +0 -1
  768. package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts +0 -2
  769. package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts.map +0 -1
  770. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts +0 -2
  771. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts.map +0 -1
  772. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts +0 -2
  773. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts.map +0 -1
  774. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts +0 -2
  775. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts.map +0 -1
  776. package/dist/record/__tests__/video-texture-view.unit.test.d.ts +0 -2
  777. package/dist/record/__tests__/video-texture-view.unit.test.d.ts.map +0 -1
@@ -16,10 +16,11 @@
16
16
  // .invert` (charter proposition 5: no math reinvention; render-system.test.ts
17
17
  // asserts `/@forgeax\/engine-math/` shows up in render-system.ts source).
18
18
 
19
- import { resolveAssetHandle } from '@forgeax/engine-assets-runtime';
19
+ import { numMipLevels, resolveAssetHandle } from '@forgeax/engine-assets-runtime';
20
20
  import type { World } from '@forgeax/engine-ecs';
21
21
  import type { RenderReadLease } from '@forgeax/engine-ecs/projection';
22
22
  import type { RecorderSession } from '@forgeax/engine-profiler';
23
+ import type { CompiledRenderGraphInfo } from '@forgeax/engine-render-graph';
23
24
  import type { BindGroupEntry, BindGroupLayout, Buffer, RenderPipeline } from '@forgeax/engine-rhi';
24
25
  import { err, ok, type Result, RhiError } from '@forgeax/engine-rhi';
25
26
  import {
@@ -34,10 +35,12 @@ import {
34
35
  toShared,
35
36
  } from '@forgeax/engine-types';
36
37
  import { createClusterBinScratch } from './cluster-binner';
38
+ import { EnvironmentLifecycle } from './environment/lifecycle';
37
39
  import {
38
40
  type ObservationUnavailableError,
39
41
  PointsLinesMaterialUnsupportedError,
40
42
  type RenderError,
43
+ TransmissionCapabilityMissingError,
41
44
  } from './errors/render';
42
45
  import {
43
46
  type RenderFeaturePreparedGraphicsResolverInput,
@@ -56,7 +59,13 @@ import {
56
59
  type PostProcessShaderEntry,
57
60
  } from './fullscreen-post-process-pass';
58
61
  import { GpuDrivenProduction } from './gpu-driven/production-raster';
59
- import type { RenderSceneInspection } from './inspection-types';
62
+ import type {
63
+ BloomInspection,
64
+ MotionBlurInspection,
65
+ RenderSceneInspection,
66
+ TemporalTargetInspection,
67
+ TransmissionInspection,
68
+ } from './inspection-types';
60
69
  import { admitPointsLines } from './points-lines/admission';
61
70
  import { PointsLinesExpansionCache } from './points-lines/expansion-cache';
62
71
  import {
@@ -71,10 +80,12 @@ import {
71
80
  import { createPointsLinesLaneAdapter, type PointsLinesBackend } from './points-lines/record';
72
81
  import type { PointsLinesRetainedSnapshot } from './points-lines/snapshot';
73
82
  import type { PointsLinesRecordOwner, PointsLinesRecordSubmission } from './record/render-context';
83
+ import { inspectVolumetricFog } from './volume/inspection';
74
84
 
75
85
  export type { RenderSceneInspection } from './inspection-types';
76
86
 
77
87
  import { deriveVertexLayoutProjection } from '@forgeax/engine-geometry';
88
+ import type { EnvironmentInspection } from './environment/inspection';
78
89
  import {
79
90
  GPU_BUFFER_USAGE_COPY_DST,
80
91
  GPU_BUFFER_USAGE_INDEX,
@@ -85,7 +96,12 @@ import { assembleMaterialWithSkylightEntries } from './ibl/skylight-bind-group';
85
96
  import { disposeInstanceBuffers, disposeTransientInstanceBuffers } from './instance-buffer-cache';
86
97
  import type { MeshMaterialBindingObservation } from './mesh-material-bindings';
87
98
  import { validateClusterGrid } from './pipeline/standard-pipeline';
88
- import { DEFAULT_CLUSTER_GRID } from './pipeline/standard-profile';
99
+ import {
100
+ DEFAULT_CLUSTER_GRID,
101
+ DEFAULT_STANDARD_PROFILE,
102
+ resolveStandardLane,
103
+ } from './pipeline/standard-profile';
104
+ import { PipelineSpecError } from './pipeline-spec';
89
105
  import { PostProcessError } from './post-process-errors';
90
106
  import {
91
107
  createPreparedGraphicsResolver,
@@ -99,12 +115,19 @@ import {
99
115
  recordFrame,
100
116
  } from './record/frame';
101
117
  import { buildPerFrameBindGroups } from './record/frame-lighting';
102
- import type { RenderFrameState } from './record/frame-snapshot';
118
+ import type {
119
+ CurrentGraphTarget,
120
+ GraphTargetCaptureRequest,
121
+ RenderFrameState,
122
+ } from './record/frame-snapshot';
123
+ import { getTextureIdentity } from './record/frame-snapshot';
124
+ import type { GpuTimingCapture } from './record/gpu-timing';
103
125
  import { applyParamSnapshotToUbo, residentTextureView } from './record/main-pass-material';
104
126
  import type { RenderSystemInternals } from './record/render-context';
105
127
  import {
106
128
  type RenderFeatureGraphCandidate,
107
129
  resetRenderFeatureGraphState,
130
+ settleVolumetricFogGraphCandidate,
108
131
  } from './record/typed-frame-graph';
109
132
  import {
110
133
  type CameraSnapshot,
@@ -125,6 +148,20 @@ import {
125
148
  TRANSPARENT_SORT_MODE_LAYER_YZ,
126
149
  TRANSPARENT_SORT_MODE_LAYER_Z,
127
150
  } from './systems/transparent-sort-config';
151
+ import { createTemporalFrameTransaction, type TemporalFrame } from './temporal/frame';
152
+ import { retireTemporalGpuState } from './temporal/gpu';
153
+ import { inspectTemporal, type TemporalInspection } from './temporal/inspection';
154
+ import {
155
+ evaluateTransmissionCapability,
156
+ probeTransmissionCapability,
157
+ resolveTransmissionBackdropTopology,
158
+ TransmissionCandidateAdmission,
159
+ } from './transmission/backdrop';
160
+ import {
161
+ estimateTransmissionBackdropBytes,
162
+ inspectTransmission,
163
+ inspectTransmissionFromAdmission,
164
+ } from './transmission/inspection';
128
165
 
129
166
  export type {
130
167
  _InternalRenderPipelineContext,
@@ -134,12 +171,15 @@ export type {
134
171
  RenderSystemInternals,
135
172
  RenderSystemRuntime,
136
173
  SurfaceBackendKind,
174
+ SurfaceCapabilityFacts,
175
+ SurfaceProfile,
137
176
  SwapChainFormatPair,
138
177
  } from './record/render-context';
139
178
  export {
140
179
  configureSurface,
141
180
  MATERIAL_PER_ENTITY_STRIDE,
142
181
  resolveSurfaceFormatPair,
182
+ resolveSurfaceProfile,
143
183
  STANDARD_PBR_UBO_SIZE,
144
184
  selectSwapChainFormat,
145
185
  } from './record/render-context';
@@ -289,6 +329,7 @@ export interface RenderSystem {
289
329
  worlds: readonly World[],
290
330
  opts: DrawOwnerOptions,
291
331
  renderReadLeases?: readonly RenderReadLease[],
332
+ timingCapture?: GpuTimingCapture,
292
333
  ): boolean;
293
334
  /** Release renderer-owned persistent state for one detached World. */
294
335
  detachScene(world: World): void;
@@ -297,6 +338,10 @@ export interface RenderSystem {
297
338
  observeCurrentFrame(
298
339
  options: FrameObservationOptions,
299
340
  ): Promise<Result<FrameObservation, ObservationUnavailableError>>;
341
+ /** Internal same-frame graph target access for backend diagnostics. */
342
+ getCurrentGraphTarget(name: string): CurrentGraphTarget | undefined;
343
+ /** Internal test capture copied into the draw's command submission. */
344
+ requestGraphTargetCapture(request: GraphTargetCaptureRequest): void;
300
345
  readonly pipelineDispatchCounts: {
301
346
  readonly unlit: number;
302
347
  };
@@ -309,6 +354,13 @@ export interface RenderSystem {
309
354
  readonly visibilityStats: { explicitlyHidden: number };
310
355
  /** Persistent scene maintenance evidence from the ordinary single-World path. */
311
356
  readonly renderScene: RenderSceneInspection;
357
+ readonly environment: EnvironmentInspection;
358
+ readonly temporal: TemporalInspection;
359
+ readonly bloom: BloomInspection;
360
+ readonly motionBlurInspection: MotionBlurInspection | undefined;
361
+ readonly temporalTargetInspection: TemporalTargetInspection | undefined;
362
+ /** Last completed transmission candidate facts, detached from GPU handles. */
363
+ readonly transmission: TransmissionInspection | undefined;
312
364
  /** Retained Points/Lines authoring facts from the single scene projection. */
313
365
  readonly pointsLinesSnapshots: readonly PointsLinesRetainedSnapshot[];
314
366
  /** Current mesh-slot provenance and active diagnostics from the last frame. */
@@ -322,6 +374,10 @@ export interface RenderSystem {
322
374
  * reaching into engine internals.
323
375
  */
324
376
  readonly perFramePassNames: readonly string[];
377
+ /** Camera antialias mode for the last successfully submitted frame. */
378
+ readonly lastSuccessfulCameraAntialias: CameraSnapshot['antialias'] | undefined;
379
+ /** Detached compiled-graph facts used by the renderer inspection owner. */
380
+ readonly perFrameGraphInfo: CompiledRenderGraphInfo | undefined;
325
381
  /**
326
382
  * feat-20260531-per-frame-bind-group-cache M1 / w4: per-frame
327
383
  * createBindGroup counter. Reset to 0 on every `draw([world], { cameraOwner: 0, resourceOwner: 0 })` entry,
@@ -341,6 +397,10 @@ export interface RenderSystem {
341
397
  readonly createBindGroup: number;
342
398
  readonly keys: readonly string[];
343
399
  };
400
+ /** Latest accepted-submit temporal POD; absent until the first accepted frame. */
401
+ readonly temporalFrame: TemporalFrame | undefined;
402
+ /** Current renderer-owned volumetric fog inspection snapshot. */
403
+ readonly volumetricFog: import('./volume/inspection').VolumetricFogInspection;
344
404
  /** Configure the sole Standard graph owner before the first frame. */
345
405
  configureStandard(config: RenderPipelineAsset['config']): void;
346
406
  /** Register one engine-owned post-process shader used by the Standard lane. */
@@ -701,6 +761,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
701
761
  let releaseProfilerCatalog =
702
762
  phaseCatalogRegistration?.ok === true ? phaseCatalogRegistration.value : undefined;
703
763
  let preparedWorlds: readonly World[] = [];
764
+ let latestCamera: CameraSnapshot | undefined;
704
765
  const pointsLinesOwner = new StandardPointsLinesOwner(internals);
705
766
  const persistentRenderScene = new PersistentRenderScene({
706
767
  getDevice: () => internals.device,
@@ -709,6 +770,131 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
709
770
  internals.gpuStore.invalidateMesh(handle, preparedWorlds[worldId] ?? worldId);
710
771
  },
711
772
  });
773
+ const environmentLifecycle = new EnvironmentLifecycle(internals.deviceScope);
774
+ const transmissionAdmission = new TransmissionCandidateAdmission();
775
+ let lastTransmissionInspection: TransmissionInspection | undefined;
776
+ let lastTransmissionKey = '';
777
+ let lastTransmissionAntialias: CameraSnapshot['antialias'] = 'none';
778
+ let transmissionCapabilityGeneration = -1;
779
+ let transmissionCapability:
780
+ | import('./transmission/backdrop').TransmissionCapabilityFacts
781
+ | undefined;
782
+ const prepareTransmissionCandidate = (antialias: CameraSnapshot['antialias']): boolean => {
783
+ const demand = persistentRenderScene.transmissionTopologyDemand();
784
+ if (demand.activeCount === 0) return true;
785
+ const topology = resolveTransmissionBackdropTopology({
786
+ demand,
787
+ sourceSampleCount: antialias === 'msaa' ? 4 : 1,
788
+ });
789
+ if (transmissionCapabilityGeneration !== internals.deviceScope.generation) {
790
+ transmissionCapability = probeTransmissionCapability(internals.device);
791
+ transmissionCapabilityGeneration = internals.deviceScope.generation;
792
+ }
793
+ if (transmissionCapability === undefined) {
794
+ throw new Error('transmission capability probe did not produce a result');
795
+ }
796
+ const capability = {
797
+ ...transmissionCapability,
798
+ msaaResolve: antialias === 'msaa' || topology.sourceSampleCount === 1,
799
+ } as const;
800
+ const verdict = evaluateTransmissionCapability(capability);
801
+ if (verdict.ok) return true;
802
+
803
+ const extent = {
804
+ width: Math.max(1, internals.canvas.width),
805
+ height: Math.max(1, internals.canvas.height),
806
+ };
807
+ const resource = {
808
+ extent,
809
+ format: capability.format,
810
+ mipCount: topology.mipCount === 0 ? 1 : numMipLevels(extent),
811
+ bytes: estimateTransmissionBackdropBytes(
812
+ extent,
813
+ topology.mipCount === 0 ? 1 : numMipLevels(extent),
814
+ capability.format,
815
+ ),
816
+ deviceGeneration: internals.deviceScope.generation,
817
+ } as const;
818
+ transmissionAdmission.admit(demand, capability, resource);
819
+ internals.errorRegistry.fire(
820
+ new TransmissionCapabilityMissingError('standard transmission', 'prepare', {
821
+ lane: 'standard-forward',
822
+ format: capability.format,
823
+ missing: verdict.missing,
824
+ }),
825
+ );
826
+ return false;
827
+ };
828
+ const updateTransmissionInspection = (
829
+ antialias: CameraSnapshot['antialias'],
830
+ submitted: boolean,
831
+ ): void => {
832
+ lastTransmissionAntialias = antialias;
833
+ const demand = persistentRenderScene.transmissionTopologyDemand();
834
+ if (demand.activeCount === 0) {
835
+ lastTransmissionInspection = undefined;
836
+ lastTransmissionKey = '';
837
+ return;
838
+ }
839
+ const extent = {
840
+ width: Math.max(1, internals.canvas.width),
841
+ height: Math.max(1, internals.canvas.height),
842
+ };
843
+ const topology = resolveTransmissionBackdropTopology({
844
+ demand,
845
+ sourceSampleCount: antialias === 'msaa' ? 4 : 1,
846
+ });
847
+ if (transmissionCapabilityGeneration !== internals.deviceScope.generation) {
848
+ transmissionCapability = probeTransmissionCapability(internals.device);
849
+ transmissionCapabilityGeneration = internals.deviceScope.generation;
850
+ }
851
+ if (transmissionCapability === undefined) {
852
+ throw new Error('transmission capability probe did not produce a result');
853
+ }
854
+ const resource = {
855
+ extent,
856
+ format: 'rgba16float',
857
+ mipCount: topology.mipCount === 0 ? 1 : numMipLevels(extent),
858
+ bytes: estimateTransmissionBackdropBytes(
859
+ extent,
860
+ topology.mipCount === 0 ? 1 : numMipLevels(extent),
861
+ ),
862
+ deviceGeneration: internals.deviceScope.generation,
863
+ } as const;
864
+ const key = `${demand.activeCount}:${demand.needsRoughMips}:${extent.width}:${extent.height}:${resource.deviceGeneration}:${antialias}:${submitted}`;
865
+ if (key === lastTransmissionKey && lastTransmissionInspection !== undefined) return;
866
+ if (submitted) {
867
+ transmissionAdmission.admit(
868
+ demand,
869
+ {
870
+ ...transmissionCapability,
871
+ msaaResolve: antialias === 'msaa' || topology.sourceSampleCount === 1,
872
+ },
873
+ resource,
874
+ );
875
+ }
876
+ const admission = transmissionAdmission.inspectLifecycle();
877
+ lastTransmissionInspection = submitted
878
+ ? inspectTransmissionFromAdmission({
879
+ admission,
880
+ topology,
881
+ extent,
882
+ transmissionDrawCount: demand.activeCount,
883
+ })
884
+ : inspectTransmission({
885
+ demand,
886
+ topology,
887
+ extent,
888
+ generation: admission.generation,
889
+ lastKnownGood: admission.lastKnownGood,
890
+ lifecycle: admission.lifecycle,
891
+ recovery: admission.recovery,
892
+ capability: admission.capability,
893
+ resourcePresent: admission.resource !== undefined,
894
+ transmissionDrawCount: demand.activeCount,
895
+ });
896
+ lastTransmissionKey = key;
897
+ };
712
898
  const gpuDrivenShaderFactory =
713
899
  internals.shaderModuleFactory ??
714
900
  ({
@@ -736,6 +922,19 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
736
922
  }),
737
923
  ),
738
924
  } satisfies import('./pipeline-builder').PipelineBuilderShaderModuleFactory),
925
+ getImmediateShaderModuleFactory: () =>
926
+ internals.immediateShaderModuleFactory ??
927
+ internals.shaderModuleFactory ??
928
+ ({
929
+ createShaderModule: () =>
930
+ err(
931
+ new RhiError({
932
+ code: 'rhi-not-available',
933
+ expected: 'the renderer backend exposes shader module creation',
934
+ hint: 'construct the renderer through the backend pack before activating GPU features',
935
+ }),
936
+ ),
937
+ } satisfies import('./pipeline-builder').PipelineBuilderShaderModuleFactory),
739
938
  });
740
939
  const disposeFeatureGpuWork = (): void => {
741
940
  const disposed = featureGpuWork.dispose();
@@ -756,12 +955,39 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
756
955
  // raw (material-handle-based, cross-world collision semantically correct).
757
956
  const frameState: RenderFrameState = {
758
957
  frameNumber: 0,
958
+ graphGeneration: 0,
959
+ successfulTemporalFrameIndex: 0,
960
+ lastSuccessfulBloom: 'off',
961
+ temporalFrameTransaction: createTemporalFrameTransaction({ deviceEpoch: 0 }),
962
+ temporalFrameInput: undefined,
759
963
  directionalShadowCache: null,
760
964
  directionalShadowCacheRecorded: false,
761
965
  compiledFrameGraph: null,
762
966
  compiledFrameGraphTopologyKey: null,
967
+ volumetricFogPreviousGraph: null,
968
+ volumetricFogPreviousGraphKey: null,
969
+ volumetricFogCandidateGraph: null,
970
+ volumetricFogParamsBuffers: [null, null],
971
+ volumetricFogParamsPendingSlot: null,
972
+ volumetricFogParamsAcceptedSlot: null,
973
+ volumetricFogAcceptedParams: undefined,
974
+ volumetricFogPendingParams: undefined,
975
+ volumetricFogInspection: inspectVolumetricFog({ authored: false, capability: 'available' }),
976
+ volumetricFogAccepted: undefined,
977
+ volumetricFogAcceptedContext: undefined,
978
+ volumetricFogHistoryGraph: null,
979
+ volumetricFogHistorySlot: null,
980
+ volumetricFogHistorySignature: null,
763
981
  retiredCompiledFrameGraphs: new Set(),
764
982
  currentFrameObservationSource: undefined,
983
+ lastSuccessfulCameraAntialias: undefined,
984
+ temporalGpuState: undefined,
985
+ activeTemporalGpuState: undefined,
986
+ retiringTemporalGpuStates: new Set(),
987
+ lastSuccessfulTemporalView: undefined,
988
+ pendingTemporalCommit: { kind: 'none' },
989
+ environmentGeneration: undefined,
990
+ environmentLifecycle,
765
991
  currentDirectionalShadowView: null,
766
992
  currentSpotShadowView: null,
767
993
  instanceBuffers: new Map(),
@@ -920,6 +1146,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
920
1146
  ...featureEntries.entries(),
921
1147
  ]);
922
1148
  for (const [id, entry] of declarations) {
1149
+ if (id === 'forgeax.taa-resolve') continue;
923
1150
  const byteSize =
924
1151
  entry.params?.byteSize ?? (entryHasDepthRead(entry) ? DEPTH_MIN_PARAMS_BYTE_SIZE : 0);
925
1152
  if (byteSize === 0 || postProcessParamsBuffers.has(id)) continue;
@@ -970,10 +1197,16 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
970
1197
  postProcessPipelineCache.set(key, built);
971
1198
  return built;
972
1199
  };
1200
+ const clearPostProcessPipelineCache = (id: string): void => {
1201
+ for (const key of postProcessPipelineCache.keys()) {
1202
+ if (key.startsWith(`${id}|`)) postProcessPipelineCache.delete(key);
1203
+ }
1204
+ };
973
1205
  Object.assign(internals, {
974
1206
  lookupPostProcess,
975
1207
  getPostProcessParamsBuffer,
976
1208
  getPostProcessPipeline,
1209
+ clearPostProcessPipelineCache,
977
1210
  });
978
1211
  // w15 M5 (plan-strategy D-P4 / AC-07): per-frame dispatch counters. Reset
979
1212
  // on every `draw([world], { cameraOwner: 0, resourceOwner: 0 })` entry; bumped once per actual `pass.setPipeline`
@@ -1121,42 +1354,20 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1121
1354
  if (buffer !== undefined) internals.device.destroyBuffer(buffer);
1122
1355
  return err(new Error('prepared material schema contains unsupported binding kinds'));
1123
1356
  }
1124
- for (let index = fields.length; index < 4; index += 1) {
1125
- const binding = derived.userRegionBindingEnd + (index - fields.length) * 2;
1126
- entries.push(
1127
- {
1128
- binding,
1129
- resource: { kind: 'sampler', value: pipelineState.defaultSampler },
1130
- },
1131
- {
1132
- binding: binding + 1,
1133
- resource: { kind: 'textureView', value: pipelineState.defaultWhiteTextureView },
1134
- },
1135
- );
1136
- }
1137
1357
  const fallback = pipelineState.skylightFallback;
1138
1358
  if (fallback === null) {
1139
1359
  if (buffer !== undefined) internals.device.destroyBuffer(buffer);
1140
1360
  return err(new Error('prepared material skylight fallback is unavailable'));
1141
1361
  }
1142
- const completeEntries = assembleMaterialWithSkylightEntries(
1143
- entries,
1144
- {
1145
- irradianceView: fallback.irradianceView,
1146
- irradianceSampler: fallback.sampler,
1147
- prefilterView: fallback.prefilterView,
1148
- prefilterSampler: fallback.sampler,
1149
- brdfLutView: fallback.brdfLutView,
1150
- brdfLutSampler: fallback.sampler,
1151
- intensityBuffer: fallback.intensityBuffer,
1152
- },
1153
- {
1154
- emissiveSampler: pipelineState.defaultSampler,
1155
- emissiveView: pipelineState.defaultWhiteTextureView,
1156
- occlusionSampler: pipelineState.defaultSampler,
1157
- occlusionView: pipelineState.defaultWhiteTextureView,
1158
- },
1159
- );
1362
+ const completeEntries = assembleMaterialWithSkylightEntries(entries, {
1363
+ irradianceView: fallback.irradianceView,
1364
+ irradianceSampler: fallback.sampler,
1365
+ prefilterView: fallback.prefilterView,
1366
+ prefilterSampler: fallback.sampler,
1367
+ brdfLutView: fallback.brdfLutView,
1368
+ brdfLutSampler: fallback.sampler,
1369
+ intensityBuffer: fallback.intensityBuffer,
1370
+ });
1160
1371
  const group = internals.device.createBindGroup({ layout, entries: completeEntries });
1161
1372
  if (!group.ok) {
1162
1373
  if (buffer !== undefined) internals.device.destroyBuffer(buffer);
@@ -1232,6 +1443,8 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1232
1443
  ? null
1233
1444
  : (descriptor.depthFormat as GPUTextureFormat),
1234
1445
  descriptor.vertexLayout,
1446
+ undefined,
1447
+ input.shaderModuleMode,
1235
1448
  );
1236
1449
  // A requested material shader is an exact pipeline contract. During
1237
1450
  // async shader warmup, substituting the generic unlit pipeline can
@@ -1367,6 +1580,98 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1367
1580
  gpuDriven: gpuDrivenProduction.inspect(),
1368
1581
  };
1369
1582
  },
1583
+ get environment(): EnvironmentInspection {
1584
+ return environmentLifecycle.inspect();
1585
+ },
1586
+ get temporal(): TemporalInspection {
1587
+ return inspectTemporal(frameState.lastSuccessfulTemporalView, undefined, {
1588
+ ...(frameState.activeTemporalGpuState === undefined
1589
+ ? {}
1590
+ : { active: frameState.activeTemporalGpuState }),
1591
+ ...(frameState.temporalGpuState === undefined
1592
+ ? {}
1593
+ : { candidate: frameState.temporalGpuState }),
1594
+ retiring: [...frameState.retiringTemporalGpuStates],
1595
+ deviceGeneration: internals.deviceScope.generation,
1596
+ });
1597
+ },
1598
+ get motionBlurInspection(): MotionBlurInspection | undefined {
1599
+ const camera = latestCamera;
1600
+ if (camera?.motionBlur === undefined) return undefined;
1601
+ const demanded = camera.motionBlur.shutterAngle > 0;
1602
+ const unavailable = demanded && !internals.device.caps.rgba16floatRenderable;
1603
+ const admitted =
1604
+ frameState.activeTemporalGpuState !== undefined ||
1605
+ frameState.temporalGpuState !== undefined;
1606
+ return {
1607
+ enabled: demanded,
1608
+ status: !demanded ? 'off' : unavailable || !admitted ? 'reset' : 'active',
1609
+ shutterAngle: camera.motionBlur.shutterAngle,
1610
+ maxRadiusPixels: camera.motionBlur.maxRadiusPixels,
1611
+ sampleCount: camera.motionBlur.sampleCount,
1612
+ temporalDemand: demanded ? 'scene-data-temporal-v1' : 'none',
1613
+ passName: 'motion-blur',
1614
+ historyWrites: 0,
1615
+ ...(unavailable ? { lastFailure: 'scene-data-unavailable' as const } : {}),
1616
+ };
1617
+ },
1618
+ get temporalTargetInspection(): TemporalTargetInspection | undefined {
1619
+ const graph = frameState.compiledFrameGraph?.inspect();
1620
+ if (graph === undefined) return undefined;
1621
+ const producer = graph.passes.find((pass) => pass.name === 'standard-scene-data');
1622
+ // The producer's semantic target is the graph-owned
1623
+ // `standard-scene-temporal` resource. Resolve it from the compiled
1624
+ // resource table rather than the pass access projection: a backend may
1625
+ // retain a view alias in the access list while the resource owner still
1626
+ // carries the canonical semantic label.
1627
+ const target = graph.resources.find(
1628
+ (resource) => resource.kind === 'texture' && resource.label === 'standard-scene-temporal',
1629
+ );
1630
+ if (producer === undefined || target === undefined) {
1631
+ return undefined;
1632
+ }
1633
+ const width = Math.max(1, internals.canvas.width);
1634
+ const height = Math.max(1, internals.canvas.height);
1635
+ return Object.freeze({
1636
+ identity: 'standard-scene-temporal',
1637
+ producerId: 'forgeax::standard::scene-data',
1638
+ schema: 'forgeax::scene-data::temporal-v1',
1639
+ targetCount: 1,
1640
+ descriptor: Object.freeze({
1641
+ format: 'rgba16float',
1642
+ width,
1643
+ height,
1644
+ sampleCount: 1,
1645
+ bytes: width * height * 8,
1646
+ }),
1647
+ });
1648
+ },
1649
+ get bloom(): BloomInspection {
1650
+ const pipelineState = internals.getPipelineState();
1651
+ const resources = pipelineState?.perPassResources;
1652
+ const lifecycle = resources?.inspectBloomResources?.(
1653
+ frameState.compiledFrameGraph?.inspect(),
1654
+ );
1655
+ return Object.freeze(
1656
+ lifecycle ?? {
1657
+ graphStatus: 'empty',
1658
+ enabled: false,
1659
+ targetCount: 0,
1660
+ targetBytes: 0,
1661
+ resourceCount: 0,
1662
+ passCount: 0,
1663
+ encodeCount: 0,
1664
+ bindGroupCount: 0,
1665
+ uploadCount: 0,
1666
+ residentChildBytes: 0,
1667
+ generation: 0,
1668
+ state: 'off',
1669
+ },
1670
+ );
1671
+ },
1672
+ get transmission(): TransmissionInspection | undefined {
1673
+ return lastTransmissionInspection;
1674
+ },
1370
1675
  get pointsLinesSnapshots(): readonly PointsLinesRetainedSnapshot[] {
1371
1676
  return persistentRenderScene.pointsLinesSnapshots();
1372
1677
  },
@@ -1377,6 +1682,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1377
1682
  worlds: readonly World[],
1378
1683
  opts: DrawOwnerOptions,
1379
1684
  renderReadLeases?: readonly RenderReadLease[],
1685
+ timingCapture?: GpuTimingCapture,
1380
1686
  ): boolean {
1381
1687
  preparedWorlds = worlds;
1382
1688
  const profileSession = internals.profiler?.activeSession();
@@ -1450,16 +1756,53 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1450
1756
  const {
1451
1757
  cameras,
1452
1758
  lights,
1759
+ environment,
1760
+ environmentReady,
1761
+ volumetricFog,
1453
1762
  renderables,
1454
1763
  dispatch,
1455
1764
  skylight,
1456
1765
  skylightCount,
1457
1766
  skybox,
1458
1767
  skyboxCount,
1768
+ fog,
1459
1769
  frustumStats,
1460
1770
  visibilityStats,
1461
1771
  postProcessParams,
1462
1772
  } = frame;
1773
+ latestCamera = cameras[0];
1774
+ const temporalDemanded =
1775
+ cameras[0]?.antialias === 'taa' || (cameras[0]?.motionBlur?.shutterAngle ?? 0) > 0;
1776
+ if (temporalDemanded) {
1777
+ persistentRenderScene.prepareTemporalFrame(renderables);
1778
+ }
1779
+ environmentLifecycle.bindScope(internals.deviceScope);
1780
+ if (!environmentReady || environment === undefined) {
1781
+ frameState.pendingTemporalCommit = { kind: 'none' };
1782
+ // A world with no camera still has a valid clear-only render path.
1783
+ // It has no environment candidate and therefore must not publish an
1784
+ // off/taa temporal state; camera-bearing rejected extraction remains
1785
+ // an atomic render failure.
1786
+ if (cameras.length > 0) return false;
1787
+ } else {
1788
+ const environmentCandidate = environmentLifecycle.ensure(environment);
1789
+ if (!environmentCandidate.ok) {
1790
+ environmentLifecycle.recordCandidateFailure(environmentCandidate.error);
1791
+ internals.errorRegistry.fire(environmentCandidate.error);
1792
+ return false;
1793
+ }
1794
+ if (!environmentLifecycle.isActive(environmentCandidate.value)) {
1795
+ frameState.environmentGeneration = environmentCandidate.value;
1796
+ }
1797
+ }
1798
+ const transmissionAntialias = frame.cameras[0]?.antialias ?? 'none';
1799
+ if (!prepareTransmissionCandidate(transmissionAntialias)) {
1800
+ // The candidate gate runs before bind-group preparation, graph
1801
+ // construction, and record/submit. A missing capability therefore
1802
+ // cannot publish or execute a transmission graph.
1803
+ updateTransmissionInspection(transmissionAntialias, false);
1804
+ return false;
1805
+ }
1463
1806
  if (lastMeshMaterialBindingFrame !== frame) {
1464
1807
  lastMeshMaterialBindingFrame = frame;
1465
1808
  lastMeshMaterialBindings = renderables.map((renderable) => ({
@@ -1530,6 +1873,9 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1530
1873
  targets: featureTargets,
1531
1874
  generation: internals.featureHost?.preparedGeneration ?? 0,
1532
1875
  caps: internals.device.caps,
1876
+ ...(internals.getMaterialShaderBindingContract === undefined
1877
+ ? {}
1878
+ : { materialShaderBindingContract: internals.getMaterialShaderBindingContract }),
1533
1879
  createPreparedGraphicsResolver: preparedResolverFactory,
1534
1880
  gpuWork: featureGpuWork,
1535
1881
  });
@@ -1605,6 +1951,9 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1605
1951
  }
1606
1952
  return runProfiledRenderPhase(profileSession, phase, action);
1607
1953
  };
1954
+ if (cameras[0]?.bloom === 'on') {
1955
+ internals.getPipelineState()?.perPassResources.ensureBloomResources?.();
1956
+ }
1608
1957
  submitted = runProfiledRenderPhase(profileSession, 'record', () =>
1609
1958
  recordFrame(
1610
1959
  internals,
@@ -1621,6 +1970,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1621
1970
  skybox,
1622
1971
  skyboxCount,
1623
1972
  postProcessParams,
1973
+ fog,
1624
1974
  worlds,
1625
1975
  recordProfilePhase,
1626
1976
  {
@@ -1634,8 +1984,38 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1634
1984
  renderReadLeases,
1635
1985
  featureGraphCandidate,
1636
1986
  pointsLinesOwner,
1987
+ environment?.environmentSignature ?? '',
1988
+ environment?.fogSignature ?? '',
1989
+ environmentReady && environment !== undefined,
1990
+ persistentRenderScene.transmissionTopologyDemand(),
1991
+ volumetricFog,
1992
+ timingCapture,
1637
1993
  ),
1638
1994
  );
1995
+ if (submitted) {
1996
+ const temporalCommit = persistentRenderScene.commitTemporalFrame();
1997
+ if (!temporalCommit.ok) {
1998
+ internals.errorRegistry.fire(temporalCommit.error);
1999
+ }
2000
+ frameState.lastSuccessfulCameraAntialias = cameras[0]?.antialias;
2001
+ internals.getPipelineState()?.perPassResources.commitBloomResources?.();
2002
+ const nextBloom = cameras[0]?.bloom ?? 'off';
2003
+ if (frameState.lastSuccessfulBloom === 'on' && nextBloom !== 'on') {
2004
+ internals
2005
+ .getPipelineState()
2006
+ ?.perPassResources.retireBloomResources?.(
2007
+ internals.device.queue.onSubmittedWorkDone(),
2008
+ );
2009
+ }
2010
+ frameState.lastSuccessfulBloom = nextBloom;
2011
+ } else {
2012
+ internals.getPipelineState()?.perPassResources.discardBloomResources?.();
2013
+ }
2014
+ if (!submitted && frameState.environmentGeneration !== undefined) {
2015
+ environmentLifecycle.discard(frameState.environmentGeneration);
2016
+ frameState.environmentGeneration = undefined;
2017
+ }
2018
+ updateTransmissionInspection(transmissionAntialias, submitted);
1639
2019
  persistentRenderScene.setPointsLinesInspections(pointsLinesOwner.inspections());
1640
2020
  if (internals.featureHost !== undefined && preparedResourceBatches.length > 0) {
1641
2021
  const batches = preparedResourceBatches;
@@ -1653,10 +2033,20 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1653
2033
  }
1654
2034
  }
1655
2035
  } catch (err) {
2036
+ if (!submitted) {
2037
+ internals.getPipelineState()?.perPassResources.discardBloomResources?.();
2038
+ }
1656
2039
  const innerError =
1657
- err instanceof RhiError
1658
- ? err
1659
- : { code: 'unknown' as const, message: String(err), name: (err as Error)?.name };
2040
+ err instanceof PipelineSpecError
2041
+ ? {
2042
+ name: err.name,
2043
+ code: err.code,
2044
+ message: err.message,
2045
+ detail: err.detail,
2046
+ }
2047
+ : err instanceof RhiError
2048
+ ? err
2049
+ : { code: 'unknown' as const, message: String(err), name: (err as Error)?.name };
1660
2050
  internals.errorRegistry.fire(
1661
2051
  new RhiError({
1662
2052
  code: 'webgpu-runtime-error',
@@ -1681,7 +2071,39 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1681
2071
  const currentFrameId = frameState.frameNumber - 1;
1682
2072
  return observeCurrentFrame(options, frameState.currentFrameObservationSource, currentFrameId);
1683
2073
  },
2074
+ getCurrentGraphTarget(name: string) {
2075
+ const graph = frameState.perFrameGraph;
2076
+ if (graph === undefined || graph === null) return undefined;
2077
+ const descriptor = graph.getColorTargetDescriptor(name);
2078
+ const texture = graph.getColorTargetTexture(name);
2079
+ if (descriptor === undefined || texture === undefined) return undefined;
2080
+ return {
2081
+ name,
2082
+ texture,
2083
+ textureIdentity: getTextureIdentity(texture),
2084
+ descriptor,
2085
+ frameId: frameState.frameNumber - 1,
2086
+ graphGeneration: graph.graphGeneration,
2087
+ };
2088
+ },
2089
+ requestGraphTargetCapture(request: GraphTargetCaptureRequest) {
2090
+ frameState.graphTargetCapture = request;
2091
+ },
1684
2092
  bindGroupCounts: bindGroupCounts,
2093
+ get temporalFrame(): TemporalFrame | undefined {
2094
+ const accepted = frameState.temporalFrame;
2095
+ if (accepted === undefined) return undefined;
2096
+ return {
2097
+ ...accepted,
2098
+ currentViewProjection: new Float32Array(accepted.currentViewProjection),
2099
+ previousViewProjection:
2100
+ accepted.previousViewProjection === undefined
2101
+ ? undefined
2102
+ : new Float32Array(accepted.previousViewProjection),
2103
+ jitter: [accepted.jitter[0], accepted.jitter[1]],
2104
+ viewport: { ...accepted.viewport },
2105
+ };
2106
+ },
1685
2107
  frustumStats: lastFrustumStats,
1686
2108
  visibilityStats: lastVisibilityStats,
1687
2109
  get meshMaterialBindings(): readonly MeshMaterialBindingObservation[] {
@@ -1690,6 +2112,15 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1690
2112
  get perFramePassNames(): readonly string[] {
1691
2113
  return frameState.compiledFrameGraph?.inspect().passes.map((pass) => pass.name) ?? [];
1692
2114
  },
2115
+ get lastSuccessfulCameraAntialias(): CameraSnapshot['antialias'] | undefined {
2116
+ return frameState.lastSuccessfulCameraAntialias;
2117
+ },
2118
+ get perFrameGraphInfo(): CompiledRenderGraphInfo | undefined {
2119
+ return frameState.compiledFrameGraph?.inspect();
2120
+ },
2121
+ get volumetricFog(): import('./volume/inspection').VolumetricFogInspection {
2122
+ return frameState.volumetricFogInspection;
2123
+ },
1693
2124
  configureStandard(config: RenderPipelineAsset['config']): void {
1694
2125
  const profileConfig = internals.standardProfile;
1695
2126
  const resolvedConfig =
@@ -1723,7 +2154,16 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1723
2154
  // is a rare boot/swap event, never a per-frame cost.
1724
2155
  installEpoch += 1;
1725
2156
  frameState.installedPipelineHandle = installEpoch;
1726
- frameState.isHdrpActive = resolvedConfig?.clusterGrid !== undefined;
2157
+ // The installed profile may request clustered lighting, but the actual
2158
+ // graph lane is capability-gated. On WebGL2 (including WebKit's wgpu
2159
+ // fallback) the forward lane is selected when compute/storage buffers
2160
+ // are unavailable; keep the frame bindings on that same lane instead of
2161
+ // advertising HDRP's clustered bind-group layout to URP pipelines.
2162
+ frameState.isHdrpActive =
2163
+ resolveStandardLane(internals.standardProfile ?? DEFAULT_STANDARD_PROFILE, {
2164
+ compute: internals.device.caps.compute,
2165
+ storageBuffer: internals.device.caps.storageBuffer,
2166
+ }) === 'clustered';
1727
2167
  frameState.installedPipelineConfig = resolvedConfig;
1728
2168
  },
1729
2169
  registerBuiltinPostProcess(id: string, entry: PostProcessShaderEntry): () => void {
@@ -1731,7 +2171,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1731
2171
  // byteSize / defaultValue validation (q5=A).
1732
2172
  let paramsBuffer: Buffer | undefined;
1733
2173
  try {
1734
- if (entry.params !== undefined) {
2174
+ if (id !== 'forgeax.taa-resolve' && entry.params !== undefined) {
1735
2175
  const { byteSize, defaultValue } = entry.params;
1736
2176
  if (byteSize < 16 || defaultValue.length !== byteSize) {
1737
2177
  throw new PostProcessError({
@@ -1749,7 +2189,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1749
2189
  paramsBuffer = paramsBufferResult.value;
1750
2190
  const writeResult = internals.device.queue.writeBuffer(paramsBuffer, 0, defaultValue);
1751
2191
  if (!writeResult.ok) throw writeResult.error;
1752
- } else if (entryHasDepthRead(entry)) {
2192
+ } else if (id !== 'forgeax.taa-resolve' && entryHasDepthRead(entry)) {
1753
2193
  const paramsBufferResult = internals.device.createBuffer({
1754
2194
  label: `post-process-params-${id}`,
1755
2195
  size: DEPTH_MIN_PARAMS_BYTE_SIZE,
@@ -1789,6 +2229,13 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1789
2229
  persistentRenderScene.dispose();
1790
2230
  gpuDrivenProduction.dispose();
1791
2231
  disposeFeatureGpuWork();
2232
+ // Bloom generations are renderer-owned rather than graph-owned. Drain
2233
+ // candidate, active, and fence-retiring bundles before the rest of the
2234
+ // frame state is torn down; the owner callback is idempotent so the
2235
+ // outer Renderer.dispose cascade can safely call this once only.
2236
+ internals.getPipelineState()?.perPassResources.drainBloomResources?.();
2237
+ internals.clearPostProcessPipelineCache?.('forgeax.taa-resolve');
2238
+ internals.invalidateShaderModule?.('post-process-forgeax.taa-resolve-module');
1792
2239
  // Retire graph-owned resources and dispose instance-buffer caches.
1793
2240
  // Both calls are idempotent + tolerate per-handle errors silently;
1794
2241
  // the Renderer.dispose() cascade owns the surrounding try/catch
@@ -1798,8 +2245,37 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1798
2245
  frameState.directionalShadowCache = null;
1799
2246
  frameState.directionalShadowCacheRecorded = false;
1800
2247
  frameState.currentFrameObservationSource = undefined;
2248
+ frameState.lastSuccessfulCameraAntialias = undefined;
1801
2249
  frameState.currentDirectionalShadowView = null;
1802
2250
  frameState.currentSpotShadowView = null;
2251
+ if (frameState.temporalGpuState !== undefined) {
2252
+ retireTemporalGpuState(frameState.temporalGpuState);
2253
+ frameState.temporalGpuState = undefined;
2254
+ }
2255
+ if (frameState.activeTemporalGpuState !== undefined) {
2256
+ retireTemporalGpuState(frameState.activeTemporalGpuState);
2257
+ frameState.activeTemporalGpuState = undefined;
2258
+ }
2259
+ for (const retiring of frameState.retiringTemporalGpuStates) {
2260
+ retireTemporalGpuState(retiring);
2261
+ }
2262
+ frameState.retiringTemporalGpuStates.clear();
2263
+ settleVolumetricFogGraphCandidate(frameState, false);
2264
+ for (const buffer of frameState.volumetricFogParamsBuffers) {
2265
+ if (buffer === null) continue;
2266
+ const destroyed = internals.device.destroyBuffer(buffer);
2267
+ if (!destroyed.ok) internals.errorRegistry.fire(destroyed.error);
2268
+ }
2269
+ frameState.volumetricFogParamsBuffers = [null, null];
2270
+ frameState.volumetricFogParamsPendingSlot = null;
2271
+ frameState.volumetricFogParamsAcceptedSlot = null;
2272
+ frameState.volumetricFogAcceptedParams = undefined;
2273
+ frameState.volumetricFogPendingParams = undefined;
2274
+ frameState.volumetricFogAccepted = undefined;
2275
+ frameState.volumetricFogAcceptedContext = undefined;
2276
+ frameState.volumetricFogHistoryGraph = null;
2277
+ frameState.volumetricFogHistorySlot = null;
2278
+ frameState.volumetricFogHistorySignature = null;
1803
2279
  const compiled = frameState.compiledFrameGraph;
1804
2280
  frameState.compiledFrameGraph = null;
1805
2281
  frameState.compiledFrameGraphTopologyKey = null;
@@ -1833,23 +2309,66 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1833
2309
  }
1834
2310
  },
1835
2311
  resetForRecover(): void {
2312
+ transmissionAdmission.markDeviceLost();
2313
+ lastTransmissionKey = '';
2314
+ transmissionCapabilityGeneration = -1;
2315
+ transmissionCapability = undefined;
2316
+ // Keep the persistent material demand observable across device loss.
2317
+ // The physical resource has already been fenced by markDeviceLost(); the
2318
+ // detached inspection now exposes the rebuild-required lifecycle until a
2319
+ // completed frame admits the replacement resource.
2320
+ updateTransmissionInspection(lastTransmissionAntialias, false);
1836
2321
  persistentRenderScene.resetGpuForRecover();
1837
2322
  gpuDrivenProduction.dispose();
1838
2323
  gpuDrivenProduction = new GpuDrivenProduction(internals.device, gpuDrivenShaderFactory);
1839
2324
  disposeFeatureGpuWork();
2325
+ // A recovered device cannot retain handles from the lost device. The
2326
+ // Bloom owner abandons candidates and retires every committed generation
2327
+ // before the new PipelineState is rebuilt.
2328
+ internals.getPipelineState()?.perPassResources.drainBloomResources?.();
1840
2329
  // feat-20260622-s5 M3 / B-2 / w18: recover() rebuild drops device-bound
1841
2330
  // state minted by the lost device. The active graph and per-entity caches
1842
2331
  // must be discarded, not merely marked for destruction: their opaque
1843
2332
  // handles cannot be used on the fresh device and the next draw must
1844
2333
  // lazily build a new graph from the preserved ECS / asset POD caches.
2334
+ settleVolumetricFogGraphCandidate(frameState, false);
1845
2335
  frameState.compiledFrameGraph?.retire().catch(() => undefined);
1846
2336
  frameState.compiledFrameGraph = null;
1847
2337
  frameState.compiledFrameGraphTopologyKey = null;
2338
+ frameState.volumetricFogPreviousGraph = null;
2339
+ frameState.volumetricFogPreviousGraphKey = null;
2340
+ frameState.volumetricFogCandidateGraph = null;
2341
+ frameState.volumetricFogAccepted = undefined;
2342
+ frameState.volumetricFogAcceptedContext = undefined;
2343
+ frameState.volumetricFogHistoryGraph = null;
2344
+ frameState.volumetricFogHistorySlot = null;
2345
+ frameState.volumetricFogHistorySignature = null;
2346
+ // The old device owns these transient params buffers. Discard their
2347
+ // handles without calling destroy() on the lost device; the next frame
2348
+ // must allocate fresh buffers on the replacement device.
2349
+ frameState.volumetricFogParamsBuffers = [null, null];
2350
+ frameState.volumetricFogParamsPendingSlot = null;
2351
+ frameState.volumetricFogParamsAcceptedSlot = null;
2352
+ frameState.volumetricFogAcceptedParams = undefined;
2353
+ frameState.volumetricFogPendingParams = undefined;
1848
2354
  frameState.directionalShadowCache = null;
1849
2355
  frameState.directionalShadowCacheRecorded = false;
1850
2356
  frameState.currentFrameObservationSource = undefined;
2357
+ frameState.lastSuccessfulCameraAntialias = undefined;
1851
2358
  frameState.currentDirectionalShadowView = null;
1852
2359
  frameState.currentSpotShadowView = null;
2360
+ if (frameState.temporalGpuState !== undefined) {
2361
+ retireTemporalGpuState(frameState.temporalGpuState);
2362
+ frameState.temporalGpuState = undefined;
2363
+ }
2364
+ if (frameState.activeTemporalGpuState !== undefined) {
2365
+ retireTemporalGpuState(frameState.activeTemporalGpuState);
2366
+ frameState.activeTemporalGpuState = undefined;
2367
+ }
2368
+ for (const retiring of frameState.retiringTemporalGpuStates) {
2369
+ retireTemporalGpuState(retiring);
2370
+ }
2371
+ frameState.retiringTemporalGpuStates.clear();
1853
2372
  for (const retired of frameState.retiredCompiledFrameGraphs) {
1854
2373
  retired.retire().catch(() => undefined);
1855
2374
  }
@@ -1886,6 +2405,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1886
2405
  ...activeFeaturePostProcessEntries.entries(),
1887
2406
  ];
1888
2407
  for (const [id, entry] of declarations) {
2408
+ if (id === 'forgeax.taa-resolve') continue;
1889
2409
  let buffer: Buffer | undefined;
1890
2410
  if (entry.params !== undefined) {
1891
2411
  const created = internals.device.createBuffer({