@forgeax/engine-render 0.1.4 → 0.1.6

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 (918) hide show
  1. package/README.md +130 -641
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts +2 -0
  4. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts.map +1 -0
  5. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts +2 -0
  6. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts.map +1 -0
  7. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts +2 -0
  8. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts.map +1 -0
  9. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +1 -1
  10. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +6 -0
  11. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +1 -1
  12. package/dist/{gpu-driven/view-reference.d.ts → __tests__/gpu-driven-view-reference.d.ts} +4 -4
  13. package/dist/__tests__/gpu-driven-view-reference.d.ts.map +1 -0
  14. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +1 -1
  15. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts +2 -0
  16. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts.map +1 -0
  17. package/dist/__tests__/morph-feature-plan.unit.test.d.ts +2 -0
  18. package/dist/__tests__/morph-feature-plan.unit.test.d.ts.map +1 -0
  19. package/dist/__tests__/render-feature-plan.test-d.d.ts +2 -0
  20. package/dist/__tests__/render-feature-plan.test-d.d.ts.map +1 -0
  21. package/dist/__tests__/render-feature-plan.unit.test.d.ts +2 -0
  22. package/dist/__tests__/render-feature-plan.unit.test.d.ts.map +1 -0
  23. package/dist/__tests__/ssao-config.unit.test.d.ts +2 -0
  24. package/dist/__tests__/ssao-config.unit.test.d.ts.map +1 -0
  25. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts +2 -0
  26. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts.map +1 -0
  27. package/dist/__tests__/standard-descriptors.test-d.d.ts +2 -0
  28. package/dist/__tests__/standard-descriptors.test-d.d.ts.map +1 -0
  29. package/dist/__tests__/standard-pipeline.dawn.test.d.ts +2 -0
  30. package/dist/__tests__/standard-pipeline.dawn.test.d.ts.map +1 -0
  31. package/dist/__tests__/standard-pipeline.integration.test.d.ts +2 -0
  32. package/dist/__tests__/standard-pipeline.integration.test.d.ts.map +1 -0
  33. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts +2 -0
  34. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts.map +1 -0
  35. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts +2 -0
  36. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts.map +1 -0
  37. package/dist/{renderer/backend-selection.d.ts → assembly/backend-contract.d.ts} +15 -4
  38. package/dist/assembly/backend-contract.d.ts.map +1 -0
  39. package/dist/assembly/factory.d.ts +207 -0
  40. package/dist/assembly/factory.d.ts.map +1 -0
  41. package/dist/assembly/host-contract.d.ts +84 -0
  42. package/dist/assembly/host-contract.d.ts.map +1 -0
  43. package/dist/{renderer → assembly}/material/assembly.d.ts +0 -1
  44. package/dist/{renderer → assembly}/material/assembly.d.ts.map +1 -1
  45. package/dist/assembly/material/pipeline-projection.d.ts +30 -0
  46. package/dist/assembly/material/pipeline-projection.d.ts.map +1 -0
  47. package/dist/authoring.d.ts +10 -11
  48. package/dist/authoring.d.ts.map +1 -1
  49. package/dist/authoring.mjs +25 -3
  50. package/dist/authoring.mjs.map +1 -1
  51. package/dist/chunk-CQXZC5XI.mjs +182 -0
  52. package/dist/chunk-CQXZC5XI.mjs.map +1 -0
  53. package/dist/chunk-QC4VW3XJ.mjs +79 -0
  54. package/dist/chunk-QC4VW3XJ.mjs.map +1 -0
  55. package/dist/chunk-SCRSAK5B.mjs +480 -0
  56. package/dist/chunk-SCRSAK5B.mjs.map +1 -0
  57. package/dist/components/__tests__/schema-contract.unit.test.d.ts +2 -0
  58. package/dist/components/__tests__/schema-contract.unit.test.d.ts.map +1 -0
  59. package/dist/components/glyph-text.d.ts +1 -1
  60. package/dist/components/glyph-text.d.ts.map +1 -1
  61. package/dist/components/index.d.ts +2 -2
  62. package/dist/components/index.d.ts.map +1 -1
  63. package/dist/components/instances.d.ts +1 -1
  64. package/dist/components/instances.d.ts.map +1 -1
  65. package/dist/components/light-helpers.d.ts +1 -1
  66. package/dist/components/light-helpers.d.ts.map +1 -1
  67. package/dist/components/mesh-filter.d.ts +7 -7
  68. package/dist/components/mesh-filter.d.ts.map +1 -1
  69. package/dist/components/scene-instance.d.ts +11 -11
  70. package/dist/components/skybox-background.d.ts +56 -0
  71. package/dist/components/skybox-background.d.ts.map +1 -0
  72. package/dist/components/skylight.d.ts +55 -0
  73. package/dist/components/skylight.d.ts.map +1 -0
  74. package/dist/components/sprite-animation.d.ts +2 -3
  75. package/dist/components/sprite-animation.d.ts.map +1 -1
  76. package/dist/components/sprite-instances.d.ts +1 -1
  77. package/dist/components/sprite-playback-mode.d.ts +6 -1
  78. package/dist/components/sprite-playback-mode.d.ts.map +1 -1
  79. package/dist/components/sprite-region-override.d.ts +2 -3
  80. package/dist/components/sprite-region-override.d.ts.map +1 -1
  81. package/dist/components/tile-layer.d.ts +5 -0
  82. package/dist/components/tile-layer.d.ts.map +1 -1
  83. package/dist/construct-renderer.d.ts +18 -1
  84. package/dist/construct-renderer.d.ts.map +1 -1
  85. package/dist/construct-renderer.mjs +27008 -4
  86. package/dist/construct-renderer.mjs.map +1 -1
  87. package/dist/debug-draw-glue.d.ts +2 -53
  88. package/dist/debug-draw-glue.d.ts.map +1 -1
  89. package/dist/device/device-scope.d.ts +83 -0
  90. package/dist/device/device-scope.d.ts.map +1 -0
  91. package/dist/{gpu-resource-store.d.ts → device/gpu-residency.d.ts} +91 -48
  92. package/dist/device/gpu-residency.d.ts.map +1 -0
  93. package/dist/device/resource-types.d.ts +8 -0
  94. package/dist/device/resource-types.d.ts.map +1 -0
  95. package/dist/engine-metrics.d.ts +2 -2
  96. package/dist/engine-metrics.d.ts.map +1 -1
  97. package/dist/errors/recover.d.ts +28 -1
  98. package/dist/errors/recover.d.ts.map +1 -1
  99. package/dist/errors/render.d.ts +249 -258
  100. package/dist/errors/render.d.ts.map +1 -1
  101. package/dist/features/fullscreen.d.ts +19 -0
  102. package/dist/features/fullscreen.d.ts.map +1 -0
  103. package/dist/features/host.d.ts +32 -26
  104. package/dist/features/host.d.ts.map +1 -1
  105. package/dist/features/morph/morph-feature.d.ts +39 -5
  106. package/dist/features/morph/morph-feature.d.ts.map +1 -1
  107. package/dist/features/plan.d.ts +182 -0
  108. package/dist/features/plan.d.ts.map +1 -0
  109. package/dist/features/prepared-gpu-work.d.ts +21 -17
  110. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  111. package/dist/features/prepared-graphics-store.d.ts +2 -1
  112. package/dist/features/prepared-graphics-store.d.ts.map +1 -1
  113. package/dist/features/prepared-graphics.d.ts +11 -21
  114. package/dist/features/prepared-graphics.d.ts.map +1 -1
  115. package/dist/features/render-graph-compute.d.ts +2 -2
  116. package/dist/features/render-graph-compute.d.ts.map +1 -1
  117. package/dist/features/render-graph-contribution.d.ts +4 -7
  118. package/dist/features/render-graph-contribution.d.ts.map +1 -1
  119. package/dist/features/render-graph-raster.d.ts +2 -2
  120. package/dist/features/render-graph-raster.d.ts.map +1 -1
  121. package/dist/features/render-graph-resources.d.ts +6 -6
  122. package/dist/features/render-graph-resources.d.ts.map +1 -1
  123. package/dist/features/targets.d.ts +5 -5
  124. package/dist/features/targets.d.ts.map +1 -1
  125. package/dist/features/types.d.ts +11 -190
  126. package/dist/features/types.d.ts.map +1 -1
  127. package/dist/features/vocabulary.d.ts +14 -0
  128. package/dist/features/vocabulary.d.ts.map +1 -0
  129. package/dist/fullscreen-post-process-pass.d.ts +4 -25
  130. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  131. package/dist/glyph-text-layout-system.d.ts +3 -2
  132. package/dist/glyph-text-layout-system.d.ts.map +1 -1
  133. package/dist/gpu-driven/batch-topology.d.ts +6 -75
  134. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  135. package/dist/gpu-driven/production-raster.d.ts +13 -112
  136. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  137. package/dist/gpu-driven/view-gpu.d.ts +10 -66
  138. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  139. package/dist/gpu-resource.d.ts +3 -3
  140. package/dist/gpu-scene-schema.d.ts +1 -94
  141. package/dist/gpu-scene-schema.d.ts.map +1 -1
  142. package/dist/gpu-scene.d.ts +7 -33
  143. package/dist/gpu-scene.d.ts.map +1 -1
  144. package/dist/hdrp-buffers.d.ts +3 -53
  145. package/dist/hdrp-buffers.d.ts.map +1 -1
  146. package/dist/ibl/IblPipelineCache.d.ts +74 -180
  147. package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
  148. package/dist/ibl/skylight-bind-group.d.ts +1 -1
  149. package/dist/index.d.ts +13 -43
  150. package/dist/index.d.ts.map +1 -1
  151. package/dist/index.mjs +165 -3
  152. package/dist/index.mjs.map +1 -1
  153. package/dist/inspection-types.d.ts +69 -0
  154. package/dist/inspection-types.d.ts.map +1 -0
  155. package/dist/instance-buffer-cache.d.ts +1 -4
  156. package/dist/instance-buffer-cache.d.ts.map +1 -1
  157. package/dist/internal.d.ts +1 -73
  158. package/dist/internal.d.ts.map +1 -1
  159. package/dist/internal.mjs +1 -43
  160. package/dist/internal.mjs.map +1 -1
  161. package/dist/lifecycle.d.ts +36 -2
  162. package/dist/lifecycle.d.ts.map +1 -1
  163. package/dist/materials.d.ts +0 -3
  164. package/dist/materials.d.ts.map +1 -1
  165. package/dist/mesh-material-bindings.d.ts +0 -1
  166. package/dist/mesh-material-bindings.d.ts.map +1 -1
  167. package/dist/pbr-pipeline.d.ts +75 -29
  168. package/dist/pbr-pipeline.d.ts.map +1 -1
  169. package/dist/pipeline/standard-forward-lane.d.ts +5 -0
  170. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -0
  171. package/dist/pipeline/standard-pipeline.d.ts +31 -0
  172. package/dist/pipeline/standard-pipeline.d.ts.map +1 -0
  173. package/dist/pipeline/standard-profile.d.ts +40 -0
  174. package/dist/pipeline/standard-profile.d.ts.map +1 -0
  175. package/dist/pipeline-builder.d.ts +3 -3
  176. package/dist/pipeline-builder.d.ts.map +1 -1
  177. package/dist/pipeline-spec-types.d.ts +24 -0
  178. package/dist/pipeline-spec-types.d.ts.map +1 -0
  179. package/dist/pipeline-spec.d.ts +16 -155
  180. package/dist/pipeline-spec.d.ts.map +1 -1
  181. package/dist/plugin.d.ts +1 -14
  182. package/dist/plugin.d.ts.map +1 -1
  183. package/dist/post-process-errors.d.ts +18 -18
  184. package/dist/post-process-errors.d.ts.map +1 -1
  185. package/dist/prepare/prepared-graphics-resolver.d.ts +2 -5
  186. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
  187. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts +2 -0
  188. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts.map +1 -0
  189. package/dist/record/frame-lighting.d.ts +7 -73
  190. package/dist/record/frame-lighting.d.ts.map +1 -1
  191. package/dist/record/frame-snapshot.d.ts +44 -44
  192. package/dist/record/frame-snapshot.d.ts.map +1 -1
  193. package/dist/record/frame-targets.d.ts +5 -38
  194. package/dist/record/frame-targets.d.ts.map +1 -1
  195. package/dist/record/frame.d.ts +64 -52
  196. package/dist/record/frame.d.ts.map +1 -1
  197. package/dist/record/helpers.d.ts +3 -2
  198. package/dist/record/helpers.d.ts.map +1 -1
  199. package/dist/record/main-pass-geometry.d.ts +5 -4
  200. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  201. package/dist/record/main-pass-material.d.ts +90 -59
  202. package/dist/record/main-pass-material.d.ts.map +1 -1
  203. package/dist/record/main-pass-sprite-draws.d.ts +28 -3
  204. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  205. package/dist/record/main-pass.d.ts +1 -1
  206. package/dist/record/main-pass.d.ts.map +1 -1
  207. package/dist/record/mesh-ssbo.d.ts +276 -3
  208. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  209. package/dist/record/render-context.d.ts +235 -0
  210. package/dist/record/render-context.d.ts.map +1 -0
  211. package/dist/record/shadow-pass.d.ts +15 -88
  212. package/dist/record/shadow-pass.d.ts.map +1 -1
  213. package/dist/record/skybox-post-pass.d.ts +1 -1
  214. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  215. package/dist/record/typed-frame-graph.d.ts +29 -7
  216. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  217. package/dist/record/view-ubo.d.ts +3 -3
  218. package/dist/record/view-ubo.d.ts.map +1 -1
  219. package/dist/render-contract.d.ts +416 -0
  220. package/dist/render-contract.d.ts.map +1 -0
  221. package/dist/render-data.d.ts.map +1 -1
  222. package/dist/render-graph-primitives.d.ts +14 -362
  223. package/dist/render-graph-primitives.d.ts.map +1 -1
  224. package/dist/render-pipeline.d.ts +25 -64
  225. package/dist/render-pipeline.d.ts.map +1 -1
  226. package/dist/render-system-extract.d.ts +107 -338
  227. package/dist/render-system-extract.d.ts.map +1 -1
  228. package/dist/render-system.d.ts +21 -713
  229. package/dist/render-system.d.ts.map +1 -1
  230. package/dist/scene/render-scene-types.d.ts +58 -0
  231. package/dist/scene/render-scene-types.d.ts.map +1 -0
  232. package/dist/scene/render-scene.d.ts +105 -0
  233. package/dist/scene/render-scene.d.ts.map +1 -0
  234. package/dist/scene-instances/post-spawn-resolve-joints.d.ts +2 -5
  235. package/dist/scene-instances/post-spawn-resolve-joints.d.ts.map +1 -1
  236. package/dist/ssao-buffers.d.ts +22 -3
  237. package/dist/ssao-buffers.d.ts.map +1 -1
  238. package/dist/systems/skin-palette-allocator.d.ts +2 -4
  239. package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
  240. package/dist/systems/skin-palette-types.d.ts +14 -0
  241. package/dist/systems/skin-palette-types.d.ts.map +1 -0
  242. package/dist/systems/transparent-sort-config.d.ts +23 -2
  243. package/dist/systems/transparent-sort-config.d.ts.map +1 -1
  244. package/dist/tilemap-chunk-extract-system.d.ts +4 -3
  245. package/dist/tilemap-chunk-extract-system.d.ts.map +1 -1
  246. package/dist/typed-render-graph-primitives.d.ts +2 -4
  247. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  248. package/dist/typed-shadow-passes.d.ts +3 -3
  249. package/dist/typed-shadow-passes.d.ts.map +1 -1
  250. package/package.json +23 -23
  251. package/src/__tests__/backend-selection-rhi-capture.test-d.ts +1 -1
  252. package/src/__tests__/callback-inference.test-d.ts +6 -3
  253. package/src/__tests__/cluster-grid-default-surface.unit.test.ts +7 -4
  254. package/src/__tests__/construct-renderer-identity.unit.test.ts +15 -2
  255. package/src/__tests__/device-scope-lifecycle.unit.test.ts +151 -0
  256. package/src/__tests__/device-scope-stale-matrix.unit.test.ts +42 -0
  257. package/src/__tests__/direct-extract-consumer-contract.test-d.ts +8 -19
  258. package/src/__tests__/direct-light-snapshot.unit.test.ts +3 -13
  259. package/src/__tests__/factory-contract.integration.test.ts +158 -209
  260. package/src/__tests__/fallback-row-stride-surface.unit.test.ts +1 -4
  261. package/src/__tests__/frame-observation.contract.test.ts +17 -8
  262. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +32 -0
  263. package/src/__tests__/glyph-text-layout-recovery.unit.test.ts +6 -11
  264. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +9 -16
  265. package/src/__tests__/gpu-driven-production.integration.test.ts +32 -205
  266. package/src/__tests__/gpu-driven-scaling.unit.test.ts +4 -7
  267. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +87 -8
  268. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +170 -8
  269. package/src/{gpu-driven/view-reference.ts → __tests__/gpu-driven-view-reference.ts} +4 -3
  270. package/src/__tests__/gpu-driven-view.browser.test.ts +12 -1
  271. package/src/__tests__/gpu-driven-view.dawn.test.ts +12 -1
  272. package/src/__tests__/gpu-driven-view.unit.test.ts +11 -267
  273. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +3 -3
  274. package/src/__tests__/gpu-scene-render-graph-gpu.ts +2 -3
  275. package/src/__tests__/gpu-scene.dawn.test.ts +2 -6
  276. package/src/__tests__/gpu-scene.unit.test.ts +10 -24
  277. package/src/__tests__/ibl/face-uniforms.unit.test.ts +46 -0
  278. package/src/__tests__/infinite-grid-no-vertex-probe.unit.test.ts +34 -66
  279. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +14 -5
  280. package/src/__tests__/light-buffer-layout.unit.test.ts +4 -49
  281. package/src/__tests__/material-cooked-projection.unit.test.ts +2 -51
  282. package/src/__tests__/material-snapshot-mutation.integration.test.ts +10 -15
  283. package/src/__tests__/material-static-dynamic-route.unit.test.ts +4 -23
  284. package/src/__tests__/material-stride-surface.unit.test.ts +2 -2
  285. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +7 -8
  286. package/src/__tests__/morph-culling-reentry.dawn.test.ts +29 -38
  287. package/src/__tests__/morph-feature-gpu-work.integration.test.ts +45 -43
  288. package/src/__tests__/morph-feature-plan.unit.test.ts +53 -0
  289. package/src/__tests__/morph-visual-evidence.integration.test.ts +47 -33
  290. package/src/__tests__/nineslice-handle-surface.unit.test.ts +11 -6
  291. package/src/__tests__/post-process-error-policy-owner.unit.test.ts +6 -13
  292. package/src/__tests__/prepared-graphics-capability.unit.test.ts +6 -81
  293. package/src/__tests__/prepared-graphics-generation.unit.test.ts +3 -17
  294. package/src/__tests__/prepared-graphics-lifecycle.unit.test.ts +6 -74
  295. package/src/__tests__/prepared-graphics-resolver.unit.test.ts +1 -3
  296. package/src/__tests__/prepared-graphics-snapshot.unit.test.ts +2 -2
  297. package/src/__tests__/profiler-default-off.test.ts +1 -1
  298. package/src/__tests__/profiler-phase-catalog.test.ts +2 -2
  299. package/src/__tests__/profiler-phase-integration.test.ts +5 -13
  300. package/src/__tests__/profiler-phase-token.test.ts +3 -8
  301. package/src/__tests__/public-surface.test-d.ts +65 -3
  302. package/src/__tests__/recover-error-policy-owner.unit.test.ts +1 -21
  303. package/src/__tests__/render-error-code-owner.test-d.ts +18 -23
  304. package/src/__tests__/render-error-detail-ssot.test-d.ts +0 -95
  305. package/src/__tests__/render-error-exhaustive.test-d.ts +8 -1
  306. package/src/__tests__/render-feature-assembly.test-d.ts +8 -16
  307. package/src/__tests__/render-feature-context.test-d.ts +16 -40
  308. package/src/__tests__/render-feature-contract.test-d.ts +9 -18
  309. package/src/__tests__/render-feature-diagnostics.unit.test.ts +6 -8
  310. package/src/__tests__/render-feature-docs.unit.test.ts +8 -7
  311. package/src/__tests__/render-feature-gpu-work.integration.test.ts +14 -75
  312. package/src/__tests__/render-feature-plan.test-d.ts +161 -0
  313. package/src/__tests__/render-feature-plan.unit.test.ts +170 -0
  314. package/src/__tests__/render-feature-prepared-diagnostics.unit.test.ts +8 -19
  315. package/src/__tests__/render-feature-prepared-errors.test-d.ts +3 -6
  316. package/src/__tests__/render-feature-prepared-graphics-docs.unit.test.ts +10 -71
  317. package/src/__tests__/render-feature-prepared-graphics-isolation.unit.test.ts +11 -61
  318. package/src/__tests__/render-feature-prepared-graphics-negative.test-d.ts +20 -43
  319. package/src/__tests__/render-feature-prepared-graphics.test-d.ts +56 -78
  320. package/src/__tests__/render-feature-public-surface.test-d.ts +6 -24
  321. package/src/__tests__/render-feature-retry.unit.test.ts +7 -48
  322. package/src/__tests__/render-feature-scheduling.unit.test.ts +15 -27
  323. package/src/__tests__/render-feature-stage-failed-policy-owner.unit.test.ts +0 -9
  324. package/src/__tests__/render-feature-stage-fault-recovery.unit.test.ts +19 -109
  325. package/src/__tests__/render-feature-visibility-context.test-d.ts +1 -6
  326. package/src/__tests__/render-feature-visibility-context.unit.test.ts +1 -2
  327. package/src/__tests__/render-feature-zero-work.unit.test.ts +14 -20
  328. package/src/__tests__/render-scene-projection.unit.test.ts +73 -111
  329. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +44 -95
  330. package/src/__tests__/renderer-lifecycle.integration.test.ts +49 -1
  331. package/src/__tests__/shader-stage-surface.unit.test.ts +14 -9
  332. package/src/__tests__/ssao-config.unit.test.ts +36 -0
  333. package/src/__tests__/ssao-kernel-surface.unit.test.ts +4 -5
  334. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +28 -0
  335. package/src/__tests__/standard-descriptors.test-d.ts +22 -0
  336. package/src/__tests__/standard-pipeline.dawn.test.ts +61 -0
  337. package/src/__tests__/standard-pipeline.integration.test.ts +124 -0
  338. package/src/__tests__/standard-profile-oracle.unit.test.ts +62 -0
  339. package/src/__tests__/surface-configuration.unit.test.ts +1 -2
  340. package/src/__tests__/texture-usage-surface.unit.test.ts +3 -6
  341. package/src/__tests__/typed-pipeline-topology.unit.test.ts +40 -206
  342. package/src/__tests__/urp-pipeline-targets.unit.test.ts +1 -11
  343. package/src/__tests__/urp-pipeline.unit.test.ts +2 -2
  344. package/src/__tests__/vertex-color-pipeline.unit.test.ts +10 -2
  345. package/src/__tests__/vertex-layout-consumer.unit.test.ts +1 -1
  346. package/src/__tests__/visibility-diagnostics.integration.test.ts +7 -11
  347. package/src/__tests__/visibility-extract.integration.test.ts +20 -11
  348. package/src/__tests__/visibility-extract.perf.test.ts +66 -32
  349. package/src/__tests__/visibility-feature-dedup.integration.test.ts +2 -4
  350. package/src/__tests__/visibility-hidden-report.unit.test.ts +1 -2
  351. package/src/__tests__/visibility-instances.integration.test.ts +7 -11
  352. package/src/__tests__/visibility-multi-world.integration.test.ts +38 -6
  353. package/src/__tests__/visibility-producer-matrix.integration.test.ts +18 -41
  354. package/src/__tests__/visibility-public-surface.test-d.ts +10 -9
  355. package/src/__tests__/visibility-resolver.unit.test.ts +2 -1
  356. package/src/__tests__/visibility-resource-short-circuit.unit.test.ts +80 -0
  357. package/src/__tests__/visibility-snapshot-contract.unit.test.ts +2 -1
  358. package/src/__tests__/vocabulary.unit.test.ts +1 -1
  359. package/src/assembly/backend-contract.ts +57 -0
  360. package/src/{renderer/renderer-factory.ts → assembly/factory.ts} +1663 -2690
  361. package/src/assembly/host-contract.ts +101 -0
  362. package/src/{renderer → assembly}/material/assembly.ts +0 -2
  363. package/src/assembly/material/pipeline-projection.ts +63 -0
  364. package/src/authoring.ts +14 -22
  365. package/src/components/__tests__/schema-contract.unit.test.ts +10 -0
  366. package/src/components/glyph-text.ts +3 -2
  367. package/src/components/index.ts +7 -9
  368. package/src/components/instances.ts +4 -5
  369. package/src/components/light-helpers.ts +1 -1
  370. package/src/components/mesh-filter.ts +11 -10
  371. package/src/components/post-process-params.ts +3 -3
  372. package/src/components/scene-instance.ts +12 -12
  373. package/src/components/skybox-background.ts +103 -0
  374. package/src/components/{environment.ts → skylight.ts} +2 -110
  375. package/src/components/sprite-animation.ts +3 -4
  376. package/src/components/sprite-instances.ts +2 -2
  377. package/src/components/sprite-playback-mode.ts +7 -1
  378. package/src/components/sprite-region-override.ts +2 -3
  379. package/src/components/tile-layer.ts +8 -2
  380. package/src/construct-renderer.ts +67 -4
  381. package/src/debug-draw-glue.ts +8 -129
  382. package/src/device/device-scope.ts +306 -0
  383. package/src/{gpu-resource-store.ts → device/gpu-residency.ts} +540 -639
  384. package/src/device/resource-types.ts +20 -0
  385. package/src/engine-metrics.ts +12 -19
  386. package/src/errors/recover.ts +45 -3
  387. package/src/errors/render.ts +357 -460
  388. package/src/features/fullscreen.ts +46 -0
  389. package/src/features/host.ts +575 -309
  390. package/src/features/morph/morph-feature.ts +195 -105
  391. package/src/features/plan.ts +447 -0
  392. package/src/features/prepared-gpu-work.ts +72 -15
  393. package/src/features/prepared-graphics-store.ts +20 -6
  394. package/src/features/prepared-graphics.ts +12 -71
  395. package/src/features/render-graph-compute.ts +14 -5
  396. package/src/features/render-graph-contribution.ts +43 -63
  397. package/src/features/render-graph-raster.ts +11 -6
  398. package/src/features/render-graph-resources.ts +25 -23
  399. package/src/features/targets.ts +8 -21
  400. package/src/features/types.ts +39 -227
  401. package/src/features/vocabulary.ts +24 -0
  402. package/src/fullscreen-post-process-pass.ts +14 -57
  403. package/src/glyph-text-layout-system.ts +70 -96
  404. package/src/gpu-driven/batch-topology.ts +24 -202
  405. package/src/gpu-driven/production-raster.ts +93 -1108
  406. package/src/gpu-driven/view-gpu.ts +46 -192
  407. package/src/gpu-resource.ts +4 -4
  408. package/src/gpu-scene-schema.ts +11 -99
  409. package/src/gpu-scene.ts +231 -364
  410. package/src/hdrp-buffers.ts +12 -221
  411. package/src/ibl/IblPipelineCache.ts +471 -711
  412. package/src/ibl/skylight-bind-group.ts +4 -4
  413. package/src/index.ts +58 -217
  414. package/src/inspection-types.ts +76 -0
  415. package/src/instance-buffer-cache.ts +1 -29
  416. package/src/internal.ts +6 -85
  417. package/src/lifecycle.ts +64 -19
  418. package/src/materials.ts +7 -29
  419. package/src/mesh-material-bindings.ts +0 -1
  420. package/src/pbr-pipeline.ts +434 -53
  421. package/src/{urp-pipeline.ts → pipeline/standard-forward-lane.ts} +38 -149
  422. package/src/{hdrp-pipeline.ts → pipeline/standard-pipeline.ts} +221 -191
  423. package/src/pipeline/standard-profile.ts +65 -0
  424. package/src/pipeline-builder.ts +60 -64
  425. package/src/pipeline-spec-types.ts +28 -0
  426. package/src/pipeline-spec.ts +72 -609
  427. package/src/plugin.ts +3 -75
  428. package/src/post-process-errors.ts +31 -33
  429. package/src/prepare/prepared-graphics-resolver.ts +5 -4
  430. package/src/record/__tests__/material-slot-plan.unit.test.ts +1 -33
  431. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +41 -0
  432. package/src/record/__tests__/video-texture-view.unit.test.ts +1 -1
  433. package/src/record/frame-lighting.ts +74 -195
  434. package/src/record/frame-snapshot.ts +45 -60
  435. package/src/record/frame-targets.ts +8 -243
  436. package/src/record/frame.ts +509 -796
  437. package/src/record/helpers.ts +6 -11
  438. package/src/record/main-pass-geometry.ts +106 -147
  439. package/src/record/main-pass-material.ts +517 -190
  440. package/src/record/main-pass-sprite-draws.ts +198 -117
  441. package/src/record/main-pass.ts +162 -143
  442. package/src/record/mesh-ssbo.ts +517 -38
  443. package/src/record/render-context.ts +364 -0
  444. package/src/record/shadow-pass.ts +138 -1838
  445. package/src/record/skybox-post-pass.ts +12 -14
  446. package/src/record/typed-frame-graph.ts +215 -254
  447. package/src/record/view-ubo.ts +6 -37
  448. package/src/render-contract.ts +571 -0
  449. package/src/render-data.ts +3 -3
  450. package/src/render-graph-primitives.ts +76 -851
  451. package/src/render-pipeline.ts +104 -188
  452. package/src/render-system-extract.ts +1048 -1729
  453. package/src/render-system.ts +330 -1957
  454. package/src/scene/render-scene-types.ts +64 -0
  455. package/src/scene/render-scene.ts +1032 -0
  456. package/src/scene-instances/post-spawn-resolve-joints.ts +4 -7
  457. package/src/ssao-buffers.ts +167 -8
  458. package/src/systems/skin-palette-allocator.ts +21 -64
  459. package/src/systems/skin-palette-types.ts +14 -0
  460. package/src/systems/transparent-sort-config.ts +25 -3
  461. package/src/tilemap-chunk-extract-system.ts +53 -70
  462. package/src/typed-render-graph-primitives.ts +35 -24
  463. package/src/typed-shadow-passes.ts +26 -56
  464. package/dist/__tests__/analytic-sky-contract.test.d.ts +0 -2
  465. package/dist/__tests__/analytic-sky-contract.test.d.ts.map +0 -1
  466. package/dist/__tests__/analytic-sky-falsify.test.d.ts +0 -2
  467. package/dist/__tests__/analytic-sky-falsify.test.d.ts.map +0 -1
  468. package/dist/__tests__/assets-runtime-handoff.integration.test.d.ts +0 -2
  469. package/dist/__tests__/assets-runtime-handoff.integration.test.d.ts.map +0 -1
  470. package/dist/__tests__/backend-selection.integration.test.d.ts +0 -2
  471. package/dist/__tests__/backend-selection.integration.test.d.ts.map +0 -1
  472. package/dist/__tests__/camera-temporal.test-d.d.ts +0 -2
  473. package/dist/__tests__/camera-temporal.test-d.d.ts.map +0 -1
  474. package/dist/__tests__/camera-temporal.test.d.ts +0 -2
  475. package/dist/__tests__/camera-temporal.test.d.ts.map +0 -1
  476. package/dist/__tests__/directional-shadow-probe-atlas-layout.unit.test.d.ts +0 -2
  477. package/dist/__tests__/directional-shadow-probe-atlas-layout.unit.test.d.ts.map +0 -1
  478. package/dist/__tests__/environment-inspection.test.d.ts +0 -2
  479. package/dist/__tests__/environment-inspection.test.d.ts.map +0 -1
  480. package/dist/__tests__/fog-ai-user.fixture.d.ts +0 -2
  481. package/dist/__tests__/fog-ai-user.fixture.d.ts.map +0 -1
  482. package/dist/__tests__/fog-custom-render-feature.fixture.d.ts +0 -16
  483. package/dist/__tests__/fog-custom-render-feature.fixture.d.ts.map +0 -1
  484. package/dist/__tests__/fog-custom-render-feature.integration.test.d.ts +0 -2
  485. package/dist/__tests__/fog-custom-render-feature.integration.test.d.ts.map +0 -1
  486. package/dist/__tests__/fog-inspection.integration.test.d.ts +0 -2
  487. package/dist/__tests__/fog-inspection.integration.test.d.ts.map +0 -1
  488. package/dist/__tests__/fog-owner-state.integration.test.d.ts +0 -2
  489. package/dist/__tests__/fog-owner-state.integration.test.d.ts.map +0 -1
  490. package/dist/__tests__/fog-pipeline-topology.integration.test.d.ts +0 -2
  491. package/dist/__tests__/fog-pipeline-topology.integration.test.d.ts.map +0 -1
  492. package/dist/__tests__/fog-public-surface.integration.test.d.ts +0 -2
  493. package/dist/__tests__/fog-public-surface.integration.test.d.ts.map +0 -1
  494. package/dist/__tests__/fog-ray-contract.integration.test.d.ts +0 -2
  495. package/dist/__tests__/fog-ray-contract.integration.test.d.ts.map +0 -1
  496. package/dist/__tests__/fog-source-absence.integration.test.d.ts +0 -2
  497. package/dist/__tests__/fog-source-absence.integration.test.d.ts.map +0 -1
  498. package/dist/__tests__/fog-temporal.integration.test.d.ts +0 -2
  499. package/dist/__tests__/fog-temporal.integration.test.d.ts.map +0 -1
  500. package/dist/__tests__/frame-chain.unit.test.d.ts +0 -2
  501. package/dist/__tests__/frame-chain.unit.test.d.ts.map +0 -1
  502. package/dist/__tests__/gpu-scene-field-type-owner.test-d.d.ts +0 -2
  503. package/dist/__tests__/gpu-scene-field-type-owner.test-d.d.ts.map +0 -1
  504. package/dist/__tests__/hdrp-pipeline.unit.test.d.ts +0 -2
  505. package/dist/__tests__/hdrp-pipeline.unit.test.d.ts.map +0 -1
  506. package/dist/__tests__/ibl/ibl-fallback.unit.test.d.ts +0 -2
  507. package/dist/__tests__/ibl/ibl-fallback.unit.test.d.ts.map +0 -1
  508. package/dist/__tests__/material-derived-error-stop-draw.integration.test.d.ts +0 -2
  509. package/dist/__tests__/material-derived-error-stop-draw.integration.test.d.ts.map +0 -1
  510. package/dist/__tests__/material-derived-payload.integration.test.d.ts +0 -2
  511. package/dist/__tests__/material-derived-payload.integration.test.d.ts.map +0 -1
  512. package/dist/__tests__/materials.unit.test.d.ts +0 -2
  513. package/dist/__tests__/materials.unit.test.d.ts.map +0 -1
  514. package/dist/__tests__/param-schema-projection-census.unit.test.d.ts +0 -2
  515. package/dist/__tests__/param-schema-projection-census.unit.test.d.ts.map +0 -1
  516. package/dist/__tests__/persistent-render-scene.unit.test.d.ts +0 -2
  517. package/dist/__tests__/persistent-render-scene.unit.test.d.ts.map +0 -1
  518. package/dist/__tests__/pipeline-error-policy-owner.unit.test.d.ts +0 -2
  519. package/dist/__tests__/pipeline-error-policy-owner.unit.test.d.ts.map +0 -1
  520. package/dist/__tests__/pipeline-pass-trace.test.d.ts +0 -2
  521. package/dist/__tests__/pipeline-pass-trace.test.d.ts.map +0 -1
  522. package/dist/__tests__/pipeline-stage-owner.test-d.d.ts +0 -2
  523. package/dist/__tests__/pipeline-stage-owner.test-d.d.ts.map +0 -1
  524. package/dist/__tests__/plugin.test.d.ts +0 -2
  525. package/dist/__tests__/plugin.test.d.ts.map +0 -1
  526. package/dist/__tests__/prepared-graphics-backend-matrix.unit.test.d.ts +0 -2
  527. package/dist/__tests__/prepared-graphics-backend-matrix.unit.test.d.ts.map +0 -1
  528. package/dist/__tests__/prepared-graphics-resolver-recording.unit.test.d.ts +0 -2
  529. package/dist/__tests__/prepared-graphics-resolver-recording.unit.test.d.ts.map +0 -1
  530. package/dist/__tests__/public-pipeline-id.test-d.d.ts +0 -2
  531. package/dist/__tests__/public-pipeline-id.test-d.d.ts.map +0 -1
  532. package/dist/__tests__/render-dispatch-membership.unit.test.d.ts +0 -2
  533. package/dist/__tests__/render-dispatch-membership.unit.test.d.ts.map +0 -1
  534. package/dist/__tests__/render-feature-construction.unit.test.d.ts +0 -2
  535. package/dist/__tests__/render-feature-construction.unit.test.d.ts.map +0 -1
  536. package/dist/__tests__/render-feature-error-code-owner.test-d.d.ts +0 -2
  537. package/dist/__tests__/render-feature-error-code-owner.test-d.d.ts.map +0 -1
  538. package/dist/__tests__/render-feature-gpu-buffer-usage-owner.test-d.d.ts +0 -2
  539. package/dist/__tests__/render-feature-gpu-buffer-usage-owner.test-d.d.ts.map +0 -1
  540. package/dist/__tests__/render-feature-graph.integration.test.d.ts +0 -2
  541. package/dist/__tests__/render-feature-graph.integration.test.d.ts.map +0 -1
  542. package/dist/__tests__/render-feature-graphics-staging.unit.test.d.ts +0 -2
  543. package/dist/__tests__/render-feature-graphics-staging.unit.test.d.ts.map +0 -1
  544. package/dist/__tests__/render-feature-order.unit.test.d.ts +0 -2
  545. package/dist/__tests__/render-feature-order.unit.test.d.ts.map +0 -1
  546. package/dist/__tests__/render-feature-prepared-graphics-recording.unit.test.d.ts +0 -2
  547. package/dist/__tests__/render-feature-prepared-graphics-recording.unit.test.d.ts.map +0 -1
  548. package/dist/__tests__/render-feature-staging.unit.test.d.ts +0 -2
  549. package/dist/__tests__/render-feature-staging.unit.test.d.ts.map +0 -1
  550. package/dist/__tests__/renderer-render-scene-public.test-d.d.ts +0 -2
  551. package/dist/__tests__/renderer-render-scene-public.test-d.d.ts.map +0 -1
  552. package/dist/__tests__/scene-temporal-coverage.unit.test.d.ts +0 -2
  553. package/dist/__tests__/scene-temporal-coverage.unit.test.d.ts.map +0 -1
  554. package/dist/__tests__/sun-snapshot-consumers.test.d.ts +0 -2
  555. package/dist/__tests__/sun-snapshot-consumers.test.d.ts.map +0 -1
  556. package/dist/__tests__/surface-backend-kind-owner.test-d.d.ts +0 -2
  557. package/dist/__tests__/surface-backend-kind-owner.test-d.d.ts.map +0 -1
  558. package/dist/__tests__/taa-history-store.unit.test.d.ts +0 -2
  559. package/dist/__tests__/taa-history-store.unit.test.d.ts.map +0 -1
  560. package/dist/__tests__/temporal-frame-transaction.integration.test.d.ts +0 -2
  561. package/dist/__tests__/temporal-frame-transaction.integration.test.d.ts.map +0 -1
  562. package/dist/__tests__/temporal-inspection.unit.test.d.ts +0 -2
  563. package/dist/__tests__/temporal-inspection.unit.test.d.ts.map +0 -1
  564. package/dist/assets/__tests__/asset-decoders.unit.test.d.ts +0 -2
  565. package/dist/assets/__tests__/asset-decoders.unit.test.d.ts.map +0 -1
  566. package/dist/assets/__tests__/mipmap-generator.unit.test.d.ts +0 -2
  567. package/dist/assets/__tests__/mipmap-generator.unit.test.d.ts.map +0 -1
  568. package/dist/assets/__tests__/render-asset-port.unit.test.d.ts +0 -2
  569. package/dist/assets/__tests__/render-asset-port.unit.test.d.ts.map +0 -1
  570. package/dist/assets/__tests__/resolve-render-asset.unit.test.d.ts +0 -2
  571. package/dist/assets/__tests__/resolve-render-asset.unit.test.d.ts.map +0 -1
  572. package/dist/chunk-DJIMFYX6.mjs +0 -1439
  573. package/dist/chunk-DJIMFYX6.mjs.map +0 -1
  574. package/dist/chunk-F2SIOCRM.mjs +0 -7423
  575. package/dist/chunk-F2SIOCRM.mjs.map +0 -1
  576. package/dist/chunk-JMSB7AR4.mjs +0 -3
  577. package/dist/chunk-JMSB7AR4.mjs.map +0 -1
  578. package/dist/chunk-KHI6K4C6.mjs +0 -659
  579. package/dist/chunk-KHI6K4C6.mjs.map +0 -1
  580. package/dist/chunk-PORZOL2V.mjs +0 -569
  581. package/dist/chunk-PORZOL2V.mjs.map +0 -1
  582. package/dist/chunk-UOJGMDGP.mjs +0 -29913
  583. package/dist/chunk-UOJGMDGP.mjs.map +0 -1
  584. package/dist/components/__tests__/atmosphere-red.test.d.ts +0 -2
  585. package/dist/components/__tests__/atmosphere-red.test.d.ts.map +0 -1
  586. package/dist/components/__tests__/atmosphere.test.d.ts +0 -2
  587. package/dist/components/__tests__/atmosphere.test.d.ts.map +0 -1
  588. package/dist/components/__tests__/fog.test-d.d.ts +0 -2
  589. package/dist/components/__tests__/fog.test-d.d.ts.map +0 -1
  590. package/dist/components/__tests__/fog.test.d.ts +0 -2
  591. package/dist/components/__tests__/fog.test.d.ts.map +0 -1
  592. package/dist/components/atmosphere.d.ts +0 -18
  593. package/dist/components/atmosphere.d.ts.map +0 -1
  594. package/dist/components/environment.d.ts +0 -115
  595. package/dist/components/environment.d.ts.map +0 -1
  596. package/dist/deferred-lighting.d.ts +0 -13
  597. package/dist/deferred-lighting.d.ts.map +0 -1
  598. package/dist/dynamic-texture-store.d.ts +0 -42
  599. package/dist/dynamic-texture-store.d.ts.map +0 -1
  600. package/dist/environment/__tests__/failure-injection.test.d.ts +0 -2
  601. package/dist/environment/__tests__/failure-injection.test.d.ts.map +0 -1
  602. package/dist/environment/__tests__/generation-red.test.d.ts +0 -2
  603. package/dist/environment/__tests__/generation-red.test.d.ts.map +0 -1
  604. package/dist/environment/__tests__/generation.test.d.ts +0 -2
  605. package/dist/environment/__tests__/generation.test.d.ts.map +0 -1
  606. package/dist/environment/__tests__/graph-transaction.test.d.ts +0 -2
  607. package/dist/environment/__tests__/graph-transaction.test.d.ts.map +0 -1
  608. package/dist/environment/__tests__/inspection-red.test.d.ts +0 -2
  609. package/dist/environment/__tests__/inspection-red.test.d.ts.map +0 -1
  610. package/dist/environment/__tests__/lifecycle-evidence.test.d.ts +0 -2
  611. package/dist/environment/__tests__/lifecycle-evidence.test.d.ts.map +0 -1
  612. package/dist/environment/__tests__/pipeline-topology.test.d.ts +0 -2
  613. package/dist/environment/__tests__/pipeline-topology.test.d.ts.map +0 -1
  614. package/dist/environment/__tests__/readiness.test.d.ts +0 -2
  615. package/dist/environment/__tests__/readiness.test.d.ts.map +0 -1
  616. package/dist/environment/__tests__/recovery.test.d.ts +0 -2
  617. package/dist/environment/__tests__/recovery.test.d.ts.map +0 -1
  618. package/dist/environment/__tests__/resize-dispose.test.d.ts +0 -2
  619. package/dist/environment/__tests__/resize-dispose.test.d.ts.map +0 -1
  620. package/dist/environment/__tests__/signature-red.test.d.ts +0 -2
  621. package/dist/environment/__tests__/signature-red.test.d.ts.map +0 -1
  622. package/dist/environment/__tests__/signature.test.d.ts +0 -2
  623. package/dist/environment/__tests__/signature.test.d.ts.map +0 -1
  624. package/dist/environment/descriptors.d.ts +0 -2
  625. package/dist/environment/descriptors.d.ts.map +0 -1
  626. package/dist/environment/extracted-environment.d.ts +0 -53
  627. package/dist/environment/extracted-environment.d.ts.map +0 -1
  628. package/dist/environment/generation.d.ts +0 -62
  629. package/dist/environment/generation.d.ts.map +0 -1
  630. package/dist/environment/gpu-bundle.d.ts +0 -23
  631. package/dist/environment/gpu-bundle.d.ts.map +0 -1
  632. package/dist/environment/graph.d.ts +0 -108
  633. package/dist/environment/graph.d.ts.map +0 -1
  634. package/dist/environment/inspection.d.ts +0 -48
  635. package/dist/environment/inspection.d.ts.map +0 -1
  636. package/dist/environment/lifecycle.d.ts +0 -22
  637. package/dist/environment/lifecycle.d.ts.map +0 -1
  638. package/dist/environment/readiness.d.ts +0 -29
  639. package/dist/environment/readiness.d.ts.map +0 -1
  640. package/dist/environment/signature.d.ts +0 -70
  641. package/dist/environment/signature.d.ts.map +0 -1
  642. package/dist/extract/__tests__/directional-csm-domain.unit.test.d.ts +0 -2
  643. package/dist/extract/__tests__/directional-csm-domain.unit.test.d.ts.map +0 -1
  644. package/dist/extract/__tests__/environment-source.test.d.ts +0 -2
  645. package/dist/extract/__tests__/environment-source.test.d.ts.map +0 -1
  646. package/dist/extract/__tests__/schema-readers.unit.test.d.ts +0 -2
  647. package/dist/extract/__tests__/schema-readers.unit.test.d.ts.map +0 -1
  648. package/dist/extract/directional-csm.d.ts +0 -129
  649. package/dist/extract/directional-csm.d.ts.map +0 -1
  650. package/dist/extract/index.d.ts +0 -5
  651. package/dist/extract/index.d.ts.map +0 -1
  652. package/dist/extract/material-interface.d.ts +0 -56
  653. package/dist/extract/material-interface.d.ts.map +0 -1
  654. package/dist/extract/schema-readers.d.ts +0 -20
  655. package/dist/extract/schema-readers.d.ts.map +0 -1
  656. package/dist/features/graph-contribution.d.ts +0 -64
  657. package/dist/features/graph-contribution.d.ts.map +0 -1
  658. package/dist/features/index.d.ts +0 -21
  659. package/dist/features/index.d.ts.map +0 -1
  660. package/dist/features/morph/index.d.ts +0 -3
  661. package/dist/features/morph/index.d.ts.map +0 -1
  662. package/dist/features/morph/morph-bounds.d.ts +0 -42
  663. package/dist/features/morph/morph-bounds.d.ts.map +0 -1
  664. package/dist/features/scene-temporal.d.ts +0 -45
  665. package/dist/features/scene-temporal.d.ts.map +0 -1
  666. package/dist/features/taa-resolve.d.ts +0 -21
  667. package/dist/features/taa-resolve.d.ts.map +0 -1
  668. package/dist/frame-chain.d.ts +0 -14
  669. package/dist/frame-chain.d.ts.map +0 -1
  670. package/dist/gpu-driven/view-reference.d.ts.map +0 -1
  671. package/dist/gpu-resource-store.d.ts.map +0 -1
  672. package/dist/hdrp-cluster-membership.d.ts +0 -2
  673. package/dist/hdrp-cluster-membership.d.ts.map +0 -1
  674. package/dist/hdrp-pipeline.d.ts +0 -36
  675. package/dist/hdrp-pipeline.d.ts.map +0 -1
  676. package/dist/ibl/cubemap-projection.d.ts +0 -23
  677. package/dist/ibl/cubemap-projection.d.ts.map +0 -1
  678. package/dist/ibl/face-uniforms.d.ts +0 -65
  679. package/dist/ibl/face-uniforms.d.ts.map +0 -1
  680. package/dist/mesh-update-errors.d.ts +0 -71
  681. package/dist/mesh-update-errors.d.ts.map +0 -1
  682. package/dist/mipmap-generator.d.ts +0 -39
  683. package/dist/mipmap-generator.d.ts.map +0 -1
  684. package/dist/param-schema-projection-census.d.ts +0 -18
  685. package/dist/param-schema-projection-census.d.ts.map +0 -1
  686. package/dist/persistent-render-scene.d.ts +0 -158
  687. package/dist/persistent-render-scene.d.ts.map +0 -1
  688. package/dist/pipeline/index.d.ts +0 -11
  689. package/dist/pipeline/index.d.ts.map +0 -1
  690. package/dist/pipeline-errors.d.ts +0 -110
  691. package/dist/pipeline-errors.d.ts.map +0 -1
  692. package/dist/prepare/__tests__/schema-readers.unit.test.d.ts +0 -2
  693. package/dist/prepare/__tests__/schema-readers.unit.test.d.ts.map +0 -1
  694. package/dist/prepare/index.d.ts +0 -4
  695. package/dist/prepare/index.d.ts.map +0 -1
  696. package/dist/prepare/schema-readers.d.ts +0 -11
  697. package/dist/prepare/schema-readers.d.ts.map +0 -1
  698. package/dist/record/__tests__/environment-record.test.d.ts +0 -2
  699. package/dist/record/__tests__/environment-record.test.d.ts.map +0 -1
  700. package/dist/record/__tests__/frame-targets.unit.test.d.ts +0 -2
  701. package/dist/record/__tests__/frame-targets.unit.test.d.ts.map +0 -1
  702. package/dist/record/__tests__/membership-timing.unit.test.d.ts +0 -2
  703. package/dist/record/__tests__/membership-timing.unit.test.d.ts.map +0 -1
  704. package/dist/record/__tests__/render-submission.integration.test.d.ts +0 -2
  705. package/dist/record/__tests__/render-submission.integration.test.d.ts.map +0 -1
  706. package/dist/record/__tests__/render-submission.perf.test.d.ts +0 -2
  707. package/dist/record/__tests__/render-submission.perf.test.d.ts.map +0 -1
  708. package/dist/record/__tests__/shadow-submit-mode.unit.test.d.ts +0 -2
  709. package/dist/record/__tests__/shadow-submit-mode.unit.test.d.ts.map +0 -1
  710. package/dist/record/__tests__/view-ubo-layout.unit.test.d.ts +0 -2
  711. package/dist/record/__tests__/view-ubo-layout.unit.test.d.ts.map +0 -1
  712. package/dist/record/frame-observation.d.ts +0 -38
  713. package/dist/record/frame-observation.d.ts.map +0 -1
  714. package/dist/record/index.d.ts +0 -15
  715. package/dist/record/index.d.ts.map +0 -1
  716. package/dist/record/main-pass-skin.d.ts +0 -46
  717. package/dist/record/main-pass-skin.d.ts.map +0 -1
  718. package/dist/record/main-pass-sprite.d.ts +0 -69
  719. package/dist/record/main-pass-sprite.d.ts.map +0 -1
  720. package/dist/record/material-payload.d.ts +0 -43
  721. package/dist/record/material-payload.d.ts.map +0 -1
  722. package/dist/record/material-slot-plan.d.ts +0 -26
  723. package/dist/record/material-slot-plan.d.ts.map +0 -1
  724. package/dist/record/membership-timing.d.ts +0 -232
  725. package/dist/record/membership-timing.d.ts.map +0 -1
  726. package/dist/record/shadow-caster-uniform.d.ts +0 -8
  727. package/dist/record/shadow-caster-uniform.d.ts.map +0 -1
  728. package/dist/record/shadow-submit-mode.d.ts +0 -66
  729. package/dist/record/shadow-submit-mode.d.ts.map +0 -1
  730. package/dist/render-dispatch-membership.d.ts +0 -47
  731. package/dist/render-dispatch-membership.d.ts.map +0 -1
  732. package/dist/render-pipeline-context.d.ts +0 -289
  733. package/dist/render-pipeline-context.d.ts.map +0 -1
  734. package/dist/render-pipeline-target.d.ts +0 -16
  735. package/dist/render-pipeline-target.d.ts.map +0 -1
  736. package/dist/render-scene-projection.d.ts +0 -174
  737. package/dist/render-scene-projection.d.ts.map +0 -1
  738. package/dist/render-system-fold.d.ts +0 -266
  739. package/dist/render-system-fold.d.ts.map +0 -1
  740. package/dist/renderer/asset-service.d.ts +0 -10
  741. package/dist/renderer/asset-service.d.ts.map +0 -1
  742. package/dist/renderer/backend-selection.d.ts.map +0 -1
  743. package/dist/renderer/environment-classify.d.ts +0 -6
  744. package/dist/renderer/environment-classify.d.ts.map +0 -1
  745. package/dist/renderer/environment-error.d.ts +0 -13
  746. package/dist/renderer/environment-error.d.ts.map +0 -1
  747. package/dist/renderer/material/pipeline-projection.d.ts +0 -91
  748. package/dist/renderer/material/pipeline-projection.d.ts.map +0 -1
  749. package/dist/renderer/renderer-factory.d.ts +0 -289
  750. package/dist/renderer/renderer-factory.d.ts.map +0 -1
  751. package/dist/renderer.d.ts +0 -771
  752. package/dist/renderer.d.ts.map +0 -1
  753. package/dist/scene-utils/collect-subtree.d.ts +0 -11
  754. package/dist/scene-utils/collect-subtree.d.ts.map +0 -1
  755. package/dist/ssao-data.d.ts +0 -34
  756. package/dist/ssao-data.d.ts.map +0 -1
  757. package/dist/surface-format.d.ts +0 -10
  758. package/dist/surface-format.d.ts.map +0 -1
  759. package/dist/taa-history-store.d.ts +0 -88
  760. package/dist/taa-history-store.d.ts.map +0 -1
  761. package/dist/temporal-coverage.d.ts +0 -35
  762. package/dist/temporal-coverage.d.ts.map +0 -1
  763. package/dist/temporal-frame-transaction.d.ts +0 -92
  764. package/dist/temporal-frame-transaction.d.ts.map +0 -1
  765. package/dist/temporal-inspection.d.ts +0 -57
  766. package/dist/temporal-inspection.d.ts.map +0 -1
  767. package/dist/temporal-view.d.ts +0 -43
  768. package/dist/temporal-view.d.ts.map +0 -1
  769. package/dist/tilemap/resolve-tileset-runtime.d.ts +0 -23
  770. package/dist/tilemap/resolve-tileset-runtime.d.ts.map +0 -1
  771. package/dist/urp-pipeline.d.ts +0 -4
  772. package/dist/urp-pipeline.d.ts.map +0 -1
  773. package/src/__tests__/analytic-sky-contract.test.ts +0 -27
  774. package/src/__tests__/analytic-sky-falsify-carriers.mjs +0 -43
  775. package/src/__tests__/analytic-sky-falsify.test.ts +0 -94
  776. package/src/__tests__/assets-runtime-handoff.integration.test.ts +0 -36
  777. package/src/__tests__/backend-selection.integration.test.ts +0 -11
  778. package/src/__tests__/camera-temporal.test-d.ts +0 -8
  779. package/src/__tests__/camera-temporal.test.ts +0 -188
  780. package/src/__tests__/directional-shadow-probe-atlas-layout.unit.test.ts +0 -18
  781. package/src/__tests__/environment-inspection.test.ts +0 -45
  782. package/src/__tests__/fog-ai-user.fixture.ts +0 -350
  783. package/src/__tests__/fog-custom-render-feature.fixture.ts +0 -33
  784. package/src/__tests__/fog-custom-render-feature.integration.test.ts +0 -76
  785. package/src/__tests__/fog-inspection.integration.test.ts +0 -127
  786. package/src/__tests__/fog-owner-state.integration.test.ts +0 -112
  787. package/src/__tests__/fog-pipeline-topology.integration.test.ts +0 -93
  788. package/src/__tests__/fog-public-surface.integration.test.ts +0 -60
  789. package/src/__tests__/fog-ray-contract.integration.test.ts +0 -73
  790. package/src/__tests__/fog-source-absence.integration.test.ts +0 -51
  791. package/src/__tests__/fog-temporal.integration.test.ts +0 -115
  792. package/src/__tests__/frame-chain.unit.test.ts +0 -26
  793. package/src/__tests__/gpu-scene-field-type-owner.test-d.ts +0 -27
  794. package/src/__tests__/hdrp-pipeline.unit.test.ts +0 -100
  795. package/src/__tests__/ibl/ibl-fallback.unit.test.ts +0 -23
  796. package/src/__tests__/material-derived-error-stop-draw.integration.test.ts +0 -69
  797. package/src/__tests__/material-derived-payload.integration.test.ts +0 -164
  798. package/src/__tests__/materials.unit.test.ts +0 -25
  799. package/src/__tests__/param-schema-projection-census.unit.test.ts +0 -40
  800. package/src/__tests__/persistent-render-scene.unit.test.ts +0 -1311
  801. package/src/__tests__/pipeline-error-policy-owner.unit.test.ts +0 -167
  802. package/src/__tests__/pipeline-pass-trace.test.ts +0 -92
  803. package/src/__tests__/pipeline-stage-owner.test-d.ts +0 -13
  804. package/src/__tests__/plugin.test.ts +0 -25
  805. package/src/__tests__/prepared-graphics-backend-matrix.unit.test.ts +0 -129
  806. package/src/__tests__/prepared-graphics-resolver-recording.unit.test.ts +0 -180
  807. package/src/__tests__/public-pipeline-id.test-d.ts +0 -6
  808. package/src/__tests__/render-dispatch-membership.unit.test.ts +0 -117
  809. package/src/__tests__/render-feature-construction.unit.test.ts +0 -124
  810. package/src/__tests__/render-feature-error-code-owner.test-d.ts +0 -27
  811. package/src/__tests__/render-feature-gpu-buffer-usage-owner.test-d.ts +0 -46
  812. package/src/__tests__/render-feature-graph.integration.test.ts +0 -205
  813. package/src/__tests__/render-feature-graphics-staging.unit.test.ts +0 -200
  814. package/src/__tests__/render-feature-order.unit.test.ts +0 -66
  815. package/src/__tests__/render-feature-prepared-graphics-recording.unit.test.ts +0 -107
  816. package/src/__tests__/render-feature-staging.unit.test.ts +0 -94
  817. package/src/__tests__/renderer-render-scene-public.test-d.ts +0 -27
  818. package/src/__tests__/scene-temporal-coverage.unit.test.ts +0 -259
  819. package/src/__tests__/sun-snapshot-consumers.test.ts +0 -35
  820. package/src/__tests__/surface-backend-kind-owner.test-d.ts +0 -42
  821. package/src/__tests__/taa-history-store.unit.test.ts +0 -196
  822. package/src/__tests__/temporal-frame-transaction.integration.test.ts +0 -537
  823. package/src/__tests__/temporal-inspection.unit.test.ts +0 -138
  824. package/src/assets/__tests__/asset-decoders.unit.test.ts +0 -92
  825. package/src/assets/__tests__/mipmap-generator.unit.test.ts +0 -52
  826. package/src/assets/__tests__/render-asset-port.unit.test.ts +0 -54
  827. package/src/assets/__tests__/resolve-render-asset.unit.test.ts +0 -47
  828. package/src/components/__tests__/atmosphere-red.test.ts +0 -51
  829. package/src/components/__tests__/atmosphere.test.ts +0 -79
  830. package/src/components/__tests__/fog.test-d.ts +0 -49
  831. package/src/components/__tests__/fog.test.ts +0 -60
  832. package/src/components/atmosphere.ts +0 -64
  833. package/src/deferred-lighting.ts +0 -92
  834. package/src/dynamic-texture-store.ts +0 -111
  835. package/src/environment/README.md +0 -76
  836. package/src/environment/__tests__/failure-injection.test.ts +0 -50
  837. package/src/environment/__tests__/generation-red.test.ts +0 -64
  838. package/src/environment/__tests__/generation.test.ts +0 -37
  839. package/src/environment/__tests__/graph-transaction.test.ts +0 -85
  840. package/src/environment/__tests__/inspection-red.test.ts +0 -53
  841. package/src/environment/__tests__/lifecycle-evidence.test.ts +0 -40
  842. package/src/environment/__tests__/pipeline-topology.test.ts +0 -33
  843. package/src/environment/__tests__/readiness.test.ts +0 -42
  844. package/src/environment/__tests__/recovery.test.ts +0 -62
  845. package/src/environment/__tests__/resize-dispose.test.ts +0 -30
  846. package/src/environment/__tests__/signature-red.test.ts +0 -45
  847. package/src/environment/__tests__/signature.test.ts +0 -60
  848. package/src/environment/descriptors.ts +0 -7
  849. package/src/environment/extracted-environment.ts +0 -239
  850. package/src/environment/generation.ts +0 -158
  851. package/src/environment/gpu-bundle.ts +0 -144
  852. package/src/environment/graph.ts +0 -588
  853. package/src/environment/inspection.ts +0 -107
  854. package/src/environment/lifecycle.ts +0 -124
  855. package/src/environment/readiness.ts +0 -76
  856. package/src/environment/signature.ts +0 -185
  857. package/src/extract/__tests__/directional-csm-domain.unit.test.ts +0 -391
  858. package/src/extract/__tests__/environment-source.test.ts +0 -105
  859. package/src/extract/__tests__/schema-readers.unit.test.ts +0 -16
  860. package/src/extract/directional-csm.ts +0 -959
  861. package/src/extract/index.ts +0 -10
  862. package/src/extract/material-interface.ts +0 -604
  863. package/src/extract/schema-readers.ts +0 -27
  864. package/src/features/graph-contribution.ts +0 -577
  865. package/src/features/index.ts +0 -100
  866. package/src/features/morph/index.ts +0 -24
  867. package/src/features/morph/morph-bounds.ts +0 -123
  868. package/src/features/scene-temporal.ts +0 -274
  869. package/src/features/taa-resolve.ts +0 -244
  870. package/src/frame-chain.ts +0 -21
  871. package/src/hdrp-cluster-membership.ts +0 -70
  872. package/src/ibl/cubemap-projection.ts +0 -60
  873. package/src/ibl/face-uniforms.ts +0 -150
  874. package/src/mesh-update-errors.ts +0 -113
  875. package/src/mipmap-generator.ts +0 -244
  876. package/src/param-schema-projection-census.ts +0 -73
  877. package/src/persistent-render-scene.ts +0 -1752
  878. package/src/pipeline/index.ts +0 -40
  879. package/src/pipeline-errors.ts +0 -172
  880. package/src/prepare/__tests__/schema-readers.unit.test.ts +0 -16
  881. package/src/prepare/index.ts +0 -8
  882. package/src/prepare/schema-readers.ts +0 -20
  883. package/src/record/__tests__/environment-record.test.ts +0 -35
  884. package/src/record/__tests__/frame-targets.unit.test.ts +0 -54
  885. package/src/record/__tests__/membership-timing.unit.test.ts +0 -524
  886. package/src/record/__tests__/render-submission.integration.test.ts +0 -76
  887. package/src/record/__tests__/render-submission.perf.test.ts +0 -141
  888. package/src/record/__tests__/shadow-submit-mode.unit.test.ts +0 -88
  889. package/src/record/__tests__/view-ubo-layout.unit.test.ts +0 -101
  890. package/src/record/frame-observation.ts +0 -122
  891. package/src/record/index.ts +0 -15
  892. package/src/record/main-pass-skin.ts +0 -51
  893. package/src/record/main-pass-sprite.ts +0 -166
  894. package/src/record/material-payload.ts +0 -292
  895. package/src/record/material-slot-plan.ts +0 -68
  896. package/src/record/membership-timing.ts +0 -1012
  897. package/src/record/shadow-caster-uniform.ts +0 -37
  898. package/src/record/shadow-submit-mode.ts +0 -277
  899. package/src/render-dispatch-membership.ts +0 -155
  900. package/src/render-pipeline-context.ts +0 -332
  901. package/src/render-pipeline-target.ts +0 -96
  902. package/src/render-scene-projection.ts +0 -1738
  903. package/src/render-system-fold.ts +0 -531
  904. package/src/renderer/asset-service.ts +0 -32
  905. package/src/renderer/backend-selection.ts +0 -121
  906. package/src/renderer/environment-classify.ts +0 -30
  907. package/src/renderer/environment-error.ts +0 -19
  908. package/src/renderer/material/pipeline-projection.ts +0 -140
  909. package/src/renderer.ts +0 -940
  910. package/src/scene-utils/collect-subtree.ts +0 -40
  911. package/src/ssao-data.ts +0 -106
  912. package/src/surface-format.ts +0 -37
  913. package/src/taa-history-store.ts +0 -429
  914. package/src/temporal-coverage.ts +0 -106
  915. package/src/temporal-frame-transaction.ts +0 -301
  916. package/src/temporal-inspection.ts +0 -194
  917. package/src/temporal-view.ts +0 -174
  918. package/src/tilemap/resolve-tileset-runtime.ts +0 -72
@@ -1,12 +1,6 @@
1
1
  import type { EntityHandle } from '@forgeax/engine-ecs';
2
- import type { RhiCaps } from '@forgeax/engine-rhi';
3
- import {
4
- err,
5
- type MaterialAsset,
6
- type MaterialError,
7
- ok,
8
- type Result,
9
- } from '@forgeax/engine-types';
2
+ import type { RhiCaps, TextureFormat } from '@forgeax/engine-rhi';
3
+ import { err, ok, type Result } from '@forgeax/engine-types';
10
4
  import {
11
5
  type RenderError,
12
6
  RenderFeatureCapabilityMissingError,
@@ -14,25 +8,35 @@ import {
14
8
  RenderFeatureRegistrationConflictError,
15
9
  RenderFeatureStageFailedError,
16
10
  } from '../errors/render';
11
+ import type { PostProcessShaderEntry } from '../fullscreen-post-process-pass';
17
12
  import type {
18
13
  PreparedGraphicsReference,
19
14
  PreparedGraphicsResolvedSnapshot,
20
15
  PreparedGraphicsResolver,
21
16
  PreparedGraphicsResourceLease,
22
17
  } from '../prepare/prepared-graphics-resolver';
18
+ import {
19
+ freezeRenderFeaturePlan,
20
+ type RenderFeatureLogicalTarget,
21
+ type RenderFeaturePassDeclaration,
22
+ type RenderFeaturePlan,
23
+ type RenderFeaturePlannedFrame,
24
+ type RenderFeatureResourceDeclaration,
25
+ renderFeaturePlanSignature,
26
+ } from './plan';
23
27
  import type {
24
- RenderFeatureContributionStaging,
25
- RenderFeatureGpuComputeResolver,
26
- RenderFeatureGraphContribution,
27
- RenderFeatureGraphicsValidator,
28
- } from './graph-contribution';
29
- import { createRenderFeatureContributionStaging } from './graph-contribution';
30
- import type { RenderFeatureGpuWorkResolver } from './prepared-gpu-work';
28
+ RenderFeatureGpuBindingsRef,
29
+ RenderFeatureGpuBufferRef,
30
+ RenderFeatureGpuComputePassDescriptor,
31
+ RenderFeatureGpuPrepareSession,
32
+ RenderFeatureGpuProgramRef,
33
+ RenderFeatureGpuWorkOwner,
34
+ } from './prepared-gpu-work';
31
35
  import {
32
- createRenderFeatureGraphicsPrepare,
33
- type RenderFeatureGraphicsContributionStaging,
36
+ type RenderFeatureGraphicsPassDescriptor,
34
37
  type RenderFeatureGraphicsPrepare,
35
- type RenderFeatureMaterialShaderBindingContract,
38
+ type RenderFeaturePreparedGraphicsState,
39
+ type RenderFeaturePreparedRef,
36
40
  validateRenderFeatureGraphicsPass,
37
41
  } from './prepared-graphics';
38
42
  import {
@@ -48,18 +52,46 @@ import type {
48
52
  RenderFeatureErrorDescriptor,
49
53
  RenderFeatureExtractContext,
50
54
  RenderFeatureHiddenEntityReport,
51
- RenderFeaturePrepareContext,
52
55
  RenderFeatureRecoverInput,
53
- RenderFeatureResourceHandle,
54
56
  RenderFeatureStatus,
55
57
  RenderFeatureTargetHandle,
56
58
  RenderFeatureWorldVisibilitySnapshot,
57
59
  } from './types';
58
60
 
61
+ const planExecutionProjections = new WeakMap<
62
+ RenderFeaturePlannedFrame,
63
+ RenderFeaturePlanExecution
64
+ >();
65
+
66
+ export interface RenderFeaturePlanExecutionPass {
67
+ readonly featureIdentity: string;
68
+ readonly order: number;
69
+ readonly name: string;
70
+ readonly graphics?: RenderFeatureGraphicsPassDescriptor;
71
+ readonly graphicsState?: RenderFeaturePreparedGraphicsState;
72
+ readonly gpuCompute?: RenderFeatureGpuComputePassDescriptor;
73
+ readonly resolvedGraphics?: PreparedGraphicsResolvedSnapshot;
74
+ readonly resolvedGpuCompute?: import('./prepared-gpu-work').RenderFeatureResolvedGpuComputePass;
75
+ }
76
+
77
+ /** Host-owned device projection of one frozen plan; graph access is derived later. */
78
+ export interface RenderFeaturePlanExecution {
79
+ readonly featureIdentity: string;
80
+ readonly order: number;
81
+ readonly passes: readonly RenderFeaturePlanExecutionPass[];
82
+ }
83
+
84
+ /** @internal Typed-graph adapter for the host-owned projection of a validated plan. */
85
+ export function getRenderFeaturePlanExecutionProjection(
86
+ planned: RenderFeaturePlannedFrame,
87
+ ): RenderFeaturePlanExecution | undefined {
88
+ return planExecutionProjections.get(planned);
89
+ }
90
+
59
91
  export interface RenderFeatureStageEvent {
60
92
  readonly featureIdentity: string;
61
93
  readonly order: number;
62
- readonly stage: 'extract' | 'prepare' | 'contribute';
94
+ readonly stage: 'extract' | 'plan';
63
95
  }
64
96
 
65
97
  export interface RenderFeatureFrameInput {
@@ -72,22 +104,11 @@ export interface RenderFeatureFrameInput {
72
104
  readonly targets?: readonly RenderFeatureTargetHandle[];
73
105
  readonly generation?: number;
74
106
  readonly caps: Readonly<RhiCaps>;
75
- readonly createContributionStaging?: (
76
- featureIdentity: string,
77
- order: number,
78
- validateGraphics?: RenderFeatureGraphicsValidator,
79
- resolveGraphics?: import('./graph-contribution').RenderFeatureGraphicsResolver,
80
- resolveGpuCompute?: RenderFeatureGpuComputeResolver,
81
- ) => RenderFeatureContributionStaging & RenderFeatureGraphicsContributionStaging;
82
107
  readonly createPreparedGraphicsResolver?: (
83
108
  input: RenderFeaturePreparedGraphicsResolverInput,
84
109
  ) => PreparedGraphicsResolver;
85
- readonly getMaterialShaderBindingContract?: (
86
- materialShaderId: string,
87
- ) => RenderFeatureMaterialShaderBindingContract;
88
- /** Render-owned cooked material projection used by prepared graphics. */
89
- readonly resolveMaterialAsset?: (material: MaterialAsset) => Result<MaterialAsset, MaterialError>;
90
- readonly getGpuWorkResolver?: (featureIdentity: string) => RenderFeatureGpuWorkResolver;
110
+ /** Single renderer-owned GPU preparation owner for all feature sessions. */
111
+ readonly gpuWork?: RenderFeatureGpuWorkOwner;
91
112
  }
92
113
 
93
114
  export interface RenderFeaturePreparedGraphicsResolverInput {
@@ -95,25 +116,21 @@ export interface RenderFeaturePreparedGraphicsResolverInput {
95
116
  readonly order: number;
96
117
  readonly generation: number;
97
118
  readonly transaction: PreparedGraphicsTransaction;
119
+ readonly fullscreenEffects: ReadonlyMap<string, PostProcessShaderEntry>;
98
120
  readonly lookup: (
99
121
  reference: import('./prepared-graphics').RenderFeaturePreparedRef,
100
122
  ) => import('./prepared-graphics-store').PreparedGraphicsItem | undefined;
101
123
  }
102
124
 
103
125
  export interface RenderFeatureFrameResult {
104
- readonly events: readonly string[];
105
126
  readonly stageEvents: readonly RenderFeatureStageEvent[];
106
127
  readonly errors: readonly RenderError[];
107
- readonly contributions: readonly RenderFeatureGraphContribution[];
128
+ readonly plans: readonly RenderFeaturePlannedFrame[];
129
+ readonly fullscreenEffects: ReadonlyMap<string, PostProcessShaderEntry>;
108
130
  readonly preparedResourceBatches: readonly RenderFeaturePreparedResourceBatch[];
109
131
  readonly hiddenEntityReports: readonly RenderFeatureHiddenEntityReport[];
110
132
  }
111
133
 
112
- export interface RenderFeatureOwnedResource {
113
- readonly handle: RenderFeatureResourceHandle;
114
- readonly release: () => Result<void, RenderError>;
115
- }
116
-
117
134
  export interface RenderFeatureHost {
118
135
  readonly size: number;
119
136
  readonly features: readonly RenderFeature<unknown>[];
@@ -123,10 +140,6 @@ export interface RenderFeatureHost {
123
140
  /** Remove one installed producer and release every resource it owns. */
124
141
  uninstall(feature: RenderFeature<unknown>): Result<void, RenderError>;
125
142
  advancePreparedGeneration(): number;
126
- registerResource(
127
- identity: string,
128
- resource: RenderFeatureOwnedResource,
129
- ): Result<void, RenderError>;
130
143
  setStatus(
131
144
  identity: string,
132
145
  status: RenderFeatureStatus,
@@ -189,7 +202,6 @@ export function settlePreparedGraphicsCompletion(
189
202
  interface FeatureSlot {
190
203
  readonly feature: RenderFeature<unknown>;
191
204
  order: number;
192
- readonly resources: RenderFeatureOwnedResource[];
193
205
  readonly preparedResourceBatches: Set<RenderFeaturePreparedResourceBatch>;
194
206
  readonly preparedStore: PreparedGraphicsStore;
195
207
  status: RenderFeatureStatus;
@@ -245,43 +257,10 @@ function missingCapability(
245
257
  return feature.requiredCapabilities?.find((capability) => caps[capability] !== true);
246
258
  }
247
259
 
248
- function lifecycleContext(input: RenderFeatureRecoverInput): RenderFeaturePrepareContext {
249
- return {
250
- caps: input.caps,
251
- frame: { frameNumber: input.frameNumber },
252
- resources: [],
253
- targets: [],
254
- reportError: { report: () => undefined },
255
- graphics: createRenderFeatureGraphicsPrepare('renderer.lifecycle', -1),
256
- };
257
- }
258
-
259
260
  function createPreparedGraphicsPrepare(
260
261
  transaction: PreparedGraphicsTransaction,
261
- getMaterialShaderBindingContract?: (
262
- materialShaderId: string,
263
- ) => RenderFeatureMaterialShaderBindingContract,
264
- resolveMaterialAsset?: (material: MaterialAsset) => Result<MaterialAsset, MaterialError>,
265
- featureIdentity = 'renderer.lifecycle',
266
- order = -1,
267
262
  ): RenderFeatureGraphicsPrepare {
268
263
  return {
269
- resolveMaterialAsset: (material) => {
270
- const resolved = resolveMaterialAsset?.(material);
271
- if (resolved === undefined || resolved.ok) return resolved ?? ok(material);
272
- return err(
273
- new RenderFeaturePreparationFailedError(
274
- featureIdentity,
275
- order,
276
- 'resolve-material-asset',
277
- 'pipeline',
278
- 'material-asset',
279
- resolved.error.code,
280
- 'next-frame',
281
- ),
282
- );
283
- },
284
- getMaterialShaderBindingContract: getMaterialShaderBindingContract ?? (() => 'render-material'),
285
264
  preparePipeline: (name, descriptor) => transaction.prepare('pipeline', name, descriptor),
286
265
  prepareBindings: (name, descriptor) => transaction.prepare('bindings', name, descriptor),
287
266
  prepareVertexData: (name, descriptor) => transaction.prepare('vertex-data', name, descriptor),
@@ -329,7 +308,10 @@ function graphicsValidator(
329
308
  identity: string,
330
309
  transaction: PreparedGraphicsTransaction,
331
310
  capabilityAvailable: boolean,
332
- ): RenderFeatureGraphicsValidator {
311
+ ): (
312
+ descriptor: RenderFeatureGraphicsPassDescriptor,
313
+ resources: readonly { readonly name: string }[],
314
+ ) => Result<RenderFeaturePreparedGraphicsState, RenderError> {
333
315
  return (descriptor, resources) => {
334
316
  const attachments = [
335
317
  ...descriptor.attachments.colors
@@ -360,74 +342,11 @@ function graphicsValidator(
360
342
  };
361
343
  }
362
344
 
363
- function invokeLifecycle(
364
- slot: FeatureSlot,
365
- stage: 'recover' | 'dispose',
366
- input: RenderFeatureRecoverInput,
367
- ): Result<void, RenderError> {
368
- const callback = slot.feature[stage];
369
- if (callback === undefined) return ok(undefined);
370
- try {
371
- const result = callback(lifecycleContext(input));
372
- return result.ok ? result : err(result.error);
373
- } catch (_failure) {
374
- return err(
375
- new RenderFeatureStageFailedError(
376
- slot.feature.identity,
377
- slot.order,
378
- stage,
379
- 'renderer-recover',
380
- ),
381
- );
382
- }
383
- }
384
-
385
- function releaseResource(
386
- slot: FeatureSlot,
387
- resource: RenderFeatureOwnedResource,
388
- ): Result<void, RenderError> {
389
- try {
390
- return resource.release();
391
- } catch {
392
- return err(unknownFeatureError(slot.feature.identity, 'dispose'));
393
- }
394
- }
395
-
396
- function cleanupErrorDescriptor(
397
- error: RenderError,
398
- slot: FeatureSlot,
399
- ): RenderFeatureCleanupFailure {
400
- return {
401
- featureIdentity: slot.feature.identity,
402
- order: slot.order,
403
- code: error.code,
404
- };
405
- }
406
-
407
- function withCleanupFailures(
408
- error: RenderError,
409
- cleanupFailures: readonly RenderFeatureCleanupFailure[],
410
- ): RenderError {
411
- if (cleanupFailures.length === 0 || error.code !== 'render-feature-stage-failed') return error;
412
- const detail = {
413
- ...error.detail,
414
- cleanupFailures: Object.freeze([...cleanupFailures]),
415
- };
416
- const wrapped = new RenderFeatureStageFailedError(
417
- detail.featureIdentity,
418
- detail.order,
419
- detail.stage,
420
- detail.recovery,
421
- );
422
- Object.defineProperty(wrapped, 'detail', { value: detail });
423
- return wrapped;
424
- }
425
-
426
345
  function asFeatureError(
427
346
  error: unknown,
428
347
  identity: string,
429
348
  order: number,
430
- stage: 'extract' | 'prepare' | 'contribute',
349
+ stage: 'extract' | 'plan',
431
350
  ): RenderError {
432
351
  if (error instanceof Error && typeof (error as Partial<RenderError>).code === 'string') {
433
352
  return error as RenderError;
@@ -449,14 +368,14 @@ function featureErrorForSlot(slot: FeatureSlot, error: RenderError): RenderError
449
368
  : new RenderFeatureStageFailedError(
450
369
  slot.feature.identity,
451
370
  slot.order,
452
- 'contribute',
371
+ 'plan',
453
372
  'next-frame',
454
373
  );
455
374
  default:
456
375
  return new RenderFeatureStageFailedError(
457
376
  slot.feature.identity,
458
377
  slot.order,
459
- 'contribute',
378
+ 'plan',
460
379
  'next-frame',
461
380
  );
462
381
  }
@@ -485,7 +404,7 @@ function errorDescriptor(error: RenderError): RenderFeatureErrorDescriptor {
485
404
  detail: {
486
405
  featureIdentity: 'unknown',
487
406
  order: -1,
488
- stage: 'contribute',
407
+ stage: 'plan',
489
408
  recovery: 'next-frame',
490
409
  },
491
410
  };
@@ -494,7 +413,7 @@ function errorDescriptor(error: RenderError): RenderFeatureErrorDescriptor {
494
413
 
495
414
  function recordFailure(
496
415
  slot: FeatureSlot,
497
- stage: 'extract' | 'prepare' | 'contribute',
416
+ stage: 'extract' | 'plan',
498
417
  failure: unknown,
499
418
  errors: RenderError[],
500
419
  ): void {
@@ -504,16 +423,447 @@ function recordFailure(
504
423
  slot.latestError = errorDescriptor(error);
505
424
  }
506
425
 
426
+ function logicalTargets(
427
+ targets: readonly RenderFeatureTargetHandle[],
428
+ ): readonly RenderFeatureLogicalTarget[] {
429
+ return Object.freeze(
430
+ targets.map((target) => ({
431
+ name: target.kind === 'scene-color' ? 'color' : 'depth',
432
+ kind: target.kind === 'scene-color' ? ('color' as const) : ('depth' as const),
433
+ format: target.format,
434
+ sampleCount: target.sampleCount,
435
+ })),
436
+ );
437
+ }
438
+
439
+ interface PreparedPlanResources {
440
+ readonly computePrograms: ReadonlyMap<string, RenderFeatureGpuProgramRef>;
441
+ readonly graphicsPrograms: ReadonlyMap<string, RenderFeaturePreparedRef<'pipeline'>>;
442
+ readonly buffers: ReadonlyMap<string, RenderFeatureGpuBufferRef>;
443
+ readonly computeBindings: ReadonlyMap<string, RenderFeatureGpuBindingsRef>;
444
+ readonly graphicsBindings: ReadonlyMap<string, RenderFeaturePreparedRef<'bindings'>>;
445
+ readonly vertexData: ReadonlyMap<string, RenderFeaturePreparedRef<'vertex-data'>>;
446
+ readonly indexData: ReadonlyMap<string, RenderFeaturePreparedRef<'index-data'>>;
447
+ }
448
+
449
+ function planFailure(slot: FeatureSlot): RenderFeatureStageFailedError {
450
+ return new RenderFeatureStageFailedError(slot.feature.identity, slot.order, 'plan', 'next-frame');
451
+ }
452
+
453
+ function targetHandle(
454
+ name: string,
455
+ targets: readonly RenderFeatureTargetHandle[],
456
+ ): string | RenderFeatureTargetHandle | undefined {
457
+ if (name === 'swapchain') return 'swapchain';
458
+ return targets.find(
459
+ (target) =>
460
+ (name === 'color' && target.kind === 'scene-color') ||
461
+ (name === 'depth' && target.kind === 'scene-depth'),
462
+ );
463
+ }
464
+
465
+ function targetFormat(
466
+ name: string,
467
+ targets: readonly RenderFeatureLogicalTarget[],
468
+ fallback: string | undefined,
469
+ ): TextureFormat | undefined {
470
+ const target = targets.find((candidate) => candidate.name === name);
471
+ return (target?.format ?? fallback) as TextureFormat | undefined;
472
+ }
473
+
474
+ function preparePlanResources(
475
+ slot: FeatureSlot,
476
+ plan: RenderFeaturePlan,
477
+ graphics: RenderFeatureGraphicsPrepare,
478
+ gpu: RenderFeatureGpuPrepareSession | undefined,
479
+ targets: readonly RenderFeatureTargetHandle[],
480
+ ): Result<PreparedPlanResources, RenderError> {
481
+ const computePrograms = new Map<string, RenderFeatureGpuProgramRef>();
482
+ const graphicsPrograms = new Map<string, RenderFeaturePreparedRef<'pipeline'>>();
483
+ const buffers = new Map<string, RenderFeatureGpuBufferRef>();
484
+ const computeBindings = new Map<string, RenderFeatureGpuBindingsRef>();
485
+ const graphicsBindings = new Map<string, RenderFeaturePreparedRef<'bindings'>>();
486
+ const vertexData = new Map<string, RenderFeaturePreparedRef<'vertex-data'>>();
487
+ const indexData = new Map<string, RenderFeaturePreparedRef<'index-data'>>();
488
+ const byKind = <Kind extends RenderFeatureResourceDeclaration['kind']>(kind: Kind) =>
489
+ plan.resources.filter(
490
+ (resource): resource is Extract<RenderFeatureResourceDeclaration, { readonly kind: Kind }> =>
491
+ resource.kind === kind,
492
+ );
493
+
494
+ if (
495
+ gpu === undefined &&
496
+ plan.resources.some((resource) =>
497
+ ['compute-program', 'buffer', 'compute-bindings'].includes(resource.kind),
498
+ )
499
+ ) {
500
+ return err(planFailure(slot));
501
+ }
502
+ for (const resource of byKind('compute-program')) {
503
+ const prepared = gpu?.prepareProgram(resource.name, resource.program);
504
+ if (prepared === undefined) return err(planFailure(slot));
505
+ if (!prepared.ok) return prepared;
506
+ computePrograms.set(resource.name, prepared.value);
507
+ }
508
+ for (const resource of byKind('graphics-program')) {
509
+ const prepared = graphics.preparePipeline(resource.name, resource.program);
510
+ if (!prepared.ok) return prepared;
511
+ graphicsPrograms.set(resource.name, prepared.value);
512
+ }
513
+ for (const resource of byKind('buffer')) {
514
+ const prepared = gpu?.prepareBuffer(resource.name, {
515
+ size: resource.size,
516
+ usage: resource.usage,
517
+ ...(resource.data === undefined ? {} : { data: resource.data }),
518
+ });
519
+ if (prepared === undefined) return err(planFailure(slot));
520
+ if (!prepared.ok) return prepared;
521
+ buffers.set(resource.name, prepared.value);
522
+ }
523
+ for (const resource of byKind('compute-bindings')) {
524
+ const program = computePrograms.get(resource.program);
525
+ const entries = resource.entries.map((entry) => ({
526
+ binding: entry.binding,
527
+ buffer: buffers.get(entry.resource),
528
+ }));
529
+ if (program === undefined || entries.some((entry) => entry.buffer === undefined)) {
530
+ return err(planFailure(slot));
531
+ }
532
+ const prepared = gpu?.prepareBindings(resource.name, {
533
+ program,
534
+ entries: entries.map((entry) => ({
535
+ binding: entry.binding,
536
+ buffer: entry.buffer as RenderFeatureGpuBufferRef,
537
+ })),
538
+ });
539
+ if (prepared === undefined) return err(planFailure(slot));
540
+ if (!prepared.ok) return prepared;
541
+ computeBindings.set(resource.name, prepared.value);
542
+ }
543
+ for (const resource of byKind('graphics-bindings')) {
544
+ const program = graphicsPrograms.get(resource.program);
545
+ if (program === undefined) return err(planFailure(slot));
546
+ const values: Record<string, unknown> = { ...resource.values };
547
+ for (const [key, targetName] of Object.entries(resource.logicalTargets ?? {})) {
548
+ const target = targetHandle(targetName, targets);
549
+ if (target === undefined || typeof target === 'string') return err(planFailure(slot));
550
+ values[key] = target;
551
+ }
552
+ const prepared = graphics.prepareBindings(resource.name, { pipeline: program, values });
553
+ if (!prepared.ok) return prepared;
554
+ graphicsBindings.set(resource.name, prepared.value);
555
+ }
556
+ for (const resource of byKind('vertex-data')) {
557
+ const descriptor =
558
+ resource.buffer === undefined
559
+ ? { layout: resource.layout, data: resource.data }
560
+ : { layout: resource.layout, buffer: buffers.get(resource.buffer) };
561
+ if ('buffer' in descriptor && descriptor.buffer === undefined) return err(planFailure(slot));
562
+ const prepared = graphics.prepareVertexData(
563
+ resource.name,
564
+ descriptor as import('./prepared-graphics').RenderFeatureVertexDataDescriptor,
565
+ );
566
+ if (!prepared.ok) return prepared;
567
+ vertexData.set(resource.name, prepared.value);
568
+ }
569
+ for (const resource of byKind('index-data')) {
570
+ const descriptor =
571
+ resource.buffer === undefined
572
+ ? { format: resource.format, data: resource.data }
573
+ : { format: resource.format, buffer: buffers.get(resource.buffer) };
574
+ if ('buffer' in descriptor && descriptor.buffer === undefined) return err(planFailure(slot));
575
+ const prepared = graphics.prepareIndexData(
576
+ resource.name,
577
+ descriptor as import('./prepared-graphics').RenderFeatureIndexDataDescriptor,
578
+ );
579
+ if (!prepared.ok) return prepared;
580
+ indexData.set(resource.name, prepared.value);
581
+ }
582
+ return ok({
583
+ computePrograms,
584
+ graphicsPrograms,
585
+ buffers,
586
+ computeBindings,
587
+ graphicsBindings,
588
+ vertexData,
589
+ indexData,
590
+ });
591
+ }
592
+
593
+ function projectDraw(
594
+ slot: FeatureSlot,
595
+ draw: Extract<RenderFeaturePassDeclaration, { readonly kind: 'raster' }>['draws'][number],
596
+ prepared: PreparedPlanResources,
597
+ ): Result<import('./prepared-graphics').RenderFeatureDrawRecord, RenderError> {
598
+ const pipeline = prepared.graphicsPrograms.get(draw.program);
599
+ const bindings = draw.bindings.map((name) => prepared.graphicsBindings.get(name));
600
+ const vertexData = draw.vertexData.map((entry) => ({
601
+ slot: entry.slot,
602
+ resource: prepared.vertexData.get(entry.resource),
603
+ }));
604
+ const indexData =
605
+ draw.indexData === undefined
606
+ ? undefined
607
+ : {
608
+ resource: prepared.indexData.get(draw.indexData.resource),
609
+ format: draw.indexData.format,
610
+ };
611
+ if (
612
+ pipeline === undefined ||
613
+ bindings.some((binding) => binding === undefined) ||
614
+ vertexData.some((vertex) => vertex.resource === undefined) ||
615
+ (indexData !== undefined && indexData.resource === undefined)
616
+ ) {
617
+ return err(planFailure(slot));
618
+ }
619
+ const common = {
620
+ pipeline,
621
+ bindings: bindings as readonly RenderFeaturePreparedRef<'bindings'>[],
622
+ vertexData: vertexData as readonly {
623
+ readonly slot: number;
624
+ readonly resource: RenderFeaturePreparedRef<'vertex-data'>;
625
+ }[],
626
+ ...(draw.vertexLayout === undefined ? {} : { vertexLayout: draw.vertexLayout }),
627
+ };
628
+ switch (draw.draw.kind) {
629
+ case 'draw':
630
+ return ok({
631
+ kind: 'draw',
632
+ ...common,
633
+ ...(indexData === undefined
634
+ ? {}
635
+ : {
636
+ indexData: {
637
+ resource: indexData.resource as RenderFeaturePreparedRef<'index-data'>,
638
+ format: indexData.format,
639
+ },
640
+ }),
641
+ command: {
642
+ vertexCount: draw.draw.vertexCount,
643
+ instanceCount: draw.draw.instanceCount,
644
+ ...(draw.draw.firstVertex === undefined ? {} : { firstVertex: draw.draw.firstVertex }),
645
+ ...(draw.draw.firstInstance === undefined
646
+ ? {}
647
+ : { firstInstance: draw.draw.firstInstance }),
648
+ },
649
+ });
650
+ case 'draw-indexed':
651
+ return ok({
652
+ kind: 'draw-indexed',
653
+ ...common,
654
+ indexData:
655
+ indexData === undefined
656
+ ? undefined
657
+ : {
658
+ resource: indexData.resource as RenderFeaturePreparedRef<'index-data'>,
659
+ format: indexData.format,
660
+ },
661
+ command: {
662
+ indexCount: draw.draw.indexCount,
663
+ instanceCount: draw.draw.instanceCount,
664
+ ...(draw.draw.firstIndex === undefined ? {} : { firstIndex: draw.draw.firstIndex }),
665
+ ...(draw.draw.baseVertex === undefined ? {} : { baseVertex: draw.draw.baseVertex }),
666
+ ...(draw.draw.firstInstance === undefined
667
+ ? {}
668
+ : { firstInstance: draw.draw.firstInstance }),
669
+ },
670
+ });
671
+ case 'draw-indirect':
672
+ case 'draw-indexed-indirect': {
673
+ const buffer = prepared.buffers.get(draw.draw.resource);
674
+ if (buffer === undefined) return err(planFailure(slot));
675
+ const command = {
676
+ buffer,
677
+ ...(draw.draw.offset === undefined ? {} : { offset: draw.draw.offset }),
678
+ };
679
+ if (draw.draw.kind === 'draw-indexed-indirect') {
680
+ return ok({
681
+ kind: 'draw-indexed-indirect',
682
+ ...common,
683
+ indexData:
684
+ indexData === undefined
685
+ ? undefined
686
+ : {
687
+ resource: indexData.resource as RenderFeaturePreparedRef<'index-data'>,
688
+ format: indexData.format,
689
+ },
690
+ command,
691
+ });
692
+ }
693
+ return ok({
694
+ kind: 'draw-indirect',
695
+ ...common,
696
+ ...(indexData === undefined
697
+ ? {}
698
+ : {
699
+ indexData: {
700
+ resource: indexData.resource as RenderFeaturePreparedRef<'index-data'>,
701
+ format: indexData.format,
702
+ },
703
+ }),
704
+ command,
705
+ });
706
+ }
707
+ }
708
+ }
709
+
710
+ function projectPlanPasses(
711
+ slot: FeatureSlot,
712
+ plan: RenderFeaturePlan,
713
+ prepared: PreparedPlanResources,
714
+ gpu: RenderFeatureGpuPrepareSession | undefined,
715
+ targets: readonly RenderFeatureTargetHandle[],
716
+ validateGraphics: (
717
+ descriptor: RenderFeatureGraphicsPassDescriptor,
718
+ resources: readonly { readonly name: string }[],
719
+ ) => Result<RenderFeaturePreparedGraphicsState, RenderError>,
720
+ resolveGraphics?: (
721
+ descriptor: RenderFeatureGraphicsPassDescriptor,
722
+ ) => Result<PreparedGraphicsResolvedSnapshot, RenderError> | undefined,
723
+ ): Result<RenderFeaturePlanExecution, RenderError> {
724
+ const logical = logicalTargets(targets);
725
+ const projected: RenderFeaturePlanExecutionPass[] = [];
726
+ for (const pass of plan.passes) {
727
+ if (pass.kind === 'compute') {
728
+ const program = prepared.computePrograms.get(pass.program);
729
+ const bindings = prepared.computeBindings.get(pass.bindings);
730
+ if (program === undefined || bindings === undefined) return err(planFailure(slot));
731
+ const descriptor: RenderFeatureGpuComputePassDescriptor = {
732
+ program,
733
+ bindings,
734
+ dispatches: pass.dispatches.map((dispatch) =>
735
+ dispatch.kind === 'direct'
736
+ ? {
737
+ entryPoint: dispatch.entryPoint,
738
+ bindings,
739
+ workgroups: dispatch.workgroups,
740
+ }
741
+ : {
742
+ entryPoint: dispatch.entryPoint,
743
+ bindings,
744
+ indirect: {
745
+ buffer: prepared.buffers.get(dispatch.resource) as RenderFeatureGpuBufferRef,
746
+ offset: dispatch.offset,
747
+ },
748
+ },
749
+ ),
750
+ };
751
+ if (
752
+ descriptor.dispatches.some(
753
+ (dispatch) => dispatch.indirect !== undefined && dispatch.indirect.buffer === undefined,
754
+ )
755
+ ) {
756
+ return err(planFailure(slot));
757
+ }
758
+ const resolved = gpu?.resolveComputePass(slot.feature.identity, descriptor);
759
+ if (resolved === undefined) return err(planFailure(slot));
760
+ if (!resolved.ok) return resolved;
761
+ projected.push({
762
+ featureIdentity: slot.feature.identity,
763
+ order: slot.order,
764
+ name: pass.name,
765
+ gpuCompute: descriptor,
766
+ resolvedGpuCompute: resolved.value,
767
+ });
768
+ continue;
769
+ }
770
+
771
+ const draws: import('./prepared-graphics').RenderFeatureDrawRecord[] = [];
772
+ for (const draw of pass.draws) {
773
+ const projected = projectDraw(slot, draw, prepared);
774
+ if (!projected.ok) return projected;
775
+ draws.push(projected.value);
776
+ }
777
+ const fallbackFormat = (() => {
778
+ const firstProgram = prepared.graphicsPrograms.get(pass.draws[0]?.program ?? '');
779
+ const declaration = plan.resources.find(
780
+ (resource) =>
781
+ resource.kind === 'graphics-program' &&
782
+ prepared.graphicsPrograms.get(resource.name) === firstProgram,
783
+ );
784
+ return declaration?.kind === 'graphics-program'
785
+ ? declaration.program.colorFormats[0]
786
+ : undefined;
787
+ })();
788
+ const colors = pass.colorAttachments.map((attachment) => ({
789
+ resource: targetHandle(attachment.target, targets),
790
+ format: targetFormat(attachment.target, logical, fallbackFormat),
791
+ loadOp: attachment.loadOp,
792
+ storeOp: attachment.storeOp,
793
+ }));
794
+ const depth =
795
+ pass.depthStencilAttachment === undefined
796
+ ? undefined
797
+ : {
798
+ resource: targetHandle(pass.depthStencilAttachment.target, targets),
799
+ format: targetFormat(pass.depthStencilAttachment.target, logical, undefined),
800
+ depthLoadOp: pass.depthStencilAttachment.depthLoadOp,
801
+ depthStoreOp: pass.depthStencilAttachment.depthStoreOp,
802
+ };
803
+ const sampledTargets = (pass.sampledTargets ?? []).map((name) => targetHandle(name, targets));
804
+ if (
805
+ colors.some(
806
+ (attachment) => attachment.resource === undefined || attachment.format === undefined,
807
+ ) ||
808
+ (depth !== undefined && (depth.resource === undefined || depth.format === undefined)) ||
809
+ sampledTargets.some((target) => target === undefined || typeof target === 'string')
810
+ ) {
811
+ return err(planFailure(slot));
812
+ }
813
+ const attachments: RenderFeatureGraphicsPassDescriptor['attachments'] =
814
+ depth === undefined
815
+ ? { colors: colors as RenderFeatureGraphicsPassDescriptor['attachments']['colors'] }
816
+ : {
817
+ colors: colors as RenderFeatureGraphicsPassDescriptor['attachments']['colors'],
818
+ depthStencil: depth as NonNullable<
819
+ RenderFeatureGraphicsPassDescriptor['attachments']['depthStencil']
820
+ >,
821
+ };
822
+ const descriptor: RenderFeatureGraphicsPassDescriptor = {
823
+ attachments,
824
+ ...(sampledTargets.length === 0
825
+ ? {}
826
+ : {
827
+ sampledTargets: sampledTargets as readonly RenderFeatureTargetHandle[],
828
+ }),
829
+ draws,
830
+ };
831
+ const graphicsState = validateGraphics(descriptor, []);
832
+ if (!graphicsState.ok) return graphicsState;
833
+ const resolved = resolveGraphics?.(descriptor);
834
+ if (
835
+ resolved !== undefined &&
836
+ !resolved.ok &&
837
+ resolved.error instanceof RenderFeaturePreparationFailedError &&
838
+ resolved.error.detail.reason === 'pipeline-pending'
839
+ ) {
840
+ continue;
841
+ }
842
+ if (resolved !== undefined && !resolved.ok) return resolved;
843
+ projected.push({
844
+ featureIdentity: slot.feature.identity,
845
+ order: slot.order,
846
+ name: pass.name,
847
+ graphics: descriptor,
848
+ graphicsState: graphicsState.value,
849
+ ...(resolved?.ok === true ? { resolvedGraphics: resolved.value } : {}),
850
+ });
851
+ }
852
+ return ok({
853
+ featureIdentity: slot.feature.identity,
854
+ order: slot.order,
855
+ passes: Object.freeze(projected),
856
+ });
857
+ }
858
+
507
859
  function invokeStage<T>(
508
860
  slot: FeatureSlot,
509
861
  stage: RenderFeatureStageEvent['stage'],
510
862
  action: () => Result<T, RenderError>,
511
- events: string[],
512
863
  stageEvents: RenderFeatureStageEvent[],
513
864
  errors: RenderError[],
514
865
  ): Result<T, RenderError> {
515
866
  const identity = slot.feature.identity;
516
- events.push(`${identity}:${stage}`);
517
867
  stageEvents.push({ featureIdentity: identity, order: slot.order, stage });
518
868
  try {
519
869
  const result = action();
@@ -574,7 +924,6 @@ class FeatureHostImpl implements RenderFeatureHost {
574
924
  this.slots.push({
575
925
  feature,
576
926
  order: this.slots.length,
577
- resources: [],
578
927
  preparedResourceBatches: new Set(),
579
928
  preparedStore: createPreparedGraphicsStore(),
580
929
  status: 'active',
@@ -596,17 +945,6 @@ class FeatureHostImpl implements RenderFeatureHost {
596
945
  const result = batch.release();
597
946
  if (!result.ok && firstError === undefined) firstError = result.error;
598
947
  }
599
- for (const resource of slot.resources) {
600
- const result = releaseResource(slot, resource);
601
- if (!result.ok && firstError === undefined) firstError = result.error;
602
- }
603
- const disposed = invokeLifecycle(slot, 'dispose', {
604
- frameNumber: -1,
605
- caps: {} as never,
606
- });
607
- if (!disposed.ok && firstError === undefined) firstError = disposed.error;
608
-
609
- slot.resources.length = 0;
610
948
  slot.status = 'disposed';
611
949
  this.slots.splice(index, 1);
612
950
  for (const [order, remaining] of this.slots.entries()) remaining.order = order;
@@ -624,18 +962,6 @@ class FeatureHostImpl implements RenderFeatureHost {
624
962
  return this.generation;
625
963
  }
626
964
 
627
- registerResource(
628
- identity: string,
629
- resource: RenderFeatureOwnedResource,
630
- ): Result<void, RenderError> {
631
- const slot = findSlot(this.slots, identity);
632
- if (slot === undefined || this.disposed || slot.status === 'disposed') {
633
- return err(unknownFeatureError(identity, 'dispose'));
634
- }
635
- slot.resources.push(resource);
636
- return ok(undefined);
637
- }
638
-
639
965
  setStatus(
640
966
  identity: string,
641
967
  status: RenderFeatureStatus,
@@ -764,14 +1090,6 @@ class FeatureHostImpl implements RenderFeatureHost {
764
1090
  if (firstError === undefined) firstError = error;
765
1091
  continue;
766
1092
  }
767
- const recovered = invokeLifecycle(slot, 'recover', input);
768
- if (!recovered.ok) {
769
- slot.status = 'failed';
770
- slot.latestError = errorDescriptor(recovered.error);
771
- diagnosticsChanged = true;
772
- if (firstError === undefined) firstError = recovered.error;
773
- continue;
774
- }
775
1093
  if (slot.status !== 'active' || slot.latestError !== undefined) {
776
1094
  slot.status = 'active';
777
1095
  slot.latestError = undefined;
@@ -796,51 +1114,26 @@ class FeatureHostImpl implements RenderFeatureHost {
796
1114
  this.disposed = true;
797
1115
 
798
1116
  const retired = this.retirePreparedGraphics();
799
- let firstError: RenderError | undefined = retired.ok ? undefined : retired.error;
800
- const cleanupFailures: RenderFeatureCleanupFailure[] = [];
1117
+ const firstError: RenderError | undefined = retired.ok ? undefined : retired.error;
801
1118
  for (const slot of this.slots) {
802
- for (const resource of slot.resources) {
803
- const result = releaseResource(slot, resource);
804
- if (!result.ok) {
805
- cleanupFailures.push(cleanupErrorDescriptor(result.error, slot));
806
- if (firstError === undefined) firstError = result.error;
807
- }
808
- }
809
- const disposed = invokeLifecycle(slot, 'dispose', {
810
- frameNumber: -1,
811
- caps: {} as never,
812
- });
813
- if (!disposed.ok) {
814
- cleanupFailures.push(cleanupErrorDescriptor(disposed.error, slot));
815
- if (firstError === undefined) firstError = disposed.error;
816
- }
817
- slot.resources.length = 0;
818
1119
  slot.status = 'disposed';
819
1120
  }
820
1121
  this.publishDiagnosticsChanged();
821
1122
  this.diagnosticsListeners.clear();
822
1123
 
823
- return firstError === undefined
824
- ? ok(undefined)
825
- : err(withCleanupFailures(firstError, cleanupFailures));
1124
+ return firstError === undefined ? ok(undefined) : err(firstError);
826
1125
  }
827
1126
  }
828
1127
 
829
- /**
830
- * Run the three typed stages once for every active feature.
831
- *
832
- * The feature value is kept in the slot closure: no heterogeneous FrameData
833
- * ledger or assertion is needed between callbacks. A failure ends only the
834
- * current slot and is retained in the host diagnostics projection.
835
- */
1128
+ /** Build and project the mandatory plan once for every active feature. */
836
1129
  export function runRenderFeatureFrame(
837
1130
  host: RenderFeatureHost,
838
1131
  input: RenderFeatureFrameInput,
839
1132
  ): RenderFeatureFrameResult {
840
- const events: string[] = [];
841
1133
  const stageEvents: RenderFeatureStageEvent[] = [];
842
1134
  const errors: RenderError[] = [];
843
- const contributions: RenderFeatureGraphContribution[] = [];
1135
+ const plans: RenderFeaturePlannedFrame[] = [];
1136
+ const fullscreenEffects = new Map<string, PostProcessShaderEntry>();
844
1137
  const preparedResourceBatches: RenderFeaturePreparedResourceBatch[] = [];
845
1138
  const hiddenEntityReports: RenderFeatureHiddenEntityReport[] = [
846
1139
  ...(input.hiddenEntityReports ?? []),
@@ -864,7 +1157,6 @@ export function runRenderFeatureFrame(
864
1157
  const slot: FeatureSlot = {
865
1158
  feature,
866
1159
  order,
867
- resources: [],
868
1160
  preparedResourceBatches: new Set(),
869
1161
  preparedStore: createPreparedGraphicsStore(),
870
1162
  status: 'active',
@@ -873,21 +1165,11 @@ export function runRenderFeatureFrame(
873
1165
  const identity = slot.feature.identity;
874
1166
  const transaction = host.beginPreparedFrame(identity, input.generation ?? 0);
875
1167
  if (transaction === undefined) continue;
876
- const graphics = createPreparedGraphicsPrepare(
877
- transaction,
878
- input.getMaterialShaderBindingContract,
879
- input.resolveMaterialAsset,
1168
+ const graphics = createPreparedGraphicsPrepare(transaction);
1169
+ const gpu: RenderFeatureGpuPrepareSession | undefined = input.gpuWork?.beginFeature(
880
1170
  identity,
881
- order,
1171
+ input.generation ?? 0,
882
1172
  );
883
- const gpu = input.getGpuWorkResolver?.(identity);
884
- gpu?.beginFrame();
885
- const validateGraphics = graphicsValidator(
886
- identity,
887
- transaction,
888
- missingCapability(feature, input.caps) === undefined,
889
- );
890
- let staging!: RenderFeatureContributionStaging & RenderFeatureGraphicsContributionStaging;
891
1173
  const featureHiddenEntityReports: RenderFeatureHiddenEntityReport[] = [];
892
1174
  const extractContext = {
893
1175
  worlds: input.worlds,
@@ -902,7 +1184,6 @@ export function runRenderFeatureFrame(
902
1184
  slot,
903
1185
  'extract',
904
1186
  () => slot.feature.extract(extractContext),
905
- events,
906
1187
  stageEvents,
907
1188
  errors,
908
1189
  );
@@ -912,34 +1193,61 @@ export function runRenderFeatureFrame(
912
1193
  continue;
913
1194
  }
914
1195
 
915
- const prepared = invokeStage(
1196
+ const targets = logicalTargets(input.targets ?? []);
1197
+ const declared = invokeStage(
916
1198
  slot,
917
- 'prepare',
1199
+ 'plan',
918
1200
  () =>
919
- slot.feature.prepare(extracted.value, {
1201
+ feature.plan(extracted.value, {
920
1202
  caps: input.caps,
921
1203
  frame: { frameNumber: input.frameNumber },
922
- resources: [],
923
- targets: input.targets ?? [],
924
- reportError: { report: (error) => errors.push(error) },
925
- graphics,
926
- ...(gpu === undefined ? {} : { gpu }),
1204
+ generation: transaction.generation,
1205
+ targets,
927
1206
  }),
928
- events,
929
1207
  stageEvents,
930
1208
  errors,
931
1209
  );
1210
+ if (!declared.ok) {
1211
+ transaction.abort();
1212
+ host.setStatus(identity, 'failed', slot.latestError);
1213
+ continue;
1214
+ }
1215
+ const frozen = freezeRenderFeaturePlan(identity, declared.value, targets);
1216
+ if (!frozen.ok) {
1217
+ recordFailure(slot, 'plan', frozen.error, errors);
1218
+ transaction.abort();
1219
+ host.setStatus(identity, 'failed', slot.latestError);
1220
+ continue;
1221
+ }
1222
+ const plannedFrame: RenderFeaturePlannedFrame = Object.freeze({
1223
+ featureIdentity: identity,
1224
+ generation: transaction.generation,
1225
+ signature: renderFeaturePlanSignature(frozen.value),
1226
+ plan: frozen.value,
1227
+ });
1228
+ for (const resource of frozen.value.resources) {
1229
+ if (resource.kind !== 'fullscreen-program') continue;
1230
+ fullscreenEffects.set(identity, {
1231
+ source: resource.source,
1232
+ ...(resource.reads === undefined ? {} : { reads: resource.reads }),
1233
+ ...(resource.params === undefined ? {} : { params: resource.params }),
1234
+ });
1235
+ }
1236
+ const prepared = preparePlanResources(slot, frozen.value, graphics, gpu, input.targets ?? []);
932
1237
  if (!prepared.ok) {
1238
+ recordFailure(slot, 'plan', prepared.error, errors);
933
1239
  transaction.abort();
934
1240
  host.setStatus(identity, 'failed', slot.latestError);
935
1241
  continue;
936
1242
  }
1243
+ const validateGraphics = graphicsValidator(identity, transaction, true);
937
1244
 
938
1245
  const resolverInput: RenderFeaturePreparedGraphicsResolverInput = {
939
1246
  featureIdentity: identity,
940
1247
  order,
941
1248
  generation: transaction.generation,
942
1249
  transaction,
1250
+ fullscreenEffects,
943
1251
  lookup: (reference) =>
944
1252
  [...transaction.overlayItems(), ...transaction.committedItems()].find(
945
1253
  (item) => item.reference === reference,
@@ -957,93 +1265,52 @@ export function runRenderFeatureFrame(
957
1265
  const releaseResolver = (): void => {
958
1266
  if (resolver !== undefined) resolver.release();
959
1267
  };
960
- const resolveGpuCompute =
961
- gpu === undefined
962
- ? undefined
963
- : (descriptor: import('./prepared-gpu-work').RenderFeatureGpuComputePassDescriptor) =>
964
- gpu.resolveComputePass(identity, descriptor);
965
- staging =
966
- input.createContributionStaging?.(
967
- identity,
968
- order,
969
- validateGraphics,
970
- resolveGraphics,
971
- resolveGpuCompute,
972
- ) ??
973
- createRenderFeatureContributionStaging(
974
- identity,
975
- order,
976
- validateGraphics,
977
- resolveGraphics,
978
- resolveGpuCompute,
979
- );
980
-
981
- const contributed = invokeStage(
1268
+ const projected = projectPlanPasses(
982
1269
  slot,
983
- 'contribute',
984
- () =>
985
- slot.feature.contribute(extracted.value, {
986
- caps: input.caps,
987
- frame: { frameNumber: input.frameNumber },
988
- resources: [],
989
- targets: input.targets ?? [],
990
- reportError: { report: (error) => errors.push(error) },
991
- graphics,
992
- ...(gpu === undefined ? {} : { gpu }),
993
- staging,
994
- }),
995
- events,
996
- stageEvents,
997
- errors,
1270
+ frozen.value,
1271
+ prepared.value,
1272
+ gpu,
1273
+ input.targets ?? [],
1274
+ validateGraphics,
1275
+ resolveGraphics,
998
1276
  );
999
- if (!contributed.ok) {
1000
- staging?.abort();
1277
+ if (!projected.ok) {
1278
+ recordFailure(slot, 'plan', projected.error, errors);
1001
1279
  transaction.abort();
1002
1280
  releaseResolver();
1003
1281
  host.setStatus(identity, 'failed', slot.latestError);
1004
1282
  continue;
1005
1283
  }
1006
- if (staging !== undefined) {
1007
- const committed = staging.commit();
1008
- if (!committed.ok) {
1009
- recordFailure(slot, 'contribute', committed.error, errors);
1010
- transaction.abort();
1011
- releaseResolver();
1012
- host.setStatus(identity, 'failed', slot.latestError);
1013
- continue;
1014
- }
1015
- const preparedCommit = transaction.commit();
1016
- if (!preparedCommit.ok) {
1017
- recordFailure(slot, 'contribute', preparedCommit.error, errors);
1018
- releaseResolver();
1019
- host.setStatus(identity, 'failed', slot.latestError);
1020
- continue;
1021
- }
1022
- const leases = [
1023
- ...new Set(committed.value.passes.flatMap((pass) => pass.resolvedGraphics?.leases ?? [])),
1024
- ...(gpu?.retireUntouched() ?? []),
1025
- ];
1026
- const retained = host.retainPreparedGraphics(identity, leases);
1027
- if (!retained.ok) {
1028
- recordFailure(slot, 'contribute', retained.error, errors);
1029
- releaseResolver();
1030
- host.setStatus(identity, 'failed', slot.latestError);
1031
- continue;
1032
- }
1033
- if (leases.length > 0) preparedResourceBatches.push(retained.value);
1034
- if (committed.value.resources.length > 0 || committed.value.passes.length > 0) {
1035
- contributions.push(committed.value);
1036
- }
1284
+ const preparedCommit = transaction.commit();
1285
+ if (!preparedCommit.ok) {
1286
+ recordFailure(slot, 'plan', preparedCommit.error, errors);
1287
+ releaseResolver();
1288
+ host.setStatus(identity, 'failed', slot.latestError);
1289
+ continue;
1290
+ }
1291
+ const leases = [
1292
+ ...new Set(projected.value.passes.flatMap((pass) => pass.resolvedGraphics?.leases ?? [])),
1293
+ ...(gpu?.retireUntouched() ?? []),
1294
+ ];
1295
+ const retained = host.retainPreparedGraphics(identity, leases);
1296
+ if (!retained.ok) {
1297
+ recordFailure(slot, 'plan', retained.error, errors);
1298
+ releaseResolver();
1299
+ host.setStatus(identity, 'failed', slot.latestError);
1300
+ continue;
1037
1301
  }
1302
+ planExecutionProjections.set(plannedFrame, projected.value);
1303
+ plans.push(plannedFrame);
1304
+ if (leases.length > 0) preparedResourceBatches.push(retained.value);
1038
1305
  hiddenEntityReports.push(...featureHiddenEntityReports);
1039
1306
  host.setStatus(identity, 'active');
1040
1307
  }
1041
1308
 
1042
1309
  return {
1043
- events,
1044
1310
  stageEvents,
1045
1311
  errors,
1046
- contributions,
1312
+ plans,
1313
+ fullscreenEffects,
1047
1314
  preparedResourceBatches,
1048
1315
  hiddenEntityReports: mergeHiddenEntityReports(hiddenEntityReports),
1049
1316
  };
@@ -1087,7 +1354,6 @@ export function createRenderFeatureHost(
1087
1354
  const slots: FeatureSlot[] = features.map((feature, order) => ({
1088
1355
  feature,
1089
1356
  order,
1090
- resources: [],
1091
1357
  preparedResourceBatches: new Set(),
1092
1358
  preparedStore: createPreparedGraphicsStore(),
1093
1359
  status: 'active',