@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
@@ -280,19 +280,18 @@ export async function prepareMaterialShaders(
280
280
  ]);
281
281
 
282
282
  // ── Step 0: storage-buffer cap gate ───────────────────────────────────────
283
- const capValue = (rhiDevice.limits as Readonly<Record<string, number>>)
284
- .maxStorageBuffersPerShaderStage;
283
+ const capValue = rhiDevice.limits.maxStorageBuffersPerShaderStage;
285
284
  const webgl2Downlevel = rhiDevice.caps.backendKind === 'wgpu-webgl2';
286
- const storageBufferCapable = rhiDevice.caps.storageBuffer;
287
- if (storageBufferCapable && typeof capValue === 'number') {
285
+ let storageBufferCapable = !webgl2Downlevel && rhiDevice.caps.storageBuffer;
286
+ if (typeof capValue === 'number') {
288
287
  const capCheck = assertStorageBufferCap(capValue);
289
288
  if (!capCheck.ok) throw capCheck.error;
289
+ storageBufferCapable = !webgl2Downlevel && rhiDevice.caps.storageBuffer && capCheck.value;
290
290
  }
291
291
  const extendedLightingShaderAvailable = deriveExtendedLightingCapability(rhiDevice).admitted;
292
292
  const projectorAvailable =
293
293
  (rhiDevice.limits.maxSampledTexturesPerShaderStage ?? 0) >=
294
294
  STANDARD_PBR_REQUIRED_SAMPLED_TEXTURES;
295
-
296
295
  // ── Step 1: manifest load ─────────────────────────────────────────────────
297
296
  const registry = getShader();
298
297
  const loaded = await registry.loadManifest();
@@ -301,35 +300,46 @@ export async function prepareMaterialShaders(
301
300
  }
302
301
 
303
302
  // ── Step 1b: material shader variant resolution + registration ───────────
304
- // feat-20260609-hdrp-cluster-fragment-ggx M1 / w7: dual-axis variant
305
- // resolution. At boot time isHdrpActive is always false (URP default),
306
- // so CLUSTER_FORWARD_AVAILABLE=false variant is selected. HDRP variant
307
- // (CLUSTER_FORWARD_AVAILABLE=true) is resolved later when
308
- // clustered Standard profile activation selects the clustered variant.
309
- const isHdrpActive = false; // M4: wire to actual renderSystem.frameState.isHdrpActive
303
+ // feat-20260609-hdrp-cluster-fragment-ggx M1 / w7: the boot resolver selects
304
+ // the non-clustered variant; clustered Standard activation resolves its own
305
+ // variant later at record time.
310
306
  for (const msEntry of registry.materialShaderManifestEntries()) {
311
307
  // bug-20260610: skip synthetic non-material engine entries piggy-backing
312
308
  // on the materialShaders channel for variant surfacing (shadow_caster).
313
309
  // They use the `forgeax::engine-` prefix and are consumed by Step 2's
314
310
  // engine-entry compile path, NOT by installMaterialArtifact.
315
311
  if (msEntry.identifier.startsWith('forgeax::engine-')) continue;
316
- // buildVariantKey logic: sorted key=value pairs joined with +; all-true = ''.
317
- const variantDefines: Record<string, boolean> = {};
318
- if (msEntry.variants.some((variant) => 'STORAGE_BUFFER_AVAILABLE' in variant.defines)) {
319
- variantDefines.STORAGE_BUFFER_AVAILABLE = storageBufferCapable;
320
- }
321
- // User material manifests may declare WEBGL2_COMPAT alongside the shared
322
- // mesh-storage axis. The fallback backend must select that authored
323
- // branch at boot; otherwise it asks for the impossible bare
324
- // `STORAGE_BUFFER_AVAILABLE=false` key and fails before the first frame.
312
+ // The same closed resolver drives every manifest axis at boot. This keeps
313
+ // registration aligned with record-time capability/feature selection and
314
+ // supplies explicit defaults for opt-in axes such as shadow alpha-mask and
315
+ // GPU-driven scene-index variants.
316
+ // Build the exact boot key from the capability facts and explicit defaults.
317
+ // Record-time callers use resolveMaterialShaderVariantSet below; keeping
318
+ // the same axes here prevents a physical-material variant from being
319
+ // registered under a key that cannot be selected by the renderer.
320
+ const variantDefines: Record<string, boolean> = {
321
+ STORAGE_BUFFER_AVAILABLE: storageBufferCapable,
322
+ };
325
323
  if (msEntry.variants.some((v) => 'WEBGL2_COMPAT' in v.defines)) {
326
324
  variantDefines.WEBGL2_COMPAT = webgl2Downlevel;
327
325
  }
328
- // Only include CLUSTER_FORWARD_AVAILABLE when the material shader declares
329
- // the axis (has a variant with this key), preserving backward compat for
330
- // entries without the pragma.
331
326
  if (msEntry.variants.some((v) => 'CLUSTER_FORWARD_AVAILABLE' in v.defines)) {
332
- variantDefines.CLUSTER_FORWARD_AVAILABLE = isHdrpActive;
327
+ variantDefines.CLUSTER_FORWARD_AVAILABLE = false;
328
+ }
329
+ if (msEntry.variants.some((v) => 'GPU_DRIVEN_SCENE_INDEX_AVAILABLE' in v.defines)) {
330
+ variantDefines.GPU_DRIVEN_SCENE_INDEX_AVAILABLE = false;
331
+ }
332
+ if (msEntry.variants.some((v) => 'GPU_DRIVEN_SCENE_INDEX_EXPLICIT' in v.defines)) {
333
+ // The boot material is the compact visible-stream path. Explicit
334
+ // scene-index dispatches select their own variant at record time; they
335
+ // must never make the default artifact key unsatisfiable.
336
+ variantDefines.GPU_DRIVEN_SCENE_INDEX_EXPLICIT = false;
337
+ }
338
+ if (msEntry.variants.some((v) => 'ALPHA_MASK' in v.defines)) {
339
+ // Alpha-mask admission is a per-draw producer fact. Keep the boot
340
+ // artifact opaque and resolve ALPHA_MASK=true only for a receipt-owned
341
+ // shadow batch.
342
+ variantDefines.ALPHA_MASK = false;
333
343
  }
334
344
  if (msEntry.variants.some((v) => 'DIRECTIONAL_PCSS_AVAILABLE' in v.defines)) {
335
345
  variantDefines.DIRECTIONAL_PCSS_AVAILABLE = directionalPcssCapable(
@@ -339,16 +349,24 @@ export async function prepareMaterialShaders(
339
349
  if (msEntry.variants.some((v) => 'VERTEX_COLOR_AVAILABLE' in v.defines)) {
340
350
  variantDefines.VERTEX_COLOR_AVAILABLE = false;
341
351
  }
352
+ if (msEntry.variants.some((v) => 'COVERAGE_ONLY' in v.defines)) {
353
+ // Coverage-only is a producer-owned opt-in for sprite/temporal paths.
354
+ // Keep the ordinary boot material on the opaque variant; record-time
355
+ // coverage batches request the true variant explicitly.
356
+ variantDefines.COVERAGE_ONLY = false;
357
+ }
342
358
  if (msEntry.variants.some((v) => 'PROBE_BLEND_AVAILABLE' in v.defines)) {
343
359
  variantDefines.PROBE_BLEND_AVAILABLE = false;
344
360
  }
345
361
  if (msEntry.variants.some((v) => 'EXTENDED_LIGHTING_AVAILABLE' in v.defines)) {
346
362
  variantDefines.EXTENDED_LIGHTING_AVAILABLE = extendedLightingShaderAvailable;
347
363
  }
348
- if (
349
- msEntry.identifier === 'forgeax::default-standard-pbr' &&
350
- msEntry.variants.some((v) => 'PROJECTOR_AVAILABLE' in v.defines)
351
- ) {
364
+ // A material shader that declares the projector axis owns the same
365
+ // capability-selected resource pair, regardless of whether it is the
366
+ // engine Standard entry or a VFX particle entry. Omitting this value for
367
+ // particle variants asks the manifest for a partial key and fails before
368
+ // the first frame when the shader does not use the Standard root.
369
+ if (msEntry.variants.some((v) => 'PROJECTOR_AVAILABLE' in v.defines)) {
352
370
  variantDefines.PROJECTOR_AVAILABLE = projectorAvailable;
353
371
  }
354
372
  if (msEntry.variants.some((v) => 'TRANSMISSION_AVAILABLE' in v.defines)) {
@@ -409,6 +427,9 @@ export async function prepareMaterialShaders(
409
427
  registry.installMaterialArtifact(msEntry.identifier, {
410
428
  source: wgsl,
411
429
  paramSchema,
430
+ ...(chosen?.receipt === undefined && msEntry.receipt === undefined
431
+ ? {}
432
+ : { receipt: chosen?.receipt ?? msEntry.receipt }),
412
433
  });
413
434
  // feat-20260629 M4: store uvSetCount from naga reflection for
414
435
  // auto-fill in getMaterialShaderPipeline clamp-to-last alias.
@@ -457,6 +478,7 @@ export async function prepareMaterialShaders(
457
478
  registry.installMaterialArtifact(shadowCasterIdentifier, {
458
479
  source: manifestEntry.composedWgsl,
459
480
  paramSchema: STANDARD_PIPELINE_PARAM_SCHEMA,
481
+ ...(manifestEntry.receipt === undefined ? {} : { receipt: manifestEntry.receipt }),
460
482
  });
461
483
  const shaderGuid = ENGINE_SHADER_GUIDS.get(shadowCasterIdentifier);
462
484
  if (shaderGuid !== undefined) {
@@ -516,7 +538,15 @@ export async function prepareMaterialShaders(
516
538
  * material-shader layouts add a `LayoutKind` member + a PipelineState slot
517
539
  * + a switch arm here in one cut (charter P3 extensibility).
518
540
  */
519
- export type LayoutKind = 'pbr' | 'pbr-skin' | 'hdrp-pbr' | 'hdrp-skin' | 'sprite-urp' | 'unlit-urp';
541
+ export type LayoutKind =
542
+ | 'pbr'
543
+ | 'pbr-skin'
544
+ | 'gpu-driven-pbr'
545
+ | 'gpu-driven-skin'
546
+ | 'hdrp-pbr'
547
+ | 'hdrp-skin'
548
+ | 'sprite-urp'
549
+ | 'unlit-urp';
520
550
 
521
551
  function directionalPcssCapable(backendKind: RhiDevice['caps']['backendKind']): boolean {
522
552
  return backendKind === 'webgpu' || backendKind === 'wgpu-native';
@@ -583,9 +613,12 @@ export function selectNoColorPbrVariant(
583
613
  ): MaterialShaderManifestEntry['variants'][number] | undefined {
584
614
  const hdrpRequested = variantSet === '' || requestsClusterVariant(variantSet);
585
615
  const probeBlendRequested = requestsProbeBlendVariant(variantSet);
616
+ const coverageOnlyRequested = variantSet?.includes('COVERAGE_ONLY=true') === true;
586
617
  return manifestEntry?.variants.find(
587
618
  (variant) =>
588
619
  variant.defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable &&
620
+ (!('COVERAGE_ONLY' in variant.defines) ||
621
+ variant.defines.COVERAGE_ONLY === coverageOnlyRequested) &&
589
622
  (!('EXTENDED_LIGHTING_AVAILABLE' in variant.defines) ||
590
623
  variant.defines.EXTENDED_LIGHTING_AVAILABLE === extendedLightingShaderAvailable) &&
591
624
  variant.defines.VERTEX_COLOR_AVAILABLE === false &&
@@ -627,6 +660,17 @@ export function resolveMaterialShaderBindingContract(
627
660
  /@group\s*\(\s*0\s*\)\s*@binding\s*\(\s*1\s*\)\s*var\s+scene_depth\s*:\s*texture_depth_2d\b/u.test(
628
661
  withoutComments,
629
662
  );
663
+ const declaresSceneDepthAtZero =
664
+ /@group\s*\(\s*0\s*\)\s*@binding\s*\(\s*0\s*\)\s*var\s+scene_depth\s*:\s*texture_depth_2d\b/u.test(
665
+ withoutComments,
666
+ );
667
+ const hasMaterialGroup = groups.includes(1);
668
+ if (declaresView && declaresSceneDepth && hasMaterialGroup) {
669
+ return 'render-material-and-scene-depth';
670
+ }
671
+ if (declaresSceneDepthAtZero && hasMaterialGroup) {
672
+ return 'render-material-with-scene-depth';
673
+ }
630
674
  if (declaresView && declaresSceneDepth && groups.every((group) => group === 0)) {
631
675
  return 'view-and-scene-depth';
632
676
  }
@@ -760,8 +804,11 @@ export function shouldDeferMissingPreparedMaterialShader(
760
804
  ): boolean {
761
805
  return (
762
806
  vertexLayout === RENDER_FEATURE_VERTEX_LAYOUTS.billboardMaterialInstance ||
807
+ vertexLayout === RENDER_FEATURE_VERTEX_LAYOUTS.billboardMaterialInputInstance ||
763
808
  vertexLayout === RENDER_FEATURE_VERTEX_LAYOUTS.topologySegmentInstance ||
764
- vertexLayout === RENDER_FEATURE_VERTEX_LAYOUTS.meshGeometryMaterialInstance
809
+ vertexLayout === RENDER_FEATURE_VERTEX_LAYOUTS.topologySegmentMaterialInputInstance ||
810
+ vertexLayout === RENDER_FEATURE_VERTEX_LAYOUTS.meshGeometryMaterialInstance ||
811
+ vertexLayout === RENDER_FEATURE_VERTEX_LAYOUTS.meshGeometryMaterialInputInstance
765
812
  );
766
813
  }
767
814
 
@@ -773,6 +820,8 @@ export function selectPipelineLayoutForVariant(
773
820
  readonly hdrpProbePbrPipelineLayout?: PipelineLayout | null;
774
821
  readonly pbrSkinPipelineLayout: PipelineLayout | null;
775
822
  readonly pbrSkinProbePipelineLayout?: PipelineLayout | null;
823
+ readonly gpuDrivenPbrPipelineLayout?: PipelineLayout | null;
824
+ readonly gpuDrivenPbrSkinPipelineLayout?: PipelineLayout | null;
776
825
  readonly hdrpSkinPipelineLayout?: PipelineLayout | null;
777
826
  } | null,
778
827
  variantSet: string | undefined,
@@ -780,6 +829,12 @@ export function selectPipelineLayoutForVariant(
780
829
  ): PipelineLayout | null {
781
830
  if (state === null) return null;
782
831
  const probeBlendVariant = variantSet?.includes('PROBE_BLEND_AVAILABLE=true') === true;
832
+ if (layoutKind === 'gpu-driven-pbr') {
833
+ return state.gpuDrivenPbrPipelineLayout ?? null;
834
+ }
835
+ if (layoutKind === 'gpu-driven-skin') {
836
+ return state.gpuDrivenPbrSkinPipelineLayout ?? null;
837
+ }
783
838
  // bug-20260611: skin layout selection takes precedence over HDRP variant
784
839
  // resolution. HDRP × skin is OOS-1 (plan-strategy R-2 — left for a
785
840
  // dedicated feat); when an HDRP-variant skin call ever lands, we fail
@@ -853,6 +908,7 @@ export function resolveMaterialShaderVariantSet(
853
908
  ): string | undefined {
854
909
  const declaredAxes = new Set(variants.flatMap((variant) => Object.keys(variant.defines)));
855
910
  const declaresCapabilityVariants =
911
+ declaredAxes.has('COVERAGE_ONLY') ||
856
912
  declaredAxes.has('WEBGL2_COMPAT') ||
857
913
  declaredAxes.has('STORAGE_BUFFER_AVAILABLE') ||
858
914
  declaredAxes.has('EXTENDED_LIGHTING_AVAILABLE') ||
@@ -890,23 +946,31 @@ export function resolveMaterialShaderVariantSet(
890
946
  ? backendKind !== 'wgpu-webgl2' && storageBuffer
891
947
  : axis === 'SKINNING_DISABLED'
892
948
  ? (requested[axis] ?? true)
893
- : axis === 'CLUSTER_FORWARD_AVAILABLE'
894
- ? storageBuffer && backendKind !== 'wgpu-webgl2' && (requested[axis] ?? false)
895
- : axis === 'PER_INSTANCE_REGION'
896
- ? requestedVariantSet === '' || (requested[axis] ?? false)
897
- : axis === 'VERTEX_COLOR_AVAILABLE'
949
+ : axis === 'ALPHA_MASK' ||
950
+ axis === 'GPU_DRIVEN_SCENE_INDEX_AVAILABLE' ||
951
+ axis === 'GPU_DRIVEN_SCENE_INDEX_EXPLICIT' ||
952
+ axis === 'COVERAGE_ONLY'
953
+ ? (requested[axis] ?? false)
954
+ : axis === 'CLUSTER_FORWARD_AVAILABLE'
955
+ ? storageBuffer && backendKind !== 'wgpu-webgl2' && (requested[axis] ?? false)
956
+ : axis === 'PER_INSTANCE_REGION'
898
957
  ? requestedVariantSet === '' || (requested[axis] ?? false)
899
- : axis === 'EXTENDED_LIGHTING_AVAILABLE'
900
- ? extendedLightingAvailable
901
- : axis === 'PROBE_BLEND_AVAILABLE'
902
- ? storageBuffer && (requested[axis] ?? false)
903
- : axis === 'TRANSMISSION_AVAILABLE'
904
- ? (requested[axis] ?? false)
905
- : axis === 'DIRECTIONAL_PCSS_AVAILABLE'
906
- ? directionalPcssCapable(backendKind)
907
- : axis === 'PROJECTOR_AVAILABLE'
908
- ? projectorAvailable
909
- : (requested[axis] ?? false);
958
+ : axis === 'VERTEX_COLOR_AVAILABLE'
959
+ ? requestedVariantSet === '' || (requested[axis] ?? false)
960
+ : axis === 'EXTENDED_LIGHTING_AVAILABLE'
961
+ ? extendedLightingAvailable
962
+ : axis === 'PROBE_BLEND_AVAILABLE'
963
+ ? storageBuffer && (requested[axis] ?? false)
964
+ : axis === 'TRANSMISSION_AVAILABLE' ||
965
+ axis === 'REFLECTION_FALLBACK_AVAILABLE'
966
+ ? (requested[axis] ?? false)
967
+ : axis === 'DIRECTIONAL_PCSS_AVAILABLE'
968
+ ? directionalPcssCapable(backendKind)
969
+ : axis === 'PROJECTOR_AVAILABLE'
970
+ ? projectorAvailable
971
+ : // Authored axes keep the manifest's all-true default.
972
+ // Only Engine-owned admission axes default to disabled.
973
+ (requested[axis] ?? true);
910
974
  }
911
975
  const sorted = Object.entries(filtered).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
912
976
  return sorted.every(([, value]) => value)
@@ -50,6 +50,11 @@ export function attachDeviceLostFanout(
50
50
  }
51
51
  onDeviceLost?.(detail);
52
52
  lostRegistry.fire(safe);
53
+ // A `destroyed` loss is the terminal signal from an intentional
54
+ // GPUDevice.destroy() call. It is observable through the lost channel,
55
+ // but must not put the renderer into recoverable device-lost health or
56
+ // emit an error during normal teardown. Only an unexpected loss keeps the
57
+ // recovery/error fan-out active.
53
58
  if (safe.reason !== 'destroyed') {
54
59
  pack.instrumentation?.onDeviceLost?.();
55
60
  healthRegistry.fire({
@@ -0,0 +1,62 @@
1
+ import type { DeviceResourceKind } from '../../device/resource-types';
2
+ import type { RecoveryGuidance, RecoveryPhase } from '../renderer-lifecycle';
3
+
4
+ export interface RecoveryFailureLocation {
5
+ readonly phase: RecoveryPhase;
6
+ readonly retryable: boolean;
7
+ readonly guidance: RecoveryGuidance;
8
+ readonly owner: string;
9
+ readonly resourceKind: DeviceResourceKind;
10
+ readonly cause: unknown;
11
+ }
12
+
13
+ function recoveryCauseCode(cause: unknown): string | undefined {
14
+ if (typeof cause !== 'object' || cause === null) return undefined;
15
+ const directCode = (cause as { readonly code?: unknown }).code;
16
+ if (typeof directCode === 'string') return directCode;
17
+ const detail = (cause as { readonly detail?: unknown }).detail;
18
+ if (typeof detail !== 'object' || detail === null) return undefined;
19
+ const detailCode = (detail as { readonly code?: unknown }).code;
20
+ if (typeof detailCode === 'string') return detailCode;
21
+ return recoveryCauseCode((detail as { readonly cause?: unknown }).cause);
22
+ }
23
+
24
+ export function createRecoveryFailureLocation(
25
+ phase: RecoveryPhase,
26
+ cause: unknown,
27
+ overrides: Partial<Omit<RecoveryFailureLocation, 'phase' | 'cause'>> = {},
28
+ ): RecoveryFailureLocation {
29
+ const code = recoveryCauseCode(cause) ?? '';
30
+ const resourceKind: DeviceResourceKind = code.includes('shader')
31
+ ? 'shader'
32
+ : code.includes('buffer')
33
+ ? 'buffer'
34
+ : code.includes('texture')
35
+ ? 'texture'
36
+ : code.includes('binding')
37
+ ? 'binding'
38
+ : phase === 'rehydrate'
39
+ ? 'shader'
40
+ : phase === 'acquire-adapter' || phase === 'acquire-device'
41
+ ? 'surface'
42
+ : phase === 'publish' || phase === 'cleanup'
43
+ ? 'surface'
44
+ : 'pipeline';
45
+ const owner =
46
+ code.includes('shader') || phase === 'rehydrate'
47
+ ? 'shader'
48
+ : phase === 'acquire-adapter' || phase === 'acquire-device'
49
+ ? 'backend'
50
+ : phase === 'compile-graph'
51
+ ? 'pipeline'
52
+ : 'renderer';
53
+ return {
54
+ phase,
55
+ retryable: false,
56
+ guidance: 'repair-owner',
57
+ owner,
58
+ resourceKind,
59
+ cause,
60
+ ...overrides,
61
+ };
62
+ }
@@ -12,6 +12,7 @@ import {
12
12
  } from '@forgeax/engine-rhi';
13
13
  import { ok, type Result } from '@forgeax/engine-types';
14
14
  import type { RhiBackendPack } from '../backend-contract';
15
+ import { deviceOptionsForAdapter } from '../device-feature-admission';
15
16
  import {
16
17
  RECOVERY_ADAPTER_DEADLINE_MS,
17
18
  RECOVERY_DEVICE_DEADLINE_MS,
@@ -20,13 +21,7 @@ import {
20
21
  type RecoveryPhase,
21
22
  } from '../renderer-lifecycle';
22
23
 
23
- const COMPRESSION_FEATURES: GPUFeatureName[] = [
24
- 'texture-compression-bc',
25
- 'texture-compression-etc2',
26
- 'texture-compression-astc',
27
- ];
28
-
29
- export const STANDARD_PBR_REQUIRED_SAMPLED_TEXTURES = 17;
24
+ export { deviceOptionsForAdapter } from '../device-feature-admission';
30
25
 
31
26
  const PROBE_TEXTURE_USAGE_COPY_SRC = 0x01;
32
27
  const PROBE_TEXTURE_USAGE_RENDER_ATTACHMENT = 0x10;
@@ -573,28 +568,6 @@ export async function probeCandidateGraphExecution(
573
568
  }
574
569
  }
575
570
 
576
- export function deviceOptionsForAdapter(adapter: Pick<RhiAdapter, 'features' | 'limits'>):
577
- | {
578
- requiredFeatures?: GPUFeatureName[];
579
- requiredLimits?: GPUDeviceDescriptor['requiredLimits'];
580
- }
581
- | undefined {
582
- const requiredFeatures = COMPRESSION_FEATURES.filter((feature) => adapter.features.has(feature));
583
- const supportsTransmission =
584
- (adapter.limits.maxSampledTexturesPerShaderStage ?? 0) >=
585
- STANDARD_PBR_REQUIRED_SAMPLED_TEXTURES;
586
- return {
587
- ...(requiredFeatures.length > 0 ? { requiredFeatures } : {}),
588
- ...(supportsTransmission
589
- ? {
590
- requiredLimits: {
591
- maxSampledTexturesPerShaderStage: STANDARD_PBR_REQUIRED_SAMPLED_TEXTURES,
592
- },
593
- }
594
- : {}),
595
- };
596
- }
597
-
598
571
  export interface AcquiredDeviceGeneration {
599
572
  readonly adapter: RhiAdapter;
600
573
  readonly device: RhiDevice;
@@ -19,18 +19,13 @@ import {
19
19
  postProcessShaderEntrySignature,
20
20
  postProcessShaderPipelineLabel,
21
21
  } from '../../fullscreen-post-process-pass';
22
- import { createRecoveryColdWorkGuard } from '../../record/recovery-pipeline';
23
- import type {
24
- PipelineState,
25
- RecoveryColdWorkGuard,
26
- RenderSystemInternals,
27
- } from '../../record/render-context';
22
+ import type { PipelineState, RenderSystemInternals } from '../../record/render-context';
28
23
  import type {
29
24
  RecoveryGraphCandidate,
30
25
  RecoveryPostProcessResources,
31
26
  RecoveryRootBundle,
32
- RenderSystem,
33
- } from '../../render-system';
27
+ } from '../../recovery/types';
28
+ import type { RenderSystem } from '../../render-system';
34
29
  import type { RhiBackendPack } from '../backend-contract';
35
30
  import {
36
31
  type LayoutKind,
@@ -42,8 +37,9 @@ import type { MeshSsboGrowResult, MeshSsboState } from '../mesh-ssbo-grow';
42
37
  import { structuredRendererCause } from '../renderer-facade';
43
38
  import { ensureContextConfigured } from '../renderer-helpers';
44
39
  import type { RecoveryContinuation, RecoveryDeadline, RecoveryPhase } from '../renderer-lifecycle';
45
- import type { RecoveryFailureLocation, WebGPURendererInternals } from '../webgpu-renderer';
40
+ import type { WebGPURendererInternals } from '../webgpu-renderer';
46
41
  import { attachDeviceLostFanout } from './device-loss-fanout';
42
+ import type { RecoveryFailureLocation } from './failure-location';
47
43
  import { buildGenerationAggregate, type GenerationAggregate } from './generation';
48
44
  import {
49
45
  acquireDeviceGeneration,
@@ -146,6 +142,9 @@ export interface RendererRecoveryDependencies {
146
142
  readonly getMaterialShaderPipelineEntry: NonNullable<
147
143
  RenderSystemInternals['getMaterialShaderPipelineEntry']
148
144
  >;
145
+ readonly getMaterialShaderArtifact: NonNullable<
146
+ RenderSystemInternals['getMaterialShaderArtifact']
147
+ >;
149
148
  readonly getCachedMaterialShaderBindingContract: NonNullable<
150
149
  RenderSystemInternals['getMaterialShaderBindingContract']
151
150
  >;
@@ -166,7 +165,6 @@ export interface RendererRecoveryDependencies {
166
165
  candidatePostProcessResources: RecoveryPostProcessResources,
167
166
  recoveryRootBundle: RecoveryRootBundle,
168
167
  recoveryGraphCandidate: RecoveryGraphCandidate | undefined,
169
- recoveryColdWorkGuard: RecoveryColdWorkGuard,
170
168
  ) => void;
171
169
  }
172
170
 
@@ -205,6 +203,7 @@ export function createRendererRecovery(deps: RendererRecoveryDependencies): Rend
205
203
  buildPipeline,
206
204
  getMaterialShaderPipeline,
207
205
  getMaterialShaderPipelineEntry,
206
+ getMaterialShaderArtifact,
208
207
  getCachedMaterialShaderBindingContract,
209
208
  getParamSchema,
210
209
  getMaterialBindGroupLayout,
@@ -253,7 +252,6 @@ export function createRendererRecovery(deps: RendererRecoveryDependencies): Rend
253
252
  // old roots remain authoritative until the final synchronous publication.
254
253
  const candidateGpuStore = new GpuResidencyCache();
255
254
  const candidateDynamicTextureStore = new DynamicTextureStore();
256
- const recoveryColdWorkGuard = createRecoveryColdWorkGuard();
257
255
  // Re-acquire through the SAME backend pack (the
258
256
  // idempotent factory primitives tryCreateWebGPURenderer uses). On the
259
257
  // adapter / device failure paths, health stays `device-lost` (A-AC-07):
@@ -334,6 +332,7 @@ export function createRendererRecovery(deps: RendererRecoveryDependencies): Rend
334
332
  candidateShaderCatalog.installMaterialArtifact(identifier, {
335
333
  source: entry.value.source,
336
334
  paramSchema: entry.value.paramSchema,
335
+ ...(entry.value.receipt === undefined ? {} : { receipt: entry.value.receipt }),
337
336
  });
338
337
  }
339
338
  }
@@ -568,14 +567,15 @@ export function createRendererRecovery(deps: RendererRecoveryDependencies): Rend
568
567
  const candidateInternals = Object.create(internals) as WebGPURendererInternals &
569
568
  RenderSystemInternals;
570
569
  Object.defineProperties(candidateInternals, {
570
+ assets: { value: assets },
571
571
  device: { value: candidateState.device },
572
572
  context: { value: candidateState.context },
573
573
  deviceScope: { value: candidateState.scope },
574
574
  gpuStore: { value: candidateState.gpuStore },
575
575
  dynamicTextureStore: { value: candidateState.dynamicTextureStore },
576
- recoveryColdWorkGuard: { value: undefined },
577
576
  getMaterialShaderPipeline: { value: getMaterialShaderPipeline },
578
577
  getMaterialShaderPipelineEntry: { value: getMaterialShaderPipelineEntry },
578
+ getMaterialShaderArtifact: { value: getMaterialShaderArtifact },
579
579
  getMaterialShaderBindingContract: { value: getCachedMaterialShaderBindingContract },
580
580
  getParamSchema: { value: getParamSchema },
581
581
  getMaterialBindGroupLayout: { value: getMaterialBindGroupLayout },
@@ -594,20 +594,20 @@ export function createRendererRecovery(deps: RendererRecoveryDependencies): Rend
594
594
  value: (
595
595
  id: string,
596
596
  bgl: BindGroupLayout,
597
- colorFormat: GPUTextureFormat,
597
+ colorFormats: readonly GPUTextureFormat[],
598
598
  entryOverride?: PostProcessShaderEntry,
599
599
  ) => {
600
600
  const entry = entryOverride ?? candidateInternals.lookupPostProcess?.(id);
601
601
  if (entry === undefined || candidateInternals.buildPostProcessPipeline === undefined) {
602
602
  return null;
603
603
  }
604
- const key = `${id}|${colorFormat}|${postProcessShaderEntrySignature(entry)}`;
604
+ const key = `${id}|${colorFormats.join(',')}|${postProcessShaderEntrySignature(entry)}`;
605
605
  const cached = candidatePostProcessPipelineCache.get(key);
606
606
  if (cached !== undefined) return cached;
607
607
  const built = candidateInternals.buildPostProcessPipeline(
608
608
  entry,
609
609
  bgl,
610
- colorFormat,
610
+ colorFormats,
611
611
  postProcessShaderPipelineLabel(id, entry.source),
612
612
  );
613
613
  if (built === null) return null;
@@ -632,7 +632,7 @@ export function createRendererRecovery(deps: RendererRecoveryDependencies): Rend
632
632
  releaseCandidate();
633
633
  return err(new RecoverError('recover-device-unavailable'));
634
634
  }
635
- const graphPreparation = await renderSystem.prepareRecoveryGraphCandidate({
635
+ const graphPreparation = renderSystem.prepareRecoveryGraphCandidate({
636
636
  internals: candidateInternals,
637
637
  pipelineState: candidatePipelineState,
638
638
  });
@@ -872,7 +872,6 @@ export function createRendererRecovery(deps: RendererRecoveryDependencies): Rend
872
872
  candidatePostProcessResources,
873
873
  preparedRecoveryRoots,
874
874
  recoveryGraphCandidate,
875
- recoveryColdWorkGuard,
876
875
  );
877
876
  if (recoveryGraphCandidate !== undefined) {
878
877
  recoveryGraphCandidate = undefined;
@@ -21,6 +21,7 @@ import {
21
21
  STANDARD_POST_STAGE_NAMES,
22
22
  } from '../pipeline/standard-profile';
23
23
  import type {
24
+ FrameObservationDomain,
24
25
  Renderer,
25
26
  RendererError,
26
27
  RendererEventListener,
@@ -29,6 +30,7 @@ import type {
29
30
  RenderProfile,
30
31
  RenderResult,
31
32
  } from '../render-contract';
33
+ import { resolveSsaoParameters } from '../ssao-config';
32
34
  import type { RendererHostImplementation } from './host-contract';
33
35
  import { createRendererLifecycle, isRendererStateOperational } from './renderer-lifecycle';
34
36
 
@@ -88,6 +90,8 @@ export function exposeRenderer(renderer: RendererHostImplementation): Renderer {
88
90
  });
89
91
 
90
92
  return {
93
+ instances: renderer.instances,
94
+ bounds: (world, entity) => (disposed ? undefined : renderer.bounds(world, entity)),
91
95
  attach: (world) => {
92
96
  const result = renderer.attach(world);
93
97
  return result.ok
@@ -105,6 +109,8 @@ export function exposeRenderer(renderer: RendererHostImplementation): Renderer {
105
109
  candidate: DynamicGeometryCandidate,
106
110
  ordering: DynamicGeometryOrdering,
107
111
  ) => renderer.acceptDynamicGeometry(candidate, ordering),
112
+ acceptDynamicGeometryCandidates: (candidates, ordering) =>
113
+ renderer.acceptDynamicGeometryCandidates(candidates, ordering),
108
114
  dynamicGeometryReceipt: (candidate: DynamicGeometryCandidate) =>
109
115
  renderer.dynamicGeometryReceipt(candidate),
110
116
  cancelDynamicGeometry: (candidate: DynamicGeometryCandidate) =>
@@ -147,10 +153,19 @@ export function exposeRenderer(renderer: RendererHostImplementation): Renderer {
147
153
  kind: 'frame-submitted',
148
154
  frameId: result.value.frameId,
149
155
  deviceGeneration: result.value.deviceGeneration,
156
+ receipt: result.value,
150
157
  }),
151
158
  );
152
159
  return ok(result.value);
153
160
  },
161
+ requestObservation: (domains: readonly FrameObservationDomain[]) =>
162
+ renderer.requestObservation?.(domains) ??
163
+ err(
164
+ new RendererOperationError('renderer-state-invalid', {
165
+ operation: 'request-observation',
166
+ state: lifecycle.state(),
167
+ }),
168
+ ),
154
169
  inspect: () => ({ ...renderer.inspect(), state: lifecycle.state() }),
155
170
  observe: (receipt, request) => renderer.observe(receipt, request),
156
171
  subscribe: (listener) => {
@@ -337,9 +352,26 @@ export function validateRenderProfile(profile: RenderProfile): string | undefine
337
352
  if (profile.shadows !== 'off' && profile.shadows !== 'hard' && profile.shadows !== 'filtered') {
338
353
  return "RenderProfile.shadows must be 'off', 'hard', or 'filtered'";
339
354
  }
340
- for (const field of ['pbr', 'ibl', 'ssao'] as const) {
355
+ for (const field of ['pbr', 'ibl'] as const) {
341
356
  if (typeof profile[field] !== 'boolean') return `RenderProfile.${field} must be boolean`;
342
357
  }
358
+ if (
359
+ typeof profile.ssao !== 'boolean' &&
360
+ (typeof profile.ssao !== 'object' || profile.ssao === null || Array.isArray(profile.ssao))
361
+ )
362
+ return 'RenderProfile.ssao must be boolean or AO parameters';
363
+ if (typeof profile.ssao === 'object') {
364
+ if (
365
+ Object.keys(profile.ssao).some(
366
+ (key) => !['radius', 'bias', 'intensity', 'quality'].includes(key),
367
+ )
368
+ )
369
+ return 'RenderProfile.ssao contains an unsupported parameter';
370
+ const resolved = resolveSsaoParameters(profile.ssao);
371
+ if (!resolved.ok) return resolved.error.hint;
372
+ }
373
+ if (profile.ssao !== false && profile.renderPath !== 'deferred')
374
+ return 'SSAO needs current depth and normals: set renderPath to deferred';
343
375
  const stages = STANDARD_POST_STAGE_NAMES;
344
376
  if (
345
377
  !Array.isArray(profile.postStages) ||
@@ -354,6 +386,7 @@ export function validateRenderProfile(profile: RenderProfile): string | undefine
354
386
  export function freezeRenderProfile(profile: RenderProfile): RenderProfile {
355
387
  return Object.freeze({
356
388
  ...profile,
389
+ ssao: typeof profile.ssao === 'object' ? Object.freeze({ ...profile.ssao }) : profile.ssao,
357
390
  postStages: Object.freeze([...profile.postStages]) as RenderProfile['postStages'],
358
391
  });
359
392
  }
@@ -0,0 +1,13 @@
1
+ import type { RenderFeatureHost } from '../features/host';
2
+ import type { RenderInspection } from '../render-contract';
3
+
4
+ /** Project feature-host lifecycle facts without exposing the live host. */
5
+ export function projectRendererFeatureInspection(
6
+ featureHost: RenderFeatureHost | undefined,
7
+ ): Pick<RenderInspection, 'features' | 'featureDiagnostics' | 'featureHost'> {
8
+ return {
9
+ features: Object.freeze((featureHost?.features ?? []).map((feature) => feature.identity)),
10
+ featureDiagnostics: featureHost?.diagnostics() ?? Object.freeze([]),
11
+ ...(featureHost?.inspection === undefined ? {} : { featureHost: featureHost.inspection() }),
12
+ };
13
+ }