@forgeax/engine-render 0.1.6 → 0.1.19
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.
- package/README.md +279 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/assembly/backend-contract.d.ts +12 -0
- package/dist/assembly/backend-contract.d.ts.map +1 -1
- package/dist/assembly/factory.d.ts +19 -2
- package/dist/assembly/factory.d.ts.map +1 -1
- package/dist/assembly/host-contract.d.ts +4 -0
- package/dist/assembly/host-contract.d.ts.map +1 -1
- package/dist/assembly/material/assembly.d.ts.map +1 -1
- package/dist/assembly/renderer-frame-transaction.d.ts +39 -0
- package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -0
- package/dist/assembly/renderer-inspection.d.ts +22 -0
- package/dist/assembly/renderer-inspection.d.ts.map +1 -0
- package/dist/assembly/renderer-lifecycle.d.ts +4 -0
- package/dist/assembly/renderer-lifecycle.d.ts.map +1 -0
- package/dist/authoring.d.ts +1 -0
- package/dist/authoring.d.ts.map +1 -1
- package/dist/authoring.mjs +4 -2
- package/dist/authoring.mjs.map +1 -1
- package/dist/chunk-FJ6P52EE.mjs +46 -0
- package/dist/chunk-FJ6P52EE.mjs.map +1 -0
- package/dist/chunk-IPXCABEP.mjs +73 -0
- package/dist/chunk-IPXCABEP.mjs.map +1 -0
- package/dist/chunk-JDWARUOI.mjs +44 -0
- package/dist/chunk-JDWARUOI.mjs.map +1 -0
- package/dist/chunk-LOSO4CTV.mjs +901 -0
- package/dist/chunk-LOSO4CTV.mjs.map +1 -0
- package/dist/chunk-PCHBPYML.mjs +385 -0
- package/dist/chunk-PCHBPYML.mjs.map +1 -0
- package/dist/chunk-RJRUS55L.mjs +9323 -0
- package/dist/chunk-RJRUS55L.mjs.map +1 -0
- package/dist/{chunk-QC4VW3XJ.mjs → chunk-RXZ3RGOU.mjs} +4 -30
- package/dist/chunk-RXZ3RGOU.mjs.map +1 -0
- package/dist/{chunk-CQXZC5XI.mjs → chunk-VFPLTKCU.mjs} +79 -69
- package/dist/chunk-VFPLTKCU.mjs.map +1 -0
- package/dist/{chunk-SCRSAK5B.mjs → chunk-YTQ5C7YQ.mjs} +231 -127
- package/dist/chunk-YTQ5C7YQ.mjs.map +1 -0
- package/dist/components/atmosphere.d.ts +9 -0
- package/dist/components/atmosphere.d.ts.map +1 -0
- package/dist/components/camera.d.ts +2 -1
- package/dist/components/camera.d.ts.map +1 -1
- package/dist/components/fog.d.ts +8 -0
- package/dist/components/fog.d.ts.map +1 -0
- package/dist/components/index.d.ts +5 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/lines.d.ts +5 -0
- package/dist/components/lines.d.ts.map +1 -0
- package/dist/components/motion-blur.d.ts +7 -0
- package/dist/components/motion-blur.d.ts.map +1 -0
- package/dist/components/points.d.ts +15 -0
- package/dist/components/points.d.ts.map +1 -0
- package/dist/construct-renderer.d.ts +2 -2
- package/dist/construct-renderer.d.ts.map +1 -1
- package/dist/construct-renderer.mjs +11419 -16442
- package/dist/construct-renderer.mjs.map +1 -1
- package/dist/device/device-scope.d.ts +4 -0
- package/dist/device/device-scope.d.ts.map +1 -1
- package/dist/environment/frame.d.ts +60 -0
- package/dist/environment/frame.d.ts.map +1 -0
- package/dist/environment/generation.d.ts +21 -0
- package/dist/environment/generation.d.ts.map +1 -0
- package/dist/environment/graph.d.ts +4 -0
- package/dist/environment/graph.d.ts.map +1 -0
- package/dist/environment/inspection.d.ts +48 -0
- package/dist/environment/inspection.d.ts.map +1 -0
- package/dist/environment/lifecycle.d.ts +39 -0
- package/dist/environment/lifecycle.d.ts.map +1 -0
- package/dist/environment/signature.d.ts +25 -0
- package/dist/environment/signature.d.ts.map +1 -0
- package/dist/errors/render.d.ts +217 -1
- package/dist/errors/render.d.ts.map +1 -1
- package/dist/extract/camera.d.ts +5 -0
- package/dist/extract/camera.d.ts.map +1 -0
- package/dist/extract/environment.d.ts +74 -0
- package/dist/extract/environment.d.ts.map +1 -0
- package/dist/extract/visibility.d.ts +1 -1
- package/dist/extract/visibility.d.ts.map +1 -1
- package/dist/features/host.d.ts +9 -2
- package/dist/features/host.d.ts.map +1 -1
- package/dist/features/motion-blur/motion-blur-feature.d.ts +16 -0
- package/dist/features/motion-blur/motion-blur-feature.d.ts.map +1 -0
- package/dist/features/motion-blur/motion-blur-params.d.ts +25 -0
- package/dist/features/motion-blur/motion-blur-params.d.ts.map +1 -0
- package/dist/features/plan.d.ts +17 -2
- package/dist/features/plan.d.ts.map +1 -1
- package/dist/features/prepared-gpu-work.d.ts +3 -1
- package/dist/features/prepared-gpu-work.d.ts.map +1 -1
- package/dist/features/prepared-graphics.d.ts +2 -1
- package/dist/features/prepared-graphics.d.ts.map +1 -1
- package/dist/features/render-graph-raster.d.ts +7 -2
- package/dist/features/render-graph-raster.d.ts.map +1 -1
- package/dist/features/targets.d.ts +3 -0
- package/dist/features/targets.d.ts.map +1 -1
- package/dist/features/types.d.ts +12 -0
- package/dist/features/types.d.ts.map +1 -1
- package/dist/fullscreen-post-process-pass.d.ts +7 -1
- package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
- package/dist/gpu-driven/production-raster.d.ts.map +1 -1
- package/dist/gpu-scene.d.ts +2 -0
- package/dist/gpu-scene.d.ts.map +1 -1
- package/dist/ibl/skylight-bind-group.d.ts +5 -6
- package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
- package/dist/index.d.ts +21 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +8 -4
- package/dist/index.mjs.map +1 -1
- package/dist/inspection-types.d.ts +46 -1
- package/dist/inspection-types.d.ts.map +1 -1
- package/dist/internal.d.ts +2 -0
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.mjs +2 -0
- package/dist/materials.d.ts +22 -0
- package/dist/materials.d.ts.map +1 -1
- package/dist/pbr-pipeline.d.ts +12 -6
- package/dist/pbr-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
- package/dist/pipeline/standard-pipeline.d.ts +3 -0
- package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-post.d.ts +48 -0
- package/dist/pipeline/standard-post.d.ts.map +1 -0
- package/dist/pipeline/standard-profile.d.ts +3 -6
- package/dist/pipeline/standard-profile.d.ts.map +1 -1
- package/dist/pipeline-builder.d.ts +18 -0
- package/dist/pipeline-builder.d.ts.map +1 -1
- package/dist/pipeline-spec.d.ts.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/points-lines/admission.d.ts +36 -0
- package/dist/points-lines/admission.d.ts.map +1 -0
- package/dist/points-lines/bounds.d.ts +8 -0
- package/dist/points-lines/bounds.d.ts.map +1 -0
- package/dist/points-lines/expansion-cache.d.ts +28 -0
- package/dist/points-lines/expansion-cache.d.ts.map +1 -0
- package/dist/points-lines/inspection.d.ts +53 -0
- package/dist/points-lines/inspection.d.ts.map +1 -0
- package/dist/points-lines/prepare.d.ts +67 -0
- package/dist/points-lines/prepare.d.ts.map +1 -0
- package/dist/points-lines/record.d.ts +60 -0
- package/dist/points-lines/record.d.ts.map +1 -0
- package/dist/points-lines/snapshot.d.ts +49 -0
- package/dist/points-lines/snapshot.d.ts.map +1 -0
- package/dist/record/frame-lighting.d.ts.map +1 -1
- package/dist/record/frame-snapshot.d.ts +100 -5
- package/dist/record/frame-snapshot.d.ts.map +1 -1
- package/dist/record/frame-targets.d.ts.map +1 -1
- package/dist/record/frame.d.ts +4 -2
- package/dist/record/frame.d.ts.map +1 -1
- package/dist/record/main-pass-geometry.d.ts +18 -0
- package/dist/record/main-pass-geometry.d.ts.map +1 -1
- package/dist/record/main-pass-material.d.ts +8 -5
- package/dist/record/main-pass-material.d.ts.map +1 -1
- package/dist/record/main-pass-sprite-draws.d.ts +8 -1
- package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
- package/dist/record/main-pass.d.ts +2 -0
- package/dist/record/main-pass.d.ts.map +1 -1
- package/dist/record/mesh-ssbo.d.ts.map +1 -1
- package/dist/record/render-context.d.ts +93 -18
- package/dist/record/render-context.d.ts.map +1 -1
- package/dist/record/shadow-pass.d.ts.map +1 -1
- package/dist/record/skybox-post-pass.d.ts +1 -11
- package/dist/record/skybox-post-pass.d.ts.map +1 -1
- package/dist/record/typed-frame-graph.d.ts +26 -2
- package/dist/record/typed-frame-graph.d.ts.map +1 -1
- package/dist/record/view-ubo.d.ts +10 -1
- package/dist/record/view-ubo.d.ts.map +1 -1
- package/dist/render-contract.d.ts +102 -10
- package/dist/render-contract.d.ts.map +1 -1
- package/dist/render-graph-primitives.d.ts.map +1 -1
- package/dist/render-pipeline.d.ts +50 -6
- package/dist/render-pipeline.d.ts.map +1 -1
- package/dist/render-system-extract.d.ts +32 -5
- package/dist/render-system-extract.d.ts.map +1 -1
- package/dist/render-system.d.ts +27 -5
- package/dist/render-system.d.ts.map +1 -1
- package/dist/scene/render-scene-types.d.ts +3 -0
- package/dist/scene/render-scene-types.d.ts.map +1 -1
- package/dist/scene/render-scene.d.ts +43 -2
- package/dist/scene/render-scene.d.ts.map +1 -1
- package/dist/temporal/coverage.d.ts +42 -0
- package/dist/temporal/coverage.d.ts.map +1 -0
- package/dist/temporal/frame-coordinator.d.ts +99 -0
- package/dist/temporal/frame-coordinator.d.ts.map +1 -0
- package/dist/temporal/gpu.d.ts +39 -0
- package/dist/temporal/gpu.d.ts.map +1 -0
- package/dist/temporal/history.d.ts +37 -0
- package/dist/temporal/history.d.ts.map +1 -0
- package/dist/temporal/index.d.ts +7 -0
- package/dist/temporal/index.d.ts.map +1 -0
- package/dist/temporal/index.mjs +8 -0
- package/dist/temporal/index.mjs.map +1 -0
- package/dist/temporal/inspection.d.ts +36 -0
- package/dist/temporal/inspection.d.ts.map +1 -0
- package/dist/temporal/scene-data-catalog.d.ts +48 -0
- package/dist/temporal/scene-data-catalog.d.ts.map +1 -0
- package/dist/temporal/scene-data.d.ts +43 -0
- package/dist/temporal/scene-data.d.ts.map +1 -0
- package/dist/temporal/standard-scene-data.d.ts +61 -0
- package/dist/temporal/standard-scene-data.d.ts.map +1 -0
- package/dist/temporal/taa-history-resources.d.ts +22 -0
- package/dist/temporal/taa-history-resources.d.ts.map +1 -0
- package/dist/temporal/taa-history-store.d.ts +27 -0
- package/dist/temporal/taa-history-store.d.ts.map +1 -0
- package/dist/temporal/taa-resolve.d.ts +15 -0
- package/dist/temporal/taa-resolve.d.ts.map +1 -0
- package/dist/temporal/temporal-view.d.ts +40 -0
- package/dist/temporal/temporal-view.d.ts.map +1 -0
- package/dist/temporal/transaction.d.ts +9 -0
- package/dist/temporal/transaction.d.ts.map +1 -0
- package/dist/temporal/view.d.ts +56 -0
- package/dist/temporal/view.d.ts.map +1 -0
- package/dist/transmission/backdrop.d.ts +147 -0
- package/dist/transmission/backdrop.d.ts.map +1 -0
- package/dist/transmission/inspection.d.ts +57 -0
- package/dist/transmission/inspection.d.ts.map +1 -0
- package/dist/transmission/oracle.d.ts +42 -0
- package/dist/transmission/oracle.d.ts.map +1 -0
- package/dist/transmission/projection.d.ts +37 -0
- package/dist/transmission/projection.d.ts.map +1 -0
- package/dist/typed-render-graph-primitives.d.ts +25 -2
- package/dist/typed-render-graph-primitives.d.ts.map +1 -1
- package/package.json +24 -19
- package/src/__tests__/ai-user-cold-start.integration.test.ts +59 -0
- package/src/__tests__/ai-user-public-surface.test-d.ts +45 -0
- package/src/__tests__/authoring-path.unit.test.ts +9 -0
- package/src/__tests__/bloom-exact-zero.unit.test.ts +202 -0
- package/src/__tests__/bloom-lifecycle.integration.test.ts +125 -0
- package/src/__tests__/construct-renderer-identity.unit.test.ts +4 -3
- package/src/__tests__/detached-inspection.integration.test.ts +177 -0
- package/src/__tests__/environment-fog-lanes.integration.test.ts +219 -0
- package/src/__tests__/environment-generation.integration.test.ts +141 -0
- package/src/__tests__/environment-selection.unit.test.ts +245 -0
- package/src/__tests__/factory-contract.integration.test.ts +1380 -9
- package/src/__tests__/frame-plan-contract.unit.test.ts +90 -0
- package/src/__tests__/fullscreen-feature-plan.unit.test.ts +7 -0
- package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +12 -2
- package/src/__tests__/gpu-driven-production.integration.test.ts +74 -22
- package/src/__tests__/gpu-driven-view-graph.integration.test.ts +37 -0
- package/src/__tests__/gpu-scene.unit.test.ts +10 -0
- package/src/__tests__/injection-kind-owner.test-d.ts +2 -1
- package/src/__tests__/material-contract-inventory.unit.test.ts +62 -0
- package/src/__tests__/material-cooked-projection.unit.test.ts +18 -124
- package/src/__tests__/material-static-dynamic-route.unit.test.ts +28 -28
- package/src/__tests__/materials-transmission-validation.unit.test.ts +36 -0
- package/src/__tests__/morph-feature-plan.unit.test.ts +7 -0
- package/src/__tests__/motion-blur.pixel.integration.test.ts +121 -0
- package/src/__tests__/public-surface.test-d.ts +15 -1
- package/src/__tests__/render-error-code-owner.test-d.ts +15 -0
- package/src/__tests__/render-error-detail-ssot.test-d.ts +11 -2
- package/src/__tests__/render-error-exhaustive.test-d.ts +22 -0
- package/src/__tests__/render-feature-errors.unit.test.ts +33 -3
- package/src/__tests__/render-feature-gpu-work.integration.test.ts +44 -0
- package/src/__tests__/render-feature-plan.test-d.ts +22 -89
- package/src/__tests__/render-scene-projection.unit.test.ts +28 -0
- package/src/__tests__/render-temporal-environment-consumer.browser.test.ts +26 -0
- package/src/__tests__/render-temporal-environment-consumer.dawn.test.ts +21 -0
- package/src/__tests__/renderer-factory-material-contract.unit.test.ts +433 -1
- package/src/__tests__/renderer-frame-transaction.integration.test.ts +405 -0
- package/src/__tests__/renderer-lifecycle.integration.test.ts +22 -0
- package/src/__tests__/scene-data-catalog.unit.test.ts +59 -0
- package/src/__tests__/scene-data-consumer.integration.test.ts +67 -0
- package/src/__tests__/scene-data-contract.test-d.ts +35 -0
- package/src/__tests__/scene-data-inspection.unit.test.ts +41 -0
- package/src/__tests__/scene-data-public-surface.test-d.ts +34 -0
- package/src/__tests__/shader-manifest-fixture.ts +111 -0
- package/src/__tests__/skinned-shadow-caster.test.ts +102 -0
- package/src/__tests__/standard-clustered-pipeline.unit.test.ts +24 -3
- package/src/__tests__/standard-pipeline.dawn.test.ts +15 -0
- package/src/__tests__/standard-pipeline.integration.test.ts +543 -1
- package/src/__tests__/standard-profile-oracle.unit.test.ts +10 -2
- package/src/__tests__/standard-temporal-producer.integration.test.ts +35 -0
- package/src/__tests__/surface-configuration.unit.test.ts +211 -12
- package/src/__tests__/taa-transaction.integration.test.ts +30 -0
- package/src/__tests__/temporal-admission.integration.test.ts +40 -0
- package/src/__tests__/temporal-coverage.unit.test.ts +35 -0
- package/src/__tests__/temporal-demand.unit.test.ts +44 -0
- package/src/__tests__/temporal-frame-coordinator.unit.test.ts +64 -0
- package/src/__tests__/temporal-graph-topology.unit.test.ts +51 -0
- package/src/__tests__/temporal-history-lifecycle.unit.test.ts +170 -0
- package/src/__tests__/temporal-performance.integration.test.ts +615 -0
- package/src/__tests__/temporal-reset-matrix.unit.test.ts +97 -0
- package/src/__tests__/temporal-transaction.integration.test.ts +60 -0
- package/src/__tests__/temporal-view.unit.test.ts +152 -0
- package/src/__tests__/transmission-prewarm.unit.test.ts +93 -0
- package/src/__tests__/typed-pipeline-topology.unit.test.ts +230 -1
- package/src/__tests__/urp-pipeline-targets.unit.test.ts +25 -1
- package/src/__tests__/urp-pipeline.unit.test.ts +4 -3
- package/src/__tests__/visibility-extract.integration.test.ts +27 -1
- package/src/__tests__/visibility-producer-matrix.integration.test.ts +10 -0
- package/src/assembly/backend-contract.ts +47 -1
- package/src/assembly/factory.ts +1295 -507
- package/src/assembly/host-contract.ts +4 -0
- package/src/assembly/material/assembly.ts +2 -5
- package/src/assembly/renderer-frame-transaction.ts +75 -0
- package/src/assembly/renderer-inspection.ts +112 -0
- package/src/assembly/renderer-lifecycle.ts +6 -0
- package/src/authoring.ts +1 -0
- package/src/components/__tests__/motion-blur.unit.test.ts +14 -0
- package/src/components/__tests__/points-lines-admission.unit.test.ts +219 -0
- package/src/components/__tests__/points-lines-schema.unit.test.ts +56 -0
- package/src/components/__tests__/schema-contract.unit.test.ts +6 -1
- package/src/components/atmosphere.ts +10 -0
- package/src/components/camera.ts +2 -1
- package/src/components/fog.ts +9 -0
- package/src/components/index.ts +10 -0
- package/src/components/lines.ts +18 -0
- package/src/components/motion-blur.ts +8 -0
- package/src/components/points.ts +40 -0
- package/src/construct-renderer.ts +40 -3
- package/src/device/device-scope.ts +15 -1
- package/src/environment/frame.ts +185 -0
- package/src/environment/generation.ts +23 -0
- package/src/environment/graph.ts +9 -0
- package/src/environment/inspection.ts +87 -0
- package/src/environment/lifecycle.ts +250 -0
- package/src/environment/signature.ts +55 -0
- package/src/errors/render.ts +429 -1
- package/src/extract/camera.ts +78 -0
- package/src/extract/environment.ts +171 -0
- package/src/extract/visibility.ts +38 -19
- package/src/features/host.ts +36 -5
- package/src/features/motion-blur/__tests__/motion-blur-feature.unit.test.ts +67 -0
- package/src/features/motion-blur/__tests__/motion-blur-params.unit.test.ts +53 -0
- package/src/features/motion-blur/motion-blur-feature.ts +119 -0
- package/src/features/motion-blur/motion-blur-params.ts +89 -0
- package/src/features/plan.ts +32 -3
- package/src/features/prepared-gpu-work.ts +21 -6
- package/src/features/prepared-graphics.ts +2 -1
- package/src/features/render-graph-raster.ts +24 -4
- package/src/features/targets.ts +24 -2
- package/src/features/types.ts +13 -0
- package/src/fullscreen-post-process-pass.ts +34 -4
- package/src/gpu-driven/production-raster.ts +6 -1
- package/src/gpu-scene.ts +24 -0
- package/src/ibl/skylight-bind-group.ts +30 -38
- package/src/index.ts +83 -6
- package/src/inspection-types.ts +52 -0
- package/src/internal.ts +5 -0
- package/src/materials.ts +119 -24
- package/src/pbr-pipeline.ts +66 -20
- package/src/pipeline/standard-forward-lane.ts +158 -101
- package/src/pipeline/standard-pipeline.ts +156 -105
- package/src/pipeline/standard-post.ts +373 -0
- package/src/pipeline/standard-profile.ts +11 -11
- package/src/pipeline-builder.ts +102 -12
- package/src/pipeline-spec.ts +9 -0
- package/src/plugin.ts +6 -0
- package/src/points-lines/__tests__/bounds.unit.test.ts +21 -0
- package/src/points-lines/__tests__/cache-recovery.unit.test.ts +157 -0
- package/src/points-lines/__tests__/inspection-lanes.integration.test.ts +146 -0
- package/src/points-lines/__tests__/inspection.unit.test.ts +173 -0
- package/src/points-lines/__tests__/lane-structural.integration.test.ts +122 -0
- package/src/points-lines/__tests__/points-lines.bench.ts +400 -0
- package/src/points-lines/__tests__/raster-lane.integration.test.ts +44 -0
- package/src/points-lines/__tests__/snapshot.unit.test.ts +101 -0
- package/src/points-lines/__tests__/view-ubo.unit.test.ts +73 -0
- package/src/points-lines/admission.ts +238 -0
- package/src/points-lines/bounds.ts +23 -0
- package/src/points-lines/expansion-cache.ts +215 -0
- package/src/points-lines/inspection.ts +97 -0
- package/src/points-lines/prepare.ts +177 -0
- package/src/points-lines/record.ts +125 -0
- package/src/points-lines/snapshot.ts +130 -0
- package/src/record/__tests__/fullscreen-temporal-routing.unit.test.ts +25 -0
- package/src/record/__tests__/main-pass-geometry.unit.test.ts +47 -0
- package/src/record/__tests__/material-bg-cache.unit.test.ts +12 -1
- package/src/record/__tests__/material-pipeline-pending-cache.unit.test.ts +22 -0
- package/src/record/__tests__/sprite-material-abi.unit.test.ts +75 -0
- package/src/record/__tests__/standard-pbr-ubo-layout.unit.test.ts +67 -0
- package/src/record/__tests__/temporal-payload.unit.test.ts +164 -0
- package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +127 -0
- package/src/record/frame-lighting.ts +14 -2
- package/src/record/frame-snapshot.ts +129 -5
- package/src/record/frame-targets.ts +15 -6
- package/src/record/frame.ts +119 -4
- package/src/record/main-pass-geometry.ts +178 -40
- package/src/record/main-pass-material.ts +114 -66
- package/src/record/main-pass-sprite-draws.ts +79 -102
- package/src/record/main-pass.ts +83 -7
- package/src/record/mesh-ssbo.ts +22 -3
- package/src/record/render-context.ts +209 -23
- package/src/record/shadow-pass.ts +129 -28
- package/src/record/skybox-post-pass.ts +99 -42
- package/src/record/typed-frame-graph.ts +582 -42
- package/src/record/view-ubo.ts +99 -4
- package/src/render-contract.ts +121 -7
- package/src/render-graph-primitives.ts +18 -1
- package/src/render-pipeline.ts +100 -27
- package/src/render-system-extract.ts +264 -77
- package/src/render-system.ts +786 -43
- package/src/scene/render-scene-types.ts +3 -0
- package/src/scene/render-scene.ts +307 -9
- package/src/temporal/__tests__/taa-history-resources.unit.test.ts +45 -0
- package/src/temporal/coverage.ts +76 -0
- package/src/temporal/frame-coordinator.ts +311 -0
- package/src/temporal/gpu.ts +287 -0
- package/src/temporal/history.ts +92 -0
- package/src/temporal/index.ts +6 -0
- package/src/temporal/inspection.ts +97 -0
- package/src/temporal/scene-data-catalog.ts +200 -0
- package/src/temporal/scene-data.ts +149 -0
- package/src/temporal/standard-scene-data.ts +182 -0
- package/src/temporal/taa-history-resources.ts +128 -0
- package/src/temporal/taa-history-store.ts +79 -0
- package/src/temporal/taa-resolve.ts +34 -0
- package/src/temporal/temporal-view.ts +169 -0
- package/src/temporal/transaction.ts +17 -0
- package/src/temporal/view.ts +161 -0
- package/src/transmission/__tests__/capability.unit.test.ts +83 -0
- package/src/transmission/__tests__/composition.integration.test.ts +161 -0
- package/src/transmission/__tests__/inspection.unit.test.ts +241 -0
- package/src/transmission/__tests__/lifecycle.integration.test.ts +96 -0
- package/src/transmission/__tests__/oracle.unit.test.ts +131 -0
- package/src/transmission/__tests__/projection.unit.test.ts +71 -0
- package/src/transmission/__tests__/standard-transmission.dawn.test.ts +438 -0
- package/src/transmission/__tests__/transmission-backdrop-topology.unit.test.ts +109 -0
- package/src/transmission/__tests__/transmission-backdrop.dawn.test.ts +105 -0
- package/src/transmission/backdrop.ts +572 -0
- package/src/transmission/inspection.ts +190 -0
- package/src/transmission/oracle.ts +141 -0
- package/src/transmission/projection.ts +83 -0
- package/src/typed-render-graph-primitives.ts +162 -9
- package/dist/__tests__/authoring-path.unit.test.d.ts +0 -2
- package/dist/__tests__/authoring-path.unit.test.d.ts.map +0 -1
- package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts +0 -2
- package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts.map +0 -1
- package/dist/__tests__/callback-inference.test-d.d.ts +0 -2
- package/dist/__tests__/callback-inference.test-d.d.ts.map +0 -1
- package/dist/__tests__/cluster-binner.test.d.ts +0 -2
- package/dist/__tests__/cluster-binner.test.d.ts.map +0 -1
- package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts +0 -2
- package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts.map +0 -1
- package/dist/__tests__/construct-renderer-identity.unit.test.d.ts +0 -2
- package/dist/__tests__/construct-renderer-identity.unit.test.d.ts.map +0 -1
- package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts +0 -2
- package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts.map +0 -1
- package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts +0 -2
- package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts.map +0 -1
- package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts +0 -2
- package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts.map +0 -1
- package/dist/__tests__/direct-light-snapshot.unit.test.d.ts +0 -2
- package/dist/__tests__/direct-light-snapshot.unit.test.d.ts.map +0 -1
- package/dist/__tests__/factory-contract.integration.test.d.ts +0 -2
- package/dist/__tests__/factory-contract.integration.test.d.ts.map +0 -1
- package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts +0 -2
- package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts.map +0 -1
- package/dist/__tests__/frame-observation.contract.test.d.ts +0 -2
- package/dist/__tests__/frame-observation.contract.test.d.ts.map +0 -1
- package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts +0 -2
- package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts.map +0 -1
- package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts +0 -2
- package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts +0 -6
- package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts +0 -2
- package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts +0 -2
- package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-production.integration.test.d.ts +0 -2
- package/dist/__tests__/gpu-driven-production.integration.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts +0 -2
- package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +0 -18
- package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts +0 -2
- package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-view-reference.d.ts +0 -15
- package/dist/__tests__/gpu-driven-view-reference.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-view.browser.test.d.ts +0 -2
- package/dist/__tests__/gpu-driven-view.browser.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-view.dawn.test.d.ts +0 -2
- package/dist/__tests__/gpu-driven-view.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-view.unit.test.d.ts +0 -2
- package/dist/__tests__/gpu-driven-view.unit.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts +0 -2
- package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts +0 -7
- package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +0 -1
- package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts +0 -2
- package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts +0 -2
- package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-scene-schema.unit.test.d.ts +0 -2
- package/dist/__tests__/gpu-scene-schema.unit.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-scene.dawn.test.d.ts +0 -2
- package/dist/__tests__/gpu-scene.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-scene.unit.test.d.ts +0 -2
- package/dist/__tests__/gpu-scene.unit.test.d.ts.map +0 -1
- package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts +0 -2
- package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts.map +0 -1
- package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts +0 -2
- package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts.map +0 -1
- package/dist/__tests__/injection-kind-owner.test-d.d.ts +0 -2
- package/dist/__tests__/injection-kind-owner.test-d.d.ts.map +0 -1
- package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts +0 -2
- package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/light-buffer-layout.unit.test.d.ts +0 -2
- package/dist/__tests__/light-buffer-layout.unit.test.d.ts.map +0 -1
- package/dist/__tests__/material-contract-inventory.unit.test.d.ts +0 -2
- package/dist/__tests__/material-contract-inventory.unit.test.d.ts.map +0 -1
- package/dist/__tests__/material-cooked-projection.unit.test.d.ts +0 -2
- package/dist/__tests__/material-cooked-projection.unit.test.d.ts.map +0 -1
- package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts +0 -2
- package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts.map +0 -1
- package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts +0 -2
- package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts.map +0 -1
- package/dist/__tests__/material-stride-surface.unit.test.d.ts +0 -2
- package/dist/__tests__/material-stride-surface.unit.test.d.ts.map +0 -1
- package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts +0 -2
- package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts.map +0 -1
- package/dist/__tests__/mesh-material-bindings.unit.test.d.ts +0 -2
- package/dist/__tests__/mesh-material-bindings.unit.test.d.ts.map +0 -1
- package/dist/__tests__/mesh-stride-surface.unit.test.d.ts +0 -2
- package/dist/__tests__/mesh-stride-surface.unit.test.d.ts.map +0 -1
- package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts +0 -2
- package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts +0 -2
- package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts.map +0 -1
- package/dist/__tests__/morph-feature-plan.unit.test.d.ts +0 -2
- package/dist/__tests__/morph-feature-plan.unit.test.d.ts.map +0 -1
- package/dist/__tests__/morph-visual-evidence.integration.test.d.ts +0 -2
- package/dist/__tests__/morph-visual-evidence.integration.test.d.ts.map +0 -1
- package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts +0 -2
- package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts.map +0 -1
- package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts +0 -2
- package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts +0 -2
- package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-store.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-store.unit.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts.map +0 -1
- package/dist/__tests__/profiler-default-off.test.d.ts +0 -2
- package/dist/__tests__/profiler-default-off.test.d.ts.map +0 -1
- package/dist/__tests__/profiler-phase-catalog.test.d.ts +0 -2
- package/dist/__tests__/profiler-phase-catalog.test.d.ts.map +0 -1
- package/dist/__tests__/profiler-phase-integration.test.d.ts +0 -2
- package/dist/__tests__/profiler-phase-integration.test.d.ts.map +0 -1
- package/dist/__tests__/profiler-phase-token.test.d.ts +0 -2
- package/dist/__tests__/profiler-phase-token.test.d.ts.map +0 -1
- package/dist/__tests__/public-surface.test-d.d.ts +0 -2
- package/dist/__tests__/public-surface.test-d.d.ts.map +0 -1
- package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts +0 -2
- package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-error-code-owner.test-d.d.ts +0 -2
- package/dist/__tests__/render-error-code-owner.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-error-detail-ssot.test-d.d.ts +0 -2
- package/dist/__tests__/render-error-detail-ssot.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-error-exhaustive.test-d.d.ts +0 -2
- package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-assembly.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-assembly.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-context.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-context.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-contract.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-contract.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-docs.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-docs.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-errors.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-errors.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts +0 -2
- package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-plan.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-plan.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-plan.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-plan.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-public-surface.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-public-surface.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-retry.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-retry.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-scheduling.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-scheduling.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-visibility-context.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-visibility-context.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-zero-work.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-zero-work.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-graph-compute-raster-gpu.d.ts +0 -7
- package/dist/__tests__/render-graph-compute-raster-gpu.d.ts.map +0 -1
- package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts +0 -2
- package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts.map +0 -1
- package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts +0 -2
- package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/render-graph-hzb-gpu.d.ts +0 -7
- package/dist/__tests__/render-graph-hzb-gpu.d.ts.map +0 -1
- package/dist/__tests__/render-graph-hzb.browser.test.d.ts +0 -2
- package/dist/__tests__/render-graph-hzb.browser.test.d.ts.map +0 -1
- package/dist/__tests__/render-graph-hzb.dawn.test.d.ts +0 -2
- package/dist/__tests__/render-graph-hzb.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/render-graph-primitives.unit.test.d.ts +0 -2
- package/dist/__tests__/render-graph-primitives.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts +0 -12
- package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts.map +0 -1
- package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts +0 -2
- package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts.map +0 -1
- package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts +0 -2
- package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/render-scene-projection.unit.test.d.ts +0 -2
- package/dist/__tests__/render-scene-projection.unit.test.d.ts.map +0 -1
- package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts +0 -2
- package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts.map +0 -1
- package/dist/__tests__/renderer-lifecycle.integration.test.d.ts +0 -2
- package/dist/__tests__/renderer-lifecycle.integration.test.d.ts.map +0 -1
- package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts +0 -2
- package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts.map +0 -1
- package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts +0 -2
- package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts.map +0 -1
- package/dist/__tests__/shader-stage-surface.unit.test.d.ts +0 -2
- package/dist/__tests__/shader-stage-surface.unit.test.d.ts.map +0 -1
- package/dist/__tests__/ssao-config.unit.test.d.ts +0 -2
- package/dist/__tests__/ssao-config.unit.test.d.ts.map +0 -1
- package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts +0 -2
- package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts.map +0 -1
- package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts +0 -2
- package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts.map +0 -1
- package/dist/__tests__/standard-descriptors.test-d.d.ts +0 -2
- package/dist/__tests__/standard-descriptors.test-d.d.ts.map +0 -1
- package/dist/__tests__/standard-pipeline.dawn.test.d.ts +0 -2
- package/dist/__tests__/standard-pipeline.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/standard-pipeline.integration.test.d.ts +0 -2
- package/dist/__tests__/standard-pipeline.integration.test.d.ts.map +0 -1
- package/dist/__tests__/standard-profile-oracle.unit.test.d.ts +0 -2
- package/dist/__tests__/standard-profile-oracle.unit.test.d.ts.map +0 -1
- package/dist/__tests__/surface-configuration.unit.test.d.ts +0 -2
- package/dist/__tests__/surface-configuration.unit.test.d.ts.map +0 -1
- package/dist/__tests__/texture-usage-surface.unit.test.d.ts +0 -2
- package/dist/__tests__/texture-usage-surface.unit.test.d.ts.map +0 -1
- package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts +0 -2
- package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts.map +0 -1
- package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts +0 -2
- package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts.map +0 -1
- package/dist/__tests__/urp-pipeline.unit.test.d.ts +0 -2
- package/dist/__tests__/urp-pipeline.unit.test.d.ts.map +0 -1
- package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts +0 -2
- package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts.map +0 -1
- package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts +0 -2
- package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-diagnostics.integration.test.d.ts +0 -2
- package/dist/__tests__/visibility-diagnostics.integration.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-extract.integration.test.d.ts +0 -2
- package/dist/__tests__/visibility-extract.integration.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-extract.perf.test.d.ts +0 -2
- package/dist/__tests__/visibility-extract.perf.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts +0 -2
- package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-hidden-report.unit.test.d.ts +0 -2
- package/dist/__tests__/visibility-hidden-report.unit.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-instances.integration.test.d.ts +0 -2
- package/dist/__tests__/visibility-instances.integration.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-multi-world.integration.test.d.ts +0 -2
- package/dist/__tests__/visibility-multi-world.integration.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts +0 -2
- package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts +0 -2
- package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-public-surface.test-d.d.ts +0 -2
- package/dist/__tests__/visibility-public-surface.test-d.d.ts.map +0 -1
- package/dist/__tests__/visibility-resolver.unit.test.d.ts +0 -2
- package/dist/__tests__/visibility-resolver.unit.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts +0 -2
- package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts +0 -2
- package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts.map +0 -1
- package/dist/__tests__/vocabulary.unit.test.d.ts +0 -2
- package/dist/__tests__/vocabulary.unit.test.d.ts.map +0 -1
- package/dist/chunk-CQXZC5XI.mjs.map +0 -1
- package/dist/chunk-QC4VW3XJ.mjs.map +0 -1
- package/dist/chunk-SCRSAK5B.mjs.map +0 -1
- package/dist/components/__tests__/schema-contract.unit.test.d.ts +0 -2
- package/dist/components/__tests__/schema-contract.unit.test.d.ts.map +0 -1
- package/dist/components/__tests__/schema-parity.unit.test.d.ts +0 -2
- package/dist/components/__tests__/schema-parity.unit.test.d.ts.map +0 -1
- package/dist/components/__tests__/visibility-schema.unit.test.d.ts +0 -2
- package/dist/components/__tests__/visibility-schema.unit.test.d.ts.map +0 -1
- package/dist/record/__tests__/material-bg-cache.unit.test.d.ts +0 -2
- package/dist/record/__tests__/material-bg-cache.unit.test.d.ts.map +0 -1
- package/dist/record/__tests__/material-slot-plan.unit.test.d.ts +0 -2
- package/dist/record/__tests__/material-slot-plan.unit.test.d.ts.map +0 -1
- package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts +0 -2
- package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts.map +0 -1
- package/dist/record/__tests__/video-texture-view.unit.test.d.ts +0 -2
- package/dist/record/__tests__/video-texture-view.unit.test.d.ts.map +0 -1
package/src/render-system.ts
CHANGED
|
@@ -16,10 +16,11 @@
|
|
|
16
16
|
// .invert` (charter proposition 5: no math reinvention; render-system.test.ts
|
|
17
17
|
// asserts `/@forgeax\/engine-math/` shows up in render-system.ts source).
|
|
18
18
|
|
|
19
|
-
import { resolveAssetHandle } from '@forgeax/engine-assets-runtime';
|
|
19
|
+
import { numMipLevels, resolveAssetHandle } from '@forgeax/engine-assets-runtime';
|
|
20
20
|
import type { World } from '@forgeax/engine-ecs';
|
|
21
21
|
import type { RenderReadLease } from '@forgeax/engine-ecs/projection';
|
|
22
22
|
import type { RecorderSession } from '@forgeax/engine-profiler';
|
|
23
|
+
import type { CompiledRenderGraphInfo } from '@forgeax/engine-render-graph';
|
|
23
24
|
import type { BindGroupEntry, BindGroupLayout, Buffer, RenderPipeline } from '@forgeax/engine-rhi';
|
|
24
25
|
import { err, ok, type Result, RhiError } from '@forgeax/engine-rhi';
|
|
25
26
|
import {
|
|
@@ -27,12 +28,20 @@ import {
|
|
|
27
28
|
type Handle,
|
|
28
29
|
type MaterialAsset,
|
|
29
30
|
type MaterialTextureValue,
|
|
31
|
+
type MeshAsset,
|
|
30
32
|
type RenderPipelineAsset,
|
|
31
33
|
RenderQueue,
|
|
32
34
|
type SamplerAsset,
|
|
35
|
+
toShared,
|
|
33
36
|
} from '@forgeax/engine-types';
|
|
34
37
|
import { createClusterBinScratch } from './cluster-binner';
|
|
35
|
-
import
|
|
38
|
+
import { EnvironmentLifecycle } from './environment/lifecycle';
|
|
39
|
+
import {
|
|
40
|
+
type ObservationUnavailableError,
|
|
41
|
+
PointsLinesMaterialUnsupportedError,
|
|
42
|
+
type RenderError,
|
|
43
|
+
TransmissionCapabilityMissingError,
|
|
44
|
+
} from './errors/render';
|
|
36
45
|
import {
|
|
37
46
|
type RenderFeaturePreparedGraphicsResolverInput,
|
|
38
47
|
runRenderFeatureFrame,
|
|
@@ -50,16 +59,48 @@ import {
|
|
|
50
59
|
type PostProcessShaderEntry,
|
|
51
60
|
} from './fullscreen-post-process-pass';
|
|
52
61
|
import { GpuDrivenProduction } from './gpu-driven/production-raster';
|
|
53
|
-
import type {
|
|
62
|
+
import type {
|
|
63
|
+
BloomInspection,
|
|
64
|
+
MotionBlurInspection,
|
|
65
|
+
RenderSceneInspection,
|
|
66
|
+
TemporalTargetInspection,
|
|
67
|
+
TransmissionInspection,
|
|
68
|
+
} from './inspection-types';
|
|
69
|
+
import { admitPointsLines } from './points-lines/admission';
|
|
70
|
+
import { PointsLinesExpansionCache } from './points-lines/expansion-cache';
|
|
71
|
+
import {
|
|
72
|
+
inspectPointsLines,
|
|
73
|
+
type PointsLinesInspection,
|
|
74
|
+
type PointsLinesSourceError,
|
|
75
|
+
} from './points-lines/inspection';
|
|
76
|
+
import {
|
|
77
|
+
createPointsLinesLanePreparationAdapter,
|
|
78
|
+
type PointsLinesLanePreparationAdapter,
|
|
79
|
+
} from './points-lines/prepare';
|
|
80
|
+
import { createPointsLinesLaneAdapter, type PointsLinesBackend } from './points-lines/record';
|
|
81
|
+
import type { PointsLinesRetainedSnapshot } from './points-lines/snapshot';
|
|
82
|
+
import type { PointsLinesRecordOwner, PointsLinesRecordSubmission } from './record/render-context';
|
|
54
83
|
|
|
55
84
|
export type { RenderSceneInspection } from './inspection-types';
|
|
56
85
|
|
|
57
|
-
import {
|
|
86
|
+
import { deriveVertexLayoutProjection } from '@forgeax/engine-geometry';
|
|
87
|
+
import type { EnvironmentInspection } from './environment/inspection';
|
|
88
|
+
import {
|
|
89
|
+
GPU_BUFFER_USAGE_COPY_DST,
|
|
90
|
+
GPU_BUFFER_USAGE_INDEX,
|
|
91
|
+
GPU_BUFFER_USAGE_UNIFORM,
|
|
92
|
+
GPU_BUFFER_USAGE_VERTEX,
|
|
93
|
+
} from './gpu-usage';
|
|
58
94
|
import { assembleMaterialWithSkylightEntries } from './ibl/skylight-bind-group';
|
|
59
95
|
import { disposeInstanceBuffers, disposeTransientInstanceBuffers } from './instance-buffer-cache';
|
|
60
96
|
import type { MeshMaterialBindingObservation } from './mesh-material-bindings';
|
|
61
97
|
import { validateClusterGrid } from './pipeline/standard-pipeline';
|
|
62
|
-
import {
|
|
98
|
+
import {
|
|
99
|
+
DEFAULT_CLUSTER_GRID,
|
|
100
|
+
DEFAULT_STANDARD_PROFILE,
|
|
101
|
+
resolveStandardLane,
|
|
102
|
+
} from './pipeline/standard-profile';
|
|
103
|
+
import { PipelineSpecError } from './pipeline-spec';
|
|
63
104
|
import { PostProcessError } from './post-process-errors';
|
|
64
105
|
import {
|
|
65
106
|
createPreparedGraphicsResolver,
|
|
@@ -73,7 +114,12 @@ import {
|
|
|
73
114
|
recordFrame,
|
|
74
115
|
} from './record/frame';
|
|
75
116
|
import { buildPerFrameBindGroups } from './record/frame-lighting';
|
|
76
|
-
import type {
|
|
117
|
+
import type {
|
|
118
|
+
CurrentGraphTarget,
|
|
119
|
+
GraphTargetCaptureRequest,
|
|
120
|
+
RenderFrameState,
|
|
121
|
+
} from './record/frame-snapshot';
|
|
122
|
+
import { getTextureIdentity } from './record/frame-snapshot';
|
|
77
123
|
import { applyParamSnapshotToUbo, residentTextureView } from './record/main-pass-material';
|
|
78
124
|
import type { RenderSystemInternals } from './record/render-context';
|
|
79
125
|
import {
|
|
@@ -99,6 +145,19 @@ import {
|
|
|
99
145
|
TRANSPARENT_SORT_MODE_LAYER_YZ,
|
|
100
146
|
TRANSPARENT_SORT_MODE_LAYER_Z,
|
|
101
147
|
} from './systems/transparent-sort-config';
|
|
148
|
+
import { retireTemporalGpuState } from './temporal/gpu';
|
|
149
|
+
import { inspectTemporal, type TemporalInspection } from './temporal/inspection';
|
|
150
|
+
import {
|
|
151
|
+
evaluateTransmissionCapability,
|
|
152
|
+
probeTransmissionCapability,
|
|
153
|
+
resolveTransmissionBackdropTopology,
|
|
154
|
+
TransmissionCandidateAdmission,
|
|
155
|
+
} from './transmission/backdrop';
|
|
156
|
+
import {
|
|
157
|
+
estimateTransmissionBackdropBytes,
|
|
158
|
+
inspectTransmission,
|
|
159
|
+
inspectTransmissionFromAdmission,
|
|
160
|
+
} from './transmission/inspection';
|
|
102
161
|
|
|
103
162
|
export type {
|
|
104
163
|
_InternalRenderPipelineContext,
|
|
@@ -108,12 +167,15 @@ export type {
|
|
|
108
167
|
RenderSystemInternals,
|
|
109
168
|
RenderSystemRuntime,
|
|
110
169
|
SurfaceBackendKind,
|
|
170
|
+
SurfaceCapabilityFacts,
|
|
171
|
+
SurfaceProfile,
|
|
111
172
|
SwapChainFormatPair,
|
|
112
173
|
} from './record/render-context';
|
|
113
174
|
export {
|
|
114
175
|
configureSurface,
|
|
115
176
|
MATERIAL_PER_ENTITY_STRIDE,
|
|
116
177
|
resolveSurfaceFormatPair,
|
|
178
|
+
resolveSurfaceProfile,
|
|
117
179
|
STANDARD_PBR_UBO_SIZE,
|
|
118
180
|
selectSwapChainFormat,
|
|
119
181
|
} from './record/render-context';
|
|
@@ -271,6 +333,10 @@ export interface RenderSystem {
|
|
|
271
333
|
observeCurrentFrame(
|
|
272
334
|
options: FrameObservationOptions,
|
|
273
335
|
): Promise<Result<FrameObservation, ObservationUnavailableError>>;
|
|
336
|
+
/** Internal same-frame graph target access for backend diagnostics. */
|
|
337
|
+
getCurrentGraphTarget(name: string): CurrentGraphTarget | undefined;
|
|
338
|
+
/** Internal test capture copied into the draw's command submission. */
|
|
339
|
+
requestGraphTargetCapture(request: GraphTargetCaptureRequest): void;
|
|
274
340
|
readonly pipelineDispatchCounts: {
|
|
275
341
|
readonly unlit: number;
|
|
276
342
|
};
|
|
@@ -283,6 +349,15 @@ export interface RenderSystem {
|
|
|
283
349
|
readonly visibilityStats: { explicitlyHidden: number };
|
|
284
350
|
/** Persistent scene maintenance evidence from the ordinary single-World path. */
|
|
285
351
|
readonly renderScene: RenderSceneInspection;
|
|
352
|
+
readonly environment: EnvironmentInspection;
|
|
353
|
+
readonly temporal: TemporalInspection;
|
|
354
|
+
readonly bloom: BloomInspection;
|
|
355
|
+
readonly motionBlurInspection: MotionBlurInspection | undefined;
|
|
356
|
+
readonly temporalTargetInspection: TemporalTargetInspection | undefined;
|
|
357
|
+
/** Last completed transmission candidate facts, detached from GPU handles. */
|
|
358
|
+
readonly transmission: TransmissionInspection | undefined;
|
|
359
|
+
/** Retained Points/Lines authoring facts from the single scene projection. */
|
|
360
|
+
readonly pointsLinesSnapshots: readonly PointsLinesRetainedSnapshot[];
|
|
286
361
|
/** Current mesh-slot provenance and active diagnostics from the last frame. */
|
|
287
362
|
readonly meshMaterialBindings: readonly MeshMaterialBindingObservation[];
|
|
288
363
|
/**
|
|
@@ -294,6 +369,10 @@ export interface RenderSystem {
|
|
|
294
369
|
* reaching into engine internals.
|
|
295
370
|
*/
|
|
296
371
|
readonly perFramePassNames: readonly string[];
|
|
372
|
+
/** Camera antialias mode for the last successfully submitted frame. */
|
|
373
|
+
readonly lastSuccessfulCameraAntialias: CameraSnapshot['antialias'] | undefined;
|
|
374
|
+
/** Detached compiled-graph facts used by the renderer inspection owner. */
|
|
375
|
+
readonly perFrameGraphInfo: CompiledRenderGraphInfo | undefined;
|
|
297
376
|
/**
|
|
298
377
|
* feat-20260531-per-frame-bind-group-cache M1 / w4: per-frame
|
|
299
378
|
* createBindGroup counter. Reset to 0 on every `draw([world], { cameraOwner: 0, resourceOwner: 0 })` entry,
|
|
@@ -398,6 +477,273 @@ function makePreparedPipelinePendingError(): RhiError {
|
|
|
398
477
|
});
|
|
399
478
|
}
|
|
400
479
|
|
|
480
|
+
type PointsLinesGpuResources = {
|
|
481
|
+
readonly vertexBuffer: Buffer;
|
|
482
|
+
readonly indexBuffer: Buffer;
|
|
483
|
+
};
|
|
484
|
+
type PointsLinesPreparationAdapter = PointsLinesLanePreparationAdapter<PointsLinesGpuResources>;
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* The Standard renderer's single Points/Lines prepare owner.
|
|
488
|
+
*
|
|
489
|
+
* The retained snapshot is the identity boundary; this owner only resolves
|
|
490
|
+
* the source assets, runs admission, and publishes the existing preparation
|
|
491
|
+
* and record contracts to the main geometry loop. The expansion cache is
|
|
492
|
+
* shared across lanes and this owner keeps the one prepared vertex/index
|
|
493
|
+
* resource pair for each retained identity.
|
|
494
|
+
*/
|
|
495
|
+
class StandardPointsLinesOwner implements PointsLinesRecordOwner {
|
|
496
|
+
private readonly cache = new PointsLinesExpansionCache();
|
|
497
|
+
private readonly preparations = new Map<string, PointsLinesPreparationAdapter>();
|
|
498
|
+
private readonly active = new Map<string, PointsLinesInspection>();
|
|
499
|
+
private readonly layoutProjection = deriveVertexLayoutProjection({
|
|
500
|
+
position: new Float32Array(0),
|
|
501
|
+
normal: new Float32Array(0),
|
|
502
|
+
uv: new Float32Array(0),
|
|
503
|
+
tangent: new Float32Array(0),
|
|
504
|
+
});
|
|
505
|
+
|
|
506
|
+
constructor(private readonly internals: RenderSystemInternals) {}
|
|
507
|
+
|
|
508
|
+
beginFrame(): void {
|
|
509
|
+
this.active.clear();
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
prepare(
|
|
513
|
+
entry: import('./record/frame-snapshot').ValidatedRenderable,
|
|
514
|
+
clustered: boolean,
|
|
515
|
+
): PointsLinesRecordSubmission | undefined {
|
|
516
|
+
const snapshot = entry.source.pointsLines;
|
|
517
|
+
if (snapshot === undefined || snapshot.component === undefined || entry.world === undefined) {
|
|
518
|
+
return undefined;
|
|
519
|
+
}
|
|
520
|
+
const key = `${snapshot.worldId}:${snapshot.entityKey}`;
|
|
521
|
+
const topology = snapshot.component === 'Points' ? 'point-list' : 'line-list';
|
|
522
|
+
const backend = this.backend();
|
|
523
|
+
const lane = backend === 'wgpu-webgl2' ? 'cpu-webgl2' : clustered ? 'clustered' : 'direct';
|
|
524
|
+
const meshResult = resolveAssetHandle<MeshAsset>(
|
|
525
|
+
entry.world,
|
|
526
|
+
toShared<'MeshAsset'>(entry.source.assetHandle),
|
|
527
|
+
);
|
|
528
|
+
const materialResult = resolveAssetHandle<MaterialAsset>(
|
|
529
|
+
entry.world,
|
|
530
|
+
toShared<'MaterialAsset'>(snapshot.materialHandle),
|
|
531
|
+
);
|
|
532
|
+
if (!meshResult.ok || !materialResult.ok) {
|
|
533
|
+
this.publishRefusal(
|
|
534
|
+
snapshot,
|
|
535
|
+
new PointsLinesMaterialUnsupportedError({
|
|
536
|
+
entity: snapshot.entityKey,
|
|
537
|
+
material: 'unresolved',
|
|
538
|
+
pass: 'forward',
|
|
539
|
+
module: 'asset-resolution',
|
|
540
|
+
reason: 'source MeshAsset or MaterialAsset could not be resolved',
|
|
541
|
+
}),
|
|
542
|
+
);
|
|
543
|
+
return undefined;
|
|
544
|
+
}
|
|
545
|
+
const admission = admitPointsLines({
|
|
546
|
+
entity: snapshot.entityKey,
|
|
547
|
+
mesh: meshResult.value,
|
|
548
|
+
material: materialResult.value,
|
|
549
|
+
...(snapshot.style?.kind === 'points'
|
|
550
|
+
? {
|
|
551
|
+
points: {
|
|
552
|
+
sizePx: snapshot.style.sizePx,
|
|
553
|
+
shape: snapshot.style.shape === 'circle' ? 1 : 0,
|
|
554
|
+
},
|
|
555
|
+
}
|
|
556
|
+
: { lines: { widthPx: snapshot.style?.widthPx ?? 1 } }),
|
|
557
|
+
});
|
|
558
|
+
if (!admission.ok) {
|
|
559
|
+
this.publishRefusal(snapshot, admission.error);
|
|
560
|
+
return undefined;
|
|
561
|
+
}
|
|
562
|
+
const geometryKey = this.cache.getOrCreate(snapshot, meshResult.value).key;
|
|
563
|
+
const prepKey = `${geometryKey}:${lane}:${backend}`;
|
|
564
|
+
let preparation = this.preparations.get(prepKey);
|
|
565
|
+
if (preparation === undefined) {
|
|
566
|
+
preparation = createPointsLinesLanePreparationAdapter(lane, backend, {
|
|
567
|
+
cache: this.cache,
|
|
568
|
+
adapter: {
|
|
569
|
+
create: (geometry) => {
|
|
570
|
+
const vertex = this.internals.device.createBuffer({
|
|
571
|
+
label: `points-lines-vertices:${geometryKey}`,
|
|
572
|
+
size: Math.max(4, geometry.vertices.byteLength),
|
|
573
|
+
usage: GPU_BUFFER_USAGE_VERTEX | GPU_BUFFER_USAGE_COPY_DST,
|
|
574
|
+
mappedAtCreation: false,
|
|
575
|
+
});
|
|
576
|
+
if (!vertex.ok) return err(vertex.error);
|
|
577
|
+
const index = this.internals.device.createBuffer({
|
|
578
|
+
label: `points-lines-indices:${geometryKey}`,
|
|
579
|
+
size: Math.max(4, geometry.indices.byteLength),
|
|
580
|
+
usage: GPU_BUFFER_USAGE_INDEX | GPU_BUFFER_USAGE_COPY_DST,
|
|
581
|
+
mappedAtCreation: false,
|
|
582
|
+
});
|
|
583
|
+
if (!index.ok) {
|
|
584
|
+
this.internals.device.destroyBuffer(vertex.value);
|
|
585
|
+
return err(index.error);
|
|
586
|
+
}
|
|
587
|
+
return ok({ vertexBuffer: vertex.value, indexBuffer: index.value });
|
|
588
|
+
},
|
|
589
|
+
upload: (resource, geometry) => {
|
|
590
|
+
if (geometry.vertices.byteLength > 0) {
|
|
591
|
+
const vertexWrite = this.internals.device.queue.writeBuffer(
|
|
592
|
+
resource.vertexBuffer,
|
|
593
|
+
0,
|
|
594
|
+
geometry.vertices,
|
|
595
|
+
);
|
|
596
|
+
if (!vertexWrite.ok) return err(vertexWrite.error);
|
|
597
|
+
}
|
|
598
|
+
if (geometry.indices.byteLength > 0) {
|
|
599
|
+
const indexWrite = this.internals.device.queue.writeBuffer(
|
|
600
|
+
resource.indexBuffer,
|
|
601
|
+
0,
|
|
602
|
+
geometry.indices,
|
|
603
|
+
);
|
|
604
|
+
if (!indexWrite.ok) return err(indexWrite.error);
|
|
605
|
+
}
|
|
606
|
+
return ok(geometry.derivedBytes);
|
|
607
|
+
},
|
|
608
|
+
validate: (_resource, geometry) =>
|
|
609
|
+
geometry.expandedVertexCount > 0 && geometry.expandedIndexCount > 0
|
|
610
|
+
? ok(undefined)
|
|
611
|
+
: err(new Error('Points/Lines expansion contains no drawable triangles')),
|
|
612
|
+
destroy: (resource) => {
|
|
613
|
+
this.internals.device.destroyBuffer(resource.vertexBuffer);
|
|
614
|
+
this.internals.device.destroyBuffer(resource.indexBuffer);
|
|
615
|
+
},
|
|
616
|
+
},
|
|
617
|
+
});
|
|
618
|
+
this.preparations.set(prepKey, preparation);
|
|
619
|
+
}
|
|
620
|
+
const prepared = preparation.prepare(snapshot, meshResult.value);
|
|
621
|
+
if (!prepared.ok) {
|
|
622
|
+
const lkg = preparation.lastKnownGood();
|
|
623
|
+
if (lkg !== undefined) {
|
|
624
|
+
const lkgPlan = createPointsLinesLaneAdapter(lane, backend).createRecordPlan(
|
|
625
|
+
lkg.snapshot,
|
|
626
|
+
lkg.geometry,
|
|
627
|
+
);
|
|
628
|
+
const state = preparation.inspect();
|
|
629
|
+
this.active.set(
|
|
630
|
+
key,
|
|
631
|
+
inspectPointsLines({
|
|
632
|
+
snapshot,
|
|
633
|
+
topology,
|
|
634
|
+
lane,
|
|
635
|
+
pointCount: lkg.geometry.pointCount,
|
|
636
|
+
segmentCount: lkg.geometry.segmentCount,
|
|
637
|
+
sourceBytes: lkg.geometry.sourceBytes,
|
|
638
|
+
derivedBytes: lkg.geometry.derivedBytes,
|
|
639
|
+
cache: { hit: true, rebuilds: state.rebuilds, evictions: 0 },
|
|
640
|
+
drawCount: lkgPlan.drawCount,
|
|
641
|
+
uploadBytes: 0,
|
|
642
|
+
lastKnownGood: true,
|
|
643
|
+
refusal: {
|
|
644
|
+
code: prepared.error.code,
|
|
645
|
+
expected: prepared.error.expected,
|
|
646
|
+
hint: prepared.error.hint,
|
|
647
|
+
detail: prepared.error.detail,
|
|
648
|
+
generation: prepared.error.detail.generation,
|
|
649
|
+
lastKnownGood: true,
|
|
650
|
+
},
|
|
651
|
+
}),
|
|
652
|
+
);
|
|
653
|
+
return {
|
|
654
|
+
plan: lkgPlan,
|
|
655
|
+
vertexBuffer: lkg.resource.vertexBuffer,
|
|
656
|
+
indexBuffer: lkg.resource.indexBuffer,
|
|
657
|
+
layoutProjection: this.layoutProjection,
|
|
658
|
+
};
|
|
659
|
+
}
|
|
660
|
+
this.publishRefusal(snapshot, prepared.error);
|
|
661
|
+
return undefined;
|
|
662
|
+
}
|
|
663
|
+
const plan = createPointsLinesLaneAdapter(lane, backend).createRecordPlan(
|
|
664
|
+
snapshot,
|
|
665
|
+
prepared.value.geometry,
|
|
666
|
+
);
|
|
667
|
+
const state = preparation.inspect();
|
|
668
|
+
this.active.set(
|
|
669
|
+
key,
|
|
670
|
+
inspectPointsLines({
|
|
671
|
+
snapshot,
|
|
672
|
+
topology,
|
|
673
|
+
lane,
|
|
674
|
+
pointCount: prepared.value.geometry.pointCount,
|
|
675
|
+
segmentCount: prepared.value.geometry.segmentCount,
|
|
676
|
+
sourceBytes: prepared.value.geometry.sourceBytes,
|
|
677
|
+
derivedBytes: prepared.value.geometry.derivedBytes,
|
|
678
|
+
cache: {
|
|
679
|
+
hit: prepared.value.uploadedBytes === 0,
|
|
680
|
+
rebuilds: state.rebuilds,
|
|
681
|
+
evictions: 0,
|
|
682
|
+
},
|
|
683
|
+
drawCount: plan.drawCount,
|
|
684
|
+
uploadBytes: prepared.value.uploadedBytes,
|
|
685
|
+
lastKnownGood: prepared.value.lastKnownGood,
|
|
686
|
+
}),
|
|
687
|
+
);
|
|
688
|
+
return {
|
|
689
|
+
plan,
|
|
690
|
+
vertexBuffer: prepared.value.resource.vertexBuffer,
|
|
691
|
+
indexBuffer: prepared.value.resource.indexBuffer,
|
|
692
|
+
layoutProjection: this.layoutProjection,
|
|
693
|
+
};
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
resetForDeviceLoss(): void {
|
|
697
|
+
for (const preparation of this.preparations.values()) preparation.resetForDeviceLoss();
|
|
698
|
+
this.active.clear();
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
inspections(): readonly PointsLinesInspection[] {
|
|
702
|
+
return [...this.active.values()];
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
private backend(): PointsLinesBackend {
|
|
706
|
+
switch (this.internals.device.caps.backendKind) {
|
|
707
|
+
case 'wgpu-webgl2':
|
|
708
|
+
return 'wgpu-webgl2';
|
|
709
|
+
case 'null':
|
|
710
|
+
return 'null';
|
|
711
|
+
default:
|
|
712
|
+
return 'webgpu';
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
private publishRefusal(
|
|
717
|
+
snapshot: PointsLinesRetainedSnapshot,
|
|
718
|
+
error: PointsLinesSourceError,
|
|
719
|
+
): void {
|
|
720
|
+
this.active.set(
|
|
721
|
+
`${snapshot.worldId}:${snapshot.entityKey}`,
|
|
722
|
+
inspectPointsLines({
|
|
723
|
+
snapshot,
|
|
724
|
+
topology: snapshot.component === 'Points' ? 'point-list' : 'line-list',
|
|
725
|
+
lane: 'refused',
|
|
726
|
+
pointCount: 0,
|
|
727
|
+
segmentCount: 0,
|
|
728
|
+
sourceBytes: 0,
|
|
729
|
+
derivedBytes: 0,
|
|
730
|
+
cache: { hit: false, rebuilds: 0, evictions: 0 },
|
|
731
|
+
drawCount: 0,
|
|
732
|
+
uploadBytes: 0,
|
|
733
|
+
lastKnownGood: false,
|
|
734
|
+
refusal: {
|
|
735
|
+
code: error.code,
|
|
736
|
+
expected: error.expected,
|
|
737
|
+
hint: error.hint,
|
|
738
|
+
detail: error.detail,
|
|
739
|
+
generation: snapshot.meshGeneration,
|
|
740
|
+
lastKnownGood: false,
|
|
741
|
+
},
|
|
742
|
+
}),
|
|
743
|
+
);
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
|
|
401
747
|
export function createRenderSystem(internals: RenderSystemInternals): RenderSystem {
|
|
402
748
|
const phaseCatalogRegistration = internals.profiler?.registerPhaseCatalog(
|
|
403
749
|
'render',
|
|
@@ -406,6 +752,8 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
406
752
|
let releaseProfilerCatalog =
|
|
407
753
|
phaseCatalogRegistration?.ok === true ? phaseCatalogRegistration.value : undefined;
|
|
408
754
|
let preparedWorlds: readonly World[] = [];
|
|
755
|
+
let latestCamera: CameraSnapshot | undefined;
|
|
756
|
+
const pointsLinesOwner = new StandardPointsLinesOwner(internals);
|
|
409
757
|
const persistentRenderScene = new PersistentRenderScene({
|
|
410
758
|
getDevice: () => internals.device,
|
|
411
759
|
onGpuError: (error) => internals.errorRegistry.fire(error),
|
|
@@ -413,6 +761,131 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
413
761
|
internals.gpuStore.invalidateMesh(handle, preparedWorlds[worldId] ?? worldId);
|
|
414
762
|
},
|
|
415
763
|
});
|
|
764
|
+
const environmentLifecycle = new EnvironmentLifecycle(internals.deviceScope);
|
|
765
|
+
const transmissionAdmission = new TransmissionCandidateAdmission();
|
|
766
|
+
let lastTransmissionInspection: TransmissionInspection | undefined;
|
|
767
|
+
let lastTransmissionKey = '';
|
|
768
|
+
let lastTransmissionAntialias: CameraSnapshot['antialias'] = 'none';
|
|
769
|
+
let transmissionCapabilityGeneration = -1;
|
|
770
|
+
let transmissionCapability:
|
|
771
|
+
| import('./transmission/backdrop').TransmissionCapabilityFacts
|
|
772
|
+
| undefined;
|
|
773
|
+
const prepareTransmissionCandidate = (antialias: CameraSnapshot['antialias']): boolean => {
|
|
774
|
+
const demand = persistentRenderScene.transmissionTopologyDemand();
|
|
775
|
+
if (demand.activeCount === 0) return true;
|
|
776
|
+
const topology = resolveTransmissionBackdropTopology({
|
|
777
|
+
demand,
|
|
778
|
+
sourceSampleCount: antialias === 'msaa' ? 4 : 1,
|
|
779
|
+
});
|
|
780
|
+
if (transmissionCapabilityGeneration !== internals.deviceScope.generation) {
|
|
781
|
+
transmissionCapability = probeTransmissionCapability(internals.device);
|
|
782
|
+
transmissionCapabilityGeneration = internals.deviceScope.generation;
|
|
783
|
+
}
|
|
784
|
+
if (transmissionCapability === undefined) {
|
|
785
|
+
throw new Error('transmission capability probe did not produce a result');
|
|
786
|
+
}
|
|
787
|
+
const capability = {
|
|
788
|
+
...transmissionCapability,
|
|
789
|
+
msaaResolve: antialias === 'msaa' || topology.sourceSampleCount === 1,
|
|
790
|
+
} as const;
|
|
791
|
+
const verdict = evaluateTransmissionCapability(capability);
|
|
792
|
+
if (verdict.ok) return true;
|
|
793
|
+
|
|
794
|
+
const extent = {
|
|
795
|
+
width: Math.max(1, internals.canvas.width),
|
|
796
|
+
height: Math.max(1, internals.canvas.height),
|
|
797
|
+
};
|
|
798
|
+
const resource = {
|
|
799
|
+
extent,
|
|
800
|
+
format: capability.format,
|
|
801
|
+
mipCount: topology.mipCount === 0 ? 1 : numMipLevels(extent),
|
|
802
|
+
bytes: estimateTransmissionBackdropBytes(
|
|
803
|
+
extent,
|
|
804
|
+
topology.mipCount === 0 ? 1 : numMipLevels(extent),
|
|
805
|
+
capability.format,
|
|
806
|
+
),
|
|
807
|
+
deviceGeneration: internals.deviceScope.generation,
|
|
808
|
+
} as const;
|
|
809
|
+
transmissionAdmission.admit(demand, capability, resource);
|
|
810
|
+
internals.errorRegistry.fire(
|
|
811
|
+
new TransmissionCapabilityMissingError('standard transmission', 'prepare', {
|
|
812
|
+
lane: 'standard-forward',
|
|
813
|
+
format: capability.format,
|
|
814
|
+
missing: verdict.missing,
|
|
815
|
+
}),
|
|
816
|
+
);
|
|
817
|
+
return false;
|
|
818
|
+
};
|
|
819
|
+
const updateTransmissionInspection = (
|
|
820
|
+
antialias: CameraSnapshot['antialias'],
|
|
821
|
+
submitted: boolean,
|
|
822
|
+
): void => {
|
|
823
|
+
lastTransmissionAntialias = antialias;
|
|
824
|
+
const demand = persistentRenderScene.transmissionTopologyDemand();
|
|
825
|
+
if (demand.activeCount === 0) {
|
|
826
|
+
lastTransmissionInspection = undefined;
|
|
827
|
+
lastTransmissionKey = '';
|
|
828
|
+
return;
|
|
829
|
+
}
|
|
830
|
+
const extent = {
|
|
831
|
+
width: Math.max(1, internals.canvas.width),
|
|
832
|
+
height: Math.max(1, internals.canvas.height),
|
|
833
|
+
};
|
|
834
|
+
const topology = resolveTransmissionBackdropTopology({
|
|
835
|
+
demand,
|
|
836
|
+
sourceSampleCount: antialias === 'msaa' ? 4 : 1,
|
|
837
|
+
});
|
|
838
|
+
if (transmissionCapabilityGeneration !== internals.deviceScope.generation) {
|
|
839
|
+
transmissionCapability = probeTransmissionCapability(internals.device);
|
|
840
|
+
transmissionCapabilityGeneration = internals.deviceScope.generation;
|
|
841
|
+
}
|
|
842
|
+
if (transmissionCapability === undefined) {
|
|
843
|
+
throw new Error('transmission capability probe did not produce a result');
|
|
844
|
+
}
|
|
845
|
+
const resource = {
|
|
846
|
+
extent,
|
|
847
|
+
format: 'rgba16float',
|
|
848
|
+
mipCount: topology.mipCount === 0 ? 1 : numMipLevels(extent),
|
|
849
|
+
bytes: estimateTransmissionBackdropBytes(
|
|
850
|
+
extent,
|
|
851
|
+
topology.mipCount === 0 ? 1 : numMipLevels(extent),
|
|
852
|
+
),
|
|
853
|
+
deviceGeneration: internals.deviceScope.generation,
|
|
854
|
+
} as const;
|
|
855
|
+
const key = `${demand.activeCount}:${demand.needsRoughMips}:${extent.width}:${extent.height}:${resource.deviceGeneration}:${antialias}:${submitted}`;
|
|
856
|
+
if (key === lastTransmissionKey && lastTransmissionInspection !== undefined) return;
|
|
857
|
+
if (submitted) {
|
|
858
|
+
transmissionAdmission.admit(
|
|
859
|
+
demand,
|
|
860
|
+
{
|
|
861
|
+
...transmissionCapability,
|
|
862
|
+
msaaResolve: antialias === 'msaa' || topology.sourceSampleCount === 1,
|
|
863
|
+
},
|
|
864
|
+
resource,
|
|
865
|
+
);
|
|
866
|
+
}
|
|
867
|
+
const admission = transmissionAdmission.inspectLifecycle();
|
|
868
|
+
lastTransmissionInspection = submitted
|
|
869
|
+
? inspectTransmissionFromAdmission({
|
|
870
|
+
admission,
|
|
871
|
+
topology,
|
|
872
|
+
extent,
|
|
873
|
+
transmissionDrawCount: demand.activeCount,
|
|
874
|
+
})
|
|
875
|
+
: inspectTransmission({
|
|
876
|
+
demand,
|
|
877
|
+
topology,
|
|
878
|
+
extent,
|
|
879
|
+
generation: admission.generation,
|
|
880
|
+
lastKnownGood: admission.lastKnownGood,
|
|
881
|
+
lifecycle: admission.lifecycle,
|
|
882
|
+
recovery: admission.recovery,
|
|
883
|
+
capability: admission.capability,
|
|
884
|
+
resourcePresent: admission.resource !== undefined,
|
|
885
|
+
transmissionDrawCount: demand.activeCount,
|
|
886
|
+
});
|
|
887
|
+
lastTransmissionKey = key;
|
|
888
|
+
};
|
|
416
889
|
const gpuDrivenShaderFactory =
|
|
417
890
|
internals.shaderModuleFactory ??
|
|
418
891
|
({
|
|
@@ -440,6 +913,19 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
440
913
|
}),
|
|
441
914
|
),
|
|
442
915
|
} satisfies import('./pipeline-builder').PipelineBuilderShaderModuleFactory),
|
|
916
|
+
getImmediateShaderModuleFactory: () =>
|
|
917
|
+
internals.immediateShaderModuleFactory ??
|
|
918
|
+
internals.shaderModuleFactory ??
|
|
919
|
+
({
|
|
920
|
+
createShaderModule: () =>
|
|
921
|
+
err(
|
|
922
|
+
new RhiError({
|
|
923
|
+
code: 'rhi-not-available',
|
|
924
|
+
expected: 'the renderer backend exposes shader module creation',
|
|
925
|
+
hint: 'construct the renderer through the backend pack before activating GPU features',
|
|
926
|
+
}),
|
|
927
|
+
),
|
|
928
|
+
} satisfies import('./pipeline-builder').PipelineBuilderShaderModuleFactory),
|
|
443
929
|
});
|
|
444
930
|
const disposeFeatureGpuWork = (): void => {
|
|
445
931
|
const disposed = featureGpuWork.dispose();
|
|
@@ -460,12 +946,23 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
460
946
|
// raw (material-handle-based, cross-world collision semantically correct).
|
|
461
947
|
const frameState: RenderFrameState = {
|
|
462
948
|
frameNumber: 0,
|
|
949
|
+
graphGeneration: 0,
|
|
950
|
+
successfulTemporalFrameIndex: 0,
|
|
951
|
+
lastSuccessfulBloom: 'off',
|
|
463
952
|
directionalShadowCache: null,
|
|
464
953
|
directionalShadowCacheRecorded: false,
|
|
465
954
|
compiledFrameGraph: null,
|
|
466
955
|
compiledFrameGraphTopologyKey: null,
|
|
467
956
|
retiredCompiledFrameGraphs: new Set(),
|
|
468
957
|
currentFrameObservationSource: undefined,
|
|
958
|
+
lastSuccessfulCameraAntialias: undefined,
|
|
959
|
+
temporalGpuState: undefined,
|
|
960
|
+
activeTemporalGpuState: undefined,
|
|
961
|
+
retiringTemporalGpuStates: new Set(),
|
|
962
|
+
lastSuccessfulTemporalView: undefined,
|
|
963
|
+
pendingTemporalCommit: { kind: 'none' },
|
|
964
|
+
environmentGeneration: undefined,
|
|
965
|
+
environmentLifecycle,
|
|
469
966
|
currentDirectionalShadowView: null,
|
|
470
967
|
currentSpotShadowView: null,
|
|
471
968
|
instanceBuffers: new Map(),
|
|
@@ -624,6 +1121,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
624
1121
|
...featureEntries.entries(),
|
|
625
1122
|
]);
|
|
626
1123
|
for (const [id, entry] of declarations) {
|
|
1124
|
+
if (id === 'forgeax.taa-resolve') continue;
|
|
627
1125
|
const byteSize =
|
|
628
1126
|
entry.params?.byteSize ?? (entryHasDepthRead(entry) ? DEPTH_MIN_PARAMS_BYTE_SIZE : 0);
|
|
629
1127
|
if (byteSize === 0 || postProcessParamsBuffers.has(id)) continue;
|
|
@@ -674,10 +1172,16 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
674
1172
|
postProcessPipelineCache.set(key, built);
|
|
675
1173
|
return built;
|
|
676
1174
|
};
|
|
1175
|
+
const clearPostProcessPipelineCache = (id: string): void => {
|
|
1176
|
+
for (const key of postProcessPipelineCache.keys()) {
|
|
1177
|
+
if (key.startsWith(`${id}|`)) postProcessPipelineCache.delete(key);
|
|
1178
|
+
}
|
|
1179
|
+
};
|
|
677
1180
|
Object.assign(internals, {
|
|
678
1181
|
lookupPostProcess,
|
|
679
1182
|
getPostProcessParamsBuffer,
|
|
680
1183
|
getPostProcessPipeline,
|
|
1184
|
+
clearPostProcessPipelineCache,
|
|
681
1185
|
});
|
|
682
1186
|
// w15 M5 (plan-strategy D-P4 / AC-07): per-frame dispatch counters. Reset
|
|
683
1187
|
// on every `draw([world], { cameraOwner: 0, resourceOwner: 0 })` entry; bumped once per actual `pass.setPipeline`
|
|
@@ -825,42 +1329,20 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
825
1329
|
if (buffer !== undefined) internals.device.destroyBuffer(buffer);
|
|
826
1330
|
return err(new Error('prepared material schema contains unsupported binding kinds'));
|
|
827
1331
|
}
|
|
828
|
-
for (let index = fields.length; index < 4; index += 1) {
|
|
829
|
-
const binding = derived.userRegionBindingEnd + (index - fields.length) * 2;
|
|
830
|
-
entries.push(
|
|
831
|
-
{
|
|
832
|
-
binding,
|
|
833
|
-
resource: { kind: 'sampler', value: pipelineState.defaultSampler },
|
|
834
|
-
},
|
|
835
|
-
{
|
|
836
|
-
binding: binding + 1,
|
|
837
|
-
resource: { kind: 'textureView', value: pipelineState.defaultWhiteTextureView },
|
|
838
|
-
},
|
|
839
|
-
);
|
|
840
|
-
}
|
|
841
1332
|
const fallback = pipelineState.skylightFallback;
|
|
842
1333
|
if (fallback === null) {
|
|
843
1334
|
if (buffer !== undefined) internals.device.destroyBuffer(buffer);
|
|
844
1335
|
return err(new Error('prepared material skylight fallback is unavailable'));
|
|
845
1336
|
}
|
|
846
|
-
const completeEntries = assembleMaterialWithSkylightEntries(
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
intensityBuffer: fallback.intensityBuffer,
|
|
856
|
-
},
|
|
857
|
-
{
|
|
858
|
-
emissiveSampler: pipelineState.defaultSampler,
|
|
859
|
-
emissiveView: pipelineState.defaultWhiteTextureView,
|
|
860
|
-
occlusionSampler: pipelineState.defaultSampler,
|
|
861
|
-
occlusionView: pipelineState.defaultWhiteTextureView,
|
|
862
|
-
},
|
|
863
|
-
);
|
|
1337
|
+
const completeEntries = assembleMaterialWithSkylightEntries(entries, {
|
|
1338
|
+
irradianceView: fallback.irradianceView,
|
|
1339
|
+
irradianceSampler: fallback.sampler,
|
|
1340
|
+
prefilterView: fallback.prefilterView,
|
|
1341
|
+
prefilterSampler: fallback.sampler,
|
|
1342
|
+
brdfLutView: fallback.brdfLutView,
|
|
1343
|
+
brdfLutSampler: fallback.sampler,
|
|
1344
|
+
intensityBuffer: fallback.intensityBuffer,
|
|
1345
|
+
});
|
|
864
1346
|
const group = internals.device.createBindGroup({ layout, entries: completeEntries });
|
|
865
1347
|
if (!group.ok) {
|
|
866
1348
|
if (buffer !== undefined) internals.device.destroyBuffer(buffer);
|
|
@@ -936,6 +1418,8 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
936
1418
|
? null
|
|
937
1419
|
: (descriptor.depthFormat as GPUTextureFormat),
|
|
938
1420
|
descriptor.vertexLayout,
|
|
1421
|
+
undefined,
|
|
1422
|
+
input.shaderModuleMode,
|
|
939
1423
|
);
|
|
940
1424
|
// A requested material shader is an exact pipeline contract. During
|
|
941
1425
|
// async shader warmup, substituting the generic unlit pipeline can
|
|
@@ -1071,6 +1555,101 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1071
1555
|
gpuDriven: gpuDrivenProduction.inspect(),
|
|
1072
1556
|
};
|
|
1073
1557
|
},
|
|
1558
|
+
get environment(): EnvironmentInspection {
|
|
1559
|
+
return environmentLifecycle.inspect();
|
|
1560
|
+
},
|
|
1561
|
+
get temporal(): TemporalInspection {
|
|
1562
|
+
return inspectTemporal(frameState.lastSuccessfulTemporalView, undefined, {
|
|
1563
|
+
...(frameState.activeTemporalGpuState === undefined
|
|
1564
|
+
? {}
|
|
1565
|
+
: { active: frameState.activeTemporalGpuState }),
|
|
1566
|
+
...(frameState.temporalGpuState === undefined
|
|
1567
|
+
? {}
|
|
1568
|
+
: { candidate: frameState.temporalGpuState }),
|
|
1569
|
+
retiring: [...frameState.retiringTemporalGpuStates],
|
|
1570
|
+
deviceGeneration: internals.deviceScope.generation,
|
|
1571
|
+
});
|
|
1572
|
+
},
|
|
1573
|
+
get motionBlurInspection(): MotionBlurInspection | undefined {
|
|
1574
|
+
const camera = latestCamera;
|
|
1575
|
+
if (camera?.motionBlur === undefined) return undefined;
|
|
1576
|
+
const demanded = camera.motionBlur.shutterAngle > 0;
|
|
1577
|
+
const unavailable = demanded && !internals.device.caps.rgba16floatRenderable;
|
|
1578
|
+
const admitted =
|
|
1579
|
+
frameState.activeTemporalGpuState !== undefined ||
|
|
1580
|
+
frameState.temporalGpuState !== undefined;
|
|
1581
|
+
return {
|
|
1582
|
+
enabled: demanded,
|
|
1583
|
+
status: !demanded ? 'off' : unavailable || !admitted ? 'reset' : 'active',
|
|
1584
|
+
shutterAngle: camera.motionBlur.shutterAngle,
|
|
1585
|
+
maxRadiusPixels: camera.motionBlur.maxRadiusPixels,
|
|
1586
|
+
sampleCount: camera.motionBlur.sampleCount,
|
|
1587
|
+
temporalDemand: demanded ? 'scene-data-temporal-v1' : 'none',
|
|
1588
|
+
passName: 'motion-blur',
|
|
1589
|
+
historyWrites: 0,
|
|
1590
|
+
...(unavailable ? { lastFailure: 'scene-data-unavailable' as const } : {}),
|
|
1591
|
+
};
|
|
1592
|
+
},
|
|
1593
|
+
get temporalTargetInspection(): TemporalTargetInspection | undefined {
|
|
1594
|
+
const graph = frameState.compiledFrameGraph?.inspect();
|
|
1595
|
+
if (graph === undefined) return undefined;
|
|
1596
|
+
const producer = graph.passes.find((pass) => pass.name === 'standard-scene-data');
|
|
1597
|
+
// The producer's semantic target is the graph-owned
|
|
1598
|
+
// `standard-scene-temporal` resource. Resolve it from the compiled
|
|
1599
|
+
// resource table rather than the pass access projection: a backend may
|
|
1600
|
+
// retain a view alias in the access list while the resource owner still
|
|
1601
|
+
// carries the canonical semantic label.
|
|
1602
|
+
const target = graph.resources.find(
|
|
1603
|
+
(resource) => resource.kind === 'texture' && resource.label === 'standard-scene-temporal',
|
|
1604
|
+
);
|
|
1605
|
+
if (producer === undefined || target === undefined) {
|
|
1606
|
+
return undefined;
|
|
1607
|
+
}
|
|
1608
|
+
const width = Math.max(1, internals.canvas.width);
|
|
1609
|
+
const height = Math.max(1, internals.canvas.height);
|
|
1610
|
+
return Object.freeze({
|
|
1611
|
+
identity: 'standard-scene-temporal',
|
|
1612
|
+
producerId: 'forgeax::standard::scene-data',
|
|
1613
|
+
schema: 'forgeax::scene-data::temporal-v1',
|
|
1614
|
+
targetCount: 1,
|
|
1615
|
+
descriptor: Object.freeze({
|
|
1616
|
+
format: 'rgba16float',
|
|
1617
|
+
width,
|
|
1618
|
+
height,
|
|
1619
|
+
sampleCount: 1,
|
|
1620
|
+
bytes: width * height * 8,
|
|
1621
|
+
}),
|
|
1622
|
+
});
|
|
1623
|
+
},
|
|
1624
|
+
get bloom(): BloomInspection {
|
|
1625
|
+
const pipelineState = internals.getPipelineState();
|
|
1626
|
+
const resources = pipelineState?.perPassResources;
|
|
1627
|
+
const lifecycle = resources?.inspectBloomResources?.(
|
|
1628
|
+
frameState.compiledFrameGraph?.inspect(),
|
|
1629
|
+
);
|
|
1630
|
+
return Object.freeze(
|
|
1631
|
+
lifecycle ?? {
|
|
1632
|
+
graphStatus: 'empty',
|
|
1633
|
+
enabled: false,
|
|
1634
|
+
targetCount: 0,
|
|
1635
|
+
targetBytes: 0,
|
|
1636
|
+
resourceCount: 0,
|
|
1637
|
+
passCount: 0,
|
|
1638
|
+
encodeCount: 0,
|
|
1639
|
+
bindGroupCount: 0,
|
|
1640
|
+
uploadCount: 0,
|
|
1641
|
+
residentChildBytes: 0,
|
|
1642
|
+
generation: 0,
|
|
1643
|
+
state: 'off',
|
|
1644
|
+
},
|
|
1645
|
+
);
|
|
1646
|
+
},
|
|
1647
|
+
get transmission(): TransmissionInspection | undefined {
|
|
1648
|
+
return lastTransmissionInspection;
|
|
1649
|
+
},
|
|
1650
|
+
get pointsLinesSnapshots(): readonly PointsLinesRetainedSnapshot[] {
|
|
1651
|
+
return persistentRenderScene.pointsLinesSnapshots();
|
|
1652
|
+
},
|
|
1074
1653
|
detachScene(world: World): void {
|
|
1075
1654
|
persistentRenderScene.detach(world);
|
|
1076
1655
|
},
|
|
@@ -1091,6 +1670,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1091
1670
|
}
|
|
1092
1671
|
}
|
|
1093
1672
|
try {
|
|
1673
|
+
pointsLinesOwner.beginFrame();
|
|
1094
1674
|
// cameraOwner drives the surfaced cameras + frustum
|
|
1095
1675
|
// cull; resourceOwner drives skylight/skybox/postProcess + per-world
|
|
1096
1676
|
// record config.
|
|
@@ -1150,16 +1730,52 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1150
1730
|
const {
|
|
1151
1731
|
cameras,
|
|
1152
1732
|
lights,
|
|
1733
|
+
environment,
|
|
1734
|
+
environmentReady,
|
|
1153
1735
|
renderables,
|
|
1154
1736
|
dispatch,
|
|
1155
1737
|
skylight,
|
|
1156
1738
|
skylightCount,
|
|
1157
1739
|
skybox,
|
|
1158
1740
|
skyboxCount,
|
|
1741
|
+
fog,
|
|
1159
1742
|
frustumStats,
|
|
1160
1743
|
visibilityStats,
|
|
1161
1744
|
postProcessParams,
|
|
1162
1745
|
} = frame;
|
|
1746
|
+
latestCamera = cameras[0];
|
|
1747
|
+
const temporalDemanded =
|
|
1748
|
+
cameras[0]?.antialias === 'taa' || (cameras[0]?.motionBlur?.shutterAngle ?? 0) > 0;
|
|
1749
|
+
if (temporalDemanded) {
|
|
1750
|
+
persistentRenderScene.prepareTemporalFrame(renderables);
|
|
1751
|
+
}
|
|
1752
|
+
environmentLifecycle.bindScope(internals.deviceScope);
|
|
1753
|
+
if (!environmentReady || environment === undefined) {
|
|
1754
|
+
frameState.pendingTemporalCommit = { kind: 'none' };
|
|
1755
|
+
// A world with no camera still has a valid clear-only render path.
|
|
1756
|
+
// It has no environment candidate and therefore must not publish an
|
|
1757
|
+
// off/taa temporal state; camera-bearing rejected extraction remains
|
|
1758
|
+
// an atomic render failure.
|
|
1759
|
+
if (cameras.length > 0) return false;
|
|
1760
|
+
} else {
|
|
1761
|
+
const environmentCandidate = environmentLifecycle.ensure(environment);
|
|
1762
|
+
if (!environmentCandidate.ok) {
|
|
1763
|
+
environmentLifecycle.recordCandidateFailure(environmentCandidate.error);
|
|
1764
|
+
internals.errorRegistry.fire(environmentCandidate.error);
|
|
1765
|
+
return false;
|
|
1766
|
+
}
|
|
1767
|
+
if (!environmentLifecycle.isActive(environmentCandidate.value)) {
|
|
1768
|
+
frameState.environmentGeneration = environmentCandidate.value;
|
|
1769
|
+
}
|
|
1770
|
+
}
|
|
1771
|
+
const transmissionAntialias = frame.cameras[0]?.antialias ?? 'none';
|
|
1772
|
+
if (!prepareTransmissionCandidate(transmissionAntialias)) {
|
|
1773
|
+
// The candidate gate runs before bind-group preparation, graph
|
|
1774
|
+
// construction, and record/submit. A missing capability therefore
|
|
1775
|
+
// cannot publish or execute a transmission graph.
|
|
1776
|
+
updateTransmissionInspection(transmissionAntialias, false);
|
|
1777
|
+
return false;
|
|
1778
|
+
}
|
|
1163
1779
|
if (lastMeshMaterialBindingFrame !== frame) {
|
|
1164
1780
|
lastMeshMaterialBindingFrame = frame;
|
|
1165
1781
|
lastMeshMaterialBindings = renderables.map((renderable) => ({
|
|
@@ -1230,6 +1846,9 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1230
1846
|
targets: featureTargets,
|
|
1231
1847
|
generation: internals.featureHost?.preparedGeneration ?? 0,
|
|
1232
1848
|
caps: internals.device.caps,
|
|
1849
|
+
...(internals.getMaterialShaderBindingContract === undefined
|
|
1850
|
+
? {}
|
|
1851
|
+
: { materialShaderBindingContract: internals.getMaterialShaderBindingContract }),
|
|
1233
1852
|
createPreparedGraphicsResolver: preparedResolverFactory,
|
|
1234
1853
|
gpuWork: featureGpuWork,
|
|
1235
1854
|
});
|
|
@@ -1305,6 +1924,9 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1305
1924
|
}
|
|
1306
1925
|
return runProfiledRenderPhase(profileSession, phase, action);
|
|
1307
1926
|
};
|
|
1927
|
+
if (cameras[0]?.bloom === 'on') {
|
|
1928
|
+
internals.getPipelineState()?.perPassResources.ensureBloomResources?.();
|
|
1929
|
+
}
|
|
1308
1930
|
submitted = runProfiledRenderPhase(profileSession, 'record', () =>
|
|
1309
1931
|
recordFrame(
|
|
1310
1932
|
internals,
|
|
@@ -1321,6 +1943,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1321
1943
|
skybox,
|
|
1322
1944
|
skyboxCount,
|
|
1323
1945
|
postProcessParams,
|
|
1946
|
+
fog,
|
|
1324
1947
|
worlds,
|
|
1325
1948
|
recordProfilePhase,
|
|
1326
1949
|
{
|
|
@@ -1333,8 +1956,38 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1333
1956
|
},
|
|
1334
1957
|
renderReadLeases,
|
|
1335
1958
|
featureGraphCandidate,
|
|
1959
|
+
pointsLinesOwner,
|
|
1960
|
+
environment?.environmentSignature ?? '',
|
|
1961
|
+
environment?.fogSignature ?? '',
|
|
1962
|
+
environmentReady && environment !== undefined,
|
|
1963
|
+
persistentRenderScene.transmissionTopologyDemand(),
|
|
1336
1964
|
),
|
|
1337
1965
|
);
|
|
1966
|
+
if (submitted) {
|
|
1967
|
+
const temporalCommit = persistentRenderScene.commitTemporalFrame();
|
|
1968
|
+
if (!temporalCommit.ok) {
|
|
1969
|
+
internals.errorRegistry.fire(temporalCommit.error);
|
|
1970
|
+
}
|
|
1971
|
+
frameState.lastSuccessfulCameraAntialias = cameras[0]?.antialias;
|
|
1972
|
+
internals.getPipelineState()?.perPassResources.commitBloomResources?.();
|
|
1973
|
+
const nextBloom = cameras[0]?.bloom ?? 'off';
|
|
1974
|
+
if (frameState.lastSuccessfulBloom === 'on' && nextBloom !== 'on') {
|
|
1975
|
+
internals
|
|
1976
|
+
.getPipelineState()
|
|
1977
|
+
?.perPassResources.retireBloomResources?.(
|
|
1978
|
+
internals.device.queue.onSubmittedWorkDone(),
|
|
1979
|
+
);
|
|
1980
|
+
}
|
|
1981
|
+
frameState.lastSuccessfulBloom = nextBloom;
|
|
1982
|
+
} else {
|
|
1983
|
+
internals.getPipelineState()?.perPassResources.discardBloomResources?.();
|
|
1984
|
+
}
|
|
1985
|
+
if (!submitted && frameState.environmentGeneration !== undefined) {
|
|
1986
|
+
environmentLifecycle.discard(frameState.environmentGeneration);
|
|
1987
|
+
frameState.environmentGeneration = undefined;
|
|
1988
|
+
}
|
|
1989
|
+
updateTransmissionInspection(transmissionAntialias, submitted);
|
|
1990
|
+
persistentRenderScene.setPointsLinesInspections(pointsLinesOwner.inspections());
|
|
1338
1991
|
if (internals.featureHost !== undefined && preparedResourceBatches.length > 0) {
|
|
1339
1992
|
const batches = preparedResourceBatches;
|
|
1340
1993
|
if (submitted) {
|
|
@@ -1351,10 +2004,20 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1351
2004
|
}
|
|
1352
2005
|
}
|
|
1353
2006
|
} catch (err) {
|
|
2007
|
+
if (!submitted) {
|
|
2008
|
+
internals.getPipelineState()?.perPassResources.discardBloomResources?.();
|
|
2009
|
+
}
|
|
1354
2010
|
const innerError =
|
|
1355
|
-
err instanceof
|
|
1356
|
-
?
|
|
1357
|
-
|
|
2011
|
+
err instanceof PipelineSpecError
|
|
2012
|
+
? {
|
|
2013
|
+
name: err.name,
|
|
2014
|
+
code: err.code,
|
|
2015
|
+
message: err.message,
|
|
2016
|
+
detail: err.detail,
|
|
2017
|
+
}
|
|
2018
|
+
: err instanceof RhiError
|
|
2019
|
+
? err
|
|
2020
|
+
: { code: 'unknown' as const, message: String(err), name: (err as Error)?.name };
|
|
1358
2021
|
internals.errorRegistry.fire(
|
|
1359
2022
|
new RhiError({
|
|
1360
2023
|
code: 'webgpu-runtime-error',
|
|
@@ -1379,6 +2042,24 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1379
2042
|
const currentFrameId = frameState.frameNumber - 1;
|
|
1380
2043
|
return observeCurrentFrame(options, frameState.currentFrameObservationSource, currentFrameId);
|
|
1381
2044
|
},
|
|
2045
|
+
getCurrentGraphTarget(name: string) {
|
|
2046
|
+
const graph = frameState.perFrameGraph;
|
|
2047
|
+
if (graph === undefined || graph === null) return undefined;
|
|
2048
|
+
const descriptor = graph.getColorTargetDescriptor(name);
|
|
2049
|
+
const texture = graph.getColorTargetTexture(name);
|
|
2050
|
+
if (descriptor === undefined || texture === undefined) return undefined;
|
|
2051
|
+
return {
|
|
2052
|
+
name,
|
|
2053
|
+
texture,
|
|
2054
|
+
textureIdentity: getTextureIdentity(texture),
|
|
2055
|
+
descriptor,
|
|
2056
|
+
frameId: frameState.frameNumber - 1,
|
|
2057
|
+
graphGeneration: graph.graphGeneration,
|
|
2058
|
+
};
|
|
2059
|
+
},
|
|
2060
|
+
requestGraphTargetCapture(request: GraphTargetCaptureRequest) {
|
|
2061
|
+
frameState.graphTargetCapture = request;
|
|
2062
|
+
},
|
|
1382
2063
|
bindGroupCounts: bindGroupCounts,
|
|
1383
2064
|
frustumStats: lastFrustumStats,
|
|
1384
2065
|
visibilityStats: lastVisibilityStats,
|
|
@@ -1388,6 +2069,12 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1388
2069
|
get perFramePassNames(): readonly string[] {
|
|
1389
2070
|
return frameState.compiledFrameGraph?.inspect().passes.map((pass) => pass.name) ?? [];
|
|
1390
2071
|
},
|
|
2072
|
+
get lastSuccessfulCameraAntialias(): CameraSnapshot['antialias'] | undefined {
|
|
2073
|
+
return frameState.lastSuccessfulCameraAntialias;
|
|
2074
|
+
},
|
|
2075
|
+
get perFrameGraphInfo(): CompiledRenderGraphInfo | undefined {
|
|
2076
|
+
return frameState.compiledFrameGraph?.inspect();
|
|
2077
|
+
},
|
|
1391
2078
|
configureStandard(config: RenderPipelineAsset['config']): void {
|
|
1392
2079
|
const profileConfig = internals.standardProfile;
|
|
1393
2080
|
const resolvedConfig =
|
|
@@ -1421,7 +2108,16 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1421
2108
|
// is a rare boot/swap event, never a per-frame cost.
|
|
1422
2109
|
installEpoch += 1;
|
|
1423
2110
|
frameState.installedPipelineHandle = installEpoch;
|
|
1424
|
-
|
|
2111
|
+
// The installed profile may request clustered lighting, but the actual
|
|
2112
|
+
// graph lane is capability-gated. On WebGL2 (including WebKit's wgpu
|
|
2113
|
+
// fallback) the forward lane is selected when compute/storage buffers
|
|
2114
|
+
// are unavailable; keep the frame bindings on that same lane instead of
|
|
2115
|
+
// advertising HDRP's clustered bind-group layout to URP pipelines.
|
|
2116
|
+
frameState.isHdrpActive =
|
|
2117
|
+
resolveStandardLane(internals.standardProfile ?? DEFAULT_STANDARD_PROFILE, {
|
|
2118
|
+
compute: internals.device.caps.compute,
|
|
2119
|
+
storageBuffer: internals.device.caps.storageBuffer,
|
|
2120
|
+
}) === 'clustered';
|
|
1425
2121
|
frameState.installedPipelineConfig = resolvedConfig;
|
|
1426
2122
|
},
|
|
1427
2123
|
registerBuiltinPostProcess(id: string, entry: PostProcessShaderEntry): () => void {
|
|
@@ -1429,7 +2125,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1429
2125
|
// byteSize / defaultValue validation (q5=A).
|
|
1430
2126
|
let paramsBuffer: Buffer | undefined;
|
|
1431
2127
|
try {
|
|
1432
|
-
if (entry.params !== undefined) {
|
|
2128
|
+
if (id !== 'forgeax.taa-resolve' && entry.params !== undefined) {
|
|
1433
2129
|
const { byteSize, defaultValue } = entry.params;
|
|
1434
2130
|
if (byteSize < 16 || defaultValue.length !== byteSize) {
|
|
1435
2131
|
throw new PostProcessError({
|
|
@@ -1447,7 +2143,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1447
2143
|
paramsBuffer = paramsBufferResult.value;
|
|
1448
2144
|
const writeResult = internals.device.queue.writeBuffer(paramsBuffer, 0, defaultValue);
|
|
1449
2145
|
if (!writeResult.ok) throw writeResult.error;
|
|
1450
|
-
} else if (entryHasDepthRead(entry)) {
|
|
2146
|
+
} else if (id !== 'forgeax.taa-resolve' && entryHasDepthRead(entry)) {
|
|
1451
2147
|
const paramsBufferResult = internals.device.createBuffer({
|
|
1452
2148
|
label: `post-process-params-${id}`,
|
|
1453
2149
|
size: DEPTH_MIN_PARAMS_BYTE_SIZE,
|
|
@@ -1487,6 +2183,13 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1487
2183
|
persistentRenderScene.dispose();
|
|
1488
2184
|
gpuDrivenProduction.dispose();
|
|
1489
2185
|
disposeFeatureGpuWork();
|
|
2186
|
+
// Bloom generations are renderer-owned rather than graph-owned. Drain
|
|
2187
|
+
// candidate, active, and fence-retiring bundles before the rest of the
|
|
2188
|
+
// frame state is torn down; the owner callback is idempotent so the
|
|
2189
|
+
// outer Renderer.dispose cascade can safely call this once only.
|
|
2190
|
+
internals.getPipelineState()?.perPassResources.drainBloomResources?.();
|
|
2191
|
+
internals.clearPostProcessPipelineCache?.('forgeax.taa-resolve');
|
|
2192
|
+
internals.invalidateShaderModule?.('post-process-forgeax.taa-resolve-module');
|
|
1490
2193
|
// Retire graph-owned resources and dispose instance-buffer caches.
|
|
1491
2194
|
// Both calls are idempotent + tolerate per-handle errors silently;
|
|
1492
2195
|
// the Renderer.dispose() cascade owns the surrounding try/catch
|
|
@@ -1496,8 +2199,21 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1496
2199
|
frameState.directionalShadowCache = null;
|
|
1497
2200
|
frameState.directionalShadowCacheRecorded = false;
|
|
1498
2201
|
frameState.currentFrameObservationSource = undefined;
|
|
2202
|
+
frameState.lastSuccessfulCameraAntialias = undefined;
|
|
1499
2203
|
frameState.currentDirectionalShadowView = null;
|
|
1500
2204
|
frameState.currentSpotShadowView = null;
|
|
2205
|
+
if (frameState.temporalGpuState !== undefined) {
|
|
2206
|
+
retireTemporalGpuState(frameState.temporalGpuState);
|
|
2207
|
+
frameState.temporalGpuState = undefined;
|
|
2208
|
+
}
|
|
2209
|
+
if (frameState.activeTemporalGpuState !== undefined) {
|
|
2210
|
+
retireTemporalGpuState(frameState.activeTemporalGpuState);
|
|
2211
|
+
frameState.activeTemporalGpuState = undefined;
|
|
2212
|
+
}
|
|
2213
|
+
for (const retiring of frameState.retiringTemporalGpuStates) {
|
|
2214
|
+
retireTemporalGpuState(retiring);
|
|
2215
|
+
}
|
|
2216
|
+
frameState.retiringTemporalGpuStates.clear();
|
|
1501
2217
|
const compiled = frameState.compiledFrameGraph;
|
|
1502
2218
|
frameState.compiledFrameGraph = null;
|
|
1503
2219
|
frameState.compiledFrameGraphTopologyKey = null;
|
|
@@ -1531,10 +2247,23 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1531
2247
|
}
|
|
1532
2248
|
},
|
|
1533
2249
|
resetForRecover(): void {
|
|
2250
|
+
transmissionAdmission.markDeviceLost();
|
|
2251
|
+
lastTransmissionKey = '';
|
|
2252
|
+
transmissionCapabilityGeneration = -1;
|
|
2253
|
+
transmissionCapability = undefined;
|
|
2254
|
+
// Keep the persistent material demand observable across device loss.
|
|
2255
|
+
// The physical resource has already been fenced by markDeviceLost(); the
|
|
2256
|
+
// detached inspection now exposes the rebuild-required lifecycle until a
|
|
2257
|
+
// completed frame admits the replacement resource.
|
|
2258
|
+
updateTransmissionInspection(lastTransmissionAntialias, false);
|
|
1534
2259
|
persistentRenderScene.resetGpuForRecover();
|
|
1535
2260
|
gpuDrivenProduction.dispose();
|
|
1536
2261
|
gpuDrivenProduction = new GpuDrivenProduction(internals.device, gpuDrivenShaderFactory);
|
|
1537
2262
|
disposeFeatureGpuWork();
|
|
2263
|
+
// A recovered device cannot retain handles from the lost device. The
|
|
2264
|
+
// Bloom owner abandons candidates and retires every committed generation
|
|
2265
|
+
// before the new PipelineState is rebuilt.
|
|
2266
|
+
internals.getPipelineState()?.perPassResources.drainBloomResources?.();
|
|
1538
2267
|
// feat-20260622-s5 M3 / B-2 / w18: recover() rebuild drops device-bound
|
|
1539
2268
|
// state minted by the lost device. The active graph and per-entity caches
|
|
1540
2269
|
// must be discarded, not merely marked for destruction: their opaque
|
|
@@ -1546,8 +2275,21 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1546
2275
|
frameState.directionalShadowCache = null;
|
|
1547
2276
|
frameState.directionalShadowCacheRecorded = false;
|
|
1548
2277
|
frameState.currentFrameObservationSource = undefined;
|
|
2278
|
+
frameState.lastSuccessfulCameraAntialias = undefined;
|
|
1549
2279
|
frameState.currentDirectionalShadowView = null;
|
|
1550
2280
|
frameState.currentSpotShadowView = null;
|
|
2281
|
+
if (frameState.temporalGpuState !== undefined) {
|
|
2282
|
+
retireTemporalGpuState(frameState.temporalGpuState);
|
|
2283
|
+
frameState.temporalGpuState = undefined;
|
|
2284
|
+
}
|
|
2285
|
+
if (frameState.activeTemporalGpuState !== undefined) {
|
|
2286
|
+
retireTemporalGpuState(frameState.activeTemporalGpuState);
|
|
2287
|
+
frameState.activeTemporalGpuState = undefined;
|
|
2288
|
+
}
|
|
2289
|
+
for (const retiring of frameState.retiringTemporalGpuStates) {
|
|
2290
|
+
retireTemporalGpuState(retiring);
|
|
2291
|
+
}
|
|
2292
|
+
frameState.retiringTemporalGpuStates.clear();
|
|
1551
2293
|
for (const retired of frameState.retiredCompiledFrameGraphs) {
|
|
1552
2294
|
retired.retire().catch(() => undefined);
|
|
1553
2295
|
}
|
|
@@ -1584,6 +2326,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1584
2326
|
...activeFeaturePostProcessEntries.entries(),
|
|
1585
2327
|
];
|
|
1586
2328
|
for (const [id, entry] of declarations) {
|
|
2329
|
+
if (id === 'forgeax.taa-resolve') continue;
|
|
1587
2330
|
let buffer: Buffer | undefined;
|
|
1588
2331
|
if (entry.params !== undefined) {
|
|
1589
2332
|
const created = internals.device.createBuffer({
|