@forgeax/engine-runtime 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -83
- package/dist/.tsbuildinfo +1 -1
- package/dist/__tests__/animation-graph-collect-roundtrip.test.d.ts +2 -0
- package/dist/__tests__/animation-graph-collect-roundtrip.test.d.ts.map +1 -0
- package/dist/__tests__/animation-graph-serialize.unit.test.d.ts +2 -0
- package/dist/__tests__/animation-graph-serialize.unit.test.d.ts.map +1 -0
- package/dist/__tests__/asset-brand-and-name-retirement.test.d.ts +2 -0
- package/dist/__tests__/asset-brand-and-name-retirement.test.d.ts.map +1 -0
- package/dist/__tests__/asset-error-exhaustive.test-d.d.ts +11 -0
- package/dist/__tests__/asset-error-exhaustive.test-d.d.ts.map +1 -0
- package/dist/__tests__/asset-registry-guid-reverse.test.d.ts +2 -0
- package/dist/__tests__/asset-registry-guid-reverse.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry-hdr-equirect.test.d.ts +2 -0
- package/dist/__tests__/asset-registry-hdr-equirect.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry-mesh-pack-payload.dawn.test.d.ts +2 -0
- package/dist/__tests__/asset-registry-mesh-pack-payload.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry-mounts.test.d.ts +2 -0
- package/dist/__tests__/asset-registry-mounts.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry.browser.test.d.ts +2 -0
- package/dist/__tests__/asset-registry.browser.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry.dawn.test.d.ts +2 -0
- package/dist/__tests__/asset-registry.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry.listCatalog.test.d.ts +2 -0
- package/dist/__tests__/asset-registry.listCatalog.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry.mesh-bin.test.d.ts +2 -0
- package/dist/__tests__/asset-registry.mesh-bin.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry.pack-cache.test.d.ts +2 -0
- package/dist/__tests__/asset-registry.pack-cache.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry.raw-container-failfast.test.d.ts +2 -0
- package/dist/__tests__/asset-registry.raw-container-failfast.test.d.ts.map +1 -0
- package/dist/__tests__/asset-registry.recursive.spec.d.ts +2 -0
- package/dist/__tests__/asset-registry.recursive.spec.d.ts.map +1 -0
- package/dist/__tests__/asset-registry.unit.test.d.ts +2 -0
- package/dist/__tests__/asset-registry.unit.test.d.ts.map +1 -0
- package/dist/__tests__/asset.unit.test.d.ts +2 -0
- package/dist/__tests__/asset.unit.test.d.ts.map +1 -0
- package/dist/__tests__/audio-load-by-guid.unit.test.d.ts +2 -0
- package/dist/__tests__/audio-load-by-guid.unit.test.d.ts.map +1 -0
- package/dist/__tests__/backend-selection.integration.test.d.ts +2 -0
- package/dist/__tests__/backend-selection.integration.test.d.ts.map +1 -0
- package/dist/__tests__/basis-catalog-dispatch.integration.test.d.ts +2 -0
- package/dist/__tests__/basis-catalog-dispatch.integration.test.d.ts.map +1 -0
- package/dist/__tests__/builtin-asset-registry.unit.test.d.ts +2 -0
- package/dist/__tests__/builtin-asset-registry.unit.test.d.ts.map +1 -0
- package/dist/__tests__/collect-scene-asset.test.d.ts +1 -2
- package/dist/__tests__/collect-scene-asset.test.d.ts.map +1 -1
- package/dist/__tests__/collect-scene-mount-collapse.test.d.ts +2 -0
- package/dist/__tests__/collect-scene-mount-collapse.test.d.ts.map +1 -0
- package/dist/__tests__/collect-transient-roundtrip.test.d.ts +1 -1
- package/dist/__tests__/collect-transient-roundtrip.test.d.ts.map +1 -1
- package/dist/__tests__/collect-transient-skip.test.d.ts +1 -2
- package/dist/__tests__/collect-transient-skip.test.d.ts.map +1 -1
- package/dist/__tests__/compressed-texture-physical-extent.integration.test.d.ts +2 -0
- package/dist/__tests__/compressed-texture-physical-extent.integration.test.d.ts.map +1 -0
- package/dist/__tests__/dawn/mesh-update-dawn.test.d.ts +2 -0
- package/dist/__tests__/dawn/mesh-update-dawn.test.d.ts.map +1 -0
- package/dist/__tests__/dawn/upload-texture.dawn.test.d.ts +2 -0
- package/dist/__tests__/dawn/upload-texture.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/draw-published.d.ts +2 -2
- package/dist/__tests__/draw-published.d.ts.map +1 -1
- package/dist/__tests__/dynamic-texture-store.unit.test.d.ts +2 -0
- package/dist/__tests__/dynamic-texture-store.unit.test.d.ts.map +1 -0
- package/dist/__tests__/errors.unit.test.d.ts +2 -0
- package/dist/__tests__/errors.unit.test.d.ts.map +1 -0
- package/dist/__tests__/extract-skin-mismatch.unit.test.d.ts +2 -0
- package/dist/__tests__/extract-skin-mismatch.unit.test.d.ts.map +1 -0
- package/dist/__tests__/fetch-binary-decompress.test.d.ts +2 -0
- package/dist/__tests__/fetch-binary-decompress.test.d.ts.map +1 -0
- package/dist/__tests__/four-path-compression.integration.test.d.ts +2 -0
- package/dist/__tests__/four-path-compression.integration.test.d.ts.map +1 -0
- package/dist/__tests__/fullscreen-feature-host.dawn.test.d.ts +2 -0
- package/dist/__tests__/fullscreen-feature-host.dawn.test.d.ts.map +1 -0
- package/dist/__tests__/guid-for-asset.unit.test.d.ts +2 -0
- package/dist/__tests__/guid-for-asset.unit.test.d.ts.map +1 -0
- package/dist/__tests__/handle-migration.test.d.ts +2 -0
- package/dist/__tests__/handle-migration.test.d.ts.map +1 -0
- package/dist/__tests__/helpers/register-runtime-components.d.ts.map +1 -1
- package/dist/__tests__/host-custom-kind-contract.test-d.d.ts +2 -0
- package/dist/__tests__/host-custom-kind-contract.test-d.d.ts.map +1 -0
- package/dist/__tests__/host-custom-kind-contract.test.d.ts +2 -0
- package/dist/__tests__/host-custom-kind-contract.test.d.ts.map +1 -0
- package/dist/__tests__/inspect-name.test.d.ts +2 -0
- package/dist/__tests__/inspect-name.test.d.ts.map +1 -0
- package/dist/__tests__/instantiate-mount-deferred-wiring.test.d.ts +2 -0
- package/dist/__tests__/instantiate-mount-deferred-wiring.test.d.ts.map +1 -0
- package/dist/__tests__/loadbyguid-payload.unit.test.d.ts +2 -0
- package/dist/__tests__/loadbyguid-payload.unit.test.d.ts.map +1 -0
- package/dist/__tests__/loadbyguid-texture-intern.unit.test.d.ts +2 -0
- package/dist/__tests__/loadbyguid-texture-intern.unit.test.d.ts.map +1 -0
- package/dist/__tests__/loader-extract-graceful.test.d.ts +2 -0
- package/dist/__tests__/loader-extract-graceful.test.d.ts.map +1 -0
- package/dist/__tests__/loader-name-survival.test.d.ts +2 -0
- package/dist/__tests__/loader-name-survival.test.d.ts.map +1 -0
- package/dist/__tests__/mesh-bin-contract.test.d.ts +2 -0
- package/dist/__tests__/mesh-bin-contract.test.d.ts.map +1 -0
- package/dist/__tests__/mesh-bin-skin-roundtrip.unit.test.d.ts +2 -0
- package/dist/__tests__/mesh-bin-skin-roundtrip.unit.test.d.ts.map +1 -0
- package/dist/__tests__/mesh-bin.test.d.ts +2 -0
- package/dist/__tests__/mesh-bin.test.d.ts.map +1 -0
- package/dist/__tests__/mesh-loader-skin-contract.unit.test.d.ts +2 -0
- package/dist/__tests__/mesh-loader-skin-contract.unit.test.d.ts.map +1 -0
- package/dist/__tests__/new-kind-refs-contract.test.d.ts +2 -0
- package/dist/__tests__/new-kind-refs-contract.test.d.ts.map +1 -0
- package/dist/__tests__/package-promotion.test.d.ts +2 -0
- package/dist/__tests__/package-promotion.test.d.ts.map +1 -0
- package/dist/__tests__/package-rename.test.d.ts +2 -0
- package/dist/__tests__/package-rename.test.d.ts.map +1 -0
- package/dist/__tests__/recover-error-exhaustive.test-d.d.ts +1 -1
- package/dist/__tests__/recover-error-exhaustive.test-d.d.ts.map +1 -1
- package/dist/__tests__/render-error-exhaustive.test-d.d.ts +1 -1
- package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +1 -1
- package/dist/__tests__/render-feature-prepared-graphics.fixture.d.ts +10 -0
- package/dist/__tests__/render-feature-prepared-graphics.fixture.d.ts.map +1 -0
- package/dist/__tests__/render-system-extract.unit.test.d.ts +2 -0
- package/dist/__tests__/render-system-extract.unit.test.d.ts.map +1 -0
- package/dist/__tests__/renderer-test-utils.d.ts +10 -0
- package/dist/__tests__/renderer-test-utils.d.ts.map +1 -0
- package/dist/__tests__/renderer.test-d.d.ts +2 -0
- package/dist/__tests__/renderer.test-d.d.ts.map +1 -0
- package/dist/__tests__/resolve-asset-handle-err.test.d.ts +2 -0
- package/dist/__tests__/resolve-asset-handle-err.test.d.ts.map +1 -0
- package/dist/__tests__/resolve-asset-handle.unit.test.d.ts +2 -0
- package/dist/__tests__/resolve-asset-handle.unit.test.d.ts.map +1 -0
- package/dist/__tests__/resolveName-fallback.test.d.ts +2 -0
- package/dist/__tests__/resolveName-fallback.test.d.ts.map +1 -0
- package/dist/__tests__/resolveName-null-package.test.d.ts +2 -0
- package/dist/__tests__/resolveName-null-package.test.d.ts.map +1 -0
- package/dist/__tests__/resolveName-unified-entry.test.d.ts +2 -0
- package/dist/__tests__/resolveName-unified-entry.test.d.ts.map +1 -0
- package/dist/__tests__/resolveName.test.d.ts +2 -0
- package/dist/__tests__/resolveName.test.d.ts.map +1 -0
- package/dist/__tests__/roots-to-scene-asset.test.d.ts +1 -1
- package/dist/__tests__/roots-to-scene-asset.test.d.ts.map +1 -1
- package/dist/__tests__/roundtrip-primitive.test.d.ts +2 -0
- package/dist/__tests__/roundtrip-primitive.test.d.ts.map +1 -0
- package/dist/__tests__/scene-bare-guid-refs-instantiate.test.d.ts +2 -0
- package/dist/__tests__/scene-bare-guid-refs-instantiate.test.d.ts.map +1 -0
- package/dist/__tests__/scene-instance-authoring.integration.test.d.ts +2 -0
- package/dist/__tests__/scene-instance-authoring.integration.test.d.ts.map +1 -0
- package/dist/__tests__/scene-mount-fixed-point.test.d.ts +2 -0
- package/dist/__tests__/scene-mount-fixed-point.test.d.ts.map +1 -0
- package/dist/__tests__/scene-mount-roundtrip.test.d.ts +2 -0
- package/dist/__tests__/scene-mount-roundtrip.test.d.ts.map +1 -0
- package/dist/__tests__/scene-mount-wrapper-roundtrip.test.d.ts +2 -0
- package/dist/__tests__/scene-mount-wrapper-roundtrip.test.d.ts.map +1 -0
- package/dist/__tests__/scene-sugar-instantiate.test.d.ts +2 -0
- package/dist/__tests__/scene-sugar-instantiate.test.d.ts.map +1 -0
- package/dist/__tests__/serialize-mounts-roundtrip.test.d.ts +2 -0
- package/dist/__tests__/serialize-mounts-roundtrip.test.d.ts.map +1 -0
- package/dist/__tests__/serialize-scene-asset.test.d.ts +1 -1
- package/dist/__tests__/serialize-scene-asset.test.d.ts.map +1 -1
- package/dist/__tests__/template-game-default-api-contract.test.d.ts +2 -0
- package/dist/__tests__/template-game-default-api-contract.test.d.ts.map +1 -0
- package/dist/__tests__/tileset-asset-validate.test.d.ts +2 -0
- package/dist/__tests__/tileset-asset-validate.test.d.ts.map +1 -0
- package/dist/__tests__/transcode-fallback.unit.test.d.ts +2 -0
- package/dist/__tests__/transcode-fallback.unit.test.d.ts.map +1 -0
- package/dist/__tests__/transient-runtime-behavior.test.d.ts +2 -0
- package/dist/__tests__/transient-runtime-behavior.test.d.ts.map +1 -0
- package/dist/__tests__/video-loader-consumption.test.d.ts +2 -0
- package/dist/__tests__/video-loader-consumption.test.d.ts.map +1 -0
- package/dist/__tests__/video-loader-smoke.dawn.test.d.ts +2 -0
- package/dist/__tests__/video-loader-smoke.dawn.test.d.ts.map +1 -0
- package/dist/backend-selection.d.ts +13 -0
- package/dist/backend-selection.d.ts.map +1 -0
- package/dist/collect-scene-asset.d.ts +3 -3
- package/dist/collect-scene-asset.d.ts.map +1 -1
- package/dist/createRenderer.d.ts +14 -2
- package/dist/createRenderer.d.ts.map +1 -1
- package/dist/errors/environment.d.ts +1 -1
- package/dist/errors/environment.d.ts.map +1 -1
- package/dist/index.d.ts +19 -81
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +105 -108
- package/dist/index.mjs.map +1 -1
- package/dist/renderer-host.d.ts +9 -0
- package/dist/renderer-host.d.ts.map +1 -0
- package/dist/renderer-host.mjs +62 -0
- package/dist/renderer-host.mjs.map +1 -0
- package/dist/scene-instances/index.d.ts +2 -0
- package/dist/scene-instances/index.d.ts.map +1 -0
- package/dist/scene-utils/mount-override-fold.d.ts +1 -2
- package/dist/scene-utils/mount-override-fold.d.ts.map +1 -1
- package/dist/systems/sprite-animation-tick.d.ts +1 -1
- package/dist/systems/sprite-animation-tick.d.ts.map +1 -1
- package/dist/systems/transparent-sort.d.ts +1 -2
- package/dist/systems/transparent-sort.d.ts.map +1 -1
- package/dist/tilemap-register-validate.d.ts.map +1 -1
- package/package.json +34 -33
- package/src/__tests__/active-camera.unit.test.ts +19 -9
- package/src/__tests__/animation-graph-collect-roundtrip.test.ts +213 -0
- package/src/__tests__/animation-graph-serialize.unit.test.ts +171 -0
- package/src/__tests__/append-injection.test.ts +1 -1
- package/src/__tests__/asset-brand-and-name-retirement.test.ts +102 -0
- package/src/__tests__/asset-error-exhaustive.test-d.ts +62 -0
- package/src/__tests__/asset-registry-guid-reverse.test.ts +575 -0
- package/src/__tests__/asset-registry-hdr-equirect.test.ts +78 -0
- package/src/__tests__/asset-registry-mesh-pack-payload.dawn.test.ts +232 -0
- package/src/__tests__/asset-registry-mounts.test.ts +806 -0
- package/src/__tests__/asset-registry.browser.test.ts +81 -0
- package/src/__tests__/asset-registry.dawn.test.ts +94 -0
- package/src/__tests__/asset-registry.listCatalog.test.ts +170 -0
- package/src/__tests__/asset-registry.mesh-bin.test.ts +316 -0
- package/src/__tests__/asset-registry.pack-cache.test.ts +969 -0
- package/src/__tests__/asset-registry.raw-container-failfast.test.ts +225 -0
- package/src/__tests__/asset-registry.recursive.spec.ts +1397 -0
- package/src/__tests__/asset-registry.unit.test.ts +1030 -0
- package/src/__tests__/asset.unit.test.ts +7107 -0
- package/src/__tests__/audio-load-by-guid.unit.test.ts +126 -0
- package/src/__tests__/backend-selection.integration.test.ts +11 -0
- package/src/__tests__/basis-catalog-dispatch.integration.test.ts +320 -0
- package/src/__tests__/bind-group-cache-keying.test.ts +4 -4
- package/src/__tests__/block-upload-math.unit.test.ts +2 -2
- package/src/__tests__/builtin-asset-registry.unit.test.ts +112 -0
- package/src/__tests__/builtin-shader-register-e2e.test.ts +1 -1
- package/src/__tests__/cache-false-eviction.test.ts +2 -1
- package/src/__tests__/cache-isolation-matrix.test.ts +2 -1
- package/src/__tests__/camera-clear-snapshot-equivalence.unit.test.ts +5 -6
- package/src/__tests__/clamp-to-last.e2e.browser.test.ts +29 -19
- package/src/__tests__/collect-scene-asset.test.ts +49 -52
- package/src/__tests__/collect-scene-mount-collapse.test.ts +391 -0
- package/src/__tests__/collect-subtree.unit.test.ts +1 -2
- package/src/__tests__/collect-transient-children-absent.test.ts +24 -10
- package/src/__tests__/collect-transient-roundtrip.test.ts +44 -20
- package/src/__tests__/collect-transient-skip.test.ts +24 -13
- package/src/__tests__/components.test-d.ts +1 -6
- package/src/__tests__/components.unit.test.ts +20 -19
- package/src/__tests__/composite-skybox-cross-world.browser.test.ts +59 -27
- package/src/__tests__/compressed-texture-physical-extent.integration.test.ts +139 -0
- package/src/__tests__/create-renderer-assembly.integration.test.ts +42 -29
- package/src/__tests__/createRenderer-dispose.test.ts +35 -402
- package/src/__tests__/createRenderer.browser-no-webgpu.test.ts +25 -30
- package/src/__tests__/createRenderer.unit.test.ts +1 -1
- package/src/__tests__/dawn/hello-sprite-nineslice-section.dawn.test.ts +27 -63
- package/src/__tests__/dawn/ibl-precompute-readback.dawn.test.ts +56 -47
- package/src/__tests__/dawn/instances-per-instance-pbr.dawn.test.ts +49 -29
- package/src/__tests__/dawn/instances-shadow.dawn.test.ts +26 -15
- package/src/__tests__/dawn/instances-uniform-fallback.dawn.test.ts +13 -14
- package/src/__tests__/dawn/material-alpha.dawn.test.ts +23 -31
- package/src/__tests__/dawn/material-cooked-fixture.dawn.test.ts +0 -18
- package/src/__tests__/dawn/{mesh-update.dawn.test.ts → mesh-update-dawn.test.ts} +42 -134
- package/src/__tests__/dawn/mipmap-srgb-linear.dawn.test.ts +14 -7
- package/src/__tests__/dawn/per-entity-material-texture-isolation.dawn.test.ts +16 -28
- package/src/__tests__/dawn/sprite-nineslice-mesh-bind.dawn.test.ts +23 -39
- package/src/__tests__/dawn/upload-texture.dawn.test.ts +198 -0
- package/src/__tests__/dawn/user-handle-mesh-render.dawn.test.ts +12 -14
- package/src/__tests__/dawn/user-mesh-upload.dawn.test.ts +27 -22
- package/src/__tests__/dawn/zero-manifest-mesh-fail.dawn.test.ts +25 -28
- package/src/__tests__/dawn/zero-manifest-ready.dawn.test.ts +10 -11
- package/src/__tests__/demo-sortscope-migration.unit.test.ts +5 -5
- package/src/__tests__/derive-bgl-integration.test.ts +34 -44
- package/src/__tests__/derive-render-data-skin.unit.test.ts +1 -1
- package/src/__tests__/draw-published.ts +11 -4
- package/src/__tests__/dynamic-texture-store.unit.test.ts +190 -0
- package/src/__tests__/equirect-bc6h.integration.test.ts +144 -21
- package/src/__tests__/errors.unit.test.ts +1203 -0
- package/src/__tests__/extract-frames-graceful-degradation.test.ts +3 -7
- package/src/__tests__/extract-frames-merge.test.ts +35 -22
- package/src/__tests__/extract-record-no-hardcoded-texture-fields.test.ts +5 -16
- package/src/__tests__/extract-skin-mismatch.unit.test.ts +322 -0
- package/src/__tests__/fetch-binary-decompress.test.ts +356 -0
- package/src/__tests__/four-path-compression.integration.test.ts +395 -0
- package/src/__tests__/frame-targets-shadow-regression.unit.test.ts +1 -1
- package/src/__tests__/fullscreen-feature-host.dawn.test.ts +80 -0
- package/src/__tests__/fullscreen-post-bgl-depth.test.ts +4 -2
- package/src/__tests__/fullscreen-post-depth-params-arity.test.ts +3 -3
- package/src/__tests__/fullscreen-post-process-pass.dawn.test.ts +39 -23
- package/src/__tests__/fullscreen-post-process-pass.unit.test.ts +4 -2
- package/src/__tests__/fxaa-pixel-diff.dawn.test.ts +28 -17
- package/src/__tests__/fxaa-validation-and-resize.dawn.test.ts +29 -18
- package/src/__tests__/fxaa-zero-overhead.dawn.test.ts +16 -12
- package/src/__tests__/geometry.unit.test.ts +525 -159
- package/src/__tests__/glyph-tilemap-worldid.test.ts +1 -1
- package/src/__tests__/gpu-resource-cow-survivor.test.ts +6 -4
- package/src/__tests__/guid-for-asset.unit.test.ts +102 -0
- package/src/__tests__/handle-migration.test.ts +136 -0
- package/src/__tests__/helpers/register-runtime-components.ts +4 -2
- package/src/__tests__/helpers/register-scene-components.ts +1 -1
- package/src/__tests__/host-custom-kind-contract.test-d.ts +47 -0
- package/src/__tests__/host-custom-kind-contract.test.ts +578 -0
- package/src/__tests__/inspect-name.test.ts +139 -0
- package/src/__tests__/instances.test-d.ts +1 -1
- package/src/__tests__/instantiate-mount-deferred-wiring.test.ts +112 -0
- package/src/__tests__/light-casters-9-light.browser.test.ts +73 -76
- package/src/__tests__/light-gpu-byte-neutral.unit.test.ts +7 -10
- package/src/__tests__/light-snapshot.test-d.ts +2 -2
- package/src/__tests__/lights-vec-negative.unit.test.ts +1 -1
- package/src/__tests__/lights.unit.test.ts +16 -500
- package/src/__tests__/loadbyguid-payload.unit.test.ts +117 -0
- package/src/__tests__/loadbyguid-texture-intern.unit.test.ts +213 -0
- package/src/__tests__/loader-extract-graceful.test.ts +146 -0
- package/src/__tests__/loader-name-survival.test.ts +213 -0
- package/src/__tests__/m3-vec-negative.unit.test.ts +3 -2
- package/src/__tests__/material-texture-uv-scale.unit.test.ts +101 -31
- package/src/__tests__/materials.unit.test.ts +10 -27
- package/src/__tests__/mesh-bin-contract.test.ts +28 -0
- package/src/__tests__/mesh-bin-skin-roundtrip.unit.test.ts +149 -0
- package/src/__tests__/mesh-bin.test.ts +38 -0
- package/src/__tests__/mesh-loader-skin-contract.unit.test.ts +120 -0
- package/src/__tests__/mesh-ssbo-grow.unit.test.ts +3 -3
- package/src/__tests__/mip-gate.unit.test.ts +1 -1
- package/src/__tests__/msaa-sprite-pixel-diff.dawn.test.ts +29 -68
- package/src/__tests__/new-kind-refs-contract.test.ts +132 -0
- package/src/__tests__/node-shims.d.ts +4 -6
- package/src/__tests__/package-promotion.test.ts +88 -0
- package/src/__tests__/package-rename.test.ts +103 -0
- package/src/__tests__/pass-selector.unit.test.ts +2 -2
- package/src/__tests__/pbr-pipeline.unit.test.ts +14 -21
- package/src/__tests__/pipeline-builder-msaa.unit.test.ts +6 -9
- package/src/__tests__/pipeline-cache-keying.unit.test.ts +6 -9
- package/src/__tests__/pipeline-spec.test.ts +16 -177
- package/src/__tests__/pipeline.unit.test.ts +154 -1693
- package/src/__tests__/point-light-shadow.dawn.test.ts +33 -42
- package/src/__tests__/point-light-shadow.unit.test.ts +19 -60
- package/src/__tests__/post-process-error-codes.unit.test.ts +4 -1
- package/src/__tests__/post-process-params-component.unit.test.ts +1 -1
- package/src/__tests__/post-process-params-extract.unit.test.ts +2 -5
- package/src/__tests__/postprocess-camera-consistency.test.ts +4 -7
- package/src/__tests__/profiler-assembly.integration.test.ts +1 -1
- package/src/__tests__/propagate-transforms.dawn.test.ts +12 -11
- package/src/__tests__/record-worldid-isolation.test.ts +7 -29
- package/src/__tests__/recover-error-exhaustive.test-d.ts +1 -1
- package/src/__tests__/render-error-exhaustive.test-d.ts +81 -71
- package/src/__tests__/render-feature-assembly.test-d.ts +20 -9
- package/src/__tests__/render-feature-prepared-graphics-docs.unit.test.ts +8 -6
- package/src/__tests__/render-feature-prepared-graphics.browser.test.ts +60 -558
- package/src/__tests__/render-feature-prepared-graphics.dawn.test.ts +57 -544
- package/src/__tests__/render-feature-prepared-graphics.fixture.ts +104 -0
- package/src/__tests__/render-feature-prepared-graphics.integration.test.ts +40 -248
- package/src/__tests__/render-feature-prepared-graphics.regression.integration.test.ts +83 -340
- package/src/__tests__/render-feature-recover.integration.test.ts +9 -49
- package/src/__tests__/render-feature-runtime-surface.test-d.ts +17 -20
- package/src/__tests__/render-schema-consumer.integration.test.ts +20 -13
- package/src/__tests__/render-schema-owner-boundary.unit.test.ts +2 -6
- package/src/__tests__/render-system-cross-world-overlay-queue.test.ts +5 -5
- package/src/__tests__/render-system-extract-dispatch-ordering.test.ts +16 -31
- package/src/__tests__/render-system-extract.test.ts +36 -51
- package/src/__tests__/render-system-extract.unit.test.ts +360 -0
- package/src/__tests__/render-system-fold-bucket.unit.test.ts +3 -5
- package/src/__tests__/render-system-fold-fallback.unit.test.ts +6 -3
- package/src/__tests__/render-system-fold-material.unit.test.ts +3 -5
- package/src/__tests__/render-system-fold-metrics.unit.test.ts +5 -5
- package/src/__tests__/render-system-fold-modegate.unit.test.ts +6 -6
- package/src/__tests__/render-system-fold.dawn.test.ts +7 -5
- package/src/__tests__/render-system-mega.test.ts +292 -190
- package/src/__tests__/render-system-owner-split-contract.test.ts +10 -32
- package/src/__tests__/render-system-record-multi-material-textureview.test.ts +59 -45
- package/src/__tests__/render-system-record-per-submesh-transparency.test.ts +23 -29
- package/src/__tests__/render-system-record.test.ts +398 -235
- package/src/__tests__/render-system-record.unit.test.ts +25 -26
- package/src/__tests__/render-system-skin-bg.unit.test.ts +8 -12
- package/src/__tests__/renderer-consumer.test-d.ts +16 -3
- package/src/__tests__/renderer-health.unit.test.ts +26 -916
- package/src/__tests__/renderer-lifecycle.integration.test.ts +19 -6
- package/src/__tests__/renderer-recover.unit.test.ts +49 -1069
- package/src/__tests__/renderer-result.test-d.ts +19 -9
- package/src/__tests__/renderer-surface.unit.test.ts +3 -5
- package/src/__tests__/renderer-test-utils.ts +56 -0
- package/src/__tests__/renderer.test-d.ts +59 -0
- package/src/__tests__/resolve-asset-handle-err.test.ts +111 -0
- package/src/__tests__/resolve-asset-handle.unit.test.ts +64 -0
- package/src/__tests__/resolve-depth-only-view.test.ts +1 -1
- package/src/__tests__/resolveName-fallback.test.ts +64 -0
- package/src/__tests__/resolveName-null-package.test.ts +38 -0
- package/src/__tests__/resolveName-unified-entry.test.ts +65 -0
- package/src/__tests__/resolveName.test.ts +64 -0
- package/src/__tests__/rhi-null-command-flow.unit.test.ts +43 -261
- package/src/__tests__/rhi-null-renderer-lifecycle.unit.test.ts +41 -169
- package/src/__tests__/roots-to-scene-asset.test.ts +199 -93
- package/src/__tests__/roundtrip-primitive.test.ts +351 -0
- package/src/__tests__/scene-bare-guid-refs-instantiate.test.ts +123 -0
- package/src/__tests__/scene-equirect-roundtrip.test.ts +103 -16
- package/src/__tests__/scene-instance-authoring.integration.test.ts +8 -0
- package/src/__tests__/scene-instance-bridge.integration.test.ts +1 -1
- package/src/__tests__/scene-instance-component.test.ts +1 -1
- package/src/__tests__/scene-mount-fixed-point.test.ts +257 -0
- package/src/__tests__/scene-mount-roundtrip.test.ts +987 -0
- package/src/__tests__/scene-mount-wrapper-roundtrip.test.ts +202 -0
- package/src/__tests__/scene-sugar-instantiate.test.ts +324 -0
- package/src/__tests__/serialize-mounts-roundtrip.test.ts +533 -0
- package/src/__tests__/serialize-scene-asset.test.ts +219 -22
- package/src/__tests__/shadow-caster-empty-schema.test.ts +3 -3
- package/src/__tests__/shadow-csm-cascade-loadop.test.ts +37 -17
- package/src/__tests__/shadow-csm-component.test.ts +3 -5
- package/src/__tests__/shadow-csm-extract.test.ts +2 -100
- package/src/__tests__/shadow-csm-orthoz.test.ts +2 -16
- package/src/__tests__/shadow-csm-runtime-vary.dawn.test.ts +19 -14
- package/src/__tests__/shadow-csm-tile-consistency.test.ts +32 -26
- package/src/__tests__/shadow-csm-ubo.dawn.test.ts +8 -49
- package/src/__tests__/shadow-csm-ubo.test.ts +3 -25
- package/src/__tests__/shadow-csm-viewport.browser.test.ts +1 -1
- package/src/__tests__/shadow-fields-observable.dawn.test.ts +67 -56
- package/src/__tests__/shadow-m1.dawn.test.ts +8 -9
- package/src/__tests__/shadow-mesh-ssbo-order.test.ts +11 -27
- package/src/__tests__/skin-errors.unit.test.ts +1 -1
- package/src/__tests__/skin-extract-getarrayview-count.unit.test.ts +7 -5
- package/src/__tests__/skylight-lazy-projection.test.ts +36 -15
- package/src/__tests__/sparse-tag-scene-roundtrip.test.ts +5 -5
- package/src/__tests__/sprite-cullmode-flip.dawn.test.ts +47 -64
- package/src/__tests__/sprite-lit-bgl-byte-identical.test.ts +12 -11
- package/src/__tests__/sprite-lit-extract-branch.test.ts +1 -1
- package/src/__tests__/sprite-lit-pipeline-cache-key.test.ts +1 -1
- package/src/__tests__/ssao-bgl.test.ts +16 -9
- package/src/__tests__/ssao-buffers.test.ts +2 -2
- package/src/__tests__/ssao-data.test.ts +2 -2
- package/src/__tests__/ssao-errors.test.ts +1 -1
- package/src/__tests__/ssao-passes.test.ts +64 -392
- package/src/__tests__/ssao-pipelines.test.ts +1 -1
- package/src/__tests__/ssao-uniform-layout.test.ts +8 -6
- package/src/__tests__/stencil-outline-pixel.dawn.test.ts +25 -17
- package/src/__tests__/swap-chain-format.unit.test.ts +5 -7
- package/src/__tests__/systems.unit.test.ts +536 -1326
- package/src/__tests__/template-game-default-api-contract.test.ts +362 -0
- package/src/__tests__/text.unit.test.ts +56 -33
- package/src/__tests__/tilemap-childed-despawn.test.ts +8 -14
- package/src/__tests__/tilemap-chunk-extract.overhang-bounds.test.ts +8 -12
- package/src/__tests__/tilemap-chunk-extract.propagate-order.test.ts +2 -1
- package/src/__tests__/tilemap-chunk-extract.test.ts +13 -17
- package/src/__tests__/tilemap-dirty-rebuild.test.ts +7 -11
- package/src/__tests__/tilemap-material-cache.test.ts +8 -13
- package/src/__tests__/tilemap-multi-atlas.test.ts +12 -32
- package/src/__tests__/tilemap-owner-boundary.unit.test.ts +5 -2
- package/src/__tests__/tilemap-region-pack.test.ts +8 -12
- package/src/__tests__/tilemap-spawn-flip-pivot.test.ts +8 -12
- package/src/__tests__/tilemap-uv-inset.test.ts +11 -14
- package/src/__tests__/tilemap-validate.test.ts +1 -1
- package/src/__tests__/tileset-asset-validate.test.ts +638 -0
- package/src/__tests__/transcode-fallback.unit.test.ts +207 -0
- package/src/__tests__/transform-hierarchy-pixel-diff.dawn.test.ts +36 -28
- package/src/__tests__/transient-fields-collect.test.ts +28 -21
- package/src/__tests__/transient-runtime-behavior.test.ts +227 -0
- package/src/__tests__/transparent-sort-tilemap-sprite-interleave.test.ts +4 -4
- package/src/__tests__/variant-selection.unit.test.ts +1 -1
- package/src/__tests__/video-extract-bindgroup.dawn.test.ts +89 -136
- package/src/__tests__/video-loader-consumption.test.ts +86 -0
- package/src/__tests__/video-loader-smoke.dawn.test.ts +60 -0
- package/src/__tests__/view-ubo-layout.browser.test.ts +0 -22
- package/src/__tests__/world-entity-key.test.ts +1 -1
- package/src/__tests__/world-scene-despawn.test.ts +1 -1
- package/src/__tests__/world-scene-instantiate.test.ts +2 -36
- package/src/__tests__/world-scene-nested.test.ts +1 -1
- package/src/__tests__/world-scene-override.test.ts +1 -1
- package/src/backend-selection.ts +69 -0
- package/src/collect-scene-asset.ts +28 -23
- package/src/components/__tests__/camera.test-d.ts +1 -1
- package/src/components/__tests__/camera.test.ts +1 -1
- package/src/components/__tests__/sprite-animation.test-d.ts +2 -2
- package/src/components/__tests__/tile-layer.test-d.ts +1 -1
- package/src/components/__tests__/tile-layer.unit.test.ts +2 -2
- package/src/createRenderer.ts +24 -36
- package/src/errors/environment.ts +1 -1
- package/src/index.ts +47 -113
- package/src/renderer-host.ts +33 -0
- package/src/scene-instances/__tests__/post-spawn-resolve-joints.unit.test.ts +1 -1
- package/src/scene-instances/index.ts +4 -0
- package/src/scene-utils/mount-override-fold.ts +3 -7
- package/src/systems/__tests__/transparent-sort.bench.ts +3 -3
- package/src/systems/sprite-animation-tick.ts +1 -1
- package/src/systems/transparent-sort.ts +38 -38
- package/src/tilemap-register-validate.ts +4 -4
- package/dist/__tests__/bind-group-cache-binding.test.d.ts +0 -2
- package/dist/__tests__/bind-group-cache-binding.test.d.ts.map +0 -1
- package/dist/__tests__/bind-group-cache-frame.test.d.ts +0 -2
- package/dist/__tests__/bind-group-cache-frame.test.d.ts.map +0 -1
- package/dist/__tests__/dawn/mesh-update.dawn.test.d.ts +0 -2
- package/dist/__tests__/dawn/mesh-update.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.d.ts +0 -2
- package/dist/__tests__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.d.ts +0 -2
- package/dist/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.d.ts +0 -2
- package/dist/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/dispatch-fullscreen-pass-params.unit.test.d.ts +0 -2
- package/dist/__tests__/dispatch-fullscreen-pass-params.unit.test.d.ts.map +0 -1
- package/dist/__tests__/fog-producer-manifest.d.ts +0 -131
- package/dist/__tests__/fog-producer-manifest.d.ts.map +0 -1
- package/dist/__tests__/fog-producer-pixel-probe.d.ts +0 -42
- package/dist/__tests__/fog-producer-pixel-probe.d.ts.map +0 -1
- package/dist/__tests__/fog-producer-pixel.browser.test.d.ts +0 -2
- package/dist/__tests__/fog-producer-pixel.browser.test.d.ts.map +0 -1
- package/dist/__tests__/fog-producer-pixel.dawn.test.d.ts +0 -2
- package/dist/__tests__/fog-producer-pixel.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/fog-producer-real-fixture.d.ts +0 -5
- package/dist/__tests__/fog-producer-real-fixture.d.ts.map +0 -1
- package/dist/__tests__/fog-producer-vfx-effect.d.ts +0 -3
- package/dist/__tests__/fog-producer-vfx-effect.d.ts.map +0 -1
- package/dist/__tests__/fog-scene-asset.integration.test.d.ts +0 -2
- package/dist/__tests__/fog-scene-asset.integration.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-resource-store-cubemap-status.test.d.ts +0 -2
- package/dist/__tests__/gpu-resource-store-cubemap-status.test.d.ts.map +0 -1
- package/dist/__tests__/gpu-resource.test.d.ts +0 -2
- package/dist/__tests__/gpu-resource.test.d.ts.map +0 -1
- package/dist/__tests__/hdrp-bgl-slots.browser.test.d.ts +0 -2
- package/dist/__tests__/hdrp-bgl-slots.browser.test.d.ts.map +0 -1
- package/dist/__tests__/hdrp-buffers.unit.test.d.ts +0 -2
- package/dist/__tests__/hdrp-buffers.unit.test.d.ts.map +0 -1
- package/dist/__tests__/hdrp-execute-filter.unit.test.d.ts +0 -2
- package/dist/__tests__/hdrp-execute-filter.unit.test.d.ts.map +0 -1
- package/dist/__tests__/hdrp-gbuffer-attachments.browser.test.d.ts +0 -2
- package/dist/__tests__/hdrp-gbuffer-attachments.browser.test.d.ts.map +0 -1
- package/dist/__tests__/hdrp-pipeline-asset-type.test-d.d.ts +0 -2
- package/dist/__tests__/hdrp-pipeline-asset-type.test-d.d.ts.map +0 -1
- package/dist/__tests__/hdrp-ssao-boundary.test.d.ts +0 -2
- package/dist/__tests__/hdrp-ssao-boundary.test.d.ts.map +0 -1
- package/dist/__tests__/hdrp-ssao-falsification.test.d.ts +0 -2
- package/dist/__tests__/hdrp-ssao-falsification.test.d.ts.map +0 -1
- package/dist/__tests__/helpers/primitive-world.d.ts +0 -8
- package/dist/__tests__/helpers/primitive-world.d.ts.map +0 -1
- package/dist/__tests__/helpers/render-asset-port.d.ts +0 -15
- package/dist/__tests__/helpers/render-asset-port.d.ts.map +0 -1
- package/dist/__tests__/helpers/scene-asset-port.d.ts +0 -9
- package/dist/__tests__/helpers/scene-asset-port.d.ts.map +0 -1
- package/dist/__tests__/material-derived-coordinates.integration.test.d.ts +0 -2
- package/dist/__tests__/material-derived-coordinates.integration.test.d.ts.map +0 -1
- package/dist/__tests__/pipeline-layout-selection.test.d.ts +0 -2
- package/dist/__tests__/pipeline-layout-selection.test.d.ts.map +0 -1
- package/dist/__tests__/post-process-reads-narrowing.test-d.d.ts +0 -2
- package/dist/__tests__/post-process-reads-narrowing.test-d.d.ts.map +0 -1
- package/dist/__tests__/post-process-register-roundtrip.dawn.test.d.ts +0 -2
- package/dist/__tests__/post-process-register-roundtrip.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/render-feature-zero-feature.browser.test.d.ts +0 -2
- package/dist/__tests__/render-feature-zero-feature.browser.test.d.ts.map +0 -1
- package/dist/__tests__/render-pipeline-trivial.dawn.test.d.ts +0 -2
- package/dist/__tests__/render-pipeline-trivial.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/shadow-csm-caster-membership.test.d.ts +0 -2
- package/dist/__tests__/shadow-csm-caster-membership.test.d.ts.map +0 -1
- package/dist/__tests__/shadow-csm-pssm.test.d.ts +0 -2
- package/dist/__tests__/shadow-csm-pssm.test.d.ts.map +0 -1
- package/dist/__tests__/shadow-csm-temporal.browser.test.d.ts +0 -2
- package/dist/__tests__/shadow-csm-temporal.browser.test.d.ts.map +0 -1
- package/dist/__tests__/shadow-csm-viewport.test.d.ts +0 -2
- package/dist/__tests__/shadow-csm-viewport.test.d.ts.map +0 -1
- package/dist/__tests__/shadow-m2.dawn.test.d.ts +0 -2
- package/dist/__tests__/shadow-m2.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/shadow-m3-calibrate-run.dawn.test.d.ts +0 -2
- package/dist/__tests__/shadow-m3-calibrate-run.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/shadow-m3-calibrate.d.ts +0 -83
- package/dist/__tests__/shadow-m3-calibrate.d.ts.map +0 -1
- package/dist/__tests__/shadow-m3.dawn.test.d.ts +0 -2
- package/dist/__tests__/shadow-m3.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/shadow-probe-control-flow.dawn.test.d.ts +0 -2
- package/dist/__tests__/shadow-probe-control-flow.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/shadow-quality-metrics.dawn.test.d.ts +0 -2
- package/dist/__tests__/shadow-quality-metrics.dawn.test.d.ts.map +0 -1
- package/dist/__tests__/temporal-off-path.unit.test.d.ts +0 -2
- package/dist/__tests__/temporal-off-path.unit.test.d.ts.map +0 -1
- package/dist/__tests__/video-cache-regression.unit.test.d.ts +0 -2
- package/dist/__tests__/video-cache-regression.unit.test.d.ts.map +0 -1
- package/dist/asset-kind.d.ts +0 -4
- package/dist/asset-kind.d.ts.map +0 -1
- package/dist/errors/sprite-animation.d.ts +0 -3
- package/dist/errors/sprite-animation.d.ts.map +0 -1
- package/dist/scene-asset-port.d.ts +0 -17
- package/dist/scene-asset-port.d.ts.map +0 -1
- package/dist/scene-collect-errors.d.ts +0 -22
- package/dist/scene-collect-errors.d.ts.map +0 -1
- package/dist/shadow-m3-calibrate.d.ts +0 -40
- package/dist/shadow-m3-calibrate.d.ts.map +0 -1
- package/src/__tests__/bind-group-cache-binding.test.ts +0 -2513
- package/src/__tests__/bind-group-cache-frame.test.ts +0 -1511
- package/src/__tests__/dispatch-fullscreen-pass-composite-swapchain.dawn.test.ts +0 -204
- package/src/__tests__/dispatch-fullscreen-pass-custom-reads.dawn.test.ts +0 -297
- package/src/__tests__/dispatch-fullscreen-pass-depth-composite.dawn.test.ts +0 -271
- package/src/__tests__/dispatch-fullscreen-pass-params.unit.test.ts +0 -321
- package/src/__tests__/fog-producer-manifest.ts +0 -162
- package/src/__tests__/fog-producer-pixel-probe.ts +0 -263
- package/src/__tests__/fog-producer-pixel.browser.test.ts +0 -26
- package/src/__tests__/fog-producer-pixel.dawn.test.ts +0 -55
- package/src/__tests__/fog-producer-real-fixture.ts +0 -805
- package/src/__tests__/fog-producer-vfx-effect.ts +0 -272
- package/src/__tests__/fog-scene-asset.integration.test.ts +0 -123
- package/src/__tests__/gpu-resource-store-cubemap-status.test.ts +0 -207
- package/src/__tests__/gpu-resource.test.ts +0 -1206
- package/src/__tests__/hdrp-bgl-slots.browser.test.ts +0 -50
- package/src/__tests__/hdrp-buffers.unit.test.ts +0 -70
- package/src/__tests__/hdrp-execute-filter.unit.test.ts +0 -200
- package/src/__tests__/hdrp-gbuffer-attachments.browser.test.ts +0 -64
- package/src/__tests__/hdrp-pipeline-asset-type.test-d.ts +0 -139
- package/src/__tests__/hdrp-ssao-boundary.test.ts +0 -237
- package/src/__tests__/hdrp-ssao-falsification.test.ts +0 -289
- package/src/__tests__/helpers/primitive-world.ts +0 -91
- package/src/__tests__/helpers/render-asset-port.ts +0 -65
- package/src/__tests__/helpers/scene-asset-port.ts +0 -23
- package/src/__tests__/material-derived-coordinates.integration.test.ts +0 -100
- package/src/__tests__/pipeline-layout-selection.test.ts +0 -298
- package/src/__tests__/post-process-reads-narrowing.test-d.ts +0 -52
- package/src/__tests__/post-process-register-roundtrip.dawn.test.ts +0 -230
- package/src/__tests__/render-feature-zero-feature.browser.test.ts +0 -152
- package/src/__tests__/render-pipeline-trivial.dawn.test.ts +0 -525
- package/src/__tests__/shadow-csm-caster-membership.test.ts +0 -232
- package/src/__tests__/shadow-csm-pssm.test.ts +0 -142
- package/src/__tests__/shadow-csm-temporal.browser.test.ts +0 -145
- package/src/__tests__/shadow-csm-viewport.test.ts +0 -74
- package/src/__tests__/shadow-m2.dawn.test.ts +0 -394
- package/src/__tests__/shadow-m3-calibrate-run.dawn.test.ts +0 -248
- package/src/__tests__/shadow-m3-calibrate.ts +0 -203
- package/src/__tests__/shadow-m3.dawn.test.ts +0 -288
- package/src/__tests__/shadow-probe-control-flow.dawn.test.ts +0 -264
- package/src/__tests__/shadow-quality-metrics.dawn.test.ts +0 -324
- package/src/__tests__/temporal-off-path.unit.test.ts +0 -69
- package/src/__tests__/video-cache-regression.unit.test.ts +0 -186
- package/src/asset-kind.ts +0 -7
- package/src/errors/sprite-animation.ts +0 -5
- package/src/scene-asset-port.ts +0 -32
- package/src/scene-collect-errors.ts +0 -30
- package/src/shadow-m3-calibrate.ts +0 -171
|
@@ -109,11 +109,11 @@ describe('w6 -- AC-07 storage+uniform variant test (degraded best-effort)', () =
|
|
|
109
109
|
// end-to-end on dawn.
|
|
110
110
|
|
|
111
111
|
const { World } = await import('@forgeax/engine-ecs');
|
|
112
|
-
const {
|
|
113
|
-
const { Camera, MeshRenderer } = await import('@forgeax/engine-render
|
|
114
|
-
const { Instances } = await import('@forgeax/engine-render
|
|
115
|
-
const {
|
|
116
|
-
const { MeshFilter } = await import('@forgeax/engine-render
|
|
112
|
+
const { AssetRegistry, HANDLE_CUBE } = await import('@forgeax/engine-assets-runtime');
|
|
113
|
+
const { Camera, MeshRenderer } = await import('@forgeax/engine-render');
|
|
114
|
+
const { Instances } = await import('@forgeax/engine-render');
|
|
115
|
+
const { constructRuntimeRendererHost } = await import('../../renderer-host');
|
|
116
|
+
const { MeshFilter } = await import('@forgeax/engine-render');
|
|
117
117
|
const { Transform } = await import('@forgeax/engine-scene');
|
|
118
118
|
const { buildEngineShaderManifest } = await import('@forgeax/engine-vite-plugin-shader');
|
|
119
119
|
const ENGINE_MANIFEST_W6 = await buildEngineShaderManifest();
|
|
@@ -173,9 +173,9 @@ describe('w6 -- AC-07 storage+uniform variant test (degraded best-effort)', () =
|
|
|
173
173
|
removeEventListener() {},
|
|
174
174
|
} as unknown as HTMLCanvasElement;
|
|
175
175
|
|
|
176
|
-
let
|
|
176
|
+
let host: Awaited<ReturnType<typeof constructRuntimeRendererHost>>;
|
|
177
177
|
try {
|
|
178
|
-
|
|
178
|
+
host = await constructRuntimeRendererHost(
|
|
179
179
|
mockCanvas,
|
|
180
180
|
{},
|
|
181
181
|
{ shaderManifestUrl: ENGINE_MANIFEST_URL_W6 },
|
|
@@ -183,11 +183,11 @@ describe('w6 -- AC-07 storage+uniform variant test (degraded best-effort)', () =
|
|
|
183
183
|
} finally {
|
|
184
184
|
globalThis.navigator.gpu.requestAdapter = origReq;
|
|
185
185
|
}
|
|
186
|
-
expect(
|
|
187
|
-
|
|
188
|
-
const
|
|
189
|
-
expect(
|
|
190
|
-
|
|
186
|
+
expect(host.ok).toBe(true);
|
|
187
|
+
if (!host.ok) throw host.error;
|
|
188
|
+
const { renderer, assets } = host.value;
|
|
189
|
+
expect(renderer.inspect().state).toBe('alive');
|
|
190
|
+
expect(assets).toBeInstanceOf(AssetRegistry);
|
|
191
191
|
|
|
192
192
|
const matAsset: MaterialAsset = {
|
|
193
193
|
kind: 'material',
|
|
@@ -222,7 +222,6 @@ describe('w6 -- AC-07 storage+uniform variant test (degraded best-effort)', () =
|
|
|
222
222
|
}
|
|
223
223
|
|
|
224
224
|
const world = new World();
|
|
225
|
-
const cubeHandle = world.internSharedRef('MeshAsset', createPrimitiveMesh('cube').unwrap());
|
|
226
225
|
const matHandle = world.allocSharedRef<'MaterialAsset', MaterialAsset>(
|
|
227
226
|
'MaterialAsset',
|
|
228
227
|
matAsset,
|
|
@@ -236,7 +235,7 @@ describe('w6 -- AC-07 storage+uniform variant test (degraded best-effort)', () =
|
|
|
236
235
|
scale: [0.3, 0.3, 0.3],
|
|
237
236
|
},
|
|
238
237
|
},
|
|
239
|
-
{ component: MeshFilter, data: { assetHandle:
|
|
238
|
+
{ component: MeshFilter, data: { assetHandle: HANDLE_CUBE } },
|
|
240
239
|
{ component: MeshRenderer, data: { materials: [matHandle] } },
|
|
241
240
|
{ component: Instances, data: { transforms } },
|
|
242
241
|
);
|
|
@@ -6,11 +6,11 @@ import {
|
|
|
6
6
|
Materials,
|
|
7
7
|
MeshFilter,
|
|
8
8
|
MeshRenderer,
|
|
9
|
-
} from '@forgeax/engine-render
|
|
10
|
-
import { createRenderer } from '@forgeax/engine-runtime';
|
|
9
|
+
} from '@forgeax/engine-render';
|
|
11
10
|
import { Transform } from '@forgeax/engine-scene';
|
|
12
11
|
import type { TextureAsset } from '@forgeax/engine-types';
|
|
13
12
|
import { describe, expect, it } from 'vitest';
|
|
13
|
+
import { constructRuntimeRendererHost } from '../../renderer-host';
|
|
14
14
|
|
|
15
15
|
const WIDTH = 64;
|
|
16
16
|
const HEIGHT = 64;
|
|
@@ -175,18 +175,25 @@ async function captureCase(testCase: AlphaCase): Promise<[number, number, number
|
|
|
175
175
|
addEventListener() {},
|
|
176
176
|
removeEventListener() {},
|
|
177
177
|
} as unknown as HTMLCanvasElement;
|
|
178
|
-
let
|
|
178
|
+
let host: Awaited<ReturnType<typeof constructRuntimeRendererHost>>;
|
|
179
179
|
try {
|
|
180
|
-
|
|
180
|
+
host = await constructRuntimeRendererHost(
|
|
181
|
+
canvas,
|
|
182
|
+
{},
|
|
183
|
+
{
|
|
184
|
+
shaderManifestUrl: ENGINE_MANIFEST_URL,
|
|
185
|
+
},
|
|
186
|
+
);
|
|
181
187
|
} finally {
|
|
182
188
|
globalThis.navigator.gpu.requestAdapter = original;
|
|
183
189
|
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
190
|
+
expect(host.ok).toBe(true);
|
|
191
|
+
if (!host.ok || device === undefined) throw new Error('runtime Dawn renderer not ready');
|
|
192
|
+
const { renderer } = host.value;
|
|
193
|
+
expect(renderer.inspect().state).toBe('alive');
|
|
187
194
|
|
|
188
195
|
const world = new World();
|
|
189
|
-
const attachment = renderer.
|
|
196
|
+
const attachment = renderer.attach(world);
|
|
190
197
|
if (!attachment.ok) throw attachment.error;
|
|
191
198
|
const plane = createPlaneGeometry(2.8, 2.8);
|
|
192
199
|
expect(plane.ok).toBe(true);
|
|
@@ -196,18 +203,8 @@ async function captureCase(testCase: AlphaCase): Promise<[number, number, number
|
|
|
196
203
|
testCase.textureColor === undefined ? undefined : makeTexture(testCase.textureColor);
|
|
197
204
|
const textureHandle =
|
|
198
205
|
texture === undefined ? undefined : world.allocSharedRef('TextureAsset', texture);
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
bytes: texture.data,
|
|
202
|
-
width: 1,
|
|
203
|
-
height: 1,
|
|
204
|
-
mime: 'image/png',
|
|
205
|
-
colorSpace: 'srgb',
|
|
206
|
-
mipmap: false,
|
|
207
|
-
});
|
|
208
|
-
expect(uploaded.ok).toBe(true);
|
|
209
|
-
if (!uploaded.ok) throw new Error('texture upload failed');
|
|
210
|
-
}
|
|
206
|
+
// The renderer-owned record stage derives GPU residency from this world
|
|
207
|
+
// asset. No renderer store upload is part of the public contract.
|
|
211
208
|
const renderState =
|
|
212
209
|
testCase.mode === 'BLEND'
|
|
213
210
|
? {
|
|
@@ -242,16 +239,7 @@ async function captureCase(testCase: AlphaCase): Promise<[number, number, number
|
|
|
242
239
|
renderState,
|
|
243
240
|
...(textureHandle === undefined
|
|
244
241
|
? {}
|
|
245
|
-
: {
|
|
246
|
-
baseColorTexture: {
|
|
247
|
-
texture: textureHandle as never,
|
|
248
|
-
coordinates: {
|
|
249
|
-
set: 0,
|
|
250
|
-
transform: { offset: [0, 0], scale: [1, 1], rotation: 0 },
|
|
251
|
-
physicalUvScale: [1, 1],
|
|
252
|
-
},
|
|
253
|
-
},
|
|
254
|
-
}),
|
|
242
|
+
: { baseColorTexture: { texture: textureHandle as never } }),
|
|
255
243
|
...(testCase.mode === 'MASK' && testCase.cutoff !== undefined
|
|
256
244
|
? { alphaCutoff: testCase.cutoff }
|
|
257
245
|
: {}),
|
|
@@ -274,7 +262,11 @@ async function captureCase(testCase: AlphaCase): Promise<[number, number, number
|
|
|
274
262
|
data: { direction: [0, 0, -1], color: [1, 1, 1], intensity: 1, castShadow: false },
|
|
275
263
|
});
|
|
276
264
|
world.update().unwrap();
|
|
277
|
-
const drawn = renderer.draw(
|
|
265
|
+
const drawn = renderer.draw({
|
|
266
|
+
leases: [attachment.value],
|
|
267
|
+
camera: { lease: attachment.value },
|
|
268
|
+
environment: { lease: attachment.value },
|
|
269
|
+
});
|
|
278
270
|
expect(drawn.ok).toBe(true);
|
|
279
271
|
if (!drawn.ok) throw new Error(`draw failed: ${drawn.error.code}`);
|
|
280
272
|
await device.queue.onSubmittedWorkDone();
|
|
@@ -6,13 +6,6 @@ type CookedRecord = {
|
|
|
6
6
|
readonly key: string;
|
|
7
7
|
readonly bytes: string;
|
|
8
8
|
readonly values: unknown;
|
|
9
|
-
readonly resolved?: {
|
|
10
|
-
readonly values?: unknown;
|
|
11
|
-
};
|
|
12
|
-
readonly receipt?: {
|
|
13
|
-
readonly layoutIdentity?: string;
|
|
14
|
-
readonly schemaVersion?: string;
|
|
15
|
-
};
|
|
16
9
|
};
|
|
17
10
|
|
|
18
11
|
type MaterialRow = {
|
|
@@ -46,17 +39,6 @@ describe('custom-shader cooked MaterialAsset fixture', () => {
|
|
|
46
39
|
expect(derived?.payload.cooked?.values).toEqual(root?.payload.cooked?.values);
|
|
47
40
|
});
|
|
48
41
|
|
|
49
|
-
it('keeps cooked layout identity and authored coordinate transforms', () => {
|
|
50
|
-
const root = fixture.assets.find((asset) => asset.payload.role === 'root');
|
|
51
|
-
const cooked = root?.payload.cooked;
|
|
52
|
-
expect(cooked?.receipt?.schemaVersion).toBe('material-cook/2');
|
|
53
|
-
expect(cooked?.receipt?.layoutIdentity).toMatch(/^sha256-/);
|
|
54
|
-
expect(cooked?.resolved?.values).toMatchObject({
|
|
55
|
-
baseColorUvTransform: [0, 0, 1, 1],
|
|
56
|
-
normalUvTransform: [0.125, 0.25, 2, 2],
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
|
|
60
42
|
it('runs the real Dawn path for exactly 300 frames without unexpected RHI errors', () => {
|
|
61
43
|
expect(fixture.assets.length).toBeGreaterThanOrEqual(2);
|
|
62
44
|
expect(fixture.assets.every((asset) => asset.kind === 'material')).toBe(true);
|
|
@@ -1,26 +1,23 @@
|
|
|
1
|
-
// mesh-update
|
|
1
|
+
// mesh-update-dawn.test.ts - updateMesh in-place re-upload dawn-tier test
|
|
2
2
|
// (feat-20260531-world-space-msdf-text-rendering M3 / w12).
|
|
3
3
|
//
|
|
4
|
-
// Verifies that updateMesh correctly writes
|
|
5
|
-
// existing GPU buffers,
|
|
6
|
-
// without changing the mesh handle id.
|
|
4
|
+
// Verifies that updateMesh correctly writes new vertex/index data into
|
|
5
|
+
// existing GPU buffers and, on expansion, creates new buffers while
|
|
6
|
+
// destroying old ones — all without changing the mesh handle id.
|
|
7
7
|
//
|
|
8
|
-
// AC-08 falsification: if
|
|
9
|
-
//
|
|
10
|
-
// or the buffer count would grow across repeated calls. This test
|
|
11
|
-
// structural invariants on a real GPU device.
|
|
8
|
+
// AC-08 falsification: if updateMesh leaked GPU buffers (create without
|
|
9
|
+
// destroy), the dawn backend would surface this as resource exhaustion
|
|
10
|
+
// or the buffer count would grow across repeated calls. This test
|
|
11
|
+
// validates the structural invariants on a real GPU device.
|
|
12
12
|
|
|
13
|
+
import { resolveAssetHandle } from '@forgeax/engine-assets-runtime';
|
|
13
14
|
import { World } from '@forgeax/engine-ecs';
|
|
14
|
-
import {
|
|
15
|
-
deriveVertexLayoutProjection,
|
|
16
|
-
PROCEDURAL_FLOATS_PER_VERTEX,
|
|
17
|
-
} from '@forgeax/engine-geometry';
|
|
15
|
+
import { PROCEDURAL_FLOATS_PER_VERTEX } from '@forgeax/engine-geometry';
|
|
18
16
|
import { mat4 } from '@forgeax/engine-math';
|
|
19
|
-
import {
|
|
20
|
-
import { ok, type RhiDevice } from '@forgeax/engine-rhi';
|
|
21
|
-
import { rhi } from '@forgeax/engine-rhi-webgpu';
|
|
17
|
+
import { ok } from '@forgeax/engine-rhi';
|
|
22
18
|
import type { EquirectAsset, MeshAsset } from '@forgeax/engine-types';
|
|
23
19
|
import { describe, expect, it } from 'vitest';
|
|
20
|
+
import { GpuResidencyCache } from '../../../../render/src/device/gpu-residency';
|
|
24
21
|
|
|
25
22
|
const mockCaps = {
|
|
26
23
|
backendKind: 'webgpu' as const,
|
|
@@ -44,32 +41,13 @@ const mockCaps = {
|
|
|
44
41
|
maxColorAttachments: 8,
|
|
45
42
|
};
|
|
46
43
|
|
|
47
|
-
// feat-20260601-gpu-
|
|
44
|
+
// feat-20260601-device/gpu-residency-extraction M1: mesh GPU residency + updateMesh
|
|
48
45
|
// moved to the store, and register no longer auto-uploads (push severed). The
|
|
49
46
|
// pull-model test premise: register the POD, then explicitly
|
|
50
47
|
// `store.ensureResident(handle, pod)` to upload, then assert + updateMesh.
|
|
51
48
|
|
|
52
49
|
const dawnReady = typeof navigator !== 'undefined' && navigator.gpu !== undefined;
|
|
53
50
|
|
|
54
|
-
async function requestRhiDevice(): Promise<RhiDevice | undefined> {
|
|
55
|
-
const adapterResult = await rhi.requestAdapter();
|
|
56
|
-
expect(adapterResult.ok).toBe(true);
|
|
57
|
-
if (!adapterResult.ok) return undefined;
|
|
58
|
-
const deviceResult = await adapterResult.value.requestDevice();
|
|
59
|
-
expect(deviceResult.ok).toBe(true);
|
|
60
|
-
if (!deviceResult.ok) return undefined;
|
|
61
|
-
return deviceResult.value;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
function canonicalAttributes(vertexCount: number): MeshAsset['attributes'] {
|
|
65
|
-
return {
|
|
66
|
-
position: new Float32Array(vertexCount * 3),
|
|
67
|
-
normal: new Float32Array(vertexCount * 3),
|
|
68
|
-
uv: new Float32Array(vertexCount * 2),
|
|
69
|
-
tangent: new Float32Array(vertexCount * 4),
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
|
|
73
51
|
function makeSmallMesh(): MeshAsset {
|
|
74
52
|
const vertices = new Float32Array(4 * PROCEDURAL_FLOATS_PER_VERTEX);
|
|
75
53
|
const indices = new Uint16Array([0, 1, 2, 0, 2, 3]);
|
|
@@ -77,7 +55,7 @@ function makeSmallMesh(): MeshAsset {
|
|
|
77
55
|
kind: 'mesh',
|
|
78
56
|
vertices,
|
|
79
57
|
indices,
|
|
80
|
-
attributes:
|
|
58
|
+
attributes: {},
|
|
81
59
|
aabb: new Float32Array(6),
|
|
82
60
|
submeshes: [
|
|
83
61
|
{
|
|
@@ -100,7 +78,7 @@ function makeLargerMesh(): MeshAsset {
|
|
|
100
78
|
kind: 'mesh',
|
|
101
79
|
vertices,
|
|
102
80
|
indices,
|
|
103
|
-
attributes:
|
|
81
|
+
attributes: {},
|
|
104
82
|
aabb: new Float32Array(6),
|
|
105
83
|
submeshes: [
|
|
106
84
|
{
|
|
@@ -120,13 +98,16 @@ describe('w12 - updateMesh dawn-tier (AC-08)', () => {
|
|
|
120
98
|
it.skipIf(!dawnReady)(
|
|
121
99
|
'(a) updateMesh in-place re-upload does not create new vbo/ibo',
|
|
122
100
|
async () => {
|
|
123
|
-
const
|
|
124
|
-
|
|
101
|
+
const adapter = await navigator.gpu.requestAdapter();
|
|
102
|
+
expect(adapter).not.toBeNull();
|
|
103
|
+
if (adapter === null) return;
|
|
104
|
+
const device = await adapter.requestDevice();
|
|
125
105
|
|
|
126
|
-
const store = new
|
|
106
|
+
const store = new GpuResidencyCache();
|
|
127
107
|
const world = new World();
|
|
128
108
|
store.configureGpuDevice(
|
|
129
|
-
device
|
|
109
|
+
// biome-ignore lint/suspicious/noExplicitAny: structural rhi device shim
|
|
110
|
+
device as any,
|
|
130
111
|
undefined,
|
|
131
112
|
(w: World, pod: EquirectAsset) => ok(w.allocSharedRef('EquirectAsset', pod)),
|
|
132
113
|
mockCaps,
|
|
@@ -162,15 +143,18 @@ describe('w12 - updateMesh dawn-tier (AC-08)', () => {
|
|
|
162
143
|
);
|
|
163
144
|
|
|
164
145
|
it.skipIf(!dawnReady)(
|
|
165
|
-
'(b)
|
|
146
|
+
'(b) updateMesh expansion creates new buffers and destroys old ones, same handle id',
|
|
166
147
|
async () => {
|
|
167
|
-
const
|
|
168
|
-
|
|
148
|
+
const adapter = await navigator.gpu.requestAdapter();
|
|
149
|
+
expect(adapter).not.toBeNull();
|
|
150
|
+
if (adapter === null) return;
|
|
151
|
+
const device = await adapter.requestDevice();
|
|
169
152
|
|
|
170
|
-
const store = new
|
|
153
|
+
const store = new GpuResidencyCache();
|
|
171
154
|
const world = new World();
|
|
172
155
|
store.configureGpuDevice(
|
|
173
|
-
device
|
|
156
|
+
// biome-ignore lint/suspicious/noExplicitAny: structural rhi device shim
|
|
157
|
+
device as any,
|
|
174
158
|
undefined,
|
|
175
159
|
(w: World, pod: EquirectAsset) => ok(w.allocSharedRef('EquirectAsset', pod)),
|
|
176
160
|
mockCaps,
|
|
@@ -186,15 +170,10 @@ describe('w12 - updateMesh dawn-tier (AC-08)', () => {
|
|
|
186
170
|
const vboBefore = before.vertexBuffer;
|
|
187
171
|
const iboBefore = before.indexBuffer;
|
|
188
172
|
|
|
189
|
-
//
|
|
173
|
+
// Expansion: larger data exceeds current buffer capacity.
|
|
190
174
|
const larger = makeLargerMesh();
|
|
191
175
|
if (!(larger.indices instanceof Uint16Array)) return;
|
|
192
|
-
|
|
193
|
-
expect(rejected.ok).toBe(false);
|
|
194
|
-
if (!rejected.ok) expect(rejected.error.code).toBe('mesh-shape-mismatch');
|
|
195
|
-
|
|
196
|
-
const replaced = store.replaceMesh(handle, larger.vertices, larger.indices);
|
|
197
|
-
expect(replaced.ok).toBe(true);
|
|
176
|
+
store.updateMesh(handle, larger.vertices, larger.indices);
|
|
198
177
|
|
|
199
178
|
const after = store.getMeshGpuHandles(handle);
|
|
200
179
|
expect(after).toBeDefined();
|
|
@@ -213,96 +192,25 @@ describe('w12 - updateMesh dawn-tier (AC-08)', () => {
|
|
|
213
192
|
// indexCount should reflect the larger data.
|
|
214
193
|
expect(after.indexCount).toBe(larger.indices.length);
|
|
215
194
|
|
|
216
|
-
// The
|
|
217
|
-
const result =
|
|
195
|
+
// The handle id is unchanged — resolveAssetHandle still returns the payload.
|
|
196
|
+
const result = resolveAssetHandle<MeshAsset>(world, handle);
|
|
218
197
|
expect(result.ok).toBe(true);
|
|
219
198
|
},
|
|
220
199
|
);
|
|
221
200
|
|
|
222
201
|
it.skipIf(!dawnReady)(
|
|
223
|
-
'(c)
|
|
224
|
-
async () => {
|
|
225
|
-
const device = await requestRhiDevice();
|
|
226
|
-
if (device === undefined) return;
|
|
227
|
-
|
|
228
|
-
const store = new GpuResourceStore();
|
|
229
|
-
const world = new World();
|
|
230
|
-
store.configureGpuDevice(
|
|
231
|
-
device,
|
|
232
|
-
undefined,
|
|
233
|
-
(w: World, pod: EquirectAsset) => ok(w.allocSharedRef('EquirectAsset', pod)),
|
|
234
|
-
mockCaps,
|
|
235
|
-
);
|
|
236
|
-
|
|
237
|
-
const vertexCount = 4;
|
|
238
|
-
const indices = new Uint32Array([0, 1, 2, 0, 2, 3]);
|
|
239
|
-
const attributes: MeshAsset['attributes'] = {
|
|
240
|
-
position: new Float32Array(vertexCount * 3),
|
|
241
|
-
normal: new Float32Array(vertexCount * 3),
|
|
242
|
-
uv: new Float32Array(vertexCount * 2),
|
|
243
|
-
tangent: new Float32Array(vertexCount * 4),
|
|
244
|
-
skinIndex: new Uint16Array(vertexCount * 4),
|
|
245
|
-
skinWeight: new Float32Array(vertexCount * 4),
|
|
246
|
-
uv1: new Float32Array(vertexCount * 2),
|
|
247
|
-
};
|
|
248
|
-
const layoutProjection = deriveVertexLayoutProjection(attributes);
|
|
249
|
-
const vertices = new Float32Array(
|
|
250
|
-
(vertexCount * layoutProjection.arrayStride) / Float32Array.BYTES_PER_ELEMENT,
|
|
251
|
-
);
|
|
252
|
-
const mesh: MeshAsset = {
|
|
253
|
-
kind: 'mesh',
|
|
254
|
-
vertices,
|
|
255
|
-
indices,
|
|
256
|
-
attributes,
|
|
257
|
-
aabb: new Float32Array(6),
|
|
258
|
-
submeshes: [
|
|
259
|
-
{
|
|
260
|
-
indexOffset: 0,
|
|
261
|
-
indexCount: indices.length,
|
|
262
|
-
vertexCount,
|
|
263
|
-
topology: 'triangle-list',
|
|
264
|
-
materialSlot: 0,
|
|
265
|
-
},
|
|
266
|
-
],
|
|
267
|
-
materialSlots: [{ slotName: 'Default' }],
|
|
268
|
-
};
|
|
269
|
-
const handle = world.allocSharedRef('MeshAsset', mesh);
|
|
270
|
-
const resident = store.ensureResident(handle, mesh);
|
|
271
|
-
expect(resident.ok).toBe(true);
|
|
272
|
-
const before = store.getMeshGpuHandles(handle);
|
|
273
|
-
expect(before?.indexFormat).toBe('uint32');
|
|
274
|
-
expect(before?.layoutProjection).toEqual(layoutProjection);
|
|
275
|
-
expect(before?.layoutProjection.arrayStride).toBe(layoutProjection.arrayStride);
|
|
276
|
-
expect(before?.vertexCount).toBe(vertexCount);
|
|
277
|
-
|
|
278
|
-
const whole = store.updateMesh(handle, vertices, indices);
|
|
279
|
-
expect(whole.ok).toBe(true);
|
|
280
|
-
const range = store.updateMeshVertexRange(
|
|
281
|
-
handle,
|
|
282
|
-
new Float32Array(layoutProjection.arrayStride / Float32Array.BYTES_PER_ELEMENT),
|
|
283
|
-
1,
|
|
284
|
-
1,
|
|
285
|
-
);
|
|
286
|
-
expect(range.ok).toBe(true);
|
|
287
|
-
const after = store.getMeshGpuHandles(handle);
|
|
288
|
-
expect(after?.indexFormat).toBe('uint32');
|
|
289
|
-
expect(after?.layoutProjection).toEqual(layoutProjection);
|
|
290
|
-
expect(after?.layoutProjection.arrayStride).toBe(layoutProjection.arrayStride);
|
|
291
|
-
expect(after?.vertexCount).toBe(vertexCount);
|
|
292
|
-
expect(after?.indexCount).toBe(indices.length);
|
|
293
|
-
},
|
|
294
|
-
);
|
|
295
|
-
|
|
296
|
-
it.skipIf(!dawnReady)(
|
|
297
|
-
'(d) repeated 50-frame same-size updateMesh does not grow GPU buffer count',
|
|
202
|
+
'(c) repeated 50-frame same-size updateMesh does not grow GPU buffer count',
|
|
298
203
|
async () => {
|
|
299
|
-
const
|
|
300
|
-
|
|
204
|
+
const adapter = await navigator.gpu.requestAdapter();
|
|
205
|
+
expect(adapter).not.toBeNull();
|
|
206
|
+
if (adapter === null) return;
|
|
207
|
+
const device = await adapter.requestDevice();
|
|
301
208
|
|
|
302
|
-
const store = new
|
|
209
|
+
const store = new GpuResidencyCache();
|
|
303
210
|
const world = new World();
|
|
304
211
|
store.configureGpuDevice(
|
|
305
|
-
device
|
|
212
|
+
// biome-ignore lint/suspicious/noExplicitAny: structural rhi device shim
|
|
213
|
+
device as any,
|
|
306
214
|
undefined,
|
|
307
215
|
(w: World, pod: EquirectAsset) => ok(w.allocSharedRef('EquirectAsset', pod)),
|
|
308
216
|
mockCaps,
|
|
@@ -11,22 +11,27 @@
|
|
|
11
11
|
// correct mid-gray on mip level 1 of a 2x2 -> 1x1 source.
|
|
12
12
|
//
|
|
13
13
|
// The 6-fixture coverage promised in plan-tasks T-M3-02 acceptanceCheck:
|
|
14
|
+
// - 1x1 / 2x2 / 256x256 / non-pow2 dimension boundaries -> covered by
|
|
15
|
+
// the pure-formula `numMipLevels` unit tests (T-M3-01 (b) -- the formula
|
|
16
|
+
// SSOT does not need real-GPU verification);
|
|
14
17
|
// - sRGB / linear physics -> covered by this dawn integration file
|
|
15
18
|
// (the `*-srgb` view spec path is the only scenario requiring real GPU).
|
|
16
19
|
//
|
|
17
20
|
// Red-stage scaffolding: implementation lands in T-M3-04 (mipmap-generator.ts)
|
|
18
21
|
// + T-M3-05 (uploadTexture call site).
|
|
19
22
|
|
|
23
|
+
import { numMipLevels } from '@forgeax/engine-assets-runtime';
|
|
20
24
|
import { World } from '@forgeax/engine-ecs';
|
|
21
|
-
import { GpuResourceStore } from '@forgeax/engine-render/internal';
|
|
22
25
|
import type { DecodedImage, TextureAsset } from '@forgeax/engine-types';
|
|
23
26
|
import { describe, expect, it } from 'vitest';
|
|
27
|
+
import { GpuResidencyCache } from '../../../../render/src/device/gpu-residency';
|
|
24
28
|
|
|
25
|
-
// feat-20260601-gpu-
|
|
29
|
+
// feat-20260601-device/gpu-residency-extraction M1: uploadTexture moved to the
|
|
26
30
|
// store (POD carries format + mipmap flag, decoded carries pixel bytes; D-2).
|
|
27
31
|
// These cases wire no GPU device, so the upload short-circuits to ok after the
|
|
28
32
|
// consistency assertion (the actual mipmap blit needs a wired + prewarmed
|
|
29
|
-
// device; that path is exercised by the smoke harness).
|
|
33
|
+
// device; that path is exercised by the smoke harness). numMipLevels assertions
|
|
34
|
+
// are pure-formula and unaffected.
|
|
30
35
|
|
|
31
36
|
function makeTexture(
|
|
32
37
|
format: GPUTextureFormat,
|
|
@@ -77,11 +82,12 @@ describe('T-M3-02 dawn mipmap chain on rgba8unorm-srgb (sRGB physics)', () => {
|
|
|
77
82
|
bytes[i * 4 + 2] = 188;
|
|
78
83
|
bytes[i * 4 + 3] = 255;
|
|
79
84
|
}
|
|
80
|
-
const store = new
|
|
85
|
+
const store = new GpuResidencyCache();
|
|
81
86
|
const pod = makeTexture('rgba8unorm-srgb', 2, 2, 'srgb', true);
|
|
82
87
|
const handle = world.allocSharedRef<'TextureAsset', TextureAsset>('TextureAsset', pod);
|
|
83
88
|
const res = await store.uploadTexture(handle, pod, decoded(bytes, 2, 2, 'srgb', true));
|
|
84
89
|
expect(res.ok).toBe(true);
|
|
90
|
+
expect(numMipLevels({ width: 2, height: 2 })).toBe(2);
|
|
85
91
|
});
|
|
86
92
|
});
|
|
87
93
|
|
|
@@ -98,17 +104,18 @@ describe('T-M3-02 dawn mipmap chain on rgba8unorm (linear physics)', () => {
|
|
|
98
104
|
bytes[i * 4 + 2] = 128;
|
|
99
105
|
bytes[i * 4 + 3] = 255;
|
|
100
106
|
}
|
|
101
|
-
const store = new
|
|
107
|
+
const store = new GpuResidencyCache();
|
|
102
108
|
const pod = makeTexture('rgba8unorm', 2, 2, 'linear', true);
|
|
103
109
|
const handle = world.allocSharedRef<'TextureAsset', TextureAsset>('TextureAsset', pod);
|
|
104
110
|
const res = await store.uploadTexture(handle, pod, decoded(bytes, 2, 2, 'linear', true));
|
|
105
111
|
expect(res.ok).toBe(true);
|
|
106
112
|
});
|
|
107
113
|
|
|
108
|
-
it('
|
|
114
|
+
it('256x256 mipmap chain produces 9 levels (numMipLevels SSOT)', async () => {
|
|
115
|
+
expect(numMipLevels({ width: 256, height: 256 })).toBe(9);
|
|
109
116
|
const world = new World();
|
|
110
117
|
const bytes = new Uint8Array(256 * 256 * 4).fill(128);
|
|
111
|
-
const store = new
|
|
118
|
+
const store = new GpuResidencyCache();
|
|
112
119
|
const pod = makeTexture('rgba8unorm', 256, 256, 'linear', true);
|
|
113
120
|
const handle = world.allocSharedRef<'TextureAsset', TextureAsset>('TextureAsset', pod);
|
|
114
121
|
const res = await store.uploadTexture(handle, pod, decoded(bytes, 256, 256, 'linear', true));
|
|
@@ -20,18 +20,12 @@
|
|
|
20
20
|
import { World } from '@forgeax/engine-ecs';
|
|
21
21
|
import { createBoxGeometry } from '@forgeax/engine-geometry';
|
|
22
22
|
import { AssetGuid } from '@forgeax/engine-pack/guid';
|
|
23
|
-
import {
|
|
24
|
-
Camera,
|
|
25
|
-
DirectionalLight,
|
|
26
|
-
MeshFilter,
|
|
27
|
-
MeshRenderer,
|
|
28
|
-
} from '@forgeax/engine-render/internal';
|
|
29
|
-
import { createRenderer } from '@forgeax/engine-runtime';
|
|
23
|
+
import { Camera, DirectionalLight, MeshFilter, MeshRenderer } from '@forgeax/engine-render';
|
|
30
24
|
import { Transform } from '@forgeax/engine-scene';
|
|
31
25
|
import type { MaterialAsset, MeshAsset, TextureAsset } from '@forgeax/engine-types';
|
|
32
26
|
import { describe, expect, it } from 'vitest';
|
|
27
|
+
import { constructRuntimeRendererHost } from '../../renderer-host';
|
|
33
28
|
import { drawPublished } from '../draw-published';
|
|
34
|
-
import { createTestRenderAssetStore } from '../helpers/render-asset-port';
|
|
35
29
|
|
|
36
30
|
const WIDTH = 256;
|
|
37
31
|
const HEIGHT = 256;
|
|
@@ -207,25 +201,22 @@ describe('bug-20260522 AC-01 per-entity material texture isolation (dawn)', () =
|
|
|
207
201
|
removeEventListener() {},
|
|
208
202
|
} as unknown as HTMLCanvasElement;
|
|
209
203
|
|
|
210
|
-
|
|
211
|
-
let renderer: Awaited<ReturnType<typeof createRenderer>>;
|
|
204
|
+
let host: Awaited<ReturnType<typeof constructRuntimeRendererHost>>;
|
|
212
205
|
try {
|
|
213
|
-
|
|
206
|
+
host = await constructRuntimeRendererHost(
|
|
214
207
|
mockCanvas,
|
|
215
208
|
{},
|
|
216
209
|
{
|
|
217
210
|
shaderManifestUrl: ENGINE_MANIFEST_URL,
|
|
218
|
-
assetResolver: assetStore.resolver,
|
|
219
211
|
},
|
|
220
212
|
);
|
|
221
213
|
} finally {
|
|
222
214
|
globalThis.navigator.gpu.requestAdapter = originalRequestAdapter;
|
|
223
215
|
}
|
|
224
|
-
expect(
|
|
225
|
-
|
|
226
|
-
const
|
|
227
|
-
expect(
|
|
228
|
-
if (!ready.ok) return;
|
|
216
|
+
expect(host.ok).toBe(true);
|
|
217
|
+
if (!host.ok) throw host.error;
|
|
218
|
+
const { renderer, assets } = host.value;
|
|
219
|
+
expect(renderer.inspect().state).toBe('alive');
|
|
229
220
|
|
|
230
221
|
const device = sharedDevice;
|
|
231
222
|
expect(device).toBeDefined();
|
|
@@ -239,7 +230,7 @@ describe('bug-20260522 AC-01 per-entity material texture isolation (dawn)', () =
|
|
|
239
230
|
// GUID; the extract stage resolves it via assets.lookup(guid) then mints a
|
|
240
231
|
// user-tier column handle via world.allocSharedRef.
|
|
241
232
|
const texGreenGuid = AssetGuid.random();
|
|
242
|
-
|
|
233
|
+
assets.catalog(texGreenGuid, makeChequerTexture(0, 200, 0));
|
|
243
234
|
const matA = world.allocSharedRef<'MaterialAsset', MaterialAsset>('MaterialAsset', {
|
|
244
235
|
kind: 'material',
|
|
245
236
|
passes: [
|
|
@@ -421,25 +412,22 @@ describe('bug-20260522 AC-01 per-entity material texture isolation (dawn)', () =
|
|
|
421
412
|
removeEventListener() {},
|
|
422
413
|
} as unknown as HTMLCanvasElement;
|
|
423
414
|
|
|
424
|
-
|
|
425
|
-
let renderer: Awaited<ReturnType<typeof createRenderer>>;
|
|
415
|
+
let host: Awaited<ReturnType<typeof constructRuntimeRendererHost>>;
|
|
426
416
|
try {
|
|
427
|
-
|
|
417
|
+
host = await constructRuntimeRendererHost(
|
|
428
418
|
mockCanvas,
|
|
429
419
|
{},
|
|
430
420
|
{
|
|
431
421
|
shaderManifestUrl: ENGINE_MANIFEST_URL,
|
|
432
|
-
assetResolver: assetStore.resolver,
|
|
433
422
|
},
|
|
434
423
|
);
|
|
435
424
|
} finally {
|
|
436
425
|
globalThis.navigator.gpu.requestAdapter = originalRequestAdapter;
|
|
437
426
|
}
|
|
438
|
-
expect(
|
|
439
|
-
|
|
440
|
-
const
|
|
441
|
-
expect(
|
|
442
|
-
if (!ready.ok) return;
|
|
427
|
+
expect(host.ok).toBe(true);
|
|
428
|
+
if (!host.ok) throw host.error;
|
|
429
|
+
const { renderer, assets } = host.value;
|
|
430
|
+
expect(renderer.inspect().state).toBe('alive');
|
|
443
431
|
|
|
444
432
|
const device = sharedDevice;
|
|
445
433
|
expect(device).toBeDefined();
|
|
@@ -451,7 +439,7 @@ describe('bug-20260522 AC-01 per-entity material texture isolation (dawn)', () =
|
|
|
451
439
|
// texture POD is catalogued (GUID->payload SSOT) and the extract stage
|
|
452
440
|
// resolves it to a user-tier column handle via world.allocSharedRef.
|
|
453
441
|
const texGreenGuid2 = AssetGuid.random();
|
|
454
|
-
|
|
442
|
+
assets.catalog(texGreenGuid2, makeChequerTexture(0, 200, 0));
|
|
455
443
|
const matA = world.allocSharedRef<'MaterialAsset', MaterialAsset>('MaterialAsset', {
|
|
456
444
|
kind: 'material',
|
|
457
445
|
passes: [
|