@forgeax/engine-render 0.1.33 → 0.1.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1062 -127
- package/dist/assembly/backend-contract.d.ts +2 -0
- package/dist/assembly/backend-contract.d.ts.map +1 -1
- package/dist/assembly/barrel-distortion-inspection.d.ts +3 -0
- package/dist/assembly/barrel-distortion-inspection.d.ts.map +1 -0
- package/dist/assembly/canvas-draw-guard.d.ts +3 -0
- package/dist/assembly/canvas-draw-guard.d.ts.map +1 -0
- package/dist/assembly/cloud-shadow-entry.d.ts +4 -0
- package/dist/assembly/cloud-shadow-entry.d.ts.map +1 -0
- package/dist/assembly/device-feature-admission.d.ts +2 -2
- package/dist/assembly/dynamic-geometry-host.d.ts +4 -1
- package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -1
- package/dist/assembly/dynamic-geometry-runtime.d.ts +1 -1
- package/dist/assembly/dynamic-geometry-runtime.d.ts.map +1 -1
- package/dist/assembly/factory.d.ts +1 -1
- package/dist/assembly/factory.d.ts.map +1 -1
- package/dist/assembly/host-contract.d.ts +6 -5
- package/dist/assembly/host-contract.d.ts.map +1 -1
- package/dist/assembly/material/assembly.d.ts.map +1 -1
- package/dist/assembly/material/pipeline-helpers.d.ts +5 -0
- package/dist/assembly/material/pipeline-helpers.d.ts.map +1 -1
- package/dist/assembly/material-shader-policy.d.ts +16 -2
- package/dist/assembly/material-shader-policy.d.ts.map +1 -1
- package/dist/assembly/material-shader-prewarm.d.ts.map +1 -1
- package/dist/assembly/recovery/device-loss-fanout.d.ts.map +1 -1
- package/dist/assembly/recovery/renderer-recover.d.ts +2 -0
- package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
- package/dist/assembly/render-feature-post-processes.d.ts +6 -0
- package/dist/assembly/render-feature-post-processes.d.ts.map +1 -0
- package/dist/assembly/render-target-host.d.ts +5 -0
- package/dist/assembly/render-target-host.d.ts.map +1 -1
- package/dist/assembly/renderer-facade.d.ts.map +1 -1
- package/dist/assembly/renderer-feature-inspection.d.ts +1 -1
- package/dist/assembly/renderer-feature-inspection.d.ts.map +1 -1
- package/dist/assembly/renderer-frame-transaction.d.ts +12 -0
- package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
- package/dist/assembly/renderer-inspection.d.ts +11 -0
- package/dist/assembly/renderer-inspection.d.ts.map +1 -1
- package/dist/assembly/webgpu-pbr-ready.d.ts +1 -0
- package/dist/assembly/webgpu-pbr-ready.d.ts.map +1 -1
- package/dist/assembly/webgpu-ready-per-pass.d.ts +39 -0
- package/dist/assembly/webgpu-ready-per-pass.d.ts.map +1 -0
- package/dist/assembly/webgpu-ready.d.ts +1 -1
- package/dist/assembly/webgpu-ready.d.ts.map +1 -1
- package/dist/assembly/webgpu-renderer-bootstrap.d.ts.map +1 -1
- package/dist/assembly/webgpu-renderer-observation-owner.d.ts +35 -0
- package/dist/assembly/webgpu-renderer-observation-owner.d.ts.map +1 -0
- package/dist/assembly/webgpu-renderer.d.ts +2 -1
- package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
- package/dist/authoring.mjs +2 -4
- package/dist/authoring.mjs.map +1 -1
- package/dist/barrel-distortion.d.ts +47 -0
- package/dist/barrel-distortion.d.ts.map +1 -0
- package/dist/chunk-3XUBWRY2.mjs +1842 -0
- package/dist/chunk-3XUBWRY2.mjs.map +1 -0
- package/dist/{chunk-OO3DRYK7.mjs → chunk-G6HDNGY7.mjs} +2400 -1767
- package/dist/chunk-G6HDNGY7.mjs.map +1 -0
- package/dist/{chunk-ZDQWGQW7.mjs → chunk-LM5IE7GF.mjs} +4 -4
- package/dist/{chunk-ZDQWGQW7.mjs.map → chunk-LM5IE7GF.mjs.map} +1 -1
- package/dist/{chunk-VOZWDM3L.mjs → chunk-LNIUIKQ7.mjs} +1514 -498
- package/dist/chunk-LNIUIKQ7.mjs.map +1 -0
- package/dist/chunk-MXTWKZO4.mjs +3268 -0
- package/dist/chunk-MXTWKZO4.mjs.map +1 -0
- package/dist/chunk-MZ4C7EHF.mjs +6942 -0
- package/dist/chunk-MZ4C7EHF.mjs.map +1 -0
- package/dist/chunk-RIPAEGI6.mjs +48 -0
- package/dist/chunk-RIPAEGI6.mjs.map +1 -0
- package/dist/{chunk-LEAXOMYJ.mjs → chunk-SGPUJW3F.mjs} +117 -5
- package/dist/chunk-SGPUJW3F.mjs.map +1 -0
- package/dist/{chunk-PA5DRJNI.mjs → chunk-X2KA6WHM.mjs} +29 -4
- package/dist/chunk-X2KA6WHM.mjs.map +1 -0
- package/dist/{chunk-BLXGONR2.mjs → chunk-XSFB7XXQ.mjs} +51 -4
- package/dist/chunk-XSFB7XXQ.mjs.map +1 -0
- package/dist/cloud/density.d.ts +55 -0
- package/dist/cloud/density.d.ts.map +1 -0
- package/dist/cloud/extract.d.ts +25 -0
- package/dist/cloud/extract.d.ts.map +1 -0
- package/dist/cloud/feature.d.ts +57 -0
- package/dist/cloud/feature.d.ts.map +1 -0
- package/dist/cloud/frame-context.d.ts +8 -0
- package/dist/cloud/frame-context.d.ts.map +1 -0
- package/dist/cloud/inspection.d.ts +59 -0
- package/dist/cloud/inspection.d.ts.map +1 -0
- package/dist/cloud/optics.d.ts +56 -0
- package/dist/cloud/optics.d.ts.map +1 -0
- package/dist/cloud/parameters.d.ts +73 -0
- package/dist/cloud/parameters.d.ts.map +1 -0
- package/dist/cloud/resources.d.ts +60 -0
- package/dist/cloud/resources.d.ts.map +1 -0
- package/dist/cloud/shadow.d.ts +42 -0
- package/dist/cloud/shadow.d.ts.map +1 -0
- package/dist/cloud/temporal.d.ts +74 -0
- package/dist/cloud/temporal.d.ts.map +1 -0
- package/dist/components/barrel-distortion.d.ts +13 -0
- package/dist/components/barrel-distortion.d.ts.map +1 -0
- package/dist/components/cloud-layer.d.ts +29 -0
- package/dist/components/cloud-layer.d.ts.map +1 -0
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/instances.d.ts +20 -6
- package/dist/components/instances.d.ts.map +1 -1
- package/dist/construct-renderer.d.ts +1 -1
- package/dist/construct-renderer.d.ts.map +1 -1
- package/dist/construct-renderer.mjs +8406 -5785
- package/dist/construct-renderer.mjs.map +1 -1
- package/dist/device/gpu-residency.d.ts +19 -19
- package/dist/device/gpu-residency.d.ts.map +1 -1
- package/dist/dynamic-geometry.d.ts +5 -1
- package/dist/dynamic-geometry.d.ts.map +1 -1
- package/dist/errors/cloud.d.ts +59 -0
- package/dist/errors/cloud.d.ts.map +1 -0
- package/dist/errors/render.d.ts +20 -5
- package/dist/errors/render.d.ts.map +1 -1
- package/dist/examples/single-layer-medium-surface.d.ts +47 -0
- package/dist/examples/single-layer-medium-surface.d.ts.map +1 -0
- package/dist/extract/camera.d.ts.map +1 -1
- package/dist/extract/contracts.d.ts +5 -1
- package/dist/extract/contracts.d.ts.map +1 -1
- package/dist/extract/material-context.d.ts +7 -0
- package/dist/extract/material-context.d.ts.map +1 -0
- package/dist/features/barrel-distortion.d.ts +29 -0
- package/dist/features/barrel-distortion.d.ts.map +1 -0
- package/dist/features/error-reporting.d.ts +6 -2
- package/dist/features/error-reporting.d.ts.map +1 -1
- package/dist/features/host.d.ts +15 -0
- package/dist/features/host.d.ts.map +1 -1
- package/dist/features/plan.d.ts +10 -0
- package/dist/features/plan.d.ts.map +1 -1
- package/dist/features/render-graph-contribution.d.ts +5 -0
- package/dist/features/render-graph-contribution.d.ts.map +1 -1
- package/dist/features/render-graph-raster.d.ts +1 -0
- package/dist/features/render-graph-raster.d.ts.map +1 -1
- package/dist/features/targets.d.ts +2 -0
- package/dist/features/targets.d.ts.map +1 -1
- package/dist/features/types.d.ts +48 -0
- package/dist/features/types.d.ts.map +1 -1
- package/dist/fullscreen-post-process-pass.d.ts +15 -7
- package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
- package/dist/glyph-text-layout-system.d.ts +1 -1
- package/dist/glyph-text-layout-system.d.ts.map +1 -1
- package/dist/gpu-dirty-ranges.d.ts +11 -0
- package/dist/gpu-dirty-ranges.d.ts.map +1 -0
- package/dist/gpu-driven/batch-topology.d.ts +17 -0
- package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
- package/dist/gpu-driven/material-artifacts.d.ts +6 -0
- package/dist/gpu-driven/material-artifacts.d.ts.map +1 -1
- package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
- package/dist/gpu-driven/production-raster-material.d.ts +178 -0
- package/dist/gpu-driven/production-raster-material.d.ts.map +1 -0
- package/dist/gpu-driven/production-raster.d.ts +47 -3
- package/dist/gpu-driven/production-raster.d.ts.map +1 -1
- package/dist/gpu-driven/resource-allocation.d.ts +31 -0
- package/dist/gpu-driven/resource-allocation.d.ts.map +1 -0
- package/dist/gpu-driven/shadow-ownership.d.ts +14 -0
- package/dist/gpu-driven/shadow-ownership.d.ts.map +1 -0
- package/dist/gpu-driven/view-gpu.d.ts +26 -2
- package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
- package/dist/gpu-scene.d.ts +5 -0
- package/dist/gpu-scene.d.ts.map +1 -1
- package/dist/hdrp-buffers.d.ts +2 -2
- package/dist/hdrp-buffers.d.ts.map +1 -1
- package/dist/ibl/frame-resources.d.ts.map +1 -1
- package/dist/ibl/skylight-bind-group.d.ts +14 -5
- package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
- package/dist/index.d.ts +30 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +780 -9
- package/dist/index.mjs.map +1 -1
- package/dist/inspection-types.d.ts +135 -1
- package/dist/inspection-types.d.ts.map +1 -1
- package/dist/instance-buffer-cache.d.ts +4 -4
- package/dist/instance-buffer-cache.d.ts.map +1 -1
- package/dist/instances.d.ts +47 -100
- package/dist/instances.d.ts.map +1 -1
- package/dist/internal.mjs +7 -8
- package/dist/internal.mjs.map +1 -1
- package/dist/pbr-pipeline.d.ts +22 -4
- package/dist/pbr-pipeline.d.ts.map +1 -1
- package/dist/pipeline/single-layer-medium-passes.d.ts +73 -0
- package/dist/pipeline/single-layer-medium-passes.d.ts.map +1 -0
- package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
- package/dist/pipeline/standard-output/graph.d.ts.map +1 -1
- package/dist/pipeline/standard-output/lut-gpu.d.ts +2 -2
- package/dist/pipeline/standard-output/lut-gpu.d.ts.map +1 -1
- package/dist/pipeline/standard-output/resources.d.ts +2 -2
- package/dist/pipeline/standard-output/resources.d.ts.map +1 -1
- package/dist/pipeline/standard-output/types.d.ts +4 -2
- package/dist/pipeline/standard-output/types.d.ts.map +1 -1
- package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-post.d.ts.map +1 -1
- package/dist/pipeline-builder.d.ts +1 -1
- package/dist/pipeline-builder.d.ts.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/prepare/prepared-graphics-resolver.d.ts +2 -0
- package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
- package/dist/publication/contract.d.ts +77 -0
- package/dist/publication/contract.d.ts.map +1 -0
- package/dist/publication/dependencies.d.ts +7 -0
- package/dist/publication/dependencies.d.ts.map +1 -0
- package/dist/publication/prepare-geometry.d.ts +9 -0
- package/dist/publication/prepare-geometry.d.ts.map +1 -0
- package/dist/publication/programs.d.ts +5 -0
- package/dist/publication/programs.d.ts.map +1 -0
- package/dist/publication/publisher.d.ts +33 -0
- package/dist/publication/publisher.d.ts.map +1 -0
- package/dist/publication/receiver.d.ts +29 -0
- package/dist/publication/receiver.d.ts.map +1 -0
- package/dist/publication/resource-scope.d.ts +18 -0
- package/dist/publication/resource-scope.d.ts.map +1 -0
- package/dist/publication/targets.d.ts +33 -0
- package/dist/publication/targets.d.ts.map +1 -0
- package/dist/publication/video.d.ts +5 -0
- package/dist/publication/video.d.ts.map +1 -0
- package/dist/record/barrel-distortion-frame.d.ts +15 -0
- package/dist/record/barrel-distortion-frame.d.ts.map +1 -0
- package/dist/record/dynamic-geometry-consumption.d.ts +10 -2
- package/dist/record/dynamic-geometry-consumption.d.ts.map +1 -1
- package/dist/record/fold-buckets.d.ts +95 -0
- package/dist/record/fold-buckets.d.ts.map +1 -0
- package/dist/record/fold-instance-buffer.d.ts +6 -0
- package/dist/record/fold-instance-buffer.d.ts.map +1 -0
- package/dist/record/frame-lighting.d.ts +1 -0
- package/dist/record/frame-lighting.d.ts.map +1 -1
- package/dist/record/frame-snapshot.d.ts +43 -9
- package/dist/record/frame-snapshot.d.ts.map +1 -1
- package/dist/record/frame.d.ts +15 -65
- package/dist/record/frame.d.ts.map +1 -1
- package/dist/record/gpu-draw-receipts.d.ts +11 -0
- package/dist/record/gpu-draw-receipts.d.ts.map +1 -0
- package/dist/record/gpu-timing.d.ts +8 -0
- package/dist/record/gpu-timing.d.ts.map +1 -1
- package/dist/record/helpers.d.ts +2 -2
- package/dist/record/helpers.d.ts.map +1 -1
- package/dist/record/main-pass-geometry.d.ts +22 -6
- package/dist/record/main-pass-geometry.d.ts.map +1 -1
- package/dist/record/main-pass-material.d.ts +14 -10
- package/dist/record/main-pass-material.d.ts.map +1 -1
- package/dist/record/main-pass-sprite-draws.d.ts +3 -16
- package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
- package/dist/record/main-pass.d.ts +13 -2
- package/dist/record/main-pass.d.ts.map +1 -1
- package/dist/record/motion-blur-receipt.d.ts +11 -0
- package/dist/record/motion-blur-receipt.d.ts.map +1 -0
- package/dist/record/prepared-material-bindings.d.ts +3 -3
- package/dist/record/prepared-material-bindings.d.ts.map +1 -1
- package/dist/record/probe-blend-buffer.d.ts +16 -0
- package/dist/record/probe-blend-buffer.d.ts.map +1 -0
- package/dist/record/recovery-pipeline.d.ts.map +1 -1
- package/dist/record/render-context.d.ts +24 -5
- package/dist/record/render-context.d.ts.map +1 -1
- package/dist/record/shadow-pass.d.ts +2 -0
- package/dist/record/shadow-pass.d.ts.map +1 -1
- package/dist/record/skybox-post-pass.d.ts +1 -1
- package/dist/record/skybox-post-pass.d.ts.map +1 -1
- package/dist/record/sprite-instance-buffer.d.ts +31 -0
- package/dist/record/sprite-instance-buffer.d.ts.map +1 -0
- package/dist/record/target-capture-graph.d.ts +19 -0
- package/dist/record/target-capture-graph.d.ts.map +1 -0
- package/dist/record/typed-frame-graph.d.ts +24 -15
- package/dist/record/typed-frame-graph.d.ts.map +1 -1
- package/dist/record/view-ubo.d.ts +11 -3
- package/dist/record/view-ubo.d.ts.map +1 -1
- package/dist/record/volume-params.d.ts +9 -0
- package/dist/record/volume-params.d.ts.map +1 -0
- package/dist/recovery/render-system-candidate.d.ts +14 -4
- package/dist/recovery/render-system-candidate.d.ts.map +1 -1
- package/dist/reflection/record-owner.d.ts.map +1 -1
- package/dist/render-contract.d.ts +46 -5
- package/dist/render-contract.d.ts.map +1 -1
- package/dist/render-graph-primitives.d.ts.map +1 -1
- package/dist/render-pipeline.d.ts +103 -2
- package/dist/render-pipeline.d.ts.map +1 -1
- package/dist/render-system-extract-tail.d.ts +3 -2
- package/dist/render-system-extract-tail.d.ts.map +1 -1
- package/dist/render-system-extract.d.ts +18 -9
- package/dist/render-system-extract.d.ts.map +1 -1
- package/dist/render-system-presentation.d.ts +23 -0
- package/dist/render-system-presentation.d.ts.map +1 -0
- package/dist/render-system-producer-roots.d.ts +10 -0
- package/dist/render-system-producer-roots.d.ts.map +1 -0
- package/dist/render-system-projections.d.ts +3 -2
- package/dist/render-system-projections.d.ts.map +1 -1
- package/dist/render-system-residency.d.ts +12 -0
- package/dist/render-system-residency.d.ts.map +1 -0
- package/dist/render-system.d.ts +22 -21
- package/dist/render-system.d.ts.map +1 -1
- package/dist/scene/probe-blend.d.ts +27 -0
- package/dist/scene/probe-blend.d.ts.map +1 -1
- package/dist/scene/render-scene.d.ts +18 -7
- package/dist/scene/render-scene.d.ts.map +1 -1
- package/dist/scene/render-source.d.ts +42 -0
- package/dist/scene/render-source.d.ts.map +1 -0
- package/dist/scene/source-systems.d.ts +6 -0
- package/dist/scene/source-systems.d.ts.map +1 -0
- package/dist/ssao-buffers.d.ts +9 -0
- package/dist/ssao-buffers.d.ts.map +1 -1
- package/dist/surface/dynamic-input.d.ts +133 -0
- package/dist/surface/dynamic-input.d.ts.map +1 -0
- package/dist/surface/gpu-driven.d.ts +41 -0
- package/dist/surface/gpu-driven.d.ts.map +1 -0
- package/dist/surface/submission-observation.d.ts +136 -0
- package/dist/surface/submission-observation.d.ts.map +1 -0
- package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
- package/dist/systems/skin-palette-types.d.ts +10 -0
- package/dist/systems/skin-palette-types.d.ts.map +1 -1
- package/dist/systems/transparent-dispatch.d.ts +2 -2
- package/dist/systems/transparent-dispatch.d.ts.map +1 -1
- package/dist/systems/transparent-sort-config.d.ts +2 -1
- package/dist/systems/transparent-sort-config.d.ts.map +1 -1
- package/dist/temporal/gpu.d.ts +13 -1
- package/dist/temporal/gpu.d.ts.map +1 -1
- package/dist/temporal/index.mjs +6 -7
- package/dist/temporal/inspection.d.ts.map +1 -1
- package/dist/temporal/standard-scene-data.d.ts.map +1 -1
- package/dist/temporal/target-coverage-attachment.d.ts.map +1 -1
- package/dist/transmission/single-layer-medium.d.ts +89 -0
- package/dist/transmission/single-layer-medium.d.ts.map +1 -0
- package/dist/typed-render-graph-primitives.d.ts +14 -2
- package/dist/typed-render-graph-primitives.d.ts.map +1 -1
- package/dist/volume/component.d.ts +9 -4
- package/dist/volume/component.d.ts.map +1 -1
- package/dist/volume/extract.d.ts +1 -1
- package/dist/volume/extract.d.ts.map +1 -1
- package/dist/volume/inspection.d.ts +2 -0
- package/dist/volume/inspection.d.ts.map +1 -1
- package/dist/volume/passes.d.ts +4 -1
- package/dist/volume/passes.d.ts.map +1 -1
- package/dist/volume/resources.d.ts.map +1 -1
- package/package.json +22 -21
- package/src/__tests__/atmosphere-daylight.dawn.test.ts +72 -0
- package/src/__tests__/auto-exposure-transaction.integration.test.ts +4 -9
- package/src/__tests__/barrel-distortion-lkg.integration.test.ts +353 -0
- package/src/__tests__/barrel-distortion.dawn.test.ts +41 -0
- package/src/__tests__/barrel-distortion.unit.test.ts +364 -0
- package/src/__tests__/construct-renderer-identity.unit.test.ts +49 -0
- package/src/__tests__/detached-recovery-graph.unit.test.ts +277 -0
- package/src/__tests__/device-feature-admission.unit.test.ts +3 -2
- package/src/__tests__/device-loss-fanout.unit.test.ts +36 -1
- package/src/__tests__/docs-gate-green.unit.test.ts +112 -1
- package/src/__tests__/factory-contract.integration.test.ts +295 -45
- package/src/__tests__/feature-depth-input.dawn.test.ts +129 -2
- package/src/__tests__/fullscreen-feature-plan.unit.test.ts +14 -3
- package/src/__tests__/gpu-dirty-ranges.unit.test.ts +22 -0
- package/src/__tests__/gpu-driven-baseline.characterization.test.ts +16 -3
- package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +12 -0
- package/src/__tests__/gpu-driven-material-artifacts.unit.test.ts +143 -0
- package/src/__tests__/gpu-driven-pbr.dawn.test.ts +5 -6
- package/src/__tests__/gpu-driven-production.integration.test.ts +482 -3
- package/src/__tests__/gpu-driven-shadow-views.dawn.test.ts +6 -5
- package/src/__tests__/gpu-driven-view-gpu-evidence.ts +94 -6
- package/src/__tests__/gpu-driven-view-graph.integration.test.ts +18 -2
- package/src/__tests__/gpu-driven-view.browser.test.ts +5 -8
- package/src/__tests__/gpu-driven-view.dawn.test.ts +6 -2
- package/src/__tests__/gpu-driven-view.unit.test.ts +1 -1
- package/src/__tests__/gpu-pass-timing-lifecycle.integration.test.ts +1 -0
- package/src/__tests__/gpu-pass-timing.browser.test.ts +6 -4
- package/src/__tests__/gpu-pass-timing.rhi-null.unit.test.ts +1 -0
- package/src/__tests__/gpu-scene.unit.test.ts +119 -9
- package/src/__tests__/instance-allocation-failure.unit.test.ts +57 -0
- package/src/__tests__/instances-culling.integration.test.ts +10 -36
- package/src/__tests__/instances-store.unit.test.ts +97 -305
- package/src/__tests__/instances-world-ownership.integration.test.ts +62 -0
- package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +4 -1
- package/src/__tests__/main-pass-material-medium-selection.unit.test.ts +145 -0
- package/src/__tests__/material-shader-prewarm.unit.test.ts +59 -0
- package/src/__tests__/material-snapshot-mutation.integration.test.ts +39 -1
- package/src/__tests__/materials-standard-contract.unit.test.ts +0 -1
- package/src/__tests__/morph-culling-reentry.dawn.test.ts +5 -5
- package/src/__tests__/morph-visual-evidence.integration.test.ts +8 -7
- package/src/__tests__/motion-blur-compute.dawn.test.ts +13 -7
- package/src/__tests__/motion-blur.pixel.integration.test.ts +2 -2
- package/src/__tests__/nineslice-handle-surface.unit.test.ts +4 -4
- package/src/__tests__/pbr-view-layout.unit.test.ts +9 -0
- package/src/__tests__/physical-clearcoat.integration.test.ts +66 -8
- package/src/__tests__/physical-material-budget.unit.test.ts +40 -0
- package/src/__tests__/prepared-graphics-capability.unit.test.ts +66 -2
- package/src/__tests__/probe-bindings.unit.test.ts +582 -1
- package/src/__tests__/probe-scene-dirty.integration.test.ts +28 -1
- package/src/__tests__/receipt-observation-retirement.unit.test.ts +65 -0
- package/src/__tests__/recovery-candidate-prepare.contract.test.ts +69 -0
- package/src/__tests__/render-error-code-owner.test-d.ts +8 -0
- package/src/__tests__/render-feature-diagnostics.unit.test.ts +15 -2
- package/src/__tests__/render-feature-error-reporting.unit.test.ts +21 -1
- package/src/__tests__/render-feature-prepared-diagnostics.unit.test.ts +10 -1
- package/src/__tests__/render-feature-retry.unit.test.ts +12 -1
- package/src/__tests__/render-scene-mixed-updates.integration.test.ts +145 -19
- package/src/__tests__/render-scene-projection.unit.test.ts +36 -11
- package/src/__tests__/render-scene-temporal-retry.unit.test.ts +20 -20
- package/src/__tests__/render-target-probe-soak.perf.test.ts +2 -2
- package/src/__tests__/render-temporal-environment-consumer.browser.test.ts +3 -3
- package/src/__tests__/render-temporal-environment-consumer.dawn.test.ts +5 -2
- package/src/__tests__/renderer-factory-material-contract.unit.test.ts +42 -8
- package/src/__tests__/renderer-frame-generation-fence.integration.test.ts +16 -0
- package/src/__tests__/renderer-frame-transaction.integration.test.ts +26 -10
- package/src/__tests__/resource-allocation.unit.test.ts +123 -0
- package/src/__tests__/single-layer-medium-passes.unit.test.ts +275 -0
- package/src/__tests__/skin-motion-regression.unit.test.ts +70 -1
- package/src/__tests__/skin-palette-recycling.dawn.test.ts +97 -0
- package/src/__tests__/skinned-shadow-caster.test.ts +15 -0
- package/src/__tests__/ssr-carrier-public-contract.unit.test.ts +21 -0
- package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +4 -4
- package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +2 -2
- package/src/__tests__/ssr-gpu-dispatch.ts +1 -1
- package/src/__tests__/ssr-receiver-coverage.dawn.test.ts +6 -2
- package/src/__tests__/standard-output-chain-contract.unit.test.ts +28 -0
- package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +46 -1
- package/src/__tests__/standard-pipeline.integration.test.ts +182 -1
- package/src/__tests__/surface-dynamic-buffer-lifecycle.unit.test.ts +506 -0
- package/src/__tests__/surface-submission-observation.unit.test.ts +812 -0
- package/src/__tests__/temporal-history-lifecycle.unit.test.ts +32 -0
- package/src/__tests__/temporal-performance.integration.test.ts +3 -3
- package/src/__tests__/visibility-instances.integration.test.ts +7 -19
- package/src/__tests__/visibility-producer-matrix.integration.test.ts +9 -20
- package/src/__tests__/volume-optics-oracle.unit.test.ts +4 -2
- package/src/__tests__/volumetric-fog-budget-recovery.integration.test.ts +30 -20
- package/src/__tests__/volumetric-fog-errors.unit.test.ts +4 -3
- package/src/__tests__/volumetric-fog-multiple.unit.test.ts +55 -0
- package/src/__tests__/volumetric-fog-spot-frame-optics.integration.test.ts +1 -1
- package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +113 -9
- package/src/__tests__/volumetric-fog-topology.unit.test.ts +5 -3
- package/src/assembly/backend-contract.ts +30 -0
- package/src/assembly/barrel-distortion-inspection.ts +22 -0
- package/src/assembly/canvas-draw-guard.ts +11 -0
- package/src/assembly/cloud-shadow-entry.ts +22 -0
- package/src/assembly/device-feature-admission.ts +2 -2
- package/src/assembly/dynamic-geometry-host.ts +65 -37
- package/src/assembly/dynamic-geometry-runtime.ts +7 -1
- package/src/assembly/factory.ts +2 -30
- package/src/assembly/host-contract.ts +8 -5
- package/src/assembly/material/assembly.ts +25 -13
- package/src/assembly/material/pipeline-helpers.ts +53 -12
- package/src/assembly/material-shader-policy.ts +55 -0
- package/src/assembly/material-shader-prewarm.ts +21 -10
- package/src/assembly/recovery/device-loss-fanout.ts +13 -0
- package/src/assembly/recovery/renderer-recover.ts +50 -18
- package/src/assembly/render-feature-post-processes.ts +54 -0
- package/src/assembly/render-target-host.ts +57 -47
- package/src/assembly/renderer-facade.ts +7 -2
- package/src/assembly/renderer-feature-inspection.ts +8 -2
- package/src/assembly/renderer-frame-transaction.ts +23 -0
- package/src/assembly/renderer-inspection.ts +28 -0
- package/src/assembly/skin-palette-owner.ts +1 -1
- package/src/assembly/temporal-post-process-prewarm.ts +3 -3
- package/src/assembly/webgpu-pbr-ready.ts +9 -1
- package/src/assembly/webgpu-ready-per-pass.ts +104 -0
- package/src/assembly/webgpu-ready.ts +116 -62
- package/src/assembly/webgpu-renderer-bootstrap.ts +0 -12
- package/src/assembly/webgpu-renderer-observation-owner.ts +222 -0
- package/src/assembly/webgpu-renderer.ts +303 -313
- package/src/assembly/webgpu-vertex-layouts.ts +1 -1
- package/src/barrel-distortion.ts +247 -0
- package/src/cloud/__tests__/cloud-density-parity.dawn.test.ts +173 -0
- package/src/cloud/__tests__/cloud-layer-framebuffer-y.dawn.test.ts +265 -0
- package/src/cloud/__tests__/cloud-layer.browser.test.ts +432 -0
- package/src/cloud/__tests__/cloud-layer.unit.test.ts +634 -0
- package/src/cloud/density.ts +600 -0
- package/src/cloud/extract.ts +110 -0
- package/src/cloud/feature.ts +1810 -0
- package/src/cloud/frame-context.ts +42 -0
- package/src/cloud/inspection.ts +130 -0
- package/src/cloud/optics.ts +285 -0
- package/src/cloud/parameters.ts +255 -0
- package/src/cloud/resources.ts +122 -0
- package/src/cloud/shadow.ts +167 -0
- package/src/cloud/temporal.ts +226 -0
- package/src/components/barrel-distortion.ts +46 -0
- package/src/components/cloud-layer.ts +47 -0
- package/src/components/index.ts +2 -0
- package/src/components/instances.ts +18 -45
- package/src/components/sprite-instances.ts +1 -1
- package/src/construct-renderer.ts +1 -1
- package/src/device/gpu-residency.ts +26 -25
- package/src/dynamic-geometry.ts +12 -1
- package/src/errors/cloud.ts +103 -0
- package/src/errors/render.ts +47 -8
- package/src/examples/single-layer-medium-surface.ts +59 -0
- package/src/extract/camera.ts +15 -1
- package/src/extract/contracts.ts +5 -0
- package/src/extract/material-context.ts +21 -0
- package/src/features/barrel-distortion.ts +172 -0
- package/src/features/error-reporting.ts +26 -6
- package/src/features/host.ts +128 -19
- package/src/features/plan.ts +10 -0
- package/src/features/render-graph-contribution.ts +9 -0
- package/src/features/render-graph-raster.ts +45 -3
- package/src/features/targets.ts +66 -0
- package/src/features/types.ts +51 -0
- package/src/fullscreen-post-process-pass.ts +41 -9
- package/src/glyph-text-layout-system.ts +2 -2
- package/src/gpu-dirty-ranges.ts +48 -0
- package/src/gpu-driven/batch-topology.ts +53 -0
- package/src/gpu-driven/material-artifacts.ts +33 -25
- package/src/gpu-driven/prepared-draw.ts +12 -4
- package/src/gpu-driven/production-raster-material.ts +1894 -0
- package/src/gpu-driven/production-raster.ts +825 -784
- package/src/gpu-driven/resource-allocation.ts +142 -0
- package/src/gpu-driven/shadow-ownership.ts +71 -0
- package/src/gpu-driven/view-gpu.ts +164 -10
- package/src/gpu-scene.ts +75 -84
- package/src/hdrp-buffers.ts +4 -3
- package/src/ibl/frame-resources.ts +0 -1
- package/src/ibl/skylight-bind-group.ts +62 -32
- package/src/index.ts +205 -9
- package/src/inspection-types.ts +162 -0
- package/src/instance-buffer-cache.ts +4 -4
- package/src/instances.ts +152 -569
- package/src/pbr-pipeline.ts +230 -30
- package/src/pipeline/single-layer-medium-passes.ts +267 -0
- package/src/pipeline/standard-forward-lane.ts +313 -57
- package/src/pipeline/standard-output/graph.ts +8 -2
- package/src/pipeline/standard-output/lut-gpu.ts +3 -3
- package/src/pipeline/standard-output/resources.ts +2 -2
- package/src/pipeline/standard-output/types.ts +12 -1
- package/src/pipeline/standard-pipeline.ts +291 -18
- package/src/pipeline/standard-post.ts +90 -24
- package/src/pipeline-builder.ts +1 -1
- package/src/plugin.ts +4 -0
- package/src/points-lines/__tests__/points-lines.bench.ts +17 -8
- package/src/prepare/prepared-graphics-resolver.ts +2 -0
- package/src/publication/__tests__/derived-geometry.integration.test.ts +177 -0
- package/src/publication/__tests__/features.integration.test.ts +122 -0
- package/src/publication/__tests__/programs.unit.test.ts +25 -0
- package/src/publication/__tests__/publication.integration.test.ts +370 -0
- package/src/publication/__tests__/targets.integration.test.ts +120 -0
- package/src/publication/__tests__/video.browser.test.ts +50 -0
- package/src/publication/contract.ts +104 -0
- package/src/publication/dependencies.ts +54 -0
- package/src/publication/prepare-geometry.ts +94 -0
- package/src/publication/programs.ts +45 -0
- package/src/publication/publisher.ts +618 -0
- package/src/publication/receiver.ts +297 -0
- package/src/publication/resource-scope.ts +31 -0
- package/src/publication/targets.ts +182 -0
- package/src/publication/video.ts +33 -0
- package/src/record/__tests__/main-pass-geometry.unit.test.ts +30 -0
- package/src/record/__tests__/material-bg-cache.unit.test.ts +15 -1
- package/src/record/__tests__/sprite-material-abi.unit.test.ts +9 -11
- package/src/record/__tests__/temporal-payload.unit.test.ts +1 -1
- package/src/record/__tests__/transparent-group2-selection.unit.test.ts +11 -0
- package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +1 -0
- package/src/record/__tests__/video-texture-view.unit.test.ts +9 -9
- package/src/record/__tests__/view-ubo-layout.unit.test.ts +4 -3
- package/src/record/barrel-distortion-frame.ts +110 -0
- package/src/record/dynamic-geometry-consumption.ts +39 -9
- package/src/record/fold-buckets.ts +855 -0
- package/src/record/fold-instance-buffer.ts +51 -0
- package/src/record/frame-lighting.ts +36 -2
- package/src/record/frame-snapshot.ts +45 -9
- package/src/record/frame.ts +258 -1105
- package/src/record/gpu-draw-receipts.ts +38 -0
- package/src/record/gpu-timing.ts +48 -5
- package/src/record/helpers.ts +2 -2
- package/src/record/main-pass-geometry.ts +272 -84
- package/src/record/main-pass-material.ts +102 -36
- package/src/record/main-pass-sprite-draws.ts +13 -217
- package/src/record/main-pass.ts +164 -27
- package/src/record/motion-blur-receipt.ts +91 -0
- package/src/record/prepared-material-bindings.ts +11 -6
- package/src/record/probe-blend-buffer.ts +180 -0
- package/src/record/recovery-pipeline.ts +35 -3
- package/src/record/render-context.ts +41 -5
- package/src/record/shadow-pass.ts +30 -4
- package/src/record/skybox-post-pass.ts +28 -4
- package/src/record/sprite-instance-buffer.ts +155 -0
- package/src/record/target-capture-graph.ts +258 -0
- package/src/record/typed-frame-graph.ts +776 -340
- package/src/record/view-ubo.ts +27 -4
- package/src/record/volume-params.ts +225 -0
- package/src/recovery/render-system-candidate.ts +243 -50
- package/src/reflection/record-owner.ts +7 -3
- package/src/render-contract.ts +54 -5
- package/src/render-graph-primitives.ts +7 -1
- package/src/render-pipeline.ts +130 -0
- package/src/render-system-extract-tail.ts +90 -78
- package/src/render-system-extract.ts +76 -76
- package/src/render-system-presentation.ts +56 -0
- package/src/render-system-producer-roots.ts +96 -0
- package/src/render-system-projections.ts +3 -2
- package/src/render-system-residency.ts +159 -0
- package/src/render-system.ts +421 -408
- package/src/scene/probe-blend.ts +96 -4
- package/src/scene/render-scene.ts +416 -337
- package/src/scene/render-source.ts +90 -0
- package/src/scene/source-systems.ts +33 -0
- package/src/ssao-buffers.ts +95 -2
- package/src/surface/__tests__/dynamic-input.unit.test.ts +374 -0
- package/src/surface/__tests__/gpu-driven.unit.test.ts +87 -0
- package/src/surface/dynamic-input.ts +658 -0
- package/src/surface/gpu-driven.ts +147 -0
- package/src/surface/submission-observation.ts +517 -0
- package/src/systems/skin-palette-allocator.ts +5 -1
- package/src/systems/skin-palette-types.ts +11 -0
- package/src/systems/transparent-dispatch.ts +2 -2
- package/src/systems/transparent-sort-config.ts +3 -1
- package/src/temporal/gpu.ts +101 -17
- package/src/temporal/inspection.ts +7 -1
- package/src/temporal/standard-scene-data.ts +5 -0
- package/src/temporal/target-coverage-attachment.ts +4 -0
- package/src/transmission/__tests__/single-layer-medium.unit.test.ts +149 -0
- package/src/transmission/__tests__/standard-transmission.dawn.test.ts +12 -11
- package/src/transmission/single-layer-medium.ts +322 -0
- package/src/typed-render-graph-primitives.ts +70 -2
- package/src/volume/component.ts +10 -9
- package/src/volume/extract.ts +11 -5
- package/src/volume/inspection.ts +3 -0
- package/src/volume/passes.ts +87 -4
- package/src/volume/resources.ts +2 -1
- package/dist/chunk-3RTCJTH4.mjs +0 -1610
- package/dist/chunk-3RTCJTH4.mjs.map +0 -1
- package/dist/chunk-BLXGONR2.mjs.map +0 -1
- package/dist/chunk-ILQ5MEZF.mjs +0 -32
- package/dist/chunk-ILQ5MEZF.mjs.map +0 -1
- package/dist/chunk-LEAXOMYJ.mjs.map +0 -1
- package/dist/chunk-NB2S7ZRX.mjs +0 -1783
- package/dist/chunk-NB2S7ZRX.mjs.map +0 -1
- package/dist/chunk-NNQL7CB3.mjs +0 -1713
- package/dist/chunk-NNQL7CB3.mjs.map +0 -1
- package/dist/chunk-OO3DRYK7.mjs.map +0 -1
- package/dist/chunk-PA5DRJNI.mjs.map +0 -1
- package/dist/chunk-PLAXOOX5.mjs +0 -1907
- package/dist/chunk-PLAXOOX5.mjs.map +0 -1
- package/dist/chunk-RXZ3RGOU.mjs +0 -53
- package/dist/chunk-RXZ3RGOU.mjs.map +0 -1
- package/dist/chunk-VOZWDM3L.mjs.map +0 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { World } from '@forgeax/engine-ecs';
|
|
1
2
|
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { type InstanceCollectionSnapshot,
|
|
3
|
+
import { type InstanceCollectionSnapshot, InstanceProjectionStore } from '../instances';
|
|
3
4
|
import type { MaterialSnapshot, RenderableSnapshot } from '../render-system-extract';
|
|
4
5
|
import { RenderScene } from '../scene/render-scene';
|
|
5
6
|
|
|
@@ -93,11 +94,11 @@ describe('RenderScene temporal retry boundary', () => {
|
|
|
93
94
|
});
|
|
94
95
|
|
|
95
96
|
it('keeps last committed root and Instances data across a failed mixed frame and retry', () => {
|
|
96
|
-
const instanceCollections = new
|
|
97
|
-
const
|
|
98
|
-
const initialInstances = instanceCollections.
|
|
99
|
-
instanceCollections.
|
|
100
|
-
const nextInstances = instanceCollections.
|
|
97
|
+
const instanceCollections = new InstanceProjectionStore();
|
|
98
|
+
const source = new World();
|
|
99
|
+
const initialInstances = instanceCollections.project(source, 7, matrices(2, 1));
|
|
100
|
+
instanceCollections.accept(source, 7, initialInstances);
|
|
101
|
+
const nextInstances = instanceCollections.project(source, 7, matrices(3, 9));
|
|
101
102
|
const scene = new RenderScene();
|
|
102
103
|
scene.setTemporalTracking(true);
|
|
103
104
|
try {
|
|
@@ -132,20 +133,19 @@ describe('RenderScene temporal retry boundary', () => {
|
|
|
132
133
|
});
|
|
133
134
|
|
|
134
135
|
it('keeps instance motion valid when stable generations reorder', () => {
|
|
135
|
-
const instanceCollections = new
|
|
136
|
-
const
|
|
137
|
-
const initialInstances = instanceCollections.
|
|
138
|
-
instanceCollections
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
]
|
|
146
|
-
)
|
|
147
|
-
|
|
148
|
-
const reorderedInstances = instanceCollections.snapshot(collection.collectionId).unwrap();
|
|
136
|
+
const instanceCollections = new InstanceProjectionStore();
|
|
137
|
+
const source = new World();
|
|
138
|
+
const initialInstances = instanceCollections.project(source, 7, matrices(2, 1));
|
|
139
|
+
instanceCollections.accept(source, 7, initialInstances);
|
|
140
|
+
// Exercise the temporal consumer's identity remapping directly. World
|
|
141
|
+
// authoring uses ordinal identity; this consumer also accepts reordered projections.
|
|
142
|
+
const reorderedInstances = {
|
|
143
|
+
...instanceCollections.project(source, 7, matrices(2, 9)),
|
|
144
|
+
generations: new Uint32Array([
|
|
145
|
+
initialInstances.generations[1] ?? 0,
|
|
146
|
+
initialInstances.generations[0] ?? 0,
|
|
147
|
+
]),
|
|
148
|
+
};
|
|
149
149
|
const scene = new RenderScene();
|
|
150
150
|
scene.setTemporalTracking(true);
|
|
151
151
|
try {
|
|
@@ -4,10 +4,10 @@ import { boundedReflectionProbeFilterWork } from '../record/typed-frame-graph';
|
|
|
4
4
|
import { advanceProbeFilter, createProbeFilterState } from '../reflection/filter';
|
|
5
5
|
import type { RenderTarget } from '../targets/contracts';
|
|
6
6
|
|
|
7
|
-
const FRAME_COUNT =
|
|
7
|
+
const FRAME_COUNT = 60;
|
|
8
8
|
const target = {} as RenderTarget;
|
|
9
9
|
|
|
10
|
-
describe('RenderTarget and ReflectionProbe
|
|
10
|
+
describe('RenderTarget and ReflectionProbe 60-frame soak contract', () => {
|
|
11
11
|
it('keeps off and settled steady-state work exactly zero', () => {
|
|
12
12
|
const scheduler = createCubeCaptureScheduler({ maxFacesPerFrame: 1 });
|
|
13
13
|
const initialFilter = createProbeFilterState({ probeIndex: 0, faceCount: 6, mipCount: 5 });
|
|
@@ -3,18 +3,18 @@ import { describe, expect, it } from 'vitest';
|
|
|
3
3
|
const scenarios = ['none', 'fxaa', 'taa', 'recovery'] as const;
|
|
4
4
|
|
|
5
5
|
describe('temporal Environment consumer browser contract', () => {
|
|
6
|
-
it('requires every mode to carry a
|
|
6
|
+
it('requires every mode to carry a 60-frame identity', () => {
|
|
7
7
|
const records = scenarios.map((scenario) => ({
|
|
8
8
|
scenario,
|
|
9
9
|
backend: 'browser-webgpu',
|
|
10
|
-
frames:
|
|
10
|
+
frames: 60,
|
|
11
11
|
status: 'pass',
|
|
12
12
|
}));
|
|
13
13
|
expect(records).toHaveLength(4);
|
|
14
14
|
expect(
|
|
15
15
|
records.every(
|
|
16
16
|
(record) =>
|
|
17
|
-
record.backend === 'browser-webgpu' && record.frames >=
|
|
17
|
+
record.backend === 'browser-webgpu' && record.frames >= 60 && record.status === 'pass',
|
|
18
18
|
),
|
|
19
19
|
).toBe(true);
|
|
20
20
|
});
|
|
@@ -6,11 +6,14 @@ describe('temporal Environment consumer Dawn contract', () => {
|
|
|
6
6
|
backend: 'dawn-node',
|
|
7
7
|
runner: 'dawn.node',
|
|
8
8
|
scenarios: 4,
|
|
9
|
-
framesPerScenario:
|
|
9
|
+
framesPerScenario: 60,
|
|
10
10
|
};
|
|
11
11
|
expect(record.backend).toBe('dawn-node');
|
|
12
12
|
expect(record.runner).toBe('dawn.node');
|
|
13
|
-
expect(
|
|
13
|
+
expect(
|
|
14
|
+
record.scenarios * record.framesPerScenario,
|
|
15
|
+
'four temporal scenarios must account for 60 frames each',
|
|
16
|
+
).toBe(240);
|
|
14
17
|
});
|
|
15
18
|
|
|
16
19
|
it('keeps adapter refusal explicit', () => {
|
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
selectNoColorPbrVariant,
|
|
21
21
|
selectPipelineLayoutForVariant,
|
|
22
22
|
shouldDeferMissingPreparedMaterialShader,
|
|
23
|
+
stripCloudShadowBindingsForLowLimit,
|
|
23
24
|
} from '../assembly/factory';
|
|
24
25
|
import { prepareMaterialShaders } from '../assembly/material-shader-policy';
|
|
25
26
|
import {
|
|
@@ -61,6 +62,22 @@ function noColorManifest() {
|
|
|
61
62
|
}
|
|
62
63
|
|
|
63
64
|
describe('material shader variant identity', () => {
|
|
65
|
+
it('lowers the optional cloud shadow bindings on cooked single-source materials', () => {
|
|
66
|
+
const source = `
|
|
67
|
+
@group(0) @binding(16) var cloudShadowMapX: texture_2d<f32>;
|
|
68
|
+
@group(0) @binding(17) var cloudShadowSamplerX: sampler;
|
|
69
|
+
fn cloud_direct_solar_factorX() -> f32 {
|
|
70
|
+
let sampled = textureSampleLevel(cloudShadowMapX, cloudShadowSamplerX, vec2<f32>(0.5), 0.0).x;
|
|
71
|
+
return sampled;
|
|
72
|
+
}
|
|
73
|
+
`;
|
|
74
|
+
const lowered = stripCloudShadowBindingsForLowLimit(source);
|
|
75
|
+
expect(lowered).not.toMatch(/@group\(0\)\s*@binding\((?:16|17)\)/u);
|
|
76
|
+
expect(lowered).not.toContain('cloudShadowMapX');
|
|
77
|
+
expect(lowered).not.toContain('cloudShadowSamplerX');
|
|
78
|
+
expect(lowered).toContain('vec4<f32>(1.0).x');
|
|
79
|
+
});
|
|
80
|
+
|
|
64
81
|
it('defaults a declared coverage-only axis to the opaque boot variant', async () => {
|
|
65
82
|
const entry: MaterialShaderManifestEntry = {
|
|
66
83
|
identifier: 'forgeax::default-standard-pbr',
|
|
@@ -120,7 +137,7 @@ describe('material shader variant identity', () => {
|
|
|
120
137
|
} as never),
|
|
121
138
|
).toEqual({
|
|
122
139
|
requiredFeatures: [],
|
|
123
|
-
requiredLimits: { maxSampledTexturesPerShaderStage:
|
|
140
|
+
requiredLimits: { maxSampledTexturesPerShaderStage: 23 },
|
|
124
141
|
});
|
|
125
142
|
expect(
|
|
126
143
|
deviceOptionsForAdapter({
|
|
@@ -264,6 +281,23 @@ describe('material shader variant identity', () => {
|
|
|
264
281
|
).toBeNull();
|
|
265
282
|
});
|
|
266
283
|
|
|
284
|
+
it('selects the producer-owned clustered layouts for scene-index batches', () => {
|
|
285
|
+
const state = {
|
|
286
|
+
pbrPipelineLayout: 'urp' as never,
|
|
287
|
+
hdrpPbrPipelineLayout: 'hdrp' as never,
|
|
288
|
+
pbrSkinPipelineLayout: 'skin-urp' as never,
|
|
289
|
+
gpuDrivenPbrPipelineLayout: 'gpu-urp' as never,
|
|
290
|
+
gpuDrivenPbrSkinPipelineLayout: 'gpu-skin-urp' as never,
|
|
291
|
+
gpuDrivenClusterPbrPipelineLayout: 'gpu-cluster' as never,
|
|
292
|
+
gpuDrivenClusterPbrSkinPipelineLayout: 'gpu-skin-cluster' as never,
|
|
293
|
+
};
|
|
294
|
+
|
|
295
|
+
expect(selectPipelineLayoutForVariant(state, '', 'gpu-driven-cluster-pbr')).toBe('gpu-cluster');
|
|
296
|
+
expect(selectPipelineLayoutForVariant(state, '', 'gpu-driven-cluster-skin')).toBe(
|
|
297
|
+
'gpu-skin-cluster',
|
|
298
|
+
);
|
|
299
|
+
});
|
|
300
|
+
|
|
267
301
|
it('does not promote an omitted semantic axis to true', () => {
|
|
268
302
|
const resolved = resolveMaterialShaderVariantSet(
|
|
269
303
|
'VERTEX_COLOR_AVAILABLE=true',
|
|
@@ -946,9 +980,9 @@ describe('material shader color-domain contract', () => {
|
|
|
946
980
|
resolve(import.meta.dirname, '../assembly/webgpu-renderer.ts'),
|
|
947
981
|
'utf8',
|
|
948
982
|
);
|
|
949
|
-
expect(source).
|
|
950
|
-
|
|
951
|
-
);
|
|
983
|
+
expect(source).toContain('!singleLayerMedium');
|
|
984
|
+
expect(source).toContain('!clustered');
|
|
985
|
+
expect(source).toContain('isSharedMaterialUserRegionCompatible');
|
|
952
986
|
});
|
|
953
987
|
|
|
954
988
|
it('keeps the fixed standard texture ABI before authored clearcoat slots', () => {
|
|
@@ -960,7 +994,7 @@ describe('material shader color-domain contract', () => {
|
|
|
960
994
|
expect(pipelineSource).toContain(
|
|
961
995
|
'const physicalFields = physicalTextureFields(effectiveSchema)',
|
|
962
996
|
);
|
|
963
|
-
expect(pipelineSource).toContain('appendTextureInjection(
|
|
997
|
+
expect(pipelineSource).toContain('appendTextureInjection(afterSurfaceMedium, physicalFields)');
|
|
964
998
|
expect(recordSource).toContain('BUILTIN_USER_REGION_TEXTURE_FIELDS');
|
|
965
999
|
});
|
|
966
1000
|
|
|
@@ -969,12 +1003,12 @@ describe('material shader color-domain contract', () => {
|
|
|
969
1003
|
resolve(import.meta.dirname, '../assembly/material/pipeline-helpers.ts'),
|
|
970
1004
|
'utf8',
|
|
971
1005
|
);
|
|
972
|
-
expect(source).
|
|
973
|
-
|
|
1006
|
+
expect(source).toMatch(
|
|
1007
|
+
/const sceneIndex =\s+[\s\S]*layoutKind === 'gpu-driven-pbr'[\s\S]*layoutKind === 'gpu-driven-skin'[\s\S]*layoutKind === 'gpu-driven-cluster-pbr'[\s\S]*layoutKind === 'gpu-driven-cluster-skin'/u,
|
|
974
1008
|
);
|
|
975
1009
|
expect(source).toContain('? (vertexEntryPoint ?? authoredVertexEntry)');
|
|
976
1010
|
expect(source).toMatch(
|
|
977
|
-
/const instancesLayout =\s+layoutKind === 'gpu-driven-pbr'
|
|
1011
|
+
/const instancesLayout =\s+[\s\S]*layoutKind === 'gpu-driven-pbr'[\s\S]*layoutKind === 'gpu-driven-skin'[\s\S]*layoutKind === 'gpu-driven-cluster-pbr'[\s\S]*layoutKind === 'gpu-driven-cluster-skin'[\s\S]*state\.gpuDrivenInstancesBindGroupLayout/u,
|
|
978
1012
|
);
|
|
979
1013
|
});
|
|
980
1014
|
});
|
|
@@ -2,6 +2,7 @@ import { describe, expect, it } from 'vitest';
|
|
|
2
2
|
import {
|
|
3
3
|
createContinuationTerminator,
|
|
4
4
|
executeRendererFrameTransaction,
|
|
5
|
+
guardFrameCompletion,
|
|
5
6
|
} from '../assembly/renderer-frame-transaction';
|
|
6
7
|
|
|
7
8
|
describe('renderer frame generation fence', () => {
|
|
@@ -44,4 +45,19 @@ describe('renderer frame generation fence', () => {
|
|
|
44
45
|
expect(terminator.guard('mapAsync')).toBe(false);
|
|
45
46
|
expect(terminator.guard('queue-completion')).toBe(false);
|
|
46
47
|
});
|
|
48
|
+
|
|
49
|
+
it('preserves a producer Result error carried by a fulfilled completion Promise', async () => {
|
|
50
|
+
const error = { code: 'queue-rejected' } as const;
|
|
51
|
+
const result = await guardFrameCompletion<
|
|
52
|
+
void,
|
|
53
|
+
{ code: 'queue-rejected' | 'stale' | 'rejected' }
|
|
54
|
+
>(
|
|
55
|
+
Promise.resolve({ ok: false as const, error }),
|
|
56
|
+
() => true,
|
|
57
|
+
() => ({ code: 'stale' as const }),
|
|
58
|
+
() => ({ code: 'rejected' as const }),
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
expect(result).toEqual({ ok: false, error });
|
|
62
|
+
});
|
|
47
63
|
});
|
|
@@ -259,6 +259,7 @@ function executeReplayCapture(
|
|
|
259
259
|
};
|
|
260
260
|
const frameState = {
|
|
261
261
|
compiledFrameGraph: graph,
|
|
262
|
+
compiledFrameGraphTopologyKey: 'synthetic-capture',
|
|
262
263
|
frameNumber: 13,
|
|
263
264
|
graphTargetCapture:
|
|
264
265
|
captureKind === 'pass-replay'
|
|
@@ -374,7 +375,7 @@ function executeReplayCapture(
|
|
|
374
375
|
describe('renderer successful-submit transaction', () => {
|
|
375
376
|
it('publishes the renderer-created receipt object only after submit', async () => {
|
|
376
377
|
const rendererHost = await constructRenderer(
|
|
377
|
-
{ getContext: () => null },
|
|
378
|
+
{ width: 64, height: 64, getContext: () => null },
|
|
378
379
|
{ rhi },
|
|
379
380
|
{
|
|
380
381
|
shaderManifestUrl: `data:application/json,${encodeURIComponent(
|
|
@@ -382,6 +383,7 @@ describe('renderer successful-submit transaction', () => {
|
|
|
382
383
|
)}`,
|
|
383
384
|
},
|
|
384
385
|
);
|
|
386
|
+
expect((await rendererHost.initialization).ok).toBe(true);
|
|
385
387
|
const renderer = exposeRenderer(rendererHost);
|
|
386
388
|
const events: Array<
|
|
387
389
|
Extract<import('../render-contract').RendererEvent, { kind: 'frame-submitted' }>
|
|
@@ -398,7 +400,7 @@ describe('renderer successful-submit transaction', () => {
|
|
|
398
400
|
camera: { lease: attached.value },
|
|
399
401
|
environment: { lease: attached.value },
|
|
400
402
|
});
|
|
401
|
-
expect(frame.ok).toBe(true);
|
|
403
|
+
expect(frame.ok, frame.ok ? '' : JSON.stringify(frame.error)).toBe(true);
|
|
402
404
|
if (!frame.ok) return;
|
|
403
405
|
expect(events).toHaveLength(1);
|
|
404
406
|
expect(events[0]?.receipt).toBe(frame.value);
|
|
@@ -416,7 +418,7 @@ describe('renderer successful-submit transaction', () => {
|
|
|
416
418
|
|
|
417
419
|
it('fail-closes an all-domain request without an admitted LUT producer', async () => {
|
|
418
420
|
const renderer = await constructRenderer(
|
|
419
|
-
{ getContext: () => null },
|
|
421
|
+
{ width: 64, height: 64, getContext: () => null },
|
|
420
422
|
{ rhi },
|
|
421
423
|
{
|
|
422
424
|
shaderManifestUrl: `data:application/json,${encodeURIComponent(
|
|
@@ -424,6 +426,7 @@ describe('renderer successful-submit transaction', () => {
|
|
|
424
426
|
)}`,
|
|
425
427
|
},
|
|
426
428
|
);
|
|
429
|
+
expect((await renderer.initialization).ok).toBe(true);
|
|
427
430
|
const world = new World();
|
|
428
431
|
const attached = renderer.attach(world);
|
|
429
432
|
expect(attached.ok).toBe(true);
|
|
@@ -433,7 +436,7 @@ describe('renderer successful-submit transaction', () => {
|
|
|
433
436
|
camera: { lease: attached.value },
|
|
434
437
|
environment: { lease: attached.value },
|
|
435
438
|
});
|
|
436
|
-
expect(frame.ok).toBe(true);
|
|
439
|
+
expect(frame.ok, frame.ok ? '' : JSON.stringify(frame.error)).toBe(true);
|
|
437
440
|
if (!frame.ok || frame.value === undefined) return;
|
|
438
441
|
expect(frame.value.graphGeneration).toBeTypeOf('number');
|
|
439
442
|
expect(frame.value.backendId).toBe('null');
|
|
@@ -477,8 +480,18 @@ describe('renderer successful-submit transaction', () => {
|
|
|
477
480
|
JSON.stringify({ schemaVersion: '1.0.0', entries: [] }),
|
|
478
481
|
)}`,
|
|
479
482
|
};
|
|
480
|
-
const firstRenderer = await constructRenderer(
|
|
481
|
-
|
|
483
|
+
const firstRenderer = await constructRenderer(
|
|
484
|
+
{ width: 64, height: 64, getContext: () => null },
|
|
485
|
+
{ rhi },
|
|
486
|
+
options,
|
|
487
|
+
);
|
|
488
|
+
const secondRenderer = await constructRenderer(
|
|
489
|
+
{ width: 64, height: 64, getContext: () => null },
|
|
490
|
+
{ rhi },
|
|
491
|
+
options,
|
|
492
|
+
);
|
|
493
|
+
expect((await firstRenderer.initialization).ok).toBe(true);
|
|
494
|
+
expect((await secondRenderer.initialization).ok).toBe(true);
|
|
482
495
|
const world = new World();
|
|
483
496
|
const attached = firstRenderer.attach(world);
|
|
484
497
|
expect(attached.ok).toBe(true);
|
|
@@ -488,7 +501,7 @@ describe('renderer successful-submit transaction', () => {
|
|
|
488
501
|
camera: { lease: attached.value },
|
|
489
502
|
environment: { lease: attached.value },
|
|
490
503
|
});
|
|
491
|
-
expect(frame.ok).toBe(true);
|
|
504
|
+
expect(frame.ok, frame.ok ? '' : JSON.stringify(frame.error)).toBe(true);
|
|
492
505
|
if (!frame.ok || frame.value === undefined) return;
|
|
493
506
|
expect(frame.value.backendId).toBe('null');
|
|
494
507
|
const crossRenderer = await secondRenderer.observe(frame.value, { include: ['timings'] });
|
|
@@ -573,7 +586,7 @@ describe('renderer successful-submit transaction', () => {
|
|
|
573
586
|
|
|
574
587
|
it('keeps real Renderer observation requests isolated across receipts', async () => {
|
|
575
588
|
const renderer = await constructRenderer(
|
|
576
|
-
{ getContext: () => null },
|
|
589
|
+
{ width: 64, height: 64, getContext: () => null },
|
|
577
590
|
{ rhi },
|
|
578
591
|
{
|
|
579
592
|
shaderManifestUrl: `data:application/json,${encodeURIComponent(
|
|
@@ -581,6 +594,7 @@ describe('renderer successful-submit transaction', () => {
|
|
|
581
594
|
)}`,
|
|
582
595
|
},
|
|
583
596
|
);
|
|
597
|
+
expect((await renderer.initialization).ok).toBe(true);
|
|
584
598
|
const world = new World();
|
|
585
599
|
const attached = renderer.attach(world);
|
|
586
600
|
expect(attached.ok).toBe(true);
|
|
@@ -595,8 +609,8 @@ describe('renderer successful-submit transaction', () => {
|
|
|
595
609
|
camera: { lease: attached.value },
|
|
596
610
|
environment: { lease: attached.value },
|
|
597
611
|
});
|
|
598
|
-
expect(first.ok).toBe(true);
|
|
599
|
-
expect(second.ok).toBe(true);
|
|
612
|
+
expect(first.ok, first.ok ? '' : JSON.stringify(first.error)).toBe(true);
|
|
613
|
+
expect(second.ok, second.ok ? '' : JSON.stringify(second.error)).toBe(true);
|
|
600
614
|
if (!first.ok || !second.ok || first.value === undefined || second.value === undefined) return;
|
|
601
615
|
const firstPending = renderer.observe(first.value, {
|
|
602
616
|
include: ['timings', 'linear-hdr', 'linear-ldr', 'final-srgb'],
|
|
@@ -1110,6 +1124,7 @@ describe('renderer successful-submit transaction', () => {
|
|
|
1110
1124
|
expect(compiled.ok).toBe(true);
|
|
1111
1125
|
if (!compiled.ok) return;
|
|
1112
1126
|
frameState.compiledFrameGraph = compiled.value;
|
|
1127
|
+
frameState.compiledFrameGraphTopologyKey = 'temporal-readiness-probe';
|
|
1113
1128
|
const submits = vi.spyOn(device.queue, 'submit');
|
|
1114
1129
|
const errors = new RhiErrorListenerRegistry();
|
|
1115
1130
|
const result = executeCompiledFrameGraph(
|
|
@@ -1183,6 +1198,7 @@ describe('renderer successful-submit transaction', () => {
|
|
|
1183
1198
|
getTemporalParamsBuffer(candidate);
|
|
1184
1199
|
const graph = await buildTemporalResolveGraph(device);
|
|
1185
1200
|
frameState.compiledFrameGraph = graph;
|
|
1201
|
+
frameState.compiledFrameGraphTopologyKey = 'temporal-resolve';
|
|
1186
1202
|
|
|
1187
1203
|
const failure = new RhiError({
|
|
1188
1204
|
code: 'webgpu-runtime-error',
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { inspectResourceClassSplits } from '../gpu-driven/batch-topology';
|
|
3
|
+
import {
|
|
4
|
+
combineGpuResourceAllocationInspections,
|
|
5
|
+
GpuResourceAllocationLedger,
|
|
6
|
+
} from '../gpu-driven/resource-allocation';
|
|
7
|
+
|
|
8
|
+
describe('GPU resource allocation ownership', () => {
|
|
9
|
+
it('keeps replacement coexistence through fence retirement and release', () => {
|
|
10
|
+
const ledger = new GpuResourceAllocationLedger();
|
|
11
|
+
const first = ledger.allocate(64);
|
|
12
|
+
const second = ledger.allocate(128);
|
|
13
|
+
|
|
14
|
+
expect(ledger.inspect()).toMatchObject({
|
|
15
|
+
liveBytes: 192,
|
|
16
|
+
pendingRetirementBytes: 0,
|
|
17
|
+
peakBytes: 192,
|
|
18
|
+
});
|
|
19
|
+
ledger.retire(first);
|
|
20
|
+
expect(ledger.inspect()).toMatchObject({
|
|
21
|
+
liveBytes: 128,
|
|
22
|
+
pendingRetirementBytes: 64,
|
|
23
|
+
peakBytes: 192,
|
|
24
|
+
});
|
|
25
|
+
ledger.release(first);
|
|
26
|
+
expect(ledger.inspect()).toMatchObject({
|
|
27
|
+
liveBytes: 128,
|
|
28
|
+
pendingRetirementBytes: 0,
|
|
29
|
+
retiredBytes: 64,
|
|
30
|
+
});
|
|
31
|
+
ledger.release(second);
|
|
32
|
+
expect(ledger.inspect()).toMatchObject({
|
|
33
|
+
liveBytes: 0,
|
|
34
|
+
pendingRetirementBytes: 0,
|
|
35
|
+
retiredBytes: 192,
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('records failed allocation rollback without leaving live bytes', () => {
|
|
40
|
+
const ledger = new GpuResourceAllocationLedger();
|
|
41
|
+
const token = ledger.allocate(256);
|
|
42
|
+
ledger.rollback(token);
|
|
43
|
+
expect(ledger.inspect()).toMatchObject({
|
|
44
|
+
liveBytes: 0,
|
|
45
|
+
failedAllocationRollbacks: 1,
|
|
46
|
+
failedAllocationRollbackBytes: 256,
|
|
47
|
+
peakBytes: 256,
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('attributes only resourceIdentity changes as resource-class splits', () => {
|
|
52
|
+
const base = {
|
|
53
|
+
generation: 0,
|
|
54
|
+
key: {
|
|
55
|
+
assetHandle: 1,
|
|
56
|
+
drawKind: 'indexed' as const,
|
|
57
|
+
first: 0,
|
|
58
|
+
count: 3,
|
|
59
|
+
baseVertex: 0,
|
|
60
|
+
materialSlot: 0,
|
|
61
|
+
topology: 'triangle-list' as const,
|
|
62
|
+
pipelineClass: 'pbr',
|
|
63
|
+
materialResourceClass: 'water-a',
|
|
64
|
+
resourceIdentity: 'water-a',
|
|
65
|
+
},
|
|
66
|
+
candidates: [],
|
|
67
|
+
visibleBase: 0,
|
|
68
|
+
visibleCapacity: 0,
|
|
69
|
+
indirectOffset: 0,
|
|
70
|
+
};
|
|
71
|
+
const sameClass = { ...base, batchId: 0 };
|
|
72
|
+
const secondRange = {
|
|
73
|
+
...base,
|
|
74
|
+
batchId: 1,
|
|
75
|
+
key: { ...base.key, first: 3, count: 6 },
|
|
76
|
+
};
|
|
77
|
+
expect(inspectResourceClassSplits({ batches: [sameClass, secondRange] })).toMatchObject({
|
|
78
|
+
resourceClassCount: 1,
|
|
79
|
+
resourceClassSplitReasons: [],
|
|
80
|
+
});
|
|
81
|
+
const changedClass = {
|
|
82
|
+
...secondRange,
|
|
83
|
+
key: { ...secondRange.key, resourceIdentity: 'water-b' },
|
|
84
|
+
};
|
|
85
|
+
expect(inspectResourceClassSplits({ batches: [sameClass, changedClass] })).toMatchObject({
|
|
86
|
+
resourceClassCount: 2,
|
|
87
|
+
resourceClassSplitReasons: ['resource-class:water-a', 'resource-class:water-b'],
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it('combines owner facts without claiming physical residency', () => {
|
|
92
|
+
const ledger = new GpuResourceAllocationLedger();
|
|
93
|
+
ledger.allocate(32);
|
|
94
|
+
const combined = combineGpuResourceAllocationInspections([ledger.inspect()]);
|
|
95
|
+
expect(combined).toMatchObject({
|
|
96
|
+
unit: 'engine-allocation-bytes',
|
|
97
|
+
physicalResidency: 'unknown',
|
|
98
|
+
liveBytes: 32,
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
it('does not add historical peaks from owners with no simultaneous occupancy', () => {
|
|
103
|
+
const first = new GpuResourceAllocationLedger();
|
|
104
|
+
const firstToken = first.allocate(64);
|
|
105
|
+
first.retire(firstToken);
|
|
106
|
+
first.release(firstToken);
|
|
107
|
+
|
|
108
|
+
const second = new GpuResourceAllocationLedger();
|
|
109
|
+
const secondToken = second.allocate(128);
|
|
110
|
+
second.retire(secondToken);
|
|
111
|
+
second.release(secondToken);
|
|
112
|
+
|
|
113
|
+
expect(
|
|
114
|
+
combineGpuResourceAllocationInspections([first.inspect(), second.inspect()]),
|
|
115
|
+
).toMatchObject({
|
|
116
|
+
liveBytes: 0,
|
|
117
|
+
pendingRetirementBytes: 0,
|
|
118
|
+
// The owner-local peaks are historical and happened in separate
|
|
119
|
+
// replacement windows; their sum is not an aggregate high-water mark.
|
|
120
|
+
peakBytes: 128,
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
});
|