@forgeax/engine-runtime 0.1.4 → 0.1.7

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 (606) hide show
  1. package/README.md +65 -83
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/__tests__/animation-graph-collect-roundtrip.test.d.ts +2 -0
  4. package/dist/__tests__/animation-graph-collect-roundtrip.test.d.ts.map +1 -0
  5. package/dist/__tests__/animation-graph-serialize.unit.test.d.ts +2 -0
  6. package/dist/__tests__/animation-graph-serialize.unit.test.d.ts.map +1 -0
  7. package/dist/__tests__/asset-brand-and-name-retirement.test.d.ts +2 -0
  8. package/dist/__tests__/asset-brand-and-name-retirement.test.d.ts.map +1 -0
  9. package/dist/__tests__/asset-error-exhaustive.test-d.d.ts +11 -0
  10. package/dist/__tests__/asset-error-exhaustive.test-d.d.ts.map +1 -0
  11. package/dist/__tests__/asset-registry-guid-reverse.test.d.ts +2 -0
  12. package/dist/__tests__/asset-registry-guid-reverse.test.d.ts.map +1 -0
  13. package/dist/__tests__/asset-registry-hdr-equirect.test.d.ts +2 -0
  14. package/dist/__tests__/asset-registry-hdr-equirect.test.d.ts.map +1 -0
  15. package/dist/__tests__/asset-registry-mesh-pack-payload.dawn.test.d.ts +2 -0
  16. package/dist/__tests__/asset-registry-mesh-pack-payload.dawn.test.d.ts.map +1 -0
  17. package/dist/__tests__/asset-registry-mounts.test.d.ts +2 -0
  18. package/dist/__tests__/asset-registry-mounts.test.d.ts.map +1 -0
  19. package/dist/__tests__/asset-registry.browser.test.d.ts +2 -0
  20. package/dist/__tests__/asset-registry.browser.test.d.ts.map +1 -0
  21. package/dist/__tests__/asset-registry.dawn.test.d.ts +2 -0
  22. package/dist/__tests__/asset-registry.dawn.test.d.ts.map +1 -0
  23. package/dist/__tests__/asset-registry.listCatalog.test.d.ts +2 -0
  24. package/dist/__tests__/asset-registry.listCatalog.test.d.ts.map +1 -0
  25. package/dist/__tests__/asset-registry.mesh-bin.test.d.ts +2 -0
  26. package/dist/__tests__/asset-registry.mesh-bin.test.d.ts.map +1 -0
  27. package/dist/__tests__/asset-registry.pack-cache.test.d.ts +2 -0
  28. package/dist/__tests__/asset-registry.pack-cache.test.d.ts.map +1 -0
  29. package/dist/__tests__/asset-registry.raw-container-failfast.test.d.ts +2 -0
  30. package/dist/__tests__/asset-registry.raw-container-failfast.test.d.ts.map +1 -0
  31. package/dist/__tests__/asset-registry.recursive.spec.d.ts +2 -0
  32. package/dist/__tests__/asset-registry.recursive.spec.d.ts.map +1 -0
  33. package/dist/__tests__/asset-registry.unit.test.d.ts +2 -0
  34. package/dist/__tests__/asset-registry.unit.test.d.ts.map +1 -0
  35. package/dist/__tests__/asset.unit.test.d.ts +2 -0
  36. package/dist/__tests__/asset.unit.test.d.ts.map +1 -0
  37. package/dist/__tests__/audio-load-by-guid.unit.test.d.ts +2 -0
  38. package/dist/__tests__/audio-load-by-guid.unit.test.d.ts.map +1 -0
  39. package/dist/__tests__/backend-selection.integration.test.d.ts +2 -0
  40. package/dist/__tests__/backend-selection.integration.test.d.ts.map +1 -0
  41. package/dist/__tests__/basis-catalog-dispatch.integration.test.d.ts +2 -0
  42. package/dist/__tests__/basis-catalog-dispatch.integration.test.d.ts.map +1 -0
  43. package/dist/__tests__/builtin-asset-registry.unit.test.d.ts +2 -0
  44. package/dist/__tests__/builtin-asset-registry.unit.test.d.ts.map +1 -0
  45. package/dist/__tests__/collect-scene-asset.test.d.ts +1 -2
  46. package/dist/__tests__/collect-scene-asset.test.d.ts.map +1 -1
  47. package/dist/__tests__/collect-scene-mount-collapse.test.d.ts +2 -0
  48. package/dist/__tests__/collect-scene-mount-collapse.test.d.ts.map +1 -0
  49. package/dist/__tests__/collect-transient-roundtrip.test.d.ts +1 -1
  50. package/dist/__tests__/collect-transient-roundtrip.test.d.ts.map +1 -1
  51. package/dist/__tests__/collect-transient-skip.test.d.ts +1 -2
  52. package/dist/__tests__/collect-transient-skip.test.d.ts.map +1 -1
  53. package/dist/__tests__/compressed-texture-physical-extent.integration.test.d.ts +2 -0
  54. package/dist/__tests__/compressed-texture-physical-extent.integration.test.d.ts.map +1 -0
  55. package/dist/__tests__/dawn/mesh-update-dawn.test.d.ts +2 -0
  56. package/dist/__tests__/dawn/mesh-update-dawn.test.d.ts.map +1 -0
  57. package/dist/__tests__/dawn/upload-texture.dawn.test.d.ts +2 -0
  58. package/dist/__tests__/dawn/upload-texture.dawn.test.d.ts.map +1 -0
  59. package/dist/__tests__/draw-published.d.ts +2 -2
  60. package/dist/__tests__/draw-published.d.ts.map +1 -1
  61. package/dist/__tests__/dynamic-texture-store.unit.test.d.ts +2 -0
  62. package/dist/__tests__/dynamic-texture-store.unit.test.d.ts.map +1 -0
  63. package/dist/__tests__/errors.unit.test.d.ts +2 -0
  64. package/dist/__tests__/errors.unit.test.d.ts.map +1 -0
  65. package/dist/__tests__/extract-skin-mismatch.unit.test.d.ts +2 -0
  66. package/dist/__tests__/extract-skin-mismatch.unit.test.d.ts.map +1 -0
  67. package/dist/__tests__/fetch-binary-decompress.test.d.ts +2 -0
  68. package/dist/__tests__/fetch-binary-decompress.test.d.ts.map +1 -0
  69. package/dist/__tests__/four-path-compression.integration.test.d.ts +2 -0
  70. package/dist/__tests__/four-path-compression.integration.test.d.ts.map +1 -0
  71. package/dist/__tests__/fullscreen-feature-host.dawn.test.d.ts +2 -0
  72. package/dist/__tests__/fullscreen-feature-host.dawn.test.d.ts.map +1 -0
  73. package/dist/__tests__/guid-for-asset.unit.test.d.ts +2 -0
  74. package/dist/__tests__/guid-for-asset.unit.test.d.ts.map +1 -0
  75. package/dist/__tests__/handle-migration.test.d.ts +2 -0
  76. package/dist/__tests__/handle-migration.test.d.ts.map +1 -0
  77. package/dist/__tests__/helpers/register-runtime-components.d.ts.map +1 -1
  78. package/dist/__tests__/host-custom-kind-contract.test-d.d.ts +2 -0
  79. package/dist/__tests__/host-custom-kind-contract.test-d.d.ts.map +1 -0
  80. package/dist/__tests__/host-custom-kind-contract.test.d.ts +2 -0
  81. package/dist/__tests__/host-custom-kind-contract.test.d.ts.map +1 -0
  82. package/dist/__tests__/inspect-name.test.d.ts +2 -0
  83. package/dist/__tests__/inspect-name.test.d.ts.map +1 -0
  84. package/dist/__tests__/instantiate-mount-deferred-wiring.test.d.ts +2 -0
  85. package/dist/__tests__/instantiate-mount-deferred-wiring.test.d.ts.map +1 -0
  86. package/dist/__tests__/loadbyguid-payload.unit.test.d.ts +2 -0
  87. package/dist/__tests__/loadbyguid-payload.unit.test.d.ts.map +1 -0
  88. package/dist/__tests__/loadbyguid-texture-intern.unit.test.d.ts +2 -0
  89. package/dist/__tests__/loadbyguid-texture-intern.unit.test.d.ts.map +1 -0
  90. package/dist/__tests__/loader-extract-graceful.test.d.ts +2 -0
  91. package/dist/__tests__/loader-extract-graceful.test.d.ts.map +1 -0
  92. package/dist/__tests__/loader-name-survival.test.d.ts +2 -0
  93. package/dist/__tests__/loader-name-survival.test.d.ts.map +1 -0
  94. package/dist/__tests__/mesh-bin-contract.test.d.ts +2 -0
  95. package/dist/__tests__/mesh-bin-contract.test.d.ts.map +1 -0
  96. package/dist/__tests__/mesh-bin-skin-roundtrip.unit.test.d.ts +2 -0
  97. package/dist/__tests__/mesh-bin-skin-roundtrip.unit.test.d.ts.map +1 -0
  98. package/dist/__tests__/mesh-bin.test.d.ts +2 -0
  99. package/dist/__tests__/mesh-bin.test.d.ts.map +1 -0
  100. package/dist/__tests__/mesh-loader-skin-contract.unit.test.d.ts +2 -0
  101. package/dist/__tests__/mesh-loader-skin-contract.unit.test.d.ts.map +1 -0
  102. package/dist/__tests__/new-kind-refs-contract.test.d.ts +2 -0
  103. package/dist/__tests__/new-kind-refs-contract.test.d.ts.map +1 -0
  104. package/dist/__tests__/package-promotion.test.d.ts +2 -0
  105. package/dist/__tests__/package-promotion.test.d.ts.map +1 -0
  106. package/dist/__tests__/package-rename.test.d.ts +2 -0
  107. package/dist/__tests__/package-rename.test.d.ts.map +1 -0
  108. package/dist/__tests__/recover-error-exhaustive.test-d.d.ts +1 -1
  109. package/dist/__tests__/recover-error-exhaustive.test-d.d.ts.map +1 -1
  110. package/dist/__tests__/render-error-exhaustive.test-d.d.ts +1 -1
  111. package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +1 -1
  112. package/dist/__tests__/render-feature-prepared-graphics.fixture.d.ts +10 -0
  113. package/dist/__tests__/render-feature-prepared-graphics.fixture.d.ts.map +1 -0
  114. package/dist/__tests__/render-system-extract.unit.test.d.ts +2 -0
  115. package/dist/__tests__/render-system-extract.unit.test.d.ts.map +1 -0
  116. package/dist/__tests__/renderer-test-utils.d.ts +10 -0
  117. package/dist/__tests__/renderer-test-utils.d.ts.map +1 -0
  118. package/dist/__tests__/renderer.test-d.d.ts +2 -0
  119. package/dist/__tests__/renderer.test-d.d.ts.map +1 -0
  120. package/dist/__tests__/resolve-asset-handle-err.test.d.ts +2 -0
  121. package/dist/__tests__/resolve-asset-handle-err.test.d.ts.map +1 -0
  122. package/dist/__tests__/resolve-asset-handle.unit.test.d.ts +2 -0
  123. package/dist/__tests__/resolve-asset-handle.unit.test.d.ts.map +1 -0
  124. package/dist/__tests__/resolveName-fallback.test.d.ts +2 -0
  125. package/dist/__tests__/resolveName-fallback.test.d.ts.map +1 -0
  126. package/dist/__tests__/resolveName-null-package.test.d.ts +2 -0
  127. package/dist/__tests__/resolveName-null-package.test.d.ts.map +1 -0
  128. package/dist/__tests__/resolveName-unified-entry.test.d.ts +2 -0
  129. package/dist/__tests__/resolveName-unified-entry.test.d.ts.map +1 -0
  130. package/dist/__tests__/resolveName.test.d.ts +2 -0
  131. package/dist/__tests__/resolveName.test.d.ts.map +1 -0
  132. package/dist/__tests__/roots-to-scene-asset.test.d.ts +1 -1
  133. package/dist/__tests__/roots-to-scene-asset.test.d.ts.map +1 -1
  134. package/dist/__tests__/roundtrip-primitive.test.d.ts +2 -0
  135. package/dist/__tests__/roundtrip-primitive.test.d.ts.map +1 -0
  136. package/dist/__tests__/scene-bare-guid-refs-instantiate.test.d.ts +2 -0
  137. package/dist/__tests__/scene-bare-guid-refs-instantiate.test.d.ts.map +1 -0
  138. package/dist/__tests__/scene-instance-authoring.integration.test.d.ts +2 -0
  139. package/dist/__tests__/scene-instance-authoring.integration.test.d.ts.map +1 -0
  140. package/dist/__tests__/scene-mount-fixed-point.test.d.ts +2 -0
  141. package/dist/__tests__/scene-mount-fixed-point.test.d.ts.map +1 -0
  142. package/dist/__tests__/scene-mount-roundtrip.test.d.ts +2 -0
  143. package/dist/__tests__/scene-mount-roundtrip.test.d.ts.map +1 -0
  144. package/dist/__tests__/scene-mount-wrapper-roundtrip.test.d.ts +2 -0
  145. package/dist/__tests__/scene-mount-wrapper-roundtrip.test.d.ts.map +1 -0
  146. package/dist/__tests__/scene-sugar-instantiate.test.d.ts +2 -0
  147. package/dist/__tests__/scene-sugar-instantiate.test.d.ts.map +1 -0
  148. package/dist/__tests__/serialize-mounts-roundtrip.test.d.ts +2 -0
  149. package/dist/__tests__/serialize-mounts-roundtrip.test.d.ts.map +1 -0
  150. package/dist/__tests__/serialize-scene-asset.test.d.ts +1 -1
  151. package/dist/__tests__/serialize-scene-asset.test.d.ts.map +1 -1
  152. package/dist/__tests__/template-game-default-api-contract.test.d.ts +2 -0
  153. package/dist/__tests__/template-game-default-api-contract.test.d.ts.map +1 -0
  154. package/dist/__tests__/tileset-asset-validate.test.d.ts +2 -0
  155. package/dist/__tests__/tileset-asset-validate.test.d.ts.map +1 -0
  156. package/dist/__tests__/transcode-fallback.unit.test.d.ts +2 -0
  157. package/dist/__tests__/transcode-fallback.unit.test.d.ts.map +1 -0
  158. package/dist/__tests__/transient-runtime-behavior.test.d.ts +2 -0
  159. package/dist/__tests__/transient-runtime-behavior.test.d.ts.map +1 -0
  160. package/dist/__tests__/video-loader-consumption.test.d.ts +2 -0
  161. package/dist/__tests__/video-loader-consumption.test.d.ts.map +1 -0
  162. package/dist/__tests__/video-loader-smoke.dawn.test.d.ts +2 -0
  163. package/dist/__tests__/video-loader-smoke.dawn.test.d.ts.map +1 -0
  164. package/dist/backend-selection.d.ts +13 -0
  165. package/dist/backend-selection.d.ts.map +1 -0
  166. package/dist/collect-scene-asset.d.ts +7 -4
  167. package/dist/collect-scene-asset.d.ts.map +1 -1
  168. package/dist/createRenderer.d.ts +14 -2
  169. package/dist/createRenderer.d.ts.map +1 -1
  170. package/dist/errors/environment.d.ts +1 -1
  171. package/dist/errors/environment.d.ts.map +1 -1
  172. package/dist/index.d.ts +20 -82
  173. package/dist/index.d.ts.map +1 -1
  174. package/dist/index.mjs +107 -108
  175. package/dist/index.mjs.map +1 -1
  176. package/dist/renderer-host.d.ts +9 -0
  177. package/dist/renderer-host.d.ts.map +1 -0
  178. package/dist/renderer-host.mjs +62 -0
  179. package/dist/renderer-host.mjs.map +1 -0
  180. package/dist/scene-instances/index.d.ts +2 -0
  181. package/dist/scene-instances/index.d.ts.map +1 -0
  182. package/dist/scene-utils/mount-override-fold.d.ts +1 -2
  183. package/dist/scene-utils/mount-override-fold.d.ts.map +1 -1
  184. package/dist/systems/sprite-animation-tick.d.ts +1 -1
  185. package/dist/systems/sprite-animation-tick.d.ts.map +1 -1
  186. package/dist/systems/transparent-sort.d.ts +1 -2
  187. package/dist/systems/transparent-sort.d.ts.map +1 -1
  188. package/dist/tilemap-register-validate.d.ts.map +1 -1
  189. package/package.json +34 -33
  190. package/src/__tests__/active-camera.unit.test.ts +19 -9
  191. package/src/__tests__/animation-graph-collect-roundtrip.test.ts +213 -0
  192. package/src/__tests__/animation-graph-serialize.unit.test.ts +171 -0
  193. package/src/__tests__/append-injection.test.ts +1 -1
  194. package/src/__tests__/asset-brand-and-name-retirement.test.ts +102 -0
  195. package/src/__tests__/asset-error-exhaustive.test-d.ts +62 -0
  196. package/src/__tests__/asset-registry-guid-reverse.test.ts +608 -0
  197. package/src/__tests__/asset-registry-hdr-equirect.test.ts +78 -0
  198. package/src/__tests__/asset-registry-mesh-pack-payload.dawn.test.ts +232 -0
  199. package/src/__tests__/asset-registry-mounts.test.ts +806 -0
  200. package/src/__tests__/asset-registry.browser.test.ts +81 -0
  201. package/src/__tests__/asset-registry.dawn.test.ts +94 -0
  202. package/src/__tests__/asset-registry.listCatalog.test.ts +170 -0
  203. package/src/__tests__/asset-registry.mesh-bin.test.ts +316 -0
  204. package/src/__tests__/asset-registry.pack-cache.test.ts +969 -0
  205. package/src/__tests__/asset-registry.raw-container-failfast.test.ts +225 -0
  206. package/src/__tests__/asset-registry.recursive.spec.ts +1397 -0
  207. package/src/__tests__/asset-registry.unit.test.ts +1030 -0
  208. package/src/__tests__/asset.unit.test.ts +7107 -0
  209. package/src/__tests__/audio-load-by-guid.unit.test.ts +126 -0
  210. package/src/__tests__/backend-selection.integration.test.ts +11 -0
  211. package/src/__tests__/basis-catalog-dispatch.integration.test.ts +320 -0
  212. package/src/__tests__/bind-group-cache-keying.test.ts +4 -4
  213. package/src/__tests__/block-upload-math.unit.test.ts +2 -2
  214. package/src/__tests__/builtin-asset-registry.unit.test.ts +112 -0
  215. package/src/__tests__/builtin-shader-register-e2e.test.ts +1 -1
  216. package/src/__tests__/cache-false-eviction.test.ts +2 -1
  217. package/src/__tests__/cache-isolation-matrix.test.ts +2 -1
  218. package/src/__tests__/camera-clear-snapshot-equivalence.unit.test.ts +5 -6
  219. package/src/__tests__/clamp-to-last.e2e.browser.test.ts +29 -19
  220. package/src/__tests__/collect-scene-asset.test.ts +49 -52
  221. package/src/__tests__/collect-scene-mount-collapse.test.ts +391 -0
  222. package/src/__tests__/collect-subtree.unit.test.ts +1 -2
  223. package/src/__tests__/collect-transient-children-absent.test.ts +24 -10
  224. package/src/__tests__/collect-transient-roundtrip.test.ts +44 -20
  225. package/src/__tests__/collect-transient-skip.test.ts +24 -13
  226. package/src/__tests__/components.test-d.ts +1 -6
  227. package/src/__tests__/components.unit.test.ts +20 -19
  228. package/src/__tests__/composite-skybox-cross-world.browser.test.ts +59 -27
  229. package/src/__tests__/compressed-texture-physical-extent.integration.test.ts +139 -0
  230. package/src/__tests__/create-renderer-assembly.integration.test.ts +42 -29
  231. package/src/__tests__/createRenderer-dispose.test.ts +35 -402
  232. package/src/__tests__/createRenderer.browser-no-webgpu.test.ts +25 -30
  233. package/src/__tests__/createRenderer.unit.test.ts +1 -1
  234. package/src/__tests__/dawn/hello-sprite-nineslice-section.dawn.test.ts +27 -63
  235. package/src/__tests__/dawn/ibl-precompute-readback.dawn.test.ts +56 -47
  236. package/src/__tests__/dawn/instances-per-instance-pbr.dawn.test.ts +49 -29
  237. package/src/__tests__/dawn/instances-shadow.dawn.test.ts +26 -15
  238. package/src/__tests__/dawn/instances-uniform-fallback.dawn.test.ts +13 -14
  239. package/src/__tests__/dawn/material-alpha.dawn.test.ts +23 -31
  240. package/src/__tests__/dawn/material-cooked-fixture.dawn.test.ts +24 -9
  241. package/src/__tests__/dawn/{mesh-update.dawn.test.ts → mesh-update-dawn.test.ts} +42 -134
  242. package/src/__tests__/dawn/mipmap-srgb-linear.dawn.test.ts +14 -7
  243. package/src/__tests__/dawn/per-entity-material-texture-isolation.dawn.test.ts +16 -28
  244. package/src/__tests__/dawn/sprite-nineslice-mesh-bind.dawn.test.ts +23 -39
  245. package/src/__tests__/dawn/upload-texture.dawn.test.ts +198 -0
  246. package/src/__tests__/dawn/user-handle-mesh-render.dawn.test.ts +12 -14
  247. package/src/__tests__/dawn/user-mesh-upload.dawn.test.ts +27 -22
  248. package/src/__tests__/dawn/zero-manifest-mesh-fail.dawn.test.ts +25 -28
  249. package/src/__tests__/dawn/zero-manifest-ready.dawn.test.ts +10 -11
  250. package/src/__tests__/demo-sortscope-migration.unit.test.ts +5 -5
  251. package/src/__tests__/derive-bgl-integration.test.ts +34 -44
  252. package/src/__tests__/derive-render-data-skin.unit.test.ts +1 -1
  253. package/src/__tests__/draw-published.ts +11 -4
  254. package/src/__tests__/dynamic-texture-store.unit.test.ts +190 -0
  255. package/src/__tests__/equirect-bc6h.integration.test.ts +144 -21
  256. package/src/__tests__/errors.unit.test.ts +1227 -0
  257. package/src/__tests__/extract-frames-graceful-degradation.test.ts +3 -7
  258. package/src/__tests__/extract-frames-merge.test.ts +35 -22
  259. package/src/__tests__/extract-record-no-hardcoded-texture-fields.test.ts +5 -16
  260. package/src/__tests__/extract-skin-mismatch.unit.test.ts +322 -0
  261. package/src/__tests__/fetch-binary-decompress.test.ts +356 -0
  262. package/src/__tests__/four-path-compression.integration.test.ts +395 -0
  263. package/src/__tests__/frame-targets-shadow-regression.unit.test.ts +1 -1
  264. package/src/__tests__/fullscreen-feature-host.dawn.test.ts +80 -0
  265. package/src/__tests__/fullscreen-post-bgl-depth.test.ts +4 -2
  266. package/src/__tests__/fullscreen-post-depth-params-arity.test.ts +3 -3
  267. package/src/__tests__/fullscreen-post-process-pass.dawn.test.ts +39 -23
  268. package/src/__tests__/fullscreen-post-process-pass.unit.test.ts +4 -2
  269. package/src/__tests__/fxaa-pixel-diff.dawn.test.ts +28 -17
  270. package/src/__tests__/fxaa-validation-and-resize.dawn.test.ts +29 -18
  271. package/src/__tests__/fxaa-zero-overhead.dawn.test.ts +16 -12
  272. package/src/__tests__/geometry.unit.test.ts +525 -159
  273. package/src/__tests__/glyph-tilemap-worldid.test.ts +1 -1
  274. package/src/__tests__/gpu-resource-cow-survivor.test.ts +6 -4
  275. package/src/__tests__/guid-for-asset.unit.test.ts +102 -0
  276. package/src/__tests__/handle-migration.test.ts +136 -0
  277. package/src/__tests__/helpers/register-runtime-components.ts +4 -2
  278. package/src/__tests__/helpers/register-scene-components.ts +1 -1
  279. package/src/__tests__/host-custom-kind-contract.test-d.ts +47 -0
  280. package/src/__tests__/host-custom-kind-contract.test.ts +578 -0
  281. package/src/__tests__/inspect-name.test.ts +139 -0
  282. package/src/__tests__/instances.test-d.ts +1 -1
  283. package/src/__tests__/instantiate-mount-deferred-wiring.test.ts +112 -0
  284. package/src/__tests__/light-casters-9-light.browser.test.ts +73 -76
  285. package/src/__tests__/light-gpu-byte-neutral.unit.test.ts +7 -10
  286. package/src/__tests__/light-snapshot.test-d.ts +2 -2
  287. package/src/__tests__/lights-vec-negative.unit.test.ts +1 -1
  288. package/src/__tests__/lights.unit.test.ts +31 -511
  289. package/src/__tests__/loadbyguid-payload.unit.test.ts +117 -0
  290. package/src/__tests__/loadbyguid-texture-intern.unit.test.ts +213 -0
  291. package/src/__tests__/loader-extract-graceful.test.ts +146 -0
  292. package/src/__tests__/loader-name-survival.test.ts +213 -0
  293. package/src/__tests__/m3-vec-negative.unit.test.ts +3 -2
  294. package/src/__tests__/material-texture-uv-scale.unit.test.ts +101 -31
  295. package/src/__tests__/materials.unit.test.ts +10 -27
  296. package/src/__tests__/mesh-bin-contract.test.ts +28 -0
  297. package/src/__tests__/mesh-bin-skin-roundtrip.unit.test.ts +149 -0
  298. package/src/__tests__/mesh-bin.test.ts +38 -0
  299. package/src/__tests__/mesh-loader-skin-contract.unit.test.ts +120 -0
  300. package/src/__tests__/mesh-ssbo-grow.unit.test.ts +3 -3
  301. package/src/__tests__/mip-gate.unit.test.ts +1 -1
  302. package/src/__tests__/msaa-sprite-pixel-diff.dawn.test.ts +29 -68
  303. package/src/__tests__/new-kind-refs-contract.test.ts +132 -0
  304. package/src/__tests__/node-shims.d.ts +4 -6
  305. package/src/__tests__/package-promotion.test.ts +88 -0
  306. package/src/__tests__/package-rename.test.ts +103 -0
  307. package/src/__tests__/pass-selector.unit.test.ts +2 -2
  308. package/src/__tests__/pbr-pipeline.unit.test.ts +21 -25
  309. package/src/__tests__/pipeline-builder-msaa.unit.test.ts +6 -9
  310. package/src/__tests__/pipeline-cache-keying.unit.test.ts +6 -9
  311. package/src/__tests__/pipeline-spec.test.ts +16 -177
  312. package/src/__tests__/pipeline.unit.test.ts +154 -1693
  313. package/src/__tests__/point-light-shadow.dawn.test.ts +33 -42
  314. package/src/__tests__/point-light-shadow.unit.test.ts +19 -60
  315. package/src/__tests__/post-process-error-codes.unit.test.ts +4 -1
  316. package/src/__tests__/post-process-params-component.unit.test.ts +1 -1
  317. package/src/__tests__/post-process-params-extract.unit.test.ts +2 -5
  318. package/src/__tests__/postprocess-camera-consistency.test.ts +4 -7
  319. package/src/__tests__/profiler-assembly.integration.test.ts +1 -1
  320. package/src/__tests__/propagate-transforms.dawn.test.ts +12 -11
  321. package/src/__tests__/record-worldid-isolation.test.ts +7 -29
  322. package/src/__tests__/recover-error-exhaustive.test-d.ts +1 -1
  323. package/src/__tests__/render-error-exhaustive.test-d.ts +117 -71
  324. package/src/__tests__/render-feature-assembly.test-d.ts +20 -9
  325. package/src/__tests__/render-feature-prepared-graphics-docs.unit.test.ts +8 -6
  326. package/src/__tests__/render-feature-prepared-graphics.browser.test.ts +65 -559
  327. package/src/__tests__/render-feature-prepared-graphics.dawn.test.ts +57 -544
  328. package/src/__tests__/render-feature-prepared-graphics.fixture.ts +104 -0
  329. package/src/__tests__/render-feature-prepared-graphics.integration.test.ts +40 -248
  330. package/src/__tests__/render-feature-prepared-graphics.regression.integration.test.ts +83 -340
  331. package/src/__tests__/render-feature-recover.integration.test.ts +9 -49
  332. package/src/__tests__/render-feature-runtime-surface.test-d.ts +17 -20
  333. package/src/__tests__/render-schema-consumer.integration.test.ts +20 -13
  334. package/src/__tests__/render-schema-owner-boundary.unit.test.ts +2 -6
  335. package/src/__tests__/render-system-cross-world-overlay-queue.test.ts +5 -5
  336. package/src/__tests__/render-system-extract-dispatch-ordering.test.ts +16 -31
  337. package/src/__tests__/render-system-extract.test.ts +36 -51
  338. package/src/__tests__/render-system-extract.unit.test.ts +360 -0
  339. package/src/__tests__/render-system-fold-bucket.unit.test.ts +3 -5
  340. package/src/__tests__/render-system-fold-fallback.unit.test.ts +6 -3
  341. package/src/__tests__/render-system-fold-material.unit.test.ts +3 -5
  342. package/src/__tests__/render-system-fold-metrics.unit.test.ts +5 -5
  343. package/src/__tests__/render-system-fold-modegate.unit.test.ts +6 -6
  344. package/src/__tests__/render-system-fold.dawn.test.ts +7 -5
  345. package/src/__tests__/render-system-mega.test.ts +292 -190
  346. package/src/__tests__/render-system-owner-split-contract.test.ts +10 -32
  347. package/src/__tests__/render-system-record-multi-material-textureview.test.ts +59 -45
  348. package/src/__tests__/render-system-record-per-submesh-transparency.test.ts +23 -29
  349. package/src/__tests__/render-system-record.test.ts +398 -235
  350. package/src/__tests__/render-system-record.unit.test.ts +25 -26
  351. package/src/__tests__/render-system-skin-bg.unit.test.ts +8 -12
  352. package/src/__tests__/renderer-consumer.test-d.ts +16 -3
  353. package/src/__tests__/renderer-health.unit.test.ts +26 -916
  354. package/src/__tests__/renderer-lifecycle.integration.test.ts +19 -6
  355. package/src/__tests__/renderer-recover.unit.test.ts +49 -1069
  356. package/src/__tests__/renderer-result.test-d.ts +19 -9
  357. package/src/__tests__/renderer-surface.unit.test.ts +3 -5
  358. package/src/__tests__/renderer-test-utils.ts +56 -0
  359. package/src/__tests__/renderer.test-d.ts +61 -0
  360. package/src/__tests__/resolve-asset-handle-err.test.ts +111 -0
  361. package/src/__tests__/resolve-asset-handle.unit.test.ts +64 -0
  362. package/src/__tests__/resolve-depth-only-view.test.ts +1 -1
  363. package/src/__tests__/resolveName-fallback.test.ts +64 -0
  364. package/src/__tests__/resolveName-null-package.test.ts +38 -0
  365. package/src/__tests__/resolveName-unified-entry.test.ts +65 -0
  366. package/src/__tests__/resolveName.test.ts +64 -0
  367. package/src/__tests__/rhi-null-command-flow.unit.test.ts +56 -260
  368. package/src/__tests__/rhi-null-renderer-lifecycle.unit.test.ts +41 -169
  369. package/src/__tests__/roots-to-scene-asset.test.ts +199 -93
  370. package/src/__tests__/roundtrip-primitive.test.ts +351 -0
  371. package/src/__tests__/scene-bare-guid-refs-instantiate.test.ts +123 -0
  372. package/src/__tests__/scene-equirect-roundtrip.test.ts +103 -16
  373. package/src/__tests__/scene-instance-authoring.integration.test.ts +8 -0
  374. package/src/__tests__/scene-instance-bridge.integration.test.ts +1 -1
  375. package/src/__tests__/scene-instance-component.test.ts +1 -1
  376. package/src/__tests__/scene-mount-fixed-point.test.ts +257 -0
  377. package/src/__tests__/scene-mount-roundtrip.test.ts +987 -0
  378. package/src/__tests__/scene-mount-wrapper-roundtrip.test.ts +202 -0
  379. package/src/__tests__/scene-sugar-instantiate.test.ts +324 -0
  380. package/src/__tests__/serialize-mounts-roundtrip.test.ts +533 -0
  381. package/src/__tests__/serialize-scene-asset.test.ts +219 -22
  382. package/src/__tests__/shadow-caster-empty-schema.test.ts +3 -3
  383. package/src/__tests__/shadow-csm-cascade-loadop.test.ts +37 -17
  384. package/src/__tests__/shadow-csm-component.test.ts +3 -5
  385. package/src/__tests__/shadow-csm-extract.test.ts +2 -100
  386. package/src/__tests__/shadow-csm-orthoz.test.ts +2 -16
  387. package/src/__tests__/shadow-csm-runtime-vary.dawn.test.ts +19 -14
  388. package/src/__tests__/shadow-csm-tile-consistency.test.ts +32 -26
  389. package/src/__tests__/shadow-csm-ubo.dawn.test.ts +8 -49
  390. package/src/__tests__/shadow-csm-ubo.test.ts +3 -25
  391. package/src/__tests__/shadow-csm-viewport.browser.test.ts +1 -1
  392. package/src/__tests__/shadow-fields-observable.dawn.test.ts +67 -56
  393. package/src/__tests__/shadow-m1.dawn.test.ts +8 -9
  394. package/src/__tests__/shadow-mesh-ssbo-order.test.ts +11 -27
  395. package/src/__tests__/skin-errors.unit.test.ts +1 -1
  396. package/src/__tests__/skin-extract-getarrayview-count.unit.test.ts +7 -5
  397. package/src/__tests__/skylight-lazy-projection.test.ts +36 -15
  398. package/src/__tests__/sparse-tag-scene-roundtrip.test.ts +5 -5
  399. package/src/__tests__/sprite-cullmode-flip.dawn.test.ts +47 -64
  400. package/src/__tests__/sprite-lit-bgl-byte-identical.test.ts +15 -14
  401. package/src/__tests__/sprite-lit-extract-branch.test.ts +1 -1
  402. package/src/__tests__/sprite-lit-pipeline-cache-key.test.ts +1 -1
  403. package/src/__tests__/ssao-bgl.test.ts +16 -9
  404. package/src/__tests__/ssao-buffers.test.ts +2 -2
  405. package/src/__tests__/ssao-data.test.ts +2 -2
  406. package/src/__tests__/ssao-errors.test.ts +1 -1
  407. package/src/__tests__/ssao-passes.test.ts +68 -392
  408. package/src/__tests__/ssao-pipelines.test.ts +1 -1
  409. package/src/__tests__/ssao-uniform-layout.test.ts +8 -6
  410. package/src/__tests__/stencil-outline-pixel.dawn.test.ts +25 -17
  411. package/src/__tests__/swap-chain-format.unit.test.ts +5 -7
  412. package/src/__tests__/systems.unit.test.ts +536 -1326
  413. package/src/__tests__/template-game-default-api-contract.test.ts +362 -0
  414. package/src/__tests__/text.unit.test.ts +56 -33
  415. package/src/__tests__/tilemap-childed-despawn.test.ts +8 -14
  416. package/src/__tests__/tilemap-chunk-extract.overhang-bounds.test.ts +8 -12
  417. package/src/__tests__/tilemap-chunk-extract.propagate-order.test.ts +2 -1
  418. package/src/__tests__/tilemap-chunk-extract.test.ts +13 -17
  419. package/src/__tests__/tilemap-dirty-rebuild.test.ts +7 -11
  420. package/src/__tests__/tilemap-material-cache.test.ts +8 -13
  421. package/src/__tests__/tilemap-multi-atlas.test.ts +12 -32
  422. package/src/__tests__/tilemap-owner-boundary.unit.test.ts +5 -2
  423. package/src/__tests__/tilemap-region-pack.test.ts +8 -12
  424. package/src/__tests__/tilemap-spawn-flip-pivot.test.ts +8 -12
  425. package/src/__tests__/tilemap-uv-inset.test.ts +11 -14
  426. package/src/__tests__/tilemap-validate.test.ts +1 -1
  427. package/src/__tests__/tileset-asset-validate.test.ts +638 -0
  428. package/src/__tests__/transcode-fallback.unit.test.ts +207 -0
  429. package/src/__tests__/transform-hierarchy-pixel-diff.dawn.test.ts +36 -28
  430. package/src/__tests__/transient-fields-collect.test.ts +28 -21
  431. package/src/__tests__/transient-runtime-behavior.test.ts +227 -0
  432. package/src/__tests__/transparent-sort-tilemap-sprite-interleave.test.ts +4 -4
  433. package/src/__tests__/variant-selection.unit.test.ts +1 -1
  434. package/src/__tests__/video-extract-bindgroup.dawn.test.ts +89 -136
  435. package/src/__tests__/video-loader-consumption.test.ts +86 -0
  436. package/src/__tests__/video-loader-smoke.dawn.test.ts +60 -0
  437. package/src/__tests__/view-ubo-layout.browser.test.ts +0 -22
  438. package/src/__tests__/world-entity-key.test.ts +1 -1
  439. package/src/__tests__/world-scene-despawn.test.ts +1 -1
  440. package/src/__tests__/world-scene-instantiate.test.ts +2 -36
  441. package/src/__tests__/world-scene-nested.test.ts +1 -1
  442. package/src/__tests__/world-scene-override.test.ts +1 -1
  443. package/src/backend-selection.ts +69 -0
  444. package/src/collect-scene-asset.ts +35 -23
  445. package/src/components/__tests__/camera.test-d.ts +1 -1
  446. package/src/components/__tests__/camera.test.ts +1 -1
  447. package/src/components/__tests__/sprite-animation.test-d.ts +2 -2
  448. package/src/components/__tests__/tile-layer.test-d.ts +1 -1
  449. package/src/components/__tests__/tile-layer.unit.test.ts +2 -2
  450. package/src/createRenderer.ts +24 -36
  451. package/src/errors/environment.ts +1 -1
  452. package/src/index.ts +51 -113
  453. package/src/renderer-host.ts +33 -0
  454. package/src/scene-instances/__tests__/post-spawn-resolve-joints.unit.test.ts +1 -1
  455. package/src/scene-instances/index.ts +4 -0
  456. package/src/scene-utils/mount-override-fold.ts +3 -7
  457. package/src/systems/__tests__/transparent-sort.bench.ts +3 -3
  458. package/src/systems/sprite-animation-tick.ts +1 -1
  459. package/src/systems/transparent-sort.ts +38 -38
  460. package/src/tilemap-register-validate.ts +4 -4
  461. package/dist/__tests__/bind-group-cache-binding.test.d.ts +0 -2
  462. package/dist/__tests__/bind-group-cache-binding.test.d.ts.map +0 -1
  463. package/dist/__tests__/bind-group-cache-frame.test.d.ts +0 -2
  464. package/dist/__tests__/bind-group-cache-frame.test.d.ts.map +0 -1
  465. package/dist/__tests__/dawn/mesh-update.dawn.test.d.ts +0 -2
  466. package/dist/__tests__/dawn/mesh-update.dawn.test.d.ts.map +0 -1
  467. package/dist/__tests__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.d.ts +0 -2
  468. package/dist/__tests__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.d.ts.map +0 -1
  469. package/dist/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.d.ts +0 -2
  470. package/dist/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.d.ts.map +0 -1
  471. package/dist/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.d.ts +0 -2
  472. package/dist/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.d.ts.map +0 -1
  473. package/dist/__tests__/dispatch-fullscreen-pass-params.unit.test.d.ts +0 -2
  474. package/dist/__tests__/dispatch-fullscreen-pass-params.unit.test.d.ts.map +0 -1
  475. package/dist/__tests__/fog-producer-manifest.d.ts +0 -131
  476. package/dist/__tests__/fog-producer-manifest.d.ts.map +0 -1
  477. package/dist/__tests__/fog-producer-pixel-probe.d.ts +0 -42
  478. package/dist/__tests__/fog-producer-pixel-probe.d.ts.map +0 -1
  479. package/dist/__tests__/fog-producer-pixel.browser.test.d.ts +0 -2
  480. package/dist/__tests__/fog-producer-pixel.browser.test.d.ts.map +0 -1
  481. package/dist/__tests__/fog-producer-pixel.dawn.test.d.ts +0 -2
  482. package/dist/__tests__/fog-producer-pixel.dawn.test.d.ts.map +0 -1
  483. package/dist/__tests__/fog-producer-real-fixture.d.ts +0 -5
  484. package/dist/__tests__/fog-producer-real-fixture.d.ts.map +0 -1
  485. package/dist/__tests__/fog-producer-vfx-effect.d.ts +0 -3
  486. package/dist/__tests__/fog-producer-vfx-effect.d.ts.map +0 -1
  487. package/dist/__tests__/fog-scene-asset.integration.test.d.ts +0 -2
  488. package/dist/__tests__/fog-scene-asset.integration.test.d.ts.map +0 -1
  489. package/dist/__tests__/gpu-resource-store-cubemap-status.test.d.ts +0 -2
  490. package/dist/__tests__/gpu-resource-store-cubemap-status.test.d.ts.map +0 -1
  491. package/dist/__tests__/gpu-resource.test.d.ts +0 -2
  492. package/dist/__tests__/gpu-resource.test.d.ts.map +0 -1
  493. package/dist/__tests__/hdrp-bgl-slots.browser.test.d.ts +0 -2
  494. package/dist/__tests__/hdrp-bgl-slots.browser.test.d.ts.map +0 -1
  495. package/dist/__tests__/hdrp-buffers.unit.test.d.ts +0 -2
  496. package/dist/__tests__/hdrp-buffers.unit.test.d.ts.map +0 -1
  497. package/dist/__tests__/hdrp-execute-filter.unit.test.d.ts +0 -2
  498. package/dist/__tests__/hdrp-execute-filter.unit.test.d.ts.map +0 -1
  499. package/dist/__tests__/hdrp-gbuffer-attachments.browser.test.d.ts +0 -2
  500. package/dist/__tests__/hdrp-gbuffer-attachments.browser.test.d.ts.map +0 -1
  501. package/dist/__tests__/hdrp-pipeline-asset-type.test-d.d.ts +0 -2
  502. package/dist/__tests__/hdrp-pipeline-asset-type.test-d.d.ts.map +0 -1
  503. package/dist/__tests__/hdrp-ssao-boundary.test.d.ts +0 -2
  504. package/dist/__tests__/hdrp-ssao-boundary.test.d.ts.map +0 -1
  505. package/dist/__tests__/hdrp-ssao-falsification.test.d.ts +0 -2
  506. package/dist/__tests__/hdrp-ssao-falsification.test.d.ts.map +0 -1
  507. package/dist/__tests__/helpers/primitive-world.d.ts +0 -8
  508. package/dist/__tests__/helpers/primitive-world.d.ts.map +0 -1
  509. package/dist/__tests__/helpers/render-asset-port.d.ts +0 -15
  510. package/dist/__tests__/helpers/render-asset-port.d.ts.map +0 -1
  511. package/dist/__tests__/helpers/scene-asset-port.d.ts +0 -9
  512. package/dist/__tests__/helpers/scene-asset-port.d.ts.map +0 -1
  513. package/dist/__tests__/material-derived-coordinates.integration.test.d.ts +0 -2
  514. package/dist/__tests__/material-derived-coordinates.integration.test.d.ts.map +0 -1
  515. package/dist/__tests__/pipeline-layout-selection.test.d.ts +0 -2
  516. package/dist/__tests__/pipeline-layout-selection.test.d.ts.map +0 -1
  517. package/dist/__tests__/post-process-reads-narrowing.test-d.d.ts +0 -2
  518. package/dist/__tests__/post-process-reads-narrowing.test-d.d.ts.map +0 -1
  519. package/dist/__tests__/post-process-register-roundtrip.dawn.test.d.ts +0 -2
  520. package/dist/__tests__/post-process-register-roundtrip.dawn.test.d.ts.map +0 -1
  521. package/dist/__tests__/render-feature-zero-feature.browser.test.d.ts +0 -2
  522. package/dist/__tests__/render-feature-zero-feature.browser.test.d.ts.map +0 -1
  523. package/dist/__tests__/render-pipeline-trivial.dawn.test.d.ts +0 -2
  524. package/dist/__tests__/render-pipeline-trivial.dawn.test.d.ts.map +0 -1
  525. package/dist/__tests__/shadow-csm-caster-membership.test.d.ts +0 -2
  526. package/dist/__tests__/shadow-csm-caster-membership.test.d.ts.map +0 -1
  527. package/dist/__tests__/shadow-csm-pssm.test.d.ts +0 -2
  528. package/dist/__tests__/shadow-csm-pssm.test.d.ts.map +0 -1
  529. package/dist/__tests__/shadow-csm-temporal.browser.test.d.ts +0 -2
  530. package/dist/__tests__/shadow-csm-temporal.browser.test.d.ts.map +0 -1
  531. package/dist/__tests__/shadow-csm-viewport.test.d.ts +0 -2
  532. package/dist/__tests__/shadow-csm-viewport.test.d.ts.map +0 -1
  533. package/dist/__tests__/shadow-m2.dawn.test.d.ts +0 -2
  534. package/dist/__tests__/shadow-m2.dawn.test.d.ts.map +0 -1
  535. package/dist/__tests__/shadow-m3-calibrate-run.dawn.test.d.ts +0 -2
  536. package/dist/__tests__/shadow-m3-calibrate-run.dawn.test.d.ts.map +0 -1
  537. package/dist/__tests__/shadow-m3-calibrate.d.ts +0 -83
  538. package/dist/__tests__/shadow-m3-calibrate.d.ts.map +0 -1
  539. package/dist/__tests__/shadow-m3.dawn.test.d.ts +0 -2
  540. package/dist/__tests__/shadow-m3.dawn.test.d.ts.map +0 -1
  541. package/dist/__tests__/shadow-probe-control-flow.dawn.test.d.ts +0 -2
  542. package/dist/__tests__/shadow-probe-control-flow.dawn.test.d.ts.map +0 -1
  543. package/dist/__tests__/shadow-quality-metrics.dawn.test.d.ts +0 -2
  544. package/dist/__tests__/shadow-quality-metrics.dawn.test.d.ts.map +0 -1
  545. package/dist/__tests__/temporal-off-path.unit.test.d.ts +0 -2
  546. package/dist/__tests__/temporal-off-path.unit.test.d.ts.map +0 -1
  547. package/dist/__tests__/video-cache-regression.unit.test.d.ts +0 -2
  548. package/dist/__tests__/video-cache-regression.unit.test.d.ts.map +0 -1
  549. package/dist/asset-kind.d.ts +0 -4
  550. package/dist/asset-kind.d.ts.map +0 -1
  551. package/dist/errors/sprite-animation.d.ts +0 -3
  552. package/dist/errors/sprite-animation.d.ts.map +0 -1
  553. package/dist/scene-asset-port.d.ts +0 -17
  554. package/dist/scene-asset-port.d.ts.map +0 -1
  555. package/dist/scene-collect-errors.d.ts +0 -22
  556. package/dist/scene-collect-errors.d.ts.map +0 -1
  557. package/dist/shadow-m3-calibrate.d.ts +0 -40
  558. package/dist/shadow-m3-calibrate.d.ts.map +0 -1
  559. package/src/__tests__/bind-group-cache-binding.test.ts +0 -2513
  560. package/src/__tests__/bind-group-cache-frame.test.ts +0 -1511
  561. package/src/__tests__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.ts +0 -204
  562. package/src/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.ts +0 -297
  563. package/src/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.ts +0 -271
  564. package/src/__tests__/dispatch-fullscreen-pass-params.unit.test.ts +0 -321
  565. package/src/__tests__/fog-producer-manifest.ts +0 -162
  566. package/src/__tests__/fog-producer-pixel-probe.ts +0 -263
  567. package/src/__tests__/fog-producer-pixel.browser.test.ts +0 -26
  568. package/src/__tests__/fog-producer-pixel.dawn.test.ts +0 -55
  569. package/src/__tests__/fog-producer-real-fixture.ts +0 -805
  570. package/src/__tests__/fog-producer-vfx-effect.ts +0 -272
  571. package/src/__tests__/fog-scene-asset.integration.test.ts +0 -123
  572. package/src/__tests__/gpu-resource-store-cubemap-status.test.ts +0 -207
  573. package/src/__tests__/gpu-resource.test.ts +0 -1206
  574. package/src/__tests__/hdrp-bgl-slots.browser.test.ts +0 -50
  575. package/src/__tests__/hdrp-buffers.unit.test.ts +0 -70
  576. package/src/__tests__/hdrp-execute-filter.unit.test.ts +0 -200
  577. package/src/__tests__/hdrp-gbuffer-attachments.browser.test.ts +0 -64
  578. package/src/__tests__/hdrp-pipeline-asset-type.test-d.ts +0 -139
  579. package/src/__tests__/hdrp-ssao-boundary.test.ts +0 -237
  580. package/src/__tests__/hdrp-ssao-falsification.test.ts +0 -289
  581. package/src/__tests__/helpers/primitive-world.ts +0 -91
  582. package/src/__tests__/helpers/render-asset-port.ts +0 -65
  583. package/src/__tests__/helpers/scene-asset-port.ts +0 -23
  584. package/src/__tests__/material-derived-coordinates.integration.test.ts +0 -100
  585. package/src/__tests__/pipeline-layout-selection.test.ts +0 -298
  586. package/src/__tests__/post-process-reads-narrowing.test-d.ts +0 -52
  587. package/src/__tests__/post-process-register-roundtrip.dawn.test.ts +0 -230
  588. package/src/__tests__/render-feature-zero-feature.browser.test.ts +0 -152
  589. package/src/__tests__/render-pipeline-trivial.dawn.test.ts +0 -525
  590. package/src/__tests__/shadow-csm-caster-membership.test.ts +0 -232
  591. package/src/__tests__/shadow-csm-pssm.test.ts +0 -142
  592. package/src/__tests__/shadow-csm-temporal.browser.test.ts +0 -145
  593. package/src/__tests__/shadow-csm-viewport.test.ts +0 -74
  594. package/src/__tests__/shadow-m2.dawn.test.ts +0 -394
  595. package/src/__tests__/shadow-m3-calibrate-run.dawn.test.ts +0 -248
  596. package/src/__tests__/shadow-m3-calibrate.ts +0 -203
  597. package/src/__tests__/shadow-m3.dawn.test.ts +0 -288
  598. package/src/__tests__/shadow-probe-control-flow.dawn.test.ts +0 -264
  599. package/src/__tests__/shadow-quality-metrics.dawn.test.ts +0 -324
  600. package/src/__tests__/temporal-off-path.unit.test.ts +0 -69
  601. package/src/__tests__/video-cache-regression.unit.test.ts +0 -186
  602. package/src/asset-kind.ts +0 -7
  603. package/src/errors/sprite-animation.ts +0 -5
  604. package/src/scene-asset-port.ts +0 -32
  605. package/src/scene-collect-errors.ts +0 -30
  606. package/src/shadow-m3-calibrate.ts +0 -171
@@ -1,204 +0,0 @@
1
- // dispatch-fullscreen-pass-composite-swapchain.dawn.test.ts -
2
- // feat-20260621-learn-render-5-3-production-shadow-demos M4' (post-URP hook).
3
- //
4
- // Spy/mock unit-style tests for dispatchFullscreenPass's compositeOverSwapchain
5
- // branch -- the generalisation of the built-in FXAA copy idiom that lets a
6
- // built-in pipeline layer a registered effect over its FINAL swap-chain image
7
- // WITHOUT replacing the pipeline (and dropping its shadow / tonemap passes).
8
- //
9
- // The branch must:
10
- // (a) copy the current swap-chain (ctx.currentTexture) into the `color`
11
- // scratch texture (resolved via `${color}::tex`) BEFORE sampling, so the
12
- // effect reads the already-composited image.
13
- // (b) feed the scratch's TextureView (resolved via `${color}`) into the bind
14
- // group input -- NOT ctx.view.
15
- // (c) write through the swap-chain NON-srgb storage view
16
- // (device.createTextureView(ctx.currentTexture)) -- R-COLORSPACE: the
17
- // scratch holds an already-sRGB-encoded copy, so the srgb view would
18
- // double-encode (mirrors recordFxaaPass).
19
- // (d) throw PostProcessError{fullscreen-input-not-found} when the scratch
20
- // texture is unresolved (charter P3 fail-fast), before any encoder call.
21
-
22
- import type { RenderPipelineContext } from '@forgeax/engine-render/internal';
23
- import { addFullscreenPass } from '@forgeax/engine-render/internal';
24
- import { RenderGraph } from '@forgeax/engine-render-graph';
25
- import { describe, expect, it } from 'vitest';
26
-
27
- interface BindGroupEntry {
28
- readonly binding: number;
29
- readonly resource: { readonly kind: string; readonly value: unknown };
30
- }
31
-
32
- interface CopyCall {
33
- readonly src: unknown;
34
- readonly dst: unknown;
35
- }
36
-
37
- interface Spy {
38
- readonly bindGroupCreates: { readonly entries: readonly BindGroupEntry[] }[];
39
- readonly beginRenderPassCalls: { readonly view: unknown }[];
40
- readonly copyCalls: CopyCall[];
41
- readonly createdViewsFrom: unknown[];
42
- drawCalls: number;
43
- }
44
-
45
- type ExecuteWithResolve = (c: unknown, r: { resolve: (n: string) => unknown }) => void;
46
-
47
- function findPassExecute(
48
- graph: RenderGraph<RenderPipelineContext>,
49
- passName: string,
50
- ): ExecuteWithResolve | undefined {
51
- const passes = (
52
- graph as unknown as {
53
- passes: {
54
- list(): readonly { name: string; descriptor: { execute?: ExecuteWithResolve } }[];
55
- };
56
- }
57
- ).passes.list();
58
- return passes.find((p) => p.name === passName)?.descriptor.execute;
59
- }
60
-
61
- function makeSpyCtx(opts: {
62
- lookup: (id: string) => { source: string } | undefined;
63
- currentTexture: unknown;
64
- storageView: unknown;
65
- }): { ctx: RenderPipelineContext; spy: Spy } {
66
- const spy: Spy = {
67
- bindGroupCreates: [],
68
- beginRenderPassCalls: [],
69
- copyCalls: [],
70
- createdViewsFrom: [],
71
- drawCalls: 0,
72
- };
73
-
74
- const passEncoder = {
75
- setPipeline(_p: unknown): void {},
76
- setBindGroup(_slot: number, _bg: unknown): void {},
77
- draw(): void {
78
- spy.drawCalls += 1;
79
- },
80
- end(): void {},
81
- };
82
-
83
- const ctx = {
84
- runtime: {
85
- lookupPostProcess: opts.lookup,
86
- getPostProcessPipeline: (_id: string, _bgl: unknown, _format: string) => ({
87
- __pipeline: true,
88
- }),
89
- device: {
90
- createBindGroupLayout: (_d: unknown) => ({ ok: true, value: { __bgl: true } }),
91
- createSampler: (_d: unknown) => ({ ok: true, value: { __sampler: true } }),
92
- createBindGroup: (desc: { readonly entries: readonly BindGroupEntry[] }) => {
93
- spy.bindGroupCreates.push({ entries: desc.entries });
94
- return { ok: true, value: { __bg: true } };
95
- },
96
- createTextureView: (tex: unknown, _d: unknown) => {
97
- spy.createdViewsFrom.push(tex);
98
- return { ok: true, value: opts.storageView };
99
- },
100
- },
101
- errorRegistry: { fire: (_e: unknown) => undefined },
102
- },
103
- pipelineState: { format: 'bgra8unorm', colorAttachmentFormat: 'bgra8unorm-srgb' },
104
- currentTexture: opts.currentTexture,
105
- targetW: 64,
106
- targetH: 64,
107
- view: { __swapchainSrgbView: true },
108
- encoder: {
109
- copyTextureToTexture: (src: { texture: unknown }, dst: { texture: unknown }) => {
110
- spy.copyCalls.push({ src: src.texture, dst: dst.texture });
111
- },
112
- beginRenderPass: (desc: { colorAttachments: readonly { view: unknown }[] }) => {
113
- spy.beginRenderPassCalls.push({ view: desc.colorAttachments[0]?.view });
114
- return passEncoder;
115
- },
116
- },
117
- } as unknown as RenderPipelineContext;
118
- return { ctx, spy };
119
- }
120
-
121
- describe('feat-20260621 M4′: dispatchFullscreenPass compositeOverSwapchain', () => {
122
- it('(a)(b)(c) copies swap-chain -> scratch, samples scratch view, writes swap-chain storage view', () => {
123
- const swapTex = { __swapTexture: true };
124
- const scratchTex = { __scratchTex: true };
125
- const scratchView = { __scratchView: true };
126
- const storageView = { __nonSrgbStorageView: true };
127
- const { ctx, spy } = makeSpyCtx({
128
- lookup: () => ({ source: 'fn vs_main(){} fn fs_main(){}' }),
129
- currentTexture: swapTex,
130
- storageView,
131
- });
132
- const graph = new RenderGraph<RenderPipelineContext>();
133
- graph.addColorTarget('scratch', { format: 'bgra8unorm', size: { w: 64, h: 64 } });
134
- addFullscreenPass(graph, 'post-effect-0', {
135
- shader: 'test::composite',
136
- color: 'scratch',
137
- compositeOverSwapchain: true,
138
- });
139
-
140
- const execute = findPassExecute(graph, 'post-effect-0');
141
- expect(execute).toBeDefined();
142
- if (!execute) return;
143
-
144
- const resolveCtx = {
145
- resolve: (n: string) =>
146
- n === 'scratch::tex' ? scratchTex : n === 'scratch' ? scratchView : undefined,
147
- };
148
- execute(ctx, resolveCtx);
149
-
150
- // (a) copy swap-chain -> scratch fired exactly once, src=swapTex dst=scratchTex.
151
- expect(spy.copyCalls.length).toBe(1);
152
- expect(spy.copyCalls[0]?.src).toBe(swapTex);
153
- expect(spy.copyCalls[0]?.dst).toBe(scratchTex);
154
-
155
- // (b) bind-group input texture = the scratch view (the copied final image),
156
- // NOT ctx.view.
157
- const tvEntry = spy.bindGroupCreates[0]?.entries.find((e) => e.resource.kind === 'textureView');
158
- expect(tvEntry?.resource.value).toBe(scratchView);
159
-
160
- // (c) write target = the swap-chain non-srgb storage view, created from
161
- // ctx.currentTexture (R-COLORSPACE), not the srgb ctx.view.
162
- expect(spy.createdViewsFrom).toContain(swapTex);
163
- expect(spy.beginRenderPassCalls[0]?.view).toBe(storageView);
164
-
165
- // fullscreen draw fired.
166
- expect(spy.drawCalls).toBe(1);
167
- });
168
-
169
- it('(d) unresolved scratch texture -> throws fullscreen-input-not-found before any encoder call', () => {
170
- const { ctx, spy } = makeSpyCtx({
171
- lookup: () => ({ source: 'fn vs_main(){} fn fs_main(){}' }),
172
- currentTexture: { __swapTexture: true },
173
- storageView: { __storage: true },
174
- });
175
- const graph = new RenderGraph<RenderPipelineContext>();
176
- graph.addColorTarget('scratch', { format: 'bgra8unorm', size: { w: 64, h: 64 } });
177
- addFullscreenPass(graph, 'post-effect-0', {
178
- shader: 'test::composite-throw',
179
- color: 'scratch',
180
- compositeOverSwapchain: true,
181
- });
182
-
183
- const execute = findPassExecute(graph, 'post-effect-0');
184
- if (!execute) return;
185
-
186
- // resolveCtx returns undefined for scratch::tex (not yet compiled) -> throw.
187
- const resolveCtx = { resolve: (_n: string) => undefined };
188
- let caught: unknown = null;
189
- try {
190
- execute(ctx, resolveCtx);
191
- } catch (e) {
192
- caught = e;
193
- }
194
- expect(caught).not.toBeNull();
195
- const err = caught as { code?: string; detail?: { readsKey?: string; passName?: string } };
196
- expect(err.code).toBe('fullscreen-input-not-found');
197
- expect(err.detail?.readsKey).toBe('scratch');
198
- expect(err.detail?.passName).toBe('post-effect-0');
199
-
200
- // Fail-fast: no copy, no render pass before the throw.
201
- expect(spy.copyCalls.length).toBe(0);
202
- expect(spy.beginRenderPassCalls.length).toBe(0);
203
- });
204
- });
@@ -1,297 +0,0 @@
1
- // dispatch-fullscreen-pass-custom-reads.dawn.test.ts -
2
- // feat-20260609-learn-render-4-5-framebuffers-demo-offscreen-rt-an M1 / T-4.
3
- //
4
- // Spy/mock unit-style integration tests for dispatchFullscreenPass's generic
5
- // (non-FXAA) branch. The test bypasses real GPU pipeline build by spying on
6
- // the per-frame encoder; the dispatcher's structural call chain is validated:
7
- //
8
- // (a) reads[0] resolves through the per-pass resolveCtx -> graph-owned
9
- // TextureView; the dispatcher passes that resolved view into
10
- // createFullscreenBindGroup (verified via spy on the bind-group
11
- // textureView entry).
12
- // (b) On the success path the dispatcher opens a render pass on
13
- // ctx.encoder, calls pass.setBindGroup(1, bg), then handle.draw(pass)
14
- // which internally does pass.setPipeline + pass.draw(3, 1, 0, 0).
15
- // (c) When reads[0] is non-empty but resolveCtx returns undefined for the
16
- // key (mis-spelled / un-declared color target), the dispatcher throws
17
- // PostProcessError({code:'fullscreen-input-not-found',
18
- // detail:{readsKey, passName}}) before any encoder call -- charter P3
19
- // fail-fast.
20
- // (d) reads === [] preserves the legacy ctx.view swap-chain path; the
21
- // dispatcher samples ctx.view (no resolveCtx invocation for any key).
22
- //
23
- // File lives under .dawn.test.ts naming (per plan-decisions L-3) so the
24
- // dawn vitest project picks it up; a Node-only environment would also work
25
- // (no real GPU calls fire), but the dawn project is the canonical home for
26
- // per-frame-execute integration tests.
27
-
28
- import type { RenderPipelineContext } from '@forgeax/engine-render/internal';
29
- import { addFullscreenPass } from '@forgeax/engine-render/internal';
30
- import { RenderGraph } from '@forgeax/engine-render-graph';
31
- import { describe, expect, it } from 'vitest';
32
-
33
- interface BindGroupEntry {
34
- readonly binding: number;
35
- readonly resource: { readonly kind: string; readonly value: unknown };
36
- }
37
-
38
- interface BindGroupCall {
39
- readonly slot: number;
40
- readonly bindGroup: unknown;
41
- }
42
-
43
- interface DrawCall {
44
- readonly vertexCount: number;
45
- readonly instanceCount: number;
46
- readonly firstVertex: number;
47
- readonly firstInstance: number;
48
- }
49
-
50
- interface DispatchSpy {
51
- readonly bindGroupCreates: { readonly entries: readonly BindGroupEntry[] }[];
52
- readonly setBindGroupCalls: BindGroupCall[];
53
- readonly setPipelineCalls: unknown[];
54
- readonly drawCalls: DrawCall[];
55
- readonly beginRenderPassCalls: { readonly view: unknown }[];
56
- }
57
-
58
- type ExecuteWithResolve = (c: unknown, r: { resolve: (n: string) => unknown }) => void;
59
-
60
- function findPassExecute(
61
- graph: RenderGraph<RenderPipelineContext>,
62
- passName: string,
63
- ): ExecuteWithResolve | undefined {
64
- // Reach into the package-private pass registry to recover descriptor.execute
65
- // (mirrors post-process-register-roundtrip.dawn.test.ts pattern; the public
66
- // RenderGraph surfaces only listPasses with name/reads/writes -- the executor
67
- // body lives on the PassEntry).
68
- const passes = (
69
- graph as unknown as {
70
- passes: {
71
- list(): readonly {
72
- name: string;
73
- descriptor: { execute?: ExecuteWithResolve };
74
- }[];
75
- };
76
- }
77
- ).passes.list();
78
- return passes.find((p) => p.name === passName)?.descriptor.execute;
79
- }
80
-
81
- function makeSpyCtx(opts: {
82
- lookup: (id: string) => { source: string } | undefined;
83
- view: unknown;
84
- }): { ctx: RenderPipelineContext; spy: DispatchSpy } {
85
- const spy: DispatchSpy = {
86
- bindGroupCreates: [],
87
- setBindGroupCalls: [],
88
- setPipelineCalls: [],
89
- drawCalls: [],
90
- beginRenderPassCalls: [],
91
- };
92
-
93
- const passEncoder = {
94
- setPipeline(p: unknown): void {
95
- spy.setPipelineCalls.push(p);
96
- },
97
- setBindGroup(slot: number, bg: unknown): void {
98
- spy.setBindGroupCalls.push({ slot, bindGroup: bg });
99
- },
100
- draw(
101
- vertexCount: number,
102
- instanceCount: number,
103
- firstVertex: number,
104
- firstInstance: number,
105
- ): void {
106
- spy.drawCalls.push({ vertexCount, instanceCount, firstVertex, firstInstance });
107
- },
108
- end(): void {},
109
- };
110
-
111
- const ctx = {
112
- runtime: {
113
- lookupPostProcess: opts.lookup,
114
- // T-10-a: dispatcher now reads runtime.getPostProcessPipeline; spy
115
- // returns a stub pipeline so the success-path tests reach
116
- // beginRenderPass / setBindGroup / setPipeline / draw. The stub object
117
- // is opaque to the dispatcher (it forwards to setPipeline as-is).
118
- getPostProcessPipeline: (_id: string, _bgl: unknown, _format: string) => ({
119
- __pipeline: true,
120
- }),
121
- device: {
122
- createBindGroupLayout: (_d: unknown) => ({ ok: true, value: { __bgl: true } }),
123
- createSampler: (_d: unknown) => ({ ok: true, value: { __sampler: true } }),
124
- createBindGroup: (desc: { readonly entries: readonly BindGroupEntry[] }) => {
125
- spy.bindGroupCreates.push({ entries: desc.entries });
126
- return { ok: true, value: { __bg: true } };
127
- },
128
- },
129
- errorRegistry: { fire: (_e: unknown) => undefined },
130
- },
131
- view: opts.view,
132
- encoder: {
133
- beginRenderPass: (desc: { colorAttachments: readonly { view: unknown }[] }) => {
134
- spy.beginRenderPassCalls.push({ view: desc.colorAttachments[0]?.view });
135
- return passEncoder;
136
- },
137
- },
138
- } as unknown as RenderPipelineContext;
139
- return { ctx, spy };
140
- }
141
-
142
- describe('feat-20260609 M1 T-4: dispatchFullscreenPass custom reads spy', () => {
143
- it('(a) reads[0] resolves via resolveCtx -> bindGroup samples the resolved input view', () => {
144
- const inputView = { __resolvedInputView: 'offscreenColor' };
145
- const writeView = { __writeView: 'rt' };
146
- const swapView = { __swap: true };
147
- const { ctx, spy } = makeSpyCtx({
148
- lookup: () => ({ source: 'fn vs_main(){} fn fs_main(){}' }),
149
- view: swapView,
150
- });
151
- const graph = new RenderGraph<RenderPipelineContext>();
152
- graph.addColorTarget('rt', { format: 'rgba8unorm', size: { w: 64, h: 64 } });
153
- addFullscreenPass(graph, 'pp', {
154
- shader: 'test::reads-resolved',
155
- color: 'rt',
156
- reads: ['offscreenColor'],
157
- });
158
-
159
- const execute = findPassExecute(graph, 'pp');
160
- expect(execute).toBeDefined();
161
- if (!execute) return;
162
-
163
- const resolveCtx = {
164
- resolve: (n: string) =>
165
- n === 'offscreenColor' ? inputView : n === 'rt' ? writeView : undefined,
166
- };
167
- execute(ctx, resolveCtx);
168
-
169
- // (a) bindgroup binding 0 carries the resolved offscreenColor view, not the
170
- // legacy ctx.view swap-chain view -- this confirms reads[0] -> graph-owned
171
- // input is the real path.
172
- expect(spy.bindGroupCreates.length).toBe(1);
173
- const textureViewEntry = spy.bindGroupCreates[0]?.entries.find(
174
- (e) => e.resource.kind === 'textureView',
175
- );
176
- expect(textureViewEntry).toBeDefined();
177
- expect(textureViewEntry?.resource.value).toBe(inputView);
178
- });
179
-
180
- it('(b) success path -> setBindGroup(1, bg) + draw(3, 1, 0, 0) really fire on the encoder', () => {
181
- const inputView = { __resolvedInputView: 'offscreenColor' };
182
- const writeView = { __writeView: 'rt' };
183
- const { ctx, spy } = makeSpyCtx({
184
- lookup: () => ({ source: 'fn vs_main(){} fn fs_main(){}' }),
185
- view: { __swap: true },
186
- });
187
- const graph = new RenderGraph<RenderPipelineContext>();
188
- graph.addColorTarget('rt', { format: 'rgba8unorm', size: { w: 64, h: 64 } });
189
- addFullscreenPass(graph, 'pp', {
190
- shader: 'test::draw-fires',
191
- color: 'rt',
192
- reads: ['offscreenColor'],
193
- });
194
-
195
- const execute = findPassExecute(graph, 'pp');
196
- if (!execute) return;
197
-
198
- const resolveCtx = {
199
- resolve: (n: string) =>
200
- n === 'offscreenColor' ? inputView : n === 'rt' ? writeView : undefined,
201
- };
202
- execute(ctx, resolveCtx);
203
-
204
- // beginRenderPass fired on the resolved write view (graph-owned 'rt').
205
- expect(spy.beginRenderPassCalls.length).toBe(1);
206
- expect(spy.beginRenderPassCalls[0]?.view).toBe(writeView);
207
-
208
- // setBindGroup(1, bg) fired with slot=1 (plan-strategy convention; slot 0
209
- // reserved for future view bind groups).
210
- expect(spy.setBindGroupCalls.length).toBe(1);
211
- expect(spy.setBindGroupCalls[0]?.slot).toBe(1);
212
- expect(spy.setBindGroupCalls[0]?.bindGroup).toEqual({ __bg: true });
213
-
214
- // handle.draw -> pass.draw(3, 1, 0, 0) for the fullscreen-triangle vertex
215
- // shader covering the entire framebuffer.
216
- expect(spy.drawCalls.length).toBe(1);
217
- expect(spy.drawCalls[0]).toEqual({
218
- vertexCount: 3,
219
- instanceCount: 1,
220
- firstVertex: 0,
221
- firstInstance: 0,
222
- });
223
- });
224
-
225
- it('(c) reads[0] unresolved -> throws PostProcessError fullscreen-input-not-found before any encoder call', () => {
226
- const { ctx, spy } = makeSpyCtx({
227
- lookup: () => ({ source: 'fn vs_main(){} fn fs_main(){}' }),
228
- view: { __swap: true },
229
- });
230
- const graph = new RenderGraph<RenderPipelineContext>();
231
- graph.addColorTarget('rt', { format: 'rgba8unorm', size: { w: 64, h: 64 } });
232
- // reads[0] = 'never-declared': the resolveCtx below returns undefined for it
233
- // -> dispatcher must throw.
234
- addFullscreenPass(graph, 'pp', {
235
- shader: 'test::reads-throw',
236
- color: 'rt',
237
- reads: ['never-declared'],
238
- });
239
-
240
- const execute = findPassExecute(graph, 'pp');
241
- if (!execute) return;
242
-
243
- const resolveCtx = { resolve: (_n: string) => undefined };
244
- let caught: unknown = null;
245
- try {
246
- execute(ctx, resolveCtx);
247
- } catch (e) {
248
- caught = e;
249
- }
250
- expect(caught).not.toBeNull();
251
- const err = caught as { code?: string; detail?: { readsKey?: string; passName?: string } };
252
- expect(err.code).toBe('fullscreen-input-not-found');
253
- expect(err.detail?.readsKey).toBe('never-declared');
254
- expect(err.detail?.passName).toBe('pp');
255
-
256
- // Charter P3 fail-fast: throw fires BEFORE any encoder call. The encoder
257
- // remains untouched (no spurious render passes / bind groups created).
258
- expect(spy.beginRenderPassCalls.length).toBe(0);
259
- expect(spy.setBindGroupCalls.length).toBe(0);
260
- expect(spy.drawCalls.length).toBe(0);
261
- });
262
-
263
- it('(d) reads === [] preserves legacy ctx.view swap-chain path (no resolveCtx call for input)', () => {
264
- const swapView = { __swap: true };
265
- const { ctx, spy } = makeSpyCtx({
266
- lookup: () => ({ source: 'fn vs_main(){} fn fs_main(){}' }),
267
- view: swapView,
268
- });
269
- const graph = new RenderGraph<RenderPipelineContext>();
270
- graph.addColorTarget('rt', { format: 'rgba8unorm', size: { w: 64, h: 64 } });
271
- addFullscreenPass(graph, 'pp', {
272
- shader: 'test::no-reads',
273
- color: 'rt',
274
- // reads omitted -> defaults to []
275
- });
276
-
277
- const execute = findPassExecute(graph, 'pp');
278
- if (!execute) return;
279
-
280
- let resolveCalls = 0;
281
- const resolveCtx = {
282
- resolve: (n: string): unknown => {
283
- resolveCalls += 1;
284
- return n === 'rt' ? { __rt: true } : undefined;
285
- },
286
- };
287
- execute(ctx, resolveCtx);
288
-
289
- // ctx.view (swap-chain) feeds the bind-group input texture entry when reads
290
- // is empty (preserving the FXAA-style legacy swap-chain sample contract).
291
- expect(spy.bindGroupCreates.length).toBe(1);
292
- const tvEntry = spy.bindGroupCreates[0]?.entries.find((e) => e.resource.kind === 'textureView');
293
- expect(tvEntry?.resource.value).toBe(swapView);
294
- // resolveCtx.resolve is still consulted for the writes target (color='rt').
295
- expect(resolveCalls).toBeGreaterThanOrEqual(1);
296
- });
297
- });