@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
@@ -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 {
@@ -75,6 +84,7 @@ import type { PointsLinesRecordOwner, PointsLinesRecordSubmission } from './reco
75
84
  export type { RenderSceneInspection } from './inspection-types';
76
85
 
77
86
  import { deriveVertexLayoutProjection } from '@forgeax/engine-geometry';
87
+ import type { EnvironmentInspection } from './environment/inspection';
78
88
  import {
79
89
  GPU_BUFFER_USAGE_COPY_DST,
80
90
  GPU_BUFFER_USAGE_INDEX,
@@ -85,7 +95,12 @@ import { assembleMaterialWithSkylightEntries } from './ibl/skylight-bind-group';
85
95
  import { disposeInstanceBuffers, disposeTransientInstanceBuffers } from './instance-buffer-cache';
86
96
  import type { MeshMaterialBindingObservation } from './mesh-material-bindings';
87
97
  import { validateClusterGrid } from './pipeline/standard-pipeline';
88
- import { DEFAULT_CLUSTER_GRID } from './pipeline/standard-profile';
98
+ import {
99
+ DEFAULT_CLUSTER_GRID,
100
+ DEFAULT_STANDARD_PROFILE,
101
+ resolveStandardLane,
102
+ } from './pipeline/standard-profile';
103
+ import { PipelineSpecError } from './pipeline-spec';
89
104
  import { PostProcessError } from './post-process-errors';
90
105
  import {
91
106
  createPreparedGraphicsResolver,
@@ -99,7 +114,12 @@ import {
99
114
  recordFrame,
100
115
  } from './record/frame';
101
116
  import { buildPerFrameBindGroups } from './record/frame-lighting';
102
- import type { RenderFrameState } from './record/frame-snapshot';
117
+ import type {
118
+ CurrentGraphTarget,
119
+ GraphTargetCaptureRequest,
120
+ RenderFrameState,
121
+ } from './record/frame-snapshot';
122
+ import { getTextureIdentity } from './record/frame-snapshot';
103
123
  import { applyParamSnapshotToUbo, residentTextureView } from './record/main-pass-material';
104
124
  import type { RenderSystemInternals } from './record/render-context';
105
125
  import {
@@ -125,6 +145,19 @@ import {
125
145
  TRANSPARENT_SORT_MODE_LAYER_YZ,
126
146
  TRANSPARENT_SORT_MODE_LAYER_Z,
127
147
  } from './systems/transparent-sort-config';
148
+ import { retireTemporalGpuState } from './temporal/gpu';
149
+ import { inspectTemporal, type TemporalInspection } from './temporal/inspection';
150
+ import {
151
+ evaluateTransmissionCapability,
152
+ probeTransmissionCapability,
153
+ resolveTransmissionBackdropTopology,
154
+ TransmissionCandidateAdmission,
155
+ } from './transmission/backdrop';
156
+ import {
157
+ estimateTransmissionBackdropBytes,
158
+ inspectTransmission,
159
+ inspectTransmissionFromAdmission,
160
+ } from './transmission/inspection';
128
161
 
129
162
  export type {
130
163
  _InternalRenderPipelineContext,
@@ -134,12 +167,15 @@ export type {
134
167
  RenderSystemInternals,
135
168
  RenderSystemRuntime,
136
169
  SurfaceBackendKind,
170
+ SurfaceCapabilityFacts,
171
+ SurfaceProfile,
137
172
  SwapChainFormatPair,
138
173
  } from './record/render-context';
139
174
  export {
140
175
  configureSurface,
141
176
  MATERIAL_PER_ENTITY_STRIDE,
142
177
  resolveSurfaceFormatPair,
178
+ resolveSurfaceProfile,
143
179
  STANDARD_PBR_UBO_SIZE,
144
180
  selectSwapChainFormat,
145
181
  } from './record/render-context';
@@ -297,6 +333,10 @@ export interface RenderSystem {
297
333
  observeCurrentFrame(
298
334
  options: FrameObservationOptions,
299
335
  ): Promise<Result<FrameObservation, ObservationUnavailableError>>;
336
+ /** Internal same-frame graph target access for backend diagnostics. */
337
+ getCurrentGraphTarget(name: string): CurrentGraphTarget | undefined;
338
+ /** Internal test capture copied into the draw's command submission. */
339
+ requestGraphTargetCapture(request: GraphTargetCaptureRequest): void;
300
340
  readonly pipelineDispatchCounts: {
301
341
  readonly unlit: number;
302
342
  };
@@ -309,6 +349,13 @@ export interface RenderSystem {
309
349
  readonly visibilityStats: { explicitlyHidden: number };
310
350
  /** Persistent scene maintenance evidence from the ordinary single-World path. */
311
351
  readonly renderScene: RenderSceneInspection;
352
+ readonly environment: EnvironmentInspection;
353
+ readonly temporal: TemporalInspection;
354
+ readonly bloom: BloomInspection;
355
+ readonly motionBlurInspection: MotionBlurInspection | undefined;
356
+ readonly temporalTargetInspection: TemporalTargetInspection | undefined;
357
+ /** Last completed transmission candidate facts, detached from GPU handles. */
358
+ readonly transmission: TransmissionInspection | undefined;
312
359
  /** Retained Points/Lines authoring facts from the single scene projection. */
313
360
  readonly pointsLinesSnapshots: readonly PointsLinesRetainedSnapshot[];
314
361
  /** Current mesh-slot provenance and active diagnostics from the last frame. */
@@ -322,6 +369,10 @@ export interface RenderSystem {
322
369
  * reaching into engine internals.
323
370
  */
324
371
  readonly perFramePassNames: readonly string[];
372
+ /** Camera antialias mode for the last successfully submitted frame. */
373
+ readonly lastSuccessfulCameraAntialias: CameraSnapshot['antialias'] | undefined;
374
+ /** Detached compiled-graph facts used by the renderer inspection owner. */
375
+ readonly perFrameGraphInfo: CompiledRenderGraphInfo | undefined;
325
376
  /**
326
377
  * feat-20260531-per-frame-bind-group-cache M1 / w4: per-frame
327
378
  * createBindGroup counter. Reset to 0 on every `draw([world], { cameraOwner: 0, resourceOwner: 0 })` entry,
@@ -701,6 +752,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
701
752
  let releaseProfilerCatalog =
702
753
  phaseCatalogRegistration?.ok === true ? phaseCatalogRegistration.value : undefined;
703
754
  let preparedWorlds: readonly World[] = [];
755
+ let latestCamera: CameraSnapshot | undefined;
704
756
  const pointsLinesOwner = new StandardPointsLinesOwner(internals);
705
757
  const persistentRenderScene = new PersistentRenderScene({
706
758
  getDevice: () => internals.device,
@@ -709,6 +761,131 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
709
761
  internals.gpuStore.invalidateMesh(handle, preparedWorlds[worldId] ?? worldId);
710
762
  },
711
763
  });
764
+ const environmentLifecycle = new EnvironmentLifecycle(internals.deviceScope);
765
+ const transmissionAdmission = new TransmissionCandidateAdmission();
766
+ let lastTransmissionInspection: TransmissionInspection | undefined;
767
+ let lastTransmissionKey = '';
768
+ let lastTransmissionAntialias: CameraSnapshot['antialias'] = 'none';
769
+ let transmissionCapabilityGeneration = -1;
770
+ let transmissionCapability:
771
+ | import('./transmission/backdrop').TransmissionCapabilityFacts
772
+ | undefined;
773
+ const prepareTransmissionCandidate = (antialias: CameraSnapshot['antialias']): boolean => {
774
+ const demand = persistentRenderScene.transmissionTopologyDemand();
775
+ if (demand.activeCount === 0) return true;
776
+ const topology = resolveTransmissionBackdropTopology({
777
+ demand,
778
+ sourceSampleCount: antialias === 'msaa' ? 4 : 1,
779
+ });
780
+ if (transmissionCapabilityGeneration !== internals.deviceScope.generation) {
781
+ transmissionCapability = probeTransmissionCapability(internals.device);
782
+ transmissionCapabilityGeneration = internals.deviceScope.generation;
783
+ }
784
+ if (transmissionCapability === undefined) {
785
+ throw new Error('transmission capability probe did not produce a result');
786
+ }
787
+ const capability = {
788
+ ...transmissionCapability,
789
+ msaaResolve: antialias === 'msaa' || topology.sourceSampleCount === 1,
790
+ } as const;
791
+ const verdict = evaluateTransmissionCapability(capability);
792
+ if (verdict.ok) return true;
793
+
794
+ const extent = {
795
+ width: Math.max(1, internals.canvas.width),
796
+ height: Math.max(1, internals.canvas.height),
797
+ };
798
+ const resource = {
799
+ extent,
800
+ format: capability.format,
801
+ mipCount: topology.mipCount === 0 ? 1 : numMipLevels(extent),
802
+ bytes: estimateTransmissionBackdropBytes(
803
+ extent,
804
+ topology.mipCount === 0 ? 1 : numMipLevels(extent),
805
+ capability.format,
806
+ ),
807
+ deviceGeneration: internals.deviceScope.generation,
808
+ } as const;
809
+ transmissionAdmission.admit(demand, capability, resource);
810
+ internals.errorRegistry.fire(
811
+ new TransmissionCapabilityMissingError('standard transmission', 'prepare', {
812
+ lane: 'standard-forward',
813
+ format: capability.format,
814
+ missing: verdict.missing,
815
+ }),
816
+ );
817
+ return false;
818
+ };
819
+ const updateTransmissionInspection = (
820
+ antialias: CameraSnapshot['antialias'],
821
+ submitted: boolean,
822
+ ): void => {
823
+ lastTransmissionAntialias = antialias;
824
+ const demand = persistentRenderScene.transmissionTopologyDemand();
825
+ if (demand.activeCount === 0) {
826
+ lastTransmissionInspection = undefined;
827
+ lastTransmissionKey = '';
828
+ return;
829
+ }
830
+ const extent = {
831
+ width: Math.max(1, internals.canvas.width),
832
+ height: Math.max(1, internals.canvas.height),
833
+ };
834
+ const topology = resolveTransmissionBackdropTopology({
835
+ demand,
836
+ sourceSampleCount: antialias === 'msaa' ? 4 : 1,
837
+ });
838
+ if (transmissionCapabilityGeneration !== internals.deviceScope.generation) {
839
+ transmissionCapability = probeTransmissionCapability(internals.device);
840
+ transmissionCapabilityGeneration = internals.deviceScope.generation;
841
+ }
842
+ if (transmissionCapability === undefined) {
843
+ throw new Error('transmission capability probe did not produce a result');
844
+ }
845
+ const resource = {
846
+ extent,
847
+ format: 'rgba16float',
848
+ mipCount: topology.mipCount === 0 ? 1 : numMipLevels(extent),
849
+ bytes: estimateTransmissionBackdropBytes(
850
+ extent,
851
+ topology.mipCount === 0 ? 1 : numMipLevels(extent),
852
+ ),
853
+ deviceGeneration: internals.deviceScope.generation,
854
+ } as const;
855
+ const key = `${demand.activeCount}:${demand.needsRoughMips}:${extent.width}:${extent.height}:${resource.deviceGeneration}:${antialias}:${submitted}`;
856
+ if (key === lastTransmissionKey && lastTransmissionInspection !== undefined) return;
857
+ if (submitted) {
858
+ transmissionAdmission.admit(
859
+ demand,
860
+ {
861
+ ...transmissionCapability,
862
+ msaaResolve: antialias === 'msaa' || topology.sourceSampleCount === 1,
863
+ },
864
+ resource,
865
+ );
866
+ }
867
+ const admission = transmissionAdmission.inspectLifecycle();
868
+ lastTransmissionInspection = submitted
869
+ ? inspectTransmissionFromAdmission({
870
+ admission,
871
+ topology,
872
+ extent,
873
+ transmissionDrawCount: demand.activeCount,
874
+ })
875
+ : inspectTransmission({
876
+ demand,
877
+ topology,
878
+ extent,
879
+ generation: admission.generation,
880
+ lastKnownGood: admission.lastKnownGood,
881
+ lifecycle: admission.lifecycle,
882
+ recovery: admission.recovery,
883
+ capability: admission.capability,
884
+ resourcePresent: admission.resource !== undefined,
885
+ transmissionDrawCount: demand.activeCount,
886
+ });
887
+ lastTransmissionKey = key;
888
+ };
712
889
  const gpuDrivenShaderFactory =
713
890
  internals.shaderModuleFactory ??
714
891
  ({
@@ -736,6 +913,19 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
736
913
  }),
737
914
  ),
738
915
  } satisfies import('./pipeline-builder').PipelineBuilderShaderModuleFactory),
916
+ getImmediateShaderModuleFactory: () =>
917
+ internals.immediateShaderModuleFactory ??
918
+ internals.shaderModuleFactory ??
919
+ ({
920
+ createShaderModule: () =>
921
+ err(
922
+ new RhiError({
923
+ code: 'rhi-not-available',
924
+ expected: 'the renderer backend exposes shader module creation',
925
+ hint: 'construct the renderer through the backend pack before activating GPU features',
926
+ }),
927
+ ),
928
+ } satisfies import('./pipeline-builder').PipelineBuilderShaderModuleFactory),
739
929
  });
740
930
  const disposeFeatureGpuWork = (): void => {
741
931
  const disposed = featureGpuWork.dispose();
@@ -756,12 +946,23 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
756
946
  // raw (material-handle-based, cross-world collision semantically correct).
757
947
  const frameState: RenderFrameState = {
758
948
  frameNumber: 0,
949
+ graphGeneration: 0,
950
+ successfulTemporalFrameIndex: 0,
951
+ lastSuccessfulBloom: 'off',
759
952
  directionalShadowCache: null,
760
953
  directionalShadowCacheRecorded: false,
761
954
  compiledFrameGraph: null,
762
955
  compiledFrameGraphTopologyKey: null,
763
956
  retiredCompiledFrameGraphs: new Set(),
764
957
  currentFrameObservationSource: undefined,
958
+ lastSuccessfulCameraAntialias: undefined,
959
+ temporalGpuState: undefined,
960
+ activeTemporalGpuState: undefined,
961
+ retiringTemporalGpuStates: new Set(),
962
+ lastSuccessfulTemporalView: undefined,
963
+ pendingTemporalCommit: { kind: 'none' },
964
+ environmentGeneration: undefined,
965
+ environmentLifecycle,
765
966
  currentDirectionalShadowView: null,
766
967
  currentSpotShadowView: null,
767
968
  instanceBuffers: new Map(),
@@ -920,6 +1121,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
920
1121
  ...featureEntries.entries(),
921
1122
  ]);
922
1123
  for (const [id, entry] of declarations) {
1124
+ if (id === 'forgeax.taa-resolve') continue;
923
1125
  const byteSize =
924
1126
  entry.params?.byteSize ?? (entryHasDepthRead(entry) ? DEPTH_MIN_PARAMS_BYTE_SIZE : 0);
925
1127
  if (byteSize === 0 || postProcessParamsBuffers.has(id)) continue;
@@ -970,10 +1172,16 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
970
1172
  postProcessPipelineCache.set(key, built);
971
1173
  return built;
972
1174
  };
1175
+ const clearPostProcessPipelineCache = (id: string): void => {
1176
+ for (const key of postProcessPipelineCache.keys()) {
1177
+ if (key.startsWith(`${id}|`)) postProcessPipelineCache.delete(key);
1178
+ }
1179
+ };
973
1180
  Object.assign(internals, {
974
1181
  lookupPostProcess,
975
1182
  getPostProcessParamsBuffer,
976
1183
  getPostProcessPipeline,
1184
+ clearPostProcessPipelineCache,
977
1185
  });
978
1186
  // w15 M5 (plan-strategy D-P4 / AC-07): per-frame dispatch counters. Reset
979
1187
  // on every `draw([world], { cameraOwner: 0, resourceOwner: 0 })` entry; bumped once per actual `pass.setPipeline`
@@ -1121,42 +1329,20 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1121
1329
  if (buffer !== undefined) internals.device.destroyBuffer(buffer);
1122
1330
  return err(new Error('prepared material schema contains unsupported binding kinds'));
1123
1331
  }
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
1332
  const fallback = pipelineState.skylightFallback;
1138
1333
  if (fallback === null) {
1139
1334
  if (buffer !== undefined) internals.device.destroyBuffer(buffer);
1140
1335
  return err(new Error('prepared material skylight fallback is unavailable'));
1141
1336
  }
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
- );
1337
+ const completeEntries = assembleMaterialWithSkylightEntries(entries, {
1338
+ irradianceView: fallback.irradianceView,
1339
+ irradianceSampler: fallback.sampler,
1340
+ prefilterView: fallback.prefilterView,
1341
+ prefilterSampler: fallback.sampler,
1342
+ brdfLutView: fallback.brdfLutView,
1343
+ brdfLutSampler: fallback.sampler,
1344
+ intensityBuffer: fallback.intensityBuffer,
1345
+ });
1160
1346
  const group = internals.device.createBindGroup({ layout, entries: completeEntries });
1161
1347
  if (!group.ok) {
1162
1348
  if (buffer !== undefined) internals.device.destroyBuffer(buffer);
@@ -1232,6 +1418,8 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1232
1418
  ? null
1233
1419
  : (descriptor.depthFormat as GPUTextureFormat),
1234
1420
  descriptor.vertexLayout,
1421
+ undefined,
1422
+ input.shaderModuleMode,
1235
1423
  );
1236
1424
  // A requested material shader is an exact pipeline contract. During
1237
1425
  // async shader warmup, substituting the generic unlit pipeline can
@@ -1367,6 +1555,98 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1367
1555
  gpuDriven: gpuDrivenProduction.inspect(),
1368
1556
  };
1369
1557
  },
1558
+ get environment(): EnvironmentInspection {
1559
+ return environmentLifecycle.inspect();
1560
+ },
1561
+ get temporal(): TemporalInspection {
1562
+ return inspectTemporal(frameState.lastSuccessfulTemporalView, undefined, {
1563
+ ...(frameState.activeTemporalGpuState === undefined
1564
+ ? {}
1565
+ : { active: frameState.activeTemporalGpuState }),
1566
+ ...(frameState.temporalGpuState === undefined
1567
+ ? {}
1568
+ : { candidate: frameState.temporalGpuState }),
1569
+ retiring: [...frameState.retiringTemporalGpuStates],
1570
+ deviceGeneration: internals.deviceScope.generation,
1571
+ });
1572
+ },
1573
+ get motionBlurInspection(): MotionBlurInspection | undefined {
1574
+ const camera = latestCamera;
1575
+ if (camera?.motionBlur === undefined) return undefined;
1576
+ const demanded = camera.motionBlur.shutterAngle > 0;
1577
+ const unavailable = demanded && !internals.device.caps.rgba16floatRenderable;
1578
+ const admitted =
1579
+ frameState.activeTemporalGpuState !== undefined ||
1580
+ frameState.temporalGpuState !== undefined;
1581
+ return {
1582
+ enabled: demanded,
1583
+ status: !demanded ? 'off' : unavailable || !admitted ? 'reset' : 'active',
1584
+ shutterAngle: camera.motionBlur.shutterAngle,
1585
+ maxRadiusPixels: camera.motionBlur.maxRadiusPixels,
1586
+ sampleCount: camera.motionBlur.sampleCount,
1587
+ temporalDemand: demanded ? 'scene-data-temporal-v1' : 'none',
1588
+ passName: 'motion-blur',
1589
+ historyWrites: 0,
1590
+ ...(unavailable ? { lastFailure: 'scene-data-unavailable' as const } : {}),
1591
+ };
1592
+ },
1593
+ get temporalTargetInspection(): TemporalTargetInspection | undefined {
1594
+ const graph = frameState.compiledFrameGraph?.inspect();
1595
+ if (graph === undefined) return undefined;
1596
+ const producer = graph.passes.find((pass) => pass.name === 'standard-scene-data');
1597
+ // The producer's semantic target is the graph-owned
1598
+ // `standard-scene-temporal` resource. Resolve it from the compiled
1599
+ // resource table rather than the pass access projection: a backend may
1600
+ // retain a view alias in the access list while the resource owner still
1601
+ // carries the canonical semantic label.
1602
+ const target = graph.resources.find(
1603
+ (resource) => resource.kind === 'texture' && resource.label === 'standard-scene-temporal',
1604
+ );
1605
+ if (producer === undefined || target === undefined) {
1606
+ return undefined;
1607
+ }
1608
+ const width = Math.max(1, internals.canvas.width);
1609
+ const height = Math.max(1, internals.canvas.height);
1610
+ return Object.freeze({
1611
+ identity: 'standard-scene-temporal',
1612
+ producerId: 'forgeax::standard::scene-data',
1613
+ schema: 'forgeax::scene-data::temporal-v1',
1614
+ targetCount: 1,
1615
+ descriptor: Object.freeze({
1616
+ format: 'rgba16float',
1617
+ width,
1618
+ height,
1619
+ sampleCount: 1,
1620
+ bytes: width * height * 8,
1621
+ }),
1622
+ });
1623
+ },
1624
+ get bloom(): BloomInspection {
1625
+ const pipelineState = internals.getPipelineState();
1626
+ const resources = pipelineState?.perPassResources;
1627
+ const lifecycle = resources?.inspectBloomResources?.(
1628
+ frameState.compiledFrameGraph?.inspect(),
1629
+ );
1630
+ return Object.freeze(
1631
+ lifecycle ?? {
1632
+ graphStatus: 'empty',
1633
+ enabled: false,
1634
+ targetCount: 0,
1635
+ targetBytes: 0,
1636
+ resourceCount: 0,
1637
+ passCount: 0,
1638
+ encodeCount: 0,
1639
+ bindGroupCount: 0,
1640
+ uploadCount: 0,
1641
+ residentChildBytes: 0,
1642
+ generation: 0,
1643
+ state: 'off',
1644
+ },
1645
+ );
1646
+ },
1647
+ get transmission(): TransmissionInspection | undefined {
1648
+ return lastTransmissionInspection;
1649
+ },
1370
1650
  get pointsLinesSnapshots(): readonly PointsLinesRetainedSnapshot[] {
1371
1651
  return persistentRenderScene.pointsLinesSnapshots();
1372
1652
  },
@@ -1450,16 +1730,52 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1450
1730
  const {
1451
1731
  cameras,
1452
1732
  lights,
1733
+ environment,
1734
+ environmentReady,
1453
1735
  renderables,
1454
1736
  dispatch,
1455
1737
  skylight,
1456
1738
  skylightCount,
1457
1739
  skybox,
1458
1740
  skyboxCount,
1741
+ fog,
1459
1742
  frustumStats,
1460
1743
  visibilityStats,
1461
1744
  postProcessParams,
1462
1745
  } = frame;
1746
+ latestCamera = cameras[0];
1747
+ const temporalDemanded =
1748
+ cameras[0]?.antialias === 'taa' || (cameras[0]?.motionBlur?.shutterAngle ?? 0) > 0;
1749
+ if (temporalDemanded) {
1750
+ persistentRenderScene.prepareTemporalFrame(renderables);
1751
+ }
1752
+ environmentLifecycle.bindScope(internals.deviceScope);
1753
+ if (!environmentReady || environment === undefined) {
1754
+ frameState.pendingTemporalCommit = { kind: 'none' };
1755
+ // A world with no camera still has a valid clear-only render path.
1756
+ // It has no environment candidate and therefore must not publish an
1757
+ // off/taa temporal state; camera-bearing rejected extraction remains
1758
+ // an atomic render failure.
1759
+ if (cameras.length > 0) return false;
1760
+ } else {
1761
+ const environmentCandidate = environmentLifecycle.ensure(environment);
1762
+ if (!environmentCandidate.ok) {
1763
+ environmentLifecycle.recordCandidateFailure(environmentCandidate.error);
1764
+ internals.errorRegistry.fire(environmentCandidate.error);
1765
+ return false;
1766
+ }
1767
+ if (!environmentLifecycle.isActive(environmentCandidate.value)) {
1768
+ frameState.environmentGeneration = environmentCandidate.value;
1769
+ }
1770
+ }
1771
+ const transmissionAntialias = frame.cameras[0]?.antialias ?? 'none';
1772
+ if (!prepareTransmissionCandidate(transmissionAntialias)) {
1773
+ // The candidate gate runs before bind-group preparation, graph
1774
+ // construction, and record/submit. A missing capability therefore
1775
+ // cannot publish or execute a transmission graph.
1776
+ updateTransmissionInspection(transmissionAntialias, false);
1777
+ return false;
1778
+ }
1463
1779
  if (lastMeshMaterialBindingFrame !== frame) {
1464
1780
  lastMeshMaterialBindingFrame = frame;
1465
1781
  lastMeshMaterialBindings = renderables.map((renderable) => ({
@@ -1530,6 +1846,9 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1530
1846
  targets: featureTargets,
1531
1847
  generation: internals.featureHost?.preparedGeneration ?? 0,
1532
1848
  caps: internals.device.caps,
1849
+ ...(internals.getMaterialShaderBindingContract === undefined
1850
+ ? {}
1851
+ : { materialShaderBindingContract: internals.getMaterialShaderBindingContract }),
1533
1852
  createPreparedGraphicsResolver: preparedResolverFactory,
1534
1853
  gpuWork: featureGpuWork,
1535
1854
  });
@@ -1605,6 +1924,9 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1605
1924
  }
1606
1925
  return runProfiledRenderPhase(profileSession, phase, action);
1607
1926
  };
1927
+ if (cameras[0]?.bloom === 'on') {
1928
+ internals.getPipelineState()?.perPassResources.ensureBloomResources?.();
1929
+ }
1608
1930
  submitted = runProfiledRenderPhase(profileSession, 'record', () =>
1609
1931
  recordFrame(
1610
1932
  internals,
@@ -1621,6 +1943,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1621
1943
  skybox,
1622
1944
  skyboxCount,
1623
1945
  postProcessParams,
1946
+ fog,
1624
1947
  worlds,
1625
1948
  recordProfilePhase,
1626
1949
  {
@@ -1634,8 +1957,36 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1634
1957
  renderReadLeases,
1635
1958
  featureGraphCandidate,
1636
1959
  pointsLinesOwner,
1960
+ environment?.environmentSignature ?? '',
1961
+ environment?.fogSignature ?? '',
1962
+ environmentReady && environment !== undefined,
1963
+ persistentRenderScene.transmissionTopologyDemand(),
1637
1964
  ),
1638
1965
  );
1966
+ if (submitted) {
1967
+ const temporalCommit = persistentRenderScene.commitTemporalFrame();
1968
+ if (!temporalCommit.ok) {
1969
+ internals.errorRegistry.fire(temporalCommit.error);
1970
+ }
1971
+ frameState.lastSuccessfulCameraAntialias = cameras[0]?.antialias;
1972
+ internals.getPipelineState()?.perPassResources.commitBloomResources?.();
1973
+ const nextBloom = cameras[0]?.bloom ?? 'off';
1974
+ if (frameState.lastSuccessfulBloom === 'on' && nextBloom !== 'on') {
1975
+ internals
1976
+ .getPipelineState()
1977
+ ?.perPassResources.retireBloomResources?.(
1978
+ internals.device.queue.onSubmittedWorkDone(),
1979
+ );
1980
+ }
1981
+ frameState.lastSuccessfulBloom = nextBloom;
1982
+ } else {
1983
+ internals.getPipelineState()?.perPassResources.discardBloomResources?.();
1984
+ }
1985
+ if (!submitted && frameState.environmentGeneration !== undefined) {
1986
+ environmentLifecycle.discard(frameState.environmentGeneration);
1987
+ frameState.environmentGeneration = undefined;
1988
+ }
1989
+ updateTransmissionInspection(transmissionAntialias, submitted);
1639
1990
  persistentRenderScene.setPointsLinesInspections(pointsLinesOwner.inspections());
1640
1991
  if (internals.featureHost !== undefined && preparedResourceBatches.length > 0) {
1641
1992
  const batches = preparedResourceBatches;
@@ -1653,10 +2004,20 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1653
2004
  }
1654
2005
  }
1655
2006
  } catch (err) {
2007
+ if (!submitted) {
2008
+ internals.getPipelineState()?.perPassResources.discardBloomResources?.();
2009
+ }
1656
2010
  const innerError =
1657
- err instanceof RhiError
1658
- ? err
1659
- : { code: 'unknown' as const, message: String(err), name: (err as Error)?.name };
2011
+ err instanceof PipelineSpecError
2012
+ ? {
2013
+ name: err.name,
2014
+ code: err.code,
2015
+ message: err.message,
2016
+ detail: err.detail,
2017
+ }
2018
+ : err instanceof RhiError
2019
+ ? err
2020
+ : { code: 'unknown' as const, message: String(err), name: (err as Error)?.name };
1660
2021
  internals.errorRegistry.fire(
1661
2022
  new RhiError({
1662
2023
  code: 'webgpu-runtime-error',
@@ -1681,6 +2042,24 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1681
2042
  const currentFrameId = frameState.frameNumber - 1;
1682
2043
  return observeCurrentFrame(options, frameState.currentFrameObservationSource, currentFrameId);
1683
2044
  },
2045
+ getCurrentGraphTarget(name: string) {
2046
+ const graph = frameState.perFrameGraph;
2047
+ if (graph === undefined || graph === null) return undefined;
2048
+ const descriptor = graph.getColorTargetDescriptor(name);
2049
+ const texture = graph.getColorTargetTexture(name);
2050
+ if (descriptor === undefined || texture === undefined) return undefined;
2051
+ return {
2052
+ name,
2053
+ texture,
2054
+ textureIdentity: getTextureIdentity(texture),
2055
+ descriptor,
2056
+ frameId: frameState.frameNumber - 1,
2057
+ graphGeneration: graph.graphGeneration,
2058
+ };
2059
+ },
2060
+ requestGraphTargetCapture(request: GraphTargetCaptureRequest) {
2061
+ frameState.graphTargetCapture = request;
2062
+ },
1684
2063
  bindGroupCounts: bindGroupCounts,
1685
2064
  frustumStats: lastFrustumStats,
1686
2065
  visibilityStats: lastVisibilityStats,
@@ -1690,6 +2069,12 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1690
2069
  get perFramePassNames(): readonly string[] {
1691
2070
  return frameState.compiledFrameGraph?.inspect().passes.map((pass) => pass.name) ?? [];
1692
2071
  },
2072
+ get lastSuccessfulCameraAntialias(): CameraSnapshot['antialias'] | undefined {
2073
+ return frameState.lastSuccessfulCameraAntialias;
2074
+ },
2075
+ get perFrameGraphInfo(): CompiledRenderGraphInfo | undefined {
2076
+ return frameState.compiledFrameGraph?.inspect();
2077
+ },
1693
2078
  configureStandard(config: RenderPipelineAsset['config']): void {
1694
2079
  const profileConfig = internals.standardProfile;
1695
2080
  const resolvedConfig =
@@ -1723,7 +2108,16 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1723
2108
  // is a rare boot/swap event, never a per-frame cost.
1724
2109
  installEpoch += 1;
1725
2110
  frameState.installedPipelineHandle = installEpoch;
1726
- frameState.isHdrpActive = resolvedConfig?.clusterGrid !== undefined;
2111
+ // The installed profile may request clustered lighting, but the actual
2112
+ // graph lane is capability-gated. On WebGL2 (including WebKit's wgpu
2113
+ // fallback) the forward lane is selected when compute/storage buffers
2114
+ // are unavailable; keep the frame bindings on that same lane instead of
2115
+ // advertising HDRP's clustered bind-group layout to URP pipelines.
2116
+ frameState.isHdrpActive =
2117
+ resolveStandardLane(internals.standardProfile ?? DEFAULT_STANDARD_PROFILE, {
2118
+ compute: internals.device.caps.compute,
2119
+ storageBuffer: internals.device.caps.storageBuffer,
2120
+ }) === 'clustered';
1727
2121
  frameState.installedPipelineConfig = resolvedConfig;
1728
2122
  },
1729
2123
  registerBuiltinPostProcess(id: string, entry: PostProcessShaderEntry): () => void {
@@ -1731,7 +2125,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1731
2125
  // byteSize / defaultValue validation (q5=A).
1732
2126
  let paramsBuffer: Buffer | undefined;
1733
2127
  try {
1734
- if (entry.params !== undefined) {
2128
+ if (id !== 'forgeax.taa-resolve' && entry.params !== undefined) {
1735
2129
  const { byteSize, defaultValue } = entry.params;
1736
2130
  if (byteSize < 16 || defaultValue.length !== byteSize) {
1737
2131
  throw new PostProcessError({
@@ -1749,7 +2143,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1749
2143
  paramsBuffer = paramsBufferResult.value;
1750
2144
  const writeResult = internals.device.queue.writeBuffer(paramsBuffer, 0, defaultValue);
1751
2145
  if (!writeResult.ok) throw writeResult.error;
1752
- } else if (entryHasDepthRead(entry)) {
2146
+ } else if (id !== 'forgeax.taa-resolve' && entryHasDepthRead(entry)) {
1753
2147
  const paramsBufferResult = internals.device.createBuffer({
1754
2148
  label: `post-process-params-${id}`,
1755
2149
  size: DEPTH_MIN_PARAMS_BYTE_SIZE,
@@ -1789,6 +2183,13 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1789
2183
  persistentRenderScene.dispose();
1790
2184
  gpuDrivenProduction.dispose();
1791
2185
  disposeFeatureGpuWork();
2186
+ // Bloom generations are renderer-owned rather than graph-owned. Drain
2187
+ // candidate, active, and fence-retiring bundles before the rest of the
2188
+ // frame state is torn down; the owner callback is idempotent so the
2189
+ // outer Renderer.dispose cascade can safely call this once only.
2190
+ internals.getPipelineState()?.perPassResources.drainBloomResources?.();
2191
+ internals.clearPostProcessPipelineCache?.('forgeax.taa-resolve');
2192
+ internals.invalidateShaderModule?.('post-process-forgeax.taa-resolve-module');
1792
2193
  // Retire graph-owned resources and dispose instance-buffer caches.
1793
2194
  // Both calls are idempotent + tolerate per-handle errors silently;
1794
2195
  // the Renderer.dispose() cascade owns the surrounding try/catch
@@ -1798,8 +2199,21 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1798
2199
  frameState.directionalShadowCache = null;
1799
2200
  frameState.directionalShadowCacheRecorded = false;
1800
2201
  frameState.currentFrameObservationSource = undefined;
2202
+ frameState.lastSuccessfulCameraAntialias = undefined;
1801
2203
  frameState.currentDirectionalShadowView = null;
1802
2204
  frameState.currentSpotShadowView = null;
2205
+ if (frameState.temporalGpuState !== undefined) {
2206
+ retireTemporalGpuState(frameState.temporalGpuState);
2207
+ frameState.temporalGpuState = undefined;
2208
+ }
2209
+ if (frameState.activeTemporalGpuState !== undefined) {
2210
+ retireTemporalGpuState(frameState.activeTemporalGpuState);
2211
+ frameState.activeTemporalGpuState = undefined;
2212
+ }
2213
+ for (const retiring of frameState.retiringTemporalGpuStates) {
2214
+ retireTemporalGpuState(retiring);
2215
+ }
2216
+ frameState.retiringTemporalGpuStates.clear();
1803
2217
  const compiled = frameState.compiledFrameGraph;
1804
2218
  frameState.compiledFrameGraph = null;
1805
2219
  frameState.compiledFrameGraphTopologyKey = null;
@@ -1833,10 +2247,23 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1833
2247
  }
1834
2248
  },
1835
2249
  resetForRecover(): void {
2250
+ transmissionAdmission.markDeviceLost();
2251
+ lastTransmissionKey = '';
2252
+ transmissionCapabilityGeneration = -1;
2253
+ transmissionCapability = undefined;
2254
+ // Keep the persistent material demand observable across device loss.
2255
+ // The physical resource has already been fenced by markDeviceLost(); the
2256
+ // detached inspection now exposes the rebuild-required lifecycle until a
2257
+ // completed frame admits the replacement resource.
2258
+ updateTransmissionInspection(lastTransmissionAntialias, false);
1836
2259
  persistentRenderScene.resetGpuForRecover();
1837
2260
  gpuDrivenProduction.dispose();
1838
2261
  gpuDrivenProduction = new GpuDrivenProduction(internals.device, gpuDrivenShaderFactory);
1839
2262
  disposeFeatureGpuWork();
2263
+ // A recovered device cannot retain handles from the lost device. The
2264
+ // Bloom owner abandons candidates and retires every committed generation
2265
+ // before the new PipelineState is rebuilt.
2266
+ internals.getPipelineState()?.perPassResources.drainBloomResources?.();
1840
2267
  // feat-20260622-s5 M3 / B-2 / w18: recover() rebuild drops device-bound
1841
2268
  // state minted by the lost device. The active graph and per-entity caches
1842
2269
  // must be discarded, not merely marked for destruction: their opaque
@@ -1848,8 +2275,21 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1848
2275
  frameState.directionalShadowCache = null;
1849
2276
  frameState.directionalShadowCacheRecorded = false;
1850
2277
  frameState.currentFrameObservationSource = undefined;
2278
+ frameState.lastSuccessfulCameraAntialias = undefined;
1851
2279
  frameState.currentDirectionalShadowView = null;
1852
2280
  frameState.currentSpotShadowView = null;
2281
+ if (frameState.temporalGpuState !== undefined) {
2282
+ retireTemporalGpuState(frameState.temporalGpuState);
2283
+ frameState.temporalGpuState = undefined;
2284
+ }
2285
+ if (frameState.activeTemporalGpuState !== undefined) {
2286
+ retireTemporalGpuState(frameState.activeTemporalGpuState);
2287
+ frameState.activeTemporalGpuState = undefined;
2288
+ }
2289
+ for (const retiring of frameState.retiringTemporalGpuStates) {
2290
+ retireTemporalGpuState(retiring);
2291
+ }
2292
+ frameState.retiringTemporalGpuStates.clear();
1853
2293
  for (const retired of frameState.retiredCompiledFrameGraphs) {
1854
2294
  retired.retire().catch(() => undefined);
1855
2295
  }
@@ -1886,6 +2326,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1886
2326
  ...activeFeaturePostProcessEntries.entries(),
1887
2327
  ];
1888
2328
  for (const [id, entry] of declarations) {
2329
+ if (id === 'forgeax.taa-resolve') continue;
1889
2330
  let buffer: Buffer | undefined;
1890
2331
  if (entry.params !== undefined) {
1891
2332
  const created = internals.device.createBuffer({