@forgeax/engine-render 0.1.28 → 0.1.30
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 +856 -126
- package/dist/assembly/atmosphere-shader-prewarm.d.ts +6 -0
- package/dist/assembly/atmosphere-shader-prewarm.d.ts.map +1 -0
- package/dist/assembly/device-feature-admission.d.ts +4 -3
- package/dist/assembly/device-feature-admission.d.ts.map +1 -1
- package/dist/assembly/dynamic-geometry-host.d.ts +27 -0
- package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -1
- 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 +14 -0
- package/dist/assembly/host-contract.d.ts.map +1 -1
- package/dist/assembly/material/assembly.d.ts +31 -1
- package/dist/assembly/material/assembly.d.ts.map +1 -1
- package/dist/assembly/material/pipeline-helpers.d.ts +24 -0
- package/dist/assembly/material/pipeline-helpers.d.ts.map +1 -0
- 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/device-loss-fanout.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/recovery-attempt.d.ts +1 -6
- package/dist/assembly/recovery/recovery-attempt.d.ts.map +1 -1
- package/dist/assembly/recovery/renderer-recover.d.ts +7 -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 +7 -1
- 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 +2 -2
- package/dist/capture/scene-projection.d.ts +41 -0
- package/dist/capture/scene-projection.d.ts.map +1 -0
- package/dist/{chunk-J52NMQKR.mjs → chunk-7MQ3XBSP.mjs} +1098 -844
- package/dist/chunk-7MQ3XBSP.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-VSL23LZE.mjs → chunk-C3DDSXYK.mjs} +1188 -463
- package/dist/chunk-C3DDSXYK.mjs.map +1 -0
- package/dist/{chunk-IQMKJLNU.mjs → chunk-FUUO4UND.mjs} +443 -30
- package/dist/chunk-FUUO4UND.mjs.map +1 -0
- package/dist/{chunk-J6KACNOH.mjs → chunk-JRBDO2KB.mjs} +617 -7
- package/dist/chunk-JRBDO2KB.mjs.map +1 -0
- package/dist/{chunk-GE3SDD72.mjs → chunk-MDQJPY3T.mjs} +20 -40
- package/dist/chunk-MDQJPY3T.mjs.map +1 -0
- package/dist/{chunk-MYJ5RPJO.mjs → chunk-NO4WZCAH.mjs} +3 -3
- package/dist/chunk-NO4WZCAH.mjs.map +1 -0
- package/dist/{chunk-RBDBZ5R7.mjs → chunk-PA5DRJNI.mjs} +2 -2
- package/dist/chunk-PA5DRJNI.mjs.map +1 -0
- package/dist/{chunk-MBU4ZVE7.mjs → chunk-PSEQ6QPH.mjs} +4655 -892
- package/dist/chunk-PSEQ6QPH.mjs.map +1 -0
- package/dist/{chunk-JAASCMXA.mjs → chunk-S5UE2T5P.mjs} +289 -41
- package/dist/chunk-S5UE2T5P.mjs.map +1 -0
- package/dist/components/camera.d.ts +62 -2
- package/dist/components/camera.d.ts.map +1 -1
- package/dist/components/directional-light.d.ts +2 -2
- package/dist/components/dynamic-resolution.d.ts +15 -0
- package/dist/components/dynamic-resolution.d.ts.map +1 -0
- package/dist/components/index.d.ts +2 -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/light-helpers.d.ts.map +1 -1
- package/dist/components/reflection-probe.d.ts +1 -0
- package/dist/components/reflection-probe.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/components/skylight.d.ts +4 -1
- package/dist/components/skylight.d.ts.map +1 -1
- package/dist/construct-renderer.mjs +14809 -7570
- package/dist/construct-renderer.mjs.map +1 -1
- package/dist/device/device-scope.d.ts +2 -0
- package/dist/device/device-scope.d.ts.map +1 -1
- package/dist/device/gpu-residency.d.ts +3 -14
- package/dist/device/gpu-residency.d.ts.map +1 -1
- package/dist/dynamic-geometry.d.ts.map +1 -1
- package/dist/environment/background.d.ts +7 -0
- package/dist/environment/background.d.ts.map +1 -0
- package/dist/environment/ibl.d.ts +11 -0
- package/dist/environment/ibl.d.ts.map +1 -0
- package/dist/environment/storage.d.ts +14 -0
- package/dist/environment/storage.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 +41 -4
- package/dist/errors/render.d.ts.map +1 -1
- package/dist/extract/camera.d.ts.map +1 -1
- package/dist/extract/contracts.d.ts +7 -0
- package/dist/extract/contracts.d.ts.map +1 -1
- package/dist/extract/gpu-driven.d.ts +50 -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/material-artifacts.d.ts +24 -0
- package/dist/gpu-driven/material-artifacts.d.ts.map +1 -0
- package/dist/gpu-driven/material-bindings.d.ts +7 -0
- package/dist/gpu-driven/material-bindings.d.ts.map +1 -0
- 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 +2 -0
- package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
- package/dist/gpu-driven/production-raster.d.ts +169 -27
- 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-resource.d.ts +5 -2
- package/dist/gpu-resource.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 +9 -0
- package/dist/hdrp-buffers.d.ts.map +1 -1
- package/dist/ibl/IblPipelineCache.d.ts +2 -0
- package/dist/ibl/IblPipelineCache.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 +3 -1
- package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
- package/dist/index.d.ts +87 -75
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +10 -8
- package/dist/index.mjs.map +1 -1
- package/dist/inspection-types.d.ts +180 -1
- 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 +117 -9
- 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 +15 -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 +23 -5
- package/dist/pbr-pipeline.d.ts.map +1 -1
- package/dist/pipeline/render-extent.d.ts +51 -0
- package/dist/pipeline/render-extent.d.ts.map +1 -0
- package/dist/pipeline/standard-build-context.d.ts +7 -0
- package/dist/pipeline/standard-build-context.d.ts.map +1 -0
- package/dist/pipeline/standard-forward-lane.d.ts +3 -2
- 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/standard-profile.d.ts +2 -1
- package/dist/pipeline/standard-profile.d.ts.map +1 -1
- package/dist/pipeline-builder.d.ts +5 -2
- 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/plugin.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/post-process-errors.d.ts +9 -2
- package/dist/post-process-errors.d.ts.map +1 -1
- package/dist/prepare/extended-lighting/resources.d.ts +3 -3
- 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 +109 -13
- 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 +41 -5
- package/dist/record/frame.d.ts.map +1 -1
- package/dist/record/main-pass-geometry.d.ts +13 -9
- package/dist/record/main-pass-geometry.d.ts.map +1 -1
- package/dist/record/main-pass-material.d.ts +43 -3
- 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 +14 -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 +1 -0
- package/dist/record/recovery-pipeline.d.ts.map +1 -1
- package/dist/record/render-context.d.ts +101 -22
- 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 +39 -8
- 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/background.d.ts +14 -0
- package/dist/reflection/background.d.ts.map +1 -0
- package/dist/reflection/filter.d.ts.map +1 -1
- package/dist/reflection/projection.d.ts +1 -0
- package/dist/reflection/projection.d.ts.map +1 -1
- package/dist/reflection/record-owner.d.ts +4 -4
- package/dist/reflection/record-owner.d.ts.map +1 -1
- package/dist/render-contract.d.ts +211 -53
- 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 +81 -6
- package/dist/render-pipeline.d.ts.map +1 -1
- package/dist/render-system-extract-tail.d.ts +15 -6
- package/dist/render-system-extract-tail.d.ts.map +1 -1
- package/dist/render-system-extract.d.ts +128 -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 +27 -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 +31 -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/ssao-config.d.ts +8 -6
- package/dist/ssao-config.d.ts.map +1 -1
- 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 +4 -2
- package/dist/temporal/standard-scene-data.d.ts.map +1 -1
- package/dist/temporal/target-coverage-attachment.d.ts +15 -0
- package/dist/temporal/target-coverage-attachment.d.ts.map +1 -0
- package/dist/temporal/temporal-view.d.ts +6 -0
- package/dist/temporal/temporal-view.d.ts.map +1 -1
- package/dist/temporal/view.d.ts +6 -0
- package/dist/temporal/view.d.ts.map +1 -1
- package/dist/typed-render-graph-primitives.d.ts +41 -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/component.d.ts +1 -0
- package/dist/volume/component.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__/capture-scene-projection.unit.test.ts +24 -0
- package/src/__tests__/detached-inspection.integration.test.ts +5 -0
- package/src/__tests__/device-feature-admission.unit.test.ts +15 -24
- package/src/__tests__/device-loss-fanout.unit.test.ts +43 -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-batch.unit.test.ts +157 -0
- package/src/__tests__/dynamic-geometry.unit.test.ts +36 -0
- package/src/__tests__/dynamic-resolution-plugin.integration.test.ts +81 -0
- package/src/__tests__/factory-contract.integration.test.ts +231 -9
- 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-observation.contract.test.ts +21 -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 +307 -7
- 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 +261 -0
- package/src/__tests__/gpu-driven-mesh-world-identity.unit.test.ts +346 -0
- package/src/__tests__/gpu-driven-pbr.dawn.test.ts +1422 -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 +1076 -106
- 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 +160 -52
- package/src/__tests__/gpu-pass-timing-browser-runner.ts +15 -0
- package/src/__tests__/gpu-pass-timing.browser.test.ts +20 -2
- package/src/__tests__/gpu-resource-scope.unit.test.ts +71 -0
- 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 +613 -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 +57 -3
- package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +4 -0
- package/src/__tests__/mesh-submission-lifetime.unit.test.ts +8 -0
- package/src/__tests__/morph-neutral-admission.unit.test.ts +19 -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 +42 -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__/post-process-error-policy-owner.unit.test.ts +6 -5
- 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 +251 -9
- 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 +171 -0
- package/src/__tests__/reflection-probe-authoring.unit.test.ts +12 -10
- package/src/__tests__/reflection-probe-box.dawn.test.ts +71 -0
- package/src/__tests__/reflection-probe-filter.unit.test.ts +9 -0
- package/src/__tests__/reflection-probe-orientation.dawn.test.ts +294 -0
- package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +5 -14
- package/src/__tests__/reflection-probe-updates.unit.test.ts +129 -0
- package/src/__tests__/render-error-code-owner.test-d.ts +7 -0
- package/src/__tests__/render-error-detail-ssot.test-d.ts +27 -1
- package/src/__tests__/render-error-exhaustive.test-d.ts +15 -0
- package/src/__tests__/render-extent.unit.test.ts +63 -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 +915 -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 +233 -9
- package/src/__tests__/renderer-frame-transaction.integration.test.ts +923 -5
- package/src/__tests__/shader-manifest-fixture.ts +45 -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 +125 -14
- package/src/__tests__/specular-environment-scale.dawn.test.ts +158 -0
- package/src/__tests__/ssao-config.unit.test.ts +7 -0
- package/src/__tests__/ssao-surface.dawn.test.ts +252 -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-cube-silhouette.dawn.test.ts +270 -0
- package/src/__tests__/ssr-format-probe-gating.integration.test.ts +82 -0
- package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +99 -0
- package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +116 -0
- package/src/__tests__/ssr-gpu-dispatch.ts +951 -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 +84 -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 +275 -0
- package/src/__tests__/standard-pipeline.integration.test.ts +320 -3
- package/src/__tests__/standard-profile-oracle.unit.test.ts +49 -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 +199 -0
- package/src/__tests__/taa-history-clipping.dawn.test.ts +328 -0
- package/src/__tests__/taa-neighborhood-equivalence.dawn.test.ts +782 -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 +342 -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__/temporal-view.unit.test.ts +17 -0
- package/src/__tests__/texture-usage-surface.unit.test.ts +4 -2
- package/src/__tests__/transmission-prewarm.unit.test.ts +57 -0
- 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/__tests__/volumetric-fog-stage-readback.dawn.test.ts +62 -13
- package/src/__tests__/volumetric-fog-topology.unit.test.ts +7 -7
- package/src/assembly/atmosphere-shader-prewarm.ts +39 -0
- package/src/assembly/device-feature-admission.ts +9 -4
- package/src/assembly/dynamic-geometry-host.ts +284 -163
- 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 +19 -0
- package/src/assembly/material/assembly.ts +383 -1
- package/src/assembly/material/pipeline-helpers.ts +100 -0
- package/src/assembly/material-shader-policy.ts +110 -46
- package/src/assembly/recovery/device-loss-fanout.ts +5 -0
- package/src/assembly/recovery/failure-location.ts +62 -0
- package/src/assembly/recovery/recovery-attempt.ts +2 -29
- package/src/assembly/recovery/renderer-recover.ts +16 -17
- package/src/assembly/renderer-facade.ts +34 -1
- 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 +46 -1
- 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 +161 -131
- 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 +744 -730
- package/src/assembly/webgpu-vertex-layouts.ts +233 -87
- package/src/capture/scene-projection.ts +37 -0
- package/src/components/__tests__/camera-exposure.contract.unit.test.ts +153 -0
- package/src/components/__tests__/dynamic-resolution-schema.unit.test.ts +65 -0
- package/src/components/__tests__/light-radius.integration.test.ts +59 -0
- package/src/components/camera.ts +287 -7
- package/src/components/directional-light.ts +3 -3
- package/src/components/dynamic-resolution.ts +67 -0
- package/src/components/index.ts +2 -0
- package/src/components/instances.ts +45 -18
- package/src/components/light-helpers.ts +6 -1
- package/src/components/reflection-probe.ts +1 -0
- package/src/components/scene-instance.ts +2 -1
- package/src/components/screen-space-reflection.ts +21 -0
- package/src/components/skylight.ts +4 -1
- package/src/components/sprite-animation.ts +2 -2
- package/src/components/sprite-instances.ts +1 -1
- package/src/device/device-scope.ts +13 -7
- package/src/device/gpu-residency.ts +45 -42
- package/src/dynamic-geometry.ts +13 -8
- package/src/environment/background.ts +281 -0
- package/src/environment/ibl.ts +211 -0
- package/src/environment/storage.ts +63 -0
- package/src/errors/gpu-driven.ts +49 -8
- package/src/errors/render.ts +91 -3
- package/src/extract/camera.ts +37 -1
- package/src/extract/contracts.ts +10 -0
- package/src/extract/gpu-driven.ts +240 -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 +452 -108
- package/src/gpu-driven/material-artifacts.ts +179 -0
- package/src/gpu-driven/material-bindings.ts +41 -0
- package/src/gpu-driven/pbr-program.ts +31 -0
- package/src/gpu-driven/prepared-draw.ts +42 -6
- package/src/gpu-driven/production-raster.ts +2806 -716
- package/src/gpu-driven/shadow-views.ts +539 -0
- package/src/gpu-driven/view-gpu.ts +188 -41
- package/src/gpu-resource.ts +21 -2
- package/src/gpu-scene-schema.ts +61 -11
- package/src/gpu-scene.ts +197 -99
- package/src/gpu-texture-usage.ts +1 -0
- package/src/hdrp-buffers.ts +141 -36
- package/src/ibl/IblPipelineCache.ts +5 -0
- package/src/ibl/frame-resources.ts +38 -0
- package/src/ibl/skylight-bind-group.ts +32 -21
- package/src/index.ts +194 -75
- package/src/inspection-types.ts +207 -1
- 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 +194 -0
- package/src/materials.ts +44 -8
- package/src/pbr-pipeline.ts +172 -19
- package/src/pipeline/render-extent.ts +111 -0
- package/src/pipeline/standard-build-context.ts +7 -0
- package/src/pipeline/standard-forward-lane.ts +74 -29
- 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 +232 -70
- package/src/pipeline/standard-post.ts +190 -27
- package/src/pipeline/standard-profile.ts +2 -1
- package/src/pipeline-builder.ts +28 -9
- package/src/pipeline-spec-types.ts +4 -0
- package/src/pipeline-spec.ts +37 -29
- package/src/plugin.ts +4 -0
- package/src/points-lines/standard-owner.ts +6 -14
- package/src/post-process-errors.ts +26 -18
- package/src/prepare/__tests__/extended-lighting-capability.unit.test.ts +2 -2
- package/src/prepare/extended-lighting/resources.ts +3 -3
- package/src/prepare/prepared-graphics-resolver.ts +9 -2
- package/src/record/__tests__/main-pass-geometry.unit.test.ts +68 -0
- package/src/record/__tests__/material-bg-cache.unit.test.ts +45 -0
- package/src/record/__tests__/material-slot-plan.unit.test.ts +57 -0
- package/src/record/__tests__/mesh-ssbo.unit.test.ts +40 -1
- package/src/record/__tests__/recovery-pipeline.unit.test.ts +20 -1
- package/src/record/__tests__/sprite-material-abi.unit.test.ts +41 -6
- package/src/record/__tests__/temporal-payload.unit.test.ts +2 -0
- 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 +15 -12
- package/src/record/frame-snapshot.ts +146 -34
- package/src/record/frame-targets.ts +9 -0
- package/src/record/frame.ts +838 -170
- package/src/record/main-pass-geometry.ts +209 -103
- package/src/record/main-pass-material.ts +157 -40
- package/src/record/main-pass-sprite-draws.ts +16 -107
- package/src/record/main-pass.ts +141 -12
- package/src/record/material-uniforms.ts +1 -1
- package/src/record/mesh-ssbo.ts +59 -15
- package/src/record/prepared-material-bindings.ts +238 -0
- package/src/record/recovery-pipeline.ts +69 -90
- package/src/record/render-context.ts +123 -24
- package/src/record/shadow-pass.ts +1389 -230
- package/src/record/skybox-post-pass.ts +14 -3
- package/src/record/typed-frame-graph.ts +1064 -47
- package/src/record/view-ubo.ts +12 -1
- package/src/recovery/render-system-candidate.ts +135 -68
- package/src/recovery/render-system-roots.ts +113 -0
- package/src/recovery/types.ts +77 -0
- package/src/reflection/background.ts +151 -0
- package/src/reflection/filter.ts +3 -0
- package/src/reflection/projection.ts +16 -6
- package/src/reflection/record-owner.ts +308 -140
- package/src/render-contract.ts +237 -49
- package/src/render-graph-primitives.ts +34 -5
- package/src/render-pipeline.ts +90 -2
- package/src/render-system-extract-tail.ts +431 -162
- package/src/render-system-extract.ts +478 -119
- package/src/render-system-projections.ts +241 -0
- package/src/render-system.ts +715 -828
- package/src/scene/render-scene-types.ts +13 -4
- package/src/scene/render-scene.ts +577 -355
- package/src/scene/shadow-visibility.ts +21 -0
- package/src/ssao-config.ts +25 -8
- 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 +797 -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 +79 -12
- package/src/temporal/history.ts +3 -1
- package/src/temporal/inspection.ts +2 -1
- package/src/temporal/standard-scene-data.ts +10 -2
- package/src/temporal/target-coverage-attachment.ts +72 -0
- package/src/temporal/temporal-view.ts +11 -2
- package/src/temporal/view.ts +12 -2
- package/src/transmission/__tests__/standard-transmission.dawn.test.ts +219 -139
- package/src/typed-render-graph-primitives.ts +304 -74
- package/src/typed-shadow-passes.ts +122 -12
- package/src/volume/component.ts +1 -0
- package/src/volume/passes.ts +3 -3
- package/src/volume/temporal.ts +10 -0
- package/dist/chunk-GE3SDD72.mjs.map +0 -1
- package/dist/chunk-GF523LHF.mjs.map +0 -1
- package/dist/chunk-IQMKJLNU.mjs.map +0 -1
- package/dist/chunk-J52NMQKR.mjs.map +0 -1
- package/dist/chunk-J6KACNOH.mjs.map +0 -1
- package/dist/chunk-JAASCMXA.mjs.map +0 -1
- package/dist/chunk-MBU4ZVE7.mjs.map +0 -1
- package/dist/chunk-MYJ5RPJO.mjs.map +0 -1
- package/dist/chunk-RBDBZ5R7.mjs.map +0 -1
- package/dist/chunk-VSL23LZE.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
package/src/features/plan.ts
CHANGED
|
@@ -23,8 +23,22 @@ export type RenderFeatureMaterialShaderBindingContract =
|
|
|
23
23
|
| 'group-0-resource'
|
|
24
24
|
| 'view-only'
|
|
25
25
|
| 'view-and-scene-depth'
|
|
26
|
+
| 'render-material-with-scene-depth'
|
|
27
|
+
| 'render-material-and-scene-depth'
|
|
26
28
|
| 'render-material';
|
|
27
29
|
|
|
30
|
+
/**
|
|
31
|
+
* Renderer-owned prepared resources that a closed RenderFeature data
|
|
32
|
+
* interface may consume for the current generation. The feature receives
|
|
33
|
+
* opaque references only; device creation and lifetime remain in Render.
|
|
34
|
+
*/
|
|
35
|
+
export interface RenderFeaturePreparedDataInterfaceResource {
|
|
36
|
+
readonly kind: 'buffer' | 'texture-view' | 'sampler';
|
|
37
|
+
readonly value: unknown;
|
|
38
|
+
readonly size?: number;
|
|
39
|
+
readonly usage?: 'uniform' | 'storage';
|
|
40
|
+
}
|
|
41
|
+
|
|
28
42
|
export type RenderFeatureFullscreenRead =
|
|
29
43
|
| string
|
|
30
44
|
| { readonly key: string; readonly sampleType?: 'depth' };
|
|
@@ -73,6 +87,22 @@ export type RenderFeatureResourceDeclaration =
|
|
|
73
87
|
readonly usage: readonly RenderFeatureGpuBufferUsage[];
|
|
74
88
|
readonly data?: ArrayBufferView;
|
|
75
89
|
}
|
|
90
|
+
| {
|
|
91
|
+
/** A resident generation-owned resource supplied by a render-owned provider. */
|
|
92
|
+
readonly kind: 'prepared-gpu-resource';
|
|
93
|
+
readonly name: string;
|
|
94
|
+
readonly resource:
|
|
95
|
+
| {
|
|
96
|
+
readonly kind: 'buffer';
|
|
97
|
+
readonly value: unknown;
|
|
98
|
+
readonly size: number;
|
|
99
|
+
readonly usage?: readonly RenderFeatureGpuBufferUsage[];
|
|
100
|
+
}
|
|
101
|
+
| { readonly kind: 'texture-view'; readonly value: unknown }
|
|
102
|
+
| { readonly kind: 'sampler'; readonly value: unknown };
|
|
103
|
+
/** Optional graph target that backs a resident sampled resource. */
|
|
104
|
+
readonly logicalTarget?: string;
|
|
105
|
+
}
|
|
76
106
|
| {
|
|
77
107
|
readonly kind: 'compute-bindings';
|
|
78
108
|
readonly name: string;
|
|
@@ -166,6 +196,11 @@ export interface RenderFeatureDrawDeclaration {
|
|
|
166
196
|
}
|
|
167
197
|
|
|
168
198
|
export type RenderFeaturePassDeclaration =
|
|
199
|
+
| {
|
|
200
|
+
readonly kind: 'shadow-caster';
|
|
201
|
+
readonly name: string;
|
|
202
|
+
readonly draws: readonly RenderFeatureDrawDeclaration[];
|
|
203
|
+
}
|
|
169
204
|
| {
|
|
170
205
|
readonly kind: 'compute';
|
|
171
206
|
readonly name: string;
|
|
@@ -218,6 +253,15 @@ export interface RenderFeaturePlanContext {
|
|
|
218
253
|
readonly materialShaderBindingContract?: (
|
|
219
254
|
materialShaderId: string,
|
|
220
255
|
) => RenderFeatureMaterialShaderBindingContract;
|
|
256
|
+
/** Renderer-owned camera/depth/noise resources for the current generation; undefined means unavailable this frame. */
|
|
257
|
+
readonly preparedDataInterfaces?: Readonly<
|
|
258
|
+
Partial<
|
|
259
|
+
Record<
|
|
260
|
+
'camera' | 'scene-depth' | 'noise',
|
|
261
|
+
RenderFeaturePreparedDataInterfaceResource | undefined
|
|
262
|
+
>
|
|
263
|
+
>
|
|
264
|
+
>;
|
|
221
265
|
}
|
|
222
266
|
|
|
223
267
|
/** Frozen declaration produced for one feature in one frame. */
|
|
@@ -251,34 +295,494 @@ function validName(name: string): boolean {
|
|
|
251
295
|
return /^[a-z][a-z0-9.-]{0,127}$/.test(name);
|
|
252
296
|
}
|
|
253
297
|
|
|
254
|
-
|
|
298
|
+
/** Detached accounting for the canonical plan signature path. */
|
|
299
|
+
export interface RenderFeaturePlanSignatureMetrics {
|
|
300
|
+
calls: number;
|
|
301
|
+
typedArrayBytes: number;
|
|
302
|
+
outputChars: number;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
const BYTE_HEX = '0123456789abcdef';
|
|
306
|
+
const BYTE_HEX_CHUNK_SIZE = 2048;
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Append an exact byte spelling without Array#join's per-byte number/string
|
|
310
|
+
* conversion. Inline vertex/index payloads remain part of the canonical
|
|
311
|
+
* signature; this only changes their private textual representation from a
|
|
312
|
+
* comma-separated decimal list to bounded hex chunks.
|
|
313
|
+
*/
|
|
314
|
+
function appendByteHex(value: ArrayBufferView, parts: string[]): void {
|
|
315
|
+
const bytes = new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
|
|
316
|
+
parts.push('[bytes-hex:');
|
|
317
|
+
for (let start = 0; start < bytes.length; start += BYTE_HEX_CHUNK_SIZE) {
|
|
318
|
+
const end = Math.min(bytes.length, start + BYTE_HEX_CHUNK_SIZE);
|
|
319
|
+
let encoded = '';
|
|
320
|
+
for (let index = start; index < end; index += 1) {
|
|
321
|
+
const byte = bytes[index] as number;
|
|
322
|
+
encoded += BYTE_HEX[byte >>> 4] as string;
|
|
323
|
+
encoded += BYTE_HEX[byte & 0x0f] as string;
|
|
324
|
+
}
|
|
325
|
+
parts.push(encoded);
|
|
326
|
+
}
|
|
327
|
+
parts.push(']');
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* Detached structural evidence for one plan signature.
|
|
332
|
+
*
|
|
333
|
+
* The renderer validates a plan twice: once while the feature host records
|
|
334
|
+
* the candidate signature and again while the typed graph admits that
|
|
335
|
+
* candidate. Keeping a detached structural snapshot lets the second check
|
|
336
|
+
* avoid rebuilding a large string while still detecting mutations to the
|
|
337
|
+
* shallow-frozen plan. This is intentionally a structural cache, not an
|
|
338
|
+
* object-identity shortcut.
|
|
339
|
+
*/
|
|
340
|
+
export type RenderFeaturePlanSignatureNode =
|
|
341
|
+
| { readonly kind: 'bytes'; readonly bytes: Uint8Array }
|
|
342
|
+
| {
|
|
343
|
+
readonly kind: 'array';
|
|
344
|
+
readonly values: readonly (RenderFeaturePlanSignatureNode | undefined)[];
|
|
345
|
+
}
|
|
346
|
+
| {
|
|
347
|
+
readonly kind: 'object';
|
|
348
|
+
readonly keys: readonly string[];
|
|
349
|
+
readonly values: readonly RenderFeaturePlanSignatureNode[];
|
|
350
|
+
}
|
|
351
|
+
| { readonly kind: 'primitive'; readonly token: string };
|
|
352
|
+
|
|
353
|
+
export interface RenderFeaturePlanSignatureSnapshot {
|
|
354
|
+
readonly resources: readonly RenderFeaturePlanSignatureNode[];
|
|
355
|
+
readonly passes: RenderFeaturePlanSignatureNode;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
const signatureEvidenceByPlan = new WeakMap<
|
|
359
|
+
object,
|
|
360
|
+
{
|
|
361
|
+
readonly signature: string;
|
|
362
|
+
readonly snapshot: RenderFeaturePlanSignatureSnapshot;
|
|
363
|
+
}
|
|
364
|
+
>();
|
|
365
|
+
|
|
366
|
+
// The detached evidence is deliberately checked again by graph admission.
|
|
367
|
+
// Host and graph therefore share one exact structural proof without trusting
|
|
368
|
+
// a producer-owned boolean or object identity if a plan is mutated between
|
|
369
|
+
// the two stages.
|
|
370
|
+
function compareStableKeys(left: string, right: string): number {
|
|
371
|
+
return left < right ? -1 : left > right ? 1 : 0;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
function stablePrimitiveToken(value: unknown): string {
|
|
375
|
+
return JSON.stringify(value) ?? 'undefined';
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* Clone a signature node while reusing an unchanged subtree from the prior
|
|
380
|
+
* detached snapshot. The prior node is never mutated: a changed parent gets
|
|
381
|
+
* a new frozen container and only equal children are shared. This keeps the
|
|
382
|
+
* graph-admission evidence immutable while avoiding a full tree allocation
|
|
383
|
+
* when one VFX resource/pass changes.
|
|
384
|
+
*/
|
|
385
|
+
function cloneSignatureNode(
|
|
386
|
+
value: unknown,
|
|
387
|
+
previous?: RenderFeaturePlanSignatureNode,
|
|
388
|
+
): RenderFeaturePlanSignatureNode {
|
|
389
|
+
if (ArrayBuffer.isView(value)) {
|
|
390
|
+
const bytes = new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
|
|
391
|
+
if (previous?.kind === 'bytes' && previous.bytes.byteLength === bytes.byteLength) {
|
|
392
|
+
let equal = true;
|
|
393
|
+
for (let index = 0; index < bytes.length; index += 1) {
|
|
394
|
+
if (bytes[index] !== previous.bytes[index]) {
|
|
395
|
+
equal = false;
|
|
396
|
+
break;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
if (equal) return previous;
|
|
400
|
+
}
|
|
401
|
+
return { kind: 'bytes', bytes: new Uint8Array(bytes) };
|
|
402
|
+
}
|
|
403
|
+
if (Array.isArray(value)) {
|
|
404
|
+
const values: (RenderFeaturePlanSignatureNode | undefined)[] = new Array(value.length);
|
|
405
|
+
const previousValues = previous?.kind === 'array' ? previous.values : undefined;
|
|
406
|
+
let changed = previousValues === undefined || previousValues.length !== value.length;
|
|
407
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
408
|
+
const child = value[index];
|
|
409
|
+
const prior = previousValues?.[index];
|
|
410
|
+
const next = child === undefined ? undefined : cloneSignatureNode(child, prior);
|
|
411
|
+
values[index] = next;
|
|
412
|
+
if (next !== prior) changed = true;
|
|
413
|
+
}
|
|
414
|
+
if (!changed && previous?.kind === 'array') return previous;
|
|
415
|
+
return Object.freeze({ kind: 'array', values: Object.freeze(values) });
|
|
416
|
+
}
|
|
417
|
+
if (value !== null && typeof value === 'object') {
|
|
418
|
+
const source = value as Readonly<Record<string, unknown>>;
|
|
419
|
+
const previousObject = previous?.kind === 'object' ? previous : undefined;
|
|
420
|
+
let keys: readonly string[] | undefined;
|
|
421
|
+
let changed = previousObject === undefined;
|
|
422
|
+
if (previousObject !== undefined) {
|
|
423
|
+
// Descriptor object shapes are stable across VFX revisions. Reuse the
|
|
424
|
+
// detached canonical key order after an allocation-free own-key check;
|
|
425
|
+
// only an actual add/remove falls back to Object.keys().sort().
|
|
426
|
+
let ownKeyCount = 0;
|
|
427
|
+
for (const key in source) {
|
|
428
|
+
if (Object.hasOwn(source, key)) ownKeyCount += 1;
|
|
429
|
+
}
|
|
430
|
+
if (ownKeyCount === previousObject.keys.length) {
|
|
431
|
+
let sameKeySet = true;
|
|
432
|
+
for (const key of previousObject.keys) {
|
|
433
|
+
if (!Object.hasOwn(source, key)) {
|
|
434
|
+
sameKeySet = false;
|
|
435
|
+
break;
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
if (sameKeySet) {
|
|
439
|
+
keys = previousObject.keys;
|
|
440
|
+
} else {
|
|
441
|
+
changed = true;
|
|
442
|
+
}
|
|
443
|
+
} else {
|
|
444
|
+
changed = true;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
if (keys === undefined) {
|
|
448
|
+
keys = Object.freeze(Object.keys(source).sort(compareStableKeys));
|
|
449
|
+
}
|
|
450
|
+
const values = Object.freeze(
|
|
451
|
+
keys.map((key) => {
|
|
452
|
+
const previousIndex = previousObject?.keys.indexOf(key) ?? -1;
|
|
453
|
+
const prior = previousIndex < 0 ? undefined : previousObject?.values[previousIndex];
|
|
454
|
+
const next = cloneSignatureNode(source[key], prior);
|
|
455
|
+
if (next !== prior) changed = true;
|
|
456
|
+
return next;
|
|
457
|
+
}),
|
|
458
|
+
);
|
|
459
|
+
if (!changed && previousObject !== undefined) return previousObject;
|
|
460
|
+
return Object.freeze({
|
|
461
|
+
kind: 'object',
|
|
462
|
+
keys,
|
|
463
|
+
values,
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
const token = stablePrimitiveToken(value);
|
|
467
|
+
return previous?.kind === 'primitive' && previous.token === token
|
|
468
|
+
? previous
|
|
469
|
+
: { kind: 'primitive', token };
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
function signatureResourceValue(resource: RenderFeatureResourceDeclaration): unknown {
|
|
473
|
+
if (resource.kind !== 'buffer') return resource;
|
|
474
|
+
// Match resourceTopology exactly: buffer payloads are upload evidence, not
|
|
475
|
+
// topology identity, while usage order is canonicalized before comparison.
|
|
476
|
+
return { ...resource, usage: [...resource.usage].sort(compareStableKeys), data: undefined };
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
/** Build a detached, mutation-resistant topology snapshot for one plan. */
|
|
480
|
+
export function cloneRenderFeaturePlanSignatureSnapshot(
|
|
481
|
+
plan: RenderFeaturePlan,
|
|
482
|
+
previous?: RenderFeaturePlanSignatureSnapshot,
|
|
483
|
+
): RenderFeaturePlanSignatureSnapshot {
|
|
484
|
+
const resources: RenderFeaturePlanSignatureNode[] = new Array(plan.resources.length);
|
|
485
|
+
let resourcesChanged = previous === undefined || previous.resources.length !== resources.length;
|
|
486
|
+
for (let index = 0; index < plan.resources.length; index += 1) {
|
|
487
|
+
const resource = plan.resources[index] as RenderFeatureResourceDeclaration;
|
|
488
|
+
const prior = previous?.resources[index];
|
|
489
|
+
let next: RenderFeaturePlanSignatureNode;
|
|
490
|
+
if (
|
|
491
|
+
prior !== undefined &&
|
|
492
|
+
(resource.kind === 'buffer'
|
|
493
|
+
? equalResourceNode(resource, prior)
|
|
494
|
+
: equalSignatureNode(resource, prior))
|
|
495
|
+
) {
|
|
496
|
+
next = prior;
|
|
497
|
+
} else {
|
|
498
|
+
// Buffer `data` is deliberately outside topology identity, so avoid
|
|
499
|
+
// materialising its normalized spread object on the common upload-only
|
|
500
|
+
// update path. Changed declarations still share equal descendants.
|
|
501
|
+
next = cloneSignatureNode(signatureResourceValue(resource), prior);
|
|
502
|
+
}
|
|
503
|
+
resources[index] = next;
|
|
504
|
+
if (next !== prior) resourcesChanged = true;
|
|
505
|
+
}
|
|
506
|
+
const nextResources =
|
|
507
|
+
previous !== undefined && !resourcesChanged ? previous.resources : Object.freeze(resources);
|
|
508
|
+
const nextPasses = cloneSignatureNode(plan.passes, previous?.passes);
|
|
509
|
+
if (previous !== undefined && !resourcesChanged && nextPasses === previous.passes) {
|
|
510
|
+
return previous;
|
|
511
|
+
}
|
|
512
|
+
return Object.freeze({ resources: nextResources, passes: nextPasses });
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
function equalSignatureNode(value: unknown, snapshot: RenderFeaturePlanSignatureNode): boolean {
|
|
516
|
+
if (snapshot.kind === 'bytes') {
|
|
517
|
+
if (!ArrayBuffer.isView(value) || value.byteLength !== snapshot.bytes.byteLength) return false;
|
|
518
|
+
const bytes = new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
|
|
519
|
+
for (let index = 0; index < bytes.length; index += 1) {
|
|
520
|
+
if (bytes[index] !== snapshot.bytes[index]) return false;
|
|
521
|
+
}
|
|
522
|
+
return true;
|
|
523
|
+
}
|
|
524
|
+
if (snapshot.kind === 'primitive') return stablePrimitiveToken(value) === snapshot.token;
|
|
525
|
+
if (snapshot.kind === 'array') {
|
|
526
|
+
if (!Array.isArray(value) || value.length !== snapshot.values.length) return false;
|
|
527
|
+
for (let index = 0; index < snapshot.values.length; index += 1) {
|
|
528
|
+
const expected = snapshot.values[index];
|
|
529
|
+
const current = value[index];
|
|
530
|
+
if (expected === undefined) {
|
|
531
|
+
// stable() intentionally spells holes and explicit undefined alike.
|
|
532
|
+
if (current !== undefined) return false;
|
|
533
|
+
} else if (!equalSignatureNode(current, expected)) {
|
|
534
|
+
return false;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
return true;
|
|
538
|
+
}
|
|
539
|
+
if (
|
|
540
|
+
value === null ||
|
|
541
|
+
typeof value !== 'object' ||
|
|
542
|
+
Array.isArray(value) ||
|
|
543
|
+
ArrayBuffer.isView(value)
|
|
544
|
+
) {
|
|
545
|
+
return false;
|
|
546
|
+
}
|
|
547
|
+
const source = value as Readonly<Record<string, unknown>>;
|
|
548
|
+
// Avoid allocating Object.keys(source) on every frame. The snapshot keeps
|
|
549
|
+
// the canonical key order, so an own-property count plus direct lookups is
|
|
550
|
+
// equivalent while leaving the hot validation path allocation-free.
|
|
551
|
+
let ownKeyCount = 0;
|
|
552
|
+
for (const key in source) {
|
|
553
|
+
if (Object.hasOwn(source, key)) ownKeyCount += 1;
|
|
554
|
+
}
|
|
555
|
+
if (ownKeyCount !== snapshot.keys.length) return false;
|
|
556
|
+
for (let index = 0; index < snapshot.keys.length; index += 1) {
|
|
557
|
+
const key = snapshot.keys[index] as string;
|
|
558
|
+
if (!Object.hasOwn(source, key)) return false;
|
|
559
|
+
if (
|
|
560
|
+
!equalSignatureNode(source[key], snapshot.values[index] as RenderFeaturePlanSignatureNode)
|
|
561
|
+
) {
|
|
562
|
+
return false;
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
return true;
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
function equalSortedUsage(usage: unknown, snapshot: RenderFeaturePlanSignatureNode): boolean {
|
|
569
|
+
if (
|
|
570
|
+
!Array.isArray(usage) ||
|
|
571
|
+
snapshot.kind !== 'array' ||
|
|
572
|
+
usage.length !== snapshot.values.length
|
|
573
|
+
) {
|
|
574
|
+
return false;
|
|
575
|
+
}
|
|
576
|
+
// Usage is a short string union. Compare it as a multiset so the check
|
|
577
|
+
// mirrors [...usage].sort() without allocating a sorted copy per frame.
|
|
578
|
+
for (let index = 0; index < snapshot.values.length; index += 1) {
|
|
579
|
+
const expected = snapshot.values[index];
|
|
580
|
+
if (expected === undefined || expected.kind !== 'primitive') return false;
|
|
581
|
+
let expectedCount = 0;
|
|
582
|
+
let currentCount = 0;
|
|
583
|
+
for (let candidate = 0; candidate < snapshot.values.length; candidate += 1) {
|
|
584
|
+
const sibling = snapshot.values[candidate];
|
|
585
|
+
if (
|
|
586
|
+
sibling !== undefined &&
|
|
587
|
+
sibling.kind === 'primitive' &&
|
|
588
|
+
sibling.token === expected.token
|
|
589
|
+
) {
|
|
590
|
+
expectedCount += 1;
|
|
591
|
+
}
|
|
592
|
+
if (stablePrimitiveToken(usage[candidate]) === expected.token) currentCount += 1;
|
|
593
|
+
}
|
|
594
|
+
if (expectedCount !== currentCount) return false;
|
|
595
|
+
}
|
|
596
|
+
return true;
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
function equalResourceNode(resource: unknown, snapshot: RenderFeaturePlanSignatureNode): boolean {
|
|
600
|
+
if (
|
|
601
|
+
resource === null ||
|
|
602
|
+
typeof resource !== 'object' ||
|
|
603
|
+
Array.isArray(resource) ||
|
|
604
|
+
ArrayBuffer.isView(resource) ||
|
|
605
|
+
snapshot.kind !== 'object'
|
|
606
|
+
) {
|
|
607
|
+
return false;
|
|
608
|
+
}
|
|
609
|
+
const source = resource as Readonly<Record<string, unknown>>;
|
|
610
|
+
if (source.kind !== 'buffer') return equalSignatureNode(source, snapshot);
|
|
611
|
+
|
|
612
|
+
// resourceTopology injects data: undefined even when no upload payload was
|
|
613
|
+
// authored. The live declaration may contain a typed array or omit it; both
|
|
614
|
+
// must compare equal because the payload is deliberately outside identity.
|
|
615
|
+
let comparableKeys = 0;
|
|
616
|
+
// Keep this branch allocation-free as well. Buffer declarations are among
|
|
617
|
+
// the most frequently validated resources in a frame.
|
|
618
|
+
for (const key in source) {
|
|
619
|
+
if (!Object.hasOwn(source, key)) continue;
|
|
620
|
+
if (key === 'data') continue;
|
|
621
|
+
const snapshotIndex = snapshot.keys.indexOf(key);
|
|
622
|
+
if (snapshotIndex < 0) return false;
|
|
623
|
+
comparableKeys += 1;
|
|
624
|
+
if (key === 'usage') {
|
|
625
|
+
if (
|
|
626
|
+
!equalSortedUsage(
|
|
627
|
+
source[key],
|
|
628
|
+
snapshot.values[snapshotIndex] as RenderFeaturePlanSignatureNode,
|
|
629
|
+
)
|
|
630
|
+
) {
|
|
631
|
+
return false;
|
|
632
|
+
}
|
|
633
|
+
} else if (
|
|
634
|
+
!equalSignatureNode(
|
|
635
|
+
source[key],
|
|
636
|
+
snapshot.values[snapshotIndex] as RenderFeaturePlanSignatureNode,
|
|
637
|
+
)
|
|
638
|
+
) {
|
|
639
|
+
return false;
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
let expectedComparableKeys = 0;
|
|
643
|
+
for (const key of snapshot.keys) {
|
|
644
|
+
if (key === 'data') continue;
|
|
645
|
+
expectedComparableKeys += 1;
|
|
646
|
+
if (!Object.hasOwn(source, key)) return false;
|
|
647
|
+
}
|
|
648
|
+
if (comparableKeys !== expectedComparableKeys) return false;
|
|
649
|
+
return true;
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
/** Exact structural equality against a detached signature snapshot. */
|
|
653
|
+
export function renderFeaturePlanSignatureSnapshotEquals(
|
|
654
|
+
plan: RenderFeaturePlan,
|
|
655
|
+
snapshot: RenderFeaturePlanSignatureSnapshot,
|
|
656
|
+
): boolean {
|
|
657
|
+
if (plan.resources.length !== snapshot.resources.length) return false;
|
|
658
|
+
for (let index = 0; index < plan.resources.length; index += 1) {
|
|
659
|
+
if (
|
|
660
|
+
!equalResourceNode(
|
|
661
|
+
plan.resources[index],
|
|
662
|
+
snapshot.resources[index] as RenderFeaturePlanSignatureNode,
|
|
663
|
+
)
|
|
664
|
+
) {
|
|
665
|
+
return false;
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
return equalSignatureNode(plan.passes, snapshot.passes);
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
/** Associate a freshly produced plan with detached evidence for later validation. */
|
|
672
|
+
export function rememberRenderFeaturePlanSignature(
|
|
673
|
+
plan: RenderFeaturePlan,
|
|
674
|
+
signature: string,
|
|
675
|
+
snapshot: RenderFeaturePlanSignatureSnapshot,
|
|
676
|
+
): void {
|
|
677
|
+
signatureEvidenceByPlan.set(plan as object, { signature, snapshot });
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
/**
|
|
681
|
+
* Validate an existing signature without serializing the plan again. A false
|
|
682
|
+
* result means the plan has no evidence or its nested data no longer matches;
|
|
683
|
+
* callers must then run the canonical serializer as the recovery path.
|
|
684
|
+
*/
|
|
685
|
+
export function renderFeaturePlanSignatureEvidenceMatches(
|
|
686
|
+
plan: RenderFeaturePlan,
|
|
687
|
+
signature: string,
|
|
688
|
+
): boolean {
|
|
689
|
+
const evidence = signatureEvidenceByPlan.get(plan as object);
|
|
690
|
+
return (
|
|
691
|
+
evidence !== undefined &&
|
|
692
|
+
evidence.signature === signature &&
|
|
693
|
+
renderFeaturePlanSignatureSnapshotEquals(plan, evidence.snapshot)
|
|
694
|
+
);
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
function stable(value: unknown, metrics?: RenderFeaturePlanSignatureMetrics): string {
|
|
698
|
+
const parts: string[] = [];
|
|
699
|
+
appendStable(value, parts, metrics);
|
|
700
|
+
return parts.join('');
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
function appendStable(
|
|
704
|
+
value: unknown,
|
|
705
|
+
parts: string[],
|
|
706
|
+
metrics?: RenderFeaturePlanSignatureMetrics,
|
|
707
|
+
): void {
|
|
255
708
|
if (ArrayBuffer.isView(value)) {
|
|
256
709
|
const bytes = new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
|
|
257
|
-
|
|
710
|
+
if (metrics !== undefined) metrics.typedArrayBytes += bytes.byteLength;
|
|
711
|
+
// Keep every byte in the canonical identity. Decimal Array#join creates
|
|
712
|
+
// a number/string conversion and a separator for every byte; bounded hex
|
|
713
|
+
// chunks cut that allocation footprint while remaining deterministic.
|
|
714
|
+
appendByteHex(value, parts);
|
|
715
|
+
return;
|
|
716
|
+
}
|
|
717
|
+
if (Array.isArray(value)) {
|
|
718
|
+
parts.push('[');
|
|
719
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
720
|
+
if (index > 0) parts.push(',');
|
|
721
|
+
// Array#join renders holes and an explicit undefined child as an empty
|
|
722
|
+
// field; retain that canonical spelling instead of writing "undefined".
|
|
723
|
+
if (value[index] !== undefined) appendStable(value[index], parts, metrics);
|
|
724
|
+
}
|
|
725
|
+
parts.push(']');
|
|
726
|
+
return;
|
|
258
727
|
}
|
|
259
|
-
if (Array.isArray(value)) return `[${value.map(stable).join(',')}]`;
|
|
260
728
|
if (value !== null && typeof value === 'object') {
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
729
|
+
const keys = Object.keys(value as Readonly<Record<string, unknown>>).sort((left, right) =>
|
|
730
|
+
left < right ? -1 : left > right ? 1 : 0,
|
|
731
|
+
);
|
|
732
|
+
parts.push('{');
|
|
733
|
+
for (let index = 0; index < keys.length; index += 1) {
|
|
734
|
+
const key = keys[index] as string;
|
|
735
|
+
if (index > 0) parts.push(',');
|
|
736
|
+
parts.push(JSON.stringify(key), ':');
|
|
737
|
+
appendStable((value as Readonly<Record<string, unknown>>)[key], parts, metrics);
|
|
738
|
+
}
|
|
739
|
+
parts.push('}');
|
|
740
|
+
return;
|
|
265
741
|
}
|
|
266
|
-
|
|
742
|
+
parts.push(JSON.stringify(value) ?? 'undefined');
|
|
267
743
|
}
|
|
268
744
|
|
|
269
|
-
function resourceTopology(
|
|
745
|
+
function resourceTopology(
|
|
746
|
+
resource: RenderFeatureResourceDeclaration,
|
|
747
|
+
metrics?: RenderFeaturePlanSignatureMetrics,
|
|
748
|
+
): unknown {
|
|
270
749
|
if (resource.kind === 'buffer') {
|
|
750
|
+
if (metrics !== undefined && resource.data !== undefined) {
|
|
751
|
+
metrics.typedArrayBytes += resource.data.byteLength;
|
|
752
|
+
}
|
|
271
753
|
return { ...resource, usage: [...resource.usage].sort(), data: undefined };
|
|
272
754
|
}
|
|
755
|
+
if (resource.kind === 'prepared-gpu-resource') {
|
|
756
|
+
return {
|
|
757
|
+
...resource,
|
|
758
|
+
resource:
|
|
759
|
+
resource.resource.kind === 'buffer'
|
|
760
|
+
? {
|
|
761
|
+
kind: 'buffer',
|
|
762
|
+
size: resource.resource.size,
|
|
763
|
+
usage: [...(resource.resource.usage ?? [])].sort(),
|
|
764
|
+
}
|
|
765
|
+
: { kind: resource.resource.kind },
|
|
766
|
+
};
|
|
767
|
+
}
|
|
273
768
|
return resource;
|
|
274
769
|
}
|
|
275
770
|
|
|
276
771
|
/** Canonical signature used by typed-graph topology and last-known-good swap. */
|
|
277
|
-
export function renderFeaturePlanSignature(
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
772
|
+
export function renderFeaturePlanSignature(
|
|
773
|
+
plan: RenderFeaturePlan,
|
|
774
|
+
metrics?: RenderFeaturePlanSignatureMetrics,
|
|
775
|
+
): string {
|
|
776
|
+
if (metrics !== undefined) metrics.calls += 1;
|
|
777
|
+
const signature = stable(
|
|
778
|
+
{
|
|
779
|
+
resources: plan.resources.map((resource) => resourceTopology(resource, metrics)),
|
|
780
|
+
passes: plan.passes,
|
|
781
|
+
},
|
|
782
|
+
metrics,
|
|
783
|
+
);
|
|
784
|
+
if (metrics !== undefined) metrics.outputChars += signature.length;
|
|
785
|
+
return signature;
|
|
282
786
|
}
|
|
283
787
|
|
|
284
788
|
function bindingAccess(type: GPUBufferBindingType | undefined): GraphBufferAccess | undefined {
|
|
@@ -312,6 +816,13 @@ export function deriveRenderFeaturePassAccess(
|
|
|
312
816
|
layoutEntries.find((candidate) => candidate.binding === entry.binding)?.buffer?.type,
|
|
313
817
|
);
|
|
314
818
|
if (usage !== undefined) accesses.push({ resource: entry.resource, usage });
|
|
819
|
+
const declaration = resources.get(entry.resource);
|
|
820
|
+
if (
|
|
821
|
+
declaration?.kind === 'prepared-gpu-resource' &&
|
|
822
|
+
declaration.logicalTarget !== undefined
|
|
823
|
+
) {
|
|
824
|
+
accesses.push({ resource: declaration.logicalTarget, usage: 'sampled-read' });
|
|
825
|
+
}
|
|
315
826
|
}
|
|
316
827
|
}
|
|
317
828
|
for (const dispatch of pass.dispatches) {
|
|
@@ -322,10 +833,10 @@ export function deriveRenderFeaturePassAccess(
|
|
|
322
833
|
return Object.freeze(accesses);
|
|
323
834
|
}
|
|
324
835
|
|
|
325
|
-
for (const attachment of pass.colorAttachments) {
|
|
836
|
+
for (const attachment of pass.kind === 'raster' ? pass.colorAttachments : []) {
|
|
326
837
|
accesses.push({ resource: attachment.target, usage: 'color-attachment' });
|
|
327
838
|
}
|
|
328
|
-
if (pass.depthStencilAttachment !== undefined) {
|
|
839
|
+
if (pass.kind === 'raster' && pass.depthStencilAttachment !== undefined) {
|
|
329
840
|
accesses.push({
|
|
330
841
|
resource: pass.depthStencilAttachment.target,
|
|
331
842
|
usage: pass.sampledTargets?.some(
|
|
@@ -335,7 +846,7 @@ export function deriveRenderFeaturePassAccess(
|
|
|
335
846
|
: 'depth-stencil-write',
|
|
336
847
|
});
|
|
337
848
|
}
|
|
338
|
-
for (const target of pass.sampledTargets ?? []) {
|
|
849
|
+
for (const target of pass.kind === 'raster' ? (pass.sampledTargets ?? []) : []) {
|
|
339
850
|
if (typeof target !== 'string') continue;
|
|
340
851
|
accesses.push({ resource: target, usage: 'sampled-read' });
|
|
341
852
|
}
|
|
@@ -381,6 +892,13 @@ export function freezeRenderFeaturePlan(
|
|
|
381
892
|
for (const resource of plan.resources) {
|
|
382
893
|
if (!validName(resource.name) || resources.has(resource.name))
|
|
383
894
|
return err(stageFailure(identity));
|
|
895
|
+
if (
|
|
896
|
+
resource.kind === 'prepared-gpu-resource' &&
|
|
897
|
+
resource.logicalTarget !== undefined &&
|
|
898
|
+
!targets.has(resource.logicalTarget)
|
|
899
|
+
) {
|
|
900
|
+
return err(stageFailure(identity));
|
|
901
|
+
}
|
|
384
902
|
resources.set(resource.name, resource);
|
|
385
903
|
}
|
|
386
904
|
const passes = new Set<string>();
|
|
@@ -400,11 +918,17 @@ export function freezeRenderFeaturePlan(
|
|
|
400
918
|
}
|
|
401
919
|
const entryPoints = new Set(program.program.entryPoints);
|
|
402
920
|
for (const entry of bindings.entries) {
|
|
403
|
-
const buffer = resources.get(entry.resource);
|
|
404
921
|
const layout = program.program.bindings?.[0]?.entries.find(
|
|
405
922
|
(candidate) => candidate.binding === entry.binding,
|
|
406
923
|
);
|
|
407
|
-
|
|
924
|
+
const resource = resources.get(entry.resource);
|
|
925
|
+
const validBuffer = resource?.kind === 'buffer' && layout?.buffer !== undefined;
|
|
926
|
+
const validPrepared =
|
|
927
|
+
resource?.kind === 'prepared-gpu-resource' &&
|
|
928
|
+
((resource.resource.kind === 'buffer' && layout?.buffer !== undefined) ||
|
|
929
|
+
(resource.resource.kind === 'texture-view' && layout?.texture !== undefined) ||
|
|
930
|
+
(resource.resource.kind === 'sampler' && layout?.sampler !== undefined));
|
|
931
|
+
if (!validBuffer && !validPrepared) {
|
|
408
932
|
return err(stageFailure(identity));
|
|
409
933
|
}
|
|
410
934
|
}
|
|
@@ -436,11 +960,13 @@ export function freezeRenderFeaturePlan(
|
|
|
436
960
|
|
|
437
961
|
if (
|
|
438
962
|
pass.draws.length === 0 ||
|
|
439
|
-
pass.
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
963
|
+
(pass.kind === 'raster' &&
|
|
964
|
+
(pass.colorAttachments.some((attachment) => !targets.has(attachment.target)) ||
|
|
965
|
+
(pass.depthStencilAttachment !== undefined &&
|
|
966
|
+
!targets.has(pass.depthStencilAttachment.target)) ||
|
|
967
|
+
pass.sampledTargets?.some(
|
|
968
|
+
(target) => typeof target === 'string' && !targets.has(target),
|
|
969
|
+
) === true))
|
|
444
970
|
) {
|
|
445
971
|
return err(stageFailure(identity));
|
|
446
972
|
}
|
|
@@ -448,6 +974,9 @@ export function freezeRenderFeaturePlan(
|
|
|
448
974
|
const program = resources.get(draw.program);
|
|
449
975
|
if (
|
|
450
976
|
program?.kind !== 'graphics-program' ||
|
|
977
|
+
(pass.kind === 'shadow-caster' &&
|
|
978
|
+
(program.program.colorFormats.length !== 0 ||
|
|
979
|
+
program.program.depthFormat !== 'depth32float')) ||
|
|
451
980
|
draw.bindings.some((name) => {
|
|
452
981
|
const binding = resources.get(name);
|
|
453
982
|
return binding?.kind !== 'graphics-bindings' || binding.program !== draw.program;
|