@forgeax/engine-render 0.1.4 → 0.1.6
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 +130 -641
- package/dist/.tsbuildinfo +1 -1
- package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts +2 -0
- package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts.map +1 -0
- package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts +2 -0
- package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts.map +1 -0
- package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts +2 -0
- package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +1 -1
- package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +6 -0
- package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +1 -1
- package/dist/{gpu-driven/view-reference.d.ts → __tests__/gpu-driven-view-reference.d.ts} +4 -4
- package/dist/__tests__/gpu-driven-view-reference.d.ts.map +1 -0
- package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +1 -1
- package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts +2 -0
- package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts.map +1 -0
- package/dist/__tests__/morph-feature-plan.unit.test.d.ts +2 -0
- package/dist/__tests__/morph-feature-plan.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-plan.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-plan.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-plan.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-plan.unit.test.d.ts.map +1 -0
- package/dist/__tests__/ssao-config.unit.test.d.ts +2 -0
- package/dist/__tests__/ssao-config.unit.test.d.ts.map +1 -0
- package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts +2 -0
- package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts.map +1 -0
- package/dist/__tests__/standard-descriptors.test-d.d.ts +2 -0
- package/dist/__tests__/standard-descriptors.test-d.d.ts.map +1 -0
- package/dist/__tests__/standard-pipeline.dawn.test.d.ts +2 -0
- package/dist/__tests__/standard-pipeline.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/standard-pipeline.integration.test.d.ts +2 -0
- package/dist/__tests__/standard-pipeline.integration.test.d.ts.map +1 -0
- package/dist/__tests__/standard-profile-oracle.unit.test.d.ts +2 -0
- package/dist/__tests__/standard-profile-oracle.unit.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts +2 -0
- package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts.map +1 -0
- package/dist/{renderer/backend-selection.d.ts → assembly/backend-contract.d.ts} +15 -4
- package/dist/assembly/backend-contract.d.ts.map +1 -0
- package/dist/assembly/factory.d.ts +207 -0
- package/dist/assembly/factory.d.ts.map +1 -0
- package/dist/assembly/host-contract.d.ts +84 -0
- package/dist/assembly/host-contract.d.ts.map +1 -0
- package/dist/{renderer → assembly}/material/assembly.d.ts +0 -1
- package/dist/{renderer → assembly}/material/assembly.d.ts.map +1 -1
- package/dist/assembly/material/pipeline-projection.d.ts +30 -0
- package/dist/assembly/material/pipeline-projection.d.ts.map +1 -0
- package/dist/authoring.d.ts +10 -11
- package/dist/authoring.d.ts.map +1 -1
- package/dist/authoring.mjs +25 -3
- package/dist/authoring.mjs.map +1 -1
- package/dist/chunk-CQXZC5XI.mjs +182 -0
- package/dist/chunk-CQXZC5XI.mjs.map +1 -0
- package/dist/chunk-QC4VW3XJ.mjs +79 -0
- package/dist/chunk-QC4VW3XJ.mjs.map +1 -0
- package/dist/chunk-SCRSAK5B.mjs +480 -0
- package/dist/chunk-SCRSAK5B.mjs.map +1 -0
- package/dist/components/__tests__/schema-contract.unit.test.d.ts +2 -0
- package/dist/components/__tests__/schema-contract.unit.test.d.ts.map +1 -0
- package/dist/components/glyph-text.d.ts +1 -1
- package/dist/components/glyph-text.d.ts.map +1 -1
- package/dist/components/index.d.ts +2 -2
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/instances.d.ts +1 -1
- package/dist/components/instances.d.ts.map +1 -1
- package/dist/components/light-helpers.d.ts +1 -1
- package/dist/components/light-helpers.d.ts.map +1 -1
- package/dist/components/mesh-filter.d.ts +7 -7
- package/dist/components/mesh-filter.d.ts.map +1 -1
- package/dist/components/scene-instance.d.ts +11 -11
- package/dist/components/skybox-background.d.ts +56 -0
- package/dist/components/skybox-background.d.ts.map +1 -0
- package/dist/components/skylight.d.ts +55 -0
- package/dist/components/skylight.d.ts.map +1 -0
- package/dist/components/sprite-animation.d.ts +2 -3
- package/dist/components/sprite-animation.d.ts.map +1 -1
- package/dist/components/sprite-instances.d.ts +1 -1
- package/dist/components/sprite-playback-mode.d.ts +6 -1
- package/dist/components/sprite-playback-mode.d.ts.map +1 -1
- package/dist/components/sprite-region-override.d.ts +2 -3
- package/dist/components/sprite-region-override.d.ts.map +1 -1
- package/dist/components/tile-layer.d.ts +5 -0
- package/dist/components/tile-layer.d.ts.map +1 -1
- package/dist/construct-renderer.d.ts +18 -1
- package/dist/construct-renderer.d.ts.map +1 -1
- package/dist/construct-renderer.mjs +27008 -4
- package/dist/construct-renderer.mjs.map +1 -1
- package/dist/debug-draw-glue.d.ts +2 -53
- package/dist/debug-draw-glue.d.ts.map +1 -1
- package/dist/device/device-scope.d.ts +83 -0
- package/dist/device/device-scope.d.ts.map +1 -0
- package/dist/{gpu-resource-store.d.ts → device/gpu-residency.d.ts} +91 -48
- package/dist/device/gpu-residency.d.ts.map +1 -0
- package/dist/device/resource-types.d.ts +8 -0
- package/dist/device/resource-types.d.ts.map +1 -0
- package/dist/engine-metrics.d.ts +2 -2
- package/dist/engine-metrics.d.ts.map +1 -1
- package/dist/errors/recover.d.ts +28 -1
- package/dist/errors/recover.d.ts.map +1 -1
- package/dist/errors/render.d.ts +249 -258
- package/dist/errors/render.d.ts.map +1 -1
- package/dist/features/fullscreen.d.ts +19 -0
- package/dist/features/fullscreen.d.ts.map +1 -0
- package/dist/features/host.d.ts +32 -26
- package/dist/features/host.d.ts.map +1 -1
- package/dist/features/morph/morph-feature.d.ts +39 -5
- package/dist/features/morph/morph-feature.d.ts.map +1 -1
- package/dist/features/plan.d.ts +182 -0
- package/dist/features/plan.d.ts.map +1 -0
- package/dist/features/prepared-gpu-work.d.ts +21 -17
- package/dist/features/prepared-gpu-work.d.ts.map +1 -1
- package/dist/features/prepared-graphics-store.d.ts +2 -1
- package/dist/features/prepared-graphics-store.d.ts.map +1 -1
- package/dist/features/prepared-graphics.d.ts +11 -21
- package/dist/features/prepared-graphics.d.ts.map +1 -1
- package/dist/features/render-graph-compute.d.ts +2 -2
- package/dist/features/render-graph-compute.d.ts.map +1 -1
- package/dist/features/render-graph-contribution.d.ts +4 -7
- package/dist/features/render-graph-contribution.d.ts.map +1 -1
- package/dist/features/render-graph-raster.d.ts +2 -2
- package/dist/features/render-graph-raster.d.ts.map +1 -1
- package/dist/features/render-graph-resources.d.ts +6 -6
- package/dist/features/render-graph-resources.d.ts.map +1 -1
- package/dist/features/targets.d.ts +5 -5
- package/dist/features/targets.d.ts.map +1 -1
- package/dist/features/types.d.ts +11 -190
- package/dist/features/types.d.ts.map +1 -1
- package/dist/features/vocabulary.d.ts +14 -0
- package/dist/features/vocabulary.d.ts.map +1 -0
- package/dist/fullscreen-post-process-pass.d.ts +4 -25
- package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
- package/dist/glyph-text-layout-system.d.ts +3 -2
- package/dist/glyph-text-layout-system.d.ts.map +1 -1
- package/dist/gpu-driven/batch-topology.d.ts +6 -75
- package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
- package/dist/gpu-driven/production-raster.d.ts +13 -112
- package/dist/gpu-driven/production-raster.d.ts.map +1 -1
- package/dist/gpu-driven/view-gpu.d.ts +10 -66
- package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
- package/dist/gpu-resource.d.ts +3 -3
- package/dist/gpu-scene-schema.d.ts +1 -94
- package/dist/gpu-scene-schema.d.ts.map +1 -1
- package/dist/gpu-scene.d.ts +7 -33
- package/dist/gpu-scene.d.ts.map +1 -1
- package/dist/hdrp-buffers.d.ts +3 -53
- package/dist/hdrp-buffers.d.ts.map +1 -1
- package/dist/ibl/IblPipelineCache.d.ts +74 -180
- package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
- package/dist/ibl/skylight-bind-group.d.ts +1 -1
- package/dist/index.d.ts +13 -43
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +165 -3
- package/dist/index.mjs.map +1 -1
- package/dist/inspection-types.d.ts +69 -0
- package/dist/inspection-types.d.ts.map +1 -0
- package/dist/instance-buffer-cache.d.ts +1 -4
- package/dist/instance-buffer-cache.d.ts.map +1 -1
- package/dist/internal.d.ts +1 -73
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.mjs +1 -43
- package/dist/internal.mjs.map +1 -1
- package/dist/lifecycle.d.ts +36 -2
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/materials.d.ts +0 -3
- package/dist/materials.d.ts.map +1 -1
- package/dist/mesh-material-bindings.d.ts +0 -1
- package/dist/mesh-material-bindings.d.ts.map +1 -1
- package/dist/pbr-pipeline.d.ts +75 -29
- package/dist/pbr-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-forward-lane.d.ts +5 -0
- package/dist/pipeline/standard-forward-lane.d.ts.map +1 -0
- package/dist/pipeline/standard-pipeline.d.ts +31 -0
- package/dist/pipeline/standard-pipeline.d.ts.map +1 -0
- package/dist/pipeline/standard-profile.d.ts +40 -0
- package/dist/pipeline/standard-profile.d.ts.map +1 -0
- package/dist/pipeline-builder.d.ts +3 -3
- package/dist/pipeline-builder.d.ts.map +1 -1
- package/dist/pipeline-spec-types.d.ts +24 -0
- package/dist/pipeline-spec-types.d.ts.map +1 -0
- package/dist/pipeline-spec.d.ts +16 -155
- package/dist/pipeline-spec.d.ts.map +1 -1
- package/dist/plugin.d.ts +1 -14
- package/dist/plugin.d.ts.map +1 -1
- package/dist/post-process-errors.d.ts +18 -18
- package/dist/post-process-errors.d.ts.map +1 -1
- package/dist/prepare/prepared-graphics-resolver.d.ts +2 -5
- package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
- package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts +2 -0
- package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts.map +1 -0
- package/dist/record/frame-lighting.d.ts +7 -73
- package/dist/record/frame-lighting.d.ts.map +1 -1
- package/dist/record/frame-snapshot.d.ts +44 -44
- package/dist/record/frame-snapshot.d.ts.map +1 -1
- package/dist/record/frame-targets.d.ts +5 -38
- package/dist/record/frame-targets.d.ts.map +1 -1
- package/dist/record/frame.d.ts +64 -52
- package/dist/record/frame.d.ts.map +1 -1
- package/dist/record/helpers.d.ts +3 -2
- package/dist/record/helpers.d.ts.map +1 -1
- package/dist/record/main-pass-geometry.d.ts +5 -4
- package/dist/record/main-pass-geometry.d.ts.map +1 -1
- package/dist/record/main-pass-material.d.ts +90 -59
- package/dist/record/main-pass-material.d.ts.map +1 -1
- package/dist/record/main-pass-sprite-draws.d.ts +28 -3
- package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
- package/dist/record/main-pass.d.ts +1 -1
- package/dist/record/main-pass.d.ts.map +1 -1
- package/dist/record/mesh-ssbo.d.ts +276 -3
- package/dist/record/mesh-ssbo.d.ts.map +1 -1
- package/dist/record/render-context.d.ts +235 -0
- package/dist/record/render-context.d.ts.map +1 -0
- package/dist/record/shadow-pass.d.ts +15 -88
- 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 +29 -7
- package/dist/record/typed-frame-graph.d.ts.map +1 -1
- package/dist/record/view-ubo.d.ts +3 -3
- package/dist/record/view-ubo.d.ts.map +1 -1
- package/dist/render-contract.d.ts +416 -0
- package/dist/render-contract.d.ts.map +1 -0
- package/dist/render-data.d.ts.map +1 -1
- package/dist/render-graph-primitives.d.ts +14 -362
- package/dist/render-graph-primitives.d.ts.map +1 -1
- package/dist/render-pipeline.d.ts +25 -64
- package/dist/render-pipeline.d.ts.map +1 -1
- package/dist/render-system-extract.d.ts +107 -338
- package/dist/render-system-extract.d.ts.map +1 -1
- package/dist/render-system.d.ts +21 -713
- package/dist/render-system.d.ts.map +1 -1
- package/dist/scene/render-scene-types.d.ts +58 -0
- package/dist/scene/render-scene-types.d.ts.map +1 -0
- package/dist/scene/render-scene.d.ts +105 -0
- package/dist/scene/render-scene.d.ts.map +1 -0
- package/dist/scene-instances/post-spawn-resolve-joints.d.ts +2 -5
- package/dist/scene-instances/post-spawn-resolve-joints.d.ts.map +1 -1
- package/dist/ssao-buffers.d.ts +22 -3
- package/dist/ssao-buffers.d.ts.map +1 -1
- package/dist/systems/skin-palette-allocator.d.ts +2 -4
- package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
- package/dist/systems/skin-palette-types.d.ts +14 -0
- package/dist/systems/skin-palette-types.d.ts.map +1 -0
- package/dist/systems/transparent-sort-config.d.ts +23 -2
- package/dist/systems/transparent-sort-config.d.ts.map +1 -1
- package/dist/tilemap-chunk-extract-system.d.ts +4 -3
- package/dist/tilemap-chunk-extract-system.d.ts.map +1 -1
- package/dist/typed-render-graph-primitives.d.ts +2 -4
- package/dist/typed-render-graph-primitives.d.ts.map +1 -1
- package/dist/typed-shadow-passes.d.ts +3 -3
- package/dist/typed-shadow-passes.d.ts.map +1 -1
- package/package.json +23 -23
- package/src/__tests__/backend-selection-rhi-capture.test-d.ts +1 -1
- package/src/__tests__/callback-inference.test-d.ts +6 -3
- package/src/__tests__/cluster-grid-default-surface.unit.test.ts +7 -4
- package/src/__tests__/construct-renderer-identity.unit.test.ts +15 -2
- package/src/__tests__/device-scope-lifecycle.unit.test.ts +151 -0
- package/src/__tests__/device-scope-stale-matrix.unit.test.ts +42 -0
- package/src/__tests__/direct-extract-consumer-contract.test-d.ts +8 -19
- package/src/__tests__/direct-light-snapshot.unit.test.ts +3 -13
- package/src/__tests__/factory-contract.integration.test.ts +158 -209
- package/src/__tests__/fallback-row-stride-surface.unit.test.ts +1 -4
- package/src/__tests__/frame-observation.contract.test.ts +17 -8
- package/src/__tests__/fullscreen-feature-plan.unit.test.ts +32 -0
- package/src/__tests__/glyph-text-layout-recovery.unit.test.ts +6 -11
- package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +9 -16
- package/src/__tests__/gpu-driven-production.integration.test.ts +32 -205
- package/src/__tests__/gpu-driven-scaling.unit.test.ts +4 -7
- package/src/__tests__/gpu-driven-view-gpu-evidence.ts +87 -8
- package/src/__tests__/gpu-driven-view-graph.integration.test.ts +170 -8
- package/src/{gpu-driven/view-reference.ts → __tests__/gpu-driven-view-reference.ts} +4 -3
- package/src/__tests__/gpu-driven-view.browser.test.ts +12 -1
- package/src/__tests__/gpu-driven-view.dawn.test.ts +12 -1
- package/src/__tests__/gpu-driven-view.unit.test.ts +11 -267
- package/src/__tests__/gpu-resource-store-stride.unit.test.ts +3 -3
- package/src/__tests__/gpu-scene-render-graph-gpu.ts +2 -3
- package/src/__tests__/gpu-scene.dawn.test.ts +2 -6
- package/src/__tests__/gpu-scene.unit.test.ts +10 -24
- package/src/__tests__/ibl/face-uniforms.unit.test.ts +46 -0
- package/src/__tests__/infinite-grid-no-vertex-probe.unit.test.ts +34 -66
- package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +14 -5
- package/src/__tests__/light-buffer-layout.unit.test.ts +4 -49
- package/src/__tests__/material-cooked-projection.unit.test.ts +2 -51
- package/src/__tests__/material-snapshot-mutation.integration.test.ts +10 -15
- package/src/__tests__/material-static-dynamic-route.unit.test.ts +4 -23
- package/src/__tests__/material-stride-surface.unit.test.ts +2 -2
- package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +7 -8
- package/src/__tests__/morph-culling-reentry.dawn.test.ts +29 -38
- package/src/__tests__/morph-feature-gpu-work.integration.test.ts +45 -43
- package/src/__tests__/morph-feature-plan.unit.test.ts +53 -0
- package/src/__tests__/morph-visual-evidence.integration.test.ts +47 -33
- package/src/__tests__/nineslice-handle-surface.unit.test.ts +11 -6
- package/src/__tests__/post-process-error-policy-owner.unit.test.ts +6 -13
- package/src/__tests__/prepared-graphics-capability.unit.test.ts +6 -81
- package/src/__tests__/prepared-graphics-generation.unit.test.ts +3 -17
- package/src/__tests__/prepared-graphics-lifecycle.unit.test.ts +6 -74
- package/src/__tests__/prepared-graphics-resolver.unit.test.ts +1 -3
- package/src/__tests__/prepared-graphics-snapshot.unit.test.ts +2 -2
- package/src/__tests__/profiler-default-off.test.ts +1 -1
- package/src/__tests__/profiler-phase-catalog.test.ts +2 -2
- package/src/__tests__/profiler-phase-integration.test.ts +5 -13
- package/src/__tests__/profiler-phase-token.test.ts +3 -8
- package/src/__tests__/public-surface.test-d.ts +65 -3
- package/src/__tests__/recover-error-policy-owner.unit.test.ts +1 -21
- package/src/__tests__/render-error-code-owner.test-d.ts +18 -23
- package/src/__tests__/render-error-detail-ssot.test-d.ts +0 -95
- package/src/__tests__/render-error-exhaustive.test-d.ts +8 -1
- package/src/__tests__/render-feature-assembly.test-d.ts +8 -16
- package/src/__tests__/render-feature-context.test-d.ts +16 -40
- package/src/__tests__/render-feature-contract.test-d.ts +9 -18
- package/src/__tests__/render-feature-diagnostics.unit.test.ts +6 -8
- package/src/__tests__/render-feature-docs.unit.test.ts +8 -7
- package/src/__tests__/render-feature-gpu-work.integration.test.ts +14 -75
- package/src/__tests__/render-feature-plan.test-d.ts +161 -0
- package/src/__tests__/render-feature-plan.unit.test.ts +170 -0
- package/src/__tests__/render-feature-prepared-diagnostics.unit.test.ts +8 -19
- package/src/__tests__/render-feature-prepared-errors.test-d.ts +3 -6
- package/src/__tests__/render-feature-prepared-graphics-docs.unit.test.ts +10 -71
- package/src/__tests__/render-feature-prepared-graphics-isolation.unit.test.ts +11 -61
- package/src/__tests__/render-feature-prepared-graphics-negative.test-d.ts +20 -43
- package/src/__tests__/render-feature-prepared-graphics.test-d.ts +56 -78
- package/src/__tests__/render-feature-public-surface.test-d.ts +6 -24
- package/src/__tests__/render-feature-retry.unit.test.ts +7 -48
- package/src/__tests__/render-feature-scheduling.unit.test.ts +15 -27
- package/src/__tests__/render-feature-stage-failed-policy-owner.unit.test.ts +0 -9
- package/src/__tests__/render-feature-stage-fault-recovery.unit.test.ts +19 -109
- package/src/__tests__/render-feature-visibility-context.test-d.ts +1 -6
- package/src/__tests__/render-feature-visibility-context.unit.test.ts +1 -2
- package/src/__tests__/render-feature-zero-work.unit.test.ts +14 -20
- package/src/__tests__/render-scene-projection.unit.test.ts +73 -111
- package/src/__tests__/renderer-factory-material-contract.unit.test.ts +44 -95
- package/src/__tests__/renderer-lifecycle.integration.test.ts +49 -1
- package/src/__tests__/shader-stage-surface.unit.test.ts +14 -9
- package/src/__tests__/ssao-config.unit.test.ts +36 -0
- package/src/__tests__/ssao-kernel-surface.unit.test.ts +4 -5
- package/src/__tests__/standard-clustered-pipeline.unit.test.ts +28 -0
- package/src/__tests__/standard-descriptors.test-d.ts +22 -0
- package/src/__tests__/standard-pipeline.dawn.test.ts +61 -0
- package/src/__tests__/standard-pipeline.integration.test.ts +124 -0
- package/src/__tests__/standard-profile-oracle.unit.test.ts +62 -0
- package/src/__tests__/surface-configuration.unit.test.ts +1 -2
- package/src/__tests__/texture-usage-surface.unit.test.ts +3 -6
- package/src/__tests__/typed-pipeline-topology.unit.test.ts +40 -206
- package/src/__tests__/urp-pipeline-targets.unit.test.ts +1 -11
- package/src/__tests__/urp-pipeline.unit.test.ts +2 -2
- package/src/__tests__/vertex-color-pipeline.unit.test.ts +10 -2
- package/src/__tests__/vertex-layout-consumer.unit.test.ts +1 -1
- package/src/__tests__/visibility-diagnostics.integration.test.ts +7 -11
- package/src/__tests__/visibility-extract.integration.test.ts +20 -11
- package/src/__tests__/visibility-extract.perf.test.ts +66 -32
- package/src/__tests__/visibility-feature-dedup.integration.test.ts +2 -4
- package/src/__tests__/visibility-hidden-report.unit.test.ts +1 -2
- package/src/__tests__/visibility-instances.integration.test.ts +7 -11
- package/src/__tests__/visibility-multi-world.integration.test.ts +38 -6
- package/src/__tests__/visibility-producer-matrix.integration.test.ts +18 -41
- package/src/__tests__/visibility-public-surface.test-d.ts +10 -9
- package/src/__tests__/visibility-resolver.unit.test.ts +2 -1
- package/src/__tests__/visibility-resource-short-circuit.unit.test.ts +80 -0
- package/src/__tests__/visibility-snapshot-contract.unit.test.ts +2 -1
- package/src/__tests__/vocabulary.unit.test.ts +1 -1
- package/src/assembly/backend-contract.ts +57 -0
- package/src/{renderer/renderer-factory.ts → assembly/factory.ts} +1663 -2690
- package/src/assembly/host-contract.ts +101 -0
- package/src/{renderer → assembly}/material/assembly.ts +0 -2
- package/src/assembly/material/pipeline-projection.ts +63 -0
- package/src/authoring.ts +14 -22
- package/src/components/__tests__/schema-contract.unit.test.ts +10 -0
- package/src/components/glyph-text.ts +3 -2
- package/src/components/index.ts +7 -9
- package/src/components/instances.ts +4 -5
- package/src/components/light-helpers.ts +1 -1
- package/src/components/mesh-filter.ts +11 -10
- package/src/components/post-process-params.ts +3 -3
- package/src/components/scene-instance.ts +12 -12
- package/src/components/skybox-background.ts +103 -0
- package/src/components/{environment.ts → skylight.ts} +2 -110
- package/src/components/sprite-animation.ts +3 -4
- package/src/components/sprite-instances.ts +2 -2
- package/src/components/sprite-playback-mode.ts +7 -1
- package/src/components/sprite-region-override.ts +2 -3
- package/src/components/tile-layer.ts +8 -2
- package/src/construct-renderer.ts +67 -4
- package/src/debug-draw-glue.ts +8 -129
- package/src/device/device-scope.ts +306 -0
- package/src/{gpu-resource-store.ts → device/gpu-residency.ts} +540 -639
- package/src/device/resource-types.ts +20 -0
- package/src/engine-metrics.ts +12 -19
- package/src/errors/recover.ts +45 -3
- package/src/errors/render.ts +357 -460
- package/src/features/fullscreen.ts +46 -0
- package/src/features/host.ts +575 -309
- package/src/features/morph/morph-feature.ts +195 -105
- package/src/features/plan.ts +447 -0
- package/src/features/prepared-gpu-work.ts +72 -15
- package/src/features/prepared-graphics-store.ts +20 -6
- package/src/features/prepared-graphics.ts +12 -71
- package/src/features/render-graph-compute.ts +14 -5
- package/src/features/render-graph-contribution.ts +43 -63
- package/src/features/render-graph-raster.ts +11 -6
- package/src/features/render-graph-resources.ts +25 -23
- package/src/features/targets.ts +8 -21
- package/src/features/types.ts +39 -227
- package/src/features/vocabulary.ts +24 -0
- package/src/fullscreen-post-process-pass.ts +14 -57
- package/src/glyph-text-layout-system.ts +70 -96
- package/src/gpu-driven/batch-topology.ts +24 -202
- package/src/gpu-driven/production-raster.ts +93 -1108
- package/src/gpu-driven/view-gpu.ts +46 -192
- package/src/gpu-resource.ts +4 -4
- package/src/gpu-scene-schema.ts +11 -99
- package/src/gpu-scene.ts +231 -364
- package/src/hdrp-buffers.ts +12 -221
- package/src/ibl/IblPipelineCache.ts +471 -711
- package/src/ibl/skylight-bind-group.ts +4 -4
- package/src/index.ts +58 -217
- package/src/inspection-types.ts +76 -0
- package/src/instance-buffer-cache.ts +1 -29
- package/src/internal.ts +6 -85
- package/src/lifecycle.ts +64 -19
- package/src/materials.ts +7 -29
- package/src/mesh-material-bindings.ts +0 -1
- package/src/pbr-pipeline.ts +434 -53
- package/src/{urp-pipeline.ts → pipeline/standard-forward-lane.ts} +38 -149
- package/src/{hdrp-pipeline.ts → pipeline/standard-pipeline.ts} +221 -191
- package/src/pipeline/standard-profile.ts +65 -0
- package/src/pipeline-builder.ts +60 -64
- package/src/pipeline-spec-types.ts +28 -0
- package/src/pipeline-spec.ts +72 -609
- package/src/plugin.ts +3 -75
- package/src/post-process-errors.ts +31 -33
- package/src/prepare/prepared-graphics-resolver.ts +5 -4
- package/src/record/__tests__/material-slot-plan.unit.test.ts +1 -33
- package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +41 -0
- package/src/record/__tests__/video-texture-view.unit.test.ts +1 -1
- package/src/record/frame-lighting.ts +74 -195
- package/src/record/frame-snapshot.ts +45 -60
- package/src/record/frame-targets.ts +8 -243
- package/src/record/frame.ts +509 -796
- package/src/record/helpers.ts +6 -11
- package/src/record/main-pass-geometry.ts +106 -147
- package/src/record/main-pass-material.ts +517 -190
- package/src/record/main-pass-sprite-draws.ts +198 -117
- package/src/record/main-pass.ts +162 -143
- package/src/record/mesh-ssbo.ts +517 -38
- package/src/record/render-context.ts +364 -0
- package/src/record/shadow-pass.ts +138 -1838
- package/src/record/skybox-post-pass.ts +12 -14
- package/src/record/typed-frame-graph.ts +215 -254
- package/src/record/view-ubo.ts +6 -37
- package/src/render-contract.ts +571 -0
- package/src/render-data.ts +3 -3
- package/src/render-graph-primitives.ts +76 -851
- package/src/render-pipeline.ts +104 -188
- package/src/render-system-extract.ts +1048 -1729
- package/src/render-system.ts +330 -1957
- package/src/scene/render-scene-types.ts +64 -0
- package/src/scene/render-scene.ts +1032 -0
- package/src/scene-instances/post-spawn-resolve-joints.ts +4 -7
- package/src/ssao-buffers.ts +167 -8
- package/src/systems/skin-palette-allocator.ts +21 -64
- package/src/systems/skin-palette-types.ts +14 -0
- package/src/systems/transparent-sort-config.ts +25 -3
- package/src/tilemap-chunk-extract-system.ts +53 -70
- package/src/typed-render-graph-primitives.ts +35 -24
- package/src/typed-shadow-passes.ts +26 -56
- package/dist/__tests__/analytic-sky-contract.test.d.ts +0 -2
- package/dist/__tests__/analytic-sky-contract.test.d.ts.map +0 -1
- package/dist/__tests__/analytic-sky-falsify.test.d.ts +0 -2
- package/dist/__tests__/analytic-sky-falsify.test.d.ts.map +0 -1
- package/dist/__tests__/assets-runtime-handoff.integration.test.d.ts +0 -2
- package/dist/__tests__/assets-runtime-handoff.integration.test.d.ts.map +0 -1
- package/dist/__tests__/backend-selection.integration.test.d.ts +0 -2
- package/dist/__tests__/backend-selection.integration.test.d.ts.map +0 -1
- package/dist/__tests__/camera-temporal.test-d.d.ts +0 -2
- package/dist/__tests__/camera-temporal.test-d.d.ts.map +0 -1
- package/dist/__tests__/camera-temporal.test.d.ts +0 -2
- package/dist/__tests__/camera-temporal.test.d.ts.map +0 -1
- package/dist/__tests__/directional-shadow-probe-atlas-layout.unit.test.d.ts +0 -2
- package/dist/__tests__/directional-shadow-probe-atlas-layout.unit.test.d.ts.map +0 -1
- package/dist/__tests__/environment-inspection.test.d.ts +0 -2
- package/dist/__tests__/environment-inspection.test.d.ts.map +0 -1
- package/dist/__tests__/fog-ai-user.fixture.d.ts +0 -2
- package/dist/__tests__/fog-ai-user.fixture.d.ts.map +0 -1
- package/dist/__tests__/fog-custom-render-feature.fixture.d.ts +0 -16
- package/dist/__tests__/fog-custom-render-feature.fixture.d.ts.map +0 -1
- package/dist/__tests__/fog-custom-render-feature.integration.test.d.ts +0 -2
- package/dist/__tests__/fog-custom-render-feature.integration.test.d.ts.map +0 -1
- package/dist/__tests__/fog-inspection.integration.test.d.ts +0 -2
- package/dist/__tests__/fog-inspection.integration.test.d.ts.map +0 -1
- package/dist/__tests__/fog-owner-state.integration.test.d.ts +0 -2
- package/dist/__tests__/fog-owner-state.integration.test.d.ts.map +0 -1
- package/dist/__tests__/fog-pipeline-topology.integration.test.d.ts +0 -2
- package/dist/__tests__/fog-pipeline-topology.integration.test.d.ts.map +0 -1
- package/dist/__tests__/fog-public-surface.integration.test.d.ts +0 -2
- package/dist/__tests__/fog-public-surface.integration.test.d.ts.map +0 -1
- package/dist/__tests__/fog-ray-contract.integration.test.d.ts +0 -2
- package/dist/__tests__/fog-ray-contract.integration.test.d.ts.map +0 -1
- package/dist/__tests__/fog-source-absence.integration.test.d.ts +0 -2
- package/dist/__tests__/fog-source-absence.integration.test.d.ts.map +0 -1
- package/dist/__tests__/fog-temporal.integration.test.d.ts +0 -2
- package/dist/__tests__/fog-temporal.integration.test.d.ts.map +0 -1
- package/dist/__tests__/frame-chain.unit.test.d.ts +0 -2
- package/dist/__tests__/frame-chain.unit.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-scene-field-type-owner.test-d.d.ts +0 -2
- package/dist/__tests__/gpu-scene-field-type-owner.test-d.d.ts.map +0 -1
- package/dist/__tests__/hdrp-pipeline.unit.test.d.ts +0 -2
- package/dist/__tests__/hdrp-pipeline.unit.test.d.ts.map +0 -1
- package/dist/__tests__/ibl/ibl-fallback.unit.test.d.ts +0 -2
- package/dist/__tests__/ibl/ibl-fallback.unit.test.d.ts.map +0 -1
- package/dist/__tests__/material-derived-error-stop-draw.integration.test.d.ts +0 -2
- package/dist/__tests__/material-derived-error-stop-draw.integration.test.d.ts.map +0 -1
- package/dist/__tests__/material-derived-payload.integration.test.d.ts +0 -2
- package/dist/__tests__/material-derived-payload.integration.test.d.ts.map +0 -1
- package/dist/__tests__/materials.unit.test.d.ts +0 -2
- package/dist/__tests__/materials.unit.test.d.ts.map +0 -1
- package/dist/__tests__/param-schema-projection-census.unit.test.d.ts +0 -2
- package/dist/__tests__/param-schema-projection-census.unit.test.d.ts.map +0 -1
- package/dist/__tests__/persistent-render-scene.unit.test.d.ts +0 -2
- package/dist/__tests__/persistent-render-scene.unit.test.d.ts.map +0 -1
- package/dist/__tests__/pipeline-error-policy-owner.unit.test.d.ts +0 -2
- package/dist/__tests__/pipeline-error-policy-owner.unit.test.d.ts.map +0 -1
- package/dist/__tests__/pipeline-pass-trace.test.d.ts +0 -2
- package/dist/__tests__/pipeline-pass-trace.test.d.ts.map +0 -1
- package/dist/__tests__/pipeline-stage-owner.test-d.d.ts +0 -2
- package/dist/__tests__/pipeline-stage-owner.test-d.d.ts.map +0 -1
- package/dist/__tests__/plugin.test.d.ts +0 -2
- package/dist/__tests__/plugin.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-backend-matrix.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-backend-matrix.unit.test.d.ts.map +0 -1
- package/dist/__tests__/prepared-graphics-resolver-recording.unit.test.d.ts +0 -2
- package/dist/__tests__/prepared-graphics-resolver-recording.unit.test.d.ts.map +0 -1
- package/dist/__tests__/public-pipeline-id.test-d.d.ts +0 -2
- package/dist/__tests__/public-pipeline-id.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-dispatch-membership.unit.test.d.ts +0 -2
- package/dist/__tests__/render-dispatch-membership.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-construction.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-construction.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-error-code-owner.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-error-code-owner.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-gpu-buffer-usage-owner.test-d.d.ts +0 -2
- package/dist/__tests__/render-feature-gpu-buffer-usage-owner.test-d.d.ts.map +0 -1
- package/dist/__tests__/render-feature-graph.integration.test.d.ts +0 -2
- package/dist/__tests__/render-feature-graph.integration.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-graphics-staging.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-graphics-staging.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-order.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-order.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-prepared-graphics-recording.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-prepared-graphics-recording.unit.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-staging.unit.test.d.ts +0 -2
- package/dist/__tests__/render-feature-staging.unit.test.d.ts.map +0 -1
- package/dist/__tests__/renderer-render-scene-public.test-d.d.ts +0 -2
- package/dist/__tests__/renderer-render-scene-public.test-d.d.ts.map +0 -1
- package/dist/__tests__/scene-temporal-coverage.unit.test.d.ts +0 -2
- package/dist/__tests__/scene-temporal-coverage.unit.test.d.ts.map +0 -1
- package/dist/__tests__/sun-snapshot-consumers.test.d.ts +0 -2
- package/dist/__tests__/sun-snapshot-consumers.test.d.ts.map +0 -1
- package/dist/__tests__/surface-backend-kind-owner.test-d.d.ts +0 -2
- package/dist/__tests__/surface-backend-kind-owner.test-d.d.ts.map +0 -1
- package/dist/__tests__/taa-history-store.unit.test.d.ts +0 -2
- package/dist/__tests__/taa-history-store.unit.test.d.ts.map +0 -1
- package/dist/__tests__/temporal-frame-transaction.integration.test.d.ts +0 -2
- package/dist/__tests__/temporal-frame-transaction.integration.test.d.ts.map +0 -1
- package/dist/__tests__/temporal-inspection.unit.test.d.ts +0 -2
- package/dist/__tests__/temporal-inspection.unit.test.d.ts.map +0 -1
- package/dist/assets/__tests__/asset-decoders.unit.test.d.ts +0 -2
- package/dist/assets/__tests__/asset-decoders.unit.test.d.ts.map +0 -1
- package/dist/assets/__tests__/mipmap-generator.unit.test.d.ts +0 -2
- package/dist/assets/__tests__/mipmap-generator.unit.test.d.ts.map +0 -1
- package/dist/assets/__tests__/render-asset-port.unit.test.d.ts +0 -2
- package/dist/assets/__tests__/render-asset-port.unit.test.d.ts.map +0 -1
- package/dist/assets/__tests__/resolve-render-asset.unit.test.d.ts +0 -2
- package/dist/assets/__tests__/resolve-render-asset.unit.test.d.ts.map +0 -1
- package/dist/chunk-DJIMFYX6.mjs +0 -1439
- package/dist/chunk-DJIMFYX6.mjs.map +0 -1
- package/dist/chunk-F2SIOCRM.mjs +0 -7423
- package/dist/chunk-F2SIOCRM.mjs.map +0 -1
- package/dist/chunk-JMSB7AR4.mjs +0 -3
- package/dist/chunk-JMSB7AR4.mjs.map +0 -1
- package/dist/chunk-KHI6K4C6.mjs +0 -659
- package/dist/chunk-KHI6K4C6.mjs.map +0 -1
- package/dist/chunk-PORZOL2V.mjs +0 -569
- package/dist/chunk-PORZOL2V.mjs.map +0 -1
- package/dist/chunk-UOJGMDGP.mjs +0 -29913
- package/dist/chunk-UOJGMDGP.mjs.map +0 -1
- package/dist/components/__tests__/atmosphere-red.test.d.ts +0 -2
- package/dist/components/__tests__/atmosphere-red.test.d.ts.map +0 -1
- package/dist/components/__tests__/atmosphere.test.d.ts +0 -2
- package/dist/components/__tests__/atmosphere.test.d.ts.map +0 -1
- package/dist/components/__tests__/fog.test-d.d.ts +0 -2
- package/dist/components/__tests__/fog.test-d.d.ts.map +0 -1
- package/dist/components/__tests__/fog.test.d.ts +0 -2
- package/dist/components/__tests__/fog.test.d.ts.map +0 -1
- package/dist/components/atmosphere.d.ts +0 -18
- package/dist/components/atmosphere.d.ts.map +0 -1
- package/dist/components/environment.d.ts +0 -115
- package/dist/components/environment.d.ts.map +0 -1
- package/dist/deferred-lighting.d.ts +0 -13
- package/dist/deferred-lighting.d.ts.map +0 -1
- package/dist/dynamic-texture-store.d.ts +0 -42
- package/dist/dynamic-texture-store.d.ts.map +0 -1
- package/dist/environment/__tests__/failure-injection.test.d.ts +0 -2
- package/dist/environment/__tests__/failure-injection.test.d.ts.map +0 -1
- package/dist/environment/__tests__/generation-red.test.d.ts +0 -2
- package/dist/environment/__tests__/generation-red.test.d.ts.map +0 -1
- package/dist/environment/__tests__/generation.test.d.ts +0 -2
- package/dist/environment/__tests__/generation.test.d.ts.map +0 -1
- package/dist/environment/__tests__/graph-transaction.test.d.ts +0 -2
- package/dist/environment/__tests__/graph-transaction.test.d.ts.map +0 -1
- package/dist/environment/__tests__/inspection-red.test.d.ts +0 -2
- package/dist/environment/__tests__/inspection-red.test.d.ts.map +0 -1
- package/dist/environment/__tests__/lifecycle-evidence.test.d.ts +0 -2
- package/dist/environment/__tests__/lifecycle-evidence.test.d.ts.map +0 -1
- package/dist/environment/__tests__/pipeline-topology.test.d.ts +0 -2
- package/dist/environment/__tests__/pipeline-topology.test.d.ts.map +0 -1
- package/dist/environment/__tests__/readiness.test.d.ts +0 -2
- package/dist/environment/__tests__/readiness.test.d.ts.map +0 -1
- package/dist/environment/__tests__/recovery.test.d.ts +0 -2
- package/dist/environment/__tests__/recovery.test.d.ts.map +0 -1
- package/dist/environment/__tests__/resize-dispose.test.d.ts +0 -2
- package/dist/environment/__tests__/resize-dispose.test.d.ts.map +0 -1
- package/dist/environment/__tests__/signature-red.test.d.ts +0 -2
- package/dist/environment/__tests__/signature-red.test.d.ts.map +0 -1
- package/dist/environment/__tests__/signature.test.d.ts +0 -2
- package/dist/environment/__tests__/signature.test.d.ts.map +0 -1
- package/dist/environment/descriptors.d.ts +0 -2
- package/dist/environment/descriptors.d.ts.map +0 -1
- package/dist/environment/extracted-environment.d.ts +0 -53
- package/dist/environment/extracted-environment.d.ts.map +0 -1
- package/dist/environment/generation.d.ts +0 -62
- package/dist/environment/generation.d.ts.map +0 -1
- package/dist/environment/gpu-bundle.d.ts +0 -23
- package/dist/environment/gpu-bundle.d.ts.map +0 -1
- package/dist/environment/graph.d.ts +0 -108
- package/dist/environment/graph.d.ts.map +0 -1
- package/dist/environment/inspection.d.ts +0 -48
- package/dist/environment/inspection.d.ts.map +0 -1
- package/dist/environment/lifecycle.d.ts +0 -22
- package/dist/environment/lifecycle.d.ts.map +0 -1
- package/dist/environment/readiness.d.ts +0 -29
- package/dist/environment/readiness.d.ts.map +0 -1
- package/dist/environment/signature.d.ts +0 -70
- package/dist/environment/signature.d.ts.map +0 -1
- package/dist/extract/__tests__/directional-csm-domain.unit.test.d.ts +0 -2
- package/dist/extract/__tests__/directional-csm-domain.unit.test.d.ts.map +0 -1
- package/dist/extract/__tests__/environment-source.test.d.ts +0 -2
- package/dist/extract/__tests__/environment-source.test.d.ts.map +0 -1
- package/dist/extract/__tests__/schema-readers.unit.test.d.ts +0 -2
- package/dist/extract/__tests__/schema-readers.unit.test.d.ts.map +0 -1
- package/dist/extract/directional-csm.d.ts +0 -129
- package/dist/extract/directional-csm.d.ts.map +0 -1
- package/dist/extract/index.d.ts +0 -5
- package/dist/extract/index.d.ts.map +0 -1
- package/dist/extract/material-interface.d.ts +0 -56
- package/dist/extract/material-interface.d.ts.map +0 -1
- package/dist/extract/schema-readers.d.ts +0 -20
- package/dist/extract/schema-readers.d.ts.map +0 -1
- package/dist/features/graph-contribution.d.ts +0 -64
- package/dist/features/graph-contribution.d.ts.map +0 -1
- package/dist/features/index.d.ts +0 -21
- package/dist/features/index.d.ts.map +0 -1
- package/dist/features/morph/index.d.ts +0 -3
- package/dist/features/morph/index.d.ts.map +0 -1
- package/dist/features/morph/morph-bounds.d.ts +0 -42
- package/dist/features/morph/morph-bounds.d.ts.map +0 -1
- package/dist/features/scene-temporal.d.ts +0 -45
- package/dist/features/scene-temporal.d.ts.map +0 -1
- package/dist/features/taa-resolve.d.ts +0 -21
- package/dist/features/taa-resolve.d.ts.map +0 -1
- package/dist/frame-chain.d.ts +0 -14
- package/dist/frame-chain.d.ts.map +0 -1
- package/dist/gpu-driven/view-reference.d.ts.map +0 -1
- package/dist/gpu-resource-store.d.ts.map +0 -1
- package/dist/hdrp-cluster-membership.d.ts +0 -2
- package/dist/hdrp-cluster-membership.d.ts.map +0 -1
- package/dist/hdrp-pipeline.d.ts +0 -36
- package/dist/hdrp-pipeline.d.ts.map +0 -1
- package/dist/ibl/cubemap-projection.d.ts +0 -23
- package/dist/ibl/cubemap-projection.d.ts.map +0 -1
- package/dist/ibl/face-uniforms.d.ts +0 -65
- package/dist/ibl/face-uniforms.d.ts.map +0 -1
- package/dist/mesh-update-errors.d.ts +0 -71
- package/dist/mesh-update-errors.d.ts.map +0 -1
- package/dist/mipmap-generator.d.ts +0 -39
- package/dist/mipmap-generator.d.ts.map +0 -1
- package/dist/param-schema-projection-census.d.ts +0 -18
- package/dist/param-schema-projection-census.d.ts.map +0 -1
- package/dist/persistent-render-scene.d.ts +0 -158
- package/dist/persistent-render-scene.d.ts.map +0 -1
- package/dist/pipeline/index.d.ts +0 -11
- package/dist/pipeline/index.d.ts.map +0 -1
- package/dist/pipeline-errors.d.ts +0 -110
- package/dist/pipeline-errors.d.ts.map +0 -1
- package/dist/prepare/__tests__/schema-readers.unit.test.d.ts +0 -2
- package/dist/prepare/__tests__/schema-readers.unit.test.d.ts.map +0 -1
- package/dist/prepare/index.d.ts +0 -4
- package/dist/prepare/index.d.ts.map +0 -1
- package/dist/prepare/schema-readers.d.ts +0 -11
- package/dist/prepare/schema-readers.d.ts.map +0 -1
- package/dist/record/__tests__/environment-record.test.d.ts +0 -2
- package/dist/record/__tests__/environment-record.test.d.ts.map +0 -1
- package/dist/record/__tests__/frame-targets.unit.test.d.ts +0 -2
- package/dist/record/__tests__/frame-targets.unit.test.d.ts.map +0 -1
- package/dist/record/__tests__/membership-timing.unit.test.d.ts +0 -2
- package/dist/record/__tests__/membership-timing.unit.test.d.ts.map +0 -1
- package/dist/record/__tests__/render-submission.integration.test.d.ts +0 -2
- package/dist/record/__tests__/render-submission.integration.test.d.ts.map +0 -1
- package/dist/record/__tests__/render-submission.perf.test.d.ts +0 -2
- package/dist/record/__tests__/render-submission.perf.test.d.ts.map +0 -1
- package/dist/record/__tests__/shadow-submit-mode.unit.test.d.ts +0 -2
- package/dist/record/__tests__/shadow-submit-mode.unit.test.d.ts.map +0 -1
- package/dist/record/__tests__/view-ubo-layout.unit.test.d.ts +0 -2
- package/dist/record/__tests__/view-ubo-layout.unit.test.d.ts.map +0 -1
- package/dist/record/frame-observation.d.ts +0 -38
- package/dist/record/frame-observation.d.ts.map +0 -1
- package/dist/record/index.d.ts +0 -15
- package/dist/record/index.d.ts.map +0 -1
- package/dist/record/main-pass-skin.d.ts +0 -46
- package/dist/record/main-pass-skin.d.ts.map +0 -1
- package/dist/record/main-pass-sprite.d.ts +0 -69
- package/dist/record/main-pass-sprite.d.ts.map +0 -1
- package/dist/record/material-payload.d.ts +0 -43
- package/dist/record/material-payload.d.ts.map +0 -1
- package/dist/record/material-slot-plan.d.ts +0 -26
- package/dist/record/material-slot-plan.d.ts.map +0 -1
- package/dist/record/membership-timing.d.ts +0 -232
- package/dist/record/membership-timing.d.ts.map +0 -1
- package/dist/record/shadow-caster-uniform.d.ts +0 -8
- package/dist/record/shadow-caster-uniform.d.ts.map +0 -1
- package/dist/record/shadow-submit-mode.d.ts +0 -66
- package/dist/record/shadow-submit-mode.d.ts.map +0 -1
- package/dist/render-dispatch-membership.d.ts +0 -47
- package/dist/render-dispatch-membership.d.ts.map +0 -1
- package/dist/render-pipeline-context.d.ts +0 -289
- package/dist/render-pipeline-context.d.ts.map +0 -1
- package/dist/render-pipeline-target.d.ts +0 -16
- package/dist/render-pipeline-target.d.ts.map +0 -1
- package/dist/render-scene-projection.d.ts +0 -174
- package/dist/render-scene-projection.d.ts.map +0 -1
- package/dist/render-system-fold.d.ts +0 -266
- package/dist/render-system-fold.d.ts.map +0 -1
- package/dist/renderer/asset-service.d.ts +0 -10
- package/dist/renderer/asset-service.d.ts.map +0 -1
- package/dist/renderer/backend-selection.d.ts.map +0 -1
- package/dist/renderer/environment-classify.d.ts +0 -6
- package/dist/renderer/environment-classify.d.ts.map +0 -1
- package/dist/renderer/environment-error.d.ts +0 -13
- package/dist/renderer/environment-error.d.ts.map +0 -1
- package/dist/renderer/material/pipeline-projection.d.ts +0 -91
- package/dist/renderer/material/pipeline-projection.d.ts.map +0 -1
- package/dist/renderer/renderer-factory.d.ts +0 -289
- package/dist/renderer/renderer-factory.d.ts.map +0 -1
- package/dist/renderer.d.ts +0 -771
- package/dist/renderer.d.ts.map +0 -1
- package/dist/scene-utils/collect-subtree.d.ts +0 -11
- package/dist/scene-utils/collect-subtree.d.ts.map +0 -1
- package/dist/ssao-data.d.ts +0 -34
- package/dist/ssao-data.d.ts.map +0 -1
- package/dist/surface-format.d.ts +0 -10
- package/dist/surface-format.d.ts.map +0 -1
- package/dist/taa-history-store.d.ts +0 -88
- package/dist/taa-history-store.d.ts.map +0 -1
- package/dist/temporal-coverage.d.ts +0 -35
- package/dist/temporal-coverage.d.ts.map +0 -1
- package/dist/temporal-frame-transaction.d.ts +0 -92
- package/dist/temporal-frame-transaction.d.ts.map +0 -1
- package/dist/temporal-inspection.d.ts +0 -57
- package/dist/temporal-inspection.d.ts.map +0 -1
- package/dist/temporal-view.d.ts +0 -43
- package/dist/temporal-view.d.ts.map +0 -1
- package/dist/tilemap/resolve-tileset-runtime.d.ts +0 -23
- package/dist/tilemap/resolve-tileset-runtime.d.ts.map +0 -1
- package/dist/urp-pipeline.d.ts +0 -4
- package/dist/urp-pipeline.d.ts.map +0 -1
- package/src/__tests__/analytic-sky-contract.test.ts +0 -27
- package/src/__tests__/analytic-sky-falsify-carriers.mjs +0 -43
- package/src/__tests__/analytic-sky-falsify.test.ts +0 -94
- package/src/__tests__/assets-runtime-handoff.integration.test.ts +0 -36
- package/src/__tests__/backend-selection.integration.test.ts +0 -11
- package/src/__tests__/camera-temporal.test-d.ts +0 -8
- package/src/__tests__/camera-temporal.test.ts +0 -188
- package/src/__tests__/directional-shadow-probe-atlas-layout.unit.test.ts +0 -18
- package/src/__tests__/environment-inspection.test.ts +0 -45
- package/src/__tests__/fog-ai-user.fixture.ts +0 -350
- package/src/__tests__/fog-custom-render-feature.fixture.ts +0 -33
- package/src/__tests__/fog-custom-render-feature.integration.test.ts +0 -76
- package/src/__tests__/fog-inspection.integration.test.ts +0 -127
- package/src/__tests__/fog-owner-state.integration.test.ts +0 -112
- package/src/__tests__/fog-pipeline-topology.integration.test.ts +0 -93
- package/src/__tests__/fog-public-surface.integration.test.ts +0 -60
- package/src/__tests__/fog-ray-contract.integration.test.ts +0 -73
- package/src/__tests__/fog-source-absence.integration.test.ts +0 -51
- package/src/__tests__/fog-temporal.integration.test.ts +0 -115
- package/src/__tests__/frame-chain.unit.test.ts +0 -26
- package/src/__tests__/gpu-scene-field-type-owner.test-d.ts +0 -27
- package/src/__tests__/hdrp-pipeline.unit.test.ts +0 -100
- package/src/__tests__/ibl/ibl-fallback.unit.test.ts +0 -23
- package/src/__tests__/material-derived-error-stop-draw.integration.test.ts +0 -69
- package/src/__tests__/material-derived-payload.integration.test.ts +0 -164
- package/src/__tests__/materials.unit.test.ts +0 -25
- package/src/__tests__/param-schema-projection-census.unit.test.ts +0 -40
- package/src/__tests__/persistent-render-scene.unit.test.ts +0 -1311
- package/src/__tests__/pipeline-error-policy-owner.unit.test.ts +0 -167
- package/src/__tests__/pipeline-pass-trace.test.ts +0 -92
- package/src/__tests__/pipeline-stage-owner.test-d.ts +0 -13
- package/src/__tests__/plugin.test.ts +0 -25
- package/src/__tests__/prepared-graphics-backend-matrix.unit.test.ts +0 -129
- package/src/__tests__/prepared-graphics-resolver-recording.unit.test.ts +0 -180
- package/src/__tests__/public-pipeline-id.test-d.ts +0 -6
- package/src/__tests__/render-dispatch-membership.unit.test.ts +0 -117
- package/src/__tests__/render-feature-construction.unit.test.ts +0 -124
- package/src/__tests__/render-feature-error-code-owner.test-d.ts +0 -27
- package/src/__tests__/render-feature-gpu-buffer-usage-owner.test-d.ts +0 -46
- package/src/__tests__/render-feature-graph.integration.test.ts +0 -205
- package/src/__tests__/render-feature-graphics-staging.unit.test.ts +0 -200
- package/src/__tests__/render-feature-order.unit.test.ts +0 -66
- package/src/__tests__/render-feature-prepared-graphics-recording.unit.test.ts +0 -107
- package/src/__tests__/render-feature-staging.unit.test.ts +0 -94
- package/src/__tests__/renderer-render-scene-public.test-d.ts +0 -27
- package/src/__tests__/scene-temporal-coverage.unit.test.ts +0 -259
- package/src/__tests__/sun-snapshot-consumers.test.ts +0 -35
- package/src/__tests__/surface-backend-kind-owner.test-d.ts +0 -42
- package/src/__tests__/taa-history-store.unit.test.ts +0 -196
- package/src/__tests__/temporal-frame-transaction.integration.test.ts +0 -537
- package/src/__tests__/temporal-inspection.unit.test.ts +0 -138
- package/src/assets/__tests__/asset-decoders.unit.test.ts +0 -92
- package/src/assets/__tests__/mipmap-generator.unit.test.ts +0 -52
- package/src/assets/__tests__/render-asset-port.unit.test.ts +0 -54
- package/src/assets/__tests__/resolve-render-asset.unit.test.ts +0 -47
- package/src/components/__tests__/atmosphere-red.test.ts +0 -51
- package/src/components/__tests__/atmosphere.test.ts +0 -79
- package/src/components/__tests__/fog.test-d.ts +0 -49
- package/src/components/__tests__/fog.test.ts +0 -60
- package/src/components/atmosphere.ts +0 -64
- package/src/deferred-lighting.ts +0 -92
- package/src/dynamic-texture-store.ts +0 -111
- package/src/environment/README.md +0 -76
- package/src/environment/__tests__/failure-injection.test.ts +0 -50
- package/src/environment/__tests__/generation-red.test.ts +0 -64
- package/src/environment/__tests__/generation.test.ts +0 -37
- package/src/environment/__tests__/graph-transaction.test.ts +0 -85
- package/src/environment/__tests__/inspection-red.test.ts +0 -53
- package/src/environment/__tests__/lifecycle-evidence.test.ts +0 -40
- package/src/environment/__tests__/pipeline-topology.test.ts +0 -33
- package/src/environment/__tests__/readiness.test.ts +0 -42
- package/src/environment/__tests__/recovery.test.ts +0 -62
- package/src/environment/__tests__/resize-dispose.test.ts +0 -30
- package/src/environment/__tests__/signature-red.test.ts +0 -45
- package/src/environment/__tests__/signature.test.ts +0 -60
- package/src/environment/descriptors.ts +0 -7
- package/src/environment/extracted-environment.ts +0 -239
- package/src/environment/generation.ts +0 -158
- package/src/environment/gpu-bundle.ts +0 -144
- package/src/environment/graph.ts +0 -588
- package/src/environment/inspection.ts +0 -107
- package/src/environment/lifecycle.ts +0 -124
- package/src/environment/readiness.ts +0 -76
- package/src/environment/signature.ts +0 -185
- package/src/extract/__tests__/directional-csm-domain.unit.test.ts +0 -391
- package/src/extract/__tests__/environment-source.test.ts +0 -105
- package/src/extract/__tests__/schema-readers.unit.test.ts +0 -16
- package/src/extract/directional-csm.ts +0 -959
- package/src/extract/index.ts +0 -10
- package/src/extract/material-interface.ts +0 -604
- package/src/extract/schema-readers.ts +0 -27
- package/src/features/graph-contribution.ts +0 -577
- package/src/features/index.ts +0 -100
- package/src/features/morph/index.ts +0 -24
- package/src/features/morph/morph-bounds.ts +0 -123
- package/src/features/scene-temporal.ts +0 -274
- package/src/features/taa-resolve.ts +0 -244
- package/src/frame-chain.ts +0 -21
- package/src/hdrp-cluster-membership.ts +0 -70
- package/src/ibl/cubemap-projection.ts +0 -60
- package/src/ibl/face-uniforms.ts +0 -150
- package/src/mesh-update-errors.ts +0 -113
- package/src/mipmap-generator.ts +0 -244
- package/src/param-schema-projection-census.ts +0 -73
- package/src/persistent-render-scene.ts +0 -1752
- package/src/pipeline/index.ts +0 -40
- package/src/pipeline-errors.ts +0 -172
- package/src/prepare/__tests__/schema-readers.unit.test.ts +0 -16
- package/src/prepare/index.ts +0 -8
- package/src/prepare/schema-readers.ts +0 -20
- package/src/record/__tests__/environment-record.test.ts +0 -35
- package/src/record/__tests__/frame-targets.unit.test.ts +0 -54
- package/src/record/__tests__/membership-timing.unit.test.ts +0 -524
- package/src/record/__tests__/render-submission.integration.test.ts +0 -76
- package/src/record/__tests__/render-submission.perf.test.ts +0 -141
- package/src/record/__tests__/shadow-submit-mode.unit.test.ts +0 -88
- package/src/record/__tests__/view-ubo-layout.unit.test.ts +0 -101
- package/src/record/frame-observation.ts +0 -122
- package/src/record/index.ts +0 -15
- package/src/record/main-pass-skin.ts +0 -51
- package/src/record/main-pass-sprite.ts +0 -166
- package/src/record/material-payload.ts +0 -292
- package/src/record/material-slot-plan.ts +0 -68
- package/src/record/membership-timing.ts +0 -1012
- package/src/record/shadow-caster-uniform.ts +0 -37
- package/src/record/shadow-submit-mode.ts +0 -277
- package/src/render-dispatch-membership.ts +0 -155
- package/src/render-pipeline-context.ts +0 -332
- package/src/render-pipeline-target.ts +0 -96
- package/src/render-scene-projection.ts +0 -1738
- package/src/render-system-fold.ts +0 -531
- package/src/renderer/asset-service.ts +0 -32
- package/src/renderer/backend-selection.ts +0 -121
- package/src/renderer/environment-classify.ts +0 -30
- package/src/renderer/environment-error.ts +0 -19
- package/src/renderer/material/pipeline-projection.ts +0 -140
- package/src/renderer.ts +0 -940
- package/src/scene-utils/collect-subtree.ts +0 -40
- package/src/ssao-data.ts +0 -106
- package/src/surface-format.ts +0 -37
- package/src/taa-history-store.ts +0 -429
- package/src/temporal-coverage.ts +0 -106
- package/src/temporal-frame-transaction.ts +0 -301
- package/src/temporal-inspection.ts +0 -194
- package/src/temporal-view.ts +0 -174
- package/src/tilemap/resolve-tileset-runtime.ts +0 -72
package/src/features/host.ts
CHANGED
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
import type { EntityHandle } from '@forgeax/engine-ecs';
|
|
2
|
-
import type { RhiCaps } from '@forgeax/engine-rhi';
|
|
3
|
-
import {
|
|
4
|
-
err,
|
|
5
|
-
type MaterialAsset,
|
|
6
|
-
type MaterialError,
|
|
7
|
-
ok,
|
|
8
|
-
type Result,
|
|
9
|
-
} from '@forgeax/engine-types';
|
|
2
|
+
import type { RhiCaps, TextureFormat } from '@forgeax/engine-rhi';
|
|
3
|
+
import { err, ok, type Result } from '@forgeax/engine-types';
|
|
10
4
|
import {
|
|
11
5
|
type RenderError,
|
|
12
6
|
RenderFeatureCapabilityMissingError,
|
|
@@ -14,25 +8,35 @@ import {
|
|
|
14
8
|
RenderFeatureRegistrationConflictError,
|
|
15
9
|
RenderFeatureStageFailedError,
|
|
16
10
|
} from '../errors/render';
|
|
11
|
+
import type { PostProcessShaderEntry } from '../fullscreen-post-process-pass';
|
|
17
12
|
import type {
|
|
18
13
|
PreparedGraphicsReference,
|
|
19
14
|
PreparedGraphicsResolvedSnapshot,
|
|
20
15
|
PreparedGraphicsResolver,
|
|
21
16
|
PreparedGraphicsResourceLease,
|
|
22
17
|
} from '../prepare/prepared-graphics-resolver';
|
|
18
|
+
import {
|
|
19
|
+
freezeRenderFeaturePlan,
|
|
20
|
+
type RenderFeatureLogicalTarget,
|
|
21
|
+
type RenderFeaturePassDeclaration,
|
|
22
|
+
type RenderFeaturePlan,
|
|
23
|
+
type RenderFeaturePlannedFrame,
|
|
24
|
+
type RenderFeatureResourceDeclaration,
|
|
25
|
+
renderFeaturePlanSignature,
|
|
26
|
+
} from './plan';
|
|
23
27
|
import type {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
RenderFeatureGpuBindingsRef,
|
|
29
|
+
RenderFeatureGpuBufferRef,
|
|
30
|
+
RenderFeatureGpuComputePassDescriptor,
|
|
31
|
+
RenderFeatureGpuPrepareSession,
|
|
32
|
+
RenderFeatureGpuProgramRef,
|
|
33
|
+
RenderFeatureGpuWorkOwner,
|
|
34
|
+
} from './prepared-gpu-work';
|
|
31
35
|
import {
|
|
32
|
-
|
|
33
|
-
type RenderFeatureGraphicsContributionStaging,
|
|
36
|
+
type RenderFeatureGraphicsPassDescriptor,
|
|
34
37
|
type RenderFeatureGraphicsPrepare,
|
|
35
|
-
type
|
|
38
|
+
type RenderFeaturePreparedGraphicsState,
|
|
39
|
+
type RenderFeaturePreparedRef,
|
|
36
40
|
validateRenderFeatureGraphicsPass,
|
|
37
41
|
} from './prepared-graphics';
|
|
38
42
|
import {
|
|
@@ -48,18 +52,46 @@ import type {
|
|
|
48
52
|
RenderFeatureErrorDescriptor,
|
|
49
53
|
RenderFeatureExtractContext,
|
|
50
54
|
RenderFeatureHiddenEntityReport,
|
|
51
|
-
RenderFeaturePrepareContext,
|
|
52
55
|
RenderFeatureRecoverInput,
|
|
53
|
-
RenderFeatureResourceHandle,
|
|
54
56
|
RenderFeatureStatus,
|
|
55
57
|
RenderFeatureTargetHandle,
|
|
56
58
|
RenderFeatureWorldVisibilitySnapshot,
|
|
57
59
|
} from './types';
|
|
58
60
|
|
|
61
|
+
const planExecutionProjections = new WeakMap<
|
|
62
|
+
RenderFeaturePlannedFrame,
|
|
63
|
+
RenderFeaturePlanExecution
|
|
64
|
+
>();
|
|
65
|
+
|
|
66
|
+
export interface RenderFeaturePlanExecutionPass {
|
|
67
|
+
readonly featureIdentity: string;
|
|
68
|
+
readonly order: number;
|
|
69
|
+
readonly name: string;
|
|
70
|
+
readonly graphics?: RenderFeatureGraphicsPassDescriptor;
|
|
71
|
+
readonly graphicsState?: RenderFeaturePreparedGraphicsState;
|
|
72
|
+
readonly gpuCompute?: RenderFeatureGpuComputePassDescriptor;
|
|
73
|
+
readonly resolvedGraphics?: PreparedGraphicsResolvedSnapshot;
|
|
74
|
+
readonly resolvedGpuCompute?: import('./prepared-gpu-work').RenderFeatureResolvedGpuComputePass;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Host-owned device projection of one frozen plan; graph access is derived later. */
|
|
78
|
+
export interface RenderFeaturePlanExecution {
|
|
79
|
+
readonly featureIdentity: string;
|
|
80
|
+
readonly order: number;
|
|
81
|
+
readonly passes: readonly RenderFeaturePlanExecutionPass[];
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** @internal Typed-graph adapter for the host-owned projection of a validated plan. */
|
|
85
|
+
export function getRenderFeaturePlanExecutionProjection(
|
|
86
|
+
planned: RenderFeaturePlannedFrame,
|
|
87
|
+
): RenderFeaturePlanExecution | undefined {
|
|
88
|
+
return planExecutionProjections.get(planned);
|
|
89
|
+
}
|
|
90
|
+
|
|
59
91
|
export interface RenderFeatureStageEvent {
|
|
60
92
|
readonly featureIdentity: string;
|
|
61
93
|
readonly order: number;
|
|
62
|
-
readonly stage: 'extract' | '
|
|
94
|
+
readonly stage: 'extract' | 'plan';
|
|
63
95
|
}
|
|
64
96
|
|
|
65
97
|
export interface RenderFeatureFrameInput {
|
|
@@ -72,22 +104,11 @@ export interface RenderFeatureFrameInput {
|
|
|
72
104
|
readonly targets?: readonly RenderFeatureTargetHandle[];
|
|
73
105
|
readonly generation?: number;
|
|
74
106
|
readonly caps: Readonly<RhiCaps>;
|
|
75
|
-
readonly createContributionStaging?: (
|
|
76
|
-
featureIdentity: string,
|
|
77
|
-
order: number,
|
|
78
|
-
validateGraphics?: RenderFeatureGraphicsValidator,
|
|
79
|
-
resolveGraphics?: import('./graph-contribution').RenderFeatureGraphicsResolver,
|
|
80
|
-
resolveGpuCompute?: RenderFeatureGpuComputeResolver,
|
|
81
|
-
) => RenderFeatureContributionStaging & RenderFeatureGraphicsContributionStaging;
|
|
82
107
|
readonly createPreparedGraphicsResolver?: (
|
|
83
108
|
input: RenderFeaturePreparedGraphicsResolverInput,
|
|
84
109
|
) => PreparedGraphicsResolver;
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
) => RenderFeatureMaterialShaderBindingContract;
|
|
88
|
-
/** Render-owned cooked material projection used by prepared graphics. */
|
|
89
|
-
readonly resolveMaterialAsset?: (material: MaterialAsset) => Result<MaterialAsset, MaterialError>;
|
|
90
|
-
readonly getGpuWorkResolver?: (featureIdentity: string) => RenderFeatureGpuWorkResolver;
|
|
110
|
+
/** Single renderer-owned GPU preparation owner for all feature sessions. */
|
|
111
|
+
readonly gpuWork?: RenderFeatureGpuWorkOwner;
|
|
91
112
|
}
|
|
92
113
|
|
|
93
114
|
export interface RenderFeaturePreparedGraphicsResolverInput {
|
|
@@ -95,25 +116,21 @@ export interface RenderFeaturePreparedGraphicsResolverInput {
|
|
|
95
116
|
readonly order: number;
|
|
96
117
|
readonly generation: number;
|
|
97
118
|
readonly transaction: PreparedGraphicsTransaction;
|
|
119
|
+
readonly fullscreenEffects: ReadonlyMap<string, PostProcessShaderEntry>;
|
|
98
120
|
readonly lookup: (
|
|
99
121
|
reference: import('./prepared-graphics').RenderFeaturePreparedRef,
|
|
100
122
|
) => import('./prepared-graphics-store').PreparedGraphicsItem | undefined;
|
|
101
123
|
}
|
|
102
124
|
|
|
103
125
|
export interface RenderFeatureFrameResult {
|
|
104
|
-
readonly events: readonly string[];
|
|
105
126
|
readonly stageEvents: readonly RenderFeatureStageEvent[];
|
|
106
127
|
readonly errors: readonly RenderError[];
|
|
107
|
-
readonly
|
|
128
|
+
readonly plans: readonly RenderFeaturePlannedFrame[];
|
|
129
|
+
readonly fullscreenEffects: ReadonlyMap<string, PostProcessShaderEntry>;
|
|
108
130
|
readonly preparedResourceBatches: readonly RenderFeaturePreparedResourceBatch[];
|
|
109
131
|
readonly hiddenEntityReports: readonly RenderFeatureHiddenEntityReport[];
|
|
110
132
|
}
|
|
111
133
|
|
|
112
|
-
export interface RenderFeatureOwnedResource {
|
|
113
|
-
readonly handle: RenderFeatureResourceHandle;
|
|
114
|
-
readonly release: () => Result<void, RenderError>;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
134
|
export interface RenderFeatureHost {
|
|
118
135
|
readonly size: number;
|
|
119
136
|
readonly features: readonly RenderFeature<unknown>[];
|
|
@@ -123,10 +140,6 @@ export interface RenderFeatureHost {
|
|
|
123
140
|
/** Remove one installed producer and release every resource it owns. */
|
|
124
141
|
uninstall(feature: RenderFeature<unknown>): Result<void, RenderError>;
|
|
125
142
|
advancePreparedGeneration(): number;
|
|
126
|
-
registerResource(
|
|
127
|
-
identity: string,
|
|
128
|
-
resource: RenderFeatureOwnedResource,
|
|
129
|
-
): Result<void, RenderError>;
|
|
130
143
|
setStatus(
|
|
131
144
|
identity: string,
|
|
132
145
|
status: RenderFeatureStatus,
|
|
@@ -189,7 +202,6 @@ export function settlePreparedGraphicsCompletion(
|
|
|
189
202
|
interface FeatureSlot {
|
|
190
203
|
readonly feature: RenderFeature<unknown>;
|
|
191
204
|
order: number;
|
|
192
|
-
readonly resources: RenderFeatureOwnedResource[];
|
|
193
205
|
readonly preparedResourceBatches: Set<RenderFeaturePreparedResourceBatch>;
|
|
194
206
|
readonly preparedStore: PreparedGraphicsStore;
|
|
195
207
|
status: RenderFeatureStatus;
|
|
@@ -245,43 +257,10 @@ function missingCapability(
|
|
|
245
257
|
return feature.requiredCapabilities?.find((capability) => caps[capability] !== true);
|
|
246
258
|
}
|
|
247
259
|
|
|
248
|
-
function lifecycleContext(input: RenderFeatureRecoverInput): RenderFeaturePrepareContext {
|
|
249
|
-
return {
|
|
250
|
-
caps: input.caps,
|
|
251
|
-
frame: { frameNumber: input.frameNumber },
|
|
252
|
-
resources: [],
|
|
253
|
-
targets: [],
|
|
254
|
-
reportError: { report: () => undefined },
|
|
255
|
-
graphics: createRenderFeatureGraphicsPrepare('renderer.lifecycle', -1),
|
|
256
|
-
};
|
|
257
|
-
}
|
|
258
|
-
|
|
259
260
|
function createPreparedGraphicsPrepare(
|
|
260
261
|
transaction: PreparedGraphicsTransaction,
|
|
261
|
-
getMaterialShaderBindingContract?: (
|
|
262
|
-
materialShaderId: string,
|
|
263
|
-
) => RenderFeatureMaterialShaderBindingContract,
|
|
264
|
-
resolveMaterialAsset?: (material: MaterialAsset) => Result<MaterialAsset, MaterialError>,
|
|
265
|
-
featureIdentity = 'renderer.lifecycle',
|
|
266
|
-
order = -1,
|
|
267
262
|
): RenderFeatureGraphicsPrepare {
|
|
268
263
|
return {
|
|
269
|
-
resolveMaterialAsset: (material) => {
|
|
270
|
-
const resolved = resolveMaterialAsset?.(material);
|
|
271
|
-
if (resolved === undefined || resolved.ok) return resolved ?? ok(material);
|
|
272
|
-
return err(
|
|
273
|
-
new RenderFeaturePreparationFailedError(
|
|
274
|
-
featureIdentity,
|
|
275
|
-
order,
|
|
276
|
-
'resolve-material-asset',
|
|
277
|
-
'pipeline',
|
|
278
|
-
'material-asset',
|
|
279
|
-
resolved.error.code,
|
|
280
|
-
'next-frame',
|
|
281
|
-
),
|
|
282
|
-
);
|
|
283
|
-
},
|
|
284
|
-
getMaterialShaderBindingContract: getMaterialShaderBindingContract ?? (() => 'render-material'),
|
|
285
264
|
preparePipeline: (name, descriptor) => transaction.prepare('pipeline', name, descriptor),
|
|
286
265
|
prepareBindings: (name, descriptor) => transaction.prepare('bindings', name, descriptor),
|
|
287
266
|
prepareVertexData: (name, descriptor) => transaction.prepare('vertex-data', name, descriptor),
|
|
@@ -329,7 +308,10 @@ function graphicsValidator(
|
|
|
329
308
|
identity: string,
|
|
330
309
|
transaction: PreparedGraphicsTransaction,
|
|
331
310
|
capabilityAvailable: boolean,
|
|
332
|
-
):
|
|
311
|
+
): (
|
|
312
|
+
descriptor: RenderFeatureGraphicsPassDescriptor,
|
|
313
|
+
resources: readonly { readonly name: string }[],
|
|
314
|
+
) => Result<RenderFeaturePreparedGraphicsState, RenderError> {
|
|
333
315
|
return (descriptor, resources) => {
|
|
334
316
|
const attachments = [
|
|
335
317
|
...descriptor.attachments.colors
|
|
@@ -360,74 +342,11 @@ function graphicsValidator(
|
|
|
360
342
|
};
|
|
361
343
|
}
|
|
362
344
|
|
|
363
|
-
function invokeLifecycle(
|
|
364
|
-
slot: FeatureSlot,
|
|
365
|
-
stage: 'recover' | 'dispose',
|
|
366
|
-
input: RenderFeatureRecoverInput,
|
|
367
|
-
): Result<void, RenderError> {
|
|
368
|
-
const callback = slot.feature[stage];
|
|
369
|
-
if (callback === undefined) return ok(undefined);
|
|
370
|
-
try {
|
|
371
|
-
const result = callback(lifecycleContext(input));
|
|
372
|
-
return result.ok ? result : err(result.error);
|
|
373
|
-
} catch (_failure) {
|
|
374
|
-
return err(
|
|
375
|
-
new RenderFeatureStageFailedError(
|
|
376
|
-
slot.feature.identity,
|
|
377
|
-
slot.order,
|
|
378
|
-
stage,
|
|
379
|
-
'renderer-recover',
|
|
380
|
-
),
|
|
381
|
-
);
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
function releaseResource(
|
|
386
|
-
slot: FeatureSlot,
|
|
387
|
-
resource: RenderFeatureOwnedResource,
|
|
388
|
-
): Result<void, RenderError> {
|
|
389
|
-
try {
|
|
390
|
-
return resource.release();
|
|
391
|
-
} catch {
|
|
392
|
-
return err(unknownFeatureError(slot.feature.identity, 'dispose'));
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
function cleanupErrorDescriptor(
|
|
397
|
-
error: RenderError,
|
|
398
|
-
slot: FeatureSlot,
|
|
399
|
-
): RenderFeatureCleanupFailure {
|
|
400
|
-
return {
|
|
401
|
-
featureIdentity: slot.feature.identity,
|
|
402
|
-
order: slot.order,
|
|
403
|
-
code: error.code,
|
|
404
|
-
};
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
function withCleanupFailures(
|
|
408
|
-
error: RenderError,
|
|
409
|
-
cleanupFailures: readonly RenderFeatureCleanupFailure[],
|
|
410
|
-
): RenderError {
|
|
411
|
-
if (cleanupFailures.length === 0 || error.code !== 'render-feature-stage-failed') return error;
|
|
412
|
-
const detail = {
|
|
413
|
-
...error.detail,
|
|
414
|
-
cleanupFailures: Object.freeze([...cleanupFailures]),
|
|
415
|
-
};
|
|
416
|
-
const wrapped = new RenderFeatureStageFailedError(
|
|
417
|
-
detail.featureIdentity,
|
|
418
|
-
detail.order,
|
|
419
|
-
detail.stage,
|
|
420
|
-
detail.recovery,
|
|
421
|
-
);
|
|
422
|
-
Object.defineProperty(wrapped, 'detail', { value: detail });
|
|
423
|
-
return wrapped;
|
|
424
|
-
}
|
|
425
|
-
|
|
426
345
|
function asFeatureError(
|
|
427
346
|
error: unknown,
|
|
428
347
|
identity: string,
|
|
429
348
|
order: number,
|
|
430
|
-
stage: 'extract' | '
|
|
349
|
+
stage: 'extract' | 'plan',
|
|
431
350
|
): RenderError {
|
|
432
351
|
if (error instanceof Error && typeof (error as Partial<RenderError>).code === 'string') {
|
|
433
352
|
return error as RenderError;
|
|
@@ -449,14 +368,14 @@ function featureErrorForSlot(slot: FeatureSlot, error: RenderError): RenderError
|
|
|
449
368
|
: new RenderFeatureStageFailedError(
|
|
450
369
|
slot.feature.identity,
|
|
451
370
|
slot.order,
|
|
452
|
-
'
|
|
371
|
+
'plan',
|
|
453
372
|
'next-frame',
|
|
454
373
|
);
|
|
455
374
|
default:
|
|
456
375
|
return new RenderFeatureStageFailedError(
|
|
457
376
|
slot.feature.identity,
|
|
458
377
|
slot.order,
|
|
459
|
-
'
|
|
378
|
+
'plan',
|
|
460
379
|
'next-frame',
|
|
461
380
|
);
|
|
462
381
|
}
|
|
@@ -485,7 +404,7 @@ function errorDescriptor(error: RenderError): RenderFeatureErrorDescriptor {
|
|
|
485
404
|
detail: {
|
|
486
405
|
featureIdentity: 'unknown',
|
|
487
406
|
order: -1,
|
|
488
|
-
stage: '
|
|
407
|
+
stage: 'plan',
|
|
489
408
|
recovery: 'next-frame',
|
|
490
409
|
},
|
|
491
410
|
};
|
|
@@ -494,7 +413,7 @@ function errorDescriptor(error: RenderError): RenderFeatureErrorDescriptor {
|
|
|
494
413
|
|
|
495
414
|
function recordFailure(
|
|
496
415
|
slot: FeatureSlot,
|
|
497
|
-
stage: 'extract' | '
|
|
416
|
+
stage: 'extract' | 'plan',
|
|
498
417
|
failure: unknown,
|
|
499
418
|
errors: RenderError[],
|
|
500
419
|
): void {
|
|
@@ -504,16 +423,447 @@ function recordFailure(
|
|
|
504
423
|
slot.latestError = errorDescriptor(error);
|
|
505
424
|
}
|
|
506
425
|
|
|
426
|
+
function logicalTargets(
|
|
427
|
+
targets: readonly RenderFeatureTargetHandle[],
|
|
428
|
+
): readonly RenderFeatureLogicalTarget[] {
|
|
429
|
+
return Object.freeze(
|
|
430
|
+
targets.map((target) => ({
|
|
431
|
+
name: target.kind === 'scene-color' ? 'color' : 'depth',
|
|
432
|
+
kind: target.kind === 'scene-color' ? ('color' as const) : ('depth' as const),
|
|
433
|
+
format: target.format,
|
|
434
|
+
sampleCount: target.sampleCount,
|
|
435
|
+
})),
|
|
436
|
+
);
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
interface PreparedPlanResources {
|
|
440
|
+
readonly computePrograms: ReadonlyMap<string, RenderFeatureGpuProgramRef>;
|
|
441
|
+
readonly graphicsPrograms: ReadonlyMap<string, RenderFeaturePreparedRef<'pipeline'>>;
|
|
442
|
+
readonly buffers: ReadonlyMap<string, RenderFeatureGpuBufferRef>;
|
|
443
|
+
readonly computeBindings: ReadonlyMap<string, RenderFeatureGpuBindingsRef>;
|
|
444
|
+
readonly graphicsBindings: ReadonlyMap<string, RenderFeaturePreparedRef<'bindings'>>;
|
|
445
|
+
readonly vertexData: ReadonlyMap<string, RenderFeaturePreparedRef<'vertex-data'>>;
|
|
446
|
+
readonly indexData: ReadonlyMap<string, RenderFeaturePreparedRef<'index-data'>>;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
function planFailure(slot: FeatureSlot): RenderFeatureStageFailedError {
|
|
450
|
+
return new RenderFeatureStageFailedError(slot.feature.identity, slot.order, 'plan', 'next-frame');
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
function targetHandle(
|
|
454
|
+
name: string,
|
|
455
|
+
targets: readonly RenderFeatureTargetHandle[],
|
|
456
|
+
): string | RenderFeatureTargetHandle | undefined {
|
|
457
|
+
if (name === 'swapchain') return 'swapchain';
|
|
458
|
+
return targets.find(
|
|
459
|
+
(target) =>
|
|
460
|
+
(name === 'color' && target.kind === 'scene-color') ||
|
|
461
|
+
(name === 'depth' && target.kind === 'scene-depth'),
|
|
462
|
+
);
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
function targetFormat(
|
|
466
|
+
name: string,
|
|
467
|
+
targets: readonly RenderFeatureLogicalTarget[],
|
|
468
|
+
fallback: string | undefined,
|
|
469
|
+
): TextureFormat | undefined {
|
|
470
|
+
const target = targets.find((candidate) => candidate.name === name);
|
|
471
|
+
return (target?.format ?? fallback) as TextureFormat | undefined;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
function preparePlanResources(
|
|
475
|
+
slot: FeatureSlot,
|
|
476
|
+
plan: RenderFeaturePlan,
|
|
477
|
+
graphics: RenderFeatureGraphicsPrepare,
|
|
478
|
+
gpu: RenderFeatureGpuPrepareSession | undefined,
|
|
479
|
+
targets: readonly RenderFeatureTargetHandle[],
|
|
480
|
+
): Result<PreparedPlanResources, RenderError> {
|
|
481
|
+
const computePrograms = new Map<string, RenderFeatureGpuProgramRef>();
|
|
482
|
+
const graphicsPrograms = new Map<string, RenderFeaturePreparedRef<'pipeline'>>();
|
|
483
|
+
const buffers = new Map<string, RenderFeatureGpuBufferRef>();
|
|
484
|
+
const computeBindings = new Map<string, RenderFeatureGpuBindingsRef>();
|
|
485
|
+
const graphicsBindings = new Map<string, RenderFeaturePreparedRef<'bindings'>>();
|
|
486
|
+
const vertexData = new Map<string, RenderFeaturePreparedRef<'vertex-data'>>();
|
|
487
|
+
const indexData = new Map<string, RenderFeaturePreparedRef<'index-data'>>();
|
|
488
|
+
const byKind = <Kind extends RenderFeatureResourceDeclaration['kind']>(kind: Kind) =>
|
|
489
|
+
plan.resources.filter(
|
|
490
|
+
(resource): resource is Extract<RenderFeatureResourceDeclaration, { readonly kind: Kind }> =>
|
|
491
|
+
resource.kind === kind,
|
|
492
|
+
);
|
|
493
|
+
|
|
494
|
+
if (
|
|
495
|
+
gpu === undefined &&
|
|
496
|
+
plan.resources.some((resource) =>
|
|
497
|
+
['compute-program', 'buffer', 'compute-bindings'].includes(resource.kind),
|
|
498
|
+
)
|
|
499
|
+
) {
|
|
500
|
+
return err(planFailure(slot));
|
|
501
|
+
}
|
|
502
|
+
for (const resource of byKind('compute-program')) {
|
|
503
|
+
const prepared = gpu?.prepareProgram(resource.name, resource.program);
|
|
504
|
+
if (prepared === undefined) return err(planFailure(slot));
|
|
505
|
+
if (!prepared.ok) return prepared;
|
|
506
|
+
computePrograms.set(resource.name, prepared.value);
|
|
507
|
+
}
|
|
508
|
+
for (const resource of byKind('graphics-program')) {
|
|
509
|
+
const prepared = graphics.preparePipeline(resource.name, resource.program);
|
|
510
|
+
if (!prepared.ok) return prepared;
|
|
511
|
+
graphicsPrograms.set(resource.name, prepared.value);
|
|
512
|
+
}
|
|
513
|
+
for (const resource of byKind('buffer')) {
|
|
514
|
+
const prepared = gpu?.prepareBuffer(resource.name, {
|
|
515
|
+
size: resource.size,
|
|
516
|
+
usage: resource.usage,
|
|
517
|
+
...(resource.data === undefined ? {} : { data: resource.data }),
|
|
518
|
+
});
|
|
519
|
+
if (prepared === undefined) return err(planFailure(slot));
|
|
520
|
+
if (!prepared.ok) return prepared;
|
|
521
|
+
buffers.set(resource.name, prepared.value);
|
|
522
|
+
}
|
|
523
|
+
for (const resource of byKind('compute-bindings')) {
|
|
524
|
+
const program = computePrograms.get(resource.program);
|
|
525
|
+
const entries = resource.entries.map((entry) => ({
|
|
526
|
+
binding: entry.binding,
|
|
527
|
+
buffer: buffers.get(entry.resource),
|
|
528
|
+
}));
|
|
529
|
+
if (program === undefined || entries.some((entry) => entry.buffer === undefined)) {
|
|
530
|
+
return err(planFailure(slot));
|
|
531
|
+
}
|
|
532
|
+
const prepared = gpu?.prepareBindings(resource.name, {
|
|
533
|
+
program,
|
|
534
|
+
entries: entries.map((entry) => ({
|
|
535
|
+
binding: entry.binding,
|
|
536
|
+
buffer: entry.buffer as RenderFeatureGpuBufferRef,
|
|
537
|
+
})),
|
|
538
|
+
});
|
|
539
|
+
if (prepared === undefined) return err(planFailure(slot));
|
|
540
|
+
if (!prepared.ok) return prepared;
|
|
541
|
+
computeBindings.set(resource.name, prepared.value);
|
|
542
|
+
}
|
|
543
|
+
for (const resource of byKind('graphics-bindings')) {
|
|
544
|
+
const program = graphicsPrograms.get(resource.program);
|
|
545
|
+
if (program === undefined) return err(planFailure(slot));
|
|
546
|
+
const values: Record<string, unknown> = { ...resource.values };
|
|
547
|
+
for (const [key, targetName] of Object.entries(resource.logicalTargets ?? {})) {
|
|
548
|
+
const target = targetHandle(targetName, targets);
|
|
549
|
+
if (target === undefined || typeof target === 'string') return err(planFailure(slot));
|
|
550
|
+
values[key] = target;
|
|
551
|
+
}
|
|
552
|
+
const prepared = graphics.prepareBindings(resource.name, { pipeline: program, values });
|
|
553
|
+
if (!prepared.ok) return prepared;
|
|
554
|
+
graphicsBindings.set(resource.name, prepared.value);
|
|
555
|
+
}
|
|
556
|
+
for (const resource of byKind('vertex-data')) {
|
|
557
|
+
const descriptor =
|
|
558
|
+
resource.buffer === undefined
|
|
559
|
+
? { layout: resource.layout, data: resource.data }
|
|
560
|
+
: { layout: resource.layout, buffer: buffers.get(resource.buffer) };
|
|
561
|
+
if ('buffer' in descriptor && descriptor.buffer === undefined) return err(planFailure(slot));
|
|
562
|
+
const prepared = graphics.prepareVertexData(
|
|
563
|
+
resource.name,
|
|
564
|
+
descriptor as import('./prepared-graphics').RenderFeatureVertexDataDescriptor,
|
|
565
|
+
);
|
|
566
|
+
if (!prepared.ok) return prepared;
|
|
567
|
+
vertexData.set(resource.name, prepared.value);
|
|
568
|
+
}
|
|
569
|
+
for (const resource of byKind('index-data')) {
|
|
570
|
+
const descriptor =
|
|
571
|
+
resource.buffer === undefined
|
|
572
|
+
? { format: resource.format, data: resource.data }
|
|
573
|
+
: { format: resource.format, buffer: buffers.get(resource.buffer) };
|
|
574
|
+
if ('buffer' in descriptor && descriptor.buffer === undefined) return err(planFailure(slot));
|
|
575
|
+
const prepared = graphics.prepareIndexData(
|
|
576
|
+
resource.name,
|
|
577
|
+
descriptor as import('./prepared-graphics').RenderFeatureIndexDataDescriptor,
|
|
578
|
+
);
|
|
579
|
+
if (!prepared.ok) return prepared;
|
|
580
|
+
indexData.set(resource.name, prepared.value);
|
|
581
|
+
}
|
|
582
|
+
return ok({
|
|
583
|
+
computePrograms,
|
|
584
|
+
graphicsPrograms,
|
|
585
|
+
buffers,
|
|
586
|
+
computeBindings,
|
|
587
|
+
graphicsBindings,
|
|
588
|
+
vertexData,
|
|
589
|
+
indexData,
|
|
590
|
+
});
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
function projectDraw(
|
|
594
|
+
slot: FeatureSlot,
|
|
595
|
+
draw: Extract<RenderFeaturePassDeclaration, { readonly kind: 'raster' }>['draws'][number],
|
|
596
|
+
prepared: PreparedPlanResources,
|
|
597
|
+
): Result<import('./prepared-graphics').RenderFeatureDrawRecord, RenderError> {
|
|
598
|
+
const pipeline = prepared.graphicsPrograms.get(draw.program);
|
|
599
|
+
const bindings = draw.bindings.map((name) => prepared.graphicsBindings.get(name));
|
|
600
|
+
const vertexData = draw.vertexData.map((entry) => ({
|
|
601
|
+
slot: entry.slot,
|
|
602
|
+
resource: prepared.vertexData.get(entry.resource),
|
|
603
|
+
}));
|
|
604
|
+
const indexData =
|
|
605
|
+
draw.indexData === undefined
|
|
606
|
+
? undefined
|
|
607
|
+
: {
|
|
608
|
+
resource: prepared.indexData.get(draw.indexData.resource),
|
|
609
|
+
format: draw.indexData.format,
|
|
610
|
+
};
|
|
611
|
+
if (
|
|
612
|
+
pipeline === undefined ||
|
|
613
|
+
bindings.some((binding) => binding === undefined) ||
|
|
614
|
+
vertexData.some((vertex) => vertex.resource === undefined) ||
|
|
615
|
+
(indexData !== undefined && indexData.resource === undefined)
|
|
616
|
+
) {
|
|
617
|
+
return err(planFailure(slot));
|
|
618
|
+
}
|
|
619
|
+
const common = {
|
|
620
|
+
pipeline,
|
|
621
|
+
bindings: bindings as readonly RenderFeaturePreparedRef<'bindings'>[],
|
|
622
|
+
vertexData: vertexData as readonly {
|
|
623
|
+
readonly slot: number;
|
|
624
|
+
readonly resource: RenderFeaturePreparedRef<'vertex-data'>;
|
|
625
|
+
}[],
|
|
626
|
+
...(draw.vertexLayout === undefined ? {} : { vertexLayout: draw.vertexLayout }),
|
|
627
|
+
};
|
|
628
|
+
switch (draw.draw.kind) {
|
|
629
|
+
case 'draw':
|
|
630
|
+
return ok({
|
|
631
|
+
kind: 'draw',
|
|
632
|
+
...common,
|
|
633
|
+
...(indexData === undefined
|
|
634
|
+
? {}
|
|
635
|
+
: {
|
|
636
|
+
indexData: {
|
|
637
|
+
resource: indexData.resource as RenderFeaturePreparedRef<'index-data'>,
|
|
638
|
+
format: indexData.format,
|
|
639
|
+
},
|
|
640
|
+
}),
|
|
641
|
+
command: {
|
|
642
|
+
vertexCount: draw.draw.vertexCount,
|
|
643
|
+
instanceCount: draw.draw.instanceCount,
|
|
644
|
+
...(draw.draw.firstVertex === undefined ? {} : { firstVertex: draw.draw.firstVertex }),
|
|
645
|
+
...(draw.draw.firstInstance === undefined
|
|
646
|
+
? {}
|
|
647
|
+
: { firstInstance: draw.draw.firstInstance }),
|
|
648
|
+
},
|
|
649
|
+
});
|
|
650
|
+
case 'draw-indexed':
|
|
651
|
+
return ok({
|
|
652
|
+
kind: 'draw-indexed',
|
|
653
|
+
...common,
|
|
654
|
+
indexData:
|
|
655
|
+
indexData === undefined
|
|
656
|
+
? undefined
|
|
657
|
+
: {
|
|
658
|
+
resource: indexData.resource as RenderFeaturePreparedRef<'index-data'>,
|
|
659
|
+
format: indexData.format,
|
|
660
|
+
},
|
|
661
|
+
command: {
|
|
662
|
+
indexCount: draw.draw.indexCount,
|
|
663
|
+
instanceCount: draw.draw.instanceCount,
|
|
664
|
+
...(draw.draw.firstIndex === undefined ? {} : { firstIndex: draw.draw.firstIndex }),
|
|
665
|
+
...(draw.draw.baseVertex === undefined ? {} : { baseVertex: draw.draw.baseVertex }),
|
|
666
|
+
...(draw.draw.firstInstance === undefined
|
|
667
|
+
? {}
|
|
668
|
+
: { firstInstance: draw.draw.firstInstance }),
|
|
669
|
+
},
|
|
670
|
+
});
|
|
671
|
+
case 'draw-indirect':
|
|
672
|
+
case 'draw-indexed-indirect': {
|
|
673
|
+
const buffer = prepared.buffers.get(draw.draw.resource);
|
|
674
|
+
if (buffer === undefined) return err(planFailure(slot));
|
|
675
|
+
const command = {
|
|
676
|
+
buffer,
|
|
677
|
+
...(draw.draw.offset === undefined ? {} : { offset: draw.draw.offset }),
|
|
678
|
+
};
|
|
679
|
+
if (draw.draw.kind === 'draw-indexed-indirect') {
|
|
680
|
+
return ok({
|
|
681
|
+
kind: 'draw-indexed-indirect',
|
|
682
|
+
...common,
|
|
683
|
+
indexData:
|
|
684
|
+
indexData === undefined
|
|
685
|
+
? undefined
|
|
686
|
+
: {
|
|
687
|
+
resource: indexData.resource as RenderFeaturePreparedRef<'index-data'>,
|
|
688
|
+
format: indexData.format,
|
|
689
|
+
},
|
|
690
|
+
command,
|
|
691
|
+
});
|
|
692
|
+
}
|
|
693
|
+
return ok({
|
|
694
|
+
kind: 'draw-indirect',
|
|
695
|
+
...common,
|
|
696
|
+
...(indexData === undefined
|
|
697
|
+
? {}
|
|
698
|
+
: {
|
|
699
|
+
indexData: {
|
|
700
|
+
resource: indexData.resource as RenderFeaturePreparedRef<'index-data'>,
|
|
701
|
+
format: indexData.format,
|
|
702
|
+
},
|
|
703
|
+
}),
|
|
704
|
+
command,
|
|
705
|
+
});
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
function projectPlanPasses(
|
|
711
|
+
slot: FeatureSlot,
|
|
712
|
+
plan: RenderFeaturePlan,
|
|
713
|
+
prepared: PreparedPlanResources,
|
|
714
|
+
gpu: RenderFeatureGpuPrepareSession | undefined,
|
|
715
|
+
targets: readonly RenderFeatureTargetHandle[],
|
|
716
|
+
validateGraphics: (
|
|
717
|
+
descriptor: RenderFeatureGraphicsPassDescriptor,
|
|
718
|
+
resources: readonly { readonly name: string }[],
|
|
719
|
+
) => Result<RenderFeaturePreparedGraphicsState, RenderError>,
|
|
720
|
+
resolveGraphics?: (
|
|
721
|
+
descriptor: RenderFeatureGraphicsPassDescriptor,
|
|
722
|
+
) => Result<PreparedGraphicsResolvedSnapshot, RenderError> | undefined,
|
|
723
|
+
): Result<RenderFeaturePlanExecution, RenderError> {
|
|
724
|
+
const logical = logicalTargets(targets);
|
|
725
|
+
const projected: RenderFeaturePlanExecutionPass[] = [];
|
|
726
|
+
for (const pass of plan.passes) {
|
|
727
|
+
if (pass.kind === 'compute') {
|
|
728
|
+
const program = prepared.computePrograms.get(pass.program);
|
|
729
|
+
const bindings = prepared.computeBindings.get(pass.bindings);
|
|
730
|
+
if (program === undefined || bindings === undefined) return err(planFailure(slot));
|
|
731
|
+
const descriptor: RenderFeatureGpuComputePassDescriptor = {
|
|
732
|
+
program,
|
|
733
|
+
bindings,
|
|
734
|
+
dispatches: pass.dispatches.map((dispatch) =>
|
|
735
|
+
dispatch.kind === 'direct'
|
|
736
|
+
? {
|
|
737
|
+
entryPoint: dispatch.entryPoint,
|
|
738
|
+
bindings,
|
|
739
|
+
workgroups: dispatch.workgroups,
|
|
740
|
+
}
|
|
741
|
+
: {
|
|
742
|
+
entryPoint: dispatch.entryPoint,
|
|
743
|
+
bindings,
|
|
744
|
+
indirect: {
|
|
745
|
+
buffer: prepared.buffers.get(dispatch.resource) as RenderFeatureGpuBufferRef,
|
|
746
|
+
offset: dispatch.offset,
|
|
747
|
+
},
|
|
748
|
+
},
|
|
749
|
+
),
|
|
750
|
+
};
|
|
751
|
+
if (
|
|
752
|
+
descriptor.dispatches.some(
|
|
753
|
+
(dispatch) => dispatch.indirect !== undefined && dispatch.indirect.buffer === undefined,
|
|
754
|
+
)
|
|
755
|
+
) {
|
|
756
|
+
return err(planFailure(slot));
|
|
757
|
+
}
|
|
758
|
+
const resolved = gpu?.resolveComputePass(slot.feature.identity, descriptor);
|
|
759
|
+
if (resolved === undefined) return err(planFailure(slot));
|
|
760
|
+
if (!resolved.ok) return resolved;
|
|
761
|
+
projected.push({
|
|
762
|
+
featureIdentity: slot.feature.identity,
|
|
763
|
+
order: slot.order,
|
|
764
|
+
name: pass.name,
|
|
765
|
+
gpuCompute: descriptor,
|
|
766
|
+
resolvedGpuCompute: resolved.value,
|
|
767
|
+
});
|
|
768
|
+
continue;
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
const draws: import('./prepared-graphics').RenderFeatureDrawRecord[] = [];
|
|
772
|
+
for (const draw of pass.draws) {
|
|
773
|
+
const projected = projectDraw(slot, draw, prepared);
|
|
774
|
+
if (!projected.ok) return projected;
|
|
775
|
+
draws.push(projected.value);
|
|
776
|
+
}
|
|
777
|
+
const fallbackFormat = (() => {
|
|
778
|
+
const firstProgram = prepared.graphicsPrograms.get(pass.draws[0]?.program ?? '');
|
|
779
|
+
const declaration = plan.resources.find(
|
|
780
|
+
(resource) =>
|
|
781
|
+
resource.kind === 'graphics-program' &&
|
|
782
|
+
prepared.graphicsPrograms.get(resource.name) === firstProgram,
|
|
783
|
+
);
|
|
784
|
+
return declaration?.kind === 'graphics-program'
|
|
785
|
+
? declaration.program.colorFormats[0]
|
|
786
|
+
: undefined;
|
|
787
|
+
})();
|
|
788
|
+
const colors = pass.colorAttachments.map((attachment) => ({
|
|
789
|
+
resource: targetHandle(attachment.target, targets),
|
|
790
|
+
format: targetFormat(attachment.target, logical, fallbackFormat),
|
|
791
|
+
loadOp: attachment.loadOp,
|
|
792
|
+
storeOp: attachment.storeOp,
|
|
793
|
+
}));
|
|
794
|
+
const depth =
|
|
795
|
+
pass.depthStencilAttachment === undefined
|
|
796
|
+
? undefined
|
|
797
|
+
: {
|
|
798
|
+
resource: targetHandle(pass.depthStencilAttachment.target, targets),
|
|
799
|
+
format: targetFormat(pass.depthStencilAttachment.target, logical, undefined),
|
|
800
|
+
depthLoadOp: pass.depthStencilAttachment.depthLoadOp,
|
|
801
|
+
depthStoreOp: pass.depthStencilAttachment.depthStoreOp,
|
|
802
|
+
};
|
|
803
|
+
const sampledTargets = (pass.sampledTargets ?? []).map((name) => targetHandle(name, targets));
|
|
804
|
+
if (
|
|
805
|
+
colors.some(
|
|
806
|
+
(attachment) => attachment.resource === undefined || attachment.format === undefined,
|
|
807
|
+
) ||
|
|
808
|
+
(depth !== undefined && (depth.resource === undefined || depth.format === undefined)) ||
|
|
809
|
+
sampledTargets.some((target) => target === undefined || typeof target === 'string')
|
|
810
|
+
) {
|
|
811
|
+
return err(planFailure(slot));
|
|
812
|
+
}
|
|
813
|
+
const attachments: RenderFeatureGraphicsPassDescriptor['attachments'] =
|
|
814
|
+
depth === undefined
|
|
815
|
+
? { colors: colors as RenderFeatureGraphicsPassDescriptor['attachments']['colors'] }
|
|
816
|
+
: {
|
|
817
|
+
colors: colors as RenderFeatureGraphicsPassDescriptor['attachments']['colors'],
|
|
818
|
+
depthStencil: depth as NonNullable<
|
|
819
|
+
RenderFeatureGraphicsPassDescriptor['attachments']['depthStencil']
|
|
820
|
+
>,
|
|
821
|
+
};
|
|
822
|
+
const descriptor: RenderFeatureGraphicsPassDescriptor = {
|
|
823
|
+
attachments,
|
|
824
|
+
...(sampledTargets.length === 0
|
|
825
|
+
? {}
|
|
826
|
+
: {
|
|
827
|
+
sampledTargets: sampledTargets as readonly RenderFeatureTargetHandle[],
|
|
828
|
+
}),
|
|
829
|
+
draws,
|
|
830
|
+
};
|
|
831
|
+
const graphicsState = validateGraphics(descriptor, []);
|
|
832
|
+
if (!graphicsState.ok) return graphicsState;
|
|
833
|
+
const resolved = resolveGraphics?.(descriptor);
|
|
834
|
+
if (
|
|
835
|
+
resolved !== undefined &&
|
|
836
|
+
!resolved.ok &&
|
|
837
|
+
resolved.error instanceof RenderFeaturePreparationFailedError &&
|
|
838
|
+
resolved.error.detail.reason === 'pipeline-pending'
|
|
839
|
+
) {
|
|
840
|
+
continue;
|
|
841
|
+
}
|
|
842
|
+
if (resolved !== undefined && !resolved.ok) return resolved;
|
|
843
|
+
projected.push({
|
|
844
|
+
featureIdentity: slot.feature.identity,
|
|
845
|
+
order: slot.order,
|
|
846
|
+
name: pass.name,
|
|
847
|
+
graphics: descriptor,
|
|
848
|
+
graphicsState: graphicsState.value,
|
|
849
|
+
...(resolved?.ok === true ? { resolvedGraphics: resolved.value } : {}),
|
|
850
|
+
});
|
|
851
|
+
}
|
|
852
|
+
return ok({
|
|
853
|
+
featureIdentity: slot.feature.identity,
|
|
854
|
+
order: slot.order,
|
|
855
|
+
passes: Object.freeze(projected),
|
|
856
|
+
});
|
|
857
|
+
}
|
|
858
|
+
|
|
507
859
|
function invokeStage<T>(
|
|
508
860
|
slot: FeatureSlot,
|
|
509
861
|
stage: RenderFeatureStageEvent['stage'],
|
|
510
862
|
action: () => Result<T, RenderError>,
|
|
511
|
-
events: string[],
|
|
512
863
|
stageEvents: RenderFeatureStageEvent[],
|
|
513
864
|
errors: RenderError[],
|
|
514
865
|
): Result<T, RenderError> {
|
|
515
866
|
const identity = slot.feature.identity;
|
|
516
|
-
events.push(`${identity}:${stage}`);
|
|
517
867
|
stageEvents.push({ featureIdentity: identity, order: slot.order, stage });
|
|
518
868
|
try {
|
|
519
869
|
const result = action();
|
|
@@ -574,7 +924,6 @@ class FeatureHostImpl implements RenderFeatureHost {
|
|
|
574
924
|
this.slots.push({
|
|
575
925
|
feature,
|
|
576
926
|
order: this.slots.length,
|
|
577
|
-
resources: [],
|
|
578
927
|
preparedResourceBatches: new Set(),
|
|
579
928
|
preparedStore: createPreparedGraphicsStore(),
|
|
580
929
|
status: 'active',
|
|
@@ -596,17 +945,6 @@ class FeatureHostImpl implements RenderFeatureHost {
|
|
|
596
945
|
const result = batch.release();
|
|
597
946
|
if (!result.ok && firstError === undefined) firstError = result.error;
|
|
598
947
|
}
|
|
599
|
-
for (const resource of slot.resources) {
|
|
600
|
-
const result = releaseResource(slot, resource);
|
|
601
|
-
if (!result.ok && firstError === undefined) firstError = result.error;
|
|
602
|
-
}
|
|
603
|
-
const disposed = invokeLifecycle(slot, 'dispose', {
|
|
604
|
-
frameNumber: -1,
|
|
605
|
-
caps: {} as never,
|
|
606
|
-
});
|
|
607
|
-
if (!disposed.ok && firstError === undefined) firstError = disposed.error;
|
|
608
|
-
|
|
609
|
-
slot.resources.length = 0;
|
|
610
948
|
slot.status = 'disposed';
|
|
611
949
|
this.slots.splice(index, 1);
|
|
612
950
|
for (const [order, remaining] of this.slots.entries()) remaining.order = order;
|
|
@@ -624,18 +962,6 @@ class FeatureHostImpl implements RenderFeatureHost {
|
|
|
624
962
|
return this.generation;
|
|
625
963
|
}
|
|
626
964
|
|
|
627
|
-
registerResource(
|
|
628
|
-
identity: string,
|
|
629
|
-
resource: RenderFeatureOwnedResource,
|
|
630
|
-
): Result<void, RenderError> {
|
|
631
|
-
const slot = findSlot(this.slots, identity);
|
|
632
|
-
if (slot === undefined || this.disposed || slot.status === 'disposed') {
|
|
633
|
-
return err(unknownFeatureError(identity, 'dispose'));
|
|
634
|
-
}
|
|
635
|
-
slot.resources.push(resource);
|
|
636
|
-
return ok(undefined);
|
|
637
|
-
}
|
|
638
|
-
|
|
639
965
|
setStatus(
|
|
640
966
|
identity: string,
|
|
641
967
|
status: RenderFeatureStatus,
|
|
@@ -764,14 +1090,6 @@ class FeatureHostImpl implements RenderFeatureHost {
|
|
|
764
1090
|
if (firstError === undefined) firstError = error;
|
|
765
1091
|
continue;
|
|
766
1092
|
}
|
|
767
|
-
const recovered = invokeLifecycle(slot, 'recover', input);
|
|
768
|
-
if (!recovered.ok) {
|
|
769
|
-
slot.status = 'failed';
|
|
770
|
-
slot.latestError = errorDescriptor(recovered.error);
|
|
771
|
-
diagnosticsChanged = true;
|
|
772
|
-
if (firstError === undefined) firstError = recovered.error;
|
|
773
|
-
continue;
|
|
774
|
-
}
|
|
775
1093
|
if (slot.status !== 'active' || slot.latestError !== undefined) {
|
|
776
1094
|
slot.status = 'active';
|
|
777
1095
|
slot.latestError = undefined;
|
|
@@ -796,51 +1114,26 @@ class FeatureHostImpl implements RenderFeatureHost {
|
|
|
796
1114
|
this.disposed = true;
|
|
797
1115
|
|
|
798
1116
|
const retired = this.retirePreparedGraphics();
|
|
799
|
-
|
|
800
|
-
const cleanupFailures: RenderFeatureCleanupFailure[] = [];
|
|
1117
|
+
const firstError: RenderError | undefined = retired.ok ? undefined : retired.error;
|
|
801
1118
|
for (const slot of this.slots) {
|
|
802
|
-
for (const resource of slot.resources) {
|
|
803
|
-
const result = releaseResource(slot, resource);
|
|
804
|
-
if (!result.ok) {
|
|
805
|
-
cleanupFailures.push(cleanupErrorDescriptor(result.error, slot));
|
|
806
|
-
if (firstError === undefined) firstError = result.error;
|
|
807
|
-
}
|
|
808
|
-
}
|
|
809
|
-
const disposed = invokeLifecycle(slot, 'dispose', {
|
|
810
|
-
frameNumber: -1,
|
|
811
|
-
caps: {} as never,
|
|
812
|
-
});
|
|
813
|
-
if (!disposed.ok) {
|
|
814
|
-
cleanupFailures.push(cleanupErrorDescriptor(disposed.error, slot));
|
|
815
|
-
if (firstError === undefined) firstError = disposed.error;
|
|
816
|
-
}
|
|
817
|
-
slot.resources.length = 0;
|
|
818
1119
|
slot.status = 'disposed';
|
|
819
1120
|
}
|
|
820
1121
|
this.publishDiagnosticsChanged();
|
|
821
1122
|
this.diagnosticsListeners.clear();
|
|
822
1123
|
|
|
823
|
-
return firstError === undefined
|
|
824
|
-
? ok(undefined)
|
|
825
|
-
: err(withCleanupFailures(firstError, cleanupFailures));
|
|
1124
|
+
return firstError === undefined ? ok(undefined) : err(firstError);
|
|
826
1125
|
}
|
|
827
1126
|
}
|
|
828
1127
|
|
|
829
|
-
/**
|
|
830
|
-
* Run the three typed stages once for every active feature.
|
|
831
|
-
*
|
|
832
|
-
* The feature value is kept in the slot closure: no heterogeneous FrameData
|
|
833
|
-
* ledger or assertion is needed between callbacks. A failure ends only the
|
|
834
|
-
* current slot and is retained in the host diagnostics projection.
|
|
835
|
-
*/
|
|
1128
|
+
/** Build and project the mandatory plan once for every active feature. */
|
|
836
1129
|
export function runRenderFeatureFrame(
|
|
837
1130
|
host: RenderFeatureHost,
|
|
838
1131
|
input: RenderFeatureFrameInput,
|
|
839
1132
|
): RenderFeatureFrameResult {
|
|
840
|
-
const events: string[] = [];
|
|
841
1133
|
const stageEvents: RenderFeatureStageEvent[] = [];
|
|
842
1134
|
const errors: RenderError[] = [];
|
|
843
|
-
const
|
|
1135
|
+
const plans: RenderFeaturePlannedFrame[] = [];
|
|
1136
|
+
const fullscreenEffects = new Map<string, PostProcessShaderEntry>();
|
|
844
1137
|
const preparedResourceBatches: RenderFeaturePreparedResourceBatch[] = [];
|
|
845
1138
|
const hiddenEntityReports: RenderFeatureHiddenEntityReport[] = [
|
|
846
1139
|
...(input.hiddenEntityReports ?? []),
|
|
@@ -864,7 +1157,6 @@ export function runRenderFeatureFrame(
|
|
|
864
1157
|
const slot: FeatureSlot = {
|
|
865
1158
|
feature,
|
|
866
1159
|
order,
|
|
867
|
-
resources: [],
|
|
868
1160
|
preparedResourceBatches: new Set(),
|
|
869
1161
|
preparedStore: createPreparedGraphicsStore(),
|
|
870
1162
|
status: 'active',
|
|
@@ -873,21 +1165,11 @@ export function runRenderFeatureFrame(
|
|
|
873
1165
|
const identity = slot.feature.identity;
|
|
874
1166
|
const transaction = host.beginPreparedFrame(identity, input.generation ?? 0);
|
|
875
1167
|
if (transaction === undefined) continue;
|
|
876
|
-
const graphics = createPreparedGraphicsPrepare(
|
|
877
|
-
|
|
878
|
-
input.getMaterialShaderBindingContract,
|
|
879
|
-
input.resolveMaterialAsset,
|
|
1168
|
+
const graphics = createPreparedGraphicsPrepare(transaction);
|
|
1169
|
+
const gpu: RenderFeatureGpuPrepareSession | undefined = input.gpuWork?.beginFeature(
|
|
880
1170
|
identity,
|
|
881
|
-
|
|
1171
|
+
input.generation ?? 0,
|
|
882
1172
|
);
|
|
883
|
-
const gpu = input.getGpuWorkResolver?.(identity);
|
|
884
|
-
gpu?.beginFrame();
|
|
885
|
-
const validateGraphics = graphicsValidator(
|
|
886
|
-
identity,
|
|
887
|
-
transaction,
|
|
888
|
-
missingCapability(feature, input.caps) === undefined,
|
|
889
|
-
);
|
|
890
|
-
let staging!: RenderFeatureContributionStaging & RenderFeatureGraphicsContributionStaging;
|
|
891
1173
|
const featureHiddenEntityReports: RenderFeatureHiddenEntityReport[] = [];
|
|
892
1174
|
const extractContext = {
|
|
893
1175
|
worlds: input.worlds,
|
|
@@ -902,7 +1184,6 @@ export function runRenderFeatureFrame(
|
|
|
902
1184
|
slot,
|
|
903
1185
|
'extract',
|
|
904
1186
|
() => slot.feature.extract(extractContext),
|
|
905
|
-
events,
|
|
906
1187
|
stageEvents,
|
|
907
1188
|
errors,
|
|
908
1189
|
);
|
|
@@ -912,34 +1193,61 @@ export function runRenderFeatureFrame(
|
|
|
912
1193
|
continue;
|
|
913
1194
|
}
|
|
914
1195
|
|
|
915
|
-
const
|
|
1196
|
+
const targets = logicalTargets(input.targets ?? []);
|
|
1197
|
+
const declared = invokeStage(
|
|
916
1198
|
slot,
|
|
917
|
-
'
|
|
1199
|
+
'plan',
|
|
918
1200
|
() =>
|
|
919
|
-
|
|
1201
|
+
feature.plan(extracted.value, {
|
|
920
1202
|
caps: input.caps,
|
|
921
1203
|
frame: { frameNumber: input.frameNumber },
|
|
922
|
-
|
|
923
|
-
targets
|
|
924
|
-
reportError: { report: (error) => errors.push(error) },
|
|
925
|
-
graphics,
|
|
926
|
-
...(gpu === undefined ? {} : { gpu }),
|
|
1204
|
+
generation: transaction.generation,
|
|
1205
|
+
targets,
|
|
927
1206
|
}),
|
|
928
|
-
events,
|
|
929
1207
|
stageEvents,
|
|
930
1208
|
errors,
|
|
931
1209
|
);
|
|
1210
|
+
if (!declared.ok) {
|
|
1211
|
+
transaction.abort();
|
|
1212
|
+
host.setStatus(identity, 'failed', slot.latestError);
|
|
1213
|
+
continue;
|
|
1214
|
+
}
|
|
1215
|
+
const frozen = freezeRenderFeaturePlan(identity, declared.value, targets);
|
|
1216
|
+
if (!frozen.ok) {
|
|
1217
|
+
recordFailure(slot, 'plan', frozen.error, errors);
|
|
1218
|
+
transaction.abort();
|
|
1219
|
+
host.setStatus(identity, 'failed', slot.latestError);
|
|
1220
|
+
continue;
|
|
1221
|
+
}
|
|
1222
|
+
const plannedFrame: RenderFeaturePlannedFrame = Object.freeze({
|
|
1223
|
+
featureIdentity: identity,
|
|
1224
|
+
generation: transaction.generation,
|
|
1225
|
+
signature: renderFeaturePlanSignature(frozen.value),
|
|
1226
|
+
plan: frozen.value,
|
|
1227
|
+
});
|
|
1228
|
+
for (const resource of frozen.value.resources) {
|
|
1229
|
+
if (resource.kind !== 'fullscreen-program') continue;
|
|
1230
|
+
fullscreenEffects.set(identity, {
|
|
1231
|
+
source: resource.source,
|
|
1232
|
+
...(resource.reads === undefined ? {} : { reads: resource.reads }),
|
|
1233
|
+
...(resource.params === undefined ? {} : { params: resource.params }),
|
|
1234
|
+
});
|
|
1235
|
+
}
|
|
1236
|
+
const prepared = preparePlanResources(slot, frozen.value, graphics, gpu, input.targets ?? []);
|
|
932
1237
|
if (!prepared.ok) {
|
|
1238
|
+
recordFailure(slot, 'plan', prepared.error, errors);
|
|
933
1239
|
transaction.abort();
|
|
934
1240
|
host.setStatus(identity, 'failed', slot.latestError);
|
|
935
1241
|
continue;
|
|
936
1242
|
}
|
|
1243
|
+
const validateGraphics = graphicsValidator(identity, transaction, true);
|
|
937
1244
|
|
|
938
1245
|
const resolverInput: RenderFeaturePreparedGraphicsResolverInput = {
|
|
939
1246
|
featureIdentity: identity,
|
|
940
1247
|
order,
|
|
941
1248
|
generation: transaction.generation,
|
|
942
1249
|
transaction,
|
|
1250
|
+
fullscreenEffects,
|
|
943
1251
|
lookup: (reference) =>
|
|
944
1252
|
[...transaction.overlayItems(), ...transaction.committedItems()].find(
|
|
945
1253
|
(item) => item.reference === reference,
|
|
@@ -957,93 +1265,52 @@ export function runRenderFeatureFrame(
|
|
|
957
1265
|
const releaseResolver = (): void => {
|
|
958
1266
|
if (resolver !== undefined) resolver.release();
|
|
959
1267
|
};
|
|
960
|
-
const
|
|
961
|
-
gpu === undefined
|
|
962
|
-
? undefined
|
|
963
|
-
: (descriptor: import('./prepared-gpu-work').RenderFeatureGpuComputePassDescriptor) =>
|
|
964
|
-
gpu.resolveComputePass(identity, descriptor);
|
|
965
|
-
staging =
|
|
966
|
-
input.createContributionStaging?.(
|
|
967
|
-
identity,
|
|
968
|
-
order,
|
|
969
|
-
validateGraphics,
|
|
970
|
-
resolveGraphics,
|
|
971
|
-
resolveGpuCompute,
|
|
972
|
-
) ??
|
|
973
|
-
createRenderFeatureContributionStaging(
|
|
974
|
-
identity,
|
|
975
|
-
order,
|
|
976
|
-
validateGraphics,
|
|
977
|
-
resolveGraphics,
|
|
978
|
-
resolveGpuCompute,
|
|
979
|
-
);
|
|
980
|
-
|
|
981
|
-
const contributed = invokeStage(
|
|
1268
|
+
const projected = projectPlanPasses(
|
|
982
1269
|
slot,
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
targets: input.targets ?? [],
|
|
990
|
-
reportError: { report: (error) => errors.push(error) },
|
|
991
|
-
graphics,
|
|
992
|
-
...(gpu === undefined ? {} : { gpu }),
|
|
993
|
-
staging,
|
|
994
|
-
}),
|
|
995
|
-
events,
|
|
996
|
-
stageEvents,
|
|
997
|
-
errors,
|
|
1270
|
+
frozen.value,
|
|
1271
|
+
prepared.value,
|
|
1272
|
+
gpu,
|
|
1273
|
+
input.targets ?? [],
|
|
1274
|
+
validateGraphics,
|
|
1275
|
+
resolveGraphics,
|
|
998
1276
|
);
|
|
999
|
-
if (!
|
|
1000
|
-
|
|
1277
|
+
if (!projected.ok) {
|
|
1278
|
+
recordFailure(slot, 'plan', projected.error, errors);
|
|
1001
1279
|
transaction.abort();
|
|
1002
1280
|
releaseResolver();
|
|
1003
1281
|
host.setStatus(identity, 'failed', slot.latestError);
|
|
1004
1282
|
continue;
|
|
1005
1283
|
}
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
...new Set(committed.value.passes.flatMap((pass) => pass.resolvedGraphics?.leases ?? [])),
|
|
1024
|
-
...(gpu?.retireUntouched() ?? []),
|
|
1025
|
-
];
|
|
1026
|
-
const retained = host.retainPreparedGraphics(identity, leases);
|
|
1027
|
-
if (!retained.ok) {
|
|
1028
|
-
recordFailure(slot, 'contribute', retained.error, errors);
|
|
1029
|
-
releaseResolver();
|
|
1030
|
-
host.setStatus(identity, 'failed', slot.latestError);
|
|
1031
|
-
continue;
|
|
1032
|
-
}
|
|
1033
|
-
if (leases.length > 0) preparedResourceBatches.push(retained.value);
|
|
1034
|
-
if (committed.value.resources.length > 0 || committed.value.passes.length > 0) {
|
|
1035
|
-
contributions.push(committed.value);
|
|
1036
|
-
}
|
|
1284
|
+
const preparedCommit = transaction.commit();
|
|
1285
|
+
if (!preparedCommit.ok) {
|
|
1286
|
+
recordFailure(slot, 'plan', preparedCommit.error, errors);
|
|
1287
|
+
releaseResolver();
|
|
1288
|
+
host.setStatus(identity, 'failed', slot.latestError);
|
|
1289
|
+
continue;
|
|
1290
|
+
}
|
|
1291
|
+
const leases = [
|
|
1292
|
+
...new Set(projected.value.passes.flatMap((pass) => pass.resolvedGraphics?.leases ?? [])),
|
|
1293
|
+
...(gpu?.retireUntouched() ?? []),
|
|
1294
|
+
];
|
|
1295
|
+
const retained = host.retainPreparedGraphics(identity, leases);
|
|
1296
|
+
if (!retained.ok) {
|
|
1297
|
+
recordFailure(slot, 'plan', retained.error, errors);
|
|
1298
|
+
releaseResolver();
|
|
1299
|
+
host.setStatus(identity, 'failed', slot.latestError);
|
|
1300
|
+
continue;
|
|
1037
1301
|
}
|
|
1302
|
+
planExecutionProjections.set(plannedFrame, projected.value);
|
|
1303
|
+
plans.push(plannedFrame);
|
|
1304
|
+
if (leases.length > 0) preparedResourceBatches.push(retained.value);
|
|
1038
1305
|
hiddenEntityReports.push(...featureHiddenEntityReports);
|
|
1039
1306
|
host.setStatus(identity, 'active');
|
|
1040
1307
|
}
|
|
1041
1308
|
|
|
1042
1309
|
return {
|
|
1043
|
-
events,
|
|
1044
1310
|
stageEvents,
|
|
1045
1311
|
errors,
|
|
1046
|
-
|
|
1312
|
+
plans,
|
|
1313
|
+
fullscreenEffects,
|
|
1047
1314
|
preparedResourceBatches,
|
|
1048
1315
|
hiddenEntityReports: mergeHiddenEntityReports(hiddenEntityReports),
|
|
1049
1316
|
};
|
|
@@ -1087,7 +1354,6 @@ export function createRenderFeatureHost(
|
|
|
1087
1354
|
const slots: FeatureSlot[] = features.map((feature, order) => ({
|
|
1088
1355
|
feature,
|
|
1089
1356
|
order,
|
|
1090
|
-
resources: [],
|
|
1091
1357
|
preparedResourceBatches: new Set(),
|
|
1092
1358
|
preparedStore: createPreparedGraphicsStore(),
|
|
1093
1359
|
status: 'active',
|