@forgeax/engine-render 0.1.6 → 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 (713) hide show
  1. package/README.md +279 -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 +19 -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/material/assembly.d.ts.map +1 -1
  10. package/dist/assembly/renderer-frame-transaction.d.ts +39 -0
  11. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -0
  12. package/dist/assembly/renderer-inspection.d.ts +22 -0
  13. package/dist/assembly/renderer-inspection.d.ts.map +1 -0
  14. package/dist/assembly/renderer-lifecycle.d.ts +4 -0
  15. package/dist/assembly/renderer-lifecycle.d.ts.map +1 -0
  16. package/dist/authoring.d.ts +1 -0
  17. package/dist/authoring.d.ts.map +1 -1
  18. package/dist/authoring.mjs +4 -2
  19. package/dist/authoring.mjs.map +1 -1
  20. package/dist/chunk-FJ6P52EE.mjs +46 -0
  21. package/dist/chunk-FJ6P52EE.mjs.map +1 -0
  22. package/dist/chunk-IPXCABEP.mjs +73 -0
  23. package/dist/chunk-IPXCABEP.mjs.map +1 -0
  24. package/dist/chunk-JDWARUOI.mjs +44 -0
  25. package/dist/chunk-JDWARUOI.mjs.map +1 -0
  26. package/dist/chunk-LOSO4CTV.mjs +901 -0
  27. package/dist/chunk-LOSO4CTV.mjs.map +1 -0
  28. package/dist/chunk-PCHBPYML.mjs +385 -0
  29. package/dist/chunk-PCHBPYML.mjs.map +1 -0
  30. package/dist/chunk-RJRUS55L.mjs +9323 -0
  31. package/dist/chunk-RJRUS55L.mjs.map +1 -0
  32. package/dist/{chunk-QC4VW3XJ.mjs → chunk-RXZ3RGOU.mjs} +4 -30
  33. package/dist/chunk-RXZ3RGOU.mjs.map +1 -0
  34. package/dist/{chunk-CQXZC5XI.mjs → chunk-VFPLTKCU.mjs} +79 -69
  35. package/dist/chunk-VFPLTKCU.mjs.map +1 -0
  36. package/dist/{chunk-SCRSAK5B.mjs → chunk-YTQ5C7YQ.mjs} +231 -127
  37. package/dist/chunk-YTQ5C7YQ.mjs.map +1 -0
  38. package/dist/components/atmosphere.d.ts +9 -0
  39. package/dist/components/atmosphere.d.ts.map +1 -0
  40. package/dist/components/camera.d.ts +2 -1
  41. package/dist/components/camera.d.ts.map +1 -1
  42. package/dist/components/fog.d.ts +8 -0
  43. package/dist/components/fog.d.ts.map +1 -0
  44. package/dist/components/index.d.ts +5 -0
  45. package/dist/components/index.d.ts.map +1 -1
  46. package/dist/components/lines.d.ts +5 -0
  47. package/dist/components/lines.d.ts.map +1 -0
  48. package/dist/components/motion-blur.d.ts +7 -0
  49. package/dist/components/motion-blur.d.ts.map +1 -0
  50. package/dist/components/points.d.ts +15 -0
  51. package/dist/components/points.d.ts.map +1 -0
  52. package/dist/construct-renderer.d.ts +2 -2
  53. package/dist/construct-renderer.d.ts.map +1 -1
  54. package/dist/construct-renderer.mjs +11419 -16442
  55. package/dist/construct-renderer.mjs.map +1 -1
  56. package/dist/device/device-scope.d.ts +4 -0
  57. package/dist/device/device-scope.d.ts.map +1 -1
  58. package/dist/environment/frame.d.ts +60 -0
  59. package/dist/environment/frame.d.ts.map +1 -0
  60. package/dist/environment/generation.d.ts +21 -0
  61. package/dist/environment/generation.d.ts.map +1 -0
  62. package/dist/environment/graph.d.ts +4 -0
  63. package/dist/environment/graph.d.ts.map +1 -0
  64. package/dist/environment/inspection.d.ts +48 -0
  65. package/dist/environment/inspection.d.ts.map +1 -0
  66. package/dist/environment/lifecycle.d.ts +39 -0
  67. package/dist/environment/lifecycle.d.ts.map +1 -0
  68. package/dist/environment/signature.d.ts +25 -0
  69. package/dist/environment/signature.d.ts.map +1 -0
  70. package/dist/errors/render.d.ts +217 -1
  71. package/dist/errors/render.d.ts.map +1 -1
  72. package/dist/extract/camera.d.ts +5 -0
  73. package/dist/extract/camera.d.ts.map +1 -0
  74. package/dist/extract/environment.d.ts +74 -0
  75. package/dist/extract/environment.d.ts.map +1 -0
  76. package/dist/extract/visibility.d.ts +1 -1
  77. package/dist/extract/visibility.d.ts.map +1 -1
  78. package/dist/features/host.d.ts +9 -2
  79. package/dist/features/host.d.ts.map +1 -1
  80. package/dist/features/motion-blur/motion-blur-feature.d.ts +16 -0
  81. package/dist/features/motion-blur/motion-blur-feature.d.ts.map +1 -0
  82. package/dist/features/motion-blur/motion-blur-params.d.ts +25 -0
  83. package/dist/features/motion-blur/motion-blur-params.d.ts.map +1 -0
  84. package/dist/features/plan.d.ts +17 -2
  85. package/dist/features/plan.d.ts.map +1 -1
  86. package/dist/features/prepared-gpu-work.d.ts +3 -1
  87. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  88. package/dist/features/prepared-graphics.d.ts +2 -1
  89. package/dist/features/prepared-graphics.d.ts.map +1 -1
  90. package/dist/features/render-graph-raster.d.ts +7 -2
  91. package/dist/features/render-graph-raster.d.ts.map +1 -1
  92. package/dist/features/targets.d.ts +3 -0
  93. package/dist/features/targets.d.ts.map +1 -1
  94. package/dist/features/types.d.ts +12 -0
  95. package/dist/features/types.d.ts.map +1 -1
  96. package/dist/fullscreen-post-process-pass.d.ts +7 -1
  97. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  98. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  99. package/dist/gpu-scene.d.ts +2 -0
  100. package/dist/gpu-scene.d.ts.map +1 -1
  101. package/dist/ibl/skylight-bind-group.d.ts +5 -6
  102. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  103. package/dist/index.d.ts +21 -6
  104. package/dist/index.d.ts.map +1 -1
  105. package/dist/index.mjs +8 -4
  106. package/dist/index.mjs.map +1 -1
  107. package/dist/inspection-types.d.ts +46 -1
  108. package/dist/inspection-types.d.ts.map +1 -1
  109. package/dist/internal.d.ts +2 -0
  110. package/dist/internal.d.ts.map +1 -1
  111. package/dist/internal.mjs +2 -0
  112. package/dist/materials.d.ts +22 -0
  113. package/dist/materials.d.ts.map +1 -1
  114. package/dist/pbr-pipeline.d.ts +12 -6
  115. package/dist/pbr-pipeline.d.ts.map +1 -1
  116. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  117. package/dist/pipeline/standard-pipeline.d.ts +3 -0
  118. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  119. package/dist/pipeline/standard-post.d.ts +48 -0
  120. package/dist/pipeline/standard-post.d.ts.map +1 -0
  121. package/dist/pipeline/standard-profile.d.ts +3 -6
  122. package/dist/pipeline/standard-profile.d.ts.map +1 -1
  123. package/dist/pipeline-builder.d.ts +18 -0
  124. package/dist/pipeline-builder.d.ts.map +1 -1
  125. package/dist/pipeline-spec.d.ts.map +1 -1
  126. package/dist/plugin.d.ts.map +1 -1
  127. package/dist/points-lines/admission.d.ts +36 -0
  128. package/dist/points-lines/admission.d.ts.map +1 -0
  129. package/dist/points-lines/bounds.d.ts +8 -0
  130. package/dist/points-lines/bounds.d.ts.map +1 -0
  131. package/dist/points-lines/expansion-cache.d.ts +28 -0
  132. package/dist/points-lines/expansion-cache.d.ts.map +1 -0
  133. package/dist/points-lines/inspection.d.ts +53 -0
  134. package/dist/points-lines/inspection.d.ts.map +1 -0
  135. package/dist/points-lines/prepare.d.ts +67 -0
  136. package/dist/points-lines/prepare.d.ts.map +1 -0
  137. package/dist/points-lines/record.d.ts +60 -0
  138. package/dist/points-lines/record.d.ts.map +1 -0
  139. package/dist/points-lines/snapshot.d.ts +49 -0
  140. package/dist/points-lines/snapshot.d.ts.map +1 -0
  141. package/dist/record/frame-lighting.d.ts.map +1 -1
  142. package/dist/record/frame-snapshot.d.ts +100 -5
  143. package/dist/record/frame-snapshot.d.ts.map +1 -1
  144. package/dist/record/frame-targets.d.ts.map +1 -1
  145. package/dist/record/frame.d.ts +4 -2
  146. package/dist/record/frame.d.ts.map +1 -1
  147. package/dist/record/main-pass-geometry.d.ts +18 -0
  148. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  149. package/dist/record/main-pass-material.d.ts +8 -5
  150. package/dist/record/main-pass-material.d.ts.map +1 -1
  151. package/dist/record/main-pass-sprite-draws.d.ts +8 -1
  152. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  153. package/dist/record/main-pass.d.ts +2 -0
  154. package/dist/record/main-pass.d.ts.map +1 -1
  155. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  156. package/dist/record/render-context.d.ts +93 -18
  157. package/dist/record/render-context.d.ts.map +1 -1
  158. package/dist/record/shadow-pass.d.ts.map +1 -1
  159. package/dist/record/skybox-post-pass.d.ts +1 -11
  160. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  161. package/dist/record/typed-frame-graph.d.ts +26 -2
  162. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  163. package/dist/record/view-ubo.d.ts +10 -1
  164. package/dist/record/view-ubo.d.ts.map +1 -1
  165. package/dist/render-contract.d.ts +102 -10
  166. package/dist/render-contract.d.ts.map +1 -1
  167. package/dist/render-graph-primitives.d.ts.map +1 -1
  168. package/dist/render-pipeline.d.ts +50 -6
  169. package/dist/render-pipeline.d.ts.map +1 -1
  170. package/dist/render-system-extract.d.ts +32 -5
  171. package/dist/render-system-extract.d.ts.map +1 -1
  172. package/dist/render-system.d.ts +27 -5
  173. package/dist/render-system.d.ts.map +1 -1
  174. package/dist/scene/render-scene-types.d.ts +3 -0
  175. package/dist/scene/render-scene-types.d.ts.map +1 -1
  176. package/dist/scene/render-scene.d.ts +43 -2
  177. package/dist/scene/render-scene.d.ts.map +1 -1
  178. package/dist/temporal/coverage.d.ts +42 -0
  179. package/dist/temporal/coverage.d.ts.map +1 -0
  180. package/dist/temporal/frame-coordinator.d.ts +99 -0
  181. package/dist/temporal/frame-coordinator.d.ts.map +1 -0
  182. package/dist/temporal/gpu.d.ts +39 -0
  183. package/dist/temporal/gpu.d.ts.map +1 -0
  184. package/dist/temporal/history.d.ts +37 -0
  185. package/dist/temporal/history.d.ts.map +1 -0
  186. package/dist/temporal/index.d.ts +7 -0
  187. package/dist/temporal/index.d.ts.map +1 -0
  188. package/dist/temporal/index.mjs +8 -0
  189. package/dist/temporal/index.mjs.map +1 -0
  190. package/dist/temporal/inspection.d.ts +36 -0
  191. package/dist/temporal/inspection.d.ts.map +1 -0
  192. package/dist/temporal/scene-data-catalog.d.ts +48 -0
  193. package/dist/temporal/scene-data-catalog.d.ts.map +1 -0
  194. package/dist/temporal/scene-data.d.ts +43 -0
  195. package/dist/temporal/scene-data.d.ts.map +1 -0
  196. package/dist/temporal/standard-scene-data.d.ts +61 -0
  197. package/dist/temporal/standard-scene-data.d.ts.map +1 -0
  198. package/dist/temporal/taa-history-resources.d.ts +22 -0
  199. package/dist/temporal/taa-history-resources.d.ts.map +1 -0
  200. package/dist/temporal/taa-history-store.d.ts +27 -0
  201. package/dist/temporal/taa-history-store.d.ts.map +1 -0
  202. package/dist/temporal/taa-resolve.d.ts +15 -0
  203. package/dist/temporal/taa-resolve.d.ts.map +1 -0
  204. package/dist/temporal/temporal-view.d.ts +40 -0
  205. package/dist/temporal/temporal-view.d.ts.map +1 -0
  206. package/dist/temporal/transaction.d.ts +9 -0
  207. package/dist/temporal/transaction.d.ts.map +1 -0
  208. package/dist/temporal/view.d.ts +56 -0
  209. package/dist/temporal/view.d.ts.map +1 -0
  210. package/dist/transmission/backdrop.d.ts +147 -0
  211. package/dist/transmission/backdrop.d.ts.map +1 -0
  212. package/dist/transmission/inspection.d.ts +57 -0
  213. package/dist/transmission/inspection.d.ts.map +1 -0
  214. package/dist/transmission/oracle.d.ts +42 -0
  215. package/dist/transmission/oracle.d.ts.map +1 -0
  216. package/dist/transmission/projection.d.ts +37 -0
  217. package/dist/transmission/projection.d.ts.map +1 -0
  218. package/dist/typed-render-graph-primitives.d.ts +25 -2
  219. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  220. package/package.json +24 -19
  221. package/src/__tests__/ai-user-cold-start.integration.test.ts +59 -0
  222. package/src/__tests__/ai-user-public-surface.test-d.ts +45 -0
  223. package/src/__tests__/authoring-path.unit.test.ts +9 -0
  224. package/src/__tests__/bloom-exact-zero.unit.test.ts +202 -0
  225. package/src/__tests__/bloom-lifecycle.integration.test.ts +125 -0
  226. package/src/__tests__/construct-renderer-identity.unit.test.ts +4 -3
  227. package/src/__tests__/detached-inspection.integration.test.ts +177 -0
  228. package/src/__tests__/environment-fog-lanes.integration.test.ts +219 -0
  229. package/src/__tests__/environment-generation.integration.test.ts +141 -0
  230. package/src/__tests__/environment-selection.unit.test.ts +245 -0
  231. package/src/__tests__/factory-contract.integration.test.ts +1380 -9
  232. package/src/__tests__/frame-plan-contract.unit.test.ts +90 -0
  233. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +7 -0
  234. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +12 -2
  235. package/src/__tests__/gpu-driven-production.integration.test.ts +74 -22
  236. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +37 -0
  237. package/src/__tests__/gpu-scene.unit.test.ts +10 -0
  238. package/src/__tests__/injection-kind-owner.test-d.ts +2 -1
  239. package/src/__tests__/material-contract-inventory.unit.test.ts +62 -0
  240. package/src/__tests__/material-cooked-projection.unit.test.ts +18 -124
  241. package/src/__tests__/material-static-dynamic-route.unit.test.ts +28 -28
  242. package/src/__tests__/materials-transmission-validation.unit.test.ts +36 -0
  243. package/src/__tests__/morph-feature-plan.unit.test.ts +7 -0
  244. package/src/__tests__/motion-blur.pixel.integration.test.ts +121 -0
  245. package/src/__tests__/public-surface.test-d.ts +15 -1
  246. package/src/__tests__/render-error-code-owner.test-d.ts +15 -0
  247. package/src/__tests__/render-error-detail-ssot.test-d.ts +11 -2
  248. package/src/__tests__/render-error-exhaustive.test-d.ts +22 -0
  249. package/src/__tests__/render-feature-errors.unit.test.ts +33 -3
  250. package/src/__tests__/render-feature-gpu-work.integration.test.ts +44 -0
  251. package/src/__tests__/render-feature-plan.test-d.ts +22 -89
  252. package/src/__tests__/render-scene-projection.unit.test.ts +28 -0
  253. package/src/__tests__/render-temporal-environment-consumer.browser.test.ts +26 -0
  254. package/src/__tests__/render-temporal-environment-consumer.dawn.test.ts +21 -0
  255. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +433 -1
  256. package/src/__tests__/renderer-frame-transaction.integration.test.ts +405 -0
  257. package/src/__tests__/renderer-lifecycle.integration.test.ts +22 -0
  258. package/src/__tests__/scene-data-catalog.unit.test.ts +59 -0
  259. package/src/__tests__/scene-data-consumer.integration.test.ts +67 -0
  260. package/src/__tests__/scene-data-contract.test-d.ts +35 -0
  261. package/src/__tests__/scene-data-inspection.unit.test.ts +41 -0
  262. package/src/__tests__/scene-data-public-surface.test-d.ts +34 -0
  263. package/src/__tests__/shader-manifest-fixture.ts +111 -0
  264. package/src/__tests__/skinned-shadow-caster.test.ts +102 -0
  265. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +24 -3
  266. package/src/__tests__/standard-pipeline.dawn.test.ts +15 -0
  267. package/src/__tests__/standard-pipeline.integration.test.ts +543 -1
  268. package/src/__tests__/standard-profile-oracle.unit.test.ts +10 -2
  269. package/src/__tests__/standard-temporal-producer.integration.test.ts +35 -0
  270. package/src/__tests__/surface-configuration.unit.test.ts +211 -12
  271. package/src/__tests__/taa-transaction.integration.test.ts +30 -0
  272. package/src/__tests__/temporal-admission.integration.test.ts +40 -0
  273. package/src/__tests__/temporal-coverage.unit.test.ts +35 -0
  274. package/src/__tests__/temporal-demand.unit.test.ts +44 -0
  275. package/src/__tests__/temporal-frame-coordinator.unit.test.ts +64 -0
  276. package/src/__tests__/temporal-graph-topology.unit.test.ts +51 -0
  277. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +170 -0
  278. package/src/__tests__/temporal-performance.integration.test.ts +615 -0
  279. package/src/__tests__/temporal-reset-matrix.unit.test.ts +97 -0
  280. package/src/__tests__/temporal-transaction.integration.test.ts +60 -0
  281. package/src/__tests__/temporal-view.unit.test.ts +152 -0
  282. package/src/__tests__/transmission-prewarm.unit.test.ts +93 -0
  283. package/src/__tests__/typed-pipeline-topology.unit.test.ts +230 -1
  284. package/src/__tests__/urp-pipeline-targets.unit.test.ts +25 -1
  285. package/src/__tests__/urp-pipeline.unit.test.ts +4 -3
  286. package/src/__tests__/visibility-extract.integration.test.ts +27 -1
  287. package/src/__tests__/visibility-producer-matrix.integration.test.ts +10 -0
  288. package/src/assembly/backend-contract.ts +47 -1
  289. package/src/assembly/factory.ts +1295 -507
  290. package/src/assembly/host-contract.ts +4 -0
  291. package/src/assembly/material/assembly.ts +2 -5
  292. package/src/assembly/renderer-frame-transaction.ts +75 -0
  293. package/src/assembly/renderer-inspection.ts +112 -0
  294. package/src/assembly/renderer-lifecycle.ts +6 -0
  295. package/src/authoring.ts +1 -0
  296. package/src/components/__tests__/motion-blur.unit.test.ts +14 -0
  297. package/src/components/__tests__/points-lines-admission.unit.test.ts +219 -0
  298. package/src/components/__tests__/points-lines-schema.unit.test.ts +56 -0
  299. package/src/components/__tests__/schema-contract.unit.test.ts +6 -1
  300. package/src/components/atmosphere.ts +10 -0
  301. package/src/components/camera.ts +2 -1
  302. package/src/components/fog.ts +9 -0
  303. package/src/components/index.ts +10 -0
  304. package/src/components/lines.ts +18 -0
  305. package/src/components/motion-blur.ts +8 -0
  306. package/src/components/points.ts +40 -0
  307. package/src/construct-renderer.ts +40 -3
  308. package/src/device/device-scope.ts +15 -1
  309. package/src/environment/frame.ts +185 -0
  310. package/src/environment/generation.ts +23 -0
  311. package/src/environment/graph.ts +9 -0
  312. package/src/environment/inspection.ts +87 -0
  313. package/src/environment/lifecycle.ts +250 -0
  314. package/src/environment/signature.ts +55 -0
  315. package/src/errors/render.ts +429 -1
  316. package/src/extract/camera.ts +78 -0
  317. package/src/extract/environment.ts +171 -0
  318. package/src/extract/visibility.ts +38 -19
  319. package/src/features/host.ts +36 -5
  320. package/src/features/motion-blur/__tests__/motion-blur-feature.unit.test.ts +67 -0
  321. package/src/features/motion-blur/__tests__/motion-blur-params.unit.test.ts +53 -0
  322. package/src/features/motion-blur/motion-blur-feature.ts +119 -0
  323. package/src/features/motion-blur/motion-blur-params.ts +89 -0
  324. package/src/features/plan.ts +32 -3
  325. package/src/features/prepared-gpu-work.ts +21 -6
  326. package/src/features/prepared-graphics.ts +2 -1
  327. package/src/features/render-graph-raster.ts +24 -4
  328. package/src/features/targets.ts +24 -2
  329. package/src/features/types.ts +13 -0
  330. package/src/fullscreen-post-process-pass.ts +34 -4
  331. package/src/gpu-driven/production-raster.ts +6 -1
  332. package/src/gpu-scene.ts +24 -0
  333. package/src/ibl/skylight-bind-group.ts +30 -38
  334. package/src/index.ts +83 -6
  335. package/src/inspection-types.ts +52 -0
  336. package/src/internal.ts +5 -0
  337. package/src/materials.ts +119 -24
  338. package/src/pbr-pipeline.ts +66 -20
  339. package/src/pipeline/standard-forward-lane.ts +158 -101
  340. package/src/pipeline/standard-pipeline.ts +156 -105
  341. package/src/pipeline/standard-post.ts +373 -0
  342. package/src/pipeline/standard-profile.ts +11 -11
  343. package/src/pipeline-builder.ts +102 -12
  344. package/src/pipeline-spec.ts +9 -0
  345. package/src/plugin.ts +6 -0
  346. package/src/points-lines/__tests__/bounds.unit.test.ts +21 -0
  347. package/src/points-lines/__tests__/cache-recovery.unit.test.ts +157 -0
  348. package/src/points-lines/__tests__/inspection-lanes.integration.test.ts +146 -0
  349. package/src/points-lines/__tests__/inspection.unit.test.ts +173 -0
  350. package/src/points-lines/__tests__/lane-structural.integration.test.ts +122 -0
  351. package/src/points-lines/__tests__/points-lines.bench.ts +400 -0
  352. package/src/points-lines/__tests__/raster-lane.integration.test.ts +44 -0
  353. package/src/points-lines/__tests__/snapshot.unit.test.ts +101 -0
  354. package/src/points-lines/__tests__/view-ubo.unit.test.ts +73 -0
  355. package/src/points-lines/admission.ts +238 -0
  356. package/src/points-lines/bounds.ts +23 -0
  357. package/src/points-lines/expansion-cache.ts +215 -0
  358. package/src/points-lines/inspection.ts +97 -0
  359. package/src/points-lines/prepare.ts +177 -0
  360. package/src/points-lines/record.ts +125 -0
  361. package/src/points-lines/snapshot.ts +130 -0
  362. package/src/record/__tests__/fullscreen-temporal-routing.unit.test.ts +25 -0
  363. package/src/record/__tests__/main-pass-geometry.unit.test.ts +47 -0
  364. package/src/record/__tests__/material-bg-cache.unit.test.ts +12 -1
  365. package/src/record/__tests__/material-pipeline-pending-cache.unit.test.ts +22 -0
  366. package/src/record/__tests__/sprite-material-abi.unit.test.ts +75 -0
  367. package/src/record/__tests__/standard-pbr-ubo-layout.unit.test.ts +67 -0
  368. package/src/record/__tests__/temporal-payload.unit.test.ts +164 -0
  369. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +127 -0
  370. package/src/record/frame-lighting.ts +14 -2
  371. package/src/record/frame-snapshot.ts +129 -5
  372. package/src/record/frame-targets.ts +15 -6
  373. package/src/record/frame.ts +119 -4
  374. package/src/record/main-pass-geometry.ts +178 -40
  375. package/src/record/main-pass-material.ts +114 -66
  376. package/src/record/main-pass-sprite-draws.ts +79 -102
  377. package/src/record/main-pass.ts +83 -7
  378. package/src/record/mesh-ssbo.ts +22 -3
  379. package/src/record/render-context.ts +209 -23
  380. package/src/record/shadow-pass.ts +129 -28
  381. package/src/record/skybox-post-pass.ts +99 -42
  382. package/src/record/typed-frame-graph.ts +582 -42
  383. package/src/record/view-ubo.ts +99 -4
  384. package/src/render-contract.ts +121 -7
  385. package/src/render-graph-primitives.ts +18 -1
  386. package/src/render-pipeline.ts +100 -27
  387. package/src/render-system-extract.ts +264 -77
  388. package/src/render-system.ts +786 -43
  389. package/src/scene/render-scene-types.ts +3 -0
  390. package/src/scene/render-scene.ts +307 -9
  391. package/src/temporal/__tests__/taa-history-resources.unit.test.ts +45 -0
  392. package/src/temporal/coverage.ts +76 -0
  393. package/src/temporal/frame-coordinator.ts +311 -0
  394. package/src/temporal/gpu.ts +287 -0
  395. package/src/temporal/history.ts +92 -0
  396. package/src/temporal/index.ts +6 -0
  397. package/src/temporal/inspection.ts +97 -0
  398. package/src/temporal/scene-data-catalog.ts +200 -0
  399. package/src/temporal/scene-data.ts +149 -0
  400. package/src/temporal/standard-scene-data.ts +182 -0
  401. package/src/temporal/taa-history-resources.ts +128 -0
  402. package/src/temporal/taa-history-store.ts +79 -0
  403. package/src/temporal/taa-resolve.ts +34 -0
  404. package/src/temporal/temporal-view.ts +169 -0
  405. package/src/temporal/transaction.ts +17 -0
  406. package/src/temporal/view.ts +161 -0
  407. package/src/transmission/__tests__/capability.unit.test.ts +83 -0
  408. package/src/transmission/__tests__/composition.integration.test.ts +161 -0
  409. package/src/transmission/__tests__/inspection.unit.test.ts +241 -0
  410. package/src/transmission/__tests__/lifecycle.integration.test.ts +96 -0
  411. package/src/transmission/__tests__/oracle.unit.test.ts +131 -0
  412. package/src/transmission/__tests__/projection.unit.test.ts +71 -0
  413. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +438 -0
  414. package/src/transmission/__tests__/transmission-backdrop-topology.unit.test.ts +109 -0
  415. package/src/transmission/__tests__/transmission-backdrop.dawn.test.ts +105 -0
  416. package/src/transmission/backdrop.ts +572 -0
  417. package/src/transmission/inspection.ts +190 -0
  418. package/src/transmission/oracle.ts +141 -0
  419. package/src/transmission/projection.ts +83 -0
  420. package/src/typed-render-graph-primitives.ts +162 -9
  421. package/dist/__tests__/authoring-path.unit.test.d.ts +0 -2
  422. package/dist/__tests__/authoring-path.unit.test.d.ts.map +0 -1
  423. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts +0 -2
  424. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts.map +0 -1
  425. package/dist/__tests__/callback-inference.test-d.d.ts +0 -2
  426. package/dist/__tests__/callback-inference.test-d.d.ts.map +0 -1
  427. package/dist/__tests__/cluster-binner.test.d.ts +0 -2
  428. package/dist/__tests__/cluster-binner.test.d.ts.map +0 -1
  429. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts +0 -2
  430. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts.map +0 -1
  431. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts +0 -2
  432. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts.map +0 -1
  433. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts +0 -2
  434. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts.map +0 -1
  435. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts +0 -2
  436. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts.map +0 -1
  437. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts +0 -2
  438. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts.map +0 -1
  439. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts +0 -2
  440. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts.map +0 -1
  441. package/dist/__tests__/factory-contract.integration.test.d.ts +0 -2
  442. package/dist/__tests__/factory-contract.integration.test.d.ts.map +0 -1
  443. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts +0 -2
  444. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts.map +0 -1
  445. package/dist/__tests__/frame-observation.contract.test.d.ts +0 -2
  446. package/dist/__tests__/frame-observation.contract.test.d.ts.map +0 -1
  447. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts +0 -2
  448. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts.map +0 -1
  449. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts +0 -2
  450. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts.map +0 -1
  451. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts +0 -6
  452. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +0 -1
  453. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts +0 -2
  454. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts.map +0 -1
  455. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts +0 -2
  456. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts.map +0 -1
  457. package/dist/__tests__/gpu-driven-production.integration.test.d.ts +0 -2
  458. package/dist/__tests__/gpu-driven-production.integration.test.d.ts.map +0 -1
  459. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts +0 -2
  460. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts.map +0 -1
  461. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +0 -18
  462. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +0 -1
  463. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts +0 -2
  464. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts.map +0 -1
  465. package/dist/__tests__/gpu-driven-view-reference.d.ts +0 -15
  466. package/dist/__tests__/gpu-driven-view-reference.d.ts.map +0 -1
  467. package/dist/__tests__/gpu-driven-view.browser.test.d.ts +0 -2
  468. package/dist/__tests__/gpu-driven-view.browser.test.d.ts.map +0 -1
  469. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts +0 -2
  470. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts.map +0 -1
  471. package/dist/__tests__/gpu-driven-view.unit.test.d.ts +0 -2
  472. package/dist/__tests__/gpu-driven-view.unit.test.d.ts.map +0 -1
  473. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts +0 -2
  474. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts.map +0 -1
  475. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts +0 -7
  476. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +0 -1
  477. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts +0 -2
  478. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts.map +0 -1
  479. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts +0 -2
  480. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts.map +0 -1
  481. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts +0 -2
  482. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts.map +0 -1
  483. package/dist/__tests__/gpu-scene.dawn.test.d.ts +0 -2
  484. package/dist/__tests__/gpu-scene.dawn.test.d.ts.map +0 -1
  485. package/dist/__tests__/gpu-scene.unit.test.d.ts +0 -2
  486. package/dist/__tests__/gpu-scene.unit.test.d.ts.map +0 -1
  487. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts +0 -2
  488. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts.map +0 -1
  489. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts +0 -2
  490. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts.map +0 -1
  491. package/dist/__tests__/injection-kind-owner.test-d.d.ts +0 -2
  492. package/dist/__tests__/injection-kind-owner.test-d.d.ts.map +0 -1
  493. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts +0 -2
  494. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts.map +0 -1
  495. package/dist/__tests__/light-buffer-layout.unit.test.d.ts +0 -2
  496. package/dist/__tests__/light-buffer-layout.unit.test.d.ts.map +0 -1
  497. package/dist/__tests__/material-contract-inventory.unit.test.d.ts +0 -2
  498. package/dist/__tests__/material-contract-inventory.unit.test.d.ts.map +0 -1
  499. package/dist/__tests__/material-cooked-projection.unit.test.d.ts +0 -2
  500. package/dist/__tests__/material-cooked-projection.unit.test.d.ts.map +0 -1
  501. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts +0 -2
  502. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts.map +0 -1
  503. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts +0 -2
  504. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts.map +0 -1
  505. package/dist/__tests__/material-stride-surface.unit.test.d.ts +0 -2
  506. package/dist/__tests__/material-stride-surface.unit.test.d.ts.map +0 -1
  507. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts +0 -2
  508. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts.map +0 -1
  509. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts +0 -2
  510. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts.map +0 -1
  511. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts +0 -2
  512. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts.map +0 -1
  513. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts +0 -2
  514. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts.map +0 -1
  515. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts +0 -2
  516. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts.map +0 -1
  517. package/dist/__tests__/morph-feature-plan.unit.test.d.ts +0 -2
  518. package/dist/__tests__/morph-feature-plan.unit.test.d.ts.map +0 -1
  519. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts +0 -2
  520. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts.map +0 -1
  521. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts +0 -2
  522. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts.map +0 -1
  523. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts +0 -2
  524. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts.map +0 -1
  525. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts +0 -2
  526. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts.map +0 -1
  527. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts +0 -2
  528. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts.map +0 -1
  529. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts +0 -2
  530. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts.map +0 -1
  531. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts +0 -2
  532. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts.map +0 -1
  533. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts +0 -2
  534. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts.map +0 -1
  535. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts +0 -2
  536. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts.map +0 -1
  537. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts +0 -2
  538. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts.map +0 -1
  539. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts +0 -2
  540. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts.map +0 -1
  541. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts +0 -2
  542. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts.map +0 -1
  543. package/dist/__tests__/profiler-default-off.test.d.ts +0 -2
  544. package/dist/__tests__/profiler-default-off.test.d.ts.map +0 -1
  545. package/dist/__tests__/profiler-phase-catalog.test.d.ts +0 -2
  546. package/dist/__tests__/profiler-phase-catalog.test.d.ts.map +0 -1
  547. package/dist/__tests__/profiler-phase-integration.test.d.ts +0 -2
  548. package/dist/__tests__/profiler-phase-integration.test.d.ts.map +0 -1
  549. package/dist/__tests__/profiler-phase-token.test.d.ts +0 -2
  550. package/dist/__tests__/profiler-phase-token.test.d.ts.map +0 -1
  551. package/dist/__tests__/public-surface.test-d.d.ts +0 -2
  552. package/dist/__tests__/public-surface.test-d.d.ts.map +0 -1
  553. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts +0 -2
  554. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts.map +0 -1
  555. package/dist/__tests__/render-error-code-owner.test-d.d.ts +0 -2
  556. package/dist/__tests__/render-error-code-owner.test-d.d.ts.map +0 -1
  557. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts +0 -2
  558. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts.map +0 -1
  559. package/dist/__tests__/render-error-exhaustive.test-d.d.ts +0 -2
  560. package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +0 -1
  561. package/dist/__tests__/render-feature-assembly.test-d.d.ts +0 -2
  562. package/dist/__tests__/render-feature-assembly.test-d.d.ts.map +0 -1
  563. package/dist/__tests__/render-feature-context.test-d.d.ts +0 -2
  564. package/dist/__tests__/render-feature-context.test-d.d.ts.map +0 -1
  565. package/dist/__tests__/render-feature-contract.test-d.d.ts +0 -2
  566. package/dist/__tests__/render-feature-contract.test-d.d.ts.map +0 -1
  567. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts +0 -2
  568. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts.map +0 -1
  569. package/dist/__tests__/render-feature-docs.unit.test.d.ts +0 -2
  570. package/dist/__tests__/render-feature-docs.unit.test.d.ts.map +0 -1
  571. package/dist/__tests__/render-feature-errors.unit.test.d.ts +0 -2
  572. package/dist/__tests__/render-feature-errors.unit.test.d.ts.map +0 -1
  573. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts +0 -2
  574. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts.map +0 -1
  575. package/dist/__tests__/render-feature-plan.test-d.d.ts +0 -2
  576. package/dist/__tests__/render-feature-plan.test-d.d.ts.map +0 -1
  577. package/dist/__tests__/render-feature-plan.unit.test.d.ts +0 -2
  578. package/dist/__tests__/render-feature-plan.unit.test.d.ts.map +0 -1
  579. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts +0 -2
  580. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts.map +0 -1
  581. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts +0 -2
  582. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts.map +0 -1
  583. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts +0 -2
  584. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts.map +0 -1
  585. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts +0 -2
  586. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts.map +0 -1
  587. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts +0 -2
  588. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts.map +0 -1
  589. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts +0 -2
  590. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts.map +0 -1
  591. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts +0 -2
  592. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts.map +0 -1
  593. package/dist/__tests__/render-feature-public-surface.test-d.d.ts +0 -2
  594. package/dist/__tests__/render-feature-public-surface.test-d.d.ts.map +0 -1
  595. package/dist/__tests__/render-feature-retry.unit.test.d.ts +0 -2
  596. package/dist/__tests__/render-feature-retry.unit.test.d.ts.map +0 -1
  597. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts +0 -2
  598. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts.map +0 -1
  599. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts +0 -2
  600. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts.map +0 -1
  601. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts +0 -2
  602. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts.map +0 -1
  603. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts +0 -2
  604. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts.map +0 -1
  605. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts +0 -2
  606. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts.map +0 -1
  607. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts +0 -2
  608. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts.map +0 -1
  609. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts +0 -7
  610. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts.map +0 -1
  611. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts +0 -2
  612. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts.map +0 -1
  613. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts +0 -2
  614. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts.map +0 -1
  615. package/dist/__tests__/render-graph-hzb-gpu.d.ts +0 -7
  616. package/dist/__tests__/render-graph-hzb-gpu.d.ts.map +0 -1
  617. package/dist/__tests__/render-graph-hzb.browser.test.d.ts +0 -2
  618. package/dist/__tests__/render-graph-hzb.browser.test.d.ts.map +0 -1
  619. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts +0 -2
  620. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts.map +0 -1
  621. package/dist/__tests__/render-graph-primitives.unit.test.d.ts +0 -2
  622. package/dist/__tests__/render-graph-primitives.unit.test.d.ts.map +0 -1
  623. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts +0 -12
  624. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts.map +0 -1
  625. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts +0 -2
  626. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts.map +0 -1
  627. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts +0 -2
  628. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts.map +0 -1
  629. package/dist/__tests__/render-scene-projection.unit.test.d.ts +0 -2
  630. package/dist/__tests__/render-scene-projection.unit.test.d.ts.map +0 -1
  631. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts +0 -2
  632. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts.map +0 -1
  633. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts +0 -2
  634. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts.map +0 -1
  635. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts +0 -2
  636. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts.map +0 -1
  637. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts +0 -2
  638. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts.map +0 -1
  639. package/dist/__tests__/shader-stage-surface.unit.test.d.ts +0 -2
  640. package/dist/__tests__/shader-stage-surface.unit.test.d.ts.map +0 -1
  641. package/dist/__tests__/ssao-config.unit.test.d.ts +0 -2
  642. package/dist/__tests__/ssao-config.unit.test.d.ts.map +0 -1
  643. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts +0 -2
  644. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts.map +0 -1
  645. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts +0 -2
  646. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts.map +0 -1
  647. package/dist/__tests__/standard-descriptors.test-d.d.ts +0 -2
  648. package/dist/__tests__/standard-descriptors.test-d.d.ts.map +0 -1
  649. package/dist/__tests__/standard-pipeline.dawn.test.d.ts +0 -2
  650. package/dist/__tests__/standard-pipeline.dawn.test.d.ts.map +0 -1
  651. package/dist/__tests__/standard-pipeline.integration.test.d.ts +0 -2
  652. package/dist/__tests__/standard-pipeline.integration.test.d.ts.map +0 -1
  653. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts +0 -2
  654. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts.map +0 -1
  655. package/dist/__tests__/surface-configuration.unit.test.d.ts +0 -2
  656. package/dist/__tests__/surface-configuration.unit.test.d.ts.map +0 -1
  657. package/dist/__tests__/texture-usage-surface.unit.test.d.ts +0 -2
  658. package/dist/__tests__/texture-usage-surface.unit.test.d.ts.map +0 -1
  659. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts +0 -2
  660. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts.map +0 -1
  661. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts +0 -2
  662. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts.map +0 -1
  663. package/dist/__tests__/urp-pipeline.unit.test.d.ts +0 -2
  664. package/dist/__tests__/urp-pipeline.unit.test.d.ts.map +0 -1
  665. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts +0 -2
  666. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts.map +0 -1
  667. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts +0 -2
  668. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts.map +0 -1
  669. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts +0 -2
  670. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts.map +0 -1
  671. package/dist/__tests__/visibility-extract.integration.test.d.ts +0 -2
  672. package/dist/__tests__/visibility-extract.integration.test.d.ts.map +0 -1
  673. package/dist/__tests__/visibility-extract.perf.test.d.ts +0 -2
  674. package/dist/__tests__/visibility-extract.perf.test.d.ts.map +0 -1
  675. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts +0 -2
  676. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts.map +0 -1
  677. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts +0 -2
  678. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts.map +0 -1
  679. package/dist/__tests__/visibility-instances.integration.test.d.ts +0 -2
  680. package/dist/__tests__/visibility-instances.integration.test.d.ts.map +0 -1
  681. package/dist/__tests__/visibility-multi-world.integration.test.d.ts +0 -2
  682. package/dist/__tests__/visibility-multi-world.integration.test.d.ts.map +0 -1
  683. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts +0 -2
  684. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts.map +0 -1
  685. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts +0 -2
  686. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts.map +0 -1
  687. package/dist/__tests__/visibility-public-surface.test-d.d.ts +0 -2
  688. package/dist/__tests__/visibility-public-surface.test-d.d.ts.map +0 -1
  689. package/dist/__tests__/visibility-resolver.unit.test.d.ts +0 -2
  690. package/dist/__tests__/visibility-resolver.unit.test.d.ts.map +0 -1
  691. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts +0 -2
  692. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts.map +0 -1
  693. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts +0 -2
  694. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts.map +0 -1
  695. package/dist/__tests__/vocabulary.unit.test.d.ts +0 -2
  696. package/dist/__tests__/vocabulary.unit.test.d.ts.map +0 -1
  697. package/dist/chunk-CQXZC5XI.mjs.map +0 -1
  698. package/dist/chunk-QC4VW3XJ.mjs.map +0 -1
  699. package/dist/chunk-SCRSAK5B.mjs.map +0 -1
  700. package/dist/components/__tests__/schema-contract.unit.test.d.ts +0 -2
  701. package/dist/components/__tests__/schema-contract.unit.test.d.ts.map +0 -1
  702. package/dist/components/__tests__/schema-parity.unit.test.d.ts +0 -2
  703. package/dist/components/__tests__/schema-parity.unit.test.d.ts.map +0 -1
  704. package/dist/components/__tests__/visibility-schema.unit.test.d.ts +0 -2
  705. package/dist/components/__tests__/visibility-schema.unit.test.d.ts.map +0 -1
  706. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts +0 -2
  707. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts.map +0 -1
  708. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts +0 -2
  709. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts.map +0 -1
  710. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts +0 -2
  711. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts.map +0 -1
  712. package/dist/record/__tests__/video-texture-view.unit.test.d.ts +0 -2
  713. 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 {
@@ -27,12 +28,20 @@ import {
27
28
  type Handle,
28
29
  type MaterialAsset,
29
30
  type MaterialTextureValue,
31
+ type MeshAsset,
30
32
  type RenderPipelineAsset,
31
33
  RenderQueue,
32
34
  type SamplerAsset,
35
+ toShared,
33
36
  } from '@forgeax/engine-types';
34
37
  import { createClusterBinScratch } from './cluster-binner';
35
- import type { ObservationUnavailableError, RenderError } from './errors/render';
38
+ import { EnvironmentLifecycle } from './environment/lifecycle';
39
+ import {
40
+ type ObservationUnavailableError,
41
+ PointsLinesMaterialUnsupportedError,
42
+ type RenderError,
43
+ TransmissionCapabilityMissingError,
44
+ } from './errors/render';
36
45
  import {
37
46
  type RenderFeaturePreparedGraphicsResolverInput,
38
47
  runRenderFeatureFrame,
@@ -50,16 +59,48 @@ import {
50
59
  type PostProcessShaderEntry,
51
60
  } from './fullscreen-post-process-pass';
52
61
  import { GpuDrivenProduction } from './gpu-driven/production-raster';
53
- import type { RenderSceneInspection } from './inspection-types';
62
+ import type {
63
+ BloomInspection,
64
+ MotionBlurInspection,
65
+ RenderSceneInspection,
66
+ TemporalTargetInspection,
67
+ TransmissionInspection,
68
+ } from './inspection-types';
69
+ import { admitPointsLines } from './points-lines/admission';
70
+ import { PointsLinesExpansionCache } from './points-lines/expansion-cache';
71
+ import {
72
+ inspectPointsLines,
73
+ type PointsLinesInspection,
74
+ type PointsLinesSourceError,
75
+ } from './points-lines/inspection';
76
+ import {
77
+ createPointsLinesLanePreparationAdapter,
78
+ type PointsLinesLanePreparationAdapter,
79
+ } from './points-lines/prepare';
80
+ import { createPointsLinesLaneAdapter, type PointsLinesBackend } from './points-lines/record';
81
+ import type { PointsLinesRetainedSnapshot } from './points-lines/snapshot';
82
+ import type { PointsLinesRecordOwner, PointsLinesRecordSubmission } from './record/render-context';
54
83
 
55
84
  export type { RenderSceneInspection } from './inspection-types';
56
85
 
57
- import { GPU_BUFFER_USAGE_COPY_DST, GPU_BUFFER_USAGE_UNIFORM } from './gpu-usage';
86
+ import { deriveVertexLayoutProjection } from '@forgeax/engine-geometry';
87
+ import type { EnvironmentInspection } from './environment/inspection';
88
+ import {
89
+ GPU_BUFFER_USAGE_COPY_DST,
90
+ GPU_BUFFER_USAGE_INDEX,
91
+ GPU_BUFFER_USAGE_UNIFORM,
92
+ GPU_BUFFER_USAGE_VERTEX,
93
+ } from './gpu-usage';
58
94
  import { assembleMaterialWithSkylightEntries } from './ibl/skylight-bind-group';
59
95
  import { disposeInstanceBuffers, disposeTransientInstanceBuffers } from './instance-buffer-cache';
60
96
  import type { MeshMaterialBindingObservation } from './mesh-material-bindings';
61
97
  import { validateClusterGrid } from './pipeline/standard-pipeline';
62
- 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';
63
104
  import { PostProcessError } from './post-process-errors';
64
105
  import {
65
106
  createPreparedGraphicsResolver,
@@ -73,7 +114,12 @@ import {
73
114
  recordFrame,
74
115
  } from './record/frame';
75
116
  import { buildPerFrameBindGroups } from './record/frame-lighting';
76
- 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';
77
123
  import { applyParamSnapshotToUbo, residentTextureView } from './record/main-pass-material';
78
124
  import type { RenderSystemInternals } from './record/render-context';
79
125
  import {
@@ -99,6 +145,19 @@ import {
99
145
  TRANSPARENT_SORT_MODE_LAYER_YZ,
100
146
  TRANSPARENT_SORT_MODE_LAYER_Z,
101
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';
102
161
 
103
162
  export type {
104
163
  _InternalRenderPipelineContext,
@@ -108,12 +167,15 @@ export type {
108
167
  RenderSystemInternals,
109
168
  RenderSystemRuntime,
110
169
  SurfaceBackendKind,
170
+ SurfaceCapabilityFacts,
171
+ SurfaceProfile,
111
172
  SwapChainFormatPair,
112
173
  } from './record/render-context';
113
174
  export {
114
175
  configureSurface,
115
176
  MATERIAL_PER_ENTITY_STRIDE,
116
177
  resolveSurfaceFormatPair,
178
+ resolveSurfaceProfile,
117
179
  STANDARD_PBR_UBO_SIZE,
118
180
  selectSwapChainFormat,
119
181
  } from './record/render-context';
@@ -271,6 +333,10 @@ export interface RenderSystem {
271
333
  observeCurrentFrame(
272
334
  options: FrameObservationOptions,
273
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;
274
340
  readonly pipelineDispatchCounts: {
275
341
  readonly unlit: number;
276
342
  };
@@ -283,6 +349,15 @@ export interface RenderSystem {
283
349
  readonly visibilityStats: { explicitlyHidden: number };
284
350
  /** Persistent scene maintenance evidence from the ordinary single-World path. */
285
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;
359
+ /** Retained Points/Lines authoring facts from the single scene projection. */
360
+ readonly pointsLinesSnapshots: readonly PointsLinesRetainedSnapshot[];
286
361
  /** Current mesh-slot provenance and active diagnostics from the last frame. */
287
362
  readonly meshMaterialBindings: readonly MeshMaterialBindingObservation[];
288
363
  /**
@@ -294,6 +369,10 @@ export interface RenderSystem {
294
369
  * reaching into engine internals.
295
370
  */
296
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;
297
376
  /**
298
377
  * feat-20260531-per-frame-bind-group-cache M1 / w4: per-frame
299
378
  * createBindGroup counter. Reset to 0 on every `draw([world], { cameraOwner: 0, resourceOwner: 0 })` entry,
@@ -398,6 +477,273 @@ function makePreparedPipelinePendingError(): RhiError {
398
477
  });
399
478
  }
400
479
 
480
+ type PointsLinesGpuResources = {
481
+ readonly vertexBuffer: Buffer;
482
+ readonly indexBuffer: Buffer;
483
+ };
484
+ type PointsLinesPreparationAdapter = PointsLinesLanePreparationAdapter<PointsLinesGpuResources>;
485
+
486
+ /**
487
+ * The Standard renderer's single Points/Lines prepare owner.
488
+ *
489
+ * The retained snapshot is the identity boundary; this owner only resolves
490
+ * the source assets, runs admission, and publishes the existing preparation
491
+ * and record contracts to the main geometry loop. The expansion cache is
492
+ * shared across lanes and this owner keeps the one prepared vertex/index
493
+ * resource pair for each retained identity.
494
+ */
495
+ class StandardPointsLinesOwner implements PointsLinesRecordOwner {
496
+ private readonly cache = new PointsLinesExpansionCache();
497
+ private readonly preparations = new Map<string, PointsLinesPreparationAdapter>();
498
+ private readonly active = new Map<string, PointsLinesInspection>();
499
+ private readonly layoutProjection = deriveVertexLayoutProjection({
500
+ position: new Float32Array(0),
501
+ normal: new Float32Array(0),
502
+ uv: new Float32Array(0),
503
+ tangent: new Float32Array(0),
504
+ });
505
+
506
+ constructor(private readonly internals: RenderSystemInternals) {}
507
+
508
+ beginFrame(): void {
509
+ this.active.clear();
510
+ }
511
+
512
+ prepare(
513
+ entry: import('./record/frame-snapshot').ValidatedRenderable,
514
+ clustered: boolean,
515
+ ): PointsLinesRecordSubmission | undefined {
516
+ const snapshot = entry.source.pointsLines;
517
+ if (snapshot === undefined || snapshot.component === undefined || entry.world === undefined) {
518
+ return undefined;
519
+ }
520
+ const key = `${snapshot.worldId}:${snapshot.entityKey}`;
521
+ const topology = snapshot.component === 'Points' ? 'point-list' : 'line-list';
522
+ const backend = this.backend();
523
+ const lane = backend === 'wgpu-webgl2' ? 'cpu-webgl2' : clustered ? 'clustered' : 'direct';
524
+ const meshResult = resolveAssetHandle<MeshAsset>(
525
+ entry.world,
526
+ toShared<'MeshAsset'>(entry.source.assetHandle),
527
+ );
528
+ const materialResult = resolveAssetHandle<MaterialAsset>(
529
+ entry.world,
530
+ toShared<'MaterialAsset'>(snapshot.materialHandle),
531
+ );
532
+ if (!meshResult.ok || !materialResult.ok) {
533
+ this.publishRefusal(
534
+ snapshot,
535
+ new PointsLinesMaterialUnsupportedError({
536
+ entity: snapshot.entityKey,
537
+ material: 'unresolved',
538
+ pass: 'forward',
539
+ module: 'asset-resolution',
540
+ reason: 'source MeshAsset or MaterialAsset could not be resolved',
541
+ }),
542
+ );
543
+ return undefined;
544
+ }
545
+ const admission = admitPointsLines({
546
+ entity: snapshot.entityKey,
547
+ mesh: meshResult.value,
548
+ material: materialResult.value,
549
+ ...(snapshot.style?.kind === 'points'
550
+ ? {
551
+ points: {
552
+ sizePx: snapshot.style.sizePx,
553
+ shape: snapshot.style.shape === 'circle' ? 1 : 0,
554
+ },
555
+ }
556
+ : { lines: { widthPx: snapshot.style?.widthPx ?? 1 } }),
557
+ });
558
+ if (!admission.ok) {
559
+ this.publishRefusal(snapshot, admission.error);
560
+ return undefined;
561
+ }
562
+ const geometryKey = this.cache.getOrCreate(snapshot, meshResult.value).key;
563
+ const prepKey = `${geometryKey}:${lane}:${backend}`;
564
+ let preparation = this.preparations.get(prepKey);
565
+ if (preparation === undefined) {
566
+ preparation = createPointsLinesLanePreparationAdapter(lane, backend, {
567
+ cache: this.cache,
568
+ adapter: {
569
+ create: (geometry) => {
570
+ const vertex = this.internals.device.createBuffer({
571
+ label: `points-lines-vertices:${geometryKey}`,
572
+ size: Math.max(4, geometry.vertices.byteLength),
573
+ usage: GPU_BUFFER_USAGE_VERTEX | GPU_BUFFER_USAGE_COPY_DST,
574
+ mappedAtCreation: false,
575
+ });
576
+ if (!vertex.ok) return err(vertex.error);
577
+ const index = this.internals.device.createBuffer({
578
+ label: `points-lines-indices:${geometryKey}`,
579
+ size: Math.max(4, geometry.indices.byteLength),
580
+ usage: GPU_BUFFER_USAGE_INDEX | GPU_BUFFER_USAGE_COPY_DST,
581
+ mappedAtCreation: false,
582
+ });
583
+ if (!index.ok) {
584
+ this.internals.device.destroyBuffer(vertex.value);
585
+ return err(index.error);
586
+ }
587
+ return ok({ vertexBuffer: vertex.value, indexBuffer: index.value });
588
+ },
589
+ upload: (resource, geometry) => {
590
+ if (geometry.vertices.byteLength > 0) {
591
+ const vertexWrite = this.internals.device.queue.writeBuffer(
592
+ resource.vertexBuffer,
593
+ 0,
594
+ geometry.vertices,
595
+ );
596
+ if (!vertexWrite.ok) return err(vertexWrite.error);
597
+ }
598
+ if (geometry.indices.byteLength > 0) {
599
+ const indexWrite = this.internals.device.queue.writeBuffer(
600
+ resource.indexBuffer,
601
+ 0,
602
+ geometry.indices,
603
+ );
604
+ if (!indexWrite.ok) return err(indexWrite.error);
605
+ }
606
+ return ok(geometry.derivedBytes);
607
+ },
608
+ validate: (_resource, geometry) =>
609
+ geometry.expandedVertexCount > 0 && geometry.expandedIndexCount > 0
610
+ ? ok(undefined)
611
+ : err(new Error('Points/Lines expansion contains no drawable triangles')),
612
+ destroy: (resource) => {
613
+ this.internals.device.destroyBuffer(resource.vertexBuffer);
614
+ this.internals.device.destroyBuffer(resource.indexBuffer);
615
+ },
616
+ },
617
+ });
618
+ this.preparations.set(prepKey, preparation);
619
+ }
620
+ const prepared = preparation.prepare(snapshot, meshResult.value);
621
+ if (!prepared.ok) {
622
+ const lkg = preparation.lastKnownGood();
623
+ if (lkg !== undefined) {
624
+ const lkgPlan = createPointsLinesLaneAdapter(lane, backend).createRecordPlan(
625
+ lkg.snapshot,
626
+ lkg.geometry,
627
+ );
628
+ const state = preparation.inspect();
629
+ this.active.set(
630
+ key,
631
+ inspectPointsLines({
632
+ snapshot,
633
+ topology,
634
+ lane,
635
+ pointCount: lkg.geometry.pointCount,
636
+ segmentCount: lkg.geometry.segmentCount,
637
+ sourceBytes: lkg.geometry.sourceBytes,
638
+ derivedBytes: lkg.geometry.derivedBytes,
639
+ cache: { hit: true, rebuilds: state.rebuilds, evictions: 0 },
640
+ drawCount: lkgPlan.drawCount,
641
+ uploadBytes: 0,
642
+ lastKnownGood: true,
643
+ refusal: {
644
+ code: prepared.error.code,
645
+ expected: prepared.error.expected,
646
+ hint: prepared.error.hint,
647
+ detail: prepared.error.detail,
648
+ generation: prepared.error.detail.generation,
649
+ lastKnownGood: true,
650
+ },
651
+ }),
652
+ );
653
+ return {
654
+ plan: lkgPlan,
655
+ vertexBuffer: lkg.resource.vertexBuffer,
656
+ indexBuffer: lkg.resource.indexBuffer,
657
+ layoutProjection: this.layoutProjection,
658
+ };
659
+ }
660
+ this.publishRefusal(snapshot, prepared.error);
661
+ return undefined;
662
+ }
663
+ const plan = createPointsLinesLaneAdapter(lane, backend).createRecordPlan(
664
+ snapshot,
665
+ prepared.value.geometry,
666
+ );
667
+ const state = preparation.inspect();
668
+ this.active.set(
669
+ key,
670
+ inspectPointsLines({
671
+ snapshot,
672
+ topology,
673
+ lane,
674
+ pointCount: prepared.value.geometry.pointCount,
675
+ segmentCount: prepared.value.geometry.segmentCount,
676
+ sourceBytes: prepared.value.geometry.sourceBytes,
677
+ derivedBytes: prepared.value.geometry.derivedBytes,
678
+ cache: {
679
+ hit: prepared.value.uploadedBytes === 0,
680
+ rebuilds: state.rebuilds,
681
+ evictions: 0,
682
+ },
683
+ drawCount: plan.drawCount,
684
+ uploadBytes: prepared.value.uploadedBytes,
685
+ lastKnownGood: prepared.value.lastKnownGood,
686
+ }),
687
+ );
688
+ return {
689
+ plan,
690
+ vertexBuffer: prepared.value.resource.vertexBuffer,
691
+ indexBuffer: prepared.value.resource.indexBuffer,
692
+ layoutProjection: this.layoutProjection,
693
+ };
694
+ }
695
+
696
+ resetForDeviceLoss(): void {
697
+ for (const preparation of this.preparations.values()) preparation.resetForDeviceLoss();
698
+ this.active.clear();
699
+ }
700
+
701
+ inspections(): readonly PointsLinesInspection[] {
702
+ return [...this.active.values()];
703
+ }
704
+
705
+ private backend(): PointsLinesBackend {
706
+ switch (this.internals.device.caps.backendKind) {
707
+ case 'wgpu-webgl2':
708
+ return 'wgpu-webgl2';
709
+ case 'null':
710
+ return 'null';
711
+ default:
712
+ return 'webgpu';
713
+ }
714
+ }
715
+
716
+ private publishRefusal(
717
+ snapshot: PointsLinesRetainedSnapshot,
718
+ error: PointsLinesSourceError,
719
+ ): void {
720
+ this.active.set(
721
+ `${snapshot.worldId}:${snapshot.entityKey}`,
722
+ inspectPointsLines({
723
+ snapshot,
724
+ topology: snapshot.component === 'Points' ? 'point-list' : 'line-list',
725
+ lane: 'refused',
726
+ pointCount: 0,
727
+ segmentCount: 0,
728
+ sourceBytes: 0,
729
+ derivedBytes: 0,
730
+ cache: { hit: false, rebuilds: 0, evictions: 0 },
731
+ drawCount: 0,
732
+ uploadBytes: 0,
733
+ lastKnownGood: false,
734
+ refusal: {
735
+ code: error.code,
736
+ expected: error.expected,
737
+ hint: error.hint,
738
+ detail: error.detail,
739
+ generation: snapshot.meshGeneration,
740
+ lastKnownGood: false,
741
+ },
742
+ }),
743
+ );
744
+ }
745
+ }
746
+
401
747
  export function createRenderSystem(internals: RenderSystemInternals): RenderSystem {
402
748
  const phaseCatalogRegistration = internals.profiler?.registerPhaseCatalog(
403
749
  'render',
@@ -406,6 +752,8 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
406
752
  let releaseProfilerCatalog =
407
753
  phaseCatalogRegistration?.ok === true ? phaseCatalogRegistration.value : undefined;
408
754
  let preparedWorlds: readonly World[] = [];
755
+ let latestCamera: CameraSnapshot | undefined;
756
+ const pointsLinesOwner = new StandardPointsLinesOwner(internals);
409
757
  const persistentRenderScene = new PersistentRenderScene({
410
758
  getDevice: () => internals.device,
411
759
  onGpuError: (error) => internals.errorRegistry.fire(error),
@@ -413,6 +761,131 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
413
761
  internals.gpuStore.invalidateMesh(handle, preparedWorlds[worldId] ?? worldId);
414
762
  },
415
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
+ };
416
889
  const gpuDrivenShaderFactory =
417
890
  internals.shaderModuleFactory ??
418
891
  ({
@@ -440,6 +913,19 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
440
913
  }),
441
914
  ),
442
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),
443
929
  });
444
930
  const disposeFeatureGpuWork = (): void => {
445
931
  const disposed = featureGpuWork.dispose();
@@ -460,12 +946,23 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
460
946
  // raw (material-handle-based, cross-world collision semantically correct).
461
947
  const frameState: RenderFrameState = {
462
948
  frameNumber: 0,
949
+ graphGeneration: 0,
950
+ successfulTemporalFrameIndex: 0,
951
+ lastSuccessfulBloom: 'off',
463
952
  directionalShadowCache: null,
464
953
  directionalShadowCacheRecorded: false,
465
954
  compiledFrameGraph: null,
466
955
  compiledFrameGraphTopologyKey: null,
467
956
  retiredCompiledFrameGraphs: new Set(),
468
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,
469
966
  currentDirectionalShadowView: null,
470
967
  currentSpotShadowView: null,
471
968
  instanceBuffers: new Map(),
@@ -624,6 +1121,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
624
1121
  ...featureEntries.entries(),
625
1122
  ]);
626
1123
  for (const [id, entry] of declarations) {
1124
+ if (id === 'forgeax.taa-resolve') continue;
627
1125
  const byteSize =
628
1126
  entry.params?.byteSize ?? (entryHasDepthRead(entry) ? DEPTH_MIN_PARAMS_BYTE_SIZE : 0);
629
1127
  if (byteSize === 0 || postProcessParamsBuffers.has(id)) continue;
@@ -674,10 +1172,16 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
674
1172
  postProcessPipelineCache.set(key, built);
675
1173
  return built;
676
1174
  };
1175
+ const clearPostProcessPipelineCache = (id: string): void => {
1176
+ for (const key of postProcessPipelineCache.keys()) {
1177
+ if (key.startsWith(`${id}|`)) postProcessPipelineCache.delete(key);
1178
+ }
1179
+ };
677
1180
  Object.assign(internals, {
678
1181
  lookupPostProcess,
679
1182
  getPostProcessParamsBuffer,
680
1183
  getPostProcessPipeline,
1184
+ clearPostProcessPipelineCache,
681
1185
  });
682
1186
  // w15 M5 (plan-strategy D-P4 / AC-07): per-frame dispatch counters. Reset
683
1187
  // on every `draw([world], { cameraOwner: 0, resourceOwner: 0 })` entry; bumped once per actual `pass.setPipeline`
@@ -825,42 +1329,20 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
825
1329
  if (buffer !== undefined) internals.device.destroyBuffer(buffer);
826
1330
  return err(new Error('prepared material schema contains unsupported binding kinds'));
827
1331
  }
828
- for (let index = fields.length; index < 4; index += 1) {
829
- const binding = derived.userRegionBindingEnd + (index - fields.length) * 2;
830
- entries.push(
831
- {
832
- binding,
833
- resource: { kind: 'sampler', value: pipelineState.defaultSampler },
834
- },
835
- {
836
- binding: binding + 1,
837
- resource: { kind: 'textureView', value: pipelineState.defaultWhiteTextureView },
838
- },
839
- );
840
- }
841
1332
  const fallback = pipelineState.skylightFallback;
842
1333
  if (fallback === null) {
843
1334
  if (buffer !== undefined) internals.device.destroyBuffer(buffer);
844
1335
  return err(new Error('prepared material skylight fallback is unavailable'));
845
1336
  }
846
- const completeEntries = assembleMaterialWithSkylightEntries(
847
- entries,
848
- {
849
- irradianceView: fallback.irradianceView,
850
- irradianceSampler: fallback.sampler,
851
- prefilterView: fallback.prefilterView,
852
- prefilterSampler: fallback.sampler,
853
- brdfLutView: fallback.brdfLutView,
854
- brdfLutSampler: fallback.sampler,
855
- intensityBuffer: fallback.intensityBuffer,
856
- },
857
- {
858
- emissiveSampler: pipelineState.defaultSampler,
859
- emissiveView: pipelineState.defaultWhiteTextureView,
860
- occlusionSampler: pipelineState.defaultSampler,
861
- occlusionView: pipelineState.defaultWhiteTextureView,
862
- },
863
- );
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
+ });
864
1346
  const group = internals.device.createBindGroup({ layout, entries: completeEntries });
865
1347
  if (!group.ok) {
866
1348
  if (buffer !== undefined) internals.device.destroyBuffer(buffer);
@@ -936,6 +1418,8 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
936
1418
  ? null
937
1419
  : (descriptor.depthFormat as GPUTextureFormat),
938
1420
  descriptor.vertexLayout,
1421
+ undefined,
1422
+ input.shaderModuleMode,
939
1423
  );
940
1424
  // A requested material shader is an exact pipeline contract. During
941
1425
  // async shader warmup, substituting the generic unlit pipeline can
@@ -1071,6 +1555,101 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1071
1555
  gpuDriven: gpuDrivenProduction.inspect(),
1072
1556
  };
1073
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
+ },
1650
+ get pointsLinesSnapshots(): readonly PointsLinesRetainedSnapshot[] {
1651
+ return persistentRenderScene.pointsLinesSnapshots();
1652
+ },
1074
1653
  detachScene(world: World): void {
1075
1654
  persistentRenderScene.detach(world);
1076
1655
  },
@@ -1091,6 +1670,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1091
1670
  }
1092
1671
  }
1093
1672
  try {
1673
+ pointsLinesOwner.beginFrame();
1094
1674
  // cameraOwner drives the surfaced cameras + frustum
1095
1675
  // cull; resourceOwner drives skylight/skybox/postProcess + per-world
1096
1676
  // record config.
@@ -1150,16 +1730,52 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1150
1730
  const {
1151
1731
  cameras,
1152
1732
  lights,
1733
+ environment,
1734
+ environmentReady,
1153
1735
  renderables,
1154
1736
  dispatch,
1155
1737
  skylight,
1156
1738
  skylightCount,
1157
1739
  skybox,
1158
1740
  skyboxCount,
1741
+ fog,
1159
1742
  frustumStats,
1160
1743
  visibilityStats,
1161
1744
  postProcessParams,
1162
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
+ }
1163
1779
  if (lastMeshMaterialBindingFrame !== frame) {
1164
1780
  lastMeshMaterialBindingFrame = frame;
1165
1781
  lastMeshMaterialBindings = renderables.map((renderable) => ({
@@ -1230,6 +1846,9 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1230
1846
  targets: featureTargets,
1231
1847
  generation: internals.featureHost?.preparedGeneration ?? 0,
1232
1848
  caps: internals.device.caps,
1849
+ ...(internals.getMaterialShaderBindingContract === undefined
1850
+ ? {}
1851
+ : { materialShaderBindingContract: internals.getMaterialShaderBindingContract }),
1233
1852
  createPreparedGraphicsResolver: preparedResolverFactory,
1234
1853
  gpuWork: featureGpuWork,
1235
1854
  });
@@ -1305,6 +1924,9 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1305
1924
  }
1306
1925
  return runProfiledRenderPhase(profileSession, phase, action);
1307
1926
  };
1927
+ if (cameras[0]?.bloom === 'on') {
1928
+ internals.getPipelineState()?.perPassResources.ensureBloomResources?.();
1929
+ }
1308
1930
  submitted = runProfiledRenderPhase(profileSession, 'record', () =>
1309
1931
  recordFrame(
1310
1932
  internals,
@@ -1321,6 +1943,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1321
1943
  skybox,
1322
1944
  skyboxCount,
1323
1945
  postProcessParams,
1946
+ fog,
1324
1947
  worlds,
1325
1948
  recordProfilePhase,
1326
1949
  {
@@ -1333,8 +1956,38 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1333
1956
  },
1334
1957
  renderReadLeases,
1335
1958
  featureGraphCandidate,
1959
+ pointsLinesOwner,
1960
+ environment?.environmentSignature ?? '',
1961
+ environment?.fogSignature ?? '',
1962
+ environmentReady && environment !== undefined,
1963
+ persistentRenderScene.transmissionTopologyDemand(),
1336
1964
  ),
1337
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);
1990
+ persistentRenderScene.setPointsLinesInspections(pointsLinesOwner.inspections());
1338
1991
  if (internals.featureHost !== undefined && preparedResourceBatches.length > 0) {
1339
1992
  const batches = preparedResourceBatches;
1340
1993
  if (submitted) {
@@ -1351,10 +2004,20 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1351
2004
  }
1352
2005
  }
1353
2006
  } catch (err) {
2007
+ if (!submitted) {
2008
+ internals.getPipelineState()?.perPassResources.discardBloomResources?.();
2009
+ }
1354
2010
  const innerError =
1355
- err instanceof RhiError
1356
- ? err
1357
- : { 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 };
1358
2021
  internals.errorRegistry.fire(
1359
2022
  new RhiError({
1360
2023
  code: 'webgpu-runtime-error',
@@ -1379,6 +2042,24 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1379
2042
  const currentFrameId = frameState.frameNumber - 1;
1380
2043
  return observeCurrentFrame(options, frameState.currentFrameObservationSource, currentFrameId);
1381
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
+ },
1382
2063
  bindGroupCounts: bindGroupCounts,
1383
2064
  frustumStats: lastFrustumStats,
1384
2065
  visibilityStats: lastVisibilityStats,
@@ -1388,6 +2069,12 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1388
2069
  get perFramePassNames(): readonly string[] {
1389
2070
  return frameState.compiledFrameGraph?.inspect().passes.map((pass) => pass.name) ?? [];
1390
2071
  },
2072
+ get lastSuccessfulCameraAntialias(): CameraSnapshot['antialias'] | undefined {
2073
+ return frameState.lastSuccessfulCameraAntialias;
2074
+ },
2075
+ get perFrameGraphInfo(): CompiledRenderGraphInfo | undefined {
2076
+ return frameState.compiledFrameGraph?.inspect();
2077
+ },
1391
2078
  configureStandard(config: RenderPipelineAsset['config']): void {
1392
2079
  const profileConfig = internals.standardProfile;
1393
2080
  const resolvedConfig =
@@ -1421,7 +2108,16 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1421
2108
  // is a rare boot/swap event, never a per-frame cost.
1422
2109
  installEpoch += 1;
1423
2110
  frameState.installedPipelineHandle = installEpoch;
1424
- 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';
1425
2121
  frameState.installedPipelineConfig = resolvedConfig;
1426
2122
  },
1427
2123
  registerBuiltinPostProcess(id: string, entry: PostProcessShaderEntry): () => void {
@@ -1429,7 +2125,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1429
2125
  // byteSize / defaultValue validation (q5=A).
1430
2126
  let paramsBuffer: Buffer | undefined;
1431
2127
  try {
1432
- if (entry.params !== undefined) {
2128
+ if (id !== 'forgeax.taa-resolve' && entry.params !== undefined) {
1433
2129
  const { byteSize, defaultValue } = entry.params;
1434
2130
  if (byteSize < 16 || defaultValue.length !== byteSize) {
1435
2131
  throw new PostProcessError({
@@ -1447,7 +2143,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1447
2143
  paramsBuffer = paramsBufferResult.value;
1448
2144
  const writeResult = internals.device.queue.writeBuffer(paramsBuffer, 0, defaultValue);
1449
2145
  if (!writeResult.ok) throw writeResult.error;
1450
- } else if (entryHasDepthRead(entry)) {
2146
+ } else if (id !== 'forgeax.taa-resolve' && entryHasDepthRead(entry)) {
1451
2147
  const paramsBufferResult = internals.device.createBuffer({
1452
2148
  label: `post-process-params-${id}`,
1453
2149
  size: DEPTH_MIN_PARAMS_BYTE_SIZE,
@@ -1487,6 +2183,13 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1487
2183
  persistentRenderScene.dispose();
1488
2184
  gpuDrivenProduction.dispose();
1489
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');
1490
2193
  // Retire graph-owned resources and dispose instance-buffer caches.
1491
2194
  // Both calls are idempotent + tolerate per-handle errors silently;
1492
2195
  // the Renderer.dispose() cascade owns the surrounding try/catch
@@ -1496,8 +2199,21 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1496
2199
  frameState.directionalShadowCache = null;
1497
2200
  frameState.directionalShadowCacheRecorded = false;
1498
2201
  frameState.currentFrameObservationSource = undefined;
2202
+ frameState.lastSuccessfulCameraAntialias = undefined;
1499
2203
  frameState.currentDirectionalShadowView = null;
1500
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();
1501
2217
  const compiled = frameState.compiledFrameGraph;
1502
2218
  frameState.compiledFrameGraph = null;
1503
2219
  frameState.compiledFrameGraphTopologyKey = null;
@@ -1531,10 +2247,23 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1531
2247
  }
1532
2248
  },
1533
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);
1534
2259
  persistentRenderScene.resetGpuForRecover();
1535
2260
  gpuDrivenProduction.dispose();
1536
2261
  gpuDrivenProduction = new GpuDrivenProduction(internals.device, gpuDrivenShaderFactory);
1537
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?.();
1538
2267
  // feat-20260622-s5 M3 / B-2 / w18: recover() rebuild drops device-bound
1539
2268
  // state minted by the lost device. The active graph and per-entity caches
1540
2269
  // must be discarded, not merely marked for destruction: their opaque
@@ -1546,8 +2275,21 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1546
2275
  frameState.directionalShadowCache = null;
1547
2276
  frameState.directionalShadowCacheRecorded = false;
1548
2277
  frameState.currentFrameObservationSource = undefined;
2278
+ frameState.lastSuccessfulCameraAntialias = undefined;
1549
2279
  frameState.currentDirectionalShadowView = null;
1550
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();
1551
2293
  for (const retired of frameState.retiredCompiledFrameGraphs) {
1552
2294
  retired.retire().catch(() => undefined);
1553
2295
  }
@@ -1584,6 +2326,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
1584
2326
  ...activeFeaturePostProcessEntries.entries(),
1585
2327
  ];
1586
2328
  for (const [id, entry] of declarations) {
2329
+ if (id === 'forgeax.taa-resolve') continue;
1587
2330
  let buffer: Buffer | undefined;
1588
2331
  if (entry.params !== undefined) {
1589
2332
  const created = internals.device.createBuffer({