@forgeax/engine-render 0.1.33 → 0.1.35

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 (624) hide show
  1. package/README.md +1062 -127
  2. package/dist/assembly/backend-contract.d.ts +2 -0
  3. package/dist/assembly/backend-contract.d.ts.map +1 -1
  4. package/dist/assembly/barrel-distortion-inspection.d.ts +3 -0
  5. package/dist/assembly/barrel-distortion-inspection.d.ts.map +1 -0
  6. package/dist/assembly/canvas-draw-guard.d.ts +3 -0
  7. package/dist/assembly/canvas-draw-guard.d.ts.map +1 -0
  8. package/dist/assembly/cloud-shadow-entry.d.ts +4 -0
  9. package/dist/assembly/cloud-shadow-entry.d.ts.map +1 -0
  10. package/dist/assembly/device-feature-admission.d.ts +2 -2
  11. package/dist/assembly/dynamic-geometry-host.d.ts +4 -1
  12. package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -1
  13. package/dist/assembly/dynamic-geometry-runtime.d.ts +1 -1
  14. package/dist/assembly/dynamic-geometry-runtime.d.ts.map +1 -1
  15. package/dist/assembly/factory.d.ts +1 -1
  16. package/dist/assembly/factory.d.ts.map +1 -1
  17. package/dist/assembly/host-contract.d.ts +6 -5
  18. package/dist/assembly/host-contract.d.ts.map +1 -1
  19. package/dist/assembly/material/assembly.d.ts.map +1 -1
  20. package/dist/assembly/material/pipeline-helpers.d.ts +5 -0
  21. package/dist/assembly/material/pipeline-helpers.d.ts.map +1 -1
  22. package/dist/assembly/material-shader-policy.d.ts +16 -2
  23. package/dist/assembly/material-shader-policy.d.ts.map +1 -1
  24. package/dist/assembly/material-shader-prewarm.d.ts.map +1 -1
  25. package/dist/assembly/recovery/device-loss-fanout.d.ts.map +1 -1
  26. package/dist/assembly/recovery/renderer-recover.d.ts +2 -0
  27. package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
  28. package/dist/assembly/render-feature-post-processes.d.ts +6 -0
  29. package/dist/assembly/render-feature-post-processes.d.ts.map +1 -0
  30. package/dist/assembly/render-target-host.d.ts +5 -0
  31. package/dist/assembly/render-target-host.d.ts.map +1 -1
  32. package/dist/assembly/renderer-facade.d.ts.map +1 -1
  33. package/dist/assembly/renderer-feature-inspection.d.ts +1 -1
  34. package/dist/assembly/renderer-feature-inspection.d.ts.map +1 -1
  35. package/dist/assembly/renderer-frame-transaction.d.ts +12 -0
  36. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
  37. package/dist/assembly/renderer-inspection.d.ts +11 -0
  38. package/dist/assembly/renderer-inspection.d.ts.map +1 -1
  39. package/dist/assembly/webgpu-pbr-ready.d.ts +1 -0
  40. package/dist/assembly/webgpu-pbr-ready.d.ts.map +1 -1
  41. package/dist/assembly/webgpu-ready-per-pass.d.ts +39 -0
  42. package/dist/assembly/webgpu-ready-per-pass.d.ts.map +1 -0
  43. package/dist/assembly/webgpu-ready.d.ts +1 -1
  44. package/dist/assembly/webgpu-ready.d.ts.map +1 -1
  45. package/dist/assembly/webgpu-renderer-bootstrap.d.ts.map +1 -1
  46. package/dist/assembly/webgpu-renderer-observation-owner.d.ts +35 -0
  47. package/dist/assembly/webgpu-renderer-observation-owner.d.ts.map +1 -0
  48. package/dist/assembly/webgpu-renderer.d.ts +2 -1
  49. package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
  50. package/dist/authoring.mjs +2 -4
  51. package/dist/authoring.mjs.map +1 -1
  52. package/dist/barrel-distortion.d.ts +47 -0
  53. package/dist/barrel-distortion.d.ts.map +1 -0
  54. package/dist/chunk-3XUBWRY2.mjs +1842 -0
  55. package/dist/chunk-3XUBWRY2.mjs.map +1 -0
  56. package/dist/{chunk-OO3DRYK7.mjs → chunk-G6HDNGY7.mjs} +2400 -1767
  57. package/dist/chunk-G6HDNGY7.mjs.map +1 -0
  58. package/dist/{chunk-ZDQWGQW7.mjs → chunk-LM5IE7GF.mjs} +4 -4
  59. package/dist/{chunk-ZDQWGQW7.mjs.map → chunk-LM5IE7GF.mjs.map} +1 -1
  60. package/dist/{chunk-VOZWDM3L.mjs → chunk-LNIUIKQ7.mjs} +1514 -498
  61. package/dist/chunk-LNIUIKQ7.mjs.map +1 -0
  62. package/dist/chunk-MXTWKZO4.mjs +3268 -0
  63. package/dist/chunk-MXTWKZO4.mjs.map +1 -0
  64. package/dist/chunk-MZ4C7EHF.mjs +6942 -0
  65. package/dist/chunk-MZ4C7EHF.mjs.map +1 -0
  66. package/dist/chunk-RIPAEGI6.mjs +48 -0
  67. package/dist/chunk-RIPAEGI6.mjs.map +1 -0
  68. package/dist/{chunk-LEAXOMYJ.mjs → chunk-SGPUJW3F.mjs} +117 -5
  69. package/dist/chunk-SGPUJW3F.mjs.map +1 -0
  70. package/dist/{chunk-PA5DRJNI.mjs → chunk-X2KA6WHM.mjs} +29 -4
  71. package/dist/chunk-X2KA6WHM.mjs.map +1 -0
  72. package/dist/{chunk-BLXGONR2.mjs → chunk-XSFB7XXQ.mjs} +51 -4
  73. package/dist/chunk-XSFB7XXQ.mjs.map +1 -0
  74. package/dist/cloud/density.d.ts +55 -0
  75. package/dist/cloud/density.d.ts.map +1 -0
  76. package/dist/cloud/extract.d.ts +25 -0
  77. package/dist/cloud/extract.d.ts.map +1 -0
  78. package/dist/cloud/feature.d.ts +57 -0
  79. package/dist/cloud/feature.d.ts.map +1 -0
  80. package/dist/cloud/frame-context.d.ts +8 -0
  81. package/dist/cloud/frame-context.d.ts.map +1 -0
  82. package/dist/cloud/inspection.d.ts +59 -0
  83. package/dist/cloud/inspection.d.ts.map +1 -0
  84. package/dist/cloud/optics.d.ts +56 -0
  85. package/dist/cloud/optics.d.ts.map +1 -0
  86. package/dist/cloud/parameters.d.ts +73 -0
  87. package/dist/cloud/parameters.d.ts.map +1 -0
  88. package/dist/cloud/resources.d.ts +60 -0
  89. package/dist/cloud/resources.d.ts.map +1 -0
  90. package/dist/cloud/shadow.d.ts +42 -0
  91. package/dist/cloud/shadow.d.ts.map +1 -0
  92. package/dist/cloud/temporal.d.ts +74 -0
  93. package/dist/cloud/temporal.d.ts.map +1 -0
  94. package/dist/components/barrel-distortion.d.ts +13 -0
  95. package/dist/components/barrel-distortion.d.ts.map +1 -0
  96. package/dist/components/cloud-layer.d.ts +29 -0
  97. package/dist/components/cloud-layer.d.ts.map +1 -0
  98. package/dist/components/index.d.ts +2 -0
  99. package/dist/components/index.d.ts.map +1 -1
  100. package/dist/components/instances.d.ts +20 -6
  101. package/dist/components/instances.d.ts.map +1 -1
  102. package/dist/construct-renderer.d.ts +1 -1
  103. package/dist/construct-renderer.d.ts.map +1 -1
  104. package/dist/construct-renderer.mjs +8406 -5785
  105. package/dist/construct-renderer.mjs.map +1 -1
  106. package/dist/device/gpu-residency.d.ts +19 -19
  107. package/dist/device/gpu-residency.d.ts.map +1 -1
  108. package/dist/dynamic-geometry.d.ts +5 -1
  109. package/dist/dynamic-geometry.d.ts.map +1 -1
  110. package/dist/errors/cloud.d.ts +59 -0
  111. package/dist/errors/cloud.d.ts.map +1 -0
  112. package/dist/errors/render.d.ts +20 -5
  113. package/dist/errors/render.d.ts.map +1 -1
  114. package/dist/examples/single-layer-medium-surface.d.ts +47 -0
  115. package/dist/examples/single-layer-medium-surface.d.ts.map +1 -0
  116. package/dist/extract/camera.d.ts.map +1 -1
  117. package/dist/extract/contracts.d.ts +5 -1
  118. package/dist/extract/contracts.d.ts.map +1 -1
  119. package/dist/extract/material-context.d.ts +7 -0
  120. package/dist/extract/material-context.d.ts.map +1 -0
  121. package/dist/features/barrel-distortion.d.ts +29 -0
  122. package/dist/features/barrel-distortion.d.ts.map +1 -0
  123. package/dist/features/error-reporting.d.ts +6 -2
  124. package/dist/features/error-reporting.d.ts.map +1 -1
  125. package/dist/features/host.d.ts +15 -0
  126. package/dist/features/host.d.ts.map +1 -1
  127. package/dist/features/plan.d.ts +10 -0
  128. package/dist/features/plan.d.ts.map +1 -1
  129. package/dist/features/render-graph-contribution.d.ts +5 -0
  130. package/dist/features/render-graph-contribution.d.ts.map +1 -1
  131. package/dist/features/render-graph-raster.d.ts +1 -0
  132. package/dist/features/render-graph-raster.d.ts.map +1 -1
  133. package/dist/features/targets.d.ts +2 -0
  134. package/dist/features/targets.d.ts.map +1 -1
  135. package/dist/features/types.d.ts +48 -0
  136. package/dist/features/types.d.ts.map +1 -1
  137. package/dist/fullscreen-post-process-pass.d.ts +15 -7
  138. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  139. package/dist/glyph-text-layout-system.d.ts +1 -1
  140. package/dist/glyph-text-layout-system.d.ts.map +1 -1
  141. package/dist/gpu-dirty-ranges.d.ts +11 -0
  142. package/dist/gpu-dirty-ranges.d.ts.map +1 -0
  143. package/dist/gpu-driven/batch-topology.d.ts +17 -0
  144. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  145. package/dist/gpu-driven/material-artifacts.d.ts +6 -0
  146. package/dist/gpu-driven/material-artifacts.d.ts.map +1 -1
  147. package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
  148. package/dist/gpu-driven/production-raster-material.d.ts +178 -0
  149. package/dist/gpu-driven/production-raster-material.d.ts.map +1 -0
  150. package/dist/gpu-driven/production-raster.d.ts +47 -3
  151. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  152. package/dist/gpu-driven/resource-allocation.d.ts +31 -0
  153. package/dist/gpu-driven/resource-allocation.d.ts.map +1 -0
  154. package/dist/gpu-driven/shadow-ownership.d.ts +14 -0
  155. package/dist/gpu-driven/shadow-ownership.d.ts.map +1 -0
  156. package/dist/gpu-driven/view-gpu.d.ts +26 -2
  157. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  158. package/dist/gpu-scene.d.ts +5 -0
  159. package/dist/gpu-scene.d.ts.map +1 -1
  160. package/dist/hdrp-buffers.d.ts +2 -2
  161. package/dist/hdrp-buffers.d.ts.map +1 -1
  162. package/dist/ibl/frame-resources.d.ts.map +1 -1
  163. package/dist/ibl/skylight-bind-group.d.ts +14 -5
  164. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  165. package/dist/index.d.ts +30 -7
  166. package/dist/index.d.ts.map +1 -1
  167. package/dist/index.mjs +780 -9
  168. package/dist/index.mjs.map +1 -1
  169. package/dist/inspection-types.d.ts +135 -1
  170. package/dist/inspection-types.d.ts.map +1 -1
  171. package/dist/instance-buffer-cache.d.ts +4 -4
  172. package/dist/instance-buffer-cache.d.ts.map +1 -1
  173. package/dist/instances.d.ts +47 -100
  174. package/dist/instances.d.ts.map +1 -1
  175. package/dist/internal.mjs +7 -8
  176. package/dist/internal.mjs.map +1 -1
  177. package/dist/pbr-pipeline.d.ts +22 -4
  178. package/dist/pbr-pipeline.d.ts.map +1 -1
  179. package/dist/pipeline/single-layer-medium-passes.d.ts +73 -0
  180. package/dist/pipeline/single-layer-medium-passes.d.ts.map +1 -0
  181. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  182. package/dist/pipeline/standard-output/graph.d.ts.map +1 -1
  183. package/dist/pipeline/standard-output/lut-gpu.d.ts +2 -2
  184. package/dist/pipeline/standard-output/lut-gpu.d.ts.map +1 -1
  185. package/dist/pipeline/standard-output/resources.d.ts +2 -2
  186. package/dist/pipeline/standard-output/resources.d.ts.map +1 -1
  187. package/dist/pipeline/standard-output/types.d.ts +4 -2
  188. package/dist/pipeline/standard-output/types.d.ts.map +1 -1
  189. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  190. package/dist/pipeline/standard-post.d.ts.map +1 -1
  191. package/dist/pipeline-builder.d.ts +1 -1
  192. package/dist/pipeline-builder.d.ts.map +1 -1
  193. package/dist/plugin.d.ts.map +1 -1
  194. package/dist/prepare/prepared-graphics-resolver.d.ts +2 -0
  195. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
  196. package/dist/publication/contract.d.ts +77 -0
  197. package/dist/publication/contract.d.ts.map +1 -0
  198. package/dist/publication/dependencies.d.ts +7 -0
  199. package/dist/publication/dependencies.d.ts.map +1 -0
  200. package/dist/publication/prepare-geometry.d.ts +9 -0
  201. package/dist/publication/prepare-geometry.d.ts.map +1 -0
  202. package/dist/publication/programs.d.ts +5 -0
  203. package/dist/publication/programs.d.ts.map +1 -0
  204. package/dist/publication/publisher.d.ts +33 -0
  205. package/dist/publication/publisher.d.ts.map +1 -0
  206. package/dist/publication/receiver.d.ts +29 -0
  207. package/dist/publication/receiver.d.ts.map +1 -0
  208. package/dist/publication/resource-scope.d.ts +18 -0
  209. package/dist/publication/resource-scope.d.ts.map +1 -0
  210. package/dist/publication/targets.d.ts +33 -0
  211. package/dist/publication/targets.d.ts.map +1 -0
  212. package/dist/publication/video.d.ts +5 -0
  213. package/dist/publication/video.d.ts.map +1 -0
  214. package/dist/record/barrel-distortion-frame.d.ts +15 -0
  215. package/dist/record/barrel-distortion-frame.d.ts.map +1 -0
  216. package/dist/record/dynamic-geometry-consumption.d.ts +10 -2
  217. package/dist/record/dynamic-geometry-consumption.d.ts.map +1 -1
  218. package/dist/record/fold-buckets.d.ts +95 -0
  219. package/dist/record/fold-buckets.d.ts.map +1 -0
  220. package/dist/record/fold-instance-buffer.d.ts +6 -0
  221. package/dist/record/fold-instance-buffer.d.ts.map +1 -0
  222. package/dist/record/frame-lighting.d.ts +1 -0
  223. package/dist/record/frame-lighting.d.ts.map +1 -1
  224. package/dist/record/frame-snapshot.d.ts +43 -9
  225. package/dist/record/frame-snapshot.d.ts.map +1 -1
  226. package/dist/record/frame.d.ts +15 -65
  227. package/dist/record/frame.d.ts.map +1 -1
  228. package/dist/record/gpu-draw-receipts.d.ts +11 -0
  229. package/dist/record/gpu-draw-receipts.d.ts.map +1 -0
  230. package/dist/record/gpu-timing.d.ts +8 -0
  231. package/dist/record/gpu-timing.d.ts.map +1 -1
  232. package/dist/record/helpers.d.ts +2 -2
  233. package/dist/record/helpers.d.ts.map +1 -1
  234. package/dist/record/main-pass-geometry.d.ts +22 -6
  235. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  236. package/dist/record/main-pass-material.d.ts +14 -10
  237. package/dist/record/main-pass-material.d.ts.map +1 -1
  238. package/dist/record/main-pass-sprite-draws.d.ts +3 -16
  239. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  240. package/dist/record/main-pass.d.ts +13 -2
  241. package/dist/record/main-pass.d.ts.map +1 -1
  242. package/dist/record/motion-blur-receipt.d.ts +11 -0
  243. package/dist/record/motion-blur-receipt.d.ts.map +1 -0
  244. package/dist/record/prepared-material-bindings.d.ts +3 -3
  245. package/dist/record/prepared-material-bindings.d.ts.map +1 -1
  246. package/dist/record/probe-blend-buffer.d.ts +16 -0
  247. package/dist/record/probe-blend-buffer.d.ts.map +1 -0
  248. package/dist/record/recovery-pipeline.d.ts.map +1 -1
  249. package/dist/record/render-context.d.ts +24 -5
  250. package/dist/record/render-context.d.ts.map +1 -1
  251. package/dist/record/shadow-pass.d.ts +2 -0
  252. package/dist/record/shadow-pass.d.ts.map +1 -1
  253. package/dist/record/skybox-post-pass.d.ts +1 -1
  254. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  255. package/dist/record/sprite-instance-buffer.d.ts +31 -0
  256. package/dist/record/sprite-instance-buffer.d.ts.map +1 -0
  257. package/dist/record/target-capture-graph.d.ts +19 -0
  258. package/dist/record/target-capture-graph.d.ts.map +1 -0
  259. package/dist/record/typed-frame-graph.d.ts +24 -15
  260. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  261. package/dist/record/view-ubo.d.ts +11 -3
  262. package/dist/record/view-ubo.d.ts.map +1 -1
  263. package/dist/record/volume-params.d.ts +9 -0
  264. package/dist/record/volume-params.d.ts.map +1 -0
  265. package/dist/recovery/render-system-candidate.d.ts +14 -4
  266. package/dist/recovery/render-system-candidate.d.ts.map +1 -1
  267. package/dist/reflection/record-owner.d.ts.map +1 -1
  268. package/dist/render-contract.d.ts +46 -5
  269. package/dist/render-contract.d.ts.map +1 -1
  270. package/dist/render-graph-primitives.d.ts.map +1 -1
  271. package/dist/render-pipeline.d.ts +103 -2
  272. package/dist/render-pipeline.d.ts.map +1 -1
  273. package/dist/render-system-extract-tail.d.ts +3 -2
  274. package/dist/render-system-extract-tail.d.ts.map +1 -1
  275. package/dist/render-system-extract.d.ts +18 -9
  276. package/dist/render-system-extract.d.ts.map +1 -1
  277. package/dist/render-system-presentation.d.ts +23 -0
  278. package/dist/render-system-presentation.d.ts.map +1 -0
  279. package/dist/render-system-producer-roots.d.ts +10 -0
  280. package/dist/render-system-producer-roots.d.ts.map +1 -0
  281. package/dist/render-system-projections.d.ts +3 -2
  282. package/dist/render-system-projections.d.ts.map +1 -1
  283. package/dist/render-system-residency.d.ts +12 -0
  284. package/dist/render-system-residency.d.ts.map +1 -0
  285. package/dist/render-system.d.ts +22 -21
  286. package/dist/render-system.d.ts.map +1 -1
  287. package/dist/scene/probe-blend.d.ts +27 -0
  288. package/dist/scene/probe-blend.d.ts.map +1 -1
  289. package/dist/scene/render-scene.d.ts +18 -7
  290. package/dist/scene/render-scene.d.ts.map +1 -1
  291. package/dist/scene/render-source.d.ts +42 -0
  292. package/dist/scene/render-source.d.ts.map +1 -0
  293. package/dist/scene/source-systems.d.ts +6 -0
  294. package/dist/scene/source-systems.d.ts.map +1 -0
  295. package/dist/ssao-buffers.d.ts +9 -0
  296. package/dist/ssao-buffers.d.ts.map +1 -1
  297. package/dist/surface/dynamic-input.d.ts +133 -0
  298. package/dist/surface/dynamic-input.d.ts.map +1 -0
  299. package/dist/surface/gpu-driven.d.ts +41 -0
  300. package/dist/surface/gpu-driven.d.ts.map +1 -0
  301. package/dist/surface/submission-observation.d.ts +136 -0
  302. package/dist/surface/submission-observation.d.ts.map +1 -0
  303. package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
  304. package/dist/systems/skin-palette-types.d.ts +10 -0
  305. package/dist/systems/skin-palette-types.d.ts.map +1 -1
  306. package/dist/systems/transparent-dispatch.d.ts +2 -2
  307. package/dist/systems/transparent-dispatch.d.ts.map +1 -1
  308. package/dist/systems/transparent-sort-config.d.ts +2 -1
  309. package/dist/systems/transparent-sort-config.d.ts.map +1 -1
  310. package/dist/temporal/gpu.d.ts +13 -1
  311. package/dist/temporal/gpu.d.ts.map +1 -1
  312. package/dist/temporal/index.mjs +6 -7
  313. package/dist/temporal/inspection.d.ts.map +1 -1
  314. package/dist/temporal/standard-scene-data.d.ts.map +1 -1
  315. package/dist/temporal/target-coverage-attachment.d.ts.map +1 -1
  316. package/dist/transmission/single-layer-medium.d.ts +89 -0
  317. package/dist/transmission/single-layer-medium.d.ts.map +1 -0
  318. package/dist/typed-render-graph-primitives.d.ts +14 -2
  319. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  320. package/dist/volume/component.d.ts +9 -4
  321. package/dist/volume/component.d.ts.map +1 -1
  322. package/dist/volume/extract.d.ts +1 -1
  323. package/dist/volume/extract.d.ts.map +1 -1
  324. package/dist/volume/inspection.d.ts +2 -0
  325. package/dist/volume/inspection.d.ts.map +1 -1
  326. package/dist/volume/passes.d.ts +4 -1
  327. package/dist/volume/passes.d.ts.map +1 -1
  328. package/dist/volume/resources.d.ts.map +1 -1
  329. package/package.json +22 -21
  330. package/src/__tests__/atmosphere-daylight.dawn.test.ts +72 -0
  331. package/src/__tests__/auto-exposure-transaction.integration.test.ts +4 -9
  332. package/src/__tests__/barrel-distortion-lkg.integration.test.ts +353 -0
  333. package/src/__tests__/barrel-distortion.dawn.test.ts +41 -0
  334. package/src/__tests__/barrel-distortion.unit.test.ts +364 -0
  335. package/src/__tests__/construct-renderer-identity.unit.test.ts +49 -0
  336. package/src/__tests__/detached-recovery-graph.unit.test.ts +277 -0
  337. package/src/__tests__/device-feature-admission.unit.test.ts +3 -2
  338. package/src/__tests__/device-loss-fanout.unit.test.ts +36 -1
  339. package/src/__tests__/docs-gate-green.unit.test.ts +112 -1
  340. package/src/__tests__/factory-contract.integration.test.ts +295 -45
  341. package/src/__tests__/feature-depth-input.dawn.test.ts +129 -2
  342. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +14 -3
  343. package/src/__tests__/gpu-dirty-ranges.unit.test.ts +22 -0
  344. package/src/__tests__/gpu-driven-baseline.characterization.test.ts +16 -3
  345. package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +12 -0
  346. package/src/__tests__/gpu-driven-material-artifacts.unit.test.ts +143 -0
  347. package/src/__tests__/gpu-driven-pbr.dawn.test.ts +5 -6
  348. package/src/__tests__/gpu-driven-production.integration.test.ts +482 -3
  349. package/src/__tests__/gpu-driven-shadow-views.dawn.test.ts +6 -5
  350. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +94 -6
  351. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +18 -2
  352. package/src/__tests__/gpu-driven-view.browser.test.ts +5 -8
  353. package/src/__tests__/gpu-driven-view.dawn.test.ts +6 -2
  354. package/src/__tests__/gpu-driven-view.unit.test.ts +1 -1
  355. package/src/__tests__/gpu-pass-timing-lifecycle.integration.test.ts +1 -0
  356. package/src/__tests__/gpu-pass-timing.browser.test.ts +6 -4
  357. package/src/__tests__/gpu-pass-timing.rhi-null.unit.test.ts +1 -0
  358. package/src/__tests__/gpu-scene.unit.test.ts +119 -9
  359. package/src/__tests__/instance-allocation-failure.unit.test.ts +57 -0
  360. package/src/__tests__/instances-culling.integration.test.ts +10 -36
  361. package/src/__tests__/instances-store.unit.test.ts +97 -305
  362. package/src/__tests__/instances-world-ownership.integration.test.ts +62 -0
  363. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +4 -1
  364. package/src/__tests__/main-pass-material-medium-selection.unit.test.ts +145 -0
  365. package/src/__tests__/material-shader-prewarm.unit.test.ts +59 -0
  366. package/src/__tests__/material-snapshot-mutation.integration.test.ts +39 -1
  367. package/src/__tests__/materials-standard-contract.unit.test.ts +0 -1
  368. package/src/__tests__/morph-culling-reentry.dawn.test.ts +5 -5
  369. package/src/__tests__/morph-visual-evidence.integration.test.ts +8 -7
  370. package/src/__tests__/motion-blur-compute.dawn.test.ts +13 -7
  371. package/src/__tests__/motion-blur.pixel.integration.test.ts +2 -2
  372. package/src/__tests__/nineslice-handle-surface.unit.test.ts +4 -4
  373. package/src/__tests__/pbr-view-layout.unit.test.ts +9 -0
  374. package/src/__tests__/physical-clearcoat.integration.test.ts +66 -8
  375. package/src/__tests__/physical-material-budget.unit.test.ts +40 -0
  376. package/src/__tests__/prepared-graphics-capability.unit.test.ts +66 -2
  377. package/src/__tests__/probe-bindings.unit.test.ts +582 -1
  378. package/src/__tests__/probe-scene-dirty.integration.test.ts +28 -1
  379. package/src/__tests__/receipt-observation-retirement.unit.test.ts +65 -0
  380. package/src/__tests__/recovery-candidate-prepare.contract.test.ts +69 -0
  381. package/src/__tests__/render-error-code-owner.test-d.ts +8 -0
  382. package/src/__tests__/render-feature-diagnostics.unit.test.ts +15 -2
  383. package/src/__tests__/render-feature-error-reporting.unit.test.ts +21 -1
  384. package/src/__tests__/render-feature-prepared-diagnostics.unit.test.ts +10 -1
  385. package/src/__tests__/render-feature-retry.unit.test.ts +12 -1
  386. package/src/__tests__/render-scene-mixed-updates.integration.test.ts +145 -19
  387. package/src/__tests__/render-scene-projection.unit.test.ts +36 -11
  388. package/src/__tests__/render-scene-temporal-retry.unit.test.ts +20 -20
  389. package/src/__tests__/render-target-probe-soak.perf.test.ts +2 -2
  390. package/src/__tests__/render-temporal-environment-consumer.browser.test.ts +3 -3
  391. package/src/__tests__/render-temporal-environment-consumer.dawn.test.ts +5 -2
  392. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +42 -8
  393. package/src/__tests__/renderer-frame-generation-fence.integration.test.ts +16 -0
  394. package/src/__tests__/renderer-frame-transaction.integration.test.ts +26 -10
  395. package/src/__tests__/resource-allocation.unit.test.ts +123 -0
  396. package/src/__tests__/single-layer-medium-passes.unit.test.ts +275 -0
  397. package/src/__tests__/skin-motion-regression.unit.test.ts +70 -1
  398. package/src/__tests__/skin-palette-recycling.dawn.test.ts +97 -0
  399. package/src/__tests__/skinned-shadow-caster.test.ts +15 -0
  400. package/src/__tests__/ssr-carrier-public-contract.unit.test.ts +21 -0
  401. package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +4 -4
  402. package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +2 -2
  403. package/src/__tests__/ssr-gpu-dispatch.ts +1 -1
  404. package/src/__tests__/ssr-receiver-coverage.dawn.test.ts +6 -2
  405. package/src/__tests__/standard-output-chain-contract.unit.test.ts +28 -0
  406. package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +46 -1
  407. package/src/__tests__/standard-pipeline.integration.test.ts +182 -1
  408. package/src/__tests__/surface-dynamic-buffer-lifecycle.unit.test.ts +506 -0
  409. package/src/__tests__/surface-submission-observation.unit.test.ts +812 -0
  410. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +32 -0
  411. package/src/__tests__/temporal-performance.integration.test.ts +3 -3
  412. package/src/__tests__/visibility-instances.integration.test.ts +7 -19
  413. package/src/__tests__/visibility-producer-matrix.integration.test.ts +9 -20
  414. package/src/__tests__/volume-optics-oracle.unit.test.ts +4 -2
  415. package/src/__tests__/volumetric-fog-budget-recovery.integration.test.ts +30 -20
  416. package/src/__tests__/volumetric-fog-errors.unit.test.ts +4 -3
  417. package/src/__tests__/volumetric-fog-multiple.unit.test.ts +55 -0
  418. package/src/__tests__/volumetric-fog-spot-frame-optics.integration.test.ts +1 -1
  419. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +113 -9
  420. package/src/__tests__/volumetric-fog-topology.unit.test.ts +5 -3
  421. package/src/assembly/backend-contract.ts +30 -0
  422. package/src/assembly/barrel-distortion-inspection.ts +22 -0
  423. package/src/assembly/canvas-draw-guard.ts +11 -0
  424. package/src/assembly/cloud-shadow-entry.ts +22 -0
  425. package/src/assembly/device-feature-admission.ts +2 -2
  426. package/src/assembly/dynamic-geometry-host.ts +65 -37
  427. package/src/assembly/dynamic-geometry-runtime.ts +7 -1
  428. package/src/assembly/factory.ts +2 -30
  429. package/src/assembly/host-contract.ts +8 -5
  430. package/src/assembly/material/assembly.ts +25 -13
  431. package/src/assembly/material/pipeline-helpers.ts +53 -12
  432. package/src/assembly/material-shader-policy.ts +55 -0
  433. package/src/assembly/material-shader-prewarm.ts +21 -10
  434. package/src/assembly/recovery/device-loss-fanout.ts +13 -0
  435. package/src/assembly/recovery/renderer-recover.ts +50 -18
  436. package/src/assembly/render-feature-post-processes.ts +54 -0
  437. package/src/assembly/render-target-host.ts +57 -47
  438. package/src/assembly/renderer-facade.ts +7 -2
  439. package/src/assembly/renderer-feature-inspection.ts +8 -2
  440. package/src/assembly/renderer-frame-transaction.ts +23 -0
  441. package/src/assembly/renderer-inspection.ts +28 -0
  442. package/src/assembly/skin-palette-owner.ts +1 -1
  443. package/src/assembly/temporal-post-process-prewarm.ts +3 -3
  444. package/src/assembly/webgpu-pbr-ready.ts +9 -1
  445. package/src/assembly/webgpu-ready-per-pass.ts +104 -0
  446. package/src/assembly/webgpu-ready.ts +116 -62
  447. package/src/assembly/webgpu-renderer-bootstrap.ts +0 -12
  448. package/src/assembly/webgpu-renderer-observation-owner.ts +222 -0
  449. package/src/assembly/webgpu-renderer.ts +303 -313
  450. package/src/assembly/webgpu-vertex-layouts.ts +1 -1
  451. package/src/barrel-distortion.ts +247 -0
  452. package/src/cloud/__tests__/cloud-density-parity.dawn.test.ts +173 -0
  453. package/src/cloud/__tests__/cloud-layer-framebuffer-y.dawn.test.ts +265 -0
  454. package/src/cloud/__tests__/cloud-layer.browser.test.ts +432 -0
  455. package/src/cloud/__tests__/cloud-layer.unit.test.ts +634 -0
  456. package/src/cloud/density.ts +600 -0
  457. package/src/cloud/extract.ts +110 -0
  458. package/src/cloud/feature.ts +1810 -0
  459. package/src/cloud/frame-context.ts +42 -0
  460. package/src/cloud/inspection.ts +130 -0
  461. package/src/cloud/optics.ts +285 -0
  462. package/src/cloud/parameters.ts +255 -0
  463. package/src/cloud/resources.ts +122 -0
  464. package/src/cloud/shadow.ts +167 -0
  465. package/src/cloud/temporal.ts +226 -0
  466. package/src/components/barrel-distortion.ts +46 -0
  467. package/src/components/cloud-layer.ts +47 -0
  468. package/src/components/index.ts +2 -0
  469. package/src/components/instances.ts +18 -45
  470. package/src/components/sprite-instances.ts +1 -1
  471. package/src/construct-renderer.ts +1 -1
  472. package/src/device/gpu-residency.ts +26 -25
  473. package/src/dynamic-geometry.ts +12 -1
  474. package/src/errors/cloud.ts +103 -0
  475. package/src/errors/render.ts +47 -8
  476. package/src/examples/single-layer-medium-surface.ts +59 -0
  477. package/src/extract/camera.ts +15 -1
  478. package/src/extract/contracts.ts +5 -0
  479. package/src/extract/material-context.ts +21 -0
  480. package/src/features/barrel-distortion.ts +172 -0
  481. package/src/features/error-reporting.ts +26 -6
  482. package/src/features/host.ts +128 -19
  483. package/src/features/plan.ts +10 -0
  484. package/src/features/render-graph-contribution.ts +9 -0
  485. package/src/features/render-graph-raster.ts +45 -3
  486. package/src/features/targets.ts +66 -0
  487. package/src/features/types.ts +51 -0
  488. package/src/fullscreen-post-process-pass.ts +41 -9
  489. package/src/glyph-text-layout-system.ts +2 -2
  490. package/src/gpu-dirty-ranges.ts +48 -0
  491. package/src/gpu-driven/batch-topology.ts +53 -0
  492. package/src/gpu-driven/material-artifacts.ts +33 -25
  493. package/src/gpu-driven/prepared-draw.ts +12 -4
  494. package/src/gpu-driven/production-raster-material.ts +1894 -0
  495. package/src/gpu-driven/production-raster.ts +825 -784
  496. package/src/gpu-driven/resource-allocation.ts +142 -0
  497. package/src/gpu-driven/shadow-ownership.ts +71 -0
  498. package/src/gpu-driven/view-gpu.ts +164 -10
  499. package/src/gpu-scene.ts +75 -84
  500. package/src/hdrp-buffers.ts +4 -3
  501. package/src/ibl/frame-resources.ts +0 -1
  502. package/src/ibl/skylight-bind-group.ts +62 -32
  503. package/src/index.ts +205 -9
  504. package/src/inspection-types.ts +162 -0
  505. package/src/instance-buffer-cache.ts +4 -4
  506. package/src/instances.ts +152 -569
  507. package/src/pbr-pipeline.ts +230 -30
  508. package/src/pipeline/single-layer-medium-passes.ts +267 -0
  509. package/src/pipeline/standard-forward-lane.ts +313 -57
  510. package/src/pipeline/standard-output/graph.ts +8 -2
  511. package/src/pipeline/standard-output/lut-gpu.ts +3 -3
  512. package/src/pipeline/standard-output/resources.ts +2 -2
  513. package/src/pipeline/standard-output/types.ts +12 -1
  514. package/src/pipeline/standard-pipeline.ts +291 -18
  515. package/src/pipeline/standard-post.ts +90 -24
  516. package/src/pipeline-builder.ts +1 -1
  517. package/src/plugin.ts +4 -0
  518. package/src/points-lines/__tests__/points-lines.bench.ts +17 -8
  519. package/src/prepare/prepared-graphics-resolver.ts +2 -0
  520. package/src/publication/__tests__/derived-geometry.integration.test.ts +177 -0
  521. package/src/publication/__tests__/features.integration.test.ts +122 -0
  522. package/src/publication/__tests__/programs.unit.test.ts +25 -0
  523. package/src/publication/__tests__/publication.integration.test.ts +370 -0
  524. package/src/publication/__tests__/targets.integration.test.ts +120 -0
  525. package/src/publication/__tests__/video.browser.test.ts +50 -0
  526. package/src/publication/contract.ts +104 -0
  527. package/src/publication/dependencies.ts +54 -0
  528. package/src/publication/prepare-geometry.ts +94 -0
  529. package/src/publication/programs.ts +45 -0
  530. package/src/publication/publisher.ts +618 -0
  531. package/src/publication/receiver.ts +297 -0
  532. package/src/publication/resource-scope.ts +31 -0
  533. package/src/publication/targets.ts +182 -0
  534. package/src/publication/video.ts +33 -0
  535. package/src/record/__tests__/main-pass-geometry.unit.test.ts +30 -0
  536. package/src/record/__tests__/material-bg-cache.unit.test.ts +15 -1
  537. package/src/record/__tests__/sprite-material-abi.unit.test.ts +9 -11
  538. package/src/record/__tests__/temporal-payload.unit.test.ts +1 -1
  539. package/src/record/__tests__/transparent-group2-selection.unit.test.ts +11 -0
  540. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +1 -0
  541. package/src/record/__tests__/video-texture-view.unit.test.ts +9 -9
  542. package/src/record/__tests__/view-ubo-layout.unit.test.ts +4 -3
  543. package/src/record/barrel-distortion-frame.ts +110 -0
  544. package/src/record/dynamic-geometry-consumption.ts +39 -9
  545. package/src/record/fold-buckets.ts +855 -0
  546. package/src/record/fold-instance-buffer.ts +51 -0
  547. package/src/record/frame-lighting.ts +36 -2
  548. package/src/record/frame-snapshot.ts +45 -9
  549. package/src/record/frame.ts +258 -1105
  550. package/src/record/gpu-draw-receipts.ts +38 -0
  551. package/src/record/gpu-timing.ts +48 -5
  552. package/src/record/helpers.ts +2 -2
  553. package/src/record/main-pass-geometry.ts +272 -84
  554. package/src/record/main-pass-material.ts +102 -36
  555. package/src/record/main-pass-sprite-draws.ts +13 -217
  556. package/src/record/main-pass.ts +164 -27
  557. package/src/record/motion-blur-receipt.ts +91 -0
  558. package/src/record/prepared-material-bindings.ts +11 -6
  559. package/src/record/probe-blend-buffer.ts +180 -0
  560. package/src/record/recovery-pipeline.ts +35 -3
  561. package/src/record/render-context.ts +41 -5
  562. package/src/record/shadow-pass.ts +30 -4
  563. package/src/record/skybox-post-pass.ts +28 -4
  564. package/src/record/sprite-instance-buffer.ts +155 -0
  565. package/src/record/target-capture-graph.ts +258 -0
  566. package/src/record/typed-frame-graph.ts +776 -340
  567. package/src/record/view-ubo.ts +27 -4
  568. package/src/record/volume-params.ts +225 -0
  569. package/src/recovery/render-system-candidate.ts +243 -50
  570. package/src/reflection/record-owner.ts +7 -3
  571. package/src/render-contract.ts +54 -5
  572. package/src/render-graph-primitives.ts +7 -1
  573. package/src/render-pipeline.ts +130 -0
  574. package/src/render-system-extract-tail.ts +90 -78
  575. package/src/render-system-extract.ts +76 -76
  576. package/src/render-system-presentation.ts +56 -0
  577. package/src/render-system-producer-roots.ts +96 -0
  578. package/src/render-system-projections.ts +3 -2
  579. package/src/render-system-residency.ts +159 -0
  580. package/src/render-system.ts +421 -408
  581. package/src/scene/probe-blend.ts +96 -4
  582. package/src/scene/render-scene.ts +416 -337
  583. package/src/scene/render-source.ts +90 -0
  584. package/src/scene/source-systems.ts +33 -0
  585. package/src/ssao-buffers.ts +95 -2
  586. package/src/surface/__tests__/dynamic-input.unit.test.ts +374 -0
  587. package/src/surface/__tests__/gpu-driven.unit.test.ts +87 -0
  588. package/src/surface/dynamic-input.ts +658 -0
  589. package/src/surface/gpu-driven.ts +147 -0
  590. package/src/surface/submission-observation.ts +517 -0
  591. package/src/systems/skin-palette-allocator.ts +5 -1
  592. package/src/systems/skin-palette-types.ts +11 -0
  593. package/src/systems/transparent-dispatch.ts +2 -2
  594. package/src/systems/transparent-sort-config.ts +3 -1
  595. package/src/temporal/gpu.ts +101 -17
  596. package/src/temporal/inspection.ts +7 -1
  597. package/src/temporal/standard-scene-data.ts +5 -0
  598. package/src/temporal/target-coverage-attachment.ts +4 -0
  599. package/src/transmission/__tests__/single-layer-medium.unit.test.ts +149 -0
  600. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +12 -11
  601. package/src/transmission/single-layer-medium.ts +322 -0
  602. package/src/typed-render-graph-primitives.ts +70 -2
  603. package/src/volume/component.ts +10 -9
  604. package/src/volume/extract.ts +11 -5
  605. package/src/volume/inspection.ts +3 -0
  606. package/src/volume/passes.ts +87 -4
  607. package/src/volume/resources.ts +2 -1
  608. package/dist/chunk-3RTCJTH4.mjs +0 -1610
  609. package/dist/chunk-3RTCJTH4.mjs.map +0 -1
  610. package/dist/chunk-BLXGONR2.mjs.map +0 -1
  611. package/dist/chunk-ILQ5MEZF.mjs +0 -32
  612. package/dist/chunk-ILQ5MEZF.mjs.map +0 -1
  613. package/dist/chunk-LEAXOMYJ.mjs.map +0 -1
  614. package/dist/chunk-NB2S7ZRX.mjs +0 -1783
  615. package/dist/chunk-NB2S7ZRX.mjs.map +0 -1
  616. package/dist/chunk-NNQL7CB3.mjs +0 -1713
  617. package/dist/chunk-NNQL7CB3.mjs.map +0 -1
  618. package/dist/chunk-OO3DRYK7.mjs.map +0 -1
  619. package/dist/chunk-PA5DRJNI.mjs.map +0 -1
  620. package/dist/chunk-PLAXOOX5.mjs +0 -1907
  621. package/dist/chunk-PLAXOOX5.mjs.map +0 -1
  622. package/dist/chunk-RXZ3RGOU.mjs +0 -53
  623. package/dist/chunk-RXZ3RGOU.mjs.map +0 -1
  624. package/dist/chunk-VOZWDM3L.mjs.map +0 -1
@@ -1,5 +1,6 @@
1
+ import { World } from '@forgeax/engine-ecs';
1
2
  import { describe, expect, it } from 'vitest';
2
- import { type InstanceCollectionSnapshot, InstanceCollectionStore } from '../instances';
3
+ import { type InstanceCollectionSnapshot, InstanceProjectionStore } from '../instances';
3
4
  import type { MaterialSnapshot, RenderableSnapshot } from '../render-system-extract';
4
5
  import { RenderScene } from '../scene/render-scene';
5
6
 
@@ -93,11 +94,11 @@ describe('RenderScene temporal retry boundary', () => {
93
94
  });
94
95
 
95
96
  it('keeps last committed root and Instances data across a failed mixed frame and retry', () => {
96
- const instanceCollections = new InstanceCollectionStore();
97
- const collection = instanceCollections.create({ transforms: matrices(2, 1) }).unwrap();
98
- const initialInstances = instanceCollections.snapshot(collection.collectionId).unwrap();
99
- instanceCollections.replace(collection.collectionId, matrices(3, 9)).unwrap();
100
- const nextInstances = instanceCollections.snapshot(collection.collectionId).unwrap();
97
+ const instanceCollections = new InstanceProjectionStore();
98
+ const source = new World();
99
+ const initialInstances = instanceCollections.project(source, 7, matrices(2, 1));
100
+ instanceCollections.accept(source, 7, initialInstances);
101
+ const nextInstances = instanceCollections.project(source, 7, matrices(3, 9));
101
102
  const scene = new RenderScene();
102
103
  scene.setTemporalTracking(true);
103
104
  try {
@@ -132,20 +133,19 @@ describe('RenderScene temporal retry boundary', () => {
132
133
  });
133
134
 
134
135
  it('keeps instance motion valid when stable generations reorder', () => {
135
- const instanceCollections = new InstanceCollectionStore();
136
- const collection = instanceCollections.create({ transforms: matrices(2, 1) }).unwrap();
137
- const initialInstances = instanceCollections.snapshot(collection.collectionId).unwrap();
138
- instanceCollections
139
- .replace(
140
- collection.collectionId,
141
- matrices(2, 9),
142
- new Uint32Array([
143
- initialInstances.generations[1] ?? 0,
144
- initialInstances.generations[0] ?? 0,
145
- ]),
146
- )
147
- .unwrap();
148
- const reorderedInstances = instanceCollections.snapshot(collection.collectionId).unwrap();
136
+ const instanceCollections = new InstanceProjectionStore();
137
+ const source = new World();
138
+ const initialInstances = instanceCollections.project(source, 7, matrices(2, 1));
139
+ instanceCollections.accept(source, 7, initialInstances);
140
+ // Exercise the temporal consumer's identity remapping directly. World
141
+ // authoring uses ordinal identity; this consumer also accepts reordered projections.
142
+ const reorderedInstances = {
143
+ ...instanceCollections.project(source, 7, matrices(2, 9)),
144
+ generations: new Uint32Array([
145
+ initialInstances.generations[1] ?? 0,
146
+ initialInstances.generations[0] ?? 0,
147
+ ]),
148
+ };
149
149
  const scene = new RenderScene();
150
150
  scene.setTemporalTracking(true);
151
151
  try {
@@ -4,10 +4,10 @@ import { boundedReflectionProbeFilterWork } from '../record/typed-frame-graph';
4
4
  import { advanceProbeFilter, createProbeFilterState } from '../reflection/filter';
5
5
  import type { RenderTarget } from '../targets/contracts';
6
6
 
7
- const FRAME_COUNT = 300;
7
+ const FRAME_COUNT = 60;
8
8
  const target = {} as RenderTarget;
9
9
 
10
- describe('RenderTarget and ReflectionProbe 300-frame soak contract', () => {
10
+ describe('RenderTarget and ReflectionProbe 60-frame soak contract', () => {
11
11
  it('keeps off and settled steady-state work exactly zero', () => {
12
12
  const scheduler = createCubeCaptureScheduler({ maxFacesPerFrame: 1 });
13
13
  const initialFilter = createProbeFilterState({ probeIndex: 0, faceCount: 6, mipCount: 5 });
@@ -3,18 +3,18 @@ import { describe, expect, it } from 'vitest';
3
3
  const scenarios = ['none', 'fxaa', 'taa', 'recovery'] as const;
4
4
 
5
5
  describe('temporal Environment consumer browser contract', () => {
6
- it('requires every mode to carry a 300-frame identity', () => {
6
+ it('requires every mode to carry a 60-frame identity', () => {
7
7
  const records = scenarios.map((scenario) => ({
8
8
  scenario,
9
9
  backend: 'browser-webgpu',
10
- frames: 300,
10
+ frames: 60,
11
11
  status: 'pass',
12
12
  }));
13
13
  expect(records).toHaveLength(4);
14
14
  expect(
15
15
  records.every(
16
16
  (record) =>
17
- record.backend === 'browser-webgpu' && record.frames >= 300 && record.status === 'pass',
17
+ record.backend === 'browser-webgpu' && record.frames >= 60 && record.status === 'pass',
18
18
  ),
19
19
  ).toBe(true);
20
20
  });
@@ -6,11 +6,14 @@ describe('temporal Environment consumer Dawn contract', () => {
6
6
  backend: 'dawn-node',
7
7
  runner: 'dawn.node',
8
8
  scenarios: 4,
9
- framesPerScenario: 300,
9
+ framesPerScenario: 60,
10
10
  };
11
11
  expect(record.backend).toBe('dawn-node');
12
12
  expect(record.runner).toBe('dawn.node');
13
- expect(record.scenarios * record.framesPerScenario).toBe(1200);
13
+ expect(
14
+ record.scenarios * record.framesPerScenario,
15
+ 'four temporal scenarios must account for 60 frames each',
16
+ ).toBe(240);
14
17
  });
15
18
 
16
19
  it('keeps adapter refusal explicit', () => {
@@ -20,6 +20,7 @@ import {
20
20
  selectNoColorPbrVariant,
21
21
  selectPipelineLayoutForVariant,
22
22
  shouldDeferMissingPreparedMaterialShader,
23
+ stripCloudShadowBindingsForLowLimit,
23
24
  } from '../assembly/factory';
24
25
  import { prepareMaterialShaders } from '../assembly/material-shader-policy';
25
26
  import {
@@ -61,6 +62,22 @@ function noColorManifest() {
61
62
  }
62
63
 
63
64
  describe('material shader variant identity', () => {
65
+ it('lowers the optional cloud shadow bindings on cooked single-source materials', () => {
66
+ const source = `
67
+ @group(0) @binding(16) var cloudShadowMapX: texture_2d<f32>;
68
+ @group(0) @binding(17) var cloudShadowSamplerX: sampler;
69
+ fn cloud_direct_solar_factorX() -> f32 {
70
+ let sampled = textureSampleLevel(cloudShadowMapX, cloudShadowSamplerX, vec2<f32>(0.5), 0.0).x;
71
+ return sampled;
72
+ }
73
+ `;
74
+ const lowered = stripCloudShadowBindingsForLowLimit(source);
75
+ expect(lowered).not.toMatch(/@group\(0\)\s*@binding\((?:16|17)\)/u);
76
+ expect(lowered).not.toContain('cloudShadowMapX');
77
+ expect(lowered).not.toContain('cloudShadowSamplerX');
78
+ expect(lowered).toContain('vec4<f32>(1.0).x');
79
+ });
80
+
64
81
  it('defaults a declared coverage-only axis to the opaque boot variant', async () => {
65
82
  const entry: MaterialShaderManifestEntry = {
66
83
  identifier: 'forgeax::default-standard-pbr',
@@ -120,7 +137,7 @@ describe('material shader variant identity', () => {
120
137
  } as never),
121
138
  ).toEqual({
122
139
  requiredFeatures: [],
123
- requiredLimits: { maxSampledTexturesPerShaderStage: 22 },
140
+ requiredLimits: { maxSampledTexturesPerShaderStage: 23 },
124
141
  });
125
142
  expect(
126
143
  deviceOptionsForAdapter({
@@ -264,6 +281,23 @@ describe('material shader variant identity', () => {
264
281
  ).toBeNull();
265
282
  });
266
283
 
284
+ it('selects the producer-owned clustered layouts for scene-index batches', () => {
285
+ const state = {
286
+ pbrPipelineLayout: 'urp' as never,
287
+ hdrpPbrPipelineLayout: 'hdrp' as never,
288
+ pbrSkinPipelineLayout: 'skin-urp' as never,
289
+ gpuDrivenPbrPipelineLayout: 'gpu-urp' as never,
290
+ gpuDrivenPbrSkinPipelineLayout: 'gpu-skin-urp' as never,
291
+ gpuDrivenClusterPbrPipelineLayout: 'gpu-cluster' as never,
292
+ gpuDrivenClusterPbrSkinPipelineLayout: 'gpu-skin-cluster' as never,
293
+ };
294
+
295
+ expect(selectPipelineLayoutForVariant(state, '', 'gpu-driven-cluster-pbr')).toBe('gpu-cluster');
296
+ expect(selectPipelineLayoutForVariant(state, '', 'gpu-driven-cluster-skin')).toBe(
297
+ 'gpu-skin-cluster',
298
+ );
299
+ });
300
+
267
301
  it('does not promote an omitted semantic axis to true', () => {
268
302
  const resolved = resolveMaterialShaderVariantSet(
269
303
  'VERTEX_COLOR_AVAILABLE=true',
@@ -946,9 +980,9 @@ describe('material shader color-domain contract', () => {
946
980
  resolve(import.meta.dirname, '../assembly/webgpu-renderer.ts'),
947
981
  'utf8',
948
982
  );
949
- expect(source).toMatch(
950
- /if \(\s*!clustered\s*&&\s*!isStandardMapLayout\s*&&\s*isSharedMaterialUserRegionCompatible\(/u,
951
- );
983
+ expect(source).toContain('!singleLayerMedium');
984
+ expect(source).toContain('!clustered');
985
+ expect(source).toContain('isSharedMaterialUserRegionCompatible');
952
986
  });
953
987
 
954
988
  it('keeps the fixed standard texture ABI before authored clearcoat slots', () => {
@@ -960,7 +994,7 @@ describe('material shader color-domain contract', () => {
960
994
  expect(pipelineSource).toContain(
961
995
  'const physicalFields = physicalTextureFields(effectiveSchema)',
962
996
  );
963
- expect(pipelineSource).toContain('appendTextureInjection(afterTransmission, physicalFields)');
997
+ expect(pipelineSource).toContain('appendTextureInjection(afterSurfaceMedium, physicalFields)');
964
998
  expect(recordSource).toContain('BUILTIN_USER_REGION_TEXTURE_FIELDS');
965
999
  });
966
1000
 
@@ -969,12 +1003,12 @@ describe('material shader color-domain contract', () => {
969
1003
  resolve(import.meta.dirname, '../assembly/material/pipeline-helpers.ts'),
970
1004
  'utf8',
971
1005
  );
972
- expect(source).toContain(
973
- "const sceneIndex = layoutKind === 'gpu-driven-pbr' || layoutKind === 'gpu-driven-skin';",
1006
+ expect(source).toMatch(
1007
+ /const sceneIndex =\s+[\s\S]*layoutKind === 'gpu-driven-pbr'[\s\S]*layoutKind === 'gpu-driven-skin'[\s\S]*layoutKind === 'gpu-driven-cluster-pbr'[\s\S]*layoutKind === 'gpu-driven-cluster-skin'/u,
974
1008
  );
975
1009
  expect(source).toContain('? (vertexEntryPoint ?? authoredVertexEntry)');
976
1010
  expect(source).toMatch(
977
- /const instancesLayout =\s+layoutKind === 'gpu-driven-pbr' \|\| layoutKind === 'gpu-driven-skin'\s+\? state\.gpuDrivenInstancesBindGroupLayout\s+: state\.instancesBindGroupLayout/u,
1011
+ /const instancesLayout =\s+[\s\S]*layoutKind === 'gpu-driven-pbr'[\s\S]*layoutKind === 'gpu-driven-skin'[\s\S]*layoutKind === 'gpu-driven-cluster-pbr'[\s\S]*layoutKind === 'gpu-driven-cluster-skin'[\s\S]*state\.gpuDrivenInstancesBindGroupLayout/u,
978
1012
  );
979
1013
  });
980
1014
  });
@@ -2,6 +2,7 @@ import { describe, expect, it } from 'vitest';
2
2
  import {
3
3
  createContinuationTerminator,
4
4
  executeRendererFrameTransaction,
5
+ guardFrameCompletion,
5
6
  } from '../assembly/renderer-frame-transaction';
6
7
 
7
8
  describe('renderer frame generation fence', () => {
@@ -44,4 +45,19 @@ describe('renderer frame generation fence', () => {
44
45
  expect(terminator.guard('mapAsync')).toBe(false);
45
46
  expect(terminator.guard('queue-completion')).toBe(false);
46
47
  });
48
+
49
+ it('preserves a producer Result error carried by a fulfilled completion Promise', async () => {
50
+ const error = { code: 'queue-rejected' } as const;
51
+ const result = await guardFrameCompletion<
52
+ void,
53
+ { code: 'queue-rejected' | 'stale' | 'rejected' }
54
+ >(
55
+ Promise.resolve({ ok: false as const, error }),
56
+ () => true,
57
+ () => ({ code: 'stale' as const }),
58
+ () => ({ code: 'rejected' as const }),
59
+ );
60
+
61
+ expect(result).toEqual({ ok: false, error });
62
+ });
47
63
  });
@@ -259,6 +259,7 @@ function executeReplayCapture(
259
259
  };
260
260
  const frameState = {
261
261
  compiledFrameGraph: graph,
262
+ compiledFrameGraphTopologyKey: 'synthetic-capture',
262
263
  frameNumber: 13,
263
264
  graphTargetCapture:
264
265
  captureKind === 'pass-replay'
@@ -374,7 +375,7 @@ function executeReplayCapture(
374
375
  describe('renderer successful-submit transaction', () => {
375
376
  it('publishes the renderer-created receipt object only after submit', async () => {
376
377
  const rendererHost = await constructRenderer(
377
- { getContext: () => null },
378
+ { width: 64, height: 64, getContext: () => null },
378
379
  { rhi },
379
380
  {
380
381
  shaderManifestUrl: `data:application/json,${encodeURIComponent(
@@ -382,6 +383,7 @@ describe('renderer successful-submit transaction', () => {
382
383
  )}`,
383
384
  },
384
385
  );
386
+ expect((await rendererHost.initialization).ok).toBe(true);
385
387
  const renderer = exposeRenderer(rendererHost);
386
388
  const events: Array<
387
389
  Extract<import('../render-contract').RendererEvent, { kind: 'frame-submitted' }>
@@ -398,7 +400,7 @@ describe('renderer successful-submit transaction', () => {
398
400
  camera: { lease: attached.value },
399
401
  environment: { lease: attached.value },
400
402
  });
401
- expect(frame.ok).toBe(true);
403
+ expect(frame.ok, frame.ok ? '' : JSON.stringify(frame.error)).toBe(true);
402
404
  if (!frame.ok) return;
403
405
  expect(events).toHaveLength(1);
404
406
  expect(events[0]?.receipt).toBe(frame.value);
@@ -416,7 +418,7 @@ describe('renderer successful-submit transaction', () => {
416
418
 
417
419
  it('fail-closes an all-domain request without an admitted LUT producer', async () => {
418
420
  const renderer = await constructRenderer(
419
- { getContext: () => null },
421
+ { width: 64, height: 64, getContext: () => null },
420
422
  { rhi },
421
423
  {
422
424
  shaderManifestUrl: `data:application/json,${encodeURIComponent(
@@ -424,6 +426,7 @@ describe('renderer successful-submit transaction', () => {
424
426
  )}`,
425
427
  },
426
428
  );
429
+ expect((await renderer.initialization).ok).toBe(true);
427
430
  const world = new World();
428
431
  const attached = renderer.attach(world);
429
432
  expect(attached.ok).toBe(true);
@@ -433,7 +436,7 @@ describe('renderer successful-submit transaction', () => {
433
436
  camera: { lease: attached.value },
434
437
  environment: { lease: attached.value },
435
438
  });
436
- expect(frame.ok).toBe(true);
439
+ expect(frame.ok, frame.ok ? '' : JSON.stringify(frame.error)).toBe(true);
437
440
  if (!frame.ok || frame.value === undefined) return;
438
441
  expect(frame.value.graphGeneration).toBeTypeOf('number');
439
442
  expect(frame.value.backendId).toBe('null');
@@ -477,8 +480,18 @@ describe('renderer successful-submit transaction', () => {
477
480
  JSON.stringify({ schemaVersion: '1.0.0', entries: [] }),
478
481
  )}`,
479
482
  };
480
- const firstRenderer = await constructRenderer({ getContext: () => null }, { rhi }, options);
481
- const secondRenderer = await constructRenderer({ getContext: () => null }, { rhi }, options);
483
+ const firstRenderer = await constructRenderer(
484
+ { width: 64, height: 64, getContext: () => null },
485
+ { rhi },
486
+ options,
487
+ );
488
+ const secondRenderer = await constructRenderer(
489
+ { width: 64, height: 64, getContext: () => null },
490
+ { rhi },
491
+ options,
492
+ );
493
+ expect((await firstRenderer.initialization).ok).toBe(true);
494
+ expect((await secondRenderer.initialization).ok).toBe(true);
482
495
  const world = new World();
483
496
  const attached = firstRenderer.attach(world);
484
497
  expect(attached.ok).toBe(true);
@@ -488,7 +501,7 @@ describe('renderer successful-submit transaction', () => {
488
501
  camera: { lease: attached.value },
489
502
  environment: { lease: attached.value },
490
503
  });
491
- expect(frame.ok).toBe(true);
504
+ expect(frame.ok, frame.ok ? '' : JSON.stringify(frame.error)).toBe(true);
492
505
  if (!frame.ok || frame.value === undefined) return;
493
506
  expect(frame.value.backendId).toBe('null');
494
507
  const crossRenderer = await secondRenderer.observe(frame.value, { include: ['timings'] });
@@ -573,7 +586,7 @@ describe('renderer successful-submit transaction', () => {
573
586
 
574
587
  it('keeps real Renderer observation requests isolated across receipts', async () => {
575
588
  const renderer = await constructRenderer(
576
- { getContext: () => null },
589
+ { width: 64, height: 64, getContext: () => null },
577
590
  { rhi },
578
591
  {
579
592
  shaderManifestUrl: `data:application/json,${encodeURIComponent(
@@ -581,6 +594,7 @@ describe('renderer successful-submit transaction', () => {
581
594
  )}`,
582
595
  },
583
596
  );
597
+ expect((await renderer.initialization).ok).toBe(true);
584
598
  const world = new World();
585
599
  const attached = renderer.attach(world);
586
600
  expect(attached.ok).toBe(true);
@@ -595,8 +609,8 @@ describe('renderer successful-submit transaction', () => {
595
609
  camera: { lease: attached.value },
596
610
  environment: { lease: attached.value },
597
611
  });
598
- expect(first.ok).toBe(true);
599
- expect(second.ok).toBe(true);
612
+ expect(first.ok, first.ok ? '' : JSON.stringify(first.error)).toBe(true);
613
+ expect(second.ok, second.ok ? '' : JSON.stringify(second.error)).toBe(true);
600
614
  if (!first.ok || !second.ok || first.value === undefined || second.value === undefined) return;
601
615
  const firstPending = renderer.observe(first.value, {
602
616
  include: ['timings', 'linear-hdr', 'linear-ldr', 'final-srgb'],
@@ -1110,6 +1124,7 @@ describe('renderer successful-submit transaction', () => {
1110
1124
  expect(compiled.ok).toBe(true);
1111
1125
  if (!compiled.ok) return;
1112
1126
  frameState.compiledFrameGraph = compiled.value;
1127
+ frameState.compiledFrameGraphTopologyKey = 'temporal-readiness-probe';
1113
1128
  const submits = vi.spyOn(device.queue, 'submit');
1114
1129
  const errors = new RhiErrorListenerRegistry();
1115
1130
  const result = executeCompiledFrameGraph(
@@ -1183,6 +1198,7 @@ describe('renderer successful-submit transaction', () => {
1183
1198
  getTemporalParamsBuffer(candidate);
1184
1199
  const graph = await buildTemporalResolveGraph(device);
1185
1200
  frameState.compiledFrameGraph = graph;
1201
+ frameState.compiledFrameGraphTopologyKey = 'temporal-resolve';
1186
1202
 
1187
1203
  const failure = new RhiError({
1188
1204
  code: 'webgpu-runtime-error',
@@ -0,0 +1,123 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { inspectResourceClassSplits } from '../gpu-driven/batch-topology';
3
+ import {
4
+ combineGpuResourceAllocationInspections,
5
+ GpuResourceAllocationLedger,
6
+ } from '../gpu-driven/resource-allocation';
7
+
8
+ describe('GPU resource allocation ownership', () => {
9
+ it('keeps replacement coexistence through fence retirement and release', () => {
10
+ const ledger = new GpuResourceAllocationLedger();
11
+ const first = ledger.allocate(64);
12
+ const second = ledger.allocate(128);
13
+
14
+ expect(ledger.inspect()).toMatchObject({
15
+ liveBytes: 192,
16
+ pendingRetirementBytes: 0,
17
+ peakBytes: 192,
18
+ });
19
+ ledger.retire(first);
20
+ expect(ledger.inspect()).toMatchObject({
21
+ liveBytes: 128,
22
+ pendingRetirementBytes: 64,
23
+ peakBytes: 192,
24
+ });
25
+ ledger.release(first);
26
+ expect(ledger.inspect()).toMatchObject({
27
+ liveBytes: 128,
28
+ pendingRetirementBytes: 0,
29
+ retiredBytes: 64,
30
+ });
31
+ ledger.release(second);
32
+ expect(ledger.inspect()).toMatchObject({
33
+ liveBytes: 0,
34
+ pendingRetirementBytes: 0,
35
+ retiredBytes: 192,
36
+ });
37
+ });
38
+
39
+ it('records failed allocation rollback without leaving live bytes', () => {
40
+ const ledger = new GpuResourceAllocationLedger();
41
+ const token = ledger.allocate(256);
42
+ ledger.rollback(token);
43
+ expect(ledger.inspect()).toMatchObject({
44
+ liveBytes: 0,
45
+ failedAllocationRollbacks: 1,
46
+ failedAllocationRollbackBytes: 256,
47
+ peakBytes: 256,
48
+ });
49
+ });
50
+
51
+ it('attributes only resourceIdentity changes as resource-class splits', () => {
52
+ const base = {
53
+ generation: 0,
54
+ key: {
55
+ assetHandle: 1,
56
+ drawKind: 'indexed' as const,
57
+ first: 0,
58
+ count: 3,
59
+ baseVertex: 0,
60
+ materialSlot: 0,
61
+ topology: 'triangle-list' as const,
62
+ pipelineClass: 'pbr',
63
+ materialResourceClass: 'water-a',
64
+ resourceIdentity: 'water-a',
65
+ },
66
+ candidates: [],
67
+ visibleBase: 0,
68
+ visibleCapacity: 0,
69
+ indirectOffset: 0,
70
+ };
71
+ const sameClass = { ...base, batchId: 0 };
72
+ const secondRange = {
73
+ ...base,
74
+ batchId: 1,
75
+ key: { ...base.key, first: 3, count: 6 },
76
+ };
77
+ expect(inspectResourceClassSplits({ batches: [sameClass, secondRange] })).toMatchObject({
78
+ resourceClassCount: 1,
79
+ resourceClassSplitReasons: [],
80
+ });
81
+ const changedClass = {
82
+ ...secondRange,
83
+ key: { ...secondRange.key, resourceIdentity: 'water-b' },
84
+ };
85
+ expect(inspectResourceClassSplits({ batches: [sameClass, changedClass] })).toMatchObject({
86
+ resourceClassCount: 2,
87
+ resourceClassSplitReasons: ['resource-class:water-a', 'resource-class:water-b'],
88
+ });
89
+ });
90
+
91
+ it('combines owner facts without claiming physical residency', () => {
92
+ const ledger = new GpuResourceAllocationLedger();
93
+ ledger.allocate(32);
94
+ const combined = combineGpuResourceAllocationInspections([ledger.inspect()]);
95
+ expect(combined).toMatchObject({
96
+ unit: 'engine-allocation-bytes',
97
+ physicalResidency: 'unknown',
98
+ liveBytes: 32,
99
+ });
100
+ });
101
+
102
+ it('does not add historical peaks from owners with no simultaneous occupancy', () => {
103
+ const first = new GpuResourceAllocationLedger();
104
+ const firstToken = first.allocate(64);
105
+ first.retire(firstToken);
106
+ first.release(firstToken);
107
+
108
+ const second = new GpuResourceAllocationLedger();
109
+ const secondToken = second.allocate(128);
110
+ second.retire(secondToken);
111
+ second.release(secondToken);
112
+
113
+ expect(
114
+ combineGpuResourceAllocationInspections([first.inspect(), second.inspect()]),
115
+ ).toMatchObject({
116
+ liveBytes: 0,
117
+ pendingRetirementBytes: 0,
118
+ // The owner-local peaks are historical and happened in separate
119
+ // replacement windows; their sum is not an aggregate high-water mark.
120
+ peakBytes: 128,
121
+ });
122
+ });
123
+ });