@forgeax/engine-render 0.1.28 → 0.1.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (642) hide show
  1. package/README.md +627 -124
  2. package/dist/assembly/atmosphere-shader-prewarm.d.ts +6 -0
  3. package/dist/assembly/atmosphere-shader-prewarm.d.ts.map +1 -0
  4. package/dist/assembly/dynamic-geometry-host.d.ts +21 -0
  5. package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -1
  6. package/dist/assembly/dynamic-geometry-runtime.d.ts +20 -0
  7. package/dist/assembly/dynamic-geometry-runtime.d.ts.map +1 -0
  8. package/dist/assembly/factory.d.ts +3 -1
  9. package/dist/assembly/factory.d.ts.map +1 -1
  10. package/dist/assembly/gpu-driven-owner.d.ts +10 -0
  11. package/dist/assembly/gpu-driven-owner.d.ts.map +1 -0
  12. package/dist/assembly/host-contract.d.ts +8 -0
  13. package/dist/assembly/host-contract.d.ts.map +1 -1
  14. package/dist/assembly/material/assembly.d.ts +7 -0
  15. package/dist/assembly/material/assembly.d.ts.map +1 -1
  16. package/dist/assembly/material-shader-policy.d.ts +3 -1
  17. package/dist/assembly/material-shader-policy.d.ts.map +1 -1
  18. package/dist/assembly/recovery/failure-location.d.ts +12 -0
  19. package/dist/assembly/recovery/failure-location.d.ts.map +1 -0
  20. package/dist/assembly/recovery/renderer-recover.d.ts +6 -4
  21. package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
  22. package/dist/assembly/renderer-facade.d.ts.map +1 -1
  23. package/dist/assembly/renderer-feature-inspection.d.ts +5 -0
  24. package/dist/assembly/renderer-feature-inspection.d.ts.map +1 -0
  25. package/dist/assembly/renderer-frame-transaction.d.ts +19 -0
  26. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
  27. package/dist/assembly/renderer-helpers.d.ts +3 -0
  28. package/dist/assembly/renderer-helpers.d.ts.map +1 -1
  29. package/dist/assembly/renderer-inspection.d.ts +4 -0
  30. package/dist/assembly/renderer-inspection.d.ts.map +1 -1
  31. package/dist/assembly/shader-prewarm-policy.d.ts +6 -0
  32. package/dist/assembly/shader-prewarm-policy.d.ts.map +1 -1
  33. package/dist/assembly/skin-palette-owner.d.ts +8 -0
  34. package/dist/assembly/skin-palette-owner.d.ts.map +1 -0
  35. package/dist/assembly/ssr-shader-prewarm.d.ts +6 -0
  36. package/dist/assembly/ssr-shader-prewarm.d.ts.map +1 -0
  37. package/dist/assembly/webgpu-device-loss.d.ts +15 -0
  38. package/dist/assembly/webgpu-device-loss.d.ts.map +1 -0
  39. package/dist/assembly/webgpu-pbr-ready.d.ts +38 -0
  40. package/dist/assembly/webgpu-pbr-ready.d.ts.map +1 -0
  41. package/dist/assembly/webgpu-ready-mipmap.d.ts +11 -0
  42. package/dist/assembly/webgpu-ready-mipmap.d.ts.map +1 -0
  43. package/dist/assembly/webgpu-ready.d.ts +7 -3
  44. package/dist/assembly/webgpu-ready.d.ts.map +1 -1
  45. package/dist/assembly/webgpu-renderer-bootstrap.d.ts +10 -0
  46. package/dist/assembly/webgpu-renderer-bootstrap.d.ts.map +1 -0
  47. package/dist/assembly/webgpu-renderer-contract.d.ts +62 -0
  48. package/dist/assembly/webgpu-renderer-contract.d.ts.map +1 -0
  49. package/dist/assembly/webgpu-renderer-guards.d.ts +9 -0
  50. package/dist/assembly/webgpu-renderer-guards.d.ts.map +1 -0
  51. package/dist/assembly/webgpu-renderer-observation.d.ts +6 -0
  52. package/dist/assembly/webgpu-renderer-observation.d.ts.map +1 -0
  53. package/dist/assembly/webgpu-renderer-recovery-failure.d.ts +12 -0
  54. package/dist/assembly/webgpu-renderer-recovery-failure.d.ts.map +1 -0
  55. package/dist/assembly/webgpu-renderer.d.ts +7 -141
  56. package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
  57. package/dist/assembly/webgpu-vertex-layouts.d.ts +28 -84
  58. package/dist/assembly/webgpu-vertex-layouts.d.ts.map +1 -1
  59. package/dist/authoring.mjs +2 -2
  60. package/dist/{chunk-JAASCMXA.mjs → chunk-33XZFTQU.mjs} +245 -39
  61. package/dist/chunk-33XZFTQU.mjs.map +1 -0
  62. package/dist/{chunk-GF523LHF.mjs → chunk-BLXGONR2.mjs} +30 -12
  63. package/dist/chunk-BLXGONR2.mjs.map +1 -0
  64. package/dist/{chunk-J52NMQKR.mjs → chunk-BQVQOQJH.mjs} +1086 -838
  65. package/dist/chunk-BQVQOQJH.mjs.map +1 -0
  66. package/dist/{chunk-IQMKJLNU.mjs → chunk-BTWH7BP4.mjs} +386 -17
  67. package/dist/chunk-BTWH7BP4.mjs.map +1 -0
  68. package/dist/{chunk-MBU4ZVE7.mjs → chunk-FUODTTIA.mjs} +3921 -671
  69. package/dist/chunk-FUODTTIA.mjs.map +1 -0
  70. package/dist/{chunk-MYJ5RPJO.mjs → chunk-JQTSEI3Z.mjs} +3 -3
  71. package/dist/{chunk-MYJ5RPJO.mjs.map → chunk-JQTSEI3Z.mjs.map} +1 -1
  72. package/dist/{chunk-GE3SDD72.mjs → chunk-NICXSHAT.mjs} +16 -38
  73. package/dist/chunk-NICXSHAT.mjs.map +1 -0
  74. package/dist/{chunk-J6KACNOH.mjs → chunk-NRNXBLIJ.mjs} +577 -7
  75. package/dist/chunk-NRNXBLIJ.mjs.map +1 -0
  76. package/dist/{chunk-RBDBZ5R7.mjs → chunk-PA5DRJNI.mjs} +2 -2
  77. package/dist/chunk-PA5DRJNI.mjs.map +1 -0
  78. package/dist/{chunk-VSL23LZE.mjs → chunk-S4DNKQYQ.mjs} +1117 -445
  79. package/dist/chunk-S4DNKQYQ.mjs.map +1 -0
  80. package/dist/components/camera.d.ts +62 -2
  81. package/dist/components/camera.d.ts.map +1 -1
  82. package/dist/components/index.d.ts +1 -0
  83. package/dist/components/index.d.ts.map +1 -1
  84. package/dist/components/instances.d.ts +6 -20
  85. package/dist/components/instances.d.ts.map +1 -1
  86. package/dist/components/scene-instance.d.ts +2 -1
  87. package/dist/components/scene-instance.d.ts.map +1 -1
  88. package/dist/components/screen-space-reflection.d.ts +14 -0
  89. package/dist/components/screen-space-reflection.d.ts.map +1 -0
  90. package/dist/construct-renderer.mjs +12888 -7025
  91. package/dist/construct-renderer.mjs.map +1 -1
  92. package/dist/device/gpu-residency.d.ts +1 -12
  93. package/dist/device/gpu-residency.d.ts.map +1 -1
  94. package/dist/environment/background.d.ts +6 -0
  95. package/dist/environment/background.d.ts.map +1 -0
  96. package/dist/errors/gpu-driven.d.ts +6 -3
  97. package/dist/errors/gpu-driven.d.ts.map +1 -1
  98. package/dist/errors/render.d.ts +7 -4
  99. package/dist/errors/render.d.ts.map +1 -1
  100. package/dist/extract/camera.d.ts.map +1 -1
  101. package/dist/extract/gpu-driven.d.ts +33 -3
  102. package/dist/extract/gpu-driven.d.ts.map +1 -1
  103. package/dist/features/host.d.ts +23 -1
  104. package/dist/features/host.d.ts.map +1 -1
  105. package/dist/features/noise-texture.d.ts +17 -0
  106. package/dist/features/noise-texture.d.ts.map +1 -0
  107. package/dist/features/plan.d.ts +83 -2
  108. package/dist/features/plan.d.ts.map +1 -1
  109. package/dist/features/prepared-gpu-work.d.ts +37 -4
  110. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  111. package/dist/features/prepared-graphics-store.d.ts.map +1 -1
  112. package/dist/features/prepared-graphics.d.ts +5 -0
  113. package/dist/features/prepared-graphics.d.ts.map +1 -1
  114. package/dist/features/render-graph-compute.d.ts +5 -3
  115. package/dist/features/render-graph-compute.d.ts.map +1 -1
  116. package/dist/features/render-graph-contribution.d.ts +11 -3
  117. package/dist/features/render-graph-contribution.d.ts.map +1 -1
  118. package/dist/features/render-graph-raster.d.ts +19 -3
  119. package/dist/features/render-graph-raster.d.ts.map +1 -1
  120. package/dist/features/types.d.ts +11 -0
  121. package/dist/features/types.d.ts.map +1 -1
  122. package/dist/fullscreen-post-process-pass.d.ts +2 -0
  123. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  124. package/dist/gpu-driven/batch-topology.d.ts +34 -1
  125. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  126. package/dist/gpu-driven/pbr-program.d.ts +10 -0
  127. package/dist/gpu-driven/pbr-program.d.ts.map +1 -0
  128. package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
  129. package/dist/gpu-driven/production-raster.d.ts +144 -23
  130. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  131. package/dist/gpu-driven/shadow-views.d.ts +126 -0
  132. package/dist/gpu-driven/shadow-views.d.ts.map +1 -0
  133. package/dist/gpu-driven/view-gpu.d.ts +18 -2
  134. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  135. package/dist/gpu-scene-schema.d.ts +2 -8
  136. package/dist/gpu-scene-schema.d.ts.map +1 -1
  137. package/dist/gpu-scene.d.ts +14 -0
  138. package/dist/gpu-scene.d.ts.map +1 -1
  139. package/dist/gpu-texture-usage.d.ts +1 -0
  140. package/dist/gpu-texture-usage.d.ts.map +1 -1
  141. package/dist/hdrp-buffers.d.ts +6 -0
  142. package/dist/hdrp-buffers.d.ts.map +1 -1
  143. package/dist/ibl/frame-resources.d.ts +8 -0
  144. package/dist/ibl/frame-resources.d.ts.map +1 -0
  145. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  146. package/dist/index.d.ts +18 -8
  147. package/dist/index.d.ts.map +1 -1
  148. package/dist/index.mjs +8 -8
  149. package/dist/inspection-types.d.ts +164 -0
  150. package/dist/inspection-types.d.ts.map +1 -1
  151. package/dist/instances-derived-bounds.d.ts +11 -0
  152. package/dist/instances-derived-bounds.d.ts.map +1 -1
  153. package/dist/instances.d.ts +89 -44
  154. package/dist/instances.d.ts.map +1 -1
  155. package/dist/internal.d.ts +3 -0
  156. package/dist/internal.d.ts.map +1 -1
  157. package/dist/internal.mjs +117 -9
  158. package/dist/internal.mjs.map +1 -1
  159. package/dist/lifecycle.d.ts +2 -1
  160. package/dist/lifecycle.d.ts.map +1 -1
  161. package/dist/material-row.d.ts +5 -0
  162. package/dist/material-row.d.ts.map +1 -0
  163. package/dist/materials.d.ts +15 -0
  164. package/dist/materials.d.ts.map +1 -1
  165. package/dist/pbr-pipeline.d.ts +21 -5
  166. package/dist/pbr-pipeline.d.ts.map +1 -1
  167. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  168. package/dist/pipeline/standard-output/auto-exposure/capability.d.ts +12 -0
  169. package/dist/pipeline/standard-output/auto-exposure/capability.d.ts.map +1 -0
  170. package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts +70 -0
  171. package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts.map +1 -0
  172. package/dist/pipeline/standard-output/auto-exposure/graph.d.ts +75 -0
  173. package/dist/pipeline/standard-output/auto-exposure/graph.d.ts.map +1 -0
  174. package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts +111 -0
  175. package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts.map +1 -0
  176. package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts +16 -0
  177. package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts.map +1 -0
  178. package/dist/pipeline/standard-output/auto-exposure/preset.d.ts +14 -0
  179. package/dist/pipeline/standard-output/auto-exposure/preset.d.ts.map +1 -0
  180. package/dist/pipeline/standard-output/auto-exposure/state.d.ts +46 -0
  181. package/dist/pipeline/standard-output/auto-exposure/state.d.ts.map +1 -0
  182. package/dist/pipeline/standard-output/color-transform.d.ts +27 -0
  183. package/dist/pipeline/standard-output/color-transform.d.ts.map +1 -0
  184. package/dist/pipeline/standard-output/graph.d.ts +15 -0
  185. package/dist/pipeline/standard-output/graph.d.ts.map +1 -0
  186. package/dist/pipeline/standard-output/lut-admission.d.ts +29 -0
  187. package/dist/pipeline/standard-output/lut-admission.d.ts.map +1 -0
  188. package/dist/pipeline/standard-output/lut-gpu.d.ts +48 -0
  189. package/dist/pipeline/standard-output/lut-gpu.d.ts.map +1 -0
  190. package/dist/pipeline/standard-output/lut-state.d.ts +68 -0
  191. package/dist/pipeline/standard-output/lut-state.d.ts.map +1 -0
  192. package/dist/pipeline/standard-output/resources.d.ts +10 -0
  193. package/dist/pipeline/standard-output/resources.d.ts.map +1 -0
  194. package/dist/pipeline/standard-output/types.d.ts +39 -0
  195. package/dist/pipeline/standard-output/types.d.ts.map +1 -0
  196. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  197. package/dist/pipeline/standard-post.d.ts +2 -2
  198. package/dist/pipeline/standard-post.d.ts.map +1 -1
  199. package/dist/pipeline-builder.d.ts +2 -1
  200. package/dist/pipeline-builder.d.ts.map +1 -1
  201. package/dist/pipeline-spec-types.d.ts +4 -0
  202. package/dist/pipeline-spec-types.d.ts.map +1 -1
  203. package/dist/pipeline-spec.d.ts +1 -9
  204. package/dist/pipeline-spec.d.ts.map +1 -1
  205. package/dist/points-lines/standard-owner.d.ts +1 -1
  206. package/dist/points-lines/standard-owner.d.ts.map +1 -1
  207. package/dist/prepare/prepared-graphics-resolver.d.ts +6 -1
  208. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
  209. package/dist/record/dynamic-geometry-consumption.d.ts +15 -0
  210. package/dist/record/dynamic-geometry-consumption.d.ts.map +1 -0
  211. package/dist/record/frame-lighting.d.ts +3 -3
  212. package/dist/record/frame-lighting.d.ts.map +1 -1
  213. package/dist/record/frame-snapshot.d.ts +106 -5
  214. package/dist/record/frame-snapshot.d.ts.map +1 -1
  215. package/dist/record/frame-targets.d.ts.map +1 -1
  216. package/dist/record/frame.d.ts +39 -4
  217. package/dist/record/frame.d.ts.map +1 -1
  218. package/dist/record/main-pass-geometry.d.ts +7 -8
  219. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  220. package/dist/record/main-pass-material.d.ts +38 -1
  221. package/dist/record/main-pass-material.d.ts.map +1 -1
  222. package/dist/record/main-pass-sprite-draws.d.ts +2 -10
  223. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  224. package/dist/record/main-pass.d.ts +12 -2
  225. package/dist/record/main-pass.d.ts.map +1 -1
  226. package/dist/record/mesh-ssbo.d.ts +15 -6
  227. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  228. package/dist/record/prepared-material-bindings.d.ts +19 -0
  229. package/dist/record/prepared-material-bindings.d.ts.map +1 -0
  230. package/dist/record/recovery-pipeline.d.ts +2 -9
  231. package/dist/record/recovery-pipeline.d.ts.map +1 -1
  232. package/dist/record/render-context.d.ts +74 -26
  233. package/dist/record/render-context.d.ts.map +1 -1
  234. package/dist/record/shadow-pass.d.ts +62 -7
  235. package/dist/record/shadow-pass.d.ts.map +1 -1
  236. package/dist/record/skybox-post-pass.d.ts +1 -1
  237. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  238. package/dist/record/typed-frame-graph.d.ts +35 -7
  239. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  240. package/dist/record/view-ubo.d.ts +1 -0
  241. package/dist/record/view-ubo.d.ts.map +1 -1
  242. package/dist/recovery/render-system-candidate.d.ts +10 -2
  243. package/dist/recovery/render-system-candidate.d.ts.map +1 -1
  244. package/dist/recovery/render-system-roots.d.ts +11 -0
  245. package/dist/recovery/render-system-roots.d.ts.map +1 -0
  246. package/dist/recovery/types.d.ts +76 -0
  247. package/dist/recovery/types.d.ts.map +1 -0
  248. package/dist/reflection/record-owner.d.ts +0 -2
  249. package/dist/reflection/record-owner.d.ts.map +1 -1
  250. package/dist/render-contract.d.ts +173 -30
  251. package/dist/render-contract.d.ts.map +1 -1
  252. package/dist/render-graph-primitives.d.ts +1 -0
  253. package/dist/render-graph-primitives.d.ts.map +1 -1
  254. package/dist/render-pipeline.d.ts +64 -5
  255. package/dist/render-pipeline.d.ts.map +1 -1
  256. package/dist/render-system-extract-tail.d.ts +7 -5
  257. package/dist/render-system-extract-tail.d.ts.map +1 -1
  258. package/dist/render-system-extract.d.ts +101 -41
  259. package/dist/render-system-extract.d.ts.map +1 -1
  260. package/dist/render-system-projections.d.ts +22 -0
  261. package/dist/render-system-projections.d.ts.map +1 -0
  262. package/dist/render-system.d.ts +27 -77
  263. package/dist/render-system.d.ts.map +1 -1
  264. package/dist/scene/render-scene-types.d.ts +14 -7
  265. package/dist/scene/render-scene-types.d.ts.map +1 -1
  266. package/dist/scene/render-scene.d.ts +29 -11
  267. package/dist/scene/render-scene.d.ts.map +1 -1
  268. package/dist/scene/shadow-visibility.d.ts +5 -0
  269. package/dist/scene/shadow-visibility.d.ts.map +1 -0
  270. package/dist/ssr/admission.d.ts +70 -1
  271. package/dist/ssr/admission.d.ts.map +1 -1
  272. package/dist/ssr/compose.d.ts +13 -0
  273. package/dist/ssr/compose.d.ts.map +1 -0
  274. package/dist/ssr/errors.d.ts +35 -0
  275. package/dist/ssr/errors.d.ts.map +1 -1
  276. package/dist/ssr/graph.d.ts +60 -0
  277. package/dist/ssr/graph.d.ts.map +1 -0
  278. package/dist/ssr/history.d.ts +97 -0
  279. package/dist/ssr/history.d.ts.map +1 -0
  280. package/dist/ssr/hiz.d.ts +37 -0
  281. package/dist/ssr/hiz.d.ts.map +1 -0
  282. package/dist/ssr/inspection.d.ts +42 -0
  283. package/dist/ssr/inspection.d.ts.map +1 -0
  284. package/dist/ssr/resources.d.ts +58 -0
  285. package/dist/ssr/resources.d.ts.map +1 -0
  286. package/dist/ssr/temporal.d.ts +38 -0
  287. package/dist/ssr/temporal.d.ts.map +1 -0
  288. package/dist/systems/skin-palette-allocator.d.ts +32 -10
  289. package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
  290. package/dist/systems/skin-palette-types.d.ts +15 -0
  291. package/dist/systems/skin-palette-types.d.ts.map +1 -1
  292. package/dist/systems/transparent-dispatch.d.ts +9 -0
  293. package/dist/systems/transparent-dispatch.d.ts.map +1 -0
  294. package/dist/targets/material-source.d.ts +7 -0
  295. package/dist/targets/material-source.d.ts.map +1 -1
  296. package/dist/temporal/frame-coordinator.d.ts +7 -0
  297. package/dist/temporal/frame-coordinator.d.ts.map +1 -1
  298. package/dist/temporal/gpu.d.ts +8 -0
  299. package/dist/temporal/gpu.d.ts.map +1 -1
  300. package/dist/temporal/history.d.ts.map +1 -1
  301. package/dist/temporal/index.mjs +6 -6
  302. package/dist/temporal/inspection.d.ts.map +1 -1
  303. package/dist/temporal/standard-scene-data.d.ts +2 -1
  304. package/dist/temporal/standard-scene-data.d.ts.map +1 -1
  305. package/dist/temporal/temporal-view.d.ts +2 -0
  306. package/dist/temporal/temporal-view.d.ts.map +1 -1
  307. package/dist/typed-render-graph-primitives.d.ts +35 -1
  308. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  309. package/dist/typed-shadow-passes.d.ts +3 -1
  310. package/dist/typed-shadow-passes.d.ts.map +1 -1
  311. package/dist/volume/temporal.d.ts +6 -0
  312. package/dist/volume/temporal.d.ts.map +1 -1
  313. package/package.json +21 -20
  314. package/src/__tests__/auto-exposure-gpu-evidence.ts +291 -0
  315. package/src/__tests__/auto-exposure-inspection.unit.test.ts +80 -0
  316. package/src/__tests__/auto-exposure-transaction.integration.test.ts +99 -0
  317. package/src/__tests__/auto-exposure.browser.test.ts +33 -0
  318. package/src/__tests__/auto-exposure.dawn.test.ts +33 -0
  319. package/src/__tests__/detached-inspection.integration.test.ts +5 -0
  320. package/src/__tests__/device-scope-lifecycle.unit.test.ts +18 -0
  321. package/src/__tests__/device-scope-stale-matrix.unit.test.ts +18 -0
  322. package/src/__tests__/docs-gate-green.unit.test.ts +3 -3
  323. package/src/__tests__/factory-contract.integration.test.ts +67 -8
  324. package/src/__tests__/fallback-row-stride-surface.unit.test.ts +19 -0
  325. package/src/__tests__/feature-depth-input.dawn.test.ts +121 -0
  326. package/src/__tests__/feature-noise.unit.test.ts +38 -0
  327. package/src/__tests__/fixtures/taa-resolve-pinned-baseline.wgsl +301 -0
  328. package/src/__tests__/frame-camera-selection.unit.test.ts +131 -0
  329. package/src/__tests__/frame-plan-contract.unit.test.ts +24 -0
  330. package/src/__tests__/frame-targets.unit.test.ts +24 -0
  331. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +3 -0
  332. package/src/__tests__/gpu-driven-baseline.characterization.test.ts +79 -0
  333. package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +287 -6
  334. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +122 -142
  335. package/src/__tests__/gpu-driven-indirect-raster.browser.test.ts +10 -1
  336. package/src/__tests__/gpu-driven-lod-cache.unit.test.ts +264 -0
  337. package/src/__tests__/gpu-driven-mesh-world-identity.unit.test.ts +349 -0
  338. package/src/__tests__/gpu-driven-pbr.dawn.test.ts +1417 -0
  339. package/src/__tests__/gpu-driven-pbr.integration.test.ts +21 -0
  340. package/src/__tests__/gpu-driven-production-fixture.ts +96 -0
  341. package/src/__tests__/gpu-driven-production.integration.test.ts +1075 -93
  342. package/src/__tests__/gpu-driven-scaling.unit.test.ts +1 -3
  343. package/src/__tests__/gpu-driven-shadow-views.browser.test.ts +63 -0
  344. package/src/__tests__/gpu-driven-shadow-views.dawn.test.ts +294 -0
  345. package/src/__tests__/gpu-driven-shadow-views.integration.test.ts +97 -0
  346. package/src/__tests__/gpu-driven-shadow-views.unit.test.ts +168 -0
  347. package/src/__tests__/gpu-driven-skin-contract.test-d.ts +11 -0
  348. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +72 -20
  349. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +30 -9
  350. package/src/__tests__/gpu-driven-view.unit.test.ts +159 -52
  351. package/src/__tests__/gpu-pass-timing.browser.test.ts +6 -1
  352. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +42 -0
  353. package/src/__tests__/gpu-scene-render-graph-gpu.ts +19 -5
  354. package/src/__tests__/gpu-scene.dawn.test.ts +40 -13
  355. package/src/__tests__/gpu-scene.unit.test.ts +559 -33
  356. package/src/__tests__/instances-culling.integration.test.ts +36 -10
  357. package/src/__tests__/instances-derived-bounds.unit.test.ts +54 -0
  358. package/src/__tests__/instances-store.unit.test.ts +242 -39
  359. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +6 -0
  360. package/src/__tests__/lighting-scene-roundtrip.integration.test.ts +13 -16
  361. package/src/__tests__/lut-lkg-transaction.integration.test.ts +122 -0
  362. package/src/__tests__/material-contract-inventory.unit.test.ts +5 -6
  363. package/src/__tests__/material-dispatch-shader-id.unit.test.ts +51 -0
  364. package/src/__tests__/material-lane-selection.unit.test.ts +60 -0
  365. package/src/__tests__/material-numeric-upload.unit.test.ts +53 -0
  366. package/src/__tests__/material-texture-handles.unit.test.ts +18 -0
  367. package/src/__tests__/material-texture-source.unit.test.ts +87 -0
  368. package/src/__tests__/materials-authoring-validation.unit.test.ts +41 -0
  369. package/src/__tests__/materials-standard-contract.unit.test.ts +52 -2
  370. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +4 -0
  371. package/src/__tests__/normal-fallback.dawn.test.ts +122 -0
  372. package/src/__tests__/particle-material-input-layout.unit.test.ts +104 -0
  373. package/src/__tests__/physical-clearcoat.integration.test.ts +37 -3
  374. package/src/__tests__/pipeline-texture-specialization.unit.test.ts +138 -0
  375. package/src/__tests__/point-shadow-inspection.unit.test.ts +2 -0
  376. package/src/__tests__/prepared-gpu-driven-pbr-contract.test-d.ts +31 -0
  377. package/src/__tests__/prepared-gpu-driven-pbr-contract.unit.test.ts +39 -0
  378. package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +35 -4
  379. package/src/__tests__/prepared-graphics-capability.unit.test.ts +21 -0
  380. package/src/__tests__/prepared-graphics-pipeline-warmup.unit.test.ts +6 -2
  381. package/src/__tests__/profiler-phase-catalog.test.ts +5 -0
  382. package/src/__tests__/public-surface.test-d.ts +3 -0
  383. package/src/__tests__/recovery-candidate-prepare.contract.test.ts +30 -12
  384. package/src/__tests__/reflection-fallback-async-publication.unit.test.ts +104 -0
  385. package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +2 -1
  386. package/src/__tests__/render-error-code-owner.test-d.ts +4 -0
  387. package/src/__tests__/render-error-detail-ssot.test-d.ts +22 -0
  388. package/src/__tests__/render-error-exhaustive.test-d.ts +15 -0
  389. package/src/__tests__/render-feature-gpu-work.integration.test.ts +285 -2
  390. package/src/__tests__/render-feature-plan.unit.test.ts +245 -0
  391. package/src/__tests__/render-feature-shadow-order.unit.test.ts +228 -0
  392. package/src/__tests__/render-feature-zero-work.unit.test.ts +35 -1
  393. package/src/__tests__/render-graph-fallback.integration.test.ts +2 -2
  394. package/src/__tests__/render-owner-cohesion.unit.test.ts +55 -0
  395. package/src/__tests__/render-scene-mixed-updates.integration.test.ts +426 -0
  396. package/src/__tests__/render-scene-projection.unit.test.ts +914 -23
  397. package/src/__tests__/render-scene-resource-updates.integration.test.ts +214 -0
  398. package/src/__tests__/render-scene-skin-lifecycle.integration.test.ts +173 -0
  399. package/src/__tests__/render-scene-temporal-retry.unit.test.ts +133 -0
  400. package/src/__tests__/render-target-material-source.test-d.ts +27 -3
  401. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +60 -0
  402. package/src/__tests__/renderer-frame-transaction.integration.test.ts +923 -5
  403. package/src/__tests__/shader-manifest-fixture.ts +39 -0
  404. package/src/__tests__/skin-motion-regression.unit.test.ts +0 -33
  405. package/src/__tests__/skin-palette-persistent.integration.test.ts +28 -0
  406. package/src/__tests__/skin-palette-persistent.unit.test.ts +247 -0
  407. package/src/__tests__/skinned-shadow-caster.test.ts +118 -14
  408. package/src/__tests__/specular-environment-scale.dawn.test.ts +156 -0
  409. package/src/__tests__/ssr-admission-matrix.integration.test.ts +7 -1
  410. package/src/__tests__/ssr-confidence-compose.unit.test.ts +84 -0
  411. package/src/__tests__/ssr-coordinate-oracle.unit.test.ts +28 -0
  412. package/src/__tests__/ssr-format-probe-gating.integration.test.ts +82 -0
  413. package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +91 -0
  414. package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +112 -0
  415. package/src/__tests__/ssr-gpu-dispatch.ts +946 -0
  416. package/src/__tests__/ssr-graph-topology.unit.test.ts +104 -0
  417. package/src/__tests__/ssr-history-filter.dawn.test.ts +198 -0
  418. package/src/__tests__/ssr-hit-color.dawn.test.ts +273 -0
  419. package/src/__tests__/ssr-hiz-odd-reduction.dawn.test.ts +569 -0
  420. package/src/__tests__/ssr-hiz-rescue.dawn.test.ts +279 -0
  421. package/src/__tests__/ssr-hiz.browser.test.ts +150 -0
  422. package/src/__tests__/ssr-hiz.dawn.test.ts +150 -0
  423. package/src/__tests__/ssr-hiz.unit.test.ts +56 -0
  424. package/src/__tests__/ssr-inspection.unit.test.ts +105 -0
  425. package/src/__tests__/ssr-memory-budget.unit.test.ts +45 -0
  426. package/src/__tests__/ssr-performance-sequence-aggregation.unit.test.ts +15 -0
  427. package/src/__tests__/ssr-public-surface.test-d.ts +37 -0
  428. package/src/__tests__/ssr-receiver-coverage.dawn.test.ts +387 -0
  429. package/src/__tests__/ssr-reflection-mip-reducer.dawn.test.ts +309 -0
  430. package/src/__tests__/ssr-reprojection-probe.ts +90 -0
  431. package/src/__tests__/ssr-roughness-mip.dawn.test.ts +163 -0
  432. package/src/__tests__/ssr-shader-prewarm.unit.test.ts +59 -0
  433. package/src/__tests__/ssr-spatial.integration.test.ts +141 -0
  434. package/src/__tests__/ssr-stable-lattice.dawn.test.ts +475 -0
  435. package/src/__tests__/ssr-temporal-history.unit.test.ts +202 -0
  436. package/src/__tests__/ssr-texel-crossing.dawn.test.ts +448 -0
  437. package/src/__tests__/ssr-zero-work.integration.test.ts +87 -0
  438. package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +44 -12
  439. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +29 -0
  440. package/src/__tests__/standard-output-chain-contract.unit.test.ts +99 -0
  441. package/src/__tests__/standard-output-chain.integration.test.ts +73 -0
  442. package/src/__tests__/standard-output-gpu-evidence.ts +205 -0
  443. package/src/__tests__/standard-output.browser.test.ts +15 -0
  444. package/src/__tests__/standard-output.dawn.test.ts +15 -0
  445. package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +38 -0
  446. package/src/__tests__/standard-pipeline.integration.test.ts +320 -3
  447. package/src/__tests__/standard-profile-oracle.unit.test.ts +22 -0
  448. package/src/__tests__/standard-surface-lighting.unit.test.ts +41 -0
  449. package/src/__tests__/standard-texture-specialization.dawn.test.ts +141 -0
  450. package/src/__tests__/surface-adjacent-regressions.integration.test.ts +6 -3
  451. package/src/__tests__/taa-coverage-edge.dawn.test.ts +193 -0
  452. package/src/__tests__/taa-history-clipping.dawn.test.ts +328 -0
  453. package/src/__tests__/taa-neighborhood-equivalence.dawn.test.ts +778 -0
  454. package/src/__tests__/taa-stability-feedback.browser.test.ts +23 -0
  455. package/src/__tests__/taa-stability-feedback.dawn.test.ts +68 -0
  456. package/src/__tests__/taa-stability-feedback.ts +341 -0
  457. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +49 -7
  458. package/src/__tests__/temporal-reset-matrix.unit.test.ts +9 -0
  459. package/src/__tests__/temporal-transaction.integration.test.ts +28 -0
  460. package/src/__tests__/texture-usage-surface.unit.test.ts +4 -2
  461. package/src/__tests__/typed-pipeline-topology.unit.test.ts +109 -4
  462. package/src/__tests__/typed-scene-pass-material-cache.integration.test.ts +126 -0
  463. package/src/__tests__/vertex-layouts-ssot.unit.test.ts +47 -0
  464. package/src/__tests__/visibility-extract.perf.test.ts +20 -8
  465. package/src/__tests__/visibility-instances.integration.test.ts +19 -7
  466. package/src/__tests__/visibility-producer-matrix.integration.test.ts +20 -9
  467. package/src/assembly/atmosphere-shader-prewarm.ts +38 -0
  468. package/src/assembly/dynamic-geometry-host.ts +48 -0
  469. package/src/assembly/dynamic-geometry-runtime.ts +71 -0
  470. package/src/assembly/factory.ts +4 -0
  471. package/src/assembly/gpu-driven-owner.ts +29 -0
  472. package/src/assembly/host-contract.ts +10 -0
  473. package/src/assembly/material/assembly.ts +38 -0
  474. package/src/assembly/material-shader-policy.ts +71 -28
  475. package/src/assembly/recovery/failure-location.ts +62 -0
  476. package/src/assembly/recovery/renderer-recover.ts +19 -17
  477. package/src/assembly/renderer-facade.ts +12 -0
  478. package/src/assembly/renderer-feature-inspection.ts +13 -0
  479. package/src/assembly/renderer-frame-transaction.ts +63 -0
  480. package/src/assembly/renderer-helpers.ts +26 -0
  481. package/src/assembly/renderer-inspection.ts +6 -0
  482. package/src/assembly/shader-prewarm-policy.ts +32 -0
  483. package/src/assembly/skin-palette-owner.ts +21 -0
  484. package/src/assembly/ssr-shader-prewarm.ts +41 -0
  485. package/src/assembly/webgpu-device-loss.ts +75 -0
  486. package/src/assembly/webgpu-pbr-ready.ts +232 -0
  487. package/src/assembly/webgpu-ready-mipmap.ts +26 -0
  488. package/src/assembly/webgpu-ready.ts +142 -121
  489. package/src/assembly/webgpu-renderer-bootstrap.ts +85 -0
  490. package/src/assembly/webgpu-renderer-contract.ts +69 -0
  491. package/src/assembly/webgpu-renderer-guards.ts +32 -0
  492. package/src/assembly/webgpu-renderer-observation.ts +43 -0
  493. package/src/assembly/webgpu-renderer-recovery-failure.ts +62 -0
  494. package/src/assembly/webgpu-renderer.ts +666 -652
  495. package/src/assembly/webgpu-vertex-layouts.ts +233 -87
  496. package/src/components/__tests__/camera-exposure.contract.unit.test.ts +153 -0
  497. package/src/components/camera.ts +287 -7
  498. package/src/components/index.ts +1 -0
  499. package/src/components/instances.ts +45 -18
  500. package/src/components/scene-instance.ts +2 -1
  501. package/src/components/screen-space-reflection.ts +21 -0
  502. package/src/components/sprite-animation.ts +2 -2
  503. package/src/components/sprite-instances.ts +1 -1
  504. package/src/device/gpu-residency.ts +34 -31
  505. package/src/environment/background.ts +263 -0
  506. package/src/errors/gpu-driven.ts +39 -5
  507. package/src/errors/render.ts +27 -3
  508. package/src/extract/camera.ts +26 -1
  509. package/src/extract/gpu-driven.ts +185 -10
  510. package/src/features/host.ts +237 -19
  511. package/src/features/noise-texture.ts +91 -0
  512. package/src/features/plan.ts +553 -24
  513. package/src/features/prepared-gpu-work.ts +631 -49
  514. package/src/features/prepared-graphics-store.ts +31 -0
  515. package/src/features/prepared-graphics.ts +5 -0
  516. package/src/features/render-graph-compute.ts +41 -8
  517. package/src/features/render-graph-contribution.ts +141 -3
  518. package/src/features/render-graph-raster.ts +143 -30
  519. package/src/features/types.ts +11 -0
  520. package/src/fullscreen-post-process-pass.ts +3 -0
  521. package/src/gpu-driven/batch-topology.ts +424 -102
  522. package/src/gpu-driven/pbr-program.ts +31 -0
  523. package/src/gpu-driven/prepared-draw.ts +29 -4
  524. package/src/gpu-driven/production-raster.ts +2267 -694
  525. package/src/gpu-driven/shadow-views.ts +539 -0
  526. package/src/gpu-driven/view-gpu.ts +188 -41
  527. package/src/gpu-scene-schema.ts +52 -11
  528. package/src/gpu-scene.ts +186 -99
  529. package/src/gpu-texture-usage.ts +1 -0
  530. package/src/hdrp-buffers.ts +72 -36
  531. package/src/ibl/frame-resources.ts +38 -0
  532. package/src/ibl/skylight-bind-group.ts +5 -4
  533. package/src/index.ts +109 -1
  534. package/src/inspection-types.ts +191 -0
  535. package/src/instances-derived-bounds.ts +258 -34
  536. package/src/instances.ts +459 -150
  537. package/src/internal.ts +22 -0
  538. package/src/lifecycle.ts +2 -0
  539. package/src/material-row.ts +145 -0
  540. package/src/materials.ts +44 -8
  541. package/src/pbr-pipeline.ts +159 -17
  542. package/src/pipeline/standard-forward-lane.ts +52 -24
  543. package/src/pipeline/standard-output/__tests__/lut-admission.unit.test.ts +103 -0
  544. package/src/pipeline/standard-output/auto-exposure/__tests__/capability.unit.test.ts +40 -0
  545. package/src/pipeline/standard-output/auto-exposure/__tests__/gpu.contract.unit.test.ts +125 -0
  546. package/src/pipeline/standard-output/auto-exposure/__tests__/graph.contract.unit.test.ts +94 -0
  547. package/src/pipeline/standard-output/auto-exposure/__tests__/oracle.test.ts +108 -0
  548. package/src/pipeline/standard-output/auto-exposure/__tests__/preset.test.ts +26 -0
  549. package/src/pipeline/standard-output/auto-exposure/capability.ts +38 -0
  550. package/src/pipeline/standard-output/auto-exposure/gpu.ts +567 -0
  551. package/src/pipeline/standard-output/auto-exposure/graph.ts +221 -0
  552. package/src/pipeline/standard-output/auto-exposure/inspection.ts +231 -0
  553. package/src/pipeline/standard-output/auto-exposure/oracle.ts +291 -0
  554. package/src/pipeline/standard-output/auto-exposure/preset.ts +28 -0
  555. package/src/pipeline/standard-output/auto-exposure/state.ts +156 -0
  556. package/src/pipeline/standard-output/color-transform.ts +124 -0
  557. package/src/pipeline/standard-output/graph.ts +139 -0
  558. package/src/pipeline/standard-output/lut-admission.ts +121 -0
  559. package/src/pipeline/standard-output/lut-gpu.ts +399 -0
  560. package/src/pipeline/standard-output/lut-state.ts +176 -0
  561. package/src/pipeline/standard-output/resources.ts +121 -0
  562. package/src/pipeline/standard-output/types.ts +58 -0
  563. package/src/pipeline/standard-pipeline.ts +192 -59
  564. package/src/pipeline/standard-post.ts +186 -27
  565. package/src/pipeline-builder.ts +16 -6
  566. package/src/pipeline-spec-types.ts +4 -0
  567. package/src/pipeline-spec.ts +37 -29
  568. package/src/points-lines/standard-owner.ts +6 -14
  569. package/src/prepare/prepared-graphics-resolver.ts +9 -2
  570. package/src/record/__tests__/material-slot-plan.unit.test.ts +48 -0
  571. package/src/record/__tests__/mesh-ssbo.unit.test.ts +40 -1
  572. package/src/record/__tests__/recovery-pipeline.unit.test.ts +2 -29
  573. package/src/record/__tests__/sprite-material-abi.unit.test.ts +36 -5
  574. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +45 -0
  575. package/src/record/__tests__/view-ubo-layout.unit.test.ts +5 -0
  576. package/src/record/dynamic-geometry-consumption.ts +59 -0
  577. package/src/record/frame-lighting.ts +12 -11
  578. package/src/record/frame-snapshot.ts +133 -23
  579. package/src/record/frame-targets.ts +9 -0
  580. package/src/record/frame.ts +725 -133
  581. package/src/record/main-pass-geometry.ts +149 -94
  582. package/src/record/main-pass-material.ts +115 -26
  583. package/src/record/main-pass-sprite-draws.ts +16 -107
  584. package/src/record/main-pass.ts +78 -8
  585. package/src/record/material-uniforms.ts +1 -1
  586. package/src/record/mesh-ssbo.ts +59 -15
  587. package/src/record/prepared-material-bindings.ts +234 -0
  588. package/src/record/recovery-pipeline.ts +59 -136
  589. package/src/record/render-context.ts +90 -22
  590. package/src/record/shadow-pass.ts +1231 -209
  591. package/src/record/skybox-post-pass.ts +14 -3
  592. package/src/record/typed-frame-graph.ts +1004 -44
  593. package/src/record/view-ubo.ts +11 -0
  594. package/src/recovery/render-system-candidate.ts +90 -66
  595. package/src/recovery/render-system-roots.ts +113 -0
  596. package/src/recovery/types.ts +77 -0
  597. package/src/reflection/record-owner.ts +26 -54
  598. package/src/render-contract.ts +195 -25
  599. package/src/render-graph-primitives.ts +6 -2
  600. package/src/render-pipeline.ts +70 -1
  601. package/src/render-system-extract-tail.ts +409 -160
  602. package/src/render-system-extract.ts +376 -102
  603. package/src/render-system-projections.ts +241 -0
  604. package/src/render-system.ts +681 -822
  605. package/src/scene/render-scene-types.ts +13 -4
  606. package/src/scene/render-scene.ts +569 -355
  607. package/src/scene/shadow-visibility.ts +21 -0
  608. package/src/ssr/admission.ts +380 -14
  609. package/src/ssr/compose.ts +144 -0
  610. package/src/ssr/errors.ts +48 -0
  611. package/src/ssr/graph.ts +777 -0
  612. package/src/ssr/history.ts +436 -0
  613. package/src/ssr/hiz.ts +124 -0
  614. package/src/ssr/inspection.ts +124 -0
  615. package/src/ssr/resources.ts +202 -0
  616. package/src/ssr/temporal.ts +164 -0
  617. package/src/systems/skin-palette-allocator.ts +495 -148
  618. package/src/systems/skin-palette-types.ts +17 -0
  619. package/src/systems/transparent-dispatch.ts +90 -0
  620. package/src/targets/material-source.ts +34 -0
  621. package/src/temporal/coverage.ts +1 -1
  622. package/src/temporal/frame-coordinator.ts +23 -2
  623. package/src/temporal/gpu.ts +74 -12
  624. package/src/temporal/history.ts +3 -1
  625. package/src/temporal/inspection.ts +2 -1
  626. package/src/temporal/standard-scene-data.ts +3 -1
  627. package/src/temporal/temporal-view.ts +3 -0
  628. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +204 -139
  629. package/src/typed-render-graph-primitives.ts +266 -74
  630. package/src/typed-shadow-passes.ts +122 -12
  631. package/src/volume/temporal.ts +10 -0
  632. package/dist/chunk-GE3SDD72.mjs.map +0 -1
  633. package/dist/chunk-GF523LHF.mjs.map +0 -1
  634. package/dist/chunk-IQMKJLNU.mjs.map +0 -1
  635. package/dist/chunk-J52NMQKR.mjs.map +0 -1
  636. package/dist/chunk-J6KACNOH.mjs.map +0 -1
  637. package/dist/chunk-JAASCMXA.mjs.map +0 -1
  638. package/dist/chunk-MBU4ZVE7.mjs.map +0 -1
  639. package/dist/chunk-RBDBZ5R7.mjs.map +0 -1
  640. package/dist/chunk-VSL23LZE.mjs.map +0 -1
  641. package/src/__tests__/instances-world-ownership.integration.test.ts +0 -62
  642. package/src/scene/__tests__/changed-block-summary.candidate.test.ts +0 -36
@@ -10,7 +10,9 @@ import {
10
10
  RhiError,
11
11
  type RhiRenderPassEncoder,
12
12
  } from '@forgeax/engine-rhi';
13
+ import { STANDARD_TEXTURE_MASK_OVERRIDE } from '@forgeax/engine-shader';
13
14
  import type { ParamSchemaEntry, PassKind, PrimitiveTopology } from '@forgeax/engine-types';
15
+ import { gpuDrivenDrawKey, gpuDrivenSourceDrawItemIndex } from '../extract/gpu-driven';
14
16
  import { GpuBuffer } from '../gpu-resource';
15
17
  import {
16
18
  GPU_BUFFER_USAGE_COPY_DST,
@@ -19,11 +21,7 @@ import {
19
21
  } from '../gpu-usage';
20
22
  import { createHdrpSkinUnifiedBindGroup, getOrCreateHdrpBuffers } from '../hdrp-buffers';
21
23
  import type { InstanceBufferCacheEntry } from '../instance-buffer-cache';
22
- import {
23
- type InstanceCollectionFailureCode,
24
- recordInstanceFailure,
25
- recordInstanceResidency,
26
- } from '../instances';
24
+ import { type InstanceCollectionFailureCode, instanceUploadRangesForResident } from '../instances';
27
25
  import { SPRITE_PREMULTIPLIED_ALPHA_BLEND } from '../materials';
28
26
  import {
29
27
  createPbrSkinMeshBindGroupEntries,
@@ -127,6 +125,7 @@ type MaterialPipelineLookup = {
127
125
  readonly sampleCount: number;
128
126
  readonly colorFormatOverride: GPUTextureFormat | undefined;
129
127
  readonly additionalColorFormats: readonly GPUTextureFormat[] | undefined;
128
+ readonly textureMask: number | undefined;
130
129
  readonly handle: MaterialShaderPipelineEntry | null;
131
130
  };
132
131
 
@@ -134,6 +133,67 @@ type GeometryRecordProfileSegment = 'material-bind-groups' | 'pipeline-selection
134
133
 
135
134
  type GeometryRenderState = ReturnType<typeof geometryRenderStateForTopology>;
136
135
 
136
+ function gpuDrivenDrawIndicesBySubmesh(
137
+ source: RenderableSnapshot,
138
+ mesh: _InternalRenderPipelineContext['validatedOrdered'][number]['mesh'],
139
+ ): ReadonlyMap<number, number> {
140
+ const draws = source.gpuDrivenDraws;
141
+ if (draws === undefined || draws.length === 0) return new Map();
142
+ const indices = new Map<number, number>();
143
+ let hasStableSourceIdentity = false;
144
+ for (const [compactIndex, draw] of draws.entries()) {
145
+ const drawItemIndex = draw.drawItemIndex;
146
+ if (drawItemIndex === undefined) continue;
147
+ hasStableSourceIdentity = true;
148
+ if (mesh.submeshes[drawItemIndex] !== undefined) indices.set(drawItemIndex, compactIndex);
149
+ }
150
+ if (hasStableSourceIdentity) return indices;
151
+
152
+ // Legacy snapshots predating drawItemIndex are matched by their compact
153
+ // geometry facts. New extracted snapshots never take this path.
154
+ let nonIndexedFirst = 0;
155
+ let drawCursor = 0;
156
+ for (const [submeshIndex, submesh] of mesh.submeshes.entries()) {
157
+ const first = mesh.indexed ? submesh.indexOffset : nonIndexedFirst;
158
+ const count = mesh.indexed ? submesh.indexCount : submesh.vertexCount;
159
+ if (!mesh.indexed) nonIndexedFirst += submesh.vertexCount;
160
+ const draw = draws[drawCursor];
161
+ if (
162
+ draw !== undefined &&
163
+ draw.first === first &&
164
+ draw.count === count &&
165
+ draw.materialSlot === submesh.materialSlot &&
166
+ draw.topology === submesh.topology
167
+ ) {
168
+ indices.set(submeshIndex, drawCursor);
169
+ drawCursor += 1;
170
+ }
171
+ }
172
+ return indices;
173
+ }
174
+
175
+ function isGpuDrivenMainClaimedSubmesh(
176
+ c: _InternalRenderPipelineContext,
177
+ source: RenderableSnapshot,
178
+ submeshIndex: number,
179
+ drawIndices: ReadonlyMap<number, number>,
180
+ ): boolean {
181
+ const drawItemIndex = drawIndices.get(submeshIndex);
182
+ const draw = drawItemIndex === undefined ? undefined : source.gpuDrivenDraws?.[drawItemIndex];
183
+ if (drawItemIndex === undefined || draw === undefined) return false;
184
+ const material = source.materials[draw.materialSlot] ?? source.material;
185
+ const sourceDrawItemIndex = gpuDrivenSourceDrawItemIndex(draw, drawItemIndex);
186
+ return (
187
+ c.gpuDrivenDrawKeys?.has(
188
+ gpuDrivenDrawKey(
189
+ worldEntityKey(source.worldId, source.entityKey),
190
+ material.materialHandle ?? -1,
191
+ sourceDrawItemIndex,
192
+ ),
193
+ ) === true
194
+ );
195
+ }
196
+
137
197
  /**
138
198
  * Select the transmission shader axis from authored material data, not the
139
199
  * canonical boot schema. The latter reserves transmission fields for the
@@ -252,8 +312,8 @@ export function effectiveMaterialLayoutIdentity(
252
312
  /**
253
313
  * Resolve the depth contract for a geometry pass without changing the base
254
314
  * material state. Temporal scene-data shares the main pass depth attachment:
255
- * it is read-only and accepts the equal depth produced by the unjittered
256
- * temporal projection, while still rejecting fragments behind the visible
315
+ * it is read-only and accepts the equal depth produced by the shared raster
316
+ * projection, while motion varyings remain unjittered. It rejects fragments behind the visible
257
317
  * surface.
258
318
  */
259
319
  export function geometryRenderStateForPass(
@@ -373,6 +433,7 @@ export function recordGeometryDraws(
373
433
  ) => BindGroup,
374
434
  passKind: PassKind = 'forward',
375
435
  selectedDispatch?: readonly DispatchEntry[],
436
+ colorFormats: readonly GPUTextureFormat[] = [],
376
437
  ): void {
377
438
  const {
378
439
  runtime,
@@ -457,6 +518,7 @@ export function recordGeometryDraws(
457
518
  layoutProjection: import('@forgeax/engine-geometry').VertexLayoutProjection,
458
519
  vertexEntry?: string,
459
520
  fragmentEntry?: string,
521
+ textureMask?: number,
460
522
  ): MaterialShaderPipelineEntry | null => {
461
523
  // The fallback MRT is an extension of the built-in Standard PBR output
462
524
  // contract only. The render pass may carry a second attachment whenever
@@ -469,7 +531,9 @@ export function recordGeometryDraws(
469
531
  const reflectionFallbackFormats =
470
532
  materialShaderId === 'forgeax::default-standard-pbr' &&
471
533
  c.reflectionFallbackColorFormat !== undefined
472
- ? [c.reflectionFallbackColorFormat]
534
+ ? passKind === 'deferred'
535
+ ? colorFormats.slice(1)
536
+ : [c.reflectionFallbackColorFormat]
473
537
  : undefined;
474
538
  const renderStateKey = renderStateHash(renderState);
475
539
  const shaderLookupCache = materialPipelineLookupCache.get(materialShaderId);
@@ -484,6 +548,7 @@ export function recordGeometryDraws(
484
548
  cached.variantSet === variantSet &&
485
549
  cached.vertexEntry === vertexEntry &&
486
550
  cached.fragmentEntry === fragmentEntry &&
551
+ cached.textureMask === textureMask &&
487
552
  cached.passKind === passKind &&
488
553
  cached.layoutProjection.digest === layoutProjection.digest &&
489
554
  cached.sampleCount === sampleCount &&
@@ -530,9 +595,12 @@ export function recordGeometryDraws(
530
595
  layoutProjection,
531
596
  undefined,
532
597
  undefined,
598
+ undefined,
533
599
  reflectionFallbackFormats,
534
600
  vertexEntry,
535
601
  fragmentEntry,
602
+ undefined,
603
+ textureMask === undefined ? undefined : { [STANDARD_TEXTURE_MASK_OVERRIDE]: textureMask },
536
604
  ) ?? null;
537
605
  const handle =
538
606
  profilePhase === undefined
@@ -560,6 +628,7 @@ export function recordGeometryDraws(
560
628
  sampleCount,
561
629
  colorFormatOverride: colorFormat,
562
630
  additionalColorFormats: reflectionFallbackFormats,
631
+ textureMask,
563
632
  handle,
564
633
  };
565
634
  if (shaderLookupCache === undefined) {
@@ -579,7 +648,6 @@ export function recordGeometryDraws(
579
648
  for (let i = 0; i < validatedOrdered.length; i++) {
580
649
  const entry = validatedOrdered[i];
581
650
  if (entry === undefined) continue;
582
-
583
651
  // Points/Lines share the Standard geometry pass. Their retained source
584
652
  // is prepared once by the renderer owner, while this loop remains the
585
653
  // sole pass/draw submission owner and preserves the authored topology.
@@ -587,18 +655,6 @@ export function recordGeometryDraws(
587
655
  if (entry.source.pointsLines !== undefined && pointsLinesSubmission?.plan.drawCount !== 1)
588
656
  continue;
589
657
 
590
- if (
591
- passKind === 'forward' &&
592
- c.gpuDrivenEntityKeys.has(
593
- worldEntityKey(
594
- c.gpuDrivenWorldKeys?.[entry.source.worldId] ?? entry.source.worldId,
595
- entry.source.entityKey,
596
- ),
597
- )
598
- ) {
599
- continue;
600
- }
601
-
602
658
  // feat-20260609 M2: skip entities that don't match the pass selector.
603
659
  if (matchedMaterials !== null && !matchedMaterials.has(entry.renderableIndex)) continue;
604
660
 
@@ -987,6 +1043,7 @@ export function recordGeometryDraws(
987
1043
  // — the same placeholders the unlit path already used. The generic
988
1044
  // branch below builds the per-submesh BG.
989
1045
  let perSubmeshBg: BindGroup | null = null;
1046
+ const gpuDrivenDrawIndices = gpuDrivenDrawIndicesBySubmesh(entry.source, entry.mesh);
990
1047
  // feat-20260608 M4 / w16: per-submesh pipeline selection + draw loop.
991
1048
  // Each submesh carries its own topology, so pipeline selection is per-submesh.
992
1049
  // Vertex/index buffers and bind groups are set once (shared across all submeshes).
@@ -1004,6 +1061,12 @@ export function recordGeometryDraws(
1004
1061
  const materialHandle = submeshMaterial.materialHandle ?? 0;
1005
1062
  if (materialHandles === undefined || !materialHandles.has(materialHandle)) continue;
1006
1063
  }
1064
+ if (
1065
+ passKind === 'forward' &&
1066
+ isGpuDrivenMainClaimedSubmesh(c, entry.source, smIdx, gpuDrivenDrawIndices)
1067
+ ) {
1068
+ continue;
1069
+ }
1007
1070
  const draws: readonly (DispatchEntry | undefined)[] =
1008
1071
  selectedDispatch === undefined
1009
1072
  ? [undefined]
@@ -1163,6 +1226,7 @@ export function recordGeometryDraws(
1163
1226
  entry.mesh.layoutProjection,
1164
1227
  vertexEntry,
1165
1228
  fragmentEntry,
1229
+ submeshMaterial.standardTextureMask,
1166
1230
  );
1167
1231
  materialPipelineEntry = unlitRsp;
1168
1232
  smPipelineHandle =
@@ -1202,7 +1266,7 @@ export function recordGeometryDraws(
1202
1266
  const transmissionAvailable = requestsStandardTransmissionVariant(submeshMaterial);
1203
1267
  const materialCapabilityVariantSet =
1204
1268
  transmissionAvailable && !capabilityVariantSet.includes('TRANSMISSION_AVAILABLE=')
1205
- ? `${capabilityVariantSet === '' ? '' : `${capabilityVariantSet}+`}TRANSMISSION_AVAILABLE=true`
1269
+ ? `${capabilityVariantSet}+TRANSMISSION_AVAILABLE=true`
1206
1270
  : capabilityVariantSet;
1207
1271
  // Sprite's base request must retain the boot-selected artifact. Only
1208
1272
  // SpriteInstances uses the explicit empty key for the
@@ -1215,9 +1279,7 @@ export function recordGeometryDraws(
1215
1279
  : undefined
1216
1280
  : entry.variantSet === undefined
1217
1281
  ? materialCapabilityVariantSet
1218
- : capabilityVariantSet === ''
1219
- ? entry.variantSet
1220
- : `${capabilityVariantSet}+${entry.variantSet}`;
1282
+ : `${materialCapabilityVariantSet}+${entry.variantSet}`;
1221
1283
  const cachedPipeline = resolveMaterialPipeline(
1222
1284
  smMaterialShaderId,
1223
1285
  pipelineRenderState,
@@ -1228,6 +1290,7 @@ export function recordGeometryDraws(
1228
1290
  entry.mesh.layoutProjection,
1229
1291
  vertexEntry,
1230
1292
  fragmentEntry,
1293
+ submeshMaterial.standardTextureMask,
1231
1294
  );
1232
1295
  // feat-20260615-pipeline-spec-ssot M6-T1: cache miss resolves to
1233
1296
  // null uniformly across URP / HDRP / skin shaders. Charter P3
@@ -1361,10 +1424,7 @@ export function recordGeometryDraws(
1361
1424
  * @internal
1362
1425
  */
1363
1426
  function uploadInstanceRanges(
1364
- c: Pick<
1365
- _InternalRenderPipelineContext,
1366
- 'runtime' | 'pipelineState' | 'frameState' | 'bindGroupCounts'
1367
- >,
1427
+ c: _InternalRenderPipelineContext,
1368
1428
  inst: NonNullable<RenderableSnapshot['instances']>,
1369
1429
  buffer: Buffer,
1370
1430
  ranges: readonly { readonly start: number; readonly end: number }[],
@@ -1396,10 +1456,7 @@ function uploadInstanceRanges(
1396
1456
  }
1397
1457
 
1398
1458
  export function reportInstanceResidency(
1399
- c: Pick<
1400
- _InternalRenderPipelineContext,
1401
- 'runtime' | 'pipelineState' | 'frameState' | 'bindGroupCounts'
1402
- >,
1459
+ c: _InternalRenderPipelineContext,
1403
1460
  inst: NonNullable<RenderableSnapshot['instances']>,
1404
1461
  input: {
1405
1462
  readonly lane: 'direct-storage' | 'chunked-storage' | 'direct-uniform' | 'chunked-uniform';
@@ -1409,8 +1466,8 @@ export function reportInstanceResidency(
1409
1466
  readonly uploadedBytes: number;
1410
1467
  },
1411
1468
  ): void {
1412
- if (inst.collectionId === undefined || c.frameState.instanceResidency === undefined) return;
1413
- recordInstanceResidency(c.frameState.instanceResidency, {
1469
+ if (inst.collectionId === undefined) return;
1470
+ c.frameState.instanceCollections?._reportResidency({
1414
1471
  collectionId: inst.collectionId,
1415
1472
  frameNumber: c.frameState.frameNumber,
1416
1473
  residentGeneration: c.runtime.deviceScope.generation,
@@ -1424,10 +1481,7 @@ export function reportInstanceResidency(
1424
1481
  }
1425
1482
 
1426
1483
  function reportInstanceFailure(
1427
- c: Pick<
1428
- _InternalRenderPipelineContext,
1429
- 'runtime' | 'pipelineState' | 'frameState' | 'bindGroupCounts'
1430
- >,
1484
+ c: _InternalRenderPipelineContext,
1431
1485
  inst: NonNullable<RenderableSnapshot['instances']>,
1432
1486
  error: {
1433
1487
  readonly code: InstanceCollectionFailureCode;
@@ -1437,8 +1491,8 @@ function reportInstanceFailure(
1437
1491
  requestedBytes: number,
1438
1492
  supportedBytes: number | undefined,
1439
1493
  ): void {
1440
- if (inst.collectionId === undefined || c.frameState.instanceResidency === undefined) return;
1441
- recordInstanceFailure(c.frameState.instanceResidency, {
1494
+ if (inst.collectionId === undefined) return;
1495
+ c.frameState.instanceCollections?._reportFailure({
1442
1496
  collectionId: inst.collectionId,
1443
1497
  code: error.code,
1444
1498
  expected: error.expected,
@@ -1454,13 +1508,7 @@ function reportInstanceFailure(
1454
1508
  });
1455
1509
  }
1456
1510
 
1457
- function clearInstanceChunksForOwner(
1458
- c: Pick<
1459
- _InternalRenderPipelineContext,
1460
- 'runtime' | 'pipelineState' | 'frameState' | 'bindGroupCounts'
1461
- >,
1462
- ownerKey: number,
1463
- ): void {
1511
+ function clearInstanceChunksForOwner(c: _InternalRenderPipelineContext, ownerKey: number): void {
1464
1512
  const chunks = c.frameState.instanceBufferChunks;
1465
1513
  if (chunks === undefined) return;
1466
1514
  const prefix = `${ownerKey}:`;
@@ -1475,10 +1523,7 @@ function clearInstanceChunksForOwner(
1475
1523
  }
1476
1524
 
1477
1525
  export function resolveStorageInstanceChunks(
1478
- c: Pick<
1479
- _InternalRenderPipelineContext,
1480
- 'runtime' | 'pipelineState' | 'frameState' | 'bindGroupCounts'
1481
- >,
1526
+ c: _InternalRenderPipelineContext,
1482
1527
  entry: _InternalRenderPipelineContext['validatedOrdered'][number],
1483
1528
  inst: NonNullable<RenderableSnapshot['instances']>,
1484
1529
  cap: number,
@@ -1516,6 +1561,7 @@ export function resolveStorageInstanceChunks(
1516
1561
  const draws: GeometryInstanceDraw[] = [];
1517
1562
  const uploadedRanges: { start: number; end: number }[] = [];
1518
1563
  let uploadedBytes = 0;
1564
+ const dirtyRanges = inst.dirtyRanges ?? [{ start: 0, end: inst.instanceCount } as const];
1519
1565
  for (let start = 0; start < inst.instanceCount; start += chunkCapacity) {
1520
1566
  const end = Math.min(inst.instanceCount, start + chunkCapacity);
1521
1567
  const count = end - start;
@@ -1557,14 +1603,17 @@ export function resolveStorageInstanceChunks(
1557
1603
  if (chunks === undefined) frameState.transientInstanceBuffers.push(active);
1558
1604
  }
1559
1605
  if (active === undefined) return null;
1560
- const needsUpload =
1561
- activeIsNew || active.uploadedRevision !== (inst.revision ?? inst.archVersion);
1562
- const rangesToUpload = [
1563
- {
1564
- start: 0,
1565
- end: count,
1566
- },
1567
- ];
1606
+ const localRanges = dirtyRanges
1607
+ .map((range) => ({
1608
+ start: Math.max(start, range.start) - start,
1609
+ end: Math.min(end, range.end) - start,
1610
+ }))
1611
+ .filter((range) => range.end > range.start);
1612
+ const needsUpload = activeIsNew || active.uploadedRevision !== inst.revision;
1613
+ const rangesToUpload = instanceUploadRangesForResident(activeIsNew, localRanges, {
1614
+ start: 0,
1615
+ end: count,
1616
+ });
1568
1617
  if (needsUpload && rangesToUpload.length > 0) {
1569
1618
  const upload = uploadInstanceRanges(
1570
1619
  c,
@@ -1584,8 +1633,7 @@ export function resolveStorageInstanceChunks(
1584
1633
  inst,
1585
1634
  {
1586
1635
  code: 'queue-write-buffer-failed',
1587
- expected:
1588
- 'the renderer-owned instance storage buffer accepts the complete instance payload',
1636
+ expected: 'the renderer-owned instance storage buffer accepts the dirty range',
1589
1637
  hint: 'retry after the active device is healthy or recover the renderer',
1590
1638
  },
1591
1639
  inst.instanceCount * strideBytes,
@@ -1595,8 +1643,8 @@ export function resolveStorageInstanceChunks(
1595
1643
  }
1596
1644
  }
1597
1645
  if (needsUpload) {
1598
- {
1599
- const published = { ...active, uploadedRevision: inst.revision ?? inst.archVersion };
1646
+ if (inst.revision !== undefined) {
1647
+ const published = { ...active, uploadedRevision: inst.revision };
1600
1648
  active = published;
1601
1649
  chunks?.set(chunkKey, published);
1602
1650
  }
@@ -1634,11 +1682,8 @@ export function resolveStorageInstanceChunks(
1634
1682
  return draws;
1635
1683
  }
1636
1684
 
1637
- export function resolveGeometryInstanceBuffer(
1638
- c: Pick<
1639
- _InternalRenderPipelineContext,
1640
- 'runtime' | 'pipelineState' | 'frameState' | 'bindGroupCounts'
1641
- >,
1685
+ function resolveGeometryInstanceBuffer(
1686
+ c: _InternalRenderPipelineContext,
1642
1687
  entry: _InternalRenderPipelineContext['validatedOrdered'][number],
1643
1688
  identityInstanceDraws: readonly GeometryInstanceDraw[],
1644
1689
  useProbeBlend: boolean,
@@ -1674,9 +1719,12 @@ export function resolveGeometryInstanceBuffer(
1674
1719
  // the shared identity buffer, which would silently render one instance.
1675
1720
  if (inst.instanceCount === 0) return [];
1676
1721
  const entityCacheKey = instanceCollectionCacheKey(entry.source.worldId, inst);
1677
- const revision = inst.revision ?? inst.archVersion;
1722
+ const revision = inst.revision;
1723
+ const dirtyRanges = inst.dirtyRanges;
1678
1724
  const sameRevision = (cached: InstanceBufferCacheEntry): boolean =>
1679
- cached.uploadedRevision === revision;
1725
+ revision === undefined
1726
+ ? cached.uploadedRevision === undefined
1727
+ : cached.uploadedRevision === revision;
1680
1728
  const fullRange = [{ start: 0, end: inst.instanceCount }] as const;
1681
1729
  let instanceBuffer: Buffer = pipelineState.identityInstanceBuffer;
1682
1730
  let instanceCount = 1;
@@ -1694,6 +1742,7 @@ export function resolveGeometryInstanceBuffer(
1694
1742
  const activeKeys = new Set<string>();
1695
1743
  const draws: GeometryInstanceDraw[] = [];
1696
1744
  const uniformStrideBytes = 16 * Float32Array.BYTES_PER_ELEMENT;
1745
+ const dirty = inst.dirtyRanges ?? fullRange;
1697
1746
  const uploadedRanges: { start: number; end: number }[] = [];
1698
1747
  let uploadedBytes = 0;
1699
1748
  for (let start = 0; start < inst.instanceCount; start += MAX_UNIFORM_INSTANCES) {
@@ -1739,13 +1788,17 @@ export function resolveGeometryInstanceBuffer(
1739
1788
  chunks?.set(chunkKey, active);
1740
1789
  if (chunks === undefined) frameState.transientInstanceBuffers.push(active);
1741
1790
  }
1791
+ const localRanges = dirty
1792
+ .map((range) => ({
1793
+ start: Math.max(start, range.start) - start,
1794
+ end: Math.min(start + count, range.end) - start,
1795
+ }))
1796
+ .filter((range) => range.end > range.start);
1742
1797
  const needsUpload = activeIsNew || !sameRevision(active);
1743
- const rangesToUpload = [
1744
- {
1745
- start: 0,
1746
- end: count,
1747
- },
1748
- ];
1798
+ const rangesToUpload = instanceUploadRangesForResident(activeIsNew, localRanges, {
1799
+ start: 0,
1800
+ end: count,
1801
+ });
1749
1802
  if (needsUpload && rangesToUpload.length > 0) {
1750
1803
  const upload = uploadInstanceRanges(
1751
1804
  c,
@@ -1765,8 +1818,7 @@ export function resolveGeometryInstanceBuffer(
1765
1818
  inst,
1766
1819
  {
1767
1820
  code: 'queue-write-buffer-failed',
1768
- expected:
1769
- 'the renderer-owned instance uniform buffer accepts the complete instance payload',
1821
+ expected: 'the renderer-owned instance uniform buffer accepts the dirty range',
1770
1822
  hint: 'retry after the active device is healthy or recover the renderer',
1771
1823
  },
1772
1824
  inst.instanceCount * uniformStrideBytes,
@@ -1776,7 +1828,8 @@ export function resolveGeometryInstanceBuffer(
1776
1828
  }
1777
1829
  }
1778
1830
  if (needsUpload) {
1779
- const published = { ...active, uploadedRevision: revision };
1831
+ const published =
1832
+ revision === undefined ? active : { ...active, uploadedRevision: revision };
1780
1833
  active = published;
1781
1834
  chunks?.set(chunkKey, published);
1782
1835
  }
@@ -1857,7 +1910,6 @@ export function resolveGeometryInstanceBuffer(
1857
1910
  if (!bufRes.ok) {
1858
1911
  runtime.errorRegistry.fire(bufRes.error);
1859
1912
  reportInstanceFailure(c, inst, bufRes.error, requestedBytes, cap);
1860
- return null;
1861
1913
  } else {
1862
1914
  // feat-20260619 M4 / F12: destroy the old cached buffer
1863
1915
  // before replacing it with the new one (D-6).
@@ -1880,7 +1932,11 @@ export function resolveGeometryInstanceBuffer(
1880
1932
  }
1881
1933
  if (active !== null) {
1882
1934
  const needsUpload = activeIsNew || !sameRevision(active);
1883
- const ranges = [fullRange[0]];
1935
+ const ranges = instanceUploadRangesForResident(
1936
+ activeIsNew,
1937
+ dirtyRanges ?? fullRange,
1938
+ fullRange[0],
1939
+ );
1884
1940
  let uploadRanges: readonly { readonly start: number; readonly end: number }[] = [];
1885
1941
  let uploadedBytes = 0;
1886
1942
  if (needsUpload && ranges.length > 0) {
@@ -1899,8 +1955,7 @@ export function resolveGeometryInstanceBuffer(
1899
1955
  inst,
1900
1956
  {
1901
1957
  code: 'queue-write-buffer-failed',
1902
- expected:
1903
- 'the renderer-owned instance buffer accepts the complete instance payloads',
1958
+ expected: 'the renderer-owned instance buffer accepts the dirty ranges',
1904
1959
  hint: 'retry after the active device is healthy or recover the renderer',
1905
1960
  },
1906
1961
  requestedBytes,
@@ -1914,7 +1969,8 @@ export function resolveGeometryInstanceBuffer(
1914
1969
  }
1915
1970
  }
1916
1971
  if (needsUpload) {
1917
- const published = { ...active, uploadedRevision: revision };
1972
+ const published =
1973
+ revision === undefined ? active : { ...active, uploadedRevision: revision };
1918
1974
  frameState.instanceBuffers.set(entityCacheKey, published);
1919
1975
  active = published;
1920
1976
  }
@@ -1949,10 +2005,7 @@ export function resolveGeometryInstanceBuffer(
1949
2005
  }
1950
2006
 
1951
2007
  export function resolveProbeBlendBuffer(
1952
- c: Pick<
1953
- _InternalRenderPipelineContext,
1954
- 'runtime' | 'pipelineState' | 'frameState' | 'bindGroupCounts'
1955
- >,
2008
+ c: _InternalRenderPipelineContext,
1956
2009
  record: import('../scene/probe-blend-record').ProbeBlendRecord | undefined,
1957
2010
  entityKey?: number,
1958
2011
  ): { readonly buffer: Buffer; readonly offset: number } {
@@ -2000,10 +2053,7 @@ export function resolveProbeBlendBuffer(
2000
2053
  }
2001
2054
 
2002
2055
  export function resolveGeometryInstancesBindGroup(
2003
- c: Pick<
2004
- _InternalRenderPipelineContext,
2005
- 'runtime' | 'pipelineState' | 'frameState' | 'bindGroupCounts'
2006
- >,
2056
+ c: _InternalRenderPipelineContext,
2007
2057
  instanceBuffer: Buffer,
2008
2058
  probeBuffer?: Buffer,
2009
2059
  ): BindGroup {
@@ -2013,8 +2063,13 @@ export function resolveGeometryInstancesBindGroup(
2013
2063
  ? pipelineState.instancesBindGroupLayout
2014
2064
  : pipelineState.probeInstancesBindGroupLayout;
2015
2065
  if (layout === undefined) throw new Error('probe instances bind-group layout is unavailable');
2066
+ // A few record-only fixtures construct a minimal frame state and omit the
2067
+ // shared bind-group cache. Production frames always provide it, but keeping
2068
+ // this resolver total lets those fixtures exercise the same binding path
2069
+ // without weakening the production cache contract.
2070
+ const instancesBgShared = frameState.instancesBgShared ?? new WeakMap<object, unknown>();
2016
2071
  return getOrCreateFromChain(
2017
- frameState.instancesBgShared,
2072
+ instancesBgShared,
2018
2073
  probeBuffer === undefined ? [layout, instanceBuffer] : [layout, instanceBuffer, probeBuffer],
2019
2074
  probeBuffer === undefined ? 'instances-no-probe' : 'instances-probe',
2020
2075
  () => {