@forgeax/engine-render 0.1.19 → 0.1.21

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 (452) hide show
  1. package/README.md +215 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/assembly/device-feature-admission.d.ts +18 -0
  4. package/dist/assembly/device-feature-admission.d.ts.map +1 -0
  5. package/dist/assembly/directional-shadow-inspection.d.ts +38 -0
  6. package/dist/assembly/directional-shadow-inspection.d.ts.map +1 -0
  7. package/dist/assembly/factory.d.ts +34 -20
  8. package/dist/assembly/factory.d.ts.map +1 -1
  9. package/dist/assembly/host-contract.d.ts +9 -0
  10. package/dist/assembly/host-contract.d.ts.map +1 -1
  11. package/dist/assembly/render-target-host.d.ts +46 -0
  12. package/dist/assembly/render-target-host.d.ts.map +1 -0
  13. package/dist/assets/render-asset-port.d.ts.map +1 -1
  14. package/dist/authoring.mjs +3 -0
  15. package/dist/authoring.mjs.map +1 -1
  16. package/dist/capture/cube-views.d.ts +21 -0
  17. package/dist/capture/cube-views.d.ts.map +1 -0
  18. package/dist/capture/scheduler.d.ts +54 -0
  19. package/dist/capture/scheduler.d.ts.map +1 -0
  20. package/dist/{chunk-RJRUS55L.mjs → chunk-5YADUCA7.mjs} +1896 -1624
  21. package/dist/chunk-5YADUCA7.mjs.map +1 -0
  22. package/dist/{chunk-LOSO4CTV.mjs → chunk-6OPXDQ2E.mjs} +423 -46
  23. package/dist/chunk-6OPXDQ2E.mjs.map +1 -0
  24. package/dist/{chunk-IPXCABEP.mjs → chunk-BXBQQKFQ.mjs} +3 -9
  25. package/dist/chunk-BXBQQKFQ.mjs.map +1 -0
  26. package/dist/chunk-FS2KNUQH.mjs +1294 -0
  27. package/dist/chunk-FS2KNUQH.mjs.map +1 -0
  28. package/dist/components/camera.d.ts +1 -0
  29. package/dist/components/camera.d.ts.map +1 -1
  30. package/dist/components/cube-camera.d.ts +20 -0
  31. package/dist/components/cube-camera.d.ts.map +1 -0
  32. package/dist/components/directional-light.d.ts +11 -2
  33. package/dist/components/directional-light.d.ts.map +1 -1
  34. package/dist/components/directional-shadow-filter.d.ts +25 -0
  35. package/dist/components/directional-shadow-filter.d.ts.map +1 -0
  36. package/dist/components/index.d.ts +2 -0
  37. package/dist/components/index.d.ts.map +1 -1
  38. package/dist/components/light-helpers.d.ts.map +1 -1
  39. package/dist/components/reflection-probe.d.ts +17 -0
  40. package/dist/components/reflection-probe.d.ts.map +1 -0
  41. package/dist/components/spot-light.d.ts +12 -0
  42. package/dist/components/spot-light.d.ts.map +1 -1
  43. package/dist/construct-renderer.mjs +8552 -1612
  44. package/dist/construct-renderer.mjs.map +1 -1
  45. package/dist/device/gpu-residency.d.ts +19 -2
  46. package/dist/device/gpu-residency.d.ts.map +1 -1
  47. package/dist/environment/frame.d.ts.map +1 -1
  48. package/dist/environment/lifecycle.d.ts +5 -0
  49. package/dist/environment/lifecycle.d.ts.map +1 -1
  50. package/dist/errors/render.d.ts +209 -93
  51. package/dist/errors/render.d.ts.map +1 -1
  52. package/dist/extract/directional-shadow-projection.d.ts +23 -0
  53. package/dist/extract/directional-shadow-projection.d.ts.map +1 -0
  54. package/dist/extract/environment.d.ts +14 -0
  55. package/dist/extract/environment.d.ts.map +1 -1
  56. package/dist/extract/visibility.d.ts.map +1 -1
  57. package/dist/features/fullscreen.d.ts.map +1 -1
  58. package/dist/features/targets.d.ts.map +1 -1
  59. package/dist/features/types.d.ts +10 -0
  60. package/dist/features/types.d.ts.map +1 -1
  61. package/dist/fullscreen-post-process-pass.d.ts +13 -2
  62. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  63. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  64. package/dist/gpu-driven/production-raster.d.ts +0 -1
  65. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  66. package/dist/gpu-scene.d.ts.map +1 -1
  67. package/dist/gpu-usage.d.ts +2 -0
  68. package/dist/gpu-usage.d.ts.map +1 -1
  69. package/dist/hdrp-buffers.d.ts +19 -17
  70. package/dist/hdrp-buffers.d.ts.map +1 -1
  71. package/dist/ibl/IblPipelineCache.d.ts +4 -0
  72. package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
  73. package/dist/ibl/kernel-cache.d.ts +36 -0
  74. package/dist/ibl/kernel-cache.d.ts.map +1 -0
  75. package/dist/index.d.ts +35 -4
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.mjs +4 -4
  78. package/dist/index.mjs.map +1 -1
  79. package/dist/inspection-types.d.ts +51 -0
  80. package/dist/inspection-types.d.ts.map +1 -1
  81. package/dist/instances-derived-bounds.d.ts +50 -0
  82. package/dist/instances-derived-bounds.d.ts.map +1 -0
  83. package/dist/internal.mjs +1 -1
  84. package/dist/light-buffer-layout.d.ts +30 -13
  85. package/dist/light-buffer-layout.d.ts.map +1 -1
  86. package/dist/mesh-material-bindings.d.ts +54 -0
  87. package/dist/mesh-material-bindings.d.ts.map +1 -1
  88. package/dist/pbr-pipeline.d.ts +20 -7
  89. package/dist/pbr-pipeline.d.ts.map +1 -1
  90. package/dist/pipeline/standard-forward-lane.d.ts +2 -1
  91. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  92. package/dist/pipeline/standard-lighting/errors.d.ts +4 -0
  93. package/dist/pipeline/standard-lighting/errors.d.ts.map +1 -0
  94. package/dist/pipeline/standard-lighting/graph.d.ts +24 -0
  95. package/dist/pipeline/standard-lighting/graph.d.ts.map +1 -0
  96. package/dist/pipeline/standard-lighting/inspection.d.ts +38 -0
  97. package/dist/pipeline/standard-lighting/inspection.d.ts.map +1 -0
  98. package/dist/pipeline/standard-lighting/layout.d.ts +28 -0
  99. package/dist/pipeline/standard-lighting/layout.d.ts.map +1 -0
  100. package/dist/pipeline/standard-lighting/light-frame.d.ts +33 -0
  101. package/dist/pipeline/standard-lighting/light-frame.d.ts.map +1 -0
  102. package/dist/pipeline/standard-lighting/membership.d.ts +14 -0
  103. package/dist/pipeline/standard-lighting/membership.d.ts.map +1 -0
  104. package/dist/pipeline/standard-lighting/prepare.d.ts +16 -0
  105. package/dist/pipeline/standard-lighting/prepare.d.ts.map +1 -0
  106. package/dist/pipeline/standard-lighting/topology.d.ts +45 -0
  107. package/dist/pipeline/standard-lighting/topology.d.ts.map +1 -0
  108. package/dist/pipeline/standard-lighting/transport.d.ts +36 -0
  109. package/dist/pipeline/standard-lighting/transport.d.ts.map +1 -0
  110. package/dist/pipeline/standard-pipeline.d.ts +4 -13
  111. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  112. package/dist/pipeline/standard-post.d.ts.map +1 -1
  113. package/dist/pipeline/standard-profile.d.ts +12 -20
  114. package/dist/pipeline/standard-profile.d.ts.map +1 -1
  115. package/dist/pipeline-spec.d.ts +40 -7
  116. package/dist/pipeline-spec.d.ts.map +1 -1
  117. package/dist/point-shadow-inspection.d.ts +21 -0
  118. package/dist/point-shadow-inspection.d.ts.map +1 -0
  119. package/dist/record/frame-lighting.d.ts +29 -32
  120. package/dist/record/frame-lighting.d.ts.map +1 -1
  121. package/dist/record/frame-snapshot.d.ts +65 -15
  122. package/dist/record/frame-snapshot.d.ts.map +1 -1
  123. package/dist/record/frame-targets.d.ts +5 -0
  124. package/dist/record/frame-targets.d.ts.map +1 -1
  125. package/dist/record/frame.d.ts +12 -5
  126. package/dist/record/frame.d.ts.map +1 -1
  127. package/dist/record/gpu-pass-timing/contract.d.ts +96 -0
  128. package/dist/record/gpu-pass-timing/contract.d.ts.map +1 -0
  129. package/dist/record/gpu-pass-timing/errors.d.ts +18 -0
  130. package/dist/record/gpu-pass-timing/errors.d.ts.map +1 -0
  131. package/dist/record/gpu-pass-timing/index.d.ts +8 -0
  132. package/dist/record/gpu-pass-timing/index.d.ts.map +1 -0
  133. package/dist/record/gpu-pass-timing/parser.d.ts +11 -0
  134. package/dist/record/gpu-pass-timing/parser.d.ts.map +1 -0
  135. package/dist/record/gpu-pass-timing/session.d.ts +43 -0
  136. package/dist/record/gpu-pass-timing/session.d.ts.map +1 -0
  137. package/dist/record/gpu-timing.d.ts +37 -0
  138. package/dist/record/gpu-timing.d.ts.map +1 -0
  139. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  140. package/dist/record/main-pass-material.d.ts +23 -2
  141. package/dist/record/main-pass-material.d.ts.map +1 -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/render-context.d.ts +48 -3
  146. package/dist/record/render-context.d.ts.map +1 -1
  147. package/dist/record/shadow-pass.d.ts.map +1 -1
  148. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  149. package/dist/record/typed-frame-graph.d.ts +81 -5
  150. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  151. package/dist/record/view-ubo.d.ts +7 -4
  152. package/dist/record/view-ubo.d.ts.map +1 -1
  153. package/dist/reflection/filter.d.ts +22 -0
  154. package/dist/reflection/filter.d.ts.map +1 -0
  155. package/dist/reflection/gpu-table.d.ts +25 -0
  156. package/dist/reflection/gpu-table.d.ts.map +1 -0
  157. package/dist/reflection/projection.d.ts +91 -0
  158. package/dist/reflection/projection.d.ts.map +1 -0
  159. package/dist/render-contract.d.ts +114 -7
  160. package/dist/render-contract.d.ts.map +1 -1
  161. package/dist/render-data.d.ts +10 -6
  162. package/dist/render-data.d.ts.map +1 -1
  163. package/dist/render-graph-primitives.d.ts +1 -0
  164. package/dist/render-graph-primitives.d.ts.map +1 -1
  165. package/dist/render-pipeline.d.ts +78 -2
  166. package/dist/render-pipeline.d.ts.map +1 -1
  167. package/dist/render-system-extract.d.ts +113 -20
  168. package/dist/render-system-extract.d.ts.map +1 -1
  169. package/dist/render-system.d.ts +24 -3
  170. package/dist/render-system.d.ts.map +1 -1
  171. package/dist/renderer-inspect.d.ts +29 -0
  172. package/dist/renderer-inspect.d.ts.map +1 -0
  173. package/dist/renderer.d.ts +43 -0
  174. package/dist/renderer.d.ts.map +1 -0
  175. package/dist/scene/render-scene.d.ts +14 -0
  176. package/dist/scene/render-scene.d.ts.map +1 -1
  177. package/dist/shadow-atlas.d.ts +3 -3
  178. package/dist/shadow-atlas.d.ts.map +1 -1
  179. package/dist/ssao-buffers.d.ts +3 -0
  180. package/dist/ssao-buffers.d.ts.map +1 -1
  181. package/dist/targets/contracts.d.ts +66 -0
  182. package/dist/targets/contracts.d.ts.map +1 -0
  183. package/dist/targets/graph-projection.d.ts +29 -0
  184. package/dist/targets/graph-projection.d.ts.map +1 -0
  185. package/dist/targets/material-source.d.ts +34 -0
  186. package/dist/targets/material-source.d.ts.map +1 -0
  187. package/dist/targets/owner.d.ts +32 -0
  188. package/dist/targets/owner.d.ts.map +1 -0
  189. package/dist/targets/physical.d.ts +18 -0
  190. package/dist/targets/physical.d.ts.map +1 -0
  191. package/dist/targets/readback.d.ts +39 -0
  192. package/dist/targets/readback.d.ts.map +1 -0
  193. package/dist/temporal/frame.d.ts +44 -0
  194. package/dist/temporal/frame.d.ts.map +1 -0
  195. package/dist/temporal/index.mjs +3 -3
  196. package/dist/typed-render-graph-primitives.d.ts +6 -1
  197. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  198. package/dist/typed-shadow-atlas.d.ts +10 -0
  199. package/dist/typed-shadow-atlas.d.ts.map +1 -0
  200. package/dist/typed-shadow-passes.d.ts +1 -1
  201. package/dist/typed-shadow-passes.d.ts.map +1 -1
  202. package/dist/volume/capability.d.ts +57 -0
  203. package/dist/volume/capability.d.ts.map +1 -0
  204. package/dist/volume/component.d.ts +61 -0
  205. package/dist/volume/component.d.ts.map +1 -0
  206. package/dist/volume/extract.d.ts +11 -0
  207. package/dist/volume/extract.d.ts.map +1 -0
  208. package/dist/volume/inspection.d.ts +38 -0
  209. package/dist/volume/inspection.d.ts.map +1 -0
  210. package/dist/volume/passes.d.ts +38 -0
  211. package/dist/volume/passes.d.ts.map +1 -0
  212. package/dist/volume/recovery.d.ts +38 -0
  213. package/dist/volume/recovery.d.ts.map +1 -0
  214. package/dist/volume/resources.d.ts +57 -0
  215. package/dist/volume/resources.d.ts.map +1 -0
  216. package/dist/volume/temporal.d.ts +35 -0
  217. package/dist/volume/temporal.d.ts.map +1 -0
  218. package/package.json +20 -20
  219. package/src/__tests__/bloom-exact-zero.unit.test.ts +48 -19
  220. package/src/__tests__/bloom-lifecycle.integration.test.ts +41 -13
  221. package/src/__tests__/camera-target-consumption.unit.test.ts +53 -0
  222. package/src/__tests__/cluster-binner.unit.test.ts +35 -0
  223. package/src/__tests__/cluster-grid-default-surface.unit.test.ts +7 -2
  224. package/src/__tests__/cube-camera-scheduler.unit.test.ts +70 -0
  225. package/src/__tests__/cube-camera-single-submit.perf.test.ts +75 -0
  226. package/src/__tests__/cube-camera-view-matrices.unit.test.ts +41 -0
  227. package/src/__tests__/cube-camera-vocabulary.unit.test.ts +47 -0
  228. package/src/__tests__/cube-camera.integration.test.ts +42 -0
  229. package/src/__tests__/device-feature-admission.unit.test.ts +73 -0
  230. package/src/__tests__/direct-light-snapshot.unit.test.ts +3 -3
  231. package/src/__tests__/docs-gate-green.unit.test.ts +38 -0
  232. package/src/__tests__/factory-contract.integration.test.ts +255 -29
  233. package/src/__tests__/fog-component.unit.test.ts +67 -0
  234. package/src/__tests__/fog.integration.test.ts +86 -0
  235. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +37 -0
  236. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +10 -9
  237. package/src/__tests__/gpu-driven-indirect-raster.dawn.test.ts +17 -1
  238. package/src/__tests__/gpu-driven-production.integration.test.ts +16 -17
  239. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +12 -4
  240. package/src/__tests__/gpu-pass-timing-browser-runner.ts +281 -0
  241. package/src/__tests__/gpu-pass-timing-coexistence.integration.test.ts +80 -0
  242. package/src/__tests__/gpu-pass-timing-contract.unit.test.ts +243 -0
  243. package/src/__tests__/gpu-pass-timing-exact-zero.unit.test.ts +131 -0
  244. package/src/__tests__/gpu-pass-timing-lifecycle.integration.test.ts +230 -0
  245. package/src/__tests__/gpu-pass-timing-observation.unit.test.ts +233 -0
  246. package/src/__tests__/gpu-pass-timing-session.unit.test.ts +438 -0
  247. package/src/__tests__/gpu-pass-timing.browser.test.ts +26 -0
  248. package/src/__tests__/gpu-pass-timing.rhi-null.unit.test.ts +125 -0
  249. package/src/__tests__/hdrp-group2-visibility.unit.test.ts +24 -0
  250. package/src/__tests__/instances-culling.integration.test.ts +94 -0
  251. package/src/__tests__/instances-derived-bounds.unit.test.ts +118 -0
  252. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +14 -14
  253. package/src/__tests__/material-observation.integration.test.ts +101 -0
  254. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +1 -1
  255. package/src/__tests__/pbr-view-layout.unit.test.ts +16 -0
  256. package/src/__tests__/point-shadow-inspection.unit.test.ts +60 -0
  257. package/src/__tests__/public-surface.test-d.ts +10 -0
  258. package/src/__tests__/reflection-probe-authoring.unit.test.ts +71 -0
  259. package/src/__tests__/reflection-probe-filter.unit.test.ts +54 -0
  260. package/src/__tests__/reflection-probe-ibl-topology.unit.test.ts +45 -0
  261. package/src/__tests__/reflection-probe-pass-encode.integration.test.ts +101 -0
  262. package/src/__tests__/reflection-probe-performance.perf.test.ts +60 -0
  263. package/src/__tests__/reflection-probe-recovery.integration.test.ts +55 -0
  264. package/src/__tests__/reflection-probe-selection.unit.test.ts +46 -0
  265. package/src/__tests__/render-error-code-owner.test-d.ts +23 -3
  266. package/src/__tests__/render-feature-docs.unit.test.ts +1 -1
  267. package/src/__tests__/render-target-admission.unit.test.ts +80 -0
  268. package/src/__tests__/render-target-graph-projection.unit.test.ts +102 -0
  269. package/src/__tests__/render-target-inspection.unit.test.ts +52 -0
  270. package/src/__tests__/render-target-material-source.test-d.ts +30 -0
  271. package/src/__tests__/render-target-material-source.unit.test.ts +97 -0
  272. package/src/__tests__/render-target-owner-placement.unit.test.ts +203 -0
  273. package/src/__tests__/render-target-owner.unit.test.ts +122 -0
  274. package/src/__tests__/render-target-probe-soak.perf.test.ts +94 -0
  275. package/src/__tests__/render-target-public-schema.json +107 -0
  276. package/src/__tests__/render-target-public-schema.unit.test.ts +91 -0
  277. package/src/__tests__/render-target-public-surface.test-d.ts +83 -0
  278. package/src/__tests__/render-target-readback.integration.test.ts +90 -0
  279. package/src/__tests__/render-target-recovery.integration.test.ts +85 -0
  280. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +76 -0
  281. package/src/__tests__/renderer-frame-transaction.integration.test.ts +1 -1
  282. package/src/__tests__/renderer-lifecycle.integration.test.ts +14 -0
  283. package/src/__tests__/shader-stage-surface.unit.test.ts +19 -4
  284. package/src/__tests__/skin-motion-regression.unit.test.ts +132 -0
  285. package/src/__tests__/skinned-shadow-caster.test.ts +32 -2
  286. package/src/__tests__/standard-cluster-capability.integration.test.ts +63 -0
  287. package/src/__tests__/standard-cluster-transport.unit.test.ts +121 -0
  288. package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +232 -0
  289. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +8 -5
  290. package/src/__tests__/standard-lighting-inspection.integration.test.ts +138 -0
  291. package/src/__tests__/standard-lighting-ssot.unit.test.ts +18 -0
  292. package/src/__tests__/standard-lighting-write.unit.test.ts +377 -0
  293. package/src/__tests__/standard-lighting.integration.test.ts +67 -0
  294. package/src/__tests__/standard-pipeline.dawn.test.ts +206 -5
  295. package/src/__tests__/standard-pipeline.integration.test.ts +181 -150
  296. package/src/__tests__/standard-probe-binding.unit.test.ts +25 -0
  297. package/src/__tests__/standard-profile-oracle.unit.test.ts +23 -36
  298. package/src/__tests__/typed-pipeline-topology.unit.test.ts +395 -14
  299. package/src/__tests__/urp-pipeline-targets.unit.test.ts +2 -2
  300. package/src/__tests__/visibility-resolver.unit.test.ts +15 -0
  301. package/src/__tests__/volume-optics-oracle.unit.test.ts +85 -0
  302. package/src/__tests__/volumetric-fog-budget-recovery.integration.test.ts +655 -0
  303. package/src/__tests__/volumetric-fog-component.unit.test.ts +71 -0
  304. package/src/__tests__/volumetric-fog-composite-stage-readback.dawn.test.ts +376 -0
  305. package/src/__tests__/volumetric-fog-errors.unit.test.ts +51 -0
  306. package/src/__tests__/volumetric-fog-inspection.unit.test.ts +77 -0
  307. package/src/__tests__/volumetric-fog-light-capability.unit.test.ts +19 -0
  308. package/src/__tests__/volumetric-fog-light-consumers.integration.test.ts +18 -0
  309. package/src/__tests__/volumetric-fog-light-errors.unit.test.ts +17 -0
  310. package/src/__tests__/volumetric-fog-light-topology.unit.test.ts +21 -0
  311. package/src/__tests__/volumetric-fog-light-transaction.integration.test.ts +53 -0
  312. package/src/__tests__/volumetric-fog-m9-watcher.integration.test.ts +27 -0
  313. package/src/__tests__/volumetric-fog-point-light-owner.integration.test.ts +44 -0
  314. package/src/__tests__/volumetric-fog-point-spot-accumulation.integration.test.ts +49 -0
  315. package/src/__tests__/volumetric-fog-point-spot-contract.unit.test.ts +28 -0
  316. package/src/__tests__/volumetric-fog-point-spot-lkg.integration.test.ts +65 -0
  317. package/src/__tests__/volumetric-fog-point-spot-selection.integration.test.ts +49 -0
  318. package/src/__tests__/volumetric-fog-point-spot-temporal.unit.test.ts +55 -0
  319. package/src/__tests__/volumetric-fog-projector-contract.unit.test.ts +22 -0
  320. package/src/__tests__/volumetric-fog-projector-inspection.unit.test.ts +12 -0
  321. package/src/__tests__/volumetric-fog-projector-surface-volume.integration.test.ts +11 -0
  322. package/src/__tests__/volumetric-fog-projector-transaction.integration.test.ts +26 -0
  323. package/src/__tests__/volumetric-fog-recovery.integration.test.ts +47 -0
  324. package/src/__tests__/volumetric-fog-selected-light-resolution.integration.test.ts +63 -0
  325. package/src/__tests__/volumetric-fog-spot-closure.integration.test.ts +26 -0
  326. package/src/__tests__/volumetric-fog-spot-contract.test-d.ts +21 -0
  327. package/src/__tests__/volumetric-fog-spot-contract.unit.test.ts +27 -0
  328. package/src/__tests__/volumetric-fog-spot-frame-optics.integration.test.ts +14 -0
  329. package/src/__tests__/volumetric-fog-spot-optics.integration.test.ts +29 -0
  330. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +550 -0
  331. package/src/__tests__/volumetric-fog-temporal-selected-light.unit.test.ts +33 -0
  332. package/src/__tests__/volumetric-fog-temporal.unit.test.ts +45 -0
  333. package/src/__tests__/volumetric-fog-topology.unit.test.ts +237 -0
  334. package/src/__tests__/volumetric-fog-transparent.integration.test.ts +27 -0
  335. package/src/assembly/device-feature-admission.ts +73 -0
  336. package/src/assembly/directional-shadow-inspection.ts +122 -0
  337. package/src/assembly/factory.ts +1093 -246
  338. package/src/assembly/host-contract.ts +25 -0
  339. package/src/assembly/render-target-host.ts +847 -0
  340. package/src/assets/asset-decoders.ts +1 -1
  341. package/src/assets/render-asset-port.ts +7 -1
  342. package/src/capture/cube-views.ts +69 -0
  343. package/src/capture/scheduler.ts +265 -0
  344. package/src/components/__tests__/schema-contract.unit.test.ts +12 -0
  345. package/src/components/__tests__/schema-parity.unit.test.ts +9 -0
  346. package/src/components/camera.ts +4 -0
  347. package/src/components/cube-camera.ts +52 -0
  348. package/src/components/directional-light.ts +22 -2
  349. package/src/components/directional-shadow-filter.ts +57 -0
  350. package/src/components/index.ts +2 -0
  351. package/src/components/light-helpers.ts +85 -7
  352. package/src/components/reflection-probe.ts +49 -0
  353. package/src/components/spot-light.ts +22 -3
  354. package/src/device/gpu-residency.ts +168 -58
  355. package/src/environment/frame.ts +6 -24
  356. package/src/environment/lifecycle.ts +12 -0
  357. package/src/errors/render.ts +405 -143
  358. package/src/extract/directional-shadow-projection.ts +61 -0
  359. package/src/extract/environment.ts +57 -0
  360. package/src/extract/visibility.ts +25 -1
  361. package/src/features/fullscreen.ts +3 -0
  362. package/src/features/targets.ts +4 -1
  363. package/src/features/types.ts +10 -0
  364. package/src/fullscreen-post-process-pass.ts +43 -2
  365. package/src/gpu-driven/batch-topology.ts +1 -0
  366. package/src/gpu-driven/production-raster.ts +1 -3
  367. package/src/gpu-scene.ts +8 -1
  368. package/src/gpu-usage.ts +2 -0
  369. package/src/hdrp-buffers.ts +165 -59
  370. package/src/ibl/IblPipelineCache.ts +11 -0
  371. package/src/ibl/kernel-cache.ts +88 -0
  372. package/src/index.ts +186 -1
  373. package/src/inspection-types.ts +56 -0
  374. package/src/instances-derived-bounds.ts +171 -0
  375. package/src/light-buffer-layout.ts +74 -26
  376. package/src/mesh-material-bindings.ts +132 -0
  377. package/src/pbr-pipeline.ts +139 -27
  378. package/src/pipeline/standard-forward-lane.ts +65 -15
  379. package/src/pipeline/standard-lighting/errors.ts +6 -0
  380. package/src/pipeline/standard-lighting/graph.ts +157 -0
  381. package/src/pipeline/standard-lighting/inspection.ts +88 -0
  382. package/src/pipeline/standard-lighting/layout.ts +31 -0
  383. package/src/pipeline/standard-lighting/light-frame.ts +34 -0
  384. package/src/pipeline/standard-lighting/membership.ts +43 -0
  385. package/src/pipeline/standard-lighting/prepare.ts +37 -0
  386. package/src/pipeline/standard-lighting/topology.ts +120 -0
  387. package/src/pipeline/standard-lighting/transport.ts +77 -0
  388. package/src/pipeline/standard-pipeline.ts +141 -192
  389. package/src/pipeline/standard-post.ts +26 -7
  390. package/src/pipeline/standard-profile.ts +23 -30
  391. package/src/pipeline-spec.ts +84 -21
  392. package/src/point-shadow-inspection.ts +55 -0
  393. package/src/record/__tests__/temporal-payload.unit.test.ts +42 -1
  394. package/src/record/__tests__/transparent-group2-selection.unit.test.ts +73 -0
  395. package/src/record/__tests__/view-ubo-layout.unit.test.ts +40 -0
  396. package/src/record/frame-lighting.ts +470 -516
  397. package/src/record/frame-snapshot.ts +76 -28
  398. package/src/record/frame-targets.ts +23 -2
  399. package/src/record/frame.ts +1169 -79
  400. package/src/record/gpu-pass-timing/contract.ts +180 -0
  401. package/src/record/gpu-pass-timing/errors.ts +34 -0
  402. package/src/record/gpu-pass-timing/index.ts +37 -0
  403. package/src/record/gpu-pass-timing/parser.ts +97 -0
  404. package/src/record/gpu-pass-timing/session.ts +938 -0
  405. package/src/record/gpu-timing.ts +233 -0
  406. package/src/record/main-pass-geometry.ts +120 -80
  407. package/src/record/main-pass-material.ts +101 -11
  408. package/src/record/main-pass-sprite-draws.ts +54 -25
  409. package/src/record/main-pass.ts +71 -15
  410. package/src/record/render-context.ts +77 -0
  411. package/src/record/shadow-pass.ts +104 -66
  412. package/src/record/skybox-post-pass.ts +20 -4
  413. package/src/record/typed-frame-graph.ts +1016 -32
  414. package/src/record/view-ubo.ts +63 -28
  415. package/src/reflection/filter.ts +81 -0
  416. package/src/reflection/gpu-table.ts +44 -0
  417. package/src/reflection/projection.ts +281 -0
  418. package/src/render-contract.ts +147 -4
  419. package/src/render-data.ts +50 -22
  420. package/src/render-graph-primitives.ts +9 -4
  421. package/src/render-pipeline.ts +161 -2
  422. package/src/render-system-extract.ts +886 -103
  423. package/src/render-system.ts +1174 -66
  424. package/src/renderer-inspect.ts +66 -0
  425. package/src/renderer.ts +222 -0
  426. package/src/scene/render-scene.ts +117 -9
  427. package/src/shadow-atlas.ts +5 -5
  428. package/src/ssao-buffers.ts +9 -2
  429. package/src/targets/contracts.ts +182 -0
  430. package/src/targets/graph-projection.ts +169 -0
  431. package/src/targets/material-source.ts +143 -0
  432. package/src/targets/owner.ts +214 -0
  433. package/src/targets/physical.ts +18 -0
  434. package/src/targets/readback.ts +153 -0
  435. package/src/temporal/frame.ts +128 -0
  436. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +61 -23
  437. package/src/typed-render-graph-primitives.ts +34 -2
  438. package/src/typed-shadow-atlas.ts +17 -0
  439. package/src/typed-shadow-passes.ts +47 -40
  440. package/src/volume/capability.ts +173 -0
  441. package/src/volume/component.ts +110 -0
  442. package/src/volume/extract.ts +21 -0
  443. package/src/volume/inspection.ts +78 -0
  444. package/src/volume/passes.ts +686 -0
  445. package/src/volume/recovery.ts +86 -0
  446. package/src/volume/resources.ts +236 -0
  447. package/src/volume/temporal.ts +89 -0
  448. package/dist/chunk-IPXCABEP.mjs.map +0 -1
  449. package/dist/chunk-LOSO4CTV.mjs.map +0 -1
  450. package/dist/chunk-RJRUS55L.mjs.map +0 -1
  451. package/dist/chunk-YTQ5C7YQ.mjs +0 -584
  452. package/dist/chunk-YTQ5C7YQ.mjs.map +0 -1
@@ -0,0 +1,61 @@
1
+ // @forgeax/engine-render - Directional CSM projection owner.
2
+
3
+ import type { DirectionalShadowQuality } from '../components/directional-shadow-filter';
4
+ import { directionalShadowQualityFromF32 } from '../components/directional-shadow-filter';
5
+
6
+ /** Light-space bounds produced by one existing orthographic CSM fit. */
7
+ export interface DirectionalShadowCascadeFit {
8
+ readonly split: number;
9
+ readonly minX: number;
10
+ readonly maxX: number;
11
+ readonly minY: number;
12
+ readonly maxY: number;
13
+ readonly minZ: number;
14
+ readonly maxZ: number;
15
+ }
16
+
17
+ /** Host projection sent to the shared View UBO. */
18
+ export interface DirectionalShadowProjection {
19
+ readonly splitPlanes: Float32Array;
20
+ readonly directionalShadowQuality: DirectionalShadowQuality;
21
+ }
22
+
23
+ /**
24
+ * Project accepted Directional author facts and the existing CSM fit into the
25
+ * shared split vec4 lanes. `.x` is the split, `.y` is world units per texel,
26
+ * `.z` is the light-space depth span, and `.w` is reserved for the ABI.
27
+ */
28
+ export function projectDirectionalShadow(
29
+ fits: readonly DirectionalShadowCascadeFit[],
30
+ mapSize: number,
31
+ shadowFilter: number,
32
+ shadowAngularRadius: number,
33
+ maxPenumbraTexels: number,
34
+ ): DirectionalShadowProjection | undefined {
35
+ if (!Number.isFinite(mapSize) || mapSize < 1) return undefined;
36
+ const directionalShadowQuality = directionalShadowQualityFromF32(
37
+ shadowFilter,
38
+ shadowAngularRadius,
39
+ maxPenumbraTexels,
40
+ );
41
+ if (directionalShadowQuality === undefined) return undefined;
42
+
43
+ const splitPlanes = new Float32Array(16);
44
+ for (let index = 0; index < fits.length && index < 4; index += 1) {
45
+ const fit = fits[index];
46
+ if (fit === undefined) continue;
47
+ const width = Math.abs(fit.maxX - fit.minX);
48
+ const height = Math.abs(fit.maxY - fit.minY);
49
+ const depth = Math.abs(fit.maxZ - fit.minZ);
50
+ const worldUnitsPerTexel = Math.max(width, height, Number.EPSILON) / mapSize;
51
+ const lightDepthWorldSpan = Math.max(depth, Number.EPSILON);
52
+ if (!Number.isFinite(worldUnitsPerTexel) || !Number.isFinite(lightDepthWorldSpan)) {
53
+ return undefined;
54
+ }
55
+ const lane = index * 4;
56
+ splitPlanes[lane] = fit.split;
57
+ splitPlanes[lane + 1] = worldUnitsPerTexel;
58
+ splitPlanes[lane + 2] = lightDepthWorldSpan;
59
+ }
60
+ return { splitPlanes, directionalShadowQuality };
61
+ }
@@ -76,6 +76,20 @@ export type EnvironmentSource =
76
76
 
77
77
  export interface FogFrame extends FogCandidate {}
78
78
 
79
+ export interface FogParameterIssue {
80
+ readonly field: string;
81
+ readonly value: number;
82
+ readonly expected: string;
83
+ }
84
+
85
+ /** Structured failure retained when an invalid Fog update falls back to LKG. */
86
+ export interface FogSelectionFailure {
87
+ readonly code: string;
88
+ readonly expected: string;
89
+ readonly hint: string;
90
+ readonly detail: Readonly<Record<string, unknown>>;
91
+ }
92
+
79
93
  export interface EnvironmentFrame {
80
94
  readonly source: EnvironmentSource;
81
95
  /** Descriptor of the real environment resource adopted for this frame. */
@@ -103,6 +117,49 @@ function freezeFog(candidate: FogCandidate): FogFrame {
103
117
  });
104
118
  }
105
119
 
120
+ /** Validate the bounded Fog domain once for every frame-selection producer. */
121
+ export function validateFogParameters(candidate: FogCandidate): FogParameterIssue | undefined {
122
+ if (candidate.color.length !== 3) {
123
+ return {
124
+ field: 'color',
125
+ value: candidate.color.length,
126
+ expected: 'exactly three finite channels in [0, 1]',
127
+ };
128
+ }
129
+ for (let index = 0; index < candidate.color.length; index += 1) {
130
+ const value = candidate.color[index];
131
+ if (value === undefined || !Number.isFinite(value) || value < 0 || value > 1) {
132
+ return {
133
+ field: `color[${index}]`,
134
+ value: value ?? Number.NaN,
135
+ expected: 'a finite number in [0, 1]',
136
+ };
137
+ }
138
+ }
139
+ if (!Number.isFinite(candidate.density) || candidate.density < 0) {
140
+ return { field: 'density', value: candidate.density, expected: 'a finite number >= 0' };
141
+ }
142
+ if (!Number.isFinite(candidate.heightFalloff) || candidate.heightFalloff < 0) {
143
+ return {
144
+ field: 'heightFalloff',
145
+ value: candidate.heightFalloff,
146
+ expected: 'a finite number >= 0',
147
+ };
148
+ }
149
+ if (
150
+ !Number.isFinite(candidate.maxOpacity) ||
151
+ candidate.maxOpacity < 0 ||
152
+ candidate.maxOpacity > 1
153
+ ) {
154
+ return {
155
+ field: 'maxOpacity',
156
+ value: candidate.maxOpacity,
157
+ expected: 'a finite number in [0, 1]',
158
+ };
159
+ }
160
+ return undefined;
161
+ }
162
+
106
163
  function freezeAtmosphere(parameters: AtmosphereParameters): AtmosphereParameters {
107
164
  return Object.freeze({ ...parameters });
108
165
  }
@@ -1,4 +1,5 @@
1
1
  import type { EntityHandle, World } from '@forgeax/engine-ecs';
2
+ import { createWorldProjection } from '@forgeax/engine-ecs/projection';
2
3
  import {
3
4
  projectHierarchy,
4
5
  type SceneHierarchyDiagnostic,
@@ -37,6 +38,14 @@ interface ResolutionState {
37
38
  readonly source: VisibilitySource;
38
39
  }
39
40
 
41
+ interface VisibilityCacheEntry {
42
+ readonly changes: ReturnType<typeof createWorldProjection>;
43
+ readonly hierarchy: SceneHierarchySnapshot;
44
+ readonly snapshot: VisibilitySnapshot;
45
+ }
46
+
47
+ const VISIBILITY_CACHE = new WeakMap<World, VisibilityCacheEntry>();
48
+
40
49
  /**
41
50
  * Resolve author intent against the scene-owned valid parent projection.
42
51
  * Diagnostics are preserved for callers to repair hierarchy input before retry.
@@ -45,6 +54,19 @@ export function resolveVisibility(
45
54
  world: World,
46
55
  hierarchy: SceneHierarchySnapshot = projectHierarchy(world),
47
56
  ): VisibilitySnapshot {
57
+ const cached = VISIBILITY_CACHE.get(world);
58
+ const changes = cached?.changes ?? createWorldProjection(world, { components: [Visibility] });
59
+ if (cached !== undefined) {
60
+ const evidence = changes.poll();
61
+ if (
62
+ evidence.status === 'delta' &&
63
+ evidence.changes.length === 0 &&
64
+ cached.hierarchy === hierarchy
65
+ ) {
66
+ return cached.snapshot;
67
+ }
68
+ }
69
+
48
70
  // Visibility is an opt-in component. Query only the owning archetypes
49
71
  // instead of walking every Entity row with an optional column; the latter
50
72
  // made a World with no visibility intents pay a full-scene scan on each
@@ -123,7 +145,7 @@ export function resolveVisibility(
123
145
  };
124
146
  };
125
147
 
126
- return {
148
+ const snapshot: VisibilitySnapshot = {
127
149
  diagnostics: hierarchy.diagnostics,
128
150
  hasAnyIntent: intentCount > 0,
129
151
  hasAnyHiddenIntent,
@@ -136,4 +158,6 @@ export function resolveVisibility(
136
158
  return resolveEntity?.(entity)?.effective ?? 'visible';
137
159
  },
138
160
  };
161
+ VISIBILITY_CACHE.set(world, { changes, hierarchy, snapshot });
162
+ return snapshot;
139
163
  }
@@ -28,6 +28,9 @@ export function createFullscreenRenderFeature(
28
28
  const resourceName = `fullscreen.${options.identity.replace(/[^a-z0-9.-]/gi, '-').toLowerCase()}`;
29
29
  return Object.freeze({
30
30
  identity: options.identity,
31
+ requiredFullscreenPostProcesses: Object.freeze([
32
+ Object.freeze({ identity: options.identity, source: options.source }),
33
+ ]),
31
34
  extract: (_context: RenderFeatureExtractContext) => ok(undefined),
32
35
  plan: (_data: undefined, _context: RenderFeaturePlanContext) =>
33
36
  ok({
@@ -57,8 +57,11 @@ export function resolveStandardRenderFeatureTargets(input: {
57
57
  readonly colorAttachmentFormat: TextureFormat;
58
58
  }): readonly RenderFeatureTargetHandle[] {
59
59
  const sampleCount: 1 | 4 = input.antialias === 'msaa' && input.multisample ? 4 : 1;
60
+ // Standard always exposes the scene to features as a linear float target;
61
+ // the shared Output Transform owns the eventual RGBA8 write for every
62
+ // antialias mode, including no-AA/WebGL2.
60
63
  const linearLdr =
61
- (input.tonemap === 'none' && input.storageBuffer) ||
64
+ input.tonemap === 'none' ||
62
65
  input.antialias === 'fxaa' ||
63
66
  (input.antialias === 'msaa' && input.multisample);
64
67
  const colorFormat =
@@ -98,6 +98,16 @@ export interface RenderFeature<FrameData> {
98
98
  * the same lazy module cache used by prepared graphics.
99
99
  */
100
100
  readonly requiredMaterialShaders?: readonly string[];
101
+ /**
102
+ * Fullscreen program sources that must be module-ready before the first
103
+ * frame. The renderer seeds the same lazy post-process module cache used by
104
+ * the typed graph, so a synchronous frame driver cannot observe a cleared
105
+ * target while a boot-installed effect is compiling.
106
+ */
107
+ readonly requiredFullscreenPostProcesses?: readonly {
108
+ readonly identity: string;
109
+ readonly source: string;
110
+ }[];
101
111
  extract(context: RenderFeatureExtractContext): Result<FrameData, RenderError>;
102
112
  plan(data: FrameData, context: RenderFeaturePlanContext): Result<RenderFeaturePlan, RenderError>;
103
113
  }
@@ -67,7 +67,8 @@ export type PostProcessReadSampleType = 'depth';
67
67
  * no paramSchema (params are passed inline via a {type, value} struct — plan-strategy D-4).
68
68
  *
69
69
  * `params` carries the WGSL struct definition + default value. When `params` is
70
- * `undefined`, the post-process shader has no UBO (e.g. FXAA — Finding M2-1).
70
+ * `undefined`, the post-process shader has no params UBO. Special graph-owned
71
+ * passes such as FXAA may still register an internal policy UBO separately.
71
72
  *
72
73
  * `reads` declares graph resource keys this pass samples as input texture(s).
73
74
  * If omitted, the pass samples the swap-chain color attachment (default path).
@@ -81,7 +82,7 @@ export interface PostProcessShaderEntry {
81
82
  /** Composed WGSL source for the fragment stage (post-naga_oil). */
82
83
  readonly source: string;
83
84
  /**
84
- * Params UBO schema. When undefined, the shader has no uniform buffer (e.g. FXAA)
85
+ * Params UBO schema. When undefined, the generic shader has no uniform buffer
85
86
  * and the BGL degrades to 2 entries (texture@0 + sampler@1). When present, the
86
87
  * primitive eager-creates a params UBO (at register, sized `byteSize`) and binds
87
88
  * it at bindgroup(1) binding(2) as part of a 3-entry BGL
@@ -104,6 +105,46 @@ export interface PostProcessShaderEntry {
104
105
  readonly reads?: readonly (string | PostProcessReadEntry)[] | undefined;
105
106
  }
106
107
 
108
+ function postProcessSourceDigest(source: string): string {
109
+ let first = 0x811c9dc5;
110
+ let second = 0x9e3779b9;
111
+ for (let index = 0; index < source.length; index += 1) {
112
+ const code = source.charCodeAt(index);
113
+ first = Math.imul(first ^ code, 0x01000193);
114
+ second = Math.imul(second ^ (code + index), 0x01000193);
115
+ }
116
+ return `${source.length.toString(16)}-${(first >>> 0).toString(16).padStart(8, '0')}-${(second >>> 0).toString(16).padStart(8, '0')}`;
117
+ }
118
+
119
+ /** Content-addressed PSO label shared by the post-process pipeline factory. */
120
+ export function postProcessShaderPipelineLabel(identity: string, source: string): string {
121
+ return `post-process-${identity}-pso-${postProcessSourceDigest(source)}`;
122
+ }
123
+
124
+ /** Content-addressed shader-module label shared by prewarm and lazy paths. */
125
+ export function postProcessShaderModuleLabel(identity: string, source: string): string {
126
+ return `${postProcessShaderPipelineLabel(identity, source)}-module`;
127
+ }
128
+
129
+ /**
130
+ * Stable declaration identity used by graph admission and the renderer's
131
+ * device-bound pipeline cache. Shader source, bind-group-affecting params,
132
+ * and graph reads must move together when a feature reuses its identity.
133
+ */
134
+ export function postProcessShaderEntrySignature(entry: PostProcessShaderEntry): string {
135
+ return JSON.stringify({
136
+ source: entry.source,
137
+ params:
138
+ entry.params === undefined
139
+ ? undefined
140
+ : {
141
+ byteSize: entry.params.byteSize,
142
+ defaultValue: Array.from(entry.params.defaultValue),
143
+ },
144
+ reads: entry.reads,
145
+ });
146
+ }
147
+
107
148
  /** Whether a feature binding opts into the temporal multi-read contract. */
108
149
  export function isTemporalFullscreenBinding(values: Readonly<Record<string, unknown>>): boolean {
109
150
  return (
@@ -53,6 +53,7 @@ function eligibleKeys(slot: RenderSceneSlot): readonly GpuDrivenBatchKey[] {
53
53
  if (
54
54
  draws === undefined ||
55
55
  draws.length === 0 ||
56
+ snapshot.instances?.instanceCount === 0 ||
56
57
  snapshot.localAabb === undefined ||
57
58
  snapshot.skin !== undefined ||
58
59
  snapshot.spriteInstances !== undefined
@@ -427,7 +427,6 @@ export class GpuDrivenProduction {
427
427
  readonly meshes: ReadonlyMap<number, MeshGpuHandles>;
428
428
  readonly viewBindGroupLayout: BindGroupLayout;
429
429
  readonly meshResidencyEpoch: number;
430
- readonly hdrp: boolean;
431
430
  }): Result<PreparedGpuDrivenFrame | undefined, RhiError> {
432
431
  this.gpuOwnedSnapshotsMaterialized = 0;
433
432
  this.filteredPlanBuilds = 0;
@@ -435,7 +434,6 @@ export class GpuDrivenProduction {
435
434
  this.validatedGpuOwnedRows = 0;
436
435
  this.cpuFallbackDrawItems = 0;
437
436
  if (
438
- input.hdrp ||
439
437
  input.scene === undefined ||
440
438
  !this.device.caps.compute ||
441
439
  !this.device.caps.storageBuffer ||
@@ -611,7 +609,7 @@ export class GpuDrivenProduction {
611
609
  // shared by the GPU-driven raster pipeline, so even rigid draws
612
610
  // must provide the binding-10 offset (zero selects the frame
613
611
  // default slot).
614
- pass.setBindGroup(0, viewBindGroup, [0]);
612
+ pass.setBindGroup(0, viewBindGroup, [0, 0]);
615
613
  let currentPipeline: RenderPipeline | undefined;
616
614
  let currentVertex: GraphBuffer | undefined;
617
615
  let currentIndex: GraphBuffer | undefined;
package/src/gpu-scene.ts CHANGED
@@ -633,7 +633,14 @@ export class GpuScene {
633
633
  record: RenderSceneSlot,
634
634
  writes: Record<GpuSceneTableName, number[]>,
635
635
  ): void {
636
- const instanceCount = Math.max(1, record.snapshot.instances?.instanceCount ?? 1);
636
+ // A present Instances component is authoritative even when its array is
637
+ // empty: preserve zero so neither the GPU Scene nor the indirect topology
638
+ // turns it into a synthetic identity instance. Entities without the
639
+ // component retain the ordinary one-instance identity path.
640
+ const instanceCount =
641
+ record.snapshot.instances === undefined
642
+ ? 1
643
+ : Math.max(0, Math.floor(record.snapshot.instances.instanceCount));
637
644
  const drawCount = Math.max(1, record.snapshot.gpuDrivenDraws?.length ?? 0);
638
645
  const materialCount = Math.max(1, record.snapshot.materials.length);
639
646
  const existing = this.allocations.get(record.slot);
package/src/gpu-usage.ts CHANGED
@@ -12,3 +12,5 @@ export const GPU_BUFFER_USAGE_UNIFORM = 0x40;
12
12
  export const GPU_BUFFER_USAGE_STORAGE = 0x80;
13
13
  export const GPU_BUFFER_USAGE_INDIRECT = 0x100;
14
14
  export const GPU_BUFFER_USAGE_MAP_READ = 0x01;
15
+ /** GPUBufferUsage.QUERY_RESOLVE, used by optional timestamp captures. */
16
+ export const GPU_BUFFER_USAGE_QUERY_RESOLVE = 0x200;