@forgeax/engine-render 0.1.7 → 0.1.19

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 (683) 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 +12 -2
  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-FJ6P52EE.mjs +46 -0
  18. package/dist/chunk-FJ6P52EE.mjs.map +1 -0
  19. package/dist/chunk-IPXCABEP.mjs +73 -0
  20. package/dist/chunk-IPXCABEP.mjs.map +1 -0
  21. package/dist/chunk-JDWARUOI.mjs +44 -0
  22. package/dist/chunk-JDWARUOI.mjs.map +1 -0
  23. package/dist/{chunk-YEJIUW7D.mjs → chunk-LOSO4CTV.mjs} +296 -547
  24. package/dist/chunk-LOSO4CTV.mjs.map +1 -0
  25. package/dist/chunk-PCHBPYML.mjs +385 -0
  26. package/dist/chunk-PCHBPYML.mjs.map +1 -0
  27. package/dist/chunk-RJRUS55L.mjs +9323 -0
  28. package/dist/chunk-RJRUS55L.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-CQXZC5XI.mjs → chunk-VFPLTKCU.mjs} +79 -69
  32. package/dist/chunk-VFPLTKCU.mjs.map +1 -0
  33. package/dist/chunk-YTQ5C7YQ.mjs +584 -0
  34. package/dist/chunk-YTQ5C7YQ.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/motion-blur.d.ts +7 -0
  44. package/dist/components/motion-blur.d.ts.map +1 -0
  45. package/dist/construct-renderer.d.ts +2 -2
  46. package/dist/construct-renderer.d.ts.map +1 -1
  47. package/dist/construct-renderer.mjs +10914 -16392
  48. package/dist/construct-renderer.mjs.map +1 -1
  49. package/dist/device/device-scope.d.ts +4 -0
  50. package/dist/device/device-scope.d.ts.map +1 -1
  51. package/dist/environment/frame.d.ts +60 -0
  52. package/dist/environment/frame.d.ts.map +1 -0
  53. package/dist/environment/generation.d.ts +21 -0
  54. package/dist/environment/generation.d.ts.map +1 -0
  55. package/dist/environment/graph.d.ts +4 -0
  56. package/dist/environment/graph.d.ts.map +1 -0
  57. package/dist/environment/inspection.d.ts +48 -0
  58. package/dist/environment/inspection.d.ts.map +1 -0
  59. package/dist/environment/lifecycle.d.ts +39 -0
  60. package/dist/environment/lifecycle.d.ts.map +1 -0
  61. package/dist/environment/signature.d.ts +25 -0
  62. package/dist/environment/signature.d.ts.map +1 -0
  63. package/dist/errors/render.d.ts +136 -1
  64. package/dist/errors/render.d.ts.map +1 -1
  65. package/dist/extract/camera.d.ts +5 -0
  66. package/dist/extract/camera.d.ts.map +1 -0
  67. package/dist/extract/environment.d.ts +74 -0
  68. package/dist/extract/environment.d.ts.map +1 -0
  69. package/dist/extract/visibility.d.ts +1 -1
  70. package/dist/extract/visibility.d.ts.map +1 -1
  71. package/dist/features/host.d.ts +9 -2
  72. package/dist/features/host.d.ts.map +1 -1
  73. package/dist/features/motion-blur/motion-blur-feature.d.ts +16 -0
  74. package/dist/features/motion-blur/motion-blur-feature.d.ts.map +1 -0
  75. package/dist/features/motion-blur/motion-blur-params.d.ts +25 -0
  76. package/dist/features/motion-blur/motion-blur-params.d.ts.map +1 -0
  77. package/dist/features/plan.d.ts +17 -2
  78. package/dist/features/plan.d.ts.map +1 -1
  79. package/dist/features/prepared-gpu-work.d.ts +3 -1
  80. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  81. package/dist/features/prepared-graphics.d.ts +2 -1
  82. package/dist/features/prepared-graphics.d.ts.map +1 -1
  83. package/dist/features/render-graph-raster.d.ts +2 -1
  84. package/dist/features/render-graph-raster.d.ts.map +1 -1
  85. package/dist/features/targets.d.ts +3 -0
  86. package/dist/features/targets.d.ts.map +1 -1
  87. package/dist/features/types.d.ts +12 -0
  88. package/dist/features/types.d.ts.map +1 -1
  89. package/dist/fullscreen-post-process-pass.d.ts +7 -1
  90. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  91. package/dist/gpu-scene.d.ts +2 -0
  92. package/dist/gpu-scene.d.ts.map +1 -1
  93. package/dist/ibl/skylight-bind-group.d.ts +5 -6
  94. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  95. package/dist/index.d.ts +17 -6
  96. package/dist/index.d.ts.map +1 -1
  97. package/dist/index.mjs +6 -4
  98. package/dist/index.mjs.map +1 -1
  99. package/dist/inspection-types.d.ts +43 -1
  100. package/dist/inspection-types.d.ts.map +1 -1
  101. package/dist/internal.d.ts +2 -0
  102. package/dist/internal.d.ts.map +1 -1
  103. package/dist/internal.mjs +2 -0
  104. package/dist/materials.d.ts +22 -0
  105. package/dist/materials.d.ts.map +1 -1
  106. package/dist/pbr-pipeline.d.ts +10 -6
  107. package/dist/pbr-pipeline.d.ts.map +1 -1
  108. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  109. package/dist/pipeline/standard-pipeline.d.ts +3 -0
  110. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  111. package/dist/pipeline/standard-post.d.ts +48 -0
  112. package/dist/pipeline/standard-post.d.ts.map +1 -0
  113. package/dist/pipeline/standard-profile.d.ts +3 -6
  114. package/dist/pipeline/standard-profile.d.ts.map +1 -1
  115. package/dist/pipeline-builder.d.ts +18 -0
  116. package/dist/pipeline-builder.d.ts.map +1 -1
  117. package/dist/pipeline-spec.d.ts.map +1 -1
  118. package/dist/plugin.d.ts.map +1 -1
  119. package/dist/record/frame-snapshot.d.ts +100 -5
  120. package/dist/record/frame-snapshot.d.ts.map +1 -1
  121. package/dist/record/frame-targets.d.ts.map +1 -1
  122. package/dist/record/frame.d.ts +4 -2
  123. package/dist/record/frame.d.ts.map +1 -1
  124. package/dist/record/main-pass-geometry.d.ts +11 -0
  125. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  126. package/dist/record/main-pass-material.d.ts +8 -5
  127. package/dist/record/main-pass-material.d.ts.map +1 -1
  128. package/dist/record/main-pass-sprite-draws.d.ts +8 -1
  129. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  130. package/dist/record/main-pass.d.ts +2 -0
  131. package/dist/record/main-pass.d.ts.map +1 -1
  132. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  133. package/dist/record/render-context.d.ts +76 -18
  134. package/dist/record/render-context.d.ts.map +1 -1
  135. package/dist/record/shadow-pass.d.ts.map +1 -1
  136. package/dist/record/skybox-post-pass.d.ts +1 -11
  137. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  138. package/dist/record/typed-frame-graph.d.ts +26 -2
  139. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  140. package/dist/record/view-ubo.d.ts +4 -1
  141. package/dist/record/view-ubo.d.ts.map +1 -1
  142. package/dist/render-contract.d.ts +92 -8
  143. package/dist/render-contract.d.ts.map +1 -1
  144. package/dist/render-graph-primitives.d.ts.map +1 -1
  145. package/dist/render-pipeline.d.ts +50 -6
  146. package/dist/render-pipeline.d.ts.map +1 -1
  147. package/dist/render-system-extract.d.ts +29 -5
  148. package/dist/render-system-extract.d.ts.map +1 -1
  149. package/dist/render-system.d.ts +23 -4
  150. package/dist/render-system.d.ts.map +1 -1
  151. package/dist/scene/render-scene.d.ts +36 -2
  152. package/dist/scene/render-scene.d.ts.map +1 -1
  153. package/dist/temporal/coverage.d.ts +42 -0
  154. package/dist/temporal/coverage.d.ts.map +1 -0
  155. package/dist/temporal/frame-coordinator.d.ts +99 -0
  156. package/dist/temporal/frame-coordinator.d.ts.map +1 -0
  157. package/dist/temporal/gpu.d.ts +39 -0
  158. package/dist/temporal/gpu.d.ts.map +1 -0
  159. package/dist/temporal/history.d.ts +37 -0
  160. package/dist/temporal/history.d.ts.map +1 -0
  161. package/dist/temporal/index.d.ts +7 -0
  162. package/dist/temporal/index.d.ts.map +1 -0
  163. package/dist/temporal/index.mjs +8 -0
  164. package/dist/temporal/index.mjs.map +1 -0
  165. package/dist/temporal/inspection.d.ts +36 -0
  166. package/dist/temporal/inspection.d.ts.map +1 -0
  167. package/dist/temporal/scene-data-catalog.d.ts +48 -0
  168. package/dist/temporal/scene-data-catalog.d.ts.map +1 -0
  169. package/dist/temporal/scene-data.d.ts +43 -0
  170. package/dist/temporal/scene-data.d.ts.map +1 -0
  171. package/dist/temporal/standard-scene-data.d.ts +61 -0
  172. package/dist/temporal/standard-scene-data.d.ts.map +1 -0
  173. package/dist/temporal/taa-history-resources.d.ts +22 -0
  174. package/dist/temporal/taa-history-resources.d.ts.map +1 -0
  175. package/dist/temporal/taa-history-store.d.ts +27 -0
  176. package/dist/temporal/taa-history-store.d.ts.map +1 -0
  177. package/dist/temporal/taa-resolve.d.ts +15 -0
  178. package/dist/temporal/taa-resolve.d.ts.map +1 -0
  179. package/dist/temporal/temporal-view.d.ts +40 -0
  180. package/dist/temporal/temporal-view.d.ts.map +1 -0
  181. package/dist/temporal/transaction.d.ts +9 -0
  182. package/dist/temporal/transaction.d.ts.map +1 -0
  183. package/dist/temporal/view.d.ts +56 -0
  184. package/dist/temporal/view.d.ts.map +1 -0
  185. package/dist/transmission/backdrop.d.ts +147 -0
  186. package/dist/transmission/backdrop.d.ts.map +1 -0
  187. package/dist/transmission/inspection.d.ts +57 -0
  188. package/dist/transmission/inspection.d.ts.map +1 -0
  189. package/dist/transmission/oracle.d.ts +42 -0
  190. package/dist/transmission/oracle.d.ts.map +1 -0
  191. package/dist/transmission/projection.d.ts +37 -0
  192. package/dist/transmission/projection.d.ts.map +1 -0
  193. package/dist/typed-render-graph-primitives.d.ts +25 -2
  194. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  195. package/package.json +24 -19
  196. package/src/__tests__/ai-user-cold-start.integration.test.ts +59 -0
  197. package/src/__tests__/ai-user-public-surface.test-d.ts +45 -0
  198. package/src/__tests__/bloom-exact-zero.unit.test.ts +202 -0
  199. package/src/__tests__/bloom-lifecycle.integration.test.ts +125 -0
  200. package/src/__tests__/construct-renderer-identity.unit.test.ts +4 -3
  201. package/src/__tests__/detached-inspection.integration.test.ts +177 -0
  202. package/src/__tests__/environment-fog-lanes.integration.test.ts +219 -0
  203. package/src/__tests__/environment-generation.integration.test.ts +141 -0
  204. package/src/__tests__/environment-selection.unit.test.ts +245 -0
  205. package/src/__tests__/factory-contract.integration.test.ts +1380 -9
  206. package/src/__tests__/frame-plan-contract.unit.test.ts +90 -0
  207. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +7 -0
  208. package/src/__tests__/gpu-driven-production.integration.test.ts +74 -22
  209. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +37 -0
  210. package/src/__tests__/gpu-scene.unit.test.ts +10 -0
  211. package/src/__tests__/injection-kind-owner.test-d.ts +2 -1
  212. package/src/__tests__/material-contract-inventory.unit.test.ts +62 -0
  213. package/src/__tests__/material-cooked-projection.unit.test.ts +18 -146
  214. package/src/__tests__/materials-transmission-validation.unit.test.ts +36 -0
  215. package/src/__tests__/morph-feature-plan.unit.test.ts +7 -0
  216. package/src/__tests__/motion-blur.pixel.integration.test.ts +121 -0
  217. package/src/__tests__/public-surface.test-d.ts +15 -1
  218. package/src/__tests__/render-error-code-owner.test-d.ts +9 -0
  219. package/src/__tests__/render-error-detail-ssot.test-d.ts +11 -2
  220. package/src/__tests__/render-error-exhaustive.test-d.ts +3 -0
  221. package/src/__tests__/render-feature-errors.unit.test.ts +33 -3
  222. package/src/__tests__/render-feature-gpu-work.integration.test.ts +44 -0
  223. package/src/__tests__/render-feature-plan.test-d.ts +22 -89
  224. package/src/__tests__/render-scene-projection.unit.test.ts +28 -0
  225. package/src/__tests__/render-temporal-environment-consumer.browser.test.ts +26 -0
  226. package/src/__tests__/render-temporal-environment-consumer.dawn.test.ts +21 -0
  227. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +395 -1
  228. package/src/__tests__/renderer-frame-transaction.integration.test.ts +405 -0
  229. package/src/__tests__/renderer-lifecycle.integration.test.ts +22 -0
  230. package/src/__tests__/scene-data-catalog.unit.test.ts +59 -0
  231. package/src/__tests__/scene-data-consumer.integration.test.ts +67 -0
  232. package/src/__tests__/scene-data-contract.test-d.ts +35 -0
  233. package/src/__tests__/scene-data-inspection.unit.test.ts +41 -0
  234. package/src/__tests__/scene-data-public-surface.test-d.ts +34 -0
  235. package/src/__tests__/shader-manifest-fixture.ts +111 -0
  236. package/src/__tests__/skinned-shadow-caster.test.ts +102 -0
  237. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +24 -3
  238. package/src/__tests__/standard-pipeline.dawn.test.ts +15 -0
  239. package/src/__tests__/standard-pipeline.integration.test.ts +543 -1
  240. package/src/__tests__/standard-profile-oracle.unit.test.ts +10 -2
  241. package/src/__tests__/standard-temporal-producer.integration.test.ts +35 -0
  242. package/src/__tests__/surface-configuration.unit.test.ts +211 -12
  243. package/src/__tests__/taa-transaction.integration.test.ts +30 -0
  244. package/src/__tests__/temporal-admission.integration.test.ts +40 -0
  245. package/src/__tests__/temporal-coverage.unit.test.ts +35 -0
  246. package/src/__tests__/temporal-demand.unit.test.ts +44 -0
  247. package/src/__tests__/temporal-frame-coordinator.unit.test.ts +64 -0
  248. package/src/__tests__/temporal-graph-topology.unit.test.ts +51 -0
  249. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +170 -0
  250. package/src/__tests__/temporal-performance.integration.test.ts +615 -0
  251. package/src/__tests__/temporal-reset-matrix.unit.test.ts +97 -0
  252. package/src/__tests__/temporal-transaction.integration.test.ts +60 -0
  253. package/src/__tests__/temporal-view.unit.test.ts +152 -0
  254. package/src/__tests__/transmission-prewarm.unit.test.ts +93 -0
  255. package/src/__tests__/typed-pipeline-topology.unit.test.ts +230 -1
  256. package/src/__tests__/urp-pipeline-targets.unit.test.ts +25 -1
  257. package/src/__tests__/urp-pipeline.unit.test.ts +4 -3
  258. package/src/__tests__/visibility-extract.integration.test.ts +27 -1
  259. package/src/__tests__/visibility-producer-matrix.integration.test.ts +10 -0
  260. package/src/assembly/backend-contract.ts +47 -1
  261. package/src/assembly/factory.ts +1224 -505
  262. package/src/assembly/host-contract.ts +4 -0
  263. package/src/assembly/renderer-frame-transaction.ts +75 -0
  264. package/src/assembly/renderer-inspection.ts +112 -0
  265. package/src/assembly/renderer-lifecycle.ts +6 -0
  266. package/src/components/__tests__/motion-blur.unit.test.ts +14 -0
  267. package/src/components/__tests__/schema-contract.unit.test.ts +6 -1
  268. package/src/components/atmosphere.ts +10 -0
  269. package/src/components/camera.ts +2 -1
  270. package/src/components/fog.ts +9 -0
  271. package/src/components/index.ts +3 -0
  272. package/src/components/motion-blur.ts +8 -0
  273. package/src/construct-renderer.ts +40 -3
  274. package/src/device/device-scope.ts +15 -1
  275. package/src/environment/frame.ts +185 -0
  276. package/src/environment/generation.ts +23 -0
  277. package/src/environment/graph.ts +9 -0
  278. package/src/environment/inspection.ts +87 -0
  279. package/src/environment/lifecycle.ts +250 -0
  280. package/src/environment/signature.ts +55 -0
  281. package/src/errors/render.ts +285 -0
  282. package/src/extract/camera.ts +78 -0
  283. package/src/extract/environment.ts +171 -0
  284. package/src/extract/visibility.ts +38 -19
  285. package/src/features/host.ts +36 -5
  286. package/src/features/motion-blur/__tests__/motion-blur-feature.unit.test.ts +67 -0
  287. package/src/features/motion-blur/__tests__/motion-blur-params.unit.test.ts +53 -0
  288. package/src/features/motion-blur/motion-blur-feature.ts +119 -0
  289. package/src/features/motion-blur/motion-blur-params.ts +89 -0
  290. package/src/features/plan.ts +32 -3
  291. package/src/features/prepared-gpu-work.ts +21 -6
  292. package/src/features/prepared-graphics.ts +2 -1
  293. package/src/features/render-graph-raster.ts +2 -1
  294. package/src/features/targets.ts +24 -2
  295. package/src/features/types.ts +13 -0
  296. package/src/fullscreen-post-process-pass.ts +34 -4
  297. package/src/gpu-scene.ts +24 -0
  298. package/src/ibl/skylight-bind-group.ts +30 -38
  299. package/src/index.ts +66 -6
  300. package/src/inspection-types.ts +48 -0
  301. package/src/internal.ts +5 -0
  302. package/src/materials.ts +119 -24
  303. package/src/pbr-pipeline.ts +58 -19
  304. package/src/pipeline/standard-forward-lane.ts +158 -101
  305. package/src/pipeline/standard-pipeline.ts +156 -105
  306. package/src/pipeline/standard-post.ts +373 -0
  307. package/src/pipeline/standard-profile.ts +11 -11
  308. package/src/pipeline-builder.ts +102 -12
  309. package/src/pipeline-spec.ts +9 -0
  310. package/src/plugin.ts +2 -0
  311. package/src/record/__tests__/fullscreen-temporal-routing.unit.test.ts +25 -0
  312. package/src/record/__tests__/main-pass-geometry.unit.test.ts +47 -0
  313. package/src/record/__tests__/material-bg-cache.unit.test.ts +12 -1
  314. package/src/record/__tests__/material-pipeline-pending-cache.unit.test.ts +22 -0
  315. package/src/record/__tests__/sprite-material-abi.unit.test.ts +75 -0
  316. package/src/record/__tests__/standard-pbr-ubo-layout.unit.test.ts +67 -0
  317. package/src/record/__tests__/temporal-payload.unit.test.ts +164 -0
  318. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +127 -0
  319. package/src/record/frame-snapshot.ts +129 -5
  320. package/src/record/frame-targets.ts +15 -6
  321. package/src/record/frame.ts +107 -3
  322. package/src/record/main-pass-geometry.ts +86 -40
  323. package/src/record/main-pass-material.ts +114 -66
  324. package/src/record/main-pass-sprite-draws.ts +78 -101
  325. package/src/record/main-pass.ts +77 -4
  326. package/src/record/mesh-ssbo.ts +22 -3
  327. package/src/record/render-context.ts +189 -23
  328. package/src/record/shadow-pass.ts +113 -23
  329. package/src/record/skybox-post-pass.ts +97 -41
  330. package/src/record/typed-frame-graph.ts +565 -26
  331. package/src/record/view-ubo.ts +52 -4
  332. package/src/render-contract.ts +109 -6
  333. package/src/render-graph-primitives.ts +18 -1
  334. package/src/render-pipeline.ts +100 -27
  335. package/src/render-system-extract.ts +193 -69
  336. package/src/render-system.ts +482 -41
  337. package/src/scene/render-scene.ts +250 -7
  338. package/src/temporal/__tests__/taa-history-resources.unit.test.ts +45 -0
  339. package/src/temporal/coverage.ts +76 -0
  340. package/src/temporal/frame-coordinator.ts +311 -0
  341. package/src/temporal/gpu.ts +287 -0
  342. package/src/temporal/history.ts +92 -0
  343. package/src/temporal/index.ts +6 -0
  344. package/src/temporal/inspection.ts +97 -0
  345. package/src/temporal/scene-data-catalog.ts +200 -0
  346. package/src/temporal/scene-data.ts +149 -0
  347. package/src/temporal/standard-scene-data.ts +182 -0
  348. package/src/temporal/taa-history-resources.ts +128 -0
  349. package/src/temporal/taa-history-store.ts +79 -0
  350. package/src/temporal/taa-resolve.ts +34 -0
  351. package/src/temporal/temporal-view.ts +169 -0
  352. package/src/temporal/transaction.ts +17 -0
  353. package/src/temporal/view.ts +161 -0
  354. package/src/transmission/__tests__/capability.unit.test.ts +83 -0
  355. package/src/transmission/__tests__/composition.integration.test.ts +161 -0
  356. package/src/transmission/__tests__/inspection.unit.test.ts +241 -0
  357. package/src/transmission/__tests__/lifecycle.integration.test.ts +96 -0
  358. package/src/transmission/__tests__/oracle.unit.test.ts +131 -0
  359. package/src/transmission/__tests__/projection.unit.test.ts +71 -0
  360. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +438 -0
  361. package/src/transmission/__tests__/transmission-backdrop-topology.unit.test.ts +109 -0
  362. package/src/transmission/__tests__/transmission-backdrop.dawn.test.ts +105 -0
  363. package/src/transmission/backdrop.ts +572 -0
  364. package/src/transmission/inspection.ts +190 -0
  365. package/src/transmission/oracle.ts +141 -0
  366. package/src/transmission/projection.ts +83 -0
  367. package/src/typed-render-graph-primitives.ts +162 -9
  368. package/dist/__tests__/authoring-path.unit.test.d.ts +0 -2
  369. package/dist/__tests__/authoring-path.unit.test.d.ts.map +0 -1
  370. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts +0 -2
  371. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts.map +0 -1
  372. package/dist/__tests__/callback-inference.test-d.d.ts +0 -2
  373. package/dist/__tests__/callback-inference.test-d.d.ts.map +0 -1
  374. package/dist/__tests__/cluster-binner.test.d.ts +0 -2
  375. package/dist/__tests__/cluster-binner.test.d.ts.map +0 -1
  376. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts +0 -2
  377. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts.map +0 -1
  378. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts +0 -2
  379. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts.map +0 -1
  380. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts +0 -2
  381. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts.map +0 -1
  382. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts +0 -2
  383. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts.map +0 -1
  384. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts +0 -2
  385. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts.map +0 -1
  386. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts +0 -2
  387. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts.map +0 -1
  388. package/dist/__tests__/factory-contract.integration.test.d.ts +0 -2
  389. package/dist/__tests__/factory-contract.integration.test.d.ts.map +0 -1
  390. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts +0 -2
  391. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts.map +0 -1
  392. package/dist/__tests__/frame-observation.contract.test.d.ts +0 -2
  393. package/dist/__tests__/frame-observation.contract.test.d.ts.map +0 -1
  394. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts +0 -2
  395. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts.map +0 -1
  396. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts +0 -2
  397. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts.map +0 -1
  398. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts +0 -6
  399. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +0 -1
  400. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts +0 -2
  401. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts.map +0 -1
  402. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts +0 -2
  403. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts.map +0 -1
  404. package/dist/__tests__/gpu-driven-production.integration.test.d.ts +0 -2
  405. package/dist/__tests__/gpu-driven-production.integration.test.d.ts.map +0 -1
  406. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts +0 -2
  407. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts.map +0 -1
  408. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +0 -18
  409. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +0 -1
  410. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts +0 -2
  411. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts.map +0 -1
  412. package/dist/__tests__/gpu-driven-view-reference.d.ts +0 -15
  413. package/dist/__tests__/gpu-driven-view-reference.d.ts.map +0 -1
  414. package/dist/__tests__/gpu-driven-view.browser.test.d.ts +0 -2
  415. package/dist/__tests__/gpu-driven-view.browser.test.d.ts.map +0 -1
  416. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts +0 -2
  417. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts.map +0 -1
  418. package/dist/__tests__/gpu-driven-view.unit.test.d.ts +0 -2
  419. package/dist/__tests__/gpu-driven-view.unit.test.d.ts.map +0 -1
  420. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts +0 -2
  421. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts.map +0 -1
  422. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts +0 -7
  423. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +0 -1
  424. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts +0 -2
  425. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts.map +0 -1
  426. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts +0 -2
  427. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts.map +0 -1
  428. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts +0 -2
  429. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts.map +0 -1
  430. package/dist/__tests__/gpu-scene.dawn.test.d.ts +0 -2
  431. package/dist/__tests__/gpu-scene.dawn.test.d.ts.map +0 -1
  432. package/dist/__tests__/gpu-scene.unit.test.d.ts +0 -2
  433. package/dist/__tests__/gpu-scene.unit.test.d.ts.map +0 -1
  434. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts +0 -2
  435. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts.map +0 -1
  436. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts +0 -2
  437. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts.map +0 -1
  438. package/dist/__tests__/injection-kind-owner.test-d.d.ts +0 -2
  439. package/dist/__tests__/injection-kind-owner.test-d.d.ts.map +0 -1
  440. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts +0 -2
  441. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts.map +0 -1
  442. package/dist/__tests__/light-buffer-layout.unit.test.d.ts +0 -2
  443. package/dist/__tests__/light-buffer-layout.unit.test.d.ts.map +0 -1
  444. package/dist/__tests__/material-contract-inventory.unit.test.d.ts +0 -2
  445. package/dist/__tests__/material-contract-inventory.unit.test.d.ts.map +0 -1
  446. package/dist/__tests__/material-cooked-projection.unit.test.d.ts +0 -2
  447. package/dist/__tests__/material-cooked-projection.unit.test.d.ts.map +0 -1
  448. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts +0 -2
  449. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts.map +0 -1
  450. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts +0 -2
  451. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts.map +0 -1
  452. package/dist/__tests__/material-stride-surface.unit.test.d.ts +0 -2
  453. package/dist/__tests__/material-stride-surface.unit.test.d.ts.map +0 -1
  454. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts +0 -2
  455. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts.map +0 -1
  456. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts +0 -2
  457. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts.map +0 -1
  458. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts +0 -2
  459. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts.map +0 -1
  460. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts +0 -2
  461. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts.map +0 -1
  462. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts +0 -2
  463. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts.map +0 -1
  464. package/dist/__tests__/morph-feature-plan.unit.test.d.ts +0 -2
  465. package/dist/__tests__/morph-feature-plan.unit.test.d.ts.map +0 -1
  466. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts +0 -2
  467. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts.map +0 -1
  468. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts +0 -2
  469. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts.map +0 -1
  470. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts +0 -2
  471. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts.map +0 -1
  472. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts +0 -2
  473. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts.map +0 -1
  474. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts +0 -2
  475. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts.map +0 -1
  476. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts +0 -2
  477. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts.map +0 -1
  478. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts +0 -2
  479. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts.map +0 -1
  480. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts +0 -2
  481. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts.map +0 -1
  482. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts +0 -2
  483. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts.map +0 -1
  484. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts +0 -2
  485. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts.map +0 -1
  486. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts +0 -2
  487. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts.map +0 -1
  488. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts +0 -2
  489. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts.map +0 -1
  490. package/dist/__tests__/profiler-default-off.test.d.ts +0 -2
  491. package/dist/__tests__/profiler-default-off.test.d.ts.map +0 -1
  492. package/dist/__tests__/profiler-phase-catalog.test.d.ts +0 -2
  493. package/dist/__tests__/profiler-phase-catalog.test.d.ts.map +0 -1
  494. package/dist/__tests__/profiler-phase-integration.test.d.ts +0 -2
  495. package/dist/__tests__/profiler-phase-integration.test.d.ts.map +0 -1
  496. package/dist/__tests__/profiler-phase-token.test.d.ts +0 -2
  497. package/dist/__tests__/profiler-phase-token.test.d.ts.map +0 -1
  498. package/dist/__tests__/public-surface.test-d.d.ts +0 -2
  499. package/dist/__tests__/public-surface.test-d.d.ts.map +0 -1
  500. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts +0 -2
  501. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts.map +0 -1
  502. package/dist/__tests__/render-error-code-owner.test-d.d.ts +0 -2
  503. package/dist/__tests__/render-error-code-owner.test-d.d.ts.map +0 -1
  504. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts +0 -2
  505. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts.map +0 -1
  506. package/dist/__tests__/render-error-exhaustive.test-d.d.ts +0 -2
  507. package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +0 -1
  508. package/dist/__tests__/render-feature-assembly.test-d.d.ts +0 -2
  509. package/dist/__tests__/render-feature-assembly.test-d.d.ts.map +0 -1
  510. package/dist/__tests__/render-feature-context.test-d.d.ts +0 -2
  511. package/dist/__tests__/render-feature-context.test-d.d.ts.map +0 -1
  512. package/dist/__tests__/render-feature-contract.test-d.d.ts +0 -2
  513. package/dist/__tests__/render-feature-contract.test-d.d.ts.map +0 -1
  514. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts +0 -2
  515. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts.map +0 -1
  516. package/dist/__tests__/render-feature-docs.unit.test.d.ts +0 -2
  517. package/dist/__tests__/render-feature-docs.unit.test.d.ts.map +0 -1
  518. package/dist/__tests__/render-feature-errors.unit.test.d.ts +0 -2
  519. package/dist/__tests__/render-feature-errors.unit.test.d.ts.map +0 -1
  520. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts +0 -2
  521. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts.map +0 -1
  522. package/dist/__tests__/render-feature-plan.test-d.d.ts +0 -2
  523. package/dist/__tests__/render-feature-plan.test-d.d.ts.map +0 -1
  524. package/dist/__tests__/render-feature-plan.unit.test.d.ts +0 -2
  525. package/dist/__tests__/render-feature-plan.unit.test.d.ts.map +0 -1
  526. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts +0 -2
  527. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts.map +0 -1
  528. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts +0 -2
  529. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts.map +0 -1
  530. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts +0 -2
  531. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts.map +0 -1
  532. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts +0 -2
  533. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts.map +0 -1
  534. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts +0 -2
  535. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts.map +0 -1
  536. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts +0 -2
  537. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts.map +0 -1
  538. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts +0 -2
  539. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts.map +0 -1
  540. package/dist/__tests__/render-feature-public-surface.test-d.d.ts +0 -2
  541. package/dist/__tests__/render-feature-public-surface.test-d.d.ts.map +0 -1
  542. package/dist/__tests__/render-feature-retry.unit.test.d.ts +0 -2
  543. package/dist/__tests__/render-feature-retry.unit.test.d.ts.map +0 -1
  544. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts +0 -2
  545. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts.map +0 -1
  546. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts +0 -2
  547. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts.map +0 -1
  548. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts +0 -2
  549. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts.map +0 -1
  550. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts +0 -2
  551. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts.map +0 -1
  552. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts +0 -2
  553. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts.map +0 -1
  554. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts +0 -2
  555. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts.map +0 -1
  556. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts +0 -7
  557. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts.map +0 -1
  558. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts +0 -2
  559. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts.map +0 -1
  560. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts +0 -2
  561. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts.map +0 -1
  562. package/dist/__tests__/render-graph-hzb-gpu.d.ts +0 -7
  563. package/dist/__tests__/render-graph-hzb-gpu.d.ts.map +0 -1
  564. package/dist/__tests__/render-graph-hzb.browser.test.d.ts +0 -2
  565. package/dist/__tests__/render-graph-hzb.browser.test.d.ts.map +0 -1
  566. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts +0 -2
  567. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts.map +0 -1
  568. package/dist/__tests__/render-graph-primitives.unit.test.d.ts +0 -2
  569. package/dist/__tests__/render-graph-primitives.unit.test.d.ts.map +0 -1
  570. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts +0 -12
  571. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts.map +0 -1
  572. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts +0 -2
  573. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts.map +0 -1
  574. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts +0 -2
  575. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts.map +0 -1
  576. package/dist/__tests__/render-scene-projection.unit.test.d.ts +0 -2
  577. package/dist/__tests__/render-scene-projection.unit.test.d.ts.map +0 -1
  578. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts +0 -2
  579. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts.map +0 -1
  580. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts +0 -2
  581. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts.map +0 -1
  582. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts +0 -2
  583. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts.map +0 -1
  584. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts +0 -2
  585. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts.map +0 -1
  586. package/dist/__tests__/shader-stage-surface.unit.test.d.ts +0 -2
  587. package/dist/__tests__/shader-stage-surface.unit.test.d.ts.map +0 -1
  588. package/dist/__tests__/ssao-config.unit.test.d.ts +0 -2
  589. package/dist/__tests__/ssao-config.unit.test.d.ts.map +0 -1
  590. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts +0 -2
  591. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts.map +0 -1
  592. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts +0 -2
  593. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts.map +0 -1
  594. package/dist/__tests__/standard-descriptors.test-d.d.ts +0 -2
  595. package/dist/__tests__/standard-descriptors.test-d.d.ts.map +0 -1
  596. package/dist/__tests__/standard-pipeline.dawn.test.d.ts +0 -2
  597. package/dist/__tests__/standard-pipeline.dawn.test.d.ts.map +0 -1
  598. package/dist/__tests__/standard-pipeline.integration.test.d.ts +0 -2
  599. package/dist/__tests__/standard-pipeline.integration.test.d.ts.map +0 -1
  600. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts +0 -2
  601. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts.map +0 -1
  602. package/dist/__tests__/surface-configuration.unit.test.d.ts +0 -2
  603. package/dist/__tests__/surface-configuration.unit.test.d.ts.map +0 -1
  604. package/dist/__tests__/texture-usage-surface.unit.test.d.ts +0 -2
  605. package/dist/__tests__/texture-usage-surface.unit.test.d.ts.map +0 -1
  606. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts +0 -2
  607. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts.map +0 -1
  608. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts +0 -2
  609. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts.map +0 -1
  610. package/dist/__tests__/urp-pipeline.unit.test.d.ts +0 -2
  611. package/dist/__tests__/urp-pipeline.unit.test.d.ts.map +0 -1
  612. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts +0 -2
  613. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts.map +0 -1
  614. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts +0 -2
  615. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts.map +0 -1
  616. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts +0 -2
  617. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts.map +0 -1
  618. package/dist/__tests__/visibility-extract.integration.test.d.ts +0 -2
  619. package/dist/__tests__/visibility-extract.integration.test.d.ts.map +0 -1
  620. package/dist/__tests__/visibility-extract.perf.test.d.ts +0 -2
  621. package/dist/__tests__/visibility-extract.perf.test.d.ts.map +0 -1
  622. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts +0 -2
  623. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts.map +0 -1
  624. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts +0 -2
  625. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts.map +0 -1
  626. package/dist/__tests__/visibility-instances.integration.test.d.ts +0 -2
  627. package/dist/__tests__/visibility-instances.integration.test.d.ts.map +0 -1
  628. package/dist/__tests__/visibility-multi-world.integration.test.d.ts +0 -2
  629. package/dist/__tests__/visibility-multi-world.integration.test.d.ts.map +0 -1
  630. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts +0 -2
  631. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts.map +0 -1
  632. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts +0 -2
  633. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts.map +0 -1
  634. package/dist/__tests__/visibility-public-surface.test-d.d.ts +0 -2
  635. package/dist/__tests__/visibility-public-surface.test-d.d.ts.map +0 -1
  636. package/dist/__tests__/visibility-resolver.unit.test.d.ts +0 -2
  637. package/dist/__tests__/visibility-resolver.unit.test.d.ts.map +0 -1
  638. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts +0 -2
  639. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts.map +0 -1
  640. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts +0 -2
  641. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts.map +0 -1
  642. package/dist/__tests__/vocabulary.unit.test.d.ts +0 -2
  643. package/dist/__tests__/vocabulary.unit.test.d.ts.map +0 -1
  644. package/dist/chunk-CQXZC5XI.mjs.map +0 -1
  645. package/dist/chunk-HCOGPHKS.mjs +0 -93
  646. package/dist/chunk-HCOGPHKS.mjs.map +0 -1
  647. package/dist/chunk-YEJIUW7D.mjs.map +0 -1
  648. package/dist/components/__tests__/points-lines-admission.unit.test.d.ts +0 -2
  649. package/dist/components/__tests__/points-lines-admission.unit.test.d.ts.map +0 -1
  650. package/dist/components/__tests__/points-lines-schema.unit.test.d.ts +0 -2
  651. package/dist/components/__tests__/points-lines-schema.unit.test.d.ts.map +0 -1
  652. package/dist/components/__tests__/schema-contract.unit.test.d.ts +0 -2
  653. package/dist/components/__tests__/schema-contract.unit.test.d.ts.map +0 -1
  654. package/dist/components/__tests__/schema-parity.unit.test.d.ts +0 -2
  655. package/dist/components/__tests__/schema-parity.unit.test.d.ts.map +0 -1
  656. package/dist/components/__tests__/visibility-schema.unit.test.d.ts +0 -2
  657. package/dist/components/__tests__/visibility-schema.unit.test.d.ts.map +0 -1
  658. package/dist/points-lines/__tests__/bounds.unit.test.d.ts +0 -2
  659. package/dist/points-lines/__tests__/bounds.unit.test.d.ts.map +0 -1
  660. package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts +0 -2
  661. package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts.map +0 -1
  662. package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts +0 -2
  663. package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts.map +0 -1
  664. package/dist/points-lines/__tests__/inspection.unit.test.d.ts +0 -2
  665. package/dist/points-lines/__tests__/inspection.unit.test.d.ts.map +0 -1
  666. package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts +0 -2
  667. package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts.map +0 -1
  668. package/dist/points-lines/__tests__/points-lines.bench.d.ts +0 -2
  669. package/dist/points-lines/__tests__/points-lines.bench.d.ts.map +0 -1
  670. package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts +0 -2
  671. package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts.map +0 -1
  672. package/dist/points-lines/__tests__/snapshot.unit.test.d.ts +0 -2
  673. package/dist/points-lines/__tests__/snapshot.unit.test.d.ts.map +0 -1
  674. package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts +0 -2
  675. package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts.map +0 -1
  676. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts +0 -2
  677. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts.map +0 -1
  678. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts +0 -2
  679. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts.map +0 -1
  680. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts +0 -2
  681. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts.map +0 -1
  682. package/dist/record/__tests__/video-texture-view.unit.test.d.ts +0 -2
  683. package/dist/record/__tests__/video-texture-view.unit.test.d.ts.map +0 -1
@@ -6,7 +6,16 @@ import { vec3 } from '@forgeax/engine-math';
6
6
  import type { ResolvedColorTargetDescriptor } from '@forgeax/engine-render-graph';
7
7
  import type { Texture } from '@forgeax/engine-rhi';
8
8
  import type { ClusterBinScratch } from '../cluster-binner';
9
+ import type { EnvironmentGeneration } from '../environment/generation';
10
+ import type { EnvironmentLifecycle } from '../environment/lifecycle';
9
11
  import type { GpuBuffer } from '../gpu-resource';
12
+ import type { TemporalGpuState } from '../temporal/gpu';
13
+ import type { TemporalView } from '../temporal/view';
14
+
15
+ export type TemporalCommitOutcome =
16
+ | { readonly kind: 'none' }
17
+ | { readonly kind: 'off'; readonly view: TemporalView }
18
+ | { readonly kind: 'taa'; readonly view: TemporalView };
10
19
 
11
20
  /**
12
21
  * feat-20260708-composited-multi-world-rendering M1 / D-1 / D-9:
@@ -84,6 +93,88 @@ export interface FrameObservationSource {
84
93
  readonly backendId: string;
85
94
  }
86
95
 
96
+ /** Internal test/diagnostic view of one compiled graph color target. */
97
+ export interface CurrentGraphTarget {
98
+ readonly name: string;
99
+ readonly texture: Texture;
100
+ /** Stable opaque identity for this RHI handle during the renderer lifetime. */
101
+ readonly textureIdentity: number;
102
+ readonly descriptor: ResolvedColorTargetDescriptor;
103
+ readonly frameId: number;
104
+ /** Monotonic identity of the compiled graph that owns this texture. */
105
+ readonly graphGeneration: number;
106
+ }
107
+
108
+ const textureIdentities = new WeakMap<object, number>();
109
+ let nextTextureIdentity = 1;
110
+
111
+ /**
112
+ * Project an opaque RHI texture handle to a stable diagnostic identity.
113
+ * RHI handles intentionally expose no serializable fields; object identity is
114
+ * the only valid comparison boundary for a copy-time capture.
115
+ */
116
+ export function getTextureIdentity(texture: Texture): number {
117
+ const object = texture as object;
118
+ const existing = textureIdentities.get(object);
119
+ if (existing !== undefined) return existing;
120
+ const identity = nextTextureIdentity++;
121
+ textureIdentities.set(object, identity);
122
+ return identity;
123
+ }
124
+
125
+ export type GraphTargetCaptureReadbackValidation =
126
+ | { readonly ok: true }
127
+ | {
128
+ readonly ok: false;
129
+ readonly code:
130
+ | 'capture-readback-length'
131
+ | 'capture-readback-untouched-sentinel'
132
+ | 'capture-readback-empty'
133
+ | 'capture-readback-non-finite';
134
+ };
135
+
136
+ /** Validate a mapped rgba16float capture before a consumer decodes its values. */
137
+ export function validateGraphTargetCaptureReadback(input: {
138
+ readonly bytes: Uint8Array;
139
+ readonly expectedByteLength: number;
140
+ readonly sentinel?: Uint8Array;
141
+ }): GraphTargetCaptureReadbackValidation {
142
+ const { bytes, expectedByteLength, sentinel } = input;
143
+ if (bytes.byteLength !== expectedByteLength)
144
+ return { ok: false, code: 'capture-readback-length' };
145
+ if (sentinel?.every((value, index) => bytes[index] === value)) {
146
+ return { ok: false, code: 'capture-readback-untouched-sentinel' };
147
+ }
148
+ if (bytes.every((value) => value === 0)) return { ok: false, code: 'capture-readback-empty' };
149
+ for (let index = 0; index + 1 < bytes.length; index += 2) {
150
+ const exponent = ((bytes[index + 1] ?? 0) >>> 2) & 0x1f;
151
+ if (exponent === 0x1f) return { ok: false, code: 'capture-readback-non-finite' };
152
+ }
153
+ return { ok: true };
154
+ }
155
+
156
+ /** Internal readback request consumed by the record encoder in the same submit. */
157
+ export interface GraphTargetCaptureRequest {
158
+ readonly name: string;
159
+ readonly buffer: Buffer;
160
+ readonly bytesPerRow: number;
161
+ readonly width: number;
162
+ readonly height: number;
163
+ /** Descriptor contract checked against the resolved target at copy time. */
164
+ readonly expected: {
165
+ readonly format: ResolvedColorTargetDescriptor['format'];
166
+ readonly width: number;
167
+ readonly height: number;
168
+ readonly usage: number;
169
+ /** Optional caller binding; when present it is checked at copy time. */
170
+ readonly identity?: {
171
+ readonly graphGeneration: number;
172
+ readonly frameId: number;
173
+ readonly textureIdentity: number;
174
+ };
175
+ };
176
+ }
177
+
87
178
  /**
88
179
  * Build a synthetic CameraSnapshot the record stage uses when the world
89
180
  * carries no Camera entity. Identity-shaped projection / view inputs
@@ -160,14 +251,24 @@ export function clampPcfKernelSize(value: number | undefined): number {
160
251
  */
161
252
  export interface RenderFrameState {
162
253
  frameNumber: number;
254
+ /** Monotonic compiled-graph identity used by diagnostic readbacks. */
255
+ graphGeneration: number;
256
+ /** Number of successfully submitted TAA frames; failed attempts do not advance it. */
257
+ successfulTemporalFrameIndex?: number;
163
258
  /** Optional graph resource lookup used by low-level record helpers and tests. */
164
- readonly perFrameGraph?: {
259
+ perFrameGraph?: {
165
260
  readonly getColorTargetDescriptor: (key: string) => ResolvedColorTargetDescriptor | undefined;
166
261
  readonly getColorTargetView: (key: string) => TextureView | undefined;
167
262
  readonly getColorTargetTexture: (key: string) => Texture | undefined;
263
+ readonly graphGeneration: number;
168
264
  } | null;
265
+ graphTargetCapture?: GraphTargetCaptureRequest | undefined;
169
266
  /** Last successfully rendered static directional shadow atlas token. */
170
267
  directionalShadowCache: DirectionalShadowCache | null;
268
+ /** Last successfully submitted camera post-process mode. */
269
+ lastSuccessfulBloom: 'off' | 'on';
270
+ /** Bloom record receipts staged by this frame; cleared on abort. */
271
+ bloomFrameReceipts?: BloomFrameReceipts | undefined;
171
272
  /** Set by a directional shadow pass when this frame refreshed the atlas. */
172
273
  directionalShadowCacheRecorded: boolean;
173
274
  /** The sole compiled owner for compute, copy, feature, and raster work. */
@@ -176,6 +277,20 @@ export interface RenderFrameState {
176
277
  readonly retiredCompiledFrameGraphs: Set<CompiledRenderGraph<RenderPipelineFrame>>;
177
278
  /** Physical outputs projected by typed graph passes for downstream observers. */
178
279
  currentFrameObservationSource: FrameObservationSource | undefined;
280
+ /** Camera antialias mode for the last successfully submitted graph. */
281
+ lastSuccessfulCameraAntialias: CameraSnapshot['antialias'] | undefined;
282
+ /** Staged TAA GPU state is promoted only after queue.submit succeeds. */
283
+ temporalGpuState: TemporalGpuState | undefined;
284
+ /** Last successful TAA GPU state; candidate replacement stays staged until submit. */
285
+ activeTemporalGpuState: TemporalGpuState | undefined;
286
+ /** Submitted temporal generations retained until their queue fence resolves. */
287
+ readonly retiringTemporalGpuStates: Set<TemporalGpuState>;
288
+ /** Last successful projection; candidate frames never overwrite it. */
289
+ lastSuccessfulTemporalView: TemporalView | undefined;
290
+ pendingTemporalCommit: TemporalCommitOutcome;
291
+ /** Staged environment generation is promoted only after queue.submit succeeds. */
292
+ environmentGeneration: EnvironmentGeneration | undefined;
293
+ readonly environmentLifecycle: EnvironmentLifecycle | undefined;
179
294
  currentDirectionalShadowView: TextureView | null;
180
295
  currentSpotShadowView: TextureView | null;
181
296
  readonly instanceBuffers: Map<number, InstanceBufferCacheEntry>;
@@ -342,10 +457,9 @@ export interface RenderFrameState {
342
457
  */
343
458
  installedPipelineConfig: RenderPipelineAsset['config'];
344
459
  /**
345
- * feat-20260608-cluster-lighting M2 / w10: HDRP active flag.
346
- * True iff the currently installed RenderPipelineAsset has
347
- * `pipelineId === 'forgeax::hdrp'`. URP-only code paths gate on
348
- * `!isHdrpActive` so HDRP demos do not double-count light contributions.
460
+ * Whether the configured standard graph resolved to the clustered lane.
461
+ * Capability gating keeps URP forward bindings on WebGL2 fallback even
462
+ * when a clustered profile was requested.
349
463
  */
350
464
  isHdrpActive: boolean;
351
465
  /**
@@ -432,6 +546,16 @@ export interface BindGroupCounts {
432
546
  keys: string[];
433
547
  }
434
548
 
549
+ /**
550
+ * Successful Bloom record operations staged for the current frame. These
551
+ * counters are promoted only after the shared renderer queue submission.
552
+ */
553
+ export interface BloomFrameReceipts {
554
+ readonly uploadCount: number;
555
+ readonly bindGroupCount: number;
556
+ readonly encodeCount: number;
557
+ }
558
+
435
559
  /**
436
560
  * A renderable resolved against the AssetRegistry for the current frame:
437
561
  * its source snapshot, the GPU mesh handles, the row index used to correlate
@@ -20,9 +20,12 @@ export function graphExecutionPhase(passName: string): RenderGraphExecutionPhase
20
20
  case 'lighting':
21
21
  return 'record/graph-execute/lighting';
22
22
  case 'forward':
23
+ case 'transmission-forward':
23
24
  return 'record/graph-execute/forward';
24
- case 'tonemap':
25
- return 'record/graph-execute/tonemap';
25
+ case 'output-transform':
26
+ return 'record/graph-execute/output-transform';
27
+ case 'present':
28
+ return 'record/graph-execute/present';
26
29
  case 'debug-overlay':
27
30
  return 'record/graph-execute/debug-overlay';
28
31
  case 'shadow':
@@ -55,17 +58,23 @@ export function acquireSwapChainTarget(
55
58
 
56
59
  let currentTextureResult = canvasContext.getCurrentTexture();
57
60
  if (!currentTextureResult.ok) {
58
- pipelineState.perPassResources.configured = false;
59
61
  const configured = configureSurface(
60
62
  canvasContext,
61
63
  internals.device,
62
64
  pipelineState.format,
63
65
  pipelineState.colorAttachmentFormat,
64
66
  );
65
- if (configured.ok) {
66
- pipelineState.perPassResources.configured = true;
67
- (globalThis as Record<string, unknown>).__forgeaxSwapChainFormat = pipelineState.format;
67
+ if (!configured.ok) {
68
+ internals.errorRegistry.fire(configured.error);
69
+ internals.healthRegistry.fire({
70
+ reason: 'internal-fault',
71
+ detail: { message: 'surface configure candidate failed; current frame skipped' },
72
+ recoverable: true,
73
+ });
74
+ return null;
68
75
  }
76
+ pipelineState.perPassResources.configured = true;
77
+ (globalThis as Record<string, unknown>).__forgeaxSwapChainFormat = pipelineState.format;
69
78
  const retry = canvasContext.getCurrentTexture();
70
79
  if (!retry.ok) {
71
80
  internals.errorRegistry.fire(retry.error);
@@ -4,6 +4,7 @@
4
4
  import { HANDLE_NINESLICE_QUAD, resolveAssetHandle } from '@forgeax/engine-assets-runtime';
5
5
  import type { World } from '@forgeax/engine-ecs';
6
6
  import type { RenderReadLease } from '@forgeax/engine-ecs/projection';
7
+ import { mat4 } from '@forgeax/engine-math';
7
8
  import {
8
9
  type CurrentFrameObservationLease,
9
10
  createCurrentFrameObservationLease,
@@ -21,6 +22,7 @@ import type { MaterialRenderState, MeshAsset } from '@forgeax/engine-types';
21
22
  import { handleSlot, toShared } from '@forgeax/engine-types';
22
23
  import type { MeshGpuHandles } from '../device/gpu-residency';
23
24
  import { ObservationUnavailableError, type ObservationUnavailableReason } from '../errors/render';
25
+ import type { FogFrame } from '../extract/environment';
24
26
  import type { GpuDrivenProduction, PreparedGpuDrivenFrame } from '../gpu-driven/production-raster';
25
27
  import { GpuBuffer } from '../gpu-resource';
26
28
  import { GPU_BUFFER_USAGE_COPY_DST, GPU_BUFFER_USAGE_VERTEX } from '../gpu-usage';
@@ -40,6 +42,7 @@ import {
40
42
  TRANSPARENT_SORT_MODE_LAYER_Y,
41
43
  TRANSPARENT_SORT_MODE_LAYER_Z,
42
44
  } from '../systems/transparent-sort-config';
45
+ import type { TransmissionDemand } from '../transmission/projection';
43
46
  import {
44
47
  buildPerFrameBindGroups,
45
48
  prepareFrameLighting,
@@ -184,6 +187,7 @@ export async function observeCurrentFrame(
184
187
  });
185
188
  }
186
189
 
190
+ import { createTemporalView, resolveTemporalReset } from '../temporal/view';
187
191
  import {
188
192
  acquireSwapChainTarget,
189
193
  graphExecutionPhase,
@@ -191,6 +195,7 @@ import {
191
195
  resolveSpotShadowMapSize,
192
196
  } from './frame-targets';
193
197
  import {
198
+ computeProjectionMatrix,
194
199
  computeViewMatrix,
195
200
  driveLazyEquirectProjection,
196
201
  selectLazyEquirectHandle,
@@ -304,6 +309,7 @@ export function recordFrame(
304
309
  skybox: SkyboxSnapshot | undefined,
305
310
  skyboxCount: number,
306
311
  postProcessParams: ReadonlyMap<string, Uint8Array>,
312
+ fog: FogFrame | undefined,
307
313
  // feat-20260709-editor-world-partition ENGINE-fix-round2 (defect 2): the
308
314
  // full worlds[] list passed to `renderer.draw`, indexed by
309
315
  // RenderableSnapshot.worldId so the record stage resolves each renderable's
@@ -321,6 +327,10 @@ export function recordFrame(
321
327
  renderReadLeases?: readonly RenderReadLease[],
322
328
  featureGraphCandidate?: RenderFeatureGraphCandidate,
323
329
  pointsLinesOwner?: import('./render-context').PointsLinesRecordOwner,
330
+ environmentSignature = '',
331
+ fogSignature = '',
332
+ environmentReady = true,
333
+ transmissionDemand?: TransmissionDemand,
324
334
  ): boolean {
325
335
  // The `try / finally` wrapper advances `frameState.frameNumber` exactly
326
336
  // once per `recordFrame` invocation regardless of which early-return
@@ -521,6 +531,8 @@ export function recordFrame(
521
531
  graphShadowMapSize,
522
532
  preparedGpuDriven,
523
533
  featureGraphCandidate,
534
+ cameras.length === 0,
535
+ transmissionDemand,
524
536
  ),
525
537
  );
526
538
  if (preflightGraph === null) return false;
@@ -539,6 +551,79 @@ export function recordFrame(
539
551
  const targetW = swapTarget.targetW;
540
552
  const targetH = swapTarget.targetH;
541
553
 
554
+ const temporalView =
555
+ camera.antialias === 'taa' && environmentReady
556
+ ? (() => {
557
+ const created = createTemporalView({
558
+ antialias: camera.antialias,
559
+ width: targetW,
560
+ height: targetH,
561
+ frameIndex: frameState.successfulTemporalFrameIndex ?? 0,
562
+ viewIdentity: `camera:${camera.entityKey ?? 0}`,
563
+ environmentSignature,
564
+ fogSignature,
565
+ deviceGeneration: internals.deviceScope.generation,
566
+ ...(camera.historyVersion === undefined
567
+ ? {}
568
+ : { historyVersion: camera.historyVersion }),
569
+ });
570
+ const previous = frameState.lastSuccessfulTemporalView;
571
+ const currentUnjitteredViewProjection = mat4.multiply(
572
+ mat4.create(),
573
+ computeProjectionMatrix(camera),
574
+ computeViewMatrix(camera),
575
+ );
576
+ const resetCandidate = createTemporalView({
577
+ antialias: created.input.antialias,
578
+ width: created.input.width,
579
+ height: created.input.height,
580
+ frameIndex: created.input.frameIndex,
581
+ historyVersion: created.input.historyVersion,
582
+ viewIdentity: created.input.viewIdentity,
583
+ environmentSignature,
584
+ fogSignature,
585
+ deviceGeneration: internals.deviceScope.generation,
586
+ cameraCut: created.input.cameraCut,
587
+ historyValid: false,
588
+ currentUnjitteredViewProjection,
589
+ });
590
+ const resetReason = resolveTemporalReset(previous, resetCandidate);
591
+ return createTemporalView({
592
+ ...resetCandidate.input,
593
+ frameIndex: resetReason === undefined ? resetCandidate.input.frameIndex : 0,
594
+ historyValid: previous !== undefined && resetReason === undefined,
595
+ currentUnjitteredViewProjection,
596
+ resetReason,
597
+ ...(resetReason !== undefined ||
598
+ previous?.currentUnjitteredViewProjection === undefined
599
+ ? {}
600
+ : {
601
+ previousUnjitteredViewProjection: previous.currentUnjitteredViewProjection,
602
+ }),
603
+ });
604
+ })()
605
+ : undefined;
606
+ frameState.pendingTemporalCommit =
607
+ cameras.length === 0 || !environmentReady || internals.deviceScope === undefined
608
+ ? { kind: 'none' }
609
+ : temporalView === undefined
610
+ ? {
611
+ kind: 'off',
612
+ view: createTemporalView({
613
+ antialias: camera.antialias,
614
+ width: targetW,
615
+ height: targetH,
616
+ frameIndex: frameState.successfulTemporalFrameIndex ?? 0,
617
+ viewIdentity: `camera:${camera.entityKey ?? 0}`,
618
+ environmentSignature,
619
+ fogSignature,
620
+ deviceGeneration: internals.deviceScope.generation,
621
+ }),
622
+ }
623
+ : { kind: 'taa', view: temporalView };
624
+ const recordCamera: CameraSnapshot =
625
+ temporalView === undefined ? camera : { ...camera, temporal: temporalView };
626
+
542
627
  const depthView: TextureView | null = null;
543
628
  // feat-20260709 M3 / D-3: clear-color read from the active CameraSnapshot's
544
629
  // single `clearColor` array field (first-archetype-hit per OOS-2). When the
@@ -583,7 +668,7 @@ export function recordFrame(
583
668
  const { tonemapActive, skyboxActive } = resolveSkyboxActive(
584
669
  internals,
585
670
  frameState,
586
- camera,
671
+ recordCamera,
587
672
  skybox,
588
673
  );
589
674
 
@@ -699,6 +784,8 @@ export function recordFrame(
699
784
  light,
700
785
  lights,
701
786
  frameState.spotShadowSnapshots,
787
+ fog,
788
+ temporalView,
702
789
  );
703
790
  if (pipelineState.pointsLinesViewBuffer !== undefined) {
704
791
  writePointsLinesViewUbo(
@@ -783,12 +870,29 @@ export function recordFrame(
783
870
  // errorRegistry + shader-cache lookups) surfaces (`internals` itself satisfies
784
871
  // `RenderSystemRuntime` so `runtime: internals` is a zero-cost reference). The
785
872
  // 0-consumed `skyboxCount` residual is dropped.
873
+ // Camera-owned temporal controls are projected into the per-frame
874
+ // post-process parameter map at record time. The extracted ECS map only
875
+ // carries explicit PostProcessParams components; without this bridge the
876
+ // builtin motion-blur pass receives its all-zero registration default and
877
+ // becomes a no-op even though the temporal scene target is populated.
878
+ const framePostProcessParams = new Map(postProcessParams);
879
+ if (camera.motionBlur !== undefined) {
880
+ const motionBlurParams = new Uint8Array(16);
881
+ const motionBlurView = new DataView(motionBlurParams.buffer);
882
+ motionBlurView.setFloat32(0, camera.motionBlur.shutterAngle, true);
883
+ motionBlurView.setFloat32(4, camera.motionBlur.maxRadiusPixels, true);
884
+ motionBlurView.setUint32(8, camera.motionBlur.sampleCount, true);
885
+ motionBlurView.setUint32(12, temporalView?.historyValid === true ? 0 : 1, true);
886
+ framePostProcessParams.set('forgeax.motion-blur', motionBlurParams);
887
+ }
888
+
786
889
  const passCtx: _InternalRenderPipelineContext = {
787
890
  assets: internals.assets,
788
891
  world,
789
892
  gpuDrivenEntityKeys: gpuOwnedEntityKeys,
790
893
  store: internals.gpuStore,
791
894
  pipelineState,
895
+ bloomResources: pipelineState.perPassResources.getBloomResources?.() ?? null,
792
896
  runtime: internals,
793
897
  encoder,
794
898
  view,
@@ -796,7 +900,7 @@ export function recordFrame(
796
900
  targetW,
797
901
  targetH,
798
902
  currentTexture,
799
- camera,
903
+ camera: recordCamera,
800
904
  tonemapActive,
801
905
  geometryColorView,
802
906
  geometryDepthView,
@@ -817,7 +921,7 @@ export function recordFrame(
817
921
  msaaActive,
818
922
  geometryColorResolveView,
819
923
  ldrSpriteColorView,
820
- postProcessParams,
924
+ postProcessParams: framePostProcessParams,
821
925
  dispatch: transparentDispatch,
822
926
  hdrpClusterBindGroup,
823
927
  hdrpClusterMembershipBindGroup,
@@ -57,7 +57,7 @@ type GeometryBindingState = {
57
57
 
58
58
  type MaterialPipelineLookup = {
59
59
  readonly materialShaderId: string;
60
- readonly tonemapActive: boolean;
60
+ readonly isHdrTarget: boolean;
61
61
  readonly renderStateKey: string;
62
62
  readonly topology: PrimitiveTopology;
63
63
  readonly indexFormat: 'uint16' | 'uint32';
@@ -71,6 +71,27 @@ type MaterialPipelineLookup = {
71
71
 
72
72
  type GeometryRecordProfileSegment = 'material-bind-groups' | 'pipeline-selection' | 'draw-submit';
73
73
 
74
+ type GeometryRenderState = ReturnType<typeof geometryRenderStateForTopology>;
75
+
76
+ /**
77
+ * Resolve the depth contract for a geometry pass without changing the base
78
+ * material state. Temporal scene-data shares the main pass depth attachment:
79
+ * it is read-only and accepts the equal depth produced by the unjittered
80
+ * temporal projection, while still rejecting fragments behind the visible
81
+ * surface.
82
+ */
83
+ export function geometryRenderStateForPass(
84
+ base: GeometryRenderState,
85
+ passKind: PassKind,
86
+ ): GeometryRenderState {
87
+ if (passKind !== 'temporal') return base;
88
+ return {
89
+ ...base,
90
+ depthWriteEnabled: false,
91
+ depthCompare: 'less-equal' as const,
92
+ };
93
+ }
94
+
74
95
  function geometryRecordPhase(
75
96
  passKind: PassKind,
76
97
  segment: GeometryRecordProfileSegment,
@@ -178,6 +199,12 @@ export function recordGeometryDraws(
178
199
  viewBindGroup,
179
200
  } = c;
180
201
  const colorFormatOverride = c.transparentColorFormat as GPUTextureFormat | undefined;
202
+ // A no-tone frame may still render into the graph-owned rgba16float target
203
+ // (the linear-LDR route). Shader variants must follow the attachment's
204
+ // numeric domain rather than the camera's tone-map switch, otherwise the
205
+ // LDR/OETF fragment entry point is encoded once here and again by the
206
+ // output transform.
207
+ const isHdrTarget = tonemapActive || colorFormatOverride === 'rgba16float';
181
208
  let lastVertexBuffer: GpuBuffer | null = null;
182
209
  let lastIndexBuffer: GpuBuffer | null = null;
183
210
  const bindingState: GeometryBindingState = {
@@ -226,7 +253,7 @@ export function recordGeometryDraws(
226
253
  if (cachedLookups !== undefined) {
227
254
  for (const cached of cachedLookups) {
228
255
  if (
229
- cached.tonemapActive === tonemapActive &&
256
+ cached.isHdrTarget === isHdrTarget &&
230
257
  cached.renderStateKey === renderStateKey &&
231
258
  cached.topology === topology &&
232
259
  cached.indexFormat === indexFormat &&
@@ -240,10 +267,11 @@ export function recordGeometryDraws(
240
267
  }
241
268
  }
242
269
  }
243
- const resolvedVariantSetResult = variantSetFromVertexLayoutProjection(
244
- layoutProjection,
245
- variantSet,
246
- );
270
+ const resolvedVariantSetResult =
271
+ variantSet === undefined &&
272
+ (materialShaderId === 'forgeax::sprite' || materialShaderId === 'forgeax::sprite-lit')
273
+ ? ({ ok: true, value: undefined } as const)
274
+ : variantSetFromVertexLayoutProjection(layoutProjection, variantSet);
247
275
  if (!resolvedVariantSetResult.ok) {
248
276
  runtime.errorRegistry.fire(resolvedVariantSetResult.error);
249
277
  return null;
@@ -252,7 +280,7 @@ export function recordGeometryDraws(
252
280
  const resolvePipeline = () =>
253
281
  runtime.getMaterialShaderPipeline?.(
254
282
  materialShaderId,
255
- tonemapActive,
283
+ isHdrTarget,
256
284
  renderState,
257
285
  topology,
258
286
  indexFormat,
@@ -270,25 +298,37 @@ export function recordGeometryDraws(
270
298
  profilePhase === undefined
271
299
  ? resolvePipeline()
272
300
  : profileGeometrySegment(c, passKind, 'pipeline-selection', resolvePipeline);
273
- const nextLookup: MaterialPipelineLookup = {
274
- materialShaderId,
275
- tonemapActive,
276
- renderStateKey,
277
- topology,
278
- indexFormat,
279
- variantSet,
280
- passKind,
281
- layoutProjection,
282
- sampleCount,
283
- colorFormatOverride: colorFormat,
284
- handle,
285
- };
286
- if (shaderLookupCache === undefined) {
287
- materialPipelineLookupCache.set(materialShaderId, new Map([[renderStateKey, [nextLookup]]]));
288
- } else if (cachedLookups === undefined) {
289
- shaderLookupCache.set(renderStateKey, [nextLookup]);
290
- } else {
291
- cachedLookups.push(nextLookup);
301
+ // A null handle is a transient async-build signal (`rhi-not-available`),
302
+ // not a stable pipeline result. Do not memoize it in this frame's lookup:
303
+ // caching the first pending lookup would turn a one-frame shader warm-up
304
+ // into a permanent skip for every later frame in a tight smoke loop. The
305
+ // owning runtime cache remains the SSOT; retrying here is bounded by the
306
+ // existing per-frame draw path and preserves the explicit skip-draw
307
+ // recovery while the pipeline becomes ready.
308
+ if (handle !== null) {
309
+ const nextLookup: MaterialPipelineLookup = {
310
+ materialShaderId,
311
+ isHdrTarget,
312
+ renderStateKey,
313
+ topology,
314
+ indexFormat,
315
+ variantSet,
316
+ passKind,
317
+ layoutProjection,
318
+ sampleCount,
319
+ colorFormatOverride: colorFormat,
320
+ handle,
321
+ };
322
+ if (shaderLookupCache === undefined) {
323
+ materialPipelineLookupCache.set(
324
+ materialShaderId,
325
+ new Map([[renderStateKey, [nextLookup]]]),
326
+ );
327
+ } else if (cachedLookups === undefined) {
328
+ shaderLookupCache.set(renderStateKey, [nextLookup]);
329
+ } else {
330
+ cachedLookups.push(nextLookup);
331
+ }
292
332
  }
293
333
  return handle;
294
334
  };
@@ -506,7 +546,7 @@ export function recordGeometryDraws(
506
546
  skinResources !== null && skinVariantSetResult.ok
507
547
  ? (runtime.getMaterialShaderPipeline?.(
508
548
  SKIN_MATERIAL_SHADER_ID,
509
- tonemapActive,
549
+ isHdrTarget,
510
550
  entry.source.material.renderState,
511
551
  entry.mesh.submeshes[0]?.topology ?? 'triangle-list',
512
552
  entry.mesh.indexFormat,
@@ -727,7 +767,7 @@ export function recordGeometryDraws(
727
767
  // Preserve the dedicated sprite-pass state when the linear-LDR graph
728
768
  // routes a sprite through this generic geometry path. Negative scale
729
769
  // flips winding, so back-face culling would erase the quad.
730
- const pipelineRenderState = isSpriteShader
770
+ const basePipelineRenderState = isSpriteShader
731
771
  ? {
732
772
  ...submeshMaterial.renderState,
733
773
  depthWriteEnabled: false,
@@ -736,6 +776,7 @@ export function recordGeometryDraws(
736
776
  blend: submeshMaterial.renderState?.blend ?? SPRITE_PREMULTIPLIED_ALPHA_BLEND,
737
777
  }
738
778
  : geometryRenderStateForTopology(smTopology, submeshMaterial.renderState);
779
+ const pipelineRenderState = geometryRenderStateForPass(basePipelineRenderState, passKind);
739
780
  let smPipelineHandle: typeof pipelineState.unlitPipeline;
740
781
  if (smMaterialShaderId === undefined || smMaterialShaderId === 'forgeax::default-unlit') {
741
782
  const unlitShaderId = smMaterialShaderId ?? 'forgeax::default-unlit';
@@ -763,7 +804,7 @@ export function recordGeometryDraws(
763
804
  smPipelineHandle =
764
805
  unlitRsp ??
765
806
  (colorFormatOverride === undefined
766
- ? selectGeometryPipeline(pipelineState, tonemapActive, msaaActive)
807
+ ? selectGeometryPipeline(pipelineState, isHdrTarget, msaaActive)
767
808
  : null);
768
809
  } else if (smMaterialShaderId !== undefined) {
769
810
  // feat-20260609 M4.5 / w38 (D-11): the variantSet handed to
@@ -793,18 +834,23 @@ export function recordGeometryDraws(
793
834
  ? ''
794
835
  : 'CLUSTER_FORWARD_AVAILABLE=true+STORAGE_BUFFER_AVAILABLE=true'
795
836
  : 'CLUSTER_FORWARD_AVAILABLE=false+STORAGE_BUFFER_AVAILABLE=true';
796
- const authoredVariantSet =
797
- isSpriteShader && entry.source.spriteInstances !== undefined ? '' : entry.variantSet;
798
- const variantSet =
799
- authoredVariantSet === undefined
837
+ // Sprite's base request must retain the boot-selected artifact. Only
838
+ // SpriteInstances uses the explicit empty key for the
839
+ // PER_INSTANCE_REGION=true variant; synthesizing the generic PBR
840
+ // capability axes for a base sprite would invent a lazy module label
841
+ // that has no boot seed and skip the first HDR draw.
842
+ const variantSet = isSpriteShader
843
+ ? smMaterialShaderId === 'forgeax::sprite' && entry.source.spriteInstances !== undefined
844
+ ? ''
845
+ : undefined
846
+ : entry.variantSet === undefined
800
847
  ? capabilityVariantSet
801
848
  : capabilityVariantSet === ''
802
- ? authoredVariantSet
803
- : `${capabilityVariantSet}+${authoredVariantSet}`;
804
- const projectionVariantSetResult = variantSetFromVertexLayoutProjection(
805
- entry.mesh.layoutProjection,
806
- variantSet,
807
- );
849
+ ? entry.variantSet
850
+ : `${capabilityVariantSet}+${entry.variantSet}`;
851
+ const projectionVariantSetResult = isSpriteShader
852
+ ? ({ ok: true, value: variantSet } as const)
853
+ : variantSetFromVertexLayoutProjection(entry.mesh.layoutProjection, variantSet);
808
854
  if (!projectionVariantSetResult.ok) {
809
855
  runtime.errorRegistry.fire(projectionVariantSetResult.error);
810
856
  continue;
@@ -833,7 +879,7 @@ export function recordGeometryDraws(
833
879
  // fires on per-submesh topology variance miss.
834
880
  smPipelineHandle = cachedPipeline ?? null;
835
881
  } else {
836
- smPipelineHandle = selectGeometryPipeline(pipelineState, tonemapActive, msaaActive);
882
+ smPipelineHandle = selectGeometryPipeline(pipelineState, isHdrTarget, msaaActive);
837
883
  }
838
884
 
839
885
  if (smPipelineHandle === null) {