@forgeax/engine-render 0.1.28 → 0.1.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (642) hide show
  1. package/README.md +627 -124
  2. package/dist/assembly/atmosphere-shader-prewarm.d.ts +6 -0
  3. package/dist/assembly/atmosphere-shader-prewarm.d.ts.map +1 -0
  4. package/dist/assembly/dynamic-geometry-host.d.ts +21 -0
  5. package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -1
  6. package/dist/assembly/dynamic-geometry-runtime.d.ts +20 -0
  7. package/dist/assembly/dynamic-geometry-runtime.d.ts.map +1 -0
  8. package/dist/assembly/factory.d.ts +3 -1
  9. package/dist/assembly/factory.d.ts.map +1 -1
  10. package/dist/assembly/gpu-driven-owner.d.ts +10 -0
  11. package/dist/assembly/gpu-driven-owner.d.ts.map +1 -0
  12. package/dist/assembly/host-contract.d.ts +8 -0
  13. package/dist/assembly/host-contract.d.ts.map +1 -1
  14. package/dist/assembly/material/assembly.d.ts +7 -0
  15. package/dist/assembly/material/assembly.d.ts.map +1 -1
  16. package/dist/assembly/material-shader-policy.d.ts +3 -1
  17. package/dist/assembly/material-shader-policy.d.ts.map +1 -1
  18. package/dist/assembly/recovery/failure-location.d.ts +12 -0
  19. package/dist/assembly/recovery/failure-location.d.ts.map +1 -0
  20. package/dist/assembly/recovery/renderer-recover.d.ts +6 -4
  21. package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
  22. package/dist/assembly/renderer-facade.d.ts.map +1 -1
  23. package/dist/assembly/renderer-feature-inspection.d.ts +5 -0
  24. package/dist/assembly/renderer-feature-inspection.d.ts.map +1 -0
  25. package/dist/assembly/renderer-frame-transaction.d.ts +19 -0
  26. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
  27. package/dist/assembly/renderer-helpers.d.ts +3 -0
  28. package/dist/assembly/renderer-helpers.d.ts.map +1 -1
  29. package/dist/assembly/renderer-inspection.d.ts +4 -0
  30. package/dist/assembly/renderer-inspection.d.ts.map +1 -1
  31. package/dist/assembly/shader-prewarm-policy.d.ts +6 -0
  32. package/dist/assembly/shader-prewarm-policy.d.ts.map +1 -1
  33. package/dist/assembly/skin-palette-owner.d.ts +8 -0
  34. package/dist/assembly/skin-palette-owner.d.ts.map +1 -0
  35. package/dist/assembly/ssr-shader-prewarm.d.ts +6 -0
  36. package/dist/assembly/ssr-shader-prewarm.d.ts.map +1 -0
  37. package/dist/assembly/webgpu-device-loss.d.ts +15 -0
  38. package/dist/assembly/webgpu-device-loss.d.ts.map +1 -0
  39. package/dist/assembly/webgpu-pbr-ready.d.ts +38 -0
  40. package/dist/assembly/webgpu-pbr-ready.d.ts.map +1 -0
  41. package/dist/assembly/webgpu-ready-mipmap.d.ts +11 -0
  42. package/dist/assembly/webgpu-ready-mipmap.d.ts.map +1 -0
  43. package/dist/assembly/webgpu-ready.d.ts +7 -3
  44. package/dist/assembly/webgpu-ready.d.ts.map +1 -1
  45. package/dist/assembly/webgpu-renderer-bootstrap.d.ts +10 -0
  46. package/dist/assembly/webgpu-renderer-bootstrap.d.ts.map +1 -0
  47. package/dist/assembly/webgpu-renderer-contract.d.ts +62 -0
  48. package/dist/assembly/webgpu-renderer-contract.d.ts.map +1 -0
  49. package/dist/assembly/webgpu-renderer-guards.d.ts +9 -0
  50. package/dist/assembly/webgpu-renderer-guards.d.ts.map +1 -0
  51. package/dist/assembly/webgpu-renderer-observation.d.ts +6 -0
  52. package/dist/assembly/webgpu-renderer-observation.d.ts.map +1 -0
  53. package/dist/assembly/webgpu-renderer-recovery-failure.d.ts +12 -0
  54. package/dist/assembly/webgpu-renderer-recovery-failure.d.ts.map +1 -0
  55. package/dist/assembly/webgpu-renderer.d.ts +7 -141
  56. package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
  57. package/dist/assembly/webgpu-vertex-layouts.d.ts +28 -84
  58. package/dist/assembly/webgpu-vertex-layouts.d.ts.map +1 -1
  59. package/dist/authoring.mjs +2 -2
  60. package/dist/{chunk-JAASCMXA.mjs → chunk-33XZFTQU.mjs} +245 -39
  61. package/dist/chunk-33XZFTQU.mjs.map +1 -0
  62. package/dist/{chunk-GF523LHF.mjs → chunk-BLXGONR2.mjs} +30 -12
  63. package/dist/chunk-BLXGONR2.mjs.map +1 -0
  64. package/dist/{chunk-J52NMQKR.mjs → chunk-BQVQOQJH.mjs} +1086 -838
  65. package/dist/chunk-BQVQOQJH.mjs.map +1 -0
  66. package/dist/{chunk-IQMKJLNU.mjs → chunk-BTWH7BP4.mjs} +386 -17
  67. package/dist/chunk-BTWH7BP4.mjs.map +1 -0
  68. package/dist/{chunk-MBU4ZVE7.mjs → chunk-FUODTTIA.mjs} +3921 -671
  69. package/dist/chunk-FUODTTIA.mjs.map +1 -0
  70. package/dist/{chunk-MYJ5RPJO.mjs → chunk-JQTSEI3Z.mjs} +3 -3
  71. package/dist/{chunk-MYJ5RPJO.mjs.map → chunk-JQTSEI3Z.mjs.map} +1 -1
  72. package/dist/{chunk-GE3SDD72.mjs → chunk-NICXSHAT.mjs} +16 -38
  73. package/dist/chunk-NICXSHAT.mjs.map +1 -0
  74. package/dist/{chunk-J6KACNOH.mjs → chunk-NRNXBLIJ.mjs} +577 -7
  75. package/dist/chunk-NRNXBLIJ.mjs.map +1 -0
  76. package/dist/{chunk-RBDBZ5R7.mjs → chunk-PA5DRJNI.mjs} +2 -2
  77. package/dist/chunk-PA5DRJNI.mjs.map +1 -0
  78. package/dist/{chunk-VSL23LZE.mjs → chunk-S4DNKQYQ.mjs} +1117 -445
  79. package/dist/chunk-S4DNKQYQ.mjs.map +1 -0
  80. package/dist/components/camera.d.ts +62 -2
  81. package/dist/components/camera.d.ts.map +1 -1
  82. package/dist/components/index.d.ts +1 -0
  83. package/dist/components/index.d.ts.map +1 -1
  84. package/dist/components/instances.d.ts +6 -20
  85. package/dist/components/instances.d.ts.map +1 -1
  86. package/dist/components/scene-instance.d.ts +2 -1
  87. package/dist/components/scene-instance.d.ts.map +1 -1
  88. package/dist/components/screen-space-reflection.d.ts +14 -0
  89. package/dist/components/screen-space-reflection.d.ts.map +1 -0
  90. package/dist/construct-renderer.mjs +12888 -7025
  91. package/dist/construct-renderer.mjs.map +1 -1
  92. package/dist/device/gpu-residency.d.ts +1 -12
  93. package/dist/device/gpu-residency.d.ts.map +1 -1
  94. package/dist/environment/background.d.ts +6 -0
  95. package/dist/environment/background.d.ts.map +1 -0
  96. package/dist/errors/gpu-driven.d.ts +6 -3
  97. package/dist/errors/gpu-driven.d.ts.map +1 -1
  98. package/dist/errors/render.d.ts +7 -4
  99. package/dist/errors/render.d.ts.map +1 -1
  100. package/dist/extract/camera.d.ts.map +1 -1
  101. package/dist/extract/gpu-driven.d.ts +33 -3
  102. package/dist/extract/gpu-driven.d.ts.map +1 -1
  103. package/dist/features/host.d.ts +23 -1
  104. package/dist/features/host.d.ts.map +1 -1
  105. package/dist/features/noise-texture.d.ts +17 -0
  106. package/dist/features/noise-texture.d.ts.map +1 -0
  107. package/dist/features/plan.d.ts +83 -2
  108. package/dist/features/plan.d.ts.map +1 -1
  109. package/dist/features/prepared-gpu-work.d.ts +37 -4
  110. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  111. package/dist/features/prepared-graphics-store.d.ts.map +1 -1
  112. package/dist/features/prepared-graphics.d.ts +5 -0
  113. package/dist/features/prepared-graphics.d.ts.map +1 -1
  114. package/dist/features/render-graph-compute.d.ts +5 -3
  115. package/dist/features/render-graph-compute.d.ts.map +1 -1
  116. package/dist/features/render-graph-contribution.d.ts +11 -3
  117. package/dist/features/render-graph-contribution.d.ts.map +1 -1
  118. package/dist/features/render-graph-raster.d.ts +19 -3
  119. package/dist/features/render-graph-raster.d.ts.map +1 -1
  120. package/dist/features/types.d.ts +11 -0
  121. package/dist/features/types.d.ts.map +1 -1
  122. package/dist/fullscreen-post-process-pass.d.ts +2 -0
  123. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  124. package/dist/gpu-driven/batch-topology.d.ts +34 -1
  125. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  126. package/dist/gpu-driven/pbr-program.d.ts +10 -0
  127. package/dist/gpu-driven/pbr-program.d.ts.map +1 -0
  128. package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
  129. package/dist/gpu-driven/production-raster.d.ts +144 -23
  130. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  131. package/dist/gpu-driven/shadow-views.d.ts +126 -0
  132. package/dist/gpu-driven/shadow-views.d.ts.map +1 -0
  133. package/dist/gpu-driven/view-gpu.d.ts +18 -2
  134. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  135. package/dist/gpu-scene-schema.d.ts +2 -8
  136. package/dist/gpu-scene-schema.d.ts.map +1 -1
  137. package/dist/gpu-scene.d.ts +14 -0
  138. package/dist/gpu-scene.d.ts.map +1 -1
  139. package/dist/gpu-texture-usage.d.ts +1 -0
  140. package/dist/gpu-texture-usage.d.ts.map +1 -1
  141. package/dist/hdrp-buffers.d.ts +6 -0
  142. package/dist/hdrp-buffers.d.ts.map +1 -1
  143. package/dist/ibl/frame-resources.d.ts +8 -0
  144. package/dist/ibl/frame-resources.d.ts.map +1 -0
  145. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  146. package/dist/index.d.ts +18 -8
  147. package/dist/index.d.ts.map +1 -1
  148. package/dist/index.mjs +8 -8
  149. package/dist/inspection-types.d.ts +164 -0
  150. package/dist/inspection-types.d.ts.map +1 -1
  151. package/dist/instances-derived-bounds.d.ts +11 -0
  152. package/dist/instances-derived-bounds.d.ts.map +1 -1
  153. package/dist/instances.d.ts +89 -44
  154. package/dist/instances.d.ts.map +1 -1
  155. package/dist/internal.d.ts +3 -0
  156. package/dist/internal.d.ts.map +1 -1
  157. package/dist/internal.mjs +117 -9
  158. package/dist/internal.mjs.map +1 -1
  159. package/dist/lifecycle.d.ts +2 -1
  160. package/dist/lifecycle.d.ts.map +1 -1
  161. package/dist/material-row.d.ts +5 -0
  162. package/dist/material-row.d.ts.map +1 -0
  163. package/dist/materials.d.ts +15 -0
  164. package/dist/materials.d.ts.map +1 -1
  165. package/dist/pbr-pipeline.d.ts +21 -5
  166. package/dist/pbr-pipeline.d.ts.map +1 -1
  167. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  168. package/dist/pipeline/standard-output/auto-exposure/capability.d.ts +12 -0
  169. package/dist/pipeline/standard-output/auto-exposure/capability.d.ts.map +1 -0
  170. package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts +70 -0
  171. package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts.map +1 -0
  172. package/dist/pipeline/standard-output/auto-exposure/graph.d.ts +75 -0
  173. package/dist/pipeline/standard-output/auto-exposure/graph.d.ts.map +1 -0
  174. package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts +111 -0
  175. package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts.map +1 -0
  176. package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts +16 -0
  177. package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts.map +1 -0
  178. package/dist/pipeline/standard-output/auto-exposure/preset.d.ts +14 -0
  179. package/dist/pipeline/standard-output/auto-exposure/preset.d.ts.map +1 -0
  180. package/dist/pipeline/standard-output/auto-exposure/state.d.ts +46 -0
  181. package/dist/pipeline/standard-output/auto-exposure/state.d.ts.map +1 -0
  182. package/dist/pipeline/standard-output/color-transform.d.ts +27 -0
  183. package/dist/pipeline/standard-output/color-transform.d.ts.map +1 -0
  184. package/dist/pipeline/standard-output/graph.d.ts +15 -0
  185. package/dist/pipeline/standard-output/graph.d.ts.map +1 -0
  186. package/dist/pipeline/standard-output/lut-admission.d.ts +29 -0
  187. package/dist/pipeline/standard-output/lut-admission.d.ts.map +1 -0
  188. package/dist/pipeline/standard-output/lut-gpu.d.ts +48 -0
  189. package/dist/pipeline/standard-output/lut-gpu.d.ts.map +1 -0
  190. package/dist/pipeline/standard-output/lut-state.d.ts +68 -0
  191. package/dist/pipeline/standard-output/lut-state.d.ts.map +1 -0
  192. package/dist/pipeline/standard-output/resources.d.ts +10 -0
  193. package/dist/pipeline/standard-output/resources.d.ts.map +1 -0
  194. package/dist/pipeline/standard-output/types.d.ts +39 -0
  195. package/dist/pipeline/standard-output/types.d.ts.map +1 -0
  196. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  197. package/dist/pipeline/standard-post.d.ts +2 -2
  198. package/dist/pipeline/standard-post.d.ts.map +1 -1
  199. package/dist/pipeline-builder.d.ts +2 -1
  200. package/dist/pipeline-builder.d.ts.map +1 -1
  201. package/dist/pipeline-spec-types.d.ts +4 -0
  202. package/dist/pipeline-spec-types.d.ts.map +1 -1
  203. package/dist/pipeline-spec.d.ts +1 -9
  204. package/dist/pipeline-spec.d.ts.map +1 -1
  205. package/dist/points-lines/standard-owner.d.ts +1 -1
  206. package/dist/points-lines/standard-owner.d.ts.map +1 -1
  207. package/dist/prepare/prepared-graphics-resolver.d.ts +6 -1
  208. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
  209. package/dist/record/dynamic-geometry-consumption.d.ts +15 -0
  210. package/dist/record/dynamic-geometry-consumption.d.ts.map +1 -0
  211. package/dist/record/frame-lighting.d.ts +3 -3
  212. package/dist/record/frame-lighting.d.ts.map +1 -1
  213. package/dist/record/frame-snapshot.d.ts +106 -5
  214. package/dist/record/frame-snapshot.d.ts.map +1 -1
  215. package/dist/record/frame-targets.d.ts.map +1 -1
  216. package/dist/record/frame.d.ts +39 -4
  217. package/dist/record/frame.d.ts.map +1 -1
  218. package/dist/record/main-pass-geometry.d.ts +7 -8
  219. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  220. package/dist/record/main-pass-material.d.ts +38 -1
  221. package/dist/record/main-pass-material.d.ts.map +1 -1
  222. package/dist/record/main-pass-sprite-draws.d.ts +2 -10
  223. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  224. package/dist/record/main-pass.d.ts +12 -2
  225. package/dist/record/main-pass.d.ts.map +1 -1
  226. package/dist/record/mesh-ssbo.d.ts +15 -6
  227. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  228. package/dist/record/prepared-material-bindings.d.ts +19 -0
  229. package/dist/record/prepared-material-bindings.d.ts.map +1 -0
  230. package/dist/record/recovery-pipeline.d.ts +2 -9
  231. package/dist/record/recovery-pipeline.d.ts.map +1 -1
  232. package/dist/record/render-context.d.ts +74 -26
  233. package/dist/record/render-context.d.ts.map +1 -1
  234. package/dist/record/shadow-pass.d.ts +62 -7
  235. package/dist/record/shadow-pass.d.ts.map +1 -1
  236. package/dist/record/skybox-post-pass.d.ts +1 -1
  237. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  238. package/dist/record/typed-frame-graph.d.ts +35 -7
  239. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  240. package/dist/record/view-ubo.d.ts +1 -0
  241. package/dist/record/view-ubo.d.ts.map +1 -1
  242. package/dist/recovery/render-system-candidate.d.ts +10 -2
  243. package/dist/recovery/render-system-candidate.d.ts.map +1 -1
  244. package/dist/recovery/render-system-roots.d.ts +11 -0
  245. package/dist/recovery/render-system-roots.d.ts.map +1 -0
  246. package/dist/recovery/types.d.ts +76 -0
  247. package/dist/recovery/types.d.ts.map +1 -0
  248. package/dist/reflection/record-owner.d.ts +0 -2
  249. package/dist/reflection/record-owner.d.ts.map +1 -1
  250. package/dist/render-contract.d.ts +173 -30
  251. package/dist/render-contract.d.ts.map +1 -1
  252. package/dist/render-graph-primitives.d.ts +1 -0
  253. package/dist/render-graph-primitives.d.ts.map +1 -1
  254. package/dist/render-pipeline.d.ts +64 -5
  255. package/dist/render-pipeline.d.ts.map +1 -1
  256. package/dist/render-system-extract-tail.d.ts +7 -5
  257. package/dist/render-system-extract-tail.d.ts.map +1 -1
  258. package/dist/render-system-extract.d.ts +101 -41
  259. package/dist/render-system-extract.d.ts.map +1 -1
  260. package/dist/render-system-projections.d.ts +22 -0
  261. package/dist/render-system-projections.d.ts.map +1 -0
  262. package/dist/render-system.d.ts +27 -77
  263. package/dist/render-system.d.ts.map +1 -1
  264. package/dist/scene/render-scene-types.d.ts +14 -7
  265. package/dist/scene/render-scene-types.d.ts.map +1 -1
  266. package/dist/scene/render-scene.d.ts +29 -11
  267. package/dist/scene/render-scene.d.ts.map +1 -1
  268. package/dist/scene/shadow-visibility.d.ts +5 -0
  269. package/dist/scene/shadow-visibility.d.ts.map +1 -0
  270. package/dist/ssr/admission.d.ts +70 -1
  271. package/dist/ssr/admission.d.ts.map +1 -1
  272. package/dist/ssr/compose.d.ts +13 -0
  273. package/dist/ssr/compose.d.ts.map +1 -0
  274. package/dist/ssr/errors.d.ts +35 -0
  275. package/dist/ssr/errors.d.ts.map +1 -1
  276. package/dist/ssr/graph.d.ts +60 -0
  277. package/dist/ssr/graph.d.ts.map +1 -0
  278. package/dist/ssr/history.d.ts +97 -0
  279. package/dist/ssr/history.d.ts.map +1 -0
  280. package/dist/ssr/hiz.d.ts +37 -0
  281. package/dist/ssr/hiz.d.ts.map +1 -0
  282. package/dist/ssr/inspection.d.ts +42 -0
  283. package/dist/ssr/inspection.d.ts.map +1 -0
  284. package/dist/ssr/resources.d.ts +58 -0
  285. package/dist/ssr/resources.d.ts.map +1 -0
  286. package/dist/ssr/temporal.d.ts +38 -0
  287. package/dist/ssr/temporal.d.ts.map +1 -0
  288. package/dist/systems/skin-palette-allocator.d.ts +32 -10
  289. package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
  290. package/dist/systems/skin-palette-types.d.ts +15 -0
  291. package/dist/systems/skin-palette-types.d.ts.map +1 -1
  292. package/dist/systems/transparent-dispatch.d.ts +9 -0
  293. package/dist/systems/transparent-dispatch.d.ts.map +1 -0
  294. package/dist/targets/material-source.d.ts +7 -0
  295. package/dist/targets/material-source.d.ts.map +1 -1
  296. package/dist/temporal/frame-coordinator.d.ts +7 -0
  297. package/dist/temporal/frame-coordinator.d.ts.map +1 -1
  298. package/dist/temporal/gpu.d.ts +8 -0
  299. package/dist/temporal/gpu.d.ts.map +1 -1
  300. package/dist/temporal/history.d.ts.map +1 -1
  301. package/dist/temporal/index.mjs +6 -6
  302. package/dist/temporal/inspection.d.ts.map +1 -1
  303. package/dist/temporal/standard-scene-data.d.ts +2 -1
  304. package/dist/temporal/standard-scene-data.d.ts.map +1 -1
  305. package/dist/temporal/temporal-view.d.ts +2 -0
  306. package/dist/temporal/temporal-view.d.ts.map +1 -1
  307. package/dist/typed-render-graph-primitives.d.ts +35 -1
  308. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  309. package/dist/typed-shadow-passes.d.ts +3 -1
  310. package/dist/typed-shadow-passes.d.ts.map +1 -1
  311. package/dist/volume/temporal.d.ts +6 -0
  312. package/dist/volume/temporal.d.ts.map +1 -1
  313. package/package.json +21 -20
  314. package/src/__tests__/auto-exposure-gpu-evidence.ts +291 -0
  315. package/src/__tests__/auto-exposure-inspection.unit.test.ts +80 -0
  316. package/src/__tests__/auto-exposure-transaction.integration.test.ts +99 -0
  317. package/src/__tests__/auto-exposure.browser.test.ts +33 -0
  318. package/src/__tests__/auto-exposure.dawn.test.ts +33 -0
  319. package/src/__tests__/detached-inspection.integration.test.ts +5 -0
  320. package/src/__tests__/device-scope-lifecycle.unit.test.ts +18 -0
  321. package/src/__tests__/device-scope-stale-matrix.unit.test.ts +18 -0
  322. package/src/__tests__/docs-gate-green.unit.test.ts +3 -3
  323. package/src/__tests__/factory-contract.integration.test.ts +67 -8
  324. package/src/__tests__/fallback-row-stride-surface.unit.test.ts +19 -0
  325. package/src/__tests__/feature-depth-input.dawn.test.ts +121 -0
  326. package/src/__tests__/feature-noise.unit.test.ts +38 -0
  327. package/src/__tests__/fixtures/taa-resolve-pinned-baseline.wgsl +301 -0
  328. package/src/__tests__/frame-camera-selection.unit.test.ts +131 -0
  329. package/src/__tests__/frame-plan-contract.unit.test.ts +24 -0
  330. package/src/__tests__/frame-targets.unit.test.ts +24 -0
  331. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +3 -0
  332. package/src/__tests__/gpu-driven-baseline.characterization.test.ts +79 -0
  333. package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +287 -6
  334. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +122 -142
  335. package/src/__tests__/gpu-driven-indirect-raster.browser.test.ts +10 -1
  336. package/src/__tests__/gpu-driven-lod-cache.unit.test.ts +264 -0
  337. package/src/__tests__/gpu-driven-mesh-world-identity.unit.test.ts +349 -0
  338. package/src/__tests__/gpu-driven-pbr.dawn.test.ts +1417 -0
  339. package/src/__tests__/gpu-driven-pbr.integration.test.ts +21 -0
  340. package/src/__tests__/gpu-driven-production-fixture.ts +96 -0
  341. package/src/__tests__/gpu-driven-production.integration.test.ts +1075 -93
  342. package/src/__tests__/gpu-driven-scaling.unit.test.ts +1 -3
  343. package/src/__tests__/gpu-driven-shadow-views.browser.test.ts +63 -0
  344. package/src/__tests__/gpu-driven-shadow-views.dawn.test.ts +294 -0
  345. package/src/__tests__/gpu-driven-shadow-views.integration.test.ts +97 -0
  346. package/src/__tests__/gpu-driven-shadow-views.unit.test.ts +168 -0
  347. package/src/__tests__/gpu-driven-skin-contract.test-d.ts +11 -0
  348. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +72 -20
  349. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +30 -9
  350. package/src/__tests__/gpu-driven-view.unit.test.ts +159 -52
  351. package/src/__tests__/gpu-pass-timing.browser.test.ts +6 -1
  352. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +42 -0
  353. package/src/__tests__/gpu-scene-render-graph-gpu.ts +19 -5
  354. package/src/__tests__/gpu-scene.dawn.test.ts +40 -13
  355. package/src/__tests__/gpu-scene.unit.test.ts +559 -33
  356. package/src/__tests__/instances-culling.integration.test.ts +36 -10
  357. package/src/__tests__/instances-derived-bounds.unit.test.ts +54 -0
  358. package/src/__tests__/instances-store.unit.test.ts +242 -39
  359. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +6 -0
  360. package/src/__tests__/lighting-scene-roundtrip.integration.test.ts +13 -16
  361. package/src/__tests__/lut-lkg-transaction.integration.test.ts +122 -0
  362. package/src/__tests__/material-contract-inventory.unit.test.ts +5 -6
  363. package/src/__tests__/material-dispatch-shader-id.unit.test.ts +51 -0
  364. package/src/__tests__/material-lane-selection.unit.test.ts +60 -0
  365. package/src/__tests__/material-numeric-upload.unit.test.ts +53 -0
  366. package/src/__tests__/material-texture-handles.unit.test.ts +18 -0
  367. package/src/__tests__/material-texture-source.unit.test.ts +87 -0
  368. package/src/__tests__/materials-authoring-validation.unit.test.ts +41 -0
  369. package/src/__tests__/materials-standard-contract.unit.test.ts +52 -2
  370. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +4 -0
  371. package/src/__tests__/normal-fallback.dawn.test.ts +122 -0
  372. package/src/__tests__/particle-material-input-layout.unit.test.ts +104 -0
  373. package/src/__tests__/physical-clearcoat.integration.test.ts +37 -3
  374. package/src/__tests__/pipeline-texture-specialization.unit.test.ts +138 -0
  375. package/src/__tests__/point-shadow-inspection.unit.test.ts +2 -0
  376. package/src/__tests__/prepared-gpu-driven-pbr-contract.test-d.ts +31 -0
  377. package/src/__tests__/prepared-gpu-driven-pbr-contract.unit.test.ts +39 -0
  378. package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +35 -4
  379. package/src/__tests__/prepared-graphics-capability.unit.test.ts +21 -0
  380. package/src/__tests__/prepared-graphics-pipeline-warmup.unit.test.ts +6 -2
  381. package/src/__tests__/profiler-phase-catalog.test.ts +5 -0
  382. package/src/__tests__/public-surface.test-d.ts +3 -0
  383. package/src/__tests__/recovery-candidate-prepare.contract.test.ts +30 -12
  384. package/src/__tests__/reflection-fallback-async-publication.unit.test.ts +104 -0
  385. package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +2 -1
  386. package/src/__tests__/render-error-code-owner.test-d.ts +4 -0
  387. package/src/__tests__/render-error-detail-ssot.test-d.ts +22 -0
  388. package/src/__tests__/render-error-exhaustive.test-d.ts +15 -0
  389. package/src/__tests__/render-feature-gpu-work.integration.test.ts +285 -2
  390. package/src/__tests__/render-feature-plan.unit.test.ts +245 -0
  391. package/src/__tests__/render-feature-shadow-order.unit.test.ts +228 -0
  392. package/src/__tests__/render-feature-zero-work.unit.test.ts +35 -1
  393. package/src/__tests__/render-graph-fallback.integration.test.ts +2 -2
  394. package/src/__tests__/render-owner-cohesion.unit.test.ts +55 -0
  395. package/src/__tests__/render-scene-mixed-updates.integration.test.ts +426 -0
  396. package/src/__tests__/render-scene-projection.unit.test.ts +914 -23
  397. package/src/__tests__/render-scene-resource-updates.integration.test.ts +214 -0
  398. package/src/__tests__/render-scene-skin-lifecycle.integration.test.ts +173 -0
  399. package/src/__tests__/render-scene-temporal-retry.unit.test.ts +133 -0
  400. package/src/__tests__/render-target-material-source.test-d.ts +27 -3
  401. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +60 -0
  402. package/src/__tests__/renderer-frame-transaction.integration.test.ts +923 -5
  403. package/src/__tests__/shader-manifest-fixture.ts +39 -0
  404. package/src/__tests__/skin-motion-regression.unit.test.ts +0 -33
  405. package/src/__tests__/skin-palette-persistent.integration.test.ts +28 -0
  406. package/src/__tests__/skin-palette-persistent.unit.test.ts +247 -0
  407. package/src/__tests__/skinned-shadow-caster.test.ts +118 -14
  408. package/src/__tests__/specular-environment-scale.dawn.test.ts +156 -0
  409. package/src/__tests__/ssr-admission-matrix.integration.test.ts +7 -1
  410. package/src/__tests__/ssr-confidence-compose.unit.test.ts +84 -0
  411. package/src/__tests__/ssr-coordinate-oracle.unit.test.ts +28 -0
  412. package/src/__tests__/ssr-format-probe-gating.integration.test.ts +82 -0
  413. package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +91 -0
  414. package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +112 -0
  415. package/src/__tests__/ssr-gpu-dispatch.ts +946 -0
  416. package/src/__tests__/ssr-graph-topology.unit.test.ts +104 -0
  417. package/src/__tests__/ssr-history-filter.dawn.test.ts +198 -0
  418. package/src/__tests__/ssr-hit-color.dawn.test.ts +273 -0
  419. package/src/__tests__/ssr-hiz-odd-reduction.dawn.test.ts +569 -0
  420. package/src/__tests__/ssr-hiz-rescue.dawn.test.ts +279 -0
  421. package/src/__tests__/ssr-hiz.browser.test.ts +150 -0
  422. package/src/__tests__/ssr-hiz.dawn.test.ts +150 -0
  423. package/src/__tests__/ssr-hiz.unit.test.ts +56 -0
  424. package/src/__tests__/ssr-inspection.unit.test.ts +105 -0
  425. package/src/__tests__/ssr-memory-budget.unit.test.ts +45 -0
  426. package/src/__tests__/ssr-performance-sequence-aggregation.unit.test.ts +15 -0
  427. package/src/__tests__/ssr-public-surface.test-d.ts +37 -0
  428. package/src/__tests__/ssr-receiver-coverage.dawn.test.ts +387 -0
  429. package/src/__tests__/ssr-reflection-mip-reducer.dawn.test.ts +309 -0
  430. package/src/__tests__/ssr-reprojection-probe.ts +90 -0
  431. package/src/__tests__/ssr-roughness-mip.dawn.test.ts +163 -0
  432. package/src/__tests__/ssr-shader-prewarm.unit.test.ts +59 -0
  433. package/src/__tests__/ssr-spatial.integration.test.ts +141 -0
  434. package/src/__tests__/ssr-stable-lattice.dawn.test.ts +475 -0
  435. package/src/__tests__/ssr-temporal-history.unit.test.ts +202 -0
  436. package/src/__tests__/ssr-texel-crossing.dawn.test.ts +448 -0
  437. package/src/__tests__/ssr-zero-work.integration.test.ts +87 -0
  438. package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +44 -12
  439. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +29 -0
  440. package/src/__tests__/standard-output-chain-contract.unit.test.ts +99 -0
  441. package/src/__tests__/standard-output-chain.integration.test.ts +73 -0
  442. package/src/__tests__/standard-output-gpu-evidence.ts +205 -0
  443. package/src/__tests__/standard-output.browser.test.ts +15 -0
  444. package/src/__tests__/standard-output.dawn.test.ts +15 -0
  445. package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +38 -0
  446. package/src/__tests__/standard-pipeline.integration.test.ts +320 -3
  447. package/src/__tests__/standard-profile-oracle.unit.test.ts +22 -0
  448. package/src/__tests__/standard-surface-lighting.unit.test.ts +41 -0
  449. package/src/__tests__/standard-texture-specialization.dawn.test.ts +141 -0
  450. package/src/__tests__/surface-adjacent-regressions.integration.test.ts +6 -3
  451. package/src/__tests__/taa-coverage-edge.dawn.test.ts +193 -0
  452. package/src/__tests__/taa-history-clipping.dawn.test.ts +328 -0
  453. package/src/__tests__/taa-neighborhood-equivalence.dawn.test.ts +778 -0
  454. package/src/__tests__/taa-stability-feedback.browser.test.ts +23 -0
  455. package/src/__tests__/taa-stability-feedback.dawn.test.ts +68 -0
  456. package/src/__tests__/taa-stability-feedback.ts +341 -0
  457. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +49 -7
  458. package/src/__tests__/temporal-reset-matrix.unit.test.ts +9 -0
  459. package/src/__tests__/temporal-transaction.integration.test.ts +28 -0
  460. package/src/__tests__/texture-usage-surface.unit.test.ts +4 -2
  461. package/src/__tests__/typed-pipeline-topology.unit.test.ts +109 -4
  462. package/src/__tests__/typed-scene-pass-material-cache.integration.test.ts +126 -0
  463. package/src/__tests__/vertex-layouts-ssot.unit.test.ts +47 -0
  464. package/src/__tests__/visibility-extract.perf.test.ts +20 -8
  465. package/src/__tests__/visibility-instances.integration.test.ts +19 -7
  466. package/src/__tests__/visibility-producer-matrix.integration.test.ts +20 -9
  467. package/src/assembly/atmosphere-shader-prewarm.ts +38 -0
  468. package/src/assembly/dynamic-geometry-host.ts +48 -0
  469. package/src/assembly/dynamic-geometry-runtime.ts +71 -0
  470. package/src/assembly/factory.ts +4 -0
  471. package/src/assembly/gpu-driven-owner.ts +29 -0
  472. package/src/assembly/host-contract.ts +10 -0
  473. package/src/assembly/material/assembly.ts +38 -0
  474. package/src/assembly/material-shader-policy.ts +71 -28
  475. package/src/assembly/recovery/failure-location.ts +62 -0
  476. package/src/assembly/recovery/renderer-recover.ts +19 -17
  477. package/src/assembly/renderer-facade.ts +12 -0
  478. package/src/assembly/renderer-feature-inspection.ts +13 -0
  479. package/src/assembly/renderer-frame-transaction.ts +63 -0
  480. package/src/assembly/renderer-helpers.ts +26 -0
  481. package/src/assembly/renderer-inspection.ts +6 -0
  482. package/src/assembly/shader-prewarm-policy.ts +32 -0
  483. package/src/assembly/skin-palette-owner.ts +21 -0
  484. package/src/assembly/ssr-shader-prewarm.ts +41 -0
  485. package/src/assembly/webgpu-device-loss.ts +75 -0
  486. package/src/assembly/webgpu-pbr-ready.ts +232 -0
  487. package/src/assembly/webgpu-ready-mipmap.ts +26 -0
  488. package/src/assembly/webgpu-ready.ts +142 -121
  489. package/src/assembly/webgpu-renderer-bootstrap.ts +85 -0
  490. package/src/assembly/webgpu-renderer-contract.ts +69 -0
  491. package/src/assembly/webgpu-renderer-guards.ts +32 -0
  492. package/src/assembly/webgpu-renderer-observation.ts +43 -0
  493. package/src/assembly/webgpu-renderer-recovery-failure.ts +62 -0
  494. package/src/assembly/webgpu-renderer.ts +666 -652
  495. package/src/assembly/webgpu-vertex-layouts.ts +233 -87
  496. package/src/components/__tests__/camera-exposure.contract.unit.test.ts +153 -0
  497. package/src/components/camera.ts +287 -7
  498. package/src/components/index.ts +1 -0
  499. package/src/components/instances.ts +45 -18
  500. package/src/components/scene-instance.ts +2 -1
  501. package/src/components/screen-space-reflection.ts +21 -0
  502. package/src/components/sprite-animation.ts +2 -2
  503. package/src/components/sprite-instances.ts +1 -1
  504. package/src/device/gpu-residency.ts +34 -31
  505. package/src/environment/background.ts +263 -0
  506. package/src/errors/gpu-driven.ts +39 -5
  507. package/src/errors/render.ts +27 -3
  508. package/src/extract/camera.ts +26 -1
  509. package/src/extract/gpu-driven.ts +185 -10
  510. package/src/features/host.ts +237 -19
  511. package/src/features/noise-texture.ts +91 -0
  512. package/src/features/plan.ts +553 -24
  513. package/src/features/prepared-gpu-work.ts +631 -49
  514. package/src/features/prepared-graphics-store.ts +31 -0
  515. package/src/features/prepared-graphics.ts +5 -0
  516. package/src/features/render-graph-compute.ts +41 -8
  517. package/src/features/render-graph-contribution.ts +141 -3
  518. package/src/features/render-graph-raster.ts +143 -30
  519. package/src/features/types.ts +11 -0
  520. package/src/fullscreen-post-process-pass.ts +3 -0
  521. package/src/gpu-driven/batch-topology.ts +424 -102
  522. package/src/gpu-driven/pbr-program.ts +31 -0
  523. package/src/gpu-driven/prepared-draw.ts +29 -4
  524. package/src/gpu-driven/production-raster.ts +2267 -694
  525. package/src/gpu-driven/shadow-views.ts +539 -0
  526. package/src/gpu-driven/view-gpu.ts +188 -41
  527. package/src/gpu-scene-schema.ts +52 -11
  528. package/src/gpu-scene.ts +186 -99
  529. package/src/gpu-texture-usage.ts +1 -0
  530. package/src/hdrp-buffers.ts +72 -36
  531. package/src/ibl/frame-resources.ts +38 -0
  532. package/src/ibl/skylight-bind-group.ts +5 -4
  533. package/src/index.ts +109 -1
  534. package/src/inspection-types.ts +191 -0
  535. package/src/instances-derived-bounds.ts +258 -34
  536. package/src/instances.ts +459 -150
  537. package/src/internal.ts +22 -0
  538. package/src/lifecycle.ts +2 -0
  539. package/src/material-row.ts +145 -0
  540. package/src/materials.ts +44 -8
  541. package/src/pbr-pipeline.ts +159 -17
  542. package/src/pipeline/standard-forward-lane.ts +52 -24
  543. package/src/pipeline/standard-output/__tests__/lut-admission.unit.test.ts +103 -0
  544. package/src/pipeline/standard-output/auto-exposure/__tests__/capability.unit.test.ts +40 -0
  545. package/src/pipeline/standard-output/auto-exposure/__tests__/gpu.contract.unit.test.ts +125 -0
  546. package/src/pipeline/standard-output/auto-exposure/__tests__/graph.contract.unit.test.ts +94 -0
  547. package/src/pipeline/standard-output/auto-exposure/__tests__/oracle.test.ts +108 -0
  548. package/src/pipeline/standard-output/auto-exposure/__tests__/preset.test.ts +26 -0
  549. package/src/pipeline/standard-output/auto-exposure/capability.ts +38 -0
  550. package/src/pipeline/standard-output/auto-exposure/gpu.ts +567 -0
  551. package/src/pipeline/standard-output/auto-exposure/graph.ts +221 -0
  552. package/src/pipeline/standard-output/auto-exposure/inspection.ts +231 -0
  553. package/src/pipeline/standard-output/auto-exposure/oracle.ts +291 -0
  554. package/src/pipeline/standard-output/auto-exposure/preset.ts +28 -0
  555. package/src/pipeline/standard-output/auto-exposure/state.ts +156 -0
  556. package/src/pipeline/standard-output/color-transform.ts +124 -0
  557. package/src/pipeline/standard-output/graph.ts +139 -0
  558. package/src/pipeline/standard-output/lut-admission.ts +121 -0
  559. package/src/pipeline/standard-output/lut-gpu.ts +399 -0
  560. package/src/pipeline/standard-output/lut-state.ts +176 -0
  561. package/src/pipeline/standard-output/resources.ts +121 -0
  562. package/src/pipeline/standard-output/types.ts +58 -0
  563. package/src/pipeline/standard-pipeline.ts +192 -59
  564. package/src/pipeline/standard-post.ts +186 -27
  565. package/src/pipeline-builder.ts +16 -6
  566. package/src/pipeline-spec-types.ts +4 -0
  567. package/src/pipeline-spec.ts +37 -29
  568. package/src/points-lines/standard-owner.ts +6 -14
  569. package/src/prepare/prepared-graphics-resolver.ts +9 -2
  570. package/src/record/__tests__/material-slot-plan.unit.test.ts +48 -0
  571. package/src/record/__tests__/mesh-ssbo.unit.test.ts +40 -1
  572. package/src/record/__tests__/recovery-pipeline.unit.test.ts +2 -29
  573. package/src/record/__tests__/sprite-material-abi.unit.test.ts +36 -5
  574. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +45 -0
  575. package/src/record/__tests__/view-ubo-layout.unit.test.ts +5 -0
  576. package/src/record/dynamic-geometry-consumption.ts +59 -0
  577. package/src/record/frame-lighting.ts +12 -11
  578. package/src/record/frame-snapshot.ts +133 -23
  579. package/src/record/frame-targets.ts +9 -0
  580. package/src/record/frame.ts +725 -133
  581. package/src/record/main-pass-geometry.ts +149 -94
  582. package/src/record/main-pass-material.ts +115 -26
  583. package/src/record/main-pass-sprite-draws.ts +16 -107
  584. package/src/record/main-pass.ts +78 -8
  585. package/src/record/material-uniforms.ts +1 -1
  586. package/src/record/mesh-ssbo.ts +59 -15
  587. package/src/record/prepared-material-bindings.ts +234 -0
  588. package/src/record/recovery-pipeline.ts +59 -136
  589. package/src/record/render-context.ts +90 -22
  590. package/src/record/shadow-pass.ts +1231 -209
  591. package/src/record/skybox-post-pass.ts +14 -3
  592. package/src/record/typed-frame-graph.ts +1004 -44
  593. package/src/record/view-ubo.ts +11 -0
  594. package/src/recovery/render-system-candidate.ts +90 -66
  595. package/src/recovery/render-system-roots.ts +113 -0
  596. package/src/recovery/types.ts +77 -0
  597. package/src/reflection/record-owner.ts +26 -54
  598. package/src/render-contract.ts +195 -25
  599. package/src/render-graph-primitives.ts +6 -2
  600. package/src/render-pipeline.ts +70 -1
  601. package/src/render-system-extract-tail.ts +409 -160
  602. package/src/render-system-extract.ts +376 -102
  603. package/src/render-system-projections.ts +241 -0
  604. package/src/render-system.ts +681 -822
  605. package/src/scene/render-scene-types.ts +13 -4
  606. package/src/scene/render-scene.ts +569 -355
  607. package/src/scene/shadow-visibility.ts +21 -0
  608. package/src/ssr/admission.ts +380 -14
  609. package/src/ssr/compose.ts +144 -0
  610. package/src/ssr/errors.ts +48 -0
  611. package/src/ssr/graph.ts +777 -0
  612. package/src/ssr/history.ts +436 -0
  613. package/src/ssr/hiz.ts +124 -0
  614. package/src/ssr/inspection.ts +124 -0
  615. package/src/ssr/resources.ts +202 -0
  616. package/src/ssr/temporal.ts +164 -0
  617. package/src/systems/skin-palette-allocator.ts +495 -148
  618. package/src/systems/skin-palette-types.ts +17 -0
  619. package/src/systems/transparent-dispatch.ts +90 -0
  620. package/src/targets/material-source.ts +34 -0
  621. package/src/temporal/coverage.ts +1 -1
  622. package/src/temporal/frame-coordinator.ts +23 -2
  623. package/src/temporal/gpu.ts +74 -12
  624. package/src/temporal/history.ts +3 -1
  625. package/src/temporal/inspection.ts +2 -1
  626. package/src/temporal/standard-scene-data.ts +3 -1
  627. package/src/temporal/temporal-view.ts +3 -0
  628. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +204 -139
  629. package/src/typed-render-graph-primitives.ts +266 -74
  630. package/src/typed-shadow-passes.ts +122 -12
  631. package/src/volume/temporal.ts +10 -0
  632. package/dist/chunk-GE3SDD72.mjs.map +0 -1
  633. package/dist/chunk-GF523LHF.mjs.map +0 -1
  634. package/dist/chunk-IQMKJLNU.mjs.map +0 -1
  635. package/dist/chunk-J52NMQKR.mjs.map +0 -1
  636. package/dist/chunk-J6KACNOH.mjs.map +0 -1
  637. package/dist/chunk-JAASCMXA.mjs.map +0 -1
  638. package/dist/chunk-MBU4ZVE7.mjs.map +0 -1
  639. package/dist/chunk-RBDBZ5R7.mjs.map +0 -1
  640. package/dist/chunk-VSL23LZE.mjs.map +0 -1
  641. package/src/__tests__/instances-world-ownership.integration.test.ts +0 -62
  642. package/src/scene/__tests__/changed-block-summary.candidate.test.ts +0 -36
@@ -0,0 +1,21 @@
1
+ import { frustum } from '@forgeax/engine-math';
2
+ import type { ExtractedLights } from '../render-system-extract';
3
+
4
+ /** Light visibility is independent of camera visibility, including across Worlds. */
5
+ export function buildShadowFrusta(lights: ExtractedLights): frustum.Frustum[] {
6
+ const result: frustum.Frustum[] = [];
7
+ const add = (matrix: Float32Array): void => {
8
+ result.push(frustum.fromViewProjection(frustum.create(), matrix));
9
+ };
10
+ for (const matrix of lights.lightViewProj?.slice(0, lights.cascadeCount) ?? []) add(matrix);
11
+ for (const snapshot of lights.pointShadow) {
12
+ if (snapshot.shadowAtlasLayer < 0) continue;
13
+ for (let face = 0; face < 6; face += 1)
14
+ add(snapshot.shadowMatrices.subarray(face * 16, (face + 1) * 16));
15
+ }
16
+ for (const snapshot of lights.spot) {
17
+ if (snapshot.shadowAtlasTile >= 0 && snapshot.lightViewProj !== undefined)
18
+ add(snapshot.lightViewProj);
19
+ }
20
+ return result;
21
+ }
@@ -10,8 +10,17 @@ import {
10
10
  type RhiTextureFormatCapabilityReceipt,
11
11
  validateR32FloatReceipt,
12
12
  } from '@forgeax/engine-rhi';
13
+ import { err, ok, type Result } from '@forgeax/engine-types';
14
+ import type { ScreenSpaceReflectionData } from '../components/screen-space-reflection';
13
15
  import type { ReflectionFallbackReceipt } from '../inspection-types';
14
- import type { SsrOwnerRecoveryAction } from './errors';
16
+ import type {
17
+ SsrConfigField,
18
+ SsrConfigInvalidError,
19
+ SsrConfigRange,
20
+ SsrOwnerRecoveryAction,
21
+ SsrSpatialUnavailableReason,
22
+ SsrUnavailableError,
23
+ } from './errors';
15
24
  import type { SsrAdmissionIdentity } from './identity';
16
25
 
17
26
  export const SSR_FORMAT_PROFILE = 'r32float-mip-sampled-storage' as const;
@@ -319,20 +328,12 @@ export function admitSsrM0(input: SsrAdmissionInput): SsrAdmissionResult {
319
328
  input.reflectionFallback.projectionGeneration,
320
329
  );
321
330
  }
322
- if (input.temporal === undefined) {
323
- return blocked(
324
- input.identity,
325
- failure(
326
- 'ssr-temporal-unavailable',
327
- 'temporal',
328
- 'submit the matching temporal producer receipt',
329
- ),
330
- input.reflectionFallback.projectionGeneration,
331
- );
332
- }
333
- const temporalIdentityFailure = receiptFailure(input, input.temporal, 'temporal');
331
+ // Prior submitted history is optional for fresh spatial SSR. If supplied,
332
+ // its identity and validity still obey the temporal owner's contract.
333
+ const temporalIdentityFailure =
334
+ input.temporal === undefined ? undefined : receiptFailure(input, input.temporal, 'temporal');
334
335
  if (temporalIdentityFailure !== undefined) return temporalIdentityFailure;
335
- if (!validTemporal(input.temporal)) {
336
+ if (input.temporal !== undefined && !validTemporal(input.temporal)) {
336
337
  return blocked(
337
338
  input.identity,
338
339
  failure('ssr-temporal-unavailable', 'temporal', 'inspect and rebuild the temporal receipt'),
@@ -449,3 +450,368 @@ export function resolveSsrAdmissionGeneration(
449
450
  generation: nextGeneration,
450
451
  };
451
452
  }
453
+
454
+ /** Standard spatial lanes that may consume an SSR candidate. */
455
+ export type SsrSpatialLane = 'clustered' | 'deferred' | 'direct' | 'cpu-webgl2' | 'forward';
456
+
457
+ /** Capability facts required by the M1 spatial path. */
458
+ export interface SsrSpatialCapabilities {
459
+ readonly compute: boolean;
460
+ readonly storageTexture: boolean;
461
+ readonly rgba16floatRenderable: boolean;
462
+ readonly r32floatSampledStorage: boolean;
463
+ }
464
+
465
+ /** Detached owner facts consumed by spatial admission. */
466
+ export interface SsrSpatialEnvironment {
467
+ readonly lane: SsrSpatialLane;
468
+ readonly m0: Pick<SsrAdmissionResult, 'status'>;
469
+ readonly sceneInputs: boolean;
470
+ /** Current-frame motion/coverage producer, not reusable previous-frame history. */
471
+ readonly temporal: boolean;
472
+ readonly reflectionFallback: boolean;
473
+ readonly capabilities: SsrSpatialCapabilities;
474
+ /** Recovery readiness is optional for callers that have no recovery fault. */
475
+ readonly recovery?: boolean;
476
+ }
477
+
478
+ /** The only camera fields used by the spatial admission owner. */
479
+ export interface SsrSpatialCamera {
480
+ readonly projection: 'perspective' | 'orthographic';
481
+ readonly near: number;
482
+ readonly far: number;
483
+ readonly screenSpaceReflection?: ScreenSpaceReflectionData;
484
+ }
485
+
486
+ export interface SsrSpatialWork {
487
+ readonly attachmentCount: number;
488
+ readonly passCount: number;
489
+ readonly bindingCount: number;
490
+ readonly resourceCount: number;
491
+ readonly historyCount: 0;
492
+ readonly temporalDemand: 0;
493
+ }
494
+
495
+ export type SsrSpatialStatus =
496
+ | 'not-requested'
497
+ | 'requested'
498
+ | 'admitted'
499
+ | 'fallback-only'
500
+ | 'structural-only';
501
+
502
+ export interface SsrSpatialAdmissionBase {
503
+ readonly status: SsrSpatialStatus;
504
+ readonly lane: SsrSpatialLane;
505
+ readonly config: ScreenSpaceReflectionData | undefined;
506
+ readonly viewRange: number;
507
+ readonly work: SsrSpatialWork;
508
+ }
509
+
510
+ export type SsrSpatialAdmission =
511
+ | (SsrSpatialAdmissionBase & {
512
+ readonly status: 'not-requested' | 'requested';
513
+ readonly failure?: undefined;
514
+ })
515
+ | (SsrSpatialAdmissionBase & {
516
+ readonly status: 'admitted';
517
+ readonly config: ScreenSpaceReflectionData;
518
+ readonly failure?: undefined;
519
+ })
520
+ | (SsrSpatialAdmissionBase & {
521
+ readonly status: 'fallback-only' | 'structural-only';
522
+ readonly failure: SsrConfigInvalidError | SsrUnavailableError;
523
+ });
524
+
525
+ const ZERO_SPATIAL_WORK: SsrSpatialWork = Object.freeze({
526
+ attachmentCount: 0,
527
+ passCount: 0,
528
+ bindingCount: 0,
529
+ resourceCount: 0,
530
+ historyCount: 0,
531
+ temporalDemand: 0,
532
+ });
533
+
534
+ const ADMITTED_SPATIAL_WORK: SsrSpatialWork = Object.freeze({
535
+ attachmentCount: 3,
536
+ passCount: 4,
537
+ bindingCount: 4,
538
+ resourceCount: 3,
539
+ historyCount: 0,
540
+ temporalDemand: 0,
541
+ });
542
+
543
+ function configRange(
544
+ field: SsrConfigField,
545
+ viewRange: number,
546
+ maxDistance: number,
547
+ ): SsrConfigRange {
548
+ switch (field) {
549
+ case 'maxDistance':
550
+ return { min: 0, minInclusive: false, max: viewRange, maxInclusive: true };
551
+ case 'thickness':
552
+ return { min: 0, minInclusive: false, max: maxDistance, maxInclusive: true };
553
+ case 'maxRoughness':
554
+ return { min: 0, minInclusive: true, max: 1, maxInclusive: true };
555
+ }
556
+ }
557
+
558
+ function configError(
559
+ field: SsrConfigField,
560
+ value: number,
561
+ range: SsrConfigRange,
562
+ ): SsrConfigInvalidError {
563
+ const left = range.minInclusive ? '[' : '(';
564
+ const right = range.maxInclusive ? ']' : ')';
565
+ return Object.freeze({
566
+ code: 'ssr-config-invalid',
567
+ expected: `finite ${field} in ${left}${range.min}, ${range.max}${right}`,
568
+ hint: `set ${field} to a finite value inside the reported range before retrying`,
569
+ detail: Object.freeze({ field, value, range: Object.freeze(range) }),
570
+ });
571
+ }
572
+
573
+ /** Validate one schema-derived component value against the active view. */
574
+ export function validateScreenSpaceReflection(
575
+ config: ScreenSpaceReflectionData,
576
+ input: { readonly viewRange: number },
577
+ ): Result<ScreenSpaceReflectionData, SsrConfigInvalidError> {
578
+ const viewRange = input.viewRange;
579
+ if (!Number.isFinite(viewRange) || viewRange <= 0) {
580
+ return err(
581
+ configError('maxDistance', config.maxDistance, configRange('maxDistance', viewRange, 0)),
582
+ );
583
+ }
584
+ if (
585
+ !Number.isFinite(config.maxDistance) ||
586
+ config.maxDistance <= 0 ||
587
+ config.maxDistance > viewRange
588
+ ) {
589
+ return err(
590
+ configError(
591
+ 'maxDistance',
592
+ config.maxDistance,
593
+ configRange('maxDistance', viewRange, config.maxDistance),
594
+ ),
595
+ );
596
+ }
597
+ if (
598
+ !Number.isFinite(config.thickness) ||
599
+ config.thickness <= 0 ||
600
+ config.thickness > config.maxDistance
601
+ ) {
602
+ return err(
603
+ configError(
604
+ 'thickness',
605
+ config.thickness,
606
+ configRange('thickness', viewRange, config.maxDistance),
607
+ ),
608
+ );
609
+ }
610
+ if (!Number.isFinite(config.maxRoughness) || config.maxRoughness < 0 || config.maxRoughness > 1) {
611
+ return err(
612
+ configError(
613
+ 'maxRoughness',
614
+ config.maxRoughness,
615
+ configRange('maxRoughness', viewRange, config.maxDistance),
616
+ ),
617
+ );
618
+ }
619
+ return ok(
620
+ Object.freeze({
621
+ maxDistance: config.maxDistance,
622
+ thickness: config.thickness,
623
+ maxRoughness: config.maxRoughness,
624
+ }),
625
+ );
626
+ }
627
+
628
+ function unavailable(
629
+ lane: SsrSpatialLane,
630
+ reason: SsrSpatialUnavailableReason,
631
+ required: readonly string[],
632
+ actual: Readonly<Record<string, boolean | number | string>>,
633
+ ): SsrUnavailableError {
634
+ const recovery =
635
+ reason === 'lane-unsupported' || reason === 'projection-unsupported'
636
+ ? 'select a perspective clustered or deferred Standard lane'
637
+ : reason === 'reflection-fallback-unavailable'
638
+ ? 'repair the submitted reflection fallback owner receipt'
639
+ : reason === 'temporal-unavailable'
640
+ ? 'submit the matching temporal-v1 producer receipt'
641
+ : reason === 'recovery-unavailable'
642
+ ? 'complete device and producer recovery before retrying'
643
+ : 'restore the required scene, capability, or format input before retrying';
644
+ return Object.freeze({
645
+ code: 'ssr-unavailable',
646
+ expected: 'SSR spatial admission has a complete Standard input and capability set',
647
+ hint: recovery,
648
+ detail: Object.freeze({
649
+ lane,
650
+ reason,
651
+ required: Object.freeze([...required]),
652
+ actual: Object.freeze({ ...actual }),
653
+ recovery,
654
+ }),
655
+ });
656
+ }
657
+
658
+ function unavailableResult(
659
+ lane: SsrSpatialLane,
660
+ viewRange: number,
661
+ failure: SsrUnavailableError,
662
+ ): SsrSpatialAdmission {
663
+ return Object.freeze({
664
+ status: 'fallback-only',
665
+ lane,
666
+ config: undefined,
667
+ viewRange,
668
+ work: ZERO_SPATIAL_WORK,
669
+ failure,
670
+ });
671
+ }
672
+
673
+ /**
674
+ * Admit the active camera's schema-derived component into the M1 spatial
675
+ * path. No graph/resource handle crosses this boundary.
676
+ */
677
+ export function admitSsrSpatial(input: {
678
+ readonly camera: SsrSpatialCamera;
679
+ readonly environment: SsrSpatialEnvironment;
680
+ }): SsrSpatialAdmission {
681
+ const camera = input.camera;
682
+ const environment = input.environment;
683
+ const viewRange = camera.far - camera.near;
684
+ const config = camera.screenSpaceReflection;
685
+ if (config === undefined) {
686
+ return Object.freeze({
687
+ status: 'not-requested',
688
+ lane: environment.lane,
689
+ config: undefined,
690
+ viewRange,
691
+ work: ZERO_SPATIAL_WORK,
692
+ });
693
+ }
694
+
695
+ const valid = validateScreenSpaceReflection(config, { viewRange });
696
+ if (!valid.ok) {
697
+ return Object.freeze({
698
+ status: 'fallback-only',
699
+ lane: environment.lane,
700
+ config,
701
+ viewRange,
702
+ work: ZERO_SPATIAL_WORK,
703
+ failure: valid.error,
704
+ });
705
+ }
706
+
707
+ if (environment.m0.status !== 'admitted') {
708
+ return unavailableResult(
709
+ environment.lane,
710
+ viewRange,
711
+ unavailable(
712
+ environment.lane,
713
+ 'reflection-fallback-unavailable',
714
+ ['admitted M0 dependency receipt'],
715
+ { m0: false },
716
+ ),
717
+ );
718
+ }
719
+ if (environment.lane !== 'clustered' && environment.lane !== 'deferred') {
720
+ return unavailableResult(
721
+ environment.lane,
722
+ viewRange,
723
+ unavailable(environment.lane, 'lane-unsupported', ['clustered or deferred Standard lane'], {
724
+ lane: environment.lane,
725
+ }),
726
+ );
727
+ }
728
+ if (camera.projection !== 'perspective') {
729
+ return unavailableResult(
730
+ environment.lane,
731
+ viewRange,
732
+ unavailable(environment.lane, 'projection-unsupported', ['perspective camera'], {
733
+ projection: camera.projection,
734
+ }),
735
+ );
736
+ }
737
+ if (!environment.sceneInputs) {
738
+ return unavailableResult(
739
+ environment.lane,
740
+ viewRange,
741
+ unavailable(
742
+ environment.lane,
743
+ 'scene-input-unavailable',
744
+ ['deferred Standard scene/material/fallback inputs'],
745
+ { sceneInputs: false },
746
+ ),
747
+ );
748
+ }
749
+ if (!environment.temporal) {
750
+ return unavailableResult(
751
+ environment.lane,
752
+ viewRange,
753
+ unavailable(environment.lane, 'temporal-unavailable', ['temporal-v1'], { temporal: false }),
754
+ );
755
+ }
756
+ if (!environment.reflectionFallback) {
757
+ return unavailableResult(
758
+ environment.lane,
759
+ viewRange,
760
+ unavailable(
761
+ environment.lane,
762
+ 'reflection-fallback-unavailable',
763
+ ['submitted BRDF-projected fallback'],
764
+ { reflectionFallback: false },
765
+ ),
766
+ );
767
+ }
768
+ if (environment.recovery === false) {
769
+ return unavailableResult(
770
+ environment.lane,
771
+ viewRange,
772
+ unavailable(environment.lane, 'recovery-unavailable', ['ready device and owners'], {
773
+ recovery: false,
774
+ }),
775
+ );
776
+ }
777
+ const capabilities = environment.capabilities;
778
+ if (
779
+ !capabilities.compute ||
780
+ !capabilities.storageTexture ||
781
+ !capabilities.rgba16floatRenderable
782
+ ) {
783
+ return unavailableResult(
784
+ environment.lane,
785
+ viewRange,
786
+ unavailable(
787
+ environment.lane,
788
+ 'capability-unavailable',
789
+ ['compute', 'storageTexture', 'rgba16floatRenderable'],
790
+ {
791
+ compute: capabilities.compute,
792
+ storageTexture: capabilities.storageTexture,
793
+ rgba16floatRenderable: capabilities.rgba16floatRenderable,
794
+ },
795
+ ),
796
+ );
797
+ }
798
+ if (!capabilities.r32floatSampledStorage) {
799
+ return unavailableResult(
800
+ environment.lane,
801
+ viewRange,
802
+ unavailable(
803
+ environment.lane,
804
+ 'format-unavailable',
805
+ ['r32float sampled and storage mip chain'],
806
+ { r32floatSampledStorage: false },
807
+ ),
808
+ );
809
+ }
810
+ return Object.freeze({
811
+ status: 'admitted',
812
+ lane: environment.lane,
813
+ config: valid.value,
814
+ viewRange,
815
+ work: ADMITTED_SPATIAL_WORK,
816
+ });
817
+ }
@@ -0,0 +1,144 @@
1
+ import type {
2
+ GraphBuffer,
3
+ GraphTextureView,
4
+ RenderGraphBuilder,
5
+ } from '@forgeax/engine-render-graph';
6
+ import type { BindGroup, BindGroupLayout, RenderPipeline, Sampler } from '@forgeax/engine-rhi';
7
+ import { RhiError } from '@forgeax/engine-rhi';
8
+ import { GPU_SHADER_STAGE_FRAGMENT } from '../gpu-stage';
9
+ import { getOrCreateFromChain } from '../record/mesh-ssbo';
10
+ import type { _InternalRenderPipelineContext } from '../record/render-context';
11
+ import type { RenderPipelineFrame, RenderPipelineTarget } from '../render-pipeline';
12
+
13
+ /** Material response is produced with the visible surface; composition never
14
+ * redraws that surface, so equal-depth overlaps cannot apply the delta twice. */
15
+ export function addSsrCompositionPass(
16
+ graph: RenderGraphBuilder<RenderPipelineFrame>,
17
+ input: {
18
+ readonly scene: RenderPipelineTarget;
19
+ readonly radiance: GraphTextureView;
20
+ readonly fallback: GraphTextureView;
21
+ readonly response: GraphTextureView;
22
+ readonly normal: GraphTextureView;
23
+ readonly view: GraphBuffer;
24
+ },
25
+ ) {
26
+ let state:
27
+ | {
28
+ pipeline: RenderPipeline;
29
+ layout: BindGroupLayout;
30
+ sampler: Sampler;
31
+ groups: WeakMap<object, unknown>;
32
+ }
33
+ | undefined;
34
+ const views = [input.radiance, input.fallback, input.response, input.normal];
35
+ return graph.addRasterPass('ssr-compose', {
36
+ accesses: [
37
+ ...views.map((resource) => ({ resource, usage: 'sampled-read' as const })),
38
+ { resource: input.view, usage: 'uniform-read' },
39
+ { resource: input.scene.view, usage: 'color-attachment' },
40
+ ],
41
+ colorAttachments: [{ view: input.scene.view, loadOp: 'load', storeOp: 'store' }],
42
+ encode: ({ pass, frame, resources }) => {
43
+ const source = frame.ssrShaders?.compose;
44
+ if (source === undefined) return;
45
+ const device = frame.runtime.device;
46
+ if (state === undefined) {
47
+ const factory = frame.runtime.shaderModuleFactory;
48
+ if (factory === undefined)
49
+ throw new RhiError({
50
+ code: 'rhi-not-available',
51
+ expected: 'SSR composition shader module factory',
52
+ hint: 'construct the renderer through a backend pack with shader module support',
53
+ });
54
+ const module = factory.createShaderModule({ code: source, label: 'ssr_compose' }).unwrap();
55
+ const layout = device
56
+ .createBindGroupLayout({
57
+ entries: [
58
+ ...views.map((_, binding) => ({
59
+ binding,
60
+ visibility: GPU_SHADER_STAGE_FRAGMENT,
61
+ texture: {
62
+ sampleType: binding === 0 ? ('float' as const) : ('unfilterable-float' as const),
63
+ viewDimension: '2d' as const,
64
+ },
65
+ })),
66
+ {
67
+ binding: 4,
68
+ visibility: GPU_SHADER_STAGE_FRAGMENT,
69
+ sampler: { type: 'filtering' as const },
70
+ },
71
+ {
72
+ binding: 5,
73
+ visibility: GPU_SHADER_STAGE_FRAGMENT,
74
+ buffer: { type: 'uniform' as const },
75
+ },
76
+ ],
77
+ })
78
+ .unwrap();
79
+ const pipelineLayout = device.createPipelineLayout({ bindGroupLayouts: [layout] }).unwrap();
80
+ const pipeline = device
81
+ .createRenderPipeline({
82
+ label: 'ssr_compose',
83
+ layout: pipelineLayout,
84
+ vertex: { module, entryPoint: 'vs_ssr_compose', buffers: [] },
85
+ fragment: {
86
+ module,
87
+ entryPoint: 'fs_ssr_compose',
88
+ targets: [
89
+ {
90
+ format: 'rgba16float',
91
+ blend: {
92
+ color: { operation: 'add', srcFactor: 'one', dstFactor: 'one' },
93
+ alpha: { operation: 'add', srcFactor: 'zero', dstFactor: 'one' },
94
+ },
95
+ },
96
+ ],
97
+ },
98
+ primitive: { topology: 'triangle-list' },
99
+ })
100
+ .unwrap();
101
+ const sampler = device
102
+ .createSampler({
103
+ addressModeU: 'clamp-to-edge',
104
+ addressModeV: 'clamp-to-edge',
105
+ minFilter: 'linear',
106
+ magFilter: 'linear',
107
+ mipmapFilter: 'linear',
108
+ })
109
+ .unwrap();
110
+ state = { pipeline, layout, sampler, groups: new WeakMap() };
111
+ }
112
+ const textures = views.map((view) => resources.textureView(view).unwrap());
113
+ const viewBuffer = resources.buffer(input.view).unwrap();
114
+ const layout = state.layout;
115
+ const sampler = state.sampler;
116
+ const group = getOrCreateFromChain(
117
+ state.groups,
118
+ [...textures, sampler, viewBuffer],
119
+ 'ssr-compose',
120
+ () =>
121
+ device
122
+ .createBindGroup({
123
+ layout,
124
+ entries: [
125
+ ...textures.map((value, binding) => ({
126
+ binding,
127
+ resource: { kind: 'textureView' as const, value },
128
+ })),
129
+ { binding: 4, resource: { kind: 'sampler' as const, value: sampler } },
130
+ {
131
+ binding: 5,
132
+ resource: { kind: 'buffer' as const, value: { buffer: viewBuffer } },
133
+ },
134
+ ],
135
+ })
136
+ .unwrap(),
137
+ (frame as _InternalRenderPipelineContext).bindGroupCounts,
138
+ ) as BindGroup;
139
+ pass.setPipeline(state.pipeline);
140
+ pass.setBindGroup(0, group);
141
+ pass.draw(3);
142
+ },
143
+ });
144
+ }
package/src/ssr/errors.ts CHANGED
@@ -57,6 +57,54 @@ export interface SsrAdmissionError {
57
57
  readonly detail: SsrAdmissionErrorDetail;
58
58
  }
59
59
 
60
+ /** Closed authoring fields accepted by the ScreenSpaceReflection schema. */
61
+ export type SsrConfigField = 'maxDistance' | 'thickness' | 'maxRoughness';
62
+
63
+ /** Dynamic finite range returned by ScreenSpaceReflection validation. */
64
+ export interface SsrConfigRange {
65
+ readonly min: number;
66
+ readonly minInclusive: boolean;
67
+ readonly max: number;
68
+ readonly maxInclusive: boolean;
69
+ }
70
+
71
+ /** Structured invalid-authoring failure; callers branch on code and detail. */
72
+ export interface SsrConfigInvalidError {
73
+ readonly code: 'ssr-config-invalid';
74
+ readonly expected: string;
75
+ readonly hint: string;
76
+ readonly detail: {
77
+ readonly field: SsrConfigField;
78
+ readonly value: number;
79
+ readonly range: SsrConfigRange;
80
+ };
81
+ }
82
+
83
+ /** Closed spatial admission reasons. */
84
+ export type SsrSpatialUnavailableReason =
85
+ | 'lane-unsupported'
86
+ | 'projection-unsupported'
87
+ | 'scene-input-unavailable'
88
+ | 'capability-unavailable'
89
+ | 'format-unavailable'
90
+ | 'temporal-unavailable'
91
+ | 'reflection-fallback-unavailable'
92
+ | 'recovery-unavailable';
93
+
94
+ /** Structured spatial admission failure with bounded actual facts. */
95
+ export interface SsrUnavailableError {
96
+ readonly code: 'ssr-unavailable';
97
+ readonly expected: string;
98
+ readonly hint: string;
99
+ readonly detail: {
100
+ readonly lane: string;
101
+ readonly reason: SsrSpatialUnavailableReason;
102
+ readonly required: readonly string[];
103
+ readonly actual: Readonly<Record<string, boolean | number | string>>;
104
+ readonly recovery: string;
105
+ };
106
+ }
107
+
60
108
  const EXPECTED = 'all detached SSR dependency receipts share one admitted identity';
61
109
 
62
110
  export function createSsrAdmissionError(detail: SsrAdmissionErrorDetail): SsrAdmissionError {