@forgeax/engine-render 0.1.27 → 0.1.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +842 -124
- package/dist/assembly/atmosphere-shader-prewarm.d.ts +6 -0
- package/dist/assembly/atmosphere-shader-prewarm.d.ts.map +1 -0
- package/dist/assembly/dynamic-geometry-host.d.ts +52 -0
- package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -0
- package/dist/assembly/dynamic-geometry-runtime.d.ts +20 -0
- package/dist/assembly/dynamic-geometry-runtime.d.ts.map +1 -0
- package/dist/assembly/factory.d.ts +3 -1
- package/dist/assembly/factory.d.ts.map +1 -1
- package/dist/assembly/gpu-driven-owner.d.ts +10 -0
- package/dist/assembly/gpu-driven-owner.d.ts.map +1 -0
- package/dist/assembly/host-contract.d.ts +19 -0
- package/dist/assembly/host-contract.d.ts.map +1 -1
- package/dist/assembly/material/assembly.d.ts +7 -0
- package/dist/assembly/material/assembly.d.ts.map +1 -1
- package/dist/assembly/material-shader-policy.d.ts +3 -1
- package/dist/assembly/material-shader-policy.d.ts.map +1 -1
- package/dist/assembly/recovery/failure-location.d.ts +12 -0
- package/dist/assembly/recovery/failure-location.d.ts.map +1 -0
- package/dist/assembly/recovery/renderer-recover.d.ts +6 -4
- package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
- package/dist/assembly/renderer-facade.d.ts.map +1 -1
- package/dist/assembly/renderer-feature-inspection.d.ts +5 -0
- package/dist/assembly/renderer-feature-inspection.d.ts.map +1 -0
- package/dist/assembly/renderer-frame-transaction.d.ts +19 -0
- package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
- package/dist/assembly/renderer-helpers.d.ts +3 -0
- package/dist/assembly/renderer-helpers.d.ts.map +1 -1
- package/dist/assembly/renderer-inspection.d.ts +4 -0
- package/dist/assembly/renderer-inspection.d.ts.map +1 -1
- package/dist/assembly/shader-prewarm-policy.d.ts +6 -0
- package/dist/assembly/shader-prewarm-policy.d.ts.map +1 -1
- package/dist/assembly/skin-palette-owner.d.ts +8 -0
- package/dist/assembly/skin-palette-owner.d.ts.map +1 -0
- package/dist/assembly/ssr-shader-prewarm.d.ts +6 -0
- package/dist/assembly/ssr-shader-prewarm.d.ts.map +1 -0
- package/dist/assembly/webgpu-device-loss.d.ts +15 -0
- package/dist/assembly/webgpu-device-loss.d.ts.map +1 -0
- package/dist/assembly/webgpu-pbr-ready.d.ts +38 -0
- package/dist/assembly/webgpu-pbr-ready.d.ts.map +1 -0
- package/dist/assembly/webgpu-ready-mipmap.d.ts +11 -0
- package/dist/assembly/webgpu-ready-mipmap.d.ts.map +1 -0
- package/dist/assembly/webgpu-ready.d.ts +7 -3
- package/dist/assembly/webgpu-ready.d.ts.map +1 -1
- package/dist/assembly/webgpu-renderer-bootstrap.d.ts +10 -0
- package/dist/assembly/webgpu-renderer-bootstrap.d.ts.map +1 -0
- package/dist/assembly/webgpu-renderer-contract.d.ts +62 -0
- package/dist/assembly/webgpu-renderer-contract.d.ts.map +1 -0
- package/dist/assembly/webgpu-renderer-guards.d.ts +9 -0
- package/dist/assembly/webgpu-renderer-guards.d.ts.map +1 -0
- package/dist/assembly/webgpu-renderer-observation.d.ts +6 -0
- package/dist/assembly/webgpu-renderer-observation.d.ts.map +1 -0
- package/dist/assembly/webgpu-renderer-recovery-failure.d.ts +12 -0
- package/dist/assembly/webgpu-renderer-recovery-failure.d.ts.map +1 -0
- package/dist/assembly/webgpu-renderer.d.ts +7 -141
- package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
- package/dist/assembly/webgpu-vertex-layouts.d.ts +28 -84
- package/dist/assembly/webgpu-vertex-layouts.d.ts.map +1 -1
- package/dist/authoring.mjs +3 -3
- package/dist/{chunk-ADHHVYLW.mjs → chunk-33XZFTQU.mjs} +245 -39
- package/dist/chunk-33XZFTQU.mjs.map +1 -0
- package/dist/{chunk-GF523LHF.mjs → chunk-BLXGONR2.mjs} +30 -12
- package/dist/chunk-BLXGONR2.mjs.map +1 -0
- package/dist/{chunk-KM2NOX2I.mjs → chunk-BQVQOQJH.mjs} +958 -254
- package/dist/chunk-BQVQOQJH.mjs.map +1 -0
- package/dist/{chunk-HKXTW355.mjs → chunk-BTWH7BP4.mjs} +386 -17
- package/dist/chunk-BTWH7BP4.mjs.map +1 -0
- package/dist/{chunk-TMIASV2N.mjs → chunk-FUODTTIA.mjs} +3934 -676
- package/dist/chunk-FUODTTIA.mjs.map +1 -0
- package/dist/{chunk-FJ6P52EE.mjs → chunk-ILQ5MEZF.mjs} +3 -17
- package/dist/chunk-ILQ5MEZF.mjs.map +1 -0
- package/dist/{chunk-E34VL5VI.mjs → chunk-JQTSEI3Z.mjs} +3 -3
- package/dist/{chunk-E34VL5VI.mjs.map → chunk-JQTSEI3Z.mjs.map} +1 -1
- package/dist/{chunk-GE3SDD72.mjs → chunk-NICXSHAT.mjs} +16 -38
- package/dist/chunk-NICXSHAT.mjs.map +1 -0
- package/dist/{chunk-ZZ4YQ474.mjs → chunk-NRNXBLIJ.mjs} +577 -7
- package/dist/chunk-NRNXBLIJ.mjs.map +1 -0
- package/dist/{chunk-JDWARUOI.mjs → chunk-PA5DRJNI.mjs} +17 -3
- package/dist/chunk-PA5DRJNI.mjs.map +1 -0
- package/dist/{chunk-XDP6XE5V.mjs → chunk-S4DNKQYQ.mjs} +1118 -446
- package/dist/chunk-S4DNKQYQ.mjs.map +1 -0
- package/dist/components/camera.d.ts +62 -2
- package/dist/components/camera.d.ts.map +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/instances.d.ts +6 -20
- package/dist/components/instances.d.ts.map +1 -1
- package/dist/components/scene-instance.d.ts +2 -1
- package/dist/components/scene-instance.d.ts.map +1 -1
- package/dist/components/screen-space-reflection.d.ts +14 -0
- package/dist/components/screen-space-reflection.d.ts.map +1 -0
- package/dist/construct-renderer.mjs +13805 -7186
- package/dist/construct-renderer.mjs.map +1 -1
- package/dist/device/gpu-residency.d.ts +11 -17
- package/dist/device/gpu-residency.d.ts.map +1 -1
- package/dist/device/mesh-residency-lifetime.d.ts +21 -0
- package/dist/device/mesh-residency-lifetime.d.ts.map +1 -0
- package/dist/dynamic-geometry.d.ts +125 -0
- package/dist/dynamic-geometry.d.ts.map +1 -0
- package/dist/environment/background.d.ts +6 -0
- package/dist/environment/background.d.ts.map +1 -0
- package/dist/errors/gpu-driven.d.ts +6 -3
- package/dist/errors/gpu-driven.d.ts.map +1 -1
- package/dist/errors/render.d.ts +7 -4
- package/dist/errors/render.d.ts.map +1 -1
- package/dist/extract/camera.d.ts.map +1 -1
- package/dist/extract/gpu-driven.d.ts +33 -3
- package/dist/extract/gpu-driven.d.ts.map +1 -1
- package/dist/features/host.d.ts +23 -1
- package/dist/features/host.d.ts.map +1 -1
- package/dist/features/noise-texture.d.ts +17 -0
- package/dist/features/noise-texture.d.ts.map +1 -0
- package/dist/features/plan.d.ts +83 -2
- package/dist/features/plan.d.ts.map +1 -1
- package/dist/features/prepared-gpu-work.d.ts +37 -4
- package/dist/features/prepared-gpu-work.d.ts.map +1 -1
- package/dist/features/prepared-graphics-store.d.ts.map +1 -1
- package/dist/features/prepared-graphics.d.ts +5 -0
- package/dist/features/prepared-graphics.d.ts.map +1 -1
- package/dist/features/render-graph-compute.d.ts +5 -3
- package/dist/features/render-graph-compute.d.ts.map +1 -1
- package/dist/features/render-graph-contribution.d.ts +11 -3
- package/dist/features/render-graph-contribution.d.ts.map +1 -1
- package/dist/features/render-graph-raster.d.ts +19 -3
- package/dist/features/render-graph-raster.d.ts.map +1 -1
- package/dist/features/types.d.ts +11 -0
- package/dist/features/types.d.ts.map +1 -1
- package/dist/fullscreen-post-process-pass.d.ts +2 -0
- package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
- package/dist/gpu-driven/batch-topology.d.ts +34 -1
- package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
- package/dist/gpu-driven/pbr-program.d.ts +10 -0
- package/dist/gpu-driven/pbr-program.d.ts.map +1 -0
- package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
- package/dist/gpu-driven/production-raster.d.ts +144 -23
- package/dist/gpu-driven/production-raster.d.ts.map +1 -1
- package/dist/gpu-driven/shadow-views.d.ts +126 -0
- package/dist/gpu-driven/shadow-views.d.ts.map +1 -0
- package/dist/gpu-driven/view-gpu.d.ts +18 -2
- package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
- package/dist/gpu-scene-schema.d.ts +2 -8
- package/dist/gpu-scene-schema.d.ts.map +1 -1
- package/dist/gpu-scene.d.ts +14 -0
- package/dist/gpu-scene.d.ts.map +1 -1
- package/dist/gpu-texture-usage.d.ts +1 -0
- package/dist/gpu-texture-usage.d.ts.map +1 -1
- package/dist/hdrp-buffers.d.ts +6 -0
- package/dist/hdrp-buffers.d.ts.map +1 -1
- package/dist/ibl/frame-resources.d.ts +8 -0
- package/dist/ibl/frame-resources.d.ts.map +1 -0
- package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
- package/dist/index.d.ts +21 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +8 -7
- package/dist/index.mjs.map +1 -1
- package/dist/inspection-types.d.ts +164 -0
- package/dist/inspection-types.d.ts.map +1 -1
- package/dist/instances-derived-bounds.d.ts +11 -0
- package/dist/instances-derived-bounds.d.ts.map +1 -1
- package/dist/instances.d.ts +89 -44
- package/dist/instances.d.ts.map +1 -1
- package/dist/internal.d.ts +3 -0
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.mjs +118 -10
- package/dist/internal.mjs.map +1 -1
- package/dist/lifecycle.d.ts +2 -1
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/material-row.d.ts +5 -0
- package/dist/material-row.d.ts.map +1 -0
- package/dist/materials.d.ts +15 -0
- package/dist/materials.d.ts.map +1 -1
- package/dist/pbr-pipeline.d.ts +21 -5
- package/dist/pbr-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
- package/dist/pipeline/standard-output/auto-exposure/capability.d.ts +12 -0
- package/dist/pipeline/standard-output/auto-exposure/capability.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts +70 -0
- package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/graph.d.ts +75 -0
- package/dist/pipeline/standard-output/auto-exposure/graph.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts +111 -0
- package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts +16 -0
- package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/preset.d.ts +14 -0
- package/dist/pipeline/standard-output/auto-exposure/preset.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/state.d.ts +46 -0
- package/dist/pipeline/standard-output/auto-exposure/state.d.ts.map +1 -0
- package/dist/pipeline/standard-output/color-transform.d.ts +27 -0
- package/dist/pipeline/standard-output/color-transform.d.ts.map +1 -0
- package/dist/pipeline/standard-output/graph.d.ts +15 -0
- package/dist/pipeline/standard-output/graph.d.ts.map +1 -0
- package/dist/pipeline/standard-output/lut-admission.d.ts +29 -0
- package/dist/pipeline/standard-output/lut-admission.d.ts.map +1 -0
- package/dist/pipeline/standard-output/lut-gpu.d.ts +48 -0
- package/dist/pipeline/standard-output/lut-gpu.d.ts.map +1 -0
- package/dist/pipeline/standard-output/lut-state.d.ts +68 -0
- package/dist/pipeline/standard-output/lut-state.d.ts.map +1 -0
- package/dist/pipeline/standard-output/resources.d.ts +10 -0
- package/dist/pipeline/standard-output/resources.d.ts.map +1 -0
- package/dist/pipeline/standard-output/types.d.ts +39 -0
- package/dist/pipeline/standard-output/types.d.ts.map +1 -0
- package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-post.d.ts +2 -2
- package/dist/pipeline/standard-post.d.ts.map +1 -1
- package/dist/pipeline-builder.d.ts +2 -1
- package/dist/pipeline-builder.d.ts.map +1 -1
- package/dist/pipeline-spec-types.d.ts +4 -0
- package/dist/pipeline-spec-types.d.ts.map +1 -1
- package/dist/pipeline-spec.d.ts +1 -9
- package/dist/pipeline-spec.d.ts.map +1 -1
- package/dist/points-lines/standard-owner.d.ts +1 -1
- package/dist/points-lines/standard-owner.d.ts.map +1 -1
- package/dist/prepare/prepared-graphics-resolver.d.ts +6 -1
- package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
- package/dist/record/dynamic-geometry-consumption.d.ts +15 -0
- package/dist/record/dynamic-geometry-consumption.d.ts.map +1 -0
- package/dist/record/frame-lighting.d.ts +3 -3
- package/dist/record/frame-lighting.d.ts.map +1 -1
- package/dist/record/frame-snapshot.d.ts +106 -5
- package/dist/record/frame-snapshot.d.ts.map +1 -1
- package/dist/record/frame-targets.d.ts.map +1 -1
- package/dist/record/frame.d.ts +39 -4
- package/dist/record/frame.d.ts.map +1 -1
- package/dist/record/main-pass-geometry.d.ts +7 -8
- package/dist/record/main-pass-geometry.d.ts.map +1 -1
- package/dist/record/main-pass-material.d.ts +38 -1
- package/dist/record/main-pass-material.d.ts.map +1 -1
- package/dist/record/main-pass-sprite-draws.d.ts +2 -10
- package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
- package/dist/record/main-pass.d.ts +12 -2
- package/dist/record/main-pass.d.ts.map +1 -1
- package/dist/record/mesh-ssbo.d.ts +15 -6
- package/dist/record/mesh-ssbo.d.ts.map +1 -1
- package/dist/record/prepared-material-bindings.d.ts +19 -0
- package/dist/record/prepared-material-bindings.d.ts.map +1 -0
- package/dist/record/recovery-pipeline.d.ts +2 -9
- package/dist/record/recovery-pipeline.d.ts.map +1 -1
- package/dist/record/render-context.d.ts +76 -26
- package/dist/record/render-context.d.ts.map +1 -1
- package/dist/record/shadow-pass.d.ts +62 -7
- package/dist/record/shadow-pass.d.ts.map +1 -1
- package/dist/record/skybox-post-pass.d.ts +1 -1
- package/dist/record/skybox-post-pass.d.ts.map +1 -1
- package/dist/record/typed-frame-graph.d.ts +35 -7
- package/dist/record/typed-frame-graph.d.ts.map +1 -1
- package/dist/record/view-ubo.d.ts +1 -0
- package/dist/record/view-ubo.d.ts.map +1 -1
- package/dist/recovery/render-system-candidate.d.ts +10 -2
- package/dist/recovery/render-system-candidate.d.ts.map +1 -1
- package/dist/recovery/render-system-roots.d.ts +11 -0
- package/dist/recovery/render-system-roots.d.ts.map +1 -0
- package/dist/recovery/types.d.ts +76 -0
- package/dist/recovery/types.d.ts.map +1 -0
- package/dist/reflection/record-owner.d.ts +0 -2
- package/dist/reflection/record-owner.d.ts.map +1 -1
- package/dist/render-contract.d.ts +185 -30
- package/dist/render-contract.d.ts.map +1 -1
- package/dist/render-graph-primitives.d.ts +1 -0
- package/dist/render-graph-primitives.d.ts.map +1 -1
- package/dist/render-pipeline.d.ts +64 -5
- package/dist/render-pipeline.d.ts.map +1 -1
- package/dist/render-system-extract-tail.d.ts +7 -5
- package/dist/render-system-extract-tail.d.ts.map +1 -1
- package/dist/render-system-extract.d.ts +101 -41
- package/dist/render-system-extract.d.ts.map +1 -1
- package/dist/render-system-projections.d.ts +22 -0
- package/dist/render-system-projections.d.ts.map +1 -0
- package/dist/render-system.d.ts +34 -77
- package/dist/render-system.d.ts.map +1 -1
- package/dist/scene/render-scene-types.d.ts +14 -7
- package/dist/scene/render-scene-types.d.ts.map +1 -1
- package/dist/scene/render-scene.d.ts +29 -11
- package/dist/scene/render-scene.d.ts.map +1 -1
- package/dist/scene/shadow-visibility.d.ts +5 -0
- package/dist/scene/shadow-visibility.d.ts.map +1 -0
- package/dist/ssr/admission.d.ts +70 -1
- package/dist/ssr/admission.d.ts.map +1 -1
- package/dist/ssr/compose.d.ts +13 -0
- package/dist/ssr/compose.d.ts.map +1 -0
- package/dist/ssr/errors.d.ts +35 -0
- package/dist/ssr/errors.d.ts.map +1 -1
- package/dist/ssr/graph.d.ts +60 -0
- package/dist/ssr/graph.d.ts.map +1 -0
- package/dist/ssr/history.d.ts +97 -0
- package/dist/ssr/history.d.ts.map +1 -0
- package/dist/ssr/hiz.d.ts +37 -0
- package/dist/ssr/hiz.d.ts.map +1 -0
- package/dist/ssr/inspection.d.ts +42 -0
- package/dist/ssr/inspection.d.ts.map +1 -0
- package/dist/ssr/resources.d.ts +58 -0
- package/dist/ssr/resources.d.ts.map +1 -0
- package/dist/ssr/temporal.d.ts +38 -0
- package/dist/ssr/temporal.d.ts.map +1 -0
- package/dist/systems/skin-palette-allocator.d.ts +32 -10
- package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
- package/dist/systems/skin-palette-types.d.ts +15 -0
- package/dist/systems/skin-palette-types.d.ts.map +1 -1
- package/dist/systems/transparent-dispatch.d.ts +9 -0
- package/dist/systems/transparent-dispatch.d.ts.map +1 -0
- package/dist/targets/material-source.d.ts +7 -0
- package/dist/targets/material-source.d.ts.map +1 -1
- package/dist/temporal/frame-coordinator.d.ts +7 -0
- package/dist/temporal/frame-coordinator.d.ts.map +1 -1
- package/dist/temporal/gpu.d.ts +8 -0
- package/dist/temporal/gpu.d.ts.map +1 -1
- package/dist/temporal/history.d.ts.map +1 -1
- package/dist/temporal/index.mjs +6 -6
- package/dist/temporal/inspection.d.ts.map +1 -1
- package/dist/temporal/standard-scene-data.d.ts +2 -1
- package/dist/temporal/standard-scene-data.d.ts.map +1 -1
- package/dist/temporal/temporal-view.d.ts +2 -0
- package/dist/temporal/temporal-view.d.ts.map +1 -1
- package/dist/typed-render-graph-primitives.d.ts +35 -1
- package/dist/typed-render-graph-primitives.d.ts.map +1 -1
- package/dist/typed-shadow-passes.d.ts +3 -1
- package/dist/typed-shadow-passes.d.ts.map +1 -1
- package/dist/volume/temporal.d.ts +6 -0
- package/dist/volume/temporal.d.ts.map +1 -1
- package/package.json +21 -20
- package/src/__tests__/auto-exposure-gpu-evidence.ts +291 -0
- package/src/__tests__/auto-exposure-inspection.unit.test.ts +80 -0
- package/src/__tests__/auto-exposure-transaction.integration.test.ts +99 -0
- package/src/__tests__/auto-exposure.browser.test.ts +33 -0
- package/src/__tests__/auto-exposure.dawn.test.ts +33 -0
- package/src/__tests__/detached-inspection.integration.test.ts +5 -0
- package/src/__tests__/device-scope-lifecycle.unit.test.ts +18 -0
- package/src/__tests__/device-scope-stale-matrix.unit.test.ts +18 -0
- package/src/__tests__/docs-gate-green.unit.test.ts +3 -3
- package/src/__tests__/dynamic-geometry-host.unit.test.ts +1123 -0
- package/src/__tests__/dynamic-geometry.unit.test.ts +233 -0
- package/src/__tests__/factory-contract.integration.test.ts +73 -22
- package/src/__tests__/fallback-row-stride-surface.unit.test.ts +19 -0
- package/src/__tests__/feature-depth-input.dawn.test.ts +121 -0
- package/src/__tests__/feature-noise.unit.test.ts +38 -0
- package/src/__tests__/fixtures/taa-resolve-pinned-baseline.wgsl +301 -0
- package/src/__tests__/frame-camera-selection.unit.test.ts +131 -0
- package/src/__tests__/frame-plan-contract.unit.test.ts +24 -0
- package/src/__tests__/frame-targets.unit.test.ts +24 -0
- package/src/__tests__/fullscreen-feature-plan.unit.test.ts +3 -0
- package/src/__tests__/gpu-driven-baseline.characterization.test.ts +79 -0
- package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +287 -6
- package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +122 -142
- package/src/__tests__/gpu-driven-indirect-raster.browser.test.ts +10 -1
- package/src/__tests__/gpu-driven-lod-cache.unit.test.ts +264 -0
- package/src/__tests__/gpu-driven-mesh-world-identity.unit.test.ts +349 -0
- package/src/__tests__/gpu-driven-pbr.dawn.test.ts +1417 -0
- package/src/__tests__/gpu-driven-pbr.integration.test.ts +21 -0
- package/src/__tests__/gpu-driven-production-fixture.ts +96 -0
- package/src/__tests__/gpu-driven-production.integration.test.ts +1075 -93
- package/src/__tests__/gpu-driven-scaling.unit.test.ts +1 -3
- package/src/__tests__/gpu-driven-shadow-views.browser.test.ts +63 -0
- package/src/__tests__/gpu-driven-shadow-views.dawn.test.ts +294 -0
- package/src/__tests__/gpu-driven-shadow-views.integration.test.ts +97 -0
- package/src/__tests__/gpu-driven-shadow-views.unit.test.ts +168 -0
- package/src/__tests__/gpu-driven-skin-contract.test-d.ts +11 -0
- package/src/__tests__/gpu-driven-view-gpu-evidence.ts +72 -20
- package/src/__tests__/gpu-driven-view-graph.integration.test.ts +30 -9
- package/src/__tests__/gpu-driven-view.unit.test.ts +159 -52
- package/src/__tests__/gpu-pass-timing.browser.test.ts +6 -1
- package/src/__tests__/gpu-resource-store-stride.unit.test.ts +42 -0
- package/src/__tests__/gpu-scene-render-graph-gpu.ts +19 -5
- package/src/__tests__/gpu-scene.dawn.test.ts +40 -13
- package/src/__tests__/gpu-scene.unit.test.ts +559 -33
- package/src/__tests__/instances-culling.integration.test.ts +36 -10
- package/src/__tests__/instances-derived-bounds.unit.test.ts +54 -0
- package/src/__tests__/instances-store.unit.test.ts +242 -39
- package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +6 -0
- package/src/__tests__/lighting-scene-roundtrip.integration.test.ts +13 -16
- package/src/__tests__/lut-lkg-transaction.integration.test.ts +122 -0
- package/src/__tests__/material-contract-inventory.unit.test.ts +5 -6
- package/src/__tests__/material-dispatch-shader-id.unit.test.ts +51 -0
- package/src/__tests__/material-lane-selection.unit.test.ts +60 -0
- package/src/__tests__/material-numeric-upload.unit.test.ts +53 -0
- package/src/__tests__/material-texture-handles.unit.test.ts +18 -0
- package/src/__tests__/material-texture-source.unit.test.ts +87 -0
- package/src/__tests__/materials-authoring-validation.unit.test.ts +41 -0
- package/src/__tests__/materials-standard-contract.unit.test.ts +52 -2
- package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +4 -0
- package/src/__tests__/mesh-submission-lifetime.unit.test.ts +53 -0
- package/src/__tests__/normal-fallback.dawn.test.ts +122 -0
- package/src/__tests__/particle-material-input-layout.unit.test.ts +104 -0
- package/src/__tests__/physical-clearcoat.integration.test.ts +37 -3
- package/src/__tests__/pipeline-texture-specialization.unit.test.ts +138 -0
- package/src/__tests__/point-shadow-inspection.unit.test.ts +2 -0
- package/src/__tests__/prepared-gpu-driven-pbr-contract.test-d.ts +31 -0
- package/src/__tests__/prepared-gpu-driven-pbr-contract.unit.test.ts +39 -0
- package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +35 -4
- package/src/__tests__/prepared-graphics-capability.unit.test.ts +21 -0
- package/src/__tests__/prepared-graphics-pipeline-warmup.unit.test.ts +6 -2
- package/src/__tests__/profiler-phase-catalog.test.ts +5 -0
- package/src/__tests__/public-surface.test-d.ts +3 -0
- package/src/__tests__/recovery-candidate-prepare.contract.test.ts +30 -12
- package/src/__tests__/reflection-fallback-async-publication.unit.test.ts +104 -0
- package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +2 -1
- package/src/__tests__/render-error-code-owner.test-d.ts +4 -0
- package/src/__tests__/render-error-detail-ssot.test-d.ts +22 -0
- package/src/__tests__/render-error-exhaustive.test-d.ts +15 -0
- package/src/__tests__/render-feature-gpu-work.integration.test.ts +285 -2
- package/src/__tests__/render-feature-plan.unit.test.ts +245 -0
- package/src/__tests__/render-feature-shadow-order.unit.test.ts +228 -0
- package/src/__tests__/render-feature-zero-work.unit.test.ts +35 -1
- package/src/__tests__/render-graph-fallback.integration.test.ts +2 -2
- package/src/__tests__/render-owner-cohesion.unit.test.ts +55 -0
- package/src/__tests__/render-scene-mixed-updates.integration.test.ts +426 -0
- package/src/__tests__/render-scene-projection.unit.test.ts +914 -23
- package/src/__tests__/render-scene-resource-updates.integration.test.ts +214 -0
- package/src/__tests__/render-scene-skin-lifecycle.integration.test.ts +173 -0
- package/src/__tests__/render-scene-temporal-retry.unit.test.ts +133 -0
- package/src/__tests__/render-target-material-source.test-d.ts +27 -3
- package/src/__tests__/renderer-factory-material-contract.unit.test.ts +61 -1
- package/src/__tests__/renderer-frame-transaction.integration.test.ts +923 -5
- package/src/__tests__/shader-manifest-fixture.ts +39 -0
- package/src/__tests__/skin-motion-regression.unit.test.ts +0 -33
- package/src/__tests__/skin-palette-persistent.integration.test.ts +28 -0
- package/src/__tests__/skin-palette-persistent.unit.test.ts +247 -0
- package/src/__tests__/skinned-shadow-caster.test.ts +118 -14
- package/src/__tests__/specular-environment-scale.dawn.test.ts +156 -0
- package/src/__tests__/ssr-admission-matrix.integration.test.ts +7 -1
- package/src/__tests__/ssr-confidence-compose.unit.test.ts +84 -0
- package/src/__tests__/ssr-coordinate-oracle.unit.test.ts +28 -0
- package/src/__tests__/ssr-format-probe-gating.integration.test.ts +82 -0
- package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +91 -0
- package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +112 -0
- package/src/__tests__/ssr-gpu-dispatch.ts +946 -0
- package/src/__tests__/ssr-graph-topology.unit.test.ts +104 -0
- package/src/__tests__/ssr-history-filter.dawn.test.ts +198 -0
- package/src/__tests__/ssr-hit-color.dawn.test.ts +273 -0
- package/src/__tests__/ssr-hiz-odd-reduction.dawn.test.ts +569 -0
- package/src/__tests__/ssr-hiz-rescue.dawn.test.ts +279 -0
- package/src/__tests__/ssr-hiz.browser.test.ts +150 -0
- package/src/__tests__/ssr-hiz.dawn.test.ts +150 -0
- package/src/__tests__/ssr-hiz.unit.test.ts +56 -0
- package/src/__tests__/ssr-inspection.unit.test.ts +105 -0
- package/src/__tests__/ssr-memory-budget.unit.test.ts +45 -0
- package/src/__tests__/ssr-performance-sequence-aggregation.unit.test.ts +15 -0
- package/src/__tests__/ssr-public-surface.test-d.ts +37 -0
- package/src/__tests__/ssr-receiver-coverage.dawn.test.ts +387 -0
- package/src/__tests__/ssr-reflection-mip-reducer.dawn.test.ts +309 -0
- package/src/__tests__/ssr-reprojection-probe.ts +90 -0
- package/src/__tests__/ssr-roughness-mip.dawn.test.ts +163 -0
- package/src/__tests__/ssr-shader-prewarm.unit.test.ts +59 -0
- package/src/__tests__/ssr-spatial.integration.test.ts +141 -0
- package/src/__tests__/ssr-stable-lattice.dawn.test.ts +475 -0
- package/src/__tests__/ssr-temporal-history.unit.test.ts +202 -0
- package/src/__tests__/ssr-texel-crossing.dawn.test.ts +448 -0
- package/src/__tests__/ssr-zero-work.integration.test.ts +87 -0
- package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +44 -12
- package/src/__tests__/standard-clustered-pipeline.unit.test.ts +29 -0
- package/src/__tests__/standard-output-chain-contract.unit.test.ts +99 -0
- package/src/__tests__/standard-output-chain.integration.test.ts +73 -0
- package/src/__tests__/standard-output-gpu-evidence.ts +205 -0
- package/src/__tests__/standard-output.browser.test.ts +15 -0
- package/src/__tests__/standard-output.dawn.test.ts +15 -0
- package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +38 -0
- package/src/__tests__/standard-pipeline.integration.test.ts +320 -3
- package/src/__tests__/standard-profile-oracle.unit.test.ts +22 -0
- package/src/__tests__/standard-surface-lighting.unit.test.ts +41 -0
- package/src/__tests__/standard-texture-specialization.dawn.test.ts +141 -0
- package/src/__tests__/surface-adjacent-regressions.integration.test.ts +6 -3
- package/src/__tests__/taa-coverage-edge.dawn.test.ts +193 -0
- package/src/__tests__/taa-history-clipping.dawn.test.ts +328 -0
- package/src/__tests__/taa-neighborhood-equivalence.dawn.test.ts +778 -0
- package/src/__tests__/taa-stability-feedback.browser.test.ts +23 -0
- package/src/__tests__/taa-stability-feedback.dawn.test.ts +68 -0
- package/src/__tests__/taa-stability-feedback.ts +341 -0
- package/src/__tests__/temporal-history-lifecycle.unit.test.ts +49 -7
- package/src/__tests__/temporal-reset-matrix.unit.test.ts +9 -0
- package/src/__tests__/temporal-transaction.integration.test.ts +28 -0
- package/src/__tests__/texture-usage-surface.unit.test.ts +4 -2
- package/src/__tests__/typed-pipeline-topology.unit.test.ts +109 -4
- package/src/__tests__/typed-scene-pass-material-cache.integration.test.ts +126 -0
- package/src/__tests__/vertex-layouts-ssot.unit.test.ts +47 -0
- package/src/__tests__/visibility-extract.perf.test.ts +20 -8
- package/src/__tests__/visibility-instances.integration.test.ts +19 -7
- package/src/__tests__/visibility-producer-matrix.integration.test.ts +20 -9
- package/src/assembly/atmosphere-shader-prewarm.ts +38 -0
- package/src/assembly/dynamic-geometry-host.ts +887 -0
- package/src/assembly/dynamic-geometry-runtime.ts +71 -0
- package/src/assembly/factory.ts +4 -0
- package/src/assembly/gpu-driven-owner.ts +29 -0
- package/src/assembly/host-contract.ts +36 -0
- package/src/assembly/material/assembly.ts +38 -0
- package/src/assembly/material-shader-policy.ts +71 -28
- package/src/assembly/recovery/failure-location.ts +62 -0
- package/src/assembly/recovery/renderer-recover.ts +19 -17
- package/src/assembly/renderer-facade.ts +29 -0
- package/src/assembly/renderer-feature-inspection.ts +13 -0
- package/src/assembly/renderer-frame-transaction.ts +63 -0
- package/src/assembly/renderer-helpers.ts +26 -0
- package/src/assembly/renderer-inspection.ts +6 -0
- package/src/assembly/shader-prewarm-policy.ts +32 -0
- package/src/assembly/skin-palette-owner.ts +21 -0
- package/src/assembly/ssr-shader-prewarm.ts +41 -0
- package/src/assembly/webgpu-device-loss.ts +75 -0
- package/src/assembly/webgpu-pbr-ready.ts +232 -0
- package/src/assembly/webgpu-ready-mipmap.ts +26 -0
- package/src/assembly/webgpu-ready.ts +142 -121
- package/src/assembly/webgpu-renderer-bootstrap.ts +85 -0
- package/src/assembly/webgpu-renderer-contract.ts +69 -0
- package/src/assembly/webgpu-renderer-guards.ts +32 -0
- package/src/assembly/webgpu-renderer-observation.ts +43 -0
- package/src/assembly/webgpu-renderer-recovery-failure.ts +62 -0
- package/src/assembly/webgpu-renderer.ts +675 -614
- package/src/assembly/webgpu-vertex-layouts.ts +233 -87
- package/src/components/__tests__/camera-exposure.contract.unit.test.ts +153 -0
- package/src/components/camera.ts +287 -7
- package/src/components/index.ts +1 -0
- package/src/components/instances.ts +45 -18
- package/src/components/scene-instance.ts +2 -1
- package/src/components/screen-space-reflection.ts +21 -0
- package/src/components/sprite-animation.ts +3 -3
- package/src/components/sprite-instances.ts +1 -1
- package/src/device/gpu-residency.ts +96 -93
- package/src/device/mesh-residency-lifetime.ts +73 -0
- package/src/dynamic-geometry.ts +736 -0
- package/src/environment/background.ts +263 -0
- package/src/errors/gpu-driven.ts +39 -5
- package/src/errors/render.ts +27 -3
- package/src/extract/camera.ts +26 -1
- package/src/extract/gpu-driven.ts +185 -10
- package/src/features/host.ts +237 -19
- package/src/features/noise-texture.ts +91 -0
- package/src/features/plan.ts +553 -24
- package/src/features/prepared-gpu-work.ts +631 -49
- package/src/features/prepared-graphics-store.ts +31 -0
- package/src/features/prepared-graphics.ts +5 -0
- package/src/features/render-graph-compute.ts +41 -8
- package/src/features/render-graph-contribution.ts +141 -3
- package/src/features/render-graph-raster.ts +143 -30
- package/src/features/types.ts +11 -0
- package/src/fullscreen-post-process-pass.ts +3 -0
- package/src/gpu-driven/batch-topology.ts +424 -102
- package/src/gpu-driven/pbr-program.ts +31 -0
- package/src/gpu-driven/prepared-draw.ts +29 -4
- package/src/gpu-driven/production-raster.ts +2267 -694
- package/src/gpu-driven/shadow-views.ts +539 -0
- package/src/gpu-driven/view-gpu.ts +188 -41
- package/src/gpu-scene-schema.ts +52 -11
- package/src/gpu-scene.ts +186 -99
- package/src/gpu-texture-usage.ts +1 -0
- package/src/hdrp-buffers.ts +72 -36
- package/src/ibl/frame-resources.ts +38 -0
- package/src/ibl/skylight-bind-group.ts +5 -4
- package/src/index.ts +125 -1
- package/src/inspection-types.ts +191 -0
- package/src/instances-derived-bounds.ts +258 -34
- package/src/instances.ts +459 -150
- package/src/internal.ts +22 -0
- package/src/lifecycle.ts +2 -0
- package/src/material-row.ts +145 -0
- package/src/materials.ts +44 -8
- package/src/pbr-pipeline.ts +159 -17
- package/src/pipeline/standard-forward-lane.ts +52 -24
- package/src/pipeline/standard-output/__tests__/lut-admission.unit.test.ts +103 -0
- package/src/pipeline/standard-output/auto-exposure/__tests__/capability.unit.test.ts +40 -0
- package/src/pipeline/standard-output/auto-exposure/__tests__/gpu.contract.unit.test.ts +125 -0
- package/src/pipeline/standard-output/auto-exposure/__tests__/graph.contract.unit.test.ts +94 -0
- package/src/pipeline/standard-output/auto-exposure/__tests__/oracle.test.ts +108 -0
- package/src/pipeline/standard-output/auto-exposure/__tests__/preset.test.ts +26 -0
- package/src/pipeline/standard-output/auto-exposure/capability.ts +38 -0
- package/src/pipeline/standard-output/auto-exposure/gpu.ts +567 -0
- package/src/pipeline/standard-output/auto-exposure/graph.ts +221 -0
- package/src/pipeline/standard-output/auto-exposure/inspection.ts +231 -0
- package/src/pipeline/standard-output/auto-exposure/oracle.ts +291 -0
- package/src/pipeline/standard-output/auto-exposure/preset.ts +28 -0
- package/src/pipeline/standard-output/auto-exposure/state.ts +156 -0
- package/src/pipeline/standard-output/color-transform.ts +124 -0
- package/src/pipeline/standard-output/graph.ts +139 -0
- package/src/pipeline/standard-output/lut-admission.ts +121 -0
- package/src/pipeline/standard-output/lut-gpu.ts +399 -0
- package/src/pipeline/standard-output/lut-state.ts +176 -0
- package/src/pipeline/standard-output/resources.ts +121 -0
- package/src/pipeline/standard-output/types.ts +58 -0
- package/src/pipeline/standard-pipeline.ts +192 -59
- package/src/pipeline/standard-post.ts +186 -27
- package/src/pipeline-builder.ts +16 -6
- package/src/pipeline-spec-types.ts +4 -0
- package/src/pipeline-spec.ts +37 -29
- package/src/points-lines/standard-owner.ts +6 -14
- package/src/prepare/prepared-graphics-resolver.ts +9 -2
- package/src/record/__tests__/material-slot-plan.unit.test.ts +48 -0
- package/src/record/__tests__/mesh-ssbo.unit.test.ts +40 -1
- package/src/record/__tests__/recovery-pipeline.unit.test.ts +2 -29
- package/src/record/__tests__/sprite-material-abi.unit.test.ts +36 -5
- package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +45 -0
- package/src/record/__tests__/view-ubo-layout.unit.test.ts +5 -0
- package/src/record/dynamic-geometry-consumption.ts +59 -0
- package/src/record/frame-lighting.ts +12 -11
- package/src/record/frame-snapshot.ts +133 -23
- package/src/record/frame-targets.ts +9 -0
- package/src/record/frame.ts +727 -133
- package/src/record/main-pass-geometry.ts +162 -98
- package/src/record/main-pass-material.ts +115 -26
- package/src/record/main-pass-sprite-draws.ts +18 -107
- package/src/record/main-pass.ts +78 -8
- package/src/record/material-uniforms.ts +1 -1
- package/src/record/mesh-ssbo.ts +59 -15
- package/src/record/prepared-material-bindings.ts +234 -0
- package/src/record/recovery-pipeline.ts +59 -136
- package/src/record/render-context.ts +92 -22
- package/src/record/shadow-pass.ts +1231 -209
- package/src/record/skybox-post-pass.ts +14 -3
- package/src/record/typed-frame-graph.ts +1006 -53
- package/src/record/view-ubo.ts +11 -0
- package/src/recovery/render-system-candidate.ts +90 -66
- package/src/recovery/render-system-roots.ts +113 -0
- package/src/recovery/types.ts +77 -0
- package/src/reflection/record-owner.ts +26 -54
- package/src/render-contract.ts +219 -25
- package/src/render-graph-primitives.ts +6 -2
- package/src/render-pipeline.ts +70 -1
- package/src/render-system-extract-tail.ts +409 -160
- package/src/render-system-extract.ts +376 -102
- package/src/render-system-projections.ts +241 -0
- package/src/render-system.ts +692 -791
- package/src/scene/render-scene-types.ts +13 -4
- package/src/scene/render-scene.ts +569 -355
- package/src/scene/shadow-visibility.ts +21 -0
- package/src/ssr/admission.ts +380 -14
- package/src/ssr/compose.ts +144 -0
- package/src/ssr/errors.ts +48 -0
- package/src/ssr/graph.ts +777 -0
- package/src/ssr/history.ts +436 -0
- package/src/ssr/hiz.ts +124 -0
- package/src/ssr/inspection.ts +124 -0
- package/src/ssr/resources.ts +202 -0
- package/src/ssr/temporal.ts +164 -0
- package/src/systems/skin-palette-allocator.ts +495 -148
- package/src/systems/skin-palette-types.ts +17 -0
- package/src/systems/transparent-dispatch.ts +90 -0
- package/src/targets/material-source.ts +34 -0
- package/src/temporal/coverage.ts +1 -1
- package/src/temporal/frame-coordinator.ts +23 -2
- package/src/temporal/gpu.ts +74 -12
- package/src/temporal/history.ts +3 -1
- package/src/temporal/inspection.ts +2 -1
- package/src/temporal/standard-scene-data.ts +3 -1
- package/src/temporal/temporal-view.ts +3 -0
- package/src/transmission/__tests__/standard-transmission.dawn.test.ts +204 -139
- package/src/typed-render-graph-primitives.ts +266 -74
- package/src/typed-shadow-passes.ts +122 -12
- package/src/volume/temporal.ts +10 -0
- package/dist/chunk-ADHHVYLW.mjs.map +0 -1
- package/dist/chunk-FJ6P52EE.mjs.map +0 -1
- package/dist/chunk-GE3SDD72.mjs.map +0 -1
- package/dist/chunk-GF523LHF.mjs.map +0 -1
- package/dist/chunk-HKXTW355.mjs.map +0 -1
- package/dist/chunk-JDWARUOI.mjs.map +0 -1
- package/dist/chunk-KM2NOX2I.mjs.map +0 -1
- package/dist/chunk-TMIASV2N.mjs.map +0 -1
- package/dist/chunk-XDP6XE5V.mjs.map +0 -1
- package/dist/chunk-ZZ4YQ474.mjs.map +0 -1
- package/src/__tests__/instances-world-ownership.integration.test.ts +0 -62
- package/src/scene/__tests__/changed-block-summary.candidate.test.ts +0 -36
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type MeshResidencyLease, MeshResidencyLifetime } from './mesh-residency-lifetime';
|
|
1
2
|
// @forgeax/engine-runtime - GpuResidencyCache
|
|
2
3
|
// (feat-20260601-device/gpu-residency-extraction M1; M2 added the deriveRenderData
|
|
3
4
|
// projection seam — see render-data.ts).
|
|
@@ -37,10 +38,7 @@ import {
|
|
|
37
38
|
prepareMipmaps,
|
|
38
39
|
} from '@forgeax/engine-assets-runtime';
|
|
39
40
|
import type { World } from '@forgeax/engine-ecs';
|
|
40
|
-
import {
|
|
41
|
-
PROCEDURAL_FLOATS_PER_VERTEX,
|
|
42
|
-
type VertexLayoutProjection,
|
|
43
|
-
} from '@forgeax/engine-geometry';
|
|
41
|
+
import { deriveVertexCount, type VertexLayoutProjection } from '@forgeax/engine-geometry';
|
|
44
42
|
import { halfFloat } from '@forgeax/engine-math';
|
|
45
43
|
import {
|
|
46
44
|
type Buffer,
|
|
@@ -100,7 +98,6 @@ import {
|
|
|
100
98
|
runIblPrecompute,
|
|
101
99
|
} from '../ibl/IblPipelineCache';
|
|
102
100
|
import type { RhiErrorListenerRegistry } from '../lifecycle';
|
|
103
|
-
import type { RecoveryColdWorkGuard } from '../record/render-context';
|
|
104
101
|
import {
|
|
105
102
|
type CubeRenderData,
|
|
106
103
|
deriveRenderDataCubemap,
|
|
@@ -371,6 +368,23 @@ function packMeshLodGeometry(
|
|
|
371
368
|
}
|
|
372
369
|
lowerData.push(projected.value);
|
|
373
370
|
}
|
|
371
|
+
if (
|
|
372
|
+
deriveVertexCount(root.vertices, rootData.layoutProjection) === undefined ||
|
|
373
|
+
lowerMeshes.some((mesh, index) => {
|
|
374
|
+
const data = lowerData[index];
|
|
375
|
+
return (
|
|
376
|
+
data === undefined || deriveVertexCount(mesh.vertices, data.layoutProjection) === undefined
|
|
377
|
+
);
|
|
378
|
+
})
|
|
379
|
+
) {
|
|
380
|
+
return err(
|
|
381
|
+
new RhiError({
|
|
382
|
+
code: 'asset-not-registered',
|
|
383
|
+
expected: 'every MeshAsset LOD vertex byte length to match its layout projection stride',
|
|
384
|
+
hint: 'reimport the LOD chain so interleaved vertex bytes match attributes',
|
|
385
|
+
}),
|
|
386
|
+
);
|
|
387
|
+
}
|
|
374
388
|
if (
|
|
375
389
|
lowerData.some(
|
|
376
390
|
(data) =>
|
|
@@ -478,14 +492,6 @@ export interface MeshGpuHandles {
|
|
|
478
492
|
readonly iboBytes: number;
|
|
479
493
|
readonly indexCount: number;
|
|
480
494
|
readonly indexFormat: 'uint16' | 'uint32';
|
|
481
|
-
/**
|
|
482
|
-
* Vertex stride discriminator (feat-20260611). `'12F'` = 48 B
|
|
483
|
-
* (position+normal+uv+tangent); `'18F'` = 72 B (12F + skinIndex(uint16x4) +
|
|
484
|
-
* skinWeight(float32x4)). Mirrors `MeshRenderData.layout` in render-data.ts
|
|
485
|
-
* and `MeshRenderData.layout` -- the residency and render-data layout
|
|
486
|
-
* fields are the same union and move together.
|
|
487
|
-
*/
|
|
488
|
-
readonly layout: '12F' | '18F';
|
|
489
495
|
/** Geometry-owned vertex layout projection used by every GPU consumer. */
|
|
490
496
|
readonly layoutProjection: VertexLayoutProjection;
|
|
491
497
|
/**
|
|
@@ -496,7 +502,7 @@ export interface MeshGpuHandles {
|
|
|
496
502
|
* MeshRenderData.uvSetCount.
|
|
497
503
|
*/
|
|
498
504
|
readonly uvSetCount: number;
|
|
499
|
-
/** Vertex count
|
|
505
|
+
/** Vertex count derived from the geometry-owned layout projection. */
|
|
500
506
|
readonly vertexCount: number;
|
|
501
507
|
/** True when `MeshAsset.indices` is present (indexed draw path). */
|
|
502
508
|
readonly indexed: boolean;
|
|
@@ -546,7 +552,6 @@ export class GpuResidencyCache {
|
|
|
546
552
|
// Hardware-probe caps injected at `configureGpuDevice`; guards the HDR cubemap
|
|
547
553
|
// path (_uploadCubemapFromEquirect) when `rgba16floatRenderable` is false.
|
|
548
554
|
private caps: RhiCaps | undefined = undefined;
|
|
549
|
-
private recoveryColdWorkGuard: RecoveryColdWorkGuard | undefined;
|
|
550
555
|
private deviceEpoch = 0;
|
|
551
556
|
private textureGeneration = 0;
|
|
552
557
|
|
|
@@ -557,6 +562,36 @@ export class GpuResidencyCache {
|
|
|
557
562
|
// equirect source always resolves to the same cubemap (idempotent, A2).
|
|
558
563
|
private readonly cubemapIdempotentMap: Map<number, Handle<'EquirectAsset', 'shared'>> = new Map();
|
|
559
564
|
private readonly meshGpuHandles: Map<string | number, MeshGpuHandles> = new Map();
|
|
565
|
+
private readonly meshLifetimes = new WeakMap<MeshGpuHandles, MeshResidencyLifetime>();
|
|
566
|
+
private readonly retiredMeshes = new Set<MeshGpuHandles>();
|
|
567
|
+
|
|
568
|
+
private meshLifetime(entry: MeshGpuHandles): MeshResidencyLifetime {
|
|
569
|
+
let lifetime = this.meshLifetimes.get(entry);
|
|
570
|
+
if (lifetime === undefined) {
|
|
571
|
+
lifetime = new MeshResidencyLifetime(() => {
|
|
572
|
+
if (!entry.vertexBuffer.isDestroyed) entry.vertexBuffer.destroy();
|
|
573
|
+
if (entry.indexBuffer !== null && !entry.indexBuffer.isDestroyed)
|
|
574
|
+
entry.indexBuffer.destroy();
|
|
575
|
+
this.retiredMeshes.delete(entry);
|
|
576
|
+
});
|
|
577
|
+
this.meshLifetimes.set(entry, lifetime);
|
|
578
|
+
}
|
|
579
|
+
return lifetime;
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
/** All resident entries conservatively cover main, shadow and cached GPU-driven draws. */
|
|
583
|
+
trackMeshSubmission(completed: Promise<unknown>): void {
|
|
584
|
+
for (const entry of this.meshGpuHandles.values()) this.meshLifetime(entry).track(completed);
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
private retireMeshEntry(key: string | number, entry: MeshGpuHandles): void {
|
|
588
|
+
if (this.meshGpuHandles.get(key) === entry) {
|
|
589
|
+
this.meshGpuHandles.delete(key);
|
|
590
|
+
this.meshResidencyEpoch += 1;
|
|
591
|
+
}
|
|
592
|
+
this.retiredMeshes.add(entry);
|
|
593
|
+
this.meshLifetime(entry).retire();
|
|
594
|
+
}
|
|
560
595
|
|
|
561
596
|
/**
|
|
562
597
|
* Compose a cache key from the raw handle slot and its owning World. The
|
|
@@ -626,9 +661,6 @@ export class GpuResidencyCache {
|
|
|
626
661
|
}
|
|
627
662
|
|
|
628
663
|
/** Arm the first-published-frame assertion on this generation's store. */
|
|
629
|
-
setRecoveryColdWorkGuard(guard: RecoveryColdWorkGuard | undefined): void {
|
|
630
|
-
this.recoveryColdWorkGuard = guard;
|
|
631
|
-
}
|
|
632
664
|
|
|
633
665
|
/**
|
|
634
666
|
* Wrap a raw RHI Buffer handle into a GpuBuffer. The wrapper holds a
|
|
@@ -711,11 +743,12 @@ export class GpuResidencyCache {
|
|
|
711
743
|
this.cubemapGpuHandles.clear();
|
|
712
744
|
this.cubemapIdempotentMap.clear();
|
|
713
745
|
|
|
714
|
-
for (const entry of this.meshGpuHandles.values()) {
|
|
746
|
+
for (const entry of [...this.meshGpuHandles.values(), ...this.retiredMeshes]) {
|
|
715
747
|
destroyBuf(entry.vertexBuffer);
|
|
716
748
|
if (entry.indexBuffer !== null) destroyBuf(entry.indexBuffer);
|
|
717
749
|
}
|
|
718
750
|
this.meshGpuHandles.clear();
|
|
751
|
+
this.retiredMeshes.clear();
|
|
719
752
|
}
|
|
720
753
|
|
|
721
754
|
/** Number of candidate-owned GPU resources currently held by this cache. */
|
|
@@ -730,6 +763,7 @@ export class GpuResidencyCache {
|
|
|
730
763
|
}
|
|
731
764
|
return (
|
|
732
765
|
this.meshGpuHandles.size +
|
|
766
|
+
this.retiredMeshes.size +
|
|
733
767
|
this.textureGpuHandles.size +
|
|
734
768
|
this.samplerGpuHandles.size +
|
|
735
769
|
cubemapResources
|
|
@@ -802,27 +836,13 @@ export class GpuResidencyCache {
|
|
|
802
836
|
const entry = this.meshGpuHandles.get(id);
|
|
803
837
|
if (entry === undefined) return { freed: 0, errors: [] };
|
|
804
838
|
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
if (r.ok) {
|
|
812
|
-
freed += 1;
|
|
813
|
-
} else {
|
|
814
|
-
errors.push(r.error);
|
|
815
|
-
if (this.errorRegistry) this.errorRegistry.fire(r.error);
|
|
816
|
-
}
|
|
817
|
-
}
|
|
839
|
+
if (this.meshLifetime(entry).owners > 0) return { freed: 0, errors: [] };
|
|
840
|
+
this.retireMeshEntry(id, entry);
|
|
841
|
+
return {
|
|
842
|
+
freed:
|
|
843
|
+
Number(entry.vertexBuffer.isDestroyed) + Number(entry.indexBuffer?.isDestroyed ?? false),
|
|
844
|
+
errors: [],
|
|
818
845
|
};
|
|
819
|
-
|
|
820
|
-
destroyBuf(entry.vertexBuffer);
|
|
821
|
-
if (entry.indexBuffer !== null) destroyBuf(entry.indexBuffer);
|
|
822
|
-
|
|
823
|
-
this.meshGpuHandles.delete(id);
|
|
824
|
-
this.meshResidencyEpoch += 1;
|
|
825
|
-
return { freed: freed > 0 ? 1 : 0, errors };
|
|
826
846
|
}
|
|
827
847
|
|
|
828
848
|
evictCubemap(id: number): { freed: number; errors: RhiError[] } {
|
|
@@ -862,7 +882,6 @@ export class GpuResidencyCache {
|
|
|
862
882
|
releaseUnreferenced(liveSet: Set<number>): { freed: number; errors: RhiError[] } {
|
|
863
883
|
let freed = 0;
|
|
864
884
|
const errors: RhiError[] = [];
|
|
865
|
-
let meshResidencyChanged = false;
|
|
866
885
|
let materialResidencyChanged = false;
|
|
867
886
|
const liveSlots = new Set([...liveSet].map((slot) => String(slot)));
|
|
868
887
|
const isLiveKey = (key: string | number): boolean => {
|
|
@@ -916,35 +935,14 @@ export class GpuResidencyCache {
|
|
|
916
935
|
}
|
|
917
936
|
}
|
|
918
937
|
|
|
919
|
-
for (const key of this.meshGpuHandles
|
|
920
|
-
if (!isLiveKey(key)) {
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
const r = entry.vertexBuffer.destroy();
|
|
925
|
-
if (r.ok) {
|
|
926
|
-
freed += 1;
|
|
927
|
-
} else {
|
|
928
|
-
errors.push(r.error);
|
|
929
|
-
if (this.errorRegistry) this.errorRegistry.fire(r.error);
|
|
930
|
-
}
|
|
931
|
-
}
|
|
932
|
-
if (entry.indexBuffer !== null && !entry.indexBuffer.isDestroyed) {
|
|
933
|
-
const r = entry.indexBuffer.destroy();
|
|
934
|
-
if (r.ok) {
|
|
935
|
-
freed += 1;
|
|
936
|
-
} else {
|
|
937
|
-
errors.push(r.error);
|
|
938
|
-
if (this.errorRegistry) this.errorRegistry.fire(r.error);
|
|
939
|
-
}
|
|
940
|
-
}
|
|
941
|
-
this.meshGpuHandles.delete(key);
|
|
942
|
-
meshResidencyChanged = true;
|
|
943
|
-
}
|
|
938
|
+
for (const [key, entry] of this.meshGpuHandles) {
|
|
939
|
+
if (!isLiveKey(key) && this.meshLifetime(entry).owners === 0) {
|
|
940
|
+
this.retireMeshEntry(key, entry);
|
|
941
|
+
freed +=
|
|
942
|
+
Number(entry.vertexBuffer.isDestroyed) + Number(entry.indexBuffer?.isDestroyed ?? false);
|
|
944
943
|
}
|
|
945
944
|
}
|
|
946
945
|
|
|
947
|
-
if (meshResidencyChanged) this.meshResidencyEpoch += 1;
|
|
948
946
|
if (materialResidencyChanged) this.materialResourceEpoch += 1;
|
|
949
947
|
|
|
950
948
|
return { freed, errors };
|
|
@@ -1026,7 +1024,6 @@ export class GpuResidencyCache {
|
|
|
1026
1024
|
const key = this.worldKey(handleSlot(handle), worldId);
|
|
1027
1025
|
const existing = this.samplerGpuHandles.get(key);
|
|
1028
1026
|
if (existing !== undefined) return ok(existing);
|
|
1029
|
-
this.recoveryColdWorkGuard?.noteUploadColdWork();
|
|
1030
1027
|
const device = this.gpuDevice;
|
|
1031
1028
|
if (device === undefined) {
|
|
1032
1029
|
return err(
|
|
@@ -1096,23 +1093,26 @@ export class GpuResidencyCache {
|
|
|
1096
1093
|
return this.meshGpuHandles.get(this.worldKey(handleSlot(handle), worldId));
|
|
1097
1094
|
}
|
|
1098
1095
|
|
|
1099
|
-
/**
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1096
|
+
/** Candidate leases retain the concrete allocation even after cache invalidation. */
|
|
1097
|
+
retainMeshResidency(
|
|
1098
|
+
handle: Handle<'MeshAsset', 'shared'>,
|
|
1099
|
+
worldId: World | number = 0,
|
|
1100
|
+
): MeshResidencyLease | undefined {
|
|
1101
|
+
const key = this.worldKey(handleSlot(handle), worldId);
|
|
1102
|
+
const entry = this.meshGpuHandles.get(key);
|
|
1103
|
+
return entry === undefined
|
|
1104
|
+
? undefined
|
|
1105
|
+
: this.meshLifetime(entry).retain(() => {
|
|
1106
|
+
if (this.meshGpuHandles.get(key) === entry) this.invalidateMesh(handle, worldId);
|
|
1107
|
+
else this.meshLifetime(entry).retire();
|
|
1108
|
+
});
|
|
1109
|
+
}
|
|
1110
|
+
|
|
1111
|
+
/** In-place author changes immediately miss the cache; old submissions keep their allocation. */
|
|
1104
1112
|
invalidateMesh(handle: number, worldId: World | number = 0): void {
|
|
1105
|
-
// SharedRefMutation publishes the encoded handle value, while the cache
|
|
1106
|
-
// key is derived from the decoded slot. Keep the invalidation path aligned
|
|
1107
|
-
// with getMeshGpuHandles/ensureResident so an in-place ECS payload change
|
|
1108
|
-
// cannot leave the old VBO resident.
|
|
1109
1113
|
const key = this.worldKey(handleSlot(toShared<'MeshAsset'>(handle)), worldId);
|
|
1110
1114
|
const entry = this.meshGpuHandles.get(key);
|
|
1111
|
-
if (entry
|
|
1112
|
-
entry.vertexBuffer.destroy();
|
|
1113
|
-
if (entry.indexBuffer !== null) entry.indexBuffer.destroy();
|
|
1114
|
-
this.meshGpuHandles.delete(key);
|
|
1115
|
-
this.meshResidencyEpoch += 1;
|
|
1115
|
+
if (entry !== undefined) this.retireMeshEntry(key, entry);
|
|
1116
1116
|
}
|
|
1117
1117
|
|
|
1118
1118
|
/**
|
|
@@ -1159,7 +1159,6 @@ export class GpuResidencyCache {
|
|
|
1159
1159
|
const key = this.worldKey(id, worldId);
|
|
1160
1160
|
const existing = this.meshGpuHandles.get(key);
|
|
1161
1161
|
if (existing !== undefined) return ok(existing);
|
|
1162
|
-
this.recoveryColdWorkGuard?.noteUploadColdWork();
|
|
1163
1162
|
const projected = deriveRenderDataMesh(pod);
|
|
1164
1163
|
if (!projected.ok) return projected;
|
|
1165
1164
|
return this.uploadMeshById(key, pod, projected.value, lodMeshes);
|
|
@@ -1168,7 +1167,6 @@ export class GpuResidencyCache {
|
|
|
1168
1167
|
const texKey = this.worldKey(id, worldId);
|
|
1169
1168
|
const existing = this.textureGpuHandles.get(texKey);
|
|
1170
1169
|
if (existing !== undefined) return ok(existing);
|
|
1171
|
-
this.recoveryColdWorkGuard?.noteUploadColdWork();
|
|
1172
1170
|
const projected = deriveRenderDataTexture(pod);
|
|
1173
1171
|
if (!projected.ok) return projected;
|
|
1174
1172
|
const decoded: DecodedImage = decodedFromTexture(pod);
|
|
@@ -2010,6 +2008,16 @@ export class GpuResidencyCache {
|
|
|
2010
2008
|
);
|
|
2011
2009
|
}
|
|
2012
2010
|
|
|
2011
|
+
const vertexCount = deriveVertexCount(mesh.vertices, renderData.layoutProjection);
|
|
2012
|
+
if (vertexCount === undefined) {
|
|
2013
|
+
return err(
|
|
2014
|
+
new RhiError({
|
|
2015
|
+
code: 'asset-not-registered',
|
|
2016
|
+
expected: 'MeshAsset.vertices byteLength to be divisible by its layout projection stride',
|
|
2017
|
+
hint: 'reimport the mesh so the interleaved vertex bytes match attributes',
|
|
2018
|
+
}),
|
|
2019
|
+
);
|
|
2020
|
+
}
|
|
2013
2021
|
const packed = packMeshLodGeometry(mesh, renderData, lodMeshes);
|
|
2014
2022
|
if (!packed.ok) return packed;
|
|
2015
2023
|
const { vertices, indices, lodRanges } = packed.value;
|
|
@@ -2068,14 +2076,9 @@ export class GpuResidencyCache {
|
|
|
2068
2076
|
iboBytes: indices === undefined ? 0 : indexBytes,
|
|
2069
2077
|
indexCount: mesh.indices === undefined ? 0 : mesh.indices.length,
|
|
2070
2078
|
indexFormat: indices instanceof Uint32Array ? 'uint32' : 'uint16',
|
|
2071
|
-
layout: renderData.layoutProjection.attributes.some(
|
|
2072
|
-
(attribute) => attribute.key === 'skinIndex' || attribute.key === 'skinWeight',
|
|
2073
|
-
)
|
|
2074
|
-
? '18F'
|
|
2075
|
-
: '12F',
|
|
2076
2079
|
layoutProjection: renderData.layoutProjection,
|
|
2077
2080
|
uvSetCount: 1 + extraUvSets,
|
|
2078
|
-
vertexCount
|
|
2081
|
+
vertexCount,
|
|
2079
2082
|
indexed: mesh.indices !== undefined,
|
|
2080
2083
|
topology: renderData.submeshes[0]?.topology ?? 'triangle-list',
|
|
2081
2084
|
submeshes: renderData.submeshes,
|
|
@@ -2102,6 +2105,8 @@ export class GpuResidencyCache {
|
|
|
2102
2105
|
if (entry === undefined) return;
|
|
2103
2106
|
|
|
2104
2107
|
const newVertexBytes = newVertices.byteLength;
|
|
2108
|
+
const newVertexCount = deriveVertexCount(newVertices, entry.layoutProjection);
|
|
2109
|
+
if (newVertexCount === undefined) return;
|
|
2105
2110
|
const indexBytesUnpadded = newIndices.byteLength;
|
|
2106
2111
|
const newIndexBytes = ((indexBytesUnpadded + 3) >> 2) << 2;
|
|
2107
2112
|
|
|
@@ -2131,10 +2136,9 @@ export class GpuResidencyCache {
|
|
|
2131
2136
|
iboBytes: entry.iboBytes,
|
|
2132
2137
|
indexCount: newIndices.length,
|
|
2133
2138
|
indexFormat: 'uint16',
|
|
2134
|
-
layout: '12F',
|
|
2135
2139
|
layoutProjection: entry.layoutProjection,
|
|
2136
2140
|
uvSetCount: entry.uvSetCount,
|
|
2137
|
-
vertexCount:
|
|
2141
|
+
vertexCount: newVertexCount,
|
|
2138
2142
|
indexed: true,
|
|
2139
2143
|
topology: entry.topology,
|
|
2140
2144
|
submeshes: nextSubmeshes,
|
|
@@ -2175,10 +2179,9 @@ export class GpuResidencyCache {
|
|
|
2175
2179
|
iboBytes: newIndexBytes,
|
|
2176
2180
|
indexCount: newIndices.length,
|
|
2177
2181
|
indexFormat: 'uint16',
|
|
2178
|
-
layout: '12F',
|
|
2179
2182
|
layoutProjection: entry.layoutProjection,
|
|
2180
2183
|
uvSetCount: entry.uvSetCount,
|
|
2181
|
-
vertexCount:
|
|
2184
|
+
vertexCount: newVertexCount,
|
|
2182
2185
|
indexed: true,
|
|
2183
2186
|
topology: entry.topology,
|
|
2184
2187
|
submeshes: nextSubmeshes,
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/** A lease captures one GPU allocation, never a reusable World handle slot. */
|
|
2
|
+
export interface MeshResidencyLease {
|
|
3
|
+
track(completed: Promise<unknown>): void;
|
|
4
|
+
release(evict: boolean): Promise<void> | undefined;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
/** Shared candidates and queue submissions have one allocation lifetime owner. */
|
|
8
|
+
export class MeshResidencyLifetime {
|
|
9
|
+
private leases = 0;
|
|
10
|
+
private retired = false;
|
|
11
|
+
private eviction: (() => void) | undefined;
|
|
12
|
+
private readonly submissions = new Set<Promise<unknown>>();
|
|
13
|
+
private readonly waiters = new Set<() => void>();
|
|
14
|
+
|
|
15
|
+
constructor(private destroy: (() => void) | undefined) {}
|
|
16
|
+
|
|
17
|
+
get owners(): number {
|
|
18
|
+
return this.leases;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
retain(evict: () => void): MeshResidencyLease {
|
|
22
|
+
this.leases += 1;
|
|
23
|
+
this.eviction = undefined;
|
|
24
|
+
let released = false;
|
|
25
|
+
let completion: Promise<void> | undefined;
|
|
26
|
+
return {
|
|
27
|
+
track: (submitted) => this.track(submitted),
|
|
28
|
+
release: (shouldEvict) => {
|
|
29
|
+
if (released) return completion;
|
|
30
|
+
released = true;
|
|
31
|
+
this.leases -= 1;
|
|
32
|
+
if (this.leases === 0 && shouldEvict) this.eviction = evict;
|
|
33
|
+
completion =
|
|
34
|
+
this.submissions.size === 0
|
|
35
|
+
? undefined
|
|
36
|
+
: new Promise<void>((resolve) => this.waiters.add(resolve));
|
|
37
|
+
this.flush();
|
|
38
|
+
return completion;
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
track(completed: Promise<unknown>): void {
|
|
44
|
+
if (this.submissions.has(completed)) return;
|
|
45
|
+
this.submissions.add(completed);
|
|
46
|
+
const finish = (): void => {
|
|
47
|
+
this.submissions.delete(completed);
|
|
48
|
+
this.flush();
|
|
49
|
+
};
|
|
50
|
+
void completed.then(finish, finish);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
retire(): void {
|
|
54
|
+
this.retired = true;
|
|
55
|
+
this.flush();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
private flush(): void {
|
|
59
|
+
if (this.submissions.size !== 0) return;
|
|
60
|
+
if (this.leases === 0 && this.eviction !== undefined) {
|
|
61
|
+
const evict = this.eviction;
|
|
62
|
+
this.eviction = undefined;
|
|
63
|
+
evict();
|
|
64
|
+
}
|
|
65
|
+
if (this.retired && this.leases === 0 && this.destroy !== undefined) {
|
|
66
|
+
const destroy = this.destroy;
|
|
67
|
+
this.destroy = undefined;
|
|
68
|
+
destroy();
|
|
69
|
+
}
|
|
70
|
+
for (const resolve of this.waiters) resolve();
|
|
71
|
+
this.waiters.clear();
|
|
72
|
+
}
|
|
73
|
+
}
|