@forgeax/engine-render 0.1.27 → 0.1.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +842 -124
- package/dist/assembly/atmosphere-shader-prewarm.d.ts +6 -0
- package/dist/assembly/atmosphere-shader-prewarm.d.ts.map +1 -0
- package/dist/assembly/dynamic-geometry-host.d.ts +52 -0
- package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -0
- package/dist/assembly/dynamic-geometry-runtime.d.ts +20 -0
- package/dist/assembly/dynamic-geometry-runtime.d.ts.map +1 -0
- package/dist/assembly/factory.d.ts +3 -1
- package/dist/assembly/factory.d.ts.map +1 -1
- package/dist/assembly/gpu-driven-owner.d.ts +10 -0
- package/dist/assembly/gpu-driven-owner.d.ts.map +1 -0
- package/dist/assembly/host-contract.d.ts +19 -0
- package/dist/assembly/host-contract.d.ts.map +1 -1
- package/dist/assembly/material/assembly.d.ts +7 -0
- package/dist/assembly/material/assembly.d.ts.map +1 -1
- package/dist/assembly/material-shader-policy.d.ts +3 -1
- package/dist/assembly/material-shader-policy.d.ts.map +1 -1
- package/dist/assembly/recovery/failure-location.d.ts +12 -0
- package/dist/assembly/recovery/failure-location.d.ts.map +1 -0
- package/dist/assembly/recovery/renderer-recover.d.ts +6 -4
- package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
- package/dist/assembly/renderer-facade.d.ts.map +1 -1
- package/dist/assembly/renderer-feature-inspection.d.ts +5 -0
- package/dist/assembly/renderer-feature-inspection.d.ts.map +1 -0
- package/dist/assembly/renderer-frame-transaction.d.ts +19 -0
- package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
- package/dist/assembly/renderer-helpers.d.ts +3 -0
- package/dist/assembly/renderer-helpers.d.ts.map +1 -1
- package/dist/assembly/renderer-inspection.d.ts +4 -0
- package/dist/assembly/renderer-inspection.d.ts.map +1 -1
- package/dist/assembly/shader-prewarm-policy.d.ts +6 -0
- package/dist/assembly/shader-prewarm-policy.d.ts.map +1 -1
- package/dist/assembly/skin-palette-owner.d.ts +8 -0
- package/dist/assembly/skin-palette-owner.d.ts.map +1 -0
- package/dist/assembly/ssr-shader-prewarm.d.ts +6 -0
- package/dist/assembly/ssr-shader-prewarm.d.ts.map +1 -0
- package/dist/assembly/webgpu-device-loss.d.ts +15 -0
- package/dist/assembly/webgpu-device-loss.d.ts.map +1 -0
- package/dist/assembly/webgpu-pbr-ready.d.ts +38 -0
- package/dist/assembly/webgpu-pbr-ready.d.ts.map +1 -0
- package/dist/assembly/webgpu-ready-mipmap.d.ts +11 -0
- package/dist/assembly/webgpu-ready-mipmap.d.ts.map +1 -0
- package/dist/assembly/webgpu-ready.d.ts +7 -3
- package/dist/assembly/webgpu-ready.d.ts.map +1 -1
- package/dist/assembly/webgpu-renderer-bootstrap.d.ts +10 -0
- package/dist/assembly/webgpu-renderer-bootstrap.d.ts.map +1 -0
- package/dist/assembly/webgpu-renderer-contract.d.ts +62 -0
- package/dist/assembly/webgpu-renderer-contract.d.ts.map +1 -0
- package/dist/assembly/webgpu-renderer-guards.d.ts +9 -0
- package/dist/assembly/webgpu-renderer-guards.d.ts.map +1 -0
- package/dist/assembly/webgpu-renderer-observation.d.ts +6 -0
- package/dist/assembly/webgpu-renderer-observation.d.ts.map +1 -0
- package/dist/assembly/webgpu-renderer-recovery-failure.d.ts +12 -0
- package/dist/assembly/webgpu-renderer-recovery-failure.d.ts.map +1 -0
- package/dist/assembly/webgpu-renderer.d.ts +7 -141
- package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
- package/dist/assembly/webgpu-vertex-layouts.d.ts +28 -84
- package/dist/assembly/webgpu-vertex-layouts.d.ts.map +1 -1
- package/dist/authoring.mjs +3 -3
- package/dist/{chunk-ADHHVYLW.mjs → chunk-33XZFTQU.mjs} +245 -39
- package/dist/chunk-33XZFTQU.mjs.map +1 -0
- package/dist/{chunk-GF523LHF.mjs → chunk-BLXGONR2.mjs} +30 -12
- package/dist/chunk-BLXGONR2.mjs.map +1 -0
- package/dist/{chunk-KM2NOX2I.mjs → chunk-BQVQOQJH.mjs} +958 -254
- package/dist/chunk-BQVQOQJH.mjs.map +1 -0
- package/dist/{chunk-HKXTW355.mjs → chunk-BTWH7BP4.mjs} +386 -17
- package/dist/chunk-BTWH7BP4.mjs.map +1 -0
- package/dist/{chunk-TMIASV2N.mjs → chunk-FUODTTIA.mjs} +3934 -676
- package/dist/chunk-FUODTTIA.mjs.map +1 -0
- package/dist/{chunk-FJ6P52EE.mjs → chunk-ILQ5MEZF.mjs} +3 -17
- package/dist/chunk-ILQ5MEZF.mjs.map +1 -0
- package/dist/{chunk-E34VL5VI.mjs → chunk-JQTSEI3Z.mjs} +3 -3
- package/dist/{chunk-E34VL5VI.mjs.map → chunk-JQTSEI3Z.mjs.map} +1 -1
- package/dist/{chunk-GE3SDD72.mjs → chunk-NICXSHAT.mjs} +16 -38
- package/dist/chunk-NICXSHAT.mjs.map +1 -0
- package/dist/{chunk-ZZ4YQ474.mjs → chunk-NRNXBLIJ.mjs} +577 -7
- package/dist/chunk-NRNXBLIJ.mjs.map +1 -0
- package/dist/{chunk-JDWARUOI.mjs → chunk-PA5DRJNI.mjs} +17 -3
- package/dist/chunk-PA5DRJNI.mjs.map +1 -0
- package/dist/{chunk-XDP6XE5V.mjs → chunk-S4DNKQYQ.mjs} +1118 -446
- package/dist/chunk-S4DNKQYQ.mjs.map +1 -0
- package/dist/components/camera.d.ts +62 -2
- package/dist/components/camera.d.ts.map +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/instances.d.ts +6 -20
- package/dist/components/instances.d.ts.map +1 -1
- package/dist/components/scene-instance.d.ts +2 -1
- package/dist/components/scene-instance.d.ts.map +1 -1
- package/dist/components/screen-space-reflection.d.ts +14 -0
- package/dist/components/screen-space-reflection.d.ts.map +1 -0
- package/dist/construct-renderer.mjs +13805 -7186
- package/dist/construct-renderer.mjs.map +1 -1
- package/dist/device/gpu-residency.d.ts +11 -17
- package/dist/device/gpu-residency.d.ts.map +1 -1
- package/dist/device/mesh-residency-lifetime.d.ts +21 -0
- package/dist/device/mesh-residency-lifetime.d.ts.map +1 -0
- package/dist/dynamic-geometry.d.ts +125 -0
- package/dist/dynamic-geometry.d.ts.map +1 -0
- package/dist/environment/background.d.ts +6 -0
- package/dist/environment/background.d.ts.map +1 -0
- package/dist/errors/gpu-driven.d.ts +6 -3
- package/dist/errors/gpu-driven.d.ts.map +1 -1
- package/dist/errors/render.d.ts +7 -4
- package/dist/errors/render.d.ts.map +1 -1
- package/dist/extract/camera.d.ts.map +1 -1
- package/dist/extract/gpu-driven.d.ts +33 -3
- package/dist/extract/gpu-driven.d.ts.map +1 -1
- package/dist/features/host.d.ts +23 -1
- package/dist/features/host.d.ts.map +1 -1
- package/dist/features/noise-texture.d.ts +17 -0
- package/dist/features/noise-texture.d.ts.map +1 -0
- package/dist/features/plan.d.ts +83 -2
- package/dist/features/plan.d.ts.map +1 -1
- package/dist/features/prepared-gpu-work.d.ts +37 -4
- package/dist/features/prepared-gpu-work.d.ts.map +1 -1
- package/dist/features/prepared-graphics-store.d.ts.map +1 -1
- package/dist/features/prepared-graphics.d.ts +5 -0
- package/dist/features/prepared-graphics.d.ts.map +1 -1
- package/dist/features/render-graph-compute.d.ts +5 -3
- package/dist/features/render-graph-compute.d.ts.map +1 -1
- package/dist/features/render-graph-contribution.d.ts +11 -3
- package/dist/features/render-graph-contribution.d.ts.map +1 -1
- package/dist/features/render-graph-raster.d.ts +19 -3
- package/dist/features/render-graph-raster.d.ts.map +1 -1
- package/dist/features/types.d.ts +11 -0
- package/dist/features/types.d.ts.map +1 -1
- package/dist/fullscreen-post-process-pass.d.ts +2 -0
- package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
- package/dist/gpu-driven/batch-topology.d.ts +34 -1
- package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
- package/dist/gpu-driven/pbr-program.d.ts +10 -0
- package/dist/gpu-driven/pbr-program.d.ts.map +1 -0
- package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
- package/dist/gpu-driven/production-raster.d.ts +144 -23
- package/dist/gpu-driven/production-raster.d.ts.map +1 -1
- package/dist/gpu-driven/shadow-views.d.ts +126 -0
- package/dist/gpu-driven/shadow-views.d.ts.map +1 -0
- package/dist/gpu-driven/view-gpu.d.ts +18 -2
- package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
- package/dist/gpu-scene-schema.d.ts +2 -8
- package/dist/gpu-scene-schema.d.ts.map +1 -1
- package/dist/gpu-scene.d.ts +14 -0
- package/dist/gpu-scene.d.ts.map +1 -1
- package/dist/gpu-texture-usage.d.ts +1 -0
- package/dist/gpu-texture-usage.d.ts.map +1 -1
- package/dist/hdrp-buffers.d.ts +6 -0
- package/dist/hdrp-buffers.d.ts.map +1 -1
- package/dist/ibl/frame-resources.d.ts +8 -0
- package/dist/ibl/frame-resources.d.ts.map +1 -0
- package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
- package/dist/index.d.ts +21 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +8 -7
- package/dist/index.mjs.map +1 -1
- package/dist/inspection-types.d.ts +164 -0
- package/dist/inspection-types.d.ts.map +1 -1
- package/dist/instances-derived-bounds.d.ts +11 -0
- package/dist/instances-derived-bounds.d.ts.map +1 -1
- package/dist/instances.d.ts +89 -44
- package/dist/instances.d.ts.map +1 -1
- package/dist/internal.d.ts +3 -0
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.mjs +118 -10
- package/dist/internal.mjs.map +1 -1
- package/dist/lifecycle.d.ts +2 -1
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/material-row.d.ts +5 -0
- package/dist/material-row.d.ts.map +1 -0
- package/dist/materials.d.ts +15 -0
- package/dist/materials.d.ts.map +1 -1
- package/dist/pbr-pipeline.d.ts +21 -5
- package/dist/pbr-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
- package/dist/pipeline/standard-output/auto-exposure/capability.d.ts +12 -0
- package/dist/pipeline/standard-output/auto-exposure/capability.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts +70 -0
- package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/graph.d.ts +75 -0
- package/dist/pipeline/standard-output/auto-exposure/graph.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts +111 -0
- package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts +16 -0
- package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/preset.d.ts +14 -0
- package/dist/pipeline/standard-output/auto-exposure/preset.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/state.d.ts +46 -0
- package/dist/pipeline/standard-output/auto-exposure/state.d.ts.map +1 -0
- package/dist/pipeline/standard-output/color-transform.d.ts +27 -0
- package/dist/pipeline/standard-output/color-transform.d.ts.map +1 -0
- package/dist/pipeline/standard-output/graph.d.ts +15 -0
- package/dist/pipeline/standard-output/graph.d.ts.map +1 -0
- package/dist/pipeline/standard-output/lut-admission.d.ts +29 -0
- package/dist/pipeline/standard-output/lut-admission.d.ts.map +1 -0
- package/dist/pipeline/standard-output/lut-gpu.d.ts +48 -0
- package/dist/pipeline/standard-output/lut-gpu.d.ts.map +1 -0
- package/dist/pipeline/standard-output/lut-state.d.ts +68 -0
- package/dist/pipeline/standard-output/lut-state.d.ts.map +1 -0
- package/dist/pipeline/standard-output/resources.d.ts +10 -0
- package/dist/pipeline/standard-output/resources.d.ts.map +1 -0
- package/dist/pipeline/standard-output/types.d.ts +39 -0
- package/dist/pipeline/standard-output/types.d.ts.map +1 -0
- package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-post.d.ts +2 -2
- package/dist/pipeline/standard-post.d.ts.map +1 -1
- package/dist/pipeline-builder.d.ts +2 -1
- package/dist/pipeline-builder.d.ts.map +1 -1
- package/dist/pipeline-spec-types.d.ts +4 -0
- package/dist/pipeline-spec-types.d.ts.map +1 -1
- package/dist/pipeline-spec.d.ts +1 -9
- package/dist/pipeline-spec.d.ts.map +1 -1
- package/dist/points-lines/standard-owner.d.ts +1 -1
- package/dist/points-lines/standard-owner.d.ts.map +1 -1
- package/dist/prepare/prepared-graphics-resolver.d.ts +6 -1
- package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
- package/dist/record/dynamic-geometry-consumption.d.ts +15 -0
- package/dist/record/dynamic-geometry-consumption.d.ts.map +1 -0
- package/dist/record/frame-lighting.d.ts +3 -3
- package/dist/record/frame-lighting.d.ts.map +1 -1
- package/dist/record/frame-snapshot.d.ts +106 -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 +39 -4
- package/dist/record/frame.d.ts.map +1 -1
- package/dist/record/main-pass-geometry.d.ts +7 -8
- package/dist/record/main-pass-geometry.d.ts.map +1 -1
- package/dist/record/main-pass-material.d.ts +38 -1
- package/dist/record/main-pass-material.d.ts.map +1 -1
- package/dist/record/main-pass-sprite-draws.d.ts +2 -10
- package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
- package/dist/record/main-pass.d.ts +12 -2
- package/dist/record/main-pass.d.ts.map +1 -1
- package/dist/record/mesh-ssbo.d.ts +15 -6
- package/dist/record/mesh-ssbo.d.ts.map +1 -1
- package/dist/record/prepared-material-bindings.d.ts +19 -0
- package/dist/record/prepared-material-bindings.d.ts.map +1 -0
- package/dist/record/recovery-pipeline.d.ts +2 -9
- package/dist/record/recovery-pipeline.d.ts.map +1 -1
- package/dist/record/render-context.d.ts +76 -26
- package/dist/record/render-context.d.ts.map +1 -1
- package/dist/record/shadow-pass.d.ts +62 -7
- package/dist/record/shadow-pass.d.ts.map +1 -1
- package/dist/record/skybox-post-pass.d.ts +1 -1
- package/dist/record/skybox-post-pass.d.ts.map +1 -1
- package/dist/record/typed-frame-graph.d.ts +35 -7
- package/dist/record/typed-frame-graph.d.ts.map +1 -1
- package/dist/record/view-ubo.d.ts +1 -0
- package/dist/record/view-ubo.d.ts.map +1 -1
- package/dist/recovery/render-system-candidate.d.ts +10 -2
- package/dist/recovery/render-system-candidate.d.ts.map +1 -1
- package/dist/recovery/render-system-roots.d.ts +11 -0
- package/dist/recovery/render-system-roots.d.ts.map +1 -0
- package/dist/recovery/types.d.ts +76 -0
- package/dist/recovery/types.d.ts.map +1 -0
- package/dist/reflection/record-owner.d.ts +0 -2
- package/dist/reflection/record-owner.d.ts.map +1 -1
- package/dist/render-contract.d.ts +185 -30
- package/dist/render-contract.d.ts.map +1 -1
- package/dist/render-graph-primitives.d.ts +1 -0
- package/dist/render-graph-primitives.d.ts.map +1 -1
- package/dist/render-pipeline.d.ts +64 -5
- package/dist/render-pipeline.d.ts.map +1 -1
- package/dist/render-system-extract-tail.d.ts +7 -5
- package/dist/render-system-extract-tail.d.ts.map +1 -1
- package/dist/render-system-extract.d.ts +101 -41
- package/dist/render-system-extract.d.ts.map +1 -1
- package/dist/render-system-projections.d.ts +22 -0
- package/dist/render-system-projections.d.ts.map +1 -0
- package/dist/render-system.d.ts +34 -77
- package/dist/render-system.d.ts.map +1 -1
- package/dist/scene/render-scene-types.d.ts +14 -7
- package/dist/scene/render-scene-types.d.ts.map +1 -1
- package/dist/scene/render-scene.d.ts +29 -11
- package/dist/scene/render-scene.d.ts.map +1 -1
- package/dist/scene/shadow-visibility.d.ts +5 -0
- package/dist/scene/shadow-visibility.d.ts.map +1 -0
- package/dist/ssr/admission.d.ts +70 -1
- package/dist/ssr/admission.d.ts.map +1 -1
- package/dist/ssr/compose.d.ts +13 -0
- package/dist/ssr/compose.d.ts.map +1 -0
- package/dist/ssr/errors.d.ts +35 -0
- package/dist/ssr/errors.d.ts.map +1 -1
- package/dist/ssr/graph.d.ts +60 -0
- package/dist/ssr/graph.d.ts.map +1 -0
- package/dist/ssr/history.d.ts +97 -0
- package/dist/ssr/history.d.ts.map +1 -0
- package/dist/ssr/hiz.d.ts +37 -0
- package/dist/ssr/hiz.d.ts.map +1 -0
- package/dist/ssr/inspection.d.ts +42 -0
- package/dist/ssr/inspection.d.ts.map +1 -0
- package/dist/ssr/resources.d.ts +58 -0
- package/dist/ssr/resources.d.ts.map +1 -0
- package/dist/ssr/temporal.d.ts +38 -0
- package/dist/ssr/temporal.d.ts.map +1 -0
- package/dist/systems/skin-palette-allocator.d.ts +32 -10
- package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
- package/dist/systems/skin-palette-types.d.ts +15 -0
- package/dist/systems/skin-palette-types.d.ts.map +1 -1
- package/dist/systems/transparent-dispatch.d.ts +9 -0
- package/dist/systems/transparent-dispatch.d.ts.map +1 -0
- package/dist/targets/material-source.d.ts +7 -0
- package/dist/targets/material-source.d.ts.map +1 -1
- package/dist/temporal/frame-coordinator.d.ts +7 -0
- package/dist/temporal/frame-coordinator.d.ts.map +1 -1
- package/dist/temporal/gpu.d.ts +8 -0
- package/dist/temporal/gpu.d.ts.map +1 -1
- package/dist/temporal/history.d.ts.map +1 -1
- package/dist/temporal/index.mjs +6 -6
- package/dist/temporal/inspection.d.ts.map +1 -1
- package/dist/temporal/standard-scene-data.d.ts +2 -1
- package/dist/temporal/standard-scene-data.d.ts.map +1 -1
- package/dist/temporal/temporal-view.d.ts +2 -0
- package/dist/temporal/temporal-view.d.ts.map +1 -1
- package/dist/typed-render-graph-primitives.d.ts +35 -1
- package/dist/typed-render-graph-primitives.d.ts.map +1 -1
- package/dist/typed-shadow-passes.d.ts +3 -1
- package/dist/typed-shadow-passes.d.ts.map +1 -1
- package/dist/volume/temporal.d.ts +6 -0
- package/dist/volume/temporal.d.ts.map +1 -1
- package/package.json +21 -20
- package/src/__tests__/auto-exposure-gpu-evidence.ts +291 -0
- package/src/__tests__/auto-exposure-inspection.unit.test.ts +80 -0
- package/src/__tests__/auto-exposure-transaction.integration.test.ts +99 -0
- package/src/__tests__/auto-exposure.browser.test.ts +33 -0
- package/src/__tests__/auto-exposure.dawn.test.ts +33 -0
- package/src/__tests__/detached-inspection.integration.test.ts +5 -0
- package/src/__tests__/device-scope-lifecycle.unit.test.ts +18 -0
- package/src/__tests__/device-scope-stale-matrix.unit.test.ts +18 -0
- package/src/__tests__/docs-gate-green.unit.test.ts +3 -3
- package/src/__tests__/dynamic-geometry-host.unit.test.ts +1123 -0
- package/src/__tests__/dynamic-geometry.unit.test.ts +233 -0
- package/src/__tests__/factory-contract.integration.test.ts +73 -22
- package/src/__tests__/fallback-row-stride-surface.unit.test.ts +19 -0
- package/src/__tests__/feature-depth-input.dawn.test.ts +121 -0
- package/src/__tests__/feature-noise.unit.test.ts +38 -0
- package/src/__tests__/fixtures/taa-resolve-pinned-baseline.wgsl +301 -0
- package/src/__tests__/frame-camera-selection.unit.test.ts +131 -0
- package/src/__tests__/frame-plan-contract.unit.test.ts +24 -0
- package/src/__tests__/frame-targets.unit.test.ts +24 -0
- package/src/__tests__/fullscreen-feature-plan.unit.test.ts +3 -0
- package/src/__tests__/gpu-driven-baseline.characterization.test.ts +79 -0
- package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +287 -6
- package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +122 -142
- package/src/__tests__/gpu-driven-indirect-raster.browser.test.ts +10 -1
- package/src/__tests__/gpu-driven-lod-cache.unit.test.ts +264 -0
- package/src/__tests__/gpu-driven-mesh-world-identity.unit.test.ts +349 -0
- package/src/__tests__/gpu-driven-pbr.dawn.test.ts +1417 -0
- package/src/__tests__/gpu-driven-pbr.integration.test.ts +21 -0
- package/src/__tests__/gpu-driven-production-fixture.ts +96 -0
- package/src/__tests__/gpu-driven-production.integration.test.ts +1075 -93
- package/src/__tests__/gpu-driven-scaling.unit.test.ts +1 -3
- package/src/__tests__/gpu-driven-shadow-views.browser.test.ts +63 -0
- package/src/__tests__/gpu-driven-shadow-views.dawn.test.ts +294 -0
- package/src/__tests__/gpu-driven-shadow-views.integration.test.ts +97 -0
- package/src/__tests__/gpu-driven-shadow-views.unit.test.ts +168 -0
- package/src/__tests__/gpu-driven-skin-contract.test-d.ts +11 -0
- package/src/__tests__/gpu-driven-view-gpu-evidence.ts +72 -20
- package/src/__tests__/gpu-driven-view-graph.integration.test.ts +30 -9
- package/src/__tests__/gpu-driven-view.unit.test.ts +159 -52
- package/src/__tests__/gpu-pass-timing.browser.test.ts +6 -1
- package/src/__tests__/gpu-resource-store-stride.unit.test.ts +42 -0
- package/src/__tests__/gpu-scene-render-graph-gpu.ts +19 -5
- package/src/__tests__/gpu-scene.dawn.test.ts +40 -13
- package/src/__tests__/gpu-scene.unit.test.ts +559 -33
- package/src/__tests__/instances-culling.integration.test.ts +36 -10
- package/src/__tests__/instances-derived-bounds.unit.test.ts +54 -0
- package/src/__tests__/instances-store.unit.test.ts +242 -39
- package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +6 -0
- package/src/__tests__/lighting-scene-roundtrip.integration.test.ts +13 -16
- package/src/__tests__/lut-lkg-transaction.integration.test.ts +122 -0
- package/src/__tests__/material-contract-inventory.unit.test.ts +5 -6
- package/src/__tests__/material-dispatch-shader-id.unit.test.ts +51 -0
- package/src/__tests__/material-lane-selection.unit.test.ts +60 -0
- package/src/__tests__/material-numeric-upload.unit.test.ts +53 -0
- package/src/__tests__/material-texture-handles.unit.test.ts +18 -0
- package/src/__tests__/material-texture-source.unit.test.ts +87 -0
- package/src/__tests__/materials-authoring-validation.unit.test.ts +41 -0
- package/src/__tests__/materials-standard-contract.unit.test.ts +52 -2
- package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +4 -0
- package/src/__tests__/mesh-submission-lifetime.unit.test.ts +53 -0
- package/src/__tests__/normal-fallback.dawn.test.ts +122 -0
- package/src/__tests__/particle-material-input-layout.unit.test.ts +104 -0
- package/src/__tests__/physical-clearcoat.integration.test.ts +37 -3
- package/src/__tests__/pipeline-texture-specialization.unit.test.ts +138 -0
- package/src/__tests__/point-shadow-inspection.unit.test.ts +2 -0
- package/src/__tests__/prepared-gpu-driven-pbr-contract.test-d.ts +31 -0
- package/src/__tests__/prepared-gpu-driven-pbr-contract.unit.test.ts +39 -0
- package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +35 -4
- package/src/__tests__/prepared-graphics-capability.unit.test.ts +21 -0
- package/src/__tests__/prepared-graphics-pipeline-warmup.unit.test.ts +6 -2
- package/src/__tests__/profiler-phase-catalog.test.ts +5 -0
- package/src/__tests__/public-surface.test-d.ts +3 -0
- package/src/__tests__/recovery-candidate-prepare.contract.test.ts +30 -12
- package/src/__tests__/reflection-fallback-async-publication.unit.test.ts +104 -0
- package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +2 -1
- package/src/__tests__/render-error-code-owner.test-d.ts +4 -0
- package/src/__tests__/render-error-detail-ssot.test-d.ts +22 -0
- package/src/__tests__/render-error-exhaustive.test-d.ts +15 -0
- package/src/__tests__/render-feature-gpu-work.integration.test.ts +285 -2
- package/src/__tests__/render-feature-plan.unit.test.ts +245 -0
- package/src/__tests__/render-feature-shadow-order.unit.test.ts +228 -0
- package/src/__tests__/render-feature-zero-work.unit.test.ts +35 -1
- package/src/__tests__/render-graph-fallback.integration.test.ts +2 -2
- package/src/__tests__/render-owner-cohesion.unit.test.ts +55 -0
- package/src/__tests__/render-scene-mixed-updates.integration.test.ts +426 -0
- package/src/__tests__/render-scene-projection.unit.test.ts +914 -23
- package/src/__tests__/render-scene-resource-updates.integration.test.ts +214 -0
- package/src/__tests__/render-scene-skin-lifecycle.integration.test.ts +173 -0
- package/src/__tests__/render-scene-temporal-retry.unit.test.ts +133 -0
- package/src/__tests__/render-target-material-source.test-d.ts +27 -3
- package/src/__tests__/renderer-factory-material-contract.unit.test.ts +61 -1
- package/src/__tests__/renderer-frame-transaction.integration.test.ts +923 -5
- package/src/__tests__/shader-manifest-fixture.ts +39 -0
- package/src/__tests__/skin-motion-regression.unit.test.ts +0 -33
- package/src/__tests__/skin-palette-persistent.integration.test.ts +28 -0
- package/src/__tests__/skin-palette-persistent.unit.test.ts +247 -0
- package/src/__tests__/skinned-shadow-caster.test.ts +118 -14
- package/src/__tests__/specular-environment-scale.dawn.test.ts +156 -0
- package/src/__tests__/ssr-admission-matrix.integration.test.ts +7 -1
- package/src/__tests__/ssr-confidence-compose.unit.test.ts +84 -0
- package/src/__tests__/ssr-coordinate-oracle.unit.test.ts +28 -0
- package/src/__tests__/ssr-format-probe-gating.integration.test.ts +82 -0
- package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +91 -0
- package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +112 -0
- package/src/__tests__/ssr-gpu-dispatch.ts +946 -0
- package/src/__tests__/ssr-graph-topology.unit.test.ts +104 -0
- package/src/__tests__/ssr-history-filter.dawn.test.ts +198 -0
- package/src/__tests__/ssr-hit-color.dawn.test.ts +273 -0
- package/src/__tests__/ssr-hiz-odd-reduction.dawn.test.ts +569 -0
- package/src/__tests__/ssr-hiz-rescue.dawn.test.ts +279 -0
- package/src/__tests__/ssr-hiz.browser.test.ts +150 -0
- package/src/__tests__/ssr-hiz.dawn.test.ts +150 -0
- package/src/__tests__/ssr-hiz.unit.test.ts +56 -0
- package/src/__tests__/ssr-inspection.unit.test.ts +105 -0
- package/src/__tests__/ssr-memory-budget.unit.test.ts +45 -0
- package/src/__tests__/ssr-performance-sequence-aggregation.unit.test.ts +15 -0
- package/src/__tests__/ssr-public-surface.test-d.ts +37 -0
- package/src/__tests__/ssr-receiver-coverage.dawn.test.ts +387 -0
- package/src/__tests__/ssr-reflection-mip-reducer.dawn.test.ts +309 -0
- package/src/__tests__/ssr-reprojection-probe.ts +90 -0
- package/src/__tests__/ssr-roughness-mip.dawn.test.ts +163 -0
- package/src/__tests__/ssr-shader-prewarm.unit.test.ts +59 -0
- package/src/__tests__/ssr-spatial.integration.test.ts +141 -0
- package/src/__tests__/ssr-stable-lattice.dawn.test.ts +475 -0
- package/src/__tests__/ssr-temporal-history.unit.test.ts +202 -0
- package/src/__tests__/ssr-texel-crossing.dawn.test.ts +448 -0
- package/src/__tests__/ssr-zero-work.integration.test.ts +87 -0
- package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +44 -12
- package/src/__tests__/standard-clustered-pipeline.unit.test.ts +29 -0
- package/src/__tests__/standard-output-chain-contract.unit.test.ts +99 -0
- package/src/__tests__/standard-output-chain.integration.test.ts +73 -0
- package/src/__tests__/standard-output-gpu-evidence.ts +205 -0
- package/src/__tests__/standard-output.browser.test.ts +15 -0
- package/src/__tests__/standard-output.dawn.test.ts +15 -0
- package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +38 -0
- package/src/__tests__/standard-pipeline.integration.test.ts +320 -3
- package/src/__tests__/standard-profile-oracle.unit.test.ts +22 -0
- package/src/__tests__/standard-surface-lighting.unit.test.ts +41 -0
- package/src/__tests__/standard-texture-specialization.dawn.test.ts +141 -0
- package/src/__tests__/surface-adjacent-regressions.integration.test.ts +6 -3
- package/src/__tests__/taa-coverage-edge.dawn.test.ts +193 -0
- package/src/__tests__/taa-history-clipping.dawn.test.ts +328 -0
- package/src/__tests__/taa-neighborhood-equivalence.dawn.test.ts +778 -0
- package/src/__tests__/taa-stability-feedback.browser.test.ts +23 -0
- package/src/__tests__/taa-stability-feedback.dawn.test.ts +68 -0
- package/src/__tests__/taa-stability-feedback.ts +341 -0
- package/src/__tests__/temporal-history-lifecycle.unit.test.ts +49 -7
- package/src/__tests__/temporal-reset-matrix.unit.test.ts +9 -0
- package/src/__tests__/temporal-transaction.integration.test.ts +28 -0
- package/src/__tests__/texture-usage-surface.unit.test.ts +4 -2
- package/src/__tests__/typed-pipeline-topology.unit.test.ts +109 -4
- package/src/__tests__/typed-scene-pass-material-cache.integration.test.ts +126 -0
- package/src/__tests__/vertex-layouts-ssot.unit.test.ts +47 -0
- package/src/__tests__/visibility-extract.perf.test.ts +20 -8
- package/src/__tests__/visibility-instances.integration.test.ts +19 -7
- package/src/__tests__/visibility-producer-matrix.integration.test.ts +20 -9
- package/src/assembly/atmosphere-shader-prewarm.ts +38 -0
- package/src/assembly/dynamic-geometry-host.ts +887 -0
- package/src/assembly/dynamic-geometry-runtime.ts +71 -0
- package/src/assembly/factory.ts +4 -0
- package/src/assembly/gpu-driven-owner.ts +29 -0
- package/src/assembly/host-contract.ts +36 -0
- package/src/assembly/material/assembly.ts +38 -0
- package/src/assembly/material-shader-policy.ts +71 -28
- package/src/assembly/recovery/failure-location.ts +62 -0
- package/src/assembly/recovery/renderer-recover.ts +19 -17
- package/src/assembly/renderer-facade.ts +29 -0
- package/src/assembly/renderer-feature-inspection.ts +13 -0
- package/src/assembly/renderer-frame-transaction.ts +63 -0
- package/src/assembly/renderer-helpers.ts +26 -0
- package/src/assembly/renderer-inspection.ts +6 -0
- package/src/assembly/shader-prewarm-policy.ts +32 -0
- package/src/assembly/skin-palette-owner.ts +21 -0
- package/src/assembly/ssr-shader-prewarm.ts +41 -0
- package/src/assembly/webgpu-device-loss.ts +75 -0
- package/src/assembly/webgpu-pbr-ready.ts +232 -0
- package/src/assembly/webgpu-ready-mipmap.ts +26 -0
- package/src/assembly/webgpu-ready.ts +142 -121
- package/src/assembly/webgpu-renderer-bootstrap.ts +85 -0
- package/src/assembly/webgpu-renderer-contract.ts +69 -0
- package/src/assembly/webgpu-renderer-guards.ts +32 -0
- package/src/assembly/webgpu-renderer-observation.ts +43 -0
- package/src/assembly/webgpu-renderer-recovery-failure.ts +62 -0
- package/src/assembly/webgpu-renderer.ts +675 -614
- package/src/assembly/webgpu-vertex-layouts.ts +233 -87
- package/src/components/__tests__/camera-exposure.contract.unit.test.ts +153 -0
- package/src/components/camera.ts +287 -7
- package/src/components/index.ts +1 -0
- package/src/components/instances.ts +45 -18
- package/src/components/scene-instance.ts +2 -1
- package/src/components/screen-space-reflection.ts +21 -0
- package/src/components/sprite-animation.ts +3 -3
- package/src/components/sprite-instances.ts +1 -1
- package/src/device/gpu-residency.ts +96 -93
- package/src/device/mesh-residency-lifetime.ts +73 -0
- package/src/dynamic-geometry.ts +736 -0
- package/src/environment/background.ts +263 -0
- package/src/errors/gpu-driven.ts +39 -5
- package/src/errors/render.ts +27 -3
- package/src/extract/camera.ts +26 -1
- package/src/extract/gpu-driven.ts +185 -10
- package/src/features/host.ts +237 -19
- package/src/features/noise-texture.ts +91 -0
- package/src/features/plan.ts +553 -24
- package/src/features/prepared-gpu-work.ts +631 -49
- package/src/features/prepared-graphics-store.ts +31 -0
- package/src/features/prepared-graphics.ts +5 -0
- package/src/features/render-graph-compute.ts +41 -8
- package/src/features/render-graph-contribution.ts +141 -3
- package/src/features/render-graph-raster.ts +143 -30
- package/src/features/types.ts +11 -0
- package/src/fullscreen-post-process-pass.ts +3 -0
- package/src/gpu-driven/batch-topology.ts +424 -102
- package/src/gpu-driven/pbr-program.ts +31 -0
- package/src/gpu-driven/prepared-draw.ts +29 -4
- package/src/gpu-driven/production-raster.ts +2267 -694
- package/src/gpu-driven/shadow-views.ts +539 -0
- package/src/gpu-driven/view-gpu.ts +188 -41
- package/src/gpu-scene-schema.ts +52 -11
- package/src/gpu-scene.ts +186 -99
- package/src/gpu-texture-usage.ts +1 -0
- package/src/hdrp-buffers.ts +72 -36
- package/src/ibl/frame-resources.ts +38 -0
- package/src/ibl/skylight-bind-group.ts +5 -4
- package/src/index.ts +125 -1
- package/src/inspection-types.ts +191 -0
- package/src/instances-derived-bounds.ts +258 -34
- package/src/instances.ts +459 -150
- package/src/internal.ts +22 -0
- package/src/lifecycle.ts +2 -0
- package/src/material-row.ts +145 -0
- package/src/materials.ts +44 -8
- package/src/pbr-pipeline.ts +159 -17
- package/src/pipeline/standard-forward-lane.ts +52 -24
- package/src/pipeline/standard-output/__tests__/lut-admission.unit.test.ts +103 -0
- package/src/pipeline/standard-output/auto-exposure/__tests__/capability.unit.test.ts +40 -0
- package/src/pipeline/standard-output/auto-exposure/__tests__/gpu.contract.unit.test.ts +125 -0
- package/src/pipeline/standard-output/auto-exposure/__tests__/graph.contract.unit.test.ts +94 -0
- package/src/pipeline/standard-output/auto-exposure/__tests__/oracle.test.ts +108 -0
- package/src/pipeline/standard-output/auto-exposure/__tests__/preset.test.ts +26 -0
- package/src/pipeline/standard-output/auto-exposure/capability.ts +38 -0
- package/src/pipeline/standard-output/auto-exposure/gpu.ts +567 -0
- package/src/pipeline/standard-output/auto-exposure/graph.ts +221 -0
- package/src/pipeline/standard-output/auto-exposure/inspection.ts +231 -0
- package/src/pipeline/standard-output/auto-exposure/oracle.ts +291 -0
- package/src/pipeline/standard-output/auto-exposure/preset.ts +28 -0
- package/src/pipeline/standard-output/auto-exposure/state.ts +156 -0
- package/src/pipeline/standard-output/color-transform.ts +124 -0
- package/src/pipeline/standard-output/graph.ts +139 -0
- package/src/pipeline/standard-output/lut-admission.ts +121 -0
- package/src/pipeline/standard-output/lut-gpu.ts +399 -0
- package/src/pipeline/standard-output/lut-state.ts +176 -0
- package/src/pipeline/standard-output/resources.ts +121 -0
- package/src/pipeline/standard-output/types.ts +58 -0
- package/src/pipeline/standard-pipeline.ts +192 -59
- package/src/pipeline/standard-post.ts +186 -27
- package/src/pipeline-builder.ts +16 -6
- package/src/pipeline-spec-types.ts +4 -0
- package/src/pipeline-spec.ts +37 -29
- package/src/points-lines/standard-owner.ts +6 -14
- package/src/prepare/prepared-graphics-resolver.ts +9 -2
- package/src/record/__tests__/material-slot-plan.unit.test.ts +48 -0
- package/src/record/__tests__/mesh-ssbo.unit.test.ts +40 -1
- package/src/record/__tests__/recovery-pipeline.unit.test.ts +2 -29
- package/src/record/__tests__/sprite-material-abi.unit.test.ts +36 -5
- package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +45 -0
- package/src/record/__tests__/view-ubo-layout.unit.test.ts +5 -0
- package/src/record/dynamic-geometry-consumption.ts +59 -0
- package/src/record/frame-lighting.ts +12 -11
- package/src/record/frame-snapshot.ts +133 -23
- package/src/record/frame-targets.ts +9 -0
- package/src/record/frame.ts +727 -133
- package/src/record/main-pass-geometry.ts +162 -98
- package/src/record/main-pass-material.ts +115 -26
- package/src/record/main-pass-sprite-draws.ts +18 -107
- package/src/record/main-pass.ts +78 -8
- package/src/record/material-uniforms.ts +1 -1
- package/src/record/mesh-ssbo.ts +59 -15
- package/src/record/prepared-material-bindings.ts +234 -0
- package/src/record/recovery-pipeline.ts +59 -136
- package/src/record/render-context.ts +92 -22
- package/src/record/shadow-pass.ts +1231 -209
- package/src/record/skybox-post-pass.ts +14 -3
- package/src/record/typed-frame-graph.ts +1006 -53
- package/src/record/view-ubo.ts +11 -0
- package/src/recovery/render-system-candidate.ts +90 -66
- package/src/recovery/render-system-roots.ts +113 -0
- package/src/recovery/types.ts +77 -0
- package/src/reflection/record-owner.ts +26 -54
- package/src/render-contract.ts +219 -25
- package/src/render-graph-primitives.ts +6 -2
- package/src/render-pipeline.ts +70 -1
- package/src/render-system-extract-tail.ts +409 -160
- package/src/render-system-extract.ts +376 -102
- package/src/render-system-projections.ts +241 -0
- package/src/render-system.ts +692 -791
- package/src/scene/render-scene-types.ts +13 -4
- package/src/scene/render-scene.ts +569 -355
- package/src/scene/shadow-visibility.ts +21 -0
- package/src/ssr/admission.ts +380 -14
- package/src/ssr/compose.ts +144 -0
- package/src/ssr/errors.ts +48 -0
- package/src/ssr/graph.ts +777 -0
- package/src/ssr/history.ts +436 -0
- package/src/ssr/hiz.ts +124 -0
- package/src/ssr/inspection.ts +124 -0
- package/src/ssr/resources.ts +202 -0
- package/src/ssr/temporal.ts +164 -0
- package/src/systems/skin-palette-allocator.ts +495 -148
- package/src/systems/skin-palette-types.ts +17 -0
- package/src/systems/transparent-dispatch.ts +90 -0
- package/src/targets/material-source.ts +34 -0
- package/src/temporal/coverage.ts +1 -1
- package/src/temporal/frame-coordinator.ts +23 -2
- package/src/temporal/gpu.ts +74 -12
- package/src/temporal/history.ts +3 -1
- package/src/temporal/inspection.ts +2 -1
- package/src/temporal/standard-scene-data.ts +3 -1
- package/src/temporal/temporal-view.ts +3 -0
- package/src/transmission/__tests__/standard-transmission.dawn.test.ts +204 -139
- package/src/typed-render-graph-primitives.ts +266 -74
- package/src/typed-shadow-passes.ts +122 -12
- package/src/volume/temporal.ts +10 -0
- package/dist/chunk-ADHHVYLW.mjs.map +0 -1
- package/dist/chunk-FJ6P52EE.mjs.map +0 -1
- package/dist/chunk-GE3SDD72.mjs.map +0 -1
- package/dist/chunk-GF523LHF.mjs.map +0 -1
- package/dist/chunk-HKXTW355.mjs.map +0 -1
- package/dist/chunk-JDWARUOI.mjs.map +0 -1
- package/dist/chunk-KM2NOX2I.mjs.map +0 -1
- package/dist/chunk-TMIASV2N.mjs.map +0 -1
- package/dist/chunk-XDP6XE5V.mjs.map +0 -1
- package/dist/chunk-ZZ4YQ474.mjs.map +0 -1
- package/src/__tests__/instances-world-ownership.integration.test.ts +0 -62
- package/src/scene/__tests__/changed-block-summary.candidate.test.ts +0 -36
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { err, ok, type Result } from '@forgeax/engine-types';
|
|
2
|
+
import type { RenderPipelineFrame } from '../../../render-pipeline';
|
|
3
|
+
import { AUTO_EXPOSURE_PRESET_V1 } from './preset';
|
|
4
|
+
|
|
5
|
+
export const AUTO_EXPOSURE_GRAPH_PASSES = [
|
|
6
|
+
'auto-exposure-clear',
|
|
7
|
+
'auto-exposure-histogram',
|
|
8
|
+
'auto-exposure-adapt',
|
|
9
|
+
] as const;
|
|
10
|
+
|
|
11
|
+
/** The logical meter stages are encoded inside one physical compute pass. */
|
|
12
|
+
export const AUTO_EXPOSURE_FUSED_GRAPH_PASS = 'auto-exposure-meter' as const;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* The meter keeps one physical compute pass, but separates its ordered
|
|
16
|
+
* clear/histogram/adapt dispatches so the histogram cohort can synchronize
|
|
17
|
+
* across workgroups through the command stream. Histogram uses 32 fixed
|
|
18
|
+
* workgroups of 256 invocations; the dispatch is intentionally independent of
|
|
19
|
+
* output resolution.
|
|
20
|
+
*/
|
|
21
|
+
export const AUTO_EXPOSURE_HISTOGRAM_WORKGROUP_SIZE = 256 as const;
|
|
22
|
+
export const AUTO_EXPOSURE_HISTOGRAM_WORKGROUP_COUNT = 32 as const;
|
|
23
|
+
export const AUTO_EXPOSURE_HISTOGRAM_DISPATCH = Object.freeze({
|
|
24
|
+
x: 4,
|
|
25
|
+
y: 8,
|
|
26
|
+
z: 1,
|
|
27
|
+
} as const);
|
|
28
|
+
export const AUTO_EXPOSURE_ADAPT_WORKGROUP_SIZE = 64 as const;
|
|
29
|
+
export const AUTO_EXPOSURE_CLEAR_WORKGROUP_SIZE = 256 as const;
|
|
30
|
+
|
|
31
|
+
export type AutoExposureGraphPassName = (typeof AUTO_EXPOSURE_GRAPH_PASSES)[number];
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Built-in auto-exposure work is recorded synchronously during graph
|
|
35
|
+
* execution. Prefer the renderer's handle-first factory so the first frame
|
|
36
|
+
* does not become a false pending shader failure after async warm-up has
|
|
37
|
+
* already supplied a usable module.
|
|
38
|
+
*/
|
|
39
|
+
export function resolveAutoExposureShaderModuleFactory(
|
|
40
|
+
runtime: Pick<
|
|
41
|
+
RenderPipelineFrame['runtime'],
|
|
42
|
+
'immediateShaderModuleFactory' | 'shaderModuleFactory'
|
|
43
|
+
>,
|
|
44
|
+
): NonNullable<RenderPipelineFrame['runtime']['shaderModuleFactory']> | undefined {
|
|
45
|
+
return runtime.immediateShaderModuleFactory ?? runtime.shaderModuleFactory;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface AutoExposureGraphPass {
|
|
49
|
+
readonly name: AutoExposureGraphPassName;
|
|
50
|
+
readonly kind: 'compute';
|
|
51
|
+
readonly workgroupSize: readonly [number, number, number];
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface AutoExposureGraphPlan {
|
|
55
|
+
readonly resolution: Readonly<{ width: number; height: number }>;
|
|
56
|
+
readonly sampleBounds: Readonly<{ x: 4; y: 4 }>;
|
|
57
|
+
readonly sampleCount: number;
|
|
58
|
+
readonly dispatch: Readonly<{ x: number; y: number; z: 1 }>;
|
|
59
|
+
readonly histogramBytes: 1024;
|
|
60
|
+
readonly stateBytes: 32;
|
|
61
|
+
readonly passes: readonly AutoExposureGraphPass[];
|
|
62
|
+
readonly physicalPass: typeof AUTO_EXPOSURE_FUSED_GRAPH_PASS;
|
|
63
|
+
readonly physicalPassCount: 1;
|
|
64
|
+
readonly resources: readonly ['auto-exposure-histogram', 'auto-exposure-state'];
|
|
65
|
+
readonly cpuReadbackCount: 0;
|
|
66
|
+
readonly cpuUploadCount: 0;
|
|
67
|
+
readonly candidateAvailableSameFrame: true;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export class AutoExposureGraphError extends Error {
|
|
71
|
+
readonly code = 'auto-exposure-graph-invalid' as const;
|
|
72
|
+
readonly expected: string;
|
|
73
|
+
readonly hint: string;
|
|
74
|
+
readonly detail: Readonly<{ field: string; actual: string }>;
|
|
75
|
+
|
|
76
|
+
constructor(field: string, actual: string, expected: string) {
|
|
77
|
+
super(`auto-exposure-graph-invalid: ${field} ${actual}; expected ${expected}`);
|
|
78
|
+
this.name = 'AutoExposureGraphError';
|
|
79
|
+
this.expected = expected;
|
|
80
|
+
this.hint = `repair the ${field} declaration before recording the auto exposure graph`;
|
|
81
|
+
this.detail = Object.freeze({ field, actual });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function positiveDimension(value: number): boolean {
|
|
86
|
+
return Number.isInteger(value) && value > 0;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function createAutoExposureGraphPlan(input: {
|
|
90
|
+
readonly width: number;
|
|
91
|
+
readonly height: number;
|
|
92
|
+
}): AutoExposureGraphPlan {
|
|
93
|
+
if (!positiveDimension(input.width) || !positiveDimension(input.height)) {
|
|
94
|
+
throw new RangeError(
|
|
95
|
+
'Auto exposure graph resolution must contain positive integer dimensions.',
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
const block = AUTO_EXPOSURE_PRESET_V1.sampleBlockSize;
|
|
99
|
+
const histogramDispatch = AUTO_EXPOSURE_HISTOGRAM_DISPATCH;
|
|
100
|
+
return {
|
|
101
|
+
resolution: Object.freeze({ width: input.width, height: input.height }),
|
|
102
|
+
sampleBounds: Object.freeze({ x: block, y: block }),
|
|
103
|
+
sampleCount: 1,
|
|
104
|
+
dispatch: histogramDispatch,
|
|
105
|
+
histogramBytes: (256 * 4) as 1024,
|
|
106
|
+
stateBytes: (2 * 16) as 32,
|
|
107
|
+
physicalPass: AUTO_EXPOSURE_FUSED_GRAPH_PASS,
|
|
108
|
+
physicalPassCount: 1,
|
|
109
|
+
passes: Object.freeze([
|
|
110
|
+
{
|
|
111
|
+
name: 'auto-exposure-clear',
|
|
112
|
+
kind: 'compute',
|
|
113
|
+
workgroupSize: [AUTO_EXPOSURE_CLEAR_WORKGROUP_SIZE, 1, 1],
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
name: 'auto-exposure-histogram',
|
|
117
|
+
kind: 'compute',
|
|
118
|
+
workgroupSize: [AUTO_EXPOSURE_HISTOGRAM_WORKGROUP_SIZE, 1, 1],
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
name: 'auto-exposure-adapt',
|
|
122
|
+
kind: 'compute',
|
|
123
|
+
workgroupSize: [AUTO_EXPOSURE_ADAPT_WORKGROUP_SIZE, 1, 1],
|
|
124
|
+
},
|
|
125
|
+
]),
|
|
126
|
+
resources: Object.freeze(['auto-exposure-histogram', 'auto-exposure-state']),
|
|
127
|
+
cpuReadbackCount: 0,
|
|
128
|
+
cpuUploadCount: 0,
|
|
129
|
+
candidateAvailableSameFrame: true,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export function validateAutoExposureGraphPlan(
|
|
134
|
+
plan: AutoExposureGraphPlan,
|
|
135
|
+
): Result<AutoExposureGraphPlan, AutoExposureGraphError> {
|
|
136
|
+
const expectedPasses = [...AUTO_EXPOSURE_GRAPH_PASSES];
|
|
137
|
+
if (
|
|
138
|
+
plan.passes.length !== expectedPasses.length ||
|
|
139
|
+
plan.passes.some(
|
|
140
|
+
(pass, index) => pass.name !== expectedPasses[index] || pass.kind !== 'compute',
|
|
141
|
+
)
|
|
142
|
+
) {
|
|
143
|
+
return err(
|
|
144
|
+
new AutoExposureGraphError(
|
|
145
|
+
'passes',
|
|
146
|
+
plan.passes.map((pass) => pass.name).join(','),
|
|
147
|
+
expectedPasses.join(','),
|
|
148
|
+
),
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
const expectedDispatch = AUTO_EXPOSURE_HISTOGRAM_DISPATCH;
|
|
152
|
+
if (
|
|
153
|
+
plan.dispatch.x !== expectedDispatch.x ||
|
|
154
|
+
plan.dispatch.y !== expectedDispatch.y ||
|
|
155
|
+
plan.dispatch.z !== expectedDispatch.z ||
|
|
156
|
+
plan.dispatch.x * plan.dispatch.y * plan.dispatch.z !== AUTO_EXPOSURE_HISTOGRAM_WORKGROUP_COUNT
|
|
157
|
+
) {
|
|
158
|
+
return err(
|
|
159
|
+
new AutoExposureGraphError(
|
|
160
|
+
'dispatch',
|
|
161
|
+
`${plan.dispatch.x}x${plan.dispatch.y}x${plan.dispatch.z}`,
|
|
162
|
+
`${expectedDispatch.x}x${expectedDispatch.y}x${expectedDispatch.z}`,
|
|
163
|
+
),
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
const expectedWorkgroupSizes = [
|
|
167
|
+
[AUTO_EXPOSURE_CLEAR_WORKGROUP_SIZE, 1, 1],
|
|
168
|
+
[AUTO_EXPOSURE_HISTOGRAM_WORKGROUP_SIZE, 1, 1],
|
|
169
|
+
[AUTO_EXPOSURE_ADAPT_WORKGROUP_SIZE, 1, 1],
|
|
170
|
+
] as const;
|
|
171
|
+
if (
|
|
172
|
+
plan.passes.some((pass, index) => {
|
|
173
|
+
const expected = expectedWorkgroupSizes[index];
|
|
174
|
+
return (
|
|
175
|
+
expected === undefined ||
|
|
176
|
+
pass.workgroupSize.some((value, dimension) => value !== expected[dimension])
|
|
177
|
+
);
|
|
178
|
+
})
|
|
179
|
+
) {
|
|
180
|
+
return err(
|
|
181
|
+
new AutoExposureGraphError(
|
|
182
|
+
'workgroupSize',
|
|
183
|
+
plan.passes.map((pass) => pass.workgroupSize.join('x')).join(','),
|
|
184
|
+
expectedWorkgroupSizes.map((size) => size.join('x')).join(','),
|
|
185
|
+
),
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
if (plan.histogramBytes !== 1024) {
|
|
189
|
+
return err(new AutoExposureGraphError('histogramBytes', String(plan.histogramBytes), '1024'));
|
|
190
|
+
}
|
|
191
|
+
if (plan.stateBytes !== 32) {
|
|
192
|
+
return err(new AutoExposureGraphError('stateBytes', String(plan.stateBytes), '32'));
|
|
193
|
+
}
|
|
194
|
+
if (plan.physicalPass !== AUTO_EXPOSURE_FUSED_GRAPH_PASS) {
|
|
195
|
+
return err(
|
|
196
|
+
new AutoExposureGraphError(
|
|
197
|
+
'physicalPass',
|
|
198
|
+
String(plan.physicalPass),
|
|
199
|
+
AUTO_EXPOSURE_FUSED_GRAPH_PASS,
|
|
200
|
+
),
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
if (plan.physicalPassCount !== 1) {
|
|
204
|
+
return err(
|
|
205
|
+
new AutoExposureGraphError('physicalPassCount', String(plan.physicalPassCount), '1'),
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
if (plan.cpuReadbackCount !== 0 || plan.cpuUploadCount !== 0) {
|
|
209
|
+
return err(
|
|
210
|
+
new AutoExposureGraphError(
|
|
211
|
+
'cpuTransfers',
|
|
212
|
+
`${plan.cpuReadbackCount}/${plan.cpuUploadCount}`,
|
|
213
|
+
'0/0',
|
|
214
|
+
),
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
if (!plan.candidateAvailableSameFrame) {
|
|
218
|
+
return err(new AutoExposureGraphError('candidateAvailableSameFrame', 'false', 'true'));
|
|
219
|
+
}
|
|
220
|
+
return ok(plan);
|
|
221
|
+
}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import type { CameraExposure } from '../../../components/camera';
|
|
2
|
+
|
|
3
|
+
export type AutoExposureErrorCode =
|
|
4
|
+
| 'auto-exposure-invalid-parameter'
|
|
5
|
+
| 'auto-exposure-capability-unavailable'
|
|
6
|
+
| 'auto-exposure-stale-generation'
|
|
7
|
+
| 'auto-exposure-stage-failed';
|
|
8
|
+
|
|
9
|
+
export interface AutoExposureInvalidParameterDetail {
|
|
10
|
+
readonly field: string;
|
|
11
|
+
readonly value: number;
|
|
12
|
+
readonly expected: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface AutoExposureCapabilityUnavailableDetail {
|
|
16
|
+
readonly capability: 'compute' | 'storage-buffer' | 'float-filterable';
|
|
17
|
+
readonly generation: number;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface AutoExposureStaleGenerationDetail {
|
|
21
|
+
readonly expectedGeneration: number;
|
|
22
|
+
readonly actualGeneration: number;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface AutoExposureStageFailedDetail {
|
|
26
|
+
readonly stage: 'prepare' | 'record';
|
|
27
|
+
readonly operation: string;
|
|
28
|
+
readonly cause: unknown;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export type AutoExposureErrorDetailByCode = {
|
|
32
|
+
'auto-exposure-invalid-parameter': AutoExposureInvalidParameterDetail;
|
|
33
|
+
'auto-exposure-capability-unavailable': AutoExposureCapabilityUnavailableDetail;
|
|
34
|
+
'auto-exposure-stale-generation': AutoExposureStaleGenerationDetail;
|
|
35
|
+
'auto-exposure-stage-failed': AutoExposureStageFailedDetail;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export type AutoExposureErrorDetail = AutoExposureErrorDetailByCode[AutoExposureErrorCode];
|
|
39
|
+
|
|
40
|
+
export class AutoExposureInvalidParameterError extends Error {
|
|
41
|
+
readonly code = 'auto-exposure-invalid-parameter' as const;
|
|
42
|
+
readonly expected = ERROR_POLICY[this.code].expected;
|
|
43
|
+
readonly hint = ERROR_POLICY[this.code].hint;
|
|
44
|
+
constructor(readonly detail: AutoExposureInvalidParameterDetail) {
|
|
45
|
+
super(`auto-exposure-invalid-parameter: ${detail.field}`);
|
|
46
|
+
this.name = 'AutoExposureInvalidParameterError';
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export class AutoExposureCapabilityUnavailableError extends Error {
|
|
51
|
+
readonly code = 'auto-exposure-capability-unavailable' as const;
|
|
52
|
+
readonly expected = ERROR_POLICY[this.code].expected;
|
|
53
|
+
readonly hint = ERROR_POLICY[this.code].hint;
|
|
54
|
+
constructor(readonly detail: AutoExposureCapabilityUnavailableDetail) {
|
|
55
|
+
super(`auto-exposure-capability-unavailable: ${detail.capability}`);
|
|
56
|
+
this.name = 'AutoExposureCapabilityUnavailableError';
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export class AutoExposureStaleGenerationError extends Error {
|
|
61
|
+
readonly code = 'auto-exposure-stale-generation' as const;
|
|
62
|
+
readonly expected = ERROR_POLICY[this.code].expected;
|
|
63
|
+
readonly hint = ERROR_POLICY[this.code].hint;
|
|
64
|
+
constructor(readonly detail: AutoExposureStaleGenerationDetail) {
|
|
65
|
+
super(
|
|
66
|
+
`auto-exposure-stale-generation: ${detail.actualGeneration} != ${detail.expectedGeneration}`,
|
|
67
|
+
);
|
|
68
|
+
this.name = 'AutoExposureStaleGenerationError';
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export class AutoExposureStageFailedError extends Error {
|
|
73
|
+
readonly code = 'auto-exposure-stage-failed' as const;
|
|
74
|
+
readonly expected = ERROR_POLICY[this.code].expected;
|
|
75
|
+
readonly hint = ERROR_POLICY[this.code].hint;
|
|
76
|
+
constructor(readonly detail: AutoExposureStageFailedDetail) {
|
|
77
|
+
super(`auto-exposure-stage-failed: ${detail.operation}`);
|
|
78
|
+
this.name = 'AutoExposureStageFailedError';
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export type AutoExposureError =
|
|
83
|
+
| AutoExposureInvalidParameterError
|
|
84
|
+
| AutoExposureCapabilityUnavailableError
|
|
85
|
+
| AutoExposureStaleGenerationError
|
|
86
|
+
| AutoExposureStageFailedError;
|
|
87
|
+
|
|
88
|
+
type AutoExposureErrorInput = {
|
|
89
|
+
[C in AutoExposureErrorCode]: {
|
|
90
|
+
readonly code: C;
|
|
91
|
+
readonly detail: AutoExposureErrorDetailByCode[C];
|
|
92
|
+
};
|
|
93
|
+
}[AutoExposureErrorCode];
|
|
94
|
+
|
|
95
|
+
export type AutoExposureErrorRecord = {
|
|
96
|
+
[C in AutoExposureErrorCode]: {
|
|
97
|
+
readonly code: C;
|
|
98
|
+
readonly expected: string;
|
|
99
|
+
readonly hint: string;
|
|
100
|
+
readonly detail: AutoExposureErrorDetailByCode[C];
|
|
101
|
+
};
|
|
102
|
+
}[AutoExposureErrorCode];
|
|
103
|
+
|
|
104
|
+
export type AutoExposureResetReason =
|
|
105
|
+
| 'camera-change'
|
|
106
|
+
| 'manual-mode'
|
|
107
|
+
| 'device-lost'
|
|
108
|
+
| 'stale-generation';
|
|
109
|
+
|
|
110
|
+
export interface AutoExposureCost {
|
|
111
|
+
readonly histogramBytes: number;
|
|
112
|
+
/** Logical stages retained for the inspect contract: clear, histogram, adapt. */
|
|
113
|
+
readonly passCount: number;
|
|
114
|
+
/** The logical stages share one real timestamped compute pass. */
|
|
115
|
+
readonly physicalPassCount: number;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export interface AutoExposureReceipt {
|
|
119
|
+
readonly frameId: number;
|
|
120
|
+
readonly committed: boolean;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Describes where the detached `actual` value came from. A successful live
|
|
125
|
+
* GPU submission is intentionally not a CPU observation: its numeric result
|
|
126
|
+
* remains resident in the GPU state buffer until an explicit readback owner
|
|
127
|
+
* is requested. Keeping that state distinct prevents fallback from being
|
|
128
|
+
* presented as the measured exposure.
|
|
129
|
+
*/
|
|
130
|
+
export type AutoExposureActualState = 'accepted' | 'fallback' | 'gpu-resident';
|
|
131
|
+
|
|
132
|
+
export interface AutoExposureInspection {
|
|
133
|
+
readonly requested: CameraExposure;
|
|
134
|
+
readonly actual: number | null;
|
|
135
|
+
readonly actualState: AutoExposureActualState;
|
|
136
|
+
readonly fallback: number;
|
|
137
|
+
readonly lastKnownGood: number;
|
|
138
|
+
readonly targetGeneration: number;
|
|
139
|
+
readonly recentFailure?: AutoExposureError;
|
|
140
|
+
readonly reset: readonly AutoExposureResetReason[];
|
|
141
|
+
readonly cost: AutoExposureCost;
|
|
142
|
+
readonly receipt: AutoExposureReceipt;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export interface AutoExposureInspectionInput
|
|
146
|
+
extends Omit<AutoExposureInspection, 'actualState' | 'recentFailure'> {
|
|
147
|
+
readonly actualState?: AutoExposureActualState;
|
|
148
|
+
readonly recentFailure?: AutoExposureError | AutoExposureErrorRecord;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const ERROR_POLICY: Readonly<
|
|
152
|
+
Record<AutoExposureErrorCode, { readonly expected: string; readonly hint: string }>
|
|
153
|
+
> = {
|
|
154
|
+
'auto-exposure-invalid-parameter': {
|
|
155
|
+
expected: 'camera auto-exposure parameters are finite and within their declared ranges',
|
|
156
|
+
hint: 'inspect the field and provide a finite value before rebuilding the camera output',
|
|
157
|
+
},
|
|
158
|
+
'auto-exposure-capability-unavailable': {
|
|
159
|
+
expected: 'the auto-exposure stage has the required device capability',
|
|
160
|
+
hint: 'inspect live capabilities and retry the same camera generation',
|
|
161
|
+
},
|
|
162
|
+
'auto-exposure-stale-generation': {
|
|
163
|
+
expected: 'the prepared auto-exposure state matches the camera target generation',
|
|
164
|
+
hint: 'discard stale prepared state and rebuild from the latest camera snapshot',
|
|
165
|
+
},
|
|
166
|
+
'auto-exposure-stage-failed': {
|
|
167
|
+
expected: 'the auto-exposure stage completes its declared operation',
|
|
168
|
+
hint: 'inspect the structured cause, preserve lastKnownGood, and retry the stage',
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
export function createAutoExposureError(
|
|
173
|
+
input: AutoExposureErrorInput | AutoExposureErrorRecord,
|
|
174
|
+
): AutoExposureError {
|
|
175
|
+
if (
|
|
176
|
+
input instanceof AutoExposureInvalidParameterError ||
|
|
177
|
+
input instanceof AutoExposureCapabilityUnavailableError ||
|
|
178
|
+
input instanceof AutoExposureStaleGenerationError ||
|
|
179
|
+
input instanceof AutoExposureStageFailedError
|
|
180
|
+
) {
|
|
181
|
+
return input;
|
|
182
|
+
}
|
|
183
|
+
switch (input.code) {
|
|
184
|
+
case 'auto-exposure-invalid-parameter':
|
|
185
|
+
return new AutoExposureInvalidParameterError(input.detail);
|
|
186
|
+
case 'auto-exposure-capability-unavailable':
|
|
187
|
+
return new AutoExposureCapabilityUnavailableError(input.detail);
|
|
188
|
+
case 'auto-exposure-stale-generation':
|
|
189
|
+
return new AutoExposureStaleGenerationError(input.detail);
|
|
190
|
+
case 'auto-exposure-stage-failed':
|
|
191
|
+
return new AutoExposureStageFailedError(input.detail);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function cloneExposure(exposure: CameraExposure): CameraExposure {
|
|
196
|
+
if (exposure.kind === 'manual') return { ...exposure };
|
|
197
|
+
return {
|
|
198
|
+
...exposure,
|
|
199
|
+
rangeEv: [exposure.rangeEv[0], exposure.rangeEv[1]],
|
|
200
|
+
rates: [exposure.rates[0], exposure.rates[1]],
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function cloneFailure(error: AutoExposureError | undefined): AutoExposureError | undefined {
|
|
205
|
+
if (error === undefined) return undefined;
|
|
206
|
+
return Object.freeze({
|
|
207
|
+
...error,
|
|
208
|
+
detail: Object.freeze({ ...error.detail }),
|
|
209
|
+
}) as AutoExposureError;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/** Project detached bounded facts; GPU handles and histogram buckets never cross this boundary. */
|
|
213
|
+
export function createAutoExposureInspection(
|
|
214
|
+
input: AutoExposureInspectionInput,
|
|
215
|
+
): Readonly<AutoExposureInspection> {
|
|
216
|
+
const base = {
|
|
217
|
+
requested: cloneExposure(input.requested),
|
|
218
|
+
actual: input.actual,
|
|
219
|
+
actualState: input.actualState ?? (input.actual === null ? 'gpu-resident' : 'accepted'),
|
|
220
|
+
fallback: input.fallback,
|
|
221
|
+
lastKnownGood: input.lastKnownGood,
|
|
222
|
+
targetGeneration: input.targetGeneration,
|
|
223
|
+
reset: Object.freeze([...input.reset]),
|
|
224
|
+
cost: Object.freeze({ ...input.cost }),
|
|
225
|
+
receipt: Object.freeze({ ...input.receipt }),
|
|
226
|
+
};
|
|
227
|
+
if (input.recentFailure === undefined) return Object.freeze(base);
|
|
228
|
+
const recentFailure = cloneFailure(createAutoExposureError(input.recentFailure));
|
|
229
|
+
if (recentFailure === undefined) return Object.freeze(base);
|
|
230
|
+
return Object.freeze({ ...base, recentFailure });
|
|
231
|
+
}
|