@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
|
@@ -1,10 +1,35 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest';
|
|
2
2
|
import {
|
|
3
|
+
buildDispatchPlan,
|
|
3
4
|
buildMaterialSlotPlan,
|
|
4
5
|
findRenderablePrefixForSlotCapacity,
|
|
5
6
|
materialSlotCountForPrefix,
|
|
6
7
|
} from '../frame';
|
|
7
8
|
|
|
9
|
+
function validatedRow(renderableIndex: number) {
|
|
10
|
+
return {
|
|
11
|
+
source: {
|
|
12
|
+
material: { materialShaderId: 'forgeax::default-unlit' },
|
|
13
|
+
materials: [{ materialShaderId: 'forgeax::default-unlit' }],
|
|
14
|
+
},
|
|
15
|
+
mesh: {},
|
|
16
|
+
renderableIndex,
|
|
17
|
+
renderState: undefined,
|
|
18
|
+
stencilReference: undefined,
|
|
19
|
+
} as never;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function ceilingInternals(slotCount: number) {
|
|
23
|
+
return {
|
|
24
|
+
growMeshSsbo: () => ({
|
|
25
|
+
ok: false as const,
|
|
26
|
+
code: 'mesh-ssbo-ceiling-reached' as const,
|
|
27
|
+
degradedToSlotCount: slotCount,
|
|
28
|
+
}),
|
|
29
|
+
meshSsboState: { slotCount },
|
|
30
|
+
} as never;
|
|
31
|
+
}
|
|
32
|
+
|
|
8
33
|
describe('material slot plan', () => {
|
|
9
34
|
it('interns repeated snapshot identities across renderables', () => {
|
|
10
35
|
const a = {};
|
|
@@ -41,4 +66,27 @@ describe('material slot plan', () => {
|
|
|
41
66
|
expect(findRenderablePrefixForSlotCapacity(indices, 5)).toBe(3);
|
|
42
67
|
expect(materialSlotCountForPrefix(indices, 3)).toBe(5);
|
|
43
68
|
});
|
|
69
|
+
|
|
70
|
+
it('keeps retained shadow rows inside the ceiling when the primary view is empty', () => {
|
|
71
|
+
const shadowRows = [validatedRow(0), validatedRow(1), validatedRow(2)];
|
|
72
|
+
const plan = buildDispatchPlan(ceilingInternals(2), [], [], [], shadowRows);
|
|
73
|
+
|
|
74
|
+
expect(plan.validatedOrdered).toHaveLength(0);
|
|
75
|
+
expect(plan.shadowValidatedOrdered).toEqual(shadowRows.slice(0, 2));
|
|
76
|
+
expect(plan.validatedOrdered.length + plan.shadowValidatedOrdered.length).toBeLessThanOrEqual(
|
|
77
|
+
2,
|
|
78
|
+
);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it('reserves the primary rows before retained shadow rows on a mixed ceiling', () => {
|
|
82
|
+
const primaryRows = [validatedRow(0), validatedRow(1)];
|
|
83
|
+
const shadowRows = [validatedRow(2), validatedRow(3)];
|
|
84
|
+
const plan = buildDispatchPlan(ceilingInternals(3), primaryRows, [], [], shadowRows);
|
|
85
|
+
|
|
86
|
+
expect(plan.validatedOrdered).toEqual(primaryRows);
|
|
87
|
+
expect(plan.shadowValidatedOrdered).toEqual(shadowRows.slice(0, 1));
|
|
88
|
+
expect(plan.validatedOrdered.length + plan.shadowValidatedOrdered.length).toBeLessThanOrEqual(
|
|
89
|
+
3,
|
|
90
|
+
);
|
|
91
|
+
});
|
|
44
92
|
});
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { err, ok } from '@forgeax/engine-types';
|
|
1
2
|
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { getOrCreateFromChain } from '../mesh-ssbo';
|
|
3
|
+
import { getOrCreateFromChain, getOrCreateFromChainResult } from '../mesh-ssbo';
|
|
3
4
|
|
|
4
5
|
describe('mesh bind-group cache chains', () => {
|
|
5
6
|
it('keeps variable-depth material resource chains isolated', () => {
|
|
@@ -35,4 +36,42 @@ describe('mesh bind-group cache chains', () => {
|
|
|
35
36
|
expect(long).not.toBe(short);
|
|
36
37
|
expect(counts.createBindGroup).toBe(2);
|
|
37
38
|
});
|
|
39
|
+
|
|
40
|
+
it('propagates bind-group creation failures without poisoning the cache', () => {
|
|
41
|
+
const root = new WeakMap<object, unknown>();
|
|
42
|
+
const resource = {};
|
|
43
|
+
const counts = { createBindGroup: 0, keys: [] as string[] };
|
|
44
|
+
const failure = { code: 'rhi-device-lost' };
|
|
45
|
+
const failed = getOrCreateFromChainResult(
|
|
46
|
+
root,
|
|
47
|
+
[resource],
|
|
48
|
+
'retryable',
|
|
49
|
+
() => err(failure),
|
|
50
|
+
counts,
|
|
51
|
+
);
|
|
52
|
+
expect(failed).toEqual({ ok: false, error: failure });
|
|
53
|
+
expect(counts.createBindGroup).toBe(0);
|
|
54
|
+
|
|
55
|
+
const created = { id: 'created' } as never;
|
|
56
|
+
const recovered = getOrCreateFromChainResult(
|
|
57
|
+
root,
|
|
58
|
+
[resource],
|
|
59
|
+
'retryable',
|
|
60
|
+
() => ok(created),
|
|
61
|
+
counts,
|
|
62
|
+
);
|
|
63
|
+
expect(recovered).toEqual({ ok: true, value: created });
|
|
64
|
+
expect(counts.createBindGroup).toBe(1);
|
|
65
|
+
expect(
|
|
66
|
+
getOrCreateFromChainResult(
|
|
67
|
+
root,
|
|
68
|
+
[resource],
|
|
69
|
+
'retryable',
|
|
70
|
+
() => {
|
|
71
|
+
throw new Error('cache miss after recovery');
|
|
72
|
+
},
|
|
73
|
+
counts,
|
|
74
|
+
),
|
|
75
|
+
).toEqual({ ok: true, value: created });
|
|
76
|
+
});
|
|
38
77
|
});
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import { deriveVertexLayoutProjection } from '@forgeax/engine-geometry';
|
|
2
2
|
import { describe, expect, it } from 'vitest';
|
|
3
3
|
import { makeZeroCameraFallbackSnapshot, type ValidatedRenderable } from '../frame-snapshot';
|
|
4
|
-
import {
|
|
5
|
-
createRecoveryColdWorkGuard,
|
|
6
|
-
prepareRecoveryPipelineReadiness,
|
|
7
|
-
} from '../recovery-pipeline';
|
|
4
|
+
import { prepareRecoveryPipelineReadiness } from '../recovery-pipeline';
|
|
8
5
|
import type { PipelineState, RenderSystemInternals } from '../render-context';
|
|
9
6
|
|
|
10
7
|
function probeRenderable(probe: boolean): ValidatedRenderable {
|
|
@@ -69,7 +66,7 @@ function recoveryReadinessFor(
|
|
|
69
66
|
});
|
|
70
67
|
}
|
|
71
68
|
|
|
72
|
-
describe('recovery
|
|
69
|
+
describe('recovery prepared pipeline cache', () => {
|
|
73
70
|
it('prepares the probe-enabled Standard PBR variant used by the live record path', () => {
|
|
74
71
|
const readiness = recoveryReadinessFor(probeRenderable(true));
|
|
75
72
|
const standardPbr = readiness.pipelineSpecs.find(
|
|
@@ -97,28 +94,4 @@ describe('recovery first-frame cold-work guard', () => {
|
|
|
97
94
|
expect(standardPbr?.shader.variantSet).toContain('REFLECTION_FALLBACK_AVAILABLE=true');
|
|
98
95
|
expect(standardPbr?.attachments.colorFormats).toEqual(['rgba16float', 'rgba16float']);
|
|
99
96
|
});
|
|
100
|
-
|
|
101
|
-
it('accepts a prepared candidate with no first-frame cold work', () => {
|
|
102
|
-
const guard = createRecoveryColdWorkGuard();
|
|
103
|
-
|
|
104
|
-
guard.arm();
|
|
105
|
-
expect(() => guard.finish()).not.toThrow();
|
|
106
|
-
expect(() => guard.finish()).not.toThrow();
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
it.each([
|
|
110
|
-
[
|
|
111
|
-
'pipeline',
|
|
112
|
-
(guard: ReturnType<typeof createRecoveryColdWorkGuard>) => guard.notePipelineColdWork(),
|
|
113
|
-
],
|
|
114
|
-
[
|
|
115
|
-
'upload',
|
|
116
|
-
(guard: ReturnType<typeof createRecoveryColdWorkGuard>) => guard.noteUploadColdWork(),
|
|
117
|
-
],
|
|
118
|
-
] as const)('hard-fails a first-frame %s miss before submission', (_kind, note) => {
|
|
119
|
-
const guard = createRecoveryColdWorkGuard();
|
|
120
|
-
|
|
121
|
-
guard.arm();
|
|
122
|
-
expect(() => note(guard)).toThrow(/recovery first frame performed cold/);
|
|
123
|
-
});
|
|
124
97
|
});
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import type { Buffer, Sampler, TextureView } from '@forgeax/engine-rhi';
|
|
1
|
+
import type { BindGroupEntry, Buffer, Sampler, TextureView } from '@forgeax/engine-rhi';
|
|
2
2
|
import { describe, expect, it } from 'vitest';
|
|
3
3
|
import { assembleMaterialWithSkylightEntries } from '../../ibl/skylight-bind-group';
|
|
4
|
-
import {
|
|
5
|
-
|
|
4
|
+
import {
|
|
5
|
+
BUILTIN_USER_REGION_TEXTURE_FIELDS,
|
|
6
|
+
defaultViewForUserRegionField,
|
|
7
|
+
} from '../main-pass-material';
|
|
6
8
|
import type { PipelineState } from '../render-context';
|
|
7
9
|
|
|
8
10
|
describe('sprite Standard material ABI', () => {
|
|
@@ -27,7 +29,6 @@ describe('sprite Standard material ABI', () => {
|
|
|
27
29
|
const white = {} as TextureView;
|
|
28
30
|
const pipelineState = {
|
|
29
31
|
materialUniformBuffer: { buffer: {} },
|
|
30
|
-
nearestSampler: sampler,
|
|
31
32
|
defaultSampler: sampler,
|
|
32
33
|
defaultWhiteTextureView: white,
|
|
33
34
|
defaultNormalTextureView: {} as TextureView,
|
|
@@ -35,7 +36,27 @@ describe('sprite Standard material ABI', () => {
|
|
|
35
36
|
} as PipelineState;
|
|
36
37
|
const spriteTexture = {} as TextureView;
|
|
37
38
|
|
|
38
|
-
|
|
39
|
+
// Sprite no longer owns a parallel material-entry builder. Preserve the
|
|
40
|
+
// shared user-region/IBL layout gate; actual sampler selection is covered
|
|
41
|
+
// by the source-derived 300-frame Sprite raster smoke in both tone lanes.
|
|
42
|
+
const entries: BindGroupEntry[] = [
|
|
43
|
+
{ binding: 0, resource: { kind: 'buffer', value: { buffer: {} as Buffer } } },
|
|
44
|
+
];
|
|
45
|
+
for (const [index, field] of BUILTIN_USER_REGION_TEXTURE_FIELDS.entries()) {
|
|
46
|
+
entries.push(
|
|
47
|
+
{ binding: 1 + index * 2, resource: { kind: 'sampler', value: sampler } },
|
|
48
|
+
{
|
|
49
|
+
binding: 2 + index * 2,
|
|
50
|
+
resource: {
|
|
51
|
+
kind: 'textureView',
|
|
52
|
+
value:
|
|
53
|
+
field === 'baseColorTexture'
|
|
54
|
+
? spriteTexture
|
|
55
|
+
: defaultViewForUserRegionField(field, pipelineState),
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
);
|
|
59
|
+
}
|
|
39
60
|
|
|
40
61
|
expect(entries.map((entry) => entry.binding)).toEqual([
|
|
41
62
|
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
|
@@ -68,6 +89,16 @@ describe('sprite Standard material ABI', () => {
|
|
|
68
89
|
});
|
|
69
90
|
expect(merged).toHaveLength(24);
|
|
70
91
|
|
|
92
|
+
const complete = [
|
|
93
|
+
...merged,
|
|
94
|
+
{
|
|
95
|
+
binding: 46,
|
|
96
|
+
resource: { kind: 'buffer' as const, value: { buffer: {} as Buffer } },
|
|
97
|
+
},
|
|
98
|
+
];
|
|
99
|
+
expect(complete).toHaveLength(25);
|
|
100
|
+
expect(complete[24]).toMatchObject({ binding: 46, resource: { kind: 'buffer' } });
|
|
101
|
+
|
|
71
102
|
const backdrop = {} as TextureView;
|
|
72
103
|
const active = assembleMaterialWithSkylightEntries(
|
|
73
104
|
entries,
|
|
@@ -2,11 +2,13 @@ import { ok } from '@forgeax/engine-types';
|
|
|
2
2
|
import { describe, expect, it } from 'vitest';
|
|
3
3
|
import type { RenderFeaturePlannedFrame } from '../../features/plan';
|
|
4
4
|
import { GPU_TEXTURE_USAGE_COPY_SRC } from '../../gpu-texture-usage';
|
|
5
|
+
import { createAutoExposureGraphPlan } from '../../pipeline/standard-output/auto-exposure/graph';
|
|
5
6
|
import { getTextureIdentity, validateGraphTargetCaptureReadback } from '../frame-snapshot';
|
|
6
7
|
import {
|
|
7
8
|
executeCompiledFrameGraph,
|
|
8
9
|
type RenderFeatureGraphCandidate,
|
|
9
10
|
renderFeatureGraphPlanSignature,
|
|
11
|
+
updateRenderFeaturePlanRevision,
|
|
10
12
|
} from '../typed-frame-graph';
|
|
11
13
|
|
|
12
14
|
const captureDescriptor = {
|
|
@@ -101,6 +103,13 @@ function planned(generation: number, signature: string): RenderFeaturePlannedFra
|
|
|
101
103
|
}
|
|
102
104
|
|
|
103
105
|
describe('typed frame graph feature plan authority', () => {
|
|
106
|
+
it('carries auto exposure as one frame-local candidate plan', () => {
|
|
107
|
+
const plan = createAutoExposureGraphPlan({ width: 17, height: 9 });
|
|
108
|
+
expect(plan.candidateAvailableSameFrame).toBe(true);
|
|
109
|
+
expect(plan.cpuReadbackCount).toBe(0);
|
|
110
|
+
expect(plan.cpuUploadCount).toBe(0);
|
|
111
|
+
});
|
|
112
|
+
|
|
104
113
|
it('keys topology and last-known-good candidates by stable plan signature and generation', () => {
|
|
105
114
|
const first = renderFeatureGraphPlanSignature([planned(1, 'plan-a')]);
|
|
106
115
|
expect(renderFeatureGraphPlanSignature([planned(1, 'plan-a')])).toBe(first);
|
|
@@ -116,6 +125,42 @@ describe('typed frame graph feature plan authority', () => {
|
|
|
116
125
|
expect(candidate.plans).toHaveLength(1);
|
|
117
126
|
});
|
|
118
127
|
|
|
128
|
+
it('keeps the compact revision stable for equivalent plan objects', () => {
|
|
129
|
+
const first = updateRenderFeaturePlanRevision(
|
|
130
|
+
{ revision: 0, entries: [] },
|
|
131
|
+
[planned(1, 'plan-a')],
|
|
132
|
+
[{ featureIdentity: 'synthetic.feature', order: 0, passes: [] }],
|
|
133
|
+
);
|
|
134
|
+
const equivalent = updateRenderFeaturePlanRevision(
|
|
135
|
+
first,
|
|
136
|
+
[planned(1, 'plan-a')],
|
|
137
|
+
[{ featureIdentity: 'synthetic.feature', order: 0, passes: [] }],
|
|
138
|
+
);
|
|
139
|
+
expect(equivalent).toBe(first);
|
|
140
|
+
expect(equivalent.revision).toBe(1);
|
|
141
|
+
|
|
142
|
+
const changedSignature = updateRenderFeaturePlanRevision(
|
|
143
|
+
equivalent,
|
|
144
|
+
[planned(1, 'plan-b')],
|
|
145
|
+
[{ featureIdentity: 'synthetic.feature', order: 0, passes: [] }],
|
|
146
|
+
);
|
|
147
|
+
expect(changedSignature.revision).toBe(2);
|
|
148
|
+
expect(
|
|
149
|
+
updateRenderFeaturePlanRevision(
|
|
150
|
+
changedSignature,
|
|
151
|
+
[planned(2, 'plan-b')],
|
|
152
|
+
[{ featureIdentity: 'synthetic.feature', order: 0, passes: [] }],
|
|
153
|
+
).revision,
|
|
154
|
+
).toBe(3);
|
|
155
|
+
expect(
|
|
156
|
+
updateRenderFeaturePlanRevision(
|
|
157
|
+
changedSignature,
|
|
158
|
+
[planned(1, 'plan-b')],
|
|
159
|
+
[{ featureIdentity: 'synthetic.feature', order: 1, passes: [] }],
|
|
160
|
+
).revision,
|
|
161
|
+
).toBe(3);
|
|
162
|
+
});
|
|
163
|
+
|
|
119
164
|
it('keeps execution projection out of the public planned-frame vocabulary', () => {
|
|
120
165
|
const invalid: RenderFeaturePlannedFrame = {
|
|
121
166
|
...planned(1, 'plan-a'),
|
|
@@ -34,6 +34,11 @@ describe('View UBO directional shadow ABI', () => {
|
|
|
34
34
|
it('declares one shared View binding with a vec4 directional filter carrier', () => {
|
|
35
35
|
const viewStruct = commonWgslSrc.match(/struct View \{[\s\S]*?\n\};/)?.[0] ?? '';
|
|
36
36
|
expect(viewStruct).toMatch(/directionalShadowFilter\s*:\s*vec4<f32>/);
|
|
37
|
+
expect(viewStruct).toMatch(/ssrParams\s*:\s*vec4<f32>/);
|
|
38
|
+
expect(viewUboSrc).toMatch(/viewPayload\[236\]\s*=\s*ssr\.maxDistance/);
|
|
39
|
+
expect(viewUboSrc).toMatch(/viewPayload\[237\]\s*=\s*ssr\.thickness/);
|
|
40
|
+
expect(viewUboSrc).toMatch(/viewPayload\[238\]\s*=\s*ssr\.maxRoughness/);
|
|
41
|
+
expect(viewUboSrc).toMatch(/viewPayload\[239\]\s*=\s*1/);
|
|
37
42
|
expect(viewStruct).not.toMatch(/pcfKernelSize/);
|
|
38
43
|
expect(commonWgslSrc.match(/@group\(0\) @binding\(0\) var<uniform> view/g)).toHaveLength(1);
|
|
39
44
|
});
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { World } from '@forgeax/engine-ecs';
|
|
2
|
+
import type { RenderFrameState, ValidatedRenderable } from './frame-snapshot';
|
|
3
|
+
|
|
4
|
+
/** Capture the render-stage mesh binding used by the current submitted frame. */
|
|
5
|
+
export function createDynamicGeometryConsumptionRecorder(
|
|
6
|
+
worlds: readonly World[],
|
|
7
|
+
bindings: WeakMap<World, Map<number, number>>,
|
|
8
|
+
): (entry: ValidatedRenderable) => void {
|
|
9
|
+
return (entry) => {
|
|
10
|
+
const renderable = entry.source;
|
|
11
|
+
const world = worlds[renderable.worldId];
|
|
12
|
+
if (world === undefined) return;
|
|
13
|
+
let worldBindings = bindings.get(world);
|
|
14
|
+
if (worldBindings === undefined) {
|
|
15
|
+
worldBindings = new Map();
|
|
16
|
+
bindings.set(world, worldBindings);
|
|
17
|
+
}
|
|
18
|
+
worldBindings.set(renderable.entityKey, renderable.assetHandle);
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface DynamicGeometryFrameBindings {
|
|
23
|
+
begin(): void;
|
|
24
|
+
onRenderableDraw(worlds: readonly World[]): (entry: ValidatedRenderable) => void;
|
|
25
|
+
commit(submitted: boolean): void;
|
|
26
|
+
isConsumed(world: World, entity: number, meshHandle: number | undefined): boolean;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Own the submitted-frame receipt used by dynamic-geometry publication. */
|
|
30
|
+
export function createDynamicGeometryFrameBindings(): DynamicGeometryFrameBindings {
|
|
31
|
+
let submitted = new WeakMap<World, ReadonlyMap<number, number>>();
|
|
32
|
+
let pending = new WeakMap<World, Map<number, number>>();
|
|
33
|
+
return {
|
|
34
|
+
begin(): void {
|
|
35
|
+
submitted = new WeakMap();
|
|
36
|
+
pending = new WeakMap();
|
|
37
|
+
},
|
|
38
|
+
onRenderableDraw(worlds): (entry: ValidatedRenderable) => void {
|
|
39
|
+
return createDynamicGeometryConsumptionRecorder(worlds, pending);
|
|
40
|
+
},
|
|
41
|
+
commit(didSubmit): void {
|
|
42
|
+
if (didSubmit) submitted = pending;
|
|
43
|
+
},
|
|
44
|
+
isConsumed(world, entity, meshHandle): boolean {
|
|
45
|
+
if (!Number.isInteger(entity) || meshHandle === undefined) return false;
|
|
46
|
+
return submitted.get(world)?.get(entity) === meshHandle;
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Drop temporal history after a dynamic-geometry topology replacement. */
|
|
52
|
+
export function resetDynamicGeometryTemporalHistory(frameState: RenderFrameState): void {
|
|
53
|
+
frameState.temporalFrameTransaction.reset('signature-change');
|
|
54
|
+
frameState.temporalFrame = undefined;
|
|
55
|
+
frameState.temporalFrameInput = undefined;
|
|
56
|
+
frameState.lastSuccessfulTemporalView = undefined;
|
|
57
|
+
frameState.successfulTemporalFrameIndex = 0;
|
|
58
|
+
frameState.pendingTemporalCommit = { kind: 'none' };
|
|
59
|
+
}
|
|
@@ -137,8 +137,8 @@ function mapClusterUploadFailure(
|
|
|
137
137
|
* verbatim from `recordFrame`. Walks the handle-identity WeakMap caches
|
|
138
138
|
* (feat-20260531 M2 + feat-20260622 M3) to resolve or lazily create the view
|
|
139
139
|
* (@group 0), mesh (@group 2), and — when HDRP is active — HDRP-unified cluster
|
|
140
|
-
* bind groups.
|
|
141
|
-
*
|
|
140
|
+
* bind groups. Raster groups may be null with no validated meshes; the Cluster
|
|
141
|
+
* producer follows the accepted lighting topology independently. `bindGroupCounts` accounting +
|
|
142
142
|
* cache maps are threaded through explicitly.
|
|
143
143
|
*
|
|
144
144
|
* @internal
|
|
@@ -181,10 +181,12 @@ export function buildPerFrameBindGroups(
|
|
|
181
181
|
const clusteredLighting = standardLighting?.kind === 'clustered';
|
|
182
182
|
const membershipLayout = pipelineState.hdrpClusterMembershipBindGroupLayout;
|
|
183
183
|
const membership = frameState.hdrpClusterMembership;
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
184
|
+
// The graph's Cluster producer also serves RenderFeature consumers and
|
|
185
|
+
// warmup frames with no ordinary meshes. Its lifetime follows the accepted
|
|
186
|
+
// lighting topology, not the ordinary raster validation count.
|
|
187
|
+
const expectedHdrpBuffers = clusteredLighting
|
|
188
|
+
? getOrCreateHdrpBuffers(internals, frameState.installedPipelineConfig?.clusterGrid)
|
|
189
|
+
: null;
|
|
188
190
|
const currentMembership =
|
|
189
191
|
expectedHdrpBuffers !== null &&
|
|
190
192
|
membership?.clusterGridBuffer === expectedHdrpBuffers.clusterGridBuffer
|
|
@@ -332,7 +334,7 @@ export function buildPerFrameBindGroups(
|
|
|
332
334
|
},
|
|
333
335
|
// feat-20260612-point-light-shadows-urp-hdrp Round-2 F-1:
|
|
334
336
|
// shadowParams UBO (`array<vec4<f32>, 4>` = 64 B). Lane N
|
|
335
|
-
// stores `(near, far,
|
|
337
|
+
// stores `(near, far, depthBias, normalBias)` for the point light
|
|
336
338
|
// with shadowAtlasLayer === N. Updated per frame from
|
|
337
339
|
// `pointShadowSnapshots` below.
|
|
338
340
|
{
|
|
@@ -829,7 +831,7 @@ export function writeSpotModifierTextures(
|
|
|
829
831
|
* binding 6), extracted verbatim from `recordFrame`.
|
|
830
832
|
*
|
|
831
833
|
* feat-20260612-point-light-shadows-urp-hdrp Round-2 F-1: 4 lanes x vec4<f32>;
|
|
832
|
-
* lane[shadowAtlasLayer] = (near, far,
|
|
834
|
+
* lane[shadowAtlasLayer] = (near, far, depthBias, normalBias). Lanes for non-shadow
|
|
833
835
|
* slots stay zero (the WGSL sample path is gated by PointLight.shadowAtlasLayer
|
|
834
836
|
* >= 0). Always writes the full 64 B so stale non-zero lanes from a previous
|
|
835
837
|
* frame's allocation cannot poison the current frame.
|
|
@@ -854,11 +856,10 @@ export function writeShadowParamsBuffer(
|
|
|
854
856
|
const base = layer * SHADOW_PARAMS_FLOATS_PER_LANE;
|
|
855
857
|
const near = ps.nearPlane;
|
|
856
858
|
const far = ps.farPlane;
|
|
857
|
-
const invSpan = far > near ? 1 / (far - near) : 0;
|
|
858
859
|
shadowParamsArr[base] = near;
|
|
859
860
|
shadowParamsArr[base + 1] = far;
|
|
860
|
-
shadowParamsArr[base + 2] =
|
|
861
|
-
shadowParamsArr[base + 3] =
|
|
861
|
+
shadowParamsArr[base + 2] = ps.depthBias;
|
|
862
|
+
shadowParamsArr[base + 3] = ps.normalBias;
|
|
862
863
|
}
|
|
863
864
|
const shadowParamsWriteRes = internals.device.queue.writeBuffer(
|
|
864
865
|
pipelineState.shadowParamsBuffer,
|
|
@@ -18,10 +18,16 @@ import type { DirectionalShadowQuality } from '../components/directional-shadow-
|
|
|
18
18
|
import type { EnvironmentGeneration } from '../environment/generation';
|
|
19
19
|
import type { EnvironmentLifecycle } from '../environment/lifecycle';
|
|
20
20
|
import type { GpuBuffer } from '../gpu-resource';
|
|
21
|
-
import type {
|
|
21
|
+
import type { InstanceCollectionStore } from '../instances';
|
|
22
22
|
import type { IblBindingInspection } from '../mesh-material-bindings';
|
|
23
23
|
import type { StandardLightingInspection } from '../pipeline/standard-lighting/inspection';
|
|
24
|
+
import type { AutoExposureGpuResources } from '../pipeline/standard-output/auto-exposure/gpu';
|
|
25
|
+
import type { AutoExposureState } from '../pipeline/standard-output/auto-exposure/state';
|
|
26
|
+
import type { StandardLutGpuResources } from '../pipeline/standard-output/lut-gpu';
|
|
27
|
+
import type { StandardLutCandidate, StandardLutState } from '../pipeline/standard-output/lut-state';
|
|
24
28
|
import type { PointShadowInspection } from '../point-shadow-inspection';
|
|
29
|
+
import type { SsrSpatialAdmission } from '../ssr/admission';
|
|
30
|
+
import type { SsrHistoryCandidate, SsrHistoryOwner } from '../ssr/history';
|
|
25
31
|
import type { TemporalGpuState } from '../temporal/gpu';
|
|
26
32
|
import type { TemporalView } from '../temporal/view';
|
|
27
33
|
|
|
@@ -30,6 +36,23 @@ export type TemporalCommitOutcome =
|
|
|
30
36
|
| { readonly kind: 'off'; readonly view: TemporalView }
|
|
31
37
|
| { readonly kind: 'taa'; readonly view: TemporalView };
|
|
32
38
|
|
|
39
|
+
/** CPU transaction metadata staged beside the renderer-owned GPU candidate. */
|
|
40
|
+
export interface PendingAutoExposureState {
|
|
41
|
+
readonly state: AutoExposureState;
|
|
42
|
+
readonly generation: number;
|
|
43
|
+
readonly deviceEpoch: number;
|
|
44
|
+
readonly frameId: number;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** CPU POD staged beside the renderer-owned LUT resources until submit. */
|
|
48
|
+
export interface PendingStandardLutState {
|
|
49
|
+
readonly state: StandardLutState;
|
|
50
|
+
readonly candidate?: StandardLutCandidate;
|
|
51
|
+
readonly remove: boolean;
|
|
52
|
+
readonly targetGeneration: number;
|
|
53
|
+
readonly deviceEpoch: number;
|
|
54
|
+
}
|
|
55
|
+
|
|
33
56
|
/**
|
|
34
57
|
* feat-20260708-composited-multi-world-rendering M1 / D-1 / D-9:
|
|
35
58
|
* worldId-entityKey composite key helper. Formula: `worldId * 2^32 + entityKey`.
|
|
@@ -53,7 +76,14 @@ export function worldEntityKey(worldId: number, entityKey: number): number {
|
|
|
53
76
|
return worldId * 4294967296 + entityKey; // 2^32 = 4294967296
|
|
54
77
|
}
|
|
55
78
|
|
|
56
|
-
/**
|
|
79
|
+
/**
|
|
80
|
+
* Cache identity for a renderer-owned instance collection.
|
|
81
|
+
*
|
|
82
|
+
* A collection can be rebound from one entity to another while retaining the
|
|
83
|
+
* same count, revision, and extraction archetype. The collection id is the
|
|
84
|
+
* owner identity in that case; the entity cache key is only the compatibility
|
|
85
|
+
* fallback for legacy snapshots that predate the collection field.
|
|
86
|
+
*/
|
|
57
87
|
export function instanceCollectionCacheKey(
|
|
58
88
|
worldId: number,
|
|
59
89
|
instance: { readonly cacheKey: number; readonly collectionId?: number },
|
|
@@ -211,27 +241,78 @@ export function validateGraphTargetCaptureReadback(input: {
|
|
|
211
241
|
return { ok: true };
|
|
212
242
|
}
|
|
213
243
|
|
|
244
|
+
/**
|
|
245
|
+
* Receipt delivered after a selected pass-replay raster pass has encoded.
|
|
246
|
+
* The depth view and target handles are the frame-resolved objects used by
|
|
247
|
+
* the graph; the numeric texture identity is derived by getTextureIdentity.
|
|
248
|
+
*/
|
|
249
|
+
export interface GraphTargetPassReplayReceipt {
|
|
250
|
+
readonly passName: string;
|
|
251
|
+
readonly executionIndex: number;
|
|
252
|
+
readonly resolvedDepthStencilAttachmentView: TextureView;
|
|
253
|
+
readonly graphGeneration: number;
|
|
254
|
+
readonly targetName: string;
|
|
255
|
+
readonly targetView: TextureView;
|
|
256
|
+
readonly targetTexture: Texture;
|
|
257
|
+
readonly targetTextureIdentity: number;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
export type GraphTargetPassReplayCallback = (receipt: GraphTargetPassReplayReceipt) => void;
|
|
261
|
+
|
|
262
|
+
/** Receipt delivered once after a complete selected prefix reaches its boundary pass. */
|
|
263
|
+
export interface GraphTargetPassReplayPrefixReceipt extends GraphTargetPassReplayReceipt {
|
|
264
|
+
/** The compiled-order prefix that was replayed. */
|
|
265
|
+
readonly replayPassNames: readonly string[];
|
|
266
|
+
/** The unique depth-bearing raster pass used as the observation anchor. */
|
|
267
|
+
readonly depthAttachmentPassName: string;
|
|
268
|
+
/** The final pass in the selected prefix. */
|
|
269
|
+
readonly observeAfterPassName: string;
|
|
270
|
+
readonly depthAttachmentExecutionIndex: number;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
export type GraphTargetPassReplayPrefixCallback = (
|
|
274
|
+
receipt: GraphTargetPassReplayPrefixReceipt,
|
|
275
|
+
) => void;
|
|
276
|
+
|
|
214
277
|
/** Internal readback request consumed by the record encoder in the same submit. */
|
|
215
|
-
export
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
278
|
+
export type GraphTargetCaptureRequest =
|
|
279
|
+
| {
|
|
280
|
+
/** The default preserves the original target-copy request shape. */
|
|
281
|
+
readonly kind?: 'target-copy';
|
|
282
|
+
readonly name: string;
|
|
283
|
+
/** Optional one-shot pass selection for internal graph-target diagnostics. */
|
|
284
|
+
readonly replayPassNames?: readonly string[];
|
|
285
|
+
readonly buffer: Buffer;
|
|
286
|
+
readonly bytesPerRow: number;
|
|
287
|
+
readonly width: number;
|
|
288
|
+
readonly height: number;
|
|
289
|
+
/** Descriptor contract checked against the resolved target at copy time. */
|
|
290
|
+
readonly expected: {
|
|
291
|
+
readonly format: ResolvedColorTargetDescriptor['format'];
|
|
292
|
+
readonly width: number;
|
|
293
|
+
readonly height: number;
|
|
294
|
+
readonly usage: number;
|
|
295
|
+
/** Optional caller binding; when present it is checked at copy time. */
|
|
296
|
+
readonly identity?: {
|
|
297
|
+
readonly graphGeneration: number;
|
|
298
|
+
readonly frameId: number;
|
|
299
|
+
readonly textureIdentity: number;
|
|
300
|
+
};
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
| {
|
|
304
|
+
/** Execute selected compiled passes without requesting a target copy. */
|
|
305
|
+
readonly kind: 'pass-replay';
|
|
306
|
+
readonly replayPassNames: readonly string[];
|
|
307
|
+
/** Optional graph target used to validate the selected pass attachment. */
|
|
308
|
+
readonly targetName?: string;
|
|
309
|
+
/** Optional callback invoked after each selected pass encodes. */
|
|
310
|
+
readonly onPassEncoded?: GraphTargetPassReplayCallback;
|
|
311
|
+
/** Optional one-shot callback invoked after the selected prefix boundary encodes. */
|
|
312
|
+
readonly depthAttachmentPassName?: string;
|
|
313
|
+
readonly observeAfterPassName?: string;
|
|
314
|
+
readonly onPrefixEncoded?: GraphTargetPassReplayPrefixCallback;
|
|
232
315
|
};
|
|
233
|
-
};
|
|
234
|
-
}
|
|
235
316
|
|
|
236
317
|
/** Renderer-private readback request for the Standard fallback MRT. */
|
|
237
318
|
export interface ReflectionFallbackReadbackRequest {
|
|
@@ -251,7 +332,6 @@ export interface ReflectionFallbackReadbackRequest {
|
|
|
251
332
|
};
|
|
252
333
|
encoded: boolean;
|
|
253
334
|
}
|
|
254
|
-
|
|
255
335
|
/**
|
|
256
336
|
* Build a synthetic CameraSnapshot the record stage uses when the world
|
|
257
337
|
* carries no Camera entity. Identity-shaped projection / view inputs
|
|
@@ -319,6 +399,18 @@ export interface RenderFrameState {
|
|
|
319
399
|
iblBindingInspection?: IblBindingInspection;
|
|
320
400
|
/** Demand for the frame-local Standard fallback MRT. */
|
|
321
401
|
reflectionFallbackDemand?: boolean;
|
|
402
|
+
/** Whether the active camera explicitly requested SSR this frame. */
|
|
403
|
+
ssrRequested?: boolean | undefined;
|
|
404
|
+
/** Current renderer-owned SSR spatial admission projection. */
|
|
405
|
+
ssrSpatialAdmission?: SsrSpatialAdmission | undefined;
|
|
406
|
+
/** Persistent SSR history owner; candidate is promoted only after submit. */
|
|
407
|
+
ssrHistoryOwner?: SsrHistoryOwner | undefined;
|
|
408
|
+
ssrHistoryCandidate?: SsrHistoryCandidate | undefined;
|
|
409
|
+
/** Reused CPU parameter payload for the SSR temporal resolve. */
|
|
410
|
+
ssrTemporalParamsPayload?: Uint8Array | undefined;
|
|
411
|
+
/** Last camera identity used by the SSR history reset seam. */
|
|
412
|
+
ssrLastCameraEntity?: number | undefined;
|
|
413
|
+
ssrLastHistoryVersion?: number | undefined;
|
|
322
414
|
/** Monotonic compiled-graph identity used by diagnostic readbacks. */
|
|
323
415
|
graphGeneration: number;
|
|
324
416
|
/** Number of successfully submitted TAA frames; failed attempts do not advance it. */
|
|
@@ -390,6 +482,22 @@ export interface RenderFrameState {
|
|
|
390
482
|
lastSuccessfulCameraAntialias: CameraSnapshot['antialias'] | undefined;
|
|
391
483
|
/** Staged TAA GPU state is promoted only after queue.submit succeeds. */
|
|
392
484
|
temporalGpuState: TemporalGpuState | undefined;
|
|
485
|
+
/** Device-scoped auto-exposure buffers imported by the Standard graph. */
|
|
486
|
+
autoExposureGpuResources?: AutoExposureGpuResources | undefined;
|
|
487
|
+
/** Candidate auto-exposure buffers; promoted only after queue.submit succeeds. */
|
|
488
|
+
pendingAutoExposureGpuResources?: AutoExposureGpuResources | undefined;
|
|
489
|
+
/** Accepted auto-exposure inspection state; promoted only after submit. */
|
|
490
|
+
autoExposureState?: AutoExposureState | undefined;
|
|
491
|
+
/** Candidate auto-exposure inspection state; cleared on any failed frame. */
|
|
492
|
+
pendingAutoExposureState?: PendingAutoExposureState | undefined;
|
|
493
|
+
/** Prepared ordinary TextureAsset LUT candidate for the Standard graph. */
|
|
494
|
+
standardLutGpuResources?: StandardLutGpuResources | undefined;
|
|
495
|
+
/** Candidate LUT resources; promoted only after queue.submit succeeds. */
|
|
496
|
+
pendingStandardLutGpuResources?: StandardLutGpuResources | undefined;
|
|
497
|
+
/** Accepted LUT inspection state; promoted only after submit. */
|
|
498
|
+
standardLutState: StandardLutState;
|
|
499
|
+
/** Candidate LUT inspection state; cleared on any failed frame. */
|
|
500
|
+
pendingStandardLutState?: PendingStandardLutState | undefined;
|
|
393
501
|
/** Last successful TAA GPU state; candidate replacement stays staged until submit. */
|
|
394
502
|
activeTemporalGpuState: TemporalGpuState | undefined;
|
|
395
503
|
/** Submitted temporal generations retained until their queue fence resolves. */
|
|
@@ -399,12 +507,14 @@ export interface RenderFrameState {
|
|
|
399
507
|
pendingTemporalCommit: TemporalCommitOutcome;
|
|
400
508
|
/** Staged environment generation is promoted only after queue.submit succeeds. */
|
|
401
509
|
environmentGeneration: EnvironmentGeneration | undefined;
|
|
510
|
+
environmentFrame?: import('../environment/frame').SelectedEnvironmentFrame | undefined;
|
|
511
|
+
pendingAtmospherePublish?: (() => void) | undefined;
|
|
402
512
|
readonly environmentLifecycle: EnvironmentLifecycle | undefined;
|
|
403
513
|
currentDirectionalShadowView: TextureView | null;
|
|
404
514
|
currentSpotShadowView: TextureView | null;
|
|
405
515
|
readonly instanceBuffers: Map<number, InstanceBufferCacheEntry>;
|
|
406
516
|
/** Renderer-owned collection owner used for record-stage residency facts. */
|
|
407
|
-
readonly
|
|
517
|
+
readonly instanceCollections?: InstanceCollectionStore;
|
|
408
518
|
/** Stable buffers for renderer-owned collections split by device cap. */
|
|
409
519
|
readonly instanceBufferChunks?: Map<string, InstanceBufferCacheEntry>;
|
|
410
520
|
/** Per-object ProbeBlendRecord buffers; upload is one atomic 160B write. */
|