@forgeax/engine-render 0.1.28 → 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 +627 -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 +21 -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 +8 -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 +2 -2
- package/dist/{chunk-JAASCMXA.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-J52NMQKR.mjs → chunk-BQVQOQJH.mjs} +1086 -838
- package/dist/chunk-BQVQOQJH.mjs.map +1 -0
- package/dist/{chunk-IQMKJLNU.mjs → chunk-BTWH7BP4.mjs} +386 -17
- package/dist/chunk-BTWH7BP4.mjs.map +1 -0
- package/dist/{chunk-MBU4ZVE7.mjs → chunk-FUODTTIA.mjs} +3921 -671
- package/dist/chunk-FUODTTIA.mjs.map +1 -0
- package/dist/{chunk-MYJ5RPJO.mjs → chunk-JQTSEI3Z.mjs} +3 -3
- package/dist/{chunk-MYJ5RPJO.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-J6KACNOH.mjs → chunk-NRNXBLIJ.mjs} +577 -7
- package/dist/chunk-NRNXBLIJ.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-VSL23LZE.mjs → chunk-S4DNKQYQ.mjs} +1117 -445
- 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 +12888 -7025
- package/dist/construct-renderer.mjs.map +1 -1
- package/dist/device/gpu-residency.d.ts +1 -12
- package/dist/device/gpu-residency.d.ts.map +1 -1
- 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 +18 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +8 -8
- 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 +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 +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 +74 -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 +173 -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 +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 +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__/factory-contract.integration.test.ts +67 -8
- 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__/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 +60 -0
- 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 +48 -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 +10 -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 +12 -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 +666 -652
- 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 +2 -2
- package/src/components/sprite-instances.ts +1 -1
- package/src/device/gpu-residency.ts +34 -31
- 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 +109 -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 +725 -133
- package/src/record/main-pass-geometry.ts +149 -94
- package/src/record/main-pass-material.ts +115 -26
- package/src/record/main-pass-sprite-draws.ts +16 -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 +90 -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 +1004 -44
- 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 +195 -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 +681 -822
- 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-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-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
|
@@ -10,7 +10,9 @@ import {
|
|
|
10
10
|
RhiError,
|
|
11
11
|
type RhiRenderPassEncoder,
|
|
12
12
|
} from '@forgeax/engine-rhi';
|
|
13
|
+
import { STANDARD_TEXTURE_MASK_OVERRIDE } from '@forgeax/engine-shader';
|
|
13
14
|
import type { ParamSchemaEntry, PassKind, PrimitiveTopology } from '@forgeax/engine-types';
|
|
15
|
+
import { gpuDrivenDrawKey, gpuDrivenSourceDrawItemIndex } from '../extract/gpu-driven';
|
|
14
16
|
import { GpuBuffer } from '../gpu-resource';
|
|
15
17
|
import {
|
|
16
18
|
GPU_BUFFER_USAGE_COPY_DST,
|
|
@@ -19,11 +21,7 @@ import {
|
|
|
19
21
|
} from '../gpu-usage';
|
|
20
22
|
import { createHdrpSkinUnifiedBindGroup, getOrCreateHdrpBuffers } from '../hdrp-buffers';
|
|
21
23
|
import type { InstanceBufferCacheEntry } from '../instance-buffer-cache';
|
|
22
|
-
import {
|
|
23
|
-
type InstanceCollectionFailureCode,
|
|
24
|
-
recordInstanceFailure,
|
|
25
|
-
recordInstanceResidency,
|
|
26
|
-
} from '../instances';
|
|
24
|
+
import { type InstanceCollectionFailureCode, instanceUploadRangesForResident } from '../instances';
|
|
27
25
|
import { SPRITE_PREMULTIPLIED_ALPHA_BLEND } from '../materials';
|
|
28
26
|
import {
|
|
29
27
|
createPbrSkinMeshBindGroupEntries,
|
|
@@ -127,6 +125,7 @@ type MaterialPipelineLookup = {
|
|
|
127
125
|
readonly sampleCount: number;
|
|
128
126
|
readonly colorFormatOverride: GPUTextureFormat | undefined;
|
|
129
127
|
readonly additionalColorFormats: readonly GPUTextureFormat[] | undefined;
|
|
128
|
+
readonly textureMask: number | undefined;
|
|
130
129
|
readonly handle: MaterialShaderPipelineEntry | null;
|
|
131
130
|
};
|
|
132
131
|
|
|
@@ -134,6 +133,67 @@ type GeometryRecordProfileSegment = 'material-bind-groups' | 'pipeline-selection
|
|
|
134
133
|
|
|
135
134
|
type GeometryRenderState = ReturnType<typeof geometryRenderStateForTopology>;
|
|
136
135
|
|
|
136
|
+
function gpuDrivenDrawIndicesBySubmesh(
|
|
137
|
+
source: RenderableSnapshot,
|
|
138
|
+
mesh: _InternalRenderPipelineContext['validatedOrdered'][number]['mesh'],
|
|
139
|
+
): ReadonlyMap<number, number> {
|
|
140
|
+
const draws = source.gpuDrivenDraws;
|
|
141
|
+
if (draws === undefined || draws.length === 0) return new Map();
|
|
142
|
+
const indices = new Map<number, number>();
|
|
143
|
+
let hasStableSourceIdentity = false;
|
|
144
|
+
for (const [compactIndex, draw] of draws.entries()) {
|
|
145
|
+
const drawItemIndex = draw.drawItemIndex;
|
|
146
|
+
if (drawItemIndex === undefined) continue;
|
|
147
|
+
hasStableSourceIdentity = true;
|
|
148
|
+
if (mesh.submeshes[drawItemIndex] !== undefined) indices.set(drawItemIndex, compactIndex);
|
|
149
|
+
}
|
|
150
|
+
if (hasStableSourceIdentity) return indices;
|
|
151
|
+
|
|
152
|
+
// Legacy snapshots predating drawItemIndex are matched by their compact
|
|
153
|
+
// geometry facts. New extracted snapshots never take this path.
|
|
154
|
+
let nonIndexedFirst = 0;
|
|
155
|
+
let drawCursor = 0;
|
|
156
|
+
for (const [submeshIndex, submesh] of mesh.submeshes.entries()) {
|
|
157
|
+
const first = mesh.indexed ? submesh.indexOffset : nonIndexedFirst;
|
|
158
|
+
const count = mesh.indexed ? submesh.indexCount : submesh.vertexCount;
|
|
159
|
+
if (!mesh.indexed) nonIndexedFirst += submesh.vertexCount;
|
|
160
|
+
const draw = draws[drawCursor];
|
|
161
|
+
if (
|
|
162
|
+
draw !== undefined &&
|
|
163
|
+
draw.first === first &&
|
|
164
|
+
draw.count === count &&
|
|
165
|
+
draw.materialSlot === submesh.materialSlot &&
|
|
166
|
+
draw.topology === submesh.topology
|
|
167
|
+
) {
|
|
168
|
+
indices.set(submeshIndex, drawCursor);
|
|
169
|
+
drawCursor += 1;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return indices;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function isGpuDrivenMainClaimedSubmesh(
|
|
176
|
+
c: _InternalRenderPipelineContext,
|
|
177
|
+
source: RenderableSnapshot,
|
|
178
|
+
submeshIndex: number,
|
|
179
|
+
drawIndices: ReadonlyMap<number, number>,
|
|
180
|
+
): boolean {
|
|
181
|
+
const drawItemIndex = drawIndices.get(submeshIndex);
|
|
182
|
+
const draw = drawItemIndex === undefined ? undefined : source.gpuDrivenDraws?.[drawItemIndex];
|
|
183
|
+
if (drawItemIndex === undefined || draw === undefined) return false;
|
|
184
|
+
const material = source.materials[draw.materialSlot] ?? source.material;
|
|
185
|
+
const sourceDrawItemIndex = gpuDrivenSourceDrawItemIndex(draw, drawItemIndex);
|
|
186
|
+
return (
|
|
187
|
+
c.gpuDrivenDrawKeys?.has(
|
|
188
|
+
gpuDrivenDrawKey(
|
|
189
|
+
worldEntityKey(source.worldId, source.entityKey),
|
|
190
|
+
material.materialHandle ?? -1,
|
|
191
|
+
sourceDrawItemIndex,
|
|
192
|
+
),
|
|
193
|
+
) === true
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
|
|
137
197
|
/**
|
|
138
198
|
* Select the transmission shader axis from authored material data, not the
|
|
139
199
|
* canonical boot schema. The latter reserves transmission fields for the
|
|
@@ -252,8 +312,8 @@ export function effectiveMaterialLayoutIdentity(
|
|
|
252
312
|
/**
|
|
253
313
|
* Resolve the depth contract for a geometry pass without changing the base
|
|
254
314
|
* material state. Temporal scene-data shares the main pass depth attachment:
|
|
255
|
-
* it is read-only and accepts the equal depth produced by the
|
|
256
|
-
*
|
|
315
|
+
* it is read-only and accepts the equal depth produced by the shared raster
|
|
316
|
+
* projection, while motion varyings remain unjittered. It rejects fragments behind the visible
|
|
257
317
|
* surface.
|
|
258
318
|
*/
|
|
259
319
|
export function geometryRenderStateForPass(
|
|
@@ -373,6 +433,7 @@ export function recordGeometryDraws(
|
|
|
373
433
|
) => BindGroup,
|
|
374
434
|
passKind: PassKind = 'forward',
|
|
375
435
|
selectedDispatch?: readonly DispatchEntry[],
|
|
436
|
+
colorFormats: readonly GPUTextureFormat[] = [],
|
|
376
437
|
): void {
|
|
377
438
|
const {
|
|
378
439
|
runtime,
|
|
@@ -457,6 +518,7 @@ export function recordGeometryDraws(
|
|
|
457
518
|
layoutProjection: import('@forgeax/engine-geometry').VertexLayoutProjection,
|
|
458
519
|
vertexEntry?: string,
|
|
459
520
|
fragmentEntry?: string,
|
|
521
|
+
textureMask?: number,
|
|
460
522
|
): MaterialShaderPipelineEntry | null => {
|
|
461
523
|
// The fallback MRT is an extension of the built-in Standard PBR output
|
|
462
524
|
// contract only. The render pass may carry a second attachment whenever
|
|
@@ -469,7 +531,9 @@ export function recordGeometryDraws(
|
|
|
469
531
|
const reflectionFallbackFormats =
|
|
470
532
|
materialShaderId === 'forgeax::default-standard-pbr' &&
|
|
471
533
|
c.reflectionFallbackColorFormat !== undefined
|
|
472
|
-
?
|
|
534
|
+
? passKind === 'deferred'
|
|
535
|
+
? colorFormats.slice(1)
|
|
536
|
+
: [c.reflectionFallbackColorFormat]
|
|
473
537
|
: undefined;
|
|
474
538
|
const renderStateKey = renderStateHash(renderState);
|
|
475
539
|
const shaderLookupCache = materialPipelineLookupCache.get(materialShaderId);
|
|
@@ -484,6 +548,7 @@ export function recordGeometryDraws(
|
|
|
484
548
|
cached.variantSet === variantSet &&
|
|
485
549
|
cached.vertexEntry === vertexEntry &&
|
|
486
550
|
cached.fragmentEntry === fragmentEntry &&
|
|
551
|
+
cached.textureMask === textureMask &&
|
|
487
552
|
cached.passKind === passKind &&
|
|
488
553
|
cached.layoutProjection.digest === layoutProjection.digest &&
|
|
489
554
|
cached.sampleCount === sampleCount &&
|
|
@@ -530,9 +595,12 @@ export function recordGeometryDraws(
|
|
|
530
595
|
layoutProjection,
|
|
531
596
|
undefined,
|
|
532
597
|
undefined,
|
|
598
|
+
undefined,
|
|
533
599
|
reflectionFallbackFormats,
|
|
534
600
|
vertexEntry,
|
|
535
601
|
fragmentEntry,
|
|
602
|
+
undefined,
|
|
603
|
+
textureMask === undefined ? undefined : { [STANDARD_TEXTURE_MASK_OVERRIDE]: textureMask },
|
|
536
604
|
) ?? null;
|
|
537
605
|
const handle =
|
|
538
606
|
profilePhase === undefined
|
|
@@ -560,6 +628,7 @@ export function recordGeometryDraws(
|
|
|
560
628
|
sampleCount,
|
|
561
629
|
colorFormatOverride: colorFormat,
|
|
562
630
|
additionalColorFormats: reflectionFallbackFormats,
|
|
631
|
+
textureMask,
|
|
563
632
|
handle,
|
|
564
633
|
};
|
|
565
634
|
if (shaderLookupCache === undefined) {
|
|
@@ -579,7 +648,6 @@ export function recordGeometryDraws(
|
|
|
579
648
|
for (let i = 0; i < validatedOrdered.length; i++) {
|
|
580
649
|
const entry = validatedOrdered[i];
|
|
581
650
|
if (entry === undefined) continue;
|
|
582
|
-
|
|
583
651
|
// Points/Lines share the Standard geometry pass. Their retained source
|
|
584
652
|
// is prepared once by the renderer owner, while this loop remains the
|
|
585
653
|
// sole pass/draw submission owner and preserves the authored topology.
|
|
@@ -587,18 +655,6 @@ export function recordGeometryDraws(
|
|
|
587
655
|
if (entry.source.pointsLines !== undefined && pointsLinesSubmission?.plan.drawCount !== 1)
|
|
588
656
|
continue;
|
|
589
657
|
|
|
590
|
-
if (
|
|
591
|
-
passKind === 'forward' &&
|
|
592
|
-
c.gpuDrivenEntityKeys.has(
|
|
593
|
-
worldEntityKey(
|
|
594
|
-
c.gpuDrivenWorldKeys?.[entry.source.worldId] ?? entry.source.worldId,
|
|
595
|
-
entry.source.entityKey,
|
|
596
|
-
),
|
|
597
|
-
)
|
|
598
|
-
) {
|
|
599
|
-
continue;
|
|
600
|
-
}
|
|
601
|
-
|
|
602
658
|
// feat-20260609 M2: skip entities that don't match the pass selector.
|
|
603
659
|
if (matchedMaterials !== null && !matchedMaterials.has(entry.renderableIndex)) continue;
|
|
604
660
|
|
|
@@ -987,6 +1043,7 @@ export function recordGeometryDraws(
|
|
|
987
1043
|
// — the same placeholders the unlit path already used. The generic
|
|
988
1044
|
// branch below builds the per-submesh BG.
|
|
989
1045
|
let perSubmeshBg: BindGroup | null = null;
|
|
1046
|
+
const gpuDrivenDrawIndices = gpuDrivenDrawIndicesBySubmesh(entry.source, entry.mesh);
|
|
990
1047
|
// feat-20260608 M4 / w16: per-submesh pipeline selection + draw loop.
|
|
991
1048
|
// Each submesh carries its own topology, so pipeline selection is per-submesh.
|
|
992
1049
|
// Vertex/index buffers and bind groups are set once (shared across all submeshes).
|
|
@@ -1004,6 +1061,12 @@ export function recordGeometryDraws(
|
|
|
1004
1061
|
const materialHandle = submeshMaterial.materialHandle ?? 0;
|
|
1005
1062
|
if (materialHandles === undefined || !materialHandles.has(materialHandle)) continue;
|
|
1006
1063
|
}
|
|
1064
|
+
if (
|
|
1065
|
+
passKind === 'forward' &&
|
|
1066
|
+
isGpuDrivenMainClaimedSubmesh(c, entry.source, smIdx, gpuDrivenDrawIndices)
|
|
1067
|
+
) {
|
|
1068
|
+
continue;
|
|
1069
|
+
}
|
|
1007
1070
|
const draws: readonly (DispatchEntry | undefined)[] =
|
|
1008
1071
|
selectedDispatch === undefined
|
|
1009
1072
|
? [undefined]
|
|
@@ -1163,6 +1226,7 @@ export function recordGeometryDraws(
|
|
|
1163
1226
|
entry.mesh.layoutProjection,
|
|
1164
1227
|
vertexEntry,
|
|
1165
1228
|
fragmentEntry,
|
|
1229
|
+
submeshMaterial.standardTextureMask,
|
|
1166
1230
|
);
|
|
1167
1231
|
materialPipelineEntry = unlitRsp;
|
|
1168
1232
|
smPipelineHandle =
|
|
@@ -1202,7 +1266,7 @@ export function recordGeometryDraws(
|
|
|
1202
1266
|
const transmissionAvailable = requestsStandardTransmissionVariant(submeshMaterial);
|
|
1203
1267
|
const materialCapabilityVariantSet =
|
|
1204
1268
|
transmissionAvailable && !capabilityVariantSet.includes('TRANSMISSION_AVAILABLE=')
|
|
1205
|
-
? `${capabilityVariantSet
|
|
1269
|
+
? `${capabilityVariantSet}+TRANSMISSION_AVAILABLE=true`
|
|
1206
1270
|
: capabilityVariantSet;
|
|
1207
1271
|
// Sprite's base request must retain the boot-selected artifact. Only
|
|
1208
1272
|
// SpriteInstances uses the explicit empty key for the
|
|
@@ -1215,9 +1279,7 @@ export function recordGeometryDraws(
|
|
|
1215
1279
|
: undefined
|
|
1216
1280
|
: entry.variantSet === undefined
|
|
1217
1281
|
? materialCapabilityVariantSet
|
|
1218
|
-
:
|
|
1219
|
-
? entry.variantSet
|
|
1220
|
-
: `${capabilityVariantSet}+${entry.variantSet}`;
|
|
1282
|
+
: `${materialCapabilityVariantSet}+${entry.variantSet}`;
|
|
1221
1283
|
const cachedPipeline = resolveMaterialPipeline(
|
|
1222
1284
|
smMaterialShaderId,
|
|
1223
1285
|
pipelineRenderState,
|
|
@@ -1228,6 +1290,7 @@ export function recordGeometryDraws(
|
|
|
1228
1290
|
entry.mesh.layoutProjection,
|
|
1229
1291
|
vertexEntry,
|
|
1230
1292
|
fragmentEntry,
|
|
1293
|
+
submeshMaterial.standardTextureMask,
|
|
1231
1294
|
);
|
|
1232
1295
|
// feat-20260615-pipeline-spec-ssot M6-T1: cache miss resolves to
|
|
1233
1296
|
// null uniformly across URP / HDRP / skin shaders. Charter P3
|
|
@@ -1361,10 +1424,7 @@ export function recordGeometryDraws(
|
|
|
1361
1424
|
* @internal
|
|
1362
1425
|
*/
|
|
1363
1426
|
function uploadInstanceRanges(
|
|
1364
|
-
c:
|
|
1365
|
-
_InternalRenderPipelineContext,
|
|
1366
|
-
'runtime' | 'pipelineState' | 'frameState' | 'bindGroupCounts'
|
|
1367
|
-
>,
|
|
1427
|
+
c: _InternalRenderPipelineContext,
|
|
1368
1428
|
inst: NonNullable<RenderableSnapshot['instances']>,
|
|
1369
1429
|
buffer: Buffer,
|
|
1370
1430
|
ranges: readonly { readonly start: number; readonly end: number }[],
|
|
@@ -1396,10 +1456,7 @@ function uploadInstanceRanges(
|
|
|
1396
1456
|
}
|
|
1397
1457
|
|
|
1398
1458
|
export function reportInstanceResidency(
|
|
1399
|
-
c:
|
|
1400
|
-
_InternalRenderPipelineContext,
|
|
1401
|
-
'runtime' | 'pipelineState' | 'frameState' | 'bindGroupCounts'
|
|
1402
|
-
>,
|
|
1459
|
+
c: _InternalRenderPipelineContext,
|
|
1403
1460
|
inst: NonNullable<RenderableSnapshot['instances']>,
|
|
1404
1461
|
input: {
|
|
1405
1462
|
readonly lane: 'direct-storage' | 'chunked-storage' | 'direct-uniform' | 'chunked-uniform';
|
|
@@ -1409,8 +1466,8 @@ export function reportInstanceResidency(
|
|
|
1409
1466
|
readonly uploadedBytes: number;
|
|
1410
1467
|
},
|
|
1411
1468
|
): void {
|
|
1412
|
-
if (inst.collectionId === undefined
|
|
1413
|
-
|
|
1469
|
+
if (inst.collectionId === undefined) return;
|
|
1470
|
+
c.frameState.instanceCollections?._reportResidency({
|
|
1414
1471
|
collectionId: inst.collectionId,
|
|
1415
1472
|
frameNumber: c.frameState.frameNumber,
|
|
1416
1473
|
residentGeneration: c.runtime.deviceScope.generation,
|
|
@@ -1424,10 +1481,7 @@ export function reportInstanceResidency(
|
|
|
1424
1481
|
}
|
|
1425
1482
|
|
|
1426
1483
|
function reportInstanceFailure(
|
|
1427
|
-
c:
|
|
1428
|
-
_InternalRenderPipelineContext,
|
|
1429
|
-
'runtime' | 'pipelineState' | 'frameState' | 'bindGroupCounts'
|
|
1430
|
-
>,
|
|
1484
|
+
c: _InternalRenderPipelineContext,
|
|
1431
1485
|
inst: NonNullable<RenderableSnapshot['instances']>,
|
|
1432
1486
|
error: {
|
|
1433
1487
|
readonly code: InstanceCollectionFailureCode;
|
|
@@ -1437,8 +1491,8 @@ function reportInstanceFailure(
|
|
|
1437
1491
|
requestedBytes: number,
|
|
1438
1492
|
supportedBytes: number | undefined,
|
|
1439
1493
|
): void {
|
|
1440
|
-
if (inst.collectionId === undefined
|
|
1441
|
-
|
|
1494
|
+
if (inst.collectionId === undefined) return;
|
|
1495
|
+
c.frameState.instanceCollections?._reportFailure({
|
|
1442
1496
|
collectionId: inst.collectionId,
|
|
1443
1497
|
code: error.code,
|
|
1444
1498
|
expected: error.expected,
|
|
@@ -1454,13 +1508,7 @@ function reportInstanceFailure(
|
|
|
1454
1508
|
});
|
|
1455
1509
|
}
|
|
1456
1510
|
|
|
1457
|
-
function clearInstanceChunksForOwner(
|
|
1458
|
-
c: Pick<
|
|
1459
|
-
_InternalRenderPipelineContext,
|
|
1460
|
-
'runtime' | 'pipelineState' | 'frameState' | 'bindGroupCounts'
|
|
1461
|
-
>,
|
|
1462
|
-
ownerKey: number,
|
|
1463
|
-
): void {
|
|
1511
|
+
function clearInstanceChunksForOwner(c: _InternalRenderPipelineContext, ownerKey: number): void {
|
|
1464
1512
|
const chunks = c.frameState.instanceBufferChunks;
|
|
1465
1513
|
if (chunks === undefined) return;
|
|
1466
1514
|
const prefix = `${ownerKey}:`;
|
|
@@ -1475,10 +1523,7 @@ function clearInstanceChunksForOwner(
|
|
|
1475
1523
|
}
|
|
1476
1524
|
|
|
1477
1525
|
export function resolveStorageInstanceChunks(
|
|
1478
|
-
c:
|
|
1479
|
-
_InternalRenderPipelineContext,
|
|
1480
|
-
'runtime' | 'pipelineState' | 'frameState' | 'bindGroupCounts'
|
|
1481
|
-
>,
|
|
1526
|
+
c: _InternalRenderPipelineContext,
|
|
1482
1527
|
entry: _InternalRenderPipelineContext['validatedOrdered'][number],
|
|
1483
1528
|
inst: NonNullable<RenderableSnapshot['instances']>,
|
|
1484
1529
|
cap: number,
|
|
@@ -1516,6 +1561,7 @@ export function resolveStorageInstanceChunks(
|
|
|
1516
1561
|
const draws: GeometryInstanceDraw[] = [];
|
|
1517
1562
|
const uploadedRanges: { start: number; end: number }[] = [];
|
|
1518
1563
|
let uploadedBytes = 0;
|
|
1564
|
+
const dirtyRanges = inst.dirtyRanges ?? [{ start: 0, end: inst.instanceCount } as const];
|
|
1519
1565
|
for (let start = 0; start < inst.instanceCount; start += chunkCapacity) {
|
|
1520
1566
|
const end = Math.min(inst.instanceCount, start + chunkCapacity);
|
|
1521
1567
|
const count = end - start;
|
|
@@ -1557,14 +1603,17 @@ export function resolveStorageInstanceChunks(
|
|
|
1557
1603
|
if (chunks === undefined) frameState.transientInstanceBuffers.push(active);
|
|
1558
1604
|
}
|
|
1559
1605
|
if (active === undefined) return null;
|
|
1560
|
-
const
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1606
|
+
const localRanges = dirtyRanges
|
|
1607
|
+
.map((range) => ({
|
|
1608
|
+
start: Math.max(start, range.start) - start,
|
|
1609
|
+
end: Math.min(end, range.end) - start,
|
|
1610
|
+
}))
|
|
1611
|
+
.filter((range) => range.end > range.start);
|
|
1612
|
+
const needsUpload = activeIsNew || active.uploadedRevision !== inst.revision;
|
|
1613
|
+
const rangesToUpload = instanceUploadRangesForResident(activeIsNew, localRanges, {
|
|
1614
|
+
start: 0,
|
|
1615
|
+
end: count,
|
|
1616
|
+
});
|
|
1568
1617
|
if (needsUpload && rangesToUpload.length > 0) {
|
|
1569
1618
|
const upload = uploadInstanceRanges(
|
|
1570
1619
|
c,
|
|
@@ -1584,8 +1633,7 @@ export function resolveStorageInstanceChunks(
|
|
|
1584
1633
|
inst,
|
|
1585
1634
|
{
|
|
1586
1635
|
code: 'queue-write-buffer-failed',
|
|
1587
|
-
expected:
|
|
1588
|
-
'the renderer-owned instance storage buffer accepts the complete instance payload',
|
|
1636
|
+
expected: 'the renderer-owned instance storage buffer accepts the dirty range',
|
|
1589
1637
|
hint: 'retry after the active device is healthy or recover the renderer',
|
|
1590
1638
|
},
|
|
1591
1639
|
inst.instanceCount * strideBytes,
|
|
@@ -1595,8 +1643,8 @@ export function resolveStorageInstanceChunks(
|
|
|
1595
1643
|
}
|
|
1596
1644
|
}
|
|
1597
1645
|
if (needsUpload) {
|
|
1598
|
-
{
|
|
1599
|
-
const published = { ...active, uploadedRevision: inst.revision
|
|
1646
|
+
if (inst.revision !== undefined) {
|
|
1647
|
+
const published = { ...active, uploadedRevision: inst.revision };
|
|
1600
1648
|
active = published;
|
|
1601
1649
|
chunks?.set(chunkKey, published);
|
|
1602
1650
|
}
|
|
@@ -1634,11 +1682,8 @@ export function resolveStorageInstanceChunks(
|
|
|
1634
1682
|
return draws;
|
|
1635
1683
|
}
|
|
1636
1684
|
|
|
1637
|
-
|
|
1638
|
-
c:
|
|
1639
|
-
_InternalRenderPipelineContext,
|
|
1640
|
-
'runtime' | 'pipelineState' | 'frameState' | 'bindGroupCounts'
|
|
1641
|
-
>,
|
|
1685
|
+
function resolveGeometryInstanceBuffer(
|
|
1686
|
+
c: _InternalRenderPipelineContext,
|
|
1642
1687
|
entry: _InternalRenderPipelineContext['validatedOrdered'][number],
|
|
1643
1688
|
identityInstanceDraws: readonly GeometryInstanceDraw[],
|
|
1644
1689
|
useProbeBlend: boolean,
|
|
@@ -1674,9 +1719,12 @@ export function resolveGeometryInstanceBuffer(
|
|
|
1674
1719
|
// the shared identity buffer, which would silently render one instance.
|
|
1675
1720
|
if (inst.instanceCount === 0) return [];
|
|
1676
1721
|
const entityCacheKey = instanceCollectionCacheKey(entry.source.worldId, inst);
|
|
1677
|
-
const revision = inst.revision
|
|
1722
|
+
const revision = inst.revision;
|
|
1723
|
+
const dirtyRanges = inst.dirtyRanges;
|
|
1678
1724
|
const sameRevision = (cached: InstanceBufferCacheEntry): boolean =>
|
|
1679
|
-
|
|
1725
|
+
revision === undefined
|
|
1726
|
+
? cached.uploadedRevision === undefined
|
|
1727
|
+
: cached.uploadedRevision === revision;
|
|
1680
1728
|
const fullRange = [{ start: 0, end: inst.instanceCount }] as const;
|
|
1681
1729
|
let instanceBuffer: Buffer = pipelineState.identityInstanceBuffer;
|
|
1682
1730
|
let instanceCount = 1;
|
|
@@ -1694,6 +1742,7 @@ export function resolveGeometryInstanceBuffer(
|
|
|
1694
1742
|
const activeKeys = new Set<string>();
|
|
1695
1743
|
const draws: GeometryInstanceDraw[] = [];
|
|
1696
1744
|
const uniformStrideBytes = 16 * Float32Array.BYTES_PER_ELEMENT;
|
|
1745
|
+
const dirty = inst.dirtyRanges ?? fullRange;
|
|
1697
1746
|
const uploadedRanges: { start: number; end: number }[] = [];
|
|
1698
1747
|
let uploadedBytes = 0;
|
|
1699
1748
|
for (let start = 0; start < inst.instanceCount; start += MAX_UNIFORM_INSTANCES) {
|
|
@@ -1739,13 +1788,17 @@ export function resolveGeometryInstanceBuffer(
|
|
|
1739
1788
|
chunks?.set(chunkKey, active);
|
|
1740
1789
|
if (chunks === undefined) frameState.transientInstanceBuffers.push(active);
|
|
1741
1790
|
}
|
|
1791
|
+
const localRanges = dirty
|
|
1792
|
+
.map((range) => ({
|
|
1793
|
+
start: Math.max(start, range.start) - start,
|
|
1794
|
+
end: Math.min(start + count, range.end) - start,
|
|
1795
|
+
}))
|
|
1796
|
+
.filter((range) => range.end > range.start);
|
|
1742
1797
|
const needsUpload = activeIsNew || !sameRevision(active);
|
|
1743
|
-
const rangesToUpload =
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
},
|
|
1748
|
-
];
|
|
1798
|
+
const rangesToUpload = instanceUploadRangesForResident(activeIsNew, localRanges, {
|
|
1799
|
+
start: 0,
|
|
1800
|
+
end: count,
|
|
1801
|
+
});
|
|
1749
1802
|
if (needsUpload && rangesToUpload.length > 0) {
|
|
1750
1803
|
const upload = uploadInstanceRanges(
|
|
1751
1804
|
c,
|
|
@@ -1765,8 +1818,7 @@ export function resolveGeometryInstanceBuffer(
|
|
|
1765
1818
|
inst,
|
|
1766
1819
|
{
|
|
1767
1820
|
code: 'queue-write-buffer-failed',
|
|
1768
|
-
expected:
|
|
1769
|
-
'the renderer-owned instance uniform buffer accepts the complete instance payload',
|
|
1821
|
+
expected: 'the renderer-owned instance uniform buffer accepts the dirty range',
|
|
1770
1822
|
hint: 'retry after the active device is healthy or recover the renderer',
|
|
1771
1823
|
},
|
|
1772
1824
|
inst.instanceCount * uniformStrideBytes,
|
|
@@ -1776,7 +1828,8 @@ export function resolveGeometryInstanceBuffer(
|
|
|
1776
1828
|
}
|
|
1777
1829
|
}
|
|
1778
1830
|
if (needsUpload) {
|
|
1779
|
-
const published =
|
|
1831
|
+
const published =
|
|
1832
|
+
revision === undefined ? active : { ...active, uploadedRevision: revision };
|
|
1780
1833
|
active = published;
|
|
1781
1834
|
chunks?.set(chunkKey, published);
|
|
1782
1835
|
}
|
|
@@ -1857,7 +1910,6 @@ export function resolveGeometryInstanceBuffer(
|
|
|
1857
1910
|
if (!bufRes.ok) {
|
|
1858
1911
|
runtime.errorRegistry.fire(bufRes.error);
|
|
1859
1912
|
reportInstanceFailure(c, inst, bufRes.error, requestedBytes, cap);
|
|
1860
|
-
return null;
|
|
1861
1913
|
} else {
|
|
1862
1914
|
// feat-20260619 M4 / F12: destroy the old cached buffer
|
|
1863
1915
|
// before replacing it with the new one (D-6).
|
|
@@ -1880,7 +1932,11 @@ export function resolveGeometryInstanceBuffer(
|
|
|
1880
1932
|
}
|
|
1881
1933
|
if (active !== null) {
|
|
1882
1934
|
const needsUpload = activeIsNew || !sameRevision(active);
|
|
1883
|
-
const ranges =
|
|
1935
|
+
const ranges = instanceUploadRangesForResident(
|
|
1936
|
+
activeIsNew,
|
|
1937
|
+
dirtyRanges ?? fullRange,
|
|
1938
|
+
fullRange[0],
|
|
1939
|
+
);
|
|
1884
1940
|
let uploadRanges: readonly { readonly start: number; readonly end: number }[] = [];
|
|
1885
1941
|
let uploadedBytes = 0;
|
|
1886
1942
|
if (needsUpload && ranges.length > 0) {
|
|
@@ -1899,8 +1955,7 @@ export function resolveGeometryInstanceBuffer(
|
|
|
1899
1955
|
inst,
|
|
1900
1956
|
{
|
|
1901
1957
|
code: 'queue-write-buffer-failed',
|
|
1902
|
-
expected:
|
|
1903
|
-
'the renderer-owned instance buffer accepts the complete instance payloads',
|
|
1958
|
+
expected: 'the renderer-owned instance buffer accepts the dirty ranges',
|
|
1904
1959
|
hint: 'retry after the active device is healthy or recover the renderer',
|
|
1905
1960
|
},
|
|
1906
1961
|
requestedBytes,
|
|
@@ -1914,7 +1969,8 @@ export function resolveGeometryInstanceBuffer(
|
|
|
1914
1969
|
}
|
|
1915
1970
|
}
|
|
1916
1971
|
if (needsUpload) {
|
|
1917
|
-
const published =
|
|
1972
|
+
const published =
|
|
1973
|
+
revision === undefined ? active : { ...active, uploadedRevision: revision };
|
|
1918
1974
|
frameState.instanceBuffers.set(entityCacheKey, published);
|
|
1919
1975
|
active = published;
|
|
1920
1976
|
}
|
|
@@ -1949,10 +2005,7 @@ export function resolveGeometryInstanceBuffer(
|
|
|
1949
2005
|
}
|
|
1950
2006
|
|
|
1951
2007
|
export function resolveProbeBlendBuffer(
|
|
1952
|
-
c:
|
|
1953
|
-
_InternalRenderPipelineContext,
|
|
1954
|
-
'runtime' | 'pipelineState' | 'frameState' | 'bindGroupCounts'
|
|
1955
|
-
>,
|
|
2008
|
+
c: _InternalRenderPipelineContext,
|
|
1956
2009
|
record: import('../scene/probe-blend-record').ProbeBlendRecord | undefined,
|
|
1957
2010
|
entityKey?: number,
|
|
1958
2011
|
): { readonly buffer: Buffer; readonly offset: number } {
|
|
@@ -2000,10 +2053,7 @@ export function resolveProbeBlendBuffer(
|
|
|
2000
2053
|
}
|
|
2001
2054
|
|
|
2002
2055
|
export function resolveGeometryInstancesBindGroup(
|
|
2003
|
-
c:
|
|
2004
|
-
_InternalRenderPipelineContext,
|
|
2005
|
-
'runtime' | 'pipelineState' | 'frameState' | 'bindGroupCounts'
|
|
2006
|
-
>,
|
|
2056
|
+
c: _InternalRenderPipelineContext,
|
|
2007
2057
|
instanceBuffer: Buffer,
|
|
2008
2058
|
probeBuffer?: Buffer,
|
|
2009
2059
|
): BindGroup {
|
|
@@ -2013,8 +2063,13 @@ export function resolveGeometryInstancesBindGroup(
|
|
|
2013
2063
|
? pipelineState.instancesBindGroupLayout
|
|
2014
2064
|
: pipelineState.probeInstancesBindGroupLayout;
|
|
2015
2065
|
if (layout === undefined) throw new Error('probe instances bind-group layout is unavailable');
|
|
2066
|
+
// A few record-only fixtures construct a minimal frame state and omit the
|
|
2067
|
+
// shared bind-group cache. Production frames always provide it, but keeping
|
|
2068
|
+
// this resolver total lets those fixtures exercise the same binding path
|
|
2069
|
+
// without weakening the production cache contract.
|
|
2070
|
+
const instancesBgShared = frameState.instancesBgShared ?? new WeakMap<object, unknown>();
|
|
2016
2071
|
return getOrCreateFromChain(
|
|
2017
|
-
|
|
2072
|
+
instancesBgShared,
|
|
2018
2073
|
probeBuffer === undefined ? [layout, instanceBuffer] : [layout, instanceBuffer, probeBuffer],
|
|
2019
2074
|
probeBuffer === undefined ? 'instances-no-probe' : 'instances-probe',
|
|
2020
2075
|
() => {
|