@forgeax/engine-render 0.1.27 → 0.1.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +842 -124
- package/dist/assembly/atmosphere-shader-prewarm.d.ts +6 -0
- package/dist/assembly/atmosphere-shader-prewarm.d.ts.map +1 -0
- package/dist/assembly/dynamic-geometry-host.d.ts +52 -0
- package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -0
- package/dist/assembly/dynamic-geometry-runtime.d.ts +20 -0
- package/dist/assembly/dynamic-geometry-runtime.d.ts.map +1 -0
- package/dist/assembly/factory.d.ts +3 -1
- package/dist/assembly/factory.d.ts.map +1 -1
- package/dist/assembly/gpu-driven-owner.d.ts +10 -0
- package/dist/assembly/gpu-driven-owner.d.ts.map +1 -0
- package/dist/assembly/host-contract.d.ts +19 -0
- package/dist/assembly/host-contract.d.ts.map +1 -1
- package/dist/assembly/material/assembly.d.ts +7 -0
- package/dist/assembly/material/assembly.d.ts.map +1 -1
- package/dist/assembly/material-shader-policy.d.ts +3 -1
- package/dist/assembly/material-shader-policy.d.ts.map +1 -1
- package/dist/assembly/recovery/failure-location.d.ts +12 -0
- package/dist/assembly/recovery/failure-location.d.ts.map +1 -0
- package/dist/assembly/recovery/renderer-recover.d.ts +6 -4
- package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
- package/dist/assembly/renderer-facade.d.ts.map +1 -1
- package/dist/assembly/renderer-feature-inspection.d.ts +5 -0
- package/dist/assembly/renderer-feature-inspection.d.ts.map +1 -0
- package/dist/assembly/renderer-frame-transaction.d.ts +19 -0
- package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
- package/dist/assembly/renderer-helpers.d.ts +3 -0
- package/dist/assembly/renderer-helpers.d.ts.map +1 -1
- package/dist/assembly/renderer-inspection.d.ts +4 -0
- package/dist/assembly/renderer-inspection.d.ts.map +1 -1
- package/dist/assembly/shader-prewarm-policy.d.ts +6 -0
- package/dist/assembly/shader-prewarm-policy.d.ts.map +1 -1
- package/dist/assembly/skin-palette-owner.d.ts +8 -0
- package/dist/assembly/skin-palette-owner.d.ts.map +1 -0
- package/dist/assembly/ssr-shader-prewarm.d.ts +6 -0
- package/dist/assembly/ssr-shader-prewarm.d.ts.map +1 -0
- package/dist/assembly/webgpu-device-loss.d.ts +15 -0
- package/dist/assembly/webgpu-device-loss.d.ts.map +1 -0
- package/dist/assembly/webgpu-pbr-ready.d.ts +38 -0
- package/dist/assembly/webgpu-pbr-ready.d.ts.map +1 -0
- package/dist/assembly/webgpu-ready-mipmap.d.ts +11 -0
- package/dist/assembly/webgpu-ready-mipmap.d.ts.map +1 -0
- package/dist/assembly/webgpu-ready.d.ts +7 -3
- package/dist/assembly/webgpu-ready.d.ts.map +1 -1
- package/dist/assembly/webgpu-renderer-bootstrap.d.ts +10 -0
- package/dist/assembly/webgpu-renderer-bootstrap.d.ts.map +1 -0
- package/dist/assembly/webgpu-renderer-contract.d.ts +62 -0
- package/dist/assembly/webgpu-renderer-contract.d.ts.map +1 -0
- package/dist/assembly/webgpu-renderer-guards.d.ts +9 -0
- package/dist/assembly/webgpu-renderer-guards.d.ts.map +1 -0
- package/dist/assembly/webgpu-renderer-observation.d.ts +6 -0
- package/dist/assembly/webgpu-renderer-observation.d.ts.map +1 -0
- package/dist/assembly/webgpu-renderer-recovery-failure.d.ts +12 -0
- package/dist/assembly/webgpu-renderer-recovery-failure.d.ts.map +1 -0
- package/dist/assembly/webgpu-renderer.d.ts +7 -141
- package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
- package/dist/assembly/webgpu-vertex-layouts.d.ts +28 -84
- package/dist/assembly/webgpu-vertex-layouts.d.ts.map +1 -1
- package/dist/authoring.mjs +3 -3
- package/dist/{chunk-ADHHVYLW.mjs → chunk-33XZFTQU.mjs} +245 -39
- package/dist/chunk-33XZFTQU.mjs.map +1 -0
- package/dist/{chunk-GF523LHF.mjs → chunk-BLXGONR2.mjs} +30 -12
- package/dist/chunk-BLXGONR2.mjs.map +1 -0
- package/dist/{chunk-KM2NOX2I.mjs → chunk-BQVQOQJH.mjs} +958 -254
- package/dist/chunk-BQVQOQJH.mjs.map +1 -0
- package/dist/{chunk-HKXTW355.mjs → chunk-BTWH7BP4.mjs} +386 -17
- package/dist/chunk-BTWH7BP4.mjs.map +1 -0
- package/dist/{chunk-TMIASV2N.mjs → chunk-FUODTTIA.mjs} +3934 -676
- package/dist/chunk-FUODTTIA.mjs.map +1 -0
- package/dist/{chunk-FJ6P52EE.mjs → chunk-ILQ5MEZF.mjs} +3 -17
- package/dist/chunk-ILQ5MEZF.mjs.map +1 -0
- package/dist/{chunk-E34VL5VI.mjs → chunk-JQTSEI3Z.mjs} +3 -3
- package/dist/{chunk-E34VL5VI.mjs.map → chunk-JQTSEI3Z.mjs.map} +1 -1
- package/dist/{chunk-GE3SDD72.mjs → chunk-NICXSHAT.mjs} +16 -38
- package/dist/chunk-NICXSHAT.mjs.map +1 -0
- package/dist/{chunk-ZZ4YQ474.mjs → chunk-NRNXBLIJ.mjs} +577 -7
- package/dist/chunk-NRNXBLIJ.mjs.map +1 -0
- package/dist/{chunk-JDWARUOI.mjs → chunk-PA5DRJNI.mjs} +17 -3
- package/dist/chunk-PA5DRJNI.mjs.map +1 -0
- package/dist/{chunk-XDP6XE5V.mjs → chunk-S4DNKQYQ.mjs} +1118 -446
- package/dist/chunk-S4DNKQYQ.mjs.map +1 -0
- package/dist/components/camera.d.ts +62 -2
- package/dist/components/camera.d.ts.map +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/instances.d.ts +6 -20
- package/dist/components/instances.d.ts.map +1 -1
- package/dist/components/scene-instance.d.ts +2 -1
- package/dist/components/scene-instance.d.ts.map +1 -1
- package/dist/components/screen-space-reflection.d.ts +14 -0
- package/dist/components/screen-space-reflection.d.ts.map +1 -0
- package/dist/construct-renderer.mjs +13805 -7186
- package/dist/construct-renderer.mjs.map +1 -1
- package/dist/device/gpu-residency.d.ts +11 -17
- package/dist/device/gpu-residency.d.ts.map +1 -1
- package/dist/device/mesh-residency-lifetime.d.ts +21 -0
- package/dist/device/mesh-residency-lifetime.d.ts.map +1 -0
- package/dist/dynamic-geometry.d.ts +125 -0
- package/dist/dynamic-geometry.d.ts.map +1 -0
- package/dist/environment/background.d.ts +6 -0
- package/dist/environment/background.d.ts.map +1 -0
- package/dist/errors/gpu-driven.d.ts +6 -3
- package/dist/errors/gpu-driven.d.ts.map +1 -1
- package/dist/errors/render.d.ts +7 -4
- package/dist/errors/render.d.ts.map +1 -1
- package/dist/extract/camera.d.ts.map +1 -1
- package/dist/extract/gpu-driven.d.ts +33 -3
- package/dist/extract/gpu-driven.d.ts.map +1 -1
- package/dist/features/host.d.ts +23 -1
- package/dist/features/host.d.ts.map +1 -1
- package/dist/features/noise-texture.d.ts +17 -0
- package/dist/features/noise-texture.d.ts.map +1 -0
- package/dist/features/plan.d.ts +83 -2
- package/dist/features/plan.d.ts.map +1 -1
- package/dist/features/prepared-gpu-work.d.ts +37 -4
- package/dist/features/prepared-gpu-work.d.ts.map +1 -1
- package/dist/features/prepared-graphics-store.d.ts.map +1 -1
- package/dist/features/prepared-graphics.d.ts +5 -0
- package/dist/features/prepared-graphics.d.ts.map +1 -1
- package/dist/features/render-graph-compute.d.ts +5 -3
- package/dist/features/render-graph-compute.d.ts.map +1 -1
- package/dist/features/render-graph-contribution.d.ts +11 -3
- package/dist/features/render-graph-contribution.d.ts.map +1 -1
- package/dist/features/render-graph-raster.d.ts +19 -3
- package/dist/features/render-graph-raster.d.ts.map +1 -1
- package/dist/features/types.d.ts +11 -0
- package/dist/features/types.d.ts.map +1 -1
- package/dist/fullscreen-post-process-pass.d.ts +2 -0
- package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
- package/dist/gpu-driven/batch-topology.d.ts +34 -1
- package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
- package/dist/gpu-driven/pbr-program.d.ts +10 -0
- package/dist/gpu-driven/pbr-program.d.ts.map +1 -0
- package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
- package/dist/gpu-driven/production-raster.d.ts +144 -23
- package/dist/gpu-driven/production-raster.d.ts.map +1 -1
- package/dist/gpu-driven/shadow-views.d.ts +126 -0
- package/dist/gpu-driven/shadow-views.d.ts.map +1 -0
- package/dist/gpu-driven/view-gpu.d.ts +18 -2
- package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
- package/dist/gpu-scene-schema.d.ts +2 -8
- package/dist/gpu-scene-schema.d.ts.map +1 -1
- package/dist/gpu-scene.d.ts +14 -0
- package/dist/gpu-scene.d.ts.map +1 -1
- package/dist/gpu-texture-usage.d.ts +1 -0
- package/dist/gpu-texture-usage.d.ts.map +1 -1
- package/dist/hdrp-buffers.d.ts +6 -0
- package/dist/hdrp-buffers.d.ts.map +1 -1
- package/dist/ibl/frame-resources.d.ts +8 -0
- package/dist/ibl/frame-resources.d.ts.map +1 -0
- package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
- package/dist/index.d.ts +21 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +8 -7
- package/dist/index.mjs.map +1 -1
- package/dist/inspection-types.d.ts +164 -0
- package/dist/inspection-types.d.ts.map +1 -1
- package/dist/instances-derived-bounds.d.ts +11 -0
- package/dist/instances-derived-bounds.d.ts.map +1 -1
- package/dist/instances.d.ts +89 -44
- package/dist/instances.d.ts.map +1 -1
- package/dist/internal.d.ts +3 -0
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.mjs +118 -10
- package/dist/internal.mjs.map +1 -1
- package/dist/lifecycle.d.ts +2 -1
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/material-row.d.ts +5 -0
- package/dist/material-row.d.ts.map +1 -0
- package/dist/materials.d.ts +15 -0
- package/dist/materials.d.ts.map +1 -1
- package/dist/pbr-pipeline.d.ts +21 -5
- package/dist/pbr-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
- package/dist/pipeline/standard-output/auto-exposure/capability.d.ts +12 -0
- package/dist/pipeline/standard-output/auto-exposure/capability.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts +70 -0
- package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/graph.d.ts +75 -0
- package/dist/pipeline/standard-output/auto-exposure/graph.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts +111 -0
- package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts +16 -0
- package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/preset.d.ts +14 -0
- package/dist/pipeline/standard-output/auto-exposure/preset.d.ts.map +1 -0
- package/dist/pipeline/standard-output/auto-exposure/state.d.ts +46 -0
- package/dist/pipeline/standard-output/auto-exposure/state.d.ts.map +1 -0
- package/dist/pipeline/standard-output/color-transform.d.ts +27 -0
- package/dist/pipeline/standard-output/color-transform.d.ts.map +1 -0
- package/dist/pipeline/standard-output/graph.d.ts +15 -0
- package/dist/pipeline/standard-output/graph.d.ts.map +1 -0
- package/dist/pipeline/standard-output/lut-admission.d.ts +29 -0
- package/dist/pipeline/standard-output/lut-admission.d.ts.map +1 -0
- package/dist/pipeline/standard-output/lut-gpu.d.ts +48 -0
- package/dist/pipeline/standard-output/lut-gpu.d.ts.map +1 -0
- package/dist/pipeline/standard-output/lut-state.d.ts +68 -0
- package/dist/pipeline/standard-output/lut-state.d.ts.map +1 -0
- package/dist/pipeline/standard-output/resources.d.ts +10 -0
- package/dist/pipeline/standard-output/resources.d.ts.map +1 -0
- package/dist/pipeline/standard-output/types.d.ts +39 -0
- package/dist/pipeline/standard-output/types.d.ts.map +1 -0
- package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-post.d.ts +2 -2
- package/dist/pipeline/standard-post.d.ts.map +1 -1
- package/dist/pipeline-builder.d.ts +2 -1
- package/dist/pipeline-builder.d.ts.map +1 -1
- package/dist/pipeline-spec-types.d.ts +4 -0
- package/dist/pipeline-spec-types.d.ts.map +1 -1
- package/dist/pipeline-spec.d.ts +1 -9
- package/dist/pipeline-spec.d.ts.map +1 -1
- package/dist/points-lines/standard-owner.d.ts +1 -1
- package/dist/points-lines/standard-owner.d.ts.map +1 -1
- package/dist/prepare/prepared-graphics-resolver.d.ts +6 -1
- package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
- package/dist/record/dynamic-geometry-consumption.d.ts +15 -0
- package/dist/record/dynamic-geometry-consumption.d.ts.map +1 -0
- package/dist/record/frame-lighting.d.ts +3 -3
- package/dist/record/frame-lighting.d.ts.map +1 -1
- package/dist/record/frame-snapshot.d.ts +106 -5
- package/dist/record/frame-snapshot.d.ts.map +1 -1
- package/dist/record/frame-targets.d.ts.map +1 -1
- package/dist/record/frame.d.ts +39 -4
- package/dist/record/frame.d.ts.map +1 -1
- package/dist/record/main-pass-geometry.d.ts +7 -8
- package/dist/record/main-pass-geometry.d.ts.map +1 -1
- package/dist/record/main-pass-material.d.ts +38 -1
- package/dist/record/main-pass-material.d.ts.map +1 -1
- package/dist/record/main-pass-sprite-draws.d.ts +2 -10
- package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
- package/dist/record/main-pass.d.ts +12 -2
- package/dist/record/main-pass.d.ts.map +1 -1
- package/dist/record/mesh-ssbo.d.ts +15 -6
- package/dist/record/mesh-ssbo.d.ts.map +1 -1
- package/dist/record/prepared-material-bindings.d.ts +19 -0
- package/dist/record/prepared-material-bindings.d.ts.map +1 -0
- package/dist/record/recovery-pipeline.d.ts +2 -9
- package/dist/record/recovery-pipeline.d.ts.map +1 -1
- package/dist/record/render-context.d.ts +76 -26
- package/dist/record/render-context.d.ts.map +1 -1
- package/dist/record/shadow-pass.d.ts +62 -7
- package/dist/record/shadow-pass.d.ts.map +1 -1
- package/dist/record/skybox-post-pass.d.ts +1 -1
- package/dist/record/skybox-post-pass.d.ts.map +1 -1
- package/dist/record/typed-frame-graph.d.ts +35 -7
- package/dist/record/typed-frame-graph.d.ts.map +1 -1
- package/dist/record/view-ubo.d.ts +1 -0
- package/dist/record/view-ubo.d.ts.map +1 -1
- package/dist/recovery/render-system-candidate.d.ts +10 -2
- package/dist/recovery/render-system-candidate.d.ts.map +1 -1
- package/dist/recovery/render-system-roots.d.ts +11 -0
- package/dist/recovery/render-system-roots.d.ts.map +1 -0
- package/dist/recovery/types.d.ts +76 -0
- package/dist/recovery/types.d.ts.map +1 -0
- package/dist/reflection/record-owner.d.ts +0 -2
- package/dist/reflection/record-owner.d.ts.map +1 -1
- package/dist/render-contract.d.ts +185 -30
- package/dist/render-contract.d.ts.map +1 -1
- package/dist/render-graph-primitives.d.ts +1 -0
- package/dist/render-graph-primitives.d.ts.map +1 -1
- package/dist/render-pipeline.d.ts +64 -5
- package/dist/render-pipeline.d.ts.map +1 -1
- package/dist/render-system-extract-tail.d.ts +7 -5
- package/dist/render-system-extract-tail.d.ts.map +1 -1
- package/dist/render-system-extract.d.ts +101 -41
- package/dist/render-system-extract.d.ts.map +1 -1
- package/dist/render-system-projections.d.ts +22 -0
- package/dist/render-system-projections.d.ts.map +1 -0
- package/dist/render-system.d.ts +34 -77
- package/dist/render-system.d.ts.map +1 -1
- package/dist/scene/render-scene-types.d.ts +14 -7
- package/dist/scene/render-scene-types.d.ts.map +1 -1
- package/dist/scene/render-scene.d.ts +29 -11
- package/dist/scene/render-scene.d.ts.map +1 -1
- package/dist/scene/shadow-visibility.d.ts +5 -0
- package/dist/scene/shadow-visibility.d.ts.map +1 -0
- package/dist/ssr/admission.d.ts +70 -1
- package/dist/ssr/admission.d.ts.map +1 -1
- package/dist/ssr/compose.d.ts +13 -0
- package/dist/ssr/compose.d.ts.map +1 -0
- package/dist/ssr/errors.d.ts +35 -0
- package/dist/ssr/errors.d.ts.map +1 -1
- package/dist/ssr/graph.d.ts +60 -0
- package/dist/ssr/graph.d.ts.map +1 -0
- package/dist/ssr/history.d.ts +97 -0
- package/dist/ssr/history.d.ts.map +1 -0
- package/dist/ssr/hiz.d.ts +37 -0
- package/dist/ssr/hiz.d.ts.map +1 -0
- package/dist/ssr/inspection.d.ts +42 -0
- package/dist/ssr/inspection.d.ts.map +1 -0
- package/dist/ssr/resources.d.ts +58 -0
- package/dist/ssr/resources.d.ts.map +1 -0
- package/dist/ssr/temporal.d.ts +38 -0
- package/dist/ssr/temporal.d.ts.map +1 -0
- package/dist/systems/skin-palette-allocator.d.ts +32 -10
- package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
- package/dist/systems/skin-palette-types.d.ts +15 -0
- package/dist/systems/skin-palette-types.d.ts.map +1 -1
- package/dist/systems/transparent-dispatch.d.ts +9 -0
- package/dist/systems/transparent-dispatch.d.ts.map +1 -0
- package/dist/targets/material-source.d.ts +7 -0
- package/dist/targets/material-source.d.ts.map +1 -1
- package/dist/temporal/frame-coordinator.d.ts +7 -0
- package/dist/temporal/frame-coordinator.d.ts.map +1 -1
- package/dist/temporal/gpu.d.ts +8 -0
- package/dist/temporal/gpu.d.ts.map +1 -1
- package/dist/temporal/history.d.ts.map +1 -1
- package/dist/temporal/index.mjs +6 -6
- package/dist/temporal/inspection.d.ts.map +1 -1
- package/dist/temporal/standard-scene-data.d.ts +2 -1
- package/dist/temporal/standard-scene-data.d.ts.map +1 -1
- package/dist/temporal/temporal-view.d.ts +2 -0
- package/dist/temporal/temporal-view.d.ts.map +1 -1
- package/dist/typed-render-graph-primitives.d.ts +35 -1
- package/dist/typed-render-graph-primitives.d.ts.map +1 -1
- package/dist/typed-shadow-passes.d.ts +3 -1
- package/dist/typed-shadow-passes.d.ts.map +1 -1
- package/dist/volume/temporal.d.ts +6 -0
- package/dist/volume/temporal.d.ts.map +1 -1
- package/package.json +21 -20
- package/src/__tests__/auto-exposure-gpu-evidence.ts +291 -0
- package/src/__tests__/auto-exposure-inspection.unit.test.ts +80 -0
- package/src/__tests__/auto-exposure-transaction.integration.test.ts +99 -0
- package/src/__tests__/auto-exposure.browser.test.ts +33 -0
- package/src/__tests__/auto-exposure.dawn.test.ts +33 -0
- package/src/__tests__/detached-inspection.integration.test.ts +5 -0
- package/src/__tests__/device-scope-lifecycle.unit.test.ts +18 -0
- package/src/__tests__/device-scope-stale-matrix.unit.test.ts +18 -0
- package/src/__tests__/docs-gate-green.unit.test.ts +3 -3
- package/src/__tests__/dynamic-geometry-host.unit.test.ts +1123 -0
- package/src/__tests__/dynamic-geometry.unit.test.ts +233 -0
- package/src/__tests__/factory-contract.integration.test.ts +73 -22
- package/src/__tests__/fallback-row-stride-surface.unit.test.ts +19 -0
- package/src/__tests__/feature-depth-input.dawn.test.ts +121 -0
- package/src/__tests__/feature-noise.unit.test.ts +38 -0
- package/src/__tests__/fixtures/taa-resolve-pinned-baseline.wgsl +301 -0
- package/src/__tests__/frame-camera-selection.unit.test.ts +131 -0
- package/src/__tests__/frame-plan-contract.unit.test.ts +24 -0
- package/src/__tests__/frame-targets.unit.test.ts +24 -0
- package/src/__tests__/fullscreen-feature-plan.unit.test.ts +3 -0
- package/src/__tests__/gpu-driven-baseline.characterization.test.ts +79 -0
- package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +287 -6
- package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +122 -142
- package/src/__tests__/gpu-driven-indirect-raster.browser.test.ts +10 -1
- package/src/__tests__/gpu-driven-lod-cache.unit.test.ts +264 -0
- package/src/__tests__/gpu-driven-mesh-world-identity.unit.test.ts +349 -0
- package/src/__tests__/gpu-driven-pbr.dawn.test.ts +1417 -0
- package/src/__tests__/gpu-driven-pbr.integration.test.ts +21 -0
- package/src/__tests__/gpu-driven-production-fixture.ts +96 -0
- package/src/__tests__/gpu-driven-production.integration.test.ts +1075 -93
- package/src/__tests__/gpu-driven-scaling.unit.test.ts +1 -3
- package/src/__tests__/gpu-driven-shadow-views.browser.test.ts +63 -0
- package/src/__tests__/gpu-driven-shadow-views.dawn.test.ts +294 -0
- package/src/__tests__/gpu-driven-shadow-views.integration.test.ts +97 -0
- package/src/__tests__/gpu-driven-shadow-views.unit.test.ts +168 -0
- package/src/__tests__/gpu-driven-skin-contract.test-d.ts +11 -0
- package/src/__tests__/gpu-driven-view-gpu-evidence.ts +72 -20
- package/src/__tests__/gpu-driven-view-graph.integration.test.ts +30 -9
- package/src/__tests__/gpu-driven-view.unit.test.ts +159 -52
- package/src/__tests__/gpu-pass-timing.browser.test.ts +6 -1
- package/src/__tests__/gpu-resource-store-stride.unit.test.ts +42 -0
- package/src/__tests__/gpu-scene-render-graph-gpu.ts +19 -5
- package/src/__tests__/gpu-scene.dawn.test.ts +40 -13
- package/src/__tests__/gpu-scene.unit.test.ts +559 -33
- package/src/__tests__/instances-culling.integration.test.ts +36 -10
- package/src/__tests__/instances-derived-bounds.unit.test.ts +54 -0
- package/src/__tests__/instances-store.unit.test.ts +242 -39
- package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +6 -0
- package/src/__tests__/lighting-scene-roundtrip.integration.test.ts +13 -16
- package/src/__tests__/lut-lkg-transaction.integration.test.ts +122 -0
- package/src/__tests__/material-contract-inventory.unit.test.ts +5 -6
- package/src/__tests__/material-dispatch-shader-id.unit.test.ts +51 -0
- package/src/__tests__/material-lane-selection.unit.test.ts +60 -0
- package/src/__tests__/material-numeric-upload.unit.test.ts +53 -0
- package/src/__tests__/material-texture-handles.unit.test.ts +18 -0
- package/src/__tests__/material-texture-source.unit.test.ts +87 -0
- package/src/__tests__/materials-authoring-validation.unit.test.ts +41 -0
- package/src/__tests__/materials-standard-contract.unit.test.ts +52 -2
- package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +4 -0
- package/src/__tests__/mesh-submission-lifetime.unit.test.ts +53 -0
- package/src/__tests__/normal-fallback.dawn.test.ts +122 -0
- package/src/__tests__/particle-material-input-layout.unit.test.ts +104 -0
- package/src/__tests__/physical-clearcoat.integration.test.ts +37 -3
- package/src/__tests__/pipeline-texture-specialization.unit.test.ts +138 -0
- package/src/__tests__/point-shadow-inspection.unit.test.ts +2 -0
- package/src/__tests__/prepared-gpu-driven-pbr-contract.test-d.ts +31 -0
- package/src/__tests__/prepared-gpu-driven-pbr-contract.unit.test.ts +39 -0
- package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +35 -4
- package/src/__tests__/prepared-graphics-capability.unit.test.ts +21 -0
- package/src/__tests__/prepared-graphics-pipeline-warmup.unit.test.ts +6 -2
- package/src/__tests__/profiler-phase-catalog.test.ts +5 -0
- package/src/__tests__/public-surface.test-d.ts +3 -0
- package/src/__tests__/recovery-candidate-prepare.contract.test.ts +30 -12
- package/src/__tests__/reflection-fallback-async-publication.unit.test.ts +104 -0
- package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +2 -1
- package/src/__tests__/render-error-code-owner.test-d.ts +4 -0
- package/src/__tests__/render-error-detail-ssot.test-d.ts +22 -0
- package/src/__tests__/render-error-exhaustive.test-d.ts +15 -0
- package/src/__tests__/render-feature-gpu-work.integration.test.ts +285 -2
- package/src/__tests__/render-feature-plan.unit.test.ts +245 -0
- package/src/__tests__/render-feature-shadow-order.unit.test.ts +228 -0
- package/src/__tests__/render-feature-zero-work.unit.test.ts +35 -1
- package/src/__tests__/render-graph-fallback.integration.test.ts +2 -2
- package/src/__tests__/render-owner-cohesion.unit.test.ts +55 -0
- package/src/__tests__/render-scene-mixed-updates.integration.test.ts +426 -0
- package/src/__tests__/render-scene-projection.unit.test.ts +914 -23
- package/src/__tests__/render-scene-resource-updates.integration.test.ts +214 -0
- package/src/__tests__/render-scene-skin-lifecycle.integration.test.ts +173 -0
- package/src/__tests__/render-scene-temporal-retry.unit.test.ts +133 -0
- package/src/__tests__/render-target-material-source.test-d.ts +27 -3
- package/src/__tests__/renderer-factory-material-contract.unit.test.ts +61 -1
- package/src/__tests__/renderer-frame-transaction.integration.test.ts +923 -5
- package/src/__tests__/shader-manifest-fixture.ts +39 -0
- package/src/__tests__/skin-motion-regression.unit.test.ts +0 -33
- package/src/__tests__/skin-palette-persistent.integration.test.ts +28 -0
- package/src/__tests__/skin-palette-persistent.unit.test.ts +247 -0
- package/src/__tests__/skinned-shadow-caster.test.ts +118 -14
- package/src/__tests__/specular-environment-scale.dawn.test.ts +156 -0
- package/src/__tests__/ssr-admission-matrix.integration.test.ts +7 -1
- package/src/__tests__/ssr-confidence-compose.unit.test.ts +84 -0
- package/src/__tests__/ssr-coordinate-oracle.unit.test.ts +28 -0
- package/src/__tests__/ssr-format-probe-gating.integration.test.ts +82 -0
- package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +91 -0
- package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +112 -0
- package/src/__tests__/ssr-gpu-dispatch.ts +946 -0
- package/src/__tests__/ssr-graph-topology.unit.test.ts +104 -0
- package/src/__tests__/ssr-history-filter.dawn.test.ts +198 -0
- package/src/__tests__/ssr-hit-color.dawn.test.ts +273 -0
- package/src/__tests__/ssr-hiz-odd-reduction.dawn.test.ts +569 -0
- package/src/__tests__/ssr-hiz-rescue.dawn.test.ts +279 -0
- package/src/__tests__/ssr-hiz.browser.test.ts +150 -0
- package/src/__tests__/ssr-hiz.dawn.test.ts +150 -0
- package/src/__tests__/ssr-hiz.unit.test.ts +56 -0
- package/src/__tests__/ssr-inspection.unit.test.ts +105 -0
- package/src/__tests__/ssr-memory-budget.unit.test.ts +45 -0
- package/src/__tests__/ssr-performance-sequence-aggregation.unit.test.ts +15 -0
- package/src/__tests__/ssr-public-surface.test-d.ts +37 -0
- package/src/__tests__/ssr-receiver-coverage.dawn.test.ts +387 -0
- package/src/__tests__/ssr-reflection-mip-reducer.dawn.test.ts +309 -0
- package/src/__tests__/ssr-reprojection-probe.ts +90 -0
- package/src/__tests__/ssr-roughness-mip.dawn.test.ts +163 -0
- package/src/__tests__/ssr-shader-prewarm.unit.test.ts +59 -0
- package/src/__tests__/ssr-spatial.integration.test.ts +141 -0
- package/src/__tests__/ssr-stable-lattice.dawn.test.ts +475 -0
- package/src/__tests__/ssr-temporal-history.unit.test.ts +202 -0
- package/src/__tests__/ssr-texel-crossing.dawn.test.ts +448 -0
- package/src/__tests__/ssr-zero-work.integration.test.ts +87 -0
- package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +44 -12
- package/src/__tests__/standard-clustered-pipeline.unit.test.ts +29 -0
- package/src/__tests__/standard-output-chain-contract.unit.test.ts +99 -0
- package/src/__tests__/standard-output-chain.integration.test.ts +73 -0
- package/src/__tests__/standard-output-gpu-evidence.ts +205 -0
- package/src/__tests__/standard-output.browser.test.ts +15 -0
- package/src/__tests__/standard-output.dawn.test.ts +15 -0
- package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +38 -0
- package/src/__tests__/standard-pipeline.integration.test.ts +320 -3
- package/src/__tests__/standard-profile-oracle.unit.test.ts +22 -0
- package/src/__tests__/standard-surface-lighting.unit.test.ts +41 -0
- package/src/__tests__/standard-texture-specialization.dawn.test.ts +141 -0
- package/src/__tests__/surface-adjacent-regressions.integration.test.ts +6 -3
- package/src/__tests__/taa-coverage-edge.dawn.test.ts +193 -0
- package/src/__tests__/taa-history-clipping.dawn.test.ts +328 -0
- package/src/__tests__/taa-neighborhood-equivalence.dawn.test.ts +778 -0
- package/src/__tests__/taa-stability-feedback.browser.test.ts +23 -0
- package/src/__tests__/taa-stability-feedback.dawn.test.ts +68 -0
- package/src/__tests__/taa-stability-feedback.ts +341 -0
- package/src/__tests__/temporal-history-lifecycle.unit.test.ts +49 -7
- package/src/__tests__/temporal-reset-matrix.unit.test.ts +9 -0
- package/src/__tests__/temporal-transaction.integration.test.ts +28 -0
- package/src/__tests__/texture-usage-surface.unit.test.ts +4 -2
- package/src/__tests__/typed-pipeline-topology.unit.test.ts +109 -4
- package/src/__tests__/typed-scene-pass-material-cache.integration.test.ts +126 -0
- package/src/__tests__/vertex-layouts-ssot.unit.test.ts +47 -0
- package/src/__tests__/visibility-extract.perf.test.ts +20 -8
- package/src/__tests__/visibility-instances.integration.test.ts +19 -7
- package/src/__tests__/visibility-producer-matrix.integration.test.ts +20 -9
- package/src/assembly/atmosphere-shader-prewarm.ts +38 -0
- package/src/assembly/dynamic-geometry-host.ts +887 -0
- package/src/assembly/dynamic-geometry-runtime.ts +71 -0
- package/src/assembly/factory.ts +4 -0
- package/src/assembly/gpu-driven-owner.ts +29 -0
- package/src/assembly/host-contract.ts +36 -0
- package/src/assembly/material/assembly.ts +38 -0
- package/src/assembly/material-shader-policy.ts +71 -28
- package/src/assembly/recovery/failure-location.ts +62 -0
- package/src/assembly/recovery/renderer-recover.ts +19 -17
- package/src/assembly/renderer-facade.ts +29 -0
- package/src/assembly/renderer-feature-inspection.ts +13 -0
- package/src/assembly/renderer-frame-transaction.ts +63 -0
- package/src/assembly/renderer-helpers.ts +26 -0
- package/src/assembly/renderer-inspection.ts +6 -0
- package/src/assembly/shader-prewarm-policy.ts +32 -0
- package/src/assembly/skin-palette-owner.ts +21 -0
- package/src/assembly/ssr-shader-prewarm.ts +41 -0
- package/src/assembly/webgpu-device-loss.ts +75 -0
- package/src/assembly/webgpu-pbr-ready.ts +232 -0
- package/src/assembly/webgpu-ready-mipmap.ts +26 -0
- package/src/assembly/webgpu-ready.ts +142 -121
- package/src/assembly/webgpu-renderer-bootstrap.ts +85 -0
- package/src/assembly/webgpu-renderer-contract.ts +69 -0
- package/src/assembly/webgpu-renderer-guards.ts +32 -0
- package/src/assembly/webgpu-renderer-observation.ts +43 -0
- package/src/assembly/webgpu-renderer-recovery-failure.ts +62 -0
- package/src/assembly/webgpu-renderer.ts +675 -614
- package/src/assembly/webgpu-vertex-layouts.ts +233 -87
- package/src/components/__tests__/camera-exposure.contract.unit.test.ts +153 -0
- package/src/components/camera.ts +287 -7
- package/src/components/index.ts +1 -0
- package/src/components/instances.ts +45 -18
- package/src/components/scene-instance.ts +2 -1
- package/src/components/screen-space-reflection.ts +21 -0
- package/src/components/sprite-animation.ts +3 -3
- package/src/components/sprite-instances.ts +1 -1
- package/src/device/gpu-residency.ts +96 -93
- package/src/device/mesh-residency-lifetime.ts +73 -0
- package/src/dynamic-geometry.ts +736 -0
- package/src/environment/background.ts +263 -0
- package/src/errors/gpu-driven.ts +39 -5
- package/src/errors/render.ts +27 -3
- package/src/extract/camera.ts +26 -1
- package/src/extract/gpu-driven.ts +185 -10
- package/src/features/host.ts +237 -19
- package/src/features/noise-texture.ts +91 -0
- package/src/features/plan.ts +553 -24
- package/src/features/prepared-gpu-work.ts +631 -49
- package/src/features/prepared-graphics-store.ts +31 -0
- package/src/features/prepared-graphics.ts +5 -0
- package/src/features/render-graph-compute.ts +41 -8
- package/src/features/render-graph-contribution.ts +141 -3
- package/src/features/render-graph-raster.ts +143 -30
- package/src/features/types.ts +11 -0
- package/src/fullscreen-post-process-pass.ts +3 -0
- package/src/gpu-driven/batch-topology.ts +424 -102
- package/src/gpu-driven/pbr-program.ts +31 -0
- package/src/gpu-driven/prepared-draw.ts +29 -4
- package/src/gpu-driven/production-raster.ts +2267 -694
- package/src/gpu-driven/shadow-views.ts +539 -0
- package/src/gpu-driven/view-gpu.ts +188 -41
- package/src/gpu-scene-schema.ts +52 -11
- package/src/gpu-scene.ts +186 -99
- package/src/gpu-texture-usage.ts +1 -0
- package/src/hdrp-buffers.ts +72 -36
- package/src/ibl/frame-resources.ts +38 -0
- package/src/ibl/skylight-bind-group.ts +5 -4
- package/src/index.ts +125 -1
- package/src/inspection-types.ts +191 -0
- package/src/instances-derived-bounds.ts +258 -34
- package/src/instances.ts +459 -150
- package/src/internal.ts +22 -0
- package/src/lifecycle.ts +2 -0
- package/src/material-row.ts +145 -0
- package/src/materials.ts +44 -8
- package/src/pbr-pipeline.ts +159 -17
- package/src/pipeline/standard-forward-lane.ts +52 -24
- package/src/pipeline/standard-output/__tests__/lut-admission.unit.test.ts +103 -0
- package/src/pipeline/standard-output/auto-exposure/__tests__/capability.unit.test.ts +40 -0
- package/src/pipeline/standard-output/auto-exposure/__tests__/gpu.contract.unit.test.ts +125 -0
- package/src/pipeline/standard-output/auto-exposure/__tests__/graph.contract.unit.test.ts +94 -0
- package/src/pipeline/standard-output/auto-exposure/__tests__/oracle.test.ts +108 -0
- package/src/pipeline/standard-output/auto-exposure/__tests__/preset.test.ts +26 -0
- package/src/pipeline/standard-output/auto-exposure/capability.ts +38 -0
- package/src/pipeline/standard-output/auto-exposure/gpu.ts +567 -0
- package/src/pipeline/standard-output/auto-exposure/graph.ts +221 -0
- package/src/pipeline/standard-output/auto-exposure/inspection.ts +231 -0
- package/src/pipeline/standard-output/auto-exposure/oracle.ts +291 -0
- package/src/pipeline/standard-output/auto-exposure/preset.ts +28 -0
- package/src/pipeline/standard-output/auto-exposure/state.ts +156 -0
- package/src/pipeline/standard-output/color-transform.ts +124 -0
- package/src/pipeline/standard-output/graph.ts +139 -0
- package/src/pipeline/standard-output/lut-admission.ts +121 -0
- package/src/pipeline/standard-output/lut-gpu.ts +399 -0
- package/src/pipeline/standard-output/lut-state.ts +176 -0
- package/src/pipeline/standard-output/resources.ts +121 -0
- package/src/pipeline/standard-output/types.ts +58 -0
- package/src/pipeline/standard-pipeline.ts +192 -59
- package/src/pipeline/standard-post.ts +186 -27
- package/src/pipeline-builder.ts +16 -6
- package/src/pipeline-spec-types.ts +4 -0
- package/src/pipeline-spec.ts +37 -29
- package/src/points-lines/standard-owner.ts +6 -14
- package/src/prepare/prepared-graphics-resolver.ts +9 -2
- package/src/record/__tests__/material-slot-plan.unit.test.ts +48 -0
- package/src/record/__tests__/mesh-ssbo.unit.test.ts +40 -1
- package/src/record/__tests__/recovery-pipeline.unit.test.ts +2 -29
- package/src/record/__tests__/sprite-material-abi.unit.test.ts +36 -5
- package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +45 -0
- package/src/record/__tests__/view-ubo-layout.unit.test.ts +5 -0
- package/src/record/dynamic-geometry-consumption.ts +59 -0
- package/src/record/frame-lighting.ts +12 -11
- package/src/record/frame-snapshot.ts +133 -23
- package/src/record/frame-targets.ts +9 -0
- package/src/record/frame.ts +727 -133
- package/src/record/main-pass-geometry.ts +162 -98
- package/src/record/main-pass-material.ts +115 -26
- package/src/record/main-pass-sprite-draws.ts +18 -107
- package/src/record/main-pass.ts +78 -8
- package/src/record/material-uniforms.ts +1 -1
- package/src/record/mesh-ssbo.ts +59 -15
- package/src/record/prepared-material-bindings.ts +234 -0
- package/src/record/recovery-pipeline.ts +59 -136
- package/src/record/render-context.ts +92 -22
- package/src/record/shadow-pass.ts +1231 -209
- package/src/record/skybox-post-pass.ts +14 -3
- package/src/record/typed-frame-graph.ts +1006 -53
- package/src/record/view-ubo.ts +11 -0
- package/src/recovery/render-system-candidate.ts +90 -66
- package/src/recovery/render-system-roots.ts +113 -0
- package/src/recovery/types.ts +77 -0
- package/src/reflection/record-owner.ts +26 -54
- package/src/render-contract.ts +219 -25
- package/src/render-graph-primitives.ts +6 -2
- package/src/render-pipeline.ts +70 -1
- package/src/render-system-extract-tail.ts +409 -160
- package/src/render-system-extract.ts +376 -102
- package/src/render-system-projections.ts +241 -0
- package/src/render-system.ts +692 -791
- package/src/scene/render-scene-types.ts +13 -4
- package/src/scene/render-scene.ts +569 -355
- package/src/scene/shadow-visibility.ts +21 -0
- package/src/ssr/admission.ts +380 -14
- package/src/ssr/compose.ts +144 -0
- package/src/ssr/errors.ts +48 -0
- package/src/ssr/graph.ts +777 -0
- package/src/ssr/history.ts +436 -0
- package/src/ssr/hiz.ts +124 -0
- package/src/ssr/inspection.ts +124 -0
- package/src/ssr/resources.ts +202 -0
- package/src/ssr/temporal.ts +164 -0
- package/src/systems/skin-palette-allocator.ts +495 -148
- package/src/systems/skin-palette-types.ts +17 -0
- package/src/systems/transparent-dispatch.ts +90 -0
- package/src/targets/material-source.ts +34 -0
- package/src/temporal/coverage.ts +1 -1
- package/src/temporal/frame-coordinator.ts +23 -2
- package/src/temporal/gpu.ts +74 -12
- package/src/temporal/history.ts +3 -1
- package/src/temporal/inspection.ts +2 -1
- package/src/temporal/standard-scene-data.ts +3 -1
- package/src/temporal/temporal-view.ts +3 -0
- package/src/transmission/__tests__/standard-transmission.dawn.test.ts +204 -139
- package/src/typed-render-graph-primitives.ts +266 -74
- package/src/typed-shadow-passes.ts +122 -12
- package/src/volume/temporal.ts +10 -0
- package/dist/chunk-ADHHVYLW.mjs.map +0 -1
- package/dist/chunk-FJ6P52EE.mjs.map +0 -1
- package/dist/chunk-GE3SDD72.mjs.map +0 -1
- package/dist/chunk-GF523LHF.mjs.map +0 -1
- package/dist/chunk-HKXTW355.mjs.map +0 -1
- package/dist/chunk-JDWARUOI.mjs.map +0 -1
- package/dist/chunk-KM2NOX2I.mjs.map +0 -1
- package/dist/chunk-TMIASV2N.mjs.map +0 -1
- package/dist/chunk-XDP6XE5V.mjs.map +0 -1
- package/dist/chunk-ZZ4YQ474.mjs.map +0 -1
- package/src/__tests__/instances-world-ownership.integration.test.ts +0 -62
- package/src/scene/__tests__/changed-block-summary.candidate.test.ts +0 -36
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { RenderFeatureHost } from '../features/host';
|
|
2
|
+
import type { RenderInspection } from '../render-contract';
|
|
3
|
+
|
|
4
|
+
/** Project feature-host lifecycle facts without exposing the live host. */
|
|
5
|
+
export function projectRendererFeatureInspection(
|
|
6
|
+
featureHost: RenderFeatureHost | undefined,
|
|
7
|
+
): Pick<RenderInspection, 'features' | 'featureDiagnostics' | 'featureHost'> {
|
|
8
|
+
return {
|
|
9
|
+
features: Object.freeze((featureHost?.features ?? []).map((feature) => feature.identity)),
|
|
10
|
+
featureDiagnostics: featureHost?.diagnostics() ?? Object.freeze([]),
|
|
11
|
+
...(featureHost?.inspection === undefined ? {} : { featureHost: featureHost.inspection() }),
|
|
12
|
+
};
|
|
13
|
+
}
|
|
@@ -118,3 +118,66 @@ export function executeRendererFrameTransaction<T>(
|
|
|
118
118
|
steps.commit(built.value);
|
|
119
119
|
return { ok: true, value: built.value };
|
|
120
120
|
}
|
|
121
|
+
|
|
122
|
+
export interface AutoExposureFrameTransactionOptions {
|
|
123
|
+
readonly failAt?: RendererFrameStage;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export type AutoExposureFrameTransactionResult =
|
|
127
|
+
| {
|
|
128
|
+
readonly ok: true;
|
|
129
|
+
readonly state: AutoExposureState;
|
|
130
|
+
readonly commitCount: 1;
|
|
131
|
+
}
|
|
132
|
+
| {
|
|
133
|
+
readonly ok: false;
|
|
134
|
+
readonly error: RendererFrameStageFailure;
|
|
135
|
+
readonly state: AutoExposureState;
|
|
136
|
+
readonly commitCount: 0;
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Adapt the auto-exposure candidate to the renderer's single submit barrier.
|
|
141
|
+
* This helper deliberately has no encoder or history state of its own.
|
|
142
|
+
*/
|
|
143
|
+
export function executeAutoExposureFrameTransaction(
|
|
144
|
+
state: AutoExposureState,
|
|
145
|
+
candidate: AutoExposureCandidate,
|
|
146
|
+
options: AutoExposureFrameTransactionOptions = {},
|
|
147
|
+
): AutoExposureFrameTransactionResult {
|
|
148
|
+
let committed = false;
|
|
149
|
+
const prepared = prepareAutoExposureCandidate(state, candidate);
|
|
150
|
+
const transaction = executeRendererFrameTransaction<AutoExposureCandidate>({
|
|
151
|
+
build: () =>
|
|
152
|
+
prepared.ok && options.failAt !== 'build'
|
|
153
|
+
? { ok: true, value: prepared.value }
|
|
154
|
+
: { ok: false, stage: 'build' },
|
|
155
|
+
execute: (_value) =>
|
|
156
|
+
options.failAt === 'execute'
|
|
157
|
+
? { ok: false, stage: 'execute' }
|
|
158
|
+
: { ok: true, value: undefined },
|
|
159
|
+
finish: (_value) =>
|
|
160
|
+
options.failAt === 'finish' ? { ok: false, stage: 'finish' } : { ok: true, value: undefined },
|
|
161
|
+
submit: (_value) =>
|
|
162
|
+
options.failAt === 'submit' ? { ok: false, stage: 'submit' } : { ok: true, value: undefined },
|
|
163
|
+
commit: (_value) => {
|
|
164
|
+
committed = true;
|
|
165
|
+
},
|
|
166
|
+
});
|
|
167
|
+
if (!transaction.ok || !committed) {
|
|
168
|
+
return {
|
|
169
|
+
ok: false,
|
|
170
|
+
error: transaction.ok ? { stage: 'submit' } : transaction.error,
|
|
171
|
+
state,
|
|
172
|
+
commitCount: 0,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
return { ok: true, state: commitAutoExposureCandidate(state, candidate), commitCount: 1 };
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
import {
|
|
179
|
+
type AutoExposureCandidate,
|
|
180
|
+
type AutoExposureState,
|
|
181
|
+
commitAutoExposureCandidate,
|
|
182
|
+
prepareAutoExposureCandidate,
|
|
183
|
+
} from '../pipeline/standard-output/auto-exposure/state';
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Result, RhiCanvasContext, RhiDevice } from '@forgeax/engine-rhi';
|
|
2
2
|
import { err, ok, RhiError } from '@forgeax/engine-rhi';
|
|
3
3
|
import type { RhiErrorListenerRegistry } from '../lifecycle';
|
|
4
|
+
import type { PipelineSpecError } from '../pipeline-spec';
|
|
4
5
|
import { configureSurface, type PipelineState } from '../render-system';
|
|
5
6
|
|
|
6
7
|
/** Minimum device-bound surface contract needed by lazy context configuration. */
|
|
@@ -24,6 +25,31 @@ export function wrapDisposeError(cause: unknown, step: string): RhiError {
|
|
|
24
25
|
});
|
|
25
26
|
}
|
|
26
27
|
|
|
28
|
+
export function rendererInitializationPipelineError(error: PipelineSpecError): RhiError {
|
|
29
|
+
return new RhiError({
|
|
30
|
+
code: 'webgpu-runtime-error',
|
|
31
|
+
expected: 'Renderer.initialization three-step strict-serial succeeds',
|
|
32
|
+
hint: 'inspect detail.error for the underlying PipelineSpecError and GPU cause',
|
|
33
|
+
detail: {
|
|
34
|
+
error: {
|
|
35
|
+
name: error.name,
|
|
36
|
+
code: error.code,
|
|
37
|
+
message: error.message,
|
|
38
|
+
detail: error.detail,
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function rendererInitializationError(cause: unknown): RhiError {
|
|
45
|
+
const message = cause instanceof Error ? cause.message : String(cause);
|
|
46
|
+
return new RhiError({
|
|
47
|
+
code: 'webgpu-runtime-error',
|
|
48
|
+
expected: 'Renderer.initialization three-step strict-serial succeeds',
|
|
49
|
+
hint: `pipeline build raised: ${message}`,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
27
53
|
export function ensureContextConfigured(
|
|
28
54
|
internals: RendererSurfaceInternals,
|
|
29
55
|
state: PipelineState,
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { CompiledRenderGraphInfo } from '@forgeax/engine-render-graph';
|
|
2
2
|
import type { RhiCanvasSurfacePresentationProof, TextureFormat } from '@forgeax/engine-rhi';
|
|
3
|
+
import type { AutoExposureInspection } from '../pipeline/standard-output/auto-exposure/inspection';
|
|
4
|
+
import type { StandardLutInspection } from '../pipeline/standard-output/lut-state';
|
|
3
5
|
import {
|
|
4
6
|
type RenderOutputInspection,
|
|
5
7
|
type RenderStandardOutputColorInspection,
|
|
@@ -15,6 +17,8 @@ export interface RendererOutputInspectionInput {
|
|
|
15
17
|
readonly surfaceProfile?: 'dual-view' | 'raw-only';
|
|
16
18
|
readonly rgba16floatRenderable: boolean;
|
|
17
19
|
readonly presentationProof?: RhiCanvasSurfacePresentationProof | undefined;
|
|
20
|
+
readonly autoExposure?: AutoExposureInspection | undefined;
|
|
21
|
+
readonly standardLut?: StandardLutInspection | undefined;
|
|
18
22
|
}
|
|
19
23
|
|
|
20
24
|
function isSrgbFormat(format: TextureFormat): boolean {
|
|
@@ -75,6 +79,8 @@ export function projectRendererOutputInspection(
|
|
|
75
79
|
const outputReady = input.surfaceAvailable && displayEncoded;
|
|
76
80
|
|
|
77
81
|
return {
|
|
82
|
+
...(input.autoExposure === undefined ? {} : { autoExposure: input.autoExposure }),
|
|
83
|
+
...(input.standardLut === undefined ? {} : { standardLut: input.standardLut }),
|
|
78
84
|
...(outputTransformPass === undefined
|
|
79
85
|
? {}
|
|
80
86
|
: { outputTransform: STANDARD_OUTPUT_TRANSFORM_FEATURE_ID }),
|
|
@@ -56,6 +56,38 @@ export function selectSkinPrewarmVariants(
|
|
|
56
56
|
);
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
+
/**
|
|
60
|
+
* Select the explicit storage-backed, non-clustered GPU scene-index variant.
|
|
61
|
+
* The GPU raster adapter owns a dedicated slot-3 BGL, so this source must not
|
|
62
|
+
* be reused by direct, probe, clustered, or transmission material draws.
|
|
63
|
+
*/
|
|
64
|
+
export function selectGpuDrivenSceneIndexVariant(
|
|
65
|
+
manifestEntry: MaterialShaderManifestEntry | undefined,
|
|
66
|
+
extendedLightingAvailable: boolean,
|
|
67
|
+
directionalPcssAvailable: boolean,
|
|
68
|
+
projectorAvailable: boolean,
|
|
69
|
+
vertexColorAvailable = false,
|
|
70
|
+
): MaterialShaderManifestEntry['variants'][number] | undefined {
|
|
71
|
+
return manifestEntry?.variants.find(
|
|
72
|
+
(variant) =>
|
|
73
|
+
variant.defines.STORAGE_BUFFER_AVAILABLE === true &&
|
|
74
|
+
variant.defines.GPU_DRIVEN_SCENE_INDEX_AVAILABLE === true &&
|
|
75
|
+
(!('CLUSTER_FORWARD_AVAILABLE' in variant.defines) ||
|
|
76
|
+
variant.defines.CLUSTER_FORWARD_AVAILABLE === false) &&
|
|
77
|
+
(variant.defines.VERTEX_COLOR_AVAILABLE === true) === vertexColorAvailable &&
|
|
78
|
+
(!('PROBE_BLEND_AVAILABLE' in variant.defines) ||
|
|
79
|
+
variant.defines.PROBE_BLEND_AVAILABLE === false) &&
|
|
80
|
+
(!('EXTENDED_LIGHTING_AVAILABLE' in variant.defines) ||
|
|
81
|
+
variant.defines.EXTENDED_LIGHTING_AVAILABLE === extendedLightingAvailable) &&
|
|
82
|
+
(!('DIRECTIONAL_PCSS_AVAILABLE' in variant.defines) ||
|
|
83
|
+
variant.defines.DIRECTIONAL_PCSS_AVAILABLE === directionalPcssAvailable) &&
|
|
84
|
+
(!('PROJECTOR_AVAILABLE' in variant.defines) ||
|
|
85
|
+
variant.defines.PROJECTOR_AVAILABLE === projectorAvailable) &&
|
|
86
|
+
(!('TRANSMISSION_AVAILABLE' in variant.defines) ||
|
|
87
|
+
variant.defines.TRANSMISSION_AVAILABLE === false),
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
|
|
59
91
|
/** Select probe-enabled material modules for recovery candidate prewarming. */
|
|
60
92
|
export function selectProbePrewarmVariants(
|
|
61
93
|
manifestEntry: MaterialShaderManifestEntry | undefined,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { RhiDevice } from '@forgeax/engine-rhi';
|
|
2
|
+
import {
|
|
3
|
+
createSkinPaletteAllocator,
|
|
4
|
+
type SkinPaletteAllocator,
|
|
5
|
+
} from '../systems/skin-palette-allocator';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Constructs the renderer's single skin palette owner. Capability selection
|
|
9
|
+
* stays at assembly, while allocation and writes remain in the allocator.
|
|
10
|
+
*/
|
|
11
|
+
export function createSkinPaletteOwner(
|
|
12
|
+
device: RhiDevice,
|
|
13
|
+
storageBufferCapable: boolean,
|
|
14
|
+
): SkinPaletteAllocator {
|
|
15
|
+
const limitKey = storageBufferCapable
|
|
16
|
+
? 'maxStorageBufferBindingSize'
|
|
17
|
+
: 'maxUniformBufferBindingSize';
|
|
18
|
+
const deviceLimit = (device.limits as Readonly<Record<string, number>>)[limitKey];
|
|
19
|
+
const maxBindingBytes = typeof deviceLimit === 'number' && deviceLimit > 0 ? deviceLimit : 65536;
|
|
20
|
+
return createSkinPaletteAllocator(device, maxBindingBytes, storageBufferCapable);
|
|
21
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { RhiError, type ShaderModule } from '@forgeax/engine-rhi';
|
|
2
|
+
import type { ManifestEntry } from '@forgeax/engine-types';
|
|
3
|
+
import type { SsrShaderSources } from '../render-contract';
|
|
4
|
+
|
|
5
|
+
/** Admit and compile the entire SSR bundle before exposing any of its modules. */
|
|
6
|
+
export async function prewarmSsrShaders(
|
|
7
|
+
entries: readonly ManifestEntry[],
|
|
8
|
+
compile: (label: string, source: string) => Promise<ShaderModule>,
|
|
9
|
+
seed: (label: string, module: ShaderModule) => void,
|
|
10
|
+
): Promise<SsrShaderSources | undefined> {
|
|
11
|
+
const stages = [
|
|
12
|
+
['hiz', 'ssr_hiz_seed', 'ssr_hiz_seed'],
|
|
13
|
+
['hizReduce', 'ssr_hiz_reduce', 'ssr_hiz_reduce'],
|
|
14
|
+
['trace', 'ssr_trace', 'ssr_trace'],
|
|
15
|
+
['temporal', 'ssr_temporal', 'ssr_temporal'],
|
|
16
|
+
['compose', 'ssr_compose', 'vs_ssr_compose'],
|
|
17
|
+
] as const;
|
|
18
|
+
const resolved = stages.map(([stage, label, entryPoint]) => ({
|
|
19
|
+
stage,
|
|
20
|
+
label,
|
|
21
|
+
entry: entries.find((entry) => entry.wgsl.includes(`fn ${entryPoint}(`)),
|
|
22
|
+
}));
|
|
23
|
+
if (resolved.every(({ entry }) => entry === undefined)) return undefined;
|
|
24
|
+
const missing = resolved.find(({ entry }) => entry === undefined);
|
|
25
|
+
if (missing !== undefined) {
|
|
26
|
+
throw new RhiError({
|
|
27
|
+
code: 'shader-compile-failed',
|
|
28
|
+
expected: 'shader manifest contains all five SSR utility entries',
|
|
29
|
+
hint: `add the package-owned WGSL entry for '${missing.label}' to the engine shader manifest`,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
const compiled: Array<{ label: string; module: ShaderModule }> = [];
|
|
33
|
+
const sources = {} as Record<keyof SsrShaderSources, string>;
|
|
34
|
+
for (const { stage, label, entry } of resolved) {
|
|
35
|
+
if (entry === undefined) throw new Error(`missing SSR shader ${label}`);
|
|
36
|
+
compiled.push({ label, module: await compile(label, entry.wgsl) });
|
|
37
|
+
sources[stage] = entry.wgsl;
|
|
38
|
+
}
|
|
39
|
+
for (const { label, module } of compiled) seed(label, module);
|
|
40
|
+
return sources;
|
|
41
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { RhiDevice } from '@forgeax/engine-rhi';
|
|
2
|
+
import { RhiError } from '@forgeax/engine-rhi';
|
|
3
|
+
|
|
4
|
+
import type {
|
|
5
|
+
HealthListenerRegistry,
|
|
6
|
+
LostListenerRegistry,
|
|
7
|
+
RhiErrorListenerRegistry,
|
|
8
|
+
} from '../lifecycle';
|
|
9
|
+
import type { RhiBackendPack } from './backend-contract';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Wire one device's loss promise into the renderer's shared health, error,
|
|
13
|
+
* and lost listener registries. The same helper is used during construction
|
|
14
|
+
* and recovery so a fresh device cannot silently lose the host subscriptions.
|
|
15
|
+
*/
|
|
16
|
+
export function attachDeviceLostFanout(
|
|
17
|
+
device: RhiDevice,
|
|
18
|
+
pack: RhiBackendPack,
|
|
19
|
+
registries: {
|
|
20
|
+
lostRegistry: LostListenerRegistry;
|
|
21
|
+
errorRegistry: RhiErrorListenerRegistry;
|
|
22
|
+
healthRegistry: HealthListenerRegistry;
|
|
23
|
+
onDeviceLost?: (detail: string) => void;
|
|
24
|
+
},
|
|
25
|
+
): void {
|
|
26
|
+
const { lostRegistry, errorRegistry, healthRegistry, onDeviceLost } = registries;
|
|
27
|
+
const lost = pack.instrumentation?.deviceLost?.(device) ?? device.lost;
|
|
28
|
+
lost
|
|
29
|
+
.then((info) => {
|
|
30
|
+
const safe = {
|
|
31
|
+
reason: info?.reason ?? 'unknown',
|
|
32
|
+
message: info?.message ?? '',
|
|
33
|
+
};
|
|
34
|
+
onDeviceLost?.(`device.lost: ${safe.reason}; ${safe.message || '<empty>'}`);
|
|
35
|
+
lostRegistry.fire(safe);
|
|
36
|
+
if (safe.reason !== 'destroyed') {
|
|
37
|
+
pack.instrumentation?.onDeviceLost?.();
|
|
38
|
+
healthRegistry.fire({
|
|
39
|
+
reason: 'device-lost',
|
|
40
|
+
detail: { lostReason: safe.reason, message: safe.message },
|
|
41
|
+
recoverable: true,
|
|
42
|
+
});
|
|
43
|
+
if (pack.translateErrorEventToRhiError) {
|
|
44
|
+
const translated = pack.translateErrorEventToRhiError(safe);
|
|
45
|
+
errorRegistry.fire(translated.error);
|
|
46
|
+
} else {
|
|
47
|
+
errorRegistry.fire(
|
|
48
|
+
new RhiError({
|
|
49
|
+
code: 'device-lost',
|
|
50
|
+
expected:
|
|
51
|
+
'device must remain alive (driver / browser must not destroy the GPUDevice)',
|
|
52
|
+
hint: `device-lost reason: ${safe.reason}; message: ${safe.message || '<empty>'}`,
|
|
53
|
+
}),
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
})
|
|
58
|
+
.catch((error: unknown) => {
|
|
59
|
+
pack.instrumentation?.onDeviceLost?.();
|
|
60
|
+
onDeviceLost?.(`device.lost rejected: ${String(error)}`);
|
|
61
|
+
lostRegistry.fire({ reason: 'unknown', message: String(error) });
|
|
62
|
+
healthRegistry.fire({
|
|
63
|
+
reason: 'device-lost',
|
|
64
|
+
detail: { lostReason: 'unknown', message: String(error) },
|
|
65
|
+
recoverable: true,
|
|
66
|
+
});
|
|
67
|
+
errorRegistry.fire(
|
|
68
|
+
new RhiError({
|
|
69
|
+
code: 'device-lost',
|
|
70
|
+
expected: 'device.lost Promise resolves with GPUDeviceLostInfo',
|
|
71
|
+
hint: `device.lost Promise rejected unexpectedly: ${String(error)}`,
|
|
72
|
+
}),
|
|
73
|
+
);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
BindGroupLayout,
|
|
3
|
+
PipelineLayout,
|
|
4
|
+
Result,
|
|
5
|
+
RhiDevice,
|
|
6
|
+
ShaderModule,
|
|
7
|
+
} from '@forgeax/engine-rhi';
|
|
8
|
+
import { ok, type RhiError } from '@forgeax/engine-rhi';
|
|
9
|
+
import type { MaterialShaderManifestEntry } from '@forgeax/engine-shader';
|
|
10
|
+
import type { ManifestEntry } from '@forgeax/engine-types';
|
|
11
|
+
import { type GpuDrivenPbrProgram, standardPbrProgramKey } from '../gpu-driven/pbr-program';
|
|
12
|
+
import { GPU_DRIVEN_VIEW_WGSL } from '../gpu-driven/view-gpu';
|
|
13
|
+
import {
|
|
14
|
+
buildGpuDrivenPbrInstancesBindGroupLayout,
|
|
15
|
+
buildGpuDrivenPbrPipelineLayout,
|
|
16
|
+
buildGpuDrivenPbrSkinPipelineLayout,
|
|
17
|
+
buildPbrSkinLayouts,
|
|
18
|
+
type PbrPipelineLayoutBundle,
|
|
19
|
+
SKIN_MATERIAL_SHADER_ID,
|
|
20
|
+
} from '../pbr-pipeline';
|
|
21
|
+
import { assembleStandardPbrArtifact } from './material/assembly';
|
|
22
|
+
import { invokeDeviceCreateShaderModule } from './material-shader-policy';
|
|
23
|
+
import { runShimStep, runShimSyncStep } from './renderer-helpers';
|
|
24
|
+
import {
|
|
25
|
+
selectGpuDrivenSceneIndexVariant,
|
|
26
|
+
selectSkinPrewarmVariants,
|
|
27
|
+
} from './shader-prewarm-policy';
|
|
28
|
+
|
|
29
|
+
export type AsyncCreateShaderModule = (
|
|
30
|
+
device: RhiDevice,
|
|
31
|
+
desc: { code: string; label?: string | undefined },
|
|
32
|
+
) => Promise<Result<ShaderModule, RhiError>>;
|
|
33
|
+
|
|
34
|
+
export interface GpuDrivenPbrReadyModules {
|
|
35
|
+
readonly pbrSkinModule: ShaderModule | null;
|
|
36
|
+
readonly gpuDrivenPbrPrograms: ReadonlyMap<string, GpuDrivenPbrProgram>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface GpuDrivenPbrReadyLayouts {
|
|
40
|
+
readonly pbrSkinPipelineLayout: PipelineLayout | null;
|
|
41
|
+
readonly pbrSkinProbePipelineLayout: PipelineLayout | null;
|
|
42
|
+
readonly pbrSkinMeshBindGroupLayout: BindGroupLayout | null;
|
|
43
|
+
readonly gpuDrivenInstancesBindGroupLayout: BindGroupLayout | null;
|
|
44
|
+
readonly gpuDrivenPbrPipelineLayout: PipelineLayout | null;
|
|
45
|
+
readonly gpuDrivenPbrSkinPipelineLayout: PipelineLayout | null;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
interface GpuDrivenPbrModuleInput {
|
|
49
|
+
readonly device: RhiDevice;
|
|
50
|
+
readonly storageBufferCapable: boolean;
|
|
51
|
+
readonly asyncCreateShaderModule: AsyncCreateShaderModule | undefined;
|
|
52
|
+
readonly pbrSkinEntry: ManifestEntry | undefined;
|
|
53
|
+
readonly pbrManifestEntry: MaterialShaderManifestEntry | undefined;
|
|
54
|
+
readonly pbrSkinManifestEntry: MaterialShaderManifestEntry | undefined;
|
|
55
|
+
readonly extendedLightingShaderAvailable: boolean;
|
|
56
|
+
readonly directionalPcssAvailable: boolean;
|
|
57
|
+
readonly projectorAvailable: boolean;
|
|
58
|
+
readonly seedShaderModule: (label: string, module: ShaderModule) => void;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function createShader(
|
|
62
|
+
input: Pick<GpuDrivenPbrModuleInput, 'device' | 'asyncCreateShaderModule'>,
|
|
63
|
+
code: string,
|
|
64
|
+
label: string,
|
|
65
|
+
): Promise<Result<ShaderModule, RhiError>> {
|
|
66
|
+
return input.asyncCreateShaderModule
|
|
67
|
+
? input.asyncCreateShaderModule(input.device, { code, label })
|
|
68
|
+
: Promise.resolve(invokeDeviceCreateShaderModule(input.device, { code, label }));
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export async function buildGpuDrivenPbrReadyModules(
|
|
72
|
+
input: GpuDrivenPbrModuleInput,
|
|
73
|
+
): Promise<GpuDrivenPbrReadyModules> {
|
|
74
|
+
let pbrSkinModule: ShaderModule | null = null;
|
|
75
|
+
const gpuDrivenPbrPrograms = new Map<string, GpuDrivenPbrProgram>();
|
|
76
|
+
if (input.pbrSkinEntry !== undefined && input.pbrSkinEntry.wgsl.length > 0) {
|
|
77
|
+
const result = await runShimStep(
|
|
78
|
+
() => createShader(input, input.pbrSkinEntry?.wgsl ?? '', 'pbr-skin'),
|
|
79
|
+
'shader-compile-failed',
|
|
80
|
+
'skinned PBR shader module compiled',
|
|
81
|
+
'inspect manifest pbr-skin entry composed wgsl; check device.features',
|
|
82
|
+
);
|
|
83
|
+
if (!result.ok) throw result.error;
|
|
84
|
+
pbrSkinModule = result.value;
|
|
85
|
+
input.seedShaderModule(`module-${SKIN_MATERIAL_SHADER_ID}`, pbrSkinModule);
|
|
86
|
+
}
|
|
87
|
+
if (
|
|
88
|
+
input.storageBufferCapable &&
|
|
89
|
+
input.device.caps.compute &&
|
|
90
|
+
input.device.caps.indirectDrawing
|
|
91
|
+
) {
|
|
92
|
+
const result = await runShimStep(
|
|
93
|
+
() => createShader(input, GPU_DRIVEN_VIEW_WGSL, 'gpu-driven-view'),
|
|
94
|
+
'shader-compile-failed',
|
|
95
|
+
'GPU-driven view shader module compiled',
|
|
96
|
+
'inspect the GPU-driven view compute WGSL and check device.features',
|
|
97
|
+
);
|
|
98
|
+
if (!result.ok) throw result.error;
|
|
99
|
+
input.seedShaderModule('gpu-driven-view', result.value);
|
|
100
|
+
}
|
|
101
|
+
if (input.storageBufferCapable) {
|
|
102
|
+
for (const [materialId, entry] of [
|
|
103
|
+
['forgeax::default-standard-pbr', input.pbrManifestEntry],
|
|
104
|
+
['forgeax::pbr-skin', input.pbrSkinManifestEntry],
|
|
105
|
+
] as const) {
|
|
106
|
+
for (const color of [false, true]) {
|
|
107
|
+
const variant = selectGpuDrivenSceneIndexVariant(
|
|
108
|
+
entry,
|
|
109
|
+
input.extendedLightingShaderAvailable,
|
|
110
|
+
input.directionalPcssAvailable,
|
|
111
|
+
input.projectorAvailable,
|
|
112
|
+
color,
|
|
113
|
+
);
|
|
114
|
+
if (variant === undefined || entry === undefined) continue;
|
|
115
|
+
const key = standardPbrProgramKey(materialId, color);
|
|
116
|
+
const artifact = assembleStandardPbrArtifact(materialId, variant.composedWgsl, color);
|
|
117
|
+
if (key === undefined || artifact === undefined) continue;
|
|
118
|
+
const result = await runShimStep(
|
|
119
|
+
() => createShader(input, artifact.wgsl, `gpu-driven-${key}`),
|
|
120
|
+
'shader-compile-failed',
|
|
121
|
+
'GPU-driven Standard PBR program compiled',
|
|
122
|
+
'inspect the selected scene-index and vertex-color variant with its slot-3 ABI',
|
|
123
|
+
);
|
|
124
|
+
if (!result.ok) throw result.error;
|
|
125
|
+
gpuDrivenPbrPrograms.set(key, { module: result.value, artifact });
|
|
126
|
+
input.seedShaderModule(`gpu-driven-${key}`, result.value);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const declaredSkinVariants = selectSkinPrewarmVariants(
|
|
131
|
+
input.pbrSkinManifestEntry,
|
|
132
|
+
input.storageBufferCapable,
|
|
133
|
+
);
|
|
134
|
+
// The complete Cartesian product is useful for a full local/nightly boot,
|
|
135
|
+
// but compiling every pbr-skin capability combination in each lightweight
|
|
136
|
+
// Dawn process dominates CI startup (the renderer only needs the active
|
|
137
|
+
// device axes plus the two topology/color lanes). Other combinations remain
|
|
138
|
+
// available in the manifest and are still resolved lazily when requested.
|
|
139
|
+
const lightweightDawn =
|
|
140
|
+
(globalThis as { process?: { env?: { FORGEAX_DAWN_LIGHTWEIGHT?: string } } }).process?.env
|
|
141
|
+
?.FORGEAX_DAWN_LIGHTWEIGHT === '1';
|
|
142
|
+
const skinVariants = lightweightDawn
|
|
143
|
+
? declaredSkinVariants.filter((variant) => {
|
|
144
|
+
const defines = variant.defines;
|
|
145
|
+
return (
|
|
146
|
+
defines.STORAGE_BUFFER_AVAILABLE === input.storageBufferCapable &&
|
|
147
|
+
defines.PROBE_BLEND_AVAILABLE !== true &&
|
|
148
|
+
(!('EXTENDED_LIGHTING_AVAILABLE' in defines) ||
|
|
149
|
+
defines.EXTENDED_LIGHTING_AVAILABLE === input.extendedLightingShaderAvailable) &&
|
|
150
|
+
(!('DIRECTIONAL_PCSS_AVAILABLE' in defines) ||
|
|
151
|
+
defines.DIRECTIONAL_PCSS_AVAILABLE === input.directionalPcssAvailable) &&
|
|
152
|
+
(!('PROJECTOR_AVAILABLE' in defines) ||
|
|
153
|
+
defines.PROJECTOR_AVAILABLE === input.projectorAvailable) &&
|
|
154
|
+
defines.GPU_DRIVEN_SCENE_INDEX_AVAILABLE === false &&
|
|
155
|
+
defines.TRANSMISSION_AVAILABLE === false
|
|
156
|
+
);
|
|
157
|
+
})
|
|
158
|
+
: declaredSkinVariants;
|
|
159
|
+
for (const variant of skinVariants) {
|
|
160
|
+
const label = `module-${SKIN_MATERIAL_SHADER_ID}#${variant.definesKey}`;
|
|
161
|
+
const result = await runShimStep(
|
|
162
|
+
() => createShader(input, variant.composedWgsl, label),
|
|
163
|
+
'shader-compile-failed',
|
|
164
|
+
`pbr-skin variant ${variant.definesKey || '<default>'} compiled`,
|
|
165
|
+
'inspect the selected pbr-skin storage/cluster/color variant and device.features',
|
|
166
|
+
);
|
|
167
|
+
if (!result.ok) throw result.error;
|
|
168
|
+
input.seedShaderModule(label, result.value);
|
|
169
|
+
if (variant.definesKey === '')
|
|
170
|
+
input.seedShaderModule(`module-${SKIN_MATERIAL_SHADER_ID}`, result.value);
|
|
171
|
+
}
|
|
172
|
+
return { pbrSkinModule, gpuDrivenPbrPrograms };
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export function buildGpuDrivenPbrReadyLayouts(
|
|
176
|
+
device: RhiDevice,
|
|
177
|
+
storageBufferCapable: boolean,
|
|
178
|
+
pbrLayouts: PbrPipelineLayoutBundle,
|
|
179
|
+
): GpuDrivenPbrReadyLayouts {
|
|
180
|
+
let pbrSkinPipelineLayout: PipelineLayout | null = null;
|
|
181
|
+
let pbrSkinProbePipelineLayout: PipelineLayout | null = null;
|
|
182
|
+
let pbrSkinMeshBindGroupLayout: BindGroupLayout | null = null;
|
|
183
|
+
let gpuDrivenInstancesBindGroupLayout: BindGroupLayout | null = null;
|
|
184
|
+
let gpuDrivenPbrPipelineLayout: PipelineLayout | null = null;
|
|
185
|
+
let gpuDrivenPbrSkinPipelineLayout: PipelineLayout | null = null;
|
|
186
|
+
const skinResult = runShimSyncStep(
|
|
187
|
+
() => ok(buildPbrSkinLayouts(device, { storageBuffer: storageBufferCapable }, pbrLayouts)),
|
|
188
|
+
'webgpu-runtime-error',
|
|
189
|
+
'buildPbrSkinLayouts succeeded',
|
|
190
|
+
'check device.limits.maxBindingsPerBindGroup (need >=14) and maxBindGroupsPerPipelineLayout',
|
|
191
|
+
);
|
|
192
|
+
if (skinResult.ok) {
|
|
193
|
+
pbrSkinPipelineLayout = skinResult.value.pipelineLayout;
|
|
194
|
+
pbrSkinProbePipelineLayout = skinResult.value.probePipelineLayout;
|
|
195
|
+
pbrSkinMeshBindGroupLayout = skinResult.value.meshArrayBgl;
|
|
196
|
+
}
|
|
197
|
+
if (storageBufferCapable) {
|
|
198
|
+
const layoutResult = runShimSyncStep(
|
|
199
|
+
() => {
|
|
200
|
+
const instances = buildGpuDrivenPbrInstancesBindGroupLayout(device, {
|
|
201
|
+
storageBuffer: true,
|
|
202
|
+
});
|
|
203
|
+
const rigid = buildGpuDrivenPbrPipelineLayout(device, pbrLayouts, instances);
|
|
204
|
+
const skin =
|
|
205
|
+
pbrSkinMeshBindGroupLayout === null
|
|
206
|
+
? null
|
|
207
|
+
: buildGpuDrivenPbrSkinPipelineLayout(
|
|
208
|
+
device,
|
|
209
|
+
{ ...pbrLayouts, meshArrayBgl: pbrSkinMeshBindGroupLayout },
|
|
210
|
+
instances,
|
|
211
|
+
);
|
|
212
|
+
return ok({ instances, rigid, skin });
|
|
213
|
+
},
|
|
214
|
+
'webgpu-runtime-error',
|
|
215
|
+
'build GPU-driven PBR pipeline layouts succeeded',
|
|
216
|
+
'check the dedicated scene-index slot-3 storage layout and four-slot pipeline layouts',
|
|
217
|
+
);
|
|
218
|
+
if (layoutResult.ok) {
|
|
219
|
+
gpuDrivenInstancesBindGroupLayout = layoutResult.value.instances;
|
|
220
|
+
gpuDrivenPbrPipelineLayout = layoutResult.value.rigid;
|
|
221
|
+
gpuDrivenPbrSkinPipelineLayout = layoutResult.value.skin;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return {
|
|
225
|
+
pbrSkinPipelineLayout,
|
|
226
|
+
pbrSkinProbePipelineLayout,
|
|
227
|
+
pbrSkinMeshBindGroupLayout,
|
|
228
|
+
gpuDrivenInstancesBindGroupLayout,
|
|
229
|
+
gpuDrivenPbrPipelineLayout,
|
|
230
|
+
gpuDrivenPbrSkinPipelineLayout,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { MipmapShaderModuleFactory } from '@forgeax/engine-assets-runtime';
|
|
2
|
+
import type { RhiDevice } from '@forgeax/engine-rhi';
|
|
3
|
+
import type { GpuResidencyCache } from '../device/gpu-residency';
|
|
4
|
+
import type { RhiBackendPack } from './backend-contract';
|
|
5
|
+
import { MIPMAP_PREWARM_FORMATS } from './webgpu-ready-contract';
|
|
6
|
+
|
|
7
|
+
export function adaptMipmapShaderModuleFactory(
|
|
8
|
+
factory: RhiBackendPack['createShaderModule'],
|
|
9
|
+
): MipmapShaderModuleFactory | undefined {
|
|
10
|
+
if (factory === undefined) return undefined;
|
|
11
|
+
return (device, descriptor) => factory(device as RhiDevice, descriptor);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Prewarm the mipmap pipeline while the renderer is still on its async ready
|
|
16
|
+
* path. A manifest-free camera-only renderer must not create the shader.
|
|
17
|
+
*/
|
|
18
|
+
export async function prewarmMipmapPipeline(
|
|
19
|
+
rhiDevice: RhiDevice,
|
|
20
|
+
gpuStore: GpuResidencyCache,
|
|
21
|
+
hasMaterialManifest: boolean,
|
|
22
|
+
): Promise<void> {
|
|
23
|
+
if (!hasMaterialManifest) return;
|
|
24
|
+
const result = await gpuStore.prewarmMipmapPipeline(rhiDevice, MIPMAP_PREWARM_FORMATS);
|
|
25
|
+
if (!result.ok) throw result.error;
|
|
26
|
+
}
|