@forgeax/engine-render 0.0.0-dev.8d955ade1c79

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 (891) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +647 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/__tests__/authoring-path.unit.test.d.ts +2 -0
  5. package/dist/__tests__/authoring-path.unit.test.d.ts.map +1 -0
  6. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts +2 -0
  7. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts.map +1 -0
  8. package/dist/__tests__/callback-inference.test-d.d.ts +2 -0
  9. package/dist/__tests__/callback-inference.test-d.d.ts.map +1 -0
  10. package/dist/__tests__/cluster-binner.test.d.ts +2 -0
  11. package/dist/__tests__/cluster-binner.test.d.ts.map +1 -0
  12. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts +2 -0
  13. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts.map +1 -0
  14. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts +2 -0
  15. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts.map +1 -0
  16. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts +2 -0
  17. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts.map +1 -0
  18. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts +2 -0
  19. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts.map +1 -0
  20. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts +2 -0
  21. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts.map +1 -0
  22. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts +2 -0
  23. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts.map +1 -0
  24. package/dist/__tests__/factory-contract.integration.test.d.ts +2 -0
  25. package/dist/__tests__/factory-contract.integration.test.d.ts.map +1 -0
  26. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts +2 -0
  27. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts.map +1 -0
  28. package/dist/__tests__/frame-observation.contract.test.d.ts +2 -0
  29. package/dist/__tests__/frame-observation.contract.test.d.ts.map +1 -0
  30. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts +2 -0
  31. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts.map +1 -0
  32. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts +2 -0
  33. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts.map +1 -0
  34. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts +6 -0
  35. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +1 -0
  36. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts +2 -0
  37. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts.map +1 -0
  38. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts +2 -0
  39. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts.map +1 -0
  40. package/dist/__tests__/gpu-driven-production.integration.test.d.ts +2 -0
  41. package/dist/__tests__/gpu-driven-production.integration.test.d.ts.map +1 -0
  42. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts +2 -0
  43. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts.map +1 -0
  44. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +18 -0
  45. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +1 -0
  46. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts +2 -0
  47. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts.map +1 -0
  48. package/dist/__tests__/gpu-driven-view-reference.d.ts +15 -0
  49. package/dist/__tests__/gpu-driven-view-reference.d.ts.map +1 -0
  50. package/dist/__tests__/gpu-driven-view.browser.test.d.ts +2 -0
  51. package/dist/__tests__/gpu-driven-view.browser.test.d.ts.map +1 -0
  52. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts +2 -0
  53. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts.map +1 -0
  54. package/dist/__tests__/gpu-driven-view.unit.test.d.ts +2 -0
  55. package/dist/__tests__/gpu-driven-view.unit.test.d.ts.map +1 -0
  56. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts +2 -0
  57. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts.map +1 -0
  58. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts +7 -0
  59. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +1 -0
  60. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts +2 -0
  61. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts.map +1 -0
  62. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts +2 -0
  63. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts.map +1 -0
  64. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts +2 -0
  65. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts.map +1 -0
  66. package/dist/__tests__/gpu-scene.dawn.test.d.ts +2 -0
  67. package/dist/__tests__/gpu-scene.dawn.test.d.ts.map +1 -0
  68. package/dist/__tests__/gpu-scene.unit.test.d.ts +2 -0
  69. package/dist/__tests__/gpu-scene.unit.test.d.ts.map +1 -0
  70. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts +2 -0
  71. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts.map +1 -0
  72. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts +2 -0
  73. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts.map +1 -0
  74. package/dist/__tests__/injection-kind-owner.test-d.d.ts +2 -0
  75. package/dist/__tests__/injection-kind-owner.test-d.d.ts.map +1 -0
  76. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts +2 -0
  77. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts.map +1 -0
  78. package/dist/__tests__/light-buffer-layout.unit.test.d.ts +2 -0
  79. package/dist/__tests__/light-buffer-layout.unit.test.d.ts.map +1 -0
  80. package/dist/__tests__/material-contract-inventory.unit.test.d.ts +2 -0
  81. package/dist/__tests__/material-contract-inventory.unit.test.d.ts.map +1 -0
  82. package/dist/__tests__/material-cooked-projection.unit.test.d.ts +2 -0
  83. package/dist/__tests__/material-cooked-projection.unit.test.d.ts.map +1 -0
  84. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts +2 -0
  85. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts.map +1 -0
  86. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts +2 -0
  87. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts.map +1 -0
  88. package/dist/__tests__/material-stride-surface.unit.test.d.ts +2 -0
  89. package/dist/__tests__/material-stride-surface.unit.test.d.ts.map +1 -0
  90. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts +2 -0
  91. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts.map +1 -0
  92. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts +2 -0
  93. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts.map +1 -0
  94. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts +2 -0
  95. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts.map +1 -0
  96. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts +2 -0
  97. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts.map +1 -0
  98. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts +2 -0
  99. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts.map +1 -0
  100. package/dist/__tests__/morph-feature-plan.unit.test.d.ts +2 -0
  101. package/dist/__tests__/morph-feature-plan.unit.test.d.ts.map +1 -0
  102. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts +2 -0
  103. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts.map +1 -0
  104. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts +2 -0
  105. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts.map +1 -0
  106. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts +2 -0
  107. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts.map +1 -0
  108. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts +2 -0
  109. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts.map +1 -0
  110. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts +2 -0
  111. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts.map +1 -0
  112. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts +2 -0
  113. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts.map +1 -0
  114. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts +2 -0
  115. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts.map +1 -0
  116. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts +2 -0
  117. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts.map +1 -0
  118. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts +2 -0
  119. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts.map +1 -0
  120. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts +2 -0
  121. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts.map +1 -0
  122. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts +2 -0
  123. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts.map +1 -0
  124. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts +2 -0
  125. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts.map +1 -0
  126. package/dist/__tests__/profiler-default-off.test.d.ts +2 -0
  127. package/dist/__tests__/profiler-default-off.test.d.ts.map +1 -0
  128. package/dist/__tests__/profiler-phase-catalog.test.d.ts +2 -0
  129. package/dist/__tests__/profiler-phase-catalog.test.d.ts.map +1 -0
  130. package/dist/__tests__/profiler-phase-integration.test.d.ts +2 -0
  131. package/dist/__tests__/profiler-phase-integration.test.d.ts.map +1 -0
  132. package/dist/__tests__/profiler-phase-token.test.d.ts +2 -0
  133. package/dist/__tests__/profiler-phase-token.test.d.ts.map +1 -0
  134. package/dist/__tests__/public-surface.test-d.d.ts +2 -0
  135. package/dist/__tests__/public-surface.test-d.d.ts.map +1 -0
  136. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts +2 -0
  137. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts.map +1 -0
  138. package/dist/__tests__/render-error-code-owner.test-d.d.ts +2 -0
  139. package/dist/__tests__/render-error-code-owner.test-d.d.ts.map +1 -0
  140. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts +2 -0
  141. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts.map +1 -0
  142. package/dist/__tests__/render-error-exhaustive.test-d.d.ts +2 -0
  143. package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +1 -0
  144. package/dist/__tests__/render-feature-assembly.test-d.d.ts +2 -0
  145. package/dist/__tests__/render-feature-assembly.test-d.d.ts.map +1 -0
  146. package/dist/__tests__/render-feature-context.test-d.d.ts +2 -0
  147. package/dist/__tests__/render-feature-context.test-d.d.ts.map +1 -0
  148. package/dist/__tests__/render-feature-contract.test-d.d.ts +2 -0
  149. package/dist/__tests__/render-feature-contract.test-d.d.ts.map +1 -0
  150. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts +2 -0
  151. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts.map +1 -0
  152. package/dist/__tests__/render-feature-docs.unit.test.d.ts +2 -0
  153. package/dist/__tests__/render-feature-docs.unit.test.d.ts.map +1 -0
  154. package/dist/__tests__/render-feature-errors.unit.test.d.ts +2 -0
  155. package/dist/__tests__/render-feature-errors.unit.test.d.ts.map +1 -0
  156. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts +2 -0
  157. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts.map +1 -0
  158. package/dist/__tests__/render-feature-plan.test-d.d.ts +2 -0
  159. package/dist/__tests__/render-feature-plan.test-d.d.ts.map +1 -0
  160. package/dist/__tests__/render-feature-plan.unit.test.d.ts +2 -0
  161. package/dist/__tests__/render-feature-plan.unit.test.d.ts.map +1 -0
  162. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts +2 -0
  163. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts.map +1 -0
  164. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts +2 -0
  165. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts.map +1 -0
  166. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts +2 -0
  167. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts.map +1 -0
  168. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts +2 -0
  169. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts.map +1 -0
  170. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts +2 -0
  171. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts.map +1 -0
  172. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts +2 -0
  173. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts.map +1 -0
  174. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts +2 -0
  175. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts.map +1 -0
  176. package/dist/__tests__/render-feature-public-surface.test-d.d.ts +2 -0
  177. package/dist/__tests__/render-feature-public-surface.test-d.d.ts.map +1 -0
  178. package/dist/__tests__/render-feature-retry.unit.test.d.ts +2 -0
  179. package/dist/__tests__/render-feature-retry.unit.test.d.ts.map +1 -0
  180. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts +2 -0
  181. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts.map +1 -0
  182. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts +2 -0
  183. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts.map +1 -0
  184. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts +2 -0
  185. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts.map +1 -0
  186. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts +2 -0
  187. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts.map +1 -0
  188. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts +2 -0
  189. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts.map +1 -0
  190. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts +2 -0
  191. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts.map +1 -0
  192. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts +7 -0
  193. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts.map +1 -0
  194. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts +2 -0
  195. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts.map +1 -0
  196. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts +2 -0
  197. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts.map +1 -0
  198. package/dist/__tests__/render-graph-hzb-gpu.d.ts +7 -0
  199. package/dist/__tests__/render-graph-hzb-gpu.d.ts.map +1 -0
  200. package/dist/__tests__/render-graph-hzb.browser.test.d.ts +2 -0
  201. package/dist/__tests__/render-graph-hzb.browser.test.d.ts.map +1 -0
  202. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts +2 -0
  203. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts.map +1 -0
  204. package/dist/__tests__/render-graph-primitives.unit.test.d.ts +2 -0
  205. package/dist/__tests__/render-graph-primitives.unit.test.d.ts.map +1 -0
  206. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts +12 -0
  207. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts.map +1 -0
  208. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts +2 -0
  209. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts.map +1 -0
  210. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts +2 -0
  211. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts.map +1 -0
  212. package/dist/__tests__/render-scene-projection.unit.test.d.ts +2 -0
  213. package/dist/__tests__/render-scene-projection.unit.test.d.ts.map +1 -0
  214. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts +2 -0
  215. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts.map +1 -0
  216. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts +2 -0
  217. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts.map +1 -0
  218. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts +2 -0
  219. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts.map +1 -0
  220. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts +2 -0
  221. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts.map +1 -0
  222. package/dist/__tests__/shader-stage-surface.unit.test.d.ts +2 -0
  223. package/dist/__tests__/shader-stage-surface.unit.test.d.ts.map +1 -0
  224. package/dist/__tests__/ssao-config.unit.test.d.ts +2 -0
  225. package/dist/__tests__/ssao-config.unit.test.d.ts.map +1 -0
  226. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts +2 -0
  227. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts.map +1 -0
  228. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts +2 -0
  229. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts.map +1 -0
  230. package/dist/__tests__/standard-descriptors.test-d.d.ts +2 -0
  231. package/dist/__tests__/standard-descriptors.test-d.d.ts.map +1 -0
  232. package/dist/__tests__/standard-pipeline.dawn.test.d.ts +2 -0
  233. package/dist/__tests__/standard-pipeline.dawn.test.d.ts.map +1 -0
  234. package/dist/__tests__/standard-pipeline.integration.test.d.ts +2 -0
  235. package/dist/__tests__/standard-pipeline.integration.test.d.ts.map +1 -0
  236. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts +2 -0
  237. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts.map +1 -0
  238. package/dist/__tests__/surface-configuration.unit.test.d.ts +2 -0
  239. package/dist/__tests__/surface-configuration.unit.test.d.ts.map +1 -0
  240. package/dist/__tests__/texture-usage-surface.unit.test.d.ts +2 -0
  241. package/dist/__tests__/texture-usage-surface.unit.test.d.ts.map +1 -0
  242. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts +2 -0
  243. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts.map +1 -0
  244. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts +2 -0
  245. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts.map +1 -0
  246. package/dist/__tests__/urp-pipeline.unit.test.d.ts +2 -0
  247. package/dist/__tests__/urp-pipeline.unit.test.d.ts.map +1 -0
  248. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts +2 -0
  249. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts.map +1 -0
  250. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts +2 -0
  251. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts.map +1 -0
  252. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts +2 -0
  253. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts.map +1 -0
  254. package/dist/__tests__/visibility-extract.integration.test.d.ts +2 -0
  255. package/dist/__tests__/visibility-extract.integration.test.d.ts.map +1 -0
  256. package/dist/__tests__/visibility-extract.perf.test.d.ts +2 -0
  257. package/dist/__tests__/visibility-extract.perf.test.d.ts.map +1 -0
  258. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts +2 -0
  259. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts.map +1 -0
  260. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts +2 -0
  261. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts.map +1 -0
  262. package/dist/__tests__/visibility-instances.integration.test.d.ts +2 -0
  263. package/dist/__tests__/visibility-instances.integration.test.d.ts.map +1 -0
  264. package/dist/__tests__/visibility-multi-world.integration.test.d.ts +2 -0
  265. package/dist/__tests__/visibility-multi-world.integration.test.d.ts.map +1 -0
  266. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts +2 -0
  267. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts.map +1 -0
  268. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts +2 -0
  269. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts.map +1 -0
  270. package/dist/__tests__/visibility-public-surface.test-d.d.ts +2 -0
  271. package/dist/__tests__/visibility-public-surface.test-d.d.ts.map +1 -0
  272. package/dist/__tests__/visibility-resolver.unit.test.d.ts +2 -0
  273. package/dist/__tests__/visibility-resolver.unit.test.d.ts.map +1 -0
  274. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts +2 -0
  275. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts.map +1 -0
  276. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts +2 -0
  277. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts.map +1 -0
  278. package/dist/__tests__/vocabulary.unit.test.d.ts +2 -0
  279. package/dist/__tests__/vocabulary.unit.test.d.ts.map +1 -0
  280. package/dist/assembly/backend-contract.d.ts +37 -0
  281. package/dist/assembly/backend-contract.d.ts.map +1 -0
  282. package/dist/assembly/factory.d.ts +207 -0
  283. package/dist/assembly/factory.d.ts.map +1 -0
  284. package/dist/assembly/host-contract.d.ts +84 -0
  285. package/dist/assembly/host-contract.d.ts.map +1 -0
  286. package/dist/assembly/material/assembly.d.ts +21 -0
  287. package/dist/assembly/material/assembly.d.ts.map +1 -0
  288. package/dist/assembly/material/pipeline-projection.d.ts +30 -0
  289. package/dist/assembly/material/pipeline-projection.d.ts.map +1 -0
  290. package/dist/assets/asset-decoders.d.ts +5 -0
  291. package/dist/assets/asset-decoders.d.ts.map +1 -0
  292. package/dist/assets/render-asset-port.d.ts +17 -0
  293. package/dist/assets/render-asset-port.d.ts.map +1 -0
  294. package/dist/assets/resolve-render-asset.d.ts +6 -0
  295. package/dist/assets/resolve-render-asset.d.ts.map +1 -0
  296. package/dist/authoring.d.ts +12 -0
  297. package/dist/authoring.d.ts.map +1 -0
  298. package/dist/authoring.mjs +27 -0
  299. package/dist/authoring.mjs.map +1 -0
  300. package/dist/chunk-CQXZC5XI.mjs +182 -0
  301. package/dist/chunk-CQXZC5XI.mjs.map +1 -0
  302. package/dist/chunk-HCOGPHKS.mjs +93 -0
  303. package/dist/chunk-HCOGPHKS.mjs.map +1 -0
  304. package/dist/chunk-YEJIUW7D.mjs +1152 -0
  305. package/dist/chunk-YEJIUW7D.mjs.map +1 -0
  306. package/dist/cluster-binner.d.ts +152 -0
  307. package/dist/cluster-binner.d.ts.map +1 -0
  308. package/dist/components/__tests__/points-lines-admission.unit.test.d.ts +2 -0
  309. package/dist/components/__tests__/points-lines-admission.unit.test.d.ts.map +1 -0
  310. package/dist/components/__tests__/points-lines-schema.unit.test.d.ts +2 -0
  311. package/dist/components/__tests__/points-lines-schema.unit.test.d.ts.map +1 -0
  312. package/dist/components/__tests__/schema-contract.unit.test.d.ts +2 -0
  313. package/dist/components/__tests__/schema-contract.unit.test.d.ts.map +1 -0
  314. package/dist/components/__tests__/schema-parity.unit.test.d.ts +2 -0
  315. package/dist/components/__tests__/schema-parity.unit.test.d.ts.map +1 -0
  316. package/dist/components/__tests__/visibility-schema.unit.test.d.ts +2 -0
  317. package/dist/components/__tests__/visibility-schema.unit.test.d.ts.map +1 -0
  318. package/dist/components/camera.d.ts +311 -0
  319. package/dist/components/camera.d.ts.map +1 -0
  320. package/dist/components/directional-light.d.ts +76 -0
  321. package/dist/components/directional-light.d.ts.map +1 -0
  322. package/dist/components/glyph-text.d.ts +26 -0
  323. package/dist/components/glyph-text.d.ts.map +1 -0
  324. package/dist/components/index.d.ts +24 -0
  325. package/dist/components/index.d.ts.map +1 -0
  326. package/dist/components/instances.d.ts +41 -0
  327. package/dist/components/instances.d.ts.map +1 -0
  328. package/dist/components/layer.d.ts +34 -0
  329. package/dist/components/layer.d.ts.map +1 -0
  330. package/dist/components/light-helpers.d.ts +53 -0
  331. package/dist/components/light-helpers.d.ts.map +1 -0
  332. package/dist/components/lines.d.ts +5 -0
  333. package/dist/components/lines.d.ts.map +1 -0
  334. package/dist/components/mesh-filter.d.ts +24 -0
  335. package/dist/components/mesh-filter.d.ts.map +1 -0
  336. package/dist/components/mesh-renderer.d.ts +33 -0
  337. package/dist/components/mesh-renderer.d.ts.map +1 -0
  338. package/dist/components/point-light-shadow.d.ts +27 -0
  339. package/dist/components/point-light-shadow.d.ts.map +1 -0
  340. package/dist/components/point-light.d.ts +35 -0
  341. package/dist/components/point-light.d.ts.map +1 -0
  342. package/dist/components/points.d.ts +15 -0
  343. package/dist/components/points.d.ts.map +1 -0
  344. package/dist/components/post-process-params.d.ts +5 -0
  345. package/dist/components/post-process-params.d.ts.map +1 -0
  346. package/dist/components/scene-instance.d.ts +140 -0
  347. package/dist/components/scene-instance.d.ts.map +1 -0
  348. package/dist/components/skybox-background.d.ts +56 -0
  349. package/dist/components/skybox-background.d.ts.map +1 -0
  350. package/dist/components/skylight.d.ts +55 -0
  351. package/dist/components/skylight.d.ts.map +1 -0
  352. package/dist/components/sort-key.d.ts +44 -0
  353. package/dist/components/sort-key.d.ts.map +1 -0
  354. package/dist/components/spot-light.d.ts +81 -0
  355. package/dist/components/spot-light.d.ts.map +1 -0
  356. package/dist/components/sprite-animation.d.ts +74 -0
  357. package/dist/components/sprite-animation.d.ts.map +1 -0
  358. package/dist/components/sprite-instances.d.ts +51 -0
  359. package/dist/components/sprite-instances.d.ts.map +1 -0
  360. package/dist/components/sprite-playback-mode.d.ts +42 -0
  361. package/dist/components/sprite-playback-mode.d.ts.map +1 -0
  362. package/dist/components/sprite-region-override.d.ts +46 -0
  363. package/dist/components/sprite-region-override.d.ts.map +1 -0
  364. package/dist/components/tile-layer.d.ts +106 -0
  365. package/dist/components/tile-layer.d.ts.map +1 -0
  366. package/dist/components/tilemap.d.ts +25 -0
  367. package/dist/components/tilemap.d.ts.map +1 -0
  368. package/dist/components/visibility.d.ts +22 -0
  369. package/dist/components/visibility.d.ts.map +1 -0
  370. package/dist/construct-renderer.d.ts +19 -0
  371. package/dist/construct-renderer.d.ts.map +1 -0
  372. package/dist/construct-renderer.mjs +27462 -0
  373. package/dist/construct-renderer.mjs.map +1 -0
  374. package/dist/debug-draw-glue.d.ts +5 -0
  375. package/dist/debug-draw-glue.d.ts.map +1 -0
  376. package/dist/device/device-scope.d.ts +83 -0
  377. package/dist/device/device-scope.d.ts.map +1 -0
  378. package/dist/device/gpu-residency.d.ts +337 -0
  379. package/dist/device/gpu-residency.d.ts.map +1 -0
  380. package/dist/device/resource-types.d.ts +8 -0
  381. package/dist/device/resource-types.d.ts.map +1 -0
  382. package/dist/engine-metrics.d.ts +23 -0
  383. package/dist/engine-metrics.d.ts.map +1 -0
  384. package/dist/errors/ecs-validation.d.ts +3 -0
  385. package/dist/errors/ecs-validation.d.ts.map +1 -0
  386. package/dist/errors/index.d.ts +4 -0
  387. package/dist/errors/index.d.ts.map +1 -0
  388. package/dist/errors/recover.d.ts +105 -0
  389. package/dist/errors/recover.d.ts.map +1 -0
  390. package/dist/errors/render.d.ts +705 -0
  391. package/dist/errors/render.d.ts.map +1 -0
  392. package/dist/extract/visibility.d.ts +26 -0
  393. package/dist/extract/visibility.d.ts.map +1 -0
  394. package/dist/features/fullscreen.d.ts +19 -0
  395. package/dist/features/fullscreen.d.ts.map +1 -0
  396. package/dist/features/host.d.ts +106 -0
  397. package/dist/features/host.d.ts.map +1 -0
  398. package/dist/features/morph/morph-feature.d.ts +79 -0
  399. package/dist/features/morph/morph-feature.d.ts.map +1 -0
  400. package/dist/features/plan.d.ts +182 -0
  401. package/dist/features/plan.d.ts.map +1 -0
  402. package/dist/features/prepared-gpu-work.d.ts +117 -0
  403. package/dist/features/prepared-gpu-work.d.ts.map +1 -0
  404. package/dist/features/prepared-graphics-store.d.ts +66 -0
  405. package/dist/features/prepared-graphics-store.d.ts.map +1 -0
  406. package/dist/features/prepared-graphics.d.ts +215 -0
  407. package/dist/features/prepared-graphics.d.ts.map +1 -0
  408. package/dist/features/render-graph-compute.d.ts +13 -0
  409. package/dist/features/render-graph-compute.d.ts.map +1 -0
  410. package/dist/features/render-graph-contribution.d.ts +12 -0
  411. package/dist/features/render-graph-contribution.d.ts.map +1 -0
  412. package/dist/features/render-graph-raster.d.ts +38 -0
  413. package/dist/features/render-graph-raster.d.ts.map +1 -0
  414. package/dist/features/render-graph-resources.d.ts +11 -0
  415. package/dist/features/render-graph-resources.d.ts.map +1 -0
  416. package/dist/features/targets.d.ts +32 -0
  417. package/dist/features/targets.d.ts.map +1 -0
  418. package/dist/features/types.d.ts +68 -0
  419. package/dist/features/types.d.ts.map +1 -0
  420. package/dist/features/vocabulary.d.ts +14 -0
  421. package/dist/features/vocabulary.d.ts.map +1 -0
  422. package/dist/fullscreen-post-process-pass.d.ts +157 -0
  423. package/dist/fullscreen-post-process-pass.d.ts.map +1 -0
  424. package/dist/glyph-text-layout-system.d.ts +19 -0
  425. package/dist/glyph-text-layout-system.d.ts.map +1 -0
  426. package/dist/gpu-driven/batch-topology.d.ts +55 -0
  427. package/dist/gpu-driven/batch-topology.d.ts.map +1 -0
  428. package/dist/gpu-driven/production-raster.d.ts +51 -0
  429. package/dist/gpu-driven/production-raster.d.ts.map +1 -0
  430. package/dist/gpu-driven/view-gpu.d.ts +85 -0
  431. package/dist/gpu-driven/view-gpu.d.ts.map +1 -0
  432. package/dist/gpu-resource.d.ts +73 -0
  433. package/dist/gpu-resource.d.ts.map +1 -0
  434. package/dist/gpu-scene-schema.d.ts +78 -0
  435. package/dist/gpu-scene-schema.d.ts.map +1 -0
  436. package/dist/gpu-scene.d.ts +55 -0
  437. package/dist/gpu-scene.d.ts.map +1 -0
  438. package/dist/gpu-stage.d.ts +4 -0
  439. package/dist/gpu-stage.d.ts.map +1 -0
  440. package/dist/gpu-texture-usage.d.ts +6 -0
  441. package/dist/gpu-texture-usage.d.ts.map +1 -0
  442. package/dist/gpu-usage.d.ts +9 -0
  443. package/dist/gpu-usage.d.ts.map +1 -0
  444. package/dist/hdrp-buffers.d.ts +163 -0
  445. package/dist/hdrp-buffers.d.ts.map +1 -0
  446. package/dist/ibl/IblPipelineCache.d.ts +168 -0
  447. package/dist/ibl/IblPipelineCache.d.ts.map +1 -0
  448. package/dist/ibl/skylight-bind-group.d.ts +130 -0
  449. package/dist/ibl/skylight-bind-group.d.ts.map +1 -0
  450. package/dist/index.d.ts +31 -0
  451. package/dist/index.d.ts.map +1 -0
  452. package/dist/index.mjs +169 -0
  453. package/dist/index.mjs.map +1 -0
  454. package/dist/inspection-types.d.ts +72 -0
  455. package/dist/inspection-types.d.ts.map +1 -0
  456. package/dist/instance-buffer-cache.d.ts +56 -0
  457. package/dist/instance-buffer-cache.d.ts.map +1 -0
  458. package/dist/internal.d.ts +2 -0
  459. package/dist/internal.d.ts.map +1 -0
  460. package/dist/internal.mjs +3 -0
  461. package/dist/internal.mjs.map +1 -0
  462. package/dist/lifecycle.d.ts +62 -0
  463. package/dist/lifecycle.d.ts.map +1 -0
  464. package/dist/light-buffer-layout.d.ts +164 -0
  465. package/dist/light-buffer-layout.d.ts.map +1 -0
  466. package/dist/materials.d.ts +47 -0
  467. package/dist/materials.d.ts.map +1 -0
  468. package/dist/mesh-material-bindings.d.ts +43 -0
  469. package/dist/mesh-material-bindings.d.ts.map +1 -0
  470. package/dist/pbr-pipeline.d.ts +301 -0
  471. package/dist/pbr-pipeline.d.ts.map +1 -0
  472. package/dist/pipeline/standard-forward-lane.d.ts +5 -0
  473. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -0
  474. package/dist/pipeline/standard-pipeline.d.ts +31 -0
  475. package/dist/pipeline/standard-pipeline.d.ts.map +1 -0
  476. package/dist/pipeline/standard-profile.d.ts +40 -0
  477. package/dist/pipeline/standard-profile.d.ts.map +1 -0
  478. package/dist/pipeline-builder.d.ts +122 -0
  479. package/dist/pipeline-builder.d.ts.map +1 -0
  480. package/dist/pipeline-spec-types.d.ts +24 -0
  481. package/dist/pipeline-spec-types.d.ts.map +1 -0
  482. package/dist/pipeline-spec.d.ts +367 -0
  483. package/dist/pipeline-spec.d.ts.map +1 -0
  484. package/dist/plugin.d.ts +4 -0
  485. package/dist/plugin.d.ts.map +1 -0
  486. package/dist/points-lines/__tests__/bounds.unit.test.d.ts +2 -0
  487. package/dist/points-lines/__tests__/bounds.unit.test.d.ts.map +1 -0
  488. package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts +2 -0
  489. package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts.map +1 -0
  490. package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts +2 -0
  491. package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts.map +1 -0
  492. package/dist/points-lines/__tests__/inspection.unit.test.d.ts +2 -0
  493. package/dist/points-lines/__tests__/inspection.unit.test.d.ts.map +1 -0
  494. package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts +2 -0
  495. package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts.map +1 -0
  496. package/dist/points-lines/__tests__/points-lines.bench.d.ts +2 -0
  497. package/dist/points-lines/__tests__/points-lines.bench.d.ts.map +1 -0
  498. package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts +2 -0
  499. package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts.map +1 -0
  500. package/dist/points-lines/__tests__/snapshot.unit.test.d.ts +2 -0
  501. package/dist/points-lines/__tests__/snapshot.unit.test.d.ts.map +1 -0
  502. package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts +2 -0
  503. package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts.map +1 -0
  504. package/dist/points-lines/admission.d.ts +36 -0
  505. package/dist/points-lines/admission.d.ts.map +1 -0
  506. package/dist/points-lines/bounds.d.ts +8 -0
  507. package/dist/points-lines/bounds.d.ts.map +1 -0
  508. package/dist/points-lines/expansion-cache.d.ts +28 -0
  509. package/dist/points-lines/expansion-cache.d.ts.map +1 -0
  510. package/dist/points-lines/inspection.d.ts +53 -0
  511. package/dist/points-lines/inspection.d.ts.map +1 -0
  512. package/dist/points-lines/prepare.d.ts +67 -0
  513. package/dist/points-lines/prepare.d.ts.map +1 -0
  514. package/dist/points-lines/record.d.ts +60 -0
  515. package/dist/points-lines/record.d.ts.map +1 -0
  516. package/dist/points-lines/snapshot.d.ts +49 -0
  517. package/dist/points-lines/snapshot.d.ts.map +1 -0
  518. package/dist/post-process-errors.d.ts +182 -0
  519. package/dist/post-process-errors.d.ts.map +1 -0
  520. package/dist/prepare/prepared-graphics-resolver.d.ts +59 -0
  521. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -0
  522. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts +2 -0
  523. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts.map +1 -0
  524. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts +2 -0
  525. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts.map +1 -0
  526. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts +2 -0
  527. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts.map +1 -0
  528. package/dist/record/__tests__/video-texture-view.unit.test.d.ts +2 -0
  529. package/dist/record/__tests__/video-texture-view.unit.test.d.ts.map +1 -0
  530. package/dist/record/frame-lighting.d.ts +121 -0
  531. package/dist/record/frame-lighting.d.ts.map +1 -0
  532. package/dist/record/frame-snapshot.d.ts +429 -0
  533. package/dist/record/frame-snapshot.d.ts.map +1 -0
  534. package/dist/record/frame-targets.d.ts +20 -0
  535. package/dist/record/frame-targets.d.ts.map +1 -0
  536. package/dist/record/frame.d.ts +71 -0
  537. package/dist/record/frame.d.ts.map +1 -0
  538. package/dist/record/helpers.d.ts +102 -0
  539. package/dist/record/helpers.d.ts.map +1 -0
  540. package/dist/record/main-pass-geometry.d.ts +28 -0
  541. package/dist/record/main-pass-geometry.d.ts.map +1 -0
  542. package/dist/record/main-pass-material.d.ts +204 -0
  543. package/dist/record/main-pass-material.d.ts.map +1 -0
  544. package/dist/record/main-pass-sprite-draws.d.ts +43 -0
  545. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -0
  546. package/dist/record/main-pass.d.ts +20 -0
  547. package/dist/record/main-pass.d.ts.map +1 -0
  548. package/dist/record/mesh-ssbo.d.ts +446 -0
  549. package/dist/record/mesh-ssbo.d.ts.map +1 -0
  550. package/dist/record/render-context.d.ts +252 -0
  551. package/dist/record/render-context.d.ts.map +1 -0
  552. package/dist/record/shadow-pass.d.ts +52 -0
  553. package/dist/record/shadow-pass.d.ts.map +1 -0
  554. package/dist/record/skybox-post-pass.d.ts +33 -0
  555. package/dist/record/skybox-post-pass.d.ts.map +1 -0
  556. package/dist/record/typed-frame-graph.d.ts +35 -0
  557. package/dist/record/typed-frame-graph.d.ts.map +1 -0
  558. package/dist/record/view-ubo.d.ts +45 -0
  559. package/dist/record/view-ubo.d.ts.map +1 -0
  560. package/dist/render-contract.d.ts +424 -0
  561. package/dist/render-contract.d.ts.map +1 -0
  562. package/dist/render-data.d.ts +143 -0
  563. package/dist/render-data.d.ts.map +1 -0
  564. package/dist/render-graph-primitives.d.ts +76 -0
  565. package/dist/render-graph-primitives.d.ts.map +1 -0
  566. package/dist/render-pipeline.d.ts +110 -0
  567. package/dist/render-pipeline.d.ts.map +1 -0
  568. package/dist/render-system-extract.d.ts +868 -0
  569. package/dist/render-system-extract.d.ts.map +1 -0
  570. package/dist/render-system.d.ts +125 -0
  571. package/dist/render-system.d.ts.map +1 -0
  572. package/dist/scene/render-scene-types.d.ts +61 -0
  573. package/dist/scene/render-scene-types.d.ts.map +1 -0
  574. package/dist/scene/render-scene.d.ts +112 -0
  575. package/dist/scene/render-scene.d.ts.map +1 -0
  576. package/dist/scene-instances/post-spawn-resolve-joints.d.ts +30 -0
  577. package/dist/scene-instances/post-spawn-resolve-joints.d.ts.map +1 -0
  578. package/dist/shadow-atlas.d.ts +117 -0
  579. package/dist/shadow-atlas.d.ts.map +1 -0
  580. package/dist/ssao-buffers.d.ts +50 -0
  581. package/dist/ssao-buffers.d.ts.map +1 -0
  582. package/dist/ssao-config.d.ts +28 -0
  583. package/dist/ssao-config.d.ts.map +1 -0
  584. package/dist/systems/active-camera.d.ts +53 -0
  585. package/dist/systems/active-camera.d.ts.map +1 -0
  586. package/dist/systems/pass-selector.d.ts +24 -0
  587. package/dist/systems/pass-selector.d.ts.map +1 -0
  588. package/dist/systems/skin-palette-allocator.d.ts +49 -0
  589. package/dist/systems/skin-palette-allocator.d.ts.map +1 -0
  590. package/dist/systems/skin-palette-types.d.ts +14 -0
  591. package/dist/systems/skin-palette-types.d.ts.map +1 -0
  592. package/dist/systems/transparent-sort-config.d.ts +112 -0
  593. package/dist/systems/transparent-sort-config.d.ts.map +1 -0
  594. package/dist/tilemap-chunk-extract-system.d.ts +143 -0
  595. package/dist/tilemap-chunk-extract-system.d.ts.map +1 -0
  596. package/dist/typed-render-graph-primitives.d.ts +57 -0
  597. package/dist/typed-render-graph-primitives.d.ts.map +1 -0
  598. package/dist/typed-shadow-passes.d.ts +11 -0
  599. package/dist/typed-shadow-passes.d.ts.map +1 -0
  600. package/package.json +94 -0
  601. package/src/__tests__/authoring-path.unit.test.ts +23 -0
  602. package/src/__tests__/backend-selection-rhi-capture.test-d.ts +21 -0
  603. package/src/__tests__/callback-inference.test-d.ts +8 -0
  604. package/src/__tests__/cluster-binner.test.ts +272 -0
  605. package/src/__tests__/cluster-grid-default-surface.unit.test.ts +20 -0
  606. package/src/__tests__/construct-renderer-identity.unit.test.ts +23 -0
  607. package/src/__tests__/device-scope-lifecycle.unit.test.ts +151 -0
  608. package/src/__tests__/device-scope-stale-matrix.unit.test.ts +42 -0
  609. package/src/__tests__/direct-extract-consumer-contract.test-d.ts +23 -0
  610. package/src/__tests__/direct-light-snapshot.unit.test.ts +61 -0
  611. package/src/__tests__/factory-contract.integration.test.ts +280 -0
  612. package/src/__tests__/fallback-row-stride-surface.unit.test.ts +15 -0
  613. package/src/__tests__/frame-observation.contract.test.ts +112 -0
  614. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +32 -0
  615. package/src/__tests__/glyph-text-layout-recovery.unit.test.ts +167 -0
  616. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +350 -0
  617. package/src/__tests__/gpu-driven-indirect-raster.browser.test.ts +12 -0
  618. package/src/__tests__/gpu-driven-indirect-raster.dawn.test.ts +16 -0
  619. package/src/__tests__/gpu-driven-production.integration.test.ts +436 -0
  620. package/src/__tests__/gpu-driven-scaling.unit.test.ts +87 -0
  621. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +271 -0
  622. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +290 -0
  623. package/src/__tests__/gpu-driven-view-reference.ts +111 -0
  624. package/src/__tests__/gpu-driven-view.browser.test.ts +30 -0
  625. package/src/__tests__/gpu-driven-view.dawn.test.ts +28 -0
  626. package/src/__tests__/gpu-driven-view.unit.test.ts +199 -0
  627. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +59 -0
  628. package/src/__tests__/gpu-scene-render-graph-gpu.ts +308 -0
  629. package/src/__tests__/gpu-scene-render-graph.browser.test.ts +19 -0
  630. package/src/__tests__/gpu-scene-render-graph.dawn.test.ts +19 -0
  631. package/src/__tests__/gpu-scene-schema.unit.test.ts +16 -0
  632. package/src/__tests__/gpu-scene.dawn.test.ts +205 -0
  633. package/src/__tests__/gpu-scene.unit.test.ts +147 -0
  634. package/src/__tests__/ibl/face-uniforms.unit.test.ts +46 -0
  635. package/src/__tests__/infinite-grid-no-vertex-probe.unit.test.ts +92 -0
  636. package/src/__tests__/injection-kind-owner.test-d.ts +14 -0
  637. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +728 -0
  638. package/src/__tests__/light-buffer-layout.unit.test.ts +40 -0
  639. package/src/__tests__/material-contract-inventory.unit.test.ts +24 -0
  640. package/src/__tests__/material-cooked-projection.unit.test.ts +150 -0
  641. package/src/__tests__/material-snapshot-mutation.integration.test.ts +53 -0
  642. package/src/__tests__/material-static-dynamic-route.unit.test.ts +94 -0
  643. package/src/__tests__/material-stride-surface.unit.test.ts +32 -0
  644. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +106 -0
  645. package/src/__tests__/mesh-material-bindings.unit.test.ts +89 -0
  646. package/src/__tests__/mesh-stride-surface.unit.test.ts +16 -0
  647. package/src/__tests__/morph-culling-reentry.dawn.test.ts +157 -0
  648. package/src/__tests__/morph-feature-gpu-work.integration.test.ts +80 -0
  649. package/src/__tests__/morph-feature-plan.unit.test.ts +53 -0
  650. package/src/__tests__/morph-visual-evidence.integration.test.ts +80 -0
  651. package/src/__tests__/nineslice-handle-surface.unit.test.ts +19 -0
  652. package/src/__tests__/post-process-error-policy-owner.unit.test.ts +201 -0
  653. package/src/__tests__/prepared-buffer-kind-owner.test-d.ts +29 -0
  654. package/src/__tests__/prepared-graphics-capability.unit.test.ts +65 -0
  655. package/src/__tests__/prepared-graphics-generation.unit.test.ts +161 -0
  656. package/src/__tests__/prepared-graphics-lifecycle.unit.test.ts +138 -0
  657. package/src/__tests__/prepared-graphics-pipeline-warmup.unit.test.ts +29 -0
  658. package/src/__tests__/prepared-graphics-resolver.unit.test.ts +285 -0
  659. package/src/__tests__/prepared-graphics-snapshot.unit.test.ts +105 -0
  660. package/src/__tests__/prepared-graphics-store.unit.test.ts +154 -0
  661. package/src/__tests__/prepared-graphics-validation.unit.test.ts +176 -0
  662. package/src/__tests__/profiler-default-off.test.ts +22 -0
  663. package/src/__tests__/profiler-phase-catalog.test.ts +66 -0
  664. package/src/__tests__/profiler-phase-integration.test.ts +62 -0
  665. package/src/__tests__/profiler-phase-token.test.ts +79 -0
  666. package/src/__tests__/public-surface.test-d.ts +94 -0
  667. package/src/__tests__/recover-error-policy-owner.unit.test.ts +107 -0
  668. package/src/__tests__/render-error-code-owner.test-d.ts +116 -0
  669. package/src/__tests__/render-error-detail-ssot.test-d.ts +139 -0
  670. package/src/__tests__/render-error-exhaustive.test-d.ts +110 -0
  671. package/src/__tests__/render-feature-assembly.test-d.ts +43 -0
  672. package/src/__tests__/render-feature-context.test-d.ts +57 -0
  673. package/src/__tests__/render-feature-contract.test-d.ts +49 -0
  674. package/src/__tests__/render-feature-diagnostics.unit.test.ts +149 -0
  675. package/src/__tests__/render-feature-docs.unit.test.ts +89 -0
  676. package/src/__tests__/render-feature-errors.unit.test.ts +47 -0
  677. package/src/__tests__/render-feature-gpu-work.integration.test.ts +316 -0
  678. package/src/__tests__/render-feature-plan.test-d.ts +161 -0
  679. package/src/__tests__/render-feature-plan.unit.test.ts +170 -0
  680. package/src/__tests__/render-feature-prepared-diagnostics.unit.test.ts +90 -0
  681. package/src/__tests__/render-feature-prepared-errors.test-d.ts +79 -0
  682. package/src/__tests__/render-feature-prepared-graphics-docs.unit.test.ts +80 -0
  683. package/src/__tests__/render-feature-prepared-graphics-isolation.unit.test.ts +72 -0
  684. package/src/__tests__/render-feature-prepared-graphics-negative.test-d.ts +36 -0
  685. package/src/__tests__/render-feature-prepared-graphics.test-d.ts +74 -0
  686. package/src/__tests__/render-feature-prepared-graphics.unit.test.ts +121 -0
  687. package/src/__tests__/render-feature-public-surface.test-d.ts +57 -0
  688. package/src/__tests__/render-feature-retry.unit.test.ts +87 -0
  689. package/src/__tests__/render-feature-scheduling.unit.test.ts +110 -0
  690. package/src/__tests__/render-feature-stage-failed-policy-owner.unit.test.ts +137 -0
  691. package/src/__tests__/render-feature-stage-fault-recovery.unit.test.ts +146 -0
  692. package/src/__tests__/render-feature-visibility-context.test-d.ts +33 -0
  693. package/src/__tests__/render-feature-visibility-context.unit.test.ts +37 -0
  694. package/src/__tests__/render-feature-zero-work.unit.test.ts +76 -0
  695. package/src/__tests__/render-graph-compute-raster-gpu.ts +342 -0
  696. package/src/__tests__/render-graph-compute-raster.browser.test.ts +16 -0
  697. package/src/__tests__/render-graph-compute-raster.dawn.test.ts +22 -0
  698. package/src/__tests__/render-graph-hzb-gpu.ts +239 -0
  699. package/src/__tests__/render-graph-hzb.browser.test.ts +16 -0
  700. package/src/__tests__/render-graph-hzb.dawn.test.ts +23 -0
  701. package/src/__tests__/render-graph-primitives.unit.test.ts +22 -0
  702. package/src/__tests__/render-graph-storage-indirect-gpu.ts +162 -0
  703. package/src/__tests__/render-graph-storage-indirect.browser.test.ts +21 -0
  704. package/src/__tests__/render-graph-storage-indirect.dawn.test.ts +28 -0
  705. package/src/__tests__/render-scene-projection.unit.test.ts +168 -0
  706. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +121 -0
  707. package/src/__tests__/renderer-lifecycle.integration.test.ts +58 -0
  708. package/src/__tests__/rhi-backend-package-boundary.unit.test.ts +11 -0
  709. package/src/__tests__/scriptable-pack-consumer.test-d.ts +14 -0
  710. package/src/__tests__/shader-stage-surface.unit.test.ts +43 -0
  711. package/src/__tests__/ssao-config.unit.test.ts +36 -0
  712. package/src/__tests__/ssao-kernel-surface.unit.test.ts +14 -0
  713. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +28 -0
  714. package/src/__tests__/standard-descriptors.test-d.ts +22 -0
  715. package/src/__tests__/standard-pipeline.dawn.test.ts +61 -0
  716. package/src/__tests__/standard-pipeline.integration.test.ts +124 -0
  717. package/src/__tests__/standard-profile-oracle.unit.test.ts +62 -0
  718. package/src/__tests__/surface-configuration.unit.test.ts +91 -0
  719. package/src/__tests__/texture-usage-surface.unit.test.ts +58 -0
  720. package/src/__tests__/typed-pipeline-topology.unit.test.ts +223 -0
  721. package/src/__tests__/urp-pipeline-targets.unit.test.ts +42 -0
  722. package/src/__tests__/urp-pipeline.unit.test.ts +14 -0
  723. package/src/__tests__/vertex-color-pipeline.unit.test.ts +132 -0
  724. package/src/__tests__/vertex-layout-consumer.unit.test.ts +25 -0
  725. package/src/__tests__/visibility-diagnostics.integration.test.ts +62 -0
  726. package/src/__tests__/visibility-extract.integration.test.ts +98 -0
  727. package/src/__tests__/visibility-extract.perf.test.ts +130 -0
  728. package/src/__tests__/visibility-feature-dedup.integration.test.ts +55 -0
  729. package/src/__tests__/visibility-hidden-report.unit.test.ts +36 -0
  730. package/src/__tests__/visibility-instances.integration.test.ts +46 -0
  731. package/src/__tests__/visibility-multi-world.integration.test.ts +86 -0
  732. package/src/__tests__/visibility-producer-matrix.integration.test.ts +168 -0
  733. package/src/__tests__/visibility-producer-matrix.unit.test.ts +96 -0
  734. package/src/__tests__/visibility-public-surface.test-d.ts +27 -0
  735. package/src/__tests__/visibility-resolver.unit.test.ts +85 -0
  736. package/src/__tests__/visibility-resource-short-circuit.unit.test.ts +80 -0
  737. package/src/__tests__/visibility-snapshot-contract.unit.test.ts +60 -0
  738. package/src/__tests__/vocabulary.unit.test.ts +21 -0
  739. package/src/assembly/backend-contract.ts +57 -0
  740. package/src/assembly/factory.ts +8130 -0
  741. package/src/assembly/host-contract.ts +101 -0
  742. package/src/assembly/material/assembly.ts +48 -0
  743. package/src/assembly/material/pipeline-projection.ts +63 -0
  744. package/src/assets/asset-decoders.ts +158 -0
  745. package/src/assets/render-asset-port.ts +44 -0
  746. package/src/assets/resolve-render-asset.ts +13 -0
  747. package/src/authoring.ts +17 -0
  748. package/src/cluster-binner.ts +700 -0
  749. package/src/components/__tests__/points-lines-admission.unit.test.ts +219 -0
  750. package/src/components/__tests__/points-lines-schema.unit.test.ts +56 -0
  751. package/src/components/__tests__/schema-contract.unit.test.ts +10 -0
  752. package/src/components/__tests__/schema-parity.unit.test.ts +25 -0
  753. package/src/components/__tests__/visibility-schema.unit.test.ts +35 -0
  754. package/src/components/camera.ts +512 -0
  755. package/src/components/directional-light.ts +120 -0
  756. package/src/components/glyph-text.ts +64 -0
  757. package/src/components/index.ts +54 -0
  758. package/src/components/instances.ts +206 -0
  759. package/src/components/layer.ts +69 -0
  760. package/src/components/light-helpers.ts +188 -0
  761. package/src/components/lines.ts +18 -0
  762. package/src/components/mesh-filter.ts +60 -0
  763. package/src/components/mesh-renderer.ts +61 -0
  764. package/src/components/point-light-shadow.ts +43 -0
  765. package/src/components/point-light.ts +65 -0
  766. package/src/components/points.ts +40 -0
  767. package/src/components/post-process-params.ts +35 -0
  768. package/src/components/scene-instance.ts +193 -0
  769. package/src/components/skybox-background.ts +103 -0
  770. package/src/components/skylight.ts +97 -0
  771. package/src/components/sort-key.ts +75 -0
  772. package/src/components/spot-light.ts +124 -0
  773. package/src/components/sprite-animation.ts +168 -0
  774. package/src/components/sprite-instances.ts +179 -0
  775. package/src/components/sprite-playback-mode.ts +79 -0
  776. package/src/components/sprite-region-override.ts +105 -0
  777. package/src/components/tile-layer.ts +167 -0
  778. package/src/components/tilemap.ts +48 -0
  779. package/src/components/visibility.ts +53 -0
  780. package/src/construct-renderer.ts +67 -0
  781. package/src/debug-draw-glue.ts +48 -0
  782. package/src/device/device-scope.ts +306 -0
  783. package/src/device/gpu-residency.ts +1822 -0
  784. package/src/device/resource-types.ts +20 -0
  785. package/src/engine-metrics.ts +82 -0
  786. package/src/errors/ecs-validation.ts +16 -0
  787. package/src/errors/index.ts +3 -0
  788. package/src/errors/recover.ts +161 -0
  789. package/src/errors/render.ts +1284 -0
  790. package/src/extract/visibility.ts +120 -0
  791. package/src/features/fullscreen.ts +46 -0
  792. package/src/features/host.ts +1363 -0
  793. package/src/features/morph/morph-feature.ts +377 -0
  794. package/src/features/plan.ts +447 -0
  795. package/src/features/prepared-gpu-work.ts +959 -0
  796. package/src/features/prepared-graphics-store.ts +449 -0
  797. package/src/features/prepared-graphics.ts +420 -0
  798. package/src/features/render-graph-compute.ts +69 -0
  799. package/src/features/render-graph-contribution.ts +75 -0
  800. package/src/features/render-graph-raster.ts +332 -0
  801. package/src/features/render-graph-resources.ts +38 -0
  802. package/src/features/targets.ts +70 -0
  803. package/src/features/types.ts +103 -0
  804. package/src/features/vocabulary.ts +24 -0
  805. package/src/fullscreen-post-process-pass.ts +363 -0
  806. package/src/glyph-text-layout-system.ts +421 -0
  807. package/src/gpu-driven/batch-topology.ts +245 -0
  808. package/src/gpu-driven/production-raster.ts +695 -0
  809. package/src/gpu-driven/view-gpu.ts +703 -0
  810. package/src/gpu-resource.ts +159 -0
  811. package/src/gpu-scene-schema.ts +136 -0
  812. package/src/gpu-scene.ts +722 -0
  813. package/src/gpu-stage.ts +9 -0
  814. package/src/gpu-texture-usage.ts +12 -0
  815. package/src/gpu-usage.ts +14 -0
  816. package/src/hdrp-buffers.ts +480 -0
  817. package/src/ibl/IblPipelineCache.ts +1006 -0
  818. package/src/ibl/skylight-bind-group.ts +513 -0
  819. package/src/index.ts +129 -0
  820. package/src/inspection-types.ts +80 -0
  821. package/src/instance-buffer-cache.ts +95 -0
  822. package/src/internal.ts +9 -0
  823. package/src/lifecycle.ts +168 -0
  824. package/src/light-buffer-layout.ts +346 -0
  825. package/src/materials.ts +214 -0
  826. package/src/mesh-material-bindings.ts +103 -0
  827. package/src/pbr-pipeline.ts +1137 -0
  828. package/src/pipeline/standard-forward-lane.ts +229 -0
  829. package/src/pipeline/standard-pipeline.ts +555 -0
  830. package/src/pipeline/standard-profile.ts +65 -0
  831. package/src/pipeline-builder.ts +382 -0
  832. package/src/pipeline-spec-types.ts +28 -0
  833. package/src/pipeline-spec.ts +1231 -0
  834. package/src/plugin.ts +69 -0
  835. package/src/points-lines/__tests__/bounds.unit.test.ts +21 -0
  836. package/src/points-lines/__tests__/cache-recovery.unit.test.ts +157 -0
  837. package/src/points-lines/__tests__/inspection-lanes.integration.test.ts +146 -0
  838. package/src/points-lines/__tests__/inspection.unit.test.ts +173 -0
  839. package/src/points-lines/__tests__/lane-structural.integration.test.ts +122 -0
  840. package/src/points-lines/__tests__/points-lines.bench.ts +400 -0
  841. package/src/points-lines/__tests__/raster-lane.integration.test.ts +44 -0
  842. package/src/points-lines/__tests__/snapshot.unit.test.ts +101 -0
  843. package/src/points-lines/__tests__/view-ubo.unit.test.ts +73 -0
  844. package/src/points-lines/admission.ts +238 -0
  845. package/src/points-lines/bounds.ts +23 -0
  846. package/src/points-lines/expansion-cache.ts +215 -0
  847. package/src/points-lines/inspection.ts +97 -0
  848. package/src/points-lines/prepare.ts +177 -0
  849. package/src/points-lines/record.ts +125 -0
  850. package/src/points-lines/snapshot.ts +130 -0
  851. package/src/post-process-errors.ts +302 -0
  852. package/src/prepare/prepared-graphics-resolver.ts +456 -0
  853. package/src/record/__tests__/material-bg-cache.unit.test.ts +41 -0
  854. package/src/record/__tests__/material-slot-plan.unit.test.ts +44 -0
  855. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +41 -0
  856. package/src/record/__tests__/video-texture-view.unit.test.ts +90 -0
  857. package/src/record/frame-lighting.ts +1074 -0
  858. package/src/record/frame-snapshot.ts +500 -0
  859. package/src/record/frame-targets.ts +137 -0
  860. package/src/record/frame.ts +1598 -0
  861. package/src/record/helpers.ts +284 -0
  862. package/src/record/main-pass-geometry.ts +1065 -0
  863. package/src/record/main-pass-material.ts +1043 -0
  864. package/src/record/main-pass-sprite-draws.ts +1137 -0
  865. package/src/record/main-pass.ts +610 -0
  866. package/src/record/mesh-ssbo.ts +885 -0
  867. package/src/record/render-context.ts +384 -0
  868. package/src/record/shadow-pass.ts +698 -0
  869. package/src/record/skybox-post-pass.ts +593 -0
  870. package/src/record/typed-frame-graph.ts +461 -0
  871. package/src/record/view-ubo.ts +222 -0
  872. package/src/render-contract.ts +582 -0
  873. package/src/render-data.ts +385 -0
  874. package/src/render-graph-primitives.ts +811 -0
  875. package/src/render-pipeline.ts +259 -0
  876. package/src/render-system-extract.ts +4585 -0
  877. package/src/render-system.ts +1933 -0
  878. package/src/scene/render-scene-types.ts +67 -0
  879. package/src/scene/render-scene.ts +1087 -0
  880. package/src/scene-instances/post-spawn-resolve-joints.ts +165 -0
  881. package/src/shadow-atlas.ts +244 -0
  882. package/src/ssao-buffers.ts +334 -0
  883. package/src/ssao-config.ts +61 -0
  884. package/src/systems/active-camera.ts +116 -0
  885. package/src/systems/pass-selector.ts +49 -0
  886. package/src/systems/skin-palette-allocator.ts +251 -0
  887. package/src/systems/skin-palette-types.ts +14 -0
  888. package/src/systems/transparent-sort-config.ts +233 -0
  889. package/src/tilemap-chunk-extract-system.ts +1290 -0
  890. package/src/typed-render-graph-primitives.ts +541 -0
  891. package/src/typed-shadow-passes.ts +165 -0
@@ -0,0 +1,811 @@
1
+ // @forgeax/engine-render - low-level record/encode graph primitives.
2
+ //
3
+ // Standard owns pass topology through typed-render-graph-primitives. This module
4
+ // retains the RHI-facing record helpers used by that typed graph: SSAO record
5
+ // closures, fullscreen dispatch, depth resolution, and encoding.
6
+ //
7
+ // Public graph assembly does not depend on legacy add* wrappers.
8
+ import { mat4 } from '@forgeax/engine-math';
9
+ import type { ResolveContext } from '@forgeax/engine-render-graph';
10
+ import type {
11
+ Buffer,
12
+ RhiRenderPassEncoder,
13
+ Sampler,
14
+ Texture,
15
+ TextureFormat,
16
+ TextureView,
17
+ } from '@forgeax/engine-rhi';
18
+ import {
19
+ buildFullscreenPostProcessPass,
20
+ createFullscreenBindGroup,
21
+ entryHasDepthRead,
22
+ } from './fullscreen-post-process-pass';
23
+ import { buildBeginRenderPassDescriptor } from './pipeline-spec';
24
+ import { PostProcessError } from './post-process-errors';
25
+ import { computeProjectionMatrix, computeViewMatrix } from './record/helpers';
26
+ import { getOrCreateFromChain } from './record/mesh-ssbo';
27
+ import type { _InternalRenderPipelineContext } from './record/render-context';
28
+ import { recordFxaaPass } from './record/skybox-post-pass';
29
+ import type { RenderPipelineContext } from './render-contract';
30
+ import { getOrCreateSsaoBuffers, getOrCreateSsaoFallbackTexture } from './ssao-buffers';
31
+ import { getSsaoParameters } from './ssao-config';
32
+
33
+ type DepthResolutionContext = Pick<_InternalRenderPipelineContext, 'runtime'> & {
34
+ readonly frameState: {
35
+ readonly perFrameGraph?: {
36
+ readonly getColorTargetTexture: (key: string) => Texture | undefined;
37
+ } | null;
38
+ };
39
+ };
40
+
41
+ type RenderGraphRecordContext = _InternalRenderPipelineContext & {
42
+ readonly frameState: _InternalRenderPipelineContext['frameState'] & {
43
+ readonly perFrameGraph?: {
44
+ readonly getColorTargetDescriptor: (
45
+ key: string,
46
+ ) => { readonly format: TextureFormat } | undefined;
47
+ readonly getColorTargetView: (key: string) => TextureView | undefined;
48
+ readonly getColorTargetTexture: (key: string) => Texture | undefined;
49
+ } | null;
50
+ };
51
+ };
52
+
53
+ function requireRenderGraphRecordContext(ctx: RenderPipelineContext): RenderGraphRecordContext {
54
+ if (!('frameState' in ctx) || !('bindGroupCounts' in ctx) || !('geometryDepthKey' in ctx)) {
55
+ throw new Error('typed render graph frame lacks the built-in record context');
56
+ }
57
+ return ctx as RenderGraphRecordContext;
58
+ }
59
+
60
+ /**
61
+ * Resolve a depth-only view of a graph color target by key.
62
+ *
63
+ * On dawn the BindGroup validation rejects a default-view (aspect=all on a
64
+ * depth+stencil texture) with "Multiple aspects (Depth|Stencil) selected".
65
+ * A separate createTextureView({aspect:'depth-only'}) is required.
66
+ *
67
+ * @param internals - internal render pipeline context
68
+ * @param key - graph color-target key to resolve depth from
69
+ * @param label - debug label for the depth-only TextureView
70
+ * @returns a depth-only TextureView, or null if the graph / texture is absent
71
+ * or creation fires a structured error
72
+ */
73
+ export function resolveDepthOnlyView(
74
+ internals: DepthResolutionContext,
75
+ key: string,
76
+ label: string,
77
+ preferredKey?: string | null,
78
+ ): TextureView | null {
79
+ const graph = internals.frameState.perFrameGraph;
80
+ if (graph === null || graph === undefined) return null;
81
+ const preferredTexture =
82
+ preferredKey === null || preferredKey === undefined
83
+ ? undefined
84
+ : graph.getColorTargetTexture(preferredKey);
85
+ const tex = preferredTexture ?? graph.getColorTargetTexture(key);
86
+ if (tex === undefined) return null;
87
+ const res = internals.runtime.device.createTextureView(tex as never, {
88
+ label,
89
+ dimension: '2d',
90
+ aspect: 'depth-only',
91
+ baseMipLevel: 0,
92
+ mipLevelCount: 1,
93
+ baseArrayLayer: 0,
94
+ arrayLayerCount: 1,
95
+ });
96
+ if (!res.ok) {
97
+ internals.runtime.errorRegistry.fire(res.error);
98
+ return null;
99
+ }
100
+ return res.value;
101
+ }
102
+
103
+ /**
104
+ * Resolve a depth-only view of the graph's hdrDepth texture.
105
+ *
106
+ * Thin delegate to {@link resolveDepthOnlyView} (plan-strategy D-5: extract
107
+ * the shared depth-only view helper, SSAO delegates). Behaviour is byte-identical
108
+ * to the pre-extraction inline version. The SSAO BGL / bindings / sampler are
109
+ * untouched (OOS-4).
110
+ */
111
+ function resolveHdrDepthDepthOnlyView(
112
+ internals: DepthResolutionContext,
113
+ hdrDepthKey: string,
114
+ ): TextureView | null {
115
+ return resolveDepthOnlyView(internals, hdrDepthKey, 'ssao-hdr-depth-only-view');
116
+ }
117
+
118
+ function ensureSsaoRecordCompanions(internals: _InternalRenderPipelineContext): {
119
+ filteringSampler: Sampler;
120
+ depthSampler: Sampler;
121
+ fallbackRawView: TextureView;
122
+ } | null {
123
+ const pp = internals.pipelineState.perPassResources;
124
+ if (
125
+ pp.ssaoFilteringSampler !== null &&
126
+ pp.ssaoDepthSampler !== null &&
127
+ pp.ssaoFallbackRawView !== null
128
+ ) {
129
+ return {
130
+ filteringSampler: pp.ssaoFilteringSampler,
131
+ depthSampler: pp.ssaoDepthSampler,
132
+ fallbackRawView: pp.ssaoFallbackRawView as TextureView,
133
+ };
134
+ }
135
+
136
+ const device = internals.runtime.device;
137
+
138
+ if (pp.ssaoFilteringSampler === null) {
139
+ // Despite the field name, this sampler is non-filtering (NEAREST):
140
+ // bindings 3 (noise sampler) + 8 (ssaoSampler) pair with unfilterable
141
+ // float textures (rgba32float noise / r8unorm ssaoRaw on dawn without
142
+ // float32-filterable). The "filtering" label in the field name predates
143
+ // the sampler-type split; the resource itself is non-filtering.
144
+ const res = device.createSampler({
145
+ label: 'ssao-noise-sampler',
146
+ magFilter: 'nearest',
147
+ minFilter: 'nearest',
148
+ mipmapFilter: 'nearest',
149
+ addressModeU: 'repeat',
150
+ addressModeV: 'repeat',
151
+ });
152
+ if (!res.ok) {
153
+ internals.runtime.errorRegistry.fire(res.error);
154
+ return null;
155
+ }
156
+ pp.ssaoFilteringSampler = res.value;
157
+ }
158
+
159
+ if (pp.ssaoDepthSampler === null) {
160
+ const res = device.createSampler({
161
+ label: 'ssao-depth-sampler',
162
+ magFilter: 'nearest',
163
+ minFilter: 'nearest',
164
+ mipmapFilter: 'nearest',
165
+ addressModeU: 'clamp-to-edge',
166
+ addressModeV: 'clamp-to-edge',
167
+ });
168
+ if (!res.ok) {
169
+ internals.runtime.errorRegistry.fire(res.error);
170
+ return null;
171
+ }
172
+ pp.ssaoDepthSampler = res.value;
173
+ }
174
+
175
+ if (pp.ssaoFallbackRawView === null) {
176
+ const fb = getOrCreateSsaoFallbackTexture(internals.runtime);
177
+ if (fb === null) return null;
178
+ pp.ssaoFallbackRawView = fb.view;
179
+ }
180
+
181
+ return {
182
+ filteringSampler: pp.ssaoFilteringSampler,
183
+ depthSampler: pp.ssaoDepthSampler,
184
+ fallbackRawView: pp.ssaoFallbackRawView as TextureView,
185
+ };
186
+ }
187
+
188
+ /**
189
+ * Pack the 256B SSAO uniform payload from the camera + config.ssao.
190
+ *
191
+ * Layout (plan-strategy D-1 + D-C):
192
+ * floats [0..15] view mat4
193
+ * floats [16..31] projection mat4
194
+ * floats [32..47] inverseProjection mat4
195
+ * floats [48..51] intensityPad vec4 (x=intensity, y=radius, z=bias)
196
+ * floats [52..63] trailing zero-pad to round to 256B / 64f UBO alignment.
197
+ */
198
+ function buildSsaoUniformPayload(internals: _InternalRenderPipelineContext): Float32Array {
199
+ const { camera, frameState } = internals;
200
+ const sProj = computeProjectionMatrix(camera);
201
+ const sView = computeViewMatrix(camera);
202
+ const invProj = mat4.create();
203
+ mat4.invert(invProj, sProj);
204
+
205
+ const out = new Float32Array(64);
206
+ out.set(sView, 0);
207
+ out.set(sProj, 16);
208
+ out.set(invProj, 32);
209
+
210
+ const ssaoConfig = frameState.installedPipelineConfig?.ssao;
211
+ const parameters = getSsaoParameters(
212
+ ssaoConfig !== undefined && ssaoConfig.enabled === true ? ssaoConfig : undefined,
213
+ );
214
+ out[48] = parameters.intensity;
215
+ out[49] = parameters.radius;
216
+ out[50] = parameters.bias;
217
+ return out;
218
+ }
219
+
220
+ /**
221
+ * recordSsaoCalcPass — fullscreen SSAO occlusion calculation (M8 / w38).
222
+ *
223
+ * Resolves the graph-owned half-resolution ssaoRaw color target, writes the
224
+ * 256 B SSAO uniform (view/proj/invProj/intensity) once per frame, then runs
225
+ * a 3-vertex fullscreen-triangle draw with fs_ssao_calc.
226
+ *
227
+ * Bind group entries (must match the 9-entry SSAO BGL declared in
228
+ * createRenderer.ts; see hdrp-ssao.wgsl §BGL layout):
229
+ * 0 ssao_uniform UBO 5 hdr_depth view
230
+ * 1 ssao_kernel UBO 6 ssao_depth_sampler (non-filtering)
231
+ * 2 ssao_noise_texture 7 fallback ssaoRaw view (calc never samples)
232
+ * 3 ssao_noise_sampler 8 ssaoSampler (unused by calc, BGL slot)
233
+ * 4 gbuffer_normal view
234
+ *
235
+ * Skips with no GPU work when the optional SSAO pipelines are unavailable
236
+ * (manifest without hdrp-ssao.wgsl), when the dedicated BGL is null, when
237
+ * the SSAO buffers fail to allocate, or when the graph cannot resolve the
238
+ * required views.
239
+ */
240
+ export interface SsaoCalcPassViews {
241
+ readonly output: TextureView;
242
+ readonly normal: TextureView;
243
+ readonly depth: TextureView;
244
+ readonly depthCacheKey: TextureView;
245
+ }
246
+
247
+ export function recordSsaoCalcPass(
248
+ _c: _InternalRenderPipelineContext,
249
+ resolveCtx?: ResolveContext,
250
+ ssaoRawKey?: string,
251
+ gbuf0Key?: string,
252
+ hdrDepthKey?: string,
253
+ graphPass?: RhiRenderPassEncoder,
254
+ graphViews?: SsaoCalcPassViews,
255
+ ): void {
256
+ const { runtime, pipelineState, encoder } = _c;
257
+ const pp = pipelineState.perPassResources;
258
+
259
+ if (pp.ssaoCalcPipeline === null || pp.ssaoBgl === null) return;
260
+ if (graphViews === undefined && (resolveCtx === undefined || ssaoRawKey === undefined)) return;
261
+
262
+ const ssaoRawView =
263
+ graphViews?.output ?? (resolveCtx?.resolve(ssaoRawKey as string) as TextureView | undefined);
264
+ const gbuf0View =
265
+ graphViews?.normal ??
266
+ (gbuf0Key !== undefined
267
+ ? (resolveCtx?.resolve(gbuf0Key) as TextureView | undefined)
268
+ : undefined);
269
+ if (!ssaoRawView || !gbuf0View || (graphViews === undefined && hdrDepthKey === undefined)) return;
270
+
271
+ // hdrDepth needs a depth-only view (BGL binding 5 sampleType=depth);
272
+ // resolveCtx returns a default all-aspects view that dawn rejects when
273
+ // paired with a depth sampler.
274
+ const hdrDepthView = graphViews?.depth ?? resolveHdrDepthDepthOnlyView(_c, hdrDepthKey as string);
275
+ if (hdrDepthView === null) return;
276
+
277
+ // Cache key: the graph's pooled hdrDepth view (stable object per size, new
278
+ // object on resize). The depth-only view above is created fresh every frame
279
+ // so it cannot key the cache; the pooled all-aspects view co-varies with it
280
+ // (both are views of the same transient hdrDepth texture) and changes exactly
281
+ // on resize. Used only as a WeakMap key, never bound.
282
+ const hdrDepthPooledView =
283
+ graphViews?.depthCacheKey ??
284
+ (resolveCtx?.resolve(hdrDepthKey as string) as TextureView | undefined);
285
+ if (hdrDepthPooledView === undefined) return;
286
+
287
+ const ssaoBufs = getOrCreateSsaoBuffers(runtime);
288
+ if (ssaoBufs === null) return;
289
+
290
+ const noiseViewRes = runtime.device.createTextureView(ssaoBufs.noiseTexture, {
291
+ label: 'hdrp-ssao-noise-view',
292
+ format: 'rgba32float',
293
+ dimension: '2d',
294
+ aspect: 'all',
295
+ baseMipLevel: 0,
296
+ mipLevelCount: 1,
297
+ baseArrayLayer: 0,
298
+ arrayLayerCount: 1,
299
+ });
300
+ if (!noiseViewRes.ok) {
301
+ runtime.errorRegistry.fire(noiseViewRes.error);
302
+ return;
303
+ }
304
+
305
+ const companions = ensureSsaoRecordCompanions(_c);
306
+ if (companions === null) return;
307
+
308
+ // Per-frame uniform write (D-C: view+proj+invProj+intensity at one queue
309
+ // call). 256 B Float32Array (64 f32) lands in ssao_uniform UBO offset 0.
310
+ const payload = buildSsaoUniformPayload(_c);
311
+ const writeRes = runtime.device.queue.writeBuffer(ssaoBufs.uniformBuffer, 0, payload);
312
+ if (!writeRes.ok) {
313
+ runtime.errorRegistry.fire(writeRes.error);
314
+ return;
315
+ }
316
+
317
+ // Identity-cached bind group: 9 entries mirror the BGL declared in
318
+ // createRenderer. Keyed on the graph-pooled gbuf0 + hdrDepth views (both
319
+ // retire + reallocate on resize), so the WeakMap misses after a resize and
320
+ // rebuilds against the live textures. The noise / depth-only views bound
321
+ // below are created fresh each frame but back stable textures; keying on the
322
+ // resize-varying graph views is what makes invalidation correct. Replaces
323
+ // the prior `=== null` slot cache that submitted a destroyed gbuf0/hdrDepth
324
+ // after resize.
325
+ const ssaoBgl = pp.ssaoBgl;
326
+ const bindGroup = getOrCreateFromChain(
327
+ _c.frameState.postProcessBgCache,
328
+ [gbuf0View, hdrDepthPooledView],
329
+ 'ssao-calc',
330
+ () => {
331
+ const bgRes = runtime.device.createBindGroup({
332
+ label: 'ssao-calc-bg',
333
+ layout: ssaoBgl,
334
+ entries: [
335
+ { binding: 0, resource: { kind: 'buffer', value: { buffer: ssaoBufs.uniformBuffer } } },
336
+ { binding: 1, resource: { kind: 'buffer', value: { buffer: ssaoBufs.kernelBuffer } } },
337
+ { binding: 2, resource: { kind: 'textureView', value: noiseViewRes.value } },
338
+ {
339
+ binding: 3,
340
+ resource: { kind: 'sampler', value: companions.filteringSampler },
341
+ },
342
+ { binding: 4, resource: { kind: 'textureView', value: gbuf0View } },
343
+ { binding: 5, resource: { kind: 'textureView', value: hdrDepthView } },
344
+ { binding: 6, resource: { kind: 'sampler', value: companions.depthSampler } },
345
+ { binding: 7, resource: { kind: 'textureView', value: companions.fallbackRawView } },
346
+ { binding: 8, resource: { kind: 'sampler', value: companions.filteringSampler } },
347
+ ],
348
+ });
349
+ if (!bgRes.ok) throw bgRes.error;
350
+ return bgRes.value;
351
+ },
352
+ _c.bindGroupCounts,
353
+ );
354
+
355
+ const pass: RhiRenderPassEncoder =
356
+ graphPass ??
357
+ encoder.beginRenderPass(
358
+ buildBeginRenderPassDescriptor(
359
+ { colorFormats: ['r8unorm'], depthFormat: undefined, sampleCount: 1 },
360
+ { colorViews: [ssaoRawView] },
361
+ 'post-process',
362
+ ) as never,
363
+ );
364
+ pass.setPipeline(pp.ssaoCalcPipeline);
365
+ pass.setBindGroup(0, bindGroup);
366
+ pass.draw(3, 1, 0, 0);
367
+ if (graphPass === undefined) pass.end();
368
+ }
369
+
370
+ /**
371
+ * recordSsaoBlurPass — fullscreen SSAO 4x4 box blur (M8 / w38).
372
+ *
373
+ * Reads the half-resolution ssaoRaw (R8), applies a 16-tap box blur, writes
374
+ * the blurred result to ssaoBlurred. The BGL is the same 9-entry SSAO BGL
375
+ * as the calc pass; the only difference is binding 7 carries the real
376
+ * ssaoRaw view (vs the 1x1 fallback the calc pass binds).
377
+ */
378
+ export interface SsaoBlurPassViews extends SsaoCalcPassViews {
379
+ readonly raw: TextureView;
380
+ }
381
+
382
+ export function recordSsaoBlurPass(
383
+ _c: _InternalRenderPipelineContext,
384
+ resolveCtx?: ResolveContext,
385
+ ssaoBlurredKey?: string,
386
+ ssaoRawKey?: string,
387
+ gbuf0Key?: string,
388
+ hdrDepthKey?: string,
389
+ graphPass?: RhiRenderPassEncoder,
390
+ graphViews?: SsaoBlurPassViews,
391
+ ): void {
392
+ const { runtime, pipelineState, encoder } = _c;
393
+ const pp = pipelineState.perPassResources;
394
+
395
+ if (pp.ssaoBlurPipeline === null || pp.ssaoBgl === null) return;
396
+ if (
397
+ graphViews === undefined &&
398
+ (resolveCtx === undefined || ssaoBlurredKey === undefined || ssaoRawKey === undefined)
399
+ )
400
+ return;
401
+
402
+ const ssaoBlurredView =
403
+ graphViews?.output ??
404
+ (resolveCtx?.resolve(ssaoBlurredKey as string) as TextureView | undefined);
405
+ const ssaoRawView =
406
+ graphViews?.raw ?? (resolveCtx?.resolve(ssaoRawKey as string) as TextureView | undefined);
407
+ const gbuf0View =
408
+ graphViews?.normal ??
409
+ (gbuf0Key !== undefined
410
+ ? (resolveCtx?.resolve(gbuf0Key) as TextureView | undefined)
411
+ : undefined);
412
+ if (!ssaoBlurredView || !ssaoRawView) return;
413
+
414
+ // hdrDepth depth-only view (see recordSsaoCalcPass).
415
+ const hdrDepthView =
416
+ graphViews?.depth ??
417
+ (hdrDepthKey !== undefined ? resolveHdrDepthDepthOnlyView(_c, hdrDepthKey) : null);
418
+ // Pooled hdrDepth view for the cache key (the depth-only view above is
419
+ // recreated every frame; see recordSsaoCalcPass).
420
+ const hdrDepthPooledView =
421
+ graphViews?.depthCacheKey ??
422
+ (hdrDepthKey !== undefined
423
+ ? (resolveCtx?.resolve(hdrDepthKey) as TextureView | undefined)
424
+ : undefined);
425
+
426
+ const ssaoBufs = getOrCreateSsaoBuffers(runtime);
427
+ if (ssaoBufs === null) return;
428
+
429
+ const noiseViewRes = runtime.device.createTextureView(ssaoBufs.noiseTexture, {
430
+ label: 'hdrp-ssao-noise-view',
431
+ format: 'rgba32float',
432
+ dimension: '2d',
433
+ aspect: 'all',
434
+ baseMipLevel: 0,
435
+ mipLevelCount: 1,
436
+ baseArrayLayer: 0,
437
+ arrayLayerCount: 1,
438
+ });
439
+ if (!noiseViewRes.ok) {
440
+ runtime.errorRegistry.fire(noiseViewRes.error);
441
+ return;
442
+ }
443
+
444
+ const companions = ensureSsaoRecordCompanions(_c);
445
+ if (companions === null) return;
446
+
447
+ // The blur reads ssaoRaw via binding 7 + ssaoSampler at binding 8. The
448
+ // remaining slots 0..6 are bound for BGL completeness (BGL is shared with
449
+ // the calc pass): WebGPU requires every BGL slot carry a valid resource
450
+ // even when the active fragment entry does not statically reference it.
451
+ // gbuf0 + hdr_depth views are resolved from the graph; they must exist
452
+ // because the typed SSAO graph declares them as reads on the blur node.
453
+ if (gbuf0View === undefined || hdrDepthView === null || hdrDepthPooledView === undefined) return;
454
+ // Identity-cached bind group keyed on the graph-pooled ssaoRaw + gbuf0 +
455
+ // hdrDepth views (all retire + reallocate on resize). Replaces the prior
456
+ // `=== null` slot cache that submitted destroyed transients after resize.
457
+ const ssaoBgl = pp.ssaoBgl;
458
+ const bindGroup = getOrCreateFromChain(
459
+ _c.frameState.postProcessBgCache,
460
+ [ssaoRawView, gbuf0View, hdrDepthPooledView],
461
+ 'ssao-blur',
462
+ () => {
463
+ const bgRes = runtime.device.createBindGroup({
464
+ label: 'ssao-blur-bg',
465
+ layout: ssaoBgl,
466
+ entries: [
467
+ { binding: 0, resource: { kind: 'buffer', value: { buffer: ssaoBufs.uniformBuffer } } },
468
+ { binding: 1, resource: { kind: 'buffer', value: { buffer: ssaoBufs.kernelBuffer } } },
469
+ { binding: 2, resource: { kind: 'textureView', value: noiseViewRes.value } },
470
+ {
471
+ binding: 3,
472
+ resource: { kind: 'sampler', value: companions.filteringSampler },
473
+ },
474
+ { binding: 4, resource: { kind: 'textureView', value: gbuf0View } },
475
+ { binding: 5, resource: { kind: 'textureView', value: hdrDepthView } },
476
+ { binding: 6, resource: { kind: 'sampler', value: companions.depthSampler } },
477
+ { binding: 7, resource: { kind: 'textureView', value: ssaoRawView } },
478
+ { binding: 8, resource: { kind: 'sampler', value: companions.filteringSampler } },
479
+ ],
480
+ });
481
+ if (!bgRes.ok) throw bgRes.error;
482
+ return bgRes.value;
483
+ },
484
+ _c.bindGroupCounts,
485
+ );
486
+
487
+ const pass: RhiRenderPassEncoder =
488
+ graphPass ??
489
+ encoder.beginRenderPass(
490
+ buildBeginRenderPassDescriptor(
491
+ { colorFormats: ['r8unorm'], depthFormat: undefined, sampleCount: 1 },
492
+ { colorViews: [ssaoBlurredView] },
493
+ 'post-process',
494
+ ) as never,
495
+ );
496
+ pass.setPipeline(pp.ssaoBlurPipeline);
497
+ pass.setBindGroup(0, bindGroup);
498
+ pass.draw(3, 1, 0, 0);
499
+ if (graphPass === undefined) pass.end();
500
+ }
501
+
502
+ /**
503
+ * F-3 fix-up + feat-20260609 M1 / T-3 patch: per-frame fullscreen-post-process
504
+ * dispatcher.
505
+ *
506
+ * Two-branch fan-out by shader id:
507
+ * - `'fxaa'` (engine-built-in hardwire): delegate to `recordFxaaPass`. The
508
+ * FXAA implementation owns its graph input view, surface output attachment,
509
+ * pipeline cache, and bindgroup-resize invalidation; that mechanics is engine-internal and
510
+ * not expressible through the generic public primitive. recordFxaaPass's
511
+ * body is intentionally unchanged across this refactor to preserve the
512
+ * AC-09 dualPassDiff=1069 (hello-fxaa) / 768 (learn-render-4-10-MSAA)
513
+ * byte-equivalence with the pre-feat baseline.
514
+ * - every other id (AI-user path): the M1 patch wires `reads[0]` through the
515
+ * render-graph `resolveCtx` so the bind group samples the upstream
516
+ * graph-owned color target (e.g. the typed scene pass writes `'offscreenColor'`,
517
+ * a custom post-process pass declares `reads: ['offscreenColor']`).
518
+ * Failure modes (charter P3 fail-fast):
519
+ * - `lookupPostProcess(shader) === undefined` -> throw
520
+ * `PostProcessError({code:'post-process-not-found'})`
521
+ * - `reads.length > 0` but `resolveCtx.resolve(reads[0]) === undefined`
522
+ * -> throw `PostProcessError({code:'fullscreen-input-not-found',
523
+ * detail:{readsKey, passName}})`. AI users read err.detail.readsKey
524
+ * to find the missing graph.addColorTarget declaration.
525
+ * On success the dispatcher builds the input-texture BGL + sampler via
526
+ * `buildFullscreenPostProcessPass`, composes the per-frame bind group
527
+ * via `createFullscreenBindGroup`, opens a render pass writing the
528
+ * declared `color` (resolved through the graph's color-target view, or
529
+ * the swap-chain `ctx.view` when the graph has not allocated a target),
530
+ * binds the input bind group at slot 1 (the 0 slot is reserved for
531
+ * future view bind groups), and calls `handle.draw(pass)` which
532
+ * internally does `setPipeline(pipeline)` + `draw(3, 1, 0, 0)` over the
533
+ * fullscreen-triangle vertex shader.
534
+ *
535
+ * Extracted from the addPass execute closure so the topology fan-out is in
536
+ * one named place; the typed graph has a single
537
+ * call site, and future post-process branches (e.g. tonemap migrated onto
538
+ * this dispatcher per OOS-3) extend this function rather than the addPass
539
+ * inline closure.
540
+ */
541
+ function dispatchFullscreenPass(
542
+ ctx: RenderPipelineContext,
543
+ name: string,
544
+ shader: string,
545
+ color: string,
546
+ reads: readonly string[],
547
+ resolveCtx?: ResolveContext,
548
+ compositeOverSwapchain = false,
549
+ rawSwapchainOutput = false,
550
+ graphPass?: RhiRenderPassEncoder,
551
+ graphOutputFormat?: GPUTextureFormat,
552
+ graphDepthView?: TextureView,
553
+ ): void {
554
+ if (shader === 'fxaa') {
555
+ if (resolveCtx === undefined) {
556
+ throw new PostProcessError({
557
+ code: 'fullscreen-input-not-found',
558
+ detail: { readsKey: reads[0] ?? 'ldrColor', passName: name },
559
+ });
560
+ }
561
+ recordFxaaPass(requireRenderGraphRecordContext(ctx), resolveCtx, graphPass);
562
+ return;
563
+ }
564
+ const lookup = ctx.runtime.lookupPostProcess;
565
+ const entry = lookup === undefined ? undefined : lookup(shader);
566
+ if (entry === undefined) {
567
+ throw new PostProcessError({
568
+ code: 'post-process-not-found',
569
+ detail: { id: shader },
570
+ });
571
+ }
572
+ // feat-20260621 M4' composite-over-swap-chain: copy the current swap-chain
573
+ // into the `color` scratch target BEFORE sampling, so the effect reads the
574
+ // already-composited final image (shadows + tonemap + fxaa). Generalises the
575
+ // built-in FXAA copy idiom. The `color` key is BOTH the copy dst and the
576
+ // sampled input (resolve its GPU texture via `${color}::tex` for the copy,
577
+ // its TextureView via `${color}` for the bind group).
578
+ let inputView: TextureView | null;
579
+ if (compositeOverSwapchain) {
580
+ const scratchTex = resolveCtx?.resolve(`${color}::tex`);
581
+ const scratchView = resolveCtx?.resolve(color);
582
+ if (scratchTex === undefined || scratchView === undefined) {
583
+ throw new PostProcessError({
584
+ code: 'fullscreen-input-not-found',
585
+ detail: { readsKey: color, passName: name },
586
+ });
587
+ }
588
+ ctx.encoder.copyTextureToTexture(
589
+ { texture: ctx.currentTexture as never, mipLevel: 0, origin: { x: 0, y: 0, z: 0 } },
590
+ { texture: scratchTex as never, mipLevel: 0, origin: { x: 0, y: 0, z: 0 } },
591
+ { width: ctx.targetW, height: ctx.targetH, depthOrArrayLayers: 1 },
592
+ );
593
+ inputView = scratchView as TextureView;
594
+ } else if (reads.length === 0) {
595
+ // reads === [] preserves the legacy swap-chain sample path (used by
596
+ // tonemap-style passes that read the framebuffer directly).
597
+ inputView = ctx.view;
598
+ } else {
599
+ // reads with a key MUST resolve through the graph compile output, otherwise
600
+ // the dispatcher throws fullscreen-input-not-found (charter P3 fail-fast).
601
+ const readsKey = reads[0] as string;
602
+ const resolved = resolveCtx?.resolve(readsKey);
603
+ if (resolved === undefined) {
604
+ throw new PostProcessError({
605
+ code: 'fullscreen-input-not-found',
606
+ detail: { readsKey, passName: name },
607
+ });
608
+ }
609
+ inputView = resolved as TextureView;
610
+ }
611
+ if (inputView === null) return;
612
+
613
+ // ── BGL/Pipeline build (before depth resolution so built.depthSampler is
614
+ // available for the depth threading block below; ctx.msaaActive selects
615
+ // the multisampled depth BGL when the scene target uses sample=4) ───────
616
+ const built = buildFullscreenPostProcessPass(
617
+ { device: ctx.runtime.device, errorRegistry: ctx.runtime.errorRegistry },
618
+ entry,
619
+ ctx.msaaActive,
620
+ );
621
+ if (built === null) return;
622
+
623
+ // ── plan-strategy D-6: depth read resolution (pipeline-agnostic, AC-02) ────
624
+ // Iterate entry.reads looking for sampleType:'depth' entries. For each depth
625
+ // entry, resolve a depth-only TextureView from the graph via
626
+ // resolveDepthOnlyView, fail-fast on unresolvable keys. The depth sampler
627
+ // is produced by buildFullscreenPostProcessPass (via createDepthSampler,
628
+ // plan-strategy D-2: non-filtering nearest+clamp-to-edge).
629
+ //
630
+ // Both composite and non-composite branches handle depth symmetrically —
631
+ // the depth resolution block is branch-agnostic (AC-02: no URP/HDRP
632
+ // discrimination). Color input logic is unchanged (AC-03 zero-regression).
633
+ let depthTexView: TextureView | null = graphDepthView ?? null;
634
+ let depthSampler: Sampler | null = null;
635
+ if (entry.reads && entry.reads.length > 0) {
636
+ const internals = requireRenderGraphRecordContext(ctx);
637
+ for (const read of entry.reads) {
638
+ if (typeof read !== 'string' && read.sampleType === 'depth') {
639
+ const depthKey = read.key;
640
+ depthTexView ??= resolveDepthOnlyView(
641
+ internals,
642
+ depthKey,
643
+ 'post-process-scene-depth-only-view',
644
+ internals.geometryDepthKey,
645
+ );
646
+ if (depthTexView === null) {
647
+ throw new PostProcessError({
648
+ code: 'fullscreen-input-not-found',
649
+ detail: { readsKey: depthKey, passName: name },
650
+ });
651
+ }
652
+ depthSampler = built.depthSampler;
653
+ }
654
+ }
655
+ }
656
+
657
+ // feat-20260621 M4' composite-over-swap-chain write target: the swap-chain's
658
+ // NON-srgb storage view (R-COLORSPACE — the scratch holds an already-sRGB-
659
+ // encoded copy, so writing through the srgb view would double-encode; mirrors
660
+ // recordFxaaPass). Otherwise resolve the declared color through the graph and
661
+ // fall back to ctx.view (swap-chain srgb view) for normal post passes.
662
+ let writeView: TextureView | null | undefined;
663
+ // The attachment format follows the actual write target. Graph-owned
664
+ // targets may be linear HDR/LDR textures (for example rgba16float), while
665
+ // the swap-chain path uses the backend-selected surface view format.
666
+ let writeFormat = ctx.pipelineState?.colorAttachmentFormat ?? 'rgba8unorm-srgb';
667
+ if (graphPass !== undefined) {
668
+ writeView = ctx.view;
669
+ writeFormat = graphOutputFormat ?? writeFormat;
670
+ } else if (rawSwapchainOutput && color === 'swapchain') {
671
+ const rawViewRes = ctx.runtime.device.createTextureView(ctx.currentTexture, {});
672
+ if (!rawViewRes.ok) {
673
+ ctx.runtime.errorRegistry.fire(rawViewRes.error);
674
+ return;
675
+ }
676
+ writeView = rawViewRes.value;
677
+ writeFormat = ctx.pipelineState?.format ?? 'rgba8unorm';
678
+ } else if (compositeOverSwapchain) {
679
+ const storageViewRes = ctx.runtime.device.createTextureView(ctx.currentTexture, {});
680
+ if (!storageViewRes.ok) {
681
+ ctx.runtime.errorRegistry.fire(storageViewRes.error);
682
+ return;
683
+ }
684
+ writeView = storageViewRes.value;
685
+ writeFormat = ctx.pipelineState?.format ?? 'rgba8unorm';
686
+ } else {
687
+ const legacyGraph = requireRenderGraphRecordContext(ctx).frameState.perFrameGraph;
688
+ const graphColorFormat = legacyGraph?.getColorTargetDescriptor(color)?.format;
689
+ if (graphColorFormat !== undefined) writeFormat = graphColorFormat;
690
+ const resolvedColor = (resolveCtx?.resolve(color) as TextureView | undefined) ?? null;
691
+ writeView = legacyGraph?.getColorTargetView(color) ?? resolvedColor ?? ctx.view;
692
+ }
693
+ if (writeView === null || writeView === undefined) return;
694
+
695
+ // feat-20260621 M-A2 / w8: per-frame data-driven params channel. When the
696
+ // entry declares params, look up the per-id eager-created UBO + the per-frame
697
+ // bytes from the PostProcessParams snapshot, fail-fast on a byteLength
698
+ // mismatch, then writeBuffer + bind the UBO at group(1) binding(2). When
699
+ // entry.params is undefined this whole block is skipped and the BGL degrades
700
+ // to 2-entry (param-less zero-regression, R-A7).
701
+ let paramsBuffer: Buffer | null = null;
702
+ if (entry.params !== undefined) {
703
+ const ubo = ctx.runtime.getPostProcessParamsBuffer?.(shader);
704
+ if (ubo !== undefined) {
705
+ const data = ctx.postProcessParams.get(shader);
706
+ if (data !== undefined) {
707
+ if (data.byteLength !== entry.params.byteSize) {
708
+ throw new PostProcessError({
709
+ code: 'params-update-size-mismatch',
710
+ detail: { byteSize: entry.params.byteSize, actualLength: data.byteLength },
711
+ });
712
+ }
713
+ const writeResult = ctx.runtime.device.queue.writeBuffer(ubo, 0, data);
714
+ if (!writeResult.ok) return;
715
+ } else {
716
+ const writeResult = ctx.runtime.device.queue.writeBuffer(ubo, 0, entry.params.defaultValue);
717
+ if (!writeResult.ok) return;
718
+ }
719
+ paramsBuffer = ubo;
720
+ }
721
+ } else if (entryHasDepthRead(entry)) {
722
+ // D-3: a param-less depth entry still binds the minimal UBO auto-allocated
723
+ // at register (the 'fullscreen-post-with-scene-depth' BGL always declares
724
+ // params@2). No per-frame write -- the buffer stays zero-filled.
725
+ paramsBuffer = ctx.runtime.getPostProcessParamsBuffer?.(shader) ?? null;
726
+ }
727
+
728
+ const bindGroup = createFullscreenBindGroup(
729
+ ctx.runtime.device,
730
+ built.bindGroupLayout,
731
+ inputView,
732
+ built.sampler,
733
+ paramsBuffer,
734
+ depthTexView,
735
+ depthSampler,
736
+ );
737
+ if (bindGroup === null) return;
738
+
739
+ // Pipeline source-of-truth (M4 / T-10-a, solving M1 CONCERN-1):
740
+ // RenderSystemRuntime.getPostProcessPipeline is the sync wrapper over the
741
+ // shared shader-module adapter (1-frame warmup). First frame after
742
+ // fullscreen effect registration: shader compile is in flight -> returns null -> we
743
+ // skip the pass for that frame. Second frame onward: cached pipeline is
744
+ // returned synchronously.
745
+ //
746
+ // Color format SSOT: graph-owned writes use their resolved descriptor format;
747
+ // swap-chain writes use the backend-aware surface format in pipelineState.
748
+ // This keeps the PSO target and render-pass attachment identical when a
749
+ // fullscreen pass writes an intermediate rgba16float target (for example
750
+ // tonemap -> FXAA), while preserving the native surface storage/sRGB split.
751
+ const lookupPipeline = ctx.runtime.getPostProcessPipeline;
752
+ if (lookupPipeline === undefined) return;
753
+ const postColorFormat = writeFormat;
754
+ const pipeline = lookupPipeline(shader, built.bindGroupLayout, postColorFormat);
755
+ if (pipeline === null) {
756
+ return;
757
+ }
758
+ const handle = built.createHandle(name, pipeline, paramsBuffer);
759
+
760
+ // Open a render pass writing into the resolved color target. Fullscreen
761
+ // post-process passes are non-MSAA, depth-less, single-attachment.
762
+ // setBindGroup(1, ...) (group=1 reserved per plan-strategy convention;
763
+ // group=0 is reserved for future view bind groups, mirroring the
764
+ // recordTonemap / recordSkybox pattern that uses slot 0 only when the
765
+ // pipeline declares a single bind group at slot 0).
766
+ const pass =
767
+ graphPass ??
768
+ ctx.encoder.beginRenderPass(
769
+ buildBeginRenderPassDescriptor(
770
+ {
771
+ colorFormats: [writeFormat],
772
+ depthFormat: undefined,
773
+ sampleCount: 1,
774
+ },
775
+ { colorViews: [writeView] },
776
+ 'post-process',
777
+ ) as never,
778
+ );
779
+ pass.setBindGroup(1, bindGroup);
780
+ handle.draw(pass, inputView);
781
+ if (graphPass === undefined) pass.end();
782
+ }
783
+
784
+ export function encodeFullscreenPass(
785
+ ctx: RenderPipelineContext,
786
+ pass: RhiRenderPassEncoder,
787
+ input: {
788
+ readonly name: string;
789
+ readonly shader: string;
790
+ readonly color: string;
791
+ readonly reads: readonly string[];
792
+ readonly resolve: ResolveContext;
793
+ readonly outputFormat: GPUTextureFormat;
794
+ readonly rawSwapchainOutput?: boolean | undefined;
795
+ readonly depthView?: TextureView | undefined;
796
+ },
797
+ ): void {
798
+ dispatchFullscreenPass(
799
+ ctx,
800
+ input.name,
801
+ input.shader,
802
+ input.color,
803
+ input.reads,
804
+ input.resolve,
805
+ false,
806
+ input.rawSwapchainOutput ?? false,
807
+ pass,
808
+ input.outputFormat,
809
+ input.depthView,
810
+ );
811
+ }