@forgeax/engine-render 0.1.7 → 0.1.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +140 -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 +26 -5
- 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/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.mjs +4 -2
- package/dist/authoring.mjs.map +1 -1
- package/dist/chunk-4XINDLAY.mjs +9404 -0
- package/dist/chunk-4XINDLAY.mjs.map +1 -0
- package/dist/chunk-CDTWTHZR.mjs +752 -0
- package/dist/chunk-CDTWTHZR.mjs.map +1 -0
- package/dist/chunk-FJ6P52EE.mjs +46 -0
- package/dist/chunk-FJ6P52EE.mjs.map +1 -0
- package/dist/chunk-JDWARUOI.mjs +44 -0
- package/dist/chunk-JDWARUOI.mjs.map +1 -0
- package/dist/chunk-M2MP4ZOU.mjs +73 -0
- package/dist/chunk-M2MP4ZOU.mjs.map +1 -0
- package/dist/chunk-PCHBPYML.mjs +385 -0
- package/dist/chunk-PCHBPYML.mjs.map +1 -0
- package/dist/chunk-RXZ3RGOU.mjs +53 -0
- package/dist/chunk-RXZ3RGOU.mjs.map +1 -0
- package/dist/{chunk-YEJIUW7D.mjs → chunk-TBQJOK2L.mjs} +356 -543
- package/dist/chunk-TBQJOK2L.mjs.map +1 -0
- package/dist/{chunk-CQXZC5XI.mjs → chunk-VFPLTKCU.mjs} +79 -69
- package/dist/chunk-VFPLTKCU.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 +3 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/light-helpers.d.ts.map +1 -1
- package/dist/components/motion-blur.d.ts +7 -0
- package/dist/components/motion-blur.d.ts.map +1 -0
- package/dist/components/spot-light.d.ts +12 -0
- package/dist/components/spot-light.d.ts.map +1 -1
- package/dist/construct-renderer.d.ts +2 -2
- package/dist/construct-renderer.d.ts.map +1 -1
- package/dist/construct-renderer.mjs +11146 -14507
- 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/device/gpu-residency.d.ts +19 -2
- package/dist/device/gpu-residency.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 +204 -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 +2 -1
- 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-scene.d.ts +2 -0
- package/dist/gpu-scene.d.ts.map +1 -1
- package/dist/gpu-usage.d.ts +2 -0
- package/dist/gpu-usage.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 +24 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +6 -4
- package/dist/index.mjs.map +1 -1
- package/dist/inspection-types.d.ts +43 -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/light-buffer-layout.d.ts +20 -12
- package/dist/light-buffer-layout.d.ts.map +1 -1
- package/dist/materials.d.ts +22 -0
- package/dist/materials.d.ts.map +1 -1
- package/dist/pbr-pipeline.d.ts +16 -9
- 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 +12 -2
- 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/record/frame-lighting.d.ts +2 -0
- package/dist/record/frame-lighting.d.ts.map +1 -1
- package/dist/record/frame-snapshot.d.ts +137 -6
- 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 +6 -3
- package/dist/record/frame.d.ts.map +1 -1
- package/dist/record/gpu-timing.d.ts +32 -0
- package/dist/record/gpu-timing.d.ts.map +1 -0
- package/dist/record/main-pass-geometry.d.ts +11 -0
- package/dist/record/main-pass-geometry.d.ts.map +1 -1
- package/dist/record/main-pass-material.d.ts +9 -6
- 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 +81 -19
- 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 +36 -4
- package/dist/record/typed-frame-graph.d.ts.map +1 -1
- package/dist/record/view-ubo.d.ts +4 -1
- package/dist/record/view-ubo.d.ts.map +1 -1
- package/dist/render-contract.d.ts +157 -8
- package/dist/render-contract.d.ts.map +1 -1
- package/dist/render-data.d.ts +10 -6
- package/dist/render-data.d.ts.map +1 -1
- package/dist/render-graph-primitives.d.ts.map +1 -1
- package/dist/render-pipeline.d.ts +86 -6
- package/dist/render-pipeline.d.ts.map +1 -1
- package/dist/render-system-extract.d.ts +84 -8
- package/dist/render-system-extract.d.ts.map +1 -1
- package/dist/render-system.d.ts +30 -5
- package/dist/render-system.d.ts.map +1 -1
- package/dist/renderer-inspect.d.ts +29 -0
- package/dist/renderer-inspect.d.ts.map +1 -0
- package/dist/scene/render-scene.d.ts +36 -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/frame.d.ts +44 -0
- package/dist/temporal/frame.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 +30 -2
- package/dist/typed-render-graph-primitives.d.ts.map +1 -1
- package/dist/typed-shadow-atlas.d.ts +10 -0
- package/dist/typed-shadow-atlas.d.ts.map +1 -0
- package/dist/typed-shadow-passes.d.ts.map +1 -1
- package/dist/volume/capability.d.ts +57 -0
- package/dist/volume/capability.d.ts.map +1 -0
- package/dist/volume/component.d.ts +61 -0
- package/dist/volume/component.d.ts.map +1 -0
- package/dist/volume/extract.d.ts +11 -0
- package/dist/volume/extract.d.ts.map +1 -0
- package/dist/volume/inspection.d.ts +38 -0
- package/dist/volume/inspection.d.ts.map +1 -0
- package/dist/volume/passes.d.ts +38 -0
- package/dist/volume/passes.d.ts.map +1 -0
- package/dist/volume/recovery.d.ts +38 -0
- package/dist/volume/recovery.d.ts.map +1 -0
- package/dist/volume/resources.d.ts +57 -0
- package/dist/volume/resources.d.ts.map +1 -0
- package/dist/volume/temporal.d.ts +35 -0
- package/dist/volume/temporal.d.ts.map +1 -0
- 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__/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-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__/ktx2-basis-gpu-consumer.dawn.test.ts +14 -14
- package/src/__tests__/material-contract-inventory.unit.test.ts +62 -0
- package/src/__tests__/material-cooked-projection.unit.test.ts +18 -146
- package/src/__tests__/materials-transmission-validation.unit.test.ts +36 -0
- package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +1 -1
- 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 +14 -0
- package/src/__tests__/render-error-detail-ssot.test-d.ts +11 -2
- package/src/__tests__/render-error-exhaustive.test-d.ts +3 -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 +423 -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 +123 -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 +12 -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/__tests__/volume-optics-oracle.unit.test.ts +85 -0
- package/src/__tests__/volumetric-fog-budget-recovery.integration.test.ts +655 -0
- package/src/__tests__/volumetric-fog-component.unit.test.ts +71 -0
- package/src/__tests__/volumetric-fog-composite-stage-readback.dawn.test.ts +376 -0
- package/src/__tests__/volumetric-fog-errors.unit.test.ts +51 -0
- package/src/__tests__/volumetric-fog-inspection.unit.test.ts +77 -0
- package/src/__tests__/volumetric-fog-light-capability.unit.test.ts +19 -0
- package/src/__tests__/volumetric-fog-light-consumers.integration.test.ts +18 -0
- package/src/__tests__/volumetric-fog-light-errors.unit.test.ts +17 -0
- package/src/__tests__/volumetric-fog-light-topology.unit.test.ts +21 -0
- package/src/__tests__/volumetric-fog-light-transaction.integration.test.ts +53 -0
- package/src/__tests__/volumetric-fog-m9-watcher.integration.test.ts +27 -0
- package/src/__tests__/volumetric-fog-point-light-owner.integration.test.ts +44 -0
- package/src/__tests__/volumetric-fog-point-spot-accumulation.integration.test.ts +49 -0
- package/src/__tests__/volumetric-fog-point-spot-contract.unit.test.ts +28 -0
- package/src/__tests__/volumetric-fog-point-spot-lkg.integration.test.ts +65 -0
- package/src/__tests__/volumetric-fog-point-spot-selection.integration.test.ts +49 -0
- package/src/__tests__/volumetric-fog-point-spot-temporal.unit.test.ts +55 -0
- package/src/__tests__/volumetric-fog-projector-contract.unit.test.ts +22 -0
- package/src/__tests__/volumetric-fog-projector-inspection.unit.test.ts +12 -0
- package/src/__tests__/volumetric-fog-projector-surface-volume.integration.test.ts +11 -0
- package/src/__tests__/volumetric-fog-projector-transaction.integration.test.ts +26 -0
- package/src/__tests__/volumetric-fog-recovery.integration.test.ts +47 -0
- package/src/__tests__/volumetric-fog-selected-light-resolution.integration.test.ts +63 -0
- package/src/__tests__/volumetric-fog-spot-closure.integration.test.ts +26 -0
- package/src/__tests__/volumetric-fog-spot-contract.test-d.ts +21 -0
- package/src/__tests__/volumetric-fog-spot-contract.unit.test.ts +27 -0
- package/src/__tests__/volumetric-fog-spot-frame-optics.integration.test.ts +14 -0
- package/src/__tests__/volumetric-fog-spot-optics.integration.test.ts +29 -0
- package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +550 -0
- package/src/__tests__/volumetric-fog-temporal-selected-light.unit.test.ts +33 -0
- package/src/__tests__/volumetric-fog-temporal.unit.test.ts +45 -0
- package/src/__tests__/volumetric-fog-topology.unit.test.ts +237 -0
- package/src/__tests__/volumetric-fog-transparent.integration.test.ts +27 -0
- package/src/assembly/backend-contract.ts +47 -1
- package/src/assembly/factory.ts +1480 -505
- package/src/assembly/host-contract.ts +4 -0
- 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/components/__tests__/motion-blur.unit.test.ts +14 -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 +3 -0
- package/src/components/light-helpers.ts +4 -0
- package/src/components/motion-blur.ts +8 -0
- package/src/components/spot-light.ts +22 -3
- package/src/construct-renderer.ts +40 -3
- package/src/device/device-scope.ts +15 -1
- package/src/device/gpu-residency.ts +168 -58
- 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 +404 -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 +2 -1
- 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-scene.ts +24 -0
- package/src/gpu-usage.ts +2 -0
- package/src/ibl/skylight-bind-group.ts +30 -38
- package/src/index.ts +104 -7
- package/src/inspection-types.ts +48 -0
- package/src/internal.ts +5 -0
- package/src/light-buffer-layout.ts +59 -26
- package/src/materials.ts +119 -24
- package/src/pbr-pipeline.ts +91 -29
- package/src/pipeline/standard-forward-lane.ts +178 -101
- package/src/pipeline/standard-pipeline.ts +176 -105
- package/src/pipeline/standard-post.ts +373 -0
- package/src/pipeline/standard-profile.ts +26 -3
- package/src/pipeline-builder.ts +102 -12
- package/src/pipeline-spec.ts +9 -0
- package/src/plugin.ts +2 -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 +103 -89
- package/src/record/frame-snapshot.ts +170 -6
- package/src/record/frame-targets.ts +21 -8
- package/src/record/frame.ts +1014 -7
- package/src/record/gpu-timing.ts +224 -0
- package/src/record/main-pass-geometry.ts +86 -40
- package/src/record/main-pass-material.ts +120 -68
- package/src/record/main-pass-sprite-draws.ts +78 -101
- package/src/record/main-pass.ts +77 -4
- package/src/record/mesh-ssbo.ts +22 -3
- package/src/record/render-context.ts +194 -23
- package/src/record/shadow-pass.ts +197 -58
- package/src/record/skybox-post-pass.ts +97 -41
- package/src/record/typed-frame-graph.ts +704 -30
- package/src/record/view-ubo.ts +52 -4
- package/src/render-contract.ts +181 -6
- package/src/render-data.ts +50 -22
- package/src/render-graph-primitives.ts +18 -1
- package/src/render-pipeline.ts +144 -27
- package/src/render-system-extract.ts +522 -72
- package/src/render-system.ts +561 -41
- package/src/renderer-inspect.ts +66 -0
- package/src/scene/render-scene.ts +252 -7
- 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/frame.ts +128 -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 +437 -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 +194 -11
- package/src/typed-shadow-atlas.ts +17 -0
- package/src/typed-shadow-passes.ts +6 -5
- package/src/volume/capability.ts +173 -0
- package/src/volume/component.ts +110 -0
- package/src/volume/extract.ts +21 -0
- package/src/volume/inspection.ts +78 -0
- package/src/volume/passes.ts +680 -0
- package/src/volume/recovery.ts +86 -0
- package/src/volume/resources.ts +236 -0
- package/src/volume/temporal.ts +89 -0
- 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-HCOGPHKS.mjs +0 -93
- package/dist/chunk-HCOGPHKS.mjs.map +0 -1
- package/dist/chunk-YEJIUW7D.mjs.map +0 -1
- package/dist/components/__tests__/points-lines-admission.unit.test.d.ts +0 -2
- package/dist/components/__tests__/points-lines-admission.unit.test.d.ts.map +0 -1
- package/dist/components/__tests__/points-lines-schema.unit.test.d.ts +0 -2
- package/dist/components/__tests__/points-lines-schema.unit.test.d.ts.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/points-lines/__tests__/bounds.unit.test.d.ts +0 -2
- package/dist/points-lines/__tests__/bounds.unit.test.d.ts.map +0 -1
- package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts +0 -2
- package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts.map +0 -1
- package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts +0 -2
- package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts.map +0 -1
- package/dist/points-lines/__tests__/inspection.unit.test.d.ts +0 -2
- package/dist/points-lines/__tests__/inspection.unit.test.d.ts.map +0 -1
- package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts +0 -2
- package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts.map +0 -1
- package/dist/points-lines/__tests__/points-lines.bench.d.ts +0 -2
- package/dist/points-lines/__tests__/points-lines.bench.d.ts.map +0 -1
- package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts +0 -2
- package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts.map +0 -1
- package/dist/points-lines/__tests__/snapshot.unit.test.d.ts +0 -2
- package/dist/points-lines/__tests__/snapshot.unit.test.d.ts.map +0 -1
- package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts +0 -2
- package/dist/points-lines/__tests__/view-ubo.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 {
|
|
@@ -34,10 +35,12 @@ import {
|
|
|
34
35
|
toShared,
|
|
35
36
|
} from '@forgeax/engine-types';
|
|
36
37
|
import { createClusterBinScratch } from './cluster-binner';
|
|
38
|
+
import { EnvironmentLifecycle } from './environment/lifecycle';
|
|
37
39
|
import {
|
|
38
40
|
type ObservationUnavailableError,
|
|
39
41
|
PointsLinesMaterialUnsupportedError,
|
|
40
42
|
type RenderError,
|
|
43
|
+
TransmissionCapabilityMissingError,
|
|
41
44
|
} from './errors/render';
|
|
42
45
|
import {
|
|
43
46
|
type RenderFeaturePreparedGraphicsResolverInput,
|
|
@@ -56,7 +59,13 @@ import {
|
|
|
56
59
|
type PostProcessShaderEntry,
|
|
57
60
|
} from './fullscreen-post-process-pass';
|
|
58
61
|
import { GpuDrivenProduction } from './gpu-driven/production-raster';
|
|
59
|
-
import type {
|
|
62
|
+
import type {
|
|
63
|
+
BloomInspection,
|
|
64
|
+
MotionBlurInspection,
|
|
65
|
+
RenderSceneInspection,
|
|
66
|
+
TemporalTargetInspection,
|
|
67
|
+
TransmissionInspection,
|
|
68
|
+
} from './inspection-types';
|
|
60
69
|
import { admitPointsLines } from './points-lines/admission';
|
|
61
70
|
import { PointsLinesExpansionCache } from './points-lines/expansion-cache';
|
|
62
71
|
import {
|
|
@@ -71,10 +80,12 @@ import {
|
|
|
71
80
|
import { createPointsLinesLaneAdapter, type PointsLinesBackend } from './points-lines/record';
|
|
72
81
|
import type { PointsLinesRetainedSnapshot } from './points-lines/snapshot';
|
|
73
82
|
import type { PointsLinesRecordOwner, PointsLinesRecordSubmission } from './record/render-context';
|
|
83
|
+
import { inspectVolumetricFog } from './volume/inspection';
|
|
74
84
|
|
|
75
85
|
export type { RenderSceneInspection } from './inspection-types';
|
|
76
86
|
|
|
77
87
|
import { deriveVertexLayoutProjection } from '@forgeax/engine-geometry';
|
|
88
|
+
import type { EnvironmentInspection } from './environment/inspection';
|
|
78
89
|
import {
|
|
79
90
|
GPU_BUFFER_USAGE_COPY_DST,
|
|
80
91
|
GPU_BUFFER_USAGE_INDEX,
|
|
@@ -85,7 +96,12 @@ import { assembleMaterialWithSkylightEntries } from './ibl/skylight-bind-group';
|
|
|
85
96
|
import { disposeInstanceBuffers, disposeTransientInstanceBuffers } from './instance-buffer-cache';
|
|
86
97
|
import type { MeshMaterialBindingObservation } from './mesh-material-bindings';
|
|
87
98
|
import { validateClusterGrid } from './pipeline/standard-pipeline';
|
|
88
|
-
import {
|
|
99
|
+
import {
|
|
100
|
+
DEFAULT_CLUSTER_GRID,
|
|
101
|
+
DEFAULT_STANDARD_PROFILE,
|
|
102
|
+
resolveStandardLane,
|
|
103
|
+
} from './pipeline/standard-profile';
|
|
104
|
+
import { PipelineSpecError } from './pipeline-spec';
|
|
89
105
|
import { PostProcessError } from './post-process-errors';
|
|
90
106
|
import {
|
|
91
107
|
createPreparedGraphicsResolver,
|
|
@@ -99,12 +115,19 @@ import {
|
|
|
99
115
|
recordFrame,
|
|
100
116
|
} from './record/frame';
|
|
101
117
|
import { buildPerFrameBindGroups } from './record/frame-lighting';
|
|
102
|
-
import type {
|
|
118
|
+
import type {
|
|
119
|
+
CurrentGraphTarget,
|
|
120
|
+
GraphTargetCaptureRequest,
|
|
121
|
+
RenderFrameState,
|
|
122
|
+
} from './record/frame-snapshot';
|
|
123
|
+
import { getTextureIdentity } from './record/frame-snapshot';
|
|
124
|
+
import type { GpuTimingCapture } from './record/gpu-timing';
|
|
103
125
|
import { applyParamSnapshotToUbo, residentTextureView } from './record/main-pass-material';
|
|
104
126
|
import type { RenderSystemInternals } from './record/render-context';
|
|
105
127
|
import {
|
|
106
128
|
type RenderFeatureGraphCandidate,
|
|
107
129
|
resetRenderFeatureGraphState,
|
|
130
|
+
settleVolumetricFogGraphCandidate,
|
|
108
131
|
} from './record/typed-frame-graph';
|
|
109
132
|
import {
|
|
110
133
|
type CameraSnapshot,
|
|
@@ -125,6 +148,20 @@ import {
|
|
|
125
148
|
TRANSPARENT_SORT_MODE_LAYER_YZ,
|
|
126
149
|
TRANSPARENT_SORT_MODE_LAYER_Z,
|
|
127
150
|
} from './systems/transparent-sort-config';
|
|
151
|
+
import { createTemporalFrameTransaction, type TemporalFrame } from './temporal/frame';
|
|
152
|
+
import { retireTemporalGpuState } from './temporal/gpu';
|
|
153
|
+
import { inspectTemporal, type TemporalInspection } from './temporal/inspection';
|
|
154
|
+
import {
|
|
155
|
+
evaluateTransmissionCapability,
|
|
156
|
+
probeTransmissionCapability,
|
|
157
|
+
resolveTransmissionBackdropTopology,
|
|
158
|
+
TransmissionCandidateAdmission,
|
|
159
|
+
} from './transmission/backdrop';
|
|
160
|
+
import {
|
|
161
|
+
estimateTransmissionBackdropBytes,
|
|
162
|
+
inspectTransmission,
|
|
163
|
+
inspectTransmissionFromAdmission,
|
|
164
|
+
} from './transmission/inspection';
|
|
128
165
|
|
|
129
166
|
export type {
|
|
130
167
|
_InternalRenderPipelineContext,
|
|
@@ -134,12 +171,15 @@ export type {
|
|
|
134
171
|
RenderSystemInternals,
|
|
135
172
|
RenderSystemRuntime,
|
|
136
173
|
SurfaceBackendKind,
|
|
174
|
+
SurfaceCapabilityFacts,
|
|
175
|
+
SurfaceProfile,
|
|
137
176
|
SwapChainFormatPair,
|
|
138
177
|
} from './record/render-context';
|
|
139
178
|
export {
|
|
140
179
|
configureSurface,
|
|
141
180
|
MATERIAL_PER_ENTITY_STRIDE,
|
|
142
181
|
resolveSurfaceFormatPair,
|
|
182
|
+
resolveSurfaceProfile,
|
|
143
183
|
STANDARD_PBR_UBO_SIZE,
|
|
144
184
|
selectSwapChainFormat,
|
|
145
185
|
} from './record/render-context';
|
|
@@ -289,6 +329,7 @@ export interface RenderSystem {
|
|
|
289
329
|
worlds: readonly World[],
|
|
290
330
|
opts: DrawOwnerOptions,
|
|
291
331
|
renderReadLeases?: readonly RenderReadLease[],
|
|
332
|
+
timingCapture?: GpuTimingCapture,
|
|
292
333
|
): boolean;
|
|
293
334
|
/** Release renderer-owned persistent state for one detached World. */
|
|
294
335
|
detachScene(world: World): void;
|
|
@@ -297,6 +338,10 @@ export interface RenderSystem {
|
|
|
297
338
|
observeCurrentFrame(
|
|
298
339
|
options: FrameObservationOptions,
|
|
299
340
|
): Promise<Result<FrameObservation, ObservationUnavailableError>>;
|
|
341
|
+
/** Internal same-frame graph target access for backend diagnostics. */
|
|
342
|
+
getCurrentGraphTarget(name: string): CurrentGraphTarget | undefined;
|
|
343
|
+
/** Internal test capture copied into the draw's command submission. */
|
|
344
|
+
requestGraphTargetCapture(request: GraphTargetCaptureRequest): void;
|
|
300
345
|
readonly pipelineDispatchCounts: {
|
|
301
346
|
readonly unlit: number;
|
|
302
347
|
};
|
|
@@ -309,6 +354,13 @@ export interface RenderSystem {
|
|
|
309
354
|
readonly visibilityStats: { explicitlyHidden: number };
|
|
310
355
|
/** Persistent scene maintenance evidence from the ordinary single-World path. */
|
|
311
356
|
readonly renderScene: RenderSceneInspection;
|
|
357
|
+
readonly environment: EnvironmentInspection;
|
|
358
|
+
readonly temporal: TemporalInspection;
|
|
359
|
+
readonly bloom: BloomInspection;
|
|
360
|
+
readonly motionBlurInspection: MotionBlurInspection | undefined;
|
|
361
|
+
readonly temporalTargetInspection: TemporalTargetInspection | undefined;
|
|
362
|
+
/** Last completed transmission candidate facts, detached from GPU handles. */
|
|
363
|
+
readonly transmission: TransmissionInspection | undefined;
|
|
312
364
|
/** Retained Points/Lines authoring facts from the single scene projection. */
|
|
313
365
|
readonly pointsLinesSnapshots: readonly PointsLinesRetainedSnapshot[];
|
|
314
366
|
/** Current mesh-slot provenance and active diagnostics from the last frame. */
|
|
@@ -322,6 +374,10 @@ export interface RenderSystem {
|
|
|
322
374
|
* reaching into engine internals.
|
|
323
375
|
*/
|
|
324
376
|
readonly perFramePassNames: readonly string[];
|
|
377
|
+
/** Camera antialias mode for the last successfully submitted frame. */
|
|
378
|
+
readonly lastSuccessfulCameraAntialias: CameraSnapshot['antialias'] | undefined;
|
|
379
|
+
/** Detached compiled-graph facts used by the renderer inspection owner. */
|
|
380
|
+
readonly perFrameGraphInfo: CompiledRenderGraphInfo | undefined;
|
|
325
381
|
/**
|
|
326
382
|
* feat-20260531-per-frame-bind-group-cache M1 / w4: per-frame
|
|
327
383
|
* createBindGroup counter. Reset to 0 on every `draw([world], { cameraOwner: 0, resourceOwner: 0 })` entry,
|
|
@@ -341,6 +397,10 @@ export interface RenderSystem {
|
|
|
341
397
|
readonly createBindGroup: number;
|
|
342
398
|
readonly keys: readonly string[];
|
|
343
399
|
};
|
|
400
|
+
/** Latest accepted-submit temporal POD; absent until the first accepted frame. */
|
|
401
|
+
readonly temporalFrame: TemporalFrame | undefined;
|
|
402
|
+
/** Current renderer-owned volumetric fog inspection snapshot. */
|
|
403
|
+
readonly volumetricFog: import('./volume/inspection').VolumetricFogInspection;
|
|
344
404
|
/** Configure the sole Standard graph owner before the first frame. */
|
|
345
405
|
configureStandard(config: RenderPipelineAsset['config']): void;
|
|
346
406
|
/** Register one engine-owned post-process shader used by the Standard lane. */
|
|
@@ -701,6 +761,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
701
761
|
let releaseProfilerCatalog =
|
|
702
762
|
phaseCatalogRegistration?.ok === true ? phaseCatalogRegistration.value : undefined;
|
|
703
763
|
let preparedWorlds: readonly World[] = [];
|
|
764
|
+
let latestCamera: CameraSnapshot | undefined;
|
|
704
765
|
const pointsLinesOwner = new StandardPointsLinesOwner(internals);
|
|
705
766
|
const persistentRenderScene = new PersistentRenderScene({
|
|
706
767
|
getDevice: () => internals.device,
|
|
@@ -709,6 +770,131 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
709
770
|
internals.gpuStore.invalidateMesh(handle, preparedWorlds[worldId] ?? worldId);
|
|
710
771
|
},
|
|
711
772
|
});
|
|
773
|
+
const environmentLifecycle = new EnvironmentLifecycle(internals.deviceScope);
|
|
774
|
+
const transmissionAdmission = new TransmissionCandidateAdmission();
|
|
775
|
+
let lastTransmissionInspection: TransmissionInspection | undefined;
|
|
776
|
+
let lastTransmissionKey = '';
|
|
777
|
+
let lastTransmissionAntialias: CameraSnapshot['antialias'] = 'none';
|
|
778
|
+
let transmissionCapabilityGeneration = -1;
|
|
779
|
+
let transmissionCapability:
|
|
780
|
+
| import('./transmission/backdrop').TransmissionCapabilityFacts
|
|
781
|
+
| undefined;
|
|
782
|
+
const prepareTransmissionCandidate = (antialias: CameraSnapshot['antialias']): boolean => {
|
|
783
|
+
const demand = persistentRenderScene.transmissionTopologyDemand();
|
|
784
|
+
if (demand.activeCount === 0) return true;
|
|
785
|
+
const topology = resolveTransmissionBackdropTopology({
|
|
786
|
+
demand,
|
|
787
|
+
sourceSampleCount: antialias === 'msaa' ? 4 : 1,
|
|
788
|
+
});
|
|
789
|
+
if (transmissionCapabilityGeneration !== internals.deviceScope.generation) {
|
|
790
|
+
transmissionCapability = probeTransmissionCapability(internals.device);
|
|
791
|
+
transmissionCapabilityGeneration = internals.deviceScope.generation;
|
|
792
|
+
}
|
|
793
|
+
if (transmissionCapability === undefined) {
|
|
794
|
+
throw new Error('transmission capability probe did not produce a result');
|
|
795
|
+
}
|
|
796
|
+
const capability = {
|
|
797
|
+
...transmissionCapability,
|
|
798
|
+
msaaResolve: antialias === 'msaa' || topology.sourceSampleCount === 1,
|
|
799
|
+
} as const;
|
|
800
|
+
const verdict = evaluateTransmissionCapability(capability);
|
|
801
|
+
if (verdict.ok) return true;
|
|
802
|
+
|
|
803
|
+
const extent = {
|
|
804
|
+
width: Math.max(1, internals.canvas.width),
|
|
805
|
+
height: Math.max(1, internals.canvas.height),
|
|
806
|
+
};
|
|
807
|
+
const resource = {
|
|
808
|
+
extent,
|
|
809
|
+
format: capability.format,
|
|
810
|
+
mipCount: topology.mipCount === 0 ? 1 : numMipLevels(extent),
|
|
811
|
+
bytes: estimateTransmissionBackdropBytes(
|
|
812
|
+
extent,
|
|
813
|
+
topology.mipCount === 0 ? 1 : numMipLevels(extent),
|
|
814
|
+
capability.format,
|
|
815
|
+
),
|
|
816
|
+
deviceGeneration: internals.deviceScope.generation,
|
|
817
|
+
} as const;
|
|
818
|
+
transmissionAdmission.admit(demand, capability, resource);
|
|
819
|
+
internals.errorRegistry.fire(
|
|
820
|
+
new TransmissionCapabilityMissingError('standard transmission', 'prepare', {
|
|
821
|
+
lane: 'standard-forward',
|
|
822
|
+
format: capability.format,
|
|
823
|
+
missing: verdict.missing,
|
|
824
|
+
}),
|
|
825
|
+
);
|
|
826
|
+
return false;
|
|
827
|
+
};
|
|
828
|
+
const updateTransmissionInspection = (
|
|
829
|
+
antialias: CameraSnapshot['antialias'],
|
|
830
|
+
submitted: boolean,
|
|
831
|
+
): void => {
|
|
832
|
+
lastTransmissionAntialias = antialias;
|
|
833
|
+
const demand = persistentRenderScene.transmissionTopologyDemand();
|
|
834
|
+
if (demand.activeCount === 0) {
|
|
835
|
+
lastTransmissionInspection = undefined;
|
|
836
|
+
lastTransmissionKey = '';
|
|
837
|
+
return;
|
|
838
|
+
}
|
|
839
|
+
const extent = {
|
|
840
|
+
width: Math.max(1, internals.canvas.width),
|
|
841
|
+
height: Math.max(1, internals.canvas.height),
|
|
842
|
+
};
|
|
843
|
+
const topology = resolveTransmissionBackdropTopology({
|
|
844
|
+
demand,
|
|
845
|
+
sourceSampleCount: antialias === 'msaa' ? 4 : 1,
|
|
846
|
+
});
|
|
847
|
+
if (transmissionCapabilityGeneration !== internals.deviceScope.generation) {
|
|
848
|
+
transmissionCapability = probeTransmissionCapability(internals.device);
|
|
849
|
+
transmissionCapabilityGeneration = internals.deviceScope.generation;
|
|
850
|
+
}
|
|
851
|
+
if (transmissionCapability === undefined) {
|
|
852
|
+
throw new Error('transmission capability probe did not produce a result');
|
|
853
|
+
}
|
|
854
|
+
const resource = {
|
|
855
|
+
extent,
|
|
856
|
+
format: 'rgba16float',
|
|
857
|
+
mipCount: topology.mipCount === 0 ? 1 : numMipLevels(extent),
|
|
858
|
+
bytes: estimateTransmissionBackdropBytes(
|
|
859
|
+
extent,
|
|
860
|
+
topology.mipCount === 0 ? 1 : numMipLevels(extent),
|
|
861
|
+
),
|
|
862
|
+
deviceGeneration: internals.deviceScope.generation,
|
|
863
|
+
} as const;
|
|
864
|
+
const key = `${demand.activeCount}:${demand.needsRoughMips}:${extent.width}:${extent.height}:${resource.deviceGeneration}:${antialias}:${submitted}`;
|
|
865
|
+
if (key === lastTransmissionKey && lastTransmissionInspection !== undefined) return;
|
|
866
|
+
if (submitted) {
|
|
867
|
+
transmissionAdmission.admit(
|
|
868
|
+
demand,
|
|
869
|
+
{
|
|
870
|
+
...transmissionCapability,
|
|
871
|
+
msaaResolve: antialias === 'msaa' || topology.sourceSampleCount === 1,
|
|
872
|
+
},
|
|
873
|
+
resource,
|
|
874
|
+
);
|
|
875
|
+
}
|
|
876
|
+
const admission = transmissionAdmission.inspectLifecycle();
|
|
877
|
+
lastTransmissionInspection = submitted
|
|
878
|
+
? inspectTransmissionFromAdmission({
|
|
879
|
+
admission,
|
|
880
|
+
topology,
|
|
881
|
+
extent,
|
|
882
|
+
transmissionDrawCount: demand.activeCount,
|
|
883
|
+
})
|
|
884
|
+
: inspectTransmission({
|
|
885
|
+
demand,
|
|
886
|
+
topology,
|
|
887
|
+
extent,
|
|
888
|
+
generation: admission.generation,
|
|
889
|
+
lastKnownGood: admission.lastKnownGood,
|
|
890
|
+
lifecycle: admission.lifecycle,
|
|
891
|
+
recovery: admission.recovery,
|
|
892
|
+
capability: admission.capability,
|
|
893
|
+
resourcePresent: admission.resource !== undefined,
|
|
894
|
+
transmissionDrawCount: demand.activeCount,
|
|
895
|
+
});
|
|
896
|
+
lastTransmissionKey = key;
|
|
897
|
+
};
|
|
712
898
|
const gpuDrivenShaderFactory =
|
|
713
899
|
internals.shaderModuleFactory ??
|
|
714
900
|
({
|
|
@@ -736,6 +922,19 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
736
922
|
}),
|
|
737
923
|
),
|
|
738
924
|
} satisfies import('./pipeline-builder').PipelineBuilderShaderModuleFactory),
|
|
925
|
+
getImmediateShaderModuleFactory: () =>
|
|
926
|
+
internals.immediateShaderModuleFactory ??
|
|
927
|
+
internals.shaderModuleFactory ??
|
|
928
|
+
({
|
|
929
|
+
createShaderModule: () =>
|
|
930
|
+
err(
|
|
931
|
+
new RhiError({
|
|
932
|
+
code: 'rhi-not-available',
|
|
933
|
+
expected: 'the renderer backend exposes shader module creation',
|
|
934
|
+
hint: 'construct the renderer through the backend pack before activating GPU features',
|
|
935
|
+
}),
|
|
936
|
+
),
|
|
937
|
+
} satisfies import('./pipeline-builder').PipelineBuilderShaderModuleFactory),
|
|
739
938
|
});
|
|
740
939
|
const disposeFeatureGpuWork = (): void => {
|
|
741
940
|
const disposed = featureGpuWork.dispose();
|
|
@@ -756,12 +955,39 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
756
955
|
// raw (material-handle-based, cross-world collision semantically correct).
|
|
757
956
|
const frameState: RenderFrameState = {
|
|
758
957
|
frameNumber: 0,
|
|
958
|
+
graphGeneration: 0,
|
|
959
|
+
successfulTemporalFrameIndex: 0,
|
|
960
|
+
lastSuccessfulBloom: 'off',
|
|
961
|
+
temporalFrameTransaction: createTemporalFrameTransaction({ deviceEpoch: 0 }),
|
|
962
|
+
temporalFrameInput: undefined,
|
|
759
963
|
directionalShadowCache: null,
|
|
760
964
|
directionalShadowCacheRecorded: false,
|
|
761
965
|
compiledFrameGraph: null,
|
|
762
966
|
compiledFrameGraphTopologyKey: null,
|
|
967
|
+
volumetricFogPreviousGraph: null,
|
|
968
|
+
volumetricFogPreviousGraphKey: null,
|
|
969
|
+
volumetricFogCandidateGraph: null,
|
|
970
|
+
volumetricFogParamsBuffers: [null, null],
|
|
971
|
+
volumetricFogParamsPendingSlot: null,
|
|
972
|
+
volumetricFogParamsAcceptedSlot: null,
|
|
973
|
+
volumetricFogAcceptedParams: undefined,
|
|
974
|
+
volumetricFogPendingParams: undefined,
|
|
975
|
+
volumetricFogInspection: inspectVolumetricFog({ authored: false, capability: 'available' }),
|
|
976
|
+
volumetricFogAccepted: undefined,
|
|
977
|
+
volumetricFogAcceptedContext: undefined,
|
|
978
|
+
volumetricFogHistoryGraph: null,
|
|
979
|
+
volumetricFogHistorySlot: null,
|
|
980
|
+
volumetricFogHistorySignature: null,
|
|
763
981
|
retiredCompiledFrameGraphs: new Set(),
|
|
764
982
|
currentFrameObservationSource: undefined,
|
|
983
|
+
lastSuccessfulCameraAntialias: undefined,
|
|
984
|
+
temporalGpuState: undefined,
|
|
985
|
+
activeTemporalGpuState: undefined,
|
|
986
|
+
retiringTemporalGpuStates: new Set(),
|
|
987
|
+
lastSuccessfulTemporalView: undefined,
|
|
988
|
+
pendingTemporalCommit: { kind: 'none' },
|
|
989
|
+
environmentGeneration: undefined,
|
|
990
|
+
environmentLifecycle,
|
|
765
991
|
currentDirectionalShadowView: null,
|
|
766
992
|
currentSpotShadowView: null,
|
|
767
993
|
instanceBuffers: new Map(),
|
|
@@ -920,6 +1146,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
920
1146
|
...featureEntries.entries(),
|
|
921
1147
|
]);
|
|
922
1148
|
for (const [id, entry] of declarations) {
|
|
1149
|
+
if (id === 'forgeax.taa-resolve') continue;
|
|
923
1150
|
const byteSize =
|
|
924
1151
|
entry.params?.byteSize ?? (entryHasDepthRead(entry) ? DEPTH_MIN_PARAMS_BYTE_SIZE : 0);
|
|
925
1152
|
if (byteSize === 0 || postProcessParamsBuffers.has(id)) continue;
|
|
@@ -970,10 +1197,16 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
970
1197
|
postProcessPipelineCache.set(key, built);
|
|
971
1198
|
return built;
|
|
972
1199
|
};
|
|
1200
|
+
const clearPostProcessPipelineCache = (id: string): void => {
|
|
1201
|
+
for (const key of postProcessPipelineCache.keys()) {
|
|
1202
|
+
if (key.startsWith(`${id}|`)) postProcessPipelineCache.delete(key);
|
|
1203
|
+
}
|
|
1204
|
+
};
|
|
973
1205
|
Object.assign(internals, {
|
|
974
1206
|
lookupPostProcess,
|
|
975
1207
|
getPostProcessParamsBuffer,
|
|
976
1208
|
getPostProcessPipeline,
|
|
1209
|
+
clearPostProcessPipelineCache,
|
|
977
1210
|
});
|
|
978
1211
|
// w15 M5 (plan-strategy D-P4 / AC-07): per-frame dispatch counters. Reset
|
|
979
1212
|
// on every `draw([world], { cameraOwner: 0, resourceOwner: 0 })` entry; bumped once per actual `pass.setPipeline`
|
|
@@ -1121,42 +1354,20 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1121
1354
|
if (buffer !== undefined) internals.device.destroyBuffer(buffer);
|
|
1122
1355
|
return err(new Error('prepared material schema contains unsupported binding kinds'));
|
|
1123
1356
|
}
|
|
1124
|
-
for (let index = fields.length; index < 4; index += 1) {
|
|
1125
|
-
const binding = derived.userRegionBindingEnd + (index - fields.length) * 2;
|
|
1126
|
-
entries.push(
|
|
1127
|
-
{
|
|
1128
|
-
binding,
|
|
1129
|
-
resource: { kind: 'sampler', value: pipelineState.defaultSampler },
|
|
1130
|
-
},
|
|
1131
|
-
{
|
|
1132
|
-
binding: binding + 1,
|
|
1133
|
-
resource: { kind: 'textureView', value: pipelineState.defaultWhiteTextureView },
|
|
1134
|
-
},
|
|
1135
|
-
);
|
|
1136
|
-
}
|
|
1137
1357
|
const fallback = pipelineState.skylightFallback;
|
|
1138
1358
|
if (fallback === null) {
|
|
1139
1359
|
if (buffer !== undefined) internals.device.destroyBuffer(buffer);
|
|
1140
1360
|
return err(new Error('prepared material skylight fallback is unavailable'));
|
|
1141
1361
|
}
|
|
1142
|
-
const completeEntries = assembleMaterialWithSkylightEntries(
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
intensityBuffer: fallback.intensityBuffer,
|
|
1152
|
-
},
|
|
1153
|
-
{
|
|
1154
|
-
emissiveSampler: pipelineState.defaultSampler,
|
|
1155
|
-
emissiveView: pipelineState.defaultWhiteTextureView,
|
|
1156
|
-
occlusionSampler: pipelineState.defaultSampler,
|
|
1157
|
-
occlusionView: pipelineState.defaultWhiteTextureView,
|
|
1158
|
-
},
|
|
1159
|
-
);
|
|
1362
|
+
const completeEntries = assembleMaterialWithSkylightEntries(entries, {
|
|
1363
|
+
irradianceView: fallback.irradianceView,
|
|
1364
|
+
irradianceSampler: fallback.sampler,
|
|
1365
|
+
prefilterView: fallback.prefilterView,
|
|
1366
|
+
prefilterSampler: fallback.sampler,
|
|
1367
|
+
brdfLutView: fallback.brdfLutView,
|
|
1368
|
+
brdfLutSampler: fallback.sampler,
|
|
1369
|
+
intensityBuffer: fallback.intensityBuffer,
|
|
1370
|
+
});
|
|
1160
1371
|
const group = internals.device.createBindGroup({ layout, entries: completeEntries });
|
|
1161
1372
|
if (!group.ok) {
|
|
1162
1373
|
if (buffer !== undefined) internals.device.destroyBuffer(buffer);
|
|
@@ -1232,6 +1443,8 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1232
1443
|
? null
|
|
1233
1444
|
: (descriptor.depthFormat as GPUTextureFormat),
|
|
1234
1445
|
descriptor.vertexLayout,
|
|
1446
|
+
undefined,
|
|
1447
|
+
input.shaderModuleMode,
|
|
1235
1448
|
);
|
|
1236
1449
|
// A requested material shader is an exact pipeline contract. During
|
|
1237
1450
|
// async shader warmup, substituting the generic unlit pipeline can
|
|
@@ -1367,6 +1580,98 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1367
1580
|
gpuDriven: gpuDrivenProduction.inspect(),
|
|
1368
1581
|
};
|
|
1369
1582
|
},
|
|
1583
|
+
get environment(): EnvironmentInspection {
|
|
1584
|
+
return environmentLifecycle.inspect();
|
|
1585
|
+
},
|
|
1586
|
+
get temporal(): TemporalInspection {
|
|
1587
|
+
return inspectTemporal(frameState.lastSuccessfulTemporalView, undefined, {
|
|
1588
|
+
...(frameState.activeTemporalGpuState === undefined
|
|
1589
|
+
? {}
|
|
1590
|
+
: { active: frameState.activeTemporalGpuState }),
|
|
1591
|
+
...(frameState.temporalGpuState === undefined
|
|
1592
|
+
? {}
|
|
1593
|
+
: { candidate: frameState.temporalGpuState }),
|
|
1594
|
+
retiring: [...frameState.retiringTemporalGpuStates],
|
|
1595
|
+
deviceGeneration: internals.deviceScope.generation,
|
|
1596
|
+
});
|
|
1597
|
+
},
|
|
1598
|
+
get motionBlurInspection(): MotionBlurInspection | undefined {
|
|
1599
|
+
const camera = latestCamera;
|
|
1600
|
+
if (camera?.motionBlur === undefined) return undefined;
|
|
1601
|
+
const demanded = camera.motionBlur.shutterAngle > 0;
|
|
1602
|
+
const unavailable = demanded && !internals.device.caps.rgba16floatRenderable;
|
|
1603
|
+
const admitted =
|
|
1604
|
+
frameState.activeTemporalGpuState !== undefined ||
|
|
1605
|
+
frameState.temporalGpuState !== undefined;
|
|
1606
|
+
return {
|
|
1607
|
+
enabled: demanded,
|
|
1608
|
+
status: !demanded ? 'off' : unavailable || !admitted ? 'reset' : 'active',
|
|
1609
|
+
shutterAngle: camera.motionBlur.shutterAngle,
|
|
1610
|
+
maxRadiusPixels: camera.motionBlur.maxRadiusPixels,
|
|
1611
|
+
sampleCount: camera.motionBlur.sampleCount,
|
|
1612
|
+
temporalDemand: demanded ? 'scene-data-temporal-v1' : 'none',
|
|
1613
|
+
passName: 'motion-blur',
|
|
1614
|
+
historyWrites: 0,
|
|
1615
|
+
...(unavailable ? { lastFailure: 'scene-data-unavailable' as const } : {}),
|
|
1616
|
+
};
|
|
1617
|
+
},
|
|
1618
|
+
get temporalTargetInspection(): TemporalTargetInspection | undefined {
|
|
1619
|
+
const graph = frameState.compiledFrameGraph?.inspect();
|
|
1620
|
+
if (graph === undefined) return undefined;
|
|
1621
|
+
const producer = graph.passes.find((pass) => pass.name === 'standard-scene-data');
|
|
1622
|
+
// The producer's semantic target is the graph-owned
|
|
1623
|
+
// `standard-scene-temporal` resource. Resolve it from the compiled
|
|
1624
|
+
// resource table rather than the pass access projection: a backend may
|
|
1625
|
+
// retain a view alias in the access list while the resource owner still
|
|
1626
|
+
// carries the canonical semantic label.
|
|
1627
|
+
const target = graph.resources.find(
|
|
1628
|
+
(resource) => resource.kind === 'texture' && resource.label === 'standard-scene-temporal',
|
|
1629
|
+
);
|
|
1630
|
+
if (producer === undefined || target === undefined) {
|
|
1631
|
+
return undefined;
|
|
1632
|
+
}
|
|
1633
|
+
const width = Math.max(1, internals.canvas.width);
|
|
1634
|
+
const height = Math.max(1, internals.canvas.height);
|
|
1635
|
+
return Object.freeze({
|
|
1636
|
+
identity: 'standard-scene-temporal',
|
|
1637
|
+
producerId: 'forgeax::standard::scene-data',
|
|
1638
|
+
schema: 'forgeax::scene-data::temporal-v1',
|
|
1639
|
+
targetCount: 1,
|
|
1640
|
+
descriptor: Object.freeze({
|
|
1641
|
+
format: 'rgba16float',
|
|
1642
|
+
width,
|
|
1643
|
+
height,
|
|
1644
|
+
sampleCount: 1,
|
|
1645
|
+
bytes: width * height * 8,
|
|
1646
|
+
}),
|
|
1647
|
+
});
|
|
1648
|
+
},
|
|
1649
|
+
get bloom(): BloomInspection {
|
|
1650
|
+
const pipelineState = internals.getPipelineState();
|
|
1651
|
+
const resources = pipelineState?.perPassResources;
|
|
1652
|
+
const lifecycle = resources?.inspectBloomResources?.(
|
|
1653
|
+
frameState.compiledFrameGraph?.inspect(),
|
|
1654
|
+
);
|
|
1655
|
+
return Object.freeze(
|
|
1656
|
+
lifecycle ?? {
|
|
1657
|
+
graphStatus: 'empty',
|
|
1658
|
+
enabled: false,
|
|
1659
|
+
targetCount: 0,
|
|
1660
|
+
targetBytes: 0,
|
|
1661
|
+
resourceCount: 0,
|
|
1662
|
+
passCount: 0,
|
|
1663
|
+
encodeCount: 0,
|
|
1664
|
+
bindGroupCount: 0,
|
|
1665
|
+
uploadCount: 0,
|
|
1666
|
+
residentChildBytes: 0,
|
|
1667
|
+
generation: 0,
|
|
1668
|
+
state: 'off',
|
|
1669
|
+
},
|
|
1670
|
+
);
|
|
1671
|
+
},
|
|
1672
|
+
get transmission(): TransmissionInspection | undefined {
|
|
1673
|
+
return lastTransmissionInspection;
|
|
1674
|
+
},
|
|
1370
1675
|
get pointsLinesSnapshots(): readonly PointsLinesRetainedSnapshot[] {
|
|
1371
1676
|
return persistentRenderScene.pointsLinesSnapshots();
|
|
1372
1677
|
},
|
|
@@ -1377,6 +1682,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1377
1682
|
worlds: readonly World[],
|
|
1378
1683
|
opts: DrawOwnerOptions,
|
|
1379
1684
|
renderReadLeases?: readonly RenderReadLease[],
|
|
1685
|
+
timingCapture?: GpuTimingCapture,
|
|
1380
1686
|
): boolean {
|
|
1381
1687
|
preparedWorlds = worlds;
|
|
1382
1688
|
const profileSession = internals.profiler?.activeSession();
|
|
@@ -1450,16 +1756,53 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1450
1756
|
const {
|
|
1451
1757
|
cameras,
|
|
1452
1758
|
lights,
|
|
1759
|
+
environment,
|
|
1760
|
+
environmentReady,
|
|
1761
|
+
volumetricFog,
|
|
1453
1762
|
renderables,
|
|
1454
1763
|
dispatch,
|
|
1455
1764
|
skylight,
|
|
1456
1765
|
skylightCount,
|
|
1457
1766
|
skybox,
|
|
1458
1767
|
skyboxCount,
|
|
1768
|
+
fog,
|
|
1459
1769
|
frustumStats,
|
|
1460
1770
|
visibilityStats,
|
|
1461
1771
|
postProcessParams,
|
|
1462
1772
|
} = frame;
|
|
1773
|
+
latestCamera = cameras[0];
|
|
1774
|
+
const temporalDemanded =
|
|
1775
|
+
cameras[0]?.antialias === 'taa' || (cameras[0]?.motionBlur?.shutterAngle ?? 0) > 0;
|
|
1776
|
+
if (temporalDemanded) {
|
|
1777
|
+
persistentRenderScene.prepareTemporalFrame(renderables);
|
|
1778
|
+
}
|
|
1779
|
+
environmentLifecycle.bindScope(internals.deviceScope);
|
|
1780
|
+
if (!environmentReady || environment === undefined) {
|
|
1781
|
+
frameState.pendingTemporalCommit = { kind: 'none' };
|
|
1782
|
+
// A world with no camera still has a valid clear-only render path.
|
|
1783
|
+
// It has no environment candidate and therefore must not publish an
|
|
1784
|
+
// off/taa temporal state; camera-bearing rejected extraction remains
|
|
1785
|
+
// an atomic render failure.
|
|
1786
|
+
if (cameras.length > 0) return false;
|
|
1787
|
+
} else {
|
|
1788
|
+
const environmentCandidate = environmentLifecycle.ensure(environment);
|
|
1789
|
+
if (!environmentCandidate.ok) {
|
|
1790
|
+
environmentLifecycle.recordCandidateFailure(environmentCandidate.error);
|
|
1791
|
+
internals.errorRegistry.fire(environmentCandidate.error);
|
|
1792
|
+
return false;
|
|
1793
|
+
}
|
|
1794
|
+
if (!environmentLifecycle.isActive(environmentCandidate.value)) {
|
|
1795
|
+
frameState.environmentGeneration = environmentCandidate.value;
|
|
1796
|
+
}
|
|
1797
|
+
}
|
|
1798
|
+
const transmissionAntialias = frame.cameras[0]?.antialias ?? 'none';
|
|
1799
|
+
if (!prepareTransmissionCandidate(transmissionAntialias)) {
|
|
1800
|
+
// The candidate gate runs before bind-group preparation, graph
|
|
1801
|
+
// construction, and record/submit. A missing capability therefore
|
|
1802
|
+
// cannot publish or execute a transmission graph.
|
|
1803
|
+
updateTransmissionInspection(transmissionAntialias, false);
|
|
1804
|
+
return false;
|
|
1805
|
+
}
|
|
1463
1806
|
if (lastMeshMaterialBindingFrame !== frame) {
|
|
1464
1807
|
lastMeshMaterialBindingFrame = frame;
|
|
1465
1808
|
lastMeshMaterialBindings = renderables.map((renderable) => ({
|
|
@@ -1530,6 +1873,9 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1530
1873
|
targets: featureTargets,
|
|
1531
1874
|
generation: internals.featureHost?.preparedGeneration ?? 0,
|
|
1532
1875
|
caps: internals.device.caps,
|
|
1876
|
+
...(internals.getMaterialShaderBindingContract === undefined
|
|
1877
|
+
? {}
|
|
1878
|
+
: { materialShaderBindingContract: internals.getMaterialShaderBindingContract }),
|
|
1533
1879
|
createPreparedGraphicsResolver: preparedResolverFactory,
|
|
1534
1880
|
gpuWork: featureGpuWork,
|
|
1535
1881
|
});
|
|
@@ -1605,6 +1951,9 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1605
1951
|
}
|
|
1606
1952
|
return runProfiledRenderPhase(profileSession, phase, action);
|
|
1607
1953
|
};
|
|
1954
|
+
if (cameras[0]?.bloom === 'on') {
|
|
1955
|
+
internals.getPipelineState()?.perPassResources.ensureBloomResources?.();
|
|
1956
|
+
}
|
|
1608
1957
|
submitted = runProfiledRenderPhase(profileSession, 'record', () =>
|
|
1609
1958
|
recordFrame(
|
|
1610
1959
|
internals,
|
|
@@ -1621,6 +1970,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1621
1970
|
skybox,
|
|
1622
1971
|
skyboxCount,
|
|
1623
1972
|
postProcessParams,
|
|
1973
|
+
fog,
|
|
1624
1974
|
worlds,
|
|
1625
1975
|
recordProfilePhase,
|
|
1626
1976
|
{
|
|
@@ -1634,8 +1984,38 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1634
1984
|
renderReadLeases,
|
|
1635
1985
|
featureGraphCandidate,
|
|
1636
1986
|
pointsLinesOwner,
|
|
1987
|
+
environment?.environmentSignature ?? '',
|
|
1988
|
+
environment?.fogSignature ?? '',
|
|
1989
|
+
environmentReady && environment !== undefined,
|
|
1990
|
+
persistentRenderScene.transmissionTopologyDemand(),
|
|
1991
|
+
volumetricFog,
|
|
1992
|
+
timingCapture,
|
|
1637
1993
|
),
|
|
1638
1994
|
);
|
|
1995
|
+
if (submitted) {
|
|
1996
|
+
const temporalCommit = persistentRenderScene.commitTemporalFrame();
|
|
1997
|
+
if (!temporalCommit.ok) {
|
|
1998
|
+
internals.errorRegistry.fire(temporalCommit.error);
|
|
1999
|
+
}
|
|
2000
|
+
frameState.lastSuccessfulCameraAntialias = cameras[0]?.antialias;
|
|
2001
|
+
internals.getPipelineState()?.perPassResources.commitBloomResources?.();
|
|
2002
|
+
const nextBloom = cameras[0]?.bloom ?? 'off';
|
|
2003
|
+
if (frameState.lastSuccessfulBloom === 'on' && nextBloom !== 'on') {
|
|
2004
|
+
internals
|
|
2005
|
+
.getPipelineState()
|
|
2006
|
+
?.perPassResources.retireBloomResources?.(
|
|
2007
|
+
internals.device.queue.onSubmittedWorkDone(),
|
|
2008
|
+
);
|
|
2009
|
+
}
|
|
2010
|
+
frameState.lastSuccessfulBloom = nextBloom;
|
|
2011
|
+
} else {
|
|
2012
|
+
internals.getPipelineState()?.perPassResources.discardBloomResources?.();
|
|
2013
|
+
}
|
|
2014
|
+
if (!submitted && frameState.environmentGeneration !== undefined) {
|
|
2015
|
+
environmentLifecycle.discard(frameState.environmentGeneration);
|
|
2016
|
+
frameState.environmentGeneration = undefined;
|
|
2017
|
+
}
|
|
2018
|
+
updateTransmissionInspection(transmissionAntialias, submitted);
|
|
1639
2019
|
persistentRenderScene.setPointsLinesInspections(pointsLinesOwner.inspections());
|
|
1640
2020
|
if (internals.featureHost !== undefined && preparedResourceBatches.length > 0) {
|
|
1641
2021
|
const batches = preparedResourceBatches;
|
|
@@ -1653,10 +2033,20 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1653
2033
|
}
|
|
1654
2034
|
}
|
|
1655
2035
|
} catch (err) {
|
|
2036
|
+
if (!submitted) {
|
|
2037
|
+
internals.getPipelineState()?.perPassResources.discardBloomResources?.();
|
|
2038
|
+
}
|
|
1656
2039
|
const innerError =
|
|
1657
|
-
err instanceof
|
|
1658
|
-
?
|
|
1659
|
-
|
|
2040
|
+
err instanceof PipelineSpecError
|
|
2041
|
+
? {
|
|
2042
|
+
name: err.name,
|
|
2043
|
+
code: err.code,
|
|
2044
|
+
message: err.message,
|
|
2045
|
+
detail: err.detail,
|
|
2046
|
+
}
|
|
2047
|
+
: err instanceof RhiError
|
|
2048
|
+
? err
|
|
2049
|
+
: { code: 'unknown' as const, message: String(err), name: (err as Error)?.name };
|
|
1660
2050
|
internals.errorRegistry.fire(
|
|
1661
2051
|
new RhiError({
|
|
1662
2052
|
code: 'webgpu-runtime-error',
|
|
@@ -1681,7 +2071,39 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1681
2071
|
const currentFrameId = frameState.frameNumber - 1;
|
|
1682
2072
|
return observeCurrentFrame(options, frameState.currentFrameObservationSource, currentFrameId);
|
|
1683
2073
|
},
|
|
2074
|
+
getCurrentGraphTarget(name: string) {
|
|
2075
|
+
const graph = frameState.perFrameGraph;
|
|
2076
|
+
if (graph === undefined || graph === null) return undefined;
|
|
2077
|
+
const descriptor = graph.getColorTargetDescriptor(name);
|
|
2078
|
+
const texture = graph.getColorTargetTexture(name);
|
|
2079
|
+
if (descriptor === undefined || texture === undefined) return undefined;
|
|
2080
|
+
return {
|
|
2081
|
+
name,
|
|
2082
|
+
texture,
|
|
2083
|
+
textureIdentity: getTextureIdentity(texture),
|
|
2084
|
+
descriptor,
|
|
2085
|
+
frameId: frameState.frameNumber - 1,
|
|
2086
|
+
graphGeneration: graph.graphGeneration,
|
|
2087
|
+
};
|
|
2088
|
+
},
|
|
2089
|
+
requestGraphTargetCapture(request: GraphTargetCaptureRequest) {
|
|
2090
|
+
frameState.graphTargetCapture = request;
|
|
2091
|
+
},
|
|
1684
2092
|
bindGroupCounts: bindGroupCounts,
|
|
2093
|
+
get temporalFrame(): TemporalFrame | undefined {
|
|
2094
|
+
const accepted = frameState.temporalFrame;
|
|
2095
|
+
if (accepted === undefined) return undefined;
|
|
2096
|
+
return {
|
|
2097
|
+
...accepted,
|
|
2098
|
+
currentViewProjection: new Float32Array(accepted.currentViewProjection),
|
|
2099
|
+
previousViewProjection:
|
|
2100
|
+
accepted.previousViewProjection === undefined
|
|
2101
|
+
? undefined
|
|
2102
|
+
: new Float32Array(accepted.previousViewProjection),
|
|
2103
|
+
jitter: [accepted.jitter[0], accepted.jitter[1]],
|
|
2104
|
+
viewport: { ...accepted.viewport },
|
|
2105
|
+
};
|
|
2106
|
+
},
|
|
1685
2107
|
frustumStats: lastFrustumStats,
|
|
1686
2108
|
visibilityStats: lastVisibilityStats,
|
|
1687
2109
|
get meshMaterialBindings(): readonly MeshMaterialBindingObservation[] {
|
|
@@ -1690,6 +2112,15 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1690
2112
|
get perFramePassNames(): readonly string[] {
|
|
1691
2113
|
return frameState.compiledFrameGraph?.inspect().passes.map((pass) => pass.name) ?? [];
|
|
1692
2114
|
},
|
|
2115
|
+
get lastSuccessfulCameraAntialias(): CameraSnapshot['antialias'] | undefined {
|
|
2116
|
+
return frameState.lastSuccessfulCameraAntialias;
|
|
2117
|
+
},
|
|
2118
|
+
get perFrameGraphInfo(): CompiledRenderGraphInfo | undefined {
|
|
2119
|
+
return frameState.compiledFrameGraph?.inspect();
|
|
2120
|
+
},
|
|
2121
|
+
get volumetricFog(): import('./volume/inspection').VolumetricFogInspection {
|
|
2122
|
+
return frameState.volumetricFogInspection;
|
|
2123
|
+
},
|
|
1693
2124
|
configureStandard(config: RenderPipelineAsset['config']): void {
|
|
1694
2125
|
const profileConfig = internals.standardProfile;
|
|
1695
2126
|
const resolvedConfig =
|
|
@@ -1723,7 +2154,16 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1723
2154
|
// is a rare boot/swap event, never a per-frame cost.
|
|
1724
2155
|
installEpoch += 1;
|
|
1725
2156
|
frameState.installedPipelineHandle = installEpoch;
|
|
1726
|
-
|
|
2157
|
+
// The installed profile may request clustered lighting, but the actual
|
|
2158
|
+
// graph lane is capability-gated. On WebGL2 (including WebKit's wgpu
|
|
2159
|
+
// fallback) the forward lane is selected when compute/storage buffers
|
|
2160
|
+
// are unavailable; keep the frame bindings on that same lane instead of
|
|
2161
|
+
// advertising HDRP's clustered bind-group layout to URP pipelines.
|
|
2162
|
+
frameState.isHdrpActive =
|
|
2163
|
+
resolveStandardLane(internals.standardProfile ?? DEFAULT_STANDARD_PROFILE, {
|
|
2164
|
+
compute: internals.device.caps.compute,
|
|
2165
|
+
storageBuffer: internals.device.caps.storageBuffer,
|
|
2166
|
+
}) === 'clustered';
|
|
1727
2167
|
frameState.installedPipelineConfig = resolvedConfig;
|
|
1728
2168
|
},
|
|
1729
2169
|
registerBuiltinPostProcess(id: string, entry: PostProcessShaderEntry): () => void {
|
|
@@ -1731,7 +2171,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1731
2171
|
// byteSize / defaultValue validation (q5=A).
|
|
1732
2172
|
let paramsBuffer: Buffer | undefined;
|
|
1733
2173
|
try {
|
|
1734
|
-
if (entry.params !== undefined) {
|
|
2174
|
+
if (id !== 'forgeax.taa-resolve' && entry.params !== undefined) {
|
|
1735
2175
|
const { byteSize, defaultValue } = entry.params;
|
|
1736
2176
|
if (byteSize < 16 || defaultValue.length !== byteSize) {
|
|
1737
2177
|
throw new PostProcessError({
|
|
@@ -1749,7 +2189,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1749
2189
|
paramsBuffer = paramsBufferResult.value;
|
|
1750
2190
|
const writeResult = internals.device.queue.writeBuffer(paramsBuffer, 0, defaultValue);
|
|
1751
2191
|
if (!writeResult.ok) throw writeResult.error;
|
|
1752
|
-
} else if (entryHasDepthRead(entry)) {
|
|
2192
|
+
} else if (id !== 'forgeax.taa-resolve' && entryHasDepthRead(entry)) {
|
|
1753
2193
|
const paramsBufferResult = internals.device.createBuffer({
|
|
1754
2194
|
label: `post-process-params-${id}`,
|
|
1755
2195
|
size: DEPTH_MIN_PARAMS_BYTE_SIZE,
|
|
@@ -1789,6 +2229,13 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1789
2229
|
persistentRenderScene.dispose();
|
|
1790
2230
|
gpuDrivenProduction.dispose();
|
|
1791
2231
|
disposeFeatureGpuWork();
|
|
2232
|
+
// Bloom generations are renderer-owned rather than graph-owned. Drain
|
|
2233
|
+
// candidate, active, and fence-retiring bundles before the rest of the
|
|
2234
|
+
// frame state is torn down; the owner callback is idempotent so the
|
|
2235
|
+
// outer Renderer.dispose cascade can safely call this once only.
|
|
2236
|
+
internals.getPipelineState()?.perPassResources.drainBloomResources?.();
|
|
2237
|
+
internals.clearPostProcessPipelineCache?.('forgeax.taa-resolve');
|
|
2238
|
+
internals.invalidateShaderModule?.('post-process-forgeax.taa-resolve-module');
|
|
1792
2239
|
// Retire graph-owned resources and dispose instance-buffer caches.
|
|
1793
2240
|
// Both calls are idempotent + tolerate per-handle errors silently;
|
|
1794
2241
|
// the Renderer.dispose() cascade owns the surrounding try/catch
|
|
@@ -1798,8 +2245,37 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1798
2245
|
frameState.directionalShadowCache = null;
|
|
1799
2246
|
frameState.directionalShadowCacheRecorded = false;
|
|
1800
2247
|
frameState.currentFrameObservationSource = undefined;
|
|
2248
|
+
frameState.lastSuccessfulCameraAntialias = undefined;
|
|
1801
2249
|
frameState.currentDirectionalShadowView = null;
|
|
1802
2250
|
frameState.currentSpotShadowView = null;
|
|
2251
|
+
if (frameState.temporalGpuState !== undefined) {
|
|
2252
|
+
retireTemporalGpuState(frameState.temporalGpuState);
|
|
2253
|
+
frameState.temporalGpuState = undefined;
|
|
2254
|
+
}
|
|
2255
|
+
if (frameState.activeTemporalGpuState !== undefined) {
|
|
2256
|
+
retireTemporalGpuState(frameState.activeTemporalGpuState);
|
|
2257
|
+
frameState.activeTemporalGpuState = undefined;
|
|
2258
|
+
}
|
|
2259
|
+
for (const retiring of frameState.retiringTemporalGpuStates) {
|
|
2260
|
+
retireTemporalGpuState(retiring);
|
|
2261
|
+
}
|
|
2262
|
+
frameState.retiringTemporalGpuStates.clear();
|
|
2263
|
+
settleVolumetricFogGraphCandidate(frameState, false);
|
|
2264
|
+
for (const buffer of frameState.volumetricFogParamsBuffers) {
|
|
2265
|
+
if (buffer === null) continue;
|
|
2266
|
+
const destroyed = internals.device.destroyBuffer(buffer);
|
|
2267
|
+
if (!destroyed.ok) internals.errorRegistry.fire(destroyed.error);
|
|
2268
|
+
}
|
|
2269
|
+
frameState.volumetricFogParamsBuffers = [null, null];
|
|
2270
|
+
frameState.volumetricFogParamsPendingSlot = null;
|
|
2271
|
+
frameState.volumetricFogParamsAcceptedSlot = null;
|
|
2272
|
+
frameState.volumetricFogAcceptedParams = undefined;
|
|
2273
|
+
frameState.volumetricFogPendingParams = undefined;
|
|
2274
|
+
frameState.volumetricFogAccepted = undefined;
|
|
2275
|
+
frameState.volumetricFogAcceptedContext = undefined;
|
|
2276
|
+
frameState.volumetricFogHistoryGraph = null;
|
|
2277
|
+
frameState.volumetricFogHistorySlot = null;
|
|
2278
|
+
frameState.volumetricFogHistorySignature = null;
|
|
1803
2279
|
const compiled = frameState.compiledFrameGraph;
|
|
1804
2280
|
frameState.compiledFrameGraph = null;
|
|
1805
2281
|
frameState.compiledFrameGraphTopologyKey = null;
|
|
@@ -1833,23 +2309,66 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1833
2309
|
}
|
|
1834
2310
|
},
|
|
1835
2311
|
resetForRecover(): void {
|
|
2312
|
+
transmissionAdmission.markDeviceLost();
|
|
2313
|
+
lastTransmissionKey = '';
|
|
2314
|
+
transmissionCapabilityGeneration = -1;
|
|
2315
|
+
transmissionCapability = undefined;
|
|
2316
|
+
// Keep the persistent material demand observable across device loss.
|
|
2317
|
+
// The physical resource has already been fenced by markDeviceLost(); the
|
|
2318
|
+
// detached inspection now exposes the rebuild-required lifecycle until a
|
|
2319
|
+
// completed frame admits the replacement resource.
|
|
2320
|
+
updateTransmissionInspection(lastTransmissionAntialias, false);
|
|
1836
2321
|
persistentRenderScene.resetGpuForRecover();
|
|
1837
2322
|
gpuDrivenProduction.dispose();
|
|
1838
2323
|
gpuDrivenProduction = new GpuDrivenProduction(internals.device, gpuDrivenShaderFactory);
|
|
1839
2324
|
disposeFeatureGpuWork();
|
|
2325
|
+
// A recovered device cannot retain handles from the lost device. The
|
|
2326
|
+
// Bloom owner abandons candidates and retires every committed generation
|
|
2327
|
+
// before the new PipelineState is rebuilt.
|
|
2328
|
+
internals.getPipelineState()?.perPassResources.drainBloomResources?.();
|
|
1840
2329
|
// feat-20260622-s5 M3 / B-2 / w18: recover() rebuild drops device-bound
|
|
1841
2330
|
// state minted by the lost device. The active graph and per-entity caches
|
|
1842
2331
|
// must be discarded, not merely marked for destruction: their opaque
|
|
1843
2332
|
// handles cannot be used on the fresh device and the next draw must
|
|
1844
2333
|
// lazily build a new graph from the preserved ECS / asset POD caches.
|
|
2334
|
+
settleVolumetricFogGraphCandidate(frameState, false);
|
|
1845
2335
|
frameState.compiledFrameGraph?.retire().catch(() => undefined);
|
|
1846
2336
|
frameState.compiledFrameGraph = null;
|
|
1847
2337
|
frameState.compiledFrameGraphTopologyKey = null;
|
|
2338
|
+
frameState.volumetricFogPreviousGraph = null;
|
|
2339
|
+
frameState.volumetricFogPreviousGraphKey = null;
|
|
2340
|
+
frameState.volumetricFogCandidateGraph = null;
|
|
2341
|
+
frameState.volumetricFogAccepted = undefined;
|
|
2342
|
+
frameState.volumetricFogAcceptedContext = undefined;
|
|
2343
|
+
frameState.volumetricFogHistoryGraph = null;
|
|
2344
|
+
frameState.volumetricFogHistorySlot = null;
|
|
2345
|
+
frameState.volumetricFogHistorySignature = null;
|
|
2346
|
+
// The old device owns these transient params buffers. Discard their
|
|
2347
|
+
// handles without calling destroy() on the lost device; the next frame
|
|
2348
|
+
// must allocate fresh buffers on the replacement device.
|
|
2349
|
+
frameState.volumetricFogParamsBuffers = [null, null];
|
|
2350
|
+
frameState.volumetricFogParamsPendingSlot = null;
|
|
2351
|
+
frameState.volumetricFogParamsAcceptedSlot = null;
|
|
2352
|
+
frameState.volumetricFogAcceptedParams = undefined;
|
|
2353
|
+
frameState.volumetricFogPendingParams = undefined;
|
|
1848
2354
|
frameState.directionalShadowCache = null;
|
|
1849
2355
|
frameState.directionalShadowCacheRecorded = false;
|
|
1850
2356
|
frameState.currentFrameObservationSource = undefined;
|
|
2357
|
+
frameState.lastSuccessfulCameraAntialias = undefined;
|
|
1851
2358
|
frameState.currentDirectionalShadowView = null;
|
|
1852
2359
|
frameState.currentSpotShadowView = null;
|
|
2360
|
+
if (frameState.temporalGpuState !== undefined) {
|
|
2361
|
+
retireTemporalGpuState(frameState.temporalGpuState);
|
|
2362
|
+
frameState.temporalGpuState = undefined;
|
|
2363
|
+
}
|
|
2364
|
+
if (frameState.activeTemporalGpuState !== undefined) {
|
|
2365
|
+
retireTemporalGpuState(frameState.activeTemporalGpuState);
|
|
2366
|
+
frameState.activeTemporalGpuState = undefined;
|
|
2367
|
+
}
|
|
2368
|
+
for (const retiring of frameState.retiringTemporalGpuStates) {
|
|
2369
|
+
retireTemporalGpuState(retiring);
|
|
2370
|
+
}
|
|
2371
|
+
frameState.retiringTemporalGpuStates.clear();
|
|
1853
2372
|
for (const retired of frameState.retiredCompiledFrameGraphs) {
|
|
1854
2373
|
retired.retire().catch(() => undefined);
|
|
1855
2374
|
}
|
|
@@ -1886,6 +2405,7 @@ export function createRenderSystem(internals: RenderSystemInternals): RenderSyst
|
|
|
1886
2405
|
...activeFeaturePostProcessEntries.entries(),
|
|
1887
2406
|
];
|
|
1888
2407
|
for (const [id, entry] of declarations) {
|
|
2408
|
+
if (id === 'forgeax.taa-resolve') continue;
|
|
1889
2409
|
let buffer: Buffer | undefined;
|
|
1890
2410
|
if (entry.params !== undefined) {
|
|
1891
2411
|
const created = internals.device.createBuffer({
|