@forgeax/engine-render 0.1.28 → 0.1.30

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 (768) hide show
  1. package/README.md +856 -126
  2. package/dist/assembly/atmosphere-shader-prewarm.d.ts +6 -0
  3. package/dist/assembly/atmosphere-shader-prewarm.d.ts.map +1 -0
  4. package/dist/assembly/device-feature-admission.d.ts +4 -3
  5. package/dist/assembly/device-feature-admission.d.ts.map +1 -1
  6. package/dist/assembly/dynamic-geometry-host.d.ts +27 -0
  7. package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -1
  8. package/dist/assembly/dynamic-geometry-runtime.d.ts +20 -0
  9. package/dist/assembly/dynamic-geometry-runtime.d.ts.map +1 -0
  10. package/dist/assembly/factory.d.ts +3 -1
  11. package/dist/assembly/factory.d.ts.map +1 -1
  12. package/dist/assembly/gpu-driven-owner.d.ts +10 -0
  13. package/dist/assembly/gpu-driven-owner.d.ts.map +1 -0
  14. package/dist/assembly/host-contract.d.ts +14 -0
  15. package/dist/assembly/host-contract.d.ts.map +1 -1
  16. package/dist/assembly/material/assembly.d.ts +31 -1
  17. package/dist/assembly/material/assembly.d.ts.map +1 -1
  18. package/dist/assembly/material/pipeline-helpers.d.ts +24 -0
  19. package/dist/assembly/material/pipeline-helpers.d.ts.map +1 -0
  20. package/dist/assembly/material-shader-policy.d.ts +3 -1
  21. package/dist/assembly/material-shader-policy.d.ts.map +1 -1
  22. package/dist/assembly/recovery/device-loss-fanout.d.ts.map +1 -1
  23. package/dist/assembly/recovery/failure-location.d.ts +12 -0
  24. package/dist/assembly/recovery/failure-location.d.ts.map +1 -0
  25. package/dist/assembly/recovery/recovery-attempt.d.ts +1 -6
  26. package/dist/assembly/recovery/recovery-attempt.d.ts.map +1 -1
  27. package/dist/assembly/recovery/renderer-recover.d.ts +7 -4
  28. package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
  29. package/dist/assembly/renderer-facade.d.ts.map +1 -1
  30. package/dist/assembly/renderer-feature-inspection.d.ts +5 -0
  31. package/dist/assembly/renderer-feature-inspection.d.ts.map +1 -0
  32. package/dist/assembly/renderer-frame-transaction.d.ts +19 -0
  33. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
  34. package/dist/assembly/renderer-helpers.d.ts +3 -0
  35. package/dist/assembly/renderer-helpers.d.ts.map +1 -1
  36. package/dist/assembly/renderer-inspection.d.ts +4 -0
  37. package/dist/assembly/renderer-inspection.d.ts.map +1 -1
  38. package/dist/assembly/shader-prewarm-policy.d.ts +7 -1
  39. package/dist/assembly/shader-prewarm-policy.d.ts.map +1 -1
  40. package/dist/assembly/skin-palette-owner.d.ts +8 -0
  41. package/dist/assembly/skin-palette-owner.d.ts.map +1 -0
  42. package/dist/assembly/ssr-shader-prewarm.d.ts +6 -0
  43. package/dist/assembly/ssr-shader-prewarm.d.ts.map +1 -0
  44. package/dist/assembly/webgpu-device-loss.d.ts +15 -0
  45. package/dist/assembly/webgpu-device-loss.d.ts.map +1 -0
  46. package/dist/assembly/webgpu-pbr-ready.d.ts +38 -0
  47. package/dist/assembly/webgpu-pbr-ready.d.ts.map +1 -0
  48. package/dist/assembly/webgpu-ready-mipmap.d.ts +11 -0
  49. package/dist/assembly/webgpu-ready-mipmap.d.ts.map +1 -0
  50. package/dist/assembly/webgpu-ready.d.ts +7 -3
  51. package/dist/assembly/webgpu-ready.d.ts.map +1 -1
  52. package/dist/assembly/webgpu-renderer-bootstrap.d.ts +10 -0
  53. package/dist/assembly/webgpu-renderer-bootstrap.d.ts.map +1 -0
  54. package/dist/assembly/webgpu-renderer-contract.d.ts +62 -0
  55. package/dist/assembly/webgpu-renderer-contract.d.ts.map +1 -0
  56. package/dist/assembly/webgpu-renderer-guards.d.ts +9 -0
  57. package/dist/assembly/webgpu-renderer-guards.d.ts.map +1 -0
  58. package/dist/assembly/webgpu-renderer-observation.d.ts +6 -0
  59. package/dist/assembly/webgpu-renderer-observation.d.ts.map +1 -0
  60. package/dist/assembly/webgpu-renderer-recovery-failure.d.ts +12 -0
  61. package/dist/assembly/webgpu-renderer-recovery-failure.d.ts.map +1 -0
  62. package/dist/assembly/webgpu-renderer.d.ts +7 -141
  63. package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
  64. package/dist/assembly/webgpu-vertex-layouts.d.ts +28 -84
  65. package/dist/assembly/webgpu-vertex-layouts.d.ts.map +1 -1
  66. package/dist/authoring.mjs +2 -2
  67. package/dist/capture/scene-projection.d.ts +41 -0
  68. package/dist/capture/scene-projection.d.ts.map +1 -0
  69. package/dist/{chunk-J52NMQKR.mjs → chunk-7MQ3XBSP.mjs} +1098 -844
  70. package/dist/chunk-7MQ3XBSP.mjs.map +1 -0
  71. package/dist/{chunk-GF523LHF.mjs → chunk-BLXGONR2.mjs} +30 -12
  72. package/dist/chunk-BLXGONR2.mjs.map +1 -0
  73. package/dist/{chunk-VSL23LZE.mjs → chunk-C3DDSXYK.mjs} +1188 -463
  74. package/dist/chunk-C3DDSXYK.mjs.map +1 -0
  75. package/dist/{chunk-IQMKJLNU.mjs → chunk-FUUO4UND.mjs} +443 -30
  76. package/dist/chunk-FUUO4UND.mjs.map +1 -0
  77. package/dist/{chunk-J6KACNOH.mjs → chunk-JRBDO2KB.mjs} +617 -7
  78. package/dist/chunk-JRBDO2KB.mjs.map +1 -0
  79. package/dist/{chunk-GE3SDD72.mjs → chunk-MDQJPY3T.mjs} +20 -40
  80. package/dist/chunk-MDQJPY3T.mjs.map +1 -0
  81. package/dist/{chunk-MYJ5RPJO.mjs → chunk-NO4WZCAH.mjs} +3 -3
  82. package/dist/chunk-NO4WZCAH.mjs.map +1 -0
  83. package/dist/{chunk-RBDBZ5R7.mjs → chunk-PA5DRJNI.mjs} +2 -2
  84. package/dist/chunk-PA5DRJNI.mjs.map +1 -0
  85. package/dist/{chunk-MBU4ZVE7.mjs → chunk-PSEQ6QPH.mjs} +4655 -892
  86. package/dist/chunk-PSEQ6QPH.mjs.map +1 -0
  87. package/dist/{chunk-JAASCMXA.mjs → chunk-S5UE2T5P.mjs} +289 -41
  88. package/dist/chunk-S5UE2T5P.mjs.map +1 -0
  89. package/dist/components/camera.d.ts +62 -2
  90. package/dist/components/camera.d.ts.map +1 -1
  91. package/dist/components/directional-light.d.ts +2 -2
  92. package/dist/components/dynamic-resolution.d.ts +15 -0
  93. package/dist/components/dynamic-resolution.d.ts.map +1 -0
  94. package/dist/components/index.d.ts +2 -0
  95. package/dist/components/index.d.ts.map +1 -1
  96. package/dist/components/instances.d.ts +6 -20
  97. package/dist/components/instances.d.ts.map +1 -1
  98. package/dist/components/light-helpers.d.ts.map +1 -1
  99. package/dist/components/reflection-probe.d.ts +1 -0
  100. package/dist/components/reflection-probe.d.ts.map +1 -1
  101. package/dist/components/scene-instance.d.ts +2 -1
  102. package/dist/components/scene-instance.d.ts.map +1 -1
  103. package/dist/components/screen-space-reflection.d.ts +14 -0
  104. package/dist/components/screen-space-reflection.d.ts.map +1 -0
  105. package/dist/components/skylight.d.ts +4 -1
  106. package/dist/components/skylight.d.ts.map +1 -1
  107. package/dist/construct-renderer.mjs +14809 -7570
  108. package/dist/construct-renderer.mjs.map +1 -1
  109. package/dist/device/device-scope.d.ts +2 -0
  110. package/dist/device/device-scope.d.ts.map +1 -1
  111. package/dist/device/gpu-residency.d.ts +3 -14
  112. package/dist/device/gpu-residency.d.ts.map +1 -1
  113. package/dist/dynamic-geometry.d.ts.map +1 -1
  114. package/dist/environment/background.d.ts +7 -0
  115. package/dist/environment/background.d.ts.map +1 -0
  116. package/dist/environment/ibl.d.ts +11 -0
  117. package/dist/environment/ibl.d.ts.map +1 -0
  118. package/dist/environment/storage.d.ts +14 -0
  119. package/dist/environment/storage.d.ts.map +1 -0
  120. package/dist/errors/gpu-driven.d.ts +6 -3
  121. package/dist/errors/gpu-driven.d.ts.map +1 -1
  122. package/dist/errors/render.d.ts +41 -4
  123. package/dist/errors/render.d.ts.map +1 -1
  124. package/dist/extract/camera.d.ts.map +1 -1
  125. package/dist/extract/contracts.d.ts +7 -0
  126. package/dist/extract/contracts.d.ts.map +1 -1
  127. package/dist/extract/gpu-driven.d.ts +50 -3
  128. package/dist/extract/gpu-driven.d.ts.map +1 -1
  129. package/dist/features/host.d.ts +23 -1
  130. package/dist/features/host.d.ts.map +1 -1
  131. package/dist/features/noise-texture.d.ts +17 -0
  132. package/dist/features/noise-texture.d.ts.map +1 -0
  133. package/dist/features/plan.d.ts +83 -2
  134. package/dist/features/plan.d.ts.map +1 -1
  135. package/dist/features/prepared-gpu-work.d.ts +37 -4
  136. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  137. package/dist/features/prepared-graphics-store.d.ts.map +1 -1
  138. package/dist/features/prepared-graphics.d.ts +5 -0
  139. package/dist/features/prepared-graphics.d.ts.map +1 -1
  140. package/dist/features/render-graph-compute.d.ts +5 -3
  141. package/dist/features/render-graph-compute.d.ts.map +1 -1
  142. package/dist/features/render-graph-contribution.d.ts +11 -3
  143. package/dist/features/render-graph-contribution.d.ts.map +1 -1
  144. package/dist/features/render-graph-raster.d.ts +19 -3
  145. package/dist/features/render-graph-raster.d.ts.map +1 -1
  146. package/dist/features/types.d.ts +11 -0
  147. package/dist/features/types.d.ts.map +1 -1
  148. package/dist/fullscreen-post-process-pass.d.ts +2 -0
  149. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  150. package/dist/gpu-driven/batch-topology.d.ts +34 -1
  151. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  152. package/dist/gpu-driven/material-artifacts.d.ts +24 -0
  153. package/dist/gpu-driven/material-artifacts.d.ts.map +1 -0
  154. package/dist/gpu-driven/material-bindings.d.ts +7 -0
  155. package/dist/gpu-driven/material-bindings.d.ts.map +1 -0
  156. package/dist/gpu-driven/pbr-program.d.ts +10 -0
  157. package/dist/gpu-driven/pbr-program.d.ts.map +1 -0
  158. package/dist/gpu-driven/prepared-draw.d.ts +2 -0
  159. package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
  160. package/dist/gpu-driven/production-raster.d.ts +169 -27
  161. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  162. package/dist/gpu-driven/shadow-views.d.ts +126 -0
  163. package/dist/gpu-driven/shadow-views.d.ts.map +1 -0
  164. package/dist/gpu-driven/view-gpu.d.ts +18 -2
  165. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  166. package/dist/gpu-resource.d.ts +5 -2
  167. package/dist/gpu-resource.d.ts.map +1 -1
  168. package/dist/gpu-scene-schema.d.ts +2 -8
  169. package/dist/gpu-scene-schema.d.ts.map +1 -1
  170. package/dist/gpu-scene.d.ts +14 -0
  171. package/dist/gpu-scene.d.ts.map +1 -1
  172. package/dist/gpu-texture-usage.d.ts +1 -0
  173. package/dist/gpu-texture-usage.d.ts.map +1 -1
  174. package/dist/hdrp-buffers.d.ts +9 -0
  175. package/dist/hdrp-buffers.d.ts.map +1 -1
  176. package/dist/ibl/IblPipelineCache.d.ts +2 -0
  177. package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
  178. package/dist/ibl/frame-resources.d.ts +8 -0
  179. package/dist/ibl/frame-resources.d.ts.map +1 -0
  180. package/dist/ibl/skylight-bind-group.d.ts +3 -1
  181. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  182. package/dist/index.d.ts +87 -75
  183. package/dist/index.d.ts.map +1 -1
  184. package/dist/index.mjs +10 -8
  185. package/dist/index.mjs.map +1 -1
  186. package/dist/inspection-types.d.ts +180 -1
  187. package/dist/inspection-types.d.ts.map +1 -1
  188. package/dist/instances-derived-bounds.d.ts +11 -0
  189. package/dist/instances-derived-bounds.d.ts.map +1 -1
  190. package/dist/instances.d.ts +89 -44
  191. package/dist/instances.d.ts.map +1 -1
  192. package/dist/internal.d.ts +3 -0
  193. package/dist/internal.d.ts.map +1 -1
  194. package/dist/internal.mjs +117 -9
  195. package/dist/internal.mjs.map +1 -1
  196. package/dist/lifecycle.d.ts +2 -1
  197. package/dist/lifecycle.d.ts.map +1 -1
  198. package/dist/material-row.d.ts +15 -0
  199. package/dist/material-row.d.ts.map +1 -0
  200. package/dist/materials.d.ts +15 -0
  201. package/dist/materials.d.ts.map +1 -1
  202. package/dist/pbr-pipeline.d.ts +23 -5
  203. package/dist/pbr-pipeline.d.ts.map +1 -1
  204. package/dist/pipeline/render-extent.d.ts +51 -0
  205. package/dist/pipeline/render-extent.d.ts.map +1 -0
  206. package/dist/pipeline/standard-build-context.d.ts +7 -0
  207. package/dist/pipeline/standard-build-context.d.ts.map +1 -0
  208. package/dist/pipeline/standard-forward-lane.d.ts +3 -2
  209. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  210. package/dist/pipeline/standard-output/auto-exposure/capability.d.ts +12 -0
  211. package/dist/pipeline/standard-output/auto-exposure/capability.d.ts.map +1 -0
  212. package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts +70 -0
  213. package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts.map +1 -0
  214. package/dist/pipeline/standard-output/auto-exposure/graph.d.ts +75 -0
  215. package/dist/pipeline/standard-output/auto-exposure/graph.d.ts.map +1 -0
  216. package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts +111 -0
  217. package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts.map +1 -0
  218. package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts +16 -0
  219. package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts.map +1 -0
  220. package/dist/pipeline/standard-output/auto-exposure/preset.d.ts +14 -0
  221. package/dist/pipeline/standard-output/auto-exposure/preset.d.ts.map +1 -0
  222. package/dist/pipeline/standard-output/auto-exposure/state.d.ts +46 -0
  223. package/dist/pipeline/standard-output/auto-exposure/state.d.ts.map +1 -0
  224. package/dist/pipeline/standard-output/color-transform.d.ts +27 -0
  225. package/dist/pipeline/standard-output/color-transform.d.ts.map +1 -0
  226. package/dist/pipeline/standard-output/graph.d.ts +15 -0
  227. package/dist/pipeline/standard-output/graph.d.ts.map +1 -0
  228. package/dist/pipeline/standard-output/lut-admission.d.ts +29 -0
  229. package/dist/pipeline/standard-output/lut-admission.d.ts.map +1 -0
  230. package/dist/pipeline/standard-output/lut-gpu.d.ts +48 -0
  231. package/dist/pipeline/standard-output/lut-gpu.d.ts.map +1 -0
  232. package/dist/pipeline/standard-output/lut-state.d.ts +68 -0
  233. package/dist/pipeline/standard-output/lut-state.d.ts.map +1 -0
  234. package/dist/pipeline/standard-output/resources.d.ts +10 -0
  235. package/dist/pipeline/standard-output/resources.d.ts.map +1 -0
  236. package/dist/pipeline/standard-output/types.d.ts +39 -0
  237. package/dist/pipeline/standard-output/types.d.ts.map +1 -0
  238. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  239. package/dist/pipeline/standard-post.d.ts +2 -2
  240. package/dist/pipeline/standard-post.d.ts.map +1 -1
  241. package/dist/pipeline/standard-profile.d.ts +2 -1
  242. package/dist/pipeline/standard-profile.d.ts.map +1 -1
  243. package/dist/pipeline-builder.d.ts +5 -2
  244. package/dist/pipeline-builder.d.ts.map +1 -1
  245. package/dist/pipeline-spec-types.d.ts +4 -0
  246. package/dist/pipeline-spec-types.d.ts.map +1 -1
  247. package/dist/pipeline-spec.d.ts +1 -9
  248. package/dist/pipeline-spec.d.ts.map +1 -1
  249. package/dist/plugin.d.ts.map +1 -1
  250. package/dist/points-lines/standard-owner.d.ts +1 -1
  251. package/dist/points-lines/standard-owner.d.ts.map +1 -1
  252. package/dist/post-process-errors.d.ts +9 -2
  253. package/dist/post-process-errors.d.ts.map +1 -1
  254. package/dist/prepare/extended-lighting/resources.d.ts +3 -3
  255. package/dist/prepare/prepared-graphics-resolver.d.ts +6 -1
  256. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
  257. package/dist/record/dynamic-geometry-consumption.d.ts +15 -0
  258. package/dist/record/dynamic-geometry-consumption.d.ts.map +1 -0
  259. package/dist/record/frame-lighting.d.ts +3 -3
  260. package/dist/record/frame-lighting.d.ts.map +1 -1
  261. package/dist/record/frame-snapshot.d.ts +109 -13
  262. package/dist/record/frame-snapshot.d.ts.map +1 -1
  263. package/dist/record/frame-targets.d.ts.map +1 -1
  264. package/dist/record/frame.d.ts +41 -5
  265. package/dist/record/frame.d.ts.map +1 -1
  266. package/dist/record/main-pass-geometry.d.ts +13 -9
  267. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  268. package/dist/record/main-pass-material.d.ts +43 -3
  269. package/dist/record/main-pass-material.d.ts.map +1 -1
  270. package/dist/record/main-pass-sprite-draws.d.ts +2 -10
  271. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  272. package/dist/record/main-pass.d.ts +14 -2
  273. package/dist/record/main-pass.d.ts.map +1 -1
  274. package/dist/record/mesh-ssbo.d.ts +15 -6
  275. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  276. package/dist/record/prepared-material-bindings.d.ts +19 -0
  277. package/dist/record/prepared-material-bindings.d.ts.map +1 -0
  278. package/dist/record/recovery-pipeline.d.ts +1 -0
  279. package/dist/record/recovery-pipeline.d.ts.map +1 -1
  280. package/dist/record/render-context.d.ts +101 -22
  281. package/dist/record/render-context.d.ts.map +1 -1
  282. package/dist/record/shadow-pass.d.ts +62 -7
  283. package/dist/record/shadow-pass.d.ts.map +1 -1
  284. package/dist/record/skybox-post-pass.d.ts +1 -1
  285. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  286. package/dist/record/typed-frame-graph.d.ts +39 -8
  287. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  288. package/dist/record/view-ubo.d.ts +1 -0
  289. package/dist/record/view-ubo.d.ts.map +1 -1
  290. package/dist/recovery/render-system-candidate.d.ts +10 -2
  291. package/dist/recovery/render-system-candidate.d.ts.map +1 -1
  292. package/dist/recovery/render-system-roots.d.ts +11 -0
  293. package/dist/recovery/render-system-roots.d.ts.map +1 -0
  294. package/dist/recovery/types.d.ts +76 -0
  295. package/dist/recovery/types.d.ts.map +1 -0
  296. package/dist/reflection/background.d.ts +14 -0
  297. package/dist/reflection/background.d.ts.map +1 -0
  298. package/dist/reflection/filter.d.ts.map +1 -1
  299. package/dist/reflection/projection.d.ts +1 -0
  300. package/dist/reflection/projection.d.ts.map +1 -1
  301. package/dist/reflection/record-owner.d.ts +4 -4
  302. package/dist/reflection/record-owner.d.ts.map +1 -1
  303. package/dist/render-contract.d.ts +211 -53
  304. package/dist/render-contract.d.ts.map +1 -1
  305. package/dist/render-graph-primitives.d.ts +1 -0
  306. package/dist/render-graph-primitives.d.ts.map +1 -1
  307. package/dist/render-pipeline.d.ts +81 -6
  308. package/dist/render-pipeline.d.ts.map +1 -1
  309. package/dist/render-system-extract-tail.d.ts +15 -6
  310. package/dist/render-system-extract-tail.d.ts.map +1 -1
  311. package/dist/render-system-extract.d.ts +128 -41
  312. package/dist/render-system-extract.d.ts.map +1 -1
  313. package/dist/render-system-projections.d.ts +22 -0
  314. package/dist/render-system-projections.d.ts.map +1 -0
  315. package/dist/render-system.d.ts +27 -77
  316. package/dist/render-system.d.ts.map +1 -1
  317. package/dist/scene/render-scene-types.d.ts +14 -7
  318. package/dist/scene/render-scene-types.d.ts.map +1 -1
  319. package/dist/scene/render-scene.d.ts +31 -11
  320. package/dist/scene/render-scene.d.ts.map +1 -1
  321. package/dist/scene/shadow-visibility.d.ts +5 -0
  322. package/dist/scene/shadow-visibility.d.ts.map +1 -0
  323. package/dist/ssao-config.d.ts +8 -6
  324. package/dist/ssao-config.d.ts.map +1 -1
  325. package/dist/ssr/admission.d.ts +70 -1
  326. package/dist/ssr/admission.d.ts.map +1 -1
  327. package/dist/ssr/compose.d.ts +13 -0
  328. package/dist/ssr/compose.d.ts.map +1 -0
  329. package/dist/ssr/errors.d.ts +35 -0
  330. package/dist/ssr/errors.d.ts.map +1 -1
  331. package/dist/ssr/graph.d.ts +60 -0
  332. package/dist/ssr/graph.d.ts.map +1 -0
  333. package/dist/ssr/history.d.ts +97 -0
  334. package/dist/ssr/history.d.ts.map +1 -0
  335. package/dist/ssr/hiz.d.ts +37 -0
  336. package/dist/ssr/hiz.d.ts.map +1 -0
  337. package/dist/ssr/inspection.d.ts +42 -0
  338. package/dist/ssr/inspection.d.ts.map +1 -0
  339. package/dist/ssr/resources.d.ts +58 -0
  340. package/dist/ssr/resources.d.ts.map +1 -0
  341. package/dist/ssr/temporal.d.ts +38 -0
  342. package/dist/ssr/temporal.d.ts.map +1 -0
  343. package/dist/systems/skin-palette-allocator.d.ts +32 -10
  344. package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
  345. package/dist/systems/skin-palette-types.d.ts +15 -0
  346. package/dist/systems/skin-palette-types.d.ts.map +1 -1
  347. package/dist/systems/transparent-dispatch.d.ts +9 -0
  348. package/dist/systems/transparent-dispatch.d.ts.map +1 -0
  349. package/dist/targets/material-source.d.ts +7 -0
  350. package/dist/targets/material-source.d.ts.map +1 -1
  351. package/dist/temporal/frame-coordinator.d.ts +7 -0
  352. package/dist/temporal/frame-coordinator.d.ts.map +1 -1
  353. package/dist/temporal/gpu.d.ts +8 -0
  354. package/dist/temporal/gpu.d.ts.map +1 -1
  355. package/dist/temporal/history.d.ts.map +1 -1
  356. package/dist/temporal/index.mjs +6 -6
  357. package/dist/temporal/inspection.d.ts.map +1 -1
  358. package/dist/temporal/standard-scene-data.d.ts +4 -2
  359. package/dist/temporal/standard-scene-data.d.ts.map +1 -1
  360. package/dist/temporal/target-coverage-attachment.d.ts +15 -0
  361. package/dist/temporal/target-coverage-attachment.d.ts.map +1 -0
  362. package/dist/temporal/temporal-view.d.ts +6 -0
  363. package/dist/temporal/temporal-view.d.ts.map +1 -1
  364. package/dist/temporal/view.d.ts +6 -0
  365. package/dist/temporal/view.d.ts.map +1 -1
  366. package/dist/typed-render-graph-primitives.d.ts +41 -1
  367. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  368. package/dist/typed-shadow-passes.d.ts +3 -1
  369. package/dist/typed-shadow-passes.d.ts.map +1 -1
  370. package/dist/volume/component.d.ts +1 -0
  371. package/dist/volume/component.d.ts.map +1 -1
  372. package/dist/volume/temporal.d.ts +6 -0
  373. package/dist/volume/temporal.d.ts.map +1 -1
  374. package/package.json +21 -20
  375. package/src/__tests__/auto-exposure-gpu-evidence.ts +291 -0
  376. package/src/__tests__/auto-exposure-inspection.unit.test.ts +80 -0
  377. package/src/__tests__/auto-exposure-transaction.integration.test.ts +99 -0
  378. package/src/__tests__/auto-exposure.browser.test.ts +33 -0
  379. package/src/__tests__/auto-exposure.dawn.test.ts +33 -0
  380. package/src/__tests__/capture-scene-projection.unit.test.ts +24 -0
  381. package/src/__tests__/detached-inspection.integration.test.ts +5 -0
  382. package/src/__tests__/device-feature-admission.unit.test.ts +15 -24
  383. package/src/__tests__/device-loss-fanout.unit.test.ts +43 -0
  384. package/src/__tests__/device-scope-lifecycle.unit.test.ts +18 -0
  385. package/src/__tests__/device-scope-stale-matrix.unit.test.ts +18 -0
  386. package/src/__tests__/docs-gate-green.unit.test.ts +3 -3
  387. package/src/__tests__/dynamic-geometry-batch.unit.test.ts +157 -0
  388. package/src/__tests__/dynamic-geometry.unit.test.ts +36 -0
  389. package/src/__tests__/dynamic-resolution-plugin.integration.test.ts +81 -0
  390. package/src/__tests__/factory-contract.integration.test.ts +231 -9
  391. package/src/__tests__/fallback-row-stride-surface.unit.test.ts +19 -0
  392. package/src/__tests__/feature-depth-input.dawn.test.ts +121 -0
  393. package/src/__tests__/feature-noise.unit.test.ts +38 -0
  394. package/src/__tests__/fixtures/taa-resolve-pinned-baseline.wgsl +301 -0
  395. package/src/__tests__/frame-camera-selection.unit.test.ts +131 -0
  396. package/src/__tests__/frame-observation.contract.test.ts +21 -0
  397. package/src/__tests__/frame-plan-contract.unit.test.ts +24 -0
  398. package/src/__tests__/frame-targets.unit.test.ts +24 -0
  399. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +3 -0
  400. package/src/__tests__/gpu-driven-baseline.characterization.test.ts +79 -0
  401. package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +307 -7
  402. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +122 -142
  403. package/src/__tests__/gpu-driven-indirect-raster.browser.test.ts +10 -1
  404. package/src/__tests__/gpu-driven-lod-cache.unit.test.ts +261 -0
  405. package/src/__tests__/gpu-driven-mesh-world-identity.unit.test.ts +346 -0
  406. package/src/__tests__/gpu-driven-pbr.dawn.test.ts +1422 -0
  407. package/src/__tests__/gpu-driven-pbr.integration.test.ts +21 -0
  408. package/src/__tests__/gpu-driven-production-fixture.ts +96 -0
  409. package/src/__tests__/gpu-driven-production.integration.test.ts +1076 -106
  410. package/src/__tests__/gpu-driven-scaling.unit.test.ts +1 -3
  411. package/src/__tests__/gpu-driven-shadow-views.browser.test.ts +63 -0
  412. package/src/__tests__/gpu-driven-shadow-views.dawn.test.ts +294 -0
  413. package/src/__tests__/gpu-driven-shadow-views.integration.test.ts +97 -0
  414. package/src/__tests__/gpu-driven-shadow-views.unit.test.ts +168 -0
  415. package/src/__tests__/gpu-driven-skin-contract.test-d.ts +11 -0
  416. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +72 -20
  417. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +30 -9
  418. package/src/__tests__/gpu-driven-view.unit.test.ts +160 -52
  419. package/src/__tests__/gpu-pass-timing-browser-runner.ts +15 -0
  420. package/src/__tests__/gpu-pass-timing.browser.test.ts +20 -2
  421. package/src/__tests__/gpu-resource-scope.unit.test.ts +71 -0
  422. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +42 -0
  423. package/src/__tests__/gpu-scene-render-graph-gpu.ts +19 -5
  424. package/src/__tests__/gpu-scene.dawn.test.ts +40 -13
  425. package/src/__tests__/gpu-scene.unit.test.ts +613 -33
  426. package/src/__tests__/instances-culling.integration.test.ts +36 -10
  427. package/src/__tests__/instances-derived-bounds.unit.test.ts +54 -0
  428. package/src/__tests__/instances-store.unit.test.ts +242 -39
  429. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +6 -0
  430. package/src/__tests__/lighting-scene-roundtrip.integration.test.ts +13 -16
  431. package/src/__tests__/lut-lkg-transaction.integration.test.ts +122 -0
  432. package/src/__tests__/material-contract-inventory.unit.test.ts +5 -6
  433. package/src/__tests__/material-dispatch-shader-id.unit.test.ts +51 -0
  434. package/src/__tests__/material-lane-selection.unit.test.ts +60 -0
  435. package/src/__tests__/material-numeric-upload.unit.test.ts +53 -0
  436. package/src/__tests__/material-texture-handles.unit.test.ts +18 -0
  437. package/src/__tests__/material-texture-source.unit.test.ts +87 -0
  438. package/src/__tests__/materials-authoring-validation.unit.test.ts +41 -0
  439. package/src/__tests__/materials-standard-contract.unit.test.ts +57 -3
  440. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +4 -0
  441. package/src/__tests__/mesh-submission-lifetime.unit.test.ts +8 -0
  442. package/src/__tests__/morph-neutral-admission.unit.test.ts +19 -0
  443. package/src/__tests__/normal-fallback.dawn.test.ts +122 -0
  444. package/src/__tests__/particle-material-input-layout.unit.test.ts +104 -0
  445. package/src/__tests__/physical-clearcoat.integration.test.ts +42 -3
  446. package/src/__tests__/pipeline-texture-specialization.unit.test.ts +138 -0
  447. package/src/__tests__/point-shadow-inspection.unit.test.ts +2 -0
  448. package/src/__tests__/post-process-error-policy-owner.unit.test.ts +6 -5
  449. package/src/__tests__/prepared-gpu-driven-pbr-contract.test-d.ts +31 -0
  450. package/src/__tests__/prepared-gpu-driven-pbr-contract.unit.test.ts +39 -0
  451. package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +251 -9
  452. package/src/__tests__/prepared-graphics-capability.unit.test.ts +21 -0
  453. package/src/__tests__/prepared-graphics-pipeline-warmup.unit.test.ts +6 -2
  454. package/src/__tests__/profiler-phase-catalog.test.ts +5 -0
  455. package/src/__tests__/public-surface.test-d.ts +3 -0
  456. package/src/__tests__/recovery-candidate-prepare.contract.test.ts +30 -12
  457. package/src/__tests__/reflection-fallback-async-publication.unit.test.ts +171 -0
  458. package/src/__tests__/reflection-probe-authoring.unit.test.ts +12 -10
  459. package/src/__tests__/reflection-probe-box.dawn.test.ts +71 -0
  460. package/src/__tests__/reflection-probe-filter.unit.test.ts +9 -0
  461. package/src/__tests__/reflection-probe-orientation.dawn.test.ts +294 -0
  462. package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +5 -14
  463. package/src/__tests__/reflection-probe-updates.unit.test.ts +129 -0
  464. package/src/__tests__/render-error-code-owner.test-d.ts +7 -0
  465. package/src/__tests__/render-error-detail-ssot.test-d.ts +27 -1
  466. package/src/__tests__/render-error-exhaustive.test-d.ts +15 -0
  467. package/src/__tests__/render-extent.unit.test.ts +63 -0
  468. package/src/__tests__/render-feature-gpu-work.integration.test.ts +285 -2
  469. package/src/__tests__/render-feature-plan.unit.test.ts +245 -0
  470. package/src/__tests__/render-feature-shadow-order.unit.test.ts +228 -0
  471. package/src/__tests__/render-feature-zero-work.unit.test.ts +35 -1
  472. package/src/__tests__/render-graph-fallback.integration.test.ts +2 -2
  473. package/src/__tests__/render-owner-cohesion.unit.test.ts +55 -0
  474. package/src/__tests__/render-scene-mixed-updates.integration.test.ts +426 -0
  475. package/src/__tests__/render-scene-projection.unit.test.ts +915 -23
  476. package/src/__tests__/render-scene-resource-updates.integration.test.ts +214 -0
  477. package/src/__tests__/render-scene-skin-lifecycle.integration.test.ts +173 -0
  478. package/src/__tests__/render-scene-temporal-retry.unit.test.ts +133 -0
  479. package/src/__tests__/render-target-material-source.test-d.ts +27 -3
  480. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +233 -9
  481. package/src/__tests__/renderer-frame-transaction.integration.test.ts +923 -5
  482. package/src/__tests__/shader-manifest-fixture.ts +45 -0
  483. package/src/__tests__/skin-motion-regression.unit.test.ts +0 -33
  484. package/src/__tests__/skin-palette-persistent.integration.test.ts +28 -0
  485. package/src/__tests__/skin-palette-persistent.unit.test.ts +247 -0
  486. package/src/__tests__/skinned-shadow-caster.test.ts +125 -14
  487. package/src/__tests__/specular-environment-scale.dawn.test.ts +158 -0
  488. package/src/__tests__/ssao-config.unit.test.ts +7 -0
  489. package/src/__tests__/ssao-surface.dawn.test.ts +252 -0
  490. package/src/__tests__/ssr-admission-matrix.integration.test.ts +7 -1
  491. package/src/__tests__/ssr-confidence-compose.unit.test.ts +84 -0
  492. package/src/__tests__/ssr-coordinate-oracle.unit.test.ts +28 -0
  493. package/src/__tests__/ssr-cube-silhouette.dawn.test.ts +270 -0
  494. package/src/__tests__/ssr-format-probe-gating.integration.test.ts +82 -0
  495. package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +99 -0
  496. package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +116 -0
  497. package/src/__tests__/ssr-gpu-dispatch.ts +951 -0
  498. package/src/__tests__/ssr-graph-topology.unit.test.ts +104 -0
  499. package/src/__tests__/ssr-history-filter.dawn.test.ts +198 -0
  500. package/src/__tests__/ssr-hit-color.dawn.test.ts +273 -0
  501. package/src/__tests__/ssr-hiz-odd-reduction.dawn.test.ts +569 -0
  502. package/src/__tests__/ssr-hiz-rescue.dawn.test.ts +279 -0
  503. package/src/__tests__/ssr-hiz.browser.test.ts +150 -0
  504. package/src/__tests__/ssr-hiz.dawn.test.ts +150 -0
  505. package/src/__tests__/ssr-hiz.unit.test.ts +56 -0
  506. package/src/__tests__/ssr-inspection.unit.test.ts +105 -0
  507. package/src/__tests__/ssr-memory-budget.unit.test.ts +45 -0
  508. package/src/__tests__/ssr-performance-sequence-aggregation.unit.test.ts +15 -0
  509. package/src/__tests__/ssr-public-surface.test-d.ts +37 -0
  510. package/src/__tests__/ssr-receiver-coverage.dawn.test.ts +387 -0
  511. package/src/__tests__/ssr-reflection-mip-reducer.dawn.test.ts +309 -0
  512. package/src/__tests__/ssr-reprojection-probe.ts +90 -0
  513. package/src/__tests__/ssr-roughness-mip.dawn.test.ts +163 -0
  514. package/src/__tests__/ssr-shader-prewarm.unit.test.ts +59 -0
  515. package/src/__tests__/ssr-spatial.integration.test.ts +141 -0
  516. package/src/__tests__/ssr-stable-lattice.dawn.test.ts +475 -0
  517. package/src/__tests__/ssr-temporal-history.unit.test.ts +202 -0
  518. package/src/__tests__/ssr-texel-crossing.dawn.test.ts +448 -0
  519. package/src/__tests__/ssr-zero-work.integration.test.ts +87 -0
  520. package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +84 -12
  521. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +29 -0
  522. package/src/__tests__/standard-output-chain-contract.unit.test.ts +99 -0
  523. package/src/__tests__/standard-output-chain.integration.test.ts +73 -0
  524. package/src/__tests__/standard-output-gpu-evidence.ts +205 -0
  525. package/src/__tests__/standard-output.browser.test.ts +15 -0
  526. package/src/__tests__/standard-output.dawn.test.ts +15 -0
  527. package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +275 -0
  528. package/src/__tests__/standard-pipeline.integration.test.ts +320 -3
  529. package/src/__tests__/standard-profile-oracle.unit.test.ts +49 -0
  530. package/src/__tests__/standard-surface-lighting.unit.test.ts +41 -0
  531. package/src/__tests__/standard-texture-specialization.dawn.test.ts +141 -0
  532. package/src/__tests__/surface-adjacent-regressions.integration.test.ts +6 -3
  533. package/src/__tests__/taa-coverage-edge.dawn.test.ts +199 -0
  534. package/src/__tests__/taa-history-clipping.dawn.test.ts +328 -0
  535. package/src/__tests__/taa-neighborhood-equivalence.dawn.test.ts +782 -0
  536. package/src/__tests__/taa-stability-feedback.browser.test.ts +23 -0
  537. package/src/__tests__/taa-stability-feedback.dawn.test.ts +68 -0
  538. package/src/__tests__/taa-stability-feedback.ts +342 -0
  539. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +49 -7
  540. package/src/__tests__/temporal-reset-matrix.unit.test.ts +9 -0
  541. package/src/__tests__/temporal-transaction.integration.test.ts +28 -0
  542. package/src/__tests__/temporal-view.unit.test.ts +17 -0
  543. package/src/__tests__/texture-usage-surface.unit.test.ts +4 -2
  544. package/src/__tests__/transmission-prewarm.unit.test.ts +57 -0
  545. package/src/__tests__/typed-pipeline-topology.unit.test.ts +109 -4
  546. package/src/__tests__/typed-scene-pass-material-cache.integration.test.ts +126 -0
  547. package/src/__tests__/vertex-layouts-ssot.unit.test.ts +47 -0
  548. package/src/__tests__/visibility-extract.perf.test.ts +20 -8
  549. package/src/__tests__/visibility-instances.integration.test.ts +19 -7
  550. package/src/__tests__/visibility-producer-matrix.integration.test.ts +20 -9
  551. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +62 -13
  552. package/src/__tests__/volumetric-fog-topology.unit.test.ts +7 -7
  553. package/src/assembly/atmosphere-shader-prewarm.ts +39 -0
  554. package/src/assembly/device-feature-admission.ts +9 -4
  555. package/src/assembly/dynamic-geometry-host.ts +284 -163
  556. package/src/assembly/dynamic-geometry-runtime.ts +71 -0
  557. package/src/assembly/factory.ts +4 -0
  558. package/src/assembly/gpu-driven-owner.ts +29 -0
  559. package/src/assembly/host-contract.ts +19 -0
  560. package/src/assembly/material/assembly.ts +383 -1
  561. package/src/assembly/material/pipeline-helpers.ts +100 -0
  562. package/src/assembly/material-shader-policy.ts +110 -46
  563. package/src/assembly/recovery/device-loss-fanout.ts +5 -0
  564. package/src/assembly/recovery/failure-location.ts +62 -0
  565. package/src/assembly/recovery/recovery-attempt.ts +2 -29
  566. package/src/assembly/recovery/renderer-recover.ts +16 -17
  567. package/src/assembly/renderer-facade.ts +34 -1
  568. package/src/assembly/renderer-feature-inspection.ts +13 -0
  569. package/src/assembly/renderer-frame-transaction.ts +63 -0
  570. package/src/assembly/renderer-helpers.ts +26 -0
  571. package/src/assembly/renderer-inspection.ts +6 -0
  572. package/src/assembly/shader-prewarm-policy.ts +46 -1
  573. package/src/assembly/skin-palette-owner.ts +21 -0
  574. package/src/assembly/ssr-shader-prewarm.ts +41 -0
  575. package/src/assembly/webgpu-device-loss.ts +75 -0
  576. package/src/assembly/webgpu-pbr-ready.ts +232 -0
  577. package/src/assembly/webgpu-ready-mipmap.ts +26 -0
  578. package/src/assembly/webgpu-ready.ts +161 -131
  579. package/src/assembly/webgpu-renderer-bootstrap.ts +85 -0
  580. package/src/assembly/webgpu-renderer-contract.ts +69 -0
  581. package/src/assembly/webgpu-renderer-guards.ts +32 -0
  582. package/src/assembly/webgpu-renderer-observation.ts +43 -0
  583. package/src/assembly/webgpu-renderer-recovery-failure.ts +62 -0
  584. package/src/assembly/webgpu-renderer.ts +744 -730
  585. package/src/assembly/webgpu-vertex-layouts.ts +233 -87
  586. package/src/capture/scene-projection.ts +37 -0
  587. package/src/components/__tests__/camera-exposure.contract.unit.test.ts +153 -0
  588. package/src/components/__tests__/dynamic-resolution-schema.unit.test.ts +65 -0
  589. package/src/components/__tests__/light-radius.integration.test.ts +59 -0
  590. package/src/components/camera.ts +287 -7
  591. package/src/components/directional-light.ts +3 -3
  592. package/src/components/dynamic-resolution.ts +67 -0
  593. package/src/components/index.ts +2 -0
  594. package/src/components/instances.ts +45 -18
  595. package/src/components/light-helpers.ts +6 -1
  596. package/src/components/reflection-probe.ts +1 -0
  597. package/src/components/scene-instance.ts +2 -1
  598. package/src/components/screen-space-reflection.ts +21 -0
  599. package/src/components/skylight.ts +4 -1
  600. package/src/components/sprite-animation.ts +2 -2
  601. package/src/components/sprite-instances.ts +1 -1
  602. package/src/device/device-scope.ts +13 -7
  603. package/src/device/gpu-residency.ts +45 -42
  604. package/src/dynamic-geometry.ts +13 -8
  605. package/src/environment/background.ts +281 -0
  606. package/src/environment/ibl.ts +211 -0
  607. package/src/environment/storage.ts +63 -0
  608. package/src/errors/gpu-driven.ts +49 -8
  609. package/src/errors/render.ts +91 -3
  610. package/src/extract/camera.ts +37 -1
  611. package/src/extract/contracts.ts +10 -0
  612. package/src/extract/gpu-driven.ts +240 -10
  613. package/src/features/host.ts +237 -19
  614. package/src/features/noise-texture.ts +91 -0
  615. package/src/features/plan.ts +553 -24
  616. package/src/features/prepared-gpu-work.ts +631 -49
  617. package/src/features/prepared-graphics-store.ts +31 -0
  618. package/src/features/prepared-graphics.ts +5 -0
  619. package/src/features/render-graph-compute.ts +41 -8
  620. package/src/features/render-graph-contribution.ts +141 -3
  621. package/src/features/render-graph-raster.ts +143 -30
  622. package/src/features/types.ts +11 -0
  623. package/src/fullscreen-post-process-pass.ts +3 -0
  624. package/src/gpu-driven/batch-topology.ts +452 -108
  625. package/src/gpu-driven/material-artifacts.ts +179 -0
  626. package/src/gpu-driven/material-bindings.ts +41 -0
  627. package/src/gpu-driven/pbr-program.ts +31 -0
  628. package/src/gpu-driven/prepared-draw.ts +42 -6
  629. package/src/gpu-driven/production-raster.ts +2806 -716
  630. package/src/gpu-driven/shadow-views.ts +539 -0
  631. package/src/gpu-driven/view-gpu.ts +188 -41
  632. package/src/gpu-resource.ts +21 -2
  633. package/src/gpu-scene-schema.ts +61 -11
  634. package/src/gpu-scene.ts +197 -99
  635. package/src/gpu-texture-usage.ts +1 -0
  636. package/src/hdrp-buffers.ts +141 -36
  637. package/src/ibl/IblPipelineCache.ts +5 -0
  638. package/src/ibl/frame-resources.ts +38 -0
  639. package/src/ibl/skylight-bind-group.ts +32 -21
  640. package/src/index.ts +194 -75
  641. package/src/inspection-types.ts +207 -1
  642. package/src/instances-derived-bounds.ts +258 -34
  643. package/src/instances.ts +459 -150
  644. package/src/internal.ts +22 -0
  645. package/src/lifecycle.ts +2 -0
  646. package/src/material-row.ts +194 -0
  647. package/src/materials.ts +44 -8
  648. package/src/pbr-pipeline.ts +172 -19
  649. package/src/pipeline/render-extent.ts +111 -0
  650. package/src/pipeline/standard-build-context.ts +7 -0
  651. package/src/pipeline/standard-forward-lane.ts +74 -29
  652. package/src/pipeline/standard-output/__tests__/lut-admission.unit.test.ts +103 -0
  653. package/src/pipeline/standard-output/auto-exposure/__tests__/capability.unit.test.ts +40 -0
  654. package/src/pipeline/standard-output/auto-exposure/__tests__/gpu.contract.unit.test.ts +125 -0
  655. package/src/pipeline/standard-output/auto-exposure/__tests__/graph.contract.unit.test.ts +94 -0
  656. package/src/pipeline/standard-output/auto-exposure/__tests__/oracle.test.ts +108 -0
  657. package/src/pipeline/standard-output/auto-exposure/__tests__/preset.test.ts +26 -0
  658. package/src/pipeline/standard-output/auto-exposure/capability.ts +38 -0
  659. package/src/pipeline/standard-output/auto-exposure/gpu.ts +567 -0
  660. package/src/pipeline/standard-output/auto-exposure/graph.ts +221 -0
  661. package/src/pipeline/standard-output/auto-exposure/inspection.ts +231 -0
  662. package/src/pipeline/standard-output/auto-exposure/oracle.ts +291 -0
  663. package/src/pipeline/standard-output/auto-exposure/preset.ts +28 -0
  664. package/src/pipeline/standard-output/auto-exposure/state.ts +156 -0
  665. package/src/pipeline/standard-output/color-transform.ts +124 -0
  666. package/src/pipeline/standard-output/graph.ts +139 -0
  667. package/src/pipeline/standard-output/lut-admission.ts +121 -0
  668. package/src/pipeline/standard-output/lut-gpu.ts +399 -0
  669. package/src/pipeline/standard-output/lut-state.ts +176 -0
  670. package/src/pipeline/standard-output/resources.ts +121 -0
  671. package/src/pipeline/standard-output/types.ts +58 -0
  672. package/src/pipeline/standard-pipeline.ts +232 -70
  673. package/src/pipeline/standard-post.ts +190 -27
  674. package/src/pipeline/standard-profile.ts +2 -1
  675. package/src/pipeline-builder.ts +28 -9
  676. package/src/pipeline-spec-types.ts +4 -0
  677. package/src/pipeline-spec.ts +37 -29
  678. package/src/plugin.ts +4 -0
  679. package/src/points-lines/standard-owner.ts +6 -14
  680. package/src/post-process-errors.ts +26 -18
  681. package/src/prepare/__tests__/extended-lighting-capability.unit.test.ts +2 -2
  682. package/src/prepare/extended-lighting/resources.ts +3 -3
  683. package/src/prepare/prepared-graphics-resolver.ts +9 -2
  684. package/src/record/__tests__/main-pass-geometry.unit.test.ts +68 -0
  685. package/src/record/__tests__/material-bg-cache.unit.test.ts +45 -0
  686. package/src/record/__tests__/material-slot-plan.unit.test.ts +57 -0
  687. package/src/record/__tests__/mesh-ssbo.unit.test.ts +40 -1
  688. package/src/record/__tests__/recovery-pipeline.unit.test.ts +20 -1
  689. package/src/record/__tests__/sprite-material-abi.unit.test.ts +41 -6
  690. package/src/record/__tests__/temporal-payload.unit.test.ts +2 -0
  691. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +45 -0
  692. package/src/record/__tests__/view-ubo-layout.unit.test.ts +5 -0
  693. package/src/record/dynamic-geometry-consumption.ts +59 -0
  694. package/src/record/frame-lighting.ts +15 -12
  695. package/src/record/frame-snapshot.ts +146 -34
  696. package/src/record/frame-targets.ts +9 -0
  697. package/src/record/frame.ts +838 -170
  698. package/src/record/main-pass-geometry.ts +209 -103
  699. package/src/record/main-pass-material.ts +157 -40
  700. package/src/record/main-pass-sprite-draws.ts +16 -107
  701. package/src/record/main-pass.ts +141 -12
  702. package/src/record/material-uniforms.ts +1 -1
  703. package/src/record/mesh-ssbo.ts +59 -15
  704. package/src/record/prepared-material-bindings.ts +238 -0
  705. package/src/record/recovery-pipeline.ts +69 -90
  706. package/src/record/render-context.ts +123 -24
  707. package/src/record/shadow-pass.ts +1389 -230
  708. package/src/record/skybox-post-pass.ts +14 -3
  709. package/src/record/typed-frame-graph.ts +1064 -47
  710. package/src/record/view-ubo.ts +12 -1
  711. package/src/recovery/render-system-candidate.ts +135 -68
  712. package/src/recovery/render-system-roots.ts +113 -0
  713. package/src/recovery/types.ts +77 -0
  714. package/src/reflection/background.ts +151 -0
  715. package/src/reflection/filter.ts +3 -0
  716. package/src/reflection/projection.ts +16 -6
  717. package/src/reflection/record-owner.ts +308 -140
  718. package/src/render-contract.ts +237 -49
  719. package/src/render-graph-primitives.ts +34 -5
  720. package/src/render-pipeline.ts +90 -2
  721. package/src/render-system-extract-tail.ts +431 -162
  722. package/src/render-system-extract.ts +478 -119
  723. package/src/render-system-projections.ts +241 -0
  724. package/src/render-system.ts +715 -828
  725. package/src/scene/render-scene-types.ts +13 -4
  726. package/src/scene/render-scene.ts +577 -355
  727. package/src/scene/shadow-visibility.ts +21 -0
  728. package/src/ssao-config.ts +25 -8
  729. package/src/ssr/admission.ts +380 -14
  730. package/src/ssr/compose.ts +144 -0
  731. package/src/ssr/errors.ts +48 -0
  732. package/src/ssr/graph.ts +797 -0
  733. package/src/ssr/history.ts +436 -0
  734. package/src/ssr/hiz.ts +124 -0
  735. package/src/ssr/inspection.ts +124 -0
  736. package/src/ssr/resources.ts +202 -0
  737. package/src/ssr/temporal.ts +164 -0
  738. package/src/systems/skin-palette-allocator.ts +495 -148
  739. package/src/systems/skin-palette-types.ts +17 -0
  740. package/src/systems/transparent-dispatch.ts +90 -0
  741. package/src/targets/material-source.ts +34 -0
  742. package/src/temporal/coverage.ts +1 -1
  743. package/src/temporal/frame-coordinator.ts +23 -2
  744. package/src/temporal/gpu.ts +79 -12
  745. package/src/temporal/history.ts +3 -1
  746. package/src/temporal/inspection.ts +2 -1
  747. package/src/temporal/standard-scene-data.ts +10 -2
  748. package/src/temporal/target-coverage-attachment.ts +72 -0
  749. package/src/temporal/temporal-view.ts +11 -2
  750. package/src/temporal/view.ts +12 -2
  751. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +219 -139
  752. package/src/typed-render-graph-primitives.ts +304 -74
  753. package/src/typed-shadow-passes.ts +122 -12
  754. package/src/volume/component.ts +1 -0
  755. package/src/volume/passes.ts +3 -3
  756. package/src/volume/temporal.ts +10 -0
  757. package/dist/chunk-GE3SDD72.mjs.map +0 -1
  758. package/dist/chunk-GF523LHF.mjs.map +0 -1
  759. package/dist/chunk-IQMKJLNU.mjs.map +0 -1
  760. package/dist/chunk-J52NMQKR.mjs.map +0 -1
  761. package/dist/chunk-J6KACNOH.mjs.map +0 -1
  762. package/dist/chunk-JAASCMXA.mjs.map +0 -1
  763. package/dist/chunk-MBU4ZVE7.mjs.map +0 -1
  764. package/dist/chunk-MYJ5RPJO.mjs.map +0 -1
  765. package/dist/chunk-RBDBZ5R7.mjs.map +0 -1
  766. package/dist/chunk-VSL23LZE.mjs.map +0 -1
  767. package/src/__tests__/instances-world-ownership.integration.test.ts +0 -62
  768. package/src/scene/__tests__/changed-block-summary.candidate.test.ts +0 -36
@@ -3,7 +3,7 @@
3
3
  // feat-20260609-learn-render-4-5-framebuffers-demo-offscreen-rt-an M1 / T-2
4
4
  // added 'fullscreen-input-not-found').
5
5
  //
6
- // Closed 7-member PostProcessErrorCode union + PostProcessError discriminated-union class.
6
+ // Closed PostProcessErrorCode union + PostProcessError discriminated-union class.
7
7
  // - 'post-process-already-registered' (programmer error) -> fullscreen effect registration THROWS a
8
8
  // PostProcessError, mirroring ShaderCatalog.installMaterialArtifact's Map.has -> throw
9
9
  // fail-fast (research Finding M2-4). A second register under the same id is a coding
@@ -38,7 +38,7 @@
38
38
  /**
39
39
  * Closed union of fullscreen post-process error codes.
40
40
  *
41
- * Exactly 7 members; AI users perform exhaustive `switch (err.code)` without a default
41
+ * AI users perform exhaustive `switch (err.code)` without a default
42
42
  * and TS guards completeness (AC-08).
43
43
  *
44
44
  * | code | channel | trigger |
@@ -134,21 +134,23 @@ export interface PostProcessParamsUpdateSizeMismatchDetail {
134
134
  * `detail` parameter to the variant payload at compile time.
135
135
  */
136
136
  export type PostProcessErrorDetailFor<C extends PostProcessErrorCode> =
137
- C extends 'post-process-already-registered'
138
- ? PostProcessPreviouslyRegisteredDetail
139
- : C extends 'post-process-not-found'
140
- ? PostProcessNotFoundDetail
141
- : C extends 'fullscreen-input-not-found'
142
- ? FullscreenInputNotFoundDetail
143
- : C extends 'ssao-radius-non-positive'
144
- ? SsaoRadiusNonPositiveDetail
145
- : C extends 'ssao-bias-negative'
146
- ? SsaoBiasNegativeDetail
147
- : C extends 'params-size-mismatch'
148
- ? PostProcessParamsSizeMismatchDetail
149
- : C extends 'params-update-size-mismatch'
150
- ? PostProcessParamsUpdateSizeMismatchDetail
151
- : never;
137
+ C extends 'ssao-parameter-invalid'
138
+ ? { readonly paramName: string; readonly value: unknown }
139
+ : C extends 'post-process-already-registered'
140
+ ? PostProcessPreviouslyRegisteredDetail
141
+ : C extends 'post-process-not-found'
142
+ ? PostProcessNotFoundDetail
143
+ : C extends 'fullscreen-input-not-found'
144
+ ? FullscreenInputNotFoundDetail
145
+ : C extends 'ssao-radius-non-positive'
146
+ ? SsaoRadiusNonPositiveDetail
147
+ : C extends 'ssao-bias-negative'
148
+ ? SsaoBiasNegativeDetail
149
+ : C extends 'params-size-mismatch'
150
+ ? PostProcessParamsSizeMismatchDetail
151
+ : C extends 'params-update-size-mismatch'
152
+ ? PostProcessParamsUpdateSizeMismatchDetail
153
+ : never;
152
154
 
153
155
  /**
154
156
  * Tagged union of `.detail` payloads. The variants are unique by structural fields
@@ -170,7 +172,8 @@ const POST_PROCESS_POLICY = {
170
172
  expected: 'typed fullscreen plan references a registered post-process id',
171
173
  hint: (detail) =>
172
174
  `no post-process is registered for id '${(detail as PostProcessNotFoundDetail).id}'. ` +
173
- `Register '${(detail as PostProcessNotFoundDetail).id}' with the feature host ({source, reads?}), ` +
175
+ 'For Engine-owned effects, rebuild the shader manifest with that Engine entry enabled. ' +
176
+ `For custom effects, register '${(detail as PostProcessNotFoundDetail).id}' with the feature host ({source, reads?}), ` +
174
177
  'then reference it from a typed fullscreen RenderFeaturePlan.',
175
178
  },
176
179
  'fullscreen-input-not-found': {
@@ -187,6 +190,11 @@ const POST_PROCESS_POLICY = {
187
190
  );
188
191
  },
189
192
  },
193
+ 'ssao-parameter-invalid': {
194
+ expected: 'finite non-negative SSAO intensity and low, medium, or high quality',
195
+ hint: () =>
196
+ 'Set ssao.intensity to a finite non-negative value and ssao.quality to low, medium, or high.',
197
+ },
190
198
  'ssao-radius-non-positive': {
191
199
  expected: 'SSAO radius must be > 0',
192
200
  hint: (detail) => {
@@ -12,7 +12,7 @@ const device = {
12
12
  samplerAliasing: true,
13
13
  } as RhiCaps,
14
14
  limits: {
15
- maxSampledTexturesPerShaderStage: 20,
15
+ maxSampledTexturesPerShaderStage: 21,
16
16
  maxTextureDimension2D: 4096,
17
17
  maxTextureArrayLayers: 32,
18
18
  maxUniformBuffersPerShaderStage: 12,
@@ -50,7 +50,7 @@ describe('extended lighting capability admission', () => {
50
50
  expect(deriveExtendedLightingCapability(limited)).toEqual({
51
51
  admitted: false,
52
52
  topology: 'extendedLighting',
53
- reason: 'maxSampledTexturesPerShaderStage 16 < 20',
53
+ reason: 'maxSampledTexturesPerShaderStage 16 < 21',
54
54
  });
55
55
  });
56
56
  });
@@ -19,13 +19,13 @@ export const COOKIE_SLICE_SIZE = 256;
19
19
  export const COOKIE_MATRIX_BYTES = 32 * 16 * Float32Array.BYTES_PER_ELEMENT;
20
20
  /**
21
21
  * Minimum per-stage sampled-texture limit for the shared PBR + extended-
22
- * lighting pipeline-layout topology. The current BGL closure reserves 18
23
- * sampled textures for the URP path and 20 for the HDRP/Probe path after the
22
+ * lighting pipeline-layout topology. The current BGL closure reserves 19
23
+ * sampled textures for the URP path and 21 for the HDRP/Probe path after the
24
24
  * material IBL and transmission injections; WebGPU validates this pipeline-
25
25
  * layout count even when a compiled shader variant does not read every
26
26
  * optional entry.
27
27
  */
28
- export const EXTENDED_LIGHTING_REQUIRED_SAMPLED_TEXTURES = 20;
28
+ export const EXTENDED_LIGHTING_REQUIRED_SAMPLED_TEXTURES = 21;
29
29
 
30
30
  /**
31
31
  * Keep shader-variant selection and resource admission on one capability fact.
@@ -44,6 +44,8 @@ export type PreparedGraphicsResolvedResource =
44
44
  readonly kind: 'pipeline';
45
45
  readonly reference: RenderFeaturePreparedRef;
46
46
  readonly handle: RenderPipeline;
47
+ /** Renderer-selected context; never authored by a RenderFeature. */
48
+ readonly standardLighting?: boolean;
47
49
  }
48
50
  | {
49
51
  readonly kind: 'bindings';
@@ -70,7 +72,10 @@ export interface PreparedGraphicsResolverInput {
70
72
  readonly lookup: (reference: RenderFeaturePreparedRef) => PreparedGraphicsItem | undefined;
71
73
  readonly resolvePipeline: (
72
74
  descriptor: PreparedGraphicsNormalizedDescriptor & { readonly kind: 'pipeline' },
73
- ) => Result<RenderPipeline, unknown>;
75
+ ) => Result<
76
+ RenderPipeline | { readonly handle: RenderPipeline; readonly standardLighting: boolean },
77
+ unknown
78
+ >;
74
79
  readonly resolveBindings: (
75
80
  descriptor: RenderFeatureBindingsDescriptor,
76
81
  pipeline: RenderPipeline,
@@ -304,7 +309,9 @@ export function createPreparedGraphicsResolver(
304
309
  const resource: PreparedGraphicsResolvedResource = {
305
310
  kind: 'pipeline',
306
311
  reference,
307
- handle: created.value,
312
+ ...('handle' in created.value
313
+ ? { handle: created.value.handle, standardLighting: created.value.standardLighting }
314
+ : { handle: created.value }),
308
315
  };
309
316
  resolved.set(reference, resource);
310
317
  return ok(resource);
@@ -1,7 +1,9 @@
1
1
  import { describe, expect, it } from 'vitest';
2
+ import type { DispatchEntry } from '../../render-system-extract';
2
3
  import {
3
4
  geometryRenderStateForPass,
4
5
  requestsStandardTransmissionVariant,
6
+ sameOpaqueTemporalDraw,
5
7
  } from '../main-pass-geometry';
6
8
 
7
9
  describe('geometry pass render state', () => {
@@ -70,3 +72,69 @@ describe('Standard transmission variant selection', () => {
70
72
  ).toBe(false);
71
73
  });
72
74
  });
75
+
76
+ describe('temporal projection of multipass materials', () => {
77
+ const forward: DispatchEntry = {
78
+ entityIndex: 0,
79
+ materialHandle: 1,
80
+ renderableIndex: 0,
81
+ passIndex: 0,
82
+ queue: 2000,
83
+ layer: 0,
84
+ tags: { LightMode: 'Forward' },
85
+ renderState: { cullMode: 'back' },
86
+ defines: undefined,
87
+ vertexEntry: 'vs_main',
88
+ fragmentEntry: 'fs_forward',
89
+ materialShaderId: 'forgeax::default-standard-pbr',
90
+ paramSnapshot: undefined,
91
+ };
92
+ const deferred = {
93
+ ...forward,
94
+ passIndex: 1,
95
+ tags: { LightMode: 'Deferred' },
96
+ fragmentEntry: 'fs_gbuffer',
97
+ };
98
+ it('projects identical opaque Forward and Deferred geometry only once', () => {
99
+ expect(sameOpaqueTemporalDraw(forward, deferred)).toBe(true);
100
+ const surface = {
101
+ ...forward,
102
+ materialShaderId: 'generated::surface',
103
+ tags: {
104
+ LightMode: 'Forward',
105
+ SurfaceKind: 'standard',
106
+ SurfaceModule: 'author::surface',
107
+ },
108
+ };
109
+ expect(
110
+ sameOpaqueTemporalDraw(surface, {
111
+ ...surface,
112
+ tags: { ...surface.tags, LightMode: 'Deferred' },
113
+ }),
114
+ ).toBe(true);
115
+ const fullCustom = { ...forward, materialShaderId: 'custom::full' };
116
+ expect(sameOpaqueTemporalDraw(fullCustom, fullCustom)).toBe(false);
117
+ });
118
+ it('preserves different shader, culling, stencil and blending semantics', () => {
119
+ expect(sameOpaqueTemporalDraw(forward, { ...deferred, materialShaderId: 'other' })).toBe(false);
120
+ expect(
121
+ sameOpaqueTemporalDraw(forward, { ...deferred, renderState: { cullMode: 'front' } }),
122
+ ).toBe(false);
123
+ expect(sameOpaqueTemporalDraw(forward, { ...deferred, stencilReference: 1 })).toBe(false);
124
+ const blended = {
125
+ ...forward,
126
+ renderState: {
127
+ blend: {
128
+ color: { srcFactor: 'src-alpha', dstFactor: 'one-minus-src-alpha' },
129
+ alpha: { srcFactor: 'one', dstFactor: 'one-minus-src-alpha' },
130
+ },
131
+ },
132
+ } as const;
133
+ expect(sameOpaqueTemporalDraw(blended, blended)).toBe(false);
134
+ const stencil = {
135
+ ...forward,
136
+ renderState: { stencil: { passOp: 'increment-clamp' } },
137
+ } as const;
138
+ expect(sameOpaqueTemporalDraw(stencil, stencil)).toBe(false);
139
+ });
140
+ });
@@ -34,6 +34,51 @@ describe('material bind-group assembly cache', () => {
34
34
  expect(
35
35
  isMaterialBgAssemblyCacheHit(cached, material, materialBgl, newBuffer, skylightResources, 7),
36
36
  ).toBe(false);
37
+ expect(
38
+ isMaterialBgAssemblyCacheHit(
39
+ cached,
40
+ material,
41
+ materialBgl,
42
+ oldBuffer,
43
+ { ...skylightResources, skylightPrefilterView: {} as TextureView },
44
+ 7,
45
+ ),
46
+ ).toBe(false);
47
+ const sceneCached = { ...cached, sceneMaterialBuffer: oldBuffer };
48
+ expect(
49
+ isMaterialBgAssemblyCacheHit(
50
+ sceneCached,
51
+ material,
52
+ materialBgl,
53
+ oldBuffer,
54
+ skylightResources,
55
+ 7,
56
+ undefined,
57
+ oldBuffer,
58
+ ),
59
+ ).toBe(true);
60
+ expect(
61
+ isMaterialBgAssemblyCacheHit(
62
+ sceneCached,
63
+ material,
64
+ materialBgl,
65
+ oldBuffer,
66
+ skylightResources,
67
+ 7,
68
+ undefined,
69
+ newBuffer,
70
+ ),
71
+ ).toBe(false);
72
+ expect(
73
+ isMaterialBgAssemblyCacheHit(
74
+ sceneCached,
75
+ material,
76
+ materialBgl,
77
+ oldBuffer,
78
+ skylightResources,
79
+ 7,
80
+ ),
81
+ ).toBe(false);
37
82
  expect(
38
83
  isMaterialBgAssemblyCacheHit(cached, material, materialBgl, oldBuffer, skylightResources, 8),
39
84
  ).toBe(false);
@@ -1,10 +1,35 @@
1
1
  import { describe, expect, it } from 'vitest';
2
2
  import {
3
+ buildDispatchPlan,
3
4
  buildMaterialSlotPlan,
4
5
  findRenderablePrefixForSlotCapacity,
5
6
  materialSlotCountForPrefix,
6
7
  } from '../frame';
7
8
 
9
+ function validatedRow(renderableIndex: number) {
10
+ return {
11
+ source: {
12
+ material: { materialShaderId: 'forgeax::default-unlit' },
13
+ materials: [{ materialShaderId: 'forgeax::default-unlit' }],
14
+ },
15
+ mesh: {},
16
+ renderableIndex,
17
+ renderState: undefined,
18
+ stencilReference: undefined,
19
+ } as never;
20
+ }
21
+
22
+ function ceilingInternals(slotCount: number) {
23
+ return {
24
+ growMeshSsbo: () => ({
25
+ ok: false as const,
26
+ code: 'mesh-ssbo-ceiling-reached' as const,
27
+ degradedToSlotCount: slotCount,
28
+ }),
29
+ meshSsboState: { slotCount },
30
+ } as never;
31
+ }
32
+
8
33
  describe('material slot plan', () => {
9
34
  it('interns repeated snapshot identities across renderables', () => {
10
35
  const a = {};
@@ -27,6 +52,15 @@ describe('material slot plan', () => {
27
52
  });
28
53
  });
29
54
 
55
+ it('separates per-object probe/pass bindings while interning the same resource class', () => {
56
+ const material = {};
57
+ expect(
58
+ buildMaterialSlotPlan([[material], [material], [material]], (_, owner) =>
59
+ owner === 1 ? 'probe:1' : 'probe:0',
60
+ ),
61
+ ).toEqual({ slotIndices: [[0], [1], [0]], slots: [material, material], slotOwners: [0, 1] });
62
+ });
63
+
30
64
  it('does not merge equal-looking snapshots with distinct identities', () => {
31
65
  expect(buildMaterialSlotPlan([[{}], [{}]])).toMatchObject({
32
66
  slotIndices: [[0], [1]],
@@ -41,4 +75,27 @@ describe('material slot plan', () => {
41
75
  expect(findRenderablePrefixForSlotCapacity(indices, 5)).toBe(3);
42
76
  expect(materialSlotCountForPrefix(indices, 3)).toBe(5);
43
77
  });
78
+
79
+ it('keeps retained shadow rows inside the ceiling when the primary view is empty', () => {
80
+ const shadowRows = [validatedRow(0), validatedRow(1), validatedRow(2)];
81
+ const plan = buildDispatchPlan(ceilingInternals(2), [], [], [], shadowRows);
82
+
83
+ expect(plan.validatedOrdered).toHaveLength(0);
84
+ expect(plan.shadowValidatedOrdered).toEqual(shadowRows.slice(0, 2));
85
+ expect(plan.validatedOrdered.length + plan.shadowValidatedOrdered.length).toBeLessThanOrEqual(
86
+ 2,
87
+ );
88
+ });
89
+
90
+ it('reserves the primary rows before retained shadow rows on a mixed ceiling', () => {
91
+ const primaryRows = [validatedRow(0), validatedRow(1)];
92
+ const shadowRows = [validatedRow(2), validatedRow(3)];
93
+ const plan = buildDispatchPlan(ceilingInternals(3), primaryRows, [], [], shadowRows);
94
+
95
+ expect(plan.validatedOrdered).toEqual(primaryRows);
96
+ expect(plan.shadowValidatedOrdered).toEqual(shadowRows.slice(0, 1));
97
+ expect(plan.validatedOrdered.length + plan.shadowValidatedOrdered.length).toBeLessThanOrEqual(
98
+ 3,
99
+ );
100
+ });
44
101
  });
@@ -1,5 +1,6 @@
1
+ import { err, ok } from '@forgeax/engine-types';
1
2
  import { describe, expect, it } from 'vitest';
2
- import { getOrCreateFromChain } from '../mesh-ssbo';
3
+ import { getOrCreateFromChain, getOrCreateFromChainResult } from '../mesh-ssbo';
3
4
 
4
5
  describe('mesh bind-group cache chains', () => {
5
6
  it('keeps variable-depth material resource chains isolated', () => {
@@ -35,4 +36,42 @@ describe('mesh bind-group cache chains', () => {
35
36
  expect(long).not.toBe(short);
36
37
  expect(counts.createBindGroup).toBe(2);
37
38
  });
39
+
40
+ it('propagates bind-group creation failures without poisoning the cache', () => {
41
+ const root = new WeakMap<object, unknown>();
42
+ const resource = {};
43
+ const counts = { createBindGroup: 0, keys: [] as string[] };
44
+ const failure = { code: 'rhi-device-lost' };
45
+ const failed = getOrCreateFromChainResult(
46
+ root,
47
+ [resource],
48
+ 'retryable',
49
+ () => err(failure),
50
+ counts,
51
+ );
52
+ expect(failed).toEqual({ ok: false, error: failure });
53
+ expect(counts.createBindGroup).toBe(0);
54
+
55
+ const created = { id: 'created' } as never;
56
+ const recovered = getOrCreateFromChainResult(
57
+ root,
58
+ [resource],
59
+ 'retryable',
60
+ () => ok(created),
61
+ counts,
62
+ );
63
+ expect(recovered).toEqual({ ok: true, value: created });
64
+ expect(counts.createBindGroup).toBe(1);
65
+ expect(
66
+ getOrCreateFromChainResult(
67
+ root,
68
+ [resource],
69
+ 'retryable',
70
+ () => {
71
+ throw new Error('cache miss after recovery');
72
+ },
73
+ counts,
74
+ ),
75
+ ).toEqual({ ok: true, value: created });
76
+ });
38
77
  });
@@ -69,7 +69,7 @@ function recoveryReadinessFor(
69
69
  });
70
70
  }
71
71
 
72
- describe('recovery first-frame cold-work guard', () => {
72
+ describe('recovery prepared pipeline cache', () => {
73
73
  it('prepares the probe-enabled Standard PBR variant used by the live record path', () => {
74
74
  const readiness = recoveryReadinessFor(probeRenderable(true));
75
75
  const standardPbr = readiness.pipelineSpecs.find(
@@ -97,11 +97,29 @@ describe('recovery first-frame cold-work guard', () => {
97
97
  expect(standardPbr?.shader.variantSet).toContain('REFLECTION_FALLBACK_AVAILABLE=true');
98
98
  expect(standardPbr?.attachments.colorFormats).toEqual(['rgba16float', 'rgba16float']);
99
99
  });
100
+ it('allows explicit candidate uploads between recovery publication and the first draw', () => {
101
+ const guard = createRecoveryColdWorkGuard();
102
+ guard.arm();
103
+ expect(() => guard.noteUploadColdWork()).not.toThrow();
104
+ });
105
+
106
+ it('keeps the first-submit assertion across a skipped draw and releases its recording scope', () => {
107
+ const guard = createRecoveryColdWorkGuard();
108
+ guard.arm();
109
+ guard.beginFrame();
110
+ guard.endFrame();
111
+ expect(() => guard.noteUploadColdWork()).not.toThrow();
112
+ guard.beginFrame();
113
+ expect(() => guard.noteUploadColdWork()).toThrow(/cold upload/);
114
+ guard.endFrame();
115
+ expect(() => guard.noteUploadColdWork()).not.toThrow();
116
+ });
100
117
 
101
118
  it('accepts a prepared candidate with no first-frame cold work', () => {
102
119
  const guard = createRecoveryColdWorkGuard();
103
120
 
104
121
  guard.arm();
122
+ guard.beginFrame();
105
123
  expect(() => guard.finish()).not.toThrow();
106
124
  expect(() => guard.finish()).not.toThrow();
107
125
  });
@@ -119,6 +137,7 @@ describe('recovery first-frame cold-work guard', () => {
119
137
  const guard = createRecoveryColdWorkGuard();
120
138
 
121
139
  guard.arm();
140
+ guard.beginFrame();
122
141
  expect(() => note(guard)).toThrow(/recovery first frame performed cold/);
123
142
  });
124
143
  });
@@ -1,8 +1,10 @@
1
- import type { Buffer, Sampler, TextureView } from '@forgeax/engine-rhi';
1
+ import type { BindGroupEntry, Buffer, Sampler, TextureView } from '@forgeax/engine-rhi';
2
2
  import { describe, expect, it } from 'vitest';
3
3
  import { assembleMaterialWithSkylightEntries } from '../../ibl/skylight-bind-group';
4
- import { defaultViewForUserRegionField } from '../main-pass-material';
5
- import { buildSpritePassBaseMaterialEntries } from '../main-pass-sprite-draws';
4
+ import {
5
+ BUILTIN_USER_REGION_TEXTURE_FIELDS,
6
+ defaultViewForUserRegionField,
7
+ } from '../main-pass-material';
6
8
  import type { PipelineState } from '../render-context';
7
9
 
8
10
  describe('sprite Standard material ABI', () => {
@@ -27,7 +29,6 @@ describe('sprite Standard material ABI', () => {
27
29
  const white = {} as TextureView;
28
30
  const pipelineState = {
29
31
  materialUniformBuffer: { buffer: {} },
30
- nearestSampler: sampler,
31
32
  defaultSampler: sampler,
32
33
  defaultWhiteTextureView: white,
33
34
  defaultNormalTextureView: {} as TextureView,
@@ -35,7 +36,27 @@ describe('sprite Standard material ABI', () => {
35
36
  } as PipelineState;
36
37
  const spriteTexture = {} as TextureView;
37
38
 
38
- const entries = buildSpritePassBaseMaterialEntries(pipelineState, spriteTexture);
39
+ // Sprite no longer owns a parallel material-entry builder. Preserve the
40
+ // shared user-region/IBL layout gate; actual sampler selection is covered
41
+ // by the source-derived 300-frame Sprite raster smoke in both tone lanes.
42
+ const entries: BindGroupEntry[] = [
43
+ { binding: 0, resource: { kind: 'buffer', value: { buffer: {} as Buffer } } },
44
+ ];
45
+ for (const [index, field] of BUILTIN_USER_REGION_TEXTURE_FIELDS.entries()) {
46
+ entries.push(
47
+ { binding: 1 + index * 2, resource: { kind: 'sampler', value: sampler } },
48
+ {
49
+ binding: 2 + index * 2,
50
+ resource: {
51
+ kind: 'textureView',
52
+ value:
53
+ field === 'baseColorTexture'
54
+ ? spriteTexture
55
+ : defaultViewForUserRegionField(field, pipelineState),
56
+ },
57
+ },
58
+ );
59
+ }
39
60
 
40
61
  expect(entries.map((entry) => entry.binding)).toEqual([
41
62
  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
@@ -66,7 +87,21 @@ describe('sprite Standard material ABI', () => {
66
87
  binding: 23,
67
88
  resource: { kind: 'textureView' },
68
89
  });
69
- expect(merged).toHaveLength(24);
90
+ expect(merged).toHaveLength(25);
91
+ expect(merged.find((entry) => entry.binding === 47)?.resource.kind).toBe('textureView');
92
+
93
+ const complete = [
94
+ ...merged,
95
+ {
96
+ binding: 46,
97
+ resource: { kind: 'buffer' as const, value: { buffer: {} as Buffer } },
98
+ },
99
+ ];
100
+ expect(complete).toHaveLength(26);
101
+ expect(complete.find((entry) => entry.binding === 46)).toMatchObject({
102
+ binding: 46,
103
+ resource: { kind: 'buffer' },
104
+ });
70
105
 
71
106
  const backdrop = {} as TextureView;
72
107
  const active = assembleMaterialWithSkylightEntries(
@@ -84,6 +84,8 @@ function temporalView(): TemporalView {
84
84
  viewId: '0:1:0',
85
85
  historyVersion: 0,
86
86
  temporalFrameIndex: 1,
87
+ internalWidth: 4,
88
+ internalHeight: 4,
87
89
  historyValid: true,
88
90
  resetReason: undefined,
89
91
  currentJitterUv: [0, 0],
@@ -2,11 +2,13 @@ import { ok } from '@forgeax/engine-types';
2
2
  import { describe, expect, it } from 'vitest';
3
3
  import type { RenderFeaturePlannedFrame } from '../../features/plan';
4
4
  import { GPU_TEXTURE_USAGE_COPY_SRC } from '../../gpu-texture-usage';
5
+ import { createAutoExposureGraphPlan } from '../../pipeline/standard-output/auto-exposure/graph';
5
6
  import { getTextureIdentity, validateGraphTargetCaptureReadback } from '../frame-snapshot';
6
7
  import {
7
8
  executeCompiledFrameGraph,
8
9
  type RenderFeatureGraphCandidate,
9
10
  renderFeatureGraphPlanSignature,
11
+ updateRenderFeaturePlanRevision,
10
12
  } from '../typed-frame-graph';
11
13
 
12
14
  const captureDescriptor = {
@@ -101,6 +103,13 @@ function planned(generation: number, signature: string): RenderFeaturePlannedFra
101
103
  }
102
104
 
103
105
  describe('typed frame graph feature plan authority', () => {
106
+ it('carries auto exposure as one frame-local candidate plan', () => {
107
+ const plan = createAutoExposureGraphPlan({ width: 17, height: 9 });
108
+ expect(plan.candidateAvailableSameFrame).toBe(true);
109
+ expect(plan.cpuReadbackCount).toBe(0);
110
+ expect(plan.cpuUploadCount).toBe(0);
111
+ });
112
+
104
113
  it('keys topology and last-known-good candidates by stable plan signature and generation', () => {
105
114
  const first = renderFeatureGraphPlanSignature([planned(1, 'plan-a')]);
106
115
  expect(renderFeatureGraphPlanSignature([planned(1, 'plan-a')])).toBe(first);
@@ -116,6 +125,42 @@ describe('typed frame graph feature plan authority', () => {
116
125
  expect(candidate.plans).toHaveLength(1);
117
126
  });
118
127
 
128
+ it('keeps the compact revision stable for equivalent plan objects', () => {
129
+ const first = updateRenderFeaturePlanRevision(
130
+ { revision: 0, entries: [] },
131
+ [planned(1, 'plan-a')],
132
+ [{ featureIdentity: 'synthetic.feature', order: 0, passes: [] }],
133
+ );
134
+ const equivalent = updateRenderFeaturePlanRevision(
135
+ first,
136
+ [planned(1, 'plan-a')],
137
+ [{ featureIdentity: 'synthetic.feature', order: 0, passes: [] }],
138
+ );
139
+ expect(equivalent).toBe(first);
140
+ expect(equivalent.revision).toBe(1);
141
+
142
+ const changedSignature = updateRenderFeaturePlanRevision(
143
+ equivalent,
144
+ [planned(1, 'plan-b')],
145
+ [{ featureIdentity: 'synthetic.feature', order: 0, passes: [] }],
146
+ );
147
+ expect(changedSignature.revision).toBe(2);
148
+ expect(
149
+ updateRenderFeaturePlanRevision(
150
+ changedSignature,
151
+ [planned(2, 'plan-b')],
152
+ [{ featureIdentity: 'synthetic.feature', order: 0, passes: [] }],
153
+ ).revision,
154
+ ).toBe(3);
155
+ expect(
156
+ updateRenderFeaturePlanRevision(
157
+ changedSignature,
158
+ [planned(1, 'plan-b')],
159
+ [{ featureIdentity: 'synthetic.feature', order: 1, passes: [] }],
160
+ ).revision,
161
+ ).toBe(3);
162
+ });
163
+
119
164
  it('keeps execution projection out of the public planned-frame vocabulary', () => {
120
165
  const invalid: RenderFeaturePlannedFrame = {
121
166
  ...planned(1, 'plan-a'),
@@ -34,6 +34,11 @@ describe('View UBO directional shadow ABI', () => {
34
34
  it('declares one shared View binding with a vec4 directional filter carrier', () => {
35
35
  const viewStruct = commonWgslSrc.match(/struct View \{[\s\S]*?\n\};/)?.[0] ?? '';
36
36
  expect(viewStruct).toMatch(/directionalShadowFilter\s*:\s*vec4<f32>/);
37
+ expect(viewStruct).toMatch(/ssrParams\s*:\s*vec4<f32>/);
38
+ expect(viewUboSrc).toMatch(/viewPayload\[236\]\s*=\s*ssr\.maxDistance/);
39
+ expect(viewUboSrc).toMatch(/viewPayload\[237\]\s*=\s*ssr\.thickness/);
40
+ expect(viewUboSrc).toMatch(/viewPayload\[238\]\s*=\s*ssr\.maxRoughness/);
41
+ expect(viewUboSrc).toMatch(/viewPayload\[239\]\s*=\s*1/);
37
42
  expect(viewStruct).not.toMatch(/pcfKernelSize/);
38
43
  expect(commonWgslSrc.match(/@group\(0\) @binding\(0\) var<uniform> view/g)).toHaveLength(1);
39
44
  });