@forgeax/engine-render 0.1.27 → 0.1.29

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 (655) hide show
  1. package/README.md +842 -124
  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/dynamic-geometry-host.d.ts +52 -0
  5. package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -0
  6. package/dist/assembly/dynamic-geometry-runtime.d.ts +20 -0
  7. package/dist/assembly/dynamic-geometry-runtime.d.ts.map +1 -0
  8. package/dist/assembly/factory.d.ts +3 -1
  9. package/dist/assembly/factory.d.ts.map +1 -1
  10. package/dist/assembly/gpu-driven-owner.d.ts +10 -0
  11. package/dist/assembly/gpu-driven-owner.d.ts.map +1 -0
  12. package/dist/assembly/host-contract.d.ts +19 -0
  13. package/dist/assembly/host-contract.d.ts.map +1 -1
  14. package/dist/assembly/material/assembly.d.ts +7 -0
  15. package/dist/assembly/material/assembly.d.ts.map +1 -1
  16. package/dist/assembly/material-shader-policy.d.ts +3 -1
  17. package/dist/assembly/material-shader-policy.d.ts.map +1 -1
  18. package/dist/assembly/recovery/failure-location.d.ts +12 -0
  19. package/dist/assembly/recovery/failure-location.d.ts.map +1 -0
  20. package/dist/assembly/recovery/renderer-recover.d.ts +6 -4
  21. package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
  22. package/dist/assembly/renderer-facade.d.ts.map +1 -1
  23. package/dist/assembly/renderer-feature-inspection.d.ts +5 -0
  24. package/dist/assembly/renderer-feature-inspection.d.ts.map +1 -0
  25. package/dist/assembly/renderer-frame-transaction.d.ts +19 -0
  26. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
  27. package/dist/assembly/renderer-helpers.d.ts +3 -0
  28. package/dist/assembly/renderer-helpers.d.ts.map +1 -1
  29. package/dist/assembly/renderer-inspection.d.ts +4 -0
  30. package/dist/assembly/renderer-inspection.d.ts.map +1 -1
  31. package/dist/assembly/shader-prewarm-policy.d.ts +6 -0
  32. package/dist/assembly/shader-prewarm-policy.d.ts.map +1 -1
  33. package/dist/assembly/skin-palette-owner.d.ts +8 -0
  34. package/dist/assembly/skin-palette-owner.d.ts.map +1 -0
  35. package/dist/assembly/ssr-shader-prewarm.d.ts +6 -0
  36. package/dist/assembly/ssr-shader-prewarm.d.ts.map +1 -0
  37. package/dist/assembly/webgpu-device-loss.d.ts +15 -0
  38. package/dist/assembly/webgpu-device-loss.d.ts.map +1 -0
  39. package/dist/assembly/webgpu-pbr-ready.d.ts +38 -0
  40. package/dist/assembly/webgpu-pbr-ready.d.ts.map +1 -0
  41. package/dist/assembly/webgpu-ready-mipmap.d.ts +11 -0
  42. package/dist/assembly/webgpu-ready-mipmap.d.ts.map +1 -0
  43. package/dist/assembly/webgpu-ready.d.ts +7 -3
  44. package/dist/assembly/webgpu-ready.d.ts.map +1 -1
  45. package/dist/assembly/webgpu-renderer-bootstrap.d.ts +10 -0
  46. package/dist/assembly/webgpu-renderer-bootstrap.d.ts.map +1 -0
  47. package/dist/assembly/webgpu-renderer-contract.d.ts +62 -0
  48. package/dist/assembly/webgpu-renderer-contract.d.ts.map +1 -0
  49. package/dist/assembly/webgpu-renderer-guards.d.ts +9 -0
  50. package/dist/assembly/webgpu-renderer-guards.d.ts.map +1 -0
  51. package/dist/assembly/webgpu-renderer-observation.d.ts +6 -0
  52. package/dist/assembly/webgpu-renderer-observation.d.ts.map +1 -0
  53. package/dist/assembly/webgpu-renderer-recovery-failure.d.ts +12 -0
  54. package/dist/assembly/webgpu-renderer-recovery-failure.d.ts.map +1 -0
  55. package/dist/assembly/webgpu-renderer.d.ts +7 -141
  56. package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
  57. package/dist/assembly/webgpu-vertex-layouts.d.ts +28 -84
  58. package/dist/assembly/webgpu-vertex-layouts.d.ts.map +1 -1
  59. package/dist/authoring.mjs +3 -3
  60. package/dist/{chunk-ADHHVYLW.mjs → chunk-33XZFTQU.mjs} +245 -39
  61. package/dist/chunk-33XZFTQU.mjs.map +1 -0
  62. package/dist/{chunk-GF523LHF.mjs → chunk-BLXGONR2.mjs} +30 -12
  63. package/dist/chunk-BLXGONR2.mjs.map +1 -0
  64. package/dist/{chunk-KM2NOX2I.mjs → chunk-BQVQOQJH.mjs} +958 -254
  65. package/dist/chunk-BQVQOQJH.mjs.map +1 -0
  66. package/dist/{chunk-HKXTW355.mjs → chunk-BTWH7BP4.mjs} +386 -17
  67. package/dist/chunk-BTWH7BP4.mjs.map +1 -0
  68. package/dist/{chunk-TMIASV2N.mjs → chunk-FUODTTIA.mjs} +3934 -676
  69. package/dist/chunk-FUODTTIA.mjs.map +1 -0
  70. package/dist/{chunk-FJ6P52EE.mjs → chunk-ILQ5MEZF.mjs} +3 -17
  71. package/dist/chunk-ILQ5MEZF.mjs.map +1 -0
  72. package/dist/{chunk-E34VL5VI.mjs → chunk-JQTSEI3Z.mjs} +3 -3
  73. package/dist/{chunk-E34VL5VI.mjs.map → chunk-JQTSEI3Z.mjs.map} +1 -1
  74. package/dist/{chunk-GE3SDD72.mjs → chunk-NICXSHAT.mjs} +16 -38
  75. package/dist/chunk-NICXSHAT.mjs.map +1 -0
  76. package/dist/{chunk-ZZ4YQ474.mjs → chunk-NRNXBLIJ.mjs} +577 -7
  77. package/dist/chunk-NRNXBLIJ.mjs.map +1 -0
  78. package/dist/{chunk-JDWARUOI.mjs → chunk-PA5DRJNI.mjs} +17 -3
  79. package/dist/chunk-PA5DRJNI.mjs.map +1 -0
  80. package/dist/{chunk-XDP6XE5V.mjs → chunk-S4DNKQYQ.mjs} +1118 -446
  81. package/dist/chunk-S4DNKQYQ.mjs.map +1 -0
  82. package/dist/components/camera.d.ts +62 -2
  83. package/dist/components/camera.d.ts.map +1 -1
  84. package/dist/components/index.d.ts +1 -0
  85. package/dist/components/index.d.ts.map +1 -1
  86. package/dist/components/instances.d.ts +6 -20
  87. package/dist/components/instances.d.ts.map +1 -1
  88. package/dist/components/scene-instance.d.ts +2 -1
  89. package/dist/components/scene-instance.d.ts.map +1 -1
  90. package/dist/components/screen-space-reflection.d.ts +14 -0
  91. package/dist/components/screen-space-reflection.d.ts.map +1 -0
  92. package/dist/construct-renderer.mjs +13805 -7186
  93. package/dist/construct-renderer.mjs.map +1 -1
  94. package/dist/device/gpu-residency.d.ts +11 -17
  95. package/dist/device/gpu-residency.d.ts.map +1 -1
  96. package/dist/device/mesh-residency-lifetime.d.ts +21 -0
  97. package/dist/device/mesh-residency-lifetime.d.ts.map +1 -0
  98. package/dist/dynamic-geometry.d.ts +125 -0
  99. package/dist/dynamic-geometry.d.ts.map +1 -0
  100. package/dist/environment/background.d.ts +6 -0
  101. package/dist/environment/background.d.ts.map +1 -0
  102. package/dist/errors/gpu-driven.d.ts +6 -3
  103. package/dist/errors/gpu-driven.d.ts.map +1 -1
  104. package/dist/errors/render.d.ts +7 -4
  105. package/dist/errors/render.d.ts.map +1 -1
  106. package/dist/extract/camera.d.ts.map +1 -1
  107. package/dist/extract/gpu-driven.d.ts +33 -3
  108. package/dist/extract/gpu-driven.d.ts.map +1 -1
  109. package/dist/features/host.d.ts +23 -1
  110. package/dist/features/host.d.ts.map +1 -1
  111. package/dist/features/noise-texture.d.ts +17 -0
  112. package/dist/features/noise-texture.d.ts.map +1 -0
  113. package/dist/features/plan.d.ts +83 -2
  114. package/dist/features/plan.d.ts.map +1 -1
  115. package/dist/features/prepared-gpu-work.d.ts +37 -4
  116. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  117. package/dist/features/prepared-graphics-store.d.ts.map +1 -1
  118. package/dist/features/prepared-graphics.d.ts +5 -0
  119. package/dist/features/prepared-graphics.d.ts.map +1 -1
  120. package/dist/features/render-graph-compute.d.ts +5 -3
  121. package/dist/features/render-graph-compute.d.ts.map +1 -1
  122. package/dist/features/render-graph-contribution.d.ts +11 -3
  123. package/dist/features/render-graph-contribution.d.ts.map +1 -1
  124. package/dist/features/render-graph-raster.d.ts +19 -3
  125. package/dist/features/render-graph-raster.d.ts.map +1 -1
  126. package/dist/features/types.d.ts +11 -0
  127. package/dist/features/types.d.ts.map +1 -1
  128. package/dist/fullscreen-post-process-pass.d.ts +2 -0
  129. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  130. package/dist/gpu-driven/batch-topology.d.ts +34 -1
  131. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  132. package/dist/gpu-driven/pbr-program.d.ts +10 -0
  133. package/dist/gpu-driven/pbr-program.d.ts.map +1 -0
  134. package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
  135. package/dist/gpu-driven/production-raster.d.ts +144 -23
  136. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  137. package/dist/gpu-driven/shadow-views.d.ts +126 -0
  138. package/dist/gpu-driven/shadow-views.d.ts.map +1 -0
  139. package/dist/gpu-driven/view-gpu.d.ts +18 -2
  140. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  141. package/dist/gpu-scene-schema.d.ts +2 -8
  142. package/dist/gpu-scene-schema.d.ts.map +1 -1
  143. package/dist/gpu-scene.d.ts +14 -0
  144. package/dist/gpu-scene.d.ts.map +1 -1
  145. package/dist/gpu-texture-usage.d.ts +1 -0
  146. package/dist/gpu-texture-usage.d.ts.map +1 -1
  147. package/dist/hdrp-buffers.d.ts +6 -0
  148. package/dist/hdrp-buffers.d.ts.map +1 -1
  149. package/dist/ibl/frame-resources.d.ts +8 -0
  150. package/dist/ibl/frame-resources.d.ts.map +1 -0
  151. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  152. package/dist/index.d.ts +21 -8
  153. package/dist/index.d.ts.map +1 -1
  154. package/dist/index.mjs +8 -7
  155. package/dist/index.mjs.map +1 -1
  156. package/dist/inspection-types.d.ts +164 -0
  157. package/dist/inspection-types.d.ts.map +1 -1
  158. package/dist/instances-derived-bounds.d.ts +11 -0
  159. package/dist/instances-derived-bounds.d.ts.map +1 -1
  160. package/dist/instances.d.ts +89 -44
  161. package/dist/instances.d.ts.map +1 -1
  162. package/dist/internal.d.ts +3 -0
  163. package/dist/internal.d.ts.map +1 -1
  164. package/dist/internal.mjs +118 -10
  165. package/dist/internal.mjs.map +1 -1
  166. package/dist/lifecycle.d.ts +2 -1
  167. package/dist/lifecycle.d.ts.map +1 -1
  168. package/dist/material-row.d.ts +5 -0
  169. package/dist/material-row.d.ts.map +1 -0
  170. package/dist/materials.d.ts +15 -0
  171. package/dist/materials.d.ts.map +1 -1
  172. package/dist/pbr-pipeline.d.ts +21 -5
  173. package/dist/pbr-pipeline.d.ts.map +1 -1
  174. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  175. package/dist/pipeline/standard-output/auto-exposure/capability.d.ts +12 -0
  176. package/dist/pipeline/standard-output/auto-exposure/capability.d.ts.map +1 -0
  177. package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts +70 -0
  178. package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts.map +1 -0
  179. package/dist/pipeline/standard-output/auto-exposure/graph.d.ts +75 -0
  180. package/dist/pipeline/standard-output/auto-exposure/graph.d.ts.map +1 -0
  181. package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts +111 -0
  182. package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts.map +1 -0
  183. package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts +16 -0
  184. package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts.map +1 -0
  185. package/dist/pipeline/standard-output/auto-exposure/preset.d.ts +14 -0
  186. package/dist/pipeline/standard-output/auto-exposure/preset.d.ts.map +1 -0
  187. package/dist/pipeline/standard-output/auto-exposure/state.d.ts +46 -0
  188. package/dist/pipeline/standard-output/auto-exposure/state.d.ts.map +1 -0
  189. package/dist/pipeline/standard-output/color-transform.d.ts +27 -0
  190. package/dist/pipeline/standard-output/color-transform.d.ts.map +1 -0
  191. package/dist/pipeline/standard-output/graph.d.ts +15 -0
  192. package/dist/pipeline/standard-output/graph.d.ts.map +1 -0
  193. package/dist/pipeline/standard-output/lut-admission.d.ts +29 -0
  194. package/dist/pipeline/standard-output/lut-admission.d.ts.map +1 -0
  195. package/dist/pipeline/standard-output/lut-gpu.d.ts +48 -0
  196. package/dist/pipeline/standard-output/lut-gpu.d.ts.map +1 -0
  197. package/dist/pipeline/standard-output/lut-state.d.ts +68 -0
  198. package/dist/pipeline/standard-output/lut-state.d.ts.map +1 -0
  199. package/dist/pipeline/standard-output/resources.d.ts +10 -0
  200. package/dist/pipeline/standard-output/resources.d.ts.map +1 -0
  201. package/dist/pipeline/standard-output/types.d.ts +39 -0
  202. package/dist/pipeline/standard-output/types.d.ts.map +1 -0
  203. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  204. package/dist/pipeline/standard-post.d.ts +2 -2
  205. package/dist/pipeline/standard-post.d.ts.map +1 -1
  206. package/dist/pipeline-builder.d.ts +2 -1
  207. package/dist/pipeline-builder.d.ts.map +1 -1
  208. package/dist/pipeline-spec-types.d.ts +4 -0
  209. package/dist/pipeline-spec-types.d.ts.map +1 -1
  210. package/dist/pipeline-spec.d.ts +1 -9
  211. package/dist/pipeline-spec.d.ts.map +1 -1
  212. package/dist/points-lines/standard-owner.d.ts +1 -1
  213. package/dist/points-lines/standard-owner.d.ts.map +1 -1
  214. package/dist/prepare/prepared-graphics-resolver.d.ts +6 -1
  215. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
  216. package/dist/record/dynamic-geometry-consumption.d.ts +15 -0
  217. package/dist/record/dynamic-geometry-consumption.d.ts.map +1 -0
  218. package/dist/record/frame-lighting.d.ts +3 -3
  219. package/dist/record/frame-lighting.d.ts.map +1 -1
  220. package/dist/record/frame-snapshot.d.ts +106 -5
  221. package/dist/record/frame-snapshot.d.ts.map +1 -1
  222. package/dist/record/frame-targets.d.ts.map +1 -1
  223. package/dist/record/frame.d.ts +39 -4
  224. package/dist/record/frame.d.ts.map +1 -1
  225. package/dist/record/main-pass-geometry.d.ts +7 -8
  226. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  227. package/dist/record/main-pass-material.d.ts +38 -1
  228. package/dist/record/main-pass-material.d.ts.map +1 -1
  229. package/dist/record/main-pass-sprite-draws.d.ts +2 -10
  230. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  231. package/dist/record/main-pass.d.ts +12 -2
  232. package/dist/record/main-pass.d.ts.map +1 -1
  233. package/dist/record/mesh-ssbo.d.ts +15 -6
  234. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  235. package/dist/record/prepared-material-bindings.d.ts +19 -0
  236. package/dist/record/prepared-material-bindings.d.ts.map +1 -0
  237. package/dist/record/recovery-pipeline.d.ts +2 -9
  238. package/dist/record/recovery-pipeline.d.ts.map +1 -1
  239. package/dist/record/render-context.d.ts +76 -26
  240. package/dist/record/render-context.d.ts.map +1 -1
  241. package/dist/record/shadow-pass.d.ts +62 -7
  242. package/dist/record/shadow-pass.d.ts.map +1 -1
  243. package/dist/record/skybox-post-pass.d.ts +1 -1
  244. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  245. package/dist/record/typed-frame-graph.d.ts +35 -7
  246. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  247. package/dist/record/view-ubo.d.ts +1 -0
  248. package/dist/record/view-ubo.d.ts.map +1 -1
  249. package/dist/recovery/render-system-candidate.d.ts +10 -2
  250. package/dist/recovery/render-system-candidate.d.ts.map +1 -1
  251. package/dist/recovery/render-system-roots.d.ts +11 -0
  252. package/dist/recovery/render-system-roots.d.ts.map +1 -0
  253. package/dist/recovery/types.d.ts +76 -0
  254. package/dist/recovery/types.d.ts.map +1 -0
  255. package/dist/reflection/record-owner.d.ts +0 -2
  256. package/dist/reflection/record-owner.d.ts.map +1 -1
  257. package/dist/render-contract.d.ts +185 -30
  258. package/dist/render-contract.d.ts.map +1 -1
  259. package/dist/render-graph-primitives.d.ts +1 -0
  260. package/dist/render-graph-primitives.d.ts.map +1 -1
  261. package/dist/render-pipeline.d.ts +64 -5
  262. package/dist/render-pipeline.d.ts.map +1 -1
  263. package/dist/render-system-extract-tail.d.ts +7 -5
  264. package/dist/render-system-extract-tail.d.ts.map +1 -1
  265. package/dist/render-system-extract.d.ts +101 -41
  266. package/dist/render-system-extract.d.ts.map +1 -1
  267. package/dist/render-system-projections.d.ts +22 -0
  268. package/dist/render-system-projections.d.ts.map +1 -0
  269. package/dist/render-system.d.ts +34 -77
  270. package/dist/render-system.d.ts.map +1 -1
  271. package/dist/scene/render-scene-types.d.ts +14 -7
  272. package/dist/scene/render-scene-types.d.ts.map +1 -1
  273. package/dist/scene/render-scene.d.ts +29 -11
  274. package/dist/scene/render-scene.d.ts.map +1 -1
  275. package/dist/scene/shadow-visibility.d.ts +5 -0
  276. package/dist/scene/shadow-visibility.d.ts.map +1 -0
  277. package/dist/ssr/admission.d.ts +70 -1
  278. package/dist/ssr/admission.d.ts.map +1 -1
  279. package/dist/ssr/compose.d.ts +13 -0
  280. package/dist/ssr/compose.d.ts.map +1 -0
  281. package/dist/ssr/errors.d.ts +35 -0
  282. package/dist/ssr/errors.d.ts.map +1 -1
  283. package/dist/ssr/graph.d.ts +60 -0
  284. package/dist/ssr/graph.d.ts.map +1 -0
  285. package/dist/ssr/history.d.ts +97 -0
  286. package/dist/ssr/history.d.ts.map +1 -0
  287. package/dist/ssr/hiz.d.ts +37 -0
  288. package/dist/ssr/hiz.d.ts.map +1 -0
  289. package/dist/ssr/inspection.d.ts +42 -0
  290. package/dist/ssr/inspection.d.ts.map +1 -0
  291. package/dist/ssr/resources.d.ts +58 -0
  292. package/dist/ssr/resources.d.ts.map +1 -0
  293. package/dist/ssr/temporal.d.ts +38 -0
  294. package/dist/ssr/temporal.d.ts.map +1 -0
  295. package/dist/systems/skin-palette-allocator.d.ts +32 -10
  296. package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
  297. package/dist/systems/skin-palette-types.d.ts +15 -0
  298. package/dist/systems/skin-palette-types.d.ts.map +1 -1
  299. package/dist/systems/transparent-dispatch.d.ts +9 -0
  300. package/dist/systems/transparent-dispatch.d.ts.map +1 -0
  301. package/dist/targets/material-source.d.ts +7 -0
  302. package/dist/targets/material-source.d.ts.map +1 -1
  303. package/dist/temporal/frame-coordinator.d.ts +7 -0
  304. package/dist/temporal/frame-coordinator.d.ts.map +1 -1
  305. package/dist/temporal/gpu.d.ts +8 -0
  306. package/dist/temporal/gpu.d.ts.map +1 -1
  307. package/dist/temporal/history.d.ts.map +1 -1
  308. package/dist/temporal/index.mjs +6 -6
  309. package/dist/temporal/inspection.d.ts.map +1 -1
  310. package/dist/temporal/standard-scene-data.d.ts +2 -1
  311. package/dist/temporal/standard-scene-data.d.ts.map +1 -1
  312. package/dist/temporal/temporal-view.d.ts +2 -0
  313. package/dist/temporal/temporal-view.d.ts.map +1 -1
  314. package/dist/typed-render-graph-primitives.d.ts +35 -1
  315. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  316. package/dist/typed-shadow-passes.d.ts +3 -1
  317. package/dist/typed-shadow-passes.d.ts.map +1 -1
  318. package/dist/volume/temporal.d.ts +6 -0
  319. package/dist/volume/temporal.d.ts.map +1 -1
  320. package/package.json +21 -20
  321. package/src/__tests__/auto-exposure-gpu-evidence.ts +291 -0
  322. package/src/__tests__/auto-exposure-inspection.unit.test.ts +80 -0
  323. package/src/__tests__/auto-exposure-transaction.integration.test.ts +99 -0
  324. package/src/__tests__/auto-exposure.browser.test.ts +33 -0
  325. package/src/__tests__/auto-exposure.dawn.test.ts +33 -0
  326. package/src/__tests__/detached-inspection.integration.test.ts +5 -0
  327. package/src/__tests__/device-scope-lifecycle.unit.test.ts +18 -0
  328. package/src/__tests__/device-scope-stale-matrix.unit.test.ts +18 -0
  329. package/src/__tests__/docs-gate-green.unit.test.ts +3 -3
  330. package/src/__tests__/dynamic-geometry-host.unit.test.ts +1123 -0
  331. package/src/__tests__/dynamic-geometry.unit.test.ts +233 -0
  332. package/src/__tests__/factory-contract.integration.test.ts +73 -22
  333. package/src/__tests__/fallback-row-stride-surface.unit.test.ts +19 -0
  334. package/src/__tests__/feature-depth-input.dawn.test.ts +121 -0
  335. package/src/__tests__/feature-noise.unit.test.ts +38 -0
  336. package/src/__tests__/fixtures/taa-resolve-pinned-baseline.wgsl +301 -0
  337. package/src/__tests__/frame-camera-selection.unit.test.ts +131 -0
  338. package/src/__tests__/frame-plan-contract.unit.test.ts +24 -0
  339. package/src/__tests__/frame-targets.unit.test.ts +24 -0
  340. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +3 -0
  341. package/src/__tests__/gpu-driven-baseline.characterization.test.ts +79 -0
  342. package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +287 -6
  343. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +122 -142
  344. package/src/__tests__/gpu-driven-indirect-raster.browser.test.ts +10 -1
  345. package/src/__tests__/gpu-driven-lod-cache.unit.test.ts +264 -0
  346. package/src/__tests__/gpu-driven-mesh-world-identity.unit.test.ts +349 -0
  347. package/src/__tests__/gpu-driven-pbr.dawn.test.ts +1417 -0
  348. package/src/__tests__/gpu-driven-pbr.integration.test.ts +21 -0
  349. package/src/__tests__/gpu-driven-production-fixture.ts +96 -0
  350. package/src/__tests__/gpu-driven-production.integration.test.ts +1075 -93
  351. package/src/__tests__/gpu-driven-scaling.unit.test.ts +1 -3
  352. package/src/__tests__/gpu-driven-shadow-views.browser.test.ts +63 -0
  353. package/src/__tests__/gpu-driven-shadow-views.dawn.test.ts +294 -0
  354. package/src/__tests__/gpu-driven-shadow-views.integration.test.ts +97 -0
  355. package/src/__tests__/gpu-driven-shadow-views.unit.test.ts +168 -0
  356. package/src/__tests__/gpu-driven-skin-contract.test-d.ts +11 -0
  357. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +72 -20
  358. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +30 -9
  359. package/src/__tests__/gpu-driven-view.unit.test.ts +159 -52
  360. package/src/__tests__/gpu-pass-timing.browser.test.ts +6 -1
  361. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +42 -0
  362. package/src/__tests__/gpu-scene-render-graph-gpu.ts +19 -5
  363. package/src/__tests__/gpu-scene.dawn.test.ts +40 -13
  364. package/src/__tests__/gpu-scene.unit.test.ts +559 -33
  365. package/src/__tests__/instances-culling.integration.test.ts +36 -10
  366. package/src/__tests__/instances-derived-bounds.unit.test.ts +54 -0
  367. package/src/__tests__/instances-store.unit.test.ts +242 -39
  368. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +6 -0
  369. package/src/__tests__/lighting-scene-roundtrip.integration.test.ts +13 -16
  370. package/src/__tests__/lut-lkg-transaction.integration.test.ts +122 -0
  371. package/src/__tests__/material-contract-inventory.unit.test.ts +5 -6
  372. package/src/__tests__/material-dispatch-shader-id.unit.test.ts +51 -0
  373. package/src/__tests__/material-lane-selection.unit.test.ts +60 -0
  374. package/src/__tests__/material-numeric-upload.unit.test.ts +53 -0
  375. package/src/__tests__/material-texture-handles.unit.test.ts +18 -0
  376. package/src/__tests__/material-texture-source.unit.test.ts +87 -0
  377. package/src/__tests__/materials-authoring-validation.unit.test.ts +41 -0
  378. package/src/__tests__/materials-standard-contract.unit.test.ts +52 -2
  379. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +4 -0
  380. package/src/__tests__/mesh-submission-lifetime.unit.test.ts +53 -0
  381. package/src/__tests__/normal-fallback.dawn.test.ts +122 -0
  382. package/src/__tests__/particle-material-input-layout.unit.test.ts +104 -0
  383. package/src/__tests__/physical-clearcoat.integration.test.ts +37 -3
  384. package/src/__tests__/pipeline-texture-specialization.unit.test.ts +138 -0
  385. package/src/__tests__/point-shadow-inspection.unit.test.ts +2 -0
  386. package/src/__tests__/prepared-gpu-driven-pbr-contract.test-d.ts +31 -0
  387. package/src/__tests__/prepared-gpu-driven-pbr-contract.unit.test.ts +39 -0
  388. package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +35 -4
  389. package/src/__tests__/prepared-graphics-capability.unit.test.ts +21 -0
  390. package/src/__tests__/prepared-graphics-pipeline-warmup.unit.test.ts +6 -2
  391. package/src/__tests__/profiler-phase-catalog.test.ts +5 -0
  392. package/src/__tests__/public-surface.test-d.ts +3 -0
  393. package/src/__tests__/recovery-candidate-prepare.contract.test.ts +30 -12
  394. package/src/__tests__/reflection-fallback-async-publication.unit.test.ts +104 -0
  395. package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +2 -1
  396. package/src/__tests__/render-error-code-owner.test-d.ts +4 -0
  397. package/src/__tests__/render-error-detail-ssot.test-d.ts +22 -0
  398. package/src/__tests__/render-error-exhaustive.test-d.ts +15 -0
  399. package/src/__tests__/render-feature-gpu-work.integration.test.ts +285 -2
  400. package/src/__tests__/render-feature-plan.unit.test.ts +245 -0
  401. package/src/__tests__/render-feature-shadow-order.unit.test.ts +228 -0
  402. package/src/__tests__/render-feature-zero-work.unit.test.ts +35 -1
  403. package/src/__tests__/render-graph-fallback.integration.test.ts +2 -2
  404. package/src/__tests__/render-owner-cohesion.unit.test.ts +55 -0
  405. package/src/__tests__/render-scene-mixed-updates.integration.test.ts +426 -0
  406. package/src/__tests__/render-scene-projection.unit.test.ts +914 -23
  407. package/src/__tests__/render-scene-resource-updates.integration.test.ts +214 -0
  408. package/src/__tests__/render-scene-skin-lifecycle.integration.test.ts +173 -0
  409. package/src/__tests__/render-scene-temporal-retry.unit.test.ts +133 -0
  410. package/src/__tests__/render-target-material-source.test-d.ts +27 -3
  411. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +61 -1
  412. package/src/__tests__/renderer-frame-transaction.integration.test.ts +923 -5
  413. package/src/__tests__/shader-manifest-fixture.ts +39 -0
  414. package/src/__tests__/skin-motion-regression.unit.test.ts +0 -33
  415. package/src/__tests__/skin-palette-persistent.integration.test.ts +28 -0
  416. package/src/__tests__/skin-palette-persistent.unit.test.ts +247 -0
  417. package/src/__tests__/skinned-shadow-caster.test.ts +118 -14
  418. package/src/__tests__/specular-environment-scale.dawn.test.ts +156 -0
  419. package/src/__tests__/ssr-admission-matrix.integration.test.ts +7 -1
  420. package/src/__tests__/ssr-confidence-compose.unit.test.ts +84 -0
  421. package/src/__tests__/ssr-coordinate-oracle.unit.test.ts +28 -0
  422. package/src/__tests__/ssr-format-probe-gating.integration.test.ts +82 -0
  423. package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +91 -0
  424. package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +112 -0
  425. package/src/__tests__/ssr-gpu-dispatch.ts +946 -0
  426. package/src/__tests__/ssr-graph-topology.unit.test.ts +104 -0
  427. package/src/__tests__/ssr-history-filter.dawn.test.ts +198 -0
  428. package/src/__tests__/ssr-hit-color.dawn.test.ts +273 -0
  429. package/src/__tests__/ssr-hiz-odd-reduction.dawn.test.ts +569 -0
  430. package/src/__tests__/ssr-hiz-rescue.dawn.test.ts +279 -0
  431. package/src/__tests__/ssr-hiz.browser.test.ts +150 -0
  432. package/src/__tests__/ssr-hiz.dawn.test.ts +150 -0
  433. package/src/__tests__/ssr-hiz.unit.test.ts +56 -0
  434. package/src/__tests__/ssr-inspection.unit.test.ts +105 -0
  435. package/src/__tests__/ssr-memory-budget.unit.test.ts +45 -0
  436. package/src/__tests__/ssr-performance-sequence-aggregation.unit.test.ts +15 -0
  437. package/src/__tests__/ssr-public-surface.test-d.ts +37 -0
  438. package/src/__tests__/ssr-receiver-coverage.dawn.test.ts +387 -0
  439. package/src/__tests__/ssr-reflection-mip-reducer.dawn.test.ts +309 -0
  440. package/src/__tests__/ssr-reprojection-probe.ts +90 -0
  441. package/src/__tests__/ssr-roughness-mip.dawn.test.ts +163 -0
  442. package/src/__tests__/ssr-shader-prewarm.unit.test.ts +59 -0
  443. package/src/__tests__/ssr-spatial.integration.test.ts +141 -0
  444. package/src/__tests__/ssr-stable-lattice.dawn.test.ts +475 -0
  445. package/src/__tests__/ssr-temporal-history.unit.test.ts +202 -0
  446. package/src/__tests__/ssr-texel-crossing.dawn.test.ts +448 -0
  447. package/src/__tests__/ssr-zero-work.integration.test.ts +87 -0
  448. package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +44 -12
  449. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +29 -0
  450. package/src/__tests__/standard-output-chain-contract.unit.test.ts +99 -0
  451. package/src/__tests__/standard-output-chain.integration.test.ts +73 -0
  452. package/src/__tests__/standard-output-gpu-evidence.ts +205 -0
  453. package/src/__tests__/standard-output.browser.test.ts +15 -0
  454. package/src/__tests__/standard-output.dawn.test.ts +15 -0
  455. package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +38 -0
  456. package/src/__tests__/standard-pipeline.integration.test.ts +320 -3
  457. package/src/__tests__/standard-profile-oracle.unit.test.ts +22 -0
  458. package/src/__tests__/standard-surface-lighting.unit.test.ts +41 -0
  459. package/src/__tests__/standard-texture-specialization.dawn.test.ts +141 -0
  460. package/src/__tests__/surface-adjacent-regressions.integration.test.ts +6 -3
  461. package/src/__tests__/taa-coverage-edge.dawn.test.ts +193 -0
  462. package/src/__tests__/taa-history-clipping.dawn.test.ts +328 -0
  463. package/src/__tests__/taa-neighborhood-equivalence.dawn.test.ts +778 -0
  464. package/src/__tests__/taa-stability-feedback.browser.test.ts +23 -0
  465. package/src/__tests__/taa-stability-feedback.dawn.test.ts +68 -0
  466. package/src/__tests__/taa-stability-feedback.ts +341 -0
  467. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +49 -7
  468. package/src/__tests__/temporal-reset-matrix.unit.test.ts +9 -0
  469. package/src/__tests__/temporal-transaction.integration.test.ts +28 -0
  470. package/src/__tests__/texture-usage-surface.unit.test.ts +4 -2
  471. package/src/__tests__/typed-pipeline-topology.unit.test.ts +109 -4
  472. package/src/__tests__/typed-scene-pass-material-cache.integration.test.ts +126 -0
  473. package/src/__tests__/vertex-layouts-ssot.unit.test.ts +47 -0
  474. package/src/__tests__/visibility-extract.perf.test.ts +20 -8
  475. package/src/__tests__/visibility-instances.integration.test.ts +19 -7
  476. package/src/__tests__/visibility-producer-matrix.integration.test.ts +20 -9
  477. package/src/assembly/atmosphere-shader-prewarm.ts +38 -0
  478. package/src/assembly/dynamic-geometry-host.ts +887 -0
  479. package/src/assembly/dynamic-geometry-runtime.ts +71 -0
  480. package/src/assembly/factory.ts +4 -0
  481. package/src/assembly/gpu-driven-owner.ts +29 -0
  482. package/src/assembly/host-contract.ts +36 -0
  483. package/src/assembly/material/assembly.ts +38 -0
  484. package/src/assembly/material-shader-policy.ts +71 -28
  485. package/src/assembly/recovery/failure-location.ts +62 -0
  486. package/src/assembly/recovery/renderer-recover.ts +19 -17
  487. package/src/assembly/renderer-facade.ts +29 -0
  488. package/src/assembly/renderer-feature-inspection.ts +13 -0
  489. package/src/assembly/renderer-frame-transaction.ts +63 -0
  490. package/src/assembly/renderer-helpers.ts +26 -0
  491. package/src/assembly/renderer-inspection.ts +6 -0
  492. package/src/assembly/shader-prewarm-policy.ts +32 -0
  493. package/src/assembly/skin-palette-owner.ts +21 -0
  494. package/src/assembly/ssr-shader-prewarm.ts +41 -0
  495. package/src/assembly/webgpu-device-loss.ts +75 -0
  496. package/src/assembly/webgpu-pbr-ready.ts +232 -0
  497. package/src/assembly/webgpu-ready-mipmap.ts +26 -0
  498. package/src/assembly/webgpu-ready.ts +142 -121
  499. package/src/assembly/webgpu-renderer-bootstrap.ts +85 -0
  500. package/src/assembly/webgpu-renderer-contract.ts +69 -0
  501. package/src/assembly/webgpu-renderer-guards.ts +32 -0
  502. package/src/assembly/webgpu-renderer-observation.ts +43 -0
  503. package/src/assembly/webgpu-renderer-recovery-failure.ts +62 -0
  504. package/src/assembly/webgpu-renderer.ts +675 -614
  505. package/src/assembly/webgpu-vertex-layouts.ts +233 -87
  506. package/src/components/__tests__/camera-exposure.contract.unit.test.ts +153 -0
  507. package/src/components/camera.ts +287 -7
  508. package/src/components/index.ts +1 -0
  509. package/src/components/instances.ts +45 -18
  510. package/src/components/scene-instance.ts +2 -1
  511. package/src/components/screen-space-reflection.ts +21 -0
  512. package/src/components/sprite-animation.ts +3 -3
  513. package/src/components/sprite-instances.ts +1 -1
  514. package/src/device/gpu-residency.ts +96 -93
  515. package/src/device/mesh-residency-lifetime.ts +73 -0
  516. package/src/dynamic-geometry.ts +736 -0
  517. package/src/environment/background.ts +263 -0
  518. package/src/errors/gpu-driven.ts +39 -5
  519. package/src/errors/render.ts +27 -3
  520. package/src/extract/camera.ts +26 -1
  521. package/src/extract/gpu-driven.ts +185 -10
  522. package/src/features/host.ts +237 -19
  523. package/src/features/noise-texture.ts +91 -0
  524. package/src/features/plan.ts +553 -24
  525. package/src/features/prepared-gpu-work.ts +631 -49
  526. package/src/features/prepared-graphics-store.ts +31 -0
  527. package/src/features/prepared-graphics.ts +5 -0
  528. package/src/features/render-graph-compute.ts +41 -8
  529. package/src/features/render-graph-contribution.ts +141 -3
  530. package/src/features/render-graph-raster.ts +143 -30
  531. package/src/features/types.ts +11 -0
  532. package/src/fullscreen-post-process-pass.ts +3 -0
  533. package/src/gpu-driven/batch-topology.ts +424 -102
  534. package/src/gpu-driven/pbr-program.ts +31 -0
  535. package/src/gpu-driven/prepared-draw.ts +29 -4
  536. package/src/gpu-driven/production-raster.ts +2267 -694
  537. package/src/gpu-driven/shadow-views.ts +539 -0
  538. package/src/gpu-driven/view-gpu.ts +188 -41
  539. package/src/gpu-scene-schema.ts +52 -11
  540. package/src/gpu-scene.ts +186 -99
  541. package/src/gpu-texture-usage.ts +1 -0
  542. package/src/hdrp-buffers.ts +72 -36
  543. package/src/ibl/frame-resources.ts +38 -0
  544. package/src/ibl/skylight-bind-group.ts +5 -4
  545. package/src/index.ts +125 -1
  546. package/src/inspection-types.ts +191 -0
  547. package/src/instances-derived-bounds.ts +258 -34
  548. package/src/instances.ts +459 -150
  549. package/src/internal.ts +22 -0
  550. package/src/lifecycle.ts +2 -0
  551. package/src/material-row.ts +145 -0
  552. package/src/materials.ts +44 -8
  553. package/src/pbr-pipeline.ts +159 -17
  554. package/src/pipeline/standard-forward-lane.ts +52 -24
  555. package/src/pipeline/standard-output/__tests__/lut-admission.unit.test.ts +103 -0
  556. package/src/pipeline/standard-output/auto-exposure/__tests__/capability.unit.test.ts +40 -0
  557. package/src/pipeline/standard-output/auto-exposure/__tests__/gpu.contract.unit.test.ts +125 -0
  558. package/src/pipeline/standard-output/auto-exposure/__tests__/graph.contract.unit.test.ts +94 -0
  559. package/src/pipeline/standard-output/auto-exposure/__tests__/oracle.test.ts +108 -0
  560. package/src/pipeline/standard-output/auto-exposure/__tests__/preset.test.ts +26 -0
  561. package/src/pipeline/standard-output/auto-exposure/capability.ts +38 -0
  562. package/src/pipeline/standard-output/auto-exposure/gpu.ts +567 -0
  563. package/src/pipeline/standard-output/auto-exposure/graph.ts +221 -0
  564. package/src/pipeline/standard-output/auto-exposure/inspection.ts +231 -0
  565. package/src/pipeline/standard-output/auto-exposure/oracle.ts +291 -0
  566. package/src/pipeline/standard-output/auto-exposure/preset.ts +28 -0
  567. package/src/pipeline/standard-output/auto-exposure/state.ts +156 -0
  568. package/src/pipeline/standard-output/color-transform.ts +124 -0
  569. package/src/pipeline/standard-output/graph.ts +139 -0
  570. package/src/pipeline/standard-output/lut-admission.ts +121 -0
  571. package/src/pipeline/standard-output/lut-gpu.ts +399 -0
  572. package/src/pipeline/standard-output/lut-state.ts +176 -0
  573. package/src/pipeline/standard-output/resources.ts +121 -0
  574. package/src/pipeline/standard-output/types.ts +58 -0
  575. package/src/pipeline/standard-pipeline.ts +192 -59
  576. package/src/pipeline/standard-post.ts +186 -27
  577. package/src/pipeline-builder.ts +16 -6
  578. package/src/pipeline-spec-types.ts +4 -0
  579. package/src/pipeline-spec.ts +37 -29
  580. package/src/points-lines/standard-owner.ts +6 -14
  581. package/src/prepare/prepared-graphics-resolver.ts +9 -2
  582. package/src/record/__tests__/material-slot-plan.unit.test.ts +48 -0
  583. package/src/record/__tests__/mesh-ssbo.unit.test.ts +40 -1
  584. package/src/record/__tests__/recovery-pipeline.unit.test.ts +2 -29
  585. package/src/record/__tests__/sprite-material-abi.unit.test.ts +36 -5
  586. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +45 -0
  587. package/src/record/__tests__/view-ubo-layout.unit.test.ts +5 -0
  588. package/src/record/dynamic-geometry-consumption.ts +59 -0
  589. package/src/record/frame-lighting.ts +12 -11
  590. package/src/record/frame-snapshot.ts +133 -23
  591. package/src/record/frame-targets.ts +9 -0
  592. package/src/record/frame.ts +727 -133
  593. package/src/record/main-pass-geometry.ts +162 -98
  594. package/src/record/main-pass-material.ts +115 -26
  595. package/src/record/main-pass-sprite-draws.ts +18 -107
  596. package/src/record/main-pass.ts +78 -8
  597. package/src/record/material-uniforms.ts +1 -1
  598. package/src/record/mesh-ssbo.ts +59 -15
  599. package/src/record/prepared-material-bindings.ts +234 -0
  600. package/src/record/recovery-pipeline.ts +59 -136
  601. package/src/record/render-context.ts +92 -22
  602. package/src/record/shadow-pass.ts +1231 -209
  603. package/src/record/skybox-post-pass.ts +14 -3
  604. package/src/record/typed-frame-graph.ts +1006 -53
  605. package/src/record/view-ubo.ts +11 -0
  606. package/src/recovery/render-system-candidate.ts +90 -66
  607. package/src/recovery/render-system-roots.ts +113 -0
  608. package/src/recovery/types.ts +77 -0
  609. package/src/reflection/record-owner.ts +26 -54
  610. package/src/render-contract.ts +219 -25
  611. package/src/render-graph-primitives.ts +6 -2
  612. package/src/render-pipeline.ts +70 -1
  613. package/src/render-system-extract-tail.ts +409 -160
  614. package/src/render-system-extract.ts +376 -102
  615. package/src/render-system-projections.ts +241 -0
  616. package/src/render-system.ts +692 -791
  617. package/src/scene/render-scene-types.ts +13 -4
  618. package/src/scene/render-scene.ts +569 -355
  619. package/src/scene/shadow-visibility.ts +21 -0
  620. package/src/ssr/admission.ts +380 -14
  621. package/src/ssr/compose.ts +144 -0
  622. package/src/ssr/errors.ts +48 -0
  623. package/src/ssr/graph.ts +777 -0
  624. package/src/ssr/history.ts +436 -0
  625. package/src/ssr/hiz.ts +124 -0
  626. package/src/ssr/inspection.ts +124 -0
  627. package/src/ssr/resources.ts +202 -0
  628. package/src/ssr/temporal.ts +164 -0
  629. package/src/systems/skin-palette-allocator.ts +495 -148
  630. package/src/systems/skin-palette-types.ts +17 -0
  631. package/src/systems/transparent-dispatch.ts +90 -0
  632. package/src/targets/material-source.ts +34 -0
  633. package/src/temporal/coverage.ts +1 -1
  634. package/src/temporal/frame-coordinator.ts +23 -2
  635. package/src/temporal/gpu.ts +74 -12
  636. package/src/temporal/history.ts +3 -1
  637. package/src/temporal/inspection.ts +2 -1
  638. package/src/temporal/standard-scene-data.ts +3 -1
  639. package/src/temporal/temporal-view.ts +3 -0
  640. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +204 -139
  641. package/src/typed-render-graph-primitives.ts +266 -74
  642. package/src/typed-shadow-passes.ts +122 -12
  643. package/src/volume/temporal.ts +10 -0
  644. package/dist/chunk-ADHHVYLW.mjs.map +0 -1
  645. package/dist/chunk-FJ6P52EE.mjs.map +0 -1
  646. package/dist/chunk-GE3SDD72.mjs.map +0 -1
  647. package/dist/chunk-GF523LHF.mjs.map +0 -1
  648. package/dist/chunk-HKXTW355.mjs.map +0 -1
  649. package/dist/chunk-JDWARUOI.mjs.map +0 -1
  650. package/dist/chunk-KM2NOX2I.mjs.map +0 -1
  651. package/dist/chunk-TMIASV2N.mjs.map +0 -1
  652. package/dist/chunk-XDP6XE5V.mjs.map +0 -1
  653. package/dist/chunk-ZZ4YQ474.mjs.map +0 -1
  654. package/src/__tests__/instances-world-ownership.integration.test.ts +0 -62
  655. package/src/scene/__tests__/changed-block-summary.candidate.test.ts +0 -36
@@ -6,13 +6,20 @@ import type {
6
6
  RenderGraphError,
7
7
  ResolveContext,
8
8
  } from '@forgeax/engine-render-graph';
9
- import { RhiError, type TextureView } from '@forgeax/engine-rhi';
9
+ import {
10
+ type Buffer,
11
+ RhiError,
12
+ type Texture,
13
+ type TextureFormat,
14
+ type TextureView,
15
+ } from '@forgeax/engine-rhi';
10
16
  import { ok, type PassKind, type PassSelector, type Result } from '@forgeax/engine-types';
11
17
  import {
12
18
  GPU_TEXTURE_USAGE_COPY_SRC,
13
19
  GPU_TEXTURE_USAGE_RENDER_ATTACHMENT,
14
20
  GPU_TEXTURE_USAGE_TEXTURE_BINDING,
15
21
  } from './gpu-texture-usage';
22
+ import { GPU_BUFFER_USAGE_COPY_DST, GPU_BUFFER_USAGE_MAP_READ } from './gpu-usage';
16
23
  import { buildPerFrameBindGroups } from './record/frame-lighting';
17
24
  import { encodeMainPass } from './record/main-pass';
18
25
  import type {
@@ -88,6 +95,136 @@ function resolvedDepthView(
88
95
  return view.value;
89
96
  }
90
97
 
98
+ export type TypedFrameObservationDomain = 'linear-hdr' | 'linear-ldr' | 'final-srgb';
99
+
100
+ /**
101
+ * One graph-owned copy destination for a receipt-bound color-domain capture.
102
+ * The buffer is created by the same encoder transaction as the source copy;
103
+ * callers map it only after the matching receipt fence resolves.
104
+ */
105
+ export interface TypedFrameObservationCapture {
106
+ readonly domain: TypedFrameObservationDomain;
107
+ /** Native source format is required so consumers can decode BGRA surfaces truthfully. */
108
+ readonly format: TextureFormat;
109
+ readonly device: import('@forgeax/engine-rhi').RhiDevice;
110
+ readonly texture: Texture;
111
+ readonly buffer: Buffer;
112
+ readonly frameNumber: number;
113
+ readonly deviceGeneration: number;
114
+ readonly graphGeneration: number;
115
+ readonly backendId: string;
116
+ readonly width: number;
117
+ readonly height: number;
118
+ readonly bytesPerRow: number;
119
+ }
120
+
121
+ function observationBytesPerPixel(format: TextureFormat): number {
122
+ return format === 'rgba16float' ? 8 : 4;
123
+ }
124
+
125
+ function observationBytesPerRow(width: number, format: TextureFormat): number {
126
+ const unaligned = width * observationBytesPerPixel(format);
127
+ return Math.ceil(unaligned / 256) * 256;
128
+ }
129
+
130
+ function addObservationCapturePass(
131
+ graph: RenderGraphBuilder<RenderPipelineFrame>,
132
+ target: RenderPipelineTarget,
133
+ domain: TypedFrameObservationDomain,
134
+ ): Result<void, RenderGraphError> {
135
+ return graph.addCopyPass(`${domain}-observation`, {
136
+ accesses: [{ resource: target.view, usage: 'copy-src' }],
137
+ encode: ({ encoder, frame, resources }) => {
138
+ const texture = resources.texture(target.texture);
139
+ if (!texture.ok) throw texture.error;
140
+ const internal = frame as _InternalRenderPipelineContext;
141
+ // The RenderSystem frame counter is the identity used by
142
+ // observeCurrentFrame after this submission. The public receipt counter
143
+ // is intentionally separate and is only used by receipt-bound copies;
144
+ // using observationFrameId here makes a current source look stale by one
145
+ // frame to the legacy same-frame observer.
146
+ if (domain === 'linear-hdr') {
147
+ internal.frameState.currentFrameObservationSource = {
148
+ texture: texture.value,
149
+ descriptor: {
150
+ texture: texture.value,
151
+ format: target.format,
152
+ size: { width: frame.targetW, height: frame.targetH },
153
+ usage:
154
+ GPU_TEXTURE_USAGE_COPY_SRC |
155
+ GPU_TEXTURE_USAGE_RENDER_ATTACHMENT |
156
+ GPU_TEXTURE_USAGE_TEXTURE_BINDING,
157
+ sample: target.sampleCount,
158
+ },
159
+ frameId: internal.frameState.frameNumber,
160
+ pipelineId: 'forgeax::standard',
161
+ backendId: frame.runtime.device.caps.backendKind,
162
+ };
163
+ }
164
+ const owner = frame.runtime.observationCaptureOwner;
165
+ if (owner === undefined) {
166
+ // Standalone graph-contract tests do not assemble a renderer owner.
167
+ // Preserve the legacy HDR source projection without allocating an
168
+ // unowned readback buffer; production frames always inject the owner.
169
+ return;
170
+ }
171
+ // Observation is an explicit host demand, not a property of every
172
+ // submitted frame. The graph keeps its copy pass declaration so the
173
+ // committed topology remains inspectable, but ordinary production
174
+ // frames must not allocate a MAP_READ buffer or enqueue a copy.
175
+ // The source projection is different: the Renderer owns the current
176
+ // linear-HDR texture for every submitted frame, even when no host asked
177
+ // for a MAP_READ copy. Consumers such as the auto-exposure meter use
178
+ // this same-frame source; publishing it only on an explicit capture
179
+ // would make ordinary frames appear to have no observation source.
180
+ if (!frame.runtime.observationCaptureDomains?.includes(domain)) return;
181
+ const width = frame.targetW;
182
+ const height = frame.targetH;
183
+ const bytesPerRow = observationBytesPerRow(width, target.format);
184
+ const created = frame.runtime.device.createBuffer({
185
+ label: `${domain}-observation-readback`,
186
+ size: bytesPerRow * height,
187
+ usage: GPU_BUFFER_USAGE_COPY_DST | GPU_BUFFER_USAGE_MAP_READ,
188
+ mappedAtCreation: false,
189
+ });
190
+ if (!created.ok) throw created.error;
191
+ try {
192
+ encoder.copyTextureToBuffer(
193
+ { texture: texture.value, mipLevel: 0, origin: { x: 0, y: 0, z: 0 } },
194
+ { buffer: created.value, bytesPerRow, rowsPerImage: height },
195
+ { width, height, depthOrArrayLayers: 1 },
196
+ );
197
+ // Publish the graph fence through the renderer runtime before any
198
+ // capture is registered. The assembly consumes this renderer-issued
199
+ // value for the receipt; it never derives the expected fence from the
200
+ // first capture in an otherwise untrusted capture set.
201
+ frame.runtime.observationGraphGeneration = internal.frameState.graphGeneration;
202
+ owner.register({
203
+ domain,
204
+ format: target.format,
205
+ device: frame.runtime.device,
206
+ texture: texture.value,
207
+ buffer: created.value,
208
+ // The assembly reserves this public receipt identity before encoding.
209
+ // The frame-state counter is an internal record counter and is not an
210
+ // identity source when non-receipt frames are recorded.
211
+ frameNumber: frame.runtime.observationFrameId ?? internal.frameState.frameNumber,
212
+ deviceGeneration: frame.runtime.deviceGeneration ?? 0,
213
+ graphGeneration: internal.frameState.graphGeneration,
214
+ backendId: frame.runtime.device.caps.backendKind,
215
+ width,
216
+ height,
217
+ bytesPerRow,
218
+ });
219
+ } catch (cause) {
220
+ const destroyed = frame.runtime.device.destroyBuffer(created.value);
221
+ if (!destroyed.ok) throw destroyed.error;
222
+ throw cause;
223
+ }
224
+ },
225
+ });
226
+ }
227
+
91
228
  function legacyResolver(
92
229
  resources: GraphResourceResolver,
93
230
  targets: Readonly<Record<string, RenderPipelineTarget>>,
@@ -131,9 +268,13 @@ export interface TypedScenePassOptions {
131
268
  readonly passKind?: PassKind | undefined;
132
269
  readonly colorTargets?: readonly RenderPipelineTarget[] | undefined;
133
270
  readonly clearColor?: readonly [number, number, number, number] | undefined;
134
- readonly colorLoadOp?: GPULoadOp | undefined;
271
+ readonly colorLoadOp?: GPULoadOp | readonly GPULoadOp[] | undefined;
135
272
  readonly depthLoadOp?: GPULoadOp | undefined;
136
273
  readonly recordMode?: 'opaque' | 'transmission' | 'transparent' | undefined;
274
+ /** Exclude material/pass pairs consumed by an earlier graph lane. */
275
+ readonly excludeSelector?: PassSelector | undefined;
276
+ /** Require material membership in another lane without selecting its entries. */
277
+ readonly includeSelector?: PassSelector | undefined;
137
278
  readonly transmissionBackdrop?: GraphTextureView | undefined;
138
279
  readonly extraAccesses?: readonly GraphAccess[] | undefined;
139
280
  readonly gpuDriven?: RenderPipelineGpuDrivenProjection | undefined;
@@ -171,7 +312,10 @@ export function addTypedScenePass(
171
312
  ...(index === 0 && options.resolve !== undefined
172
313
  ? { resolveTarget: options.resolve.view }
173
314
  : {}),
174
- loadOp: options.colorLoadOp ?? 'clear',
315
+ loadOp:
316
+ (typeof options.colorLoadOp === 'string'
317
+ ? options.colorLoadOp
318
+ : options.colorLoadOp?.[index]) ?? 'clear',
175
319
  storeOp: 'store',
176
320
  clearValue: {
177
321
  r: options.clearColor?.[0] ?? 0,
@@ -228,47 +372,66 @@ export function addTypedScenePass(
228
372
  true,
229
373
  internal.standardLighting,
230
374
  );
231
- if (groups.viewBindGroup !== null) {
232
- options.gpuDriven?.encode(groups.viewBindGroup, pass, resources);
233
- }
375
+ // GPU-driven indirect draws are encoded by `recordMainPass` after it
376
+ // has populated the frame-global material bind-group receipt. Encoding
377
+ // here would race that producer and either observe an empty receipt or
378
+ // issue the same indirect draw twice. Keep this wrapper responsible for
379
+ // resolving graph-owned attachments; the main-pass owner orders the
380
+ // material producer before the GPU consumer.
234
381
  // The context carries the frame's primary occlusion projection for
235
382
  // pipeline construction, but only the pass that owns that projection
236
383
  // may begin its query. Forwarding it to deferred/temporal scene passes
237
384
  // leaves their descriptors without an occlusionQuerySet and makes Dawn
238
385
  // reject beginOcclusionQuery in those passes.
239
386
  const activeOcclusion = options.occlusion;
240
- encodeMainPass(
241
- {
242
- ...internal,
243
- ...(activeOcclusion === undefined ? {} : { occlusion: activeOcclusion }),
244
- geometryColorView: colorViews[0] ?? null,
245
- geometryDepthView: depthView,
246
- geometryColorResolveView: resolveView,
247
- transparentColorFormat: colorTargets[0]?.format as GPUTextureFormat,
248
- ...(colorTargets[1]?.format === 'rgba16float'
249
- ? { reflectionFallbackColorFormat: 'rgba16float' as const }
250
- : {}),
251
- msaaActive: colorTargets[0]?.sampleCount === 4,
252
- viewBindGroup: groups.viewBindGroup,
253
- meshBindGroup: groups.meshBindGroup,
254
- hdrpClusterBindGroup: groups.hdrpClusterBindGroup,
255
- hdrpClusterMembershipBindGroup: groups.hdrpClusterMembershipBindGroup,
256
- ...(ssao === undefined ? {} : { hdrpSsaoBlurredView: ssao }),
257
- },
258
- pass,
259
- options.selector,
260
- {
261
- colorViews,
262
- colorFormats: colorTargets.map((target) => target.format as GPUTextureFormat),
263
- depthView,
264
- passKind: options.passKind ?? 'forward',
265
- ...(options.clearColor === undefined ? {} : { clearColor: options.clearColor }),
266
- ...(options.recordMode === undefined ? {} : { recordMode: options.recordMode }),
267
- ...(options.transmissionBackdrop === undefined
268
- ? {}
269
- : { transmissionBackdropView: transmissionBackdrop }),
270
- },
271
- );
387
+ const passContext: _InternalRenderPipelineContext = {
388
+ ...internal,
389
+ ...(activeOcclusion === undefined ? {} : { occlusion: activeOcclusion }),
390
+ geometryColorView: colorViews[0] ?? null,
391
+ geometryDepthView: depthView,
392
+ geometryColorResolveView: resolveView,
393
+ transparentColorFormat: colorTargets[0]?.format as GPUTextureFormat,
394
+ ...((options.passKind === 'deferred'
395
+ ? colorTargets[3]?.format
396
+ : colorTargets[1]?.format) === 'rgba16float'
397
+ ? { reflectionFallbackColorFormat: 'rgba16float' as const }
398
+ : {}),
399
+ msaaActive: colorTargets[0]?.sampleCount === 4,
400
+ viewBindGroup: groups.viewBindGroup,
401
+ meshBindGroup: groups.meshBindGroup,
402
+ hdrpClusterBindGroup: groups.hdrpClusterBindGroup,
403
+ hdrpClusterMembershipBindGroup: groups.hdrpClusterMembershipBindGroup,
404
+ ...(ssao === undefined ? {} : { hdrpSsaoBlurredView: ssao }),
405
+ };
406
+ encodeMainPass(passContext, pass, options.selector, {
407
+ colorViews,
408
+ colorFormats: colorTargets.map((target) => target.format as GPUTextureFormat),
409
+ depthView,
410
+ passKind: options.passKind ?? 'forward',
411
+ ...(options.clearColor === undefined ? {} : { clearColor: options.clearColor }),
412
+ ...(options.recordMode === undefined ? {} : { recordMode: options.recordMode }),
413
+ ...(options.excludeSelector === undefined
414
+ ? {}
415
+ : { excludeSelector: options.excludeSelector }),
416
+ ...(options.includeSelector === undefined
417
+ ? {}
418
+ : { includeSelector: options.includeSelector }),
419
+ ...(options.transmissionBackdrop === undefined
420
+ ? {}
421
+ : { transmissionBackdropView: transmissionBackdrop }),
422
+ ...(options.gpuDriven === undefined
423
+ ? {}
424
+ : { gpuDriven: { projection: options.gpuDriven, resources } }),
425
+ });
426
+ // encodeMainPass receives a pass-local context so attachment and
427
+ // bind-group overrides stay isolated. Its material UBO payload cache is
428
+ // frame-owned, however: return it to the original context so the next
429
+ // Standard scene pass can reuse the same validated slot projection.
430
+ // This remains frame-local and keeps the existing writeBuffer, texture
431
+ // readiness, UV-scale, and missing-texture diagnostic behavior intact.
432
+ if (passContext.materialUboPayloadCache !== undefined) {
433
+ internal.materialUboPayloadCache = passContext.materialUboPayloadCache;
434
+ }
272
435
  if (activeOcclusion !== undefined) {
273
436
  const proxyResult = activeOcclusion.encodeProxyBounds(pass);
274
437
  if (!proxyResult.ok) throw proxyResult.error;
@@ -282,30 +445,8 @@ export function addTypedFrameObservationPass(
282
445
  target: RenderPipelineTarget,
283
446
  pipelineId: 'forgeax::standard',
284
447
  ): Result<void, RenderGraphError> {
285
- return graph.addCopyPass('linear-hdr-observation', {
286
- accesses: [{ resource: target.view, usage: 'copy-src' }],
287
- encode: ({ frame, resources }) => {
288
- const internal = frame as _InternalRenderPipelineContext;
289
- const texture = resources.texture(target.texture);
290
- if (!texture.ok) throw texture.error;
291
- internal.frameState.currentFrameObservationSource = {
292
- texture: texture.value,
293
- descriptor: {
294
- texture: texture.value,
295
- format: target.format,
296
- size: { width: frame.targetW, height: frame.targetH },
297
- usage:
298
- GPU_TEXTURE_USAGE_COPY_SRC |
299
- GPU_TEXTURE_USAGE_RENDER_ATTACHMENT |
300
- GPU_TEXTURE_USAGE_TEXTURE_BINDING,
301
- sample: target.sampleCount,
302
- },
303
- frameId: internal.frameState.frameNumber,
304
- pipelineId,
305
- backendId: frame.runtime.device.caps.backendKind,
306
- };
307
- },
308
- });
448
+ void pipelineId;
449
+ return addObservationCapturePass(graph, target, 'linear-hdr');
309
450
  }
310
451
 
311
452
  /** Publish the same-frame fallback MRT as a detached, copy-readable source. */
@@ -508,6 +649,8 @@ export function addTypedSsaoPasses(
508
649
  export interface TypedFullscreenPassOptions {
509
650
  readonly name: string;
510
651
  readonly shader: string;
652
+ /** Optional fragment entry point override for composed fullscreen shaders. */
653
+ readonly fragmentEntryPoint?: string | undefined;
511
654
  readonly input: RenderPipelineTarget;
512
655
  readonly output: RenderPipelineTarget;
513
656
  readonly outputOnly?: boolean | undefined;
@@ -525,12 +668,16 @@ export interface TypedFullscreenPassOptions {
525
668
 
526
669
  export interface TypedTemporalResolveTargets {
527
670
  readonly scene: RenderPipelineTarget;
671
+ /** Optional producer-owned R-channel reactivity in current screen space. */
672
+ readonly secondaryReactivity?: GraphTextureView;
528
673
  readonly currentTemporal: RenderPipelineTarget;
529
674
  readonly depth: RenderPipelineTarget;
530
675
  readonly historyColor: RenderPipelineTarget;
531
676
  readonly historyTemporal: RenderPipelineTarget;
677
+ readonly historyStability: RenderPipelineTarget;
532
678
  readonly writeColor: RenderPipelineTarget;
533
679
  readonly writeTemporal: RenderPipelineTarget;
680
+ readonly writeStability: RenderPipelineTarget;
534
681
  }
535
682
 
536
683
  export function addTypedTemporalResolvePass(
@@ -543,8 +690,13 @@ export function addTypedTemporalResolvePass(
543
690
  { resource: targets.currentTemporal.view, usage: 'sampled-read' },
544
691
  { resource: targets.historyColor.view, usage: 'sampled-read' },
545
692
  { resource: targets.historyTemporal.view, usage: 'sampled-read' },
693
+ { resource: targets.historyStability.view, usage: 'sampled-read' },
694
+ ...(targets.secondaryReactivity === undefined
695
+ ? []
696
+ : [{ resource: targets.secondaryReactivity, usage: 'sampled-read' as const }]),
546
697
  { resource: targets.writeColor.view, usage: 'color-attachment' },
547
698
  { resource: targets.writeTemporal.view, usage: 'color-attachment' },
699
+ { resource: targets.writeStability.view, usage: 'color-attachment' },
548
700
  ],
549
701
  colorAttachments: [
550
702
  {
@@ -559,6 +711,12 @@ export function addTypedTemporalResolvePass(
559
711
  storeOp: 'store',
560
712
  clearValue: { r: 0, g: 0, b: 0, a: 0 },
561
713
  },
714
+ {
715
+ view: targets.writeStability.view,
716
+ loadOp: 'clear',
717
+ storeOp: 'store',
718
+ clearValue: { r: 0, g: 0, b: 0, a: 0 },
719
+ },
562
720
  ],
563
721
  encode: ({ pass, frame, resources }) => {
564
722
  const internal = frame as _InternalRenderPipelineContext;
@@ -574,11 +732,12 @@ export function addTypedTemporalResolvePass(
574
732
  const currentTemporal = resolvedView(resources, targets.currentTemporal.view);
575
733
  const historyColor = resolvedView(resources, targets.historyColor.view);
576
734
  const historyTemporal = resolvedView(resources, targets.historyTemporal.view);
735
+ const historyStability = resolvedView(resources, targets.historyStability.view);
577
736
  const params = getTemporalParamsBuffer(state);
578
- if (params === undefined || built.sampler === null) {
737
+ if (params === undefined || built.sampler === null || built.temporalSampler === null) {
579
738
  throwTemporalEncodeFailure('TAA resolve has an admitted params buffer and sampler');
580
739
  }
581
- const payload = new ArrayBuffer(16);
740
+ const payload = new ArrayBuffer(32);
582
741
  new Float32Array(payload).set([
583
742
  frame.camera.temporal?.currentJitterUv?.[0] ?? 0,
584
743
  frame.camera.temporal?.currentJitterUv?.[1] ?? 0,
@@ -586,6 +745,7 @@ export function addTypedTemporalResolvePass(
586
745
  const words = new Uint32Array(payload);
587
746
  words[2] = state.valid && (frame.camera.temporal?.historyValid ?? true) ? 1 : 0;
588
747
  words[3] = frame.camera.temporal?.temporalFrameIndex ?? 0;
748
+ words[4] = Number(targets.secondaryReactivity !== undefined);
589
749
  const written = frame.runtime.device.queue.writeBuffer(params, 0, new Uint8Array(payload));
590
750
  if (!written.ok)
591
751
  throwTemporalEncodeFailure('TAA resolve params upload succeeds', written.error);
@@ -598,20 +758,31 @@ export function addTypedTemporalResolvePass(
598
758
  { binding: 2, resource: { kind: 'textureView', value: historyColor } },
599
759
  { binding: 3, resource: { kind: 'sampler', value: built.sampler } },
600
760
  { binding: 4, resource: { kind: 'textureView', value: historyTemporal } },
601
- { binding: 5, resource: { kind: 'sampler', value: built.sampler } },
761
+ { binding: 5, resource: { kind: 'sampler', value: built.temporalSampler } },
602
762
  { binding: 6, resource: { kind: 'textureView', value: currentTemporal } },
603
- { binding: 7, resource: { kind: 'sampler', value: built.sampler } },
763
+ { binding: 7, resource: { kind: 'sampler', value: built.temporalSampler } },
604
764
  { binding: 8, resource: { kind: 'buffer', value: { buffer: params } } },
765
+ { binding: 9, resource: { kind: 'textureView', value: historyStability } },
766
+ {
767
+ binding: 10,
768
+ resource: {
769
+ kind: 'textureView',
770
+ value:
771
+ targets.secondaryReactivity === undefined
772
+ ? currentTemporal
773
+ : resolvedView(resources, targets.secondaryReactivity),
774
+ },
775
+ },
605
776
  ] as never,
606
777
  });
607
778
  if (!bindGroup.ok) {
608
779
  throwTemporalEncodeFailure('TAA resolve bind group creation succeeds', bindGroup.error);
609
780
  }
610
- const pipeline = frame.runtime.getPostProcessPipeline?.(
611
- 'forgeax.taa-resolve',
612
- built.layout,
613
- targets.writeColor.format as GPUTextureFormat,
614
- );
781
+ const pipeline = frame.runtime.getPostProcessPipeline?.('forgeax.taa-resolve', built.layout, [
782
+ targets.writeColor.format,
783
+ targets.writeTemporal.format,
784
+ targets.writeStability.format,
785
+ ] as GPUTextureFormat[]);
615
786
  if (pipeline === null || pipeline === undefined) {
616
787
  throwTemporalEncodeFailure('TAA resolve pipeline is ready before frame encoding');
617
788
  }
@@ -680,6 +851,9 @@ export function addTypedFullscreenPass(
680
851
  : {
681
852
  paramsOverride: options.paramsTransform(frame.postProcessParams.get(options.shader)),
682
853
  }),
854
+ ...(options.fragmentEntryPoint === undefined
855
+ ? {}
856
+ : { fragmentEntryPoint: options.fragmentEntryPoint }),
683
857
  });
684
858
  },
685
859
  });
@@ -746,11 +920,20 @@ export function addTypedOutputTransformPass(
746
920
  graph: RenderGraphBuilder<RenderPipelineFrame>,
747
921
  input: RenderPipelineTarget,
748
922
  output: RenderPipelineTarget,
749
- options: { readonly outputOnly?: boolean; readonly dither?: boolean } = {},
923
+ options: {
924
+ readonly outputOnly?: boolean;
925
+ readonly dither?: boolean;
926
+ readonly name?: string | undefined;
927
+ readonly fragmentEntryPoint?: string | undefined;
928
+ } = {},
750
929
  ): Result<void, RenderGraphError> {
751
930
  const outputOnly = options.outputOnly ?? false;
752
- return addTypedFullscreenPass(graph, {
753
- name: outputOnly ? 'present' : 'output-transform',
931
+ if (options.fragmentEntryPoint === 'fs_encode_only') {
932
+ const ldrCapture = addObservationCapturePass(graph, input, 'linear-ldr');
933
+ if (!ldrCapture.ok) return ldrCapture;
934
+ }
935
+ const transformed = addTypedFullscreenPass(graph, {
936
+ name: options.name ?? (outputOnly ? 'present' : 'output-transform'),
754
937
  shader: STANDARD_OUTPUT_TRANSFORM_FEATURE_ID,
755
938
  input,
756
939
  output,
@@ -770,5 +953,14 @@ export function addTypedOutputTransformPass(
770
953
  },
771
954
  }
772
955
  : {}),
956
+ ...(options.fragmentEntryPoint === undefined
957
+ ? {}
958
+ : { fragmentEntryPoint: options.fragmentEntryPoint }),
773
959
  });
960
+ if (!transformed.ok) return transformed;
961
+ if (options.fragmentEntryPoint === 'fs_encode_only') {
962
+ const finalCapture = addObservationCapturePass(graph, output, 'final-srgb');
963
+ if (!finalCapture.ok) return finalCapture;
964
+ }
965
+ return ok(undefined);
774
966
  }