@forgeax/engine-render 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (918) hide show
  1. package/README.md +130 -641
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts +2 -0
  4. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts.map +1 -0
  5. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts +2 -0
  6. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts.map +1 -0
  7. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts +2 -0
  8. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts.map +1 -0
  9. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +1 -1
  10. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +6 -0
  11. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +1 -1
  12. package/dist/{gpu-driven/view-reference.d.ts → __tests__/gpu-driven-view-reference.d.ts} +4 -4
  13. package/dist/__tests__/gpu-driven-view-reference.d.ts.map +1 -0
  14. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +1 -1
  15. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts +2 -0
  16. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts.map +1 -0
  17. package/dist/__tests__/morph-feature-plan.unit.test.d.ts +2 -0
  18. package/dist/__tests__/morph-feature-plan.unit.test.d.ts.map +1 -0
  19. package/dist/__tests__/render-feature-plan.test-d.d.ts +2 -0
  20. package/dist/__tests__/render-feature-plan.test-d.d.ts.map +1 -0
  21. package/dist/__tests__/render-feature-plan.unit.test.d.ts +2 -0
  22. package/dist/__tests__/render-feature-plan.unit.test.d.ts.map +1 -0
  23. package/dist/__tests__/ssao-config.unit.test.d.ts +2 -0
  24. package/dist/__tests__/ssao-config.unit.test.d.ts.map +1 -0
  25. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts +2 -0
  26. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts.map +1 -0
  27. package/dist/__tests__/standard-descriptors.test-d.d.ts +2 -0
  28. package/dist/__tests__/standard-descriptors.test-d.d.ts.map +1 -0
  29. package/dist/__tests__/standard-pipeline.dawn.test.d.ts +2 -0
  30. package/dist/__tests__/standard-pipeline.dawn.test.d.ts.map +1 -0
  31. package/dist/__tests__/standard-pipeline.integration.test.d.ts +2 -0
  32. package/dist/__tests__/standard-pipeline.integration.test.d.ts.map +1 -0
  33. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts +2 -0
  34. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts.map +1 -0
  35. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts +2 -0
  36. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts.map +1 -0
  37. package/dist/{renderer/backend-selection.d.ts → assembly/backend-contract.d.ts} +15 -4
  38. package/dist/assembly/backend-contract.d.ts.map +1 -0
  39. package/dist/assembly/factory.d.ts +207 -0
  40. package/dist/assembly/factory.d.ts.map +1 -0
  41. package/dist/assembly/host-contract.d.ts +84 -0
  42. package/dist/assembly/host-contract.d.ts.map +1 -0
  43. package/dist/{renderer → assembly}/material/assembly.d.ts +0 -1
  44. package/dist/{renderer → assembly}/material/assembly.d.ts.map +1 -1
  45. package/dist/assembly/material/pipeline-projection.d.ts +30 -0
  46. package/dist/assembly/material/pipeline-projection.d.ts.map +1 -0
  47. package/dist/authoring.d.ts +10 -11
  48. package/dist/authoring.d.ts.map +1 -1
  49. package/dist/authoring.mjs +25 -3
  50. package/dist/authoring.mjs.map +1 -1
  51. package/dist/chunk-CQXZC5XI.mjs +182 -0
  52. package/dist/chunk-CQXZC5XI.mjs.map +1 -0
  53. package/dist/chunk-QC4VW3XJ.mjs +79 -0
  54. package/dist/chunk-QC4VW3XJ.mjs.map +1 -0
  55. package/dist/chunk-SCRSAK5B.mjs +480 -0
  56. package/dist/chunk-SCRSAK5B.mjs.map +1 -0
  57. package/dist/components/__tests__/schema-contract.unit.test.d.ts +2 -0
  58. package/dist/components/__tests__/schema-contract.unit.test.d.ts.map +1 -0
  59. package/dist/components/glyph-text.d.ts +1 -1
  60. package/dist/components/glyph-text.d.ts.map +1 -1
  61. package/dist/components/index.d.ts +2 -2
  62. package/dist/components/index.d.ts.map +1 -1
  63. package/dist/components/instances.d.ts +1 -1
  64. package/dist/components/instances.d.ts.map +1 -1
  65. package/dist/components/light-helpers.d.ts +1 -1
  66. package/dist/components/light-helpers.d.ts.map +1 -1
  67. package/dist/components/mesh-filter.d.ts +7 -7
  68. package/dist/components/mesh-filter.d.ts.map +1 -1
  69. package/dist/components/scene-instance.d.ts +11 -11
  70. package/dist/components/skybox-background.d.ts +56 -0
  71. package/dist/components/skybox-background.d.ts.map +1 -0
  72. package/dist/components/skylight.d.ts +55 -0
  73. package/dist/components/skylight.d.ts.map +1 -0
  74. package/dist/components/sprite-animation.d.ts +2 -3
  75. package/dist/components/sprite-animation.d.ts.map +1 -1
  76. package/dist/components/sprite-instances.d.ts +1 -1
  77. package/dist/components/sprite-playback-mode.d.ts +6 -1
  78. package/dist/components/sprite-playback-mode.d.ts.map +1 -1
  79. package/dist/components/sprite-region-override.d.ts +2 -3
  80. package/dist/components/sprite-region-override.d.ts.map +1 -1
  81. package/dist/components/tile-layer.d.ts +5 -0
  82. package/dist/components/tile-layer.d.ts.map +1 -1
  83. package/dist/construct-renderer.d.ts +18 -1
  84. package/dist/construct-renderer.d.ts.map +1 -1
  85. package/dist/construct-renderer.mjs +27008 -4
  86. package/dist/construct-renderer.mjs.map +1 -1
  87. package/dist/debug-draw-glue.d.ts +2 -53
  88. package/dist/debug-draw-glue.d.ts.map +1 -1
  89. package/dist/device/device-scope.d.ts +83 -0
  90. package/dist/device/device-scope.d.ts.map +1 -0
  91. package/dist/{gpu-resource-store.d.ts → device/gpu-residency.d.ts} +91 -48
  92. package/dist/device/gpu-residency.d.ts.map +1 -0
  93. package/dist/device/resource-types.d.ts +8 -0
  94. package/dist/device/resource-types.d.ts.map +1 -0
  95. package/dist/engine-metrics.d.ts +2 -2
  96. package/dist/engine-metrics.d.ts.map +1 -1
  97. package/dist/errors/recover.d.ts +28 -1
  98. package/dist/errors/recover.d.ts.map +1 -1
  99. package/dist/errors/render.d.ts +249 -258
  100. package/dist/errors/render.d.ts.map +1 -1
  101. package/dist/features/fullscreen.d.ts +19 -0
  102. package/dist/features/fullscreen.d.ts.map +1 -0
  103. package/dist/features/host.d.ts +32 -26
  104. package/dist/features/host.d.ts.map +1 -1
  105. package/dist/features/morph/morph-feature.d.ts +39 -5
  106. package/dist/features/morph/morph-feature.d.ts.map +1 -1
  107. package/dist/features/plan.d.ts +182 -0
  108. package/dist/features/plan.d.ts.map +1 -0
  109. package/dist/features/prepared-gpu-work.d.ts +21 -17
  110. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  111. package/dist/features/prepared-graphics-store.d.ts +2 -1
  112. package/dist/features/prepared-graphics-store.d.ts.map +1 -1
  113. package/dist/features/prepared-graphics.d.ts +11 -21
  114. package/dist/features/prepared-graphics.d.ts.map +1 -1
  115. package/dist/features/render-graph-compute.d.ts +2 -2
  116. package/dist/features/render-graph-compute.d.ts.map +1 -1
  117. package/dist/features/render-graph-contribution.d.ts +4 -7
  118. package/dist/features/render-graph-contribution.d.ts.map +1 -1
  119. package/dist/features/render-graph-raster.d.ts +2 -2
  120. package/dist/features/render-graph-raster.d.ts.map +1 -1
  121. package/dist/features/render-graph-resources.d.ts +6 -6
  122. package/dist/features/render-graph-resources.d.ts.map +1 -1
  123. package/dist/features/targets.d.ts +5 -5
  124. package/dist/features/targets.d.ts.map +1 -1
  125. package/dist/features/types.d.ts +11 -190
  126. package/dist/features/types.d.ts.map +1 -1
  127. package/dist/features/vocabulary.d.ts +14 -0
  128. package/dist/features/vocabulary.d.ts.map +1 -0
  129. package/dist/fullscreen-post-process-pass.d.ts +4 -25
  130. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  131. package/dist/glyph-text-layout-system.d.ts +3 -2
  132. package/dist/glyph-text-layout-system.d.ts.map +1 -1
  133. package/dist/gpu-driven/batch-topology.d.ts +6 -75
  134. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  135. package/dist/gpu-driven/production-raster.d.ts +13 -112
  136. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  137. package/dist/gpu-driven/view-gpu.d.ts +10 -66
  138. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  139. package/dist/gpu-resource.d.ts +3 -3
  140. package/dist/gpu-scene-schema.d.ts +1 -94
  141. package/dist/gpu-scene-schema.d.ts.map +1 -1
  142. package/dist/gpu-scene.d.ts +7 -33
  143. package/dist/gpu-scene.d.ts.map +1 -1
  144. package/dist/hdrp-buffers.d.ts +3 -53
  145. package/dist/hdrp-buffers.d.ts.map +1 -1
  146. package/dist/ibl/IblPipelineCache.d.ts +74 -180
  147. package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
  148. package/dist/ibl/skylight-bind-group.d.ts +1 -1
  149. package/dist/index.d.ts +13 -43
  150. package/dist/index.d.ts.map +1 -1
  151. package/dist/index.mjs +165 -3
  152. package/dist/index.mjs.map +1 -1
  153. package/dist/inspection-types.d.ts +69 -0
  154. package/dist/inspection-types.d.ts.map +1 -0
  155. package/dist/instance-buffer-cache.d.ts +1 -4
  156. package/dist/instance-buffer-cache.d.ts.map +1 -1
  157. package/dist/internal.d.ts +1 -73
  158. package/dist/internal.d.ts.map +1 -1
  159. package/dist/internal.mjs +1 -43
  160. package/dist/internal.mjs.map +1 -1
  161. package/dist/lifecycle.d.ts +36 -2
  162. package/dist/lifecycle.d.ts.map +1 -1
  163. package/dist/materials.d.ts +0 -3
  164. package/dist/materials.d.ts.map +1 -1
  165. package/dist/mesh-material-bindings.d.ts +0 -1
  166. package/dist/mesh-material-bindings.d.ts.map +1 -1
  167. package/dist/pbr-pipeline.d.ts +75 -29
  168. package/dist/pbr-pipeline.d.ts.map +1 -1
  169. package/dist/pipeline/standard-forward-lane.d.ts +5 -0
  170. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -0
  171. package/dist/pipeline/standard-pipeline.d.ts +31 -0
  172. package/dist/pipeline/standard-pipeline.d.ts.map +1 -0
  173. package/dist/pipeline/standard-profile.d.ts +40 -0
  174. package/dist/pipeline/standard-profile.d.ts.map +1 -0
  175. package/dist/pipeline-builder.d.ts +3 -3
  176. package/dist/pipeline-builder.d.ts.map +1 -1
  177. package/dist/pipeline-spec-types.d.ts +24 -0
  178. package/dist/pipeline-spec-types.d.ts.map +1 -0
  179. package/dist/pipeline-spec.d.ts +16 -155
  180. package/dist/pipeline-spec.d.ts.map +1 -1
  181. package/dist/plugin.d.ts +1 -14
  182. package/dist/plugin.d.ts.map +1 -1
  183. package/dist/post-process-errors.d.ts +18 -18
  184. package/dist/post-process-errors.d.ts.map +1 -1
  185. package/dist/prepare/prepared-graphics-resolver.d.ts +2 -5
  186. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
  187. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts +2 -0
  188. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts.map +1 -0
  189. package/dist/record/frame-lighting.d.ts +7 -73
  190. package/dist/record/frame-lighting.d.ts.map +1 -1
  191. package/dist/record/frame-snapshot.d.ts +44 -44
  192. package/dist/record/frame-snapshot.d.ts.map +1 -1
  193. package/dist/record/frame-targets.d.ts +5 -38
  194. package/dist/record/frame-targets.d.ts.map +1 -1
  195. package/dist/record/frame.d.ts +64 -52
  196. package/dist/record/frame.d.ts.map +1 -1
  197. package/dist/record/helpers.d.ts +3 -2
  198. package/dist/record/helpers.d.ts.map +1 -1
  199. package/dist/record/main-pass-geometry.d.ts +5 -4
  200. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  201. package/dist/record/main-pass-material.d.ts +90 -59
  202. package/dist/record/main-pass-material.d.ts.map +1 -1
  203. package/dist/record/main-pass-sprite-draws.d.ts +28 -3
  204. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  205. package/dist/record/main-pass.d.ts +1 -1
  206. package/dist/record/main-pass.d.ts.map +1 -1
  207. package/dist/record/mesh-ssbo.d.ts +276 -3
  208. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  209. package/dist/record/render-context.d.ts +235 -0
  210. package/dist/record/render-context.d.ts.map +1 -0
  211. package/dist/record/shadow-pass.d.ts +15 -88
  212. package/dist/record/shadow-pass.d.ts.map +1 -1
  213. package/dist/record/skybox-post-pass.d.ts +1 -1
  214. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  215. package/dist/record/typed-frame-graph.d.ts +29 -7
  216. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  217. package/dist/record/view-ubo.d.ts +3 -3
  218. package/dist/record/view-ubo.d.ts.map +1 -1
  219. package/dist/render-contract.d.ts +416 -0
  220. package/dist/render-contract.d.ts.map +1 -0
  221. package/dist/render-data.d.ts.map +1 -1
  222. package/dist/render-graph-primitives.d.ts +14 -362
  223. package/dist/render-graph-primitives.d.ts.map +1 -1
  224. package/dist/render-pipeline.d.ts +25 -64
  225. package/dist/render-pipeline.d.ts.map +1 -1
  226. package/dist/render-system-extract.d.ts +107 -338
  227. package/dist/render-system-extract.d.ts.map +1 -1
  228. package/dist/render-system.d.ts +21 -713
  229. package/dist/render-system.d.ts.map +1 -1
  230. package/dist/scene/render-scene-types.d.ts +58 -0
  231. package/dist/scene/render-scene-types.d.ts.map +1 -0
  232. package/dist/scene/render-scene.d.ts +105 -0
  233. package/dist/scene/render-scene.d.ts.map +1 -0
  234. package/dist/scene-instances/post-spawn-resolve-joints.d.ts +2 -5
  235. package/dist/scene-instances/post-spawn-resolve-joints.d.ts.map +1 -1
  236. package/dist/ssao-buffers.d.ts +22 -3
  237. package/dist/ssao-buffers.d.ts.map +1 -1
  238. package/dist/systems/skin-palette-allocator.d.ts +2 -4
  239. package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
  240. package/dist/systems/skin-palette-types.d.ts +14 -0
  241. package/dist/systems/skin-palette-types.d.ts.map +1 -0
  242. package/dist/systems/transparent-sort-config.d.ts +23 -2
  243. package/dist/systems/transparent-sort-config.d.ts.map +1 -1
  244. package/dist/tilemap-chunk-extract-system.d.ts +4 -3
  245. package/dist/tilemap-chunk-extract-system.d.ts.map +1 -1
  246. package/dist/typed-render-graph-primitives.d.ts +2 -4
  247. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  248. package/dist/typed-shadow-passes.d.ts +3 -3
  249. package/dist/typed-shadow-passes.d.ts.map +1 -1
  250. package/package.json +23 -23
  251. package/src/__tests__/backend-selection-rhi-capture.test-d.ts +1 -1
  252. package/src/__tests__/callback-inference.test-d.ts +6 -3
  253. package/src/__tests__/cluster-grid-default-surface.unit.test.ts +7 -4
  254. package/src/__tests__/construct-renderer-identity.unit.test.ts +15 -2
  255. package/src/__tests__/device-scope-lifecycle.unit.test.ts +151 -0
  256. package/src/__tests__/device-scope-stale-matrix.unit.test.ts +42 -0
  257. package/src/__tests__/direct-extract-consumer-contract.test-d.ts +8 -19
  258. package/src/__tests__/direct-light-snapshot.unit.test.ts +3 -13
  259. package/src/__tests__/factory-contract.integration.test.ts +158 -209
  260. package/src/__tests__/fallback-row-stride-surface.unit.test.ts +1 -4
  261. package/src/__tests__/frame-observation.contract.test.ts +17 -8
  262. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +32 -0
  263. package/src/__tests__/glyph-text-layout-recovery.unit.test.ts +6 -11
  264. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +9 -16
  265. package/src/__tests__/gpu-driven-production.integration.test.ts +32 -205
  266. package/src/__tests__/gpu-driven-scaling.unit.test.ts +4 -7
  267. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +87 -8
  268. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +170 -8
  269. package/src/{gpu-driven/view-reference.ts → __tests__/gpu-driven-view-reference.ts} +4 -3
  270. package/src/__tests__/gpu-driven-view.browser.test.ts +12 -1
  271. package/src/__tests__/gpu-driven-view.dawn.test.ts +12 -1
  272. package/src/__tests__/gpu-driven-view.unit.test.ts +11 -267
  273. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +3 -3
  274. package/src/__tests__/gpu-scene-render-graph-gpu.ts +2 -3
  275. package/src/__tests__/gpu-scene.dawn.test.ts +2 -6
  276. package/src/__tests__/gpu-scene.unit.test.ts +10 -24
  277. package/src/__tests__/ibl/face-uniforms.unit.test.ts +46 -0
  278. package/src/__tests__/infinite-grid-no-vertex-probe.unit.test.ts +34 -66
  279. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +14 -5
  280. package/src/__tests__/light-buffer-layout.unit.test.ts +4 -49
  281. package/src/__tests__/material-cooked-projection.unit.test.ts +2 -51
  282. package/src/__tests__/material-snapshot-mutation.integration.test.ts +10 -15
  283. package/src/__tests__/material-static-dynamic-route.unit.test.ts +4 -23
  284. package/src/__tests__/material-stride-surface.unit.test.ts +2 -2
  285. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +7 -8
  286. package/src/__tests__/morph-culling-reentry.dawn.test.ts +29 -38
  287. package/src/__tests__/morph-feature-gpu-work.integration.test.ts +45 -43
  288. package/src/__tests__/morph-feature-plan.unit.test.ts +53 -0
  289. package/src/__tests__/morph-visual-evidence.integration.test.ts +47 -33
  290. package/src/__tests__/nineslice-handle-surface.unit.test.ts +11 -6
  291. package/src/__tests__/post-process-error-policy-owner.unit.test.ts +6 -13
  292. package/src/__tests__/prepared-graphics-capability.unit.test.ts +6 -81
  293. package/src/__tests__/prepared-graphics-generation.unit.test.ts +3 -17
  294. package/src/__tests__/prepared-graphics-lifecycle.unit.test.ts +6 -74
  295. package/src/__tests__/prepared-graphics-resolver.unit.test.ts +1 -3
  296. package/src/__tests__/prepared-graphics-snapshot.unit.test.ts +2 -2
  297. package/src/__tests__/profiler-default-off.test.ts +1 -1
  298. package/src/__tests__/profiler-phase-catalog.test.ts +2 -2
  299. package/src/__tests__/profiler-phase-integration.test.ts +5 -13
  300. package/src/__tests__/profiler-phase-token.test.ts +3 -8
  301. package/src/__tests__/public-surface.test-d.ts +65 -3
  302. package/src/__tests__/recover-error-policy-owner.unit.test.ts +1 -21
  303. package/src/__tests__/render-error-code-owner.test-d.ts +18 -23
  304. package/src/__tests__/render-error-detail-ssot.test-d.ts +0 -95
  305. package/src/__tests__/render-error-exhaustive.test-d.ts +8 -1
  306. package/src/__tests__/render-feature-assembly.test-d.ts +8 -16
  307. package/src/__tests__/render-feature-context.test-d.ts +16 -40
  308. package/src/__tests__/render-feature-contract.test-d.ts +9 -18
  309. package/src/__tests__/render-feature-diagnostics.unit.test.ts +6 -8
  310. package/src/__tests__/render-feature-docs.unit.test.ts +8 -7
  311. package/src/__tests__/render-feature-gpu-work.integration.test.ts +14 -75
  312. package/src/__tests__/render-feature-plan.test-d.ts +161 -0
  313. package/src/__tests__/render-feature-plan.unit.test.ts +170 -0
  314. package/src/__tests__/render-feature-prepared-diagnostics.unit.test.ts +8 -19
  315. package/src/__tests__/render-feature-prepared-errors.test-d.ts +3 -6
  316. package/src/__tests__/render-feature-prepared-graphics-docs.unit.test.ts +10 -71
  317. package/src/__tests__/render-feature-prepared-graphics-isolation.unit.test.ts +11 -61
  318. package/src/__tests__/render-feature-prepared-graphics-negative.test-d.ts +20 -43
  319. package/src/__tests__/render-feature-prepared-graphics.test-d.ts +56 -78
  320. package/src/__tests__/render-feature-public-surface.test-d.ts +6 -24
  321. package/src/__tests__/render-feature-retry.unit.test.ts +7 -48
  322. package/src/__tests__/render-feature-scheduling.unit.test.ts +15 -27
  323. package/src/__tests__/render-feature-stage-failed-policy-owner.unit.test.ts +0 -9
  324. package/src/__tests__/render-feature-stage-fault-recovery.unit.test.ts +19 -109
  325. package/src/__tests__/render-feature-visibility-context.test-d.ts +1 -6
  326. package/src/__tests__/render-feature-visibility-context.unit.test.ts +1 -2
  327. package/src/__tests__/render-feature-zero-work.unit.test.ts +14 -20
  328. package/src/__tests__/render-scene-projection.unit.test.ts +73 -111
  329. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +44 -95
  330. package/src/__tests__/renderer-lifecycle.integration.test.ts +49 -1
  331. package/src/__tests__/shader-stage-surface.unit.test.ts +14 -9
  332. package/src/__tests__/ssao-config.unit.test.ts +36 -0
  333. package/src/__tests__/ssao-kernel-surface.unit.test.ts +4 -5
  334. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +28 -0
  335. package/src/__tests__/standard-descriptors.test-d.ts +22 -0
  336. package/src/__tests__/standard-pipeline.dawn.test.ts +61 -0
  337. package/src/__tests__/standard-pipeline.integration.test.ts +124 -0
  338. package/src/__tests__/standard-profile-oracle.unit.test.ts +62 -0
  339. package/src/__tests__/surface-configuration.unit.test.ts +1 -2
  340. package/src/__tests__/texture-usage-surface.unit.test.ts +3 -6
  341. package/src/__tests__/typed-pipeline-topology.unit.test.ts +40 -206
  342. package/src/__tests__/urp-pipeline-targets.unit.test.ts +1 -11
  343. package/src/__tests__/urp-pipeline.unit.test.ts +2 -2
  344. package/src/__tests__/vertex-color-pipeline.unit.test.ts +10 -2
  345. package/src/__tests__/vertex-layout-consumer.unit.test.ts +1 -1
  346. package/src/__tests__/visibility-diagnostics.integration.test.ts +7 -11
  347. package/src/__tests__/visibility-extract.integration.test.ts +20 -11
  348. package/src/__tests__/visibility-extract.perf.test.ts +66 -32
  349. package/src/__tests__/visibility-feature-dedup.integration.test.ts +2 -4
  350. package/src/__tests__/visibility-hidden-report.unit.test.ts +1 -2
  351. package/src/__tests__/visibility-instances.integration.test.ts +7 -11
  352. package/src/__tests__/visibility-multi-world.integration.test.ts +38 -6
  353. package/src/__tests__/visibility-producer-matrix.integration.test.ts +18 -41
  354. package/src/__tests__/visibility-public-surface.test-d.ts +10 -9
  355. package/src/__tests__/visibility-resolver.unit.test.ts +2 -1
  356. package/src/__tests__/visibility-resource-short-circuit.unit.test.ts +80 -0
  357. package/src/__tests__/visibility-snapshot-contract.unit.test.ts +2 -1
  358. package/src/__tests__/vocabulary.unit.test.ts +1 -1
  359. package/src/assembly/backend-contract.ts +57 -0
  360. package/src/{renderer/renderer-factory.ts → assembly/factory.ts} +1663 -2690
  361. package/src/assembly/host-contract.ts +101 -0
  362. package/src/{renderer → assembly}/material/assembly.ts +0 -2
  363. package/src/assembly/material/pipeline-projection.ts +63 -0
  364. package/src/authoring.ts +14 -22
  365. package/src/components/__tests__/schema-contract.unit.test.ts +10 -0
  366. package/src/components/glyph-text.ts +3 -2
  367. package/src/components/index.ts +7 -9
  368. package/src/components/instances.ts +4 -5
  369. package/src/components/light-helpers.ts +1 -1
  370. package/src/components/mesh-filter.ts +11 -10
  371. package/src/components/post-process-params.ts +3 -3
  372. package/src/components/scene-instance.ts +12 -12
  373. package/src/components/skybox-background.ts +103 -0
  374. package/src/components/{environment.ts → skylight.ts} +2 -110
  375. package/src/components/sprite-animation.ts +3 -4
  376. package/src/components/sprite-instances.ts +2 -2
  377. package/src/components/sprite-playback-mode.ts +7 -1
  378. package/src/components/sprite-region-override.ts +2 -3
  379. package/src/components/tile-layer.ts +8 -2
  380. package/src/construct-renderer.ts +67 -4
  381. package/src/debug-draw-glue.ts +8 -129
  382. package/src/device/device-scope.ts +306 -0
  383. package/src/{gpu-resource-store.ts → device/gpu-residency.ts} +540 -639
  384. package/src/device/resource-types.ts +20 -0
  385. package/src/engine-metrics.ts +12 -19
  386. package/src/errors/recover.ts +45 -3
  387. package/src/errors/render.ts +357 -460
  388. package/src/features/fullscreen.ts +46 -0
  389. package/src/features/host.ts +575 -309
  390. package/src/features/morph/morph-feature.ts +195 -105
  391. package/src/features/plan.ts +447 -0
  392. package/src/features/prepared-gpu-work.ts +72 -15
  393. package/src/features/prepared-graphics-store.ts +20 -6
  394. package/src/features/prepared-graphics.ts +12 -71
  395. package/src/features/render-graph-compute.ts +14 -5
  396. package/src/features/render-graph-contribution.ts +43 -63
  397. package/src/features/render-graph-raster.ts +11 -6
  398. package/src/features/render-graph-resources.ts +25 -23
  399. package/src/features/targets.ts +8 -21
  400. package/src/features/types.ts +39 -227
  401. package/src/features/vocabulary.ts +24 -0
  402. package/src/fullscreen-post-process-pass.ts +14 -57
  403. package/src/glyph-text-layout-system.ts +70 -96
  404. package/src/gpu-driven/batch-topology.ts +24 -202
  405. package/src/gpu-driven/production-raster.ts +93 -1108
  406. package/src/gpu-driven/view-gpu.ts +46 -192
  407. package/src/gpu-resource.ts +4 -4
  408. package/src/gpu-scene-schema.ts +11 -99
  409. package/src/gpu-scene.ts +231 -364
  410. package/src/hdrp-buffers.ts +12 -221
  411. package/src/ibl/IblPipelineCache.ts +471 -711
  412. package/src/ibl/skylight-bind-group.ts +4 -4
  413. package/src/index.ts +58 -217
  414. package/src/inspection-types.ts +76 -0
  415. package/src/instance-buffer-cache.ts +1 -29
  416. package/src/internal.ts +6 -85
  417. package/src/lifecycle.ts +64 -19
  418. package/src/materials.ts +7 -29
  419. package/src/mesh-material-bindings.ts +0 -1
  420. package/src/pbr-pipeline.ts +434 -53
  421. package/src/{urp-pipeline.ts → pipeline/standard-forward-lane.ts} +38 -149
  422. package/src/{hdrp-pipeline.ts → pipeline/standard-pipeline.ts} +221 -191
  423. package/src/pipeline/standard-profile.ts +65 -0
  424. package/src/pipeline-builder.ts +60 -64
  425. package/src/pipeline-spec-types.ts +28 -0
  426. package/src/pipeline-spec.ts +72 -609
  427. package/src/plugin.ts +3 -75
  428. package/src/post-process-errors.ts +31 -33
  429. package/src/prepare/prepared-graphics-resolver.ts +5 -4
  430. package/src/record/__tests__/material-slot-plan.unit.test.ts +1 -33
  431. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +41 -0
  432. package/src/record/__tests__/video-texture-view.unit.test.ts +1 -1
  433. package/src/record/frame-lighting.ts +74 -195
  434. package/src/record/frame-snapshot.ts +45 -60
  435. package/src/record/frame-targets.ts +8 -243
  436. package/src/record/frame.ts +509 -796
  437. package/src/record/helpers.ts +6 -11
  438. package/src/record/main-pass-geometry.ts +106 -147
  439. package/src/record/main-pass-material.ts +517 -190
  440. package/src/record/main-pass-sprite-draws.ts +198 -117
  441. package/src/record/main-pass.ts +162 -143
  442. package/src/record/mesh-ssbo.ts +517 -38
  443. package/src/record/render-context.ts +364 -0
  444. package/src/record/shadow-pass.ts +138 -1838
  445. package/src/record/skybox-post-pass.ts +12 -14
  446. package/src/record/typed-frame-graph.ts +215 -254
  447. package/src/record/view-ubo.ts +6 -37
  448. package/src/render-contract.ts +571 -0
  449. package/src/render-data.ts +3 -3
  450. package/src/render-graph-primitives.ts +76 -851
  451. package/src/render-pipeline.ts +104 -188
  452. package/src/render-system-extract.ts +1048 -1729
  453. package/src/render-system.ts +330 -1957
  454. package/src/scene/render-scene-types.ts +64 -0
  455. package/src/scene/render-scene.ts +1032 -0
  456. package/src/scene-instances/post-spawn-resolve-joints.ts +4 -7
  457. package/src/ssao-buffers.ts +167 -8
  458. package/src/systems/skin-palette-allocator.ts +21 -64
  459. package/src/systems/skin-palette-types.ts +14 -0
  460. package/src/systems/transparent-sort-config.ts +25 -3
  461. package/src/tilemap-chunk-extract-system.ts +53 -70
  462. package/src/typed-render-graph-primitives.ts +35 -24
  463. package/src/typed-shadow-passes.ts +26 -56
  464. package/dist/__tests__/analytic-sky-contract.test.d.ts +0 -2
  465. package/dist/__tests__/analytic-sky-contract.test.d.ts.map +0 -1
  466. package/dist/__tests__/analytic-sky-falsify.test.d.ts +0 -2
  467. package/dist/__tests__/analytic-sky-falsify.test.d.ts.map +0 -1
  468. package/dist/__tests__/assets-runtime-handoff.integration.test.d.ts +0 -2
  469. package/dist/__tests__/assets-runtime-handoff.integration.test.d.ts.map +0 -1
  470. package/dist/__tests__/backend-selection.integration.test.d.ts +0 -2
  471. package/dist/__tests__/backend-selection.integration.test.d.ts.map +0 -1
  472. package/dist/__tests__/camera-temporal.test-d.d.ts +0 -2
  473. package/dist/__tests__/camera-temporal.test-d.d.ts.map +0 -1
  474. package/dist/__tests__/camera-temporal.test.d.ts +0 -2
  475. package/dist/__tests__/camera-temporal.test.d.ts.map +0 -1
  476. package/dist/__tests__/directional-shadow-probe-atlas-layout.unit.test.d.ts +0 -2
  477. package/dist/__tests__/directional-shadow-probe-atlas-layout.unit.test.d.ts.map +0 -1
  478. package/dist/__tests__/environment-inspection.test.d.ts +0 -2
  479. package/dist/__tests__/environment-inspection.test.d.ts.map +0 -1
  480. package/dist/__tests__/fog-ai-user.fixture.d.ts +0 -2
  481. package/dist/__tests__/fog-ai-user.fixture.d.ts.map +0 -1
  482. package/dist/__tests__/fog-custom-render-feature.fixture.d.ts +0 -16
  483. package/dist/__tests__/fog-custom-render-feature.fixture.d.ts.map +0 -1
  484. package/dist/__tests__/fog-custom-render-feature.integration.test.d.ts +0 -2
  485. package/dist/__tests__/fog-custom-render-feature.integration.test.d.ts.map +0 -1
  486. package/dist/__tests__/fog-inspection.integration.test.d.ts +0 -2
  487. package/dist/__tests__/fog-inspection.integration.test.d.ts.map +0 -1
  488. package/dist/__tests__/fog-owner-state.integration.test.d.ts +0 -2
  489. package/dist/__tests__/fog-owner-state.integration.test.d.ts.map +0 -1
  490. package/dist/__tests__/fog-pipeline-topology.integration.test.d.ts +0 -2
  491. package/dist/__tests__/fog-pipeline-topology.integration.test.d.ts.map +0 -1
  492. package/dist/__tests__/fog-public-surface.integration.test.d.ts +0 -2
  493. package/dist/__tests__/fog-public-surface.integration.test.d.ts.map +0 -1
  494. package/dist/__tests__/fog-ray-contract.integration.test.d.ts +0 -2
  495. package/dist/__tests__/fog-ray-contract.integration.test.d.ts.map +0 -1
  496. package/dist/__tests__/fog-source-absence.integration.test.d.ts +0 -2
  497. package/dist/__tests__/fog-source-absence.integration.test.d.ts.map +0 -1
  498. package/dist/__tests__/fog-temporal.integration.test.d.ts +0 -2
  499. package/dist/__tests__/fog-temporal.integration.test.d.ts.map +0 -1
  500. package/dist/__tests__/frame-chain.unit.test.d.ts +0 -2
  501. package/dist/__tests__/frame-chain.unit.test.d.ts.map +0 -1
  502. package/dist/__tests__/gpu-scene-field-type-owner.test-d.d.ts +0 -2
  503. package/dist/__tests__/gpu-scene-field-type-owner.test-d.d.ts.map +0 -1
  504. package/dist/__tests__/hdrp-pipeline.unit.test.d.ts +0 -2
  505. package/dist/__tests__/hdrp-pipeline.unit.test.d.ts.map +0 -1
  506. package/dist/__tests__/ibl/ibl-fallback.unit.test.d.ts +0 -2
  507. package/dist/__tests__/ibl/ibl-fallback.unit.test.d.ts.map +0 -1
  508. package/dist/__tests__/material-derived-error-stop-draw.integration.test.d.ts +0 -2
  509. package/dist/__tests__/material-derived-error-stop-draw.integration.test.d.ts.map +0 -1
  510. package/dist/__tests__/material-derived-payload.integration.test.d.ts +0 -2
  511. package/dist/__tests__/material-derived-payload.integration.test.d.ts.map +0 -1
  512. package/dist/__tests__/materials.unit.test.d.ts +0 -2
  513. package/dist/__tests__/materials.unit.test.d.ts.map +0 -1
  514. package/dist/__tests__/param-schema-projection-census.unit.test.d.ts +0 -2
  515. package/dist/__tests__/param-schema-projection-census.unit.test.d.ts.map +0 -1
  516. package/dist/__tests__/persistent-render-scene.unit.test.d.ts +0 -2
  517. package/dist/__tests__/persistent-render-scene.unit.test.d.ts.map +0 -1
  518. package/dist/__tests__/pipeline-error-policy-owner.unit.test.d.ts +0 -2
  519. package/dist/__tests__/pipeline-error-policy-owner.unit.test.d.ts.map +0 -1
  520. package/dist/__tests__/pipeline-pass-trace.test.d.ts +0 -2
  521. package/dist/__tests__/pipeline-pass-trace.test.d.ts.map +0 -1
  522. package/dist/__tests__/pipeline-stage-owner.test-d.d.ts +0 -2
  523. package/dist/__tests__/pipeline-stage-owner.test-d.d.ts.map +0 -1
  524. package/dist/__tests__/plugin.test.d.ts +0 -2
  525. package/dist/__tests__/plugin.test.d.ts.map +0 -1
  526. package/dist/__tests__/prepared-graphics-backend-matrix.unit.test.d.ts +0 -2
  527. package/dist/__tests__/prepared-graphics-backend-matrix.unit.test.d.ts.map +0 -1
  528. package/dist/__tests__/prepared-graphics-resolver-recording.unit.test.d.ts +0 -2
  529. package/dist/__tests__/prepared-graphics-resolver-recording.unit.test.d.ts.map +0 -1
  530. package/dist/__tests__/public-pipeline-id.test-d.d.ts +0 -2
  531. package/dist/__tests__/public-pipeline-id.test-d.d.ts.map +0 -1
  532. package/dist/__tests__/render-dispatch-membership.unit.test.d.ts +0 -2
  533. package/dist/__tests__/render-dispatch-membership.unit.test.d.ts.map +0 -1
  534. package/dist/__tests__/render-feature-construction.unit.test.d.ts +0 -2
  535. package/dist/__tests__/render-feature-construction.unit.test.d.ts.map +0 -1
  536. package/dist/__tests__/render-feature-error-code-owner.test-d.d.ts +0 -2
  537. package/dist/__tests__/render-feature-error-code-owner.test-d.d.ts.map +0 -1
  538. package/dist/__tests__/render-feature-gpu-buffer-usage-owner.test-d.d.ts +0 -2
  539. package/dist/__tests__/render-feature-gpu-buffer-usage-owner.test-d.d.ts.map +0 -1
  540. package/dist/__tests__/render-feature-graph.integration.test.d.ts +0 -2
  541. package/dist/__tests__/render-feature-graph.integration.test.d.ts.map +0 -1
  542. package/dist/__tests__/render-feature-graphics-staging.unit.test.d.ts +0 -2
  543. package/dist/__tests__/render-feature-graphics-staging.unit.test.d.ts.map +0 -1
  544. package/dist/__tests__/render-feature-order.unit.test.d.ts +0 -2
  545. package/dist/__tests__/render-feature-order.unit.test.d.ts.map +0 -1
  546. package/dist/__tests__/render-feature-prepared-graphics-recording.unit.test.d.ts +0 -2
  547. package/dist/__tests__/render-feature-prepared-graphics-recording.unit.test.d.ts.map +0 -1
  548. package/dist/__tests__/render-feature-staging.unit.test.d.ts +0 -2
  549. package/dist/__tests__/render-feature-staging.unit.test.d.ts.map +0 -1
  550. package/dist/__tests__/renderer-render-scene-public.test-d.d.ts +0 -2
  551. package/dist/__tests__/renderer-render-scene-public.test-d.d.ts.map +0 -1
  552. package/dist/__tests__/scene-temporal-coverage.unit.test.d.ts +0 -2
  553. package/dist/__tests__/scene-temporal-coverage.unit.test.d.ts.map +0 -1
  554. package/dist/__tests__/sun-snapshot-consumers.test.d.ts +0 -2
  555. package/dist/__tests__/sun-snapshot-consumers.test.d.ts.map +0 -1
  556. package/dist/__tests__/surface-backend-kind-owner.test-d.d.ts +0 -2
  557. package/dist/__tests__/surface-backend-kind-owner.test-d.d.ts.map +0 -1
  558. package/dist/__tests__/taa-history-store.unit.test.d.ts +0 -2
  559. package/dist/__tests__/taa-history-store.unit.test.d.ts.map +0 -1
  560. package/dist/__tests__/temporal-frame-transaction.integration.test.d.ts +0 -2
  561. package/dist/__tests__/temporal-frame-transaction.integration.test.d.ts.map +0 -1
  562. package/dist/__tests__/temporal-inspection.unit.test.d.ts +0 -2
  563. package/dist/__tests__/temporal-inspection.unit.test.d.ts.map +0 -1
  564. package/dist/assets/__tests__/asset-decoders.unit.test.d.ts +0 -2
  565. package/dist/assets/__tests__/asset-decoders.unit.test.d.ts.map +0 -1
  566. package/dist/assets/__tests__/mipmap-generator.unit.test.d.ts +0 -2
  567. package/dist/assets/__tests__/mipmap-generator.unit.test.d.ts.map +0 -1
  568. package/dist/assets/__tests__/render-asset-port.unit.test.d.ts +0 -2
  569. package/dist/assets/__tests__/render-asset-port.unit.test.d.ts.map +0 -1
  570. package/dist/assets/__tests__/resolve-render-asset.unit.test.d.ts +0 -2
  571. package/dist/assets/__tests__/resolve-render-asset.unit.test.d.ts.map +0 -1
  572. package/dist/chunk-DJIMFYX6.mjs +0 -1439
  573. package/dist/chunk-DJIMFYX6.mjs.map +0 -1
  574. package/dist/chunk-F2SIOCRM.mjs +0 -7423
  575. package/dist/chunk-F2SIOCRM.mjs.map +0 -1
  576. package/dist/chunk-JMSB7AR4.mjs +0 -3
  577. package/dist/chunk-JMSB7AR4.mjs.map +0 -1
  578. package/dist/chunk-KHI6K4C6.mjs +0 -659
  579. package/dist/chunk-KHI6K4C6.mjs.map +0 -1
  580. package/dist/chunk-PORZOL2V.mjs +0 -569
  581. package/dist/chunk-PORZOL2V.mjs.map +0 -1
  582. package/dist/chunk-UOJGMDGP.mjs +0 -29913
  583. package/dist/chunk-UOJGMDGP.mjs.map +0 -1
  584. package/dist/components/__tests__/atmosphere-red.test.d.ts +0 -2
  585. package/dist/components/__tests__/atmosphere-red.test.d.ts.map +0 -1
  586. package/dist/components/__tests__/atmosphere.test.d.ts +0 -2
  587. package/dist/components/__tests__/atmosphere.test.d.ts.map +0 -1
  588. package/dist/components/__tests__/fog.test-d.d.ts +0 -2
  589. package/dist/components/__tests__/fog.test-d.d.ts.map +0 -1
  590. package/dist/components/__tests__/fog.test.d.ts +0 -2
  591. package/dist/components/__tests__/fog.test.d.ts.map +0 -1
  592. package/dist/components/atmosphere.d.ts +0 -18
  593. package/dist/components/atmosphere.d.ts.map +0 -1
  594. package/dist/components/environment.d.ts +0 -115
  595. package/dist/components/environment.d.ts.map +0 -1
  596. package/dist/deferred-lighting.d.ts +0 -13
  597. package/dist/deferred-lighting.d.ts.map +0 -1
  598. package/dist/dynamic-texture-store.d.ts +0 -42
  599. package/dist/dynamic-texture-store.d.ts.map +0 -1
  600. package/dist/environment/__tests__/failure-injection.test.d.ts +0 -2
  601. package/dist/environment/__tests__/failure-injection.test.d.ts.map +0 -1
  602. package/dist/environment/__tests__/generation-red.test.d.ts +0 -2
  603. package/dist/environment/__tests__/generation-red.test.d.ts.map +0 -1
  604. package/dist/environment/__tests__/generation.test.d.ts +0 -2
  605. package/dist/environment/__tests__/generation.test.d.ts.map +0 -1
  606. package/dist/environment/__tests__/graph-transaction.test.d.ts +0 -2
  607. package/dist/environment/__tests__/graph-transaction.test.d.ts.map +0 -1
  608. package/dist/environment/__tests__/inspection-red.test.d.ts +0 -2
  609. package/dist/environment/__tests__/inspection-red.test.d.ts.map +0 -1
  610. package/dist/environment/__tests__/lifecycle-evidence.test.d.ts +0 -2
  611. package/dist/environment/__tests__/lifecycle-evidence.test.d.ts.map +0 -1
  612. package/dist/environment/__tests__/pipeline-topology.test.d.ts +0 -2
  613. package/dist/environment/__tests__/pipeline-topology.test.d.ts.map +0 -1
  614. package/dist/environment/__tests__/readiness.test.d.ts +0 -2
  615. package/dist/environment/__tests__/readiness.test.d.ts.map +0 -1
  616. package/dist/environment/__tests__/recovery.test.d.ts +0 -2
  617. package/dist/environment/__tests__/recovery.test.d.ts.map +0 -1
  618. package/dist/environment/__tests__/resize-dispose.test.d.ts +0 -2
  619. package/dist/environment/__tests__/resize-dispose.test.d.ts.map +0 -1
  620. package/dist/environment/__tests__/signature-red.test.d.ts +0 -2
  621. package/dist/environment/__tests__/signature-red.test.d.ts.map +0 -1
  622. package/dist/environment/__tests__/signature.test.d.ts +0 -2
  623. package/dist/environment/__tests__/signature.test.d.ts.map +0 -1
  624. package/dist/environment/descriptors.d.ts +0 -2
  625. package/dist/environment/descriptors.d.ts.map +0 -1
  626. package/dist/environment/extracted-environment.d.ts +0 -53
  627. package/dist/environment/extracted-environment.d.ts.map +0 -1
  628. package/dist/environment/generation.d.ts +0 -62
  629. package/dist/environment/generation.d.ts.map +0 -1
  630. package/dist/environment/gpu-bundle.d.ts +0 -23
  631. package/dist/environment/gpu-bundle.d.ts.map +0 -1
  632. package/dist/environment/graph.d.ts +0 -108
  633. package/dist/environment/graph.d.ts.map +0 -1
  634. package/dist/environment/inspection.d.ts +0 -48
  635. package/dist/environment/inspection.d.ts.map +0 -1
  636. package/dist/environment/lifecycle.d.ts +0 -22
  637. package/dist/environment/lifecycle.d.ts.map +0 -1
  638. package/dist/environment/readiness.d.ts +0 -29
  639. package/dist/environment/readiness.d.ts.map +0 -1
  640. package/dist/environment/signature.d.ts +0 -70
  641. package/dist/environment/signature.d.ts.map +0 -1
  642. package/dist/extract/__tests__/directional-csm-domain.unit.test.d.ts +0 -2
  643. package/dist/extract/__tests__/directional-csm-domain.unit.test.d.ts.map +0 -1
  644. package/dist/extract/__tests__/environment-source.test.d.ts +0 -2
  645. package/dist/extract/__tests__/environment-source.test.d.ts.map +0 -1
  646. package/dist/extract/__tests__/schema-readers.unit.test.d.ts +0 -2
  647. package/dist/extract/__tests__/schema-readers.unit.test.d.ts.map +0 -1
  648. package/dist/extract/directional-csm.d.ts +0 -129
  649. package/dist/extract/directional-csm.d.ts.map +0 -1
  650. package/dist/extract/index.d.ts +0 -5
  651. package/dist/extract/index.d.ts.map +0 -1
  652. package/dist/extract/material-interface.d.ts +0 -56
  653. package/dist/extract/material-interface.d.ts.map +0 -1
  654. package/dist/extract/schema-readers.d.ts +0 -20
  655. package/dist/extract/schema-readers.d.ts.map +0 -1
  656. package/dist/features/graph-contribution.d.ts +0 -64
  657. package/dist/features/graph-contribution.d.ts.map +0 -1
  658. package/dist/features/index.d.ts +0 -21
  659. package/dist/features/index.d.ts.map +0 -1
  660. package/dist/features/morph/index.d.ts +0 -3
  661. package/dist/features/morph/index.d.ts.map +0 -1
  662. package/dist/features/morph/morph-bounds.d.ts +0 -42
  663. package/dist/features/morph/morph-bounds.d.ts.map +0 -1
  664. package/dist/features/scene-temporal.d.ts +0 -45
  665. package/dist/features/scene-temporal.d.ts.map +0 -1
  666. package/dist/features/taa-resolve.d.ts +0 -21
  667. package/dist/features/taa-resolve.d.ts.map +0 -1
  668. package/dist/frame-chain.d.ts +0 -14
  669. package/dist/frame-chain.d.ts.map +0 -1
  670. package/dist/gpu-driven/view-reference.d.ts.map +0 -1
  671. package/dist/gpu-resource-store.d.ts.map +0 -1
  672. package/dist/hdrp-cluster-membership.d.ts +0 -2
  673. package/dist/hdrp-cluster-membership.d.ts.map +0 -1
  674. package/dist/hdrp-pipeline.d.ts +0 -36
  675. package/dist/hdrp-pipeline.d.ts.map +0 -1
  676. package/dist/ibl/cubemap-projection.d.ts +0 -23
  677. package/dist/ibl/cubemap-projection.d.ts.map +0 -1
  678. package/dist/ibl/face-uniforms.d.ts +0 -65
  679. package/dist/ibl/face-uniforms.d.ts.map +0 -1
  680. package/dist/mesh-update-errors.d.ts +0 -71
  681. package/dist/mesh-update-errors.d.ts.map +0 -1
  682. package/dist/mipmap-generator.d.ts +0 -39
  683. package/dist/mipmap-generator.d.ts.map +0 -1
  684. package/dist/param-schema-projection-census.d.ts +0 -18
  685. package/dist/param-schema-projection-census.d.ts.map +0 -1
  686. package/dist/persistent-render-scene.d.ts +0 -158
  687. package/dist/persistent-render-scene.d.ts.map +0 -1
  688. package/dist/pipeline/index.d.ts +0 -11
  689. package/dist/pipeline/index.d.ts.map +0 -1
  690. package/dist/pipeline-errors.d.ts +0 -110
  691. package/dist/pipeline-errors.d.ts.map +0 -1
  692. package/dist/prepare/__tests__/schema-readers.unit.test.d.ts +0 -2
  693. package/dist/prepare/__tests__/schema-readers.unit.test.d.ts.map +0 -1
  694. package/dist/prepare/index.d.ts +0 -4
  695. package/dist/prepare/index.d.ts.map +0 -1
  696. package/dist/prepare/schema-readers.d.ts +0 -11
  697. package/dist/prepare/schema-readers.d.ts.map +0 -1
  698. package/dist/record/__tests__/environment-record.test.d.ts +0 -2
  699. package/dist/record/__tests__/environment-record.test.d.ts.map +0 -1
  700. package/dist/record/__tests__/frame-targets.unit.test.d.ts +0 -2
  701. package/dist/record/__tests__/frame-targets.unit.test.d.ts.map +0 -1
  702. package/dist/record/__tests__/membership-timing.unit.test.d.ts +0 -2
  703. package/dist/record/__tests__/membership-timing.unit.test.d.ts.map +0 -1
  704. package/dist/record/__tests__/render-submission.integration.test.d.ts +0 -2
  705. package/dist/record/__tests__/render-submission.integration.test.d.ts.map +0 -1
  706. package/dist/record/__tests__/render-submission.perf.test.d.ts +0 -2
  707. package/dist/record/__tests__/render-submission.perf.test.d.ts.map +0 -1
  708. package/dist/record/__tests__/shadow-submit-mode.unit.test.d.ts +0 -2
  709. package/dist/record/__tests__/shadow-submit-mode.unit.test.d.ts.map +0 -1
  710. package/dist/record/__tests__/view-ubo-layout.unit.test.d.ts +0 -2
  711. package/dist/record/__tests__/view-ubo-layout.unit.test.d.ts.map +0 -1
  712. package/dist/record/frame-observation.d.ts +0 -38
  713. package/dist/record/frame-observation.d.ts.map +0 -1
  714. package/dist/record/index.d.ts +0 -15
  715. package/dist/record/index.d.ts.map +0 -1
  716. package/dist/record/main-pass-skin.d.ts +0 -46
  717. package/dist/record/main-pass-skin.d.ts.map +0 -1
  718. package/dist/record/main-pass-sprite.d.ts +0 -69
  719. package/dist/record/main-pass-sprite.d.ts.map +0 -1
  720. package/dist/record/material-payload.d.ts +0 -43
  721. package/dist/record/material-payload.d.ts.map +0 -1
  722. package/dist/record/material-slot-plan.d.ts +0 -26
  723. package/dist/record/material-slot-plan.d.ts.map +0 -1
  724. package/dist/record/membership-timing.d.ts +0 -232
  725. package/dist/record/membership-timing.d.ts.map +0 -1
  726. package/dist/record/shadow-caster-uniform.d.ts +0 -8
  727. package/dist/record/shadow-caster-uniform.d.ts.map +0 -1
  728. package/dist/record/shadow-submit-mode.d.ts +0 -66
  729. package/dist/record/shadow-submit-mode.d.ts.map +0 -1
  730. package/dist/render-dispatch-membership.d.ts +0 -47
  731. package/dist/render-dispatch-membership.d.ts.map +0 -1
  732. package/dist/render-pipeline-context.d.ts +0 -289
  733. package/dist/render-pipeline-context.d.ts.map +0 -1
  734. package/dist/render-pipeline-target.d.ts +0 -16
  735. package/dist/render-pipeline-target.d.ts.map +0 -1
  736. package/dist/render-scene-projection.d.ts +0 -174
  737. package/dist/render-scene-projection.d.ts.map +0 -1
  738. package/dist/render-system-fold.d.ts +0 -266
  739. package/dist/render-system-fold.d.ts.map +0 -1
  740. package/dist/renderer/asset-service.d.ts +0 -10
  741. package/dist/renderer/asset-service.d.ts.map +0 -1
  742. package/dist/renderer/backend-selection.d.ts.map +0 -1
  743. package/dist/renderer/environment-classify.d.ts +0 -6
  744. package/dist/renderer/environment-classify.d.ts.map +0 -1
  745. package/dist/renderer/environment-error.d.ts +0 -13
  746. package/dist/renderer/environment-error.d.ts.map +0 -1
  747. package/dist/renderer/material/pipeline-projection.d.ts +0 -91
  748. package/dist/renderer/material/pipeline-projection.d.ts.map +0 -1
  749. package/dist/renderer/renderer-factory.d.ts +0 -289
  750. package/dist/renderer/renderer-factory.d.ts.map +0 -1
  751. package/dist/renderer.d.ts +0 -771
  752. package/dist/renderer.d.ts.map +0 -1
  753. package/dist/scene-utils/collect-subtree.d.ts +0 -11
  754. package/dist/scene-utils/collect-subtree.d.ts.map +0 -1
  755. package/dist/ssao-data.d.ts +0 -34
  756. package/dist/ssao-data.d.ts.map +0 -1
  757. package/dist/surface-format.d.ts +0 -10
  758. package/dist/surface-format.d.ts.map +0 -1
  759. package/dist/taa-history-store.d.ts +0 -88
  760. package/dist/taa-history-store.d.ts.map +0 -1
  761. package/dist/temporal-coverage.d.ts +0 -35
  762. package/dist/temporal-coverage.d.ts.map +0 -1
  763. package/dist/temporal-frame-transaction.d.ts +0 -92
  764. package/dist/temporal-frame-transaction.d.ts.map +0 -1
  765. package/dist/temporal-inspection.d.ts +0 -57
  766. package/dist/temporal-inspection.d.ts.map +0 -1
  767. package/dist/temporal-view.d.ts +0 -43
  768. package/dist/temporal-view.d.ts.map +0 -1
  769. package/dist/tilemap/resolve-tileset-runtime.d.ts +0 -23
  770. package/dist/tilemap/resolve-tileset-runtime.d.ts.map +0 -1
  771. package/dist/urp-pipeline.d.ts +0 -4
  772. package/dist/urp-pipeline.d.ts.map +0 -1
  773. package/src/__tests__/analytic-sky-contract.test.ts +0 -27
  774. package/src/__tests__/analytic-sky-falsify-carriers.mjs +0 -43
  775. package/src/__tests__/analytic-sky-falsify.test.ts +0 -94
  776. package/src/__tests__/assets-runtime-handoff.integration.test.ts +0 -36
  777. package/src/__tests__/backend-selection.integration.test.ts +0 -11
  778. package/src/__tests__/camera-temporal.test-d.ts +0 -8
  779. package/src/__tests__/camera-temporal.test.ts +0 -188
  780. package/src/__tests__/directional-shadow-probe-atlas-layout.unit.test.ts +0 -18
  781. package/src/__tests__/environment-inspection.test.ts +0 -45
  782. package/src/__tests__/fog-ai-user.fixture.ts +0 -350
  783. package/src/__tests__/fog-custom-render-feature.fixture.ts +0 -33
  784. package/src/__tests__/fog-custom-render-feature.integration.test.ts +0 -76
  785. package/src/__tests__/fog-inspection.integration.test.ts +0 -127
  786. package/src/__tests__/fog-owner-state.integration.test.ts +0 -112
  787. package/src/__tests__/fog-pipeline-topology.integration.test.ts +0 -93
  788. package/src/__tests__/fog-public-surface.integration.test.ts +0 -60
  789. package/src/__tests__/fog-ray-contract.integration.test.ts +0 -73
  790. package/src/__tests__/fog-source-absence.integration.test.ts +0 -51
  791. package/src/__tests__/fog-temporal.integration.test.ts +0 -115
  792. package/src/__tests__/frame-chain.unit.test.ts +0 -26
  793. package/src/__tests__/gpu-scene-field-type-owner.test-d.ts +0 -27
  794. package/src/__tests__/hdrp-pipeline.unit.test.ts +0 -100
  795. package/src/__tests__/ibl/ibl-fallback.unit.test.ts +0 -23
  796. package/src/__tests__/material-derived-error-stop-draw.integration.test.ts +0 -69
  797. package/src/__tests__/material-derived-payload.integration.test.ts +0 -164
  798. package/src/__tests__/materials.unit.test.ts +0 -25
  799. package/src/__tests__/param-schema-projection-census.unit.test.ts +0 -40
  800. package/src/__tests__/persistent-render-scene.unit.test.ts +0 -1311
  801. package/src/__tests__/pipeline-error-policy-owner.unit.test.ts +0 -167
  802. package/src/__tests__/pipeline-pass-trace.test.ts +0 -92
  803. package/src/__tests__/pipeline-stage-owner.test-d.ts +0 -13
  804. package/src/__tests__/plugin.test.ts +0 -25
  805. package/src/__tests__/prepared-graphics-backend-matrix.unit.test.ts +0 -129
  806. package/src/__tests__/prepared-graphics-resolver-recording.unit.test.ts +0 -180
  807. package/src/__tests__/public-pipeline-id.test-d.ts +0 -6
  808. package/src/__tests__/render-dispatch-membership.unit.test.ts +0 -117
  809. package/src/__tests__/render-feature-construction.unit.test.ts +0 -124
  810. package/src/__tests__/render-feature-error-code-owner.test-d.ts +0 -27
  811. package/src/__tests__/render-feature-gpu-buffer-usage-owner.test-d.ts +0 -46
  812. package/src/__tests__/render-feature-graph.integration.test.ts +0 -205
  813. package/src/__tests__/render-feature-graphics-staging.unit.test.ts +0 -200
  814. package/src/__tests__/render-feature-order.unit.test.ts +0 -66
  815. package/src/__tests__/render-feature-prepared-graphics-recording.unit.test.ts +0 -107
  816. package/src/__tests__/render-feature-staging.unit.test.ts +0 -94
  817. package/src/__tests__/renderer-render-scene-public.test-d.ts +0 -27
  818. package/src/__tests__/scene-temporal-coverage.unit.test.ts +0 -259
  819. package/src/__tests__/sun-snapshot-consumers.test.ts +0 -35
  820. package/src/__tests__/surface-backend-kind-owner.test-d.ts +0 -42
  821. package/src/__tests__/taa-history-store.unit.test.ts +0 -196
  822. package/src/__tests__/temporal-frame-transaction.integration.test.ts +0 -537
  823. package/src/__tests__/temporal-inspection.unit.test.ts +0 -138
  824. package/src/assets/__tests__/asset-decoders.unit.test.ts +0 -92
  825. package/src/assets/__tests__/mipmap-generator.unit.test.ts +0 -52
  826. package/src/assets/__tests__/render-asset-port.unit.test.ts +0 -54
  827. package/src/assets/__tests__/resolve-render-asset.unit.test.ts +0 -47
  828. package/src/components/__tests__/atmosphere-red.test.ts +0 -51
  829. package/src/components/__tests__/atmosphere.test.ts +0 -79
  830. package/src/components/__tests__/fog.test-d.ts +0 -49
  831. package/src/components/__tests__/fog.test.ts +0 -60
  832. package/src/components/atmosphere.ts +0 -64
  833. package/src/deferred-lighting.ts +0 -92
  834. package/src/dynamic-texture-store.ts +0 -111
  835. package/src/environment/README.md +0 -76
  836. package/src/environment/__tests__/failure-injection.test.ts +0 -50
  837. package/src/environment/__tests__/generation-red.test.ts +0 -64
  838. package/src/environment/__tests__/generation.test.ts +0 -37
  839. package/src/environment/__tests__/graph-transaction.test.ts +0 -85
  840. package/src/environment/__tests__/inspection-red.test.ts +0 -53
  841. package/src/environment/__tests__/lifecycle-evidence.test.ts +0 -40
  842. package/src/environment/__tests__/pipeline-topology.test.ts +0 -33
  843. package/src/environment/__tests__/readiness.test.ts +0 -42
  844. package/src/environment/__tests__/recovery.test.ts +0 -62
  845. package/src/environment/__tests__/resize-dispose.test.ts +0 -30
  846. package/src/environment/__tests__/signature-red.test.ts +0 -45
  847. package/src/environment/__tests__/signature.test.ts +0 -60
  848. package/src/environment/descriptors.ts +0 -7
  849. package/src/environment/extracted-environment.ts +0 -239
  850. package/src/environment/generation.ts +0 -158
  851. package/src/environment/gpu-bundle.ts +0 -144
  852. package/src/environment/graph.ts +0 -588
  853. package/src/environment/inspection.ts +0 -107
  854. package/src/environment/lifecycle.ts +0 -124
  855. package/src/environment/readiness.ts +0 -76
  856. package/src/environment/signature.ts +0 -185
  857. package/src/extract/__tests__/directional-csm-domain.unit.test.ts +0 -391
  858. package/src/extract/__tests__/environment-source.test.ts +0 -105
  859. package/src/extract/__tests__/schema-readers.unit.test.ts +0 -16
  860. package/src/extract/directional-csm.ts +0 -959
  861. package/src/extract/index.ts +0 -10
  862. package/src/extract/material-interface.ts +0 -604
  863. package/src/extract/schema-readers.ts +0 -27
  864. package/src/features/graph-contribution.ts +0 -577
  865. package/src/features/index.ts +0 -100
  866. package/src/features/morph/index.ts +0 -24
  867. package/src/features/morph/morph-bounds.ts +0 -123
  868. package/src/features/scene-temporal.ts +0 -274
  869. package/src/features/taa-resolve.ts +0 -244
  870. package/src/frame-chain.ts +0 -21
  871. package/src/hdrp-cluster-membership.ts +0 -70
  872. package/src/ibl/cubemap-projection.ts +0 -60
  873. package/src/ibl/face-uniforms.ts +0 -150
  874. package/src/mesh-update-errors.ts +0 -113
  875. package/src/mipmap-generator.ts +0 -244
  876. package/src/param-schema-projection-census.ts +0 -73
  877. package/src/persistent-render-scene.ts +0 -1752
  878. package/src/pipeline/index.ts +0 -40
  879. package/src/pipeline-errors.ts +0 -172
  880. package/src/prepare/__tests__/schema-readers.unit.test.ts +0 -16
  881. package/src/prepare/index.ts +0 -8
  882. package/src/prepare/schema-readers.ts +0 -20
  883. package/src/record/__tests__/environment-record.test.ts +0 -35
  884. package/src/record/__tests__/frame-targets.unit.test.ts +0 -54
  885. package/src/record/__tests__/membership-timing.unit.test.ts +0 -524
  886. package/src/record/__tests__/render-submission.integration.test.ts +0 -76
  887. package/src/record/__tests__/render-submission.perf.test.ts +0 -141
  888. package/src/record/__tests__/shadow-submit-mode.unit.test.ts +0 -88
  889. package/src/record/__tests__/view-ubo-layout.unit.test.ts +0 -101
  890. package/src/record/frame-observation.ts +0 -122
  891. package/src/record/index.ts +0 -15
  892. package/src/record/main-pass-skin.ts +0 -51
  893. package/src/record/main-pass-sprite.ts +0 -166
  894. package/src/record/material-payload.ts +0 -292
  895. package/src/record/material-slot-plan.ts +0 -68
  896. package/src/record/membership-timing.ts +0 -1012
  897. package/src/record/shadow-caster-uniform.ts +0 -37
  898. package/src/record/shadow-submit-mode.ts +0 -277
  899. package/src/render-dispatch-membership.ts +0 -155
  900. package/src/render-pipeline-context.ts +0 -332
  901. package/src/render-pipeline-target.ts +0 -96
  902. package/src/render-scene-projection.ts +0 -1738
  903. package/src/render-system-fold.ts +0 -531
  904. package/src/renderer/asset-service.ts +0 -32
  905. package/src/renderer/backend-selection.ts +0 -121
  906. package/src/renderer/environment-classify.ts +0 -30
  907. package/src/renderer/environment-error.ts +0 -19
  908. package/src/renderer/material/pipeline-projection.ts +0 -140
  909. package/src/renderer.ts +0 -940
  910. package/src/scene-utils/collect-subtree.ts +0 -40
  911. package/src/ssao-data.ts +0 -106
  912. package/src/surface-format.ts +0 -37
  913. package/src/taa-history-store.ts +0 -429
  914. package/src/temporal-coverage.ts +0 -106
  915. package/src/temporal-frame-transaction.ts +0 -301
  916. package/src/temporal-inspection.ts +0 -194
  917. package/src/temporal-view.ts +0 -174
  918. package/src/tilemap/resolve-tileset-runtime.ts +0 -72
@@ -1,531 +0,0 @@
1
- // @forgeax/engine-runtime — fold operator (record-stage transparent fold).
2
- //
3
- // feat-20260622-chunk-gpu-instancing-sprite-tilemap M1 / w4 — pure helper.
4
- // feat-20260622-chunk-gpu-instancing-sprite-tilemap M2 / w11 — uniform-cap
5
- // fallback decision helper (`evaluateFoldBucketUniformCap`).
6
- //
7
- // Plan-strategy D-1 (record-stage transparent fold) + D-5 (mode-gate) +
8
- // D-7 (bucket key reuses transparent-sort equivalence class — no new BinKey
9
- // type). The helper takes a transparent-sort-ordered DispatchEntry[] and
10
- // groups consecutive entries with equal three-tuple
11
- // (Layer.value, sortKey, materialHandle) into FoldBucket descriptors.
12
- //
13
- // The bucket carries an assembled Float32Array of per-instance world mat4s
14
- // (stride=16, column-major), suitable for upload to a GPU instance buffer
15
- // and a single drawIndexed(indexCount, bucketSize) call. The actual
16
- // recordFrame integration (instance buffer upload + drawIndexed swap) is
17
- // the consumer's responsibility — this file is pure data shaping, no GPU
18
- // dependencies, fully unit-testable.
19
- //
20
- // Mode-gate (D-5, extended for LAYER_Y):
21
- // - mode 0 (LAYER_Z): folds on posZ (world[14]) — horizontal side-scroller.
22
- // - mode 1 (LAYER_Y): folds on posY (world[13]) — same-row tiles share posY
23
- // so consecutive equal-(layer, posY, materialHandle) runs collapse.
24
- // - mode 2 (LAYER_YZ) / 3 (DISTANCE): bypass per-entity — sort key is a
25
- // composite foot-Y formula or per-entity camera distance, neither
26
- // reducible to a single world-mat4 read without the full sort state.
27
- // Each entry becomes a singleton bucket (bucketSize=1); the dispatch
28
- // consumer treats singletons identically to per-entity drawIndexed
29
- // (charter P3 silent fallback — no error fired).
30
- //
31
- // Uniform-cap fallback (M2 / D-2 + D-9):
32
- // - When `caps.storageBuffer === false` (WebGL2 path) AND a fold bucket
33
- // carries more than `FOLD_UNIFORM_INSTANCE_CAP = 128` instances, the
34
- // bucket cannot fit a uniform-buffer binding (research N-1: 128 * 64 B
35
- // mat4 stride = 8192 B fits inside the WebGL2 minimum 16384 B UBO size
36
- // with headroom; 256 instances * 64 B = 16384 B would not). The
37
- // pure-helper `evaluateFoldBucketUniformCap(bucket, caps, scope)`
38
- // answers the dispatch site's "should this bucket fold or fall back?"
39
- // question with a `{ fallback, error? }` POD. The record-stage
40
- // consumer (`render-system-record.ts`) fires `error` AND routes the
41
- // bucket through the same per-entity drawIndexed exit the mode-gate
42
- // bypass uses (plan-strategy D-9 "shared fallback exit") so the
43
- // frame stays visually correct (no identity-collapse / black screen).
44
- //
45
- // AC-08: this file lives outside packages/runtime/src/scene-instances/
46
- // (skin-joint post-spawn semantics, unrelated to GPU-instancing folding).
47
-
48
- import { RhiError } from '@forgeax/engine-rhi';
49
- import type { DispatchEntry } from './render-system-extract';
50
- import {
51
- TRANSPARENT_SORT_MODE_LAYER_Y,
52
- TRANSPARENT_SORT_MODE_LAYER_Z,
53
- type TransparentSortConfig,
54
- } from './systems/transparent-sort-config';
55
-
56
- /**
57
- * Per-bucket descriptor produced by {@link foldDispatchBuckets}.
58
- *
59
- * One bucket = one fold-eligible run of consecutive DispatchEntry whose
60
- * `(layer, sortKey, materialHandle)` triple is equal. Singleton buckets
61
- * (bucketSize=1) appear when the mode bypasses fold (D-5 mode 2/3) or
62
- * when consecutive entries differ in any of the three keys.
63
- *
64
- * Fields:
65
- * - `entries` — original DispatchEntry slice for this bucket (preserves
66
- * the input ordering); the consumer uses these to look up per-entity
67
- * material BG handles, mesh handles (which are bucket-uniform by
68
- * construction since materialHandle key is included), etc.
69
- * - `bucketSize` — `entries.length`. Surfaced as a top-level field so
70
- * the consumer can pass it directly as `instanceCount` to
71
- * `drawIndexed`.
72
- * - `transforms` — assembled Float32Array of bucketSize world mat4s,
73
- * stride=16 floats per instance, column-major. Suitable for direct
74
- * `device.queue.writeBuffer` into an instance buffer used at @group(3).
75
- * - `materialHandle` / `layer` / `sortKey` — the three-tuple key for this
76
- * bucket. `sortKey` is mode-dependent: posZ (world[14]) for mode 0
77
- * (LAYER_Z), posY (world[13]) for mode 1 (LAYER_Y). Consumed by the
78
- * dispatch loop for bind-group selection / sort-stability invariants.
79
- */
80
- export interface FoldBucket {
81
- readonly entries: readonly DispatchEntry[];
82
- readonly bucketSize: number;
83
- readonly transforms: Float32Array;
84
- readonly materialHandle: number;
85
- readonly layer: number;
86
- readonly sortKey: number;
87
- }
88
-
89
- /**
90
- * Minimal renderable shape consumed by the helper. The real
91
- * `RenderableSnapshot` carries many more fields; the helper only reads
92
- * `transform.world` (a Float32Array of 16 column-major floats) and
93
- * `material.transparent` (the LDR-split-sub-pass fold gate, see PR #502
94
- * fix + feat-20260625 R2 fix-up: geometry-pass entities — non-transparent
95
- * materials — MUST stay singleton because the sprite-pass dispatch path
96
- * that consumes `headBuckets` does not run for them; folding them would
97
- * overwrite their mesh-SSBO slot with identity and collapse 3D geometry
98
- * to origin).
99
- *
100
- * Production callers pass `RenderableSnapshot[]` straight through —
101
- * `RenderableSnapshot.material.transparent` is `boolean | undefined`
102
- * (derived by the extract stage from `passes[0].renderState.blend !==
103
- * undefined`, the post-feat-20260626-collapse SSOT; see
104
- * `MaterialSnapshot.transparent`), structurally compatible with this
105
- * minimal shape. The gate read inside the helper uses `=== true` /
106
- * `!== true` so both `false` and `undefined` enter the singleton branch.
107
- *
108
- * feat-20260625-refactor-sprite-as-transparent-mesh R2 fix-up: gate
109
- * migrated from `shadingModel === 'sprite'` (the union member was
110
- * removed in M3 / w15) to `transparent === true` (the new SSOT for
111
- * "routes through the LDR split sub-pass" — same predicate the
112
- * `splitLdrSprite` filter at render-system-record.ts:4826/5612 uses).
113
- */
114
- export interface FoldRenderableLike {
115
- readonly transform: { readonly world: Float32Array };
116
- readonly material: { readonly transparent?: boolean | undefined };
117
- }
118
-
119
- /**
120
- * Linear-scan fold operator (plan-strategy D-1).
121
- *
122
- * Walks `orderedEntries` (must be transparent-sort-ordered when mode=0;
123
- * the helper trusts the input ordering and only checks adjacent equality
124
- * — non-consecutive entries with equal keys are NOT merged, preserving
125
- * stable-sort semantics).
126
- *
127
- * @param orderedEntries — DispatchEntry[] in transparent-sort order. Empty
128
- * array yields zero buckets (defensive empty-bucket suppression).
129
- * @param mode — current `TransparentSortConfig.mode`. Modes 0 (LAYER_Z)
130
- * and 1 (LAYER_Y) enable fold using the appropriate sort-axis coordinate
131
- * (posZ / posY respectively). Modes 2 and 3 produce singleton buckets
132
- * per entry (D-5 bypass).
133
- * @param renderables — parallel snapshot array indexed by
134
- * `DispatchEntry.renderableIndex`. The helper reads `transform.world`
135
- * to (a) extract the sort-axis coordinate for the bucket key (posZ
136
- * world[14] for mode 0, posY world[13] for mode 1), and (b) copy 16
137
- * floats per entry into the assembled transforms buffer. Out-of-range /
138
- * missing renderables defensively contribute a zero mat4 slot.
139
- * @returns Array of FoldBucket descriptors in input order.
140
- */
141
- export function foldDispatchBuckets(
142
- orderedEntries: readonly DispatchEntry[],
143
- mode: TransparentSortConfig['mode'],
144
- renderables: readonly FoldRenderableLike[],
145
- ): readonly FoldBucket[] {
146
- if (orderedEntries.length === 0) return [];
147
-
148
- // Bypass branch (D-5): modes 2 (LAYER_YZ) and 3 (DISTANCE) cannot fold
149
- // — their sort keys are composite foot-Y formulas or per-entity camera
150
- // distances, not reducible to a single world-mat4 coordinate read.
151
- // Each entry produces its own singleton bucket; the dispatch consumer
152
- // treats bucketSize=1 identically to per-entity drawIndexed (charter P3
153
- // silent fallback — no error fired).
154
- //
155
- // Mode 1 (LAYER_Y) falls through to the fold branch below and uses posY
156
- // (world[13]) as the sort-axis bucket key.
157
- if (mode !== TRANSPARENT_SORT_MODE_LAYER_Z && mode !== TRANSPARENT_SORT_MODE_LAYER_Y) {
158
- const out: FoldBucket[] = [];
159
- for (let i = 0; i < orderedEntries.length; i++) {
160
- const e = orderedEntries[i];
161
- if (e === undefined) continue;
162
- out.push(makeSingletonBucket(e, renderables, mode));
163
- }
164
- return out;
165
- }
166
-
167
- // Fold branch (mode 0 = LAYER_Z, mode 1 = LAYER_Y): linear scan, collect
168
- // runs with equal (layer, sortKey, materialHandle). sortKey is posZ for
169
- // mode 0, posY for mode 1 — see readSortKey().
170
- //
171
- // Transparent-pass-only gate (PR #502 fix + feat-20260625 R2 fix-up):
172
- // the only dispatch site that consumes `headBuckets` to emit one
173
- // instanced drawIndexed per bucket is the transparent-pass loop in
174
- // `render-system-record.ts` (~line 5500; routed via `splitLdrSprite`
175
- // filter on `material.transparent === true`). The geometry-pass loop
176
- // (~line 4660) iterates `validatedOrdered` and emits per-entity
177
- // drawIndexed unchanged; it does NOT branch on `headBuckets`. So when
178
- // a non-transparent entry (geometry-pass: unlit / standard-PBR / skin)
179
- // is folded into a multi-entry bucket, the mesh-SSBO upload loop
180
- // (~line 2710) still overwrites its mesh slot with identity (because
181
- // `headBuckets.has(i)` is true), but the geometry-pass then reads
182
- // identity and renders the 3D geometry at the origin — collapsing the
183
- // frame to black (hello-room CI regression).
184
- //
185
- // Concept-count fix: encode "fold is transparent-sub-pass-only" at the
186
- // head selection point — the gate is the single bucket-key invariant
187
- // that makes both dispatch sites correct without coupling identity-
188
- // overwrite logic to a separate check (avoiding the D-9 shared-exit
189
- // violation that selecting fix-location B would produce).
190
- //
191
- // Non-transparent entries (`transparent !== true`) always produce
192
- // singleton buckets (bucketSize=1), which `buildFoldDispatchPlan`
193
- // filters out (`if (bucket.bucketSize <= 1) continue`), so they never
194
- // enter `headBuckets` / `skipIndices` — the mesh-SSBO upload,
195
- // transparent-pass, and geometry-pass loops all see them as byte-
196
- // identical to the pre-fold per-entity path.
197
- //
198
- // feat-20260625 R2 fix-up: pre-feat the gate was `shadingModel ===
199
- // 'sprite'`; M3 / w15 narrowed the shadingModel union to
200
- // `'unlit' | undefined` (the `'sprite'` discriminator was the design
201
- // ablation target), so the gate now reads `material.transparent` —
202
- // the new SSOT for "routes through the LDR split sub-pass" mirrored
203
- // on `computeSplitLdrSprite` + the `splitLdrSprite` skip filter.
204
- const buckets: FoldBucket[] = [];
205
- let runStart = 0;
206
- while (runStart < orderedEntries.length) {
207
- const head = orderedEntries[runStart];
208
- if (head === undefined) {
209
- runStart += 1;
210
- continue;
211
- }
212
- // Transparent-pass-only gate (feat-20260625 R2 fix-up): non-transparent
213
- // heads emit a singleton bucket and advance the cursor by 1 — no run
214
- // extension. `RenderableSnapshot.material.transparent` is the SSOT
215
- // carrier (extract stage derives it from the first pass's
216
- // `renderState.blend !== undefined`, post-feat-20260626-collapse;
217
- // see `MaterialSnapshot.transparent`).
218
- const headTransparent = renderables[head.renderableIndex]?.material.transparent;
219
- if (headTransparent !== true) {
220
- buckets.push(makeSingletonBucket(head, renderables, mode));
221
- runStart += 1;
222
- continue;
223
- }
224
- const headSortKey = readSortKey(mode, head.renderableIndex, renderables);
225
- let runEnd = runStart + 1;
226
- while (runEnd < orderedEntries.length) {
227
- const cand = orderedEntries[runEnd];
228
- if (cand === undefined) break;
229
- if (cand.layer !== head.layer) break;
230
- if (cand.materialHandle !== head.materialHandle) break;
231
- // Defensive: cand transparent must also be true to join the run.
232
- // Same materialHandle implies same transparent flag in production
233
- // (material asset identity), but the check costs O(1) per cand and
234
- // makes the bucket invariant locally readable.
235
- const candTransparent = renderables[cand.renderableIndex]?.material.transparent;
236
- if (candTransparent !== true) break;
237
- const candSortKey = readSortKey(mode, cand.renderableIndex, renderables);
238
- if (candSortKey !== headSortKey) break;
239
- runEnd += 1;
240
- }
241
-
242
- const run = orderedEntries.slice(runStart, runEnd);
243
- const transforms = assembleTransforms(run, renderables);
244
- buckets.push({
245
- entries: run,
246
- bucketSize: run.length,
247
- transforms,
248
- materialHandle: head.materialHandle,
249
- layer: head.layer,
250
- sortKey: headSortKey,
251
- });
252
- runStart = runEnd;
253
- }
254
- return buckets;
255
- }
256
-
257
- function makeSingletonBucket(
258
- entry: DispatchEntry,
259
- renderables: readonly FoldRenderableLike[],
260
- mode: TransparentSortConfig['mode'],
261
- ): FoldBucket {
262
- const transforms = new Float32Array(16);
263
- const w = renderables[entry.renderableIndex]?.transform.world;
264
- if (w !== undefined) transforms.set(w);
265
- const sortKey = readSortKey(mode, entry.renderableIndex, renderables);
266
- return {
267
- entries: [entry],
268
- bucketSize: 1,
269
- transforms,
270
- materialHandle: entry.materialHandle,
271
- layer: entry.layer,
272
- sortKey,
273
- };
274
- }
275
-
276
- function assembleTransforms(
277
- run: readonly DispatchEntry[],
278
- renderables: readonly FoldRenderableLike[],
279
- ): Float32Array {
280
- const out = new Float32Array(run.length * 16);
281
- for (let i = 0; i < run.length; i++) {
282
- const e = run[i];
283
- if (e === undefined) continue;
284
- const w = renderables[e.renderableIndex]?.transform.world;
285
- if (w !== undefined) out.set(w, i * 16);
286
- }
287
- return out;
288
- }
289
-
290
- function readSortKey(
291
- mode: TransparentSortConfig['mode'],
292
- renderableIndex: number,
293
- renderables: readonly FoldRenderableLike[],
294
- ): number {
295
- const w = renderables[renderableIndex]?.transform.world;
296
- if (w === undefined) return 0;
297
- // mode 0 (LAYER_Z): sort-axis is Z, column 3 row 2 = world[14].
298
- // mode 1 (LAYER_Y): sort-axis is Y, column 3 row 1 = world[13].
299
- return ((mode === TRANSPARENT_SORT_MODE_LAYER_Z ? w[14] : w[13]) ?? 0) as number;
300
- }
301
-
302
- /**
303
- * Per-validatedOrdered-index fold metadata consumed by the record-stage
304
- * dispatch loops. Built from {@link foldDispatchBuckets} output by
305
- * {@link buildFoldDispatchPlan}; see plan-strategy §3.2 sequence diagram.
306
- *
307
- * Field semantics (consumer contract, w4-record-swap):
308
- * - `headBuckets[i]` is non-null when validatedOrdered index `i` is the
309
- * **bucket head** of a non-singleton (bucketSize > 1) fold bucket. The
310
- * dispatch loop overrides @group(3) instances BG to a transient buffer
311
- * holding `bucket.transforms` and emits `drawIndexed(idxCount,
312
- * bucket.bucketSize)` instead of per-entity drawIndexed.
313
- * - `skipIndices.has(i)` is true when index `i` is a non-head member of
314
- * a non-singleton fold bucket; the dispatch loop emits `continue`.
315
- * - Singleton buckets (bucketSize === 1) leave both arrays empty for
316
- * that index — dispatch falls through to the existing per-entity path
317
- * byte-identically (mode-bypass / non-foldable head / fold-disabled).
318
- *
319
- * Note: the maps are keyed on `validatedOrderedIndex`, NOT
320
- * `renderableIndex`. The dispatch loops iterate `validatedOrdered` by
321
- * positional index `i`, and that index drives mesh SSBO slot offset
322
- * (`i * MESH_PER_ENTITY_STRIDE`), material UBO slot, and per-entity bind
323
- * group cache keys, all of which the swap must coordinate with.
324
- */
325
- export interface FoldDispatchPlan {
326
- readonly headBuckets: ReadonlyMap<number, FoldBucket>;
327
- readonly skipIndices: ReadonlySet<number>;
328
- readonly foldedBucketCount: number;
329
- }
330
-
331
- /**
332
- * Build the per-validatedOrdered-index fold metadata from a
333
- * {@link foldDispatchBuckets} output.
334
- *
335
- * @param buckets — output of {@link foldDispatchBuckets}; ordered by
336
- * transparent-sort scan order.
337
- * @param renderableIndexToValidatedIndex — map from `DispatchEntry.renderableIndex`
338
- * to the validated-ordered index `i` (the loop counter the dispatch
339
- * loops use). Caller builds this once per frame from `validatedOrdered`.
340
- * @returns FoldDispatchPlan keyed by validated-ordered index.
341
- *
342
- * Empty / all-singleton input yields empty maps + `foldedBucketCount=0`,
343
- * which the dispatch loops treat as "no fold this frame" — byte-identical
344
- * to pre-feat behavior.
345
- */
346
- export function buildFoldDispatchPlan(
347
- buckets: readonly FoldBucket[],
348
- renderableIndexToValidatedIndex: ReadonlyMap<number, number>,
349
- ): FoldDispatchPlan {
350
- const headBuckets = new Map<number, FoldBucket>();
351
- const skipIndices = new Set<number>();
352
- let foldedBucketCount = 0;
353
- for (const bucket of buckets) {
354
- if (bucket.bucketSize <= 1) continue;
355
- const headEntry = bucket.entries[0];
356
- if (headEntry === undefined) continue;
357
- const headValidatedIdx = renderableIndexToValidatedIndex.get(headEntry.renderableIndex);
358
- if (headValidatedIdx === undefined) continue;
359
- headBuckets.set(headValidatedIdx, bucket);
360
- foldedBucketCount += 1;
361
- for (let i = 1; i < bucket.entries.length; i++) {
362
- const memberEntry = bucket.entries[i];
363
- if (memberEntry === undefined) continue;
364
- const memberValidatedIdx = renderableIndexToValidatedIndex.get(memberEntry.renderableIndex);
365
- if (memberValidatedIdx === undefined) continue;
366
- skipIndices.add(memberValidatedIdx);
367
- }
368
- }
369
- return { headBuckets, skipIndices, foldedBucketCount };
370
- }
371
-
372
- /**
373
- * WebGL2 uniform-fallback per-bucket instance-count ceiling
374
- * (feat-20260622-chunk-gpu-instancing-sprite-tilemap M2 / D-2 +
375
- * research N-1).
376
- *
377
- * 128 instances * 64 B/mat4 stride = 8192 B, comfortably below the WebGL2
378
- * minimum 16384 B UBO size, leaving headroom for the per-frame material
379
- * UBO slice. Locked at the type level via `RhiInstancingExceedsUniformCapDetail.limit`
380
- * (literal 128) — a future cap change would be a major evolution, not a
381
- * runtime knob.
382
- */
383
- export const FOLD_UNIFORM_INSTANCE_CAP = 128;
384
-
385
- /**
386
- * Minimal `RhiCapabilities` shape consumed by the cap-fallback helper.
387
- *
388
- * The real `RhiDevice.caps` carries many feature flags; the helper only
389
- * reads `storageBuffer` (the WebGL2 / WebGPU split signal — true on
390
- * WebGPU + dawn / wgpu native paths, false on the WebGL2 uniform-only
391
- * fallback path). Mirrors the field name on the production `RhiCaps`
392
- * type so the dispatch site can pass `runtime.device.caps` straight in.
393
- */
394
- export interface FoldCapsLike {
395
- readonly storageBuffer: boolean;
396
- }
397
-
398
- /**
399
- * Decision POD returned by {@link evaluateFoldBucketUniformCap}.
400
- *
401
- * Fields:
402
- * - `fallback` — `true` when the bucket must NOT fold and the dispatch
403
- * site must route it through the per-entity drawIndexed exit (the
404
- * same exit the mode-gate bypass uses, plan-strategy D-9 "shared
405
- * fallback exit"). `false` when the bucket can fold normally.
406
- * - `error` — the structured RhiError to fire alongside the fallback.
407
- * Always populated when `fallback === true`; always `undefined` when
408
- * `fallback === false` (charter proposition 4: explicit failure on
409
- * the failure path; silent success on the success path).
410
- *
411
- * Caller contract: when `fallback === true`, fire the error via the
412
- * runtime error registry AND draw the bucket's entries individually
413
- * (each as a 1-instance drawIndexed). Skipping the fallback while still
414
- * firing the error would leave the frame visually wrong (uniform buffer
415
- * write would clip at 128 entries).
416
- */
417
- export interface FoldBucketCapDecision {
418
- readonly fallback: boolean;
419
- readonly error: RhiError | undefined;
420
- }
421
-
422
- /**
423
- * Decide whether a fold bucket fits the WebGL2 uniform-fallback per-bucket
424
- * instance-count ceiling, returning the structured RhiError + fallback
425
- * intent the dispatch site needs to act on
426
- * (feat-20260622-chunk-gpu-instancing-sprite-tilemap M2 / w11 +
427
- * plan-strategy D-2 + D-9 + AC-05).
428
- *
429
- * Decision matrix:
430
- *
431
- * | caps.storageBuffer | bucketSize | fallback | error |
432
- * |:--|:--|:--|:--|
433
- * | `true` | any | `false` | `undefined` (WebGPU has no per-binding instance cap inside the storage buffer's `maxStorageBufferBindingSize`; the byte-cap path emits `'limit-exceeded'` separately) |
434
- * | `false` | `<= 128` | `false` | `undefined` (fits inside the WebGL2 minimum 16384 B UBO with headroom) |
435
- * | `false` | `> 128` | `true` | `RhiError({ code: 'instancing-exceeds-uniform-cap', detail: { requested, limit: 128, scope } })` |
436
- *
437
- * Singleton buckets (`bucketSize === 1`) always pass — they are the
438
- * mode-gate bypass output and never need the cap check (the cap is
439
- * about *folded* bucket arity, not about per-entity per-frame work).
440
- *
441
- * @param bucket — the FoldBucket whose `bucketSize` is the sole input
442
- * (instance count = bucketSize); other fields are not consulted.
443
- * @param caps — the runtime's RHI capability flags
444
- * (`runtime.device.caps`); only `storageBuffer` is read.
445
- * @param scope — closed `'sprite' | 'tilemap-chunk'` discriminator the
446
- * dispatch site picks based on the call site (sprite-pass primary
447
- * sprite entry vs tilemap-chunk-derived entry). Surfaced verbatim on
448
- * the error's `.detail.scope` so AI users can branch their recovery
449
- * on which dispatch site overflowed.
450
- * @returns a {@link FoldBucketCapDecision} POD; never throws.
451
- */
452
- export function evaluateFoldBucketUniformCap(
453
- bucket: FoldBucket,
454
- caps: FoldCapsLike,
455
- scope: 'sprite' | 'tilemap-chunk',
456
- ): FoldBucketCapDecision {
457
- if (caps.storageBuffer) return { fallback: false, error: undefined };
458
- if (bucket.bucketSize <= FOLD_UNIFORM_INSTANCE_CAP) {
459
- return { fallback: false, error: undefined };
460
- }
461
- const error = new RhiError({
462
- code: 'instancing-exceeds-uniform-cap',
463
- expected: `bucket instance count <= ${FOLD_UNIFORM_INSTANCE_CAP} (uniform fallback cap)`,
464
- hint: `reduce the bucket size (smaller layer/material groupings), switch to a WebGPU-capable backend (storage buffers lift the cap), or accept the per-cell drawIndexed fallback for ${scope}`,
465
- detail: {
466
- requested: bucket.bucketSize,
467
- limit: FOLD_UNIFORM_INSTANCE_CAP,
468
- scope,
469
- },
470
- });
471
- return { fallback: true, error };
472
- }
473
-
474
- /**
475
- * Closed metric key for the AC-06 fold counter
476
- * (feat-20260622-chunk-gpu-instancing-sprite-tilemap M3 / D-3).
477
- *
478
- * Semantics — count of instanced `drawIndexed` calls the fold operator
479
- * emits this frame; one increment per non-singleton head bucket retained
480
- * after the M2 / w11 cap-fallback filter. NOT entity count, NOT pre-
481
- * filter bucket count — cap-overrun buckets that the dispatch site
482
- * routed through the per-entity fallback exit do not count.
483
- *
484
- * Naming follows the EngineMetrics dot-namespace convention
485
- * (`<feature>.<event>`); `render.instancing.*` covers both sprite and
486
- * tilemap-chunk dispatch sites without scope ambiguity (research F-5,
487
- * plan-strategy §8.2). AI users observe via
488
- * `renderer.metrics.snapshot()['render.instancing.foldedDraws']`.
489
- */
490
- export const FOLDED_DRAWS_METRIC_KEY = 'render.instancing.foldedDraws';
491
-
492
- /**
493
- * Minimal `EngineMetrics` shape consumed by {@link incrementFoldedDrawsMetric}.
494
- *
495
- * The real `EngineMetrics` carries `snapshot()` + `reset()` too; the
496
- * helper only writes, so the consumed surface narrows to a single
497
- * method. Lets the unit test inject a `vi.fn()` mock without faking the
498
- * read APIs.
499
- */
500
- export interface FoldMetricsLike {
501
- increment(name: string): void;
502
- }
503
-
504
- /**
505
- * Bump the AC-06 `render.instancing.foldedDraws` counter once per fold-
506
- * eligible head bucket in `plan` (M3 / w13, plan-strategy D-3).
507
- *
508
- * Single counter-write site for the metric — the record-stage consumer
509
- * calls this once per `recordFrame` after the cap-fallback filter
510
- * (M2 / w11) so cap-overrun buckets do not contribute (their members
511
- * fall through to per-entity drawIndexed, which is not an instanced
512
- * draw). `plan.foldedBucketCount` is the SSOT for "how many instanced
513
- * drawIndexed will this frame emit"; passing the same plan to this
514
- * helper keeps the metric and the actual dispatch in lockstep.
515
- *
516
- * Mode-bypass plans (D-5: mode != 0 yields singleton-only buckets which
517
- * `buildFoldDispatchPlan` filters out) carry `foldedBucketCount === 0`
518
- * and produce no increments — per-entity drawIndexed is not folded so
519
- * the metric correctly stays at 0.
520
- *
521
- * @param plan — output of {@link buildFoldDispatchPlan} after any
522
- * cap-fallback filtering by the record-stage consumer.
523
- * @param metrics — the per-Renderer EngineMetrics counter; only
524
- * `increment(name)` is called. Empty `plan.foldedBucketCount === 0`
525
- * produces zero calls (no metric churn for fold-disabled frames).
526
- */
527
- export function incrementFoldedDrawsMetric(plan: FoldDispatchPlan, metrics: FoldMetricsLike): void {
528
- for (let i = 0; i < plan.foldedBucketCount; i++) {
529
- metrics.increment(FOLDED_DRAWS_METRIC_KEY);
530
- }
531
- }
@@ -1,32 +0,0 @@
1
- import type { CookedMaterialRecord } from '@forgeax/engine-pack';
2
- import {
3
- type MaterialArtifactConflictError,
4
- MaterialArtifactRegistry,
5
- type MaterialRuntimeArtifact,
6
- registerMaterialArtifact,
7
- } from '@forgeax/engine-shader';
8
- import { err, ok, type Result } from '@forgeax/engine-types';
9
-
10
- export interface MaterialAssetService {
11
- publish(
12
- record: CookedMaterialRecord,
13
- ): Result<CookedMaterialRecord, MaterialArtifactConflictError>;
14
- inspect(key: string): ReturnType<MaterialArtifactRegistry['inspect']>;
15
- }
16
-
17
- /** Render owns the CPU material artifact handoff; no GPU cache is introduced. */
18
- export function createMaterialAssetService(): MaterialAssetService {
19
- const artifacts = new MaterialArtifactRegistry();
20
- return {
21
- publish(record) {
22
- const artifact: MaterialRuntimeArtifact = {
23
- key: record.specializationKey ?? record.receipt.inputDigest,
24
- bytes: record.artifact.bytes,
25
- digest: record.artifact.digest,
26
- };
27
- const registered = registerMaterialArtifact(artifacts, artifact);
28
- return registered.ok ? ok(record) : err(registered.error);
29
- },
30
- inspect: (key) => artifacts.inspect(key),
31
- };
32
- }
@@ -1,121 +0,0 @@
1
- import type {
2
- Result,
3
- RhiCanvasContext,
4
- RhiDevice,
5
- RhiError,
6
- RhiInstance,
7
- ShaderModule,
8
- } from '@forgeax/engine-rhi';
9
- import { err, ok, RhiError as RhiErrorClass } from '@forgeax/engine-rhi';
10
- import * as rhiWebgpu from '@forgeax/engine-rhi-webgpu';
11
- import type { RendererOptions } from '../renderer';
12
-
13
- export interface RhiBackendInstrumentation {
14
- readonly resolveSurfaceDevice?: (device: RhiDevice) => Result<RhiDevice, RhiError>;
15
- readonly onFrameBoundary?: () => void;
16
- readonly onDeviceLost?: () => void;
17
- }
18
-
19
- export interface RhiBackendPack {
20
- readonly rhi: RhiInstance & {
21
- readonly acquireCanvasContext: (
22
- canvas: HTMLCanvasElement | OffscreenCanvas,
23
- ) => Result<RhiCanvasContext, RhiError>;
24
- };
25
- readonly createShaderModule?: (
26
- device: RhiDevice,
27
- desc: { code: string; label?: string | undefined },
28
- ) => Promise<Result<ShaderModule, RhiError>>;
29
- readonly translateErrorEventToRhiError?: (event: unknown) => {
30
- readonly ok: false;
31
- readonly error: RhiError;
32
- };
33
- /** @internal */
34
- readonly _internal_getRawDevice?: (device: RhiDevice) => unknown | undefined;
35
- readonly instrumentation?: RhiBackendInstrumentation;
36
- }
37
-
38
- function readOptionalExport(mod: Record<string, unknown>, key: string): unknown {
39
- try {
40
- return mod[key];
41
- } catch {
42
- return undefined;
43
- }
44
- }
45
-
46
- export function loadRhiPack(mod: Record<string, unknown>): RhiBackendPack {
47
- const createShaderModule = readOptionalExport(mod, 'createShaderModule');
48
- const translateErrorEventToRhiError = readOptionalExport(mod, 'translateErrorEventToRhiError');
49
- const rawDeviceExport = readOptionalExport(mod, '_internal_getRawDevice');
50
- const instrumentation = readOptionalExport(mod, 'instrumentation');
51
- return {
52
- rhi: mod.rhi as RhiBackendPack['rhi'],
53
- ...(createShaderModule !== undefined
54
- ? {
55
- createShaderModule: createShaderModule as NonNullable<
56
- RhiBackendPack['createShaderModule']
57
- >,
58
- }
59
- : {}),
60
- ...(translateErrorEventToRhiError !== undefined
61
- ? {
62
- translateErrorEventToRhiError: translateErrorEventToRhiError as NonNullable<
63
- RhiBackendPack['translateErrorEventToRhiError']
64
- >,
65
- }
66
- : {}),
67
- ...(rawDeviceExport !== undefined
68
- ? {
69
- _internal_getRawDevice: rawDeviceExport as NonNullable<
70
- RhiBackendPack['_internal_getRawDevice']
71
- >,
72
- }
73
- : {}),
74
- ...(instrumentation !== undefined
75
- ? { instrumentation: instrumentation as RhiBackendInstrumentation }
76
- : {}),
77
- };
78
- }
79
-
80
- function applyInstrumentation(
81
- pack: RhiBackendPack,
82
- instrumentation: RhiBackendInstrumentation | undefined,
83
- ): RhiBackendPack {
84
- return instrumentation === undefined ? pack : { ...pack, instrumentation };
85
- }
86
-
87
- export async function loadBackendPack(
88
- options: RendererOptions | undefined,
89
- ): Promise<Result<RhiBackendPack, RhiError>> {
90
- const explicit = options?.rhi;
91
- if (explicit !== undefined && explicit !== null) {
92
- const extras = explicit as unknown as Record<string, unknown>;
93
- return ok(
94
- applyInstrumentation(loadRhiPack({ rhi: explicit, ...extras }), options?.rhiInstrumentation),
95
- );
96
- }
97
- const nav =
98
- typeof globalThis === 'undefined'
99
- ? undefined
100
- : (globalThis as { navigator?: { gpu?: unknown } }).navigator;
101
- if (nav?.gpu !== undefined && nav.gpu !== null)
102
- return ok(
103
- applyInstrumentation(
104
- loadRhiPack(rhiWebgpu as unknown as Record<string, unknown>),
105
- options?.rhiInstrumentation,
106
- ),
107
- );
108
- try {
109
- const mod = (await import('@forgeax/engine-rhi-wgpu')) as Record<string, unknown>;
110
- await (mod.ensureReady as () => Promise<unknown>)();
111
- return ok(applyInstrumentation(loadRhiPack(mod), options?.rhiInstrumentation));
112
- } catch (cause) {
113
- return err(
114
- new RhiErrorClass({
115
- code: 'rhi-not-available',
116
- expected: 'a usable RHI backend is available',
117
- hint: `failed to load wgpu backend: ${String(cause)}`,
118
- }),
119
- );
120
- }
121
- }