@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/host.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { EntityHandle } from '@forgeax/engine-ecs';
|
|
2
|
-
import type { RhiCaps, TextureFormat } from '@forgeax/engine-rhi';
|
|
2
|
+
import type { Buffer, RhiCaps, Sampler, TextureFormat, TextureView } from '@forgeax/engine-rhi';
|
|
3
3
|
import { err, ok, type Result } from '@forgeax/engine-types';
|
|
4
4
|
import type { DeviceScope, LifecycleResourceSpec } from '../device/device-scope';
|
|
5
5
|
import {
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
RenderFeatureStageFailedError,
|
|
11
11
|
} from '../errors/render';
|
|
12
12
|
import type { PostProcessShaderEntry } from '../fullscreen-post-process-pass';
|
|
13
|
+
import type { RenderFeatureHostInspection } from '../inspection-types';
|
|
13
14
|
import type {
|
|
14
15
|
PreparedGraphicsReference,
|
|
15
16
|
PreparedGraphicsResolvedSnapshot,
|
|
@@ -19,19 +20,26 @@ import type {
|
|
|
19
20
|
import type { SceneDataTarget } from '../temporal/scene-data';
|
|
20
21
|
import { createSceneDataCatalog, type SceneDataCatalog } from '../temporal/scene-data-catalog';
|
|
21
22
|
import {
|
|
23
|
+
cloneRenderFeaturePlanSignatureSnapshot,
|
|
22
24
|
freezeRenderFeaturePlan,
|
|
23
25
|
type RenderFeatureLogicalTarget,
|
|
24
26
|
type RenderFeatureMaterialShaderBindingContract,
|
|
25
27
|
type RenderFeaturePassDeclaration,
|
|
26
28
|
type RenderFeaturePlan,
|
|
29
|
+
type RenderFeaturePlanContext,
|
|
27
30
|
type RenderFeaturePlannedFrame,
|
|
31
|
+
type RenderFeaturePlanSignatureMetrics,
|
|
32
|
+
type RenderFeaturePlanSignatureSnapshot,
|
|
28
33
|
type RenderFeatureResourceDeclaration,
|
|
34
|
+
rememberRenderFeaturePlanSignature,
|
|
29
35
|
renderFeaturePlanSignature,
|
|
36
|
+
renderFeaturePlanSignatureSnapshotEquals,
|
|
30
37
|
} from './plan';
|
|
31
38
|
import type {
|
|
32
39
|
RenderFeatureGpuBindingsRef,
|
|
33
40
|
RenderFeatureGpuBufferRef,
|
|
34
41
|
RenderFeatureGpuComputePassDescriptor,
|
|
42
|
+
RenderFeatureGpuPreparedResourceRef,
|
|
35
43
|
RenderFeatureGpuPrepareSession,
|
|
36
44
|
RenderFeatureGpuProgramRef,
|
|
37
45
|
RenderFeatureGpuWorkOwner,
|
|
@@ -48,6 +56,7 @@ import {
|
|
|
48
56
|
type PreparedGraphicsStore,
|
|
49
57
|
type PreparedGraphicsTransaction,
|
|
50
58
|
} from './prepared-graphics-store';
|
|
59
|
+
import { isRenderFeatureTargetHandle } from './targets';
|
|
51
60
|
import type {
|
|
52
61
|
RenderFeature,
|
|
53
62
|
RenderFeatureCapabilityKey,
|
|
@@ -68,7 +77,29 @@ const planExecutionProjections = new WeakMap<
|
|
|
68
77
|
RenderFeaturePlanExecution
|
|
69
78
|
>();
|
|
70
79
|
|
|
80
|
+
const submissionAcknowledgments = new WeakMap<RenderFeaturePlannedFrame, () => void>();
|
|
81
|
+
const submissionSensitivePlans = new WeakSet<RenderFeaturePlannedFrame>();
|
|
82
|
+
|
|
83
|
+
/** A cached command graph must not replay a producer's already-consumed intents. */
|
|
84
|
+
export function hasSubmissionSensitiveFeatures(
|
|
85
|
+
plans: readonly RenderFeaturePlannedFrame[],
|
|
86
|
+
): boolean {
|
|
87
|
+
return plans.some((plan) => submissionSensitivePlans.has(plan));
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Acknowledge only plans in the submitted graph, once, including a retained graph. */
|
|
91
|
+
export function acknowledgeRenderFeatureSubmission(
|
|
92
|
+
plans: readonly RenderFeaturePlannedFrame[],
|
|
93
|
+
): void {
|
|
94
|
+
for (const plan of plans) {
|
|
95
|
+
const acknowledge = submissionAcknowledgments.get(plan);
|
|
96
|
+
submissionAcknowledgments.delete(plan);
|
|
97
|
+
acknowledge?.();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
71
101
|
export interface RenderFeaturePlanExecutionPass {
|
|
102
|
+
readonly shadowCaster?: true;
|
|
72
103
|
readonly featureIdentity: string;
|
|
73
104
|
readonly order: number;
|
|
74
105
|
readonly name: string;
|
|
@@ -115,6 +146,8 @@ export interface RenderFeatureFrameInput {
|
|
|
115
146
|
readonly materialShaderBindingContract?: (
|
|
116
147
|
materialShaderId: string,
|
|
117
148
|
) => RenderFeatureMaterialShaderBindingContract;
|
|
149
|
+
/** Renderer-owned prepared camera/depth/noise resources for feature plans. */
|
|
150
|
+
readonly preparedDataInterfaces?: RenderFeaturePlanContext['preparedDataInterfaces'];
|
|
118
151
|
readonly createPreparedGraphicsResolver?: (
|
|
119
152
|
input: RenderFeaturePreparedGraphicsResolverInput,
|
|
120
153
|
) => PreparedGraphicsResolver;
|
|
@@ -141,7 +174,17 @@ export interface RenderFeatureFrameResult {
|
|
|
141
174
|
readonly plans: readonly RenderFeaturePlannedFrame[];
|
|
142
175
|
readonly fullscreenEffects: ReadonlyMap<string, PostProcessShaderEntry>;
|
|
143
176
|
readonly preparedResourceBatches: readonly RenderFeaturePreparedResourceBatch[];
|
|
177
|
+
/**
|
|
178
|
+
* True only when the current graph resolves a transient graphics lease.
|
|
179
|
+
* Retired GPU-work leases are kept alive until queue completion but are not
|
|
180
|
+
* referenced by this candidate and therefore do not require a new graph.
|
|
181
|
+
*/
|
|
182
|
+
readonly requiresPreparedResourceKey: boolean;
|
|
144
183
|
readonly hiddenEntityReports: readonly RenderFeatureHiddenEntityReport[];
|
|
184
|
+
/** Invoke producer consumption after the frame reaches queue submission. */
|
|
185
|
+
readonly onSubmitted: () => void;
|
|
186
|
+
/** Discard producer frame state after graph admission/submission failure. */
|
|
187
|
+
readonly onAborted: () => void;
|
|
145
188
|
}
|
|
146
189
|
|
|
147
190
|
export interface RenderFeatureHost {
|
|
@@ -180,6 +223,10 @@ export interface RenderFeatureHost {
|
|
|
180
223
|
diagnostics(): readonly RenderFeatureDiagnostics[];
|
|
181
224
|
/** Subscribe to lifecycle projection changes; unchanged active frames are silent. */
|
|
182
225
|
subscribeDiagnostics(listener: () => void): () => void;
|
|
226
|
+
/** Detached signature and prepared-resource accounting for diagnostics. */
|
|
227
|
+
readonly inspection?: () => RenderFeatureHostInspection;
|
|
228
|
+
/** Host-owned signature entry point so accounting remains per feature. */
|
|
229
|
+
readonly recordPlanSignature?: (identity: string, plan: RenderFeaturePlan) => string;
|
|
183
230
|
dispose(): Result<void, RenderError>;
|
|
184
231
|
}
|
|
185
232
|
|
|
@@ -454,6 +501,7 @@ interface PreparedPlanResources {
|
|
|
454
501
|
readonly computePrograms: ReadonlyMap<string, RenderFeatureGpuProgramRef>;
|
|
455
502
|
readonly graphicsPrograms: ReadonlyMap<string, RenderFeaturePreparedRef<'pipeline'>>;
|
|
456
503
|
readonly buffers: ReadonlyMap<string, RenderFeatureGpuBufferRef>;
|
|
504
|
+
readonly preparedGpuResources: ReadonlyMap<string, RenderFeatureGpuPreparedResourceRef>;
|
|
457
505
|
readonly computeBindings: ReadonlyMap<string, RenderFeatureGpuBindingsRef>;
|
|
458
506
|
readonly graphicsBindings: ReadonlyMap<string, RenderFeaturePreparedRef<'bindings'>>;
|
|
459
507
|
readonly vertexData: ReadonlyMap<string, RenderFeaturePreparedRef<'vertex-data'>>;
|
|
@@ -498,6 +546,7 @@ function preparePlanResources(
|
|
|
498
546
|
const computePrograms = new Map<string, RenderFeatureGpuProgramRef>();
|
|
499
547
|
const graphicsPrograms = new Map<string, RenderFeaturePreparedRef<'pipeline'>>();
|
|
500
548
|
const buffers = new Map<string, RenderFeatureGpuBufferRef>();
|
|
549
|
+
const preparedGpuResources = new Map<string, RenderFeatureGpuPreparedResourceRef>();
|
|
501
550
|
const computeBindings = new Map<string, RenderFeatureGpuBindingsRef>();
|
|
502
551
|
const graphicsBindings = new Map<string, RenderFeaturePreparedRef<'bindings'>>();
|
|
503
552
|
const vertexData = new Map<string, RenderFeaturePreparedRef<'vertex-data'>>();
|
|
@@ -511,7 +560,9 @@ function preparePlanResources(
|
|
|
511
560
|
if (
|
|
512
561
|
gpu === undefined &&
|
|
513
562
|
plan.resources.some((resource) =>
|
|
514
|
-
['compute-program', 'buffer', 'compute-bindings'].includes(
|
|
563
|
+
['compute-program', 'buffer', 'prepared-gpu-resource', 'compute-bindings'].includes(
|
|
564
|
+
resource.kind,
|
|
565
|
+
),
|
|
515
566
|
)
|
|
516
567
|
) {
|
|
517
568
|
return err(planFailure(slot));
|
|
@@ -537,21 +588,60 @@ function preparePlanResources(
|
|
|
537
588
|
if (!prepared.ok) return prepared;
|
|
538
589
|
buffers.set(resource.name, prepared.value);
|
|
539
590
|
}
|
|
591
|
+
for (const resource of byKind('prepared-gpu-resource')) {
|
|
592
|
+
if (gpu === undefined) return err(planFailure(slot));
|
|
593
|
+
if (resource.resource.kind === 'buffer') {
|
|
594
|
+
const prepared = gpu.prepareBufferResource(resource.name, resource.resource.value as Buffer, {
|
|
595
|
+
size: resource.resource.size,
|
|
596
|
+
usage: resource.resource.usage ?? ['uniform'],
|
|
597
|
+
});
|
|
598
|
+
if (!prepared.ok) return prepared;
|
|
599
|
+
preparedGpuResources.set(resource.name, { kind: 'buffer', reference: prepared.value });
|
|
600
|
+
continue;
|
|
601
|
+
}
|
|
602
|
+
if (resource.resource.kind === 'texture-view') {
|
|
603
|
+
const logical =
|
|
604
|
+
resource.logicalTarget === undefined
|
|
605
|
+
? undefined
|
|
606
|
+
: targetHandle(resource.logicalTarget, targets);
|
|
607
|
+
if (
|
|
608
|
+
resource.logicalTarget !== undefined &&
|
|
609
|
+
(logical === undefined || !isRenderFeatureTargetHandle(logical))
|
|
610
|
+
) {
|
|
611
|
+
return err(planFailure(slot));
|
|
612
|
+
}
|
|
613
|
+
const prepared = gpu.prepareTextureView(
|
|
614
|
+
resource.name,
|
|
615
|
+
resource.resource.value as TextureView,
|
|
616
|
+
logical === undefined || !isRenderFeatureTargetHandle(logical) ? undefined : logical,
|
|
617
|
+
);
|
|
618
|
+
if (!prepared.ok) return prepared;
|
|
619
|
+
preparedGpuResources.set(resource.name, {
|
|
620
|
+
kind: 'texture-view',
|
|
621
|
+
reference: prepared.value,
|
|
622
|
+
});
|
|
623
|
+
continue;
|
|
624
|
+
}
|
|
625
|
+
const prepared = gpu.prepareSampler(resource.name, resource.resource.value as Sampler);
|
|
626
|
+
if (!prepared.ok) return prepared;
|
|
627
|
+
preparedGpuResources.set(resource.name, { kind: 'sampler', reference: prepared.value });
|
|
628
|
+
}
|
|
540
629
|
for (const resource of byKind('compute-bindings')) {
|
|
541
630
|
const program = computePrograms.get(resource.program);
|
|
542
|
-
const entries = resource.entries.map((entry) =>
|
|
543
|
-
|
|
544
|
-
buffer:
|
|
545
|
-
|
|
546
|
-
|
|
631
|
+
const entries = resource.entries.map((entry) => {
|
|
632
|
+
const buffer = buffers.get(entry.resource);
|
|
633
|
+
if (buffer !== undefined) return { binding: entry.binding, buffer } as const;
|
|
634
|
+
const prepared = preparedGpuResources.get(entry.resource);
|
|
635
|
+
return prepared === undefined
|
|
636
|
+
? undefined
|
|
637
|
+
: ({ binding: entry.binding, resource: prepared } as const);
|
|
638
|
+
});
|
|
639
|
+
if (program === undefined || entries.some((entry) => entry === undefined)) {
|
|
547
640
|
return err(planFailure(slot));
|
|
548
641
|
}
|
|
549
642
|
const prepared = gpu?.prepareBindings(resource.name, {
|
|
550
643
|
program,
|
|
551
|
-
entries: entries
|
|
552
|
-
binding: entry.binding,
|
|
553
|
-
buffer: entry.buffer as RenderFeatureGpuBufferRef,
|
|
554
|
-
})),
|
|
644
|
+
entries: entries as NonNullable<(typeof entries)[number]>[],
|
|
555
645
|
});
|
|
556
646
|
if (prepared === undefined) return err(planFailure(slot));
|
|
557
647
|
if (!prepared.ok) return prepared;
|
|
@@ -600,6 +690,7 @@ function preparePlanResources(
|
|
|
600
690
|
computePrograms,
|
|
601
691
|
graphicsPrograms,
|
|
602
692
|
buffers,
|
|
693
|
+
preparedGpuResources,
|
|
603
694
|
computeBindings,
|
|
604
695
|
graphicsBindings,
|
|
605
696
|
vertexData,
|
|
@@ -802,14 +893,14 @@ function projectPlanPasses(
|
|
|
802
893
|
? declaration.program.colorFormats[0]
|
|
803
894
|
: undefined;
|
|
804
895
|
})();
|
|
805
|
-
const colors = pass.colorAttachments.map((attachment) => ({
|
|
896
|
+
const colors = (pass.kind === 'raster' ? pass.colorAttachments : []).map((attachment) => ({
|
|
806
897
|
resource: targetHandle(attachment.target, targets),
|
|
807
898
|
format: targetFormat(attachment.target, logical, fallbackFormat),
|
|
808
899
|
loadOp: attachment.loadOp,
|
|
809
900
|
storeOp: attachment.storeOp,
|
|
810
901
|
}));
|
|
811
902
|
const depth =
|
|
812
|
-
pass.depthStencilAttachment === undefined
|
|
903
|
+
pass.kind !== 'raster' || pass.depthStencilAttachment === undefined
|
|
813
904
|
? undefined
|
|
814
905
|
: {
|
|
815
906
|
resource: targetHandle(pass.depthStencilAttachment.target, targets),
|
|
@@ -817,7 +908,9 @@ function projectPlanPasses(
|
|
|
817
908
|
depthLoadOp: pass.depthStencilAttachment.depthLoadOp,
|
|
818
909
|
depthStoreOp: pass.depthStencilAttachment.depthStoreOp,
|
|
819
910
|
};
|
|
820
|
-
const sampledTargets = (pass.sampledTargets ?? []).map((name) =>
|
|
911
|
+
const sampledTargets = (pass.kind === 'raster' ? (pass.sampledTargets ?? []) : []).map((name) =>
|
|
912
|
+
targetHandle(name, targets),
|
|
913
|
+
);
|
|
821
914
|
if (
|
|
822
915
|
colors.some(
|
|
823
916
|
(attachment) => attachment.resource === undefined || attachment.format === undefined,
|
|
@@ -862,6 +955,7 @@ function projectPlanPasses(
|
|
|
862
955
|
order: slot.order,
|
|
863
956
|
name: pass.name,
|
|
864
957
|
graphics: descriptor,
|
|
958
|
+
...(pass.kind === 'shadow-caster' ? { shadowCaster: true as const } : {}),
|
|
865
959
|
graphicsState: graphicsState.value,
|
|
866
960
|
...(resolved?.ok === true ? { resolvedGraphics: resolved.value } : {}),
|
|
867
961
|
});
|
|
@@ -898,6 +992,22 @@ class FeatureHostImpl implements RenderFeatureHost {
|
|
|
898
992
|
private generation = 0;
|
|
899
993
|
private lastRecoveryFrame: number | undefined;
|
|
900
994
|
private readonly diagnosticsListeners = new Set<() => void>();
|
|
995
|
+
private readonly signatureByFeature = new Map<
|
|
996
|
+
string,
|
|
997
|
+
RenderFeatureHostInspection['signatures'][number]
|
|
998
|
+
>();
|
|
999
|
+
private readonly signatureCacheByFeature = new Map<
|
|
1000
|
+
string,
|
|
1001
|
+
{ readonly signature: string; readonly snapshot: RenderFeaturePlanSignatureSnapshot }
|
|
1002
|
+
>();
|
|
1003
|
+
/** Monotonic compact identity for a changed feature-plan snapshot. */
|
|
1004
|
+
private signatureRevision = 0;
|
|
1005
|
+
private readonly preparedInspection = {
|
|
1006
|
+
retained: 0,
|
|
1007
|
+
submitted: 0,
|
|
1008
|
+
released: 0,
|
|
1009
|
+
releaseFailures: 0,
|
|
1010
|
+
};
|
|
901
1011
|
private readonly preparedBatchStates = new WeakMap<
|
|
902
1012
|
RenderFeaturePreparedResourceBatch,
|
|
903
1013
|
'unsubmitted' | 'submitted'
|
|
@@ -917,6 +1027,77 @@ class FeatureHostImpl implements RenderFeatureHost {
|
|
|
917
1027
|
return this.slots.map((slot) => slot.feature);
|
|
918
1028
|
}
|
|
919
1029
|
|
|
1030
|
+
recordPlanSignature(identity: string, plan: RenderFeaturePlan): string {
|
|
1031
|
+
const now = (): number => (typeof performance === 'undefined' ? Date.now() : performance.now());
|
|
1032
|
+
const started = now();
|
|
1033
|
+
const previous = this.signatureCacheByFeature.get(identity);
|
|
1034
|
+
if (
|
|
1035
|
+
previous !== undefined &&
|
|
1036
|
+
renderFeaturePlanSignatureSnapshotEquals(plan, previous.snapshot)
|
|
1037
|
+
) {
|
|
1038
|
+
const elapsed = now() - started;
|
|
1039
|
+
const priorInspection = this.signatureByFeature.get(identity);
|
|
1040
|
+
this.signatureByFeature.set(identity, {
|
|
1041
|
+
featureIdentity: identity,
|
|
1042
|
+
calls: priorInspection?.calls ?? 0,
|
|
1043
|
+
typedArrayBytes: priorInspection?.typedArrayBytes ?? 0,
|
|
1044
|
+
outputChars: priorInspection?.outputChars ?? 0,
|
|
1045
|
+
cpuMs: (priorInspection?.cpuMs ?? 0) + elapsed,
|
|
1046
|
+
cacheHits: (priorInspection?.cacheHits ?? 0) + 1,
|
|
1047
|
+
cacheMisses: priorInspection?.cacheMisses ?? 0,
|
|
1048
|
+
});
|
|
1049
|
+
// The graph validator receives a fresh plan object every frame. Reuse
|
|
1050
|
+
// is safe only because it will perform the same exact structural check
|
|
1051
|
+
// against this detached snapshot.
|
|
1052
|
+
rememberRenderFeaturePlanSignature(plan, previous.signature, previous.snapshot);
|
|
1053
|
+
return previous.signature;
|
|
1054
|
+
}
|
|
1055
|
+
// A changed plan usually mutates a small VFX membership/pass leaf. Keep
|
|
1056
|
+
// the previous detached evidence as a sharing source so unchanged
|
|
1057
|
+
// resource/program subtrees remain immutable and allocation-free; the
|
|
1058
|
+
// candidate snapshot is still a fresh root and is revalidated by graph
|
|
1059
|
+
// admission exactly as before.
|
|
1060
|
+
const snapshot = cloneRenderFeaturePlanSignatureSnapshot(plan, previous?.snapshot);
|
|
1061
|
+
// Keep one canonical spelling for the initial diagnostic/API observation.
|
|
1062
|
+
// Subsequent changes only need a compact monotonic identity: the detached
|
|
1063
|
+
// snapshot remains the exact structural proof and avoids rebuilding
|
|
1064
|
+
// megabytes of text for every VFX plan revision.
|
|
1065
|
+
const metrics: RenderFeaturePlanSignatureMetrics = {
|
|
1066
|
+
calls: 0,
|
|
1067
|
+
typedArrayBytes: 0,
|
|
1068
|
+
outputChars: 0,
|
|
1069
|
+
};
|
|
1070
|
+
const signature =
|
|
1071
|
+
previous === undefined
|
|
1072
|
+
? renderFeaturePlanSignature(plan, metrics)
|
|
1073
|
+
: `revision-${++this.signatureRevision}`;
|
|
1074
|
+
this.signatureCacheByFeature.set(identity, { signature, snapshot });
|
|
1075
|
+
rememberRenderFeaturePlanSignature(plan, signature, snapshot);
|
|
1076
|
+
const elapsed = now() - started;
|
|
1077
|
+
const priorInspection = this.signatureByFeature.get(identity);
|
|
1078
|
+
this.signatureByFeature.set(identity, {
|
|
1079
|
+
featureIdentity: identity,
|
|
1080
|
+
calls: (priorInspection?.calls ?? 0) + metrics.calls,
|
|
1081
|
+
typedArrayBytes: (priorInspection?.typedArrayBytes ?? 0) + metrics.typedArrayBytes,
|
|
1082
|
+
outputChars: (priorInspection?.outputChars ?? 0) + metrics.outputChars,
|
|
1083
|
+
cpuMs: (priorInspection?.cpuMs ?? 0) + elapsed,
|
|
1084
|
+
cacheHits: priorInspection?.cacheHits ?? 0,
|
|
1085
|
+
cacheMisses: (priorInspection?.cacheMisses ?? 0) + 1,
|
|
1086
|
+
});
|
|
1087
|
+
return signature;
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1090
|
+
inspection(): RenderFeatureHostInspection {
|
|
1091
|
+
return Object.freeze({
|
|
1092
|
+
signatures: Object.freeze(
|
|
1093
|
+
[...this.signatureByFeature.values()]
|
|
1094
|
+
.sort((left, right) => left.featureIdentity.localeCompare(right.featureIdentity))
|
|
1095
|
+
.map((entry) => Object.freeze({ ...entry })),
|
|
1096
|
+
),
|
|
1097
|
+
prepared: Object.freeze({ ...this.preparedInspection }),
|
|
1098
|
+
});
|
|
1099
|
+
}
|
|
1100
|
+
|
|
920
1101
|
createRecoveryRoot(scope: DeviceScope): LifecycleResourceSpec<unknown> {
|
|
921
1102
|
return {
|
|
922
1103
|
kind: 'feature',
|
|
@@ -978,6 +1159,8 @@ class FeatureHostImpl implements RenderFeatureHost {
|
|
|
978
1159
|
}
|
|
979
1160
|
slot.status = 'disposed';
|
|
980
1161
|
this.slots.splice(index, 1);
|
|
1162
|
+
this.signatureByFeature.delete(feature.identity);
|
|
1163
|
+
this.signatureCacheByFeature.delete(feature.identity);
|
|
981
1164
|
for (const [order, remaining] of this.slots.entries()) remaining.order = order;
|
|
982
1165
|
this.publishDiagnosticsChanged();
|
|
983
1166
|
return firstError === undefined ? ok(undefined) : err(firstError);
|
|
@@ -1055,11 +1238,14 @@ class FeatureHostImpl implements RenderFeatureHost {
|
|
|
1055
1238
|
const result = lease.release();
|
|
1056
1239
|
if (!result.ok && firstError === undefined) firstError = result.error;
|
|
1057
1240
|
}
|
|
1241
|
+
this.preparedInspection.released += 1;
|
|
1242
|
+
if (firstError !== undefined) this.preparedInspection.releaseFailures += 1;
|
|
1058
1243
|
return firstError === undefined ? ok(undefined) : err(firstError);
|
|
1059
1244
|
},
|
|
1060
1245
|
};
|
|
1061
1246
|
this.preparedBatchStates.set(batch, 'unsubmitted');
|
|
1062
1247
|
slot.preparedResourceBatches.add(batch);
|
|
1248
|
+
this.preparedInspection.retained += 1;
|
|
1063
1249
|
return ok(batch);
|
|
1064
1250
|
}
|
|
1065
1251
|
|
|
@@ -1067,6 +1253,7 @@ class FeatureHostImpl implements RenderFeatureHost {
|
|
|
1067
1253
|
for (const batch of batches) {
|
|
1068
1254
|
if (this.preparedBatchStates.get(batch) === 'unsubmitted') {
|
|
1069
1255
|
this.preparedBatchStates.set(batch, 'submitted');
|
|
1256
|
+
this.preparedInspection.submitted += 1;
|
|
1070
1257
|
}
|
|
1071
1258
|
}
|
|
1072
1259
|
}
|
|
@@ -1166,9 +1353,11 @@ export function runRenderFeatureFrame(
|
|
|
1166
1353
|
const plans: RenderFeaturePlannedFrame[] = [];
|
|
1167
1354
|
const fullscreenEffects = new Map<string, PostProcessShaderEntry>();
|
|
1168
1355
|
const preparedResourceBatches: RenderFeaturePreparedResourceBatch[] = [];
|
|
1356
|
+
let requiresPreparedResourceKey = false;
|
|
1169
1357
|
const hiddenEntityReports: RenderFeatureHiddenEntityReport[] = [
|
|
1170
1358
|
...(input.hiddenEntityReports ?? []),
|
|
1171
1359
|
];
|
|
1360
|
+
const abortedCallbacks: (() => void)[] = [];
|
|
1172
1361
|
|
|
1173
1362
|
const diagnostics = host.diagnostics();
|
|
1174
1363
|
for (const [order, feature] of host.features.entries()) {
|
|
@@ -1247,6 +1436,9 @@ export function runRenderFeatureFrame(
|
|
|
1247
1436
|
...(input.materialShaderBindingContract === undefined
|
|
1248
1437
|
? {}
|
|
1249
1438
|
: { materialShaderBindingContract: input.materialShaderBindingContract }),
|
|
1439
|
+
...(input.preparedDataInterfaces === undefined
|
|
1440
|
+
? {}
|
|
1441
|
+
: { preparedDataInterfaces: input.preparedDataInterfaces }),
|
|
1250
1442
|
}),
|
|
1251
1443
|
stageEvents,
|
|
1252
1444
|
errors,
|
|
@@ -1266,7 +1458,9 @@ export function runRenderFeatureFrame(
|
|
|
1266
1458
|
const plannedFrame: RenderFeaturePlannedFrame = Object.freeze({
|
|
1267
1459
|
featureIdentity: identity,
|
|
1268
1460
|
generation: transaction.generation,
|
|
1269
|
-
signature:
|
|
1461
|
+
signature:
|
|
1462
|
+
host.recordPlanSignature?.(identity, frozen.value) ??
|
|
1463
|
+
renderFeaturePlanSignature(frozen.value),
|
|
1270
1464
|
plan: frozen.value,
|
|
1271
1465
|
});
|
|
1272
1466
|
for (const resource of frozen.value.resources) {
|
|
@@ -1335,10 +1529,11 @@ export function runRenderFeatureFrame(
|
|
|
1335
1529
|
host.setStatus(identity, 'failed', slot.latestError);
|
|
1336
1530
|
continue;
|
|
1337
1531
|
}
|
|
1338
|
-
const
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1532
|
+
const graphicsLeases = projected.value.passes.flatMap(
|
|
1533
|
+
(pass) => pass.resolvedGraphics?.leases ?? [],
|
|
1534
|
+
);
|
|
1535
|
+
if (graphicsLeases.length > 0) requiresPreparedResourceKey = true;
|
|
1536
|
+
const leases = [...new Set(graphicsLeases), ...(gpu?.retireUntouched() ?? [])];
|
|
1342
1537
|
const retained = host.retainPreparedGraphics(identity, leases);
|
|
1343
1538
|
if (!retained.ok) {
|
|
1344
1539
|
recordFailure(slot, 'plan', retained.error, errors);
|
|
@@ -1347,19 +1542,42 @@ export function runRenderFeatureFrame(
|
|
|
1347
1542
|
continue;
|
|
1348
1543
|
}
|
|
1349
1544
|
planExecutionProjections.set(plannedFrame, projected.value);
|
|
1545
|
+
if (feature.onFrameSubmitted !== undefined) {
|
|
1546
|
+
submissionSensitivePlans.add(plannedFrame);
|
|
1547
|
+
submissionAcknowledgments.set(plannedFrame, () =>
|
|
1548
|
+
feature.onFrameSubmitted?.(extracted.value),
|
|
1549
|
+
);
|
|
1550
|
+
}
|
|
1350
1551
|
plans.push(plannedFrame);
|
|
1552
|
+
if (feature.onFrameAborted !== undefined) {
|
|
1553
|
+
abortedCallbacks.push(() => feature.onFrameAborted?.(extracted.value));
|
|
1554
|
+
}
|
|
1351
1555
|
if (leases.length > 0) preparedResourceBatches.push(retained.value);
|
|
1352
1556
|
hiddenEntityReports.push(...featureHiddenEntityReports);
|
|
1353
1557
|
host.setStatus(identity, 'active');
|
|
1354
1558
|
}
|
|
1355
1559
|
|
|
1560
|
+
let submitted = false;
|
|
1561
|
+
let aborted = false;
|
|
1356
1562
|
return {
|
|
1357
1563
|
stageEvents,
|
|
1358
1564
|
errors,
|
|
1359
1565
|
plans,
|
|
1360
1566
|
fullscreenEffects,
|
|
1361
1567
|
preparedResourceBatches,
|
|
1568
|
+
requiresPreparedResourceKey,
|
|
1362
1569
|
hiddenEntityReports: mergeHiddenEntityReports(hiddenEntityReports),
|
|
1570
|
+
onSubmitted: () => {
|
|
1571
|
+
if (submitted || aborted) return;
|
|
1572
|
+
submitted = true;
|
|
1573
|
+
acknowledgeRenderFeatureSubmission(plans);
|
|
1574
|
+
},
|
|
1575
|
+
onAborted: () => {
|
|
1576
|
+
if (submitted || aborted) return;
|
|
1577
|
+
aborted = true;
|
|
1578
|
+
for (const plan of plans) submissionAcknowledgments.delete(plan);
|
|
1579
|
+
for (const callback of abortedCallbacks) callback();
|
|
1580
|
+
},
|
|
1363
1581
|
};
|
|
1364
1582
|
}
|
|
1365
1583
|
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { RhiDevice, RhiError, Texture, TextureView } from '@forgeax/engine-rhi';
|
|
2
|
+
import { ok, type Result } from '@forgeax/engine-types';
|
|
3
|
+
import type { DeviceScope } from '../device/device-scope';
|
|
4
|
+
import {
|
|
5
|
+
GPU_TEXTURE_USAGE_COPY_DST,
|
|
6
|
+
GPU_TEXTURE_USAGE_TEXTURE_BINDING,
|
|
7
|
+
} from '../gpu-texture-usage';
|
|
8
|
+
|
|
9
|
+
/** A reproducible, filterable RGBA noise field; each channel has an independent sample. */
|
|
10
|
+
export function createFeatureNoisePixels(): Uint8Array {
|
|
11
|
+
const pixels = new Uint8Array(64 * 64 * 4);
|
|
12
|
+
let state = 0x6d2b79f5;
|
|
13
|
+
for (let index = 0; index < pixels.length; index++) {
|
|
14
|
+
state ^= state << 13;
|
|
15
|
+
state ^= state >>> 17;
|
|
16
|
+
state ^= state << 5;
|
|
17
|
+
pixels[index] = state >>> 24;
|
|
18
|
+
}
|
|
19
|
+
return pixels;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** The caller's device scope owns the texture, like the other built-in material inputs. */
|
|
23
|
+
export function createFeatureNoiseTexture(
|
|
24
|
+
device: RhiDevice,
|
|
25
|
+
): Result<{ readonly texture: Texture; readonly view: TextureView }, RhiError> {
|
|
26
|
+
const texture = device.createTexture({
|
|
27
|
+
label: 'feature-noise-64x64',
|
|
28
|
+
size: { width: 64, height: 64 },
|
|
29
|
+
format: 'rgba8unorm',
|
|
30
|
+
usage: GPU_TEXTURE_USAGE_COPY_DST | GPU_TEXTURE_USAGE_TEXTURE_BINDING,
|
|
31
|
+
textureBindingViewDimension: undefined,
|
|
32
|
+
});
|
|
33
|
+
if (!texture.ok) return texture;
|
|
34
|
+
const uploaded = device.queue.writeTexture(
|
|
35
|
+
{ texture: texture.value },
|
|
36
|
+
createFeatureNoisePixels(),
|
|
37
|
+
{ bytesPerRow: 256, rowsPerImage: 64 },
|
|
38
|
+
{ width: 64, height: 64 },
|
|
39
|
+
);
|
|
40
|
+
if (!uploaded.ok) {
|
|
41
|
+
device.destroyTexture(texture.value);
|
|
42
|
+
return uploaded;
|
|
43
|
+
}
|
|
44
|
+
const view = device.createTextureView(texture.value, {
|
|
45
|
+
label: 'feature-noise-view',
|
|
46
|
+
dimension: '2d',
|
|
47
|
+
});
|
|
48
|
+
if (!view.ok) {
|
|
49
|
+
device.destroyTexture(texture.value);
|
|
50
|
+
return view;
|
|
51
|
+
}
|
|
52
|
+
return ok({ texture: texture.value, view: view.value });
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Lazily provisions one generation-owned noise view for feature preparation. */
|
|
56
|
+
export function createFeatureNoiseResolver(input: {
|
|
57
|
+
readonly scope: DeviceScope;
|
|
58
|
+
readonly getDevice: () => RhiDevice;
|
|
59
|
+
readonly onError: (error: RhiError) => void;
|
|
60
|
+
}): (frameNumber: number) => TextureView | undefined {
|
|
61
|
+
let current:
|
|
62
|
+
| { readonly device: RhiDevice; readonly generation: number; readonly view: TextureView }
|
|
63
|
+
| undefined;
|
|
64
|
+
let attempt:
|
|
65
|
+
| { readonly device: RhiDevice; readonly generation: number; readonly frameNumber: number }
|
|
66
|
+
| undefined;
|
|
67
|
+
return (frameNumber) => {
|
|
68
|
+
const device = input.getDevice();
|
|
69
|
+
const generation = input.scope.generation;
|
|
70
|
+
if (current?.device === device && current.generation === generation) return current.view;
|
|
71
|
+
if (
|
|
72
|
+
attempt?.device === device &&
|
|
73
|
+
attempt.generation === generation &&
|
|
74
|
+
attempt.frameNumber === frameNumber
|
|
75
|
+
) {
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
current = undefined;
|
|
79
|
+
attempt = { device, generation, frameNumber };
|
|
80
|
+
const created = createFeatureNoiseTexture(device);
|
|
81
|
+
if (!created.ok) {
|
|
82
|
+
input.onError(created.error);
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
input.scope._adopt('texture', created.value.texture, (value) => {
|
|
86
|
+
device.destroyTexture(value);
|
|
87
|
+
});
|
|
88
|
+
current = { device, generation, view: created.value.view };
|
|
89
|
+
return current.view;
|
|
90
|
+
};
|
|
91
|
+
}
|