@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
@@ -23,8 +23,22 @@ export type RenderFeatureMaterialShaderBindingContract =
23
23
  | 'group-0-resource'
24
24
  | 'view-only'
25
25
  | 'view-and-scene-depth'
26
+ | 'render-material-with-scene-depth'
27
+ | 'render-material-and-scene-depth'
26
28
  | 'render-material';
27
29
 
30
+ /**
31
+ * Renderer-owned prepared resources that a closed RenderFeature data
32
+ * interface may consume for the current generation. The feature receives
33
+ * opaque references only; device creation and lifetime remain in Render.
34
+ */
35
+ export interface RenderFeaturePreparedDataInterfaceResource {
36
+ readonly kind: 'buffer' | 'texture-view' | 'sampler';
37
+ readonly value: unknown;
38
+ readonly size?: number;
39
+ readonly usage?: 'uniform' | 'storage';
40
+ }
41
+
28
42
  export type RenderFeatureFullscreenRead =
29
43
  | string
30
44
  | { readonly key: string; readonly sampleType?: 'depth' };
@@ -73,6 +87,22 @@ export type RenderFeatureResourceDeclaration =
73
87
  readonly usage: readonly RenderFeatureGpuBufferUsage[];
74
88
  readonly data?: ArrayBufferView;
75
89
  }
90
+ | {
91
+ /** A resident generation-owned resource supplied by a render-owned provider. */
92
+ readonly kind: 'prepared-gpu-resource';
93
+ readonly name: string;
94
+ readonly resource:
95
+ | {
96
+ readonly kind: 'buffer';
97
+ readonly value: unknown;
98
+ readonly size: number;
99
+ readonly usage?: readonly RenderFeatureGpuBufferUsage[];
100
+ }
101
+ | { readonly kind: 'texture-view'; readonly value: unknown }
102
+ | { readonly kind: 'sampler'; readonly value: unknown };
103
+ /** Optional graph target that backs a resident sampled resource. */
104
+ readonly logicalTarget?: string;
105
+ }
76
106
  | {
77
107
  readonly kind: 'compute-bindings';
78
108
  readonly name: string;
@@ -166,6 +196,11 @@ export interface RenderFeatureDrawDeclaration {
166
196
  }
167
197
 
168
198
  export type RenderFeaturePassDeclaration =
199
+ | {
200
+ readonly kind: 'shadow-caster';
201
+ readonly name: string;
202
+ readonly draws: readonly RenderFeatureDrawDeclaration[];
203
+ }
169
204
  | {
170
205
  readonly kind: 'compute';
171
206
  readonly name: string;
@@ -218,6 +253,15 @@ export interface RenderFeaturePlanContext {
218
253
  readonly materialShaderBindingContract?: (
219
254
  materialShaderId: string,
220
255
  ) => RenderFeatureMaterialShaderBindingContract;
256
+ /** Renderer-owned camera/depth/noise resources for the current generation; undefined means unavailable this frame. */
257
+ readonly preparedDataInterfaces?: Readonly<
258
+ Partial<
259
+ Record<
260
+ 'camera' | 'scene-depth' | 'noise',
261
+ RenderFeaturePreparedDataInterfaceResource | undefined
262
+ >
263
+ >
264
+ >;
221
265
  }
222
266
 
223
267
  /** Frozen declaration produced for one feature in one frame. */
@@ -251,34 +295,494 @@ function validName(name: string): boolean {
251
295
  return /^[a-z][a-z0-9.-]{0,127}$/.test(name);
252
296
  }
253
297
 
254
- function stable(value: unknown): string {
298
+ /** Detached accounting for the canonical plan signature path. */
299
+ export interface RenderFeaturePlanSignatureMetrics {
300
+ calls: number;
301
+ typedArrayBytes: number;
302
+ outputChars: number;
303
+ }
304
+
305
+ const BYTE_HEX = '0123456789abcdef';
306
+ const BYTE_HEX_CHUNK_SIZE = 2048;
307
+
308
+ /**
309
+ * Append an exact byte spelling without Array#join's per-byte number/string
310
+ * conversion. Inline vertex/index payloads remain part of the canonical
311
+ * signature; this only changes their private textual representation from a
312
+ * comma-separated decimal list to bounded hex chunks.
313
+ */
314
+ function appendByteHex(value: ArrayBufferView, parts: string[]): void {
315
+ const bytes = new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
316
+ parts.push('[bytes-hex:');
317
+ for (let start = 0; start < bytes.length; start += BYTE_HEX_CHUNK_SIZE) {
318
+ const end = Math.min(bytes.length, start + BYTE_HEX_CHUNK_SIZE);
319
+ let encoded = '';
320
+ for (let index = start; index < end; index += 1) {
321
+ const byte = bytes[index] as number;
322
+ encoded += BYTE_HEX[byte >>> 4] as string;
323
+ encoded += BYTE_HEX[byte & 0x0f] as string;
324
+ }
325
+ parts.push(encoded);
326
+ }
327
+ parts.push(']');
328
+ }
329
+
330
+ /**
331
+ * Detached structural evidence for one plan signature.
332
+ *
333
+ * The renderer validates a plan twice: once while the feature host records
334
+ * the candidate signature and again while the typed graph admits that
335
+ * candidate. Keeping a detached structural snapshot lets the second check
336
+ * avoid rebuilding a large string while still detecting mutations to the
337
+ * shallow-frozen plan. This is intentionally a structural cache, not an
338
+ * object-identity shortcut.
339
+ */
340
+ export type RenderFeaturePlanSignatureNode =
341
+ | { readonly kind: 'bytes'; readonly bytes: Uint8Array }
342
+ | {
343
+ readonly kind: 'array';
344
+ readonly values: readonly (RenderFeaturePlanSignatureNode | undefined)[];
345
+ }
346
+ | {
347
+ readonly kind: 'object';
348
+ readonly keys: readonly string[];
349
+ readonly values: readonly RenderFeaturePlanSignatureNode[];
350
+ }
351
+ | { readonly kind: 'primitive'; readonly token: string };
352
+
353
+ export interface RenderFeaturePlanSignatureSnapshot {
354
+ readonly resources: readonly RenderFeaturePlanSignatureNode[];
355
+ readonly passes: RenderFeaturePlanSignatureNode;
356
+ }
357
+
358
+ const signatureEvidenceByPlan = new WeakMap<
359
+ object,
360
+ {
361
+ readonly signature: string;
362
+ readonly snapshot: RenderFeaturePlanSignatureSnapshot;
363
+ }
364
+ >();
365
+
366
+ // The detached evidence is deliberately checked again by graph admission.
367
+ // Host and graph therefore share one exact structural proof without trusting
368
+ // a producer-owned boolean or object identity if a plan is mutated between
369
+ // the two stages.
370
+ function compareStableKeys(left: string, right: string): number {
371
+ return left < right ? -1 : left > right ? 1 : 0;
372
+ }
373
+
374
+ function stablePrimitiveToken(value: unknown): string {
375
+ return JSON.stringify(value) ?? 'undefined';
376
+ }
377
+
378
+ /**
379
+ * Clone a signature node while reusing an unchanged subtree from the prior
380
+ * detached snapshot. The prior node is never mutated: a changed parent gets
381
+ * a new frozen container and only equal children are shared. This keeps the
382
+ * graph-admission evidence immutable while avoiding a full tree allocation
383
+ * when one VFX resource/pass changes.
384
+ */
385
+ function cloneSignatureNode(
386
+ value: unknown,
387
+ previous?: RenderFeaturePlanSignatureNode,
388
+ ): RenderFeaturePlanSignatureNode {
389
+ if (ArrayBuffer.isView(value)) {
390
+ const bytes = new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
391
+ if (previous?.kind === 'bytes' && previous.bytes.byteLength === bytes.byteLength) {
392
+ let equal = true;
393
+ for (let index = 0; index < bytes.length; index += 1) {
394
+ if (bytes[index] !== previous.bytes[index]) {
395
+ equal = false;
396
+ break;
397
+ }
398
+ }
399
+ if (equal) return previous;
400
+ }
401
+ return { kind: 'bytes', bytes: new Uint8Array(bytes) };
402
+ }
403
+ if (Array.isArray(value)) {
404
+ const values: (RenderFeaturePlanSignatureNode | undefined)[] = new Array(value.length);
405
+ const previousValues = previous?.kind === 'array' ? previous.values : undefined;
406
+ let changed = previousValues === undefined || previousValues.length !== value.length;
407
+ for (let index = 0; index < value.length; index += 1) {
408
+ const child = value[index];
409
+ const prior = previousValues?.[index];
410
+ const next = child === undefined ? undefined : cloneSignatureNode(child, prior);
411
+ values[index] = next;
412
+ if (next !== prior) changed = true;
413
+ }
414
+ if (!changed && previous?.kind === 'array') return previous;
415
+ return Object.freeze({ kind: 'array', values: Object.freeze(values) });
416
+ }
417
+ if (value !== null && typeof value === 'object') {
418
+ const source = value as Readonly<Record<string, unknown>>;
419
+ const previousObject = previous?.kind === 'object' ? previous : undefined;
420
+ let keys: readonly string[] | undefined;
421
+ let changed = previousObject === undefined;
422
+ if (previousObject !== undefined) {
423
+ // Descriptor object shapes are stable across VFX revisions. Reuse the
424
+ // detached canonical key order after an allocation-free own-key check;
425
+ // only an actual add/remove falls back to Object.keys().sort().
426
+ let ownKeyCount = 0;
427
+ for (const key in source) {
428
+ if (Object.hasOwn(source, key)) ownKeyCount += 1;
429
+ }
430
+ if (ownKeyCount === previousObject.keys.length) {
431
+ let sameKeySet = true;
432
+ for (const key of previousObject.keys) {
433
+ if (!Object.hasOwn(source, key)) {
434
+ sameKeySet = false;
435
+ break;
436
+ }
437
+ }
438
+ if (sameKeySet) {
439
+ keys = previousObject.keys;
440
+ } else {
441
+ changed = true;
442
+ }
443
+ } else {
444
+ changed = true;
445
+ }
446
+ }
447
+ if (keys === undefined) {
448
+ keys = Object.freeze(Object.keys(source).sort(compareStableKeys));
449
+ }
450
+ const values = Object.freeze(
451
+ keys.map((key) => {
452
+ const previousIndex = previousObject?.keys.indexOf(key) ?? -1;
453
+ const prior = previousIndex < 0 ? undefined : previousObject?.values[previousIndex];
454
+ const next = cloneSignatureNode(source[key], prior);
455
+ if (next !== prior) changed = true;
456
+ return next;
457
+ }),
458
+ );
459
+ if (!changed && previousObject !== undefined) return previousObject;
460
+ return Object.freeze({
461
+ kind: 'object',
462
+ keys,
463
+ values,
464
+ });
465
+ }
466
+ const token = stablePrimitiveToken(value);
467
+ return previous?.kind === 'primitive' && previous.token === token
468
+ ? previous
469
+ : { kind: 'primitive', token };
470
+ }
471
+
472
+ function signatureResourceValue(resource: RenderFeatureResourceDeclaration): unknown {
473
+ if (resource.kind !== 'buffer') return resource;
474
+ // Match resourceTopology exactly: buffer payloads are upload evidence, not
475
+ // topology identity, while usage order is canonicalized before comparison.
476
+ return { ...resource, usage: [...resource.usage].sort(compareStableKeys), data: undefined };
477
+ }
478
+
479
+ /** Build a detached, mutation-resistant topology snapshot for one plan. */
480
+ export function cloneRenderFeaturePlanSignatureSnapshot(
481
+ plan: RenderFeaturePlan,
482
+ previous?: RenderFeaturePlanSignatureSnapshot,
483
+ ): RenderFeaturePlanSignatureSnapshot {
484
+ const resources: RenderFeaturePlanSignatureNode[] = new Array(plan.resources.length);
485
+ let resourcesChanged = previous === undefined || previous.resources.length !== resources.length;
486
+ for (let index = 0; index < plan.resources.length; index += 1) {
487
+ const resource = plan.resources[index] as RenderFeatureResourceDeclaration;
488
+ const prior = previous?.resources[index];
489
+ let next: RenderFeaturePlanSignatureNode;
490
+ if (
491
+ prior !== undefined &&
492
+ (resource.kind === 'buffer'
493
+ ? equalResourceNode(resource, prior)
494
+ : equalSignatureNode(resource, prior))
495
+ ) {
496
+ next = prior;
497
+ } else {
498
+ // Buffer `data` is deliberately outside topology identity, so avoid
499
+ // materialising its normalized spread object on the common upload-only
500
+ // update path. Changed declarations still share equal descendants.
501
+ next = cloneSignatureNode(signatureResourceValue(resource), prior);
502
+ }
503
+ resources[index] = next;
504
+ if (next !== prior) resourcesChanged = true;
505
+ }
506
+ const nextResources =
507
+ previous !== undefined && !resourcesChanged ? previous.resources : Object.freeze(resources);
508
+ const nextPasses = cloneSignatureNode(plan.passes, previous?.passes);
509
+ if (previous !== undefined && !resourcesChanged && nextPasses === previous.passes) {
510
+ return previous;
511
+ }
512
+ return Object.freeze({ resources: nextResources, passes: nextPasses });
513
+ }
514
+
515
+ function equalSignatureNode(value: unknown, snapshot: RenderFeaturePlanSignatureNode): boolean {
516
+ if (snapshot.kind === 'bytes') {
517
+ if (!ArrayBuffer.isView(value) || value.byteLength !== snapshot.bytes.byteLength) return false;
518
+ const bytes = new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
519
+ for (let index = 0; index < bytes.length; index += 1) {
520
+ if (bytes[index] !== snapshot.bytes[index]) return false;
521
+ }
522
+ return true;
523
+ }
524
+ if (snapshot.kind === 'primitive') return stablePrimitiveToken(value) === snapshot.token;
525
+ if (snapshot.kind === 'array') {
526
+ if (!Array.isArray(value) || value.length !== snapshot.values.length) return false;
527
+ for (let index = 0; index < snapshot.values.length; index += 1) {
528
+ const expected = snapshot.values[index];
529
+ const current = value[index];
530
+ if (expected === undefined) {
531
+ // stable() intentionally spells holes and explicit undefined alike.
532
+ if (current !== undefined) return false;
533
+ } else if (!equalSignatureNode(current, expected)) {
534
+ return false;
535
+ }
536
+ }
537
+ return true;
538
+ }
539
+ if (
540
+ value === null ||
541
+ typeof value !== 'object' ||
542
+ Array.isArray(value) ||
543
+ ArrayBuffer.isView(value)
544
+ ) {
545
+ return false;
546
+ }
547
+ const source = value as Readonly<Record<string, unknown>>;
548
+ // Avoid allocating Object.keys(source) on every frame. The snapshot keeps
549
+ // the canonical key order, so an own-property count plus direct lookups is
550
+ // equivalent while leaving the hot validation path allocation-free.
551
+ let ownKeyCount = 0;
552
+ for (const key in source) {
553
+ if (Object.hasOwn(source, key)) ownKeyCount += 1;
554
+ }
555
+ if (ownKeyCount !== snapshot.keys.length) return false;
556
+ for (let index = 0; index < snapshot.keys.length; index += 1) {
557
+ const key = snapshot.keys[index] as string;
558
+ if (!Object.hasOwn(source, key)) return false;
559
+ if (
560
+ !equalSignatureNode(source[key], snapshot.values[index] as RenderFeaturePlanSignatureNode)
561
+ ) {
562
+ return false;
563
+ }
564
+ }
565
+ return true;
566
+ }
567
+
568
+ function equalSortedUsage(usage: unknown, snapshot: RenderFeaturePlanSignatureNode): boolean {
569
+ if (
570
+ !Array.isArray(usage) ||
571
+ snapshot.kind !== 'array' ||
572
+ usage.length !== snapshot.values.length
573
+ ) {
574
+ return false;
575
+ }
576
+ // Usage is a short string union. Compare it as a multiset so the check
577
+ // mirrors [...usage].sort() without allocating a sorted copy per frame.
578
+ for (let index = 0; index < snapshot.values.length; index += 1) {
579
+ const expected = snapshot.values[index];
580
+ if (expected === undefined || expected.kind !== 'primitive') return false;
581
+ let expectedCount = 0;
582
+ let currentCount = 0;
583
+ for (let candidate = 0; candidate < snapshot.values.length; candidate += 1) {
584
+ const sibling = snapshot.values[candidate];
585
+ if (
586
+ sibling !== undefined &&
587
+ sibling.kind === 'primitive' &&
588
+ sibling.token === expected.token
589
+ ) {
590
+ expectedCount += 1;
591
+ }
592
+ if (stablePrimitiveToken(usage[candidate]) === expected.token) currentCount += 1;
593
+ }
594
+ if (expectedCount !== currentCount) return false;
595
+ }
596
+ return true;
597
+ }
598
+
599
+ function equalResourceNode(resource: unknown, snapshot: RenderFeaturePlanSignatureNode): boolean {
600
+ if (
601
+ resource === null ||
602
+ typeof resource !== 'object' ||
603
+ Array.isArray(resource) ||
604
+ ArrayBuffer.isView(resource) ||
605
+ snapshot.kind !== 'object'
606
+ ) {
607
+ return false;
608
+ }
609
+ const source = resource as Readonly<Record<string, unknown>>;
610
+ if (source.kind !== 'buffer') return equalSignatureNode(source, snapshot);
611
+
612
+ // resourceTopology injects data: undefined even when no upload payload was
613
+ // authored. The live declaration may contain a typed array or omit it; both
614
+ // must compare equal because the payload is deliberately outside identity.
615
+ let comparableKeys = 0;
616
+ // Keep this branch allocation-free as well. Buffer declarations are among
617
+ // the most frequently validated resources in a frame.
618
+ for (const key in source) {
619
+ if (!Object.hasOwn(source, key)) continue;
620
+ if (key === 'data') continue;
621
+ const snapshotIndex = snapshot.keys.indexOf(key);
622
+ if (snapshotIndex < 0) return false;
623
+ comparableKeys += 1;
624
+ if (key === 'usage') {
625
+ if (
626
+ !equalSortedUsage(
627
+ source[key],
628
+ snapshot.values[snapshotIndex] as RenderFeaturePlanSignatureNode,
629
+ )
630
+ ) {
631
+ return false;
632
+ }
633
+ } else if (
634
+ !equalSignatureNode(
635
+ source[key],
636
+ snapshot.values[snapshotIndex] as RenderFeaturePlanSignatureNode,
637
+ )
638
+ ) {
639
+ return false;
640
+ }
641
+ }
642
+ let expectedComparableKeys = 0;
643
+ for (const key of snapshot.keys) {
644
+ if (key === 'data') continue;
645
+ expectedComparableKeys += 1;
646
+ if (!Object.hasOwn(source, key)) return false;
647
+ }
648
+ if (comparableKeys !== expectedComparableKeys) return false;
649
+ return true;
650
+ }
651
+
652
+ /** Exact structural equality against a detached signature snapshot. */
653
+ export function renderFeaturePlanSignatureSnapshotEquals(
654
+ plan: RenderFeaturePlan,
655
+ snapshot: RenderFeaturePlanSignatureSnapshot,
656
+ ): boolean {
657
+ if (plan.resources.length !== snapshot.resources.length) return false;
658
+ for (let index = 0; index < plan.resources.length; index += 1) {
659
+ if (
660
+ !equalResourceNode(
661
+ plan.resources[index],
662
+ snapshot.resources[index] as RenderFeaturePlanSignatureNode,
663
+ )
664
+ ) {
665
+ return false;
666
+ }
667
+ }
668
+ return equalSignatureNode(plan.passes, snapshot.passes);
669
+ }
670
+
671
+ /** Associate a freshly produced plan with detached evidence for later validation. */
672
+ export function rememberRenderFeaturePlanSignature(
673
+ plan: RenderFeaturePlan,
674
+ signature: string,
675
+ snapshot: RenderFeaturePlanSignatureSnapshot,
676
+ ): void {
677
+ signatureEvidenceByPlan.set(plan as object, { signature, snapshot });
678
+ }
679
+
680
+ /**
681
+ * Validate an existing signature without serializing the plan again. A false
682
+ * result means the plan has no evidence or its nested data no longer matches;
683
+ * callers must then run the canonical serializer as the recovery path.
684
+ */
685
+ export function renderFeaturePlanSignatureEvidenceMatches(
686
+ plan: RenderFeaturePlan,
687
+ signature: string,
688
+ ): boolean {
689
+ const evidence = signatureEvidenceByPlan.get(plan as object);
690
+ return (
691
+ evidence !== undefined &&
692
+ evidence.signature === signature &&
693
+ renderFeaturePlanSignatureSnapshotEquals(plan, evidence.snapshot)
694
+ );
695
+ }
696
+
697
+ function stable(value: unknown, metrics?: RenderFeaturePlanSignatureMetrics): string {
698
+ const parts: string[] = [];
699
+ appendStable(value, parts, metrics);
700
+ return parts.join('');
701
+ }
702
+
703
+ function appendStable(
704
+ value: unknown,
705
+ parts: string[],
706
+ metrics?: RenderFeaturePlanSignatureMetrics,
707
+ ): void {
255
708
  if (ArrayBuffer.isView(value)) {
256
709
  const bytes = new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
257
- return `[bytes:${Array.from(bytes).join(',')}]`;
710
+ if (metrics !== undefined) metrics.typedArrayBytes += bytes.byteLength;
711
+ // Keep every byte in the canonical identity. Decimal Array#join creates
712
+ // a number/string conversion and a separator for every byte; bounded hex
713
+ // chunks cut that allocation footprint while remaining deterministic.
714
+ appendByteHex(value, parts);
715
+ return;
716
+ }
717
+ if (Array.isArray(value)) {
718
+ parts.push('[');
719
+ for (let index = 0; index < value.length; index += 1) {
720
+ if (index > 0) parts.push(',');
721
+ // Array#join renders holes and an explicit undefined child as an empty
722
+ // field; retain that canonical spelling instead of writing "undefined".
723
+ if (value[index] !== undefined) appendStable(value[index], parts, metrics);
724
+ }
725
+ parts.push(']');
726
+ return;
258
727
  }
259
- if (Array.isArray(value)) return `[${value.map(stable).join(',')}]`;
260
728
  if (value !== null && typeof value === 'object') {
261
- return `{${Object.entries(value as Readonly<Record<string, unknown>>)
262
- .sort(([left], [right]) => left.localeCompare(right))
263
- .map(([key, child]) => `${JSON.stringify(key)}:${stable(child)}`)
264
- .join(',')}}`;
729
+ const keys = Object.keys(value as Readonly<Record<string, unknown>>).sort((left, right) =>
730
+ left < right ? -1 : left > right ? 1 : 0,
731
+ );
732
+ parts.push('{');
733
+ for (let index = 0; index < keys.length; index += 1) {
734
+ const key = keys[index] as string;
735
+ if (index > 0) parts.push(',');
736
+ parts.push(JSON.stringify(key), ':');
737
+ appendStable((value as Readonly<Record<string, unknown>>)[key], parts, metrics);
738
+ }
739
+ parts.push('}');
740
+ return;
265
741
  }
266
- return JSON.stringify(value);
742
+ parts.push(JSON.stringify(value) ?? 'undefined');
267
743
  }
268
744
 
269
- function resourceTopology(resource: RenderFeatureResourceDeclaration): unknown {
745
+ function resourceTopology(
746
+ resource: RenderFeatureResourceDeclaration,
747
+ metrics?: RenderFeaturePlanSignatureMetrics,
748
+ ): unknown {
270
749
  if (resource.kind === 'buffer') {
750
+ if (metrics !== undefined && resource.data !== undefined) {
751
+ metrics.typedArrayBytes += resource.data.byteLength;
752
+ }
271
753
  return { ...resource, usage: [...resource.usage].sort(), data: undefined };
272
754
  }
755
+ if (resource.kind === 'prepared-gpu-resource') {
756
+ return {
757
+ ...resource,
758
+ resource:
759
+ resource.resource.kind === 'buffer'
760
+ ? {
761
+ kind: 'buffer',
762
+ size: resource.resource.size,
763
+ usage: [...(resource.resource.usage ?? [])].sort(),
764
+ }
765
+ : { kind: resource.resource.kind },
766
+ };
767
+ }
273
768
  return resource;
274
769
  }
275
770
 
276
771
  /** Canonical signature used by typed-graph topology and last-known-good swap. */
277
- export function renderFeaturePlanSignature(plan: RenderFeaturePlan): string {
278
- return stable({
279
- resources: plan.resources.map(resourceTopology),
280
- passes: plan.passes,
281
- });
772
+ export function renderFeaturePlanSignature(
773
+ plan: RenderFeaturePlan,
774
+ metrics?: RenderFeaturePlanSignatureMetrics,
775
+ ): string {
776
+ if (metrics !== undefined) metrics.calls += 1;
777
+ const signature = stable(
778
+ {
779
+ resources: plan.resources.map((resource) => resourceTopology(resource, metrics)),
780
+ passes: plan.passes,
781
+ },
782
+ metrics,
783
+ );
784
+ if (metrics !== undefined) metrics.outputChars += signature.length;
785
+ return signature;
282
786
  }
283
787
 
284
788
  function bindingAccess(type: GPUBufferBindingType | undefined): GraphBufferAccess | undefined {
@@ -312,6 +816,13 @@ export function deriveRenderFeaturePassAccess(
312
816
  layoutEntries.find((candidate) => candidate.binding === entry.binding)?.buffer?.type,
313
817
  );
314
818
  if (usage !== undefined) accesses.push({ resource: entry.resource, usage });
819
+ const declaration = resources.get(entry.resource);
820
+ if (
821
+ declaration?.kind === 'prepared-gpu-resource' &&
822
+ declaration.logicalTarget !== undefined
823
+ ) {
824
+ accesses.push({ resource: declaration.logicalTarget, usage: 'sampled-read' });
825
+ }
315
826
  }
316
827
  }
317
828
  for (const dispatch of pass.dispatches) {
@@ -322,10 +833,10 @@ export function deriveRenderFeaturePassAccess(
322
833
  return Object.freeze(accesses);
323
834
  }
324
835
 
325
- for (const attachment of pass.colorAttachments) {
836
+ for (const attachment of pass.kind === 'raster' ? pass.colorAttachments : []) {
326
837
  accesses.push({ resource: attachment.target, usage: 'color-attachment' });
327
838
  }
328
- if (pass.depthStencilAttachment !== undefined) {
839
+ if (pass.kind === 'raster' && pass.depthStencilAttachment !== undefined) {
329
840
  accesses.push({
330
841
  resource: pass.depthStencilAttachment.target,
331
842
  usage: pass.sampledTargets?.some(
@@ -335,7 +846,7 @@ export function deriveRenderFeaturePassAccess(
335
846
  : 'depth-stencil-write',
336
847
  });
337
848
  }
338
- for (const target of pass.sampledTargets ?? []) {
849
+ for (const target of pass.kind === 'raster' ? (pass.sampledTargets ?? []) : []) {
339
850
  if (typeof target !== 'string') continue;
340
851
  accesses.push({ resource: target, usage: 'sampled-read' });
341
852
  }
@@ -381,6 +892,13 @@ export function freezeRenderFeaturePlan(
381
892
  for (const resource of plan.resources) {
382
893
  if (!validName(resource.name) || resources.has(resource.name))
383
894
  return err(stageFailure(identity));
895
+ if (
896
+ resource.kind === 'prepared-gpu-resource' &&
897
+ resource.logicalTarget !== undefined &&
898
+ !targets.has(resource.logicalTarget)
899
+ ) {
900
+ return err(stageFailure(identity));
901
+ }
384
902
  resources.set(resource.name, resource);
385
903
  }
386
904
  const passes = new Set<string>();
@@ -400,11 +918,17 @@ export function freezeRenderFeaturePlan(
400
918
  }
401
919
  const entryPoints = new Set(program.program.entryPoints);
402
920
  for (const entry of bindings.entries) {
403
- const buffer = resources.get(entry.resource);
404
921
  const layout = program.program.bindings?.[0]?.entries.find(
405
922
  (candidate) => candidate.binding === entry.binding,
406
923
  );
407
- if (buffer?.kind !== 'buffer' || layout?.buffer === undefined) {
924
+ const resource = resources.get(entry.resource);
925
+ const validBuffer = resource?.kind === 'buffer' && layout?.buffer !== undefined;
926
+ const validPrepared =
927
+ resource?.kind === 'prepared-gpu-resource' &&
928
+ ((resource.resource.kind === 'buffer' && layout?.buffer !== undefined) ||
929
+ (resource.resource.kind === 'texture-view' && layout?.texture !== undefined) ||
930
+ (resource.resource.kind === 'sampler' && layout?.sampler !== undefined));
931
+ if (!validBuffer && !validPrepared) {
408
932
  return err(stageFailure(identity));
409
933
  }
410
934
  }
@@ -436,11 +960,13 @@ export function freezeRenderFeaturePlan(
436
960
 
437
961
  if (
438
962
  pass.draws.length === 0 ||
439
- pass.colorAttachments.some((attachment) => !targets.has(attachment.target)) ||
440
- (pass.depthStencilAttachment !== undefined &&
441
- !targets.has(pass.depthStencilAttachment.target)) ||
442
- pass.sampledTargets?.some((target) => typeof target === 'string' && !targets.has(target)) ===
443
- true
963
+ (pass.kind === 'raster' &&
964
+ (pass.colorAttachments.some((attachment) => !targets.has(attachment.target)) ||
965
+ (pass.depthStencilAttachment !== undefined &&
966
+ !targets.has(pass.depthStencilAttachment.target)) ||
967
+ pass.sampledTargets?.some(
968
+ (target) => typeof target === 'string' && !targets.has(target),
969
+ ) === true))
444
970
  ) {
445
971
  return err(stageFailure(identity));
446
972
  }
@@ -448,6 +974,9 @@ export function freezeRenderFeaturePlan(
448
974
  const program = resources.get(draw.program);
449
975
  if (
450
976
  program?.kind !== 'graphics-program' ||
977
+ (pass.kind === 'shadow-caster' &&
978
+ (program.program.colorFormats.length !== 0 ||
979
+ program.program.depthFormat !== 'depth32float')) ||
451
980
  draw.bindings.some((name) => {
452
981
  const binding = resources.get(name);
453
982
  return binding?.kind !== 'graphics-bindings' || binding.program !== draw.program;