@forgeax/engine-render 0.1.20 → 0.1.23

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 (645) hide show
  1. package/README.md +365 -29
  2. package/dist/assembly/backend-contract.d.ts +13 -0
  3. package/dist/assembly/backend-contract.d.ts.map +1 -1
  4. package/dist/assembly/device-feature-admission.d.ts +18 -0
  5. package/dist/assembly/device-feature-admission.d.ts.map +1 -0
  6. package/dist/assembly/directional-shadow-inspection.d.ts +38 -0
  7. package/dist/assembly/directional-shadow-inspection.d.ts.map +1 -0
  8. package/dist/assembly/factory.d.ts +30 -19
  9. package/dist/assembly/factory.d.ts.map +1 -1
  10. package/dist/assembly/host-contract.d.ts +19 -0
  11. package/dist/assembly/host-contract.d.ts.map +1 -1
  12. package/dist/assembly/render-target-host.d.ts +46 -0
  13. package/dist/assembly/render-target-host.d.ts.map +1 -0
  14. package/dist/assets/render-asset-port.d.ts.map +1 -1
  15. package/dist/authoring.mjs +4 -1
  16. package/dist/authoring.mjs.map +1 -1
  17. package/dist/capture/cube-views.d.ts +21 -0
  18. package/dist/capture/cube-views.d.ts.map +1 -0
  19. package/dist/capture/scheduler.d.ts +54 -0
  20. package/dist/capture/scheduler.d.ts.map +1 -0
  21. package/dist/{chunk-PCHBPYML.mjs → chunk-4L3P6DT5.mjs} +2 -2
  22. package/dist/chunk-4L3P6DT5.mjs.map +1 -0
  23. package/dist/{chunk-VFPLTKCU.mjs → chunk-4NPUASZR.mjs} +15 -4
  24. package/dist/chunk-4NPUASZR.mjs.map +1 -0
  25. package/dist/chunk-DIYW3M5D.mjs +5085 -0
  26. package/dist/chunk-DIYW3M5D.mjs.map +1 -0
  27. package/dist/chunk-FBC4R44J.mjs +1003 -0
  28. package/dist/chunk-FBC4R44J.mjs.map +1 -0
  29. package/dist/{chunk-CDTWTHZR.mjs → chunk-FF7K3FSO.mjs} +474 -168
  30. package/dist/chunk-FF7K3FSO.mjs.map +1 -0
  31. package/dist/chunk-HZUPSYW7.mjs +1104 -0
  32. package/dist/chunk-HZUPSYW7.mjs.map +1 -0
  33. package/dist/{chunk-TBQJOK2L.mjs → chunk-QODA5UKU.mjs} +321 -269
  34. package/dist/chunk-QODA5UKU.mjs.map +1 -0
  35. package/dist/chunk-YALPS44A.mjs +296 -0
  36. package/dist/chunk-YALPS44A.mjs.map +1 -0
  37. package/dist/{chunk-4XINDLAY.mjs → chunk-ZUWKAZ2I.mjs} +1963 -2178
  38. package/dist/chunk-ZUWKAZ2I.mjs.map +1 -0
  39. package/dist/cluster-binner.d.ts +5 -0
  40. package/dist/cluster-binner.d.ts.map +1 -1
  41. package/dist/components/camera.d.ts +1 -0
  42. package/dist/components/camera.d.ts.map +1 -1
  43. package/dist/components/cube-camera.d.ts +20 -0
  44. package/dist/components/cube-camera.d.ts.map +1 -0
  45. package/dist/components/directional-light.d.ts +11 -2
  46. package/dist/components/directional-light.d.ts.map +1 -1
  47. package/dist/components/directional-shadow-filter.d.ts +25 -0
  48. package/dist/components/directional-shadow-filter.d.ts.map +1 -0
  49. package/dist/components/index.d.ts +5 -0
  50. package/dist/components/index.d.ts.map +1 -1
  51. package/dist/components/light-helpers.d.ts +4 -0
  52. package/dist/components/light-helpers.d.ts.map +1 -1
  53. package/dist/components/light-probe.d.ts +9 -0
  54. package/dist/components/light-probe.d.ts.map +1 -0
  55. package/dist/components/rect-area-light.d.ts +12 -0
  56. package/dist/components/rect-area-light.d.ts.map +1 -0
  57. package/dist/components/reflection-probe.d.ts +17 -0
  58. package/dist/components/reflection-probe.d.ts.map +1 -0
  59. package/dist/components/scene-instance.d.ts +4 -0
  60. package/dist/components/scene-instance.d.ts.map +1 -1
  61. package/dist/components/spot-light.d.ts +3 -0
  62. package/dist/components/spot-light.d.ts.map +1 -1
  63. package/dist/construct-renderer.mjs +14836 -9620
  64. package/dist/construct-renderer.mjs.map +1 -1
  65. package/dist/device/gpu-residency.d.ts +8 -1
  66. package/dist/device/gpu-residency.d.ts.map +1 -1
  67. package/dist/device/lifecycle-transaction.d.ts +2 -0
  68. package/dist/device/lifecycle-transaction.d.ts.map +1 -0
  69. package/dist/environment/frame.d.ts.map +1 -1
  70. package/dist/environment/lifecycle.d.ts +5 -0
  71. package/dist/environment/lifecycle.d.ts.map +1 -1
  72. package/dist/errors/gpu-driven.d.ts +26 -0
  73. package/dist/errors/gpu-driven.d.ts.map +1 -0
  74. package/dist/errors/index.d.ts +1 -0
  75. package/dist/errors/index.d.ts.map +1 -1
  76. package/dist/errors/recover.d.ts +9 -1
  77. package/dist/errors/recover.d.ts.map +1 -1
  78. package/dist/errors/render.d.ts +166 -93
  79. package/dist/errors/render.d.ts.map +1 -1
  80. package/dist/extract/directional-shadow-projection.d.ts +23 -0
  81. package/dist/extract/directional-shadow-projection.d.ts.map +1 -0
  82. package/dist/extract/environment.d.ts +14 -0
  83. package/dist/extract/environment.d.ts.map +1 -1
  84. package/dist/extract/gpu-driven.d.ts +50 -0
  85. package/dist/extract/gpu-driven.d.ts.map +1 -0
  86. package/dist/extract/visibility.d.ts.map +1 -1
  87. package/dist/features/fullscreen.d.ts.map +1 -1
  88. package/dist/features/targets.d.ts.map +1 -1
  89. package/dist/features/types.d.ts +10 -0
  90. package/dist/features/types.d.ts.map +1 -1
  91. package/dist/fullscreen-post-process-pass.d.ts +13 -2
  92. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  93. package/dist/gpu-driven/batch-topology.d.ts +34 -0
  94. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  95. package/dist/gpu-driven/prepared-draw.d.ts +63 -0
  96. package/dist/gpu-driven/prepared-draw.d.ts.map +1 -0
  97. package/dist/gpu-driven/production-raster.d.ts +97 -2
  98. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  99. package/dist/gpu-driven/view-gpu.d.ts +64 -1
  100. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  101. package/dist/gpu-scene-schema.d.ts +14 -0
  102. package/dist/gpu-scene-schema.d.ts.map +1 -1
  103. package/dist/gpu-scene.d.ts +8 -1
  104. package/dist/gpu-scene.d.ts.map +1 -1
  105. package/dist/gpu-usage.d.ts +0 -1
  106. package/dist/gpu-usage.d.ts.map +1 -1
  107. package/dist/hdrp-buffers.d.ts +21 -19
  108. package/dist/hdrp-buffers.d.ts.map +1 -1
  109. package/dist/ibl/IblPipelineCache.d.ts +4 -0
  110. package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
  111. package/dist/ibl/kernel-cache.d.ts +36 -0
  112. package/dist/ibl/kernel-cache.d.ts.map +1 -0
  113. package/dist/index.d.ts +39 -3
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/index.mjs +91 -6
  116. package/dist/index.mjs.map +1 -1
  117. package/dist/inspection-types.d.ts +214 -1
  118. package/dist/inspection-types.d.ts.map +1 -1
  119. package/dist/instances-derived-bounds.d.ts +50 -0
  120. package/dist/instances-derived-bounds.d.ts.map +1 -0
  121. package/dist/internal.d.ts +9 -0
  122. package/dist/internal.d.ts.map +1 -1
  123. package/dist/internal.mjs +23 -2
  124. package/dist/internal.mjs.map +1 -1
  125. package/dist/light-buffer-layout.d.ts +58 -140
  126. package/dist/light-buffer-layout.d.ts.map +1 -1
  127. package/dist/materials.d.ts.map +1 -1
  128. package/dist/mesh-material-bindings.d.ts +54 -0
  129. package/dist/mesh-material-bindings.d.ts.map +1 -1
  130. package/dist/pbr-pipeline.d.ts +38 -14
  131. package/dist/pbr-pipeline.d.ts.map +1 -1
  132. package/dist/pipeline/standard-forward-lane.d.ts +2 -1
  133. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  134. package/dist/pipeline/standard-lighting/errors.d.ts +4 -0
  135. package/dist/pipeline/standard-lighting/errors.d.ts.map +1 -0
  136. package/dist/pipeline/standard-lighting/graph.d.ts +24 -0
  137. package/dist/pipeline/standard-lighting/graph.d.ts.map +1 -0
  138. package/dist/pipeline/standard-lighting/inspection.d.ts +38 -0
  139. package/dist/pipeline/standard-lighting/inspection.d.ts.map +1 -0
  140. package/dist/pipeline/standard-lighting/layout.d.ts +28 -0
  141. package/dist/pipeline/standard-lighting/layout.d.ts.map +1 -0
  142. package/dist/pipeline/standard-lighting/light-frame.d.ts +33 -0
  143. package/dist/pipeline/standard-lighting/light-frame.d.ts.map +1 -0
  144. package/dist/pipeline/standard-lighting/membership.d.ts +14 -0
  145. package/dist/pipeline/standard-lighting/membership.d.ts.map +1 -0
  146. package/dist/pipeline/standard-lighting/prepare.d.ts +16 -0
  147. package/dist/pipeline/standard-lighting/prepare.d.ts.map +1 -0
  148. package/dist/pipeline/standard-lighting/topology.d.ts +45 -0
  149. package/dist/pipeline/standard-lighting/topology.d.ts.map +1 -0
  150. package/dist/pipeline/standard-lighting/transport.d.ts +36 -0
  151. package/dist/pipeline/standard-lighting/transport.d.ts.map +1 -0
  152. package/dist/pipeline/standard-pipeline.d.ts +4 -13
  153. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  154. package/dist/pipeline/standard-post.d.ts.map +1 -1
  155. package/dist/pipeline/standard-profile.d.ts +5 -26
  156. package/dist/pipeline/standard-profile.d.ts.map +1 -1
  157. package/dist/pipeline-builder.d.ts +2 -0
  158. package/dist/pipeline-builder.d.ts.map +1 -1
  159. package/dist/pipeline-spec.d.ts +40 -7
  160. package/dist/pipeline-spec.d.ts.map +1 -1
  161. package/dist/plugin.d.ts.map +1 -1
  162. package/dist/point-shadow-inspection.d.ts +21 -0
  163. package/dist/point-shadow-inspection.d.ts.map +1 -0
  164. package/dist/prepare/extended-lighting/ltc-resources.d.ts +31 -0
  165. package/dist/prepare/extended-lighting/ltc-resources.d.ts.map +1 -0
  166. package/dist/prepare/extended-lighting/resources.d.ts +72 -0
  167. package/dist/prepare/extended-lighting/resources.d.ts.map +1 -0
  168. package/dist/prepare/extended-lighting/spot-modifiers.d.ts +42 -0
  169. package/dist/prepare/extended-lighting/spot-modifiers.d.ts.map +1 -0
  170. package/dist/prepare/extended-lighting/state.d.ts +24 -0
  171. package/dist/prepare/extended-lighting/state.d.ts.map +1 -0
  172. package/dist/record/frame-lighting.d.ts +33 -36
  173. package/dist/record/frame-lighting.d.ts.map +1 -1
  174. package/dist/record/frame-snapshot.d.ts +78 -24
  175. package/dist/record/frame-snapshot.d.ts.map +1 -1
  176. package/dist/record/frame-targets.d.ts +5 -0
  177. package/dist/record/frame-targets.d.ts.map +1 -1
  178. package/dist/record/frame.d.ts +16 -6
  179. package/dist/record/frame.d.ts.map +1 -1
  180. package/dist/record/gpu-pass-timing/contract.d.ts +96 -0
  181. package/dist/record/gpu-pass-timing/contract.d.ts.map +1 -0
  182. package/dist/record/gpu-pass-timing/errors.d.ts +18 -0
  183. package/dist/record/gpu-pass-timing/errors.d.ts.map +1 -0
  184. package/dist/record/gpu-pass-timing/index.d.ts +8 -0
  185. package/dist/record/gpu-pass-timing/index.d.ts.map +1 -0
  186. package/dist/record/gpu-pass-timing/parser.d.ts +11 -0
  187. package/dist/record/gpu-pass-timing/parser.d.ts.map +1 -0
  188. package/dist/record/gpu-pass-timing/session.d.ts +43 -0
  189. package/dist/record/gpu-pass-timing/session.d.ts.map +1 -0
  190. package/dist/record/gpu-timing.d.ts +20 -3
  191. package/dist/record/gpu-timing.d.ts.map +1 -1
  192. package/dist/record/helpers.d.ts +0 -20
  193. package/dist/record/helpers.d.ts.map +1 -1
  194. package/dist/record/main-pass-geometry.d.ts +6 -1
  195. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  196. package/dist/record/main-pass-material.d.ts +25 -2
  197. package/dist/record/main-pass-material.d.ts.map +1 -1
  198. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  199. package/dist/record/main-pass.d.ts +2 -0
  200. package/dist/record/main-pass.d.ts.map +1 -1
  201. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  202. package/dist/record/render-context.d.ts +98 -6
  203. package/dist/record/render-context.d.ts.map +1 -1
  204. package/dist/record/shadow-pass.d.ts.map +1 -1
  205. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  206. package/dist/record/typed-frame-graph.d.ts +119 -4
  207. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  208. package/dist/record/view-ubo.d.ts +7 -5
  209. package/dist/record/view-ubo.d.ts.map +1 -1
  210. package/dist/reflection/filter.d.ts +22 -0
  211. package/dist/reflection/filter.d.ts.map +1 -0
  212. package/dist/reflection/gpu-table.d.ts +25 -0
  213. package/dist/reflection/gpu-table.d.ts.map +1 -0
  214. package/dist/reflection/inspection.d.ts +10 -0
  215. package/dist/reflection/inspection.d.ts.map +1 -0
  216. package/dist/reflection/projection.d.ts +140 -0
  217. package/dist/reflection/projection.d.ts.map +1 -0
  218. package/dist/reflection/record-owner.d.ts +60 -0
  219. package/dist/reflection/record-owner.d.ts.map +1 -0
  220. package/dist/render-contract.d.ts +62 -14
  221. package/dist/render-contract.d.ts.map +1 -1
  222. package/dist/render-graph-primitives.d.ts +1 -0
  223. package/dist/render-graph-primitives.d.ts.map +1 -1
  224. package/dist/render-pipeline.d.ts +49 -2
  225. package/dist/render-pipeline.d.ts.map +1 -1
  226. package/dist/render-system-extract.d.ts +160 -31
  227. package/dist/render-system-extract.d.ts.map +1 -1
  228. package/dist/render-system.d.ts +28 -2
  229. package/dist/render-system.d.ts.map +1 -1
  230. package/dist/renderer.d.ts +43 -0
  231. package/dist/renderer.d.ts.map +1 -0
  232. package/dist/scene/probe-blend-record.d.ts +22 -0
  233. package/dist/scene/probe-blend-record.d.ts.map +1 -0
  234. package/dist/scene/probe-blend.d.ts +142 -0
  235. package/dist/scene/probe-blend.d.ts.map +1 -0
  236. package/dist/scene/render-scene-types.d.ts +0 -6
  237. package/dist/scene/render-scene-types.d.ts.map +1 -1
  238. package/dist/scene/render-scene.d.ts +117 -9
  239. package/dist/scene/render-scene.d.ts.map +1 -1
  240. package/dist/scene/visibility/bounds.d.ts +20 -0
  241. package/dist/scene/visibility/bounds.d.ts.map +1 -0
  242. package/dist/scene/visibility/budget.d.ts +16 -0
  243. package/dist/scene/visibility/budget.d.ts.map +1 -0
  244. package/dist/scene/visibility/facet.d.ts +73 -0
  245. package/dist/scene/visibility/facet.d.ts.map +1 -0
  246. package/dist/scene/visibility/gpu-frame-timing.d.ts +41 -0
  247. package/dist/scene/visibility/gpu-frame-timing.d.ts.map +1 -0
  248. package/dist/scene/visibility/gpu-lod.d.ts +46 -0
  249. package/dist/scene/visibility/gpu-lod.d.ts.map +1 -0
  250. package/dist/scene/visibility/inspection.d.ts +132 -0
  251. package/dist/scene/visibility/inspection.d.ts.map +1 -0
  252. package/dist/scene/visibility/lod-selector.d.ts +25 -0
  253. package/dist/scene/visibility/lod-selector.d.ts.map +1 -0
  254. package/dist/scene/visibility/occlusion-confidence.d.ts +81 -0
  255. package/dist/scene/visibility/occlusion-confidence.d.ts.map +1 -0
  256. package/dist/scene/visibility/occlusion-pass.d.ts +57 -0
  257. package/dist/scene/visibility/occlusion-pass.d.ts.map +1 -0
  258. package/dist/scene/visibility/occlusion-query-pool.d.ts +57 -0
  259. package/dist/scene/visibility/occlusion-query-pool.d.ts.map +1 -0
  260. package/dist/scene/visibility/occlusion-runtime.d.ts +96 -0
  261. package/dist/scene/visibility/occlusion-runtime.d.ts.map +1 -0
  262. package/dist/scene/visibility/types.d.ts +34 -0
  263. package/dist/scene/visibility/types.d.ts.map +1 -0
  264. package/dist/shadow-atlas.d.ts +3 -3
  265. package/dist/shadow-atlas.d.ts.map +1 -1
  266. package/dist/ssao-buffers.d.ts +3 -0
  267. package/dist/ssao-buffers.d.ts.map +1 -1
  268. package/dist/ssr/admission.d.ts +122 -0
  269. package/dist/ssr/admission.d.ts.map +1 -0
  270. package/dist/ssr/composition.d.ts +32 -0
  271. package/dist/ssr/composition.d.ts.map +1 -0
  272. package/dist/ssr/errors.d.ts +39 -0
  273. package/dist/ssr/errors.d.ts.map +1 -0
  274. package/dist/ssr/identity.d.ts +13 -0
  275. package/dist/ssr/identity.d.ts.map +1 -0
  276. package/dist/systems/skin-palette-allocator.d.ts +1 -1
  277. package/dist/targets/contracts.d.ts +66 -0
  278. package/dist/targets/contracts.d.ts.map +1 -0
  279. package/dist/targets/graph-projection.d.ts +29 -0
  280. package/dist/targets/graph-projection.d.ts.map +1 -0
  281. package/dist/targets/material-source.d.ts +34 -0
  282. package/dist/targets/material-source.d.ts.map +1 -0
  283. package/dist/targets/owner.d.ts +32 -0
  284. package/dist/targets/owner.d.ts.map +1 -0
  285. package/dist/targets/physical.d.ts +18 -0
  286. package/dist/targets/physical.d.ts.map +1 -0
  287. package/dist/targets/readback.d.ts +39 -0
  288. package/dist/targets/readback.d.ts.map +1 -0
  289. package/dist/temporal/frame-coordinator.d.ts +13 -0
  290. package/dist/temporal/frame-coordinator.d.ts.map +1 -1
  291. package/dist/temporal/frame.d.ts +2 -0
  292. package/dist/temporal/frame.d.ts.map +1 -1
  293. package/dist/temporal/index.mjs +6 -5
  294. package/dist/temporal/view.d.ts +7 -0
  295. package/dist/temporal/view.d.ts.map +1 -1
  296. package/dist/tilemap-chunk-extract-system.d.ts +1 -1
  297. package/dist/typed-render-graph-primitives.d.ts +5 -1
  298. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  299. package/dist/typed-shadow-passes.d.ts +1 -1
  300. package/dist/typed-shadow-passes.d.ts.map +1 -1
  301. package/dist/volume/passes.d.ts +9 -5
  302. package/dist/volume/passes.d.ts.map +1 -1
  303. package/package.json +20 -20
  304. package/src/__tests__/bloom-exact-zero.unit.test.ts +48 -19
  305. package/src/__tests__/bloom-lifecycle.integration.test.ts +41 -13
  306. package/src/__tests__/camera-target-consumption.unit.test.ts +53 -0
  307. package/src/__tests__/cluster-binner.unit.test.ts +35 -0
  308. package/src/__tests__/cluster-grid-default-surface.unit.test.ts +12 -2
  309. package/src/__tests__/cube-camera-scheduler.unit.test.ts +70 -0
  310. package/src/__tests__/cube-camera-single-submit.perf.test.ts +75 -0
  311. package/src/__tests__/cube-camera-view-matrices.unit.test.ts +41 -0
  312. package/src/__tests__/cube-camera-vocabulary.unit.test.ts +47 -0
  313. package/src/__tests__/cube-camera.integration.test.ts +42 -0
  314. package/src/__tests__/detached-inspection.integration.test.ts +6 -0
  315. package/src/__tests__/device-feature-admission.unit.test.ts +85 -0
  316. package/src/__tests__/direct-light-snapshot.unit.test.ts +62 -6
  317. package/src/__tests__/docs-gate-green.unit.test.ts +38 -0
  318. package/src/__tests__/environment-generation.integration.test.ts +16 -0
  319. package/src/__tests__/evidence-identity.ts +13 -0
  320. package/src/__tests__/evidence-identity.unit.test.ts +24 -0
  321. package/src/__tests__/extended-lighting-recovery.browser.test.ts +14 -0
  322. package/src/__tests__/extended-lighting-recovery.dawn.test.ts +14 -0
  323. package/src/__tests__/extended-lighting-recovery.integration.test.ts +81 -0
  324. package/src/__tests__/extended-lighting-resources.unit.test.ts +51 -0
  325. package/src/__tests__/extended-lighting-zero-feature.integration.test.ts +52 -0
  326. package/src/__tests__/factory-contract.integration.test.ts +288 -29
  327. package/src/__tests__/fog-component.unit.test.ts +67 -0
  328. package/src/__tests__/fog.integration.test.ts +86 -0
  329. package/src/__tests__/frame-observation.contract.test.ts +15 -0
  330. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +37 -0
  331. package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +146 -0
  332. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +10 -8
  333. package/src/__tests__/gpu-driven-indirect-raster.dawn.test.ts +18 -1
  334. package/src/__tests__/gpu-driven-production.integration.test.ts +579 -17
  335. package/src/__tests__/gpu-driven-scaling.unit.test.ts +66 -2
  336. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +26 -1
  337. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +101 -6
  338. package/src/__tests__/gpu-driven-view.browser.test.ts +3 -3
  339. package/src/__tests__/gpu-driven-view.dawn.test.ts +3 -3
  340. package/src/__tests__/gpu-driven-view.unit.test.ts +50 -0
  341. package/src/__tests__/gpu-lod-evidence.ts +188 -0
  342. package/src/__tests__/gpu-lod-fallback.integration.test.ts +10 -0
  343. package/src/__tests__/gpu-lod-indirect.integration.test.ts +40 -0
  344. package/src/__tests__/gpu-lod-parity.dawn.test.ts +29 -0
  345. package/src/__tests__/gpu-lod-readiness.integration.test.ts +52 -0
  346. package/src/__tests__/gpu-lod-schema.unit.test.ts +66 -0
  347. package/src/__tests__/gpu-lod-selector.unit.test.ts +28 -0
  348. package/src/__tests__/gpu-lod-silhouette.browser.test.ts +13 -0
  349. package/src/__tests__/gpu-pass-timing-browser-runner.ts +281 -0
  350. package/src/__tests__/gpu-pass-timing-coexistence.integration.test.ts +80 -0
  351. package/src/__tests__/gpu-pass-timing-contract.unit.test.ts +243 -0
  352. package/src/__tests__/gpu-pass-timing-exact-zero.unit.test.ts +131 -0
  353. package/src/__tests__/gpu-pass-timing-lifecycle.integration.test.ts +230 -0
  354. package/src/__tests__/gpu-pass-timing-observation.unit.test.ts +233 -0
  355. package/src/__tests__/gpu-pass-timing-session.unit.test.ts +438 -0
  356. package/src/__tests__/gpu-pass-timing.browser.test.ts +26 -0
  357. package/src/__tests__/gpu-pass-timing.rhi-null.unit.test.ts +125 -0
  358. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +66 -1
  359. package/src/__tests__/gpu-scene.dawn.test.ts +8 -1
  360. package/src/__tests__/gpu-scene.unit.test.ts +49 -3
  361. package/src/__tests__/hdrp-group2-visibility.unit.test.ts +24 -0
  362. package/src/__tests__/instances-culling.integration.test.ts +94 -0
  363. package/src/__tests__/instances-derived-bounds.unit.test.ts +118 -0
  364. package/src/__tests__/light-buffer-layout.unit.test.ts +113 -3
  365. package/src/__tests__/light-inspection.unit.test.ts +55 -0
  366. package/src/__tests__/light-resource-error.unit.test.ts +43 -0
  367. package/src/__tests__/lighting-scene-roundtrip.integration.test.ts +109 -0
  368. package/src/__tests__/lod-bounds.unit.test.ts +42 -0
  369. package/src/__tests__/lod-cpu-lane.integration.test.ts +55 -0
  370. package/src/__tests__/lod-cpu-no-change.perf.test.ts +19 -0
  371. package/src/__tests__/lod-gpu-frame-timing.unit.test.ts +49 -0
  372. package/src/__tests__/lod-multi-view.integration.test.ts +63 -0
  373. package/src/__tests__/lod-occlusion-device-loss.integration.test.ts +27 -0
  374. package/src/__tests__/lod-occlusion-final-decision.integration.test.ts +47 -0
  375. package/src/__tests__/lod-occlusion-inspection.integration.test.ts +217 -0
  376. package/src/__tests__/lod-occlusion-inspection.schema.test-d.ts +14 -0
  377. package/src/__tests__/lod-occlusion-inspection.unit.test.ts +72 -0
  378. package/src/__tests__/lod-occlusion-visual-evidence.ts +91 -0
  379. package/src/__tests__/lod-occlusion.browser.test.ts +15 -0
  380. package/src/__tests__/lod-occlusion.dawn.test.ts +20 -0
  381. package/src/__tests__/lod-selector.profile.test.ts +35 -0
  382. package/src/__tests__/lod-selector.unit.test.ts +68 -0
  383. package/src/__tests__/lod-visibility-identity.unit.test.ts +198 -0
  384. package/src/__tests__/lod-visibility-lifecycle.integration.test.ts +132 -0
  385. package/src/__tests__/ltc-resources.unit.test.ts +32 -0
  386. package/src/__tests__/material-contract-inventory.unit.test.ts +17 -0
  387. package/src/__tests__/material-observation.integration.test.ts +101 -0
  388. package/src/__tests__/occlusion-confidence.unit.test.ts +168 -0
  389. package/src/__tests__/occlusion-invalidation.integration.test.ts +37 -0
  390. package/src/__tests__/occlusion-pass-routing.unit.test.ts +16 -0
  391. package/src/__tests__/occlusion-pass.dawn.test.ts +20 -0
  392. package/src/__tests__/occlusion-pass.integration.test.ts +43 -0
  393. package/src/__tests__/occlusion-pass.rhi-null.test.ts +22 -0
  394. package/src/__tests__/occlusion-query-pool.rhi-null.test.ts +21 -0
  395. package/src/__tests__/occlusion-query-pool.unit.test.ts +95 -0
  396. package/src/__tests__/occlusion-query-ticket.integration.test.ts +47 -0
  397. package/src/__tests__/occlusion-query.dawn.test.ts +16 -0
  398. package/src/__tests__/occlusion-query.evidence.ts +178 -0
  399. package/src/__tests__/occlusion-query.rhi-null.test.ts +31 -0
  400. package/src/__tests__/occlusion-runtime.unit.test.ts +120 -0
  401. package/src/__tests__/pbr-view-layout.unit.test.ts +16 -0
  402. package/src/__tests__/point-shadow-inspection.unit.test.ts +60 -0
  403. package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +196 -0
  404. package/src/__tests__/probe-bindings.unit.test.ts +200 -0
  405. package/src/__tests__/probe-blend-numeric.unit.test.ts +67 -0
  406. package/src/__tests__/probe-blend-oracle.unit.test.ts +136 -0
  407. package/src/__tests__/probe-capacity.integration.test.ts +97 -0
  408. package/src/__tests__/probe-recovery.integration.test.ts +104 -0
  409. package/src/__tests__/probe-scene-dirty.integration.test.ts +211 -0
  410. package/src/__tests__/profiler-phase-catalog.test.ts +4 -1
  411. package/src/__tests__/profiler-phase-token.test.ts +1 -0
  412. package/src/__tests__/public-surface.test-d.ts +10 -0
  413. package/src/__tests__/rect-area-boundary.unit.test.ts +24 -0
  414. package/src/__tests__/reflection-fallback-graph.unit.test.ts +67 -0
  415. package/src/__tests__/reflection-fallback-inspection.unit.test.ts +77 -0
  416. package/src/__tests__/reflection-fallback-lifecycle.integration.test.ts +21 -0
  417. package/src/__tests__/reflection-fallback-projection.unit.test.ts +90 -0
  418. package/src/__tests__/reflection-fallback-source.unit.test.ts +32 -0
  419. package/src/__tests__/reflection-probe-authoring.unit.test.ts +71 -0
  420. package/src/__tests__/reflection-probe-filter.unit.test.ts +54 -0
  421. package/src/__tests__/reflection-probe-ibl-topology.unit.test.ts +45 -0
  422. package/src/__tests__/reflection-probe-owner-placement.unit.test.ts +39 -0
  423. package/src/__tests__/reflection-probe-pass-encode.integration.test.ts +101 -0
  424. package/src/__tests__/reflection-probe-performance.perf.test.ts +60 -0
  425. package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +120 -0
  426. package/src/__tests__/reflection-probe-recovery.integration.test.ts +55 -0
  427. package/src/__tests__/reflection-probe-selection.unit.test.ts +46 -0
  428. package/src/__tests__/render-error-code-owner.test-d.ts +19 -3
  429. package/src/__tests__/render-feature-docs.unit.test.ts +12 -7
  430. package/src/__tests__/render-graph-fallback.integration.test.ts +24 -0
  431. package/src/__tests__/render-perf/extended-lighting.bench.test.ts +66 -0
  432. package/src/__tests__/render-scene-projection.unit.test.ts +447 -18
  433. package/src/__tests__/render-target-admission.unit.test.ts +80 -0
  434. package/src/__tests__/render-target-graph-projection.unit.test.ts +102 -0
  435. package/src/__tests__/render-target-inspection.unit.test.ts +52 -0
  436. package/src/__tests__/render-target-material-source.test-d.ts +30 -0
  437. package/src/__tests__/render-target-material-source.unit.test.ts +97 -0
  438. package/src/__tests__/render-target-owner-placement.unit.test.ts +203 -0
  439. package/src/__tests__/render-target-owner.unit.test.ts +122 -0
  440. package/src/__tests__/render-target-probe-soak.perf.test.ts +94 -0
  441. package/src/__tests__/render-target-public-schema.json +107 -0
  442. package/src/__tests__/render-target-public-schema.unit.test.ts +91 -0
  443. package/src/__tests__/render-target-public-surface.test-d.ts +83 -0
  444. package/src/__tests__/render-target-readback.integration.test.ts +90 -0
  445. package/src/__tests__/render-target-recovery.integration.test.ts +85 -0
  446. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +124 -0
  447. package/src/__tests__/renderer-lifecycle.integration.test.ts +14 -0
  448. package/src/__tests__/shader-stage-surface.unit.test.ts +19 -4
  449. package/src/__tests__/skin-motion-regression.unit.test.ts +154 -0
  450. package/src/__tests__/skinned-shadow-caster.test.ts +13 -4
  451. package/src/__tests__/spot-modifier-projection.unit.test.ts +70 -0
  452. package/src/__tests__/ssr-admission-matrix.integration.test.ts +206 -0
  453. package/src/__tests__/ssr-composition.unit.test.ts +46 -0
  454. package/src/__tests__/ssr-fallback-zero-work.bench.test.ts +94 -0
  455. package/src/__tests__/ssr-recovery-errors.unit.test.ts +58 -0
  456. package/src/__tests__/standard-cluster-capability.integration.test.ts +63 -0
  457. package/src/__tests__/standard-cluster-transport.unit.test.ts +121 -0
  458. package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +299 -0
  459. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +15 -5
  460. package/src/__tests__/standard-lighting-inspection.integration.test.ts +138 -0
  461. package/src/__tests__/standard-lighting-ssot.unit.test.ts +18 -0
  462. package/src/__tests__/standard-lighting-write.unit.test.ts +441 -0
  463. package/src/__tests__/standard-lighting.integration.test.ts +67 -0
  464. package/src/__tests__/standard-pipeline.dawn.test.ts +206 -5
  465. package/src/__tests__/standard-pipeline.integration.test.ts +181 -150
  466. package/src/__tests__/standard-probe-binding.unit.test.ts +25 -0
  467. package/src/__tests__/standard-profile-oracle.unit.test.ts +23 -38
  468. package/src/__tests__/temporal-fallback-generation.integration.test.ts +16 -0
  469. package/src/__tests__/temporal-view.unit.test.ts +3 -3
  470. package/src/__tests__/transmission-prewarm.unit.test.ts +69 -0
  471. package/src/__tests__/typed-pipeline-topology.unit.test.ts +395 -14
  472. package/src/__tests__/urp-pipeline-targets.unit.test.ts +2 -2
  473. package/src/__tests__/visibility-budget.integration.test.ts +140 -0
  474. package/src/__tests__/visibility-budget.unit.test.ts +70 -0
  475. package/src/__tests__/visibility-extract.integration.test.ts +11 -6
  476. package/src/__tests__/visibility-resolver.unit.test.ts +15 -0
  477. package/src/__tests__/volumetric-fog-point-spot-accumulation.integration.test.ts +6 -3
  478. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +31 -28
  479. package/src/assembly/backend-contract.ts +13 -0
  480. package/src/assembly/device-feature-admission.ts +80 -0
  481. package/src/assembly/directional-shadow-inspection.ts +122 -0
  482. package/src/assembly/factory.ts +1411 -366
  483. package/src/assembly/host-contract.ts +35 -0
  484. package/src/assembly/render-target-host.ts +847 -0
  485. package/src/assets/asset-decoders.ts +1 -1
  486. package/src/assets/render-asset-port.ts +7 -1
  487. package/src/capture/cube-views.ts +69 -0
  488. package/src/capture/scheduler.ts +265 -0
  489. package/src/cluster-binner.ts +31 -0
  490. package/src/components/__tests__/lighting-authoring.unit.test.ts +39 -0
  491. package/src/components/__tests__/rect-area-light.unit.test.ts +33 -0
  492. package/src/components/__tests__/schema-contract.unit.test.ts +12 -0
  493. package/src/components/__tests__/schema-parity.unit.test.ts +9 -0
  494. package/src/components/camera.ts +4 -0
  495. package/src/components/cube-camera.ts +52 -0
  496. package/src/components/directional-light.ts +22 -2
  497. package/src/components/directional-shadow-filter.ts +57 -0
  498. package/src/components/index.ts +5 -0
  499. package/src/components/light-helpers.ts +133 -8
  500. package/src/components/light-probe.ts +13 -0
  501. package/src/components/rect-area-light.ts +15 -0
  502. package/src/components/reflection-probe.ts +49 -0
  503. package/src/components/scene-instance.ts +6 -0
  504. package/src/components/spot-light.ts +3 -0
  505. package/src/device/__tests__/extended-lighting-recovery.unit.test.ts +24 -0
  506. package/src/device/gpu-residency.ts +140 -9
  507. package/src/device/lifecycle-transaction.ts +12 -0
  508. package/src/environment/frame.ts +6 -24
  509. package/src/environment/lifecycle.ts +20 -1
  510. package/src/errors/gpu-driven.ts +92 -0
  511. package/src/errors/index.ts +1 -0
  512. package/src/errors/recover.ts +32 -0
  513. package/src/errors/render.ts +341 -143
  514. package/src/extract/camera.ts +3 -3
  515. package/src/extract/directional-shadow-projection.ts +61 -0
  516. package/src/extract/environment.ts +57 -0
  517. package/src/extract/gpu-driven.ts +108 -0
  518. package/src/extract/visibility.ts +2 -1
  519. package/src/features/fullscreen.ts +3 -0
  520. package/src/features/targets.ts +4 -1
  521. package/src/features/types.ts +10 -0
  522. package/src/fullscreen-post-process-pass.ts +43 -2
  523. package/src/gpu-driven/batch-topology.ts +207 -28
  524. package/src/gpu-driven/prepared-draw.ts +208 -0
  525. package/src/gpu-driven/production-raster.ts +953 -43
  526. package/src/gpu-driven/view-gpu.ts +411 -29
  527. package/src/gpu-scene-schema.ts +13 -0
  528. package/src/gpu-scene.ts +140 -64
  529. package/src/gpu-usage.ts +0 -1
  530. package/src/hdrp-buffers.ts +169 -63
  531. package/src/ibl/IblPipelineCache.ts +11 -0
  532. package/src/ibl/kernel-cache.ts +88 -0
  533. package/src/index.ts +222 -0
  534. package/src/inspection-types.ts +276 -1
  535. package/src/instances-derived-bounds.ts +171 -0
  536. package/src/internal.ts +38 -0
  537. package/src/light-buffer-layout.ts +155 -310
  538. package/src/materials.ts +16 -2
  539. package/src/mesh-material-bindings.ts +132 -0
  540. package/src/pbr-pipeline.ts +255 -60
  541. package/src/pipeline/standard-forward-lane.ts +93 -16
  542. package/src/pipeline/standard-lighting/errors.ts +6 -0
  543. package/src/pipeline/standard-lighting/graph.ts +158 -0
  544. package/src/pipeline/standard-lighting/inspection.ts +88 -0
  545. package/src/pipeline/standard-lighting/layout.ts +31 -0
  546. package/src/pipeline/standard-lighting/light-frame.ts +35 -0
  547. package/src/pipeline/standard-lighting/membership.ts +43 -0
  548. package/src/pipeline/standard-lighting/prepare.ts +37 -0
  549. package/src/pipeline/standard-lighting/topology.ts +120 -0
  550. package/src/pipeline/standard-lighting/transport.ts +78 -0
  551. package/src/pipeline/standard-pipeline.ts +124 -193
  552. package/src/pipeline/standard-post.ts +26 -7
  553. package/src/pipeline/standard-profile.ts +17 -47
  554. package/src/pipeline-builder.ts +5 -2
  555. package/src/pipeline-spec.ts +95 -21
  556. package/src/plugin.ts +4 -0
  557. package/src/point-shadow-inspection.ts +55 -0
  558. package/src/prepare/__tests__/extended-lighting-capability.unit.test.ts +56 -0
  559. package/src/prepare/extended-lighting/ltc-resources.ts +136 -0
  560. package/src/prepare/extended-lighting/resources.ts +389 -0
  561. package/src/prepare/extended-lighting/spot-modifiers.ts +194 -0
  562. package/src/prepare/extended-lighting/state.ts +92 -0
  563. package/src/record/__tests__/gpu-timing.unit.test.ts +177 -0
  564. package/src/record/__tests__/temporal-payload.unit.test.ts +64 -1
  565. package/src/record/__tests__/transparent-group2-selection.unit.test.ts +73 -0
  566. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +20 -1
  567. package/src/record/__tests__/view-ubo-layout.unit.test.ts +40 -0
  568. package/src/record/frame-lighting.ts +591 -452
  569. package/src/record/frame-snapshot.ts +92 -39
  570. package/src/record/frame-targets.ts +17 -0
  571. package/src/record/frame.ts +662 -158
  572. package/src/record/gpu-pass-timing/contract.ts +180 -0
  573. package/src/record/gpu-pass-timing/errors.ts +34 -0
  574. package/src/record/gpu-pass-timing/index.ts +37 -0
  575. package/src/record/gpu-pass-timing/parser.ts +97 -0
  576. package/src/record/gpu-pass-timing/session.ts +938 -0
  577. package/src/record/gpu-timing.ts +112 -39
  578. package/src/record/helpers.ts +0 -58
  579. package/src/record/main-pass-geometry.ts +324 -119
  580. package/src/record/main-pass-material.ts +103 -10
  581. package/src/record/main-pass-sprite-draws.ts +99 -103
  582. package/src/record/main-pass.ts +71 -15
  583. package/src/record/mesh-ssbo.ts +47 -36
  584. package/src/record/render-context.ts +136 -3
  585. package/src/record/shadow-pass.ts +83 -68
  586. package/src/record/skybox-post-pass.ts +20 -4
  587. package/src/record/typed-frame-graph.ts +1034 -43
  588. package/src/record/view-ubo.ts +72 -47
  589. package/src/reflection/filter.ts +81 -0
  590. package/src/reflection/gpu-table.ts +44 -0
  591. package/src/reflection/inspection.ts +67 -0
  592. package/src/reflection/projection.ts +476 -0
  593. package/src/reflection/record-owner.ts +1283 -0
  594. package/src/render-contract.ts +93 -10
  595. package/src/render-graph-primitives.ts +9 -4
  596. package/src/render-pipeline.ts +122 -2
  597. package/src/render-system-extract.ts +1041 -225
  598. package/src/render-system.ts +1310 -85
  599. package/src/renderer.ts +222 -0
  600. package/src/scene/__tests__/changed-block-summary.candidate.test.ts +36 -0
  601. package/src/scene/probe-blend-record.ts +54 -0
  602. package/src/scene/probe-blend.ts +813 -0
  603. package/src/scene/render-scene-types.ts +0 -7
  604. package/src/scene/render-scene.ts +942 -171
  605. package/src/scene/visibility/bounds.ts +57 -0
  606. package/src/scene/visibility/budget.ts +40 -0
  607. package/src/scene/visibility/facet.ts +400 -0
  608. package/src/scene/visibility/gpu-frame-timing.ts +101 -0
  609. package/src/scene/visibility/gpu-lod.ts +119 -0
  610. package/src/scene/visibility/inspection.ts +313 -0
  611. package/src/scene/visibility/lod-selector.ts +84 -0
  612. package/src/scene/visibility/occlusion-confidence.ts +478 -0
  613. package/src/scene/visibility/occlusion-pass.ts +165 -0
  614. package/src/scene/visibility/occlusion-query-pool.ts +178 -0
  615. package/src/scene/visibility/occlusion-runtime.ts +672 -0
  616. package/src/scene/visibility/types.ts +50 -0
  617. package/src/shadow-atlas.ts +5 -5
  618. package/src/ssao-buffers.ts +9 -2
  619. package/src/ssr/admission.ts +451 -0
  620. package/src/ssr/composition.ts +73 -0
  621. package/src/ssr/errors.ts +76 -0
  622. package/src/ssr/identity.ts +12 -0
  623. package/src/systems/skin-palette-allocator.ts +1 -1
  624. package/src/targets/contracts.ts +182 -0
  625. package/src/targets/graph-projection.ts +169 -0
  626. package/src/targets/material-source.ts +143 -0
  627. package/src/targets/owner.ts +214 -0
  628. package/src/targets/physical.ts +18 -0
  629. package/src/targets/readback.ts +153 -0
  630. package/src/temporal/frame-coordinator.ts +26 -0
  631. package/src/temporal/frame.ts +14 -1
  632. package/src/temporal/view.ts +11 -0
  633. package/src/tilemap-chunk-extract-system.ts +4 -4
  634. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +59 -20
  635. package/src/typed-render-graph-primitives.ts +53 -3
  636. package/src/typed-shadow-passes.ts +46 -40
  637. package/src/volume/passes.ts +61 -58
  638. package/dist/.tsbuildinfo +0 -1
  639. package/dist/chunk-4XINDLAY.mjs.map +0 -1
  640. package/dist/chunk-CDTWTHZR.mjs.map +0 -1
  641. package/dist/chunk-M2MP4ZOU.mjs +0 -73
  642. package/dist/chunk-M2MP4ZOU.mjs.map +0 -1
  643. package/dist/chunk-PCHBPYML.mjs.map +0 -1
  644. package/dist/chunk-TBQJOK2L.mjs.map +0 -1
  645. package/dist/chunk-VFPLTKCU.mjs.map +0 -1
package/README.md CHANGED
@@ -8,6 +8,30 @@
8
8
 
9
9
  ## Public frame contract
10
10
 
11
+ ## 灯光最短入口
12
+
13
+ 三条最短入口:
14
+
15
+ 1. `RectAreaLight`:在现有 `Transform` 上声明单面矩形发光体,尺寸由 `width` 与 `height` 持有。
16
+ 2. `SpotLight`:用 `iesProfile` 和 `cookie` 绑定现有资产,用 `rollDeg` 共享方位角;缺席 handle 是乘法单位元。
17
+ 3. `LightProbe`:声明 27 个 `irradiance` 值和唯一的 `radius`,位置与朝向仍来自 `Transform`。
18
+
19
+ 这些是 authored/render 输入,不是 GPU slot、LTC、probe asset 或第二个 Renderer API。尺寸、半径和 `rollDeg` 在场景序列化中保留;资产 GUID 通过 Pack/Catalog 的 `refs` 往返,不能从 URL 或数组位置推断身份。
20
+
21
+ ### Extended-lighting consumer route
22
+
23
+ The three smallest public examples are `RectAreaLight(width, height)`,
24
+ `SpotLight(iesProfile, cookie, rollDeg)`, and `LightProbe(irradiance, radius)`.
25
+ Probe diffuse uses `A={admitted && d<r}`, `c=1-(d/r)^2`, scaled finite `qhat`,
26
+ `alpha=q/Q`, `C=1-prod(1-c)`, and `S=1-C`; Sky is only
27
+ `S*E_sky(N)`. It never enters probe admission, `Q`, `alpha`, specular, or
28
+ `DirectLightSlot`. `recordByteLength=160` is the per-object ABI receipt.
29
+
30
+ Recovery is inspected as data: read `code`, `expected`, `hint`, and typed
31
+ `detail`; keep the current LKG until the replacement generation is accepted.
32
+ GPU, Browser, and Dawn evidence that cannot execute is `not-run` or
33
+ `unavailable`, never a verified structural substitute.
34
+
11
35
  The public frame vocabulary is intentionally small. `Camera` is the authoring
12
36
  owner for tone, antialiasing, bloom, and `historyVersion`; `Atmosphere` and
13
37
  `Fog` are independent ECS components. The renderer extracts these facts into
@@ -25,10 +49,86 @@ typed `detail`, repair that owner, and submit the same request again. Public
25
49
  consumers do not parse `message` and never receive graph nodes, devices,
26
50
  history textures, or prepared handles.
27
51
 
28
- The current-source manifest and schema identify `source`, `build`, `backend`,
29
- `runner`, and `frameIdentity`. Structural graph receipts, Browser/Dawn
30
- readback or PNG evidence, and historical oracle data are separate evidence
31
- classes. An unavailable backend is reported as unavailable.
52
+ The current-source manifest and schema identify `source`, `build`, `backend`,
53
+ `runner`, and `frameIdentity`. Structural graph receipts, Browser/Dawn
54
+ readback or PNG evidence, and historical oracle data are separate evidence
55
+ classes. An unavailable backend is reported as unavailable.
56
+
57
+ ## RenderFeature: the producer seam (first-read index)
58
+
59
+ ### Material contract projection
60
+
61
+ Render consumes only the Pack-owned material publication projection. Its
62
+ inputs are runtime bool/value data, composed module slots, and the closed
63
+ compiler context; render never authors, cooks, writes DDC, or selects a
64
+ fallback material. The projection preserves `layoutIdentity`,
65
+ `programIdentity`, `cookIdentity`, and `materialPublicationIdentity` so a
66
+ stale draw can be traced to the first producer divergence.
67
+
68
+ The public route is one `RenderFeature<FrameData>` through the Standard
69
+ Pipeline and the active RenderGraph pass. In the examples below, `type FrameData`
70
+ is the producer-owned extracted value. A feature extracts one frame value,
71
+ then its mandatory `plan(data, context)` declares named resources and passes;
72
+ the host derives graph access, preparation, recording, and recovery from that
73
+ plan. Register it at construction with
74
+ `createRenderer(canvas, { features: [feature] })`. A feature never receives a
75
+ device, queue, encoder, staging builder, or submit callback.
76
+
77
+ ### Directional shadow quality: author → inspect → recover
78
+
79
+ `DirectionalLight` is the only authoring entry for directional shadow quality.
80
+ Set `shadowFilter` with the numeric constant for one of the five closed labels
81
+ below; it is an ECS enum field, not a label string. Do not invent a numeric
82
+ label or a compatibility alias. The default is `pcf3`. The two PCSS fields
83
+ are read only when `shadowFilter` is `pcssMedium` or `pcssHigh`:
84
+
85
+ ```ts
86
+ import { DirectionalLight, DirectionalShadowFilterValue } from '@forgeax/engine-render';
87
+
88
+ world.spawn({ component: DirectionalLight, data: {
89
+ direction: [0.2, -0.98, 0],
90
+ shadowFilter: DirectionalShadowFilterValue.pcssHigh,
91
+ shadowAngularRadius: 0.00465,
92
+ maxPenumbraTexels: 32,
93
+ } });
94
+ ```
95
+
96
+ | Author field | Valid values / units | Default | Effective meaning |
97
+ |:--|:--|:--|:--|
98
+ | `shadowFilter` | `pcf1`, `pcf3`, `pcf5`, `pcssMedium`, `pcssHigh` | `pcf3` | Requested directional filter profile |
99
+ | `shadowAngularRadius` | Radians, finite range `[0.0001, 0.05]` | `0.00465` | PCSS light angular radius |
100
+ | `maxPenumbraTexels` | Texels, finite integer range `[1, 64]` | `32` | PCSS penumbra ceiling |
101
+
102
+ The remaining CSM fields keep these public units and defaults: `cascadeCount`
103
+ is an integer in `[1, 4]` (default `4`), `splitLambda` is `[0, 1]` (default
104
+ `0.75`), `cascadeBlend` is `[0, 0.5]` (default `0.2`), `mapSize` is a positive
105
+ map resolution (default `2048`), `depthBias` is a depth value (default
106
+ `0.005`), `normalBias` is a world-space offset (default `0.05`), and
107
+ `shadowDistance` is a positive world-unit distance in meters (default `200`).
108
+
109
+ After `draw`, read the single `renderer.inspect().directionalShadow` projection.
110
+ It is JSON-safe and bounded: `requested` is author intent, `effective` is the
111
+ admitted profile, `status` is `accepted | fallback | rejected`, and
112
+ `fallbackReason` explains `webgl2-unsupported`, `rhi-null-structural`, or
113
+ `candidate-failed`. `lastKnownGood` identifies retained output and
114
+ `pixelEvidence` distinguishes real pixel evidence from `not-available`.
115
+ `cascadeCount`, `mapSize`, `atlasBytes`, `writerPasses`, `blockerTaps`,
116
+ `filterTapUpperBound`, `seamTapUpperBound`, `deviceGeneration`, and
117
+ `graphGeneration` are inspection facts, not additional author controls.
118
+
119
+ If author validation returns `error.code === 'shadow-invalid-config'`, do not
120
+ parse `error.message`. Read `error.expected`, `error.hint`,
121
+ `error.detail.field`, `error.detail.actual`, `error.detail.bound`, and
122
+ `error.detail.reason`; repair the named `DirectionalLight` field and retry the
123
+ same request. For a rejected candidate, retain `lastKnownGood` from inspection,
124
+ repair or rebuild the named producer, then call the existing `renderer.recover()`
125
+ boundary and retry. WebGL2 reports its explicit PCF lane; RhiNull reports
126
+ `rhi-null-structural` only, so neither is PCSS pixel evidence.
127
+ Missing or `not-run` Browser/Dawn/PNG/timing evidence remains missing or
128
+ `not-run`, never a pass. The authoritative labels and validation remain in
129
+ [`directional-light.ts`](src/components/directional-light.ts) and
130
+ [`light-helpers.ts`](src/components/light-helpers.ts); this section is an AI
131
+ index path, not a second schema.
32
132
 
33
133
  ```ts
34
134
  import {
@@ -55,6 +155,102 @@ environment owners or multiple fog owners return structured errors with a
55
155
  code-specific `detail`; they do not create a second registry or silently pick
56
156
  the first entity. Frame facts contain IDs, revisions, and POD values only, not
57
157
  textures, buffers, devices, or other live GPU objects.
158
+ ## GPU pass timing: opt in, draw, observe, branch on status
159
+
160
+ GPU pass timing is disabled by default. Opt in once on `createRenderer`, keep the
161
+ returned `FrameReceipt`, and request facts only for that receipt. The pass
162
+ duration is a bounded GPU fact; it is not frame latency.
163
+
164
+ ```ts
165
+ import { createRenderer } from '@forgeax/engine-runtime';
166
+
167
+ const created = await createRenderer(canvas, { gpuPassTiming: {} });
168
+ if (!created.ok) throw created.error;
169
+ const renderer = created.value;
170
+ const attached = renderer.attach(world);
171
+ if (!attached.ok) throw attached.error;
172
+ const drawn = renderer.draw({
173
+ leases: [attached.value],
174
+ camera: { lease: attached.value },
175
+ environment: { lease: attached.value },
176
+ });
177
+ if (!drawn.ok) throw drawn.error;
178
+
179
+ const observed = await renderer.observe(drawn.value, { include: ['timings'] });
180
+ if (!observed.ok) throw observed.error;
181
+ const timings = observed.value.timings;
182
+ if (timings === undefined) throw new Error('timings were not requested');
183
+ switch (timings.status) {
184
+ case 'complete':
185
+ console.log(timings.frame.passes);
186
+ break;
187
+ case 'partial':
188
+ console.log(timings.reason.code, timings.frame.passes);
189
+ break;
190
+ case 'unavailable':
191
+ console.log(timings.reason.code, timings.capability);
192
+ break;
193
+ case 'failed':
194
+ console.log(timings.error.code, timings.latestKnownGood);
195
+ break;
196
+ }
197
+ ```
198
+
199
+ The [bounded fact contract](src/record/gpu-pass-timing/contract.ts),
200
+ [recovery errors](src/record/gpu-pass-timing/errors.ts), and
201
+ [validator](bench/gpu-pass-timing/validator.ts) are the source-linked
202
+ references for the four status branches and the fail-closed benchmark verdict.
203
+ A timing error exposes the closed `code` union plus `expected`, `hint`, and
204
+ `detail`; follow the producer-owned recovery action in the error before
205
+ observing a later receipt. `latestKnownGood` is a separate reference and never
206
+ changes the current status or completeness. Omitting `timings` from `include`
207
+ returns receipt metadata without materializing timing facts.
208
+
209
+ Run the paired real-GPU benchmark with the Dawn host:
210
+
211
+ ```sh
212
+ FORGEAX_GPU_PASS_TIMING_HOST_MODULE="$PWD/packages/render/bench/gpu-pass-timing/dawn-host.ts" \
213
+ pnpm gpu-pass-timing:bench -- --output=/tmp/forgeax-gpu-pass-timing.json
214
+ ```
215
+
216
+ The command exits `0` only for a complete accepted report and exits `2` for a
217
+ blocked report. When an observation is `partial`, branch on
218
+ `timings.reason.code === 'timestamp-write-unavailable'`, retain the
219
+ unmeasured pass and its structured `detail.cause`, then observe the next
220
+ receipt after the producer-owned recovery action. Do not turn that pass into a
221
+ zero-duration sample or accept the benchmark until all paired windows are
222
+ complete.
223
+
224
+ An accepted report retains `frameFacts`: one complete on-path frame fact per paired
225
+ group, including the frame identity, raw decimal ticks, each measured pass duration,
226
+ and `measuredPassNanoseconds`. If a real run is blocked by partial observations, the
227
+ blocked JSON keeps the observed representative facts under `evidence.frameFacts` so
228
+ the measured values remain inspectable without weakening the verdict. If complete
229
+ windows fail the paired overhead gate, `evidence.windows` retains the raw samples and
230
+ `evidence.pairedOverhead` retains each group p95, group overhead, and reported median.
231
+
232
+ Measured entries expose `measurementSource`: raster and compute entries use
233
+ `pass-boundary`; copy entries use `copy-boundary-envelope`, the interval between
234
+ timing-only marker passes, and must not be read as exact copy duration.
235
+
236
+ ## Fog and point-shadow observations
237
+
238
+ `Fog` is a one-per-World environment input. Extract validates its parameters
239
+ before publication; an invalid update keeps the renderer's last-known-good
240
+ fog frame and exposes the structured failure through the existing inspection
241
+ path. There is no app-local fog state.
242
+
243
+ Point shadows use one renderer-owned cube-array `ShadowAtlas`. The public
244
+ `SHADOW_ATLAS_DEFAULT_FACE_SIZE` and `SHADOW_ATLAS_DEFAULT_LAYERS` constants
245
+ are the only capacity owner; extract assigns `shadowAtlasLayer: -1` to
246
+ requests beyond that capacity while retaining them for inspection. After a
247
+ successful frame, `renderer.inspect().pointShadow` reports `requested`,
248
+ `admitted`, `shadowed`, `shadowAtlasOccupancy`, and `shadowAtlasCapacity`.
249
+ The App `pointShadowPlugin()` consumes that renderer capability and provides
250
+ structured preflight failures for missing-storage-buffer, invalid, or
251
+ over-budget requests. A World with no `PointLightShadow` remains `inactive`;
252
+ there is no pseudo-disabled shadow mode. Directional CSM remains a separate
253
+ shadow owner; PointLightShadow is not a second directional-light path.
58
254
 
59
255
  ## Render happy path
60
256
 
@@ -79,10 +275,97 @@ if (!frame.ok) throw frame.error;
79
275
  const observation = await renderer.observe(frame.value, { include: ['timings'] });
80
276
  ```
81
277
 
82
- The Standard pipeline selects direct or clustered lighting from capabilities and keeps shadow,
83
- PBR, IBL, SSAO, bloom, tone, antialiasing, sky, material, VFX, and debug feature ownership inside
84
- the same graph and submit boundary. CPU and WebGL2 fallback are capability lanes of that pipeline,
85
- not second renderer identities.
278
+ The Standard pipeline uses one Cluster transport for every local light on storage-capable devices
279
+ and keeps shadow, PBR, IBL, SSAO, bloom, tone, antialiasing, sky, material, VFX, and debug feature
280
+ ownership inside the same graph and submit boundary. CPU and WebGL2 remain capability lanes for the
281
+ Cluster membership producer or for mesh/instance storage fallback; they do not reintroduce a
282
+ PointLight/SpotLight buffer or a fixed four-light ABI.
283
+ ## SSR M0 admission: inspect owners, then decide
284
+
285
+ > [!IMPORTANT]
286
+ > SSR M0 is a consumer-only admission boundary. It reads detached producer,
287
+ > r32float format, and temporal receipts with one four-field integration
288
+ > identity. Any missing, stale, structural-only, or mismatched receipt stays
289
+ > `fallback-only` and emits zero SSR work; this section does not describe SSR
290
+ > capture, ray tracing, Hi-Z, temporal resolve, composition, or history.
291
+
292
+ ```mermaid
293
+ flowchart LR
294
+ P["producer detached receipt"] --> A["admitSsrM0"]
295
+ F["format stage receipt"] --> A
296
+ T["temporal submit receipt"] --> A
297
+ A -->|"all identity and verdict checks pass"| E["admitted: parent M1 may unlock"]
298
+ A -->|"missing, stale, unavailable, or mismatched"| B["fallback-only: zero work"]
299
+ ```
300
+
301
+ The inspection route is deliberately progressive:
302
+
303
+ | Layer | Read first | Owner action on failure |
304
+ |:--|:--|:--|
305
+ | Status | `status`, `failure.code`, `failure.expected` | branch on the closed failure code |
306
+ | Identity | `sourceHead`, `sourceTree`, `lockSha256`, `buildSha256` | rebuild the owner receipt for the current identity |
307
+ | Generation | producer `generation`, format `deviceGeneration`, temporal `generation` | discard stale completion and reinspect |
308
+ | Recovery | `failure.hint`, typed `detail.owner`, `detail.action` | use LKG/Skylight/neutral, recapture, rebuild, or retry through that owner |
309
+ | Work | attachment/pass/binding/resource/history/temporal counters | require exact zero on every blocked path |
310
+
311
+ ```ts
312
+ const admission = admitSsrM0({ requested, identity, reflectionFallback, format, temporal });
313
+ if (admission.status === 'fallback-only') {
314
+ // Read admission.failure.code and route recovery to its owner.
315
+ console.log(admission.work); // every SSR counter is zero
316
+ }
317
+ ```
318
+
319
+ Use `inspect -> owner recovery -> matching submit -> reinspect` as the complete
320
+ AI route. No returned field is a device, graph node, texture, buffer, encoder,
321
+ or other live handle. A stable generation keeps `resetCount`, `rebuildCount`,
322
+ and additional format probe work at zero; a changed generation must be
323
+ reinspected before admission can be considered again.
324
+
325
+ `inspect()` is a synchronous snapshot. The first snapshot after binding may show
326
+ an absent format or temporal receipt while the owner probe and first submit are
327
+ still in flight; it is not a `pending` verdict. Run the ordinary owner frame,
328
+ await `FrameReceipt.completed`, then inspect again before routing recovery.
329
+
330
+ There are two action projections. `admission.failure.detail.action` is the coarse
331
+ M0 gate instruction (`retry` for demand/readiness and `rebuild` for a missing or
332
+ mismatched receipt). `reflectionFallbackInspection.recoveryAction` is the
333
+ producer's more specific source/recapture instruction. Neither is a second SSR
334
+ API; use the existing owner operation shown here, then submit and inspect again:
335
+
336
+ | Action field | Owner operation | Next observation |
337
+ |:--|:--|:--|
338
+ | `reflectionFallbackInspection.recoveryAction = use-LKG` | Keep the compatible probe row and draw the next frame | Read the committed row and matching temporal receipt |
339
+ | `reflectionFallbackInspection.recoveryAction = use-Skylight` / `use-neutral` | Change the World-owned probe/`Skylight` source, then draw | Confirm selected source and committed generation |
340
+ | `reflectionFallbackInspection.recoveryAction = recapture` / `rebuild` / `retry` | Draw again so the producer/RHI owner retries pending work | Await completion and inspect the owner receipt/failure |
341
+ | `admission.failure.detail.action = retry` / `rebuild` | Retry the consumer frame, or rebuild the named owner receipt | Reinspect admission and all three receipt generations |
342
+ | device-loss recovery | `await renderer.recover()` before the next draw | Confirm the replacement `deviceGeneration`, then re-probe |
343
+
344
+ SSR never invokes these operations or mutates producer/device state; this table
345
+ maps the typed action to the existing public World and Renderer seams.
346
+
347
+ ## Target and probe lifecycle index
348
+
349
+ The public target route is one Renderer owner: create a typed `RenderTarget`, create a
350
+ `RenderTargetTextureSource` for the material slot, request a readback ticket, draw once, await
351
+ `FrameReceipt.completed`, then call `observe(receipt, ...)`. `CubeCamera` contributes six real
352
+ face views to the existing frame graph; a candidate becomes active only after its completed
353
+ receipt. `ReflectionProbe` adds bounded PMREM face/mip work, local box projection, and Skylight
354
+ irradiance fallback through the same Standard material binding path.
355
+
356
+ Use `inspect()` for bounded target/probe counts, pending work, and the last structured failure.
357
+ `inspection.reflectionProbes.selection` identifies the selected probe by `worldId` and `entityKey`,
358
+ or reports `{ kind: 'skylight' }` for the explicit fallback. `recover()` is meaningful only from `device-lost`; on a healthy renderer its structured
359
+ `renderer-state-invalid` result is a guard. Device recovery invalidates old generations and
360
+ rebuilds producer-owned physical resources, so old tickets and sources must not be reused.
361
+ For the SSR dependency producer, `inspection.reflectionProbes.reflectionFallbackInspection`
362
+ is the bounded recovery projection: its `receipt` is the committed source row selected for
363
+ the current lighting selection, while `failureStage`, `failureCode`, `expected`, and
364
+ `recoveryAction` describe the latest closed failure without exposing a texture, graph, or
365
+ device handle. `reflectionFallbackReadback` is the separate completed attachment fact; it
366
+ must match the committed row's frame and device generation before it is used as evidence.
367
+ The exact public names and stable consumer IDs are machine-readable in
368
+ `src/__tests__/render-target-public-schema.json`.
86
369
 
87
370
  ## Stable inspection and dark-gradient evidence
88
371
 
@@ -186,26 +469,6 @@ gate exercises the browser delivery path. Runtime inspection uses the public
186
469
  belongs in `packages/render/bench` and its dev-verify producer. Render does
187
470
  not expose a timing controller or a second membership-specific API.
188
471
 
189
- ## RenderFeature: the producer seam (first-read index)
190
-
191
- ### Material contract projection
192
-
193
- Render consumes only the Pack-owned material publication projection. Its
194
- inputs are runtime bool/value data, composed module slots, and the closed
195
- compiler context; render never authors, cooks, writes DDC, or selects a
196
- fallback material. The projection preserves `layoutIdentity`,
197
- `programIdentity`, `cookIdentity`, and `materialPublicationIdentity` so a
198
- stale draw can be traced to the first producer divergence.
199
-
200
- The public route is one `RenderFeature<FrameData>` through the Standard
201
- Pipeline and the active RenderGraph pass. In the examples below, `type FrameData`
202
- is the producer-owned extracted value. A feature extracts one frame value,
203
- then its mandatory `plan(data, context)` declares named resources and passes;
204
- the host derives graph access, preparation, recording, and recovery from that
205
- plan. Register it at construction with
206
- `createRenderer(canvas, { features: [feature] })`. A feature never receives a
207
- device, queue, encoder, staging builder, or submit callback.
208
-
209
472
  ## Motion Blur temporal consumer
210
473
 
211
474
  The Standard camera may carry the presence-enabled `MotionBlur` component. Its
@@ -255,6 +518,31 @@ uses the neutral engine material.
255
518
 
256
519
  The render path is `MaterialAsset` -> extract snapshot -> prepare resources -> record the per-slot `coordinates` and values. The effective `parent` is already resolved before extract. If a material contract or reflection binding fails, preserve the structured error and repair the source contract or cooked module before drawing again; that is the recovery route. The render package owns consumption, not material import or cook policy.
257
520
 
521
+ ### Resident material observation
522
+
523
+ `renderer.inspect().meshMaterialBindings[]` is the detached observation of the
524
+ binding that the renderer actually consumed. Its `residency` projection records
525
+ `ready`, `pending`, `failed`, or `last-known-good`, plus the resolved sampler
526
+ handles, texture handles, mip counts, and the nearest structured preparation
527
+ failure when one exists. The observation is recomputed from the asset/runtime
528
+ owner during preparation; render does not keep a second readiness ledger,
529
+ infer state from URLs, or repair a producer failure. Aggregate counts are
530
+ derived from the observations, so an AI can inspect first, repair or recook the
531
+ producer, and retry without guessing at hidden renderer state.
532
+
533
+ ### Instances CPU bounds contract
534
+
535
+ `Instances` remains author data containing only packed local transforms. The
536
+ renderer derives a CPU union bound from each mesh AABB, entity world matrix,
537
+ and every instance matrix. The union cache is scoped by World/entity and
538
+ invalidated by mesh, entity-transform, instance-array, slot removal, and
539
+ generation changes. Missing, malformed, or empty instance data is a
540
+ conservative no-cull result; it never creates a synthetic identity instance.
541
+ The GPU path keeps the mesh-local AABB and performs per-instance visibility,
542
+ while the CPU path uses the derived union only to avoid dropping an entity
543
+ whose origin is outside the view. Do not add `bounds` to the public
544
+ `Instances` component or duplicate this renderer fact in Pack/asset state.
545
+
258
546
  ## Points and Lines authoring (M1)
259
547
 
260
548
  Points and Lines are first-class render components. Their geometry remains a
@@ -336,6 +624,27 @@ if (!result.ok) {
336
624
  }
337
625
  ```
338
626
 
627
+ ## Standard lighting contract
628
+
629
+ `forgeax::standard` is the only built-in lighting identity. Every finite point
630
+ and spot light enters the shared Cluster membership path; `DirectionalLight`
631
+ remains global and does not consume local-light membership. `renderPath` only
632
+ selects Forward or Deferred graph topology. The derivation chain is
633
+ `LightFrame -> PreparedStandardLighting -> StandardClusterTransportPlan`, with
634
+ `packages/render/src/pipeline/standard-lighting/layout.ts` as the storage-size
635
+ and light-index budget SSOT.
636
+
637
+ Transport capability is explicit: compute/storage or CPU/storage. Cluster has
638
+ no uniform-backed downlevel ABI; when `storageBuffer` is absent, admission
639
+ returns the structured `standard-cluster-transport-unavailable` result with
640
+ `requested` and `admitted`. Never invent a four-light fallback. Read
641
+ `expected`, `hint`, and `detail` before repairing the device capability or the
642
+ producer input. Both lanes consume the same complete CPU canonical corpus;
643
+ the compute lane materializes the GPU index list, while the CPU lane uploads
644
+ that list. A Dawn readback that compares the GPU list with the canonical
645
+ corpus is the proof of GPU membership; until that readback runs, evidence is
646
+ `not-proven`, never a synthetic completion state.
647
+
339
648
  M1 intentionally refuses strip expansion, joins, caps, dashes, picking, and
340
649
  visible point/line draw preparation. Those are later implementation lanes, not
341
650
  implicit fallbacks in authoring code.
@@ -445,7 +754,7 @@ authority.
445
754
 
446
755
  Inspect the current path through `renderer.inspect()`. Its detached CPU snapshot exposes
447
756
  full rebuilds, no-change and delta frames, transform/material/instance updates,
448
- removals, the journal cursor, projection cardinality, and the last resync
757
+ removals, the consumer-owned read version, projection cardinality, and the last resync
449
758
  reason. The nested `gpu` status is one of `inactive`, `unsupported`, `resident`,
450
759
  `rebuild-pending`, or `error`; resident state additionally reports capacity,
451
760
  upload ranges and bytes, grows, clears, rebuilds, and no-change frames. The
@@ -783,3 +1092,30 @@ const temporal = catalog.require('forgeax::scene-data::temporal-v1');
783
1092
  available, `SceneDataUnavailableError` exposes the closed `reason`, missing
784
1093
  producer IDs (at most 32 plus an omission count), and explicit `recovery`.
785
1094
  Repair capability or producer coverage at its owner, then retry the next frame.
1095
+
1096
+ ## AI-readable SSR fallback route
1097
+
1098
+ For the reflection fallback dependency evidence, call `renderer.inspect()` first
1099
+ and run the paired fixture. The fixture writes the current Browser/Dawn manifests;
1100
+ the collector then seals a fresh joint M0 guard for the current checkout:
1101
+
1102
+ ```bash
1103
+ pnpm --filter @forgeax/app-learn-render-6-pbr-4-render-target-reflection smoke:ssr-fallback
1104
+ pnpm --filter @forgeax/app-learn-render-6-pbr-4-render-target-reflection smoke:browser
1105
+ node scripts/forgeax/collect-ssr-dependency-report.mjs \
1106
+ --input artifacts/ssr-fallback/dawn/ssr-dependencies-input.json \
1107
+ --build-summary packages/render/dist/index.mjs \
1108
+ --output artifacts/ssr-fallback/ssr-dependency-report.json
1109
+ ```
1110
+
1111
+ Each smoke writes its own detached `ssr-dependencies-input.json` beside the lane
1112
+ manifest; the command above uses the just-completed Dawn input (use the Browser
1113
+ path when inspecting that lane separately). The collector signs the output with
1114
+ the current source/tree/lock/build identity; it never promotes a stale
1115
+ sibling-loop report or an authored manifest. Read identity, generation, evidence
1116
+ level, and closed failure fields before following the named owner recovery action.
1117
+ Submit the same consumer request and reinspect after recovery. The route returns
1118
+ detached facts only: no live GPU handle, second owner, or second ledger is exposed.
1119
+ Missing or mismatched receipts remain
1120
+ `fallback-only` with zero SSR work; SSR v1, Hi-Z, ray marching, temporal resolve,
1121
+ compose, and history are out of scope.
@@ -2,6 +2,19 @@ import type { Result, RhiCanvasContext, RhiDevice, RhiError, RhiInstance, Shader
2
2
  /** Optional host hooks for recorder and device-lifecycle capabilities. */
3
3
  export interface RhiBackendInstrumentation {
4
4
  readonly resolveSurfaceDevice?: (device: RhiDevice) => Result<RhiDevice, RhiError>;
5
+ /**
6
+ * Optional deterministic submit fault seam for backend-owned integration
7
+ * fixtures. The callback runs after `finish()` and before the queue submit;
8
+ * returning an error aborts the frame transaction without changing the
9
+ * production queue contract.
10
+ */
11
+ readonly beforeSubmit?: (device: RhiDevice) => RhiError | undefined;
12
+ /**
13
+ * Optional device-loss projection for deterministic recovery fixtures. A
14
+ * backend may compose this promise with its native `device.lost` promise;
15
+ * normal production packs leave it undefined and use the native signal.
16
+ */
17
+ readonly deviceLost?: (device: RhiDevice) => RhiDevice['lost'];
5
18
  readonly onFrameBoundary?: () => void;
6
19
  readonly onDeviceLost?: () => void;
7
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"backend-contract.d.ts","sourceRoot":"","sources":["../../src/assembly/backend-contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,QAAQ,EACR,WAAW,EACX,YAAY,EACb,MAAM,qBAAqB,CAAC;AAE7B,0EAA0E;AAC1E,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACnF,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IACtC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CACpC;AAED,wEAAwE;AACxE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG;QAC1B,QAAQ,CAAC,oBAAoB,EAAE,CAC7B,MAAM,EAAE,iBAAiB,GAAG,eAAe,KACxC,MAAM,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;KACzC,CAAC;IACF,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAC5B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,KAC/C,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC7C;;;;;;;OAOG;IACH,QAAQ,CAAC,2BAA2B,CAAC,EAAE,CACrC,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,KAC/C,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IACpC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK;QAC3D,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;QACnB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;KAC1B,CAAC;IACF,gBAAgB;IAChB,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,OAAO,GAAG,SAAS,CAAC;IAC7E,4EAA4E;IAC5E,QAAQ,CAAC,eAAe,CAAC,EAAE,yBAAyB,CAAC;CACtD;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;CACnD;AAiCD,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,MAAM,EAAE,4BAA4B,CAAC;gBAElC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,4BAAiC;CAWtE"}
1
+ {"version":3,"file":"backend-contract.d.ts","sourceRoot":"","sources":["../../src/assembly/backend-contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,QAAQ,EACR,WAAW,EACX,YAAY,EACb,MAAM,qBAAqB,CAAC;AAE7B,0EAA0E;AAC1E,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACnF;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,QAAQ,GAAG,SAAS,CAAC;IACpE;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,SAAS,CAAC,MAAM,CAAC,CAAC;IAC/D,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IACtC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CACpC;AAED,wEAAwE;AACxE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG;QAC1B,QAAQ,CAAC,oBAAoB,EAAE,CAC7B,MAAM,EAAE,iBAAiB,GAAG,eAAe,KACxC,MAAM,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;KACzC,CAAC;IACF,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAC5B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,KAC/C,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC7C;;;;;;;OAOG;IACH,QAAQ,CAAC,2BAA2B,CAAC,EAAE,CACrC,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,KAC/C,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IACpC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK;QAC3D,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;QACnB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;KAC1B,CAAC;IACF,gBAAgB;IAChB,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,OAAO,GAAG,SAAS,CAAC;IAC7E,4EAA4E;IAC5E,QAAQ,CAAC,eAAe,CAAC,EAAE,yBAAyB,CAAC;CACtD;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;CACnD;AAiCD,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,MAAM,EAAE,4BAA4B,CAAC;gBAElC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,4BAAiC;CAWtE"}
@@ -0,0 +1,18 @@
1
+ import type { RhiAdapter, RhiDevice } from '@forgeax/engine-rhi';
2
+ export declare const STANDARD_PBR_REQUIRED_SAMPLED_TEXTURES = 17;
3
+ export interface DeviceFeatureAdmissionOptions {
4
+ readonly gpuPassTiming?: object | undefined;
5
+ readonly captureGpuTimings?: boolean | undefined;
6
+ }
7
+ export interface DeviceFeatureAdmission {
8
+ readonly requiredFeatures: GPUFeatureName[];
9
+ readonly requiredLimits?: {
10
+ readonly maxSampledTexturesPerShaderStage: number;
11
+ };
12
+ }
13
+ type AdapterFeatureProbe = Pick<RhiAdapter, 'features'> & Partial<Pick<RhiAdapter, 'limits'>>;
14
+ export declare function deriveDeviceFeatureAdmission(adapter: AdapterFeatureProbe, options?: DeviceFeatureAdmissionOptions): DeviceFeatureAdmission;
15
+ export declare function deviceOptionsForAdapter(adapter: AdapterFeatureProbe, options?: DeviceFeatureAdmissionOptions): DeviceFeatureAdmission | undefined;
16
+ export declare function isTimestampQueryAdmitted(caps: Pick<RhiDevice['caps'], 'timestampQuery' | 'timestampPeriodNanoseconds'>): boolean;
17
+ export {};
18
+ //# sourceMappingURL=device-feature-admission.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-feature-admission.d.ts","sourceRoot":"","sources":["../../src/assembly/device-feature-admission.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAejE,eAAO,MAAM,sCAAsC,KAAK,CAAC;AAEzD,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAClD;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,gBAAgB,EAAE,cAAc,EAAE,CAAC;IAC5C,QAAQ,CAAC,cAAc,CAAC,EAAE;QACxB,QAAQ,CAAC,gCAAgC,EAAE,MAAM,CAAC;KACnD,CAAC;CACH;AAED,KAAK,mBAAmB,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE9F,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,mBAAmB,EAC5B,OAAO,CAAC,EAAE,6BAA6B,GACtC,sBAAsB,CAwBxB;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,mBAAmB,EAC5B,OAAO,CAAC,EAAE,6BAA6B,GACtC,sBAAsB,GAAG,SAAS,CAKpC;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,4BAA4B,CAAC,GAC7E,OAAO,CAOT"}
@@ -0,0 +1,38 @@
1
+ import type { DirectionalShadowQuality } from '../components/directional-shadow-filter';
2
+ import type { DirectionalShadowInspection, DirectionalShadowInspectionError, DirectionalShadowProfile } from '../inspection-types';
3
+ import type { DirectionalShadowBackendAdmission } from '../render-pipeline';
4
+ export interface DirectionalShadowInspectionSource {
5
+ readonly requested: DirectionalShadowProfile;
6
+ readonly candidate: 'accepted' | 'failed';
7
+ readonly lastKnownGood?: DirectionalShadowProfile | undefined;
8
+ readonly cascadeCount: number;
9
+ readonly mapSize: number;
10
+ readonly atlasBytes: number;
11
+ readonly writerPasses: number;
12
+ readonly shadowAngularRadius?: number | undefined;
13
+ readonly maxPenumbraTexels?: number | undefined;
14
+ readonly deviceGeneration: number;
15
+ readonly graphGeneration: number;
16
+ readonly shadowReady: boolean;
17
+ readonly error?: DirectionalShadowInspectionError | undefined;
18
+ }
19
+ export interface DirectionalShadowInspectionInput {
20
+ readonly admission: DirectionalShadowBackendAdmission;
21
+ readonly cascadeCount: number;
22
+ readonly mapSize: number;
23
+ readonly atlasBytes: number;
24
+ readonly writerPasses: number;
25
+ readonly blockerTaps: number;
26
+ readonly filterTapUpperBound: number;
27
+ readonly seamTapUpperBound: number;
28
+ readonly shadowAngularRadius?: number | undefined;
29
+ readonly maxPenumbraTexels?: number | undefined;
30
+ readonly deviceGeneration: number;
31
+ readonly graphGeneration: number;
32
+ readonly error?: DirectionalShadowInspectionError | undefined;
33
+ }
34
+ /** Project the single bounded Directional inspection POD; no live handles leak. */
35
+ export declare function projectDirectionalShadowInspection(input: DirectionalShadowInspectionInput): DirectionalShadowInspection;
36
+ export declare function directionalShadowProfileFromQuality(quality: DirectionalShadowQuality | undefined): DirectionalShadowProfile;
37
+ export declare function projectDirectionalShadowInspectionSource(input: DirectionalShadowInspectionSource): DirectionalShadowInspection;
38
+ //# sourceMappingURL=directional-shadow-inspection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directional-shadow-inspection.d.ts","sourceRoot":"","sources":["../../src/assembly/directional-shadow-inspection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AACxF,OAAO,KAAK,EACV,2BAA2B,EAC3B,gCAAgC,EAChC,wBAAwB,EACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,oBAAoB,CAAC;AAE5E,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,SAAS,EAAE,wBAAwB,CAAC;IAC7C,QAAQ,CAAC,SAAS,EAAE,UAAU,GAAG,QAAQ,CAAC;IAC1C,QAAQ,CAAC,aAAa,CAAC,EAAE,wBAAwB,GAAG,SAAS,CAAC;IAC9D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,gCAAgC,GAAG,SAAS,CAAC;CAC/D;AAED,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,SAAS,EAAE,iCAAiC,CAAC;IACtD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,gCAAgC,GAAG,SAAS,CAAC;CAC/D;AAWD,mFAAmF;AACnF,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,gCAAgC,GACtC,2BAA2B,CAwB7B;AAED,wBAAgB,mCAAmC,CACjD,OAAO,EAAE,wBAAwB,GAAG,SAAS,GAC5C,wBAAwB,CAI1B;AAED,wBAAgB,wCAAwC,CACtD,KAAK,EAAE,iCAAiC,GACvC,2BAA2B,CAiC7B"}