@forgeax/engine-render 0.1.6 → 0.1.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +279 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/assembly/backend-contract.d.ts +12 -0
- package/dist/assembly/backend-contract.d.ts.map +1 -1
- package/dist/assembly/factory.d.ts +19 -2
- package/dist/assembly/factory.d.ts.map +1 -1
- package/dist/assembly/host-contract.d.ts +4 -0
- package/dist/assembly/host-contract.d.ts.map +1 -1
- package/dist/assembly/material/assembly.d.ts.map +1 -1
- package/dist/assembly/renderer-frame-transaction.d.ts +39 -0
- package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -0
- package/dist/assembly/renderer-inspection.d.ts +22 -0
- package/dist/assembly/renderer-inspection.d.ts.map +1 -0
- package/dist/assembly/renderer-lifecycle.d.ts +4 -0
- package/dist/assembly/renderer-lifecycle.d.ts.map +1 -0
- package/dist/authoring.d.ts +1 -0
- package/dist/authoring.d.ts.map +1 -1
- package/dist/authoring.mjs +4 -2
- package/dist/authoring.mjs.map +1 -1
- package/dist/chunk-FJ6P52EE.mjs +46 -0
- package/dist/chunk-FJ6P52EE.mjs.map +1 -0
- package/dist/chunk-IPXCABEP.mjs +73 -0
- package/dist/chunk-IPXCABEP.mjs.map +1 -0
- package/dist/chunk-JDWARUOI.mjs +44 -0
- package/dist/chunk-JDWARUOI.mjs.map +1 -0
- package/dist/chunk-LOSO4CTV.mjs +901 -0
- package/dist/chunk-LOSO4CTV.mjs.map +1 -0
- package/dist/chunk-PCHBPYML.mjs +385 -0
- package/dist/chunk-PCHBPYML.mjs.map +1 -0
- package/dist/chunk-RJRUS55L.mjs +9323 -0
- package/dist/chunk-RJRUS55L.mjs.map +1 -0
- package/dist/{chunk-QC4VW3XJ.mjs → chunk-RXZ3RGOU.mjs} +4 -30
- package/dist/chunk-RXZ3RGOU.mjs.map +1 -0
- package/dist/{chunk-CQXZC5XI.mjs → chunk-VFPLTKCU.mjs} +79 -69
- package/dist/chunk-VFPLTKCU.mjs.map +1 -0
- package/dist/{chunk-SCRSAK5B.mjs → chunk-YTQ5C7YQ.mjs} +231 -127
- package/dist/chunk-YTQ5C7YQ.mjs.map +1 -0
- package/dist/components/atmosphere.d.ts +9 -0
- package/dist/components/atmosphere.d.ts.map +1 -0
- package/dist/components/camera.d.ts +2 -1
- package/dist/components/camera.d.ts.map +1 -1
- package/dist/components/fog.d.ts +8 -0
- package/dist/components/fog.d.ts.map +1 -0
- package/dist/components/index.d.ts +5 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/lines.d.ts +5 -0
- package/dist/components/lines.d.ts.map +1 -0
- package/dist/components/motion-blur.d.ts +7 -0
- package/dist/components/motion-blur.d.ts.map +1 -0
- package/dist/components/points.d.ts +15 -0
- package/dist/components/points.d.ts.map +1 -0
- package/dist/construct-renderer.d.ts +2 -2
- package/dist/construct-renderer.d.ts.map +1 -1
- package/dist/construct-renderer.mjs +11419 -16442
- package/dist/construct-renderer.mjs.map +1 -1
- package/dist/device/device-scope.d.ts +4 -0
- package/dist/device/device-scope.d.ts.map +1 -1
- package/dist/environment/frame.d.ts +60 -0
- package/dist/environment/frame.d.ts.map +1 -0
- package/dist/environment/generation.d.ts +21 -0
- package/dist/environment/generation.d.ts.map +1 -0
- package/dist/environment/graph.d.ts +4 -0
- package/dist/environment/graph.d.ts.map +1 -0
- package/dist/environment/inspection.d.ts +48 -0
- package/dist/environment/inspection.d.ts.map +1 -0
- package/dist/environment/lifecycle.d.ts +39 -0
- package/dist/environment/lifecycle.d.ts.map +1 -0
- package/dist/environment/signature.d.ts +25 -0
- package/dist/environment/signature.d.ts.map +1 -0
- package/dist/errors/render.d.ts +217 -1
- package/dist/errors/render.d.ts.map +1 -1
- package/dist/extract/camera.d.ts +5 -0
- package/dist/extract/camera.d.ts.map +1 -0
- package/dist/extract/environment.d.ts +74 -0
- package/dist/extract/environment.d.ts.map +1 -0
- package/dist/extract/visibility.d.ts +1 -1
- package/dist/extract/visibility.d.ts.map +1 -1
- package/dist/features/host.d.ts +9 -2
- package/dist/features/host.d.ts.map +1 -1
- package/dist/features/motion-blur/motion-blur-feature.d.ts +16 -0
- package/dist/features/motion-blur/motion-blur-feature.d.ts.map +1 -0
- package/dist/features/motion-blur/motion-blur-params.d.ts +25 -0
- package/dist/features/motion-blur/motion-blur-params.d.ts.map +1 -0
- package/dist/features/plan.d.ts +17 -2
- package/dist/features/plan.d.ts.map +1 -1
- package/dist/features/prepared-gpu-work.d.ts +3 -1
- package/dist/features/prepared-gpu-work.d.ts.map +1 -1
- package/dist/features/prepared-graphics.d.ts +2 -1
- package/dist/features/prepared-graphics.d.ts.map +1 -1
- package/dist/features/render-graph-raster.d.ts +7 -2
- package/dist/features/render-graph-raster.d.ts.map +1 -1
- package/dist/features/targets.d.ts +3 -0
- package/dist/features/targets.d.ts.map +1 -1
- package/dist/features/types.d.ts +12 -0
- package/dist/features/types.d.ts.map +1 -1
- package/dist/fullscreen-post-process-pass.d.ts +7 -1
- package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
- package/dist/gpu-driven/production-raster.d.ts.map +1 -1
- package/dist/gpu-scene.d.ts +2 -0
- package/dist/gpu-scene.d.ts.map +1 -1
- package/dist/ibl/skylight-bind-group.d.ts +5 -6
- package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
- package/dist/index.d.ts +21 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +8 -4
- package/dist/index.mjs.map +1 -1
- package/dist/inspection-types.d.ts +46 -1
- package/dist/inspection-types.d.ts.map +1 -1
- package/dist/internal.d.ts +2 -0
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.mjs +2 -0
- package/dist/materials.d.ts +22 -0
- package/dist/materials.d.ts.map +1 -1
- package/dist/pbr-pipeline.d.ts +12 -6
- package/dist/pbr-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
- package/dist/pipeline/standard-pipeline.d.ts +3 -0
- package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-post.d.ts +48 -0
- package/dist/pipeline/standard-post.d.ts.map +1 -0
- package/dist/pipeline/standard-profile.d.ts +3 -6
- package/dist/pipeline/standard-profile.d.ts.map +1 -1
- package/dist/pipeline-builder.d.ts +18 -0
- package/dist/pipeline-builder.d.ts.map +1 -1
- package/dist/pipeline-spec.d.ts.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/points-lines/admission.d.ts +36 -0
- package/dist/points-lines/admission.d.ts.map +1 -0
- package/dist/points-lines/bounds.d.ts +8 -0
- package/dist/points-lines/bounds.d.ts.map +1 -0
- package/dist/points-lines/expansion-cache.d.ts +28 -0
- package/dist/points-lines/expansion-cache.d.ts.map +1 -0
- package/dist/points-lines/inspection.d.ts +53 -0
- package/dist/points-lines/inspection.d.ts.map +1 -0
- package/dist/points-lines/prepare.d.ts +67 -0
- package/dist/points-lines/prepare.d.ts.map +1 -0
- package/dist/points-lines/record.d.ts +60 -0
- package/dist/points-lines/record.d.ts.map +1 -0
- package/dist/points-lines/snapshot.d.ts +49 -0
- package/dist/points-lines/snapshot.d.ts.map +1 -0
- package/dist/record/frame-lighting.d.ts.map +1 -1
- package/dist/record/frame-snapshot.d.ts +100 -5
- package/dist/record/frame-snapshot.d.ts.map +1 -1
- package/dist/record/frame-targets.d.ts.map +1 -1
- package/dist/record/frame.d.ts +4 -2
- package/dist/record/frame.d.ts.map +1 -1
- package/dist/record/main-pass-geometry.d.ts +18 -0
- package/dist/record/main-pass-geometry.d.ts.map +1 -1
- package/dist/record/main-pass-material.d.ts +8 -5
- package/dist/record/main-pass-material.d.ts.map +1 -1
- package/dist/record/main-pass-sprite-draws.d.ts +8 -1
- package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
- package/dist/record/main-pass.d.ts +2 -0
- package/dist/record/main-pass.d.ts.map +1 -1
- package/dist/record/mesh-ssbo.d.ts.map +1 -1
- package/dist/record/render-context.d.ts +93 -18
- package/dist/record/render-context.d.ts.map +1 -1
- package/dist/record/shadow-pass.d.ts.map +1 -1
- package/dist/record/skybox-post-pass.d.ts +1 -11
- package/dist/record/skybox-post-pass.d.ts.map +1 -1
- package/dist/record/typed-frame-graph.d.ts +26 -2
- package/dist/record/typed-frame-graph.d.ts.map +1 -1
- package/dist/record/view-ubo.d.ts +10 -1
- package/dist/record/view-ubo.d.ts.map +1 -1
- package/dist/render-contract.d.ts +102 -10
- package/dist/render-contract.d.ts.map +1 -1
- package/dist/render-graph-primitives.d.ts.map +1 -1
- package/dist/render-pipeline.d.ts +50 -6
- package/dist/render-pipeline.d.ts.map +1 -1
- package/dist/render-system-extract.d.ts +32 -5
- package/dist/render-system-extract.d.ts.map +1 -1
- package/dist/render-system.d.ts +27 -5
- package/dist/render-system.d.ts.map +1 -1
- package/dist/scene/render-scene-types.d.ts +3 -0
- package/dist/scene/render-scene-types.d.ts.map +1 -1
- package/dist/scene/render-scene.d.ts +43 -2
- package/dist/scene/render-scene.d.ts.map +1 -1
- package/dist/temporal/coverage.d.ts +42 -0
- package/dist/temporal/coverage.d.ts.map +1 -0
- package/dist/temporal/frame-coordinator.d.ts +99 -0
- package/dist/temporal/frame-coordinator.d.ts.map +1 -0
- package/dist/temporal/gpu.d.ts +39 -0
- package/dist/temporal/gpu.d.ts.map +1 -0
- package/dist/temporal/history.d.ts +37 -0
- package/dist/temporal/history.d.ts.map +1 -0
- package/dist/temporal/index.d.ts +7 -0
- package/dist/temporal/index.d.ts.map +1 -0
- package/dist/temporal/index.mjs +8 -0
- package/dist/temporal/index.mjs.map +1 -0
- package/dist/temporal/inspection.d.ts +36 -0
- package/dist/temporal/inspection.d.ts.map +1 -0
- package/dist/temporal/scene-data-catalog.d.ts +48 -0
- package/dist/temporal/scene-data-catalog.d.ts.map +1 -0
- package/dist/temporal/scene-data.d.ts +43 -0
- package/dist/temporal/scene-data.d.ts.map +1 -0
- package/dist/temporal/standard-scene-data.d.ts +61 -0
- package/dist/temporal/standard-scene-data.d.ts.map +1 -0
- package/dist/temporal/taa-history-resources.d.ts +22 -0
- package/dist/temporal/taa-history-resources.d.ts.map +1 -0
- package/dist/temporal/taa-history-store.d.ts +27 -0
- package/dist/temporal/taa-history-store.d.ts.map +1 -0
- package/dist/temporal/taa-resolve.d.ts +15 -0
- package/dist/temporal/taa-resolve.d.ts.map +1 -0
- package/dist/temporal/temporal-view.d.ts +40 -0
- package/dist/temporal/temporal-view.d.ts.map +1 -0
- package/dist/temporal/transaction.d.ts +9 -0
- package/dist/temporal/transaction.d.ts.map +1 -0
- package/dist/temporal/view.d.ts +56 -0
- package/dist/temporal/view.d.ts.map +1 -0
- package/dist/transmission/backdrop.d.ts +147 -0
- package/dist/transmission/backdrop.d.ts.map +1 -0
- package/dist/transmission/inspection.d.ts +57 -0
- package/dist/transmission/inspection.d.ts.map +1 -0
- package/dist/transmission/oracle.d.ts +42 -0
- package/dist/transmission/oracle.d.ts.map +1 -0
- package/dist/transmission/projection.d.ts +37 -0
- package/dist/transmission/projection.d.ts.map +1 -0
- package/dist/typed-render-graph-primitives.d.ts +25 -2
- package/dist/typed-render-graph-primitives.d.ts.map +1 -1
- package/package.json +24 -19
- package/src/__tests__/ai-user-cold-start.integration.test.ts +59 -0
- package/src/__tests__/ai-user-public-surface.test-d.ts +45 -0
- package/src/__tests__/authoring-path.unit.test.ts +9 -0
- package/src/__tests__/bloom-exact-zero.unit.test.ts +202 -0
- package/src/__tests__/bloom-lifecycle.integration.test.ts +125 -0
- package/src/__tests__/construct-renderer-identity.unit.test.ts +4 -3
- package/src/__tests__/detached-inspection.integration.test.ts +177 -0
- package/src/__tests__/environment-fog-lanes.integration.test.ts +219 -0
- package/src/__tests__/environment-generation.integration.test.ts +141 -0
- package/src/__tests__/environment-selection.unit.test.ts +245 -0
- package/src/__tests__/factory-contract.integration.test.ts +1380 -9
- package/src/__tests__/frame-plan-contract.unit.test.ts +90 -0
- package/src/__tests__/fullscreen-feature-plan.unit.test.ts +7 -0
- package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +12 -2
- package/src/__tests__/gpu-driven-production.integration.test.ts +74 -22
- package/src/__tests__/gpu-driven-view-graph.integration.test.ts +37 -0
- package/src/__tests__/gpu-scene.unit.test.ts +10 -0
- package/src/__tests__/injection-kind-owner.test-d.ts +2 -1
- package/src/__tests__/material-contract-inventory.unit.test.ts +62 -0
- package/src/__tests__/material-cooked-projection.unit.test.ts +18 -124
- package/src/__tests__/material-static-dynamic-route.unit.test.ts +28 -28
- package/src/__tests__/materials-transmission-validation.unit.test.ts +36 -0
- package/src/__tests__/morph-feature-plan.unit.test.ts +7 -0
- package/src/__tests__/motion-blur.pixel.integration.test.ts +121 -0
- package/src/__tests__/public-surface.test-d.ts +15 -1
- package/src/__tests__/render-error-code-owner.test-d.ts +15 -0
- package/src/__tests__/render-error-detail-ssot.test-d.ts +11 -2
- package/src/__tests__/render-error-exhaustive.test-d.ts +22 -0
- package/src/__tests__/render-feature-errors.unit.test.ts +33 -3
- package/src/__tests__/render-feature-gpu-work.integration.test.ts +44 -0
- package/src/__tests__/render-feature-plan.test-d.ts +22 -89
- package/src/__tests__/render-scene-projection.unit.test.ts +28 -0
- package/src/__tests__/render-temporal-environment-consumer.browser.test.ts +26 -0
- package/src/__tests__/render-temporal-environment-consumer.dawn.test.ts +21 -0
- package/src/__tests__/renderer-factory-material-contract.unit.test.ts +433 -1
- package/src/__tests__/renderer-frame-transaction.integration.test.ts +405 -0
- package/src/__tests__/renderer-lifecycle.integration.test.ts +22 -0
- package/src/__tests__/scene-data-catalog.unit.test.ts +59 -0
- package/src/__tests__/scene-data-consumer.integration.test.ts +67 -0
- package/src/__tests__/scene-data-contract.test-d.ts +35 -0
- package/src/__tests__/scene-data-inspection.unit.test.ts +41 -0
- package/src/__tests__/scene-data-public-surface.test-d.ts +34 -0
- package/src/__tests__/shader-manifest-fixture.ts +111 -0
- package/src/__tests__/skinned-shadow-caster.test.ts +102 -0
- package/src/__tests__/standard-clustered-pipeline.unit.test.ts +24 -3
- package/src/__tests__/standard-pipeline.dawn.test.ts +15 -0
- package/src/__tests__/standard-pipeline.integration.test.ts +543 -1
- package/src/__tests__/standard-profile-oracle.unit.test.ts +10 -2
- package/src/__tests__/standard-temporal-producer.integration.test.ts +35 -0
- package/src/__tests__/surface-configuration.unit.test.ts +211 -12
- package/src/__tests__/taa-transaction.integration.test.ts +30 -0
- package/src/__tests__/temporal-admission.integration.test.ts +40 -0
- package/src/__tests__/temporal-coverage.unit.test.ts +35 -0
- package/src/__tests__/temporal-demand.unit.test.ts +44 -0
- package/src/__tests__/temporal-frame-coordinator.unit.test.ts +64 -0
- package/src/__tests__/temporal-graph-topology.unit.test.ts +51 -0
- package/src/__tests__/temporal-history-lifecycle.unit.test.ts +170 -0
- package/src/__tests__/temporal-performance.integration.test.ts +615 -0
- package/src/__tests__/temporal-reset-matrix.unit.test.ts +97 -0
- package/src/__tests__/temporal-transaction.integration.test.ts +60 -0
- package/src/__tests__/temporal-view.unit.test.ts +152 -0
- package/src/__tests__/transmission-prewarm.unit.test.ts +93 -0
- package/src/__tests__/typed-pipeline-topology.unit.test.ts +230 -1
- package/src/__tests__/urp-pipeline-targets.unit.test.ts +25 -1
- package/src/__tests__/urp-pipeline.unit.test.ts +4 -3
- package/src/__tests__/visibility-extract.integration.test.ts +27 -1
- package/src/__tests__/visibility-producer-matrix.integration.test.ts +10 -0
- package/src/assembly/backend-contract.ts +47 -1
- package/src/assembly/factory.ts +1295 -507
- package/src/assembly/host-contract.ts +4 -0
- package/src/assembly/material/assembly.ts +2 -5
- package/src/assembly/renderer-frame-transaction.ts +75 -0
- package/src/assembly/renderer-inspection.ts +112 -0
- package/src/assembly/renderer-lifecycle.ts +6 -0
- package/src/authoring.ts +1 -0
- package/src/components/__tests__/motion-blur.unit.test.ts +14 -0
- package/src/components/__tests__/points-lines-admission.unit.test.ts +219 -0
- package/src/components/__tests__/points-lines-schema.unit.test.ts +56 -0
- package/src/components/__tests__/schema-contract.unit.test.ts +6 -1
- package/src/components/atmosphere.ts +10 -0
- package/src/components/camera.ts +2 -1
- package/src/components/fog.ts +9 -0
- package/src/components/index.ts +10 -0
- package/src/components/lines.ts +18 -0
- package/src/components/motion-blur.ts +8 -0
- package/src/components/points.ts +40 -0
- package/src/construct-renderer.ts +40 -3
- package/src/device/device-scope.ts +15 -1
- package/src/environment/frame.ts +185 -0
- package/src/environment/generation.ts +23 -0
- package/src/environment/graph.ts +9 -0
- package/src/environment/inspection.ts +87 -0
- package/src/environment/lifecycle.ts +250 -0
- package/src/environment/signature.ts +55 -0
- package/src/errors/render.ts +429 -1
- package/src/extract/camera.ts +78 -0
- package/src/extract/environment.ts +171 -0
- package/src/extract/visibility.ts +38 -19
- package/src/features/host.ts +36 -5
- package/src/features/motion-blur/__tests__/motion-blur-feature.unit.test.ts +67 -0
- package/src/features/motion-blur/__tests__/motion-blur-params.unit.test.ts +53 -0
- package/src/features/motion-blur/motion-blur-feature.ts +119 -0
- package/src/features/motion-blur/motion-blur-params.ts +89 -0
- package/src/features/plan.ts +32 -3
- package/src/features/prepared-gpu-work.ts +21 -6
- package/src/features/prepared-graphics.ts +2 -1
- package/src/features/render-graph-raster.ts +24 -4
- package/src/features/targets.ts +24 -2
- package/src/features/types.ts +13 -0
- package/src/fullscreen-post-process-pass.ts +34 -4
- package/src/gpu-driven/production-raster.ts +6 -1
- package/src/gpu-scene.ts +24 -0
- package/src/ibl/skylight-bind-group.ts +30 -38
- package/src/index.ts +83 -6
- package/src/inspection-types.ts +52 -0
- package/src/internal.ts +5 -0
- package/src/materials.ts +119 -24
- package/src/pbr-pipeline.ts +66 -20
- package/src/pipeline/standard-forward-lane.ts +158 -101
- package/src/pipeline/standard-pipeline.ts +156 -105
- package/src/pipeline/standard-post.ts +373 -0
- package/src/pipeline/standard-profile.ts +11 -11
- package/src/pipeline-builder.ts +102 -12
- package/src/pipeline-spec.ts +9 -0
- package/src/plugin.ts +6 -0
- package/src/points-lines/__tests__/bounds.unit.test.ts +21 -0
- package/src/points-lines/__tests__/cache-recovery.unit.test.ts +157 -0
- package/src/points-lines/__tests__/inspection-lanes.integration.test.ts +146 -0
- package/src/points-lines/__tests__/inspection.unit.test.ts +173 -0
- package/src/points-lines/__tests__/lane-structural.integration.test.ts +122 -0
- package/src/points-lines/__tests__/points-lines.bench.ts +400 -0
- package/src/points-lines/__tests__/raster-lane.integration.test.ts +44 -0
- package/src/points-lines/__tests__/snapshot.unit.test.ts +101 -0
- package/src/points-lines/__tests__/view-ubo.unit.test.ts +73 -0
- package/src/points-lines/admission.ts +238 -0
- package/src/points-lines/bounds.ts +23 -0
- package/src/points-lines/expansion-cache.ts +215 -0
- package/src/points-lines/inspection.ts +97 -0
- package/src/points-lines/prepare.ts +177 -0
- package/src/points-lines/record.ts +125 -0
- package/src/points-lines/snapshot.ts +130 -0
- package/src/record/__tests__/fullscreen-temporal-routing.unit.test.ts +25 -0
- package/src/record/__tests__/main-pass-geometry.unit.test.ts +47 -0
- package/src/record/__tests__/material-bg-cache.unit.test.ts +12 -1
- package/src/record/__tests__/material-pipeline-pending-cache.unit.test.ts +22 -0
- package/src/record/__tests__/sprite-material-abi.unit.test.ts +75 -0
- package/src/record/__tests__/standard-pbr-ubo-layout.unit.test.ts +67 -0
- package/src/record/__tests__/temporal-payload.unit.test.ts +164 -0
- package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +127 -0
- package/src/record/frame-lighting.ts +14 -2
- package/src/record/frame-snapshot.ts +129 -5
- package/src/record/frame-targets.ts +15 -6
- package/src/record/frame.ts +119 -4
- package/src/record/main-pass-geometry.ts +178 -40
- package/src/record/main-pass-material.ts +114 -66
- package/src/record/main-pass-sprite-draws.ts +79 -102
- package/src/record/main-pass.ts +83 -7
- package/src/record/mesh-ssbo.ts +22 -3
- package/src/record/render-context.ts +209 -23
- package/src/record/shadow-pass.ts +129 -28
- package/src/record/skybox-post-pass.ts +99 -42
- package/src/record/typed-frame-graph.ts +582 -42
- package/src/record/view-ubo.ts +99 -4
- package/src/render-contract.ts +121 -7
- package/src/render-graph-primitives.ts +18 -1
- package/src/render-pipeline.ts +100 -27
- package/src/render-system-extract.ts +264 -77
- package/src/render-system.ts +786 -43
- package/src/scene/render-scene-types.ts +3 -0
- package/src/scene/render-scene.ts +307 -9
- package/src/temporal/__tests__/taa-history-resources.unit.test.ts +45 -0
- package/src/temporal/coverage.ts +76 -0
- package/src/temporal/frame-coordinator.ts +311 -0
- package/src/temporal/gpu.ts +287 -0
- package/src/temporal/history.ts +92 -0
- package/src/temporal/index.ts +6 -0
- package/src/temporal/inspection.ts +97 -0
- package/src/temporal/scene-data-catalog.ts +200 -0
- package/src/temporal/scene-data.ts +149 -0
- package/src/temporal/standard-scene-data.ts +182 -0
- package/src/temporal/taa-history-resources.ts +128 -0
- package/src/temporal/taa-history-store.ts +79 -0
- package/src/temporal/taa-resolve.ts +34 -0
- package/src/temporal/temporal-view.ts +169 -0
- package/src/temporal/transaction.ts +17 -0
- package/src/temporal/view.ts +161 -0
- package/src/transmission/__tests__/capability.unit.test.ts +83 -0
- package/src/transmission/__tests__/composition.integration.test.ts +161 -0
- package/src/transmission/__tests__/inspection.unit.test.ts +241 -0
- package/src/transmission/__tests__/lifecycle.integration.test.ts +96 -0
- package/src/transmission/__tests__/oracle.unit.test.ts +131 -0
- package/src/transmission/__tests__/projection.unit.test.ts +71 -0
- package/src/transmission/__tests__/standard-transmission.dawn.test.ts +438 -0
- package/src/transmission/__tests__/transmission-backdrop-topology.unit.test.ts +109 -0
- package/src/transmission/__tests__/transmission-backdrop.dawn.test.ts +105 -0
- package/src/transmission/backdrop.ts +572 -0
- package/src/transmission/inspection.ts +190 -0
- package/src/transmission/oracle.ts +141 -0
- package/src/transmission/projection.ts +83 -0
- package/src/typed-render-graph-primitives.ts +162 -9
- package/dist/__tests__/authoring-path.unit.test.d.ts +0 -2
- package/dist/__tests__/authoring-path.unit.test.d.ts.map +0 -1
- package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts +0 -2
- package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts.map +0 -1
- package/dist/__tests__/callback-inference.test-d.d.ts +0 -2
- package/dist/__tests__/callback-inference.test-d.d.ts.map +0 -1
- package/dist/__tests__/cluster-binner.test.d.ts +0 -2
- package/dist/__tests__/cluster-binner.test.d.ts.map +0 -1
- package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts +0 -2
- package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts.map +0 -1
- package/dist/__tests__/construct-renderer-identity.unit.test.d.ts +0 -2
- package/dist/__tests__/construct-renderer-identity.unit.test.d.ts.map +0 -1
- package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts +0 -2
- package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts.map +0 -1
- package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts +0 -2
- package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts.map +0 -1
- package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts +0 -2
- package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts.map +0 -1
- package/dist/__tests__/direct-light-snapshot.unit.test.d.ts +0 -2
- package/dist/__tests__/direct-light-snapshot.unit.test.d.ts.map +0 -1
- package/dist/__tests__/factory-contract.integration.test.d.ts +0 -2
- package/dist/__tests__/factory-contract.integration.test.d.ts.map +0 -1
- package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts +0 -2
- package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts.map +0 -1
- package/dist/__tests__/frame-observation.contract.test.d.ts +0 -2
- package/dist/__tests__/frame-observation.contract.test.d.ts.map +0 -1
- package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts +0 -2
- package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts.map +0 -1
- package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts +0 -2
- package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts +0 -6
- package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts +0 -2
- package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts +0 -2
- package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-production.integration.test.d.ts +0 -2
- package/dist/__tests__/gpu-driven-production.integration.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts +0 -2
- package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +0 -18
- package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts +0 -2
- package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-view-reference.d.ts +0 -15
- package/dist/__tests__/gpu-driven-view-reference.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-view.browser.test.d.ts +0 -2
- package/dist/__tests__/gpu-driven-view.browser.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-view.dawn.test.d.ts +0 -2
- package/dist/__tests__/gpu-driven-view.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-driven-view.unit.test.d.ts +0 -2
- package/dist/__tests__/gpu-driven-view.unit.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts +0 -2
- package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts +0 -7
- package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +0 -1
- package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts +0 -2
- package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts +0 -2
- package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-scene-schema.unit.test.d.ts +0 -2
- package/dist/__tests__/gpu-scene-schema.unit.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-scene.dawn.test.d.ts +0 -2
- package/dist/__tests__/gpu-scene.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-scene.unit.test.d.ts +0 -2
- package/dist/__tests__/gpu-scene.unit.test.d.ts.map +0 -1
- package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts +0 -2
- package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts.map +0 -1
- package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts +0 -2
- package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts.map +0 -1
- package/dist/__tests__/injection-kind-owner.test-d.d.ts +0 -2
- package/dist/__tests__/injection-kind-owner.test-d.d.ts.map +0 -1
- package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts +0 -2
- package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/light-buffer-layout.unit.test.d.ts +0 -2
- package/dist/__tests__/light-buffer-layout.unit.test.d.ts.map +0 -1
- package/dist/__tests__/material-contract-inventory.unit.test.d.ts +0 -2
- package/dist/__tests__/material-contract-inventory.unit.test.d.ts.map +0 -1
- package/dist/__tests__/material-cooked-projection.unit.test.d.ts +0 -2
- package/dist/__tests__/material-cooked-projection.unit.test.d.ts.map +0 -1
- package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts +0 -2
- package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts.map +0 -1
- package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts +0 -2
- package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts.map +0 -1
- package/dist/__tests__/material-stride-surface.unit.test.d.ts +0 -2
- package/dist/__tests__/material-stride-surface.unit.test.d.ts.map +0 -1
- package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts +0 -2
- package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts.map +0 -1
- package/dist/__tests__/mesh-material-bindings.unit.test.d.ts +0 -2
- package/dist/__tests__/mesh-material-bindings.unit.test.d.ts.map +0 -1
- package/dist/__tests__/mesh-stride-surface.unit.test.d.ts +0 -2
- package/dist/__tests__/mesh-stride-surface.unit.test.d.ts.map +0 -1
- package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts +0 -2
- package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts +0 -2
- package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts.map +0 -1
- package/dist/__tests__/morph-feature-plan.unit.test.d.ts +0 -2
- package/dist/__tests__/morph-feature-plan.unit.test.d.ts.map +0 -1
- package/dist/__tests__/morph-visual-evidence.integration.test.d.ts +0 -2
- package/dist/__tests__/morph-visual-evidence.integration.test.d.ts.map +0 -1
- package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts +0 -2
- package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts.map +0 -1
- package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts +0 -2
- package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts +0 -2
- package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-store.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-store.unit.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts.map +0 -1
- package/dist/__tests__/profiler-default-off.test.d.ts +0 -2
- package/dist/__tests__/profiler-default-off.test.d.ts.map +0 -1
- package/dist/__tests__/profiler-phase-catalog.test.d.ts +0 -2
- package/dist/__tests__/profiler-phase-catalog.test.d.ts.map +0 -1
- package/dist/__tests__/profiler-phase-integration.test.d.ts +0 -2
- package/dist/__tests__/profiler-phase-integration.test.d.ts.map +0 -1
- package/dist/__tests__/profiler-phase-token.test.d.ts +0 -2
- package/dist/__tests__/profiler-phase-token.test.d.ts.map +0 -1
- package/dist/__tests__/public-surface.test-d.d.ts +0 -2
- package/dist/__tests__/public-surface.test-d.d.ts.map +0 -1
- package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts +0 -2
- package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-error-code-owner.test-d.d.ts +0 -2
- package/dist/__tests__/render-error-code-owner.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-error-detail-ssot.test-d.d.ts +0 -2
- package/dist/__tests__/render-error-detail-ssot.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-error-exhaustive.test-d.d.ts +0 -2
- package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-assembly.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-assembly.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-context.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-context.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-contract.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-contract.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-docs.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-docs.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-errors.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-errors.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts +0 -2
- package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-plan.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-plan.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-plan.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-plan.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-public-surface.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-public-surface.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-retry.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-retry.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-scheduling.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-scheduling.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-visibility-context.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-visibility-context.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-zero-work.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-zero-work.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-graph-compute-raster-gpu.d.ts +0 -7
- package/dist/__tests__/render-graph-compute-raster-gpu.d.ts.map +0 -1
- package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts +0 -2
- package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts.map +0 -1
- package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts +0 -2
- package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/render-graph-hzb-gpu.d.ts +0 -7
- package/dist/__tests__/render-graph-hzb-gpu.d.ts.map +0 -1
- package/dist/__tests__/render-graph-hzb.browser.test.d.ts +0 -2
- package/dist/__tests__/render-graph-hzb.browser.test.d.ts.map +0 -1
- package/dist/__tests__/render-graph-hzb.dawn.test.d.ts +0 -2
- package/dist/__tests__/render-graph-hzb.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/render-graph-primitives.unit.test.d.ts +0 -2
- package/dist/__tests__/render-graph-primitives.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts +0 -12
- package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts.map +0 -1
- package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts +0 -2
- package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts.map +0 -1
- package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts +0 -2
- package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/render-scene-projection.unit.test.d.ts +0 -2
- package/dist/__tests__/render-scene-projection.unit.test.d.ts.map +0 -1
- package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts +0 -2
- package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts.map +0 -1
- package/dist/__tests__/renderer-lifecycle.integration.test.d.ts +0 -2
- package/dist/__tests__/renderer-lifecycle.integration.test.d.ts.map +0 -1
- package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts +0 -2
- package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts.map +0 -1
- package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts +0 -2
- package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts.map +0 -1
- package/dist/__tests__/shader-stage-surface.unit.test.d.ts +0 -2
- package/dist/__tests__/shader-stage-surface.unit.test.d.ts.map +0 -1
- package/dist/__tests__/ssao-config.unit.test.d.ts +0 -2
- package/dist/__tests__/ssao-config.unit.test.d.ts.map +0 -1
- package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts +0 -2
- package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts.map +0 -1
- package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts +0 -2
- package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts.map +0 -1
- package/dist/__tests__/standard-descriptors.test-d.d.ts +0 -2
- package/dist/__tests__/standard-descriptors.test-d.d.ts.map +0 -1
- package/dist/__tests__/standard-pipeline.dawn.test.d.ts +0 -2
- package/dist/__tests__/standard-pipeline.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/standard-pipeline.integration.test.d.ts +0 -2
- package/dist/__tests__/standard-pipeline.integration.test.d.ts.map +0 -1
- package/dist/__tests__/standard-profile-oracle.unit.test.d.ts +0 -2
- package/dist/__tests__/standard-profile-oracle.unit.test.d.ts.map +0 -1
- package/dist/__tests__/surface-configuration.unit.test.d.ts +0 -2
- package/dist/__tests__/surface-configuration.unit.test.d.ts.map +0 -1
- package/dist/__tests__/texture-usage-surface.unit.test.d.ts +0 -2
- package/dist/__tests__/texture-usage-surface.unit.test.d.ts.map +0 -1
- package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts +0 -2
- package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts.map +0 -1
- package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts +0 -2
- package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts.map +0 -1
- package/dist/__tests__/urp-pipeline.unit.test.d.ts +0 -2
- package/dist/__tests__/urp-pipeline.unit.test.d.ts.map +0 -1
- package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts +0 -2
- package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts.map +0 -1
- package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts +0 -2
- package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-diagnostics.integration.test.d.ts +0 -2
- package/dist/__tests__/visibility-diagnostics.integration.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-extract.integration.test.d.ts +0 -2
- package/dist/__tests__/visibility-extract.integration.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-extract.perf.test.d.ts +0 -2
- package/dist/__tests__/visibility-extract.perf.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts +0 -2
- package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-hidden-report.unit.test.d.ts +0 -2
- package/dist/__tests__/visibility-hidden-report.unit.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-instances.integration.test.d.ts +0 -2
- package/dist/__tests__/visibility-instances.integration.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-multi-world.integration.test.d.ts +0 -2
- package/dist/__tests__/visibility-multi-world.integration.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts +0 -2
- package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts +0 -2
- package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-public-surface.test-d.d.ts +0 -2
- package/dist/__tests__/visibility-public-surface.test-d.d.ts.map +0 -1
- package/dist/__tests__/visibility-resolver.unit.test.d.ts +0 -2
- package/dist/__tests__/visibility-resolver.unit.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts +0 -2
- package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts.map +0 -1
- package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts +0 -2
- package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts.map +0 -1
- package/dist/__tests__/vocabulary.unit.test.d.ts +0 -2
- package/dist/__tests__/vocabulary.unit.test.d.ts.map +0 -1
- package/dist/chunk-CQXZC5XI.mjs.map +0 -1
- package/dist/chunk-QC4VW3XJ.mjs.map +0 -1
- package/dist/chunk-SCRSAK5B.mjs.map +0 -1
- package/dist/components/__tests__/schema-contract.unit.test.d.ts +0 -2
- package/dist/components/__tests__/schema-contract.unit.test.d.ts.map +0 -1
- package/dist/components/__tests__/schema-parity.unit.test.d.ts +0 -2
- package/dist/components/__tests__/schema-parity.unit.test.d.ts.map +0 -1
- package/dist/components/__tests__/visibility-schema.unit.test.d.ts +0 -2
- package/dist/components/__tests__/visibility-schema.unit.test.d.ts.map +0 -1
- package/dist/record/__tests__/material-bg-cache.unit.test.d.ts +0 -2
- package/dist/record/__tests__/material-bg-cache.unit.test.d.ts.map +0 -1
- package/dist/record/__tests__/material-slot-plan.unit.test.d.ts +0 -2
- package/dist/record/__tests__/material-slot-plan.unit.test.d.ts.map +0 -1
- package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts +0 -2
- package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts.map +0 -1
- package/dist/record/__tests__/video-texture-view.unit.test.d.ts +0 -2
- package/dist/record/__tests__/video-texture-view.unit.test.d.ts.map +0 -1
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { World } from '@forgeax/engine-ecs';
|
|
2
|
+
import { vec3 } from '@forgeax/engine-math';
|
|
3
|
+
import { DEFAULT_STANDARD_PBR_PARAM_SCHEMA } from '@forgeax/engine-shader';
|
|
4
|
+
import { derive } from '@forgeax/engine-types';
|
|
5
|
+
import { describe, expect, it } from 'vitest';
|
|
6
|
+
import type { MaterialSnapshot } from '../../render-system-extract';
|
|
7
|
+
import { applyMaterialTextureUvScales, buildPbrMaterialUboPayload } from '../main-pass-material';
|
|
8
|
+
|
|
9
|
+
describe('Standard PBR UBO layout', () => {
|
|
10
|
+
it('keeps shader, derived schema, and record offsets aligned', () => {
|
|
11
|
+
const derived = derive(DEFAULT_STANDARD_PBR_PARAM_SCHEMA);
|
|
12
|
+
const numeric = new Map(derived.numericMembers.map((member) => [member.name, member.offset]));
|
|
13
|
+
const coordinates = new Map(
|
|
14
|
+
derived.coordinateRecords.map((record) => [record.parameter, record.offset]),
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
expect(derived.totalBytes).toBe(384);
|
|
18
|
+
expect(numeric.get('normalScale')).toBe(92);
|
|
19
|
+
expect(numeric.get('transmission')).toBe(96);
|
|
20
|
+
expect(numeric.get('ior')).toBe(100);
|
|
21
|
+
expect(numeric.get('thickness')).toBe(104);
|
|
22
|
+
expect(numeric.get('attenuationColor')).toBe(112);
|
|
23
|
+
expect(numeric.get('attenuationDistance')).toBe(124);
|
|
24
|
+
expect(coordinates.get('baseColorTexture')).toBe(128);
|
|
25
|
+
expect(coordinates.get('transmissionTexture')).toBe(320);
|
|
26
|
+
expect(coordinates.get('thicknessTexture')).toBe(352);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('writes transmission scalars and defaults at the reflected offsets', () => {
|
|
30
|
+
const material = {
|
|
31
|
+
baseColor: vec3.create(0.7, 0.7, 0.7),
|
|
32
|
+
metallic: 0,
|
|
33
|
+
roughness: 0.4,
|
|
34
|
+
normalScale: 0.25,
|
|
35
|
+
materialShaderId: 'forgeax::default-standard-pbr',
|
|
36
|
+
paramSnapshot: {
|
|
37
|
+
transmission: 0.75,
|
|
38
|
+
ior: 1.6,
|
|
39
|
+
thickness: 0.2,
|
|
40
|
+
attenuationColor: [0.2, 0.4, 0.6],
|
|
41
|
+
attenuationDistance: 3,
|
|
42
|
+
},
|
|
43
|
+
} satisfies MaterialSnapshot;
|
|
44
|
+
const f32 = new Float32Array(buildPbrMaterialUboPayload(material).buffer);
|
|
45
|
+
|
|
46
|
+
expect(f32.slice(23, 32)).toEqual(
|
|
47
|
+
new Float32Array([0.25, 0.75, 1.6, 0.2, 0, 0.2, 0.4, 0.6, 3]),
|
|
48
|
+
);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('uses all eight identity coordinate records in the no-snapshot fallback', () => {
|
|
52
|
+
const material = {
|
|
53
|
+
baseColor: vec3.create(0.7, 0.7, 0.7),
|
|
54
|
+
metallic: 0,
|
|
55
|
+
roughness: 0.4,
|
|
56
|
+
materialShaderId: 'forgeax::default-standard-pbr',
|
|
57
|
+
} satisfies MaterialSnapshot;
|
|
58
|
+
const payload = buildPbrMaterialUboPayload(material);
|
|
59
|
+
|
|
60
|
+
applyMaterialTextureUvScales(payload, material, new World());
|
|
61
|
+
|
|
62
|
+
const f32 = new Float32Array(payload.buffer);
|
|
63
|
+
expect(f32.slice(32, 96)).toEqual(
|
|
64
|
+
new Float32Array(Array(8).fill([0, 0, 1, 1, 0, 0, 1, 1]).flat()),
|
|
65
|
+
);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { vec3 } from '@forgeax/engine-math';
|
|
2
|
+
import type { Buffer, RhiQueue } from '@forgeax/engine-rhi';
|
|
3
|
+
import { describe, expect, it } from 'vitest';
|
|
4
|
+
import type { CameraSnapshot } from '../../render-contract';
|
|
5
|
+
import type { RenderableSnapshot } from '../../render-system-extract';
|
|
6
|
+
import type { TemporalView } from '../../temporal/temporal-view';
|
|
7
|
+
import type { ValidatedRenderable } from '../frame-snapshot';
|
|
8
|
+
import { uploadMeshSsboBatch } from '../mesh-ssbo';
|
|
9
|
+
import { writeViewUbo } from '../view-ubo';
|
|
10
|
+
|
|
11
|
+
function identityMatrix(): Float32Array {
|
|
12
|
+
const matrix = new Float32Array(16);
|
|
13
|
+
matrix[0] = 1;
|
|
14
|
+
matrix[5] = 1;
|
|
15
|
+
matrix[10] = 1;
|
|
16
|
+
matrix[15] = 1;
|
|
17
|
+
return matrix;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function translatedMatrix(x: number): Float32Array {
|
|
21
|
+
const matrix = identityMatrix();
|
|
22
|
+
matrix[12] = x;
|
|
23
|
+
return matrix;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function recordingQueue(): {
|
|
27
|
+
readonly queue: RhiQueue;
|
|
28
|
+
readonly uploads: readonly Uint8Array[];
|
|
29
|
+
} {
|
|
30
|
+
const uploads: Uint8Array[] = [];
|
|
31
|
+
const queue = {
|
|
32
|
+
writeBuffer: (
|
|
33
|
+
_buffer: Buffer,
|
|
34
|
+
_bufferOffset: number,
|
|
35
|
+
data: ArrayBufferView | ArrayBuffer,
|
|
36
|
+
_dataOffset?: number,
|
|
37
|
+
size?: number,
|
|
38
|
+
) => {
|
|
39
|
+
const bytes =
|
|
40
|
+
data instanceof ArrayBuffer
|
|
41
|
+
? new Uint8Array(data, 0, size ?? data.byteLength)
|
|
42
|
+
: new Uint8Array(data.buffer, data.byteOffset, size ?? data.byteLength);
|
|
43
|
+
uploads.push(new Uint8Array(bytes));
|
|
44
|
+
return { ok: true, value: undefined } as const;
|
|
45
|
+
},
|
|
46
|
+
} as unknown as RhiQueue;
|
|
47
|
+
return { queue, uploads };
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function camera(): CameraSnapshot {
|
|
51
|
+
return {
|
|
52
|
+
entityKey: 1,
|
|
53
|
+
worldId: 0,
|
|
54
|
+
historyVersion: 0,
|
|
55
|
+
position: vec3.create(0, 0, 5),
|
|
56
|
+
world: identityMatrix(),
|
|
57
|
+
fov: Math.PI / 3,
|
|
58
|
+
aspect: 1,
|
|
59
|
+
near: 0.1,
|
|
60
|
+
far: 100,
|
|
61
|
+
projection: 'perspective',
|
|
62
|
+
orthoLeft: -1,
|
|
63
|
+
orthoRight: 1,
|
|
64
|
+
orthoBottom: -1,
|
|
65
|
+
orthoTop: 1,
|
|
66
|
+
tonemap: 'none',
|
|
67
|
+
exposure: 1,
|
|
68
|
+
whitePoint: 4,
|
|
69
|
+
antialias: 'none',
|
|
70
|
+
bloom: 'off',
|
|
71
|
+
bloomThreshold: 1,
|
|
72
|
+
bloomIntensity: 1,
|
|
73
|
+
bloomBlurRadius: 4,
|
|
74
|
+
clearColor: [0, 0, 0, 1],
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function temporalView(): TemporalView {
|
|
79
|
+
const current = identityMatrix();
|
|
80
|
+
current[0] = 2;
|
|
81
|
+
const previous = identityMatrix();
|
|
82
|
+
previous[0] = 3;
|
|
83
|
+
return {
|
|
84
|
+
viewId: '0:1:0',
|
|
85
|
+
historyVersion: 0,
|
|
86
|
+
temporalFrameIndex: 1,
|
|
87
|
+
historyValid: true,
|
|
88
|
+
resetReason: undefined,
|
|
89
|
+
currentJitterUv: [0, 0],
|
|
90
|
+
previousJitterUv: [0, 0],
|
|
91
|
+
currentJitteredViewProjection: current,
|
|
92
|
+
currentUnjitteredViewProjection: current,
|
|
93
|
+
previousUnjitteredViewProjection: previous,
|
|
94
|
+
projection: 'perspective',
|
|
95
|
+
near: 0.1,
|
|
96
|
+
far: 100,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
describe('temporal GPU payloads', () => {
|
|
101
|
+
it('writes temporal current/previous projection after the spot-light lanes', () => {
|
|
102
|
+
const { queue, uploads } = recordingQueue();
|
|
103
|
+
writeViewUbo(
|
|
104
|
+
queue,
|
|
105
|
+
{} as Buffer,
|
|
106
|
+
camera(),
|
|
107
|
+
{
|
|
108
|
+
kind: 'directional',
|
|
109
|
+
direction: vec3.create(0, -1, 0),
|
|
110
|
+
color: vec3.create(1, 1, 1),
|
|
111
|
+
intensity: 1,
|
|
112
|
+
},
|
|
113
|
+
{ point: [], spot: [] } as never,
|
|
114
|
+
[],
|
|
115
|
+
temporalView(),
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
const payload = new Float32Array(uploads[0]?.buffer ?? new ArrayBuffer(0));
|
|
119
|
+
expect(payload.length).toBe(240);
|
|
120
|
+
expect(payload[196]).toBeCloseTo(Math.sqrt(3));
|
|
121
|
+
expect(payload[212]).toBe(3);
|
|
122
|
+
expect(payload[228]).toBeCloseTo(0.1);
|
|
123
|
+
expect(payload[229]).toBe(100);
|
|
124
|
+
expect(payload[230]).toBe(0);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it('seeds previousWorld on the first frame and uses the submitted snapshot later', () => {
|
|
128
|
+
const first = translatedMatrix(4);
|
|
129
|
+
const previous = translatedMatrix(2);
|
|
130
|
+
const second = translatedMatrix(6);
|
|
131
|
+
const makeEntry = (world: Float32Array, temporal?: object) =>
|
|
132
|
+
({
|
|
133
|
+
source: {
|
|
134
|
+
transform: { world },
|
|
135
|
+
materials: [{ transparent: false }],
|
|
136
|
+
...(temporal === undefined ? {} : { temporal }),
|
|
137
|
+
} as unknown as RenderableSnapshot,
|
|
138
|
+
}) as unknown as ValidatedRenderable;
|
|
139
|
+
const firstRecording = recordingQueue();
|
|
140
|
+
uploadMeshSsboBatch(firstRecording.queue, { buffer: {} as Buffer }, [makeEntry(first)], null);
|
|
141
|
+
const firstPayload = new Float32Array(firstRecording.uploads[0]?.buffer ?? new ArrayBuffer(0));
|
|
142
|
+
expect(firstPayload[12]).toBe(4);
|
|
143
|
+
expect(firstPayload[28 + 12]).toBe(4);
|
|
144
|
+
|
|
145
|
+
const secondRecording = recordingQueue();
|
|
146
|
+
uploadMeshSsboBatch(
|
|
147
|
+
secondRecording.queue,
|
|
148
|
+
{ buffer: {} as Buffer },
|
|
149
|
+
[
|
|
150
|
+
makeEntry(second, {
|
|
151
|
+
previousTransform: { world: previous },
|
|
152
|
+
reactive: false,
|
|
153
|
+
}),
|
|
154
|
+
],
|
|
155
|
+
null,
|
|
156
|
+
);
|
|
157
|
+
const secondPayload = new Float32Array(
|
|
158
|
+
secondRecording.uploads[0]?.buffer ?? new ArrayBuffer(0),
|
|
159
|
+
);
|
|
160
|
+
expect(secondPayload[12]).toBe(6);
|
|
161
|
+
expect(secondPayload[28 + 12]).toBe(2);
|
|
162
|
+
expect(secondPayload[44]).toBe(0);
|
|
163
|
+
});
|
|
164
|
+
});
|
|
@@ -1,10 +1,88 @@
|
|
|
1
|
+
import { ok } from '@forgeax/engine-types';
|
|
1
2
|
import { describe, expect, it } from 'vitest';
|
|
2
3
|
import type { RenderFeaturePlannedFrame } from '../../features/plan';
|
|
4
|
+
import { GPU_TEXTURE_USAGE_COPY_SRC } from '../../gpu-texture-usage';
|
|
5
|
+
import { getTextureIdentity, validateGraphTargetCaptureReadback } from '../frame-snapshot';
|
|
3
6
|
import {
|
|
7
|
+
executeCompiledFrameGraph,
|
|
4
8
|
type RenderFeatureGraphCandidate,
|
|
5
9
|
renderFeatureGraphPlanSignature,
|
|
6
10
|
} from '../typed-frame-graph';
|
|
7
11
|
|
|
12
|
+
const captureDescriptor = {
|
|
13
|
+
texture: {} as never,
|
|
14
|
+
format: 'rgba16float' as const,
|
|
15
|
+
size: { width: 4, height: 2 },
|
|
16
|
+
usage: GPU_TEXTURE_USAGE_COPY_SRC,
|
|
17
|
+
sample: 1,
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
type CaptureOverrides = {
|
|
21
|
+
readonly target?: boolean;
|
|
22
|
+
readonly descriptor?: {
|
|
23
|
+
readonly format?: 'rgba16float' | 'rgba8unorm';
|
|
24
|
+
readonly size?: { readonly width: number; readonly height: number };
|
|
25
|
+
readonly usage?: number;
|
|
26
|
+
};
|
|
27
|
+
readonly identity?: { graphGeneration: number; frameId: number; textureIdentity: number };
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
function executeCapture(overrides: CaptureOverrides = {}) {
|
|
31
|
+
const errors: unknown[] = [];
|
|
32
|
+
const copies: unknown[] = [];
|
|
33
|
+
const texture = {} as never;
|
|
34
|
+
const descriptor = { ...captureDescriptor, ...overrides.descriptor, texture };
|
|
35
|
+
const graph = {
|
|
36
|
+
execute: () => ok(undefined),
|
|
37
|
+
};
|
|
38
|
+
const frameState = {
|
|
39
|
+
compiledFrameGraph: graph,
|
|
40
|
+
frameNumber: 13,
|
|
41
|
+
graphTargetCapture: {
|
|
42
|
+
name: 'standard-output-color',
|
|
43
|
+
buffer: {} as never,
|
|
44
|
+
bytesPerRow: 256,
|
|
45
|
+
width: 4,
|
|
46
|
+
height: 2,
|
|
47
|
+
expected: {
|
|
48
|
+
format: 'rgba16float' as const,
|
|
49
|
+
width: 4,
|
|
50
|
+
height: 2,
|
|
51
|
+
usage: GPU_TEXTURE_USAGE_COPY_SRC,
|
|
52
|
+
identity: overrides.identity ?? {
|
|
53
|
+
graphGeneration: 7,
|
|
54
|
+
frameId: 12,
|
|
55
|
+
textureIdentity: getTextureIdentity(texture),
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
perFrameGraph:
|
|
60
|
+
overrides.target === false
|
|
61
|
+
? undefined
|
|
62
|
+
: {
|
|
63
|
+
graphGeneration: 7,
|
|
64
|
+
getColorTargetTexture: () => (overrides.target === false ? undefined : texture),
|
|
65
|
+
getColorTargetDescriptor: () => (overrides.target === false ? undefined : descriptor),
|
|
66
|
+
getColorTargetView: () => undefined,
|
|
67
|
+
},
|
|
68
|
+
} as never;
|
|
69
|
+
const encoder = {
|
|
70
|
+
copyTextureToBuffer: (...args: unknown[]) => copies.push(args),
|
|
71
|
+
finish: () => ok({} as never),
|
|
72
|
+
} as never;
|
|
73
|
+
const internals = {
|
|
74
|
+
errorRegistry: { fire: (error: unknown) => errors.push(error) },
|
|
75
|
+
device: { queue: { submit: () => ok(undefined) } },
|
|
76
|
+
} as never;
|
|
77
|
+
const submitted = executeCompiledFrameGraph(internals, frameState, {} as never, encoder);
|
|
78
|
+
return { submitted, errors, copies };
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function failureReason(errors: readonly unknown[]): string {
|
|
82
|
+
const error = errors[0] as { detail?: { error?: { message?: string } } } | undefined;
|
|
83
|
+
return error?.detail?.error?.message ?? '';
|
|
84
|
+
}
|
|
85
|
+
|
|
8
86
|
function planned(generation: number, signature: string): RenderFeaturePlannedFrame {
|
|
9
87
|
return {
|
|
10
88
|
featureIdentity: 'synthetic.feature',
|
|
@@ -38,4 +116,53 @@ describe('typed frame graph feature plan authority', () => {
|
|
|
38
116
|
};
|
|
39
117
|
void invalid;
|
|
40
118
|
});
|
|
119
|
+
|
|
120
|
+
it.each([
|
|
121
|
+
['missing target', { target: false }, 'target-not-present-in-current-graph'],
|
|
122
|
+
['format mismatch', { descriptor: { format: 'rgba8unorm' as const } }, 'descriptor-mismatch'],
|
|
123
|
+
['extent mismatch', { descriptor: { size: { width: 2, height: 2 } } }, 'extent-mismatch'],
|
|
124
|
+
['COPY_SRC missing', { descriptor: { usage: 0 } }, 'copy-src-usage-missing'],
|
|
125
|
+
[
|
|
126
|
+
'identity mismatch',
|
|
127
|
+
{ identity: { graphGeneration: 8, frameId: 12, textureIdentity: 999 } },
|
|
128
|
+
'identity-mismatch',
|
|
129
|
+
],
|
|
130
|
+
])('fails closed for capture %s', (_name, overrides, expectedReason) => {
|
|
131
|
+
const result = executeCapture(overrides);
|
|
132
|
+
expect(result.submitted).toBe(true);
|
|
133
|
+
expect(result.copies).toHaveLength(0);
|
|
134
|
+
expect(result.errors).toHaveLength(1);
|
|
135
|
+
expect(failureReason(result.errors)).toContain(`"reason":"${expectedReason}"`);
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
it('copies the exact target only after all capture identity and descriptor checks pass', () => {
|
|
139
|
+
const result = executeCapture();
|
|
140
|
+
expect(result.submitted).toBe(true);
|
|
141
|
+
expect(result.errors).toHaveLength(0);
|
|
142
|
+
expect(result.copies).toHaveLength(1);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it.each([
|
|
146
|
+
[
|
|
147
|
+
'missing same-submit copy / untouched sentinel',
|
|
148
|
+
new Uint8Array([0xa5, 0xa5, 0xa5, 0xa5]),
|
|
149
|
+
new Uint8Array([0xa5, 0xa5]),
|
|
150
|
+
'capture-readback-untouched-sentinel',
|
|
151
|
+
],
|
|
152
|
+
['all-empty readback', new Uint8Array(4), undefined, 'capture-readback-empty'],
|
|
153
|
+
[
|
|
154
|
+
'non-finite float16',
|
|
155
|
+
new Uint8Array([0x01, 0x7c, 0, 0]),
|
|
156
|
+
undefined,
|
|
157
|
+
'capture-readback-non-finite',
|
|
158
|
+
],
|
|
159
|
+
])('returns a structured failure for %s readback', (_name, bytes, sentinel, expectedCode) => {
|
|
160
|
+
const result = validateGraphTargetCaptureReadback({
|
|
161
|
+
bytes,
|
|
162
|
+
expectedByteLength: 4,
|
|
163
|
+
...(sentinel === undefined ? {} : { sentinel }),
|
|
164
|
+
});
|
|
165
|
+
expect(result.ok).toBe(false);
|
|
166
|
+
if (!result.ok) expect(result.code).toBe(expectedCode);
|
|
167
|
+
});
|
|
41
168
|
});
|
|
@@ -57,7 +57,7 @@ import {
|
|
|
57
57
|
} from './helpers';
|
|
58
58
|
import { getOrCreateFromChain, MESH_SSBO_BYTES, MESH_UBO_FULL_ARRAY_BYTES } from './mesh-ssbo';
|
|
59
59
|
import type { PipelineState, RecordProfileRunner, RenderSystemInternals } from './render-context';
|
|
60
|
-
import { VIEW_UNIFORM_BYTES } from './view-ubo';
|
|
60
|
+
import { POINTS_LINES_VIEW_BYTES, VIEW_UNIFORM_BYTES } from './view-ubo';
|
|
61
61
|
|
|
62
62
|
function runHdrpClusterProfilePhase<T>(
|
|
63
63
|
runner: RecordProfileRunner | undefined,
|
|
@@ -161,6 +161,7 @@ export function buildPerFrameBindGroups(
|
|
|
161
161
|
b5View,
|
|
162
162
|
pipelineState.shadowParamsBuffer,
|
|
163
163
|
b8View,
|
|
164
|
+
pipelineState.pointsLinesViewBuffer ?? pipelineState.viewUniformBuffer,
|
|
164
165
|
],
|
|
165
166
|
'view-main',
|
|
166
167
|
() => {
|
|
@@ -248,10 +249,21 @@ export function buildPerFrameBindGroups(
|
|
|
248
249
|
value: b8View,
|
|
249
250
|
},
|
|
250
251
|
},
|
|
252
|
+
{
|
|
253
|
+
binding: 10,
|
|
254
|
+
resource: {
|
|
255
|
+
kind: 'buffer',
|
|
256
|
+
value: {
|
|
257
|
+
buffer: pipelineState.pointsLinesViewBuffer ?? pipelineState.viewUniformBuffer,
|
|
258
|
+
size: POINTS_LINES_VIEW_BYTES,
|
|
259
|
+
},
|
|
260
|
+
},
|
|
261
|
+
},
|
|
251
262
|
// feat-20260625-spot-light-shadow-mapping w25: the per-spot
|
|
252
263
|
// fragment-read lightViewProj matrices fold into the View UBO
|
|
253
264
|
// (binding 0, `view.spotLightViewProj`) — no standalone binding 9
|
|
254
|
-
// (WebGL2 fragment uniform-buffer budget). binding
|
|
265
|
+
// (WebGL2 fragment uniform-buffer budget). binding 10 is the
|
|
266
|
+
// dedicated vertex-only Points/Lines viewport UBO.
|
|
255
267
|
],
|
|
256
268
|
});
|
|
257
269
|
if (!viewBindGroupResult.ok) throw viewBindGroupResult.error;
|
|
@@ -6,7 +6,16 @@ import { vec3 } from '@forgeax/engine-math';
|
|
|
6
6
|
import type { ResolvedColorTargetDescriptor } from '@forgeax/engine-render-graph';
|
|
7
7
|
import type { Texture } from '@forgeax/engine-rhi';
|
|
8
8
|
import type { ClusterBinScratch } from '../cluster-binner';
|
|
9
|
+
import type { EnvironmentGeneration } from '../environment/generation';
|
|
10
|
+
import type { EnvironmentLifecycle } from '../environment/lifecycle';
|
|
9
11
|
import type { GpuBuffer } from '../gpu-resource';
|
|
12
|
+
import type { TemporalGpuState } from '../temporal/gpu';
|
|
13
|
+
import type { TemporalView } from '../temporal/view';
|
|
14
|
+
|
|
15
|
+
export type TemporalCommitOutcome =
|
|
16
|
+
| { readonly kind: 'none' }
|
|
17
|
+
| { readonly kind: 'off'; readonly view: TemporalView }
|
|
18
|
+
| { readonly kind: 'taa'; readonly view: TemporalView };
|
|
10
19
|
|
|
11
20
|
/**
|
|
12
21
|
* feat-20260708-composited-multi-world-rendering M1 / D-1 / D-9:
|
|
@@ -84,6 +93,88 @@ export interface FrameObservationSource {
|
|
|
84
93
|
readonly backendId: string;
|
|
85
94
|
}
|
|
86
95
|
|
|
96
|
+
/** Internal test/diagnostic view of one compiled graph color target. */
|
|
97
|
+
export interface CurrentGraphTarget {
|
|
98
|
+
readonly name: string;
|
|
99
|
+
readonly texture: Texture;
|
|
100
|
+
/** Stable opaque identity for this RHI handle during the renderer lifetime. */
|
|
101
|
+
readonly textureIdentity: number;
|
|
102
|
+
readonly descriptor: ResolvedColorTargetDescriptor;
|
|
103
|
+
readonly frameId: number;
|
|
104
|
+
/** Monotonic identity of the compiled graph that owns this texture. */
|
|
105
|
+
readonly graphGeneration: number;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const textureIdentities = new WeakMap<object, number>();
|
|
109
|
+
let nextTextureIdentity = 1;
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Project an opaque RHI texture handle to a stable diagnostic identity.
|
|
113
|
+
* RHI handles intentionally expose no serializable fields; object identity is
|
|
114
|
+
* the only valid comparison boundary for a copy-time capture.
|
|
115
|
+
*/
|
|
116
|
+
export function getTextureIdentity(texture: Texture): number {
|
|
117
|
+
const object = texture as object;
|
|
118
|
+
const existing = textureIdentities.get(object);
|
|
119
|
+
if (existing !== undefined) return existing;
|
|
120
|
+
const identity = nextTextureIdentity++;
|
|
121
|
+
textureIdentities.set(object, identity);
|
|
122
|
+
return identity;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export type GraphTargetCaptureReadbackValidation =
|
|
126
|
+
| { readonly ok: true }
|
|
127
|
+
| {
|
|
128
|
+
readonly ok: false;
|
|
129
|
+
readonly code:
|
|
130
|
+
| 'capture-readback-length'
|
|
131
|
+
| 'capture-readback-untouched-sentinel'
|
|
132
|
+
| 'capture-readback-empty'
|
|
133
|
+
| 'capture-readback-non-finite';
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
/** Validate a mapped rgba16float capture before a consumer decodes its values. */
|
|
137
|
+
export function validateGraphTargetCaptureReadback(input: {
|
|
138
|
+
readonly bytes: Uint8Array;
|
|
139
|
+
readonly expectedByteLength: number;
|
|
140
|
+
readonly sentinel?: Uint8Array;
|
|
141
|
+
}): GraphTargetCaptureReadbackValidation {
|
|
142
|
+
const { bytes, expectedByteLength, sentinel } = input;
|
|
143
|
+
if (bytes.byteLength !== expectedByteLength)
|
|
144
|
+
return { ok: false, code: 'capture-readback-length' };
|
|
145
|
+
if (sentinel?.every((value, index) => bytes[index] === value)) {
|
|
146
|
+
return { ok: false, code: 'capture-readback-untouched-sentinel' };
|
|
147
|
+
}
|
|
148
|
+
if (bytes.every((value) => value === 0)) return { ok: false, code: 'capture-readback-empty' };
|
|
149
|
+
for (let index = 0; index + 1 < bytes.length; index += 2) {
|
|
150
|
+
const exponent = ((bytes[index + 1] ?? 0) >>> 2) & 0x1f;
|
|
151
|
+
if (exponent === 0x1f) return { ok: false, code: 'capture-readback-non-finite' };
|
|
152
|
+
}
|
|
153
|
+
return { ok: true };
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/** Internal readback request consumed by the record encoder in the same submit. */
|
|
157
|
+
export interface GraphTargetCaptureRequest {
|
|
158
|
+
readonly name: string;
|
|
159
|
+
readonly buffer: Buffer;
|
|
160
|
+
readonly bytesPerRow: number;
|
|
161
|
+
readonly width: number;
|
|
162
|
+
readonly height: number;
|
|
163
|
+
/** Descriptor contract checked against the resolved target at copy time. */
|
|
164
|
+
readonly expected: {
|
|
165
|
+
readonly format: ResolvedColorTargetDescriptor['format'];
|
|
166
|
+
readonly width: number;
|
|
167
|
+
readonly height: number;
|
|
168
|
+
readonly usage: number;
|
|
169
|
+
/** Optional caller binding; when present it is checked at copy time. */
|
|
170
|
+
readonly identity?: {
|
|
171
|
+
readonly graphGeneration: number;
|
|
172
|
+
readonly frameId: number;
|
|
173
|
+
readonly textureIdentity: number;
|
|
174
|
+
};
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
|
|
87
178
|
/**
|
|
88
179
|
* Build a synthetic CameraSnapshot the record stage uses when the world
|
|
89
180
|
* carries no Camera entity. Identity-shaped projection / view inputs
|
|
@@ -160,14 +251,24 @@ export function clampPcfKernelSize(value: number | undefined): number {
|
|
|
160
251
|
*/
|
|
161
252
|
export interface RenderFrameState {
|
|
162
253
|
frameNumber: number;
|
|
254
|
+
/** Monotonic compiled-graph identity used by diagnostic readbacks. */
|
|
255
|
+
graphGeneration: number;
|
|
256
|
+
/** Number of successfully submitted TAA frames; failed attempts do not advance it. */
|
|
257
|
+
successfulTemporalFrameIndex?: number;
|
|
163
258
|
/** Optional graph resource lookup used by low-level record helpers and tests. */
|
|
164
|
-
|
|
259
|
+
perFrameGraph?: {
|
|
165
260
|
readonly getColorTargetDescriptor: (key: string) => ResolvedColorTargetDescriptor | undefined;
|
|
166
261
|
readonly getColorTargetView: (key: string) => TextureView | undefined;
|
|
167
262
|
readonly getColorTargetTexture: (key: string) => Texture | undefined;
|
|
263
|
+
readonly graphGeneration: number;
|
|
168
264
|
} | null;
|
|
265
|
+
graphTargetCapture?: GraphTargetCaptureRequest | undefined;
|
|
169
266
|
/** Last successfully rendered static directional shadow atlas token. */
|
|
170
267
|
directionalShadowCache: DirectionalShadowCache | null;
|
|
268
|
+
/** Last successfully submitted camera post-process mode. */
|
|
269
|
+
lastSuccessfulBloom: 'off' | 'on';
|
|
270
|
+
/** Bloom record receipts staged by this frame; cleared on abort. */
|
|
271
|
+
bloomFrameReceipts?: BloomFrameReceipts | undefined;
|
|
171
272
|
/** Set by a directional shadow pass when this frame refreshed the atlas. */
|
|
172
273
|
directionalShadowCacheRecorded: boolean;
|
|
173
274
|
/** The sole compiled owner for compute, copy, feature, and raster work. */
|
|
@@ -176,6 +277,20 @@ export interface RenderFrameState {
|
|
|
176
277
|
readonly retiredCompiledFrameGraphs: Set<CompiledRenderGraph<RenderPipelineFrame>>;
|
|
177
278
|
/** Physical outputs projected by typed graph passes for downstream observers. */
|
|
178
279
|
currentFrameObservationSource: FrameObservationSource | undefined;
|
|
280
|
+
/** Camera antialias mode for the last successfully submitted graph. */
|
|
281
|
+
lastSuccessfulCameraAntialias: CameraSnapshot['antialias'] | undefined;
|
|
282
|
+
/** Staged TAA GPU state is promoted only after queue.submit succeeds. */
|
|
283
|
+
temporalGpuState: TemporalGpuState | undefined;
|
|
284
|
+
/** Last successful TAA GPU state; candidate replacement stays staged until submit. */
|
|
285
|
+
activeTemporalGpuState: TemporalGpuState | undefined;
|
|
286
|
+
/** Submitted temporal generations retained until their queue fence resolves. */
|
|
287
|
+
readonly retiringTemporalGpuStates: Set<TemporalGpuState>;
|
|
288
|
+
/** Last successful projection; candidate frames never overwrite it. */
|
|
289
|
+
lastSuccessfulTemporalView: TemporalView | undefined;
|
|
290
|
+
pendingTemporalCommit: TemporalCommitOutcome;
|
|
291
|
+
/** Staged environment generation is promoted only after queue.submit succeeds. */
|
|
292
|
+
environmentGeneration: EnvironmentGeneration | undefined;
|
|
293
|
+
readonly environmentLifecycle: EnvironmentLifecycle | undefined;
|
|
179
294
|
currentDirectionalShadowView: TextureView | null;
|
|
180
295
|
currentSpotShadowView: TextureView | null;
|
|
181
296
|
readonly instanceBuffers: Map<number, InstanceBufferCacheEntry>;
|
|
@@ -342,10 +457,9 @@ export interface RenderFrameState {
|
|
|
342
457
|
*/
|
|
343
458
|
installedPipelineConfig: RenderPipelineAsset['config'];
|
|
344
459
|
/**
|
|
345
|
-
*
|
|
346
|
-
*
|
|
347
|
-
*
|
|
348
|
-
* `!isHdrpActive` so HDRP demos do not double-count light contributions.
|
|
460
|
+
* Whether the configured standard graph resolved to the clustered lane.
|
|
461
|
+
* Capability gating keeps URP forward bindings on WebGL2 fallback even
|
|
462
|
+
* when a clustered profile was requested.
|
|
349
463
|
*/
|
|
350
464
|
isHdrpActive: boolean;
|
|
351
465
|
/**
|
|
@@ -432,6 +546,16 @@ export interface BindGroupCounts {
|
|
|
432
546
|
keys: string[];
|
|
433
547
|
}
|
|
434
548
|
|
|
549
|
+
/**
|
|
550
|
+
* Successful Bloom record operations staged for the current frame. These
|
|
551
|
+
* counters are promoted only after the shared renderer queue submission.
|
|
552
|
+
*/
|
|
553
|
+
export interface BloomFrameReceipts {
|
|
554
|
+
readonly uploadCount: number;
|
|
555
|
+
readonly bindGroupCount: number;
|
|
556
|
+
readonly encodeCount: number;
|
|
557
|
+
}
|
|
558
|
+
|
|
435
559
|
/**
|
|
436
560
|
* A renderable resolved against the AssetRegistry for the current frame:
|
|
437
561
|
* its source snapshot, the GPU mesh handles, the row index used to correlate
|
|
@@ -20,9 +20,12 @@ export function graphExecutionPhase(passName: string): RenderGraphExecutionPhase
|
|
|
20
20
|
case 'lighting':
|
|
21
21
|
return 'record/graph-execute/lighting';
|
|
22
22
|
case 'forward':
|
|
23
|
+
case 'transmission-forward':
|
|
23
24
|
return 'record/graph-execute/forward';
|
|
24
|
-
case '
|
|
25
|
-
return 'record/graph-execute/
|
|
25
|
+
case 'output-transform':
|
|
26
|
+
return 'record/graph-execute/output-transform';
|
|
27
|
+
case 'present':
|
|
28
|
+
return 'record/graph-execute/present';
|
|
26
29
|
case 'debug-overlay':
|
|
27
30
|
return 'record/graph-execute/debug-overlay';
|
|
28
31
|
case 'shadow':
|
|
@@ -55,17 +58,23 @@ export function acquireSwapChainTarget(
|
|
|
55
58
|
|
|
56
59
|
let currentTextureResult = canvasContext.getCurrentTexture();
|
|
57
60
|
if (!currentTextureResult.ok) {
|
|
58
|
-
pipelineState.perPassResources.configured = false;
|
|
59
61
|
const configured = configureSurface(
|
|
60
62
|
canvasContext,
|
|
61
63
|
internals.device,
|
|
62
64
|
pipelineState.format,
|
|
63
65
|
pipelineState.colorAttachmentFormat,
|
|
64
66
|
);
|
|
65
|
-
if (configured.ok) {
|
|
66
|
-
|
|
67
|
-
|
|
67
|
+
if (!configured.ok) {
|
|
68
|
+
internals.errorRegistry.fire(configured.error);
|
|
69
|
+
internals.healthRegistry.fire({
|
|
70
|
+
reason: 'internal-fault',
|
|
71
|
+
detail: { message: 'surface configure candidate failed; current frame skipped' },
|
|
72
|
+
recoverable: true,
|
|
73
|
+
});
|
|
74
|
+
return null;
|
|
68
75
|
}
|
|
76
|
+
pipelineState.perPassResources.configured = true;
|
|
77
|
+
(globalThis as Record<string, unknown>).__forgeaxSwapChainFormat = pipelineState.format;
|
|
69
78
|
const retry = canvasContext.getCurrentTexture();
|
|
70
79
|
if (!retry.ok) {
|
|
71
80
|
internals.errorRegistry.fire(retry.error);
|