@forgeax/engine-render 0.1.33 → 0.1.34

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 (518) hide show
  1. package/README.md +1010 -124
  2. package/dist/assembly/backend-contract.d.ts +2 -0
  3. package/dist/assembly/backend-contract.d.ts.map +1 -1
  4. package/dist/assembly/barrel-distortion-inspection.d.ts +3 -0
  5. package/dist/assembly/barrel-distortion-inspection.d.ts.map +1 -0
  6. package/dist/assembly/canvas-draw-guard.d.ts +3 -0
  7. package/dist/assembly/canvas-draw-guard.d.ts.map +1 -0
  8. package/dist/assembly/cloud-shadow-entry.d.ts +4 -0
  9. package/dist/assembly/cloud-shadow-entry.d.ts.map +1 -0
  10. package/dist/assembly/dynamic-geometry-host.d.ts +4 -1
  11. package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -1
  12. package/dist/assembly/dynamic-geometry-runtime.d.ts +1 -1
  13. package/dist/assembly/dynamic-geometry-runtime.d.ts.map +1 -1
  14. package/dist/assembly/factory.d.ts +1 -1
  15. package/dist/assembly/factory.d.ts.map +1 -1
  16. package/dist/assembly/host-contract.d.ts +3 -3
  17. package/dist/assembly/host-contract.d.ts.map +1 -1
  18. package/dist/assembly/material/assembly.d.ts.map +1 -1
  19. package/dist/assembly/material/pipeline-helpers.d.ts +5 -0
  20. package/dist/assembly/material/pipeline-helpers.d.ts.map +1 -1
  21. package/dist/assembly/material-shader-policy.d.ts +16 -2
  22. package/dist/assembly/material-shader-policy.d.ts.map +1 -1
  23. package/dist/assembly/material-shader-prewarm.d.ts.map +1 -1
  24. package/dist/assembly/recovery/device-loss-fanout.d.ts.map +1 -1
  25. package/dist/assembly/recovery/renderer-recover.d.ts +2 -0
  26. package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
  27. package/dist/assembly/render-feature-post-processes.d.ts +6 -0
  28. package/dist/assembly/render-feature-post-processes.d.ts.map +1 -0
  29. package/dist/assembly/renderer-facade.d.ts.map +1 -1
  30. package/dist/assembly/renderer-feature-inspection.d.ts +1 -1
  31. package/dist/assembly/renderer-feature-inspection.d.ts.map +1 -1
  32. package/dist/assembly/renderer-frame-transaction.d.ts +12 -0
  33. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
  34. package/dist/assembly/renderer-inspection.d.ts +11 -0
  35. package/dist/assembly/renderer-inspection.d.ts.map +1 -1
  36. package/dist/assembly/webgpu-pbr-ready.d.ts +1 -0
  37. package/dist/assembly/webgpu-pbr-ready.d.ts.map +1 -1
  38. package/dist/assembly/webgpu-ready-per-pass.d.ts +39 -0
  39. package/dist/assembly/webgpu-ready-per-pass.d.ts.map +1 -0
  40. package/dist/assembly/webgpu-ready.d.ts +1 -1
  41. package/dist/assembly/webgpu-ready.d.ts.map +1 -1
  42. package/dist/assembly/webgpu-renderer-bootstrap.d.ts.map +1 -1
  43. package/dist/assembly/webgpu-renderer-observation-owner.d.ts +35 -0
  44. package/dist/assembly/webgpu-renderer-observation-owner.d.ts.map +1 -0
  45. package/dist/assembly/webgpu-renderer.d.ts +1 -1
  46. package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
  47. package/dist/authoring.mjs +1 -1
  48. package/dist/barrel-distortion.d.ts +47 -0
  49. package/dist/barrel-distortion.d.ts.map +1 -0
  50. package/dist/{chunk-PA5DRJNI.mjs → chunk-ELJFJ2BU.mjs} +2 -2
  51. package/dist/chunk-ELJFJ2BU.mjs.map +1 -0
  52. package/dist/{chunk-ZDQWGQW7.mjs → chunk-HEB564WF.mjs} +4 -4
  53. package/dist/{chunk-ZDQWGQW7.mjs.map → chunk-HEB564WF.mjs.map} +1 -1
  54. package/dist/{chunk-VOZWDM3L.mjs → chunk-MKDIT2EM.mjs} +1307 -188
  55. package/dist/chunk-MKDIT2EM.mjs.map +1 -0
  56. package/dist/{chunk-LEAXOMYJ.mjs → chunk-OCDLEI6I.mjs} +3 -3
  57. package/dist/{chunk-LEAXOMYJ.mjs.map → chunk-OCDLEI6I.mjs.map} +1 -1
  58. package/dist/chunk-ODZWR6JQ.mjs +4927 -0
  59. package/dist/chunk-ODZWR6JQ.mjs.map +1 -0
  60. package/dist/{chunk-3RTCJTH4.mjs → chunk-SHFUFJ5N.mjs} +184 -13
  61. package/dist/chunk-SHFUFJ5N.mjs.map +1 -0
  62. package/dist/{chunk-OO3DRYK7.mjs → chunk-UI5SFODX.mjs} +176 -96
  63. package/dist/chunk-UI5SFODX.mjs.map +1 -0
  64. package/dist/{chunk-PLAXOOX5.mjs → chunk-UINHLCZA.mjs} +561 -79
  65. package/dist/chunk-UINHLCZA.mjs.map +1 -0
  66. package/dist/{chunk-NB2S7ZRX.mjs → chunk-WEX45HKH.mjs} +127 -386
  67. package/dist/chunk-WEX45HKH.mjs.map +1 -0
  68. package/dist/cloud/density.d.ts +55 -0
  69. package/dist/cloud/density.d.ts.map +1 -0
  70. package/dist/cloud/extract.d.ts +25 -0
  71. package/dist/cloud/extract.d.ts.map +1 -0
  72. package/dist/cloud/feature.d.ts +57 -0
  73. package/dist/cloud/feature.d.ts.map +1 -0
  74. package/dist/cloud/frame-context.d.ts +8 -0
  75. package/dist/cloud/frame-context.d.ts.map +1 -0
  76. package/dist/cloud/inspection.d.ts +59 -0
  77. package/dist/cloud/inspection.d.ts.map +1 -0
  78. package/dist/cloud/optics.d.ts +56 -0
  79. package/dist/cloud/optics.d.ts.map +1 -0
  80. package/dist/cloud/parameters.d.ts +73 -0
  81. package/dist/cloud/parameters.d.ts.map +1 -0
  82. package/dist/cloud/resources.d.ts +60 -0
  83. package/dist/cloud/resources.d.ts.map +1 -0
  84. package/dist/cloud/shadow.d.ts +42 -0
  85. package/dist/cloud/shadow.d.ts.map +1 -0
  86. package/dist/cloud/temporal.d.ts +74 -0
  87. package/dist/cloud/temporal.d.ts.map +1 -0
  88. package/dist/components/barrel-distortion.d.ts +13 -0
  89. package/dist/components/barrel-distortion.d.ts.map +1 -0
  90. package/dist/components/cloud-layer.d.ts +29 -0
  91. package/dist/components/cloud-layer.d.ts.map +1 -0
  92. package/dist/components/index.d.ts +2 -0
  93. package/dist/components/index.d.ts.map +1 -1
  94. package/dist/components/instances.d.ts +20 -6
  95. package/dist/components/instances.d.ts.map +1 -1
  96. package/dist/construct-renderer.d.ts +1 -1
  97. package/dist/construct-renderer.d.ts.map +1 -1
  98. package/dist/construct-renderer.mjs +6759 -2875
  99. package/dist/construct-renderer.mjs.map +1 -1
  100. package/dist/dynamic-geometry.d.ts +5 -1
  101. package/dist/dynamic-geometry.d.ts.map +1 -1
  102. package/dist/errors/cloud.d.ts +59 -0
  103. package/dist/errors/cloud.d.ts.map +1 -0
  104. package/dist/errors/render.d.ts +18 -4
  105. package/dist/errors/render.d.ts.map +1 -1
  106. package/dist/examples/single-layer-medium-surface.d.ts +47 -0
  107. package/dist/examples/single-layer-medium-surface.d.ts.map +1 -0
  108. package/dist/extract/camera.d.ts.map +1 -1
  109. package/dist/extract/contracts.d.ts +5 -1
  110. package/dist/extract/contracts.d.ts.map +1 -1
  111. package/dist/features/barrel-distortion.d.ts +29 -0
  112. package/dist/features/barrel-distortion.d.ts.map +1 -0
  113. package/dist/features/error-reporting.d.ts +6 -2
  114. package/dist/features/error-reporting.d.ts.map +1 -1
  115. package/dist/features/host.d.ts +10 -0
  116. package/dist/features/host.d.ts.map +1 -1
  117. package/dist/features/plan.d.ts +8 -0
  118. package/dist/features/plan.d.ts.map +1 -1
  119. package/dist/features/render-graph-contribution.d.ts +5 -0
  120. package/dist/features/render-graph-contribution.d.ts.map +1 -1
  121. package/dist/features/render-graph-raster.d.ts +1 -0
  122. package/dist/features/render-graph-raster.d.ts.map +1 -1
  123. package/dist/features/targets.d.ts +2 -0
  124. package/dist/features/targets.d.ts.map +1 -1
  125. package/dist/features/types.d.ts +44 -0
  126. package/dist/features/types.d.ts.map +1 -1
  127. package/dist/fullscreen-post-process-pass.d.ts +15 -7
  128. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  129. package/dist/gpu-dirty-ranges.d.ts +11 -0
  130. package/dist/gpu-dirty-ranges.d.ts.map +1 -0
  131. package/dist/gpu-driven/batch-topology.d.ts +17 -0
  132. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  133. package/dist/gpu-driven/material-artifacts.d.ts +6 -0
  134. package/dist/gpu-driven/material-artifacts.d.ts.map +1 -1
  135. package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
  136. package/dist/gpu-driven/production-raster-material.d.ts +178 -0
  137. package/dist/gpu-driven/production-raster-material.d.ts.map +1 -0
  138. package/dist/gpu-driven/production-raster.d.ts +47 -3
  139. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  140. package/dist/gpu-driven/resource-allocation.d.ts +31 -0
  141. package/dist/gpu-driven/resource-allocation.d.ts.map +1 -0
  142. package/dist/gpu-driven/shadow-ownership.d.ts +14 -0
  143. package/dist/gpu-driven/shadow-ownership.d.ts.map +1 -0
  144. package/dist/gpu-driven/view-gpu.d.ts +26 -2
  145. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  146. package/dist/gpu-scene.d.ts +5 -0
  147. package/dist/gpu-scene.d.ts.map +1 -1
  148. package/dist/hdrp-buffers.d.ts +2 -2
  149. package/dist/hdrp-buffers.d.ts.map +1 -1
  150. package/dist/ibl/skylight-bind-group.d.ts +10 -1
  151. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  152. package/dist/index.d.ts +27 -7
  153. package/dist/index.d.ts.map +1 -1
  154. package/dist/index.mjs +258 -8
  155. package/dist/index.mjs.map +1 -1
  156. package/dist/inspection-types.d.ts +135 -1
  157. package/dist/inspection-types.d.ts.map +1 -1
  158. package/dist/instance-buffer-cache.d.ts +4 -4
  159. package/dist/instance-buffer-cache.d.ts.map +1 -1
  160. package/dist/instances.d.ts +48 -100
  161. package/dist/instances.d.ts.map +1 -1
  162. package/dist/internal.mjs +7 -7
  163. package/dist/pbr-pipeline.d.ts +19 -1
  164. package/dist/pbr-pipeline.d.ts.map +1 -1
  165. package/dist/pipeline/single-layer-medium-passes.d.ts +73 -0
  166. package/dist/pipeline/single-layer-medium-passes.d.ts.map +1 -0
  167. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  168. package/dist/pipeline/standard-output/graph.d.ts.map +1 -1
  169. package/dist/pipeline/standard-output/types.d.ts +4 -2
  170. package/dist/pipeline/standard-output/types.d.ts.map +1 -1
  171. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  172. package/dist/pipeline/standard-post.d.ts.map +1 -1
  173. package/dist/pipeline-builder.d.ts +1 -1
  174. package/dist/pipeline-builder.d.ts.map +1 -1
  175. package/dist/plugin.d.ts.map +1 -1
  176. package/dist/prepare/prepared-graphics-resolver.d.ts +2 -0
  177. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
  178. package/dist/record/barrel-distortion-frame.d.ts +15 -0
  179. package/dist/record/barrel-distortion-frame.d.ts.map +1 -0
  180. package/dist/record/dynamic-geometry-consumption.d.ts +10 -2
  181. package/dist/record/dynamic-geometry-consumption.d.ts.map +1 -1
  182. package/dist/record/fold-buckets.d.ts +95 -0
  183. package/dist/record/fold-buckets.d.ts.map +1 -0
  184. package/dist/record/fold-instance-buffer.d.ts +6 -0
  185. package/dist/record/fold-instance-buffer.d.ts.map +1 -0
  186. package/dist/record/frame-lighting.d.ts +1 -0
  187. package/dist/record/frame-lighting.d.ts.map +1 -1
  188. package/dist/record/frame-snapshot.d.ts +37 -3
  189. package/dist/record/frame-snapshot.d.ts.map +1 -1
  190. package/dist/record/frame.d.ts +10 -61
  191. package/dist/record/frame.d.ts.map +1 -1
  192. package/dist/record/gpu-draw-receipts.d.ts +11 -0
  193. package/dist/record/gpu-draw-receipts.d.ts.map +1 -0
  194. package/dist/record/gpu-timing.d.ts +8 -0
  195. package/dist/record/gpu-timing.d.ts.map +1 -1
  196. package/dist/record/main-pass-geometry.d.ts +21 -5
  197. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  198. package/dist/record/main-pass-material.d.ts +7 -1
  199. package/dist/record/main-pass-material.d.ts.map +1 -1
  200. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  201. package/dist/record/main-pass.d.ts +13 -2
  202. package/dist/record/main-pass.d.ts.map +1 -1
  203. package/dist/record/motion-blur-receipt.d.ts +11 -0
  204. package/dist/record/motion-blur-receipt.d.ts.map +1 -0
  205. package/dist/record/probe-blend-buffer.d.ts +16 -0
  206. package/dist/record/probe-blend-buffer.d.ts.map +1 -0
  207. package/dist/record/recovery-pipeline.d.ts.map +1 -1
  208. package/dist/record/render-context.d.ts +22 -3
  209. package/dist/record/render-context.d.ts.map +1 -1
  210. package/dist/record/shadow-pass.d.ts +2 -0
  211. package/dist/record/shadow-pass.d.ts.map +1 -1
  212. package/dist/record/skybox-post-pass.d.ts +1 -1
  213. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  214. package/dist/record/typed-frame-graph.d.ts +22 -2
  215. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  216. package/dist/record/view-ubo.d.ts +11 -3
  217. package/dist/record/view-ubo.d.ts.map +1 -1
  218. package/dist/record/volume-params.d.ts +9 -0
  219. package/dist/record/volume-params.d.ts.map +1 -0
  220. package/dist/recovery/render-system-candidate.d.ts +10 -0
  221. package/dist/recovery/render-system-candidate.d.ts.map +1 -1
  222. package/dist/reflection/record-owner.d.ts.map +1 -1
  223. package/dist/render-contract.d.ts +42 -4
  224. package/dist/render-contract.d.ts.map +1 -1
  225. package/dist/render-graph-primitives.d.ts.map +1 -1
  226. package/dist/render-pipeline.d.ts +103 -2
  227. package/dist/render-pipeline.d.ts.map +1 -1
  228. package/dist/render-system-extract-tail.d.ts +3 -2
  229. package/dist/render-system-extract-tail.d.ts.map +1 -1
  230. package/dist/render-system-extract.d.ts +16 -9
  231. package/dist/render-system-extract.d.ts.map +1 -1
  232. package/dist/render-system-presentation.d.ts +23 -0
  233. package/dist/render-system-presentation.d.ts.map +1 -0
  234. package/dist/render-system-producer-roots.d.ts +10 -0
  235. package/dist/render-system-producer-roots.d.ts.map +1 -0
  236. package/dist/render-system-residency.d.ts +12 -0
  237. package/dist/render-system-residency.d.ts.map +1 -0
  238. package/dist/render-system.d.ts +19 -14
  239. package/dist/render-system.d.ts.map +1 -1
  240. package/dist/scene/probe-blend.d.ts +27 -0
  241. package/dist/scene/probe-blend.d.ts.map +1 -1
  242. package/dist/scene/render-scene.d.ts +12 -5
  243. package/dist/scene/render-scene.d.ts.map +1 -1
  244. package/dist/ssao-buffers.d.ts +9 -0
  245. package/dist/ssao-buffers.d.ts.map +1 -1
  246. package/dist/surface/dynamic-input.d.ts +133 -0
  247. package/dist/surface/dynamic-input.d.ts.map +1 -0
  248. package/dist/surface/gpu-driven.d.ts +41 -0
  249. package/dist/surface/gpu-driven.d.ts.map +1 -0
  250. package/dist/surface/submission-observation.d.ts +136 -0
  251. package/dist/surface/submission-observation.d.ts.map +1 -0
  252. package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
  253. package/dist/temporal/gpu.d.ts +13 -1
  254. package/dist/temporal/gpu.d.ts.map +1 -1
  255. package/dist/temporal/index.mjs +5 -5
  256. package/dist/temporal/inspection.d.ts.map +1 -1
  257. package/dist/temporal/standard-scene-data.d.ts.map +1 -1
  258. package/dist/temporal/target-coverage-attachment.d.ts.map +1 -1
  259. package/dist/transmission/single-layer-medium.d.ts +89 -0
  260. package/dist/transmission/single-layer-medium.d.ts.map +1 -0
  261. package/dist/typed-render-graph-primitives.d.ts +14 -2
  262. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  263. package/dist/volume/component.d.ts +9 -4
  264. package/dist/volume/component.d.ts.map +1 -1
  265. package/dist/volume/extract.d.ts +1 -1
  266. package/dist/volume/extract.d.ts.map +1 -1
  267. package/dist/volume/inspection.d.ts +2 -0
  268. package/dist/volume/inspection.d.ts.map +1 -1
  269. package/dist/volume/passes.d.ts +4 -1
  270. package/dist/volume/passes.d.ts.map +1 -1
  271. package/dist/volume/resources.d.ts.map +1 -1
  272. package/package.json +22 -21
  273. package/src/__tests__/atmosphere-daylight.dawn.test.ts +72 -0
  274. package/src/__tests__/barrel-distortion-lkg.integration.test.ts +353 -0
  275. package/src/__tests__/barrel-distortion.dawn.test.ts +41 -0
  276. package/src/__tests__/barrel-distortion.unit.test.ts +364 -0
  277. package/src/__tests__/construct-renderer-identity.unit.test.ts +49 -0
  278. package/src/__tests__/detached-recovery-graph.unit.test.ts +277 -0
  279. package/src/__tests__/device-loss-fanout.unit.test.ts +36 -1
  280. package/src/__tests__/docs-gate-green.unit.test.ts +112 -1
  281. package/src/__tests__/factory-contract.integration.test.ts +295 -45
  282. package/src/__tests__/feature-depth-input.dawn.test.ts +129 -2
  283. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +14 -3
  284. package/src/__tests__/gpu-dirty-ranges.unit.test.ts +22 -0
  285. package/src/__tests__/gpu-driven-baseline.characterization.test.ts +16 -3
  286. package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +12 -0
  287. package/src/__tests__/gpu-driven-material-artifacts.unit.test.ts +143 -0
  288. package/src/__tests__/gpu-driven-pbr.dawn.test.ts +2 -2
  289. package/src/__tests__/gpu-driven-production.integration.test.ts +482 -3
  290. package/src/__tests__/gpu-driven-shadow-views.dawn.test.ts +6 -5
  291. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +94 -6
  292. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +18 -2
  293. package/src/__tests__/gpu-driven-view.browser.test.ts +5 -8
  294. package/src/__tests__/gpu-driven-view.dawn.test.ts +6 -2
  295. package/src/__tests__/gpu-driven-view.unit.test.ts +1 -1
  296. package/src/__tests__/gpu-pass-timing-lifecycle.integration.test.ts +1 -0
  297. package/src/__tests__/gpu-pass-timing.browser.test.ts +6 -4
  298. package/src/__tests__/gpu-pass-timing.rhi-null.unit.test.ts +1 -0
  299. package/src/__tests__/gpu-scene.unit.test.ts +119 -9
  300. package/src/__tests__/instance-allocation-failure.unit.test.ts +57 -0
  301. package/src/__tests__/instances-culling.integration.test.ts +10 -36
  302. package/src/__tests__/instances-store.unit.test.ts +97 -305
  303. package/src/__tests__/instances-world-ownership.integration.test.ts +62 -0
  304. package/src/__tests__/main-pass-material-medium-selection.unit.test.ts +146 -0
  305. package/src/__tests__/material-shader-prewarm.unit.test.ts +59 -0
  306. package/src/__tests__/material-snapshot-mutation.integration.test.ts +39 -1
  307. package/src/__tests__/morph-culling-reentry.dawn.test.ts +5 -5
  308. package/src/__tests__/morph-visual-evidence.integration.test.ts +8 -7
  309. package/src/__tests__/motion-blur-compute.dawn.test.ts +13 -7
  310. package/src/__tests__/motion-blur.pixel.integration.test.ts +2 -2
  311. package/src/__tests__/nineslice-handle-surface.unit.test.ts +4 -4
  312. package/src/__tests__/pbr-view-layout.unit.test.ts +9 -0
  313. package/src/__tests__/physical-clearcoat.integration.test.ts +58 -0
  314. package/src/__tests__/prepared-graphics-capability.unit.test.ts +66 -2
  315. package/src/__tests__/probe-bindings.unit.test.ts +582 -1
  316. package/src/__tests__/probe-scene-dirty.integration.test.ts +28 -1
  317. package/src/__tests__/receipt-observation-retirement.unit.test.ts +65 -0
  318. package/src/__tests__/recovery-candidate-prepare.contract.test.ts +69 -0
  319. package/src/__tests__/render-error-code-owner.test-d.ts +7 -0
  320. package/src/__tests__/render-feature-diagnostics.unit.test.ts +15 -2
  321. package/src/__tests__/render-feature-error-reporting.unit.test.ts +21 -1
  322. package/src/__tests__/render-feature-prepared-diagnostics.unit.test.ts +10 -1
  323. package/src/__tests__/render-feature-retry.unit.test.ts +12 -1
  324. package/src/__tests__/render-scene-mixed-updates.integration.test.ts +145 -19
  325. package/src/__tests__/render-scene-projection.unit.test.ts +36 -11
  326. package/src/__tests__/render-scene-temporal-retry.unit.test.ts +20 -20
  327. package/src/__tests__/render-target-probe-soak.perf.test.ts +2 -2
  328. package/src/__tests__/render-temporal-environment-consumer.browser.test.ts +3 -3
  329. package/src/__tests__/render-temporal-environment-consumer.dawn.test.ts +5 -2
  330. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +41 -7
  331. package/src/__tests__/renderer-frame-generation-fence.integration.test.ts +16 -0
  332. package/src/__tests__/renderer-frame-transaction.integration.test.ts +26 -10
  333. package/src/__tests__/resource-allocation.unit.test.ts +123 -0
  334. package/src/__tests__/single-layer-medium-passes.unit.test.ts +275 -0
  335. package/src/__tests__/skin-motion-regression.unit.test.ts +70 -1
  336. package/src/__tests__/skin-palette-recycling.dawn.test.ts +97 -0
  337. package/src/__tests__/skinned-shadow-caster.test.ts +15 -0
  338. package/src/__tests__/ssr-carrier-public-contract.unit.test.ts +21 -0
  339. package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +4 -4
  340. package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +2 -2
  341. package/src/__tests__/ssr-gpu-dispatch.ts +1 -1
  342. package/src/__tests__/ssr-receiver-coverage.dawn.test.ts +6 -2
  343. package/src/__tests__/standard-output-chain-contract.unit.test.ts +28 -0
  344. package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +46 -1
  345. package/src/__tests__/standard-pipeline.integration.test.ts +182 -1
  346. package/src/__tests__/surface-dynamic-buffer-lifecycle.unit.test.ts +506 -0
  347. package/src/__tests__/surface-submission-observation.unit.test.ts +812 -0
  348. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +32 -0
  349. package/src/__tests__/temporal-performance.integration.test.ts +3 -3
  350. package/src/__tests__/visibility-instances.integration.test.ts +7 -19
  351. package/src/__tests__/visibility-producer-matrix.integration.test.ts +9 -20
  352. package/src/__tests__/volume-optics-oracle.unit.test.ts +4 -2
  353. package/src/__tests__/volumetric-fog-budget-recovery.integration.test.ts +30 -20
  354. package/src/__tests__/volumetric-fog-errors.unit.test.ts +4 -3
  355. package/src/__tests__/volumetric-fog-multiple.unit.test.ts +55 -0
  356. package/src/__tests__/volumetric-fog-spot-frame-optics.integration.test.ts +1 -1
  357. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +113 -9
  358. package/src/__tests__/volumetric-fog-topology.unit.test.ts +5 -3
  359. package/src/assembly/backend-contract.ts +30 -0
  360. package/src/assembly/barrel-distortion-inspection.ts +22 -0
  361. package/src/assembly/canvas-draw-guard.ts +11 -0
  362. package/src/assembly/cloud-shadow-entry.ts +22 -0
  363. package/src/assembly/dynamic-geometry-host.ts +65 -37
  364. package/src/assembly/dynamic-geometry-runtime.ts +7 -1
  365. package/src/assembly/factory.ts +2 -30
  366. package/src/assembly/host-contract.ts +3 -3
  367. package/src/assembly/material/assembly.ts +25 -13
  368. package/src/assembly/material/pipeline-helpers.ts +53 -12
  369. package/src/assembly/material-shader-policy.ts +55 -0
  370. package/src/assembly/material-shader-prewarm.ts +21 -10
  371. package/src/assembly/recovery/device-loss-fanout.ts +13 -0
  372. package/src/assembly/recovery/renderer-recover.ts +41 -18
  373. package/src/assembly/render-feature-post-processes.ts +54 -0
  374. package/src/assembly/renderer-facade.ts +4 -1
  375. package/src/assembly/renderer-feature-inspection.ts +8 -2
  376. package/src/assembly/renderer-frame-transaction.ts +23 -0
  377. package/src/assembly/renderer-inspection.ts +28 -0
  378. package/src/assembly/skin-palette-owner.ts +1 -1
  379. package/src/assembly/temporal-post-process-prewarm.ts +3 -3
  380. package/src/assembly/webgpu-pbr-ready.ts +9 -1
  381. package/src/assembly/webgpu-ready-per-pass.ts +104 -0
  382. package/src/assembly/webgpu-ready.ts +115 -61
  383. package/src/assembly/webgpu-renderer-bootstrap.ts +0 -12
  384. package/src/assembly/webgpu-renderer-observation-owner.ts +222 -0
  385. package/src/assembly/webgpu-renderer.ts +214 -252
  386. package/src/assembly/webgpu-vertex-layouts.ts +1 -1
  387. package/src/barrel-distortion.ts +247 -0
  388. package/src/cloud/__tests__/cloud-density-parity.dawn.test.ts +173 -0
  389. package/src/cloud/__tests__/cloud-layer-framebuffer-y.dawn.test.ts +265 -0
  390. package/src/cloud/__tests__/cloud-layer.browser.test.ts +432 -0
  391. package/src/cloud/__tests__/cloud-layer.unit.test.ts +634 -0
  392. package/src/cloud/density.ts +600 -0
  393. package/src/cloud/extract.ts +110 -0
  394. package/src/cloud/feature.ts +1810 -0
  395. package/src/cloud/frame-context.ts +42 -0
  396. package/src/cloud/inspection.ts +130 -0
  397. package/src/cloud/optics.ts +285 -0
  398. package/src/cloud/parameters.ts +255 -0
  399. package/src/cloud/resources.ts +122 -0
  400. package/src/cloud/shadow.ts +167 -0
  401. package/src/cloud/temporal.ts +226 -0
  402. package/src/components/barrel-distortion.ts +46 -0
  403. package/src/components/cloud-layer.ts +47 -0
  404. package/src/components/index.ts +2 -0
  405. package/src/components/instances.ts +18 -45
  406. package/src/components/sprite-instances.ts +1 -1
  407. package/src/construct-renderer.ts +1 -1
  408. package/src/dynamic-geometry.ts +12 -1
  409. package/src/errors/cloud.ts +103 -0
  410. package/src/errors/render.ts +44 -7
  411. package/src/examples/single-layer-medium-surface.ts +59 -0
  412. package/src/extract/camera.ts +15 -1
  413. package/src/extract/contracts.ts +5 -0
  414. package/src/features/barrel-distortion.ts +172 -0
  415. package/src/features/error-reporting.ts +26 -6
  416. package/src/features/host.ts +115 -14
  417. package/src/features/plan.ts +8 -0
  418. package/src/features/render-graph-contribution.ts +9 -0
  419. package/src/features/render-graph-raster.ts +45 -3
  420. package/src/features/targets.ts +66 -0
  421. package/src/features/types.ts +47 -0
  422. package/src/fullscreen-post-process-pass.ts +41 -9
  423. package/src/gpu-dirty-ranges.ts +48 -0
  424. package/src/gpu-driven/batch-topology.ts +53 -0
  425. package/src/gpu-driven/material-artifacts.ts +33 -25
  426. package/src/gpu-driven/prepared-draw.ts +12 -4
  427. package/src/gpu-driven/production-raster-material.ts +1894 -0
  428. package/src/gpu-driven/production-raster.ts +825 -784
  429. package/src/gpu-driven/resource-allocation.ts +142 -0
  430. package/src/gpu-driven/shadow-ownership.ts +71 -0
  431. package/src/gpu-driven/view-gpu.ts +164 -10
  432. package/src/gpu-scene.ts +75 -84
  433. package/src/hdrp-buffers.ts +4 -3
  434. package/src/ibl/skylight-bind-group.ts +49 -7
  435. package/src/index.ts +196 -9
  436. package/src/inspection-types.ts +162 -0
  437. package/src/instance-buffer-cache.ts +4 -4
  438. package/src/instances.ts +149 -569
  439. package/src/pbr-pipeline.ts +219 -13
  440. package/src/pipeline/single-layer-medium-passes.ts +267 -0
  441. package/src/pipeline/standard-forward-lane.ts +313 -57
  442. package/src/pipeline/standard-output/graph.ts +8 -2
  443. package/src/pipeline/standard-output/types.ts +12 -1
  444. package/src/pipeline/standard-pipeline.ts +291 -18
  445. package/src/pipeline/standard-post.ts +90 -24
  446. package/src/pipeline-builder.ts +1 -1
  447. package/src/plugin.ts +4 -0
  448. package/src/points-lines/__tests__/points-lines.bench.ts +17 -8
  449. package/src/prepare/prepared-graphics-resolver.ts +2 -0
  450. package/src/record/__tests__/main-pass-geometry.unit.test.ts +30 -0
  451. package/src/record/__tests__/sprite-material-abi.unit.test.ts +1 -1
  452. package/src/record/__tests__/temporal-payload.unit.test.ts +1 -1
  453. package/src/record/__tests__/transparent-group2-selection.unit.test.ts +11 -0
  454. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +1 -0
  455. package/src/record/__tests__/view-ubo-layout.unit.test.ts +4 -3
  456. package/src/record/barrel-distortion-frame.ts +110 -0
  457. package/src/record/dynamic-geometry-consumption.ts +39 -9
  458. package/src/record/fold-buckets.ts +852 -0
  459. package/src/record/fold-instance-buffer.ts +51 -0
  460. package/src/record/frame-lighting.ts +36 -2
  461. package/src/record/frame-snapshot.ts +39 -3
  462. package/src/record/frame.ts +217 -1084
  463. package/src/record/gpu-draw-receipts.ts +38 -0
  464. package/src/record/gpu-timing.ts +48 -5
  465. package/src/record/main-pass-geometry.ts +251 -82
  466. package/src/record/main-pass-material.ts +66 -4
  467. package/src/record/main-pass-sprite-draws.ts +7 -65
  468. package/src/record/main-pass.ts +156 -20
  469. package/src/record/motion-blur-receipt.ts +91 -0
  470. package/src/record/probe-blend-buffer.ts +180 -0
  471. package/src/record/recovery-pipeline.ts +35 -3
  472. package/src/record/render-context.ts +39 -3
  473. package/src/record/shadow-pass.ts +30 -1
  474. package/src/record/skybox-post-pass.ts +28 -4
  475. package/src/record/typed-frame-graph.ts +770 -134
  476. package/src/record/view-ubo.ts +26 -3
  477. package/src/record/volume-params.ts +225 -0
  478. package/src/recovery/render-system-candidate.ts +235 -42
  479. package/src/reflection/record-owner.ts +7 -3
  480. package/src/render-contract.ts +48 -4
  481. package/src/render-graph-primitives.ts +7 -1
  482. package/src/render-pipeline.ts +130 -0
  483. package/src/render-system-extract-tail.ts +57 -61
  484. package/src/render-system-extract.ts +74 -76
  485. package/src/render-system-presentation.ts +56 -0
  486. package/src/render-system-producer-roots.ts +96 -0
  487. package/src/render-system-residency.ts +159 -0
  488. package/src/render-system.ts +347 -363
  489. package/src/scene/probe-blend.ts +96 -4
  490. package/src/scene/render-scene.ts +349 -280
  491. package/src/ssao-buffers.ts +95 -2
  492. package/src/surface/__tests__/dynamic-input.unit.test.ts +374 -0
  493. package/src/surface/__tests__/gpu-driven.unit.test.ts +87 -0
  494. package/src/surface/dynamic-input.ts +658 -0
  495. package/src/surface/gpu-driven.ts +147 -0
  496. package/src/surface/submission-observation.ts +517 -0
  497. package/src/systems/skin-palette-allocator.ts +4 -1
  498. package/src/temporal/gpu.ts +101 -17
  499. package/src/temporal/inspection.ts +7 -1
  500. package/src/temporal/standard-scene-data.ts +5 -0
  501. package/src/temporal/target-coverage-attachment.ts +4 -0
  502. package/src/transmission/__tests__/single-layer-medium.unit.test.ts +149 -0
  503. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +12 -11
  504. package/src/transmission/single-layer-medium.ts +322 -0
  505. package/src/typed-render-graph-primitives.ts +70 -2
  506. package/src/volume/component.ts +10 -9
  507. package/src/volume/extract.ts +11 -5
  508. package/src/volume/inspection.ts +3 -0
  509. package/src/volume/passes.ts +87 -4
  510. package/src/volume/resources.ts +2 -1
  511. package/dist/chunk-3RTCJTH4.mjs.map +0 -1
  512. package/dist/chunk-NB2S7ZRX.mjs.map +0 -1
  513. package/dist/chunk-NNQL7CB3.mjs +0 -1713
  514. package/dist/chunk-NNQL7CB3.mjs.map +0 -1
  515. package/dist/chunk-OO3DRYK7.mjs.map +0 -1
  516. package/dist/chunk-PA5DRJNI.mjs.map +0 -1
  517. package/dist/chunk-PLAXOOX5.mjs.map +0 -1
  518. package/dist/chunk-VOZWDM3L.mjs.map +0 -1
@@ -15,6 +15,7 @@ import {
15
15
  buildGpuDrivenPbrPipelineLayout,
16
16
  buildGpuDrivenPbrSkinPipelineLayout,
17
17
  buildPbrSkinLayouts,
18
+ buildSurfaceDirectInstancesBindGroupLayout,
18
19
  type PbrPipelineLayoutBundle,
19
20
  SKIN_MATERIAL_SHADER_ID,
20
21
  } from '../pbr-pipeline';
@@ -43,6 +44,7 @@ export interface GpuDrivenPbrReadyLayouts {
43
44
  readonly gpuDrivenInstancesBindGroupLayout: BindGroupLayout | null;
44
45
  readonly gpuDrivenPbrPipelineLayout: PipelineLayout | null;
45
46
  readonly gpuDrivenPbrSkinPipelineLayout: PipelineLayout | null;
47
+ readonly surfaceDirectInstancesBindGroupLayout: BindGroupLayout | null;
46
48
  }
47
49
 
48
50
  interface GpuDrivenPbrModuleInput {
@@ -183,6 +185,7 @@ export function buildGpuDrivenPbrReadyLayouts(
183
185
  let gpuDrivenInstancesBindGroupLayout: BindGroupLayout | null = null;
184
186
  let gpuDrivenPbrPipelineLayout: PipelineLayout | null = null;
185
187
  let gpuDrivenPbrSkinPipelineLayout: PipelineLayout | null = null;
188
+ let surfaceDirectInstancesBindGroupLayout: BindGroupLayout | null = null;
186
189
  const skinResult = runShimSyncStep(
187
190
  () => ok(buildPbrSkinLayouts(device, { storageBuffer: storageBufferCapable }, pbrLayouts)),
188
191
  'webgpu-runtime-error',
@@ -200,6 +203,9 @@ export function buildGpuDrivenPbrReadyLayouts(
200
203
  const instances = buildGpuDrivenPbrInstancesBindGroupLayout(device, {
201
204
  storageBuffer: true,
202
205
  });
206
+ const surfaceDirect = buildSurfaceDirectInstancesBindGroupLayout(device, {
207
+ storageBuffer: true,
208
+ });
203
209
  const rigid = buildGpuDrivenPbrPipelineLayout(device, pbrLayouts, instances);
204
210
  const skin =
205
211
  pbrSkinMeshBindGroupLayout === null
@@ -209,7 +215,7 @@ export function buildGpuDrivenPbrReadyLayouts(
209
215
  { ...pbrLayouts, meshArrayBgl: pbrSkinMeshBindGroupLayout },
210
216
  instances,
211
217
  );
212
- return ok({ instances, rigid, skin });
218
+ return ok({ instances, rigid, skin, surfaceDirect });
213
219
  },
214
220
  'webgpu-runtime-error',
215
221
  'build GPU-driven PBR pipeline layouts succeeded',
@@ -219,6 +225,7 @@ export function buildGpuDrivenPbrReadyLayouts(
219
225
  gpuDrivenInstancesBindGroupLayout = layoutResult.value.instances;
220
226
  gpuDrivenPbrPipelineLayout = layoutResult.value.rigid;
221
227
  gpuDrivenPbrSkinPipelineLayout = layoutResult.value.skin;
228
+ surfaceDirectInstancesBindGroupLayout = layoutResult.value.surfaceDirect;
222
229
  }
223
230
  }
224
231
  return {
@@ -228,5 +235,6 @@ export function buildGpuDrivenPbrReadyLayouts(
228
235
  gpuDrivenInstancesBindGroupLayout,
229
236
  gpuDrivenPbrPipelineLayout,
230
237
  gpuDrivenPbrSkinPipelineLayout,
238
+ surfaceDirectInstancesBindGroupLayout,
231
239
  };
232
240
  }
@@ -0,0 +1,104 @@
1
+ import type { PerPassResources } from '../record/render-context';
2
+
3
+ export interface ReadyPerPassResourceInputs {
4
+ readonly fxaaPipeline: PerPassResources['fxaaPipeline'];
5
+ readonly fxaaBindGroupLayout: PerPassResources['fxaaBindGroupLayout'];
6
+ readonly fxaaSampler: PerPassResources['fxaaSampler'];
7
+ readonly skyboxPipeline: PerPassResources['skyboxPipeline'];
8
+ readonly skyboxPipelineMsaa: PerPassResources['skyboxPipelineMsaa'];
9
+ readonly skyboxBindGroupLayout: PerPassResources['skyboxBindGroupLayout'];
10
+ readonly skyboxSampler: PerPassResources['skyboxSampler'];
11
+ readonly skyboxRotationBuffer: PerPassResources['skyboxRotationBuffer'];
12
+ readonly shadowSampler: PerPassResources['shadowSampler'];
13
+ readonly shadowLightSpaceMatrix: PerPassResources['shadowLightSpaceMatrix'];
14
+ readonly shadowCsmLightViewProj: PerPassResources['shadowCsmLightViewProj'];
15
+ readonly shadowCsmSelection: PerPassResources['shadowCsmSelection'];
16
+ readonly bloomDownsamplePipeline: PerPassResources['bloomDownsamplePipeline'];
17
+ readonly bloomUpsamplePipeline: PerPassResources['bloomUpsamplePipeline'];
18
+ readonly bloomCompositePipeline: PerPassResources['bloomCompositePipeline'];
19
+ readonly bloomDownsampleBindGroupLayout: PerPassResources['bloomDownsampleBindGroupLayout'];
20
+ readonly bloomUpsampleBindGroupLayout: PerPassResources['bloomUpsampleBindGroupLayout'];
21
+ readonly bloomCompositeBindGroupLayout: PerPassResources['bloomCompositeBindGroupLayout'];
22
+ readonly bloomSampler: PerPassResources['bloomSampler'];
23
+ readonly bloomDownsampleParamsBuffer: PerPassResources['bloomDownsampleParamsBuffer'];
24
+ readonly bloomUpsampleParamsBuffer: PerPassResources['bloomUpsampleParamsBuffer'];
25
+ readonly bloomCompositeParamsBuffer: PerPassResources['bloomCompositeParamsBuffer'];
26
+ readonly ensureBloomResources: NonNullable<PerPassResources['ensureBloomResources']>;
27
+ readonly getBloomResources: NonNullable<PerPassResources['getBloomResources']>;
28
+ readonly commitBloomResources: NonNullable<PerPassResources['commitBloomResources']>;
29
+ readonly commitBloomFrameReceipts: NonNullable<PerPassResources['commitBloomFrameReceipts']>;
30
+ readonly discardBloomResources: NonNullable<PerPassResources['discardBloomResources']>;
31
+ readonly retireBloomResources: NonNullable<PerPassResources['retireBloomResources']>;
32
+ readonly drainBloomResources: NonNullable<PerPassResources['drainBloomResources']>;
33
+ readonly inspectBloomResources: NonNullable<PerPassResources['inspectBloomResources']>;
34
+ readonly ssaoCalcPipeline: PerPassResources['ssaoCalcPipeline'];
35
+ readonly ssaoBlurPipeline: PerPassResources['ssaoBlurPipeline'];
36
+ readonly ssaoBgl: PerPassResources['ssaoBgl'];
37
+ }
38
+
39
+ /** Creates the mutable per-pass slots owned by one prepared device generation. */
40
+ export function createReadyPerPassResources(input: ReadyPerPassResourceInputs): PerPassResources {
41
+ return {
42
+ depthTexture: null,
43
+ depthTextureView: null,
44
+ depthTextureWidth: 0,
45
+ depthTextureHeight: 0,
46
+ configured: false,
47
+ hdrColorTexture: null,
48
+ hdrColorView: null,
49
+ hdrDepthTexture: null,
50
+ hdrDepthView: null,
51
+ hdrTextureWidth: 0,
52
+ hdrTextureHeight: 0,
53
+ hdrDepthSampleCount: 1,
54
+ fxaaPipeline: input.fxaaPipeline,
55
+ fxaaBindGroupLayout: input.fxaaBindGroupLayout,
56
+ fxaaSampler: input.fxaaSampler,
57
+ msaaColorTexture: null,
58
+ msaaColorView: null,
59
+ msaaSpriteColorTexture: null,
60
+ msaaSpriteColorView: null,
61
+ msaaDepthTexture: null,
62
+ msaaDepthView: null,
63
+ msaaTextureWidth: 0,
64
+ msaaTextureHeight: 0,
65
+ hdrColorMsaaTexture: null,
66
+ hdrColorMsaaView: null,
67
+ skyboxPipeline: input.skyboxPipeline,
68
+ skyboxPipelineMsaa: input.skyboxPipelineMsaa,
69
+ skyboxBindGroupLayout: input.skyboxBindGroupLayout,
70
+ skyboxSampler: input.skyboxSampler,
71
+ skyboxRotationBuffer: input.skyboxRotationBuffer,
72
+ shadowTexture: null,
73
+ shadowMapSize: 0,
74
+ shadowCascadeCount: 0,
75
+ shadowSampler: input.shadowSampler,
76
+ shadowLightSpaceMatrix: input.shadowLightSpaceMatrix,
77
+ shadowCsmLightViewProj: input.shadowCsmLightViewProj,
78
+ shadowCsmSelection: input.shadowCsmSelection,
79
+ bloomDownsamplePipeline: input.bloomDownsamplePipeline,
80
+ bloomUpsamplePipeline: input.bloomUpsamplePipeline,
81
+ bloomCompositePipeline: input.bloomCompositePipeline,
82
+ bloomDownsampleBindGroupLayout: input.bloomDownsampleBindGroupLayout,
83
+ bloomUpsampleBindGroupLayout: input.bloomUpsampleBindGroupLayout,
84
+ bloomCompositeBindGroupLayout: input.bloomCompositeBindGroupLayout,
85
+ bloomSampler: input.bloomSampler,
86
+ bloomDownsampleParamsBuffer: input.bloomDownsampleParamsBuffer,
87
+ bloomUpsampleParamsBuffer: input.bloomUpsampleParamsBuffer,
88
+ bloomCompositeParamsBuffer: input.bloomCompositeParamsBuffer,
89
+ ensureBloomResources: input.ensureBloomResources,
90
+ getBloomResources: input.getBloomResources,
91
+ commitBloomResources: input.commitBloomResources,
92
+ commitBloomFrameReceipts: input.commitBloomFrameReceipts,
93
+ discardBloomResources: input.discardBloomResources,
94
+ retireBloomResources: input.retireBloomResources,
95
+ drainBloomResources: input.drainBloomResources,
96
+ inspectBloomResources: input.inspectBloomResources,
97
+ ssaoCalcPipeline: input.ssaoCalcPipeline,
98
+ ssaoBlurPipeline: input.ssaoBlurPipeline,
99
+ ssaoBgl: input.ssaoBgl,
100
+ ssaoFilteringSampler: null,
101
+ ssaoDepthSampler: null,
102
+ ssaoFallbackRawView: null,
103
+ };
104
+ }
@@ -30,6 +30,7 @@ import type { ManifestEntry } from '@forgeax/engine-types';
30
30
  import { handleSlot } from '@forgeax/engine-types';
31
31
  import { prewarmDepthOfField } from '../features/depth-of-field/depth-of-field-assembly';
32
32
  import { prewarmAtmosphereShaders } from './atmosphere-shader-prewarm';
33
+ import { selectCloudShadowCompatibleEntry } from './cloud-shadow-entry';
33
34
  import { prewarmSsrShaders } from './ssr-shader-prewarm';
34
35
 
35
36
  export type { MaterialShaderManifestEntry } from '@forgeax/engine-shader';
@@ -85,11 +86,10 @@ import { deriveExtendedLightingCapability } from '../prepare/extended-lighting/r
85
86
  import type { BloomPersistentBundle } from '../record/render-context';
86
87
  import { SHADOW_CASTER_BUFFER_SIZE } from '../record/shadow-pass';
87
88
  import { POINTS_LINES_VIEW_BUFFER_SIZE } from '../record/view-ubo';
88
- import {
89
- type AtmosphereShaderSources,
90
- type SsrShaderSources,
91
- STANDARD_OUTPUT_TRANSFORM_FEATURE_ID,
92
- type VolumetricFogShaderSources,
89
+ import type {
90
+ AtmosphereShaderSources,
91
+ SsrShaderSources,
92
+ VolumetricFogShaderSources,
93
93
  } from '../render-contract';
94
94
  import {
95
95
  MATERIAL_PER_ENTITY_STRIDE,
@@ -129,6 +129,7 @@ import {
129
129
  VIEW_UBO_BYTES,
130
130
  } from './webgpu-ready-contract';
131
131
  import { prewarmMipmapPipeline } from './webgpu-ready-mipmap';
132
+ import { createReadyPerPassResources } from './webgpu-ready-per-pass';
132
133
 
133
134
  /**
134
135
  * Build the `Renderer.initialization` Promise (D-S3 three-step strict-serial chain).
@@ -235,8 +236,7 @@ export async function buildReadyWebGPU(
235
236
  ): Promise<PipelineState> {
236
237
  const extendedLightingShaderAvailable = deriveExtendedLightingCapability(rhiDevice).admitted;
237
238
  // Shader and layout construction consume the same storage capability.
238
- const capValue = (rhiDevice.limits as Readonly<Record<string, number>>)
239
- .maxStorageBuffersPerShaderStage;
239
+ const capValue = rhiDevice.limits.maxStorageBuffersPerShaderStage;
240
240
  const webgl2Downlevel = rhiDevice.caps.backendKind === 'wgpu-webgl2';
241
241
  let storageBufferCapable = !webgl2Downlevel && rhiDevice.caps.storageBuffer;
242
242
  if (typeof capValue === 'number') {
@@ -590,11 +590,25 @@ export async function buildReadyWebGPU(
590
590
  return wgsl !== undefined ? { ...entry, wgsl } : entry;
591
591
  };
592
592
  pbrEntry = patchRuntimeVariant(pbrEntry, 'forgeax::default-standard-pbr');
593
+ const pbrMaterialEntry = Array.from(registry.materialShaderManifestEntries()).find(
594
+ (entry) => entry.identifier === 'forgeax::default-standard-pbr',
595
+ );
596
+ pbrEntry = selectCloudShadowCompatibleEntry(pbrEntry, pbrMaterialEntry, projectorAvailable);
593
597
  if (pbrSkinEntry !== undefined) {
594
598
  pbrSkinEntry = patchRuntimeVariant(
595
599
  patchRuntimeVariant(pbrSkinEntry, SKIN_MATERIAL_SHADER_ID),
596
600
  'forgeax::default-standard-pbr-skin',
597
601
  );
602
+ const pbrSkinMaterialEntry = Array.from(registry.materialShaderManifestEntries()).find(
603
+ (entry) =>
604
+ entry.identifier === SKIN_MATERIAL_SHADER_ID ||
605
+ entry.identifier === 'forgeax::default-standard-pbr-skin',
606
+ );
607
+ pbrSkinEntry = selectCloudShadowCompatibleEntry(
608
+ pbrSkinEntry,
609
+ pbrSkinMaterialEntry,
610
+ projectorAvailable,
611
+ );
598
612
  }
599
613
  unlitEntry = patchRuntimeVariant(unlitEntry, 'forgeax::default-unlit');
600
614
  if (shadowCasterEntry !== undefined) {
@@ -693,7 +707,7 @@ export async function buildReadyWebGPU(
693
707
  seedShaderModule,
694
708
  });
695
709
  for (const postProcess of requiredFullscreenPostProcesses) {
696
- const label = postProcessShaderModuleLabel(postProcess.identity, postProcess.source);
710
+ const label = postProcessShaderModuleLabel(postProcess.source);
697
711
  const shaderResult = await runShimStep(
698
712
  () =>
699
713
  asyncCreateShaderModule
@@ -1111,7 +1125,7 @@ export async function buildReadyWebGPU(
1111
1125
  // frames (e.g. the hello-tonemap dawn smoke) would stall on a black frame
1112
1126
  // forever. Mirror the shadow_caster prewarm: await-compile the tonemap module
1113
1127
  // here and `seedShaderModule` it under the exact label
1114
- // `buildPostProcessPipeline` requests (`post-process-${id}-module`), so the
1128
+ // `buildPostProcessPipeline` requests (keyed by shader source), so the
1115
1129
  // first `getPostProcessPipeline(STANDARD_OUTPUT_TRANSFORM_FEATURE_ID, …)` hits the module cache
1116
1130
  // synchronously and builds the pipeline on frame 1.
1117
1131
  const tonemapPrewarm = await runShimStep(
@@ -1119,27 +1133,18 @@ export async function buildReadyWebGPU(
1119
1133
  asyncCreateShaderModule
1120
1134
  ? asyncCreateShaderModule(rhiDevice, {
1121
1135
  code: tonemapEntry.wgsl,
1122
- label: postProcessShaderModuleLabel(
1123
- STANDARD_OUTPUT_TRANSFORM_FEATURE_ID,
1124
- tonemapEntry.wgsl,
1125
- ),
1136
+ label: postProcessShaderModuleLabel(tonemapEntry.wgsl),
1126
1137
  })
1127
1138
  : invokeDeviceCreateShaderModule(rhiDevice, {
1128
1139
  code: tonemapEntry.wgsl,
1129
- label: postProcessShaderModuleLabel(
1130
- STANDARD_OUTPUT_TRANSFORM_FEATURE_ID,
1131
- tonemapEntry.wgsl,
1132
- ),
1140
+ label: postProcessShaderModuleLabel(tonemapEntry.wgsl),
1133
1141
  }),
1134
1142
  'shader-compile-failed',
1135
1143
  'tonemap shader module compiled (unified post-process prewarm)',
1136
1144
  'inspect manifest tonemap entry composed wgsl; check device.features',
1137
1145
  );
1138
1146
  if (!tonemapPrewarm.ok) throw tonemapPrewarm.error;
1139
- seedShaderModule(
1140
- postProcessShaderModuleLabel(STANDARD_OUTPUT_TRANSFORM_FEATURE_ID, tonemapEntry.wgsl),
1141
- tonemapPrewarm.value,
1142
- );
1147
+ seedShaderModule(postProcessShaderModuleLabel(tonemapEntry.wgsl), tonemapPrewarm.value);
1143
1148
  registerBuiltinTonemap(tonemapEntry.wgsl);
1144
1149
 
1145
1150
  // Prewarm temporal fullscreen modules before readiness so first-frame
@@ -1309,6 +1314,12 @@ export async function buildReadyWebGPU(
1309
1314
  if (!fxaaShaderResult.ok) throw fxaaShaderResult.error;
1310
1315
  fxaaModule = fxaaShaderResult.value;
1311
1316
  registerBuiltinFxaa(fxaaEntry.wgsl);
1317
+ // The typed graph may need a second FXAA pipeline for a graph-owned
1318
+ // linear-LDR target (for example BarrelDistortion + FXAA). Seed the
1319
+ // shared post-process adapter with the already compiled module so that
1320
+ // this alternate color format is available on the first submitted
1321
+ // frame instead of waiting for an async recompile.
1322
+ seedShaderModule(postProcessShaderModuleLabel(fxaaEntry.wgsl), fxaaModule);
1312
1323
  }
1313
1324
 
1314
1325
  // feat-20260531-skybox-env-background M3 / w15: skybox shader module.
@@ -1479,6 +1490,7 @@ export async function buildReadyWebGPU(
1479
1490
  let hdrpPbrPipelineLayoutHandle: PipelineLayout | null = null;
1480
1491
  let hdrpMeshBindGroupLayoutHandle: BindGroupLayout | null = null;
1481
1492
  let hdrpProbePbrPipelineLayoutHandle: PipelineLayout | null = null;
1493
+ let hdrpUnifiedBglHandle: BindGroupLayout | null = null;
1482
1494
  // The cluster layout is storage-buffer backed. On the WebGL2/fallback
1483
1495
  // capability tier its uniform-buffer projection exceeds the backend's
1484
1496
  // fragment-stage limit, and HDRP is not a valid route there anyway.
@@ -1486,6 +1498,7 @@ export async function buildReadyWebGPU(
1486
1498
  const hdrpUnifiedBglDesc = createHdrpBindGroupLayoutDescriptor();
1487
1499
  const hdrpUnifiedBglRes = rhiDevice.createBindGroupLayout(hdrpUnifiedBglDesc);
1488
1500
  if (hdrpUnifiedBglRes.ok) {
1501
+ hdrpUnifiedBglHandle = hdrpUnifiedBglRes.value;
1489
1502
  hdrpMeshBindGroupLayoutHandle = hdrpUnifiedBglRes.value;
1490
1503
  const hdrpPlRes = rhiDevice.createPipelineLayout({
1491
1504
  label: 'hdrp-pbr-pl',
@@ -1571,6 +1584,7 @@ export async function buildReadyWebGPU(
1571
1584
  gpuDrivenInstancesBindGroupLayout: gpuDrivenInstancesBindGroupLayoutHandle,
1572
1585
  gpuDrivenPbrPipelineLayout: gpuDrivenPbrPipelineLayoutHandle,
1573
1586
  gpuDrivenPbrSkinPipelineLayout: gpuDrivenPbrSkinPipelineLayoutHandle,
1587
+ surfaceDirectInstancesBindGroupLayout: surfaceDirectInstancesBindGroupLayoutHandle,
1574
1588
  } = buildGpuDrivenPbrReadyLayouts(rhiDevice, storageBufferCapable, pbrLayouts.value);
1575
1589
  let hdrpSkinPipelineLayoutHandle: PipelineLayout | null = null;
1576
1590
  let hdrpSkinMeshBindGroupLayoutHandle: BindGroupLayout | null = null;
@@ -1595,6 +1609,46 @@ export async function buildReadyWebGPU(
1595
1609
  }
1596
1610
  }
1597
1611
 
1612
+ // GPU-driven Standard batches use the compact scene-index slot(3) while
1613
+ // retaining the same clustered group(2) bind group that the ordinary main
1614
+ // pass publishes. Build a matching pipeline layout from those exact
1615
+ // producer-owned layouts; a separate URP mesh-array layout would validate
1616
+ // the indirect draw but reject its clustered bind group at encode time.
1617
+ let gpuDrivenClusterPbrPipelineLayoutHandle: PipelineLayout | null = null;
1618
+ let gpuDrivenClusterPbrSkinPipelineLayoutHandle: PipelineLayout | null = null;
1619
+ if (
1620
+ storageBufferCapable &&
1621
+ hdrpUnifiedBglHandle !== null &&
1622
+ gpuDrivenInstancesBindGroupLayoutHandle !== null
1623
+ ) {
1624
+ const rigidResult = rhiDevice.createPipelineLayout({
1625
+ label: 'pbr-gpu-driven-cluster-pl',
1626
+ bindGroupLayouts: [
1627
+ viewBglResult.value,
1628
+ materialBglResult.value,
1629
+ hdrpUnifiedBglHandle,
1630
+ gpuDrivenInstancesBindGroupLayoutHandle,
1631
+ ],
1632
+ });
1633
+ if (rigidResult.ok) gpuDrivenClusterPbrPipelineLayoutHandle = rigidResult.value;
1634
+ }
1635
+ if (
1636
+ storageBufferCapable &&
1637
+ hdrpSkinMeshBindGroupLayoutHandle !== null &&
1638
+ gpuDrivenInstancesBindGroupLayoutHandle !== null
1639
+ ) {
1640
+ const skinResult = rhiDevice.createPipelineLayout({
1641
+ label: 'pbr-skin-gpu-driven-cluster-pl',
1642
+ bindGroupLayouts: [
1643
+ viewBglResult.value,
1644
+ materialBglResult.value,
1645
+ hdrpSkinMeshBindGroupLayoutHandle,
1646
+ gpuDrivenInstancesBindGroupLayoutHandle,
1647
+ ],
1648
+ });
1649
+ if (skinResult.ok) gpuDrivenClusterPbrSkinPipelineLayoutHandle = skinResult.value;
1650
+ }
1651
+
1598
1652
  // feat-20260612-skin-palette-per-frame-upload M1 / m1-2: skin palette
1599
1653
  // allocator. Replaces the prior 16320 B identity-seeded UBO stub (PR #353,
1600
1654
  // feat-20260611 R2 / M8 / w28 IS-14, retired identity-buffer field) with
@@ -1622,9 +1676,7 @@ export async function buildReadyWebGPU(
1622
1676
  const skinPaletteLimitKey = storageBufferCapable
1623
1677
  ? 'maxStorageBufferBindingSize'
1624
1678
  : 'maxUniformBufferBindingSize';
1625
- const skinPaletteDeviceLimit = (rhiDevice.limits as Readonly<Record<string, number>>)[
1626
- skinPaletteLimitKey
1627
- ];
1679
+ const skinPaletteDeviceLimit = rhiDevice.limits[skinPaletteLimitKey];
1628
1680
  const SKIN_PALETTE_MAX_BINDING_BYTES =
1629
1681
  typeof skinPaletteDeviceLimit === 'number' && skinPaletteDeviceLimit > 0
1630
1682
  ? skinPaletteDeviceLimit
@@ -2016,6 +2068,24 @@ export async function buildReadyWebGPU(
2016
2068
  );
2017
2069
  if (!defaultSamplerResult.ok) throw defaultSamplerResult.error;
2018
2070
 
2071
+ // r32float Surface raw-depth views are unfilterable. Keep their sampler
2072
+ // distinct from the filtering material sampler so WebGPU's sample-type
2073
+ // validation remains explicit at the material BGL boundary.
2074
+ const surfaceMediumDepthSamplerResult = runShimSyncStep(
2075
+ () =>
2076
+ rhiDevice.createSampler({
2077
+ label: 'surface-medium-depth-sampler',
2078
+ magFilter: 'nearest',
2079
+ minFilter: 'nearest',
2080
+ addressModeU: 'clamp-to-edge',
2081
+ addressModeV: 'clamp-to-edge',
2082
+ }),
2083
+ 'webgpu-runtime-error',
2084
+ 'createSampler (single-layer medium raw depth) succeeded',
2085
+ 'check device.limits.maxSamplersPerShaderStage',
2086
+ );
2087
+ if (!surfaceMediumDepthSamplerResult.ok) throw surfaceMediumDepthSamplerResult.error;
2088
+
2019
2089
  // feat-20260520-directional-light-shadow-mapping M1c / w8 + M2 / w14:
2020
2090
  // shadow comparison sampler — clamp-to-edge, linear filter, compare:'less'.
2021
2091
  // Used for shadow map sampling in M2/M3 and shadow depth pass. comparison
@@ -3879,6 +3949,18 @@ export async function buildReadyWebGPU(
3879
3949
  gpuDrivenPbrPrograms,
3880
3950
  gpuDrivenPbrSkinPipelineLayout:
3881
3951
  unlitModule !== null && pbrModule !== null ? gpuDrivenPbrSkinPipelineLayoutHandle : null,
3952
+ surfaceDirectInstancesBindGroupLayout:
3953
+ unlitModule !== null && pbrModule !== null
3954
+ ? surfaceDirectInstancesBindGroupLayoutHandle
3955
+ : null,
3956
+ gpuDrivenClusterPbrPipelineLayout:
3957
+ unlitModule !== null && pbrModule !== null ? gpuDrivenClusterPbrPipelineLayoutHandle : null,
3958
+ gpuDrivenClusterPbrSkinPipelineLayout:
3959
+ unlitModule !== null && pbrModule !== null
3960
+ ? gpuDrivenClusterPbrSkinPipelineLayoutHandle
3961
+ : null,
3962
+ gpuDrivenClusterMeshBindGroupLayout:
3963
+ unlitModule !== null && pbrModule !== null ? hdrpUnifiedBglHandle : null,
3882
3964
  // HDRP variant uses the unified group(2) layout built above.
3883
3965
  hdrpPbrPipelineLayout:
3884
3966
  unlitModule !== null && pbrModule !== null ? hdrpPbrPipelineLayoutHandle : null,
@@ -3924,6 +4006,7 @@ export async function buildReadyWebGPU(
3924
4006
  probeInstancesBindGroupLayout: probeInstancesBglResult.value,
3925
4007
  identityInstanceBuffer: identityInstanceResult.value,
3926
4008
  defaultSampler: defaultSamplerResult.value,
4009
+ surfaceMediumDepthSampler: surfaceMediumDepthSamplerResult.value,
3927
4010
  fallbackTextureView: fallbackTextureViewResult.value,
3928
4011
  defaultWhiteTextureView: fallbackTextureViewResult.value,
3929
4012
  // Exactly neutral half-float RG=(0.5,0.5) decodes to tangent (0,0,1).
@@ -3952,44 +4035,15 @@ export async function buildReadyWebGPU(
3952
4035
  // matrices fold into the View UBO tail (`view.spotLightViewProj`); no
3953
4036
  // dedicated buffer / view-BG binding 9 (WebGL2 uniform-buffer budget).
3954
4037
  skylightFallback,
3955
- // feat-20260529-rendergraph-pass-abstraction M3 / w11 (D-2 + Finding 3):
3956
- // per-pass mutable resource slots moved to PerPassResources.
3957
- perPassResources: {
3958
- depthTexture: null,
3959
- depthTextureView: null,
3960
- depthTextureWidth: 0,
3961
- depthTextureHeight: 0,
3962
- configured: false,
3963
- hdrColorTexture: null,
3964
- hdrColorView: null,
3965
- hdrDepthTexture: null,
3966
- hdrDepthView: null,
3967
- hdrTextureWidth: 0,
3968
- hdrTextureHeight: 0,
3969
- hdrDepthSampleCount: 1,
4038
+ perPassResources: createReadyPerPassResources({
3970
4039
  fxaaPipeline: fxaaPipelineHandle,
3971
4040
  fxaaBindGroupLayout: fxaaBglHandle,
3972
4041
  fxaaSampler: fxaaSamplerHandle,
3973
- // feat-20260604-learn-render-4.10-anti-aliasing-msaa M2 / w7: MSAA
3974
- // attachment slots. All null/0 until the first antialias='msaa' frame.
3975
- msaaColorTexture: null,
3976
- msaaColorView: null,
3977
- msaaSpriteColorTexture: null,
3978
- msaaSpriteColorView: null,
3979
- msaaDepthTexture: null,
3980
- msaaDepthView: null,
3981
- msaaTextureWidth: 0,
3982
- msaaTextureHeight: 0,
3983
- hdrColorMsaaTexture: null,
3984
- hdrColorMsaaView: null,
3985
4042
  skyboxPipeline: skyboxPipelineHandle,
3986
4043
  skyboxPipelineMsaa: skyboxPipelineMsaaHandle,
3987
4044
  skyboxBindGroupLayout: skyboxBglHandle,
3988
4045
  skyboxSampler: skyboxSamplerHandle,
3989
4046
  skyboxRotationBuffer: skyboxRotationBufferHandle,
3990
- shadowTexture: null,
3991
- shadowMapSize: 0,
3992
- shadowCascadeCount: 0,
3993
4047
  shadowSampler: shadowSamplerResult.value,
3994
4048
  shadowLightSpaceMatrix: null,
3995
4049
  shadowCsmLightViewProj: null,
@@ -4020,13 +4074,13 @@ export async function buildReadyWebGPU(
4020
4074
  ssaoCalcPipeline: ssaoCalcPipelineHandle,
4021
4075
  ssaoBlurPipeline: ssaoBlurPipelineHandle,
4022
4076
  ssaoBgl: ssaoBglHandle,
4023
- // M8 / w38: lazy-allocated on first SSAO record frame. Sampler kinds
4024
- // and the 1x1 ssaoRaw fallback view are constant across frames and
4025
- // cached after first construction.
4026
- ssaoFilteringSampler: null,
4027
- ssaoDepthSampler: null,
4028
- ssaoFallbackRawView: null,
4029
- },
4077
+ }),
4030
4078
  };
4079
+ // Boot-time fallback resources submit real GPU work before the renderer is
4080
+ // published. Keep initialization as the readiness barrier for the first
4081
+ // frame: a Worker can otherwise receive `ready`, start its frame deadline,
4082
+ // and report `frame-submitted` while that earlier queue work still holds the
4083
+ // receipt's completion fence.
4084
+ await queue.onSubmittedWorkDone();
4031
4085
  return pipelineState;
4032
4086
  }
@@ -53,18 +53,6 @@ export async function tryCreateWebGPURenderer(
53
53
  onDeviceLost: (detail) => lossObserver.current?.(detail),
54
54
  });
55
55
 
56
- if (pack._internal_getRawDevice && pack.translateErrorEventToRhiError) {
57
- const backendDevice = pack._internal_getRawDevice(device);
58
- if (backendDevice && typeof backendDevice === 'object') {
59
- const target = backendDevice as {
60
- onuncapturederror?: ((event: unknown) => void) | null;
61
- };
62
- target.onuncapturederror = (event: unknown): void => {
63
- const translated = pack.translateErrorEventToRhiError?.(event);
64
- if (translated && !translated.ok) errorRegistry.fire(translated.error);
65
- };
66
- }
67
- }
68
56
  return {
69
57
  kind: 'ok',
70
58
  renderer: await createRenderer({