@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,5 +1,6 @@
1
1
  import type { World } from '@forgeax/engine-ecs';
2
2
  import { probeVideoHighPerfUpload } from '@forgeax/engine-graphics-extras';
3
+ import type { GraphResourceResolver } from '@forgeax/engine-render-graph';
3
4
  import {
4
5
  type BindGroup,
5
6
  RhiError,
@@ -7,16 +8,24 @@ import {
7
8
  type TextureView,
8
9
  } from '@forgeax/engine-rhi';
9
10
  import type { PassKind, PassSelector } from '@forgeax/engine-types';
10
- import { createHdrpUnifiedBindGroup, getOrCreateHdrpBuffers } from '../hdrp-buffers';
11
+ import {
12
+ createGpuDrivenLightingBindGroup,
13
+ createHdrpUnifiedBindGroup,
14
+ getOrCreateHdrpBuffers,
15
+ } from '../hdrp-buffers';
11
16
  import { getOrCreateIblCache } from '../ibl/IblPipelineCache';
12
17
  import type { SkylightBindGroupResources } from '../ibl/skylight-bind-group';
13
18
  import { buildBeginRenderPassDescriptor, standardTopologyBindGroupReady } from '../pipeline-spec';
14
19
  import { POINTS_LINES_MATERIAL_SHADER_ID } from '../points-lines/record';
15
20
  import type { ReflectionProbeSelectionResult } from '../reflection/projection';
16
21
  import type { RenderRecordPhase } from '../render-contract';
22
+ import type {
23
+ GpuDrivenStandardPbrFrameResources,
24
+ RenderPipelineGpuDrivenProjection,
25
+ } from '../render-pipeline';
17
26
  import type { MaterialSnapshot } from '../render-system-extract';
18
27
  import { resolveReflectionProbeBinding } from './frame-lighting';
19
- import { getOpaqueResourceIdentity } from './frame-snapshot';
28
+ import { getOpaqueResourceIdentity, worldEntityKey } from './frame-snapshot';
20
29
  import { recordGeometryDraws } from './main-pass-geometry';
21
30
  import {
22
31
  buildPerSubmeshMaterialBg as buildPerSubmeshMaterialBgImpl,
@@ -57,7 +66,17 @@ export type MainPassOptions = {
57
66
  readonly passKind?: PassKind;
58
67
  readonly clearColor?: readonly [number, number, number, number];
59
68
  readonly recordMode?: 'opaque' | 'transmission' | 'transparent';
69
+ /** Exclude material/pass pairs already consumed by an earlier graph lane. */
70
+ readonly excludeSelector?: PassSelector;
71
+ /** Require the same material to contribute to another graph lane. */
72
+ readonly includeSelector?: PassSelector;
60
73
  readonly transmissionBackdropView?: TextureView | null;
74
+ /** Select the material temporal entry's binary coverage output. */
75
+ readonly coverageOnly?: boolean;
76
+ readonly gpuDriven?: {
77
+ readonly projection: RenderPipelineGpuDrivenProjection;
78
+ readonly resources: GraphResourceResolver;
79
+ };
61
80
  };
62
81
 
63
82
  function isTransmissionMaterial(material: MaterialSnapshot): boolean {
@@ -117,7 +136,7 @@ export function recordMainPass(
117
136
  selector?: PassSelector,
118
137
  options?: MainPassOptions,
119
138
  graphPass?: RhiRenderPassEncoder,
120
- ): void {
139
+ ): GpuDrivenStandardPbrFrameResources | undefined {
121
140
  const {
122
141
  runtime,
123
142
  world,
@@ -143,6 +162,8 @@ export function recordMainPass(
143
162
  materialSlots,
144
163
  materialSlotOwners,
145
164
  materialSlotCount,
165
+ gpuDrivenStandardPbrFrameResources,
166
+ gpuDrivenSceneMaterialBuffer,
146
167
  } = c;
147
168
  // bug-20260615 M3 / m3-1: sampleCount is threaded through every
148
169
  // getMaterialShaderPipeline call site so the cache key / builder
@@ -280,7 +301,14 @@ export function recordMainPass(
280
301
  const matchedIndices =
281
302
  selector !== undefined ? buildMatchedRenderableIndices(dispatch, selector) : null;
282
303
  const selectorMatchedMaterials =
283
- selector !== undefined ? buildMatchedMaterialHandlesByRenderable(dispatch, selector) : null;
304
+ selector !== undefined
305
+ ? buildMatchedMaterialHandlesByRenderable(
306
+ dispatch,
307
+ selector,
308
+ options?.excludeSelector,
309
+ options?.includeSelector,
310
+ )
311
+ : null;
284
312
  const matchedMaterials = matchedMaterialsForRecordMode(c, selectorMatchedMaterials, recordMode);
285
313
  const selectedDispatch =
286
314
  dispatch.length === 0
@@ -447,6 +475,13 @@ export function recordMainPass(
447
475
  // which cannot render a PBR decal). Captures only frame-stable closure
448
476
  // state; the caller passes the per-submesh material snapshot + entityKey
449
477
  // (for video texture routing) and sets the dynamic UBO offset itself.
478
+ // Selection keys use the extracted frame index, never World.identity.
479
+ const hasProbeBindings = (c.reflectionProbes?.table.rows.length ?? 0) > 0;
480
+ const worldIndices = hasProbeBindings
481
+ ? new Map(
482
+ validatedOrdered.map((entry) => [entry.world ?? world, entry.source.worldId] as const),
483
+ )
484
+ : undefined;
450
485
  const perSubmeshMaterialBgDeps: PerSubmeshMaterialBgDeps = {
451
486
  runtime,
452
487
  pipelineState,
@@ -458,8 +493,10 @@ export function recordMainPass(
458
493
  resolveRenderTargetTextureSource: runtime.resolveRenderTargetTextureSource,
459
494
  resolveReflectionProbeResources: (materialWorld, entityKey) => {
460
495
  const reflectionProbes = c.reflectionProbes;
461
- if (reflectionProbes === undefined) return undefined;
462
- const selection = reflectionProbes.selections.get(`${materialWorld.identity}:${entityKey}`);
496
+ if (reflectionProbes === undefined || !hasProbeBindings) return undefined;
497
+ const selection = reflectionProbes.selections.get(
498
+ `${worldIndices?.get(materialWorld)}:${entityKey}`,
499
+ );
463
500
  if (selection === undefined) return undefined;
464
501
  const binding = resolveReflectionProbeBinding(selection, reflectionProbes.table);
465
502
  if (binding.useSkylight || binding.probeIndex === undefined) return undefined;
@@ -477,17 +514,26 @@ export function recordMainPass(
477
514
  irradianceView: skylightResources.irradianceView,
478
515
  irradianceSampler: skylightResources.irradianceSampler,
479
516
  prefilterView: row.filteredView,
517
+ skylightPrefilterView: skylightResources.prefilterView,
480
518
  prefilterSampler: row.sampler,
481
519
  brdfLutView: skylightResources.brdfLutView,
482
520
  brdfLutSampler: skylightResources.brdfLutSampler,
483
521
  intensityBuffer: row.uniformBuffer,
484
522
  };
485
- return probeResources;
523
+ return { resources: probeResources, probeIndex: row.index };
486
524
  },
487
525
  materialBgShared: frameState.materialBgShared,
488
526
  materialBgAssemblyCache: c.materialBgAssemblyCache,
489
527
  frameState,
490
528
  bindGroupCounts,
529
+ ...(gpuDrivenStandardPbrFrameResources?.sceneMaterialBuffer === undefined &&
530
+ gpuDrivenSceneMaterialBuffer === undefined
531
+ ? {}
532
+ : {
533
+ sceneMaterialBuffer:
534
+ gpuDrivenStandardPbrFrameResources?.sceneMaterialBuffer ??
535
+ gpuDrivenSceneMaterialBuffer,
536
+ }),
491
537
  ...(transmissionBackdropView === undefined ? {} : { transmissionBackdropView }),
492
538
  };
493
539
  const buildPerSubmeshMaterialBg = (
@@ -503,7 +549,6 @@ export function recordMainPass(
503
549
  materialWorld,
504
550
  materialShaderId,
505
551
  );
506
-
507
552
  // Static material resources are a property of the frame-local material
508
553
  // slot, not of each submesh draw. Resolve them once here so the geometry
509
554
  // loop only selects a prepared binding. Video fields remain entity-bound:
@@ -513,7 +558,7 @@ export function recordMainPass(
513
558
  for (let materialSlot = 0; materialSlot < materialSlotCount; materialSlot += 1) {
514
559
  const material = materialSlots[materialSlot];
515
560
  if (material === undefined || (material.videoTextureFields?.size ?? 0) > 0) continue;
516
- const owner = validatedOrdered[materialSlotOwners[materialSlot] ?? -1];
561
+ const owner = materialSlotOwners[materialSlot];
517
562
  if (owner === undefined) continue;
518
563
  preparedMaterialBindGroups[materialSlot] = buildPerSubmeshMaterialBg(
519
564
  material,
@@ -521,6 +566,60 @@ export function recordMainPass(
521
566
  owner.world ?? world,
522
567
  );
523
568
  }
569
+ if (gpuDrivenStandardPbrFrameResources !== undefined) {
570
+ gpuDrivenStandardPbrFrameResources.resolveClusteredMeshBindGroup = (binding) => {
571
+ const buffers = getOrCreateHdrpBuffers(
572
+ runtime,
573
+ frameState.installedPipelineConfig?.clusterGrid,
574
+ );
575
+ const layout =
576
+ binding.paletteBuffer === undefined
577
+ ? pipelineState.hdrpMeshBindGroupLayout
578
+ : pipelineState.hdrpSkinMeshBindGroupLayout;
579
+ const group =
580
+ buffers === null || layout == null
581
+ ? null
582
+ : createGpuDrivenLightingBindGroup(
583
+ runtime,
584
+ buffers,
585
+ layout,
586
+ binding,
587
+ c.hdrpSsaoBlurredView,
588
+ );
589
+ if (group === null)
590
+ throw new RhiError({
591
+ code: 'rhi-not-available',
592
+ expected: 'scene-index clustered lighting binding',
593
+ hint: 'publish scene rows and the current lighting/AO resources before indirect drawing',
594
+ });
595
+ return group;
596
+ };
597
+ gpuDrivenStandardPbrFrameResources.materialBindGroups.length = 0;
598
+ gpuDrivenStandardPbrFrameResources.materialBindGroups.push(...preparedMaterialBindGroups);
599
+ gpuDrivenStandardPbrFrameResources.colorFormats = colorFormats;
600
+ const selectedMaterialSlots = new Set<number>();
601
+ if (matchedMaterials === null)
602
+ delete gpuDrivenStandardPbrFrameResources.selectedMaterialSlots;
603
+ else gpuDrivenStandardPbrFrameResources.selectedMaterialSlots = selectedMaterialSlots;
604
+ gpuDrivenStandardPbrFrameResources.materialSlotIndicesByEntity.clear();
605
+ for (let index = 0; index < validatedOrdered.length; index += 1) {
606
+ const entry = validatedOrdered[index];
607
+ if (entry === undefined) continue;
608
+ const selected = matchedMaterials?.get(entry.renderableIndex);
609
+ const materials =
610
+ entry.source.materials.length > 0 ? entry.source.materials : [entry.source.material];
611
+ for (let slot = 0; slot < materials.length; slot += 1) {
612
+ const handle = materials[slot]?.materialHandle ?? -1;
613
+ const globalSlot = materialSlotIndices[index]?.[slot];
614
+ if (globalSlot !== undefined && selected?.has(handle))
615
+ selectedMaterialSlots.add(globalSlot);
616
+ }
617
+ gpuDrivenStandardPbrFrameResources.materialSlotIndicesByEntity.set(
618
+ worldEntityKey(entry.source.worldId, entry.source.entityKey),
619
+ materialSlotIndices[index] ?? [],
620
+ );
621
+ }
622
+ }
524
623
  const resolveMaterialBindGroup = (
525
624
  materialSlot: number,
526
625
  material: MaterialSnapshot,
@@ -528,6 +627,7 @@ export function recordMainPass(
528
627
  materialWorld: World = world,
529
628
  materialShaderId: string | undefined = material.materialShaderId,
530
629
  ): BindGroup =>
630
+ !hasProbeBindings &&
531
631
  materialShaderId === material.materialShaderId &&
532
632
  materialShaderId !== POINTS_LINES_MATERIAL_SHADER_ID
533
633
  ? (preparedMaterialBindGroups[materialSlot] ??
@@ -554,6 +654,8 @@ export function recordMainPass(
554
654
  resolveMaterialBindGroup,
555
655
  passKind,
556
656
  selectedDispatch,
657
+ colorFormats,
658
+ options?.coverageOnly ?? false,
557
659
  );
558
660
  };
559
661
  if (c.profilePhase === undefined) {
@@ -566,6 +668,33 @@ export function recordMainPass(
566
668
  );
567
669
  }
568
670
 
671
+ if (options?.gpuDriven !== undefined) {
672
+ if (viewBindGroup === null) {
673
+ throw new RhiError({
674
+ code: 'rhi-not-available',
675
+ expected: 'main-pass Standard PBR view bind group for GPU-driven encode',
676
+ hint: 'publish the current frame view/light/shadow bind group before GPU raster',
677
+ });
678
+ }
679
+ if (
680
+ gpuDrivenStandardPbrFrameResources === undefined ||
681
+ gpuDrivenStandardPbrFrameResources.materialBindGroups.length === 0 ||
682
+ gpuDrivenStandardPbrFrameResources.materialBindGroups.some((group) => group === undefined)
683
+ ) {
684
+ throw new RhiError({
685
+ code: 'rhi-not-available',
686
+ expected: 'complete main-pass Standard PBR material bind-group receipt',
687
+ hint: 'finish frame material producer assembly before GPU-driven encode',
688
+ });
689
+ }
690
+ options.gpuDriven.projection.encode(
691
+ viewBindGroup,
692
+ pass,
693
+ options.gpuDriven.resources,
694
+ gpuDrivenStandardPbrFrameResources,
695
+ );
696
+ }
697
+
569
698
  // D-2: LDR sprite pass. Runs after the geometry pass when there are
570
699
  // sprite entities in the draw list and the LDR path is active.
571
700
  // The geometry pass used the bgra8unorm-srgb sRGB view (hardware sRGB
@@ -583,7 +712,6 @@ export function recordMainPass(
583
712
  materialSlotIndices,
584
713
  sampleCount,
585
714
  resolveMaterialBindGroup,
586
- skylightResources,
587
715
  graphPass,
588
716
  selectedDispatch,
589
717
  );
@@ -593,6 +721,7 @@ export function recordMainPass(
593
721
  if (!geometryPassEnded && graphPass === undefined) {
594
722
  pass.end();
595
723
  }
724
+ return gpuDrivenStandardPbrFrameResources;
596
725
  }
597
726
 
598
727
  export function encodeMainPass(
@@ -600,6 +729,6 @@ export function encodeMainPass(
600
729
  pass: RhiRenderPassEncoder,
601
730
  selector?: PassSelector,
602
731
  options?: MainPassOptions,
603
- ): void {
604
- recordMainPass(c, selector, options, pass);
732
+ ): GpuDrivenStandardPbrFrameResources | undefined {
733
+ return recordMainPass(c, selector, options, pass);
605
734
  }
@@ -41,7 +41,7 @@ export function uploadMaterialUniforms(c: _InternalRenderPipelineContext): void
41
41
  );
42
42
  for (let materialSlot = 0; materialSlot < materialSlots.length; materialSlot += 1) {
43
43
  const mat = materialSlots[materialSlot];
44
- const entry = validatedOrdered[materialSlotOwners[materialSlot] ?? -1];
44
+ const entry = materialSlotOwners[materialSlot];
45
45
  if (mat === undefined || entry === undefined) continue;
46
46
 
47
47
  // feat-20260625-refactor-sprite-as-transparent-mesh M3 / w13 (D-2):
@@ -1,5 +1,6 @@
1
1
  import { mat3 } from '@forgeax/engine-math';
2
2
  import { type BindGroup, type Buffer, RhiError, type RhiQueue } from '@forgeax/engine-rhi';
3
+ import { ok, type Result } from '@forgeax/engine-types';
3
4
  import type { DispatchEntry } from '../render-system-extract';
4
5
  import {
5
6
  TRANSPARENT_SORT_MODE_LAYER_Y,
@@ -127,6 +128,42 @@ export function getOrCreateFromChain(
127
128
  return bg;
128
129
  }
129
130
 
131
+ /**
132
+ * Result-preserving sibling of `getOrCreateFromChain`. RHI creation can fail
133
+ * transiently during recovery or capability probing; a failed attempt must
134
+ * not enter the cache and must remain a structured Result for the caller.
135
+ */
136
+ export function getOrCreateFromChainResult<E>(
137
+ root: WeakMap<object, unknown>,
138
+ handles: readonly object[],
139
+ variant: string,
140
+ factory: () => Result<BindGroup, E>,
141
+ counts: { createBindGroup: number; keys: string[] },
142
+ ): Result<BindGroup, E> {
143
+ let node = root;
144
+ for (const h of handles) {
145
+ let next = node.get(h) as WeakMap<object, unknown> | undefined;
146
+ if (next === undefined) {
147
+ next = new WeakMap();
148
+ node.set(h, next);
149
+ }
150
+ node = next;
151
+ }
152
+ let leaf = node.get(BIND_GROUP_CHAIN_LEAF_KEY) as Map<string, BindGroup> | undefined;
153
+ if (leaf === undefined) {
154
+ leaf = new Map();
155
+ node.set(BIND_GROUP_CHAIN_LEAF_KEY, leaf);
156
+ }
157
+ const hit = leaf.get(variant);
158
+ if (hit !== undefined) return ok(hit);
159
+ const created = factory();
160
+ if (!created.ok) return created;
161
+ counts.createBindGroup += 1;
162
+ counts.keys.push(variant);
163
+ leaf.set(variant, created.value);
164
+ return created;
165
+ }
166
+
130
167
  /**
131
168
  * Read a cached bind group using the same variable-depth chain contract as
132
169
  * `getOrCreateFromChain`. Readers must traverse the terminal marker instead
@@ -376,6 +413,7 @@ export function uploadMeshSsboBatch(
376
413
  meshStorageBuffer: { readonly buffer: Buffer },
377
414
  validatedOrdered: readonly ValidatedRenderable[],
378
415
  foldDispatchPlan: FoldDispatchPlan | null,
416
+ startSlot = 0,
379
417
  ): void {
380
418
  const slotCount = validatedOrdered.length;
381
419
  const neededBytes = slotCount * MESH_PER_ENTITY_STRIDE;
@@ -450,7 +488,7 @@ export function uploadMeshSsboBatch(
450
488
  if (neededBytes > 0) {
451
489
  const meshUpload = queue.writeBuffer(
452
490
  meshStorageBuffer.buffer,
453
- 0,
491
+ startSlot * MESH_PER_ENTITY_STRIDE,
454
492
  _meshSsboScratch,
455
493
  0,
456
494
  neededBytes,
@@ -511,17 +549,26 @@ export interface FoldBucket {
511
549
  * minimal shape. The gate read inside the helper uses `=== true` /
512
550
  * `!== true` so both `false` and `undefined` enter the singleton branch.
513
551
  *
514
- * feat-20260625-refactor-sprite-as-transparent-mesh R2 fix-up: gate
515
- * migrated from `shadingModel === 'sprite'` (the union member was
516
- * removed in M3 / w15) to `transparent === true` (the new SSOT for
517
- * "routes through the LDR split sub-pass" same predicate the
518
- * `splitLdrSprite` filter at render-system-record.ts:4826/5612 uses).
552
+ * feat-20260625-refactor-sprite-as-transparent-mesh R2 fix-up: the
553
+ * transparent flag identifies the LDR split sub-pass, while the shader id
554
+ * identifies the sprite owner that is safe to fold. Standard PBR Alpha Blend
555
+ * remains singleton so its geometry pass keeps one projection row per draw.
519
556
  */
520
557
  export interface FoldRenderableLike {
521
558
  readonly transform: { readonly world: Float32Array };
522
559
  readonly material: { readonly transparent?: boolean | undefined };
523
560
  }
524
561
 
562
+ const FOLDABLE_TRANSPARENT_SHADER_IDS = new Set(['forgeax::sprite', 'forgeax::sprite-lit']);
563
+
564
+ function isFoldEligible(entry: DispatchEntry, renderables: readonly FoldRenderableLike[]): boolean {
565
+ return (
566
+ renderables[entry.renderableIndex]?.material.transparent === true &&
567
+ entry.materialShaderId !== undefined &&
568
+ FOLDABLE_TRANSPARENT_SHADER_IDS.has(entry.materialShaderId)
569
+ );
570
+ }
571
+
525
572
  /**
526
573
  * Linear-scan fold operator (plan-strategy D-1).
527
574
  *
@@ -588,7 +635,7 @@ export function foldDispatchBuckets(
588
635
  // identity and renders the 3D geometry at the origin — collapsing the
589
636
  // frame to black (hello-room CI regression).
590
637
  //
591
- // Concept-count fix: encode "fold is transparent-sub-pass-only" at the
638
+ // Concept-count fix: encode "fold is transparent-sprite-sub-pass-only" at the
592
639
  // head selection point — the gate is the single bucket-key invariant
593
640
  // that makes both dispatch sites correct without coupling identity-
594
641
  // overwrite logic to a separate check (avoiding the D-9 shared-exit
@@ -603,10 +650,9 @@ export function foldDispatchBuckets(
603
650
  //
604
651
  // feat-20260625 R2 fix-up: pre-feat the gate was `shadingModel ===
605
652
  // 'sprite'`; M3 / w15 narrowed the shadingModel union to
606
- // `'unlit' | undefined` (the `'sprite'` discriminator was the design
607
- // ablation target), so the gate now reads `material.transparent`
608
- // the new SSOT for "routes through the LDR split sub-pass" mirrored
609
- // on `computeSplitLdrSprite` + the `splitLdrSprite` skip filter.
653
+ // `'unlit' | undefined`. The current gate retains the transparent SSOT
654
+ // and adds the explicit sprite shader identity so Standard PBR Alpha Blend
655
+ // cannot enter this fold path.
610
656
  const buckets: FoldBucket[] = [];
611
657
  let runStart = 0;
612
658
  while (runStart < orderedEntries.length) {
@@ -621,8 +667,7 @@ export function foldDispatchBuckets(
621
667
  // carrier (extract stage derives it from the first pass's
622
668
  // `renderState.blend !== undefined`, post-feat-20260626-collapse;
623
669
  // see `MaterialSnapshot.transparent`).
624
- const headTransparent = renderables[head.renderableIndex]?.material.transparent;
625
- if (headTransparent !== true) {
670
+ if (!isFoldEligible(head, renderables)) {
626
671
  buckets.push(makeSingletonBucket(head, renderables, mode));
627
672
  runStart += 1;
628
673
  continue;
@@ -638,8 +683,7 @@ export function foldDispatchBuckets(
638
683
  // Same materialHandle implies same transparent flag in production
639
684
  // (material asset identity), but the check costs O(1) per cand and
640
685
  // makes the bucket invariant locally readable.
641
- const candTransparent = renderables[cand.renderableIndex]?.material.transparent;
642
- if (candTransparent !== true) break;
686
+ if (!isFoldEligible(cand, renderables)) break;
643
687
  const candSortKey = readSortKey(mode, cand.renderableIndex, renderables);
644
688
  if (candSortKey !== headSortKey) break;
645
689
  runEnd += 1;
@@ -0,0 +1,238 @@
1
+ import { resolveAssetHandle } from '@forgeax/engine-assets-runtime';
2
+ import type { World } from '@forgeax/engine-ecs';
3
+ import type { BindGroupEntry, BindGroupLayout, Buffer } from '@forgeax/engine-rhi';
4
+ import { err, ok } from '@forgeax/engine-rhi';
5
+ import {
6
+ derive,
7
+ type Handle,
8
+ type MaterialAsset,
9
+ type MaterialTextureValue,
10
+ materialValuesToLinearRuntime,
11
+ type SamplerAsset,
12
+ } from '@forgeax/engine-types';
13
+ import { transmissionBackdropAvailable } from '../assembly/device-feature-admission';
14
+ import { GPU_BUFFER_USAGE_COPY_DST, GPU_BUFFER_USAGE_UNIFORM } from '../gpu-usage';
15
+ import type { SkylightBindGroupResources } from '../ibl/skylight-bind-group';
16
+ import { assembleMaterialWithSkylightEntries } from '../ibl/skylight-bind-group';
17
+ import {
18
+ applyParamSchemaDefaultsToUbo,
19
+ applyParamSnapshotToUbo,
20
+ defaultViewForUserRegionField,
21
+ residentTextureView,
22
+ } from './main-pass-material';
23
+ import type { RenderSystemInternals } from './render-context';
24
+
25
+ export type PreparedResolverCaches = {
26
+ readonly preparedPipelineIds: WeakMap<object, string>;
27
+ readonly preparedMaterialPipelineShaders: WeakMap<object, string>;
28
+ readonly preparedGroup0Pipelines: WeakSet<object>;
29
+ readonly preparedViewOnlyPipelines: WeakSet<object>;
30
+ readonly preparedRenderMaterialPipelines: WeakSet<object>;
31
+ readonly preparedAssetHandles: WeakMap<World, Map<string, number>>;
32
+ };
33
+
34
+ export function createPreparedResolverCaches(): PreparedResolverCaches {
35
+ return {
36
+ preparedPipelineIds: new WeakMap(),
37
+ preparedMaterialPipelineShaders: new WeakMap(),
38
+ preparedGroup0Pipelines: new WeakSet(),
39
+ preparedViewOnlyPipelines: new WeakSet(),
40
+ preparedRenderMaterialPipelines: new WeakSet(),
41
+ preparedAssetHandles: new WeakMap(),
42
+ };
43
+ }
44
+
45
+ function preparedHandle<Brand extends string>(
46
+ runtime: RenderSystemInternals,
47
+ caches: PreparedResolverCaches,
48
+ world: World,
49
+ guid: string,
50
+ brand: Brand,
51
+ ): Handle<Brand, 'shared'> | undefined {
52
+ let handles = caches.preparedAssetHandles.get(world);
53
+ if (handles === undefined) {
54
+ handles = new Map();
55
+ caches.preparedAssetHandles.set(world, handles);
56
+ }
57
+ const key = `${brand}:${guid.toLowerCase()}`;
58
+ const cached = handles.get(key);
59
+ if (cached !== undefined) return cached as Handle<Brand, 'shared'>;
60
+ const asset = runtime.assets.lookup(guid);
61
+ if (asset === undefined) return undefined;
62
+ const handle = world.allocSharedRef(brand, asset);
63
+ handles.set(key, handle as number);
64
+ return handle;
65
+ }
66
+
67
+ export function preparedMaterialBindings(
68
+ runtime: RenderSystemInternals,
69
+ caches: PreparedResolverCaches,
70
+ worlds: readonly World[],
71
+ materialShaderId: string,
72
+ worldIndex: number,
73
+ materialGuid: string,
74
+ layout: BindGroupLayout,
75
+ skylightResources?: SkylightBindGroupResources,
76
+ ) {
77
+ const world = worlds[worldIndex];
78
+ const material = runtime.assets.lookup(materialGuid) as MaterialAsset | undefined;
79
+ const pipelineState = runtime.getPipelineState();
80
+ if (world === undefined || material?.kind !== 'material' || pipelineState === null) {
81
+ return err(new Error('prepared material asset is unavailable'));
82
+ }
83
+ const schema = runtime.getParamSchema?.(materialShaderId) ?? [];
84
+ // Feature materials share the ordinary linear parameter domain and semantic texture defaults.
85
+ const values = materialValuesToLinearRuntime(
86
+ material.values,
87
+ [...schema, ...(material.parameters ?? [])],
88
+ material.colorSpace,
89
+ );
90
+ const derived = derive(schema);
91
+ const fields = [...derived.textureFieldNames];
92
+ let buffer: Buffer | undefined;
93
+ let payloadByteLength = 0;
94
+ if (derived.uboLayout.totalBytes > 0) {
95
+ const payload = new Uint8Array(Math.max(16, derived.uboLayout.totalBytes));
96
+ applyParamSchemaDefaultsToUbo(payload, schema);
97
+ applyParamSnapshotToUbo(
98
+ payload,
99
+ schema,
100
+ values as Readonly<Record<string, number | readonly number[]>>,
101
+ );
102
+ const created = runtime.device.createBuffer({
103
+ label: `prepared-material:${materialGuid}`,
104
+ size: payload.byteLength,
105
+ usage: GPU_BUFFER_USAGE_UNIFORM | GPU_BUFFER_USAGE_COPY_DST,
106
+ });
107
+ if (!created.ok) return created;
108
+ buffer = created.value;
109
+ payloadByteLength = payload.byteLength;
110
+ const written = runtime.device.queue.writeBuffer(buffer, 0, payload);
111
+ if (!written.ok) {
112
+ runtime.device.destroyBuffer(buffer);
113
+ return written;
114
+ }
115
+ }
116
+ const textureResources: Array<{
117
+ sampler: import('@forgeax/engine-rhi').Sampler;
118
+ view: import('@forgeax/engine-rhi').TextureView;
119
+ }> = [];
120
+ for (const field of fields) {
121
+ if (field === undefined) continue;
122
+ const value = values[field];
123
+ const textureValue =
124
+ typeof value === 'object' && value !== null && 'texture' in value
125
+ ? (value as MaterialTextureValue)
126
+ : undefined;
127
+ let sampler = pipelineState.defaultSampler;
128
+ if (textureValue?.sampler !== undefined) {
129
+ const handle = preparedHandle(
130
+ runtime,
131
+ caches,
132
+ world,
133
+ String(textureValue.sampler),
134
+ 'SamplerAsset',
135
+ );
136
+ if (handle !== undefined) {
137
+ const asset = resolveAssetHandle<SamplerAsset>(world, handle);
138
+ if (asset.ok) {
139
+ const resident = runtime.gpuStore.ensureSamplerResident(handle, asset.value, world);
140
+ if (resident.ok) sampler = resident.value;
141
+ }
142
+ }
143
+ }
144
+ let view = defaultViewForUserRegionField(field, pipelineState, schema);
145
+ if (textureValue !== undefined) {
146
+ const handle = preparedHandle(
147
+ runtime,
148
+ caches,
149
+ world,
150
+ String(textureValue.texture),
151
+ 'TextureAsset',
152
+ );
153
+ if (handle !== undefined) {
154
+ view = residentTextureView(world, runtime.gpuStore, runtime, handle) ?? view;
155
+ }
156
+ }
157
+ textureResources.push({ sampler, view });
158
+ }
159
+ const entries: BindGroupEntry[] = [];
160
+ let textureIndex = 0;
161
+ for (let index = 0; index < derived.bglEntries.length; index += 1) {
162
+ const expected = derived.bglEntries[index];
163
+ if (expected?.buffer?.type === 'uniform' && buffer !== undefined) {
164
+ entries.push({
165
+ binding: expected.binding,
166
+ resource: { kind: 'buffer', value: { buffer, size: payloadByteLength } },
167
+ });
168
+ continue;
169
+ }
170
+ const textureResource = textureResources[textureIndex];
171
+ if (
172
+ expected?.sampler?.type === 'filtering' &&
173
+ derived.bglEntries[index + 1]?.texture !== undefined &&
174
+ textureResource !== undefined
175
+ ) {
176
+ entries.push({
177
+ binding: expected.binding,
178
+ resource: { kind: 'sampler', value: textureResource.sampler },
179
+ });
180
+ continue;
181
+ }
182
+ if (expected?.texture !== undefined && textureResource !== undefined) {
183
+ entries.push({
184
+ binding: expected.binding,
185
+ resource: { kind: 'textureView', value: textureResource.view },
186
+ });
187
+ textureIndex += 1;
188
+ continue;
189
+ }
190
+ if (buffer !== undefined) runtime.device.destroyBuffer(buffer);
191
+ return err(new Error('prepared material schema contains unsupported binding kinds'));
192
+ }
193
+ const fallback = pipelineState.skylightFallback;
194
+ if (fallback === null) {
195
+ if (buffer !== undefined) runtime.device.destroyBuffer(buffer);
196
+ return err(new Error('prepared material skylight fallback is unavailable'));
197
+ }
198
+ const completeEntries = assembleMaterialWithSkylightEntries(
199
+ entries,
200
+ skylightResources ?? {
201
+ irradianceView: fallback.irradianceView,
202
+ irradianceSampler: fallback.sampler,
203
+ prefilterView: fallback.prefilterView,
204
+ prefilterSampler: fallback.sampler,
205
+ brdfLutView: fallback.brdfLutView,
206
+ brdfLutSampler: fallback.sampler,
207
+ intensityBuffer: fallback.intensityBuffer,
208
+ },
209
+ transmissionBackdropAvailable(runtime.device.limits.maxSampledTexturesPerShaderStage)
210
+ ? undefined
211
+ : null,
212
+ );
213
+ // Per-shader PBR layouts reserve the scene-material SSBO at binding 46 on
214
+ // storage-capable devices. Prepared feature materials use this same layout,
215
+ // so they must provide the neutral producer-owned table even when their
216
+ // authored shader does not read it. Omitting the entry makes Dawn reject the
217
+ // bind group before submission.
218
+ if (runtime.device.caps.storageBuffer) {
219
+ completeEntries.push({
220
+ binding: 46,
221
+ resource: {
222
+ kind: 'buffer',
223
+ value: { buffer: pipelineState.meshStorageBuffer.buffer },
224
+ },
225
+ });
226
+ }
227
+ const group = runtime.device.createBindGroup({ layout, entries: completeEntries });
228
+ if (!group.ok) {
229
+ if (buffer !== undefined) runtime.device.destroyBuffer(buffer);
230
+ return group;
231
+ }
232
+ if (buffer === undefined) return group;
233
+ return ok({
234
+ handle: group.value,
235
+ dynamicOffsets: [0],
236
+ release: () => runtime.device.destroyBuffer(buffer),
237
+ });
238
+ }