@forgeax/engine-render 0.1.7 → 0.1.20

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 (777) hide show
  1. package/README.md +140 -2
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/assembly/backend-contract.d.ts +12 -0
  4. package/dist/assembly/backend-contract.d.ts.map +1 -1
  5. package/dist/assembly/factory.d.ts +26 -5
  6. package/dist/assembly/factory.d.ts.map +1 -1
  7. package/dist/assembly/host-contract.d.ts +4 -0
  8. package/dist/assembly/host-contract.d.ts.map +1 -1
  9. package/dist/assembly/renderer-frame-transaction.d.ts +39 -0
  10. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -0
  11. package/dist/assembly/renderer-inspection.d.ts +22 -0
  12. package/dist/assembly/renderer-inspection.d.ts.map +1 -0
  13. package/dist/assembly/renderer-lifecycle.d.ts +4 -0
  14. package/dist/assembly/renderer-lifecycle.d.ts.map +1 -0
  15. package/dist/authoring.mjs +4 -2
  16. package/dist/authoring.mjs.map +1 -1
  17. package/dist/chunk-4XINDLAY.mjs +9404 -0
  18. package/dist/chunk-4XINDLAY.mjs.map +1 -0
  19. package/dist/chunk-CDTWTHZR.mjs +752 -0
  20. package/dist/chunk-CDTWTHZR.mjs.map +1 -0
  21. package/dist/chunk-FJ6P52EE.mjs +46 -0
  22. package/dist/chunk-FJ6P52EE.mjs.map +1 -0
  23. package/dist/chunk-JDWARUOI.mjs +44 -0
  24. package/dist/chunk-JDWARUOI.mjs.map +1 -0
  25. package/dist/chunk-M2MP4ZOU.mjs +73 -0
  26. package/dist/chunk-M2MP4ZOU.mjs.map +1 -0
  27. package/dist/chunk-PCHBPYML.mjs +385 -0
  28. package/dist/chunk-PCHBPYML.mjs.map +1 -0
  29. package/dist/chunk-RXZ3RGOU.mjs +53 -0
  30. package/dist/chunk-RXZ3RGOU.mjs.map +1 -0
  31. package/dist/{chunk-YEJIUW7D.mjs → chunk-TBQJOK2L.mjs} +356 -543
  32. package/dist/chunk-TBQJOK2L.mjs.map +1 -0
  33. package/dist/{chunk-CQXZC5XI.mjs → chunk-VFPLTKCU.mjs} +79 -69
  34. package/dist/chunk-VFPLTKCU.mjs.map +1 -0
  35. package/dist/components/atmosphere.d.ts +9 -0
  36. package/dist/components/atmosphere.d.ts.map +1 -0
  37. package/dist/components/camera.d.ts +2 -1
  38. package/dist/components/camera.d.ts.map +1 -1
  39. package/dist/components/fog.d.ts +8 -0
  40. package/dist/components/fog.d.ts.map +1 -0
  41. package/dist/components/index.d.ts +3 -0
  42. package/dist/components/index.d.ts.map +1 -1
  43. package/dist/components/light-helpers.d.ts.map +1 -1
  44. package/dist/components/motion-blur.d.ts +7 -0
  45. package/dist/components/motion-blur.d.ts.map +1 -0
  46. package/dist/components/spot-light.d.ts +12 -0
  47. package/dist/components/spot-light.d.ts.map +1 -1
  48. package/dist/construct-renderer.d.ts +2 -2
  49. package/dist/construct-renderer.d.ts.map +1 -1
  50. package/dist/construct-renderer.mjs +11146 -14507
  51. package/dist/construct-renderer.mjs.map +1 -1
  52. package/dist/device/device-scope.d.ts +4 -0
  53. package/dist/device/device-scope.d.ts.map +1 -1
  54. package/dist/device/gpu-residency.d.ts +19 -2
  55. package/dist/device/gpu-residency.d.ts.map +1 -1
  56. package/dist/environment/frame.d.ts +60 -0
  57. package/dist/environment/frame.d.ts.map +1 -0
  58. package/dist/environment/generation.d.ts +21 -0
  59. package/dist/environment/generation.d.ts.map +1 -0
  60. package/dist/environment/graph.d.ts +4 -0
  61. package/dist/environment/graph.d.ts.map +1 -0
  62. package/dist/environment/inspection.d.ts +48 -0
  63. package/dist/environment/inspection.d.ts.map +1 -0
  64. package/dist/environment/lifecycle.d.ts +39 -0
  65. package/dist/environment/lifecycle.d.ts.map +1 -0
  66. package/dist/environment/signature.d.ts +25 -0
  67. package/dist/environment/signature.d.ts.map +1 -0
  68. package/dist/errors/render.d.ts +204 -1
  69. package/dist/errors/render.d.ts.map +1 -1
  70. package/dist/extract/camera.d.ts +5 -0
  71. package/dist/extract/camera.d.ts.map +1 -0
  72. package/dist/extract/environment.d.ts +74 -0
  73. package/dist/extract/environment.d.ts.map +1 -0
  74. package/dist/extract/visibility.d.ts +1 -1
  75. package/dist/extract/visibility.d.ts.map +1 -1
  76. package/dist/features/host.d.ts +9 -2
  77. package/dist/features/host.d.ts.map +1 -1
  78. package/dist/features/motion-blur/motion-blur-feature.d.ts +16 -0
  79. package/dist/features/motion-blur/motion-blur-feature.d.ts.map +1 -0
  80. package/dist/features/motion-blur/motion-blur-params.d.ts +25 -0
  81. package/dist/features/motion-blur/motion-blur-params.d.ts.map +1 -0
  82. package/dist/features/plan.d.ts +17 -2
  83. package/dist/features/plan.d.ts.map +1 -1
  84. package/dist/features/prepared-gpu-work.d.ts +3 -1
  85. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  86. package/dist/features/prepared-graphics.d.ts +2 -1
  87. package/dist/features/prepared-graphics.d.ts.map +1 -1
  88. package/dist/features/render-graph-raster.d.ts +2 -1
  89. package/dist/features/render-graph-raster.d.ts.map +1 -1
  90. package/dist/features/targets.d.ts +3 -0
  91. package/dist/features/targets.d.ts.map +1 -1
  92. package/dist/features/types.d.ts +12 -0
  93. package/dist/features/types.d.ts.map +1 -1
  94. package/dist/fullscreen-post-process-pass.d.ts +7 -1
  95. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  96. package/dist/gpu-scene.d.ts +2 -0
  97. package/dist/gpu-scene.d.ts.map +1 -1
  98. package/dist/gpu-usage.d.ts +2 -0
  99. package/dist/gpu-usage.d.ts.map +1 -1
  100. package/dist/ibl/skylight-bind-group.d.ts +5 -6
  101. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  102. package/dist/index.d.ts +24 -7
  103. package/dist/index.d.ts.map +1 -1
  104. package/dist/index.mjs +6 -4
  105. package/dist/index.mjs.map +1 -1
  106. package/dist/inspection-types.d.ts +43 -1
  107. package/dist/inspection-types.d.ts.map +1 -1
  108. package/dist/internal.d.ts +2 -0
  109. package/dist/internal.d.ts.map +1 -1
  110. package/dist/internal.mjs +2 -0
  111. package/dist/light-buffer-layout.d.ts +20 -12
  112. package/dist/light-buffer-layout.d.ts.map +1 -1
  113. package/dist/materials.d.ts +22 -0
  114. package/dist/materials.d.ts.map +1 -1
  115. package/dist/pbr-pipeline.d.ts +16 -9
  116. package/dist/pbr-pipeline.d.ts.map +1 -1
  117. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  118. package/dist/pipeline/standard-pipeline.d.ts +3 -0
  119. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  120. package/dist/pipeline/standard-post.d.ts +48 -0
  121. package/dist/pipeline/standard-post.d.ts.map +1 -0
  122. package/dist/pipeline/standard-profile.d.ts +12 -2
  123. package/dist/pipeline/standard-profile.d.ts.map +1 -1
  124. package/dist/pipeline-builder.d.ts +18 -0
  125. package/dist/pipeline-builder.d.ts.map +1 -1
  126. package/dist/pipeline-spec.d.ts.map +1 -1
  127. package/dist/plugin.d.ts.map +1 -1
  128. package/dist/record/frame-lighting.d.ts +2 -0
  129. package/dist/record/frame-lighting.d.ts.map +1 -1
  130. package/dist/record/frame-snapshot.d.ts +137 -6
  131. package/dist/record/frame-snapshot.d.ts.map +1 -1
  132. package/dist/record/frame-targets.d.ts.map +1 -1
  133. package/dist/record/frame.d.ts +6 -3
  134. package/dist/record/frame.d.ts.map +1 -1
  135. package/dist/record/gpu-timing.d.ts +32 -0
  136. package/dist/record/gpu-timing.d.ts.map +1 -0
  137. package/dist/record/main-pass-geometry.d.ts +11 -0
  138. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  139. package/dist/record/main-pass-material.d.ts +9 -6
  140. package/dist/record/main-pass-material.d.ts.map +1 -1
  141. package/dist/record/main-pass-sprite-draws.d.ts +8 -1
  142. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  143. package/dist/record/main-pass.d.ts +2 -0
  144. package/dist/record/main-pass.d.ts.map +1 -1
  145. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  146. package/dist/record/render-context.d.ts +81 -19
  147. package/dist/record/render-context.d.ts.map +1 -1
  148. package/dist/record/shadow-pass.d.ts.map +1 -1
  149. package/dist/record/skybox-post-pass.d.ts +1 -11
  150. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  151. package/dist/record/typed-frame-graph.d.ts +36 -4
  152. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  153. package/dist/record/view-ubo.d.ts +4 -1
  154. package/dist/record/view-ubo.d.ts.map +1 -1
  155. package/dist/render-contract.d.ts +157 -8
  156. package/dist/render-contract.d.ts.map +1 -1
  157. package/dist/render-data.d.ts +10 -6
  158. package/dist/render-data.d.ts.map +1 -1
  159. package/dist/render-graph-primitives.d.ts.map +1 -1
  160. package/dist/render-pipeline.d.ts +86 -6
  161. package/dist/render-pipeline.d.ts.map +1 -1
  162. package/dist/render-system-extract.d.ts +84 -8
  163. package/dist/render-system-extract.d.ts.map +1 -1
  164. package/dist/render-system.d.ts +30 -5
  165. package/dist/render-system.d.ts.map +1 -1
  166. package/dist/renderer-inspect.d.ts +29 -0
  167. package/dist/renderer-inspect.d.ts.map +1 -0
  168. package/dist/scene/render-scene.d.ts +36 -2
  169. package/dist/scene/render-scene.d.ts.map +1 -1
  170. package/dist/temporal/coverage.d.ts +42 -0
  171. package/dist/temporal/coverage.d.ts.map +1 -0
  172. package/dist/temporal/frame-coordinator.d.ts +99 -0
  173. package/dist/temporal/frame-coordinator.d.ts.map +1 -0
  174. package/dist/temporal/frame.d.ts +44 -0
  175. package/dist/temporal/frame.d.ts.map +1 -0
  176. package/dist/temporal/gpu.d.ts +39 -0
  177. package/dist/temporal/gpu.d.ts.map +1 -0
  178. package/dist/temporal/history.d.ts +37 -0
  179. package/dist/temporal/history.d.ts.map +1 -0
  180. package/dist/temporal/index.d.ts +7 -0
  181. package/dist/temporal/index.d.ts.map +1 -0
  182. package/dist/temporal/index.mjs +8 -0
  183. package/dist/temporal/index.mjs.map +1 -0
  184. package/dist/temporal/inspection.d.ts +36 -0
  185. package/dist/temporal/inspection.d.ts.map +1 -0
  186. package/dist/temporal/scene-data-catalog.d.ts +48 -0
  187. package/dist/temporal/scene-data-catalog.d.ts.map +1 -0
  188. package/dist/temporal/scene-data.d.ts +43 -0
  189. package/dist/temporal/scene-data.d.ts.map +1 -0
  190. package/dist/temporal/standard-scene-data.d.ts +61 -0
  191. package/dist/temporal/standard-scene-data.d.ts.map +1 -0
  192. package/dist/temporal/taa-history-resources.d.ts +22 -0
  193. package/dist/temporal/taa-history-resources.d.ts.map +1 -0
  194. package/dist/temporal/taa-history-store.d.ts +27 -0
  195. package/dist/temporal/taa-history-store.d.ts.map +1 -0
  196. package/dist/temporal/taa-resolve.d.ts +15 -0
  197. package/dist/temporal/taa-resolve.d.ts.map +1 -0
  198. package/dist/temporal/temporal-view.d.ts +40 -0
  199. package/dist/temporal/temporal-view.d.ts.map +1 -0
  200. package/dist/temporal/transaction.d.ts +9 -0
  201. package/dist/temporal/transaction.d.ts.map +1 -0
  202. package/dist/temporal/view.d.ts +56 -0
  203. package/dist/temporal/view.d.ts.map +1 -0
  204. package/dist/transmission/backdrop.d.ts +147 -0
  205. package/dist/transmission/backdrop.d.ts.map +1 -0
  206. package/dist/transmission/inspection.d.ts +57 -0
  207. package/dist/transmission/inspection.d.ts.map +1 -0
  208. package/dist/transmission/oracle.d.ts +42 -0
  209. package/dist/transmission/oracle.d.ts.map +1 -0
  210. package/dist/transmission/projection.d.ts +37 -0
  211. package/dist/transmission/projection.d.ts.map +1 -0
  212. package/dist/typed-render-graph-primitives.d.ts +30 -2
  213. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  214. package/dist/typed-shadow-atlas.d.ts +10 -0
  215. package/dist/typed-shadow-atlas.d.ts.map +1 -0
  216. package/dist/typed-shadow-passes.d.ts.map +1 -1
  217. package/dist/volume/capability.d.ts +57 -0
  218. package/dist/volume/capability.d.ts.map +1 -0
  219. package/dist/volume/component.d.ts +61 -0
  220. package/dist/volume/component.d.ts.map +1 -0
  221. package/dist/volume/extract.d.ts +11 -0
  222. package/dist/volume/extract.d.ts.map +1 -0
  223. package/dist/volume/inspection.d.ts +38 -0
  224. package/dist/volume/inspection.d.ts.map +1 -0
  225. package/dist/volume/passes.d.ts +38 -0
  226. package/dist/volume/passes.d.ts.map +1 -0
  227. package/dist/volume/recovery.d.ts +38 -0
  228. package/dist/volume/recovery.d.ts.map +1 -0
  229. package/dist/volume/resources.d.ts +57 -0
  230. package/dist/volume/resources.d.ts.map +1 -0
  231. package/dist/volume/temporal.d.ts +35 -0
  232. package/dist/volume/temporal.d.ts.map +1 -0
  233. package/package.json +24 -19
  234. package/src/__tests__/ai-user-cold-start.integration.test.ts +59 -0
  235. package/src/__tests__/ai-user-public-surface.test-d.ts +45 -0
  236. package/src/__tests__/bloom-exact-zero.unit.test.ts +202 -0
  237. package/src/__tests__/bloom-lifecycle.integration.test.ts +125 -0
  238. package/src/__tests__/construct-renderer-identity.unit.test.ts +4 -3
  239. package/src/__tests__/detached-inspection.integration.test.ts +177 -0
  240. package/src/__tests__/environment-fog-lanes.integration.test.ts +219 -0
  241. package/src/__tests__/environment-generation.integration.test.ts +141 -0
  242. package/src/__tests__/environment-selection.unit.test.ts +245 -0
  243. package/src/__tests__/factory-contract.integration.test.ts +1380 -9
  244. package/src/__tests__/frame-plan-contract.unit.test.ts +90 -0
  245. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +7 -0
  246. package/src/__tests__/gpu-driven-production.integration.test.ts +74 -22
  247. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +37 -0
  248. package/src/__tests__/gpu-scene.unit.test.ts +10 -0
  249. package/src/__tests__/injection-kind-owner.test-d.ts +2 -1
  250. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +14 -14
  251. package/src/__tests__/material-contract-inventory.unit.test.ts +62 -0
  252. package/src/__tests__/material-cooked-projection.unit.test.ts +18 -146
  253. package/src/__tests__/materials-transmission-validation.unit.test.ts +36 -0
  254. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +1 -1
  255. package/src/__tests__/morph-feature-plan.unit.test.ts +7 -0
  256. package/src/__tests__/motion-blur.pixel.integration.test.ts +121 -0
  257. package/src/__tests__/public-surface.test-d.ts +15 -1
  258. package/src/__tests__/render-error-code-owner.test-d.ts +14 -0
  259. package/src/__tests__/render-error-detail-ssot.test-d.ts +11 -2
  260. package/src/__tests__/render-error-exhaustive.test-d.ts +3 -0
  261. package/src/__tests__/render-feature-errors.unit.test.ts +33 -3
  262. package/src/__tests__/render-feature-gpu-work.integration.test.ts +44 -0
  263. package/src/__tests__/render-feature-plan.test-d.ts +22 -89
  264. package/src/__tests__/render-scene-projection.unit.test.ts +28 -0
  265. package/src/__tests__/render-temporal-environment-consumer.browser.test.ts +26 -0
  266. package/src/__tests__/render-temporal-environment-consumer.dawn.test.ts +21 -0
  267. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +423 -1
  268. package/src/__tests__/renderer-frame-transaction.integration.test.ts +405 -0
  269. package/src/__tests__/renderer-lifecycle.integration.test.ts +22 -0
  270. package/src/__tests__/scene-data-catalog.unit.test.ts +59 -0
  271. package/src/__tests__/scene-data-consumer.integration.test.ts +67 -0
  272. package/src/__tests__/scene-data-contract.test-d.ts +35 -0
  273. package/src/__tests__/scene-data-inspection.unit.test.ts +41 -0
  274. package/src/__tests__/scene-data-public-surface.test-d.ts +34 -0
  275. package/src/__tests__/shader-manifest-fixture.ts +111 -0
  276. package/src/__tests__/skinned-shadow-caster.test.ts +123 -0
  277. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +24 -3
  278. package/src/__tests__/standard-pipeline.dawn.test.ts +15 -0
  279. package/src/__tests__/standard-pipeline.integration.test.ts +543 -1
  280. package/src/__tests__/standard-profile-oracle.unit.test.ts +12 -2
  281. package/src/__tests__/standard-temporal-producer.integration.test.ts +35 -0
  282. package/src/__tests__/surface-configuration.unit.test.ts +211 -12
  283. package/src/__tests__/taa-transaction.integration.test.ts +30 -0
  284. package/src/__tests__/temporal-admission.integration.test.ts +40 -0
  285. package/src/__tests__/temporal-coverage.unit.test.ts +35 -0
  286. package/src/__tests__/temporal-demand.unit.test.ts +44 -0
  287. package/src/__tests__/temporal-frame-coordinator.unit.test.ts +64 -0
  288. package/src/__tests__/temporal-graph-topology.unit.test.ts +51 -0
  289. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +170 -0
  290. package/src/__tests__/temporal-performance.integration.test.ts +615 -0
  291. package/src/__tests__/temporal-reset-matrix.unit.test.ts +97 -0
  292. package/src/__tests__/temporal-transaction.integration.test.ts +60 -0
  293. package/src/__tests__/temporal-view.unit.test.ts +152 -0
  294. package/src/__tests__/transmission-prewarm.unit.test.ts +93 -0
  295. package/src/__tests__/typed-pipeline-topology.unit.test.ts +230 -1
  296. package/src/__tests__/urp-pipeline-targets.unit.test.ts +25 -1
  297. package/src/__tests__/urp-pipeline.unit.test.ts +4 -3
  298. package/src/__tests__/visibility-extract.integration.test.ts +27 -1
  299. package/src/__tests__/visibility-producer-matrix.integration.test.ts +10 -0
  300. package/src/__tests__/volume-optics-oracle.unit.test.ts +85 -0
  301. package/src/__tests__/volumetric-fog-budget-recovery.integration.test.ts +655 -0
  302. package/src/__tests__/volumetric-fog-component.unit.test.ts +71 -0
  303. package/src/__tests__/volumetric-fog-composite-stage-readback.dawn.test.ts +376 -0
  304. package/src/__tests__/volumetric-fog-errors.unit.test.ts +51 -0
  305. package/src/__tests__/volumetric-fog-inspection.unit.test.ts +77 -0
  306. package/src/__tests__/volumetric-fog-light-capability.unit.test.ts +19 -0
  307. package/src/__tests__/volumetric-fog-light-consumers.integration.test.ts +18 -0
  308. package/src/__tests__/volumetric-fog-light-errors.unit.test.ts +17 -0
  309. package/src/__tests__/volumetric-fog-light-topology.unit.test.ts +21 -0
  310. package/src/__tests__/volumetric-fog-light-transaction.integration.test.ts +53 -0
  311. package/src/__tests__/volumetric-fog-m9-watcher.integration.test.ts +27 -0
  312. package/src/__tests__/volumetric-fog-point-light-owner.integration.test.ts +44 -0
  313. package/src/__tests__/volumetric-fog-point-spot-accumulation.integration.test.ts +49 -0
  314. package/src/__tests__/volumetric-fog-point-spot-contract.unit.test.ts +28 -0
  315. package/src/__tests__/volumetric-fog-point-spot-lkg.integration.test.ts +65 -0
  316. package/src/__tests__/volumetric-fog-point-spot-selection.integration.test.ts +49 -0
  317. package/src/__tests__/volumetric-fog-point-spot-temporal.unit.test.ts +55 -0
  318. package/src/__tests__/volumetric-fog-projector-contract.unit.test.ts +22 -0
  319. package/src/__tests__/volumetric-fog-projector-inspection.unit.test.ts +12 -0
  320. package/src/__tests__/volumetric-fog-projector-surface-volume.integration.test.ts +11 -0
  321. package/src/__tests__/volumetric-fog-projector-transaction.integration.test.ts +26 -0
  322. package/src/__tests__/volumetric-fog-recovery.integration.test.ts +47 -0
  323. package/src/__tests__/volumetric-fog-selected-light-resolution.integration.test.ts +63 -0
  324. package/src/__tests__/volumetric-fog-spot-closure.integration.test.ts +26 -0
  325. package/src/__tests__/volumetric-fog-spot-contract.test-d.ts +21 -0
  326. package/src/__tests__/volumetric-fog-spot-contract.unit.test.ts +27 -0
  327. package/src/__tests__/volumetric-fog-spot-frame-optics.integration.test.ts +14 -0
  328. package/src/__tests__/volumetric-fog-spot-optics.integration.test.ts +29 -0
  329. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +550 -0
  330. package/src/__tests__/volumetric-fog-temporal-selected-light.unit.test.ts +33 -0
  331. package/src/__tests__/volumetric-fog-temporal.unit.test.ts +45 -0
  332. package/src/__tests__/volumetric-fog-topology.unit.test.ts +237 -0
  333. package/src/__tests__/volumetric-fog-transparent.integration.test.ts +27 -0
  334. package/src/assembly/backend-contract.ts +47 -1
  335. package/src/assembly/factory.ts +1480 -505
  336. package/src/assembly/host-contract.ts +4 -0
  337. package/src/assembly/renderer-frame-transaction.ts +75 -0
  338. package/src/assembly/renderer-inspection.ts +112 -0
  339. package/src/assembly/renderer-lifecycle.ts +6 -0
  340. package/src/components/__tests__/motion-blur.unit.test.ts +14 -0
  341. package/src/components/__tests__/schema-contract.unit.test.ts +6 -1
  342. package/src/components/atmosphere.ts +10 -0
  343. package/src/components/camera.ts +2 -1
  344. package/src/components/fog.ts +9 -0
  345. package/src/components/index.ts +3 -0
  346. package/src/components/light-helpers.ts +4 -0
  347. package/src/components/motion-blur.ts +8 -0
  348. package/src/components/spot-light.ts +22 -3
  349. package/src/construct-renderer.ts +40 -3
  350. package/src/device/device-scope.ts +15 -1
  351. package/src/device/gpu-residency.ts +168 -58
  352. package/src/environment/frame.ts +185 -0
  353. package/src/environment/generation.ts +23 -0
  354. package/src/environment/graph.ts +9 -0
  355. package/src/environment/inspection.ts +87 -0
  356. package/src/environment/lifecycle.ts +250 -0
  357. package/src/environment/signature.ts +55 -0
  358. package/src/errors/render.ts +404 -1
  359. package/src/extract/camera.ts +78 -0
  360. package/src/extract/environment.ts +171 -0
  361. package/src/extract/visibility.ts +38 -19
  362. package/src/features/host.ts +36 -5
  363. package/src/features/motion-blur/__tests__/motion-blur-feature.unit.test.ts +67 -0
  364. package/src/features/motion-blur/__tests__/motion-blur-params.unit.test.ts +53 -0
  365. package/src/features/motion-blur/motion-blur-feature.ts +119 -0
  366. package/src/features/motion-blur/motion-blur-params.ts +89 -0
  367. package/src/features/plan.ts +32 -3
  368. package/src/features/prepared-gpu-work.ts +21 -6
  369. package/src/features/prepared-graphics.ts +2 -1
  370. package/src/features/render-graph-raster.ts +2 -1
  371. package/src/features/targets.ts +24 -2
  372. package/src/features/types.ts +13 -0
  373. package/src/fullscreen-post-process-pass.ts +34 -4
  374. package/src/gpu-scene.ts +24 -0
  375. package/src/gpu-usage.ts +2 -0
  376. package/src/ibl/skylight-bind-group.ts +30 -38
  377. package/src/index.ts +104 -7
  378. package/src/inspection-types.ts +48 -0
  379. package/src/internal.ts +5 -0
  380. package/src/light-buffer-layout.ts +59 -26
  381. package/src/materials.ts +119 -24
  382. package/src/pbr-pipeline.ts +91 -29
  383. package/src/pipeline/standard-forward-lane.ts +178 -101
  384. package/src/pipeline/standard-pipeline.ts +176 -105
  385. package/src/pipeline/standard-post.ts +373 -0
  386. package/src/pipeline/standard-profile.ts +26 -3
  387. package/src/pipeline-builder.ts +102 -12
  388. package/src/pipeline-spec.ts +9 -0
  389. package/src/plugin.ts +2 -0
  390. package/src/record/__tests__/fullscreen-temporal-routing.unit.test.ts +25 -0
  391. package/src/record/__tests__/main-pass-geometry.unit.test.ts +47 -0
  392. package/src/record/__tests__/material-bg-cache.unit.test.ts +12 -1
  393. package/src/record/__tests__/material-pipeline-pending-cache.unit.test.ts +22 -0
  394. package/src/record/__tests__/sprite-material-abi.unit.test.ts +75 -0
  395. package/src/record/__tests__/standard-pbr-ubo-layout.unit.test.ts +67 -0
  396. package/src/record/__tests__/temporal-payload.unit.test.ts +164 -0
  397. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +127 -0
  398. package/src/record/frame-lighting.ts +103 -89
  399. package/src/record/frame-snapshot.ts +170 -6
  400. package/src/record/frame-targets.ts +21 -8
  401. package/src/record/frame.ts +1014 -7
  402. package/src/record/gpu-timing.ts +224 -0
  403. package/src/record/main-pass-geometry.ts +86 -40
  404. package/src/record/main-pass-material.ts +120 -68
  405. package/src/record/main-pass-sprite-draws.ts +78 -101
  406. package/src/record/main-pass.ts +77 -4
  407. package/src/record/mesh-ssbo.ts +22 -3
  408. package/src/record/render-context.ts +194 -23
  409. package/src/record/shadow-pass.ts +197 -58
  410. package/src/record/skybox-post-pass.ts +97 -41
  411. package/src/record/typed-frame-graph.ts +704 -30
  412. package/src/record/view-ubo.ts +52 -4
  413. package/src/render-contract.ts +181 -6
  414. package/src/render-data.ts +50 -22
  415. package/src/render-graph-primitives.ts +18 -1
  416. package/src/render-pipeline.ts +144 -27
  417. package/src/render-system-extract.ts +522 -72
  418. package/src/render-system.ts +561 -41
  419. package/src/renderer-inspect.ts +66 -0
  420. package/src/scene/render-scene.ts +252 -7
  421. package/src/temporal/__tests__/taa-history-resources.unit.test.ts +45 -0
  422. package/src/temporal/coverage.ts +76 -0
  423. package/src/temporal/frame-coordinator.ts +311 -0
  424. package/src/temporal/frame.ts +128 -0
  425. package/src/temporal/gpu.ts +287 -0
  426. package/src/temporal/history.ts +92 -0
  427. package/src/temporal/index.ts +6 -0
  428. package/src/temporal/inspection.ts +97 -0
  429. package/src/temporal/scene-data-catalog.ts +200 -0
  430. package/src/temporal/scene-data.ts +149 -0
  431. package/src/temporal/standard-scene-data.ts +182 -0
  432. package/src/temporal/taa-history-resources.ts +128 -0
  433. package/src/temporal/taa-history-store.ts +79 -0
  434. package/src/temporal/taa-resolve.ts +34 -0
  435. package/src/temporal/temporal-view.ts +169 -0
  436. package/src/temporal/transaction.ts +17 -0
  437. package/src/temporal/view.ts +161 -0
  438. package/src/transmission/__tests__/capability.unit.test.ts +83 -0
  439. package/src/transmission/__tests__/composition.integration.test.ts +161 -0
  440. package/src/transmission/__tests__/inspection.unit.test.ts +241 -0
  441. package/src/transmission/__tests__/lifecycle.integration.test.ts +96 -0
  442. package/src/transmission/__tests__/oracle.unit.test.ts +131 -0
  443. package/src/transmission/__tests__/projection.unit.test.ts +71 -0
  444. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +437 -0
  445. package/src/transmission/__tests__/transmission-backdrop-topology.unit.test.ts +109 -0
  446. package/src/transmission/__tests__/transmission-backdrop.dawn.test.ts +105 -0
  447. package/src/transmission/backdrop.ts +572 -0
  448. package/src/transmission/inspection.ts +190 -0
  449. package/src/transmission/oracle.ts +141 -0
  450. package/src/transmission/projection.ts +83 -0
  451. package/src/typed-render-graph-primitives.ts +194 -11
  452. package/src/typed-shadow-atlas.ts +17 -0
  453. package/src/typed-shadow-passes.ts +6 -5
  454. package/src/volume/capability.ts +173 -0
  455. package/src/volume/component.ts +110 -0
  456. package/src/volume/extract.ts +21 -0
  457. package/src/volume/inspection.ts +78 -0
  458. package/src/volume/passes.ts +680 -0
  459. package/src/volume/recovery.ts +86 -0
  460. package/src/volume/resources.ts +236 -0
  461. package/src/volume/temporal.ts +89 -0
  462. package/dist/__tests__/authoring-path.unit.test.d.ts +0 -2
  463. package/dist/__tests__/authoring-path.unit.test.d.ts.map +0 -1
  464. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts +0 -2
  465. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts.map +0 -1
  466. package/dist/__tests__/callback-inference.test-d.d.ts +0 -2
  467. package/dist/__tests__/callback-inference.test-d.d.ts.map +0 -1
  468. package/dist/__tests__/cluster-binner.test.d.ts +0 -2
  469. package/dist/__tests__/cluster-binner.test.d.ts.map +0 -1
  470. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts +0 -2
  471. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts.map +0 -1
  472. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts +0 -2
  473. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts.map +0 -1
  474. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts +0 -2
  475. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts.map +0 -1
  476. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts +0 -2
  477. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts.map +0 -1
  478. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts +0 -2
  479. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts.map +0 -1
  480. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts +0 -2
  481. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts.map +0 -1
  482. package/dist/__tests__/factory-contract.integration.test.d.ts +0 -2
  483. package/dist/__tests__/factory-contract.integration.test.d.ts.map +0 -1
  484. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts +0 -2
  485. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts.map +0 -1
  486. package/dist/__tests__/frame-observation.contract.test.d.ts +0 -2
  487. package/dist/__tests__/frame-observation.contract.test.d.ts.map +0 -1
  488. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts +0 -2
  489. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts.map +0 -1
  490. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts +0 -2
  491. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts.map +0 -1
  492. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts +0 -6
  493. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +0 -1
  494. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts +0 -2
  495. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts.map +0 -1
  496. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts +0 -2
  497. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts.map +0 -1
  498. package/dist/__tests__/gpu-driven-production.integration.test.d.ts +0 -2
  499. package/dist/__tests__/gpu-driven-production.integration.test.d.ts.map +0 -1
  500. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts +0 -2
  501. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts.map +0 -1
  502. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +0 -18
  503. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +0 -1
  504. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts +0 -2
  505. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts.map +0 -1
  506. package/dist/__tests__/gpu-driven-view-reference.d.ts +0 -15
  507. package/dist/__tests__/gpu-driven-view-reference.d.ts.map +0 -1
  508. package/dist/__tests__/gpu-driven-view.browser.test.d.ts +0 -2
  509. package/dist/__tests__/gpu-driven-view.browser.test.d.ts.map +0 -1
  510. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts +0 -2
  511. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts.map +0 -1
  512. package/dist/__tests__/gpu-driven-view.unit.test.d.ts +0 -2
  513. package/dist/__tests__/gpu-driven-view.unit.test.d.ts.map +0 -1
  514. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts +0 -2
  515. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts.map +0 -1
  516. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts +0 -7
  517. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +0 -1
  518. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts +0 -2
  519. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts.map +0 -1
  520. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts +0 -2
  521. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts.map +0 -1
  522. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts +0 -2
  523. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts.map +0 -1
  524. package/dist/__tests__/gpu-scene.dawn.test.d.ts +0 -2
  525. package/dist/__tests__/gpu-scene.dawn.test.d.ts.map +0 -1
  526. package/dist/__tests__/gpu-scene.unit.test.d.ts +0 -2
  527. package/dist/__tests__/gpu-scene.unit.test.d.ts.map +0 -1
  528. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts +0 -2
  529. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts.map +0 -1
  530. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts +0 -2
  531. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts.map +0 -1
  532. package/dist/__tests__/injection-kind-owner.test-d.d.ts +0 -2
  533. package/dist/__tests__/injection-kind-owner.test-d.d.ts.map +0 -1
  534. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts +0 -2
  535. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts.map +0 -1
  536. package/dist/__tests__/light-buffer-layout.unit.test.d.ts +0 -2
  537. package/dist/__tests__/light-buffer-layout.unit.test.d.ts.map +0 -1
  538. package/dist/__tests__/material-contract-inventory.unit.test.d.ts +0 -2
  539. package/dist/__tests__/material-contract-inventory.unit.test.d.ts.map +0 -1
  540. package/dist/__tests__/material-cooked-projection.unit.test.d.ts +0 -2
  541. package/dist/__tests__/material-cooked-projection.unit.test.d.ts.map +0 -1
  542. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts +0 -2
  543. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts.map +0 -1
  544. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts +0 -2
  545. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts.map +0 -1
  546. package/dist/__tests__/material-stride-surface.unit.test.d.ts +0 -2
  547. package/dist/__tests__/material-stride-surface.unit.test.d.ts.map +0 -1
  548. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts +0 -2
  549. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts.map +0 -1
  550. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts +0 -2
  551. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts.map +0 -1
  552. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts +0 -2
  553. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts.map +0 -1
  554. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts +0 -2
  555. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts.map +0 -1
  556. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts +0 -2
  557. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts.map +0 -1
  558. package/dist/__tests__/morph-feature-plan.unit.test.d.ts +0 -2
  559. package/dist/__tests__/morph-feature-plan.unit.test.d.ts.map +0 -1
  560. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts +0 -2
  561. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts.map +0 -1
  562. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts +0 -2
  563. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts.map +0 -1
  564. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts +0 -2
  565. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts.map +0 -1
  566. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts +0 -2
  567. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts.map +0 -1
  568. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts +0 -2
  569. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts.map +0 -1
  570. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts +0 -2
  571. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts.map +0 -1
  572. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts +0 -2
  573. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts.map +0 -1
  574. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts +0 -2
  575. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts.map +0 -1
  576. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts +0 -2
  577. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts.map +0 -1
  578. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts +0 -2
  579. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts.map +0 -1
  580. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts +0 -2
  581. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts.map +0 -1
  582. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts +0 -2
  583. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts.map +0 -1
  584. package/dist/__tests__/profiler-default-off.test.d.ts +0 -2
  585. package/dist/__tests__/profiler-default-off.test.d.ts.map +0 -1
  586. package/dist/__tests__/profiler-phase-catalog.test.d.ts +0 -2
  587. package/dist/__tests__/profiler-phase-catalog.test.d.ts.map +0 -1
  588. package/dist/__tests__/profiler-phase-integration.test.d.ts +0 -2
  589. package/dist/__tests__/profiler-phase-integration.test.d.ts.map +0 -1
  590. package/dist/__tests__/profiler-phase-token.test.d.ts +0 -2
  591. package/dist/__tests__/profiler-phase-token.test.d.ts.map +0 -1
  592. package/dist/__tests__/public-surface.test-d.d.ts +0 -2
  593. package/dist/__tests__/public-surface.test-d.d.ts.map +0 -1
  594. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts +0 -2
  595. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts.map +0 -1
  596. package/dist/__tests__/render-error-code-owner.test-d.d.ts +0 -2
  597. package/dist/__tests__/render-error-code-owner.test-d.d.ts.map +0 -1
  598. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts +0 -2
  599. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts.map +0 -1
  600. package/dist/__tests__/render-error-exhaustive.test-d.d.ts +0 -2
  601. package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +0 -1
  602. package/dist/__tests__/render-feature-assembly.test-d.d.ts +0 -2
  603. package/dist/__tests__/render-feature-assembly.test-d.d.ts.map +0 -1
  604. package/dist/__tests__/render-feature-context.test-d.d.ts +0 -2
  605. package/dist/__tests__/render-feature-context.test-d.d.ts.map +0 -1
  606. package/dist/__tests__/render-feature-contract.test-d.d.ts +0 -2
  607. package/dist/__tests__/render-feature-contract.test-d.d.ts.map +0 -1
  608. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts +0 -2
  609. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts.map +0 -1
  610. package/dist/__tests__/render-feature-docs.unit.test.d.ts +0 -2
  611. package/dist/__tests__/render-feature-docs.unit.test.d.ts.map +0 -1
  612. package/dist/__tests__/render-feature-errors.unit.test.d.ts +0 -2
  613. package/dist/__tests__/render-feature-errors.unit.test.d.ts.map +0 -1
  614. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts +0 -2
  615. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts.map +0 -1
  616. package/dist/__tests__/render-feature-plan.test-d.d.ts +0 -2
  617. package/dist/__tests__/render-feature-plan.test-d.d.ts.map +0 -1
  618. package/dist/__tests__/render-feature-plan.unit.test.d.ts +0 -2
  619. package/dist/__tests__/render-feature-plan.unit.test.d.ts.map +0 -1
  620. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts +0 -2
  621. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts.map +0 -1
  622. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts +0 -2
  623. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts.map +0 -1
  624. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts +0 -2
  625. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts.map +0 -1
  626. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts +0 -2
  627. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts.map +0 -1
  628. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts +0 -2
  629. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts.map +0 -1
  630. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts +0 -2
  631. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts.map +0 -1
  632. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts +0 -2
  633. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts.map +0 -1
  634. package/dist/__tests__/render-feature-public-surface.test-d.d.ts +0 -2
  635. package/dist/__tests__/render-feature-public-surface.test-d.d.ts.map +0 -1
  636. package/dist/__tests__/render-feature-retry.unit.test.d.ts +0 -2
  637. package/dist/__tests__/render-feature-retry.unit.test.d.ts.map +0 -1
  638. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts +0 -2
  639. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts.map +0 -1
  640. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts +0 -2
  641. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts.map +0 -1
  642. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts +0 -2
  643. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts.map +0 -1
  644. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts +0 -2
  645. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts.map +0 -1
  646. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts +0 -2
  647. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts.map +0 -1
  648. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts +0 -2
  649. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts.map +0 -1
  650. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts +0 -7
  651. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts.map +0 -1
  652. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts +0 -2
  653. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts.map +0 -1
  654. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts +0 -2
  655. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts.map +0 -1
  656. package/dist/__tests__/render-graph-hzb-gpu.d.ts +0 -7
  657. package/dist/__tests__/render-graph-hzb-gpu.d.ts.map +0 -1
  658. package/dist/__tests__/render-graph-hzb.browser.test.d.ts +0 -2
  659. package/dist/__tests__/render-graph-hzb.browser.test.d.ts.map +0 -1
  660. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts +0 -2
  661. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts.map +0 -1
  662. package/dist/__tests__/render-graph-primitives.unit.test.d.ts +0 -2
  663. package/dist/__tests__/render-graph-primitives.unit.test.d.ts.map +0 -1
  664. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts +0 -12
  665. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts.map +0 -1
  666. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts +0 -2
  667. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts.map +0 -1
  668. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts +0 -2
  669. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts.map +0 -1
  670. package/dist/__tests__/render-scene-projection.unit.test.d.ts +0 -2
  671. package/dist/__tests__/render-scene-projection.unit.test.d.ts.map +0 -1
  672. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts +0 -2
  673. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts.map +0 -1
  674. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts +0 -2
  675. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts.map +0 -1
  676. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts +0 -2
  677. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts.map +0 -1
  678. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts +0 -2
  679. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts.map +0 -1
  680. package/dist/__tests__/shader-stage-surface.unit.test.d.ts +0 -2
  681. package/dist/__tests__/shader-stage-surface.unit.test.d.ts.map +0 -1
  682. package/dist/__tests__/ssao-config.unit.test.d.ts +0 -2
  683. package/dist/__tests__/ssao-config.unit.test.d.ts.map +0 -1
  684. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts +0 -2
  685. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts.map +0 -1
  686. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts +0 -2
  687. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts.map +0 -1
  688. package/dist/__tests__/standard-descriptors.test-d.d.ts +0 -2
  689. package/dist/__tests__/standard-descriptors.test-d.d.ts.map +0 -1
  690. package/dist/__tests__/standard-pipeline.dawn.test.d.ts +0 -2
  691. package/dist/__tests__/standard-pipeline.dawn.test.d.ts.map +0 -1
  692. package/dist/__tests__/standard-pipeline.integration.test.d.ts +0 -2
  693. package/dist/__tests__/standard-pipeline.integration.test.d.ts.map +0 -1
  694. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts +0 -2
  695. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts.map +0 -1
  696. package/dist/__tests__/surface-configuration.unit.test.d.ts +0 -2
  697. package/dist/__tests__/surface-configuration.unit.test.d.ts.map +0 -1
  698. package/dist/__tests__/texture-usage-surface.unit.test.d.ts +0 -2
  699. package/dist/__tests__/texture-usage-surface.unit.test.d.ts.map +0 -1
  700. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts +0 -2
  701. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts.map +0 -1
  702. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts +0 -2
  703. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts.map +0 -1
  704. package/dist/__tests__/urp-pipeline.unit.test.d.ts +0 -2
  705. package/dist/__tests__/urp-pipeline.unit.test.d.ts.map +0 -1
  706. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts +0 -2
  707. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts.map +0 -1
  708. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts +0 -2
  709. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts.map +0 -1
  710. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts +0 -2
  711. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts.map +0 -1
  712. package/dist/__tests__/visibility-extract.integration.test.d.ts +0 -2
  713. package/dist/__tests__/visibility-extract.integration.test.d.ts.map +0 -1
  714. package/dist/__tests__/visibility-extract.perf.test.d.ts +0 -2
  715. package/dist/__tests__/visibility-extract.perf.test.d.ts.map +0 -1
  716. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts +0 -2
  717. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts.map +0 -1
  718. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts +0 -2
  719. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts.map +0 -1
  720. package/dist/__tests__/visibility-instances.integration.test.d.ts +0 -2
  721. package/dist/__tests__/visibility-instances.integration.test.d.ts.map +0 -1
  722. package/dist/__tests__/visibility-multi-world.integration.test.d.ts +0 -2
  723. package/dist/__tests__/visibility-multi-world.integration.test.d.ts.map +0 -1
  724. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts +0 -2
  725. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts.map +0 -1
  726. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts +0 -2
  727. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts.map +0 -1
  728. package/dist/__tests__/visibility-public-surface.test-d.d.ts +0 -2
  729. package/dist/__tests__/visibility-public-surface.test-d.d.ts.map +0 -1
  730. package/dist/__tests__/visibility-resolver.unit.test.d.ts +0 -2
  731. package/dist/__tests__/visibility-resolver.unit.test.d.ts.map +0 -1
  732. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts +0 -2
  733. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts.map +0 -1
  734. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts +0 -2
  735. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts.map +0 -1
  736. package/dist/__tests__/vocabulary.unit.test.d.ts +0 -2
  737. package/dist/__tests__/vocabulary.unit.test.d.ts.map +0 -1
  738. package/dist/chunk-CQXZC5XI.mjs.map +0 -1
  739. package/dist/chunk-HCOGPHKS.mjs +0 -93
  740. package/dist/chunk-HCOGPHKS.mjs.map +0 -1
  741. package/dist/chunk-YEJIUW7D.mjs.map +0 -1
  742. package/dist/components/__tests__/points-lines-admission.unit.test.d.ts +0 -2
  743. package/dist/components/__tests__/points-lines-admission.unit.test.d.ts.map +0 -1
  744. package/dist/components/__tests__/points-lines-schema.unit.test.d.ts +0 -2
  745. package/dist/components/__tests__/points-lines-schema.unit.test.d.ts.map +0 -1
  746. package/dist/components/__tests__/schema-contract.unit.test.d.ts +0 -2
  747. package/dist/components/__tests__/schema-contract.unit.test.d.ts.map +0 -1
  748. package/dist/components/__tests__/schema-parity.unit.test.d.ts +0 -2
  749. package/dist/components/__tests__/schema-parity.unit.test.d.ts.map +0 -1
  750. package/dist/components/__tests__/visibility-schema.unit.test.d.ts +0 -2
  751. package/dist/components/__tests__/visibility-schema.unit.test.d.ts.map +0 -1
  752. package/dist/points-lines/__tests__/bounds.unit.test.d.ts +0 -2
  753. package/dist/points-lines/__tests__/bounds.unit.test.d.ts.map +0 -1
  754. package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts +0 -2
  755. package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts.map +0 -1
  756. package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts +0 -2
  757. package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts.map +0 -1
  758. package/dist/points-lines/__tests__/inspection.unit.test.d.ts +0 -2
  759. package/dist/points-lines/__tests__/inspection.unit.test.d.ts.map +0 -1
  760. package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts +0 -2
  761. package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts.map +0 -1
  762. package/dist/points-lines/__tests__/points-lines.bench.d.ts +0 -2
  763. package/dist/points-lines/__tests__/points-lines.bench.d.ts.map +0 -1
  764. package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts +0 -2
  765. package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts.map +0 -1
  766. package/dist/points-lines/__tests__/snapshot.unit.test.d.ts +0 -2
  767. package/dist/points-lines/__tests__/snapshot.unit.test.d.ts.map +0 -1
  768. package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts +0 -2
  769. package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts.map +0 -1
  770. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts +0 -2
  771. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts.map +0 -1
  772. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts +0 -2
  773. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts.map +0 -1
  774. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts +0 -2
  775. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts.map +0 -1
  776. package/dist/record/__tests__/video-texture-view.unit.test.d.ts +0 -2
  777. package/dist/record/__tests__/video-texture-view.unit.test.d.ts.map +0 -1
@@ -60,6 +60,7 @@ import {
60
60
  type AssetError,
61
61
  countExtraUvSets,
62
62
  type DecodedImage,
63
+ deriveTextureLayout,
63
64
  type EquirectAsset,
64
65
  type Handle,
65
66
  handleSlot,
@@ -72,6 +73,7 @@ import {
72
73
  type SamplerAsset,
73
74
  type Submesh,
74
75
  type TextureAsset,
76
+ type TextureShape,
75
77
  type MeshAsset as TypesMeshAsset,
76
78
  toShared,
77
79
  } from '@forgeax/engine-types';
@@ -98,7 +100,6 @@ import {
98
100
  import type { RhiErrorListenerRegistry } from '../lifecycle';
99
101
  import {
100
102
  type CubeRenderData,
101
- deriveMipUploadLayout,
102
103
  deriveRenderDataCubemap,
103
104
  deriveRenderDataMesh,
104
105
  deriveRenderDataTexture,
@@ -281,10 +282,25 @@ type RegisterCube = (
281
282
  // not destroyable on their own; their lifetime is bound to the parent
282
283
  // GpuTexture, which the wrapper owns. destroyAll() walks the GpuResource
283
284
  // fields and forwards .destroy() to the RHI shim.
284
- interface TextureGpuEntry {
285
+ export interface TextureResidencyReceipt {
286
+ readonly shape: TextureShape;
287
+ readonly format: GPUTextureFormat;
288
+ readonly extent: {
289
+ readonly width: number;
290
+ readonly height: number;
291
+ readonly depthOrArrayLayers: number;
292
+ };
293
+ readonly bytes: number;
294
+ readonly view: '2d' | '2d-array' | '3d';
295
+ readonly generation: number;
296
+ readonly deviceEpoch: number;
297
+ }
298
+
299
+ export interface TextureGpuEntry {
285
300
  readonly texture: GpuTexture;
286
301
  /** Opaque RHI view handle; lifetime is bound to the parent texture. */
287
302
  readonly view: TextureView;
303
+ readonly receipt: TextureResidencyReceipt;
288
304
  }
289
305
 
290
306
  // feat-20260630-equirect-kind-internalized-ibl-declarative-skyligh M2 / w11
@@ -388,6 +404,8 @@ export class GpuResidencyCache {
388
404
  // Hardware-probe caps injected at `configureGpuDevice`; guards the HDR cubemap
389
405
  // path (_uploadCubemapFromEquirect) when `rgba16floatRenderable` is false.
390
406
  private caps: RhiCaps | undefined = undefined;
407
+ private deviceEpoch = 0;
408
+ private textureGeneration = 0;
391
409
 
392
410
  private readonly textureGpuHandles: Map<string | number, TextureGpuEntry> = new Map();
393
411
  private readonly samplerGpuHandles: Map<string | number, Sampler> = new Map();
@@ -432,6 +450,12 @@ export class GpuResidencyCache {
432
450
  registerCube: RegisterCube,
433
451
  caps: RhiCaps,
434
452
  ): void {
453
+ for (const entry of this.textureGpuHandles.values()) {
454
+ if (!entry.texture.isDestroyed) entry.texture.destroy();
455
+ }
456
+ if (this.textureGpuHandles.size > 0) this.materialResourceEpoch += 1;
457
+ this.textureGpuHandles.clear();
458
+ this.deviceEpoch += 1;
435
459
  this.meshResidencyEpoch += 1;
436
460
  this.gpuDevice = device;
437
461
  this.asyncCreateShaderModule = asyncCreateShaderModule;
@@ -997,7 +1021,7 @@ export class GpuResidencyCache {
997
1021
  const cacheKey = this.worldKey(handleSlot(handle), worldId);
998
1022
  if (gpuTexture === undefined) return ok(undefined);
999
1023
 
1000
- if (!projected.value.compressed && decoded.mipmap === true && levels > 1) {
1024
+ if (!projected.value.compressed && tex.mips.kind === 'generate' && levels > 1) {
1001
1025
  const factory = this.asyncCreateShaderModule;
1002
1026
  if (factory === undefined) {
1003
1027
  return err(
@@ -1020,8 +1044,8 @@ export class GpuResidencyCache {
1020
1044
  }
1021
1045
  const blitRes = blitMipmapsSync(device, gpuTexture, {
1022
1046
  format: tex.format,
1023
- width: tex.width,
1024
- height: tex.height,
1047
+ width: tex.shape.extent.width,
1048
+ height: tex.shape.extent.height,
1025
1049
  levels,
1026
1050
  });
1027
1051
  if (!blitRes.ok) return blitRes as Result<void, RhiError>;
@@ -1029,13 +1053,14 @@ export class GpuResidencyCache {
1029
1053
 
1030
1054
  const viewRes = device.createTextureView(gpuTexture, {
1031
1055
  label: `texture-view-${cacheKey}`,
1032
- dimension: '2d',
1056
+ dimension: projected.value.shape.viewDimension,
1033
1057
  });
1034
1058
  if (!viewRes.ok) return viewRes;
1035
1059
  const previous = this.textureGpuHandles.get(cacheKey);
1036
- const next = {
1060
+ const next: TextureGpuEntry = {
1037
1061
  texture: this.wrapTex(gpuTexture),
1038
1062
  view: viewRes.value,
1063
+ receipt: this.textureReceipt(pod, projected.value),
1039
1064
  };
1040
1065
  this.textureGpuHandles.set(cacheKey, next);
1041
1066
  this.materialResourceEpoch += 1;
@@ -1077,11 +1102,11 @@ export class GpuResidencyCache {
1077
1102
  const { tex, levels, gpuTexture } = prepared.value;
1078
1103
  const cacheKey = this.worldKey(handleSlot(handle), worldId);
1079
1104
 
1080
- if (!renderData.compressed && decoded.mipmap === true && levels > 1) {
1105
+ if (!renderData.compressed && tex.mips.kind === 'generate' && levels > 1) {
1081
1106
  const blitRes = blitMipmapsSync(device, gpuTexture, {
1082
1107
  format: tex.format,
1083
- width: tex.width,
1084
- height: tex.height,
1108
+ width: tex.shape.extent.width,
1109
+ height: tex.shape.extent.height,
1085
1110
  levels,
1086
1111
  });
1087
1112
  if (!blitRes.ok) return blitRes as Result<TextureGpuEntry, RhiError>;
@@ -1089,10 +1114,14 @@ export class GpuResidencyCache {
1089
1114
 
1090
1115
  const viewRes = device.createTextureView(gpuTexture, {
1091
1116
  label: `texture-view-${cacheKey}`,
1092
- dimension: '2d',
1117
+ dimension: renderData.shape.viewDimension,
1093
1118
  });
1094
1119
  if (!viewRes.ok) return viewRes;
1095
- const entry: TextureGpuEntry = { texture: this.wrapTex(gpuTexture), view: viewRes.value };
1120
+ const entry: TextureGpuEntry = {
1121
+ texture: this.wrapTex(gpuTexture),
1122
+ view: viewRes.value,
1123
+ receipt: this.textureReceipt(pod, renderData),
1124
+ };
1096
1125
  const previous = this.textureGpuHandles.get(cacheKey);
1097
1126
  this.textureGpuHandles.set(cacheKey, entry);
1098
1127
  this.materialResourceEpoch += 1;
@@ -1106,6 +1135,25 @@ export class GpuResidencyCache {
1106
1135
  return ok(entry);
1107
1136
  }
1108
1137
 
1138
+ private textureReceipt(
1139
+ pod: TextureAsset,
1140
+ renderData: TextureRenderData,
1141
+ ): TextureResidencyReceipt {
1142
+ return {
1143
+ shape: pod.shape,
1144
+ format: renderData.format,
1145
+ extent: {
1146
+ width: renderData.physicalExtent.width,
1147
+ height: renderData.physicalExtent.height,
1148
+ depthOrArrayLayers: renderData.depthOrArrayLayers,
1149
+ },
1150
+ bytes: pod.data.byteLength,
1151
+ view: renderData.shape.viewDimension,
1152
+ generation: ++this.textureGeneration,
1153
+ deviceEpoch: this.deviceEpoch,
1154
+ };
1155
+ }
1156
+
1109
1157
  /**
1110
1158
  * Shared texture-upload prelude: format / colorSpace consistency assertion,
1111
1159
  * GPU texture allocation + writeTexture. Returns `gpuTexture: undefined`
@@ -1155,13 +1203,21 @@ export class GpuResidencyCache {
1155
1203
  // upload before allocating a handle; binding a texture that the backend
1156
1204
  // accepted syntactically but cannot use later surfaces only as a generic
1157
1205
  // invalid-bind-group submit error.
1158
- const maxDimension = device.limits.maxTextureDimension2D;
1159
- if (tex.width > maxDimension || tex.height > maxDimension) {
1206
+ const maxDimension =
1207
+ tex.shape.viewDimension === '3d'
1208
+ ? device.limits.maxTextureDimension3D
1209
+ : device.limits.maxTextureDimension2D;
1210
+ const width = tex.shape.extent.width;
1211
+ const height = tex.shape.extent.height;
1212
+ const layers = renderData.depthOrArrayLayers;
1213
+ const exceedsLayerLimit =
1214
+ tex.shape.viewDimension === '2d-array' && layers > device.limits.maxTextureArrayLayers;
1215
+ if (width > maxDimension || height > maxDimension || exceedsLayerLimit) {
1160
1216
  return err(
1161
1217
  makeImageError({
1162
1218
  code: 'image-dimension-out-of-bounds',
1163
- requested: { width: tex.width, height: tex.height },
1164
- limit: maxDimension,
1219
+ requested: { width, height },
1220
+ limit: exceedsLayerLimit ? device.limits.maxTextureArrayLayers : maxDimension,
1165
1221
  }),
1166
1222
  );
1167
1223
  }
@@ -1171,11 +1227,11 @@ export class GpuResidencyCache {
1171
1227
  size: {
1172
1228
  width: renderData.physicalExtent.width,
1173
1229
  height: renderData.physicalExtent.height,
1174
- depthOrArrayLayers: 1,
1230
+ depthOrArrayLayers: renderData.depthOrArrayLayers,
1175
1231
  },
1176
1232
  mipLevelCount: levels,
1177
1233
  sampleCount: 1,
1178
- dimension: '2d',
1234
+ dimension: tex.shape.viewDimension === '3d' ? '3d' : '2d',
1179
1235
  format: renderData.format,
1180
1236
  usage: renderData.usage,
1181
1237
  viewFormats: [],
@@ -1193,28 +1249,77 @@ export class GpuResidencyCache {
1193
1249
  // block math). Full-subresource copies retain their logical size, including
1194
1250
  // non-block-aligned dimensions. queue.writeTexture avoids the 256 B
1195
1251
  // copyBufferToTexture alignment trap.
1196
- const layout = deriveMipUploadLayout(renderData.format, tex.width, tex.height, levels);
1197
- for (const lvl of layout) {
1198
- const slice = decoded.bytes.subarray(lvl.byteOffset, lvl.byteOffset + lvl.byteLength);
1199
- const writeRes = queue.writeTexture(
1200
- { texture: gpuTexture, mipLevel: lvl.level, origin: { x: 0, y: 0, z: 0 } },
1201
- slice,
1202
- { offset: 0, bytesPerRow: lvl.bytesPerRow, rowsPerImage: lvl.rowsPerImage },
1203
- { width: lvl.copyWidth, height: lvl.copyHeight, depthOrArrayLayers: 1 },
1252
+ const layout = deriveTextureLayout({
1253
+ shape: tex.shape,
1254
+ format: renderData.format,
1255
+ mips: tex.mips,
1256
+ });
1257
+ if (!layout.ok) {
1258
+ return err(
1259
+ makeAssetError({
1260
+ code: 'invalid-source-format',
1261
+ expected: layout.error.expected,
1262
+ hint: layout.error.hint,
1263
+ }),
1204
1264
  );
1205
- if (!writeRes.ok) return writeRes;
1265
+ }
1266
+ for (const level of layout.value.levels) {
1267
+ for (let image = 0; image < level.imagesPerMip; image++) {
1268
+ const imageBytes = level.bytesPerRow * level.rowsPerImage;
1269
+ const offset = level.byteOffset + image * imageBytes;
1270
+ const slice = decoded.bytes.subarray(offset, offset + imageBytes);
1271
+ const writeRes = queue.writeTexture(
1272
+ {
1273
+ texture: gpuTexture,
1274
+ mipLevel: level.level,
1275
+ origin: { x: 0, y: 0, z: image },
1276
+ },
1277
+ slice,
1278
+ { offset: 0, bytesPerRow: level.bytesPerRow, rowsPerImage: level.rowsPerImage },
1279
+ {
1280
+ width: level.physicalWidth,
1281
+ height: level.physicalHeight,
1282
+ depthOrArrayLayers: 1,
1283
+ },
1284
+ );
1285
+ if (!writeRes.ok) return writeRes;
1286
+ }
1206
1287
  }
1207
1288
  return ok({ id, tex, levels, gpuTexture });
1208
1289
  }
1209
1290
 
1210
1291
  // Uncompressed base-mip write; higher mips (when mipmap) are GPU-generated by
1211
1292
  // the caller's blit pass. rowsPerImage is the pixel height for linear RGBA.
1212
- const bytesPerRow = renderData.bytesPerRow;
1293
+ const textureLayout = deriveTextureLayout({
1294
+ shape: tex.shape,
1295
+ format: renderData.format,
1296
+ mips: tex.mips,
1297
+ });
1298
+ if (!textureLayout.ok) {
1299
+ return err(
1300
+ makeAssetError({
1301
+ code: 'invalid-source-format',
1302
+ expected: textureLayout.error.expected,
1303
+ hint: textureLayout.error.hint,
1304
+ }),
1305
+ );
1306
+ }
1307
+ const baseLevel = textureLayout.value.levels[0];
1308
+ if (baseLevel === undefined) {
1309
+ return err(
1310
+ makeAssetError({
1311
+ code: 'invalid-source-format',
1312
+ expected: 'texture layout contains a base mip level',
1313
+ hint: ASSET_ERROR_HINTS['invalid-source-format'],
1314
+ }),
1315
+ );
1316
+ }
1317
+ const bytesPerRow = baseLevel.bytesPerRow;
1213
1318
  const writeTextureRes = queue.writeTexture(
1214
1319
  { texture: gpuTexture, mipLevel: 0, origin: { x: 0, y: 0, z: 0 } },
1215
1320
  decoded.bytes,
1216
- { offset: 0, bytesPerRow, rowsPerImage: tex.height },
1217
- { width: tex.width, height: tex.height, depthOrArrayLayers: 1 },
1321
+ { offset: 0, bytesPerRow, rowsPerImage: height },
1322
+ { width, height, depthOrArrayLayers: renderData.depthOrArrayLayers },
1218
1323
  );
1219
1324
  if (!writeTextureRes.ok) return writeTextureRes;
1220
1325
 
@@ -1333,14 +1438,21 @@ export class GpuResidencyCache {
1333
1438
  // / format / data / colorSpace) but has no CPU mip chain, so the derived
1334
1439
  // texture view declares `mipmap:false` (the IBL prefilter mip chain is a
1335
1440
  // GPU-side pass, not a CPU-authored level set).
1441
+ const sourceData =
1442
+ sourcePod.data instanceof Uint8ClampedArray
1443
+ ? new Uint8Array(
1444
+ sourcePod.data.buffer,
1445
+ sourcePod.data.byteOffset,
1446
+ sourcePod.data.byteLength,
1447
+ )
1448
+ : sourcePod.data;
1336
1449
  const sourceTex: TextureAsset = {
1337
1450
  kind: 'texture',
1338
- width: sourcePod.width,
1339
- height: sourcePod.height,
1451
+ shape: { viewDimension: '2d', extent: { width: sourcePod.width, height: sourcePod.height } },
1340
1452
  format: sourcePod.format,
1341
- data: sourcePod.data,
1453
+ data: sourceData,
1342
1454
  colorSpace: sourcePod.colorSpace,
1343
- mipmap: false,
1455
+ mips: { kind: 'none' },
1344
1456
  };
1345
1457
 
1346
1458
  // Project the equirect source POD into the cubemap descriptor (D-5): the
@@ -1365,20 +1477,11 @@ export class GpuResidencyCache {
1365
1477
  const tex: TextureAsset = projected.needsHalfConversion
1366
1478
  ? {
1367
1479
  kind: 'texture',
1368
- width: sourceTex.width,
1369
- height: sourceTex.height,
1480
+ shape: sourceTex.shape,
1370
1481
  format: projected.outputFormat,
1371
- data: halfFloat.f32ToF16Bytes(
1372
- sourceTex.data instanceof Uint8ClampedArray
1373
- ? new Uint8Array(
1374
- sourceTex.data.buffer,
1375
- sourceTex.data.byteOffset,
1376
- sourceTex.data.byteLength,
1377
- )
1378
- : sourceTex.data,
1379
- ),
1482
+ data: halfFloat.f32ToF16Bytes(sourceTex.data),
1380
1483
  colorSpace: 'linear',
1381
- mipmap: false,
1484
+ mips: { kind: 'none' },
1382
1485
  }
1383
1486
  : sourceTex;
1384
1487
 
@@ -1503,7 +1606,11 @@ export class GpuResidencyCache {
1503
1606
 
1504
1607
  const equirectTextureResult = device.createTexture({
1505
1608
  label: `equirect-${sourceId}`,
1506
- size: { width: tex.width, height: tex.height, depthOrArrayLayers: 1 },
1609
+ size: {
1610
+ width: tex.shape.extent.width,
1611
+ height: tex.shape.extent.height,
1612
+ depthOrArrayLayers: 1,
1613
+ },
1507
1614
  mipLevelCount: 1,
1508
1615
  sampleCount: 1,
1509
1616
  dimension: '2d',
@@ -1526,8 +1633,15 @@ export class GpuResidencyCache {
1526
1633
  const equirectWriteResult = device.queue.writeTexture(
1527
1634
  { texture: equirectGpuTex },
1528
1635
  tex.data,
1529
- { bytesPerRow: tex.width * bytesPerPixel, rowsPerImage: tex.height },
1530
- { width: tex.width, height: tex.height, depthOrArrayLayers: 1 },
1636
+ {
1637
+ bytesPerRow: tex.shape.extent.width * bytesPerPixel,
1638
+ rowsPerImage: tex.shape.extent.height,
1639
+ },
1640
+ {
1641
+ width: tex.shape.extent.width,
1642
+ height: tex.shape.extent.height,
1643
+ depthOrArrayLayers: 1,
1644
+ },
1531
1645
  );
1532
1646
  if (!equirectWriteResult.ok) return recordFailed(equirectWriteResult.error);
1533
1647
 
@@ -1803,20 +1917,16 @@ export class GpuResidencyCache {
1803
1917
  /**
1804
1918
  * Synthesize the `DecodedImage` view the texture-upload prelude consumes from
1805
1919
  * a `TextureAsset` POD (the record-stage pull path holds only the POD). The
1806
- * POD's `data` is the pixel bytes; `colorSpace` + `mipmap` drive the
1920
+ * POD's `data` is the pixel bytes; `colorSpace` + `mips` drive the
1807
1921
  * consistency assertion + mip count.
1808
1922
  */
1809
1923
  function decodedFromTexture(tex: TextureAsset): DecodedImage {
1810
- const bytes =
1811
- tex.data instanceof Uint8ClampedArray
1812
- ? new Uint8Array(tex.data.buffer, tex.data.byteOffset, tex.data.byteLength)
1813
- : tex.data;
1814
1924
  return {
1815
- bytes,
1816
- width: tex.width,
1817
- height: tex.height,
1925
+ bytes: tex.data,
1926
+ width: tex.shape.extent.width,
1927
+ height: tex.shape.extent.height,
1818
1928
  mime: 'image/png',
1819
1929
  colorSpace: tex.colorSpace,
1820
- mipmap: tex.mipmap,
1930
+ mipmap: tex.mips.kind === 'generate',
1821
1931
  };
1822
1932
  }
@@ -0,0 +1,185 @@
1
+ import { err, ok, type Result } from '@forgeax/engine-types';
2
+ import { EnvironmentSourceConflictError, FogCardinalityError } from '../errors/render';
3
+ import type {
4
+ EnvironmentCandidate,
5
+ EnvironmentFrame,
6
+ EnvironmentSource,
7
+ FogCandidate,
8
+ FogFrame,
9
+ } from '../extract/environment';
10
+ import { validateAtmosphereParameters } from '../extract/environment';
11
+ import { environmentFactSignatures } from './signature';
12
+
13
+ export type { EnvironmentCandidate, EnvironmentFrame, EnvironmentSource, FogCandidate, FogFrame };
14
+
15
+ export interface SunCandidate {
16
+ readonly entityKey: number;
17
+ readonly direction: readonly [number, number, number];
18
+ readonly color: readonly [number, number, number];
19
+ readonly intensity: number;
20
+ }
21
+
22
+ export interface EnvironmentSelectionInput {
23
+ readonly environments: readonly EnvironmentCandidate[];
24
+ readonly fogs: readonly FogCandidate[];
25
+ readonly suns: readonly SunCandidate[];
26
+ readonly lane: 'direct' | 'clustered';
27
+ }
28
+
29
+ export interface EnvironmentSelectionParameterDetail {
30
+ readonly field: string;
31
+ readonly value: number;
32
+ }
33
+
34
+ export class EnvironmentSelectionParameterError extends Error {
35
+ readonly code = 'environment-selection-invalid' as const;
36
+ readonly expected: string;
37
+ readonly hint: string;
38
+ readonly detail: EnvironmentSelectionParameterDetail;
39
+
40
+ constructor(field: string, value: number, expected: string) {
41
+ super(`environment selection field ${field} is invalid`);
42
+ this.name = 'EnvironmentSelectionParameterError';
43
+ this.expected = expected;
44
+ this.hint = `set ${field} to a finite value satisfying ${expected}`;
45
+ this.detail = { field, value };
46
+ }
47
+ }
48
+
49
+ export interface SunCardinalityDetail {
50
+ readonly field: 'sun';
51
+ readonly value: number;
52
+ }
53
+
54
+ export class SunCardinalityError extends Error {
55
+ readonly code = 'sun-cardinality' as const;
56
+ readonly expected = 'atmosphere has exactly one sun owner';
57
+ readonly hint = 'add exactly one DirectionalLight sun for the atmosphere owner';
58
+ readonly detail: SunCardinalityDetail;
59
+
60
+ constructor(value: number) {
61
+ super(`atmosphere sun cardinality is ${value}`);
62
+ this.name = 'SunCardinalityError';
63
+ this.detail = { field: 'sun', value };
64
+ }
65
+ }
66
+
67
+ export interface EnvironmentSelectionErrorDetail {
68
+ readonly owners?: readonly {
69
+ readonly kind: 'image' | 'atmosphere';
70
+ readonly entityKey: number;
71
+ readonly sourceKey: string;
72
+ }[];
73
+ readonly field?: string;
74
+ readonly value?: number;
75
+ readonly count?: number;
76
+ }
77
+
78
+ export interface EnvironmentSelectionError {
79
+ readonly code:
80
+ | 'environment-source-conflict'
81
+ | 'fog-cardinality'
82
+ | 'environment-selection-invalid'
83
+ | 'atmosphere-invalid-parameter'
84
+ | 'sun-cardinality';
85
+ readonly expected: string;
86
+ readonly hint: string;
87
+ readonly detail: EnvironmentSelectionErrorDetail;
88
+ }
89
+
90
+ export interface SelectedEnvironmentFrame extends EnvironmentFrame {
91
+ readonly sun: SunCandidate | undefined;
92
+ readonly lane: 'direct' | 'clustered';
93
+ }
94
+
95
+ function freezeCandidate<T extends object>(candidate: T): T {
96
+ return Object.freeze(candidate);
97
+ }
98
+
99
+ function freezeFog(candidate: FogCandidate): FogFrame {
100
+ return Object.freeze({
101
+ ...candidate,
102
+ color: Object.freeze([...candidate.color] as unknown as FogFrame['color']),
103
+ });
104
+ }
105
+
106
+ function validFog(candidate: FogCandidate): boolean {
107
+ return (
108
+ candidate.color.every(Number.isFinite) &&
109
+ Number.isFinite(candidate.density) &&
110
+ candidate.density >= 0 &&
111
+ Number.isFinite(candidate.heightFalloff) &&
112
+ candidate.heightFalloff >= 0 &&
113
+ Number.isFinite(candidate.maxOpacity) &&
114
+ candidate.maxOpacity >= 0 &&
115
+ candidate.maxOpacity <= 1
116
+ );
117
+ }
118
+
119
+ /** Select one immutable frame fact set for both Standard lighting lanes. */
120
+ export function selectEnvironment(
121
+ input: EnvironmentSelectionInput,
122
+ ): Result<SelectedEnvironmentFrame, EnvironmentSelectionError> {
123
+ if (input.environments.length > 1) {
124
+ return err(
125
+ new EnvironmentSourceConflictError(
126
+ [...input.environments]
127
+ .sort((left, right) => left.entityKey - right.entityKey)
128
+ .map(({ kind, entityKey, sourceKey }) => ({ kind, entityKey, sourceKey })),
129
+ ),
130
+ );
131
+ }
132
+ if (input.fogs.length > 1) return err(new FogCardinalityError(input.fogs.length));
133
+ const selectedFog = input.fogs[0];
134
+ if (selectedFog !== undefined && !validFog(selectedFog)) {
135
+ const field =
136
+ !Number.isFinite(selectedFog.density) || selectedFog.density < 0
137
+ ? 'density'
138
+ : !Number.isFinite(selectedFog.heightFalloff) || selectedFog.heightFalloff < 0
139
+ ? 'heightFalloff'
140
+ : 'maxOpacity';
141
+ return err(
142
+ new EnvironmentSelectionParameterError(field, selectedFog[field], 'finite and in range'),
143
+ );
144
+ }
145
+ const selected = input.environments[0];
146
+ if (selected?.kind === 'atmosphere') {
147
+ const invalid = validateAtmosphereParameters(selected.atmosphere);
148
+ if (invalid !== undefined) return err(invalid);
149
+ }
150
+ if (selected?.kind === 'atmosphere' && input.suns.length !== 1) {
151
+ return err(new SunCardinalityError(input.suns.length));
152
+ }
153
+ const source: EnvironmentSource =
154
+ selected === undefined
155
+ ? { kind: 'none' }
156
+ : selected.kind === 'atmosphere'
157
+ ? {
158
+ kind: 'atmosphere',
159
+ entityKey: selected.entityKey,
160
+ sourceKey: selected.sourceKey,
161
+ atmosphere: Object.freeze({ ...selected.atmosphere }),
162
+ }
163
+ : {
164
+ kind: 'image',
165
+ entityKey: selected.entityKey,
166
+ sourceKey: selected.sourceKey,
167
+ };
168
+ const sun = input.suns[0] === undefined ? undefined : freezeCandidate({ ...input.suns[0] });
169
+ const fog = selectedFog === undefined ? undefined : freezeFog(selectedFog);
170
+ const signatureInput = {
171
+ environments: selected === undefined ? [] : [selected],
172
+ fogs: selectedFog === undefined ? [] : [selectedFog],
173
+ suns: input.suns,
174
+ };
175
+ const signatures = environmentFactSignatures(signatureInput);
176
+ const result = {
177
+ source: Object.freeze(source),
178
+ fog,
179
+ ...signatures,
180
+ revision: 0,
181
+ sun,
182
+ } as SelectedEnvironmentFrame;
183
+ Object.defineProperty(result, 'lane', { value: input.lane, enumerable: false });
184
+ return ok(Object.freeze(result));
185
+ }
@@ -0,0 +1,23 @@
1
+ import type { DeviceScope } from '../device/device-scope';
2
+ import type { EnvironmentFrame } from './frame';
3
+
4
+ export interface EnvironmentGeneration {
5
+ readonly signature: string;
6
+ readonly generation: number;
7
+ readonly lane: 'direct' | 'clustered';
8
+ readonly scope: DeviceScope;
9
+ readonly liveHandle: object;
10
+ readonly resourceCount: number;
11
+ readonly resourceBytes: number;
12
+ retired: boolean;
13
+ }
14
+
15
+ export interface EnvironmentGenerationFailure {
16
+ readonly failureAt?: 'prepare' | 'build' | 'execute' | 'finish' | 'submit';
17
+ }
18
+
19
+ export interface EnvironmentGenerationState {
20
+ readonly frame: EnvironmentFrame;
21
+ readonly scope: DeviceScope;
22
+ readonly generation: number;
23
+ }
@@ -0,0 +1,9 @@
1
+ import type { EnvironmentFrame } from './frame';
2
+
3
+ /** Both Standard lanes consume the same selected CPU environment facts. */
4
+ export function sharedEnvironmentFrame(
5
+ frame: EnvironmentFrame,
6
+ _lane: 'direct' | 'clustered',
7
+ ): EnvironmentFrame {
8
+ return frame;
9
+ }