@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
@@ -1,3 +1,5 @@
1
+ import type { GpuDrivenPbrProgram } from '../gpu-driven/pbr-program';
2
+ import { transmissionBackdropAvailable } from './device-feature-admission';
1
3
  // WebGPU generation-scoped ready-state builder.
2
4
  // This owner performs one complete device-generation promotion; it receives
3
5
  // policy/adapters and returns a fully prepared PipelineState.
@@ -10,7 +12,7 @@ import {
10
12
  HANDLE_SPHERE,
11
13
  HANDLE_TRIANGLE,
12
14
  } from '@forgeax/engine-assets-runtime';
13
- import { deriveVertexLayoutProjection } from '@forgeax/engine-geometry';
15
+ import { deriveVertexCount, deriveVertexLayoutProjection } from '@forgeax/engine-geometry';
14
16
  import type {
15
17
  BindGroupLayout,
16
18
  Buffer,
@@ -26,6 +28,8 @@ import { ok, RhiError } from '@forgeax/engine-rhi';
26
28
  import { findVariantByKey, type ShaderCatalog } from '@forgeax/engine-shader';
27
29
  import type { ManifestEntry } from '@forgeax/engine-types';
28
30
  import { handleSlot } from '@forgeax/engine-types';
31
+ import { prewarmAtmosphereShaders } from './atmosphere-shader-prewarm';
32
+ import { prewarmSsrShaders } from './ssr-shader-prewarm';
29
33
 
30
34
  export type { MaterialShaderManifestEntry } from '@forgeax/engine-shader';
31
35
 
@@ -54,12 +58,13 @@ import {
54
58
  } from '../ibl/skylight-bind-group';
55
59
  import type { BloomInspection } from '../inspection-types';
56
60
  import type { DeviceScope, RhiErrorListenerRegistry } from '../lifecycle';
61
+ import { assertStorageBufferCap } from '../light-buffer-layout';
57
62
  import {
58
63
  buildPbrPipelineLayouts,
59
- buildPbrSkinLayouts,
60
64
  createHdrpSkinBindGroupLayoutDescriptor,
61
65
  type PipelineGroup2Contract,
62
66
  resolvePipelineGroup2Contract,
67
+ SKIN_MATERIAL_SHADER_ID,
63
68
  } from '../pbr-pipeline';
64
69
  import { STANDARD_CLUSTER_MEMBERSHIP_WGSL } from '../pipeline/standard-pipeline';
65
70
  import { inspectStandardBloomGraph } from '../pipeline/standard-post';
@@ -80,6 +85,8 @@ import type { BloomPersistentBundle } from '../record/render-context';
80
85
  import { SHADOW_CASTER_BUFFER_SIZE } from '../record/shadow-pass';
81
86
  import { POINTS_LINES_VIEW_BUFFER_SIZE } from '../record/view-ubo';
82
87
  import {
88
+ type AtmosphereShaderSources,
89
+ type SsrShaderSources,
83
90
  STANDARD_OUTPUT_TRANSFORM_FEATURE_ID,
84
91
  type VolumetricFogShaderSources,
85
92
  } from '../render-contract';
@@ -111,14 +118,15 @@ import {
111
118
  selectProbePrewarmVariants,
112
119
  selectStandardPbrTransmissionPrewarmVariants,
113
120
  } from './shader-prewarm-policy';
121
+ import { buildGpuDrivenPbrReadyLayouts, buildGpuDrivenPbrReadyModules } from './webgpu-pbr-ready';
114
122
  import {
115
123
  BLUR_PARAMS_BYTES,
116
124
  BRIGHT_PARAMS_BYTES,
117
125
  COMPOSITE_PARAMS_BYTES,
118
126
  HDR_COLOR_ATTACHMENT_FORMAT,
119
- MIPMAP_PREWARM_FORMATS,
120
127
  VIEW_UBO_BYTES,
121
128
  } from './webgpu-ready-contract';
129
+ import { prewarmMipmapPipeline } from './webgpu-ready-mipmap';
122
130
 
123
131
  /**
124
132
  * Build the `Renderer.initialization` Promise (D-S3 three-step strict-serial chain).
@@ -160,6 +168,7 @@ export async function buildReadyWebGPU(
160
168
  * frame while the shared async shader adapter is still warming up.
161
169
  */
162
170
  requiredMaterialShaders: readonly string[],
171
+ standardPbrShaderUvSetCount: number,
163
172
  /** Fullscreen feature modules compiled before the first synchronous frame. */
164
173
  requiredFullscreenPostProcesses: readonly {
165
174
  readonly identity: string;
@@ -215,12 +224,22 @@ export async function buildReadyWebGPU(
215
224
  }) => void,
216
225
  /** Install manifest-owned volume utility sources only after all four modules compile. */
217
226
  setVolumetricFogShaderSources: (sources: VolumetricFogShaderSources) => void,
227
+ /** Install manifest-owned SSR utility sources only after all five modules compile. */
228
+ setSsrShaderSources: (sources: SsrShaderSources) => void,
229
+ /** Install manifest-owned atmosphere utility sources only after all modules compile. */
230
+ setAtmosphereShaderSources: (sources: AtmosphereShaderSources) => void,
218
231
  ): Promise<PipelineState> {
219
232
  const extendedLightingShaderAvailable = deriveExtendedLightingCapability(rhiDevice).admitted;
220
- // Shader layouts and record-stage buffer usage share the RHI capability.
221
- // Backend names and numeric limits must not independently re-enable storage.
222
- const storageBufferCapable = rhiDevice.caps.storageBuffer;
233
+ // Shader and layout construction consume the same storage capability.
234
+ const capValue = (rhiDevice.limits as Readonly<Record<string, number>>)
235
+ .maxStorageBuffersPerShaderStage;
223
236
  const webgl2Downlevel = rhiDevice.caps.backendKind === 'wgpu-webgl2';
237
+ let storageBufferCapable = !webgl2Downlevel && rhiDevice.caps.storageBuffer;
238
+ if (typeof capValue === 'number') {
239
+ const capCheck = assertStorageBufferCap(capValue);
240
+ storageBufferCapable =
241
+ capCheck.ok && !webgl2Downlevel && rhiDevice.caps.storageBuffer && capCheck.value;
242
+ }
224
243
  const directionalPcssAvailable =
225
244
  rhiDevice.caps.backendKind === 'webgpu' || rhiDevice.caps.backendKind === 'wgpu-native';
226
245
  const projectorAvailable =
@@ -292,6 +311,8 @@ export async function buildReadyWebGPU(
292
311
  manifestEntries.push(entry);
293
312
  }
294
313
  let pbrModule: ShaderModule | null = null;
314
+ let pbrSkinModule: ShaderModule | null = null;
315
+ let gpuDrivenPbrPrograms: ReadonlyMap<string, GpuDrivenPbrProgram> = new Map();
295
316
  let unlitModule: ShaderModule | null = null;
296
317
  let spriteModule: ShaderModule | null = null;
297
318
  let spriteLitModule: ShaderModule | null = null;
@@ -339,6 +360,9 @@ export async function buildReadyWebGPU(
339
360
  // brdfLutBake_fs) which survive naga_oil composition unchanged.
340
361
  // - unlit.wgsl: none of the above markers → falls into the unlit slot.
341
362
  let pbrEntry = findEngineManifestEntry('forgeax::default-standard-pbr');
363
+ let pbrSkinEntry =
364
+ findEngineManifestEntry(SKIN_MATERIAL_SHADER_ID) ??
365
+ findEngineManifestEntry('forgeax::default-standard-pbr-skin');
342
366
  let unlitEntry = findEngineManifestEntry('forgeax::default-unlit');
343
367
  let tonemapEntry: ManifestEntry | undefined;
344
368
  let motionBlurEntry: ManifestEntry | undefined;
@@ -356,6 +380,7 @@ export async function buildReadyWebGPU(
356
380
  let iblIrradianceEntry: ManifestEntry | undefined;
357
381
  let iblPrefilterEntry: ManifestEntry | undefined;
358
382
  let iblBrdfLutEntry: ManifestEntry | undefined;
383
+ let probeBackgroundEntry: ManifestEntry | undefined;
359
384
  let fxaaEntry: ManifestEntry | undefined;
360
385
  let skyboxEntry: ManifestEntry | undefined;
361
386
  let bloomBrightEntry: ManifestEntry | undefined;
@@ -411,6 +436,10 @@ export async function buildReadyWebGPU(
411
436
  iblBrdfLutEntry ??= entry;
412
437
  continue;
413
438
  }
439
+ if (entry.wgsl.includes('probe_background_fs')) {
440
+ probeBackgroundEntry ??= entry;
441
+ continue;
442
+ }
414
443
  if (entry.wgsl.includes('f_schlick')) {
415
444
  pbrEntry ??= entry;
416
445
  continue;
@@ -492,6 +521,7 @@ export async function buildReadyWebGPU(
492
521
  const exact = ms.variants.find(
493
522
  (v) =>
494
523
  v.defines.STORAGE_BUFFER_AVAILABLE === false &&
524
+ v.defines.COVERAGE_ONLY !== true &&
495
525
  (!('CLUSTER_FORWARD_AVAILABLE' in v.defines) ||
496
526
  v.defines.CLUSTER_FORWARD_AVAILABLE === false) &&
497
527
  (!('VERTEX_COLOR_AVAILABLE' in v.defines) ||
@@ -534,6 +564,7 @@ export async function buildReadyWebGPU(
534
564
  const exact = ms.variants.find(
535
565
  (variant) =>
536
566
  variant.defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable &&
567
+ variant.defines.COVERAGE_ONLY !== true &&
537
568
  (!('CLUSTER_FORWARD_AVAILABLE' in variant.defines) ||
538
569
  variant.defines.CLUSTER_FORWARD_AVAILABLE === false) &&
539
570
  (!('VERTEX_COLOR_AVAILABLE' in variant.defines) ||
@@ -562,6 +593,12 @@ export async function buildReadyWebGPU(
562
593
  return wgsl !== undefined ? { ...entry, wgsl } : entry;
563
594
  };
564
595
  pbrEntry = patchRuntimeVariant(pbrEntry, 'forgeax::default-standard-pbr');
596
+ if (pbrSkinEntry !== undefined) {
597
+ pbrSkinEntry = patchRuntimeVariant(
598
+ patchRuntimeVariant(pbrSkinEntry, SKIN_MATERIAL_SHADER_ID),
599
+ 'forgeax::default-standard-pbr-skin',
600
+ );
601
+ }
565
602
  unlitEntry = patchRuntimeVariant(unlitEntry, 'forgeax::default-unlit');
566
603
  if (shadowCasterEntry !== undefined) {
567
604
  shadowCasterEntry = patchRuntimeVariant(shadowCasterEntry, 'forgeax::default-shadow-caster');
@@ -606,13 +643,7 @@ export async function buildReadyWebGPU(
606
643
  }
607
644
  }
608
645
  }
609
- // Wire composed IBL shaders into IblPipelineCache before the cache's
610
- // createIblPipelines runs (called downstream by the internal
611
- // GpuResidencyCache equirect-to-cubemap projection during the first Skylight
612
- // dispatch). When all 4 are present, register them; otherwise leave
613
- // the cache untouched (charter F1: tests / non-IBL hosts that ship
614
- // empty / 3-entry manifests still boot, and the IBL pipeline cache's
615
- // own error surfacing covers the "missing" case downstream).
646
+ // Publish the generation's compiled IBL programs before resource preparation.
616
647
  if (
617
648
  iblEquirectEntry !== undefined &&
618
649
  iblIrradianceEntry !== undefined &&
@@ -624,6 +655,9 @@ export async function buildReadyWebGPU(
624
655
  irradiance: iblIrradianceEntry.wgsl,
625
656
  prefilter: iblPrefilterEntry.wgsl,
626
657
  brdfLut: iblBrdfLutEntry.wgsl,
658
+ ...(probeBackgroundEntry === undefined
659
+ ? {}
660
+ : { probeBackground: probeBackgroundEntry.wgsl }),
627
661
  });
628
662
  }
629
663
  // Points/Lines are an engine-owned record path rather than a producer
@@ -675,6 +709,23 @@ export async function buildReadyWebGPU(
675
709
  if (!shaderResult.ok) throw shaderResult.error;
676
710
  seedShaderModule(label, shaderResult.value);
677
711
  }
712
+ const compileUtilityShader = async (
713
+ label: string,
714
+ source: string,
715
+ context: string,
716
+ ): Promise<ShaderModule> => {
717
+ const result = await runShimStep(
718
+ () =>
719
+ asyncCreateShaderModule
720
+ ? asyncCreateShaderModule(rhiDevice, { code: source, label })
721
+ : invokeDeviceCreateShaderModule(rhiDevice, { code: source, label }),
722
+ 'shader-compile-failed',
723
+ `${context} shader module '${label}' compiled`,
724
+ `inspect manifest WGSL for '${label}' and check device.features`,
725
+ );
726
+ if (!result.ok) throw result.error;
727
+ return result.value;
728
+ };
678
729
  if (rhiDevice.caps.compute && rhiDevice.caps.storageTexture) {
679
730
  const volumeSources = [
680
731
  ['inject', 'volume_inject', (source: string) => source.includes('fn volume_inject(')],
@@ -709,17 +760,12 @@ export async function buildReadyWebGPU(
709
760
  }> = [];
710
761
  for (const { stage, label, entry } of resolved) {
711
762
  if (entry === undefined) throw new Error(`missing volumetric shader ${label}`);
712
- const shaderResult = await runShimStep(
713
- () =>
714
- asyncCreateShaderModule
715
- ? asyncCreateShaderModule(rhiDevice, { code: entry.wgsl, label })
716
- : invokeDeviceCreateShaderModule(rhiDevice, { code: entry.wgsl, label }),
717
- 'shader-compile-failed',
718
- `volumetric fog shader module '${label}' compiled`,
719
- `inspect manifest WGSL for '${label}' and check device.features`,
720
- );
721
- if (!shaderResult.ok) throw shaderResult.error;
722
- compiled.push({ stage, label, source: entry.wgsl, module: shaderResult.value });
763
+ compiled.push({
764
+ stage,
765
+ label,
766
+ source: entry.wgsl,
767
+ module: await compileUtilityShader(label, entry.wgsl, 'volumetric fog'),
768
+ });
723
769
  }
724
770
  for (const { label, module } of compiled) seedShaderModule(label, module);
725
771
  setVolumetricFogShaderSources({
@@ -730,6 +776,20 @@ export async function buildReadyWebGPU(
730
776
  });
731
777
  }
732
778
  }
779
+ if (rhiDevice.caps.compute && rhiDevice.caps.storageTexture) {
780
+ const sources = await prewarmSsrShaders(
781
+ manifestEntries,
782
+ (label, source) => compileUtilityShader(label, source, 'SSR'),
783
+ seedShaderModule,
784
+ );
785
+ if (sources !== undefined) setSsrShaderSources(sources);
786
+ }
787
+ const atmosphereSources = await prewarmAtmosphereShaders(
788
+ manifestEntries,
789
+ (label, source) => compileUtilityShader(label, source, 'Atmosphere'),
790
+ seedShaderModule,
791
+ );
792
+ if (atmosphereSources !== undefined) setAtmosphereShaderSources(atmosphereSources);
733
793
  const pbrShaderResult = await runShimStep(
734
794
  () =>
735
795
  asyncCreateShaderModule
@@ -751,6 +811,27 @@ export async function buildReadyWebGPU(
751
811
  const pbrManifestEntry = [...registry.materialShaderManifestEntries()].find(
752
812
  (entry) => entry.identifier === 'forgeax::default-standard-pbr',
753
813
  );
814
+ const pbrSkinManifestEntry =
815
+ [...registry.materialShaderManifestEntries()].find(
816
+ (entry) => entry.identifier === SKIN_MATERIAL_SHADER_ID,
817
+ ) ??
818
+ [...registry.materialShaderManifestEntries()].find(
819
+ (entry) => entry.identifier === 'forgeax::default-standard-pbr-skin',
820
+ );
821
+ const gpuDrivenModules = await buildGpuDrivenPbrReadyModules({
822
+ device: rhiDevice,
823
+ storageBufferCapable,
824
+ asyncCreateShaderModule,
825
+ pbrSkinEntry,
826
+ pbrManifestEntry,
827
+ pbrSkinManifestEntry,
828
+ extendedLightingShaderAvailable,
829
+ directionalPcssAvailable,
830
+ projectorAvailable,
831
+ seedShaderModule,
832
+ });
833
+ pbrSkinModule = gpuDrivenModules.pbrSkinModule;
834
+ gpuDrivenPbrPrograms = gpuDrivenModules.gpuDrivenPbrPrograms;
754
835
  const pbrVariant = pbrManifestEntry?.variants.find(
755
836
  (variant) => variant.composedWgsl === pbrEntry.wgsl,
756
837
  );
@@ -903,7 +984,8 @@ export async function buildReadyWebGPU(
903
984
  const coloredUnlitVariant = unlitManifestEntry?.variants.find(
904
985
  (variant) =>
905
986
  variant.defines.VERTEX_COLOR_AVAILABLE === true &&
906
- variant.defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable,
987
+ variant.defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable &&
988
+ variant.defines.COVERAGE_ONLY !== true,
907
989
  );
908
990
  if (coloredUnlitVariant !== undefined && coloredUnlitVariant.composedWgsl !== unlitEntry.wgsl) {
909
991
  const coloredUnlitShaderResult = await runShimStep(
@@ -930,7 +1012,8 @@ export async function buildReadyWebGPU(
930
1012
  const uncoloredUnlitVariant = unlitManifestEntry?.variants.find(
931
1013
  (variant) =>
932
1014
  variant.defines.VERTEX_COLOR_AVAILABLE === false &&
933
- variant.defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable,
1015
+ variant.defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable &&
1016
+ variant.defines.COVERAGE_ONLY !== true,
934
1017
  );
935
1018
  if (uncoloredUnlitVariant !== undefined) {
936
1019
  seedShaderModule(
@@ -1328,7 +1411,10 @@ export async function buildReadyWebGPU(
1328
1411
  // feat-20260612-hdrp-ssao M6 / w27: SSAO shader module compilation.
1329
1412
  // Optional manifest entry — absent on legacy manifests (zero-overhead
1330
1413
  // opt-out, same as bloom). Identified by 'fs_ssao_calc' content marker.
1331
- if (ssaoEntry !== undefined) {
1414
+ // The GLES translator cannot read raw depth through this SSAO program.
1415
+ // Keep optional AO out of fallback startup; requesting it is refused by
1416
+ // the record owner instead of breaking every AO-disabled renderer.
1417
+ if (ssaoEntry !== undefined && !webgl2Downlevel) {
1332
1418
  const entry = ssaoEntry;
1333
1419
  const ssaoShaderResult = await runShimStep(
1334
1420
  () =>
@@ -1377,6 +1463,9 @@ export async function buildReadyWebGPU(
1377
1463
  storageBuffer: storageBufferCapable,
1378
1464
  extendedLighting: extendedLightingShaderAvailable,
1379
1465
  projectorAvailable,
1466
+ transmissionBackdrop: transmissionBackdropAvailable(
1467
+ rhiDevice.limits.maxSampledTexturesPerShaderStage,
1468
+ ),
1380
1469
  }),
1381
1470
  ),
1382
1471
  'webgpu-runtime-error',
@@ -1402,6 +1491,7 @@ export async function buildReadyWebGPU(
1402
1491
  // (URP layout) so the manifest entry's URP variant WGSL still builds a
1403
1492
  // valid PSO instead of hard-disabling the entire HDRP-variant build path.
1404
1493
  let hdrpPbrPipelineLayoutHandle: PipelineLayout | null = null;
1494
+ let hdrpMeshBindGroupLayoutHandle: BindGroupLayout | null = null;
1405
1495
  let hdrpProbePbrPipelineLayoutHandle: PipelineLayout | null = null;
1406
1496
  // The cluster layout is storage-buffer backed. On the WebGL2/fallback
1407
1497
  // capability tier its uniform-buffer projection exceeds the backend's
@@ -1410,6 +1500,7 @@ export async function buildReadyWebGPU(
1410
1500
  const hdrpUnifiedBglDesc = createHdrpBindGroupLayoutDescriptor();
1411
1501
  const hdrpUnifiedBglRes = rhiDevice.createBindGroupLayout(hdrpUnifiedBglDesc);
1412
1502
  if (hdrpUnifiedBglRes.ok) {
1503
+ hdrpMeshBindGroupLayoutHandle = hdrpUnifiedBglRes.value;
1413
1504
  const hdrpPlRes = rhiDevice.createPipelineLayout({
1414
1505
  label: 'hdrp-pbr-pl',
1415
1506
  bindGroupLayouts: [
@@ -1487,45 +1578,16 @@ export async function buildReadyWebGPU(
1487
1578
  }
1488
1579
  }
1489
1580
 
1490
- // bug-20260611-skin-pipeline-layout-mesh-array-bgl-2bindings: boot-time
1491
- // build of the skin-variant PipelineLayout. Mirrors the HDRP block above
1492
- // (D-2 / D-3 in plan-strategy): reuse view / material / instances BGLs
1493
- // from `pbrLayouts` and only create a 2-entry mesh-array BGL (binding 0
1494
- // meshes + binding 1 palette) so the `forgeax::pbr-skin` shader's
1495
- // `@group(2) @binding(1) palette` declaration validates. Stays null when
1496
- // createBindGroupLayout / createPipelineLayout fails;
1497
- // selectPipelineLayoutForVariant returns null in that case (charter P3
1498
- // explicit failure -- no silent fallback to URP layout, mirroring memory
1499
- // anchor `hdrp-active-must-not-fallback-to-urp-pipeline`).
1500
- let pbrSkinPipelineLayoutHandle: PipelineLayout | null = null;
1501
- let pbrSkinProbePipelineLayoutHandle: PipelineLayout | null = null;
1502
- // feat-20260611 R2 / M8 / w28: capture the 2-binding skin mesh-array BGL
1503
- // produced by `buildPbrSkinLayouts` so the record stage can build a BG
1504
- // matching `pbr-skin-pl` (pipeline-layout BGL[2] is this 2-entry skin
1505
- // BGL, NOT the 1-entry `pbr-mesh-array-bgl`). The BGL handle stays null
1506
- // when the skin pipeline layout itself failed to build, keeping the skin
1507
- // path explicitly disabled (charter P3 — record-stage falls back to URP
1508
- // path which is correct for non-skin entries; skin entries hit the
1509
- // explicit-failure branch).
1510
- let pbrSkinMeshBindGroupLayoutHandle: BindGroupLayout | null = null;
1581
+ const {
1582
+ pbrSkinPipelineLayout: pbrSkinPipelineLayoutHandle,
1583
+ pbrSkinProbePipelineLayout: pbrSkinProbePipelineLayoutHandle,
1584
+ pbrSkinMeshBindGroupLayout: pbrSkinMeshBindGroupLayoutHandle,
1585
+ gpuDrivenInstancesBindGroupLayout: gpuDrivenInstancesBindGroupLayoutHandle,
1586
+ gpuDrivenPbrPipelineLayout: gpuDrivenPbrPipelineLayoutHandle,
1587
+ gpuDrivenPbrSkinPipelineLayout: gpuDrivenPbrSkinPipelineLayoutHandle,
1588
+ } = buildGpuDrivenPbrReadyLayouts(rhiDevice, storageBufferCapable, pbrLayouts.value);
1511
1589
  let hdrpSkinPipelineLayoutHandle: PipelineLayout | null = null;
1512
1590
  let hdrpSkinMeshBindGroupLayoutHandle: BindGroupLayout | null = null;
1513
- {
1514
- const skinLayoutsResult = runShimSyncStep(
1515
- () =>
1516
- ok(
1517
- buildPbrSkinLayouts(rhiDevice, { storageBuffer: storageBufferCapable }, pbrLayouts.value),
1518
- ),
1519
- 'webgpu-runtime-error',
1520
- 'buildPbrSkinLayouts succeeded',
1521
- 'check device.limits.maxBindingsPerBindGroup (need >=14) and maxBindGroupsPerPipelineLayout',
1522
- );
1523
- if (skinLayoutsResult.ok) {
1524
- pbrSkinPipelineLayoutHandle = skinLayoutsResult.value.pipelineLayout;
1525
- pbrSkinProbePipelineLayoutHandle = skinLayoutsResult.value.probePipelineLayout;
1526
- pbrSkinMeshBindGroupLayoutHandle = skinLayoutsResult.value.meshArrayBgl;
1527
- }
1528
- }
1529
1591
  if (storageBufferCapable) {
1530
1592
  const skinBglResult = rhiDevice.createBindGroupLayout(
1531
1593
  createHdrpSkinBindGroupLayoutDescriptor(),
@@ -1733,6 +1795,13 @@ export async function buildReadyWebGPU(
1733
1795
  // M-3 / w12: builtin direct-upload fallback path mirrors the gpuStore
1734
1796
  // mesh entry shape -- raw RHI Buffer handles are wrapped in GpuBuffer so
1735
1797
  // the dispose chain (M-5) can walk them via `.destroy()`.
1798
+ const layoutProjection = deriveVertexLayoutProjection(asset.attributes);
1799
+ const vertexCount = deriveVertexCount(asset.vertices, layoutProjection);
1800
+ if (vertexCount === undefined) {
1801
+ throw new Error(
1802
+ `builtin mesh ${id} has vertex bytes that do not match its layout projection`,
1803
+ );
1804
+ }
1736
1805
  meshHandles.set(id, {
1737
1806
  vertexBuffer: new GpuBuffer(rhiDevice, vboResult.value),
1738
1807
  indexBuffer: ibo === null ? null : new GpuBuffer(rhiDevice, ibo),
@@ -1740,17 +1809,10 @@ export async function buildReadyWebGPU(
1740
1809
  iboBytes: meshIndices === undefined ? 0 : indexBytes,
1741
1810
  indexCount: meshIndices?.length ?? 0,
1742
1811
  indexFormat: meshIndices instanceof Uint32Array ? 'uint32' : 'uint16',
1743
- // bug-20260519: BUILTIN_CUBE / BUILTIN_TRIANGLE migrated to 12F
1744
- // (position + normal + uv + tangent), so the fallback literal mirrors
1745
- // every other mesh upload site.
1746
- layout: '12F',
1747
- layoutProjection: deriveVertexLayoutProjection(asset.attributes),
1812
+ layoutProjection,
1748
1813
  // BUILTIN_CUBE / BUILTIN_TRIANGLE are single-UV (set 0 only).
1749
1814
  uvSetCount: 1,
1750
- vertexCount:
1751
- asset.vertices.length /
1752
- (deriveVertexLayoutProjection(asset.attributes).arrayStride /
1753
- Float32Array.BYTES_PER_ELEMENT),
1815
+ vertexCount,
1754
1816
  indexed: meshIndices !== undefined,
1755
1817
  topology: asset.submeshes[0]?.topology ?? 'triangle-list',
1756
1818
  submeshes: asset.submeshes,
@@ -1968,22 +2030,6 @@ export async function buildReadyWebGPU(
1968
2030
  );
1969
2031
  if (!defaultSamplerResult.ok) throw defaultSamplerResult.error;
1970
2032
 
1971
- const nearestSamplerResult = runShimSyncStep(
1972
- () =>
1973
- rhiDevice.createSampler({
1974
- label: 'nearest-sampler',
1975
- magFilter: 'nearest',
1976
- minFilter: 'nearest',
1977
- mipmapFilter: 'nearest',
1978
- addressModeU: 'clamp-to-edge',
1979
- addressModeV: 'clamp-to-edge',
1980
- }),
1981
- 'webgpu-runtime-error',
1982
- 'createSampler (nearest) succeeded',
1983
- 'check device.limits.maxSamplersPerShaderStage',
1984
- );
1985
- if (!nearestSamplerResult.ok) throw nearestSamplerResult.error;
1986
-
1987
2033
  // feat-20260520-directional-light-shadow-mapping M1c / w8 + M2 / w14:
1988
2034
  // shadow comparison sampler — clamp-to-edge, linear filter, compare:'less'.
1989
2035
  // Used for shadow map sampling in M2/M3 and shadow depth pass. comparison
@@ -2070,9 +2116,9 @@ export async function buildReadyWebGPU(
2070
2116
  extendedLightingShaderAvailable,
2071
2117
  );
2072
2118
 
2073
- // Normal-slot fallback: 1x1 RGBA8 (128, 128, 255, 255). pbr.wgsl decodes
2074
- // sample.rg * 2 - 1 + z = sqrt(1 - x^2 - y^2), so RG=(128,128)=0.5 maps
2075
- // to tangent (0, 0, 1) -- zero perturbation when normalTexture is absent.
2119
+ // A declared normal map that is not ready needs an exactly neutral sample.
2120
+ // RGBA8 cannot encode 0.5: 128/255 perturbs the reflected ray even on a
2121
+ // perfectly flat surface. Half float stores (0.5, 0.5, 1, 1) exactly.
2076
2122
  // Cannot share the white fallback (255,255,...) because RG=(255,255)=1.0
2077
2123
  // gives tangent.xy=(1,1) -> 1 - 2 = -1 under the sqrt -> NaN (saturate
2078
2124
  // clamps to 0 z=0, still wrong). White-on-missing semantics for baseColor
@@ -2086,7 +2132,7 @@ export async function buildReadyWebGPU(
2086
2132
  mipLevelCount: 1,
2087
2133
  sampleCount: 1,
2088
2134
  dimension: '2d',
2089
- format: 'rgba8unorm',
2135
+ format: 'rgba16float',
2090
2136
  usage: GPU_TEXTURE_USAGE_TEXTURE_BINDING | GPU_TEXTURE_USAGE_COPY_DST,
2091
2137
  viewFormats: [],
2092
2138
  textureBindingViewDimension: undefined,
@@ -2098,10 +2144,7 @@ export async function buildReadyWebGPU(
2098
2144
  if (!fallbackNormalTextureResult.ok) throw fallbackNormalTextureResult.error;
2099
2145
 
2100
2146
  const fallbackNormalPixel = new Uint8Array(FALLBACK_BYTES_PER_ROW);
2101
- fallbackNormalPixel[0] = 128;
2102
- fallbackNormalPixel[1] = 128;
2103
- fallbackNormalPixel[2] = 255;
2104
- fallbackNormalPixel[3] = 255;
2147
+ new Uint16Array(fallbackNormalPixel.buffer).set([0x3800, 0x3800, 0x3c00, 0x3c00]);
2105
2148
  const fallbackNormalWriteResult = runShimSyncStep(
2106
2149
  () =>
2107
2150
  queue.writeTexture(
@@ -2650,9 +2693,10 @@ export async function buildReadyWebGPU(
2650
2693
  // - fragment.targets[0].blend: premultiplied alpha (vs no blend)
2651
2694
  // - depthStencil.depthWriteEnabled: false (vs true)
2652
2695
  // - depthStencil.depthCompare: 'less-equal' (vs 'less')
2653
- // The vertex stride stays 12F (HANDLE_QUAD passes through the same
2654
- // 12-float interleaved layout as procedural meshes), so no new vertex
2655
- // pipeline branch is needed in the record stage (plan-strategy §3 RT4).
2696
+ // The vertex stride comes from the geometry-owned projection (HANDLE_QUAD
2697
+ // passes through the same 12-float interleaved layout as procedural meshes),
2698
+ // so no new vertex pipeline branch is needed in the record stage
2699
+ // (plan-strategy §3 RT4).
2656
2700
  //
2657
2701
  // Premultiplied alpha blend op (`{ srcFactor: 'one', dstFactor:
2658
2702
  // 'one-minus-src-alpha', operation: 'add' }`) is the industry-default for
@@ -3833,37 +3877,14 @@ export async function buildReadyWebGPU(
3833
3877
  }
3834
3878
  }
3835
3879
 
3836
- // feat-20260601-device/gpu-residency-extraction M1 (D-9 sub-contract 1): prewarm
3837
- // the mipmap pipeline cache for the smoke texture formats while still on the
3838
- // async `renderer.initialization` path. This builds the one-time mipmap shader module +
3839
- // per-format pipeline into the deviceCache so the record-stage texture
3840
- // ensureResident (sync) reproduces the pre-extraction async uploadTexture
3841
- // byte-for-byte without an async stall in the synchronous draw frame. A build
3842
- // failure here is surfaced through ready's reject channel (structured RhiError).
3843
- //
3844
- // Gated on `manifestEntries.length > 0` (the same Camera-only / clear-pass
3845
- // skip as the Step-2 pipeline compile, bug-20260519 D-3): a zero-manifest
3846
- // world renders no material geometry, so no texture is ever made resident and
3847
- // the mipmap shader-module build (a `createShaderModule` call) must not fire
3848
- // -- preserving the zero-manifest "0 createShaderModule" invariant
3849
- // (renderer-ready.test.ts AC-02).
3850
- if (manifestEntries.length > 0) {
3851
- const prewarmRes = await gpuStore.prewarmMipmapPipeline(rhiDevice, MIPMAP_PREWARM_FORMATS);
3852
- if (!prewarmRes.ok) throw prewarmRes.error;
3853
- }
3880
+ await prewarmMipmapPipeline(rhiDevice, gpuStore, manifestEntries.length > 0);
3854
3881
 
3855
3882
  const pipelineState: PipelineState = {
3856
3883
  device: rhiDevice,
3857
- // feat-20260518-pbr-direct-lighting-mvp M5 / w22.10 (AC-06 dual->triple
3858
- // pipeline + D-2 + D-10): three distinct GPU render-pipeline handles
3859
- // backed by 2 distinct shader modules (unlit + pbr) x 2 vertex stride
3860
- // configurations (6F builtin + 12F procedural; the 6F + pbr combination
3861
- // does not exist per D-2). All three share the identical 4-BindGroupLayout
3862
- // chain so material BG entries built once compose for each of the three
3863
- // pipelines (charter P5 consistent abstraction). The legacy `pipeline`
3864
- // alias field has been retired; consumers select per
3865
- // (mat.materialShaderId, mesh.layout) tuple via the record-stage three-way
3866
- // setPipeline branch (w22.11).
3884
+ // The ready state keeps one canonical mesh vertex projection from the
3885
+ // geometry owner. Material selection and feature layout identity are
3886
+ // derived from that projection; no legacy stride discriminator participates
3887
+ // in pipeline or record routing.
3867
3888
  // bug-20260519: BUILTIN cube migrated to 12F so the legacy
3868
3889
  // `unlitBuiltinPipeline` (+ its zero-stride `unlitBuiltinDummyAttrBuffer`)
3869
3890
  // is gone; consumers pick per `mat.materialShaderId` only via the record-stage
@@ -3876,6 +3897,9 @@ export async function buildReadyWebGPU(
3876
3897
  // (see definition near SPEC_CONST boot-time pre-warm block above)
3877
3898
  unlitPipeline: getCachedPipelineOrNull('forgeax::default-unlit', false, 1),
3878
3899
  standardPipeline: getCachedPipelineOrNull('forgeax::default-standard-pbr', false, 1),
3900
+ standardPbrShaderModule: pbrModule,
3901
+ pbrSkinShaderModule: pbrSkinModule,
3902
+ standardPbrShaderUvSetCount,
3879
3903
  unlitPipelineMsaa: getCachedPipelineOrNull('forgeax::default-unlit', false, 4),
3880
3904
  // feat-20260625-refactor-sprite-as-transparent-mesh M3 / w14 (D-7):
3881
3905
  // four sprite-dedicated boot-time pre-warms are gone. Sprite PSO now
@@ -3893,9 +3917,17 @@ export async function buildReadyWebGPU(
3893
3917
  // standard pipeline fields above).
3894
3918
  pbrPipelineLayout:
3895
3919
  unlitModule !== null && pbrModule !== null ? pipelineLayoutResult.value : null,
3920
+ gpuDrivenInstancesBindGroupLayout:
3921
+ unlitModule !== null && pbrModule !== null ? gpuDrivenInstancesBindGroupLayoutHandle : null,
3922
+ gpuDrivenPbrPipelineLayout:
3923
+ unlitModule !== null && pbrModule !== null ? gpuDrivenPbrPipelineLayoutHandle : null,
3924
+ gpuDrivenPbrPrograms,
3925
+ gpuDrivenPbrSkinPipelineLayout:
3926
+ unlitModule !== null && pbrModule !== null ? gpuDrivenPbrSkinPipelineLayoutHandle : null,
3896
3927
  // HDRP variant uses the unified group(2) layout built above.
3897
3928
  hdrpPbrPipelineLayout:
3898
3929
  unlitModule !== null && pbrModule !== null ? hdrpPbrPipelineLayoutHandle : null,
3930
+ hdrpMeshBindGroupLayout: hdrpMeshBindGroupLayoutHandle,
3899
3931
  hdrpProbePbrPipelineLayout:
3900
3932
  unlitModule !== null && pbrModule !== null ? hdrpProbePbrPipelineLayoutHandle : null,
3901
3933
  hdrpClusterMembershipPipeline,
@@ -3937,11 +3969,9 @@ export async function buildReadyWebGPU(
3937
3969
  probeInstancesBindGroupLayout: probeInstancesBglResult.value,
3938
3970
  identityInstanceBuffer: identityInstanceResult.value,
3939
3971
  defaultSampler: defaultSamplerResult.value,
3940
- nearestSampler: nearestSamplerResult.value,
3941
3972
  fallbackTextureView: fallbackTextureViewResult.value,
3942
3973
  defaultWhiteTextureView: fallbackTextureViewResult.value,
3943
- // Normal-slot fallback view (1x1 RGBA8 (128,128,255,255)). RG=(128,128)
3944
- // decodes to tangent (0,0,1) under pbr.wgsl's RG-only normal decoder.
3974
+ // Exactly neutral half-float RG=(0.5,0.5) decodes to tangent (0,0,1).
3945
3975
  // Distinct from defaultWhiteTextureView because RG=(255,255)=1.0 gives
3946
3976
  // sqrt(1 - 1 - 1) = NaN, breaking the no-normal-map case.
3947
3977
  defaultNormalTextureView: fallbackNormalTextureViewResult.value,
@@ -0,0 +1,85 @@
1
+ import type { RhiCanvasContext, RhiDevice } from '@forgeax/engine-rhi';
2
+ import {
3
+ HealthListenerRegistry,
4
+ LostListenerRegistry,
5
+ RhiErrorListenerRegistry,
6
+ } from '../lifecycle';
7
+ import type { RendererOptions } from '../render-contract';
8
+ import type { RhiBackendPack } from './backend-contract';
9
+ import type { BundlerOptions } from './bundler-contract';
10
+ import { deviceOptionsForAdapter } from './device-feature-admission';
11
+ import type { RendererAssemblyImplementation } from './host-contract';
12
+ import { attachDeviceLostFanout } from './recovery/device-loss-fanout';
13
+ import type { WebGPUOutcome, WebGPURendererInternals } from './webgpu-renderer-contract';
14
+
15
+ export type { WebGPUOutcome, WebGPURendererInternals } from './webgpu-renderer-contract';
16
+
17
+ export type WebGPURendererFactory = (
18
+ internals: WebGPURendererInternals,
19
+ ) => Promise<RendererAssemblyImplementation>;
20
+
21
+ /** Acquire the selected backend and build one renderer generation. */
22
+ export async function tryCreateWebGPURenderer(
23
+ canvas: HTMLCanvasElement | OffscreenCanvas,
24
+ options: RendererOptions | undefined,
25
+ pack: RhiBackendPack,
26
+ bundler: BundlerOptions | undefined,
27
+ createRenderer: WebGPURendererFactory,
28
+ ): Promise<WebGPUOutcome> {
29
+ const importTransport = bundler?.importTransport;
30
+ const adapterResult = await pack.rhi.requestAdapter(undefined, canvas);
31
+ if (!adapterResult.ok) return { kind: 'rhi-err', error: adapterResult.error };
32
+ const adapter = adapterResult.value;
33
+ const deviceOpts = deviceOptionsForAdapter(adapter, options);
34
+ const result = await adapter.requestDevice(deviceOpts);
35
+ if (!result.ok) return { kind: 'rhi-err', error: result.error };
36
+ const device: RhiDevice = result.value;
37
+ const ctxResult = pack.rhi.acquireCanvasContext(canvas);
38
+ if (!ctxResult.ok) return { kind: 'rhi-err', error: ctxResult.error };
39
+ const context: RhiCanvasContext = ctxResult.value;
40
+
41
+ const lostRegistry = new LostListenerRegistry();
42
+ const errorRegistry = new RhiErrorListenerRegistry();
43
+ const healthRegistry = new HealthListenerRegistry();
44
+ const lossObserver: { current?: (detail: string) => void } = {};
45
+ const generationState: { current: number; onStaleLoss?: () => void } = { current: 0 };
46
+ attachDeviceLostFanout(device, pack, {
47
+ lostRegistry,
48
+ errorRegistry,
49
+ healthRegistry,
50
+ generation: 0,
51
+ currentGeneration: () => generationState.current,
52
+ onStaleLoss: () => generationState.onStaleLoss?.(),
53
+ onDeviceLost: (detail) => lossObserver.current?.(detail),
54
+ });
55
+
56
+ if (pack._internal_getRawDevice && pack.translateErrorEventToRhiError) {
57
+ const backendDevice = pack._internal_getRawDevice(device);
58
+ if (backendDevice && typeof backendDevice === 'object') {
59
+ const target = backendDevice as {
60
+ onuncapturederror?: ((event: unknown) => void) | null;
61
+ };
62
+ target.onuncapturederror = (event: unknown): void => {
63
+ const translated = pack.translateErrorEventToRhiError?.(event);
64
+ if (translated && !translated.ok) errorRegistry.fire(translated.error);
65
+ };
66
+ }
67
+ }
68
+ return {
69
+ kind: 'ok',
70
+ renderer: await createRenderer({
71
+ canvas,
72
+ device,
73
+ context,
74
+ options,
75
+ bundler,
76
+ lostRegistry,
77
+ errorRegistry,
78
+ healthRegistry,
79
+ pack,
80
+ importTransport,
81
+ lossObserver,
82
+ generationState,
83
+ }),
84
+ };
85
+ }