@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/record/main-pass.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { World } from '@forgeax/engine-ecs';
|
|
2
2
|
import { probeVideoHighPerfUpload } from '@forgeax/engine-graphics-extras';
|
|
3
|
+
import type { GraphResourceResolver } from '@forgeax/engine-render-graph';
|
|
3
4
|
import {
|
|
4
5
|
type BindGroup,
|
|
5
6
|
RhiError,
|
|
@@ -7,16 +8,24 @@ import {
|
|
|
7
8
|
type TextureView,
|
|
8
9
|
} from '@forgeax/engine-rhi';
|
|
9
10
|
import type { PassKind, PassSelector } from '@forgeax/engine-types';
|
|
10
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
createGpuDrivenLightingBindGroup,
|
|
13
|
+
createHdrpUnifiedBindGroup,
|
|
14
|
+
getOrCreateHdrpBuffers,
|
|
15
|
+
} from '../hdrp-buffers';
|
|
11
16
|
import { getOrCreateIblCache } from '../ibl/IblPipelineCache';
|
|
12
17
|
import type { SkylightBindGroupResources } from '../ibl/skylight-bind-group';
|
|
13
18
|
import { buildBeginRenderPassDescriptor, standardTopologyBindGroupReady } from '../pipeline-spec';
|
|
14
19
|
import { POINTS_LINES_MATERIAL_SHADER_ID } from '../points-lines/record';
|
|
15
20
|
import type { ReflectionProbeSelectionResult } from '../reflection/projection';
|
|
16
21
|
import type { RenderRecordPhase } from '../render-contract';
|
|
22
|
+
import type {
|
|
23
|
+
GpuDrivenStandardPbrFrameResources,
|
|
24
|
+
RenderPipelineGpuDrivenProjection,
|
|
25
|
+
} from '../render-pipeline';
|
|
17
26
|
import type { MaterialSnapshot } from '../render-system-extract';
|
|
18
27
|
import { resolveReflectionProbeBinding } from './frame-lighting';
|
|
19
|
-
import { getOpaqueResourceIdentity } from './frame-snapshot';
|
|
28
|
+
import { getOpaqueResourceIdentity, worldEntityKey } from './frame-snapshot';
|
|
20
29
|
import { recordGeometryDraws } from './main-pass-geometry';
|
|
21
30
|
import {
|
|
22
31
|
buildPerSubmeshMaterialBg as buildPerSubmeshMaterialBgImpl,
|
|
@@ -57,7 +66,17 @@ export type MainPassOptions = {
|
|
|
57
66
|
readonly passKind?: PassKind;
|
|
58
67
|
readonly clearColor?: readonly [number, number, number, number];
|
|
59
68
|
readonly recordMode?: 'opaque' | 'transmission' | 'transparent';
|
|
69
|
+
/** Exclude material/pass pairs already consumed by an earlier graph lane. */
|
|
70
|
+
readonly excludeSelector?: PassSelector;
|
|
71
|
+
/** Require the same material to contribute to another graph lane. */
|
|
72
|
+
readonly includeSelector?: PassSelector;
|
|
60
73
|
readonly transmissionBackdropView?: TextureView | null;
|
|
74
|
+
/** Select the material temporal entry's binary coverage output. */
|
|
75
|
+
readonly coverageOnly?: boolean;
|
|
76
|
+
readonly gpuDriven?: {
|
|
77
|
+
readonly projection: RenderPipelineGpuDrivenProjection;
|
|
78
|
+
readonly resources: GraphResourceResolver;
|
|
79
|
+
};
|
|
61
80
|
};
|
|
62
81
|
|
|
63
82
|
function isTransmissionMaterial(material: MaterialSnapshot): boolean {
|
|
@@ -117,7 +136,7 @@ export function recordMainPass(
|
|
|
117
136
|
selector?: PassSelector,
|
|
118
137
|
options?: MainPassOptions,
|
|
119
138
|
graphPass?: RhiRenderPassEncoder,
|
|
120
|
-
):
|
|
139
|
+
): GpuDrivenStandardPbrFrameResources | undefined {
|
|
121
140
|
const {
|
|
122
141
|
runtime,
|
|
123
142
|
world,
|
|
@@ -143,6 +162,8 @@ export function recordMainPass(
|
|
|
143
162
|
materialSlots,
|
|
144
163
|
materialSlotOwners,
|
|
145
164
|
materialSlotCount,
|
|
165
|
+
gpuDrivenStandardPbrFrameResources,
|
|
166
|
+
gpuDrivenSceneMaterialBuffer,
|
|
146
167
|
} = c;
|
|
147
168
|
// bug-20260615 M3 / m3-1: sampleCount is threaded through every
|
|
148
169
|
// getMaterialShaderPipeline call site so the cache key / builder
|
|
@@ -280,7 +301,14 @@ export function recordMainPass(
|
|
|
280
301
|
const matchedIndices =
|
|
281
302
|
selector !== undefined ? buildMatchedRenderableIndices(dispatch, selector) : null;
|
|
282
303
|
const selectorMatchedMaterials =
|
|
283
|
-
selector !== undefined
|
|
304
|
+
selector !== undefined
|
|
305
|
+
? buildMatchedMaterialHandlesByRenderable(
|
|
306
|
+
dispatch,
|
|
307
|
+
selector,
|
|
308
|
+
options?.excludeSelector,
|
|
309
|
+
options?.includeSelector,
|
|
310
|
+
)
|
|
311
|
+
: null;
|
|
284
312
|
const matchedMaterials = matchedMaterialsForRecordMode(c, selectorMatchedMaterials, recordMode);
|
|
285
313
|
const selectedDispatch =
|
|
286
314
|
dispatch.length === 0
|
|
@@ -447,6 +475,13 @@ export function recordMainPass(
|
|
|
447
475
|
// which cannot render a PBR decal). Captures only frame-stable closure
|
|
448
476
|
// state; the caller passes the per-submesh material snapshot + entityKey
|
|
449
477
|
// (for video texture routing) and sets the dynamic UBO offset itself.
|
|
478
|
+
// Selection keys use the extracted frame index, never World.identity.
|
|
479
|
+
const hasProbeBindings = (c.reflectionProbes?.table.rows.length ?? 0) > 0;
|
|
480
|
+
const worldIndices = hasProbeBindings
|
|
481
|
+
? new Map(
|
|
482
|
+
validatedOrdered.map((entry) => [entry.world ?? world, entry.source.worldId] as const),
|
|
483
|
+
)
|
|
484
|
+
: undefined;
|
|
450
485
|
const perSubmeshMaterialBgDeps: PerSubmeshMaterialBgDeps = {
|
|
451
486
|
runtime,
|
|
452
487
|
pipelineState,
|
|
@@ -458,8 +493,10 @@ export function recordMainPass(
|
|
|
458
493
|
resolveRenderTargetTextureSource: runtime.resolveRenderTargetTextureSource,
|
|
459
494
|
resolveReflectionProbeResources: (materialWorld, entityKey) => {
|
|
460
495
|
const reflectionProbes = c.reflectionProbes;
|
|
461
|
-
if (reflectionProbes === undefined) return undefined;
|
|
462
|
-
const selection = reflectionProbes.selections.get(
|
|
496
|
+
if (reflectionProbes === undefined || !hasProbeBindings) return undefined;
|
|
497
|
+
const selection = reflectionProbes.selections.get(
|
|
498
|
+
`${worldIndices?.get(materialWorld)}:${entityKey}`,
|
|
499
|
+
);
|
|
463
500
|
if (selection === undefined) return undefined;
|
|
464
501
|
const binding = resolveReflectionProbeBinding(selection, reflectionProbes.table);
|
|
465
502
|
if (binding.useSkylight || binding.probeIndex === undefined) return undefined;
|
|
@@ -477,17 +514,26 @@ export function recordMainPass(
|
|
|
477
514
|
irradianceView: skylightResources.irradianceView,
|
|
478
515
|
irradianceSampler: skylightResources.irradianceSampler,
|
|
479
516
|
prefilterView: row.filteredView,
|
|
517
|
+
skylightPrefilterView: skylightResources.prefilterView,
|
|
480
518
|
prefilterSampler: row.sampler,
|
|
481
519
|
brdfLutView: skylightResources.brdfLutView,
|
|
482
520
|
brdfLutSampler: skylightResources.brdfLutSampler,
|
|
483
521
|
intensityBuffer: row.uniformBuffer,
|
|
484
522
|
};
|
|
485
|
-
return probeResources;
|
|
523
|
+
return { resources: probeResources, probeIndex: row.index };
|
|
486
524
|
},
|
|
487
525
|
materialBgShared: frameState.materialBgShared,
|
|
488
526
|
materialBgAssemblyCache: c.materialBgAssemblyCache,
|
|
489
527
|
frameState,
|
|
490
528
|
bindGroupCounts,
|
|
529
|
+
...(gpuDrivenStandardPbrFrameResources?.sceneMaterialBuffer === undefined &&
|
|
530
|
+
gpuDrivenSceneMaterialBuffer === undefined
|
|
531
|
+
? {}
|
|
532
|
+
: {
|
|
533
|
+
sceneMaterialBuffer:
|
|
534
|
+
gpuDrivenStandardPbrFrameResources?.sceneMaterialBuffer ??
|
|
535
|
+
gpuDrivenSceneMaterialBuffer,
|
|
536
|
+
}),
|
|
491
537
|
...(transmissionBackdropView === undefined ? {} : { transmissionBackdropView }),
|
|
492
538
|
};
|
|
493
539
|
const buildPerSubmeshMaterialBg = (
|
|
@@ -503,7 +549,6 @@ export function recordMainPass(
|
|
|
503
549
|
materialWorld,
|
|
504
550
|
materialShaderId,
|
|
505
551
|
);
|
|
506
|
-
|
|
507
552
|
// Static material resources are a property of the frame-local material
|
|
508
553
|
// slot, not of each submesh draw. Resolve them once here so the geometry
|
|
509
554
|
// loop only selects a prepared binding. Video fields remain entity-bound:
|
|
@@ -513,7 +558,7 @@ export function recordMainPass(
|
|
|
513
558
|
for (let materialSlot = 0; materialSlot < materialSlotCount; materialSlot += 1) {
|
|
514
559
|
const material = materialSlots[materialSlot];
|
|
515
560
|
if (material === undefined || (material.videoTextureFields?.size ?? 0) > 0) continue;
|
|
516
|
-
const owner =
|
|
561
|
+
const owner = materialSlotOwners[materialSlot];
|
|
517
562
|
if (owner === undefined) continue;
|
|
518
563
|
preparedMaterialBindGroups[materialSlot] = buildPerSubmeshMaterialBg(
|
|
519
564
|
material,
|
|
@@ -521,6 +566,60 @@ export function recordMainPass(
|
|
|
521
566
|
owner.world ?? world,
|
|
522
567
|
);
|
|
523
568
|
}
|
|
569
|
+
if (gpuDrivenStandardPbrFrameResources !== undefined) {
|
|
570
|
+
gpuDrivenStandardPbrFrameResources.resolveClusteredMeshBindGroup = (binding) => {
|
|
571
|
+
const buffers = getOrCreateHdrpBuffers(
|
|
572
|
+
runtime,
|
|
573
|
+
frameState.installedPipelineConfig?.clusterGrid,
|
|
574
|
+
);
|
|
575
|
+
const layout =
|
|
576
|
+
binding.paletteBuffer === undefined
|
|
577
|
+
? pipelineState.hdrpMeshBindGroupLayout
|
|
578
|
+
: pipelineState.hdrpSkinMeshBindGroupLayout;
|
|
579
|
+
const group =
|
|
580
|
+
buffers === null || layout == null
|
|
581
|
+
? null
|
|
582
|
+
: createGpuDrivenLightingBindGroup(
|
|
583
|
+
runtime,
|
|
584
|
+
buffers,
|
|
585
|
+
layout,
|
|
586
|
+
binding,
|
|
587
|
+
c.hdrpSsaoBlurredView,
|
|
588
|
+
);
|
|
589
|
+
if (group === null)
|
|
590
|
+
throw new RhiError({
|
|
591
|
+
code: 'rhi-not-available',
|
|
592
|
+
expected: 'scene-index clustered lighting binding',
|
|
593
|
+
hint: 'publish scene rows and the current lighting/AO resources before indirect drawing',
|
|
594
|
+
});
|
|
595
|
+
return group;
|
|
596
|
+
};
|
|
597
|
+
gpuDrivenStandardPbrFrameResources.materialBindGroups.length = 0;
|
|
598
|
+
gpuDrivenStandardPbrFrameResources.materialBindGroups.push(...preparedMaterialBindGroups);
|
|
599
|
+
gpuDrivenStandardPbrFrameResources.colorFormats = colorFormats;
|
|
600
|
+
const selectedMaterialSlots = new Set<number>();
|
|
601
|
+
if (matchedMaterials === null)
|
|
602
|
+
delete gpuDrivenStandardPbrFrameResources.selectedMaterialSlots;
|
|
603
|
+
else gpuDrivenStandardPbrFrameResources.selectedMaterialSlots = selectedMaterialSlots;
|
|
604
|
+
gpuDrivenStandardPbrFrameResources.materialSlotIndicesByEntity.clear();
|
|
605
|
+
for (let index = 0; index < validatedOrdered.length; index += 1) {
|
|
606
|
+
const entry = validatedOrdered[index];
|
|
607
|
+
if (entry === undefined) continue;
|
|
608
|
+
const selected = matchedMaterials?.get(entry.renderableIndex);
|
|
609
|
+
const materials =
|
|
610
|
+
entry.source.materials.length > 0 ? entry.source.materials : [entry.source.material];
|
|
611
|
+
for (let slot = 0; slot < materials.length; slot += 1) {
|
|
612
|
+
const handle = materials[slot]?.materialHandle ?? -1;
|
|
613
|
+
const globalSlot = materialSlotIndices[index]?.[slot];
|
|
614
|
+
if (globalSlot !== undefined && selected?.has(handle))
|
|
615
|
+
selectedMaterialSlots.add(globalSlot);
|
|
616
|
+
}
|
|
617
|
+
gpuDrivenStandardPbrFrameResources.materialSlotIndicesByEntity.set(
|
|
618
|
+
worldEntityKey(entry.source.worldId, entry.source.entityKey),
|
|
619
|
+
materialSlotIndices[index] ?? [],
|
|
620
|
+
);
|
|
621
|
+
}
|
|
622
|
+
}
|
|
524
623
|
const resolveMaterialBindGroup = (
|
|
525
624
|
materialSlot: number,
|
|
526
625
|
material: MaterialSnapshot,
|
|
@@ -528,6 +627,7 @@ export function recordMainPass(
|
|
|
528
627
|
materialWorld: World = world,
|
|
529
628
|
materialShaderId: string | undefined = material.materialShaderId,
|
|
530
629
|
): BindGroup =>
|
|
630
|
+
!hasProbeBindings &&
|
|
531
631
|
materialShaderId === material.materialShaderId &&
|
|
532
632
|
materialShaderId !== POINTS_LINES_MATERIAL_SHADER_ID
|
|
533
633
|
? (preparedMaterialBindGroups[materialSlot] ??
|
|
@@ -554,6 +654,8 @@ export function recordMainPass(
|
|
|
554
654
|
resolveMaterialBindGroup,
|
|
555
655
|
passKind,
|
|
556
656
|
selectedDispatch,
|
|
657
|
+
colorFormats,
|
|
658
|
+
options?.coverageOnly ?? false,
|
|
557
659
|
);
|
|
558
660
|
};
|
|
559
661
|
if (c.profilePhase === undefined) {
|
|
@@ -566,6 +668,33 @@ export function recordMainPass(
|
|
|
566
668
|
);
|
|
567
669
|
}
|
|
568
670
|
|
|
671
|
+
if (options?.gpuDriven !== undefined) {
|
|
672
|
+
if (viewBindGroup === null) {
|
|
673
|
+
throw new RhiError({
|
|
674
|
+
code: 'rhi-not-available',
|
|
675
|
+
expected: 'main-pass Standard PBR view bind group for GPU-driven encode',
|
|
676
|
+
hint: 'publish the current frame view/light/shadow bind group before GPU raster',
|
|
677
|
+
});
|
|
678
|
+
}
|
|
679
|
+
if (
|
|
680
|
+
gpuDrivenStandardPbrFrameResources === undefined ||
|
|
681
|
+
gpuDrivenStandardPbrFrameResources.materialBindGroups.length === 0 ||
|
|
682
|
+
gpuDrivenStandardPbrFrameResources.materialBindGroups.some((group) => group === undefined)
|
|
683
|
+
) {
|
|
684
|
+
throw new RhiError({
|
|
685
|
+
code: 'rhi-not-available',
|
|
686
|
+
expected: 'complete main-pass Standard PBR material bind-group receipt',
|
|
687
|
+
hint: 'finish frame material producer assembly before GPU-driven encode',
|
|
688
|
+
});
|
|
689
|
+
}
|
|
690
|
+
options.gpuDriven.projection.encode(
|
|
691
|
+
viewBindGroup,
|
|
692
|
+
pass,
|
|
693
|
+
options.gpuDriven.resources,
|
|
694
|
+
gpuDrivenStandardPbrFrameResources,
|
|
695
|
+
);
|
|
696
|
+
}
|
|
697
|
+
|
|
569
698
|
// D-2: LDR sprite pass. Runs after the geometry pass when there are
|
|
570
699
|
// sprite entities in the draw list and the LDR path is active.
|
|
571
700
|
// The geometry pass used the bgra8unorm-srgb sRGB view (hardware sRGB
|
|
@@ -583,7 +712,6 @@ export function recordMainPass(
|
|
|
583
712
|
materialSlotIndices,
|
|
584
713
|
sampleCount,
|
|
585
714
|
resolveMaterialBindGroup,
|
|
586
|
-
skylightResources,
|
|
587
715
|
graphPass,
|
|
588
716
|
selectedDispatch,
|
|
589
717
|
);
|
|
@@ -593,6 +721,7 @@ export function recordMainPass(
|
|
|
593
721
|
if (!geometryPassEnded && graphPass === undefined) {
|
|
594
722
|
pass.end();
|
|
595
723
|
}
|
|
724
|
+
return gpuDrivenStandardPbrFrameResources;
|
|
596
725
|
}
|
|
597
726
|
|
|
598
727
|
export function encodeMainPass(
|
|
@@ -600,6 +729,6 @@ export function encodeMainPass(
|
|
|
600
729
|
pass: RhiRenderPassEncoder,
|
|
601
730
|
selector?: PassSelector,
|
|
602
731
|
options?: MainPassOptions,
|
|
603
|
-
):
|
|
604
|
-
recordMainPass(c, selector, options, pass);
|
|
732
|
+
): GpuDrivenStandardPbrFrameResources | undefined {
|
|
733
|
+
return recordMainPass(c, selector, options, pass);
|
|
605
734
|
}
|
|
@@ -41,7 +41,7 @@ export function uploadMaterialUniforms(c: _InternalRenderPipelineContext): void
|
|
|
41
41
|
);
|
|
42
42
|
for (let materialSlot = 0; materialSlot < materialSlots.length; materialSlot += 1) {
|
|
43
43
|
const mat = materialSlots[materialSlot];
|
|
44
|
-
const entry =
|
|
44
|
+
const entry = materialSlotOwners[materialSlot];
|
|
45
45
|
if (mat === undefined || entry === undefined) continue;
|
|
46
46
|
|
|
47
47
|
// feat-20260625-refactor-sprite-as-transparent-mesh M3 / w13 (D-2):
|
package/src/record/mesh-ssbo.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { mat3 } from '@forgeax/engine-math';
|
|
2
2
|
import { type BindGroup, type Buffer, RhiError, type RhiQueue } from '@forgeax/engine-rhi';
|
|
3
|
+
import { ok, type Result } from '@forgeax/engine-types';
|
|
3
4
|
import type { DispatchEntry } from '../render-system-extract';
|
|
4
5
|
import {
|
|
5
6
|
TRANSPARENT_SORT_MODE_LAYER_Y,
|
|
@@ -127,6 +128,42 @@ export function getOrCreateFromChain(
|
|
|
127
128
|
return bg;
|
|
128
129
|
}
|
|
129
130
|
|
|
131
|
+
/**
|
|
132
|
+
* Result-preserving sibling of `getOrCreateFromChain`. RHI creation can fail
|
|
133
|
+
* transiently during recovery or capability probing; a failed attempt must
|
|
134
|
+
* not enter the cache and must remain a structured Result for the caller.
|
|
135
|
+
*/
|
|
136
|
+
export function getOrCreateFromChainResult<E>(
|
|
137
|
+
root: WeakMap<object, unknown>,
|
|
138
|
+
handles: readonly object[],
|
|
139
|
+
variant: string,
|
|
140
|
+
factory: () => Result<BindGroup, E>,
|
|
141
|
+
counts: { createBindGroup: number; keys: string[] },
|
|
142
|
+
): Result<BindGroup, E> {
|
|
143
|
+
let node = root;
|
|
144
|
+
for (const h of handles) {
|
|
145
|
+
let next = node.get(h) as WeakMap<object, unknown> | undefined;
|
|
146
|
+
if (next === undefined) {
|
|
147
|
+
next = new WeakMap();
|
|
148
|
+
node.set(h, next);
|
|
149
|
+
}
|
|
150
|
+
node = next;
|
|
151
|
+
}
|
|
152
|
+
let leaf = node.get(BIND_GROUP_CHAIN_LEAF_KEY) as Map<string, BindGroup> | undefined;
|
|
153
|
+
if (leaf === undefined) {
|
|
154
|
+
leaf = new Map();
|
|
155
|
+
node.set(BIND_GROUP_CHAIN_LEAF_KEY, leaf);
|
|
156
|
+
}
|
|
157
|
+
const hit = leaf.get(variant);
|
|
158
|
+
if (hit !== undefined) return ok(hit);
|
|
159
|
+
const created = factory();
|
|
160
|
+
if (!created.ok) return created;
|
|
161
|
+
counts.createBindGroup += 1;
|
|
162
|
+
counts.keys.push(variant);
|
|
163
|
+
leaf.set(variant, created.value);
|
|
164
|
+
return created;
|
|
165
|
+
}
|
|
166
|
+
|
|
130
167
|
/**
|
|
131
168
|
* Read a cached bind group using the same variable-depth chain contract as
|
|
132
169
|
* `getOrCreateFromChain`. Readers must traverse the terminal marker instead
|
|
@@ -376,6 +413,7 @@ export function uploadMeshSsboBatch(
|
|
|
376
413
|
meshStorageBuffer: { readonly buffer: Buffer },
|
|
377
414
|
validatedOrdered: readonly ValidatedRenderable[],
|
|
378
415
|
foldDispatchPlan: FoldDispatchPlan | null,
|
|
416
|
+
startSlot = 0,
|
|
379
417
|
): void {
|
|
380
418
|
const slotCount = validatedOrdered.length;
|
|
381
419
|
const neededBytes = slotCount * MESH_PER_ENTITY_STRIDE;
|
|
@@ -450,7 +488,7 @@ export function uploadMeshSsboBatch(
|
|
|
450
488
|
if (neededBytes > 0) {
|
|
451
489
|
const meshUpload = queue.writeBuffer(
|
|
452
490
|
meshStorageBuffer.buffer,
|
|
453
|
-
|
|
491
|
+
startSlot * MESH_PER_ENTITY_STRIDE,
|
|
454
492
|
_meshSsboScratch,
|
|
455
493
|
0,
|
|
456
494
|
neededBytes,
|
|
@@ -511,17 +549,26 @@ export interface FoldBucket {
|
|
|
511
549
|
* minimal shape. The gate read inside the helper uses `=== true` /
|
|
512
550
|
* `!== true` so both `false` and `undefined` enter the singleton branch.
|
|
513
551
|
*
|
|
514
|
-
* feat-20260625-refactor-sprite-as-transparent-mesh R2 fix-up:
|
|
515
|
-
*
|
|
516
|
-
*
|
|
517
|
-
*
|
|
518
|
-
* `splitLdrSprite` filter at render-system-record.ts:4826/5612 uses).
|
|
552
|
+
* feat-20260625-refactor-sprite-as-transparent-mesh R2 fix-up: the
|
|
553
|
+
* transparent flag identifies the LDR split sub-pass, while the shader id
|
|
554
|
+
* identifies the sprite owner that is safe to fold. Standard PBR Alpha Blend
|
|
555
|
+
* remains singleton so its geometry pass keeps one projection row per draw.
|
|
519
556
|
*/
|
|
520
557
|
export interface FoldRenderableLike {
|
|
521
558
|
readonly transform: { readonly world: Float32Array };
|
|
522
559
|
readonly material: { readonly transparent?: boolean | undefined };
|
|
523
560
|
}
|
|
524
561
|
|
|
562
|
+
const FOLDABLE_TRANSPARENT_SHADER_IDS = new Set(['forgeax::sprite', 'forgeax::sprite-lit']);
|
|
563
|
+
|
|
564
|
+
function isFoldEligible(entry: DispatchEntry, renderables: readonly FoldRenderableLike[]): boolean {
|
|
565
|
+
return (
|
|
566
|
+
renderables[entry.renderableIndex]?.material.transparent === true &&
|
|
567
|
+
entry.materialShaderId !== undefined &&
|
|
568
|
+
FOLDABLE_TRANSPARENT_SHADER_IDS.has(entry.materialShaderId)
|
|
569
|
+
);
|
|
570
|
+
}
|
|
571
|
+
|
|
525
572
|
/**
|
|
526
573
|
* Linear-scan fold operator (plan-strategy D-1).
|
|
527
574
|
*
|
|
@@ -588,7 +635,7 @@ export function foldDispatchBuckets(
|
|
|
588
635
|
// identity and renders the 3D geometry at the origin — collapsing the
|
|
589
636
|
// frame to black (hello-room CI regression).
|
|
590
637
|
//
|
|
591
|
-
// Concept-count fix: encode "fold is transparent-sub-pass-only" at the
|
|
638
|
+
// Concept-count fix: encode "fold is transparent-sprite-sub-pass-only" at the
|
|
592
639
|
// head selection point — the gate is the single bucket-key invariant
|
|
593
640
|
// that makes both dispatch sites correct without coupling identity-
|
|
594
641
|
// overwrite logic to a separate check (avoiding the D-9 shared-exit
|
|
@@ -603,10 +650,9 @@ export function foldDispatchBuckets(
|
|
|
603
650
|
//
|
|
604
651
|
// feat-20260625 R2 fix-up: pre-feat the gate was `shadingModel ===
|
|
605
652
|
// 'sprite'`; M3 / w15 narrowed the shadingModel union to
|
|
606
|
-
// `'unlit' | undefined
|
|
607
|
-
//
|
|
608
|
-
//
|
|
609
|
-
// on `computeSplitLdrSprite` + the `splitLdrSprite` skip filter.
|
|
653
|
+
// `'unlit' | undefined`. The current gate retains the transparent SSOT
|
|
654
|
+
// and adds the explicit sprite shader identity so Standard PBR Alpha Blend
|
|
655
|
+
// cannot enter this fold path.
|
|
610
656
|
const buckets: FoldBucket[] = [];
|
|
611
657
|
let runStart = 0;
|
|
612
658
|
while (runStart < orderedEntries.length) {
|
|
@@ -621,8 +667,7 @@ export function foldDispatchBuckets(
|
|
|
621
667
|
// carrier (extract stage derives it from the first pass's
|
|
622
668
|
// `renderState.blend !== undefined`, post-feat-20260626-collapse;
|
|
623
669
|
// see `MaterialSnapshot.transparent`).
|
|
624
|
-
|
|
625
|
-
if (headTransparent !== true) {
|
|
670
|
+
if (!isFoldEligible(head, renderables)) {
|
|
626
671
|
buckets.push(makeSingletonBucket(head, renderables, mode));
|
|
627
672
|
runStart += 1;
|
|
628
673
|
continue;
|
|
@@ -638,8 +683,7 @@ export function foldDispatchBuckets(
|
|
|
638
683
|
// Same materialHandle implies same transparent flag in production
|
|
639
684
|
// (material asset identity), but the check costs O(1) per cand and
|
|
640
685
|
// makes the bucket invariant locally readable.
|
|
641
|
-
|
|
642
|
-
if (candTransparent !== true) break;
|
|
686
|
+
if (!isFoldEligible(cand, renderables)) break;
|
|
643
687
|
const candSortKey = readSortKey(mode, cand.renderableIndex, renderables);
|
|
644
688
|
if (candSortKey !== headSortKey) break;
|
|
645
689
|
runEnd += 1;
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { resolveAssetHandle } from '@forgeax/engine-assets-runtime';
|
|
2
|
+
import type { World } from '@forgeax/engine-ecs';
|
|
3
|
+
import type { BindGroupEntry, BindGroupLayout, Buffer } from '@forgeax/engine-rhi';
|
|
4
|
+
import { err, ok } from '@forgeax/engine-rhi';
|
|
5
|
+
import {
|
|
6
|
+
derive,
|
|
7
|
+
type Handle,
|
|
8
|
+
type MaterialAsset,
|
|
9
|
+
type MaterialTextureValue,
|
|
10
|
+
materialValuesToLinearRuntime,
|
|
11
|
+
type SamplerAsset,
|
|
12
|
+
} from '@forgeax/engine-types';
|
|
13
|
+
import { transmissionBackdropAvailable } from '../assembly/device-feature-admission';
|
|
14
|
+
import { GPU_BUFFER_USAGE_COPY_DST, GPU_BUFFER_USAGE_UNIFORM } from '../gpu-usage';
|
|
15
|
+
import type { SkylightBindGroupResources } from '../ibl/skylight-bind-group';
|
|
16
|
+
import { assembleMaterialWithSkylightEntries } from '../ibl/skylight-bind-group';
|
|
17
|
+
import {
|
|
18
|
+
applyParamSchemaDefaultsToUbo,
|
|
19
|
+
applyParamSnapshotToUbo,
|
|
20
|
+
defaultViewForUserRegionField,
|
|
21
|
+
residentTextureView,
|
|
22
|
+
} from './main-pass-material';
|
|
23
|
+
import type { RenderSystemInternals } from './render-context';
|
|
24
|
+
|
|
25
|
+
export type PreparedResolverCaches = {
|
|
26
|
+
readonly preparedPipelineIds: WeakMap<object, string>;
|
|
27
|
+
readonly preparedMaterialPipelineShaders: WeakMap<object, string>;
|
|
28
|
+
readonly preparedGroup0Pipelines: WeakSet<object>;
|
|
29
|
+
readonly preparedViewOnlyPipelines: WeakSet<object>;
|
|
30
|
+
readonly preparedRenderMaterialPipelines: WeakSet<object>;
|
|
31
|
+
readonly preparedAssetHandles: WeakMap<World, Map<string, number>>;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export function createPreparedResolverCaches(): PreparedResolverCaches {
|
|
35
|
+
return {
|
|
36
|
+
preparedPipelineIds: new WeakMap(),
|
|
37
|
+
preparedMaterialPipelineShaders: new WeakMap(),
|
|
38
|
+
preparedGroup0Pipelines: new WeakSet(),
|
|
39
|
+
preparedViewOnlyPipelines: new WeakSet(),
|
|
40
|
+
preparedRenderMaterialPipelines: new WeakSet(),
|
|
41
|
+
preparedAssetHandles: new WeakMap(),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function preparedHandle<Brand extends string>(
|
|
46
|
+
runtime: RenderSystemInternals,
|
|
47
|
+
caches: PreparedResolverCaches,
|
|
48
|
+
world: World,
|
|
49
|
+
guid: string,
|
|
50
|
+
brand: Brand,
|
|
51
|
+
): Handle<Brand, 'shared'> | undefined {
|
|
52
|
+
let handles = caches.preparedAssetHandles.get(world);
|
|
53
|
+
if (handles === undefined) {
|
|
54
|
+
handles = new Map();
|
|
55
|
+
caches.preparedAssetHandles.set(world, handles);
|
|
56
|
+
}
|
|
57
|
+
const key = `${brand}:${guid.toLowerCase()}`;
|
|
58
|
+
const cached = handles.get(key);
|
|
59
|
+
if (cached !== undefined) return cached as Handle<Brand, 'shared'>;
|
|
60
|
+
const asset = runtime.assets.lookup(guid);
|
|
61
|
+
if (asset === undefined) return undefined;
|
|
62
|
+
const handle = world.allocSharedRef(brand, asset);
|
|
63
|
+
handles.set(key, handle as number);
|
|
64
|
+
return handle;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function preparedMaterialBindings(
|
|
68
|
+
runtime: RenderSystemInternals,
|
|
69
|
+
caches: PreparedResolverCaches,
|
|
70
|
+
worlds: readonly World[],
|
|
71
|
+
materialShaderId: string,
|
|
72
|
+
worldIndex: number,
|
|
73
|
+
materialGuid: string,
|
|
74
|
+
layout: BindGroupLayout,
|
|
75
|
+
skylightResources?: SkylightBindGroupResources,
|
|
76
|
+
) {
|
|
77
|
+
const world = worlds[worldIndex];
|
|
78
|
+
const material = runtime.assets.lookup(materialGuid) as MaterialAsset | undefined;
|
|
79
|
+
const pipelineState = runtime.getPipelineState();
|
|
80
|
+
if (world === undefined || material?.kind !== 'material' || pipelineState === null) {
|
|
81
|
+
return err(new Error('prepared material asset is unavailable'));
|
|
82
|
+
}
|
|
83
|
+
const schema = runtime.getParamSchema?.(materialShaderId) ?? [];
|
|
84
|
+
// Feature materials share the ordinary linear parameter domain and semantic texture defaults.
|
|
85
|
+
const values = materialValuesToLinearRuntime(
|
|
86
|
+
material.values,
|
|
87
|
+
[...schema, ...(material.parameters ?? [])],
|
|
88
|
+
material.colorSpace,
|
|
89
|
+
);
|
|
90
|
+
const derived = derive(schema);
|
|
91
|
+
const fields = [...derived.textureFieldNames];
|
|
92
|
+
let buffer: Buffer | undefined;
|
|
93
|
+
let payloadByteLength = 0;
|
|
94
|
+
if (derived.uboLayout.totalBytes > 0) {
|
|
95
|
+
const payload = new Uint8Array(Math.max(16, derived.uboLayout.totalBytes));
|
|
96
|
+
applyParamSchemaDefaultsToUbo(payload, schema);
|
|
97
|
+
applyParamSnapshotToUbo(
|
|
98
|
+
payload,
|
|
99
|
+
schema,
|
|
100
|
+
values as Readonly<Record<string, number | readonly number[]>>,
|
|
101
|
+
);
|
|
102
|
+
const created = runtime.device.createBuffer({
|
|
103
|
+
label: `prepared-material:${materialGuid}`,
|
|
104
|
+
size: payload.byteLength,
|
|
105
|
+
usage: GPU_BUFFER_USAGE_UNIFORM | GPU_BUFFER_USAGE_COPY_DST,
|
|
106
|
+
});
|
|
107
|
+
if (!created.ok) return created;
|
|
108
|
+
buffer = created.value;
|
|
109
|
+
payloadByteLength = payload.byteLength;
|
|
110
|
+
const written = runtime.device.queue.writeBuffer(buffer, 0, payload);
|
|
111
|
+
if (!written.ok) {
|
|
112
|
+
runtime.device.destroyBuffer(buffer);
|
|
113
|
+
return written;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const textureResources: Array<{
|
|
117
|
+
sampler: import('@forgeax/engine-rhi').Sampler;
|
|
118
|
+
view: import('@forgeax/engine-rhi').TextureView;
|
|
119
|
+
}> = [];
|
|
120
|
+
for (const field of fields) {
|
|
121
|
+
if (field === undefined) continue;
|
|
122
|
+
const value = values[field];
|
|
123
|
+
const textureValue =
|
|
124
|
+
typeof value === 'object' && value !== null && 'texture' in value
|
|
125
|
+
? (value as MaterialTextureValue)
|
|
126
|
+
: undefined;
|
|
127
|
+
let sampler = pipelineState.defaultSampler;
|
|
128
|
+
if (textureValue?.sampler !== undefined) {
|
|
129
|
+
const handle = preparedHandle(
|
|
130
|
+
runtime,
|
|
131
|
+
caches,
|
|
132
|
+
world,
|
|
133
|
+
String(textureValue.sampler),
|
|
134
|
+
'SamplerAsset',
|
|
135
|
+
);
|
|
136
|
+
if (handle !== undefined) {
|
|
137
|
+
const asset = resolveAssetHandle<SamplerAsset>(world, handle);
|
|
138
|
+
if (asset.ok) {
|
|
139
|
+
const resident = runtime.gpuStore.ensureSamplerResident(handle, asset.value, world);
|
|
140
|
+
if (resident.ok) sampler = resident.value;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
let view = defaultViewForUserRegionField(field, pipelineState, schema);
|
|
145
|
+
if (textureValue !== undefined) {
|
|
146
|
+
const handle = preparedHandle(
|
|
147
|
+
runtime,
|
|
148
|
+
caches,
|
|
149
|
+
world,
|
|
150
|
+
String(textureValue.texture),
|
|
151
|
+
'TextureAsset',
|
|
152
|
+
);
|
|
153
|
+
if (handle !== undefined) {
|
|
154
|
+
view = residentTextureView(world, runtime.gpuStore, runtime, handle) ?? view;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
textureResources.push({ sampler, view });
|
|
158
|
+
}
|
|
159
|
+
const entries: BindGroupEntry[] = [];
|
|
160
|
+
let textureIndex = 0;
|
|
161
|
+
for (let index = 0; index < derived.bglEntries.length; index += 1) {
|
|
162
|
+
const expected = derived.bglEntries[index];
|
|
163
|
+
if (expected?.buffer?.type === 'uniform' && buffer !== undefined) {
|
|
164
|
+
entries.push({
|
|
165
|
+
binding: expected.binding,
|
|
166
|
+
resource: { kind: 'buffer', value: { buffer, size: payloadByteLength } },
|
|
167
|
+
});
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
const textureResource = textureResources[textureIndex];
|
|
171
|
+
if (
|
|
172
|
+
expected?.sampler?.type === 'filtering' &&
|
|
173
|
+
derived.bglEntries[index + 1]?.texture !== undefined &&
|
|
174
|
+
textureResource !== undefined
|
|
175
|
+
) {
|
|
176
|
+
entries.push({
|
|
177
|
+
binding: expected.binding,
|
|
178
|
+
resource: { kind: 'sampler', value: textureResource.sampler },
|
|
179
|
+
});
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
if (expected?.texture !== undefined && textureResource !== undefined) {
|
|
183
|
+
entries.push({
|
|
184
|
+
binding: expected.binding,
|
|
185
|
+
resource: { kind: 'textureView', value: textureResource.view },
|
|
186
|
+
});
|
|
187
|
+
textureIndex += 1;
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
if (buffer !== undefined) runtime.device.destroyBuffer(buffer);
|
|
191
|
+
return err(new Error('prepared material schema contains unsupported binding kinds'));
|
|
192
|
+
}
|
|
193
|
+
const fallback = pipelineState.skylightFallback;
|
|
194
|
+
if (fallback === null) {
|
|
195
|
+
if (buffer !== undefined) runtime.device.destroyBuffer(buffer);
|
|
196
|
+
return err(new Error('prepared material skylight fallback is unavailable'));
|
|
197
|
+
}
|
|
198
|
+
const completeEntries = assembleMaterialWithSkylightEntries(
|
|
199
|
+
entries,
|
|
200
|
+
skylightResources ?? {
|
|
201
|
+
irradianceView: fallback.irradianceView,
|
|
202
|
+
irradianceSampler: fallback.sampler,
|
|
203
|
+
prefilterView: fallback.prefilterView,
|
|
204
|
+
prefilterSampler: fallback.sampler,
|
|
205
|
+
brdfLutView: fallback.brdfLutView,
|
|
206
|
+
brdfLutSampler: fallback.sampler,
|
|
207
|
+
intensityBuffer: fallback.intensityBuffer,
|
|
208
|
+
},
|
|
209
|
+
transmissionBackdropAvailable(runtime.device.limits.maxSampledTexturesPerShaderStage)
|
|
210
|
+
? undefined
|
|
211
|
+
: null,
|
|
212
|
+
);
|
|
213
|
+
// Per-shader PBR layouts reserve the scene-material SSBO at binding 46 on
|
|
214
|
+
// storage-capable devices. Prepared feature materials use this same layout,
|
|
215
|
+
// so they must provide the neutral producer-owned table even when their
|
|
216
|
+
// authored shader does not read it. Omitting the entry makes Dawn reject the
|
|
217
|
+
// bind group before submission.
|
|
218
|
+
if (runtime.device.caps.storageBuffer) {
|
|
219
|
+
completeEntries.push({
|
|
220
|
+
binding: 46,
|
|
221
|
+
resource: {
|
|
222
|
+
kind: 'buffer',
|
|
223
|
+
value: { buffer: pipelineState.meshStorageBuffer.buffer },
|
|
224
|
+
},
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
const group = runtime.device.createBindGroup({ layout, entries: completeEntries });
|
|
228
|
+
if (!group.ok) {
|
|
229
|
+
if (buffer !== undefined) runtime.device.destroyBuffer(buffer);
|
|
230
|
+
return group;
|
|
231
|
+
}
|
|
232
|
+
if (buffer === undefined) return group;
|
|
233
|
+
return ok({
|
|
234
|
+
handle: group.value,
|
|
235
|
+
dynamicOffsets: [0],
|
|
236
|
+
release: () => runtime.device.destroyBuffer(buffer),
|
|
237
|
+
});
|
|
238
|
+
}
|