@forgeax/engine-render 0.0.0-dev.8d955ade1c79
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/LICENSE +202 -0
- package/README.md +647 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/__tests__/authoring-path.unit.test.d.ts +2 -0
- package/dist/__tests__/authoring-path.unit.test.d.ts.map +1 -0
- package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts +2 -0
- package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts.map +1 -0
- package/dist/__tests__/callback-inference.test-d.d.ts +2 -0
- package/dist/__tests__/callback-inference.test-d.d.ts.map +1 -0
- package/dist/__tests__/cluster-binner.test.d.ts +2 -0
- package/dist/__tests__/cluster-binner.test.d.ts.map +1 -0
- package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts.map +1 -0
- package/dist/__tests__/construct-renderer-identity.unit.test.d.ts +2 -0
- package/dist/__tests__/construct-renderer-identity.unit.test.d.ts.map +1 -0
- 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__/direct-extract-consumer-contract.test-d.d.ts +2 -0
- package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts.map +1 -0
- package/dist/__tests__/direct-light-snapshot.unit.test.d.ts +2 -0
- package/dist/__tests__/direct-light-snapshot.unit.test.d.ts.map +1 -0
- package/dist/__tests__/factory-contract.integration.test.d.ts +2 -0
- package/dist/__tests__/factory-contract.integration.test.d.ts.map +1 -0
- package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts.map +1 -0
- package/dist/__tests__/frame-observation.contract.test.d.ts +2 -0
- package/dist/__tests__/frame-observation.contract.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__/glyph-text-layout-recovery.unit.test.d.ts +2 -0
- package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts +6 -0
- package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts +2 -0
- package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts +2 -0
- package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-production.integration.test.d.ts +2 -0
- package/dist/__tests__/gpu-driven-production.integration.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts +2 -0
- package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +18 -0
- package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts +2 -0
- package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-view-reference.d.ts +15 -0
- package/dist/__tests__/gpu-driven-view-reference.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-view.browser.test.d.ts +2 -0
- package/dist/__tests__/gpu-driven-view.browser.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-view.dawn.test.d.ts +2 -0
- package/dist/__tests__/gpu-driven-view.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-driven-view.unit.test.d.ts +2 -0
- package/dist/__tests__/gpu-driven-view.unit.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts +2 -0
- package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts +7 -0
- package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +1 -0
- package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts +2 -0
- package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts +2 -0
- package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-scene-schema.unit.test.d.ts +2 -0
- package/dist/__tests__/gpu-scene-schema.unit.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-scene.dawn.test.d.ts +2 -0
- package/dist/__tests__/gpu-scene.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/gpu-scene.unit.test.d.ts +2 -0
- package/dist/__tests__/gpu-scene.unit.test.d.ts.map +1 -0
- 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__/infinite-grid-no-vertex-probe.unit.test.d.ts +2 -0
- package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts.map +1 -0
- package/dist/__tests__/injection-kind-owner.test-d.d.ts +2 -0
- package/dist/__tests__/injection-kind-owner.test-d.d.ts.map +1 -0
- package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts +2 -0
- package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/light-buffer-layout.unit.test.d.ts +2 -0
- package/dist/__tests__/light-buffer-layout.unit.test.d.ts.map +1 -0
- package/dist/__tests__/material-contract-inventory.unit.test.d.ts +2 -0
- package/dist/__tests__/material-contract-inventory.unit.test.d.ts.map +1 -0
- package/dist/__tests__/material-cooked-projection.unit.test.d.ts +2 -0
- package/dist/__tests__/material-cooked-projection.unit.test.d.ts.map +1 -0
- package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts +2 -0
- package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts.map +1 -0
- package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts +2 -0
- package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts.map +1 -0
- package/dist/__tests__/material-stride-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/material-stride-surface.unit.test.d.ts.map +1 -0
- package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts.map +1 -0
- package/dist/__tests__/mesh-material-bindings.unit.test.d.ts +2 -0
- package/dist/__tests__/mesh-material-bindings.unit.test.d.ts.map +1 -0
- package/dist/__tests__/mesh-stride-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/mesh-stride-surface.unit.test.d.ts.map +1 -0
- package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts +2 -0
- package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts +2 -0
- package/dist/__tests__/morph-feature-gpu-work.integration.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__/morph-visual-evidence.integration.test.d.ts +2 -0
- package/dist/__tests__/morph-visual-evidence.integration.test.d.ts.map +1 -0
- package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts.map +1 -0
- package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts +2 -0
- package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts.map +1 -0
- package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts +2 -0
- package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts.map +1 -0
- package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts +2 -0
- package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts.map +1 -0
- package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts +2 -0
- package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts.map +1 -0
- package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts +2 -0
- package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts.map +1 -0
- package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts +2 -0
- package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts.map +1 -0
- package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts +2 -0
- package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts.map +1 -0
- package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts +2 -0
- package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts.map +1 -0
- package/dist/__tests__/prepared-graphics-store.unit.test.d.ts +2 -0
- package/dist/__tests__/prepared-graphics-store.unit.test.d.ts.map +1 -0
- package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts +2 -0
- package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts.map +1 -0
- package/dist/__tests__/profiler-default-off.test.d.ts +2 -0
- package/dist/__tests__/profiler-default-off.test.d.ts.map +1 -0
- package/dist/__tests__/profiler-phase-catalog.test.d.ts +2 -0
- package/dist/__tests__/profiler-phase-catalog.test.d.ts.map +1 -0
- package/dist/__tests__/profiler-phase-integration.test.d.ts +2 -0
- package/dist/__tests__/profiler-phase-integration.test.d.ts.map +1 -0
- package/dist/__tests__/profiler-phase-token.test.d.ts +2 -0
- package/dist/__tests__/profiler-phase-token.test.d.ts.map +1 -0
- package/dist/__tests__/public-surface.test-d.d.ts +2 -0
- package/dist/__tests__/public-surface.test-d.d.ts.map +1 -0
- package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts +2 -0
- package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-error-code-owner.test-d.d.ts +2 -0
- package/dist/__tests__/render-error-code-owner.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-error-detail-ssot.test-d.d.ts +2 -0
- package/dist/__tests__/render-error-detail-ssot.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-error-exhaustive.test-d.d.ts +2 -0
- package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-assembly.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-assembly.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-context.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-context.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-contract.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-contract.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-docs.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-docs.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-errors.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-errors.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts +2 -0
- package/dist/__tests__/render-feature-gpu-work.integration.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__/render-feature-prepared-diagnostics.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-public-surface.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-public-surface.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-retry.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-retry.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-scheduling.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-scheduling.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-visibility-context.test-d.d.ts +2 -0
- package/dist/__tests__/render-feature-visibility-context.test-d.d.ts.map +1 -0
- package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-feature-zero-work.unit.test.d.ts +2 -0
- package/dist/__tests__/render-feature-zero-work.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-graph-compute-raster-gpu.d.ts +7 -0
- package/dist/__tests__/render-graph-compute-raster-gpu.d.ts.map +1 -0
- package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts +2 -0
- package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts.map +1 -0
- package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts +2 -0
- package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/render-graph-hzb-gpu.d.ts +7 -0
- package/dist/__tests__/render-graph-hzb-gpu.d.ts.map +1 -0
- package/dist/__tests__/render-graph-hzb.browser.test.d.ts +2 -0
- package/dist/__tests__/render-graph-hzb.browser.test.d.ts.map +1 -0
- package/dist/__tests__/render-graph-hzb.dawn.test.d.ts +2 -0
- package/dist/__tests__/render-graph-hzb.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/render-graph-primitives.unit.test.d.ts +2 -0
- package/dist/__tests__/render-graph-primitives.unit.test.d.ts.map +1 -0
- package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts +12 -0
- package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts.map +1 -0
- package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts +2 -0
- package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts.map +1 -0
- package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts +2 -0
- package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/render-scene-projection.unit.test.d.ts +2 -0
- package/dist/__tests__/render-scene-projection.unit.test.d.ts.map +1 -0
- package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts +2 -0
- package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts.map +1 -0
- package/dist/__tests__/renderer-lifecycle.integration.test.d.ts +2 -0
- package/dist/__tests__/renderer-lifecycle.integration.test.d.ts.map +1 -0
- package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts +2 -0
- package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts.map +1 -0
- package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts +2 -0
- package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts.map +1 -0
- package/dist/__tests__/shader-stage-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/shader-stage-surface.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__/ssao-kernel-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/ssao-kernel-surface.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__/surface-configuration.unit.test.d.ts +2 -0
- package/dist/__tests__/surface-configuration.unit.test.d.ts.map +1 -0
- package/dist/__tests__/texture-usage-surface.unit.test.d.ts +2 -0
- package/dist/__tests__/texture-usage-surface.unit.test.d.ts.map +1 -0
- package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts +2 -0
- package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts.map +1 -0
- package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts +2 -0
- package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts.map +1 -0
- package/dist/__tests__/urp-pipeline.unit.test.d.ts +2 -0
- package/dist/__tests__/urp-pipeline.unit.test.d.ts.map +1 -0
- package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts +2 -0
- package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts.map +1 -0
- package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts +2 -0
- package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-diagnostics.integration.test.d.ts +2 -0
- package/dist/__tests__/visibility-diagnostics.integration.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-extract.integration.test.d.ts +2 -0
- package/dist/__tests__/visibility-extract.integration.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-extract.perf.test.d.ts +2 -0
- package/dist/__tests__/visibility-extract.perf.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts +2 -0
- package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-hidden-report.unit.test.d.ts +2 -0
- package/dist/__tests__/visibility-hidden-report.unit.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-instances.integration.test.d.ts +2 -0
- package/dist/__tests__/visibility-instances.integration.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-multi-world.integration.test.d.ts +2 -0
- package/dist/__tests__/visibility-multi-world.integration.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts +2 -0
- package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts +2 -0
- package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts.map +1 -0
- package/dist/__tests__/visibility-public-surface.test-d.d.ts +2 -0
- package/dist/__tests__/visibility-public-surface.test-d.d.ts.map +1 -0
- package/dist/__tests__/visibility-resolver.unit.test.d.ts +2 -0
- package/dist/__tests__/visibility-resolver.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/__tests__/visibility-snapshot-contract.unit.test.d.ts +2 -0
- package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts.map +1 -0
- package/dist/__tests__/vocabulary.unit.test.d.ts +2 -0
- package/dist/__tests__/vocabulary.unit.test.d.ts.map +1 -0
- package/dist/assembly/backend-contract.d.ts +37 -0
- 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/assembly/material/assembly.d.ts +21 -0
- package/dist/assembly/material/assembly.d.ts.map +1 -0
- package/dist/assembly/material/pipeline-projection.d.ts +30 -0
- package/dist/assembly/material/pipeline-projection.d.ts.map +1 -0
- package/dist/assets/asset-decoders.d.ts +5 -0
- package/dist/assets/asset-decoders.d.ts.map +1 -0
- package/dist/assets/render-asset-port.d.ts +17 -0
- package/dist/assets/render-asset-port.d.ts.map +1 -0
- package/dist/assets/resolve-render-asset.d.ts +6 -0
- package/dist/assets/resolve-render-asset.d.ts.map +1 -0
- package/dist/authoring.d.ts +12 -0
- package/dist/authoring.d.ts.map +1 -0
- package/dist/authoring.mjs +27 -0
- package/dist/authoring.mjs.map +1 -0
- package/dist/chunk-CQXZC5XI.mjs +182 -0
- package/dist/chunk-CQXZC5XI.mjs.map +1 -0
- package/dist/chunk-HCOGPHKS.mjs +93 -0
- package/dist/chunk-HCOGPHKS.mjs.map +1 -0
- package/dist/chunk-YEJIUW7D.mjs +1152 -0
- package/dist/chunk-YEJIUW7D.mjs.map +1 -0
- package/dist/cluster-binner.d.ts +152 -0
- package/dist/cluster-binner.d.ts.map +1 -0
- package/dist/components/__tests__/points-lines-admission.unit.test.d.ts +2 -0
- package/dist/components/__tests__/points-lines-admission.unit.test.d.ts.map +1 -0
- package/dist/components/__tests__/points-lines-schema.unit.test.d.ts +2 -0
- package/dist/components/__tests__/points-lines-schema.unit.test.d.ts.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/__tests__/schema-parity.unit.test.d.ts +2 -0
- package/dist/components/__tests__/schema-parity.unit.test.d.ts.map +1 -0
- package/dist/components/__tests__/visibility-schema.unit.test.d.ts +2 -0
- package/dist/components/__tests__/visibility-schema.unit.test.d.ts.map +1 -0
- package/dist/components/camera.d.ts +311 -0
- package/dist/components/camera.d.ts.map +1 -0
- package/dist/components/directional-light.d.ts +76 -0
- package/dist/components/directional-light.d.ts.map +1 -0
- package/dist/components/glyph-text.d.ts +26 -0
- package/dist/components/glyph-text.d.ts.map +1 -0
- package/dist/components/index.d.ts +24 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/instances.d.ts +41 -0
- package/dist/components/instances.d.ts.map +1 -0
- package/dist/components/layer.d.ts +34 -0
- package/dist/components/layer.d.ts.map +1 -0
- package/dist/components/light-helpers.d.ts +53 -0
- package/dist/components/light-helpers.d.ts.map +1 -0
- package/dist/components/lines.d.ts +5 -0
- package/dist/components/lines.d.ts.map +1 -0
- package/dist/components/mesh-filter.d.ts +24 -0
- package/dist/components/mesh-filter.d.ts.map +1 -0
- package/dist/components/mesh-renderer.d.ts +33 -0
- package/dist/components/mesh-renderer.d.ts.map +1 -0
- package/dist/components/point-light-shadow.d.ts +27 -0
- package/dist/components/point-light-shadow.d.ts.map +1 -0
- package/dist/components/point-light.d.ts +35 -0
- package/dist/components/point-light.d.ts.map +1 -0
- package/dist/components/points.d.ts +15 -0
- package/dist/components/points.d.ts.map +1 -0
- package/dist/components/post-process-params.d.ts +5 -0
- package/dist/components/post-process-params.d.ts.map +1 -0
- package/dist/components/scene-instance.d.ts +140 -0
- package/dist/components/scene-instance.d.ts.map +1 -0
- 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/sort-key.d.ts +44 -0
- package/dist/components/sort-key.d.ts.map +1 -0
- package/dist/components/spot-light.d.ts +81 -0
- package/dist/components/spot-light.d.ts.map +1 -0
- package/dist/components/sprite-animation.d.ts +74 -0
- package/dist/components/sprite-animation.d.ts.map +1 -0
- package/dist/components/sprite-instances.d.ts +51 -0
- package/dist/components/sprite-instances.d.ts.map +1 -0
- package/dist/components/sprite-playback-mode.d.ts +42 -0
- package/dist/components/sprite-playback-mode.d.ts.map +1 -0
- package/dist/components/sprite-region-override.d.ts +46 -0
- package/dist/components/sprite-region-override.d.ts.map +1 -0
- package/dist/components/tile-layer.d.ts +106 -0
- package/dist/components/tile-layer.d.ts.map +1 -0
- package/dist/components/tilemap.d.ts +25 -0
- package/dist/components/tilemap.d.ts.map +1 -0
- package/dist/components/visibility.d.ts +22 -0
- package/dist/components/visibility.d.ts.map +1 -0
- package/dist/construct-renderer.d.ts +19 -0
- package/dist/construct-renderer.d.ts.map +1 -0
- package/dist/construct-renderer.mjs +27462 -0
- package/dist/construct-renderer.mjs.map +1 -0
- package/dist/debug-draw-glue.d.ts +5 -0
- package/dist/debug-draw-glue.d.ts.map +1 -0
- package/dist/device/device-scope.d.ts +83 -0
- package/dist/device/device-scope.d.ts.map +1 -0
- package/dist/device/gpu-residency.d.ts +337 -0
- 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 +23 -0
- package/dist/engine-metrics.d.ts.map +1 -0
- package/dist/errors/ecs-validation.d.ts +3 -0
- package/dist/errors/ecs-validation.d.ts.map +1 -0
- package/dist/errors/index.d.ts +4 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/recover.d.ts +105 -0
- package/dist/errors/recover.d.ts.map +1 -0
- package/dist/errors/render.d.ts +705 -0
- package/dist/errors/render.d.ts.map +1 -0
- package/dist/extract/visibility.d.ts +26 -0
- package/dist/extract/visibility.d.ts.map +1 -0
- package/dist/features/fullscreen.d.ts +19 -0
- package/dist/features/fullscreen.d.ts.map +1 -0
- package/dist/features/host.d.ts +106 -0
- package/dist/features/host.d.ts.map +1 -0
- package/dist/features/morph/morph-feature.d.ts +79 -0
- package/dist/features/morph/morph-feature.d.ts.map +1 -0
- 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 +117 -0
- package/dist/features/prepared-gpu-work.d.ts.map +1 -0
- package/dist/features/prepared-graphics-store.d.ts +66 -0
- package/dist/features/prepared-graphics-store.d.ts.map +1 -0
- package/dist/features/prepared-graphics.d.ts +215 -0
- package/dist/features/prepared-graphics.d.ts.map +1 -0
- package/dist/features/render-graph-compute.d.ts +13 -0
- package/dist/features/render-graph-compute.d.ts.map +1 -0
- package/dist/features/render-graph-contribution.d.ts +12 -0
- package/dist/features/render-graph-contribution.d.ts.map +1 -0
- package/dist/features/render-graph-raster.d.ts +38 -0
- package/dist/features/render-graph-raster.d.ts.map +1 -0
- package/dist/features/render-graph-resources.d.ts +11 -0
- package/dist/features/render-graph-resources.d.ts.map +1 -0
- package/dist/features/targets.d.ts +32 -0
- package/dist/features/targets.d.ts.map +1 -0
- package/dist/features/types.d.ts +68 -0
- package/dist/features/types.d.ts.map +1 -0
- 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 +157 -0
- package/dist/fullscreen-post-process-pass.d.ts.map +1 -0
- package/dist/glyph-text-layout-system.d.ts +19 -0
- package/dist/glyph-text-layout-system.d.ts.map +1 -0
- package/dist/gpu-driven/batch-topology.d.ts +55 -0
- package/dist/gpu-driven/batch-topology.d.ts.map +1 -0
- package/dist/gpu-driven/production-raster.d.ts +51 -0
- package/dist/gpu-driven/production-raster.d.ts.map +1 -0
- package/dist/gpu-driven/view-gpu.d.ts +85 -0
- package/dist/gpu-driven/view-gpu.d.ts.map +1 -0
- package/dist/gpu-resource.d.ts +73 -0
- package/dist/gpu-resource.d.ts.map +1 -0
- package/dist/gpu-scene-schema.d.ts +78 -0
- package/dist/gpu-scene-schema.d.ts.map +1 -0
- package/dist/gpu-scene.d.ts +55 -0
- package/dist/gpu-scene.d.ts.map +1 -0
- package/dist/gpu-stage.d.ts +4 -0
- package/dist/gpu-stage.d.ts.map +1 -0
- package/dist/gpu-texture-usage.d.ts +6 -0
- package/dist/gpu-texture-usage.d.ts.map +1 -0
- package/dist/gpu-usage.d.ts +9 -0
- package/dist/gpu-usage.d.ts.map +1 -0
- package/dist/hdrp-buffers.d.ts +163 -0
- package/dist/hdrp-buffers.d.ts.map +1 -0
- package/dist/ibl/IblPipelineCache.d.ts +168 -0
- package/dist/ibl/IblPipelineCache.d.ts.map +1 -0
- package/dist/ibl/skylight-bind-group.d.ts +130 -0
- package/dist/ibl/skylight-bind-group.d.ts.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +169 -0
- package/dist/index.mjs.map +1 -0
- package/dist/inspection-types.d.ts +72 -0
- package/dist/inspection-types.d.ts.map +1 -0
- package/dist/instance-buffer-cache.d.ts +56 -0
- package/dist/instance-buffer-cache.d.ts.map +1 -0
- package/dist/internal.d.ts +2 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.mjs +3 -0
- package/dist/internal.mjs.map +1 -0
- package/dist/lifecycle.d.ts +62 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/light-buffer-layout.d.ts +164 -0
- package/dist/light-buffer-layout.d.ts.map +1 -0
- package/dist/materials.d.ts +47 -0
- package/dist/materials.d.ts.map +1 -0
- package/dist/mesh-material-bindings.d.ts +43 -0
- package/dist/mesh-material-bindings.d.ts.map +1 -0
- package/dist/pbr-pipeline.d.ts +301 -0
- package/dist/pbr-pipeline.d.ts.map +1 -0
- 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 +122 -0
- package/dist/pipeline-builder.d.ts.map +1 -0
- 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 +367 -0
- package/dist/pipeline-spec.d.ts.map +1 -0
- package/dist/plugin.d.ts +4 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/points-lines/__tests__/bounds.unit.test.d.ts +2 -0
- package/dist/points-lines/__tests__/bounds.unit.test.d.ts.map +1 -0
- package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts +2 -0
- package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts.map +1 -0
- package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts +2 -0
- package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts.map +1 -0
- package/dist/points-lines/__tests__/inspection.unit.test.d.ts +2 -0
- package/dist/points-lines/__tests__/inspection.unit.test.d.ts.map +1 -0
- package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts +2 -0
- package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts.map +1 -0
- package/dist/points-lines/__tests__/points-lines.bench.d.ts +2 -0
- package/dist/points-lines/__tests__/points-lines.bench.d.ts.map +1 -0
- package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts +2 -0
- package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts.map +1 -0
- package/dist/points-lines/__tests__/snapshot.unit.test.d.ts +2 -0
- package/dist/points-lines/__tests__/snapshot.unit.test.d.ts.map +1 -0
- package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts +2 -0
- package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts.map +1 -0
- package/dist/points-lines/admission.d.ts +36 -0
- package/dist/points-lines/admission.d.ts.map +1 -0
- package/dist/points-lines/bounds.d.ts +8 -0
- package/dist/points-lines/bounds.d.ts.map +1 -0
- package/dist/points-lines/expansion-cache.d.ts +28 -0
- package/dist/points-lines/expansion-cache.d.ts.map +1 -0
- package/dist/points-lines/inspection.d.ts +53 -0
- package/dist/points-lines/inspection.d.ts.map +1 -0
- package/dist/points-lines/prepare.d.ts +67 -0
- package/dist/points-lines/prepare.d.ts.map +1 -0
- package/dist/points-lines/record.d.ts +60 -0
- package/dist/points-lines/record.d.ts.map +1 -0
- package/dist/points-lines/snapshot.d.ts +49 -0
- package/dist/points-lines/snapshot.d.ts.map +1 -0
- package/dist/post-process-errors.d.ts +182 -0
- package/dist/post-process-errors.d.ts.map +1 -0
- package/dist/prepare/prepared-graphics-resolver.d.ts +59 -0
- package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -0
- package/dist/record/__tests__/material-bg-cache.unit.test.d.ts +2 -0
- package/dist/record/__tests__/material-bg-cache.unit.test.d.ts.map +1 -0
- package/dist/record/__tests__/material-slot-plan.unit.test.d.ts +2 -0
- package/dist/record/__tests__/material-slot-plan.unit.test.d.ts.map +1 -0
- 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/__tests__/video-texture-view.unit.test.d.ts +2 -0
- package/dist/record/__tests__/video-texture-view.unit.test.d.ts.map +1 -0
- package/dist/record/frame-lighting.d.ts +121 -0
- package/dist/record/frame-lighting.d.ts.map +1 -0
- package/dist/record/frame-snapshot.d.ts +429 -0
- package/dist/record/frame-snapshot.d.ts.map +1 -0
- package/dist/record/frame-targets.d.ts +20 -0
- package/dist/record/frame-targets.d.ts.map +1 -0
- package/dist/record/frame.d.ts +71 -0
- package/dist/record/frame.d.ts.map +1 -0
- package/dist/record/helpers.d.ts +102 -0
- package/dist/record/helpers.d.ts.map +1 -0
- package/dist/record/main-pass-geometry.d.ts +28 -0
- package/dist/record/main-pass-geometry.d.ts.map +1 -0
- package/dist/record/main-pass-material.d.ts +204 -0
- package/dist/record/main-pass-material.d.ts.map +1 -0
- package/dist/record/main-pass-sprite-draws.d.ts +43 -0
- package/dist/record/main-pass-sprite-draws.d.ts.map +1 -0
- package/dist/record/main-pass.d.ts +20 -0
- package/dist/record/main-pass.d.ts.map +1 -0
- package/dist/record/mesh-ssbo.d.ts +446 -0
- package/dist/record/mesh-ssbo.d.ts.map +1 -0
- package/dist/record/render-context.d.ts +252 -0
- package/dist/record/render-context.d.ts.map +1 -0
- package/dist/record/shadow-pass.d.ts +52 -0
- package/dist/record/shadow-pass.d.ts.map +1 -0
- package/dist/record/skybox-post-pass.d.ts +33 -0
- package/dist/record/skybox-post-pass.d.ts.map +1 -0
- package/dist/record/typed-frame-graph.d.ts +35 -0
- package/dist/record/typed-frame-graph.d.ts.map +1 -0
- package/dist/record/view-ubo.d.ts +45 -0
- package/dist/record/view-ubo.d.ts.map +1 -0
- package/dist/render-contract.d.ts +424 -0
- package/dist/render-contract.d.ts.map +1 -0
- package/dist/render-data.d.ts +143 -0
- package/dist/render-data.d.ts.map +1 -0
- package/dist/render-graph-primitives.d.ts +76 -0
- package/dist/render-graph-primitives.d.ts.map +1 -0
- package/dist/render-pipeline.d.ts +110 -0
- package/dist/render-pipeline.d.ts.map +1 -0
- package/dist/render-system-extract.d.ts +868 -0
- package/dist/render-system-extract.d.ts.map +1 -0
- package/dist/render-system.d.ts +125 -0
- package/dist/render-system.d.ts.map +1 -0
- package/dist/scene/render-scene-types.d.ts +61 -0
- package/dist/scene/render-scene-types.d.ts.map +1 -0
- package/dist/scene/render-scene.d.ts +112 -0
- package/dist/scene/render-scene.d.ts.map +1 -0
- package/dist/scene-instances/post-spawn-resolve-joints.d.ts +30 -0
- package/dist/scene-instances/post-spawn-resolve-joints.d.ts.map +1 -0
- package/dist/shadow-atlas.d.ts +117 -0
- package/dist/shadow-atlas.d.ts.map +1 -0
- package/dist/ssao-buffers.d.ts +50 -0
- package/dist/ssao-buffers.d.ts.map +1 -0
- package/dist/ssao-config.d.ts +28 -0
- package/dist/ssao-config.d.ts.map +1 -0
- package/dist/systems/active-camera.d.ts +53 -0
- package/dist/systems/active-camera.d.ts.map +1 -0
- package/dist/systems/pass-selector.d.ts +24 -0
- package/dist/systems/pass-selector.d.ts.map +1 -0
- package/dist/systems/skin-palette-allocator.d.ts +49 -0
- package/dist/systems/skin-palette-allocator.d.ts.map +1 -0
- 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 +112 -0
- package/dist/systems/transparent-sort-config.d.ts.map +1 -0
- package/dist/tilemap-chunk-extract-system.d.ts +143 -0
- package/dist/tilemap-chunk-extract-system.d.ts.map +1 -0
- package/dist/typed-render-graph-primitives.d.ts +57 -0
- package/dist/typed-render-graph-primitives.d.ts.map +1 -0
- package/dist/typed-shadow-passes.d.ts +11 -0
- package/dist/typed-shadow-passes.d.ts.map +1 -0
- package/package.json +94 -0
- package/src/__tests__/authoring-path.unit.test.ts +23 -0
- package/src/__tests__/backend-selection-rhi-capture.test-d.ts +21 -0
- package/src/__tests__/callback-inference.test-d.ts +8 -0
- package/src/__tests__/cluster-binner.test.ts +272 -0
- package/src/__tests__/cluster-grid-default-surface.unit.test.ts +20 -0
- package/src/__tests__/construct-renderer-identity.unit.test.ts +23 -0
- 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 +23 -0
- package/src/__tests__/direct-light-snapshot.unit.test.ts +61 -0
- package/src/__tests__/factory-contract.integration.test.ts +280 -0
- package/src/__tests__/fallback-row-stride-surface.unit.test.ts +15 -0
- package/src/__tests__/frame-observation.contract.test.ts +112 -0
- package/src/__tests__/fullscreen-feature-plan.unit.test.ts +32 -0
- package/src/__tests__/glyph-text-layout-recovery.unit.test.ts +167 -0
- package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +350 -0
- package/src/__tests__/gpu-driven-indirect-raster.browser.test.ts +12 -0
- package/src/__tests__/gpu-driven-indirect-raster.dawn.test.ts +16 -0
- package/src/__tests__/gpu-driven-production.integration.test.ts +436 -0
- package/src/__tests__/gpu-driven-scaling.unit.test.ts +87 -0
- package/src/__tests__/gpu-driven-view-gpu-evidence.ts +271 -0
- package/src/__tests__/gpu-driven-view-graph.integration.test.ts +290 -0
- package/src/__tests__/gpu-driven-view-reference.ts +111 -0
- package/src/__tests__/gpu-driven-view.browser.test.ts +30 -0
- package/src/__tests__/gpu-driven-view.dawn.test.ts +28 -0
- package/src/__tests__/gpu-driven-view.unit.test.ts +199 -0
- package/src/__tests__/gpu-resource-store-stride.unit.test.ts +59 -0
- package/src/__tests__/gpu-scene-render-graph-gpu.ts +308 -0
- package/src/__tests__/gpu-scene-render-graph.browser.test.ts +19 -0
- package/src/__tests__/gpu-scene-render-graph.dawn.test.ts +19 -0
- package/src/__tests__/gpu-scene-schema.unit.test.ts +16 -0
- package/src/__tests__/gpu-scene.dawn.test.ts +205 -0
- package/src/__tests__/gpu-scene.unit.test.ts +147 -0
- package/src/__tests__/ibl/face-uniforms.unit.test.ts +46 -0
- package/src/__tests__/infinite-grid-no-vertex-probe.unit.test.ts +92 -0
- package/src/__tests__/injection-kind-owner.test-d.ts +14 -0
- package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +728 -0
- package/src/__tests__/light-buffer-layout.unit.test.ts +40 -0
- package/src/__tests__/material-contract-inventory.unit.test.ts +24 -0
- package/src/__tests__/material-cooked-projection.unit.test.ts +150 -0
- package/src/__tests__/material-snapshot-mutation.integration.test.ts +53 -0
- package/src/__tests__/material-static-dynamic-route.unit.test.ts +94 -0
- package/src/__tests__/material-stride-surface.unit.test.ts +32 -0
- package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +106 -0
- package/src/__tests__/mesh-material-bindings.unit.test.ts +89 -0
- package/src/__tests__/mesh-stride-surface.unit.test.ts +16 -0
- package/src/__tests__/morph-culling-reentry.dawn.test.ts +157 -0
- package/src/__tests__/morph-feature-gpu-work.integration.test.ts +80 -0
- package/src/__tests__/morph-feature-plan.unit.test.ts +53 -0
- package/src/__tests__/morph-visual-evidence.integration.test.ts +80 -0
- package/src/__tests__/nineslice-handle-surface.unit.test.ts +19 -0
- package/src/__tests__/post-process-error-policy-owner.unit.test.ts +201 -0
- package/src/__tests__/prepared-buffer-kind-owner.test-d.ts +29 -0
- package/src/__tests__/prepared-graphics-capability.unit.test.ts +65 -0
- package/src/__tests__/prepared-graphics-generation.unit.test.ts +161 -0
- package/src/__tests__/prepared-graphics-lifecycle.unit.test.ts +138 -0
- package/src/__tests__/prepared-graphics-pipeline-warmup.unit.test.ts +29 -0
- package/src/__tests__/prepared-graphics-resolver.unit.test.ts +285 -0
- package/src/__tests__/prepared-graphics-snapshot.unit.test.ts +105 -0
- package/src/__tests__/prepared-graphics-store.unit.test.ts +154 -0
- package/src/__tests__/prepared-graphics-validation.unit.test.ts +176 -0
- package/src/__tests__/profiler-default-off.test.ts +22 -0
- package/src/__tests__/profiler-phase-catalog.test.ts +66 -0
- package/src/__tests__/profiler-phase-integration.test.ts +62 -0
- package/src/__tests__/profiler-phase-token.test.ts +79 -0
- package/src/__tests__/public-surface.test-d.ts +94 -0
- package/src/__tests__/recover-error-policy-owner.unit.test.ts +107 -0
- package/src/__tests__/render-error-code-owner.test-d.ts +116 -0
- package/src/__tests__/render-error-detail-ssot.test-d.ts +139 -0
- package/src/__tests__/render-error-exhaustive.test-d.ts +110 -0
- package/src/__tests__/render-feature-assembly.test-d.ts +43 -0
- package/src/__tests__/render-feature-context.test-d.ts +57 -0
- package/src/__tests__/render-feature-contract.test-d.ts +49 -0
- package/src/__tests__/render-feature-diagnostics.unit.test.ts +149 -0
- package/src/__tests__/render-feature-docs.unit.test.ts +89 -0
- package/src/__tests__/render-feature-errors.unit.test.ts +47 -0
- package/src/__tests__/render-feature-gpu-work.integration.test.ts +316 -0
- 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 +90 -0
- package/src/__tests__/render-feature-prepared-errors.test-d.ts +79 -0
- package/src/__tests__/render-feature-prepared-graphics-docs.unit.test.ts +80 -0
- package/src/__tests__/render-feature-prepared-graphics-isolation.unit.test.ts +72 -0
- package/src/__tests__/render-feature-prepared-graphics-negative.test-d.ts +36 -0
- package/src/__tests__/render-feature-prepared-graphics.test-d.ts +74 -0
- package/src/__tests__/render-feature-prepared-graphics.unit.test.ts +121 -0
- package/src/__tests__/render-feature-public-surface.test-d.ts +57 -0
- package/src/__tests__/render-feature-retry.unit.test.ts +87 -0
- package/src/__tests__/render-feature-scheduling.unit.test.ts +110 -0
- package/src/__tests__/render-feature-stage-failed-policy-owner.unit.test.ts +137 -0
- package/src/__tests__/render-feature-stage-fault-recovery.unit.test.ts +146 -0
- package/src/__tests__/render-feature-visibility-context.test-d.ts +33 -0
- package/src/__tests__/render-feature-visibility-context.unit.test.ts +37 -0
- package/src/__tests__/render-feature-zero-work.unit.test.ts +76 -0
- package/src/__tests__/render-graph-compute-raster-gpu.ts +342 -0
- package/src/__tests__/render-graph-compute-raster.browser.test.ts +16 -0
- package/src/__tests__/render-graph-compute-raster.dawn.test.ts +22 -0
- package/src/__tests__/render-graph-hzb-gpu.ts +239 -0
- package/src/__tests__/render-graph-hzb.browser.test.ts +16 -0
- package/src/__tests__/render-graph-hzb.dawn.test.ts +23 -0
- package/src/__tests__/render-graph-primitives.unit.test.ts +22 -0
- package/src/__tests__/render-graph-storage-indirect-gpu.ts +162 -0
- package/src/__tests__/render-graph-storage-indirect.browser.test.ts +21 -0
- package/src/__tests__/render-graph-storage-indirect.dawn.test.ts +28 -0
- package/src/__tests__/render-scene-projection.unit.test.ts +168 -0
- package/src/__tests__/renderer-factory-material-contract.unit.test.ts +121 -0
- package/src/__tests__/renderer-lifecycle.integration.test.ts +58 -0
- package/src/__tests__/rhi-backend-package-boundary.unit.test.ts +11 -0
- package/src/__tests__/scriptable-pack-consumer.test-d.ts +14 -0
- package/src/__tests__/shader-stage-surface.unit.test.ts +43 -0
- package/src/__tests__/ssao-config.unit.test.ts +36 -0
- package/src/__tests__/ssao-kernel-surface.unit.test.ts +14 -0
- 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 +91 -0
- package/src/__tests__/texture-usage-surface.unit.test.ts +58 -0
- package/src/__tests__/typed-pipeline-topology.unit.test.ts +223 -0
- package/src/__tests__/urp-pipeline-targets.unit.test.ts +42 -0
- package/src/__tests__/urp-pipeline.unit.test.ts +14 -0
- package/src/__tests__/vertex-color-pipeline.unit.test.ts +132 -0
- package/src/__tests__/vertex-layout-consumer.unit.test.ts +25 -0
- package/src/__tests__/visibility-diagnostics.integration.test.ts +62 -0
- package/src/__tests__/visibility-extract.integration.test.ts +98 -0
- package/src/__tests__/visibility-extract.perf.test.ts +130 -0
- package/src/__tests__/visibility-feature-dedup.integration.test.ts +55 -0
- package/src/__tests__/visibility-hidden-report.unit.test.ts +36 -0
- package/src/__tests__/visibility-instances.integration.test.ts +46 -0
- package/src/__tests__/visibility-multi-world.integration.test.ts +86 -0
- package/src/__tests__/visibility-producer-matrix.integration.test.ts +168 -0
- package/src/__tests__/visibility-producer-matrix.unit.test.ts +96 -0
- package/src/__tests__/visibility-public-surface.test-d.ts +27 -0
- package/src/__tests__/visibility-resolver.unit.test.ts +85 -0
- package/src/__tests__/visibility-resource-short-circuit.unit.test.ts +80 -0
- package/src/__tests__/visibility-snapshot-contract.unit.test.ts +60 -0
- package/src/__tests__/vocabulary.unit.test.ts +21 -0
- package/src/assembly/backend-contract.ts +57 -0
- package/src/assembly/factory.ts +8130 -0
- package/src/assembly/host-contract.ts +101 -0
- package/src/assembly/material/assembly.ts +48 -0
- package/src/assembly/material/pipeline-projection.ts +63 -0
- package/src/assets/asset-decoders.ts +158 -0
- package/src/assets/render-asset-port.ts +44 -0
- package/src/assets/resolve-render-asset.ts +13 -0
- package/src/authoring.ts +17 -0
- package/src/cluster-binner.ts +700 -0
- package/src/components/__tests__/points-lines-admission.unit.test.ts +219 -0
- package/src/components/__tests__/points-lines-schema.unit.test.ts +56 -0
- package/src/components/__tests__/schema-contract.unit.test.ts +10 -0
- package/src/components/__tests__/schema-parity.unit.test.ts +25 -0
- package/src/components/__tests__/visibility-schema.unit.test.ts +35 -0
- package/src/components/camera.ts +512 -0
- package/src/components/directional-light.ts +120 -0
- package/src/components/glyph-text.ts +64 -0
- package/src/components/index.ts +54 -0
- package/src/components/instances.ts +206 -0
- package/src/components/layer.ts +69 -0
- package/src/components/light-helpers.ts +188 -0
- package/src/components/lines.ts +18 -0
- package/src/components/mesh-filter.ts +60 -0
- package/src/components/mesh-renderer.ts +61 -0
- package/src/components/point-light-shadow.ts +43 -0
- package/src/components/point-light.ts +65 -0
- package/src/components/points.ts +40 -0
- package/src/components/post-process-params.ts +35 -0
- package/src/components/scene-instance.ts +193 -0
- package/src/components/skybox-background.ts +103 -0
- package/src/components/skylight.ts +97 -0
- package/src/components/sort-key.ts +75 -0
- package/src/components/spot-light.ts +124 -0
- package/src/components/sprite-animation.ts +168 -0
- package/src/components/sprite-instances.ts +179 -0
- package/src/components/sprite-playback-mode.ts +79 -0
- package/src/components/sprite-region-override.ts +105 -0
- package/src/components/tile-layer.ts +167 -0
- package/src/components/tilemap.ts +48 -0
- package/src/components/visibility.ts +53 -0
- package/src/construct-renderer.ts +67 -0
- package/src/debug-draw-glue.ts +48 -0
- package/src/device/device-scope.ts +306 -0
- package/src/device/gpu-residency.ts +1822 -0
- package/src/device/resource-types.ts +20 -0
- package/src/engine-metrics.ts +82 -0
- package/src/errors/ecs-validation.ts +16 -0
- package/src/errors/index.ts +3 -0
- package/src/errors/recover.ts +161 -0
- package/src/errors/render.ts +1284 -0
- package/src/extract/visibility.ts +120 -0
- package/src/features/fullscreen.ts +46 -0
- package/src/features/host.ts +1363 -0
- package/src/features/morph/morph-feature.ts +377 -0
- package/src/features/plan.ts +447 -0
- package/src/features/prepared-gpu-work.ts +959 -0
- package/src/features/prepared-graphics-store.ts +449 -0
- package/src/features/prepared-graphics.ts +420 -0
- package/src/features/render-graph-compute.ts +69 -0
- package/src/features/render-graph-contribution.ts +75 -0
- package/src/features/render-graph-raster.ts +332 -0
- package/src/features/render-graph-resources.ts +38 -0
- package/src/features/targets.ts +70 -0
- package/src/features/types.ts +103 -0
- package/src/features/vocabulary.ts +24 -0
- package/src/fullscreen-post-process-pass.ts +363 -0
- package/src/glyph-text-layout-system.ts +421 -0
- package/src/gpu-driven/batch-topology.ts +245 -0
- package/src/gpu-driven/production-raster.ts +695 -0
- package/src/gpu-driven/view-gpu.ts +703 -0
- package/src/gpu-resource.ts +159 -0
- package/src/gpu-scene-schema.ts +136 -0
- package/src/gpu-scene.ts +722 -0
- package/src/gpu-stage.ts +9 -0
- package/src/gpu-texture-usage.ts +12 -0
- package/src/gpu-usage.ts +14 -0
- package/src/hdrp-buffers.ts +480 -0
- package/src/ibl/IblPipelineCache.ts +1006 -0
- package/src/ibl/skylight-bind-group.ts +513 -0
- package/src/index.ts +129 -0
- package/src/inspection-types.ts +80 -0
- package/src/instance-buffer-cache.ts +95 -0
- package/src/internal.ts +9 -0
- package/src/lifecycle.ts +168 -0
- package/src/light-buffer-layout.ts +346 -0
- package/src/materials.ts +214 -0
- package/src/mesh-material-bindings.ts +103 -0
- package/src/pbr-pipeline.ts +1137 -0
- package/src/pipeline/standard-forward-lane.ts +229 -0
- package/src/pipeline/standard-pipeline.ts +555 -0
- package/src/pipeline/standard-profile.ts +65 -0
- package/src/pipeline-builder.ts +382 -0
- package/src/pipeline-spec-types.ts +28 -0
- package/src/pipeline-spec.ts +1231 -0
- package/src/plugin.ts +69 -0
- package/src/points-lines/__tests__/bounds.unit.test.ts +21 -0
- package/src/points-lines/__tests__/cache-recovery.unit.test.ts +157 -0
- package/src/points-lines/__tests__/inspection-lanes.integration.test.ts +146 -0
- package/src/points-lines/__tests__/inspection.unit.test.ts +173 -0
- package/src/points-lines/__tests__/lane-structural.integration.test.ts +122 -0
- package/src/points-lines/__tests__/points-lines.bench.ts +400 -0
- package/src/points-lines/__tests__/raster-lane.integration.test.ts +44 -0
- package/src/points-lines/__tests__/snapshot.unit.test.ts +101 -0
- package/src/points-lines/__tests__/view-ubo.unit.test.ts +73 -0
- package/src/points-lines/admission.ts +238 -0
- package/src/points-lines/bounds.ts +23 -0
- package/src/points-lines/expansion-cache.ts +215 -0
- package/src/points-lines/inspection.ts +97 -0
- package/src/points-lines/prepare.ts +177 -0
- package/src/points-lines/record.ts +125 -0
- package/src/points-lines/snapshot.ts +130 -0
- package/src/post-process-errors.ts +302 -0
- package/src/prepare/prepared-graphics-resolver.ts +456 -0
- package/src/record/__tests__/material-bg-cache.unit.test.ts +41 -0
- package/src/record/__tests__/material-slot-plan.unit.test.ts +44 -0
- package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +41 -0
- package/src/record/__tests__/video-texture-view.unit.test.ts +90 -0
- package/src/record/frame-lighting.ts +1074 -0
- package/src/record/frame-snapshot.ts +500 -0
- package/src/record/frame-targets.ts +137 -0
- package/src/record/frame.ts +1598 -0
- package/src/record/helpers.ts +284 -0
- package/src/record/main-pass-geometry.ts +1065 -0
- package/src/record/main-pass-material.ts +1043 -0
- package/src/record/main-pass-sprite-draws.ts +1137 -0
- package/src/record/main-pass.ts +610 -0
- package/src/record/mesh-ssbo.ts +885 -0
- package/src/record/render-context.ts +384 -0
- package/src/record/shadow-pass.ts +698 -0
- package/src/record/skybox-post-pass.ts +593 -0
- package/src/record/typed-frame-graph.ts +461 -0
- package/src/record/view-ubo.ts +222 -0
- package/src/render-contract.ts +582 -0
- package/src/render-data.ts +385 -0
- package/src/render-graph-primitives.ts +811 -0
- package/src/render-pipeline.ts +259 -0
- package/src/render-system-extract.ts +4585 -0
- package/src/render-system.ts +1933 -0
- package/src/scene/render-scene-types.ts +67 -0
- package/src/scene/render-scene.ts +1087 -0
- package/src/scene-instances/post-spawn-resolve-joints.ts +165 -0
- package/src/shadow-atlas.ts +244 -0
- package/src/ssao-buffers.ts +334 -0
- package/src/ssao-config.ts +61 -0
- package/src/systems/active-camera.ts +116 -0
- package/src/systems/pass-selector.ts +49 -0
- package/src/systems/skin-palette-allocator.ts +251 -0
- package/src/systems/skin-palette-types.ts +14 -0
- package/src/systems/transparent-sort-config.ts +233 -0
- package/src/tilemap-chunk-extract-system.ts +1290 -0
- package/src/typed-render-graph-primitives.ts +541 -0
- package/src/typed-shadow-passes.ts +165 -0
|
@@ -0,0 +1,811 @@
|
|
|
1
|
+
// @forgeax/engine-render - low-level record/encode graph primitives.
|
|
2
|
+
//
|
|
3
|
+
// Standard owns pass topology through typed-render-graph-primitives. This module
|
|
4
|
+
// retains the RHI-facing record helpers used by that typed graph: SSAO record
|
|
5
|
+
// closures, fullscreen dispatch, depth resolution, and encoding.
|
|
6
|
+
//
|
|
7
|
+
// Public graph assembly does not depend on legacy add* wrappers.
|
|
8
|
+
import { mat4 } from '@forgeax/engine-math';
|
|
9
|
+
import type { ResolveContext } from '@forgeax/engine-render-graph';
|
|
10
|
+
import type {
|
|
11
|
+
Buffer,
|
|
12
|
+
RhiRenderPassEncoder,
|
|
13
|
+
Sampler,
|
|
14
|
+
Texture,
|
|
15
|
+
TextureFormat,
|
|
16
|
+
TextureView,
|
|
17
|
+
} from '@forgeax/engine-rhi';
|
|
18
|
+
import {
|
|
19
|
+
buildFullscreenPostProcessPass,
|
|
20
|
+
createFullscreenBindGroup,
|
|
21
|
+
entryHasDepthRead,
|
|
22
|
+
} from './fullscreen-post-process-pass';
|
|
23
|
+
import { buildBeginRenderPassDescriptor } from './pipeline-spec';
|
|
24
|
+
import { PostProcessError } from './post-process-errors';
|
|
25
|
+
import { computeProjectionMatrix, computeViewMatrix } from './record/helpers';
|
|
26
|
+
import { getOrCreateFromChain } from './record/mesh-ssbo';
|
|
27
|
+
import type { _InternalRenderPipelineContext } from './record/render-context';
|
|
28
|
+
import { recordFxaaPass } from './record/skybox-post-pass';
|
|
29
|
+
import type { RenderPipelineContext } from './render-contract';
|
|
30
|
+
import { getOrCreateSsaoBuffers, getOrCreateSsaoFallbackTexture } from './ssao-buffers';
|
|
31
|
+
import { getSsaoParameters } from './ssao-config';
|
|
32
|
+
|
|
33
|
+
type DepthResolutionContext = Pick<_InternalRenderPipelineContext, 'runtime'> & {
|
|
34
|
+
readonly frameState: {
|
|
35
|
+
readonly perFrameGraph?: {
|
|
36
|
+
readonly getColorTargetTexture: (key: string) => Texture | undefined;
|
|
37
|
+
} | null;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
type RenderGraphRecordContext = _InternalRenderPipelineContext & {
|
|
42
|
+
readonly frameState: _InternalRenderPipelineContext['frameState'] & {
|
|
43
|
+
readonly perFrameGraph?: {
|
|
44
|
+
readonly getColorTargetDescriptor: (
|
|
45
|
+
key: string,
|
|
46
|
+
) => { readonly format: TextureFormat } | undefined;
|
|
47
|
+
readonly getColorTargetView: (key: string) => TextureView | undefined;
|
|
48
|
+
readonly getColorTargetTexture: (key: string) => Texture | undefined;
|
|
49
|
+
} | null;
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
function requireRenderGraphRecordContext(ctx: RenderPipelineContext): RenderGraphRecordContext {
|
|
54
|
+
if (!('frameState' in ctx) || !('bindGroupCounts' in ctx) || !('geometryDepthKey' in ctx)) {
|
|
55
|
+
throw new Error('typed render graph frame lacks the built-in record context');
|
|
56
|
+
}
|
|
57
|
+
return ctx as RenderGraphRecordContext;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Resolve a depth-only view of a graph color target by key.
|
|
62
|
+
*
|
|
63
|
+
* On dawn the BindGroup validation rejects a default-view (aspect=all on a
|
|
64
|
+
* depth+stencil texture) with "Multiple aspects (Depth|Stencil) selected".
|
|
65
|
+
* A separate createTextureView({aspect:'depth-only'}) is required.
|
|
66
|
+
*
|
|
67
|
+
* @param internals - internal render pipeline context
|
|
68
|
+
* @param key - graph color-target key to resolve depth from
|
|
69
|
+
* @param label - debug label for the depth-only TextureView
|
|
70
|
+
* @returns a depth-only TextureView, or null if the graph / texture is absent
|
|
71
|
+
* or creation fires a structured error
|
|
72
|
+
*/
|
|
73
|
+
export function resolveDepthOnlyView(
|
|
74
|
+
internals: DepthResolutionContext,
|
|
75
|
+
key: string,
|
|
76
|
+
label: string,
|
|
77
|
+
preferredKey?: string | null,
|
|
78
|
+
): TextureView | null {
|
|
79
|
+
const graph = internals.frameState.perFrameGraph;
|
|
80
|
+
if (graph === null || graph === undefined) return null;
|
|
81
|
+
const preferredTexture =
|
|
82
|
+
preferredKey === null || preferredKey === undefined
|
|
83
|
+
? undefined
|
|
84
|
+
: graph.getColorTargetTexture(preferredKey);
|
|
85
|
+
const tex = preferredTexture ?? graph.getColorTargetTexture(key);
|
|
86
|
+
if (tex === undefined) return null;
|
|
87
|
+
const res = internals.runtime.device.createTextureView(tex as never, {
|
|
88
|
+
label,
|
|
89
|
+
dimension: '2d',
|
|
90
|
+
aspect: 'depth-only',
|
|
91
|
+
baseMipLevel: 0,
|
|
92
|
+
mipLevelCount: 1,
|
|
93
|
+
baseArrayLayer: 0,
|
|
94
|
+
arrayLayerCount: 1,
|
|
95
|
+
});
|
|
96
|
+
if (!res.ok) {
|
|
97
|
+
internals.runtime.errorRegistry.fire(res.error);
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
return res.value;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Resolve a depth-only view of the graph's hdrDepth texture.
|
|
105
|
+
*
|
|
106
|
+
* Thin delegate to {@link resolveDepthOnlyView} (plan-strategy D-5: extract
|
|
107
|
+
* the shared depth-only view helper, SSAO delegates). Behaviour is byte-identical
|
|
108
|
+
* to the pre-extraction inline version. The SSAO BGL / bindings / sampler are
|
|
109
|
+
* untouched (OOS-4).
|
|
110
|
+
*/
|
|
111
|
+
function resolveHdrDepthDepthOnlyView(
|
|
112
|
+
internals: DepthResolutionContext,
|
|
113
|
+
hdrDepthKey: string,
|
|
114
|
+
): TextureView | null {
|
|
115
|
+
return resolveDepthOnlyView(internals, hdrDepthKey, 'ssao-hdr-depth-only-view');
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function ensureSsaoRecordCompanions(internals: _InternalRenderPipelineContext): {
|
|
119
|
+
filteringSampler: Sampler;
|
|
120
|
+
depthSampler: Sampler;
|
|
121
|
+
fallbackRawView: TextureView;
|
|
122
|
+
} | null {
|
|
123
|
+
const pp = internals.pipelineState.perPassResources;
|
|
124
|
+
if (
|
|
125
|
+
pp.ssaoFilteringSampler !== null &&
|
|
126
|
+
pp.ssaoDepthSampler !== null &&
|
|
127
|
+
pp.ssaoFallbackRawView !== null
|
|
128
|
+
) {
|
|
129
|
+
return {
|
|
130
|
+
filteringSampler: pp.ssaoFilteringSampler,
|
|
131
|
+
depthSampler: pp.ssaoDepthSampler,
|
|
132
|
+
fallbackRawView: pp.ssaoFallbackRawView as TextureView,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const device = internals.runtime.device;
|
|
137
|
+
|
|
138
|
+
if (pp.ssaoFilteringSampler === null) {
|
|
139
|
+
// Despite the field name, this sampler is non-filtering (NEAREST):
|
|
140
|
+
// bindings 3 (noise sampler) + 8 (ssaoSampler) pair with unfilterable
|
|
141
|
+
// float textures (rgba32float noise / r8unorm ssaoRaw on dawn without
|
|
142
|
+
// float32-filterable). The "filtering" label in the field name predates
|
|
143
|
+
// the sampler-type split; the resource itself is non-filtering.
|
|
144
|
+
const res = device.createSampler({
|
|
145
|
+
label: 'ssao-noise-sampler',
|
|
146
|
+
magFilter: 'nearest',
|
|
147
|
+
minFilter: 'nearest',
|
|
148
|
+
mipmapFilter: 'nearest',
|
|
149
|
+
addressModeU: 'repeat',
|
|
150
|
+
addressModeV: 'repeat',
|
|
151
|
+
});
|
|
152
|
+
if (!res.ok) {
|
|
153
|
+
internals.runtime.errorRegistry.fire(res.error);
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
pp.ssaoFilteringSampler = res.value;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (pp.ssaoDepthSampler === null) {
|
|
160
|
+
const res = device.createSampler({
|
|
161
|
+
label: 'ssao-depth-sampler',
|
|
162
|
+
magFilter: 'nearest',
|
|
163
|
+
minFilter: 'nearest',
|
|
164
|
+
mipmapFilter: 'nearest',
|
|
165
|
+
addressModeU: 'clamp-to-edge',
|
|
166
|
+
addressModeV: 'clamp-to-edge',
|
|
167
|
+
});
|
|
168
|
+
if (!res.ok) {
|
|
169
|
+
internals.runtime.errorRegistry.fire(res.error);
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
pp.ssaoDepthSampler = res.value;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if (pp.ssaoFallbackRawView === null) {
|
|
176
|
+
const fb = getOrCreateSsaoFallbackTexture(internals.runtime);
|
|
177
|
+
if (fb === null) return null;
|
|
178
|
+
pp.ssaoFallbackRawView = fb.view;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
return {
|
|
182
|
+
filteringSampler: pp.ssaoFilteringSampler,
|
|
183
|
+
depthSampler: pp.ssaoDepthSampler,
|
|
184
|
+
fallbackRawView: pp.ssaoFallbackRawView as TextureView,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Pack the 256B SSAO uniform payload from the camera + config.ssao.
|
|
190
|
+
*
|
|
191
|
+
* Layout (plan-strategy D-1 + D-C):
|
|
192
|
+
* floats [0..15] view mat4
|
|
193
|
+
* floats [16..31] projection mat4
|
|
194
|
+
* floats [32..47] inverseProjection mat4
|
|
195
|
+
* floats [48..51] intensityPad vec4 (x=intensity, y=radius, z=bias)
|
|
196
|
+
* floats [52..63] trailing zero-pad to round to 256B / 64f UBO alignment.
|
|
197
|
+
*/
|
|
198
|
+
function buildSsaoUniformPayload(internals: _InternalRenderPipelineContext): Float32Array {
|
|
199
|
+
const { camera, frameState } = internals;
|
|
200
|
+
const sProj = computeProjectionMatrix(camera);
|
|
201
|
+
const sView = computeViewMatrix(camera);
|
|
202
|
+
const invProj = mat4.create();
|
|
203
|
+
mat4.invert(invProj, sProj);
|
|
204
|
+
|
|
205
|
+
const out = new Float32Array(64);
|
|
206
|
+
out.set(sView, 0);
|
|
207
|
+
out.set(sProj, 16);
|
|
208
|
+
out.set(invProj, 32);
|
|
209
|
+
|
|
210
|
+
const ssaoConfig = frameState.installedPipelineConfig?.ssao;
|
|
211
|
+
const parameters = getSsaoParameters(
|
|
212
|
+
ssaoConfig !== undefined && ssaoConfig.enabled === true ? ssaoConfig : undefined,
|
|
213
|
+
);
|
|
214
|
+
out[48] = parameters.intensity;
|
|
215
|
+
out[49] = parameters.radius;
|
|
216
|
+
out[50] = parameters.bias;
|
|
217
|
+
return out;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* recordSsaoCalcPass — fullscreen SSAO occlusion calculation (M8 / w38).
|
|
222
|
+
*
|
|
223
|
+
* Resolves the graph-owned half-resolution ssaoRaw color target, writes the
|
|
224
|
+
* 256 B SSAO uniform (view/proj/invProj/intensity) once per frame, then runs
|
|
225
|
+
* a 3-vertex fullscreen-triangle draw with fs_ssao_calc.
|
|
226
|
+
*
|
|
227
|
+
* Bind group entries (must match the 9-entry SSAO BGL declared in
|
|
228
|
+
* createRenderer.ts; see hdrp-ssao.wgsl §BGL layout):
|
|
229
|
+
* 0 ssao_uniform UBO 5 hdr_depth view
|
|
230
|
+
* 1 ssao_kernel UBO 6 ssao_depth_sampler (non-filtering)
|
|
231
|
+
* 2 ssao_noise_texture 7 fallback ssaoRaw view (calc never samples)
|
|
232
|
+
* 3 ssao_noise_sampler 8 ssaoSampler (unused by calc, BGL slot)
|
|
233
|
+
* 4 gbuffer_normal view
|
|
234
|
+
*
|
|
235
|
+
* Skips with no GPU work when the optional SSAO pipelines are unavailable
|
|
236
|
+
* (manifest without hdrp-ssao.wgsl), when the dedicated BGL is null, when
|
|
237
|
+
* the SSAO buffers fail to allocate, or when the graph cannot resolve the
|
|
238
|
+
* required views.
|
|
239
|
+
*/
|
|
240
|
+
export interface SsaoCalcPassViews {
|
|
241
|
+
readonly output: TextureView;
|
|
242
|
+
readonly normal: TextureView;
|
|
243
|
+
readonly depth: TextureView;
|
|
244
|
+
readonly depthCacheKey: TextureView;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
export function recordSsaoCalcPass(
|
|
248
|
+
_c: _InternalRenderPipelineContext,
|
|
249
|
+
resolveCtx?: ResolveContext,
|
|
250
|
+
ssaoRawKey?: string,
|
|
251
|
+
gbuf0Key?: string,
|
|
252
|
+
hdrDepthKey?: string,
|
|
253
|
+
graphPass?: RhiRenderPassEncoder,
|
|
254
|
+
graphViews?: SsaoCalcPassViews,
|
|
255
|
+
): void {
|
|
256
|
+
const { runtime, pipelineState, encoder } = _c;
|
|
257
|
+
const pp = pipelineState.perPassResources;
|
|
258
|
+
|
|
259
|
+
if (pp.ssaoCalcPipeline === null || pp.ssaoBgl === null) return;
|
|
260
|
+
if (graphViews === undefined && (resolveCtx === undefined || ssaoRawKey === undefined)) return;
|
|
261
|
+
|
|
262
|
+
const ssaoRawView =
|
|
263
|
+
graphViews?.output ?? (resolveCtx?.resolve(ssaoRawKey as string) as TextureView | undefined);
|
|
264
|
+
const gbuf0View =
|
|
265
|
+
graphViews?.normal ??
|
|
266
|
+
(gbuf0Key !== undefined
|
|
267
|
+
? (resolveCtx?.resolve(gbuf0Key) as TextureView | undefined)
|
|
268
|
+
: undefined);
|
|
269
|
+
if (!ssaoRawView || !gbuf0View || (graphViews === undefined && hdrDepthKey === undefined)) return;
|
|
270
|
+
|
|
271
|
+
// hdrDepth needs a depth-only view (BGL binding 5 sampleType=depth);
|
|
272
|
+
// resolveCtx returns a default all-aspects view that dawn rejects when
|
|
273
|
+
// paired with a depth sampler.
|
|
274
|
+
const hdrDepthView = graphViews?.depth ?? resolveHdrDepthDepthOnlyView(_c, hdrDepthKey as string);
|
|
275
|
+
if (hdrDepthView === null) return;
|
|
276
|
+
|
|
277
|
+
// Cache key: the graph's pooled hdrDepth view (stable object per size, new
|
|
278
|
+
// object on resize). The depth-only view above is created fresh every frame
|
|
279
|
+
// so it cannot key the cache; the pooled all-aspects view co-varies with it
|
|
280
|
+
// (both are views of the same transient hdrDepth texture) and changes exactly
|
|
281
|
+
// on resize. Used only as a WeakMap key, never bound.
|
|
282
|
+
const hdrDepthPooledView =
|
|
283
|
+
graphViews?.depthCacheKey ??
|
|
284
|
+
(resolveCtx?.resolve(hdrDepthKey as string) as TextureView | undefined);
|
|
285
|
+
if (hdrDepthPooledView === undefined) return;
|
|
286
|
+
|
|
287
|
+
const ssaoBufs = getOrCreateSsaoBuffers(runtime);
|
|
288
|
+
if (ssaoBufs === null) return;
|
|
289
|
+
|
|
290
|
+
const noiseViewRes = runtime.device.createTextureView(ssaoBufs.noiseTexture, {
|
|
291
|
+
label: 'hdrp-ssao-noise-view',
|
|
292
|
+
format: 'rgba32float',
|
|
293
|
+
dimension: '2d',
|
|
294
|
+
aspect: 'all',
|
|
295
|
+
baseMipLevel: 0,
|
|
296
|
+
mipLevelCount: 1,
|
|
297
|
+
baseArrayLayer: 0,
|
|
298
|
+
arrayLayerCount: 1,
|
|
299
|
+
});
|
|
300
|
+
if (!noiseViewRes.ok) {
|
|
301
|
+
runtime.errorRegistry.fire(noiseViewRes.error);
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
const companions = ensureSsaoRecordCompanions(_c);
|
|
306
|
+
if (companions === null) return;
|
|
307
|
+
|
|
308
|
+
// Per-frame uniform write (D-C: view+proj+invProj+intensity at one queue
|
|
309
|
+
// call). 256 B Float32Array (64 f32) lands in ssao_uniform UBO offset 0.
|
|
310
|
+
const payload = buildSsaoUniformPayload(_c);
|
|
311
|
+
const writeRes = runtime.device.queue.writeBuffer(ssaoBufs.uniformBuffer, 0, payload);
|
|
312
|
+
if (!writeRes.ok) {
|
|
313
|
+
runtime.errorRegistry.fire(writeRes.error);
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// Identity-cached bind group: 9 entries mirror the BGL declared in
|
|
318
|
+
// createRenderer. Keyed on the graph-pooled gbuf0 + hdrDepth views (both
|
|
319
|
+
// retire + reallocate on resize), so the WeakMap misses after a resize and
|
|
320
|
+
// rebuilds against the live textures. The noise / depth-only views bound
|
|
321
|
+
// below are created fresh each frame but back stable textures; keying on the
|
|
322
|
+
// resize-varying graph views is what makes invalidation correct. Replaces
|
|
323
|
+
// the prior `=== null` slot cache that submitted a destroyed gbuf0/hdrDepth
|
|
324
|
+
// after resize.
|
|
325
|
+
const ssaoBgl = pp.ssaoBgl;
|
|
326
|
+
const bindGroup = getOrCreateFromChain(
|
|
327
|
+
_c.frameState.postProcessBgCache,
|
|
328
|
+
[gbuf0View, hdrDepthPooledView],
|
|
329
|
+
'ssao-calc',
|
|
330
|
+
() => {
|
|
331
|
+
const bgRes = runtime.device.createBindGroup({
|
|
332
|
+
label: 'ssao-calc-bg',
|
|
333
|
+
layout: ssaoBgl,
|
|
334
|
+
entries: [
|
|
335
|
+
{ binding: 0, resource: { kind: 'buffer', value: { buffer: ssaoBufs.uniformBuffer } } },
|
|
336
|
+
{ binding: 1, resource: { kind: 'buffer', value: { buffer: ssaoBufs.kernelBuffer } } },
|
|
337
|
+
{ binding: 2, resource: { kind: 'textureView', value: noiseViewRes.value } },
|
|
338
|
+
{
|
|
339
|
+
binding: 3,
|
|
340
|
+
resource: { kind: 'sampler', value: companions.filteringSampler },
|
|
341
|
+
},
|
|
342
|
+
{ binding: 4, resource: { kind: 'textureView', value: gbuf0View } },
|
|
343
|
+
{ binding: 5, resource: { kind: 'textureView', value: hdrDepthView } },
|
|
344
|
+
{ binding: 6, resource: { kind: 'sampler', value: companions.depthSampler } },
|
|
345
|
+
{ binding: 7, resource: { kind: 'textureView', value: companions.fallbackRawView } },
|
|
346
|
+
{ binding: 8, resource: { kind: 'sampler', value: companions.filteringSampler } },
|
|
347
|
+
],
|
|
348
|
+
});
|
|
349
|
+
if (!bgRes.ok) throw bgRes.error;
|
|
350
|
+
return bgRes.value;
|
|
351
|
+
},
|
|
352
|
+
_c.bindGroupCounts,
|
|
353
|
+
);
|
|
354
|
+
|
|
355
|
+
const pass: RhiRenderPassEncoder =
|
|
356
|
+
graphPass ??
|
|
357
|
+
encoder.beginRenderPass(
|
|
358
|
+
buildBeginRenderPassDescriptor(
|
|
359
|
+
{ colorFormats: ['r8unorm'], depthFormat: undefined, sampleCount: 1 },
|
|
360
|
+
{ colorViews: [ssaoRawView] },
|
|
361
|
+
'post-process',
|
|
362
|
+
) as never,
|
|
363
|
+
);
|
|
364
|
+
pass.setPipeline(pp.ssaoCalcPipeline);
|
|
365
|
+
pass.setBindGroup(0, bindGroup);
|
|
366
|
+
pass.draw(3, 1, 0, 0);
|
|
367
|
+
if (graphPass === undefined) pass.end();
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/**
|
|
371
|
+
* recordSsaoBlurPass — fullscreen SSAO 4x4 box blur (M8 / w38).
|
|
372
|
+
*
|
|
373
|
+
* Reads the half-resolution ssaoRaw (R8), applies a 16-tap box blur, writes
|
|
374
|
+
* the blurred result to ssaoBlurred. The BGL is the same 9-entry SSAO BGL
|
|
375
|
+
* as the calc pass; the only difference is binding 7 carries the real
|
|
376
|
+
* ssaoRaw view (vs the 1x1 fallback the calc pass binds).
|
|
377
|
+
*/
|
|
378
|
+
export interface SsaoBlurPassViews extends SsaoCalcPassViews {
|
|
379
|
+
readonly raw: TextureView;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
export function recordSsaoBlurPass(
|
|
383
|
+
_c: _InternalRenderPipelineContext,
|
|
384
|
+
resolveCtx?: ResolveContext,
|
|
385
|
+
ssaoBlurredKey?: string,
|
|
386
|
+
ssaoRawKey?: string,
|
|
387
|
+
gbuf0Key?: string,
|
|
388
|
+
hdrDepthKey?: string,
|
|
389
|
+
graphPass?: RhiRenderPassEncoder,
|
|
390
|
+
graphViews?: SsaoBlurPassViews,
|
|
391
|
+
): void {
|
|
392
|
+
const { runtime, pipelineState, encoder } = _c;
|
|
393
|
+
const pp = pipelineState.perPassResources;
|
|
394
|
+
|
|
395
|
+
if (pp.ssaoBlurPipeline === null || pp.ssaoBgl === null) return;
|
|
396
|
+
if (
|
|
397
|
+
graphViews === undefined &&
|
|
398
|
+
(resolveCtx === undefined || ssaoBlurredKey === undefined || ssaoRawKey === undefined)
|
|
399
|
+
)
|
|
400
|
+
return;
|
|
401
|
+
|
|
402
|
+
const ssaoBlurredView =
|
|
403
|
+
graphViews?.output ??
|
|
404
|
+
(resolveCtx?.resolve(ssaoBlurredKey as string) as TextureView | undefined);
|
|
405
|
+
const ssaoRawView =
|
|
406
|
+
graphViews?.raw ?? (resolveCtx?.resolve(ssaoRawKey as string) as TextureView | undefined);
|
|
407
|
+
const gbuf0View =
|
|
408
|
+
graphViews?.normal ??
|
|
409
|
+
(gbuf0Key !== undefined
|
|
410
|
+
? (resolveCtx?.resolve(gbuf0Key) as TextureView | undefined)
|
|
411
|
+
: undefined);
|
|
412
|
+
if (!ssaoBlurredView || !ssaoRawView) return;
|
|
413
|
+
|
|
414
|
+
// hdrDepth depth-only view (see recordSsaoCalcPass).
|
|
415
|
+
const hdrDepthView =
|
|
416
|
+
graphViews?.depth ??
|
|
417
|
+
(hdrDepthKey !== undefined ? resolveHdrDepthDepthOnlyView(_c, hdrDepthKey) : null);
|
|
418
|
+
// Pooled hdrDepth view for the cache key (the depth-only view above is
|
|
419
|
+
// recreated every frame; see recordSsaoCalcPass).
|
|
420
|
+
const hdrDepthPooledView =
|
|
421
|
+
graphViews?.depthCacheKey ??
|
|
422
|
+
(hdrDepthKey !== undefined
|
|
423
|
+
? (resolveCtx?.resolve(hdrDepthKey) as TextureView | undefined)
|
|
424
|
+
: undefined);
|
|
425
|
+
|
|
426
|
+
const ssaoBufs = getOrCreateSsaoBuffers(runtime);
|
|
427
|
+
if (ssaoBufs === null) return;
|
|
428
|
+
|
|
429
|
+
const noiseViewRes = runtime.device.createTextureView(ssaoBufs.noiseTexture, {
|
|
430
|
+
label: 'hdrp-ssao-noise-view',
|
|
431
|
+
format: 'rgba32float',
|
|
432
|
+
dimension: '2d',
|
|
433
|
+
aspect: 'all',
|
|
434
|
+
baseMipLevel: 0,
|
|
435
|
+
mipLevelCount: 1,
|
|
436
|
+
baseArrayLayer: 0,
|
|
437
|
+
arrayLayerCount: 1,
|
|
438
|
+
});
|
|
439
|
+
if (!noiseViewRes.ok) {
|
|
440
|
+
runtime.errorRegistry.fire(noiseViewRes.error);
|
|
441
|
+
return;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
const companions = ensureSsaoRecordCompanions(_c);
|
|
445
|
+
if (companions === null) return;
|
|
446
|
+
|
|
447
|
+
// The blur reads ssaoRaw via binding 7 + ssaoSampler at binding 8. The
|
|
448
|
+
// remaining slots 0..6 are bound for BGL completeness (BGL is shared with
|
|
449
|
+
// the calc pass): WebGPU requires every BGL slot carry a valid resource
|
|
450
|
+
// even when the active fragment entry does not statically reference it.
|
|
451
|
+
// gbuf0 + hdr_depth views are resolved from the graph; they must exist
|
|
452
|
+
// because the typed SSAO graph declares them as reads on the blur node.
|
|
453
|
+
if (gbuf0View === undefined || hdrDepthView === null || hdrDepthPooledView === undefined) return;
|
|
454
|
+
// Identity-cached bind group keyed on the graph-pooled ssaoRaw + gbuf0 +
|
|
455
|
+
// hdrDepth views (all retire + reallocate on resize). Replaces the prior
|
|
456
|
+
// `=== null` slot cache that submitted destroyed transients after resize.
|
|
457
|
+
const ssaoBgl = pp.ssaoBgl;
|
|
458
|
+
const bindGroup = getOrCreateFromChain(
|
|
459
|
+
_c.frameState.postProcessBgCache,
|
|
460
|
+
[ssaoRawView, gbuf0View, hdrDepthPooledView],
|
|
461
|
+
'ssao-blur',
|
|
462
|
+
() => {
|
|
463
|
+
const bgRes = runtime.device.createBindGroup({
|
|
464
|
+
label: 'ssao-blur-bg',
|
|
465
|
+
layout: ssaoBgl,
|
|
466
|
+
entries: [
|
|
467
|
+
{ binding: 0, resource: { kind: 'buffer', value: { buffer: ssaoBufs.uniformBuffer } } },
|
|
468
|
+
{ binding: 1, resource: { kind: 'buffer', value: { buffer: ssaoBufs.kernelBuffer } } },
|
|
469
|
+
{ binding: 2, resource: { kind: 'textureView', value: noiseViewRes.value } },
|
|
470
|
+
{
|
|
471
|
+
binding: 3,
|
|
472
|
+
resource: { kind: 'sampler', value: companions.filteringSampler },
|
|
473
|
+
},
|
|
474
|
+
{ binding: 4, resource: { kind: 'textureView', value: gbuf0View } },
|
|
475
|
+
{ binding: 5, resource: { kind: 'textureView', value: hdrDepthView } },
|
|
476
|
+
{ binding: 6, resource: { kind: 'sampler', value: companions.depthSampler } },
|
|
477
|
+
{ binding: 7, resource: { kind: 'textureView', value: ssaoRawView } },
|
|
478
|
+
{ binding: 8, resource: { kind: 'sampler', value: companions.filteringSampler } },
|
|
479
|
+
],
|
|
480
|
+
});
|
|
481
|
+
if (!bgRes.ok) throw bgRes.error;
|
|
482
|
+
return bgRes.value;
|
|
483
|
+
},
|
|
484
|
+
_c.bindGroupCounts,
|
|
485
|
+
);
|
|
486
|
+
|
|
487
|
+
const pass: RhiRenderPassEncoder =
|
|
488
|
+
graphPass ??
|
|
489
|
+
encoder.beginRenderPass(
|
|
490
|
+
buildBeginRenderPassDescriptor(
|
|
491
|
+
{ colorFormats: ['r8unorm'], depthFormat: undefined, sampleCount: 1 },
|
|
492
|
+
{ colorViews: [ssaoBlurredView] },
|
|
493
|
+
'post-process',
|
|
494
|
+
) as never,
|
|
495
|
+
);
|
|
496
|
+
pass.setPipeline(pp.ssaoBlurPipeline);
|
|
497
|
+
pass.setBindGroup(0, bindGroup);
|
|
498
|
+
pass.draw(3, 1, 0, 0);
|
|
499
|
+
if (graphPass === undefined) pass.end();
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
/**
|
|
503
|
+
* F-3 fix-up + feat-20260609 M1 / T-3 patch: per-frame fullscreen-post-process
|
|
504
|
+
* dispatcher.
|
|
505
|
+
*
|
|
506
|
+
* Two-branch fan-out by shader id:
|
|
507
|
+
* - `'fxaa'` (engine-built-in hardwire): delegate to `recordFxaaPass`. The
|
|
508
|
+
* FXAA implementation owns its graph input view, surface output attachment,
|
|
509
|
+
* pipeline cache, and bindgroup-resize invalidation; that mechanics is engine-internal and
|
|
510
|
+
* not expressible through the generic public primitive. recordFxaaPass's
|
|
511
|
+
* body is intentionally unchanged across this refactor to preserve the
|
|
512
|
+
* AC-09 dualPassDiff=1069 (hello-fxaa) / 768 (learn-render-4-10-MSAA)
|
|
513
|
+
* byte-equivalence with the pre-feat baseline.
|
|
514
|
+
* - every other id (AI-user path): the M1 patch wires `reads[0]` through the
|
|
515
|
+
* render-graph `resolveCtx` so the bind group samples the upstream
|
|
516
|
+
* graph-owned color target (e.g. the typed scene pass writes `'offscreenColor'`,
|
|
517
|
+
* a custom post-process pass declares `reads: ['offscreenColor']`).
|
|
518
|
+
* Failure modes (charter P3 fail-fast):
|
|
519
|
+
* - `lookupPostProcess(shader) === undefined` -> throw
|
|
520
|
+
* `PostProcessError({code:'post-process-not-found'})`
|
|
521
|
+
* - `reads.length > 0` but `resolveCtx.resolve(reads[0]) === undefined`
|
|
522
|
+
* -> throw `PostProcessError({code:'fullscreen-input-not-found',
|
|
523
|
+
* detail:{readsKey, passName}})`. AI users read err.detail.readsKey
|
|
524
|
+
* to find the missing graph.addColorTarget declaration.
|
|
525
|
+
* On success the dispatcher builds the input-texture BGL + sampler via
|
|
526
|
+
* `buildFullscreenPostProcessPass`, composes the per-frame bind group
|
|
527
|
+
* via `createFullscreenBindGroup`, opens a render pass writing the
|
|
528
|
+
* declared `color` (resolved through the graph's color-target view, or
|
|
529
|
+
* the swap-chain `ctx.view` when the graph has not allocated a target),
|
|
530
|
+
* binds the input bind group at slot 1 (the 0 slot is reserved for
|
|
531
|
+
* future view bind groups), and calls `handle.draw(pass)` which
|
|
532
|
+
* internally does `setPipeline(pipeline)` + `draw(3, 1, 0, 0)` over the
|
|
533
|
+
* fullscreen-triangle vertex shader.
|
|
534
|
+
*
|
|
535
|
+
* Extracted from the addPass execute closure so the topology fan-out is in
|
|
536
|
+
* one named place; the typed graph has a single
|
|
537
|
+
* call site, and future post-process branches (e.g. tonemap migrated onto
|
|
538
|
+
* this dispatcher per OOS-3) extend this function rather than the addPass
|
|
539
|
+
* inline closure.
|
|
540
|
+
*/
|
|
541
|
+
function dispatchFullscreenPass(
|
|
542
|
+
ctx: RenderPipelineContext,
|
|
543
|
+
name: string,
|
|
544
|
+
shader: string,
|
|
545
|
+
color: string,
|
|
546
|
+
reads: readonly string[],
|
|
547
|
+
resolveCtx?: ResolveContext,
|
|
548
|
+
compositeOverSwapchain = false,
|
|
549
|
+
rawSwapchainOutput = false,
|
|
550
|
+
graphPass?: RhiRenderPassEncoder,
|
|
551
|
+
graphOutputFormat?: GPUTextureFormat,
|
|
552
|
+
graphDepthView?: TextureView,
|
|
553
|
+
): void {
|
|
554
|
+
if (shader === 'fxaa') {
|
|
555
|
+
if (resolveCtx === undefined) {
|
|
556
|
+
throw new PostProcessError({
|
|
557
|
+
code: 'fullscreen-input-not-found',
|
|
558
|
+
detail: { readsKey: reads[0] ?? 'ldrColor', passName: name },
|
|
559
|
+
});
|
|
560
|
+
}
|
|
561
|
+
recordFxaaPass(requireRenderGraphRecordContext(ctx), resolveCtx, graphPass);
|
|
562
|
+
return;
|
|
563
|
+
}
|
|
564
|
+
const lookup = ctx.runtime.lookupPostProcess;
|
|
565
|
+
const entry = lookup === undefined ? undefined : lookup(shader);
|
|
566
|
+
if (entry === undefined) {
|
|
567
|
+
throw new PostProcessError({
|
|
568
|
+
code: 'post-process-not-found',
|
|
569
|
+
detail: { id: shader },
|
|
570
|
+
});
|
|
571
|
+
}
|
|
572
|
+
// feat-20260621 M4' composite-over-swap-chain: copy the current swap-chain
|
|
573
|
+
// into the `color` scratch target BEFORE sampling, so the effect reads the
|
|
574
|
+
// already-composited final image (shadows + tonemap + fxaa). Generalises the
|
|
575
|
+
// built-in FXAA copy idiom. The `color` key is BOTH the copy dst and the
|
|
576
|
+
// sampled input (resolve its GPU texture via `${color}::tex` for the copy,
|
|
577
|
+
// its TextureView via `${color}` for the bind group).
|
|
578
|
+
let inputView: TextureView | null;
|
|
579
|
+
if (compositeOverSwapchain) {
|
|
580
|
+
const scratchTex = resolveCtx?.resolve(`${color}::tex`);
|
|
581
|
+
const scratchView = resolveCtx?.resolve(color);
|
|
582
|
+
if (scratchTex === undefined || scratchView === undefined) {
|
|
583
|
+
throw new PostProcessError({
|
|
584
|
+
code: 'fullscreen-input-not-found',
|
|
585
|
+
detail: { readsKey: color, passName: name },
|
|
586
|
+
});
|
|
587
|
+
}
|
|
588
|
+
ctx.encoder.copyTextureToTexture(
|
|
589
|
+
{ texture: ctx.currentTexture as never, mipLevel: 0, origin: { x: 0, y: 0, z: 0 } },
|
|
590
|
+
{ texture: scratchTex as never, mipLevel: 0, origin: { x: 0, y: 0, z: 0 } },
|
|
591
|
+
{ width: ctx.targetW, height: ctx.targetH, depthOrArrayLayers: 1 },
|
|
592
|
+
);
|
|
593
|
+
inputView = scratchView as TextureView;
|
|
594
|
+
} else if (reads.length === 0) {
|
|
595
|
+
// reads === [] preserves the legacy swap-chain sample path (used by
|
|
596
|
+
// tonemap-style passes that read the framebuffer directly).
|
|
597
|
+
inputView = ctx.view;
|
|
598
|
+
} else {
|
|
599
|
+
// reads with a key MUST resolve through the graph compile output, otherwise
|
|
600
|
+
// the dispatcher throws fullscreen-input-not-found (charter P3 fail-fast).
|
|
601
|
+
const readsKey = reads[0] as string;
|
|
602
|
+
const resolved = resolveCtx?.resolve(readsKey);
|
|
603
|
+
if (resolved === undefined) {
|
|
604
|
+
throw new PostProcessError({
|
|
605
|
+
code: 'fullscreen-input-not-found',
|
|
606
|
+
detail: { readsKey, passName: name },
|
|
607
|
+
});
|
|
608
|
+
}
|
|
609
|
+
inputView = resolved as TextureView;
|
|
610
|
+
}
|
|
611
|
+
if (inputView === null) return;
|
|
612
|
+
|
|
613
|
+
// ── BGL/Pipeline build (before depth resolution so built.depthSampler is
|
|
614
|
+
// available for the depth threading block below; ctx.msaaActive selects
|
|
615
|
+
// the multisampled depth BGL when the scene target uses sample=4) ───────
|
|
616
|
+
const built = buildFullscreenPostProcessPass(
|
|
617
|
+
{ device: ctx.runtime.device, errorRegistry: ctx.runtime.errorRegistry },
|
|
618
|
+
entry,
|
|
619
|
+
ctx.msaaActive,
|
|
620
|
+
);
|
|
621
|
+
if (built === null) return;
|
|
622
|
+
|
|
623
|
+
// ── plan-strategy D-6: depth read resolution (pipeline-agnostic, AC-02) ────
|
|
624
|
+
// Iterate entry.reads looking for sampleType:'depth' entries. For each depth
|
|
625
|
+
// entry, resolve a depth-only TextureView from the graph via
|
|
626
|
+
// resolveDepthOnlyView, fail-fast on unresolvable keys. The depth sampler
|
|
627
|
+
// is produced by buildFullscreenPostProcessPass (via createDepthSampler,
|
|
628
|
+
// plan-strategy D-2: non-filtering nearest+clamp-to-edge).
|
|
629
|
+
//
|
|
630
|
+
// Both composite and non-composite branches handle depth symmetrically —
|
|
631
|
+
// the depth resolution block is branch-agnostic (AC-02: no URP/HDRP
|
|
632
|
+
// discrimination). Color input logic is unchanged (AC-03 zero-regression).
|
|
633
|
+
let depthTexView: TextureView | null = graphDepthView ?? null;
|
|
634
|
+
let depthSampler: Sampler | null = null;
|
|
635
|
+
if (entry.reads && entry.reads.length > 0) {
|
|
636
|
+
const internals = requireRenderGraphRecordContext(ctx);
|
|
637
|
+
for (const read of entry.reads) {
|
|
638
|
+
if (typeof read !== 'string' && read.sampleType === 'depth') {
|
|
639
|
+
const depthKey = read.key;
|
|
640
|
+
depthTexView ??= resolveDepthOnlyView(
|
|
641
|
+
internals,
|
|
642
|
+
depthKey,
|
|
643
|
+
'post-process-scene-depth-only-view',
|
|
644
|
+
internals.geometryDepthKey,
|
|
645
|
+
);
|
|
646
|
+
if (depthTexView === null) {
|
|
647
|
+
throw new PostProcessError({
|
|
648
|
+
code: 'fullscreen-input-not-found',
|
|
649
|
+
detail: { readsKey: depthKey, passName: name },
|
|
650
|
+
});
|
|
651
|
+
}
|
|
652
|
+
depthSampler = built.depthSampler;
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
// feat-20260621 M4' composite-over-swap-chain write target: the swap-chain's
|
|
658
|
+
// NON-srgb storage view (R-COLORSPACE — the scratch holds an already-sRGB-
|
|
659
|
+
// encoded copy, so writing through the srgb view would double-encode; mirrors
|
|
660
|
+
// recordFxaaPass). Otherwise resolve the declared color through the graph and
|
|
661
|
+
// fall back to ctx.view (swap-chain srgb view) for normal post passes.
|
|
662
|
+
let writeView: TextureView | null | undefined;
|
|
663
|
+
// The attachment format follows the actual write target. Graph-owned
|
|
664
|
+
// targets may be linear HDR/LDR textures (for example rgba16float), while
|
|
665
|
+
// the swap-chain path uses the backend-selected surface view format.
|
|
666
|
+
let writeFormat = ctx.pipelineState?.colorAttachmentFormat ?? 'rgba8unorm-srgb';
|
|
667
|
+
if (graphPass !== undefined) {
|
|
668
|
+
writeView = ctx.view;
|
|
669
|
+
writeFormat = graphOutputFormat ?? writeFormat;
|
|
670
|
+
} else if (rawSwapchainOutput && color === 'swapchain') {
|
|
671
|
+
const rawViewRes = ctx.runtime.device.createTextureView(ctx.currentTexture, {});
|
|
672
|
+
if (!rawViewRes.ok) {
|
|
673
|
+
ctx.runtime.errorRegistry.fire(rawViewRes.error);
|
|
674
|
+
return;
|
|
675
|
+
}
|
|
676
|
+
writeView = rawViewRes.value;
|
|
677
|
+
writeFormat = ctx.pipelineState?.format ?? 'rgba8unorm';
|
|
678
|
+
} else if (compositeOverSwapchain) {
|
|
679
|
+
const storageViewRes = ctx.runtime.device.createTextureView(ctx.currentTexture, {});
|
|
680
|
+
if (!storageViewRes.ok) {
|
|
681
|
+
ctx.runtime.errorRegistry.fire(storageViewRes.error);
|
|
682
|
+
return;
|
|
683
|
+
}
|
|
684
|
+
writeView = storageViewRes.value;
|
|
685
|
+
writeFormat = ctx.pipelineState?.format ?? 'rgba8unorm';
|
|
686
|
+
} else {
|
|
687
|
+
const legacyGraph = requireRenderGraphRecordContext(ctx).frameState.perFrameGraph;
|
|
688
|
+
const graphColorFormat = legacyGraph?.getColorTargetDescriptor(color)?.format;
|
|
689
|
+
if (graphColorFormat !== undefined) writeFormat = graphColorFormat;
|
|
690
|
+
const resolvedColor = (resolveCtx?.resolve(color) as TextureView | undefined) ?? null;
|
|
691
|
+
writeView = legacyGraph?.getColorTargetView(color) ?? resolvedColor ?? ctx.view;
|
|
692
|
+
}
|
|
693
|
+
if (writeView === null || writeView === undefined) return;
|
|
694
|
+
|
|
695
|
+
// feat-20260621 M-A2 / w8: per-frame data-driven params channel. When the
|
|
696
|
+
// entry declares params, look up the per-id eager-created UBO + the per-frame
|
|
697
|
+
// bytes from the PostProcessParams snapshot, fail-fast on a byteLength
|
|
698
|
+
// mismatch, then writeBuffer + bind the UBO at group(1) binding(2). When
|
|
699
|
+
// entry.params is undefined this whole block is skipped and the BGL degrades
|
|
700
|
+
// to 2-entry (param-less zero-regression, R-A7).
|
|
701
|
+
let paramsBuffer: Buffer | null = null;
|
|
702
|
+
if (entry.params !== undefined) {
|
|
703
|
+
const ubo = ctx.runtime.getPostProcessParamsBuffer?.(shader);
|
|
704
|
+
if (ubo !== undefined) {
|
|
705
|
+
const data = ctx.postProcessParams.get(shader);
|
|
706
|
+
if (data !== undefined) {
|
|
707
|
+
if (data.byteLength !== entry.params.byteSize) {
|
|
708
|
+
throw new PostProcessError({
|
|
709
|
+
code: 'params-update-size-mismatch',
|
|
710
|
+
detail: { byteSize: entry.params.byteSize, actualLength: data.byteLength },
|
|
711
|
+
});
|
|
712
|
+
}
|
|
713
|
+
const writeResult = ctx.runtime.device.queue.writeBuffer(ubo, 0, data);
|
|
714
|
+
if (!writeResult.ok) return;
|
|
715
|
+
} else {
|
|
716
|
+
const writeResult = ctx.runtime.device.queue.writeBuffer(ubo, 0, entry.params.defaultValue);
|
|
717
|
+
if (!writeResult.ok) return;
|
|
718
|
+
}
|
|
719
|
+
paramsBuffer = ubo;
|
|
720
|
+
}
|
|
721
|
+
} else if (entryHasDepthRead(entry)) {
|
|
722
|
+
// D-3: a param-less depth entry still binds the minimal UBO auto-allocated
|
|
723
|
+
// at register (the 'fullscreen-post-with-scene-depth' BGL always declares
|
|
724
|
+
// params@2). No per-frame write -- the buffer stays zero-filled.
|
|
725
|
+
paramsBuffer = ctx.runtime.getPostProcessParamsBuffer?.(shader) ?? null;
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
const bindGroup = createFullscreenBindGroup(
|
|
729
|
+
ctx.runtime.device,
|
|
730
|
+
built.bindGroupLayout,
|
|
731
|
+
inputView,
|
|
732
|
+
built.sampler,
|
|
733
|
+
paramsBuffer,
|
|
734
|
+
depthTexView,
|
|
735
|
+
depthSampler,
|
|
736
|
+
);
|
|
737
|
+
if (bindGroup === null) return;
|
|
738
|
+
|
|
739
|
+
// Pipeline source-of-truth (M4 / T-10-a, solving M1 CONCERN-1):
|
|
740
|
+
// RenderSystemRuntime.getPostProcessPipeline is the sync wrapper over the
|
|
741
|
+
// shared shader-module adapter (1-frame warmup). First frame after
|
|
742
|
+
// fullscreen effect registration: shader compile is in flight -> returns null -> we
|
|
743
|
+
// skip the pass for that frame. Second frame onward: cached pipeline is
|
|
744
|
+
// returned synchronously.
|
|
745
|
+
//
|
|
746
|
+
// Color format SSOT: graph-owned writes use their resolved descriptor format;
|
|
747
|
+
// swap-chain writes use the backend-aware surface format in pipelineState.
|
|
748
|
+
// This keeps the PSO target and render-pass attachment identical when a
|
|
749
|
+
// fullscreen pass writes an intermediate rgba16float target (for example
|
|
750
|
+
// tonemap -> FXAA), while preserving the native surface storage/sRGB split.
|
|
751
|
+
const lookupPipeline = ctx.runtime.getPostProcessPipeline;
|
|
752
|
+
if (lookupPipeline === undefined) return;
|
|
753
|
+
const postColorFormat = writeFormat;
|
|
754
|
+
const pipeline = lookupPipeline(shader, built.bindGroupLayout, postColorFormat);
|
|
755
|
+
if (pipeline === null) {
|
|
756
|
+
return;
|
|
757
|
+
}
|
|
758
|
+
const handle = built.createHandle(name, pipeline, paramsBuffer);
|
|
759
|
+
|
|
760
|
+
// Open a render pass writing into the resolved color target. Fullscreen
|
|
761
|
+
// post-process passes are non-MSAA, depth-less, single-attachment.
|
|
762
|
+
// setBindGroup(1, ...) (group=1 reserved per plan-strategy convention;
|
|
763
|
+
// group=0 is reserved for future view bind groups, mirroring the
|
|
764
|
+
// recordTonemap / recordSkybox pattern that uses slot 0 only when the
|
|
765
|
+
// pipeline declares a single bind group at slot 0).
|
|
766
|
+
const pass =
|
|
767
|
+
graphPass ??
|
|
768
|
+
ctx.encoder.beginRenderPass(
|
|
769
|
+
buildBeginRenderPassDescriptor(
|
|
770
|
+
{
|
|
771
|
+
colorFormats: [writeFormat],
|
|
772
|
+
depthFormat: undefined,
|
|
773
|
+
sampleCount: 1,
|
|
774
|
+
},
|
|
775
|
+
{ colorViews: [writeView] },
|
|
776
|
+
'post-process',
|
|
777
|
+
) as never,
|
|
778
|
+
);
|
|
779
|
+
pass.setBindGroup(1, bindGroup);
|
|
780
|
+
handle.draw(pass, inputView);
|
|
781
|
+
if (graphPass === undefined) pass.end();
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
export function encodeFullscreenPass(
|
|
785
|
+
ctx: RenderPipelineContext,
|
|
786
|
+
pass: RhiRenderPassEncoder,
|
|
787
|
+
input: {
|
|
788
|
+
readonly name: string;
|
|
789
|
+
readonly shader: string;
|
|
790
|
+
readonly color: string;
|
|
791
|
+
readonly reads: readonly string[];
|
|
792
|
+
readonly resolve: ResolveContext;
|
|
793
|
+
readonly outputFormat: GPUTextureFormat;
|
|
794
|
+
readonly rawSwapchainOutput?: boolean | undefined;
|
|
795
|
+
readonly depthView?: TextureView | undefined;
|
|
796
|
+
},
|
|
797
|
+
): void {
|
|
798
|
+
dispatchFullscreenPass(
|
|
799
|
+
ctx,
|
|
800
|
+
input.name,
|
|
801
|
+
input.shader,
|
|
802
|
+
input.color,
|
|
803
|
+
input.reads,
|
|
804
|
+
input.resolve,
|
|
805
|
+
false,
|
|
806
|
+
input.rawSwapchainOutput ?? false,
|
|
807
|
+
pass,
|
|
808
|
+
input.outputFormat,
|
|
809
|
+
input.depthView,
|
|
810
|
+
);
|
|
811
|
+
}
|