@forgeax/engine-render 0.1.7 → 0.1.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (683) hide show
  1. package/README.md +140 -2
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/assembly/backend-contract.d.ts +12 -0
  4. package/dist/assembly/backend-contract.d.ts.map +1 -1
  5. package/dist/assembly/factory.d.ts +12 -2
  6. package/dist/assembly/factory.d.ts.map +1 -1
  7. package/dist/assembly/host-contract.d.ts +4 -0
  8. package/dist/assembly/host-contract.d.ts.map +1 -1
  9. package/dist/assembly/renderer-frame-transaction.d.ts +39 -0
  10. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -0
  11. package/dist/assembly/renderer-inspection.d.ts +22 -0
  12. package/dist/assembly/renderer-inspection.d.ts.map +1 -0
  13. package/dist/assembly/renderer-lifecycle.d.ts +4 -0
  14. package/dist/assembly/renderer-lifecycle.d.ts.map +1 -0
  15. package/dist/authoring.mjs +4 -2
  16. package/dist/authoring.mjs.map +1 -1
  17. package/dist/chunk-FJ6P52EE.mjs +46 -0
  18. package/dist/chunk-FJ6P52EE.mjs.map +1 -0
  19. package/dist/chunk-IPXCABEP.mjs +73 -0
  20. package/dist/chunk-IPXCABEP.mjs.map +1 -0
  21. package/dist/chunk-JDWARUOI.mjs +44 -0
  22. package/dist/chunk-JDWARUOI.mjs.map +1 -0
  23. package/dist/{chunk-YEJIUW7D.mjs → chunk-LOSO4CTV.mjs} +296 -547
  24. package/dist/chunk-LOSO4CTV.mjs.map +1 -0
  25. package/dist/chunk-PCHBPYML.mjs +385 -0
  26. package/dist/chunk-PCHBPYML.mjs.map +1 -0
  27. package/dist/chunk-RJRUS55L.mjs +9323 -0
  28. package/dist/chunk-RJRUS55L.mjs.map +1 -0
  29. package/dist/chunk-RXZ3RGOU.mjs +53 -0
  30. package/dist/chunk-RXZ3RGOU.mjs.map +1 -0
  31. package/dist/{chunk-CQXZC5XI.mjs → chunk-VFPLTKCU.mjs} +79 -69
  32. package/dist/chunk-VFPLTKCU.mjs.map +1 -0
  33. package/dist/chunk-YTQ5C7YQ.mjs +584 -0
  34. package/dist/chunk-YTQ5C7YQ.mjs.map +1 -0
  35. package/dist/components/atmosphere.d.ts +9 -0
  36. package/dist/components/atmosphere.d.ts.map +1 -0
  37. package/dist/components/camera.d.ts +2 -1
  38. package/dist/components/camera.d.ts.map +1 -1
  39. package/dist/components/fog.d.ts +8 -0
  40. package/dist/components/fog.d.ts.map +1 -0
  41. package/dist/components/index.d.ts +3 -0
  42. package/dist/components/index.d.ts.map +1 -1
  43. package/dist/components/motion-blur.d.ts +7 -0
  44. package/dist/components/motion-blur.d.ts.map +1 -0
  45. package/dist/construct-renderer.d.ts +2 -2
  46. package/dist/construct-renderer.d.ts.map +1 -1
  47. package/dist/construct-renderer.mjs +10914 -16392
  48. package/dist/construct-renderer.mjs.map +1 -1
  49. package/dist/device/device-scope.d.ts +4 -0
  50. package/dist/device/device-scope.d.ts.map +1 -1
  51. package/dist/environment/frame.d.ts +60 -0
  52. package/dist/environment/frame.d.ts.map +1 -0
  53. package/dist/environment/generation.d.ts +21 -0
  54. package/dist/environment/generation.d.ts.map +1 -0
  55. package/dist/environment/graph.d.ts +4 -0
  56. package/dist/environment/graph.d.ts.map +1 -0
  57. package/dist/environment/inspection.d.ts +48 -0
  58. package/dist/environment/inspection.d.ts.map +1 -0
  59. package/dist/environment/lifecycle.d.ts +39 -0
  60. package/dist/environment/lifecycle.d.ts.map +1 -0
  61. package/dist/environment/signature.d.ts +25 -0
  62. package/dist/environment/signature.d.ts.map +1 -0
  63. package/dist/errors/render.d.ts +136 -1
  64. package/dist/errors/render.d.ts.map +1 -1
  65. package/dist/extract/camera.d.ts +5 -0
  66. package/dist/extract/camera.d.ts.map +1 -0
  67. package/dist/extract/environment.d.ts +74 -0
  68. package/dist/extract/environment.d.ts.map +1 -0
  69. package/dist/extract/visibility.d.ts +1 -1
  70. package/dist/extract/visibility.d.ts.map +1 -1
  71. package/dist/features/host.d.ts +9 -2
  72. package/dist/features/host.d.ts.map +1 -1
  73. package/dist/features/motion-blur/motion-blur-feature.d.ts +16 -0
  74. package/dist/features/motion-blur/motion-blur-feature.d.ts.map +1 -0
  75. package/dist/features/motion-blur/motion-blur-params.d.ts +25 -0
  76. package/dist/features/motion-blur/motion-blur-params.d.ts.map +1 -0
  77. package/dist/features/plan.d.ts +17 -2
  78. package/dist/features/plan.d.ts.map +1 -1
  79. package/dist/features/prepared-gpu-work.d.ts +3 -1
  80. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  81. package/dist/features/prepared-graphics.d.ts +2 -1
  82. package/dist/features/prepared-graphics.d.ts.map +1 -1
  83. package/dist/features/render-graph-raster.d.ts +2 -1
  84. package/dist/features/render-graph-raster.d.ts.map +1 -1
  85. package/dist/features/targets.d.ts +3 -0
  86. package/dist/features/targets.d.ts.map +1 -1
  87. package/dist/features/types.d.ts +12 -0
  88. package/dist/features/types.d.ts.map +1 -1
  89. package/dist/fullscreen-post-process-pass.d.ts +7 -1
  90. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  91. package/dist/gpu-scene.d.ts +2 -0
  92. package/dist/gpu-scene.d.ts.map +1 -1
  93. package/dist/ibl/skylight-bind-group.d.ts +5 -6
  94. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  95. package/dist/index.d.ts +17 -6
  96. package/dist/index.d.ts.map +1 -1
  97. package/dist/index.mjs +6 -4
  98. package/dist/index.mjs.map +1 -1
  99. package/dist/inspection-types.d.ts +43 -1
  100. package/dist/inspection-types.d.ts.map +1 -1
  101. package/dist/internal.d.ts +2 -0
  102. package/dist/internal.d.ts.map +1 -1
  103. package/dist/internal.mjs +2 -0
  104. package/dist/materials.d.ts +22 -0
  105. package/dist/materials.d.ts.map +1 -1
  106. package/dist/pbr-pipeline.d.ts +10 -6
  107. package/dist/pbr-pipeline.d.ts.map +1 -1
  108. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  109. package/dist/pipeline/standard-pipeline.d.ts +3 -0
  110. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  111. package/dist/pipeline/standard-post.d.ts +48 -0
  112. package/dist/pipeline/standard-post.d.ts.map +1 -0
  113. package/dist/pipeline/standard-profile.d.ts +3 -6
  114. package/dist/pipeline/standard-profile.d.ts.map +1 -1
  115. package/dist/pipeline-builder.d.ts +18 -0
  116. package/dist/pipeline-builder.d.ts.map +1 -1
  117. package/dist/pipeline-spec.d.ts.map +1 -1
  118. package/dist/plugin.d.ts.map +1 -1
  119. package/dist/record/frame-snapshot.d.ts +100 -5
  120. package/dist/record/frame-snapshot.d.ts.map +1 -1
  121. package/dist/record/frame-targets.d.ts.map +1 -1
  122. package/dist/record/frame.d.ts +4 -2
  123. package/dist/record/frame.d.ts.map +1 -1
  124. package/dist/record/main-pass-geometry.d.ts +11 -0
  125. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  126. package/dist/record/main-pass-material.d.ts +8 -5
  127. package/dist/record/main-pass-material.d.ts.map +1 -1
  128. package/dist/record/main-pass-sprite-draws.d.ts +8 -1
  129. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  130. package/dist/record/main-pass.d.ts +2 -0
  131. package/dist/record/main-pass.d.ts.map +1 -1
  132. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  133. package/dist/record/render-context.d.ts +76 -18
  134. package/dist/record/render-context.d.ts.map +1 -1
  135. package/dist/record/shadow-pass.d.ts.map +1 -1
  136. package/dist/record/skybox-post-pass.d.ts +1 -11
  137. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  138. package/dist/record/typed-frame-graph.d.ts +26 -2
  139. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  140. package/dist/record/view-ubo.d.ts +4 -1
  141. package/dist/record/view-ubo.d.ts.map +1 -1
  142. package/dist/render-contract.d.ts +92 -8
  143. package/dist/render-contract.d.ts.map +1 -1
  144. package/dist/render-graph-primitives.d.ts.map +1 -1
  145. package/dist/render-pipeline.d.ts +50 -6
  146. package/dist/render-pipeline.d.ts.map +1 -1
  147. package/dist/render-system-extract.d.ts +29 -5
  148. package/dist/render-system-extract.d.ts.map +1 -1
  149. package/dist/render-system.d.ts +23 -4
  150. package/dist/render-system.d.ts.map +1 -1
  151. package/dist/scene/render-scene.d.ts +36 -2
  152. package/dist/scene/render-scene.d.ts.map +1 -1
  153. package/dist/temporal/coverage.d.ts +42 -0
  154. package/dist/temporal/coverage.d.ts.map +1 -0
  155. package/dist/temporal/frame-coordinator.d.ts +99 -0
  156. package/dist/temporal/frame-coordinator.d.ts.map +1 -0
  157. package/dist/temporal/gpu.d.ts +39 -0
  158. package/dist/temporal/gpu.d.ts.map +1 -0
  159. package/dist/temporal/history.d.ts +37 -0
  160. package/dist/temporal/history.d.ts.map +1 -0
  161. package/dist/temporal/index.d.ts +7 -0
  162. package/dist/temporal/index.d.ts.map +1 -0
  163. package/dist/temporal/index.mjs +8 -0
  164. package/dist/temporal/index.mjs.map +1 -0
  165. package/dist/temporal/inspection.d.ts +36 -0
  166. package/dist/temporal/inspection.d.ts.map +1 -0
  167. package/dist/temporal/scene-data-catalog.d.ts +48 -0
  168. package/dist/temporal/scene-data-catalog.d.ts.map +1 -0
  169. package/dist/temporal/scene-data.d.ts +43 -0
  170. package/dist/temporal/scene-data.d.ts.map +1 -0
  171. package/dist/temporal/standard-scene-data.d.ts +61 -0
  172. package/dist/temporal/standard-scene-data.d.ts.map +1 -0
  173. package/dist/temporal/taa-history-resources.d.ts +22 -0
  174. package/dist/temporal/taa-history-resources.d.ts.map +1 -0
  175. package/dist/temporal/taa-history-store.d.ts +27 -0
  176. package/dist/temporal/taa-history-store.d.ts.map +1 -0
  177. package/dist/temporal/taa-resolve.d.ts +15 -0
  178. package/dist/temporal/taa-resolve.d.ts.map +1 -0
  179. package/dist/temporal/temporal-view.d.ts +40 -0
  180. package/dist/temporal/temporal-view.d.ts.map +1 -0
  181. package/dist/temporal/transaction.d.ts +9 -0
  182. package/dist/temporal/transaction.d.ts.map +1 -0
  183. package/dist/temporal/view.d.ts +56 -0
  184. package/dist/temporal/view.d.ts.map +1 -0
  185. package/dist/transmission/backdrop.d.ts +147 -0
  186. package/dist/transmission/backdrop.d.ts.map +1 -0
  187. package/dist/transmission/inspection.d.ts +57 -0
  188. package/dist/transmission/inspection.d.ts.map +1 -0
  189. package/dist/transmission/oracle.d.ts +42 -0
  190. package/dist/transmission/oracle.d.ts.map +1 -0
  191. package/dist/transmission/projection.d.ts +37 -0
  192. package/dist/transmission/projection.d.ts.map +1 -0
  193. package/dist/typed-render-graph-primitives.d.ts +25 -2
  194. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  195. package/package.json +24 -19
  196. package/src/__tests__/ai-user-cold-start.integration.test.ts +59 -0
  197. package/src/__tests__/ai-user-public-surface.test-d.ts +45 -0
  198. package/src/__tests__/bloom-exact-zero.unit.test.ts +202 -0
  199. package/src/__tests__/bloom-lifecycle.integration.test.ts +125 -0
  200. package/src/__tests__/construct-renderer-identity.unit.test.ts +4 -3
  201. package/src/__tests__/detached-inspection.integration.test.ts +177 -0
  202. package/src/__tests__/environment-fog-lanes.integration.test.ts +219 -0
  203. package/src/__tests__/environment-generation.integration.test.ts +141 -0
  204. package/src/__tests__/environment-selection.unit.test.ts +245 -0
  205. package/src/__tests__/factory-contract.integration.test.ts +1380 -9
  206. package/src/__tests__/frame-plan-contract.unit.test.ts +90 -0
  207. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +7 -0
  208. package/src/__tests__/gpu-driven-production.integration.test.ts +74 -22
  209. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +37 -0
  210. package/src/__tests__/gpu-scene.unit.test.ts +10 -0
  211. package/src/__tests__/injection-kind-owner.test-d.ts +2 -1
  212. package/src/__tests__/material-contract-inventory.unit.test.ts +62 -0
  213. package/src/__tests__/material-cooked-projection.unit.test.ts +18 -146
  214. package/src/__tests__/materials-transmission-validation.unit.test.ts +36 -0
  215. package/src/__tests__/morph-feature-plan.unit.test.ts +7 -0
  216. package/src/__tests__/motion-blur.pixel.integration.test.ts +121 -0
  217. package/src/__tests__/public-surface.test-d.ts +15 -1
  218. package/src/__tests__/render-error-code-owner.test-d.ts +9 -0
  219. package/src/__tests__/render-error-detail-ssot.test-d.ts +11 -2
  220. package/src/__tests__/render-error-exhaustive.test-d.ts +3 -0
  221. package/src/__tests__/render-feature-errors.unit.test.ts +33 -3
  222. package/src/__tests__/render-feature-gpu-work.integration.test.ts +44 -0
  223. package/src/__tests__/render-feature-plan.test-d.ts +22 -89
  224. package/src/__tests__/render-scene-projection.unit.test.ts +28 -0
  225. package/src/__tests__/render-temporal-environment-consumer.browser.test.ts +26 -0
  226. package/src/__tests__/render-temporal-environment-consumer.dawn.test.ts +21 -0
  227. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +395 -1
  228. package/src/__tests__/renderer-frame-transaction.integration.test.ts +405 -0
  229. package/src/__tests__/renderer-lifecycle.integration.test.ts +22 -0
  230. package/src/__tests__/scene-data-catalog.unit.test.ts +59 -0
  231. package/src/__tests__/scene-data-consumer.integration.test.ts +67 -0
  232. package/src/__tests__/scene-data-contract.test-d.ts +35 -0
  233. package/src/__tests__/scene-data-inspection.unit.test.ts +41 -0
  234. package/src/__tests__/scene-data-public-surface.test-d.ts +34 -0
  235. package/src/__tests__/shader-manifest-fixture.ts +111 -0
  236. package/src/__tests__/skinned-shadow-caster.test.ts +102 -0
  237. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +24 -3
  238. package/src/__tests__/standard-pipeline.dawn.test.ts +15 -0
  239. package/src/__tests__/standard-pipeline.integration.test.ts +543 -1
  240. package/src/__tests__/standard-profile-oracle.unit.test.ts +10 -2
  241. package/src/__tests__/standard-temporal-producer.integration.test.ts +35 -0
  242. package/src/__tests__/surface-configuration.unit.test.ts +211 -12
  243. package/src/__tests__/taa-transaction.integration.test.ts +30 -0
  244. package/src/__tests__/temporal-admission.integration.test.ts +40 -0
  245. package/src/__tests__/temporal-coverage.unit.test.ts +35 -0
  246. package/src/__tests__/temporal-demand.unit.test.ts +44 -0
  247. package/src/__tests__/temporal-frame-coordinator.unit.test.ts +64 -0
  248. package/src/__tests__/temporal-graph-topology.unit.test.ts +51 -0
  249. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +170 -0
  250. package/src/__tests__/temporal-performance.integration.test.ts +615 -0
  251. package/src/__tests__/temporal-reset-matrix.unit.test.ts +97 -0
  252. package/src/__tests__/temporal-transaction.integration.test.ts +60 -0
  253. package/src/__tests__/temporal-view.unit.test.ts +152 -0
  254. package/src/__tests__/transmission-prewarm.unit.test.ts +93 -0
  255. package/src/__tests__/typed-pipeline-topology.unit.test.ts +230 -1
  256. package/src/__tests__/urp-pipeline-targets.unit.test.ts +25 -1
  257. package/src/__tests__/urp-pipeline.unit.test.ts +4 -3
  258. package/src/__tests__/visibility-extract.integration.test.ts +27 -1
  259. package/src/__tests__/visibility-producer-matrix.integration.test.ts +10 -0
  260. package/src/assembly/backend-contract.ts +47 -1
  261. package/src/assembly/factory.ts +1224 -505
  262. package/src/assembly/host-contract.ts +4 -0
  263. package/src/assembly/renderer-frame-transaction.ts +75 -0
  264. package/src/assembly/renderer-inspection.ts +112 -0
  265. package/src/assembly/renderer-lifecycle.ts +6 -0
  266. package/src/components/__tests__/motion-blur.unit.test.ts +14 -0
  267. package/src/components/__tests__/schema-contract.unit.test.ts +6 -1
  268. package/src/components/atmosphere.ts +10 -0
  269. package/src/components/camera.ts +2 -1
  270. package/src/components/fog.ts +9 -0
  271. package/src/components/index.ts +3 -0
  272. package/src/components/motion-blur.ts +8 -0
  273. package/src/construct-renderer.ts +40 -3
  274. package/src/device/device-scope.ts +15 -1
  275. package/src/environment/frame.ts +185 -0
  276. package/src/environment/generation.ts +23 -0
  277. package/src/environment/graph.ts +9 -0
  278. package/src/environment/inspection.ts +87 -0
  279. package/src/environment/lifecycle.ts +250 -0
  280. package/src/environment/signature.ts +55 -0
  281. package/src/errors/render.ts +285 -0
  282. package/src/extract/camera.ts +78 -0
  283. package/src/extract/environment.ts +171 -0
  284. package/src/extract/visibility.ts +38 -19
  285. package/src/features/host.ts +36 -5
  286. package/src/features/motion-blur/__tests__/motion-blur-feature.unit.test.ts +67 -0
  287. package/src/features/motion-blur/__tests__/motion-blur-params.unit.test.ts +53 -0
  288. package/src/features/motion-blur/motion-blur-feature.ts +119 -0
  289. package/src/features/motion-blur/motion-blur-params.ts +89 -0
  290. package/src/features/plan.ts +32 -3
  291. package/src/features/prepared-gpu-work.ts +21 -6
  292. package/src/features/prepared-graphics.ts +2 -1
  293. package/src/features/render-graph-raster.ts +2 -1
  294. package/src/features/targets.ts +24 -2
  295. package/src/features/types.ts +13 -0
  296. package/src/fullscreen-post-process-pass.ts +34 -4
  297. package/src/gpu-scene.ts +24 -0
  298. package/src/ibl/skylight-bind-group.ts +30 -38
  299. package/src/index.ts +66 -6
  300. package/src/inspection-types.ts +48 -0
  301. package/src/internal.ts +5 -0
  302. package/src/materials.ts +119 -24
  303. package/src/pbr-pipeline.ts +58 -19
  304. package/src/pipeline/standard-forward-lane.ts +158 -101
  305. package/src/pipeline/standard-pipeline.ts +156 -105
  306. package/src/pipeline/standard-post.ts +373 -0
  307. package/src/pipeline/standard-profile.ts +11 -11
  308. package/src/pipeline-builder.ts +102 -12
  309. package/src/pipeline-spec.ts +9 -0
  310. package/src/plugin.ts +2 -0
  311. package/src/record/__tests__/fullscreen-temporal-routing.unit.test.ts +25 -0
  312. package/src/record/__tests__/main-pass-geometry.unit.test.ts +47 -0
  313. package/src/record/__tests__/material-bg-cache.unit.test.ts +12 -1
  314. package/src/record/__tests__/material-pipeline-pending-cache.unit.test.ts +22 -0
  315. package/src/record/__tests__/sprite-material-abi.unit.test.ts +75 -0
  316. package/src/record/__tests__/standard-pbr-ubo-layout.unit.test.ts +67 -0
  317. package/src/record/__tests__/temporal-payload.unit.test.ts +164 -0
  318. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +127 -0
  319. package/src/record/frame-snapshot.ts +129 -5
  320. package/src/record/frame-targets.ts +15 -6
  321. package/src/record/frame.ts +107 -3
  322. package/src/record/main-pass-geometry.ts +86 -40
  323. package/src/record/main-pass-material.ts +114 -66
  324. package/src/record/main-pass-sprite-draws.ts +78 -101
  325. package/src/record/main-pass.ts +77 -4
  326. package/src/record/mesh-ssbo.ts +22 -3
  327. package/src/record/render-context.ts +189 -23
  328. package/src/record/shadow-pass.ts +113 -23
  329. package/src/record/skybox-post-pass.ts +97 -41
  330. package/src/record/typed-frame-graph.ts +565 -26
  331. package/src/record/view-ubo.ts +52 -4
  332. package/src/render-contract.ts +109 -6
  333. package/src/render-graph-primitives.ts +18 -1
  334. package/src/render-pipeline.ts +100 -27
  335. package/src/render-system-extract.ts +193 -69
  336. package/src/render-system.ts +482 -41
  337. package/src/scene/render-scene.ts +250 -7
  338. package/src/temporal/__tests__/taa-history-resources.unit.test.ts +45 -0
  339. package/src/temporal/coverage.ts +76 -0
  340. package/src/temporal/frame-coordinator.ts +311 -0
  341. package/src/temporal/gpu.ts +287 -0
  342. package/src/temporal/history.ts +92 -0
  343. package/src/temporal/index.ts +6 -0
  344. package/src/temporal/inspection.ts +97 -0
  345. package/src/temporal/scene-data-catalog.ts +200 -0
  346. package/src/temporal/scene-data.ts +149 -0
  347. package/src/temporal/standard-scene-data.ts +182 -0
  348. package/src/temporal/taa-history-resources.ts +128 -0
  349. package/src/temporal/taa-history-store.ts +79 -0
  350. package/src/temporal/taa-resolve.ts +34 -0
  351. package/src/temporal/temporal-view.ts +169 -0
  352. package/src/temporal/transaction.ts +17 -0
  353. package/src/temporal/view.ts +161 -0
  354. package/src/transmission/__tests__/capability.unit.test.ts +83 -0
  355. package/src/transmission/__tests__/composition.integration.test.ts +161 -0
  356. package/src/transmission/__tests__/inspection.unit.test.ts +241 -0
  357. package/src/transmission/__tests__/lifecycle.integration.test.ts +96 -0
  358. package/src/transmission/__tests__/oracle.unit.test.ts +131 -0
  359. package/src/transmission/__tests__/projection.unit.test.ts +71 -0
  360. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +438 -0
  361. package/src/transmission/__tests__/transmission-backdrop-topology.unit.test.ts +109 -0
  362. package/src/transmission/__tests__/transmission-backdrop.dawn.test.ts +105 -0
  363. package/src/transmission/backdrop.ts +572 -0
  364. package/src/transmission/inspection.ts +190 -0
  365. package/src/transmission/oracle.ts +141 -0
  366. package/src/transmission/projection.ts +83 -0
  367. package/src/typed-render-graph-primitives.ts +162 -9
  368. package/dist/__tests__/authoring-path.unit.test.d.ts +0 -2
  369. package/dist/__tests__/authoring-path.unit.test.d.ts.map +0 -1
  370. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts +0 -2
  371. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts.map +0 -1
  372. package/dist/__tests__/callback-inference.test-d.d.ts +0 -2
  373. package/dist/__tests__/callback-inference.test-d.d.ts.map +0 -1
  374. package/dist/__tests__/cluster-binner.test.d.ts +0 -2
  375. package/dist/__tests__/cluster-binner.test.d.ts.map +0 -1
  376. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts +0 -2
  377. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts.map +0 -1
  378. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts +0 -2
  379. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts.map +0 -1
  380. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts +0 -2
  381. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts.map +0 -1
  382. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts +0 -2
  383. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts.map +0 -1
  384. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts +0 -2
  385. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts.map +0 -1
  386. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts +0 -2
  387. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts.map +0 -1
  388. package/dist/__tests__/factory-contract.integration.test.d.ts +0 -2
  389. package/dist/__tests__/factory-contract.integration.test.d.ts.map +0 -1
  390. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts +0 -2
  391. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts.map +0 -1
  392. package/dist/__tests__/frame-observation.contract.test.d.ts +0 -2
  393. package/dist/__tests__/frame-observation.contract.test.d.ts.map +0 -1
  394. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts +0 -2
  395. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts.map +0 -1
  396. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts +0 -2
  397. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts.map +0 -1
  398. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts +0 -6
  399. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +0 -1
  400. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts +0 -2
  401. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts.map +0 -1
  402. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts +0 -2
  403. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts.map +0 -1
  404. package/dist/__tests__/gpu-driven-production.integration.test.d.ts +0 -2
  405. package/dist/__tests__/gpu-driven-production.integration.test.d.ts.map +0 -1
  406. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts +0 -2
  407. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts.map +0 -1
  408. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +0 -18
  409. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +0 -1
  410. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts +0 -2
  411. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts.map +0 -1
  412. package/dist/__tests__/gpu-driven-view-reference.d.ts +0 -15
  413. package/dist/__tests__/gpu-driven-view-reference.d.ts.map +0 -1
  414. package/dist/__tests__/gpu-driven-view.browser.test.d.ts +0 -2
  415. package/dist/__tests__/gpu-driven-view.browser.test.d.ts.map +0 -1
  416. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts +0 -2
  417. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts.map +0 -1
  418. package/dist/__tests__/gpu-driven-view.unit.test.d.ts +0 -2
  419. package/dist/__tests__/gpu-driven-view.unit.test.d.ts.map +0 -1
  420. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts +0 -2
  421. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts.map +0 -1
  422. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts +0 -7
  423. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +0 -1
  424. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts +0 -2
  425. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts.map +0 -1
  426. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts +0 -2
  427. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts.map +0 -1
  428. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts +0 -2
  429. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts.map +0 -1
  430. package/dist/__tests__/gpu-scene.dawn.test.d.ts +0 -2
  431. package/dist/__tests__/gpu-scene.dawn.test.d.ts.map +0 -1
  432. package/dist/__tests__/gpu-scene.unit.test.d.ts +0 -2
  433. package/dist/__tests__/gpu-scene.unit.test.d.ts.map +0 -1
  434. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts +0 -2
  435. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts.map +0 -1
  436. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts +0 -2
  437. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts.map +0 -1
  438. package/dist/__tests__/injection-kind-owner.test-d.d.ts +0 -2
  439. package/dist/__tests__/injection-kind-owner.test-d.d.ts.map +0 -1
  440. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts +0 -2
  441. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts.map +0 -1
  442. package/dist/__tests__/light-buffer-layout.unit.test.d.ts +0 -2
  443. package/dist/__tests__/light-buffer-layout.unit.test.d.ts.map +0 -1
  444. package/dist/__tests__/material-contract-inventory.unit.test.d.ts +0 -2
  445. package/dist/__tests__/material-contract-inventory.unit.test.d.ts.map +0 -1
  446. package/dist/__tests__/material-cooked-projection.unit.test.d.ts +0 -2
  447. package/dist/__tests__/material-cooked-projection.unit.test.d.ts.map +0 -1
  448. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts +0 -2
  449. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts.map +0 -1
  450. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts +0 -2
  451. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts.map +0 -1
  452. package/dist/__tests__/material-stride-surface.unit.test.d.ts +0 -2
  453. package/dist/__tests__/material-stride-surface.unit.test.d.ts.map +0 -1
  454. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts +0 -2
  455. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts.map +0 -1
  456. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts +0 -2
  457. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts.map +0 -1
  458. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts +0 -2
  459. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts.map +0 -1
  460. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts +0 -2
  461. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts.map +0 -1
  462. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts +0 -2
  463. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts.map +0 -1
  464. package/dist/__tests__/morph-feature-plan.unit.test.d.ts +0 -2
  465. package/dist/__tests__/morph-feature-plan.unit.test.d.ts.map +0 -1
  466. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts +0 -2
  467. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts.map +0 -1
  468. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts +0 -2
  469. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts.map +0 -1
  470. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts +0 -2
  471. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts.map +0 -1
  472. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts +0 -2
  473. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts.map +0 -1
  474. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts +0 -2
  475. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts.map +0 -1
  476. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts +0 -2
  477. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts.map +0 -1
  478. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts +0 -2
  479. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts.map +0 -1
  480. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts +0 -2
  481. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts.map +0 -1
  482. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts +0 -2
  483. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts.map +0 -1
  484. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts +0 -2
  485. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts.map +0 -1
  486. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts +0 -2
  487. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts.map +0 -1
  488. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts +0 -2
  489. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts.map +0 -1
  490. package/dist/__tests__/profiler-default-off.test.d.ts +0 -2
  491. package/dist/__tests__/profiler-default-off.test.d.ts.map +0 -1
  492. package/dist/__tests__/profiler-phase-catalog.test.d.ts +0 -2
  493. package/dist/__tests__/profiler-phase-catalog.test.d.ts.map +0 -1
  494. package/dist/__tests__/profiler-phase-integration.test.d.ts +0 -2
  495. package/dist/__tests__/profiler-phase-integration.test.d.ts.map +0 -1
  496. package/dist/__tests__/profiler-phase-token.test.d.ts +0 -2
  497. package/dist/__tests__/profiler-phase-token.test.d.ts.map +0 -1
  498. package/dist/__tests__/public-surface.test-d.d.ts +0 -2
  499. package/dist/__tests__/public-surface.test-d.d.ts.map +0 -1
  500. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts +0 -2
  501. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts.map +0 -1
  502. package/dist/__tests__/render-error-code-owner.test-d.d.ts +0 -2
  503. package/dist/__tests__/render-error-code-owner.test-d.d.ts.map +0 -1
  504. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts +0 -2
  505. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts.map +0 -1
  506. package/dist/__tests__/render-error-exhaustive.test-d.d.ts +0 -2
  507. package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +0 -1
  508. package/dist/__tests__/render-feature-assembly.test-d.d.ts +0 -2
  509. package/dist/__tests__/render-feature-assembly.test-d.d.ts.map +0 -1
  510. package/dist/__tests__/render-feature-context.test-d.d.ts +0 -2
  511. package/dist/__tests__/render-feature-context.test-d.d.ts.map +0 -1
  512. package/dist/__tests__/render-feature-contract.test-d.d.ts +0 -2
  513. package/dist/__tests__/render-feature-contract.test-d.d.ts.map +0 -1
  514. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts +0 -2
  515. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts.map +0 -1
  516. package/dist/__tests__/render-feature-docs.unit.test.d.ts +0 -2
  517. package/dist/__tests__/render-feature-docs.unit.test.d.ts.map +0 -1
  518. package/dist/__tests__/render-feature-errors.unit.test.d.ts +0 -2
  519. package/dist/__tests__/render-feature-errors.unit.test.d.ts.map +0 -1
  520. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts +0 -2
  521. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts.map +0 -1
  522. package/dist/__tests__/render-feature-plan.test-d.d.ts +0 -2
  523. package/dist/__tests__/render-feature-plan.test-d.d.ts.map +0 -1
  524. package/dist/__tests__/render-feature-plan.unit.test.d.ts +0 -2
  525. package/dist/__tests__/render-feature-plan.unit.test.d.ts.map +0 -1
  526. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts +0 -2
  527. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts.map +0 -1
  528. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts +0 -2
  529. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts.map +0 -1
  530. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts +0 -2
  531. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts.map +0 -1
  532. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts +0 -2
  533. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts.map +0 -1
  534. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts +0 -2
  535. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts.map +0 -1
  536. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts +0 -2
  537. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts.map +0 -1
  538. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts +0 -2
  539. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts.map +0 -1
  540. package/dist/__tests__/render-feature-public-surface.test-d.d.ts +0 -2
  541. package/dist/__tests__/render-feature-public-surface.test-d.d.ts.map +0 -1
  542. package/dist/__tests__/render-feature-retry.unit.test.d.ts +0 -2
  543. package/dist/__tests__/render-feature-retry.unit.test.d.ts.map +0 -1
  544. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts +0 -2
  545. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts.map +0 -1
  546. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts +0 -2
  547. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts.map +0 -1
  548. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts +0 -2
  549. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts.map +0 -1
  550. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts +0 -2
  551. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts.map +0 -1
  552. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts +0 -2
  553. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts.map +0 -1
  554. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts +0 -2
  555. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts.map +0 -1
  556. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts +0 -7
  557. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts.map +0 -1
  558. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts +0 -2
  559. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts.map +0 -1
  560. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts +0 -2
  561. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts.map +0 -1
  562. package/dist/__tests__/render-graph-hzb-gpu.d.ts +0 -7
  563. package/dist/__tests__/render-graph-hzb-gpu.d.ts.map +0 -1
  564. package/dist/__tests__/render-graph-hzb.browser.test.d.ts +0 -2
  565. package/dist/__tests__/render-graph-hzb.browser.test.d.ts.map +0 -1
  566. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts +0 -2
  567. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts.map +0 -1
  568. package/dist/__tests__/render-graph-primitives.unit.test.d.ts +0 -2
  569. package/dist/__tests__/render-graph-primitives.unit.test.d.ts.map +0 -1
  570. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts +0 -12
  571. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts.map +0 -1
  572. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts +0 -2
  573. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts.map +0 -1
  574. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts +0 -2
  575. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts.map +0 -1
  576. package/dist/__tests__/render-scene-projection.unit.test.d.ts +0 -2
  577. package/dist/__tests__/render-scene-projection.unit.test.d.ts.map +0 -1
  578. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts +0 -2
  579. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts.map +0 -1
  580. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts +0 -2
  581. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts.map +0 -1
  582. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts +0 -2
  583. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts.map +0 -1
  584. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts +0 -2
  585. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts.map +0 -1
  586. package/dist/__tests__/shader-stage-surface.unit.test.d.ts +0 -2
  587. package/dist/__tests__/shader-stage-surface.unit.test.d.ts.map +0 -1
  588. package/dist/__tests__/ssao-config.unit.test.d.ts +0 -2
  589. package/dist/__tests__/ssao-config.unit.test.d.ts.map +0 -1
  590. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts +0 -2
  591. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts.map +0 -1
  592. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts +0 -2
  593. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts.map +0 -1
  594. package/dist/__tests__/standard-descriptors.test-d.d.ts +0 -2
  595. package/dist/__tests__/standard-descriptors.test-d.d.ts.map +0 -1
  596. package/dist/__tests__/standard-pipeline.dawn.test.d.ts +0 -2
  597. package/dist/__tests__/standard-pipeline.dawn.test.d.ts.map +0 -1
  598. package/dist/__tests__/standard-pipeline.integration.test.d.ts +0 -2
  599. package/dist/__tests__/standard-pipeline.integration.test.d.ts.map +0 -1
  600. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts +0 -2
  601. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts.map +0 -1
  602. package/dist/__tests__/surface-configuration.unit.test.d.ts +0 -2
  603. package/dist/__tests__/surface-configuration.unit.test.d.ts.map +0 -1
  604. package/dist/__tests__/texture-usage-surface.unit.test.d.ts +0 -2
  605. package/dist/__tests__/texture-usage-surface.unit.test.d.ts.map +0 -1
  606. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts +0 -2
  607. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts.map +0 -1
  608. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts +0 -2
  609. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts.map +0 -1
  610. package/dist/__tests__/urp-pipeline.unit.test.d.ts +0 -2
  611. package/dist/__tests__/urp-pipeline.unit.test.d.ts.map +0 -1
  612. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts +0 -2
  613. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts.map +0 -1
  614. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts +0 -2
  615. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts.map +0 -1
  616. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts +0 -2
  617. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts.map +0 -1
  618. package/dist/__tests__/visibility-extract.integration.test.d.ts +0 -2
  619. package/dist/__tests__/visibility-extract.integration.test.d.ts.map +0 -1
  620. package/dist/__tests__/visibility-extract.perf.test.d.ts +0 -2
  621. package/dist/__tests__/visibility-extract.perf.test.d.ts.map +0 -1
  622. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts +0 -2
  623. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts.map +0 -1
  624. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts +0 -2
  625. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts.map +0 -1
  626. package/dist/__tests__/visibility-instances.integration.test.d.ts +0 -2
  627. package/dist/__tests__/visibility-instances.integration.test.d.ts.map +0 -1
  628. package/dist/__tests__/visibility-multi-world.integration.test.d.ts +0 -2
  629. package/dist/__tests__/visibility-multi-world.integration.test.d.ts.map +0 -1
  630. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts +0 -2
  631. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts.map +0 -1
  632. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts +0 -2
  633. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts.map +0 -1
  634. package/dist/__tests__/visibility-public-surface.test-d.d.ts +0 -2
  635. package/dist/__tests__/visibility-public-surface.test-d.d.ts.map +0 -1
  636. package/dist/__tests__/visibility-resolver.unit.test.d.ts +0 -2
  637. package/dist/__tests__/visibility-resolver.unit.test.d.ts.map +0 -1
  638. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts +0 -2
  639. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts.map +0 -1
  640. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts +0 -2
  641. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts.map +0 -1
  642. package/dist/__tests__/vocabulary.unit.test.d.ts +0 -2
  643. package/dist/__tests__/vocabulary.unit.test.d.ts.map +0 -1
  644. package/dist/chunk-CQXZC5XI.mjs.map +0 -1
  645. package/dist/chunk-HCOGPHKS.mjs +0 -93
  646. package/dist/chunk-HCOGPHKS.mjs.map +0 -1
  647. package/dist/chunk-YEJIUW7D.mjs.map +0 -1
  648. package/dist/components/__tests__/points-lines-admission.unit.test.d.ts +0 -2
  649. package/dist/components/__tests__/points-lines-admission.unit.test.d.ts.map +0 -1
  650. package/dist/components/__tests__/points-lines-schema.unit.test.d.ts +0 -2
  651. package/dist/components/__tests__/points-lines-schema.unit.test.d.ts.map +0 -1
  652. package/dist/components/__tests__/schema-contract.unit.test.d.ts +0 -2
  653. package/dist/components/__tests__/schema-contract.unit.test.d.ts.map +0 -1
  654. package/dist/components/__tests__/schema-parity.unit.test.d.ts +0 -2
  655. package/dist/components/__tests__/schema-parity.unit.test.d.ts.map +0 -1
  656. package/dist/components/__tests__/visibility-schema.unit.test.d.ts +0 -2
  657. package/dist/components/__tests__/visibility-schema.unit.test.d.ts.map +0 -1
  658. package/dist/points-lines/__tests__/bounds.unit.test.d.ts +0 -2
  659. package/dist/points-lines/__tests__/bounds.unit.test.d.ts.map +0 -1
  660. package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts +0 -2
  661. package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts.map +0 -1
  662. package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts +0 -2
  663. package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts.map +0 -1
  664. package/dist/points-lines/__tests__/inspection.unit.test.d.ts +0 -2
  665. package/dist/points-lines/__tests__/inspection.unit.test.d.ts.map +0 -1
  666. package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts +0 -2
  667. package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts.map +0 -1
  668. package/dist/points-lines/__tests__/points-lines.bench.d.ts +0 -2
  669. package/dist/points-lines/__tests__/points-lines.bench.d.ts.map +0 -1
  670. package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts +0 -2
  671. package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts.map +0 -1
  672. package/dist/points-lines/__tests__/snapshot.unit.test.d.ts +0 -2
  673. package/dist/points-lines/__tests__/snapshot.unit.test.d.ts.map +0 -1
  674. package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts +0 -2
  675. package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts.map +0 -1
  676. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts +0 -2
  677. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts.map +0 -1
  678. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts +0 -2
  679. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts.map +0 -1
  680. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts +0 -2
  681. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts.map +0 -1
  682. package/dist/record/__tests__/video-texture-view.unit.test.d.ts +0 -2
  683. package/dist/record/__tests__/video-texture-view.unit.test.d.ts.map +0 -1
@@ -0,0 +1,128 @@
1
+ import type {
2
+ RhiDevice,
3
+ RhiError,
4
+ Texture,
5
+ TextureDescriptor,
6
+ TextureView,
7
+ } from '@forgeax/engine-rhi';
8
+ import { err, ok, type Result } from '@forgeax/engine-types';
9
+ import {
10
+ GPU_TEXTURE_USAGE_COPY_DST,
11
+ GPU_TEXTURE_USAGE_COPY_SRC,
12
+ GPU_TEXTURE_USAGE_RENDER_ATTACHMENT,
13
+ GPU_TEXTURE_USAGE_TEXTURE_BINDING,
14
+ } from '../gpu-texture-usage';
15
+
16
+ const HISTORY_USAGE =
17
+ GPU_TEXTURE_USAGE_COPY_SRC |
18
+ GPU_TEXTURE_USAGE_COPY_DST |
19
+ GPU_TEXTURE_USAGE_TEXTURE_BINDING |
20
+ GPU_TEXTURE_USAGE_RENDER_ATTACHMENT;
21
+
22
+ export interface TaaHistorySlot {
23
+ readonly texture: Texture;
24
+ readonly view: TextureView;
25
+ }
26
+
27
+ export interface TaaHistoryResources {
28
+ readonly width: number;
29
+ readonly height: number;
30
+ readonly descriptor: TextureDescriptor;
31
+ readonly slots: readonly [TaaHistorySlot, TaaHistorySlot];
32
+ readonly temporalSlots: readonly [TaaHistorySlot, TaaHistorySlot];
33
+ readonly currentIndex: 0 | 1;
34
+ readonly previousIndex: 0 | 1;
35
+ readonly valid: boolean;
36
+ beginFrame(): void;
37
+ commitFrame(): void;
38
+ abortFrame(): void;
39
+ dispose(): void;
40
+ }
41
+
42
+ export function createTaaHistoryResources(
43
+ device: RhiDevice,
44
+ width: number,
45
+ height: number,
46
+ ): Result<TaaHistoryResources, RhiError> {
47
+ const descriptor: TextureDescriptor = {
48
+ label: 'taa-history-rgba16float',
49
+ size: { width, height, depthOrArrayLayers: 1 },
50
+ format: 'rgba16float',
51
+ usage: HISTORY_USAGE,
52
+ sampleCount: 1,
53
+ mipLevelCount: undefined,
54
+ dimension: undefined,
55
+ viewFormats: undefined,
56
+ textureBindingViewDimension: undefined,
57
+ };
58
+ const createSlots = (kind: 'color' | 'temporal'): Result<TaaHistorySlot[], RhiError> => {
59
+ const slots: TaaHistorySlot[] = [];
60
+ for (let index = 0; index < 2; index += 1) {
61
+ const texture = device.createTexture({
62
+ ...descriptor,
63
+ label: `taa-history-${kind}-rgba16float-${index}`,
64
+ });
65
+ if (!texture.ok) {
66
+ for (const slot of slots) device.destroyTexture(slot.texture);
67
+ return texture;
68
+ }
69
+ const view = device.createTextureView(texture.value, {
70
+ label: `taa-history-${kind}-rgba16float-${index}.view`,
71
+ dimension: '2d',
72
+ });
73
+ if (!view.ok) {
74
+ device.destroyTexture(texture.value);
75
+ for (const slot of slots) device.destroyTexture(slot.texture);
76
+ return err(view.error);
77
+ }
78
+ slots.push({ texture: texture.value, view: view.value });
79
+ }
80
+ return ok(slots);
81
+ };
82
+ const colorSlots = createSlots('color');
83
+ if (!colorSlots.ok) return colorSlots;
84
+ const temporalSlots = createSlots('temporal');
85
+ if (!temporalSlots.ok) {
86
+ for (const slot of colorSlots.value) device.destroyTexture(slot.texture);
87
+ return temporalSlots;
88
+ }
89
+
90
+ let currentIndex: 0 | 1 = 0;
91
+ let valid = false;
92
+ let active = false;
93
+ let disposed = false;
94
+ return ok({
95
+ width,
96
+ height,
97
+ descriptor,
98
+ slots: colorSlots.value as [TaaHistorySlot, TaaHistorySlot],
99
+ temporalSlots: temporalSlots.value as [TaaHistorySlot, TaaHistorySlot],
100
+ get currentIndex() {
101
+ return currentIndex;
102
+ },
103
+ get previousIndex() {
104
+ return currentIndex === 0 ? 1 : 0;
105
+ },
106
+ get valid() {
107
+ return valid;
108
+ },
109
+ beginFrame() {
110
+ active = true;
111
+ },
112
+ commitFrame() {
113
+ if (!active || disposed) return;
114
+ currentIndex = currentIndex === 0 ? 1 : 0;
115
+ valid = true;
116
+ active = false;
117
+ },
118
+ abortFrame() {
119
+ active = false;
120
+ },
121
+ dispose() {
122
+ if (disposed) return;
123
+ disposed = true;
124
+ for (const slot of colorSlots.value) device.destroyTexture(slot.texture);
125
+ for (const slot of temporalSlots.value) device.destroyTexture(slot.texture);
126
+ },
127
+ });
128
+ }
@@ -0,0 +1,79 @@
1
+ export type TaaHistoryResetReason =
2
+ | 'first-frame'
3
+ | 'camera-cut'
4
+ | 'resize'
5
+ | 'recover'
6
+ | 'device-generation';
7
+
8
+ export interface TaaHistoryInspection {
9
+ readonly generation: number;
10
+ readonly seed: number;
11
+ readonly attempt: 'none' | 'active' | 'committed' | 'aborted';
12
+ readonly valid: boolean;
13
+ readonly resetReason: TaaHistoryResetReason | undefined;
14
+ }
15
+
16
+ export interface TaaHistoryAttempt {
17
+ readonly generation: number;
18
+ readonly seed: number;
19
+ commit(): void;
20
+ abort(): void;
21
+ }
22
+
23
+ /** TAA-only history owner. No global registry or backend handle crosses this boundary. */
24
+ export class TaaHistoryStore {
25
+ private generation = 0;
26
+ private seed = 0;
27
+ private valid = false;
28
+ private attempt: TaaHistoryInspection['attempt'] = 'none';
29
+ private resetReason: TaaHistoryResetReason | undefined;
30
+
31
+ begin(reason: TaaHistoryResetReason | undefined = undefined): TaaHistoryAttempt {
32
+ const generation = this.generation;
33
+ const seed = this.seed;
34
+ this.attempt = 'active';
35
+ let state: 'active' | 'committed' | 'aborted' = 'active';
36
+ return {
37
+ generation,
38
+ seed,
39
+ commit: () => {
40
+ if (state !== 'active') return;
41
+ state = 'committed';
42
+ this.attempt = 'committed';
43
+ this.valid = true;
44
+ this.generation += 1;
45
+ this.seed += 1;
46
+ this.resetReason = reason;
47
+ },
48
+ abort: () => {
49
+ if (state !== 'active') return;
50
+ state = 'aborted';
51
+ this.attempt = 'aborted';
52
+ },
53
+ };
54
+ }
55
+
56
+ seedHistory(reason: TaaHistoryResetReason = 'first-frame'): void {
57
+ this.valid = false;
58
+ this.resetReason = reason;
59
+ this.attempt = 'none';
60
+ }
61
+
62
+ reset(reason: TaaHistoryResetReason): void {
63
+ this.generation = 0;
64
+ this.seed = 0;
65
+ this.valid = false;
66
+ this.attempt = 'none';
67
+ this.resetReason = reason;
68
+ }
69
+
70
+ inspect(): TaaHistoryInspection {
71
+ return {
72
+ generation: this.generation,
73
+ seed: this.seed,
74
+ attempt: this.attempt,
75
+ valid: this.valid,
76
+ resetReason: this.resetReason,
77
+ };
78
+ }
79
+ }
@@ -0,0 +1,34 @@
1
+ import type { RenderPipelineFeatureTarget, RenderPipelineTarget } from '../render-pipeline';
2
+
3
+ export interface TaaResolveInput {
4
+ readonly current: RenderPipelineFeatureTarget;
5
+ readonly temporal: RenderPipelineFeatureTarget;
6
+ readonly historyValid: boolean;
7
+ }
8
+
9
+ export interface TaaResolveInspection {
10
+ readonly applied: boolean;
11
+ readonly currentOnly: boolean;
12
+ readonly historyGeneration: number;
13
+ }
14
+
15
+ /** TAA resolve contract; graph encoding remains owned by Standard topology. */
16
+ export function resolveTaa(
17
+ input: TaaResolveInput,
18
+ historyGeneration: number,
19
+ ): TaaResolveInspection {
20
+ return {
21
+ applied: input.historyValid,
22
+ currentOnly: !input.historyValid,
23
+ historyGeneration,
24
+ };
25
+ }
26
+
27
+ export function taaOutputTarget(target: RenderPipelineFeatureTarget): RenderPipelineTarget {
28
+ return {
29
+ texture: target.texture,
30
+ view: target.view,
31
+ format: 'rgba16float',
32
+ sampleCount: 1,
33
+ };
34
+ }
@@ -0,0 +1,169 @@
1
+ import { mat4 } from '@forgeax/engine-math';
2
+ import type { CameraProjection } from '../components/camera';
3
+ import type { CameraSnapshot } from '../render-contract';
4
+
5
+ export const TEMPORAL_JITTER_SAMPLE_COUNT = 8;
6
+
7
+ export type TemporalViewResetReason =
8
+ | 'first-frame'
9
+ | 'camera-switch'
10
+ | 'history-version-changed'
11
+ | 'projection-kind-changed'
12
+ | 'projection-range-changed';
13
+
14
+ export interface SubmittedTemporalView {
15
+ readonly viewId: string;
16
+ readonly historyVersion: number;
17
+ readonly projection: CameraProjection;
18
+ readonly near: number;
19
+ readonly far: number;
20
+ readonly jitterUv: readonly [number, number];
21
+ readonly unjitteredViewProjection: Float32Array;
22
+ }
23
+
24
+ export interface TemporalView {
25
+ readonly viewId: string;
26
+ readonly historyVersion: number;
27
+ readonly temporalFrameIndex: number;
28
+ readonly historyValid: boolean;
29
+ readonly resetReason: TemporalViewResetReason | undefined;
30
+ readonly currentJitterUv: readonly [number, number];
31
+ readonly previousJitterUv: readonly [number, number];
32
+ readonly currentJitteredViewProjection: Float32Array;
33
+ readonly currentUnjitteredViewProjection: Float32Array;
34
+ readonly previousUnjitteredViewProjection: Float32Array;
35
+ readonly projection: CameraProjection;
36
+ readonly near: number;
37
+ readonly far: number;
38
+ }
39
+
40
+ export interface TemporalViewInput {
41
+ readonly camera: CameraSnapshot;
42
+ readonly temporalFrameIndex: number;
43
+ readonly surfaceWidth: number;
44
+ readonly surfaceHeight: number;
45
+ readonly lastSubmitted?: SubmittedTemporalView;
46
+ }
47
+
48
+ export function temporalViewId(worldId: number, entityKey: number): string {
49
+ const raw = entityKey >>> 0;
50
+ const index = raw & 0x00ffffff;
51
+ const generation = (raw >>> 24) & 0xff;
52
+ return `${worldId}:${index}:${generation}`;
53
+ }
54
+
55
+ function halton(index: number, base: number): number {
56
+ let result = 0;
57
+ let fraction = 1 / base;
58
+ let value = index;
59
+ while (value > 0) {
60
+ result += fraction * (value % base);
61
+ value = Math.floor(value / base);
62
+ fraction /= base;
63
+ }
64
+ return result;
65
+ }
66
+
67
+ export function temporalJitterSample(temporalFrameIndex: number): readonly [number, number] {
68
+ const sampleIndex =
69
+ ((Math.trunc(temporalFrameIndex) % TEMPORAL_JITTER_SAMPLE_COUNT) +
70
+ TEMPORAL_JITTER_SAMPLE_COUNT) %
71
+ TEMPORAL_JITTER_SAMPLE_COUNT;
72
+ const haltonIndex = sampleIndex + 1;
73
+ return [halton(haltonIndex, 2) - 0.5, halton(haltonIndex, 3) - 0.5];
74
+ }
75
+
76
+ function temporalJitterUv(
77
+ temporalFrameIndex: number,
78
+ surfaceWidth: number,
79
+ surfaceHeight: number,
80
+ ): readonly [number, number] {
81
+ const sample = temporalJitterSample(temporalFrameIndex);
82
+ return [sample[0] / Math.max(1, surfaceWidth), sample[1] / Math.max(1, surfaceHeight)];
83
+ }
84
+
85
+ function cameraProjection(camera: CameraSnapshot): Float32Array {
86
+ const projection = mat4.create();
87
+ if (camera.projection === 'orthographic') {
88
+ mat4.orthographic(
89
+ projection,
90
+ camera.orthoLeft,
91
+ camera.orthoRight,
92
+ camera.orthoBottom,
93
+ camera.orthoTop,
94
+ camera.near,
95
+ camera.far,
96
+ );
97
+ } else {
98
+ mat4.perspective(projection, camera.fov, camera.aspect, camera.near, camera.far);
99
+ }
100
+ return projection;
101
+ }
102
+
103
+ function resetReason(
104
+ current: CameraSnapshot,
105
+ viewId: string,
106
+ previous: SubmittedTemporalView | undefined,
107
+ ): TemporalViewResetReason | undefined {
108
+ if (previous === undefined) return 'first-frame';
109
+ if (previous.viewId !== viewId) return 'camera-switch';
110
+ if (previous.historyVersion !== (current.historyVersion ?? 0)) {
111
+ return 'history-version-changed';
112
+ }
113
+ if (previous.projection !== current.projection) return 'projection-kind-changed';
114
+ if (!Object.is(previous.near, current.near) || !Object.is(previous.far, current.far)) {
115
+ return 'projection-range-changed';
116
+ }
117
+ return undefined;
118
+ }
119
+
120
+ export function projectTemporalView(input: TemporalViewInput): TemporalView {
121
+ const { camera } = input;
122
+ const viewId = temporalViewId(camera.worldId ?? 0, camera.entityKey ?? 0);
123
+ const currentJitterUv = temporalJitterUv(
124
+ input.temporalFrameIndex,
125
+ input.surfaceWidth,
126
+ input.surfaceHeight,
127
+ );
128
+ const view = mat4.invert(mat4.create(), camera.world);
129
+ const projection = cameraProjection(camera);
130
+ const currentUnjitteredViewProjection = mat4.multiply(mat4.create(), projection, view);
131
+ const clipJitter = mat4.identity(mat4.create());
132
+ clipJitter[12] = currentJitterUv[0] * 2;
133
+ clipJitter[13] = currentJitterUv[1] * -2;
134
+ const jitteredProjection = mat4.multiply(mat4.create(), clipJitter, projection);
135
+ const currentJitteredViewProjection = mat4.multiply(mat4.create(), jitteredProjection, view);
136
+ const reason = resetReason(camera, viewId, input.lastSubmitted);
137
+ const historyValid = reason === undefined;
138
+ return {
139
+ viewId,
140
+ historyVersion: camera.historyVersion ?? 0,
141
+ temporalFrameIndex: input.temporalFrameIndex,
142
+ historyValid,
143
+ resetReason: reason,
144
+ currentJitterUv,
145
+ previousJitterUv: historyValid
146
+ ? (input.lastSubmitted?.jitterUv ?? currentJitterUv)
147
+ : currentJitterUv,
148
+ currentJitteredViewProjection,
149
+ currentUnjitteredViewProjection,
150
+ previousUnjitteredViewProjection: historyValid
151
+ ? (input.lastSubmitted?.unjitteredViewProjection ?? currentUnjitteredViewProjection)
152
+ : currentUnjitteredViewProjection,
153
+ projection: camera.projection,
154
+ near: camera.near,
155
+ far: camera.far,
156
+ };
157
+ }
158
+
159
+ export function snapshotSubmittedTemporalView(view: TemporalView): SubmittedTemporalView {
160
+ return {
161
+ viewId: view.viewId,
162
+ historyVersion: view.historyVersion,
163
+ projection: view.projection,
164
+ near: view.near,
165
+ far: view.far,
166
+ jitterUv: [view.currentJitterUv[0], view.currentJitterUv[1]],
167
+ unjitteredViewProjection: new Float32Array(view.currentUnjitteredViewProjection),
168
+ };
169
+ }
@@ -0,0 +1,17 @@
1
+ import {
2
+ type RendererFrameTransaction,
3
+ stageRendererFrame,
4
+ } from '../assembly/renderer-frame-transaction';
5
+ import type { TemporalHistory } from './history';
6
+ import type { TemporalView } from './view';
7
+
8
+ export interface TemporalFrameCandidate {
9
+ readonly view: TemporalView;
10
+ readonly history: TemporalHistory;
11
+ }
12
+
13
+ export function stageTemporalFrame(
14
+ candidate: TemporalFrameCandidate,
15
+ ): RendererFrameTransaction<TemporalFrameCandidate> {
16
+ return stageRendererFrame(candidate, () => candidate.history.abort());
17
+ }
@@ -0,0 +1,161 @@
1
+ import type { Antialias } from '../components/camera';
2
+
3
+ type Jitter = readonly [number, number];
4
+
5
+ export const HALTON_23_8 = Object.freeze([
6
+ Object.freeze([0, -1 / 6]),
7
+ Object.freeze([-1 / 4, 1 / 6]),
8
+ Object.freeze([1 / 4, -5 / 18]),
9
+ Object.freeze([-3 / 8, -1 / 18]),
10
+ Object.freeze([1 / 8, 5 / 18]),
11
+ Object.freeze([-1 / 8, -7 / 54]),
12
+ Object.freeze([3 / 8, 11 / 54]),
13
+ Object.freeze([-7 / 16, 7 / 18]),
14
+ ] as const);
15
+
16
+ export type TemporalResetReason =
17
+ | 'first-frame'
18
+ | 'resize'
19
+ | 'camera-cut'
20
+ | 'history-version'
21
+ | 'view-switch'
22
+ | 'environment-change'
23
+ | 'fog-change'
24
+ | 'device-recover'
25
+ | 'submit-failure';
26
+
27
+ export interface TemporalViewInput {
28
+ readonly antialias: Antialias;
29
+ readonly width: number;
30
+ readonly height: number;
31
+ readonly frameIndex?: number;
32
+ readonly historyVersion?: number;
33
+ readonly viewIdentity?: string;
34
+ readonly environmentSignature?: string;
35
+ readonly fogSignature?: string;
36
+ readonly deviceGeneration?: number;
37
+ readonly cameraCut?: boolean;
38
+ readonly historyValid?: boolean;
39
+ readonly currentUnjitteredViewProjection?: ArrayLike<number> | undefined;
40
+ readonly previousUnjitteredViewProjection?: ArrayLike<number> | undefined;
41
+ readonly resetReason?: TemporalResetReason | undefined;
42
+ }
43
+
44
+ interface TemporalViewSnapshot {
45
+ readonly antialias: Antialias;
46
+ readonly width: number;
47
+ readonly height: number;
48
+ readonly frameIndex: number;
49
+ readonly historyVersion: number;
50
+ readonly viewIdentity: string;
51
+ readonly environmentSignature: string;
52
+ readonly fogSignature: string;
53
+ readonly deviceGeneration: number;
54
+ readonly cameraCut: boolean;
55
+ readonly historyValid: boolean;
56
+ readonly currentUnjitteredViewProjection: ArrayLike<number> | undefined;
57
+ readonly previousUnjitteredViewProjection: ArrayLike<number> | undefined;
58
+ readonly resetReason: TemporalResetReason | undefined;
59
+ }
60
+
61
+ export interface TemporalView {
62
+ readonly input: Readonly<TemporalViewSnapshot>;
63
+ readonly historyVersion: number;
64
+ readonly mode: 'off' | 'taa';
65
+ readonly jitter: readonly [number, number] | undefined;
66
+ readonly jitterCancellationUv: readonly [number, number] | undefined;
67
+ readonly currentJitterUv: readonly [number, number] | undefined;
68
+ readonly historyValid: boolean;
69
+ readonly temporalFrameIndex: number;
70
+ /** Unjittered matrices are supplied by the renderer projection owner. */
71
+ readonly currentUnjitteredViewProjection: ArrayLike<number> | undefined;
72
+ readonly previousUnjitteredViewProjection: ArrayLike<number> | undefined;
73
+ readonly currentProjection: 'jittered' | 'unjittered';
74
+ readonly previousProjection: 'unjittered';
75
+ readonly historyRequired: boolean;
76
+ readonly resetReason: TemporalResetReason | undefined;
77
+ }
78
+
79
+ function validDimension(value: number, field: string): number {
80
+ if (!Number.isSafeInteger(value) || value <= 0) {
81
+ throw new RangeError(`${field} must be a positive safe integer.`);
82
+ }
83
+ return value;
84
+ }
85
+
86
+ export function createTemporalView(input: TemporalViewInput): TemporalView {
87
+ const width = validDimension(input.width, 'width');
88
+ const height = validDimension(input.height, 'height');
89
+ const historyVersion = input.historyVersion ?? 0;
90
+ const frameIndex = input.frameIndex ?? 0;
91
+ const deviceGeneration = input.deviceGeneration ?? 0;
92
+ if (!Number.isSafeInteger(historyVersion) || historyVersion < 0) {
93
+ throw new RangeError('historyVersion must be a non-negative safe integer.');
94
+ }
95
+ if (!Number.isSafeInteger(frameIndex) || frameIndex < 0) {
96
+ throw new RangeError('frameIndex must be a non-negative safe integer.');
97
+ }
98
+ if (!Number.isSafeInteger(deviceGeneration) || deviceGeneration < 0) {
99
+ throw new RangeError('deviceGeneration must be a non-negative safe integer.');
100
+ }
101
+ const normalized: TemporalViewSnapshot = Object.freeze({
102
+ ...input,
103
+ width,
104
+ height,
105
+ frameIndex,
106
+ historyVersion,
107
+ viewIdentity: input.viewIdentity ?? 'camera:default',
108
+ environmentSignature: input.environmentSignature ?? '',
109
+ fogSignature: input.fogSignature ?? '',
110
+ deviceGeneration,
111
+ cameraCut: input.cameraCut ?? false,
112
+ historyValid: input.historyValid ?? false,
113
+ currentUnjitteredViewProjection: input.currentUnjitteredViewProjection,
114
+ previousUnjitteredViewProjection: input.previousUnjitteredViewProjection,
115
+ resetReason: input.resetReason,
116
+ });
117
+ const taa = input.antialias === 'taa';
118
+ const jitter: Jitter | undefined = taa
119
+ ? (HALTON_23_8[frameIndex % HALTON_23_8.length] as Jitter)
120
+ : undefined;
121
+ return Object.freeze({
122
+ input: normalized,
123
+ historyVersion,
124
+ mode: taa ? 'taa' : 'off',
125
+ jitter,
126
+ jitterCancellationUv:
127
+ jitter === undefined
128
+ ? undefined
129
+ : (Object.freeze([jitter[0] / width, jitter[1] / height]) as Jitter),
130
+ currentJitterUv:
131
+ jitter === undefined
132
+ ? undefined
133
+ : (Object.freeze([jitter[0] / width, jitter[1] / height]) as Jitter),
134
+ historyValid: normalized.historyValid,
135
+ temporalFrameIndex: frameIndex,
136
+ currentUnjitteredViewProjection: input.currentUnjitteredViewProjection,
137
+ previousUnjitteredViewProjection: input.previousUnjitteredViewProjection,
138
+ currentProjection: taa ? 'jittered' : 'unjittered',
139
+ previousProjection: 'unjittered',
140
+ historyRequired: taa,
141
+ resetReason: input.resetReason,
142
+ });
143
+ }
144
+
145
+ export function resolveTemporalReset(
146
+ previous: TemporalView | undefined,
147
+ next: TemporalView,
148
+ ): TemporalResetReason | undefined {
149
+ if (next.mode !== 'taa') return undefined;
150
+ if (previous === undefined || previous.mode !== 'taa') return 'first-frame';
151
+ const before = previous.input;
152
+ const after = next.input;
153
+ if (before.width !== after.width || before.height !== after.height) return 'resize';
154
+ if (after.cameraCut) return 'camera-cut';
155
+ if (before.historyVersion !== after.historyVersion) return 'history-version';
156
+ if (before.viewIdentity !== after.viewIdentity) return 'view-switch';
157
+ if (before.environmentSignature !== after.environmentSignature) return 'environment-change';
158
+ if (before.fogSignature !== after.fogSignature) return 'fog-change';
159
+ if (before.deviceGeneration !== after.deviceGeneration) return 'device-recover';
160
+ return undefined;
161
+ }
@@ -0,0 +1,83 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import {
3
+ evaluateTransmissionCapability,
4
+ TransmissionCandidateAdmission,
5
+ type TransmissionCapabilityFacts,
6
+ } from '../backdrop';
7
+
8
+ function facts(overrides: Partial<TransmissionCapabilityFacts> = {}): TransmissionCapabilityFacts {
9
+ return {
10
+ format: 'rgba16float',
11
+ renderAttachment: true,
12
+ copySrc: true,
13
+ textureBinding: true,
14
+ mipView: true,
15
+ filteringSampler: true,
16
+ bindGroupLayout: true,
17
+ msaaResolve: true,
18
+ resourceCreation: true,
19
+ ...overrides,
20
+ };
21
+ }
22
+
23
+ describe('TransmissionBackdrop joint capability verdict', () => {
24
+ it('requires every real resource and usage fact', () => {
25
+ const fields = [
26
+ 'format',
27
+ 'renderAttachment',
28
+ 'copySrc',
29
+ 'textureBinding',
30
+ 'mipView',
31
+ 'filteringSampler',
32
+ 'bindGroupLayout',
33
+ 'msaaResolve',
34
+ 'resourceCreation',
35
+ ] as const;
36
+
37
+ for (const field of fields) {
38
+ const input = field === 'format' ? { format: 'bgra8unorm' } : { [field]: false };
39
+ const verdict = evaluateTransmissionCapability(facts(input));
40
+ expect(verdict.ok, field).toBe(false);
41
+ expect(verdict.missing).toContain(field);
42
+ }
43
+ });
44
+
45
+ it('does not branch on backend name or a synthetic transmission boolean', () => {
46
+ const baseline = evaluateTransmissionCapability(facts());
47
+ const sameFacts = evaluateTransmissionCapability({
48
+ ...facts(),
49
+ backendKind: 'wgpu-native',
50
+ });
51
+
52
+ expect(baseline).toEqual(sameFacts);
53
+ expect(baseline.ok).toBe(true);
54
+ });
55
+
56
+ it('returns a successful receipt only for the complete joint capability', () => {
57
+ expect(evaluateTransmissionCapability(facts())).toEqual({ ok: true, missing: [] });
58
+ });
59
+
60
+ it('does not publish demand or generation when candidate admission fails', () => {
61
+ const admission = new TransmissionCandidateAdmission();
62
+ expect(admission.admit({ activeCount: 1, needsRoughMips: true }, facts())).toMatchObject({
63
+ ok: true,
64
+ generation: 1,
65
+ });
66
+
67
+ const rejected = admission.admit(
68
+ { activeCount: 2, needsRoughMips: true },
69
+ facts({ copySrc: false }),
70
+ );
71
+ expect(rejected).toMatchObject({
72
+ ok: false,
73
+ missing: ['copySrc'],
74
+ published: false,
75
+ generation: 1,
76
+ demand: { activeCount: 1, needsRoughMips: true },
77
+ });
78
+ expect(admission.inspect()).toEqual({
79
+ generation: 1,
80
+ demand: { activeCount: 1, needsRoughMips: true },
81
+ });
82
+ });
83
+ });