@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
|
@@ -23,6 +23,7 @@ import {
|
|
|
23
23
|
DEFAULT_MSDF_TEXT_PARAM_SCHEMA,
|
|
24
24
|
DEFAULT_SPRITE_PARAM_SCHEMA,
|
|
25
25
|
DEFAULT_UNLIT_PARAM_SCHEMA,
|
|
26
|
+
STANDARD_PHYSICAL_TEXTURE_FIELDS,
|
|
26
27
|
STANDARD_PIPELINE_PARAM_SCHEMA,
|
|
27
28
|
} from '@forgeax/engine-shader';
|
|
28
29
|
import type {
|
|
@@ -51,7 +52,7 @@ import {
|
|
|
51
52
|
physicalTextureFields,
|
|
52
53
|
} from '../pbr-pipeline';
|
|
53
54
|
import { deriveTextureExtent } from '../render-data';
|
|
54
|
-
import type { MaterialSnapshot } from '../render-system-extract';
|
|
55
|
+
import type { MaterialSnapshot, SkylightSnapshot } from '../render-system-extract';
|
|
55
56
|
import type { RenderTargetTextureSource } from '../targets/contracts';
|
|
56
57
|
import {
|
|
57
58
|
type RenderTargetMaterialSourceBinding,
|
|
@@ -548,6 +549,44 @@ function materialUboFloatView(payload: MaterialUboPayload): Float32Array {
|
|
|
548
549
|
: new Float32Array(payload);
|
|
549
550
|
}
|
|
550
551
|
|
|
552
|
+
function materialUboDataView(payload: MaterialUboPayload): DataView {
|
|
553
|
+
if (payload instanceof Float32Array || payload instanceof Uint8Array) {
|
|
554
|
+
return new DataView(payload.buffer, payload.byteOffset, payload.byteLength);
|
|
555
|
+
}
|
|
556
|
+
return new DataView(payload);
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
/** Write one schema value with the scalar type's actual WGSL bit encoding. */
|
|
560
|
+
function writeNumericParamValue(
|
|
561
|
+
view: DataView,
|
|
562
|
+
entry: { readonly offset: number; readonly size: number; readonly type: string },
|
|
563
|
+
value: number | readonly number[],
|
|
564
|
+
): void {
|
|
565
|
+
const values = typeof value === 'number' ? [value] : value;
|
|
566
|
+
const width = entry.size / 4;
|
|
567
|
+
const writeCount = Math.min(values.length, width);
|
|
568
|
+
for (let index = 0; index < writeCount; index += 1) {
|
|
569
|
+
const component = values[index];
|
|
570
|
+
if (typeof component !== 'number') continue;
|
|
571
|
+
const byteOffset = entry.offset + index * 4;
|
|
572
|
+
switch (entry.type) {
|
|
573
|
+
case 'i32':
|
|
574
|
+
view.setInt32(byteOffset, component, true);
|
|
575
|
+
break;
|
|
576
|
+
case 'u32':
|
|
577
|
+
view.setUint32(byteOffset, component, true);
|
|
578
|
+
break;
|
|
579
|
+
case 'f32':
|
|
580
|
+
case 'vec2':
|
|
581
|
+
case 'vec3':
|
|
582
|
+
case 'vec4':
|
|
583
|
+
case 'color':
|
|
584
|
+
view.setFloat32(byteOffset, component, true);
|
|
585
|
+
break;
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
|
|
551
590
|
export function applyMaterialTextureUvScales(
|
|
552
591
|
payload: MaterialUboPayload,
|
|
553
592
|
material: MaterialSnapshot,
|
|
@@ -745,7 +784,7 @@ export function writePbrMaterialUboPayload(
|
|
|
745
784
|
);
|
|
746
785
|
}
|
|
747
786
|
buf.fill(0);
|
|
748
|
-
const
|
|
787
|
+
const dataView = materialUboDataView(buf);
|
|
749
788
|
const schema =
|
|
750
789
|
material.materialParamSchema === undefined || material.materialParamSchema.length === 0
|
|
751
790
|
? STANDARD_PIPELINE_PARAM_SCHEMA
|
|
@@ -782,15 +821,10 @@ export function writePbrMaterialUboPayload(
|
|
|
782
821
|
const value =
|
|
783
822
|
snapshot?.[entry.name] ??
|
|
784
823
|
fallback(entry.name, schema.find((item) => item.name === entry.name) ?? entry);
|
|
785
|
-
const offset = entry.offset / 4;
|
|
786
|
-
const width = entry.size / 4;
|
|
787
824
|
if (typeof value === 'number') {
|
|
788
|
-
|
|
825
|
+
writeNumericParamValue(dataView, entry, value);
|
|
789
826
|
} else if (Array.isArray(value)) {
|
|
790
|
-
|
|
791
|
-
const component = value[index];
|
|
792
|
-
if (typeof component === 'number') f32[offset + index] = component;
|
|
793
|
-
}
|
|
827
|
+
writeNumericParamValue(dataView, entry, value);
|
|
794
828
|
}
|
|
795
829
|
}
|
|
796
830
|
}
|
|
@@ -839,28 +873,18 @@ export function applyParamSnapshotToUbo(
|
|
|
839
873
|
): void {
|
|
840
874
|
if (paramSchema === undefined) return;
|
|
841
875
|
if (paramSnapshot === undefined) return;
|
|
842
|
-
const
|
|
876
|
+
const dataView = materialUboDataView(payload);
|
|
843
877
|
const { uboLayout } = derivedParamSchema(paramSchema);
|
|
844
878
|
for (const entry of uboLayout.entries) {
|
|
845
879
|
const value = paramSnapshot[entry.name];
|
|
846
880
|
if (value === undefined) continue;
|
|
847
|
-
const f32Offset = entry.offset / 4;
|
|
848
|
-
const f32Width = entry.size / 4;
|
|
849
881
|
if (typeof value === 'number') {
|
|
850
|
-
|
|
851
|
-
// as a JS number; the GPU side reads the four bytes as the declared
|
|
852
|
-
// type, so an f32 write is the correct bit pattern when the caller
|
|
853
|
-
// already produced an integer value.)
|
|
854
|
-
if (f32Width >= 1) f32[f32Offset] = value;
|
|
882
|
+
writeNumericParamValue(dataView, entry, value);
|
|
855
883
|
continue;
|
|
856
884
|
}
|
|
857
885
|
if (Array.isArray(value)) {
|
|
858
886
|
const arr = value as readonly number[];
|
|
859
|
-
|
|
860
|
-
for (let i = 0; i < writeCount; i++) {
|
|
861
|
-
const v = arr[i];
|
|
862
|
-
if (typeof v === 'number') f32[f32Offset + i] = v;
|
|
863
|
-
}
|
|
887
|
+
writeNumericParamValue(dataView, entry, arr);
|
|
864
888
|
}
|
|
865
889
|
// string values (texture GUIDs) belong to texture bindings, not the
|
|
866
890
|
// UBO; derive's uboLayout.entries already strips non-numeric schema
|
|
@@ -869,6 +893,31 @@ export function applyParamSnapshotToUbo(
|
|
|
869
893
|
}
|
|
870
894
|
}
|
|
871
895
|
|
|
896
|
+
/**
|
|
897
|
+
* Seed a schema-driven UBO with the defaults declared by its numeric contract.
|
|
898
|
+
*
|
|
899
|
+
* Prepared graphics (VFX and other feature-owned materials) do not pass
|
|
900
|
+
* through the extracted `MaterialSnapshot` writer, so their payload starts as
|
|
901
|
+
* zeroed storage. Applying the schema defaults first keeps that path
|
|
902
|
+
* byte-compatible with the ordinary material writer while preserving the
|
|
903
|
+
* snapshot writer's intentional overlay semantics.
|
|
904
|
+
*/
|
|
905
|
+
export function applyParamSchemaDefaultsToUbo(
|
|
906
|
+
payload: MaterialUboPayload,
|
|
907
|
+
paramSchema: readonly ParamSchemaEntry[] | undefined,
|
|
908
|
+
): void {
|
|
909
|
+
if (paramSchema === undefined) return;
|
|
910
|
+
const defaults: Record<string, number | readonly number[]> = {};
|
|
911
|
+
for (const entry of derivedParamSchema(paramSchema).uboLayout.entries) {
|
|
912
|
+
const schemaEntry = paramSchema.find((candidate) => candidate.name === entry.name);
|
|
913
|
+
const value = schemaEntry?.default;
|
|
914
|
+
if (typeof value === 'number' || Array.isArray(value)) {
|
|
915
|
+
defaults[entry.name] = value as number | readonly number[];
|
|
916
|
+
}
|
|
917
|
+
}
|
|
918
|
+
applyParamSnapshotToUbo(payload, paramSchema, defaults);
|
|
919
|
+
}
|
|
920
|
+
|
|
872
921
|
/**
|
|
873
922
|
* feat-20260704 M3/w19: shared per-submesh material bind-group assembly, hoisted
|
|
874
923
|
* from the `buildPerSubmeshMaterialBg` closure inside recordMainPass so both the
|
|
@@ -902,6 +951,8 @@ export interface PerSubmeshMaterialBgDeps {
|
|
|
902
951
|
readonly materialBgShared: Map<string, WeakMap<object, unknown>>;
|
|
903
952
|
/** Cross-frame final BG reuse keyed by the stable source material handle. */
|
|
904
953
|
readonly materialBgAssemblyCache: Map<string, MaterialBgAssemblyCacheEntry>;
|
|
954
|
+
/** Producer-owned numeric scene rows consumed by scene-index PBR draws. */
|
|
955
|
+
readonly sceneMaterialBuffer?: Buffer;
|
|
905
956
|
/** Active transmission backdrop; undefined/null means layout placeholder. */
|
|
906
957
|
readonly transmissionBackdropView?: TextureView | null;
|
|
907
958
|
readonly bindGroupCounts: BindGroupCounts;
|
|
@@ -1041,7 +1092,8 @@ export function buildPerSubmeshMaterialBg(
|
|
|
1041
1092
|
effectiveSkylightResources,
|
|
1042
1093
|
store.materialResourceEpoch,
|
|
1043
1094
|
transmissionBackdropView,
|
|
1044
|
-
)
|
|
1095
|
+
) &&
|
|
1096
|
+
deps.sceneMaterialBuffer === undefined
|
|
1045
1097
|
) {
|
|
1046
1098
|
if (diagnosticsEnabled) {
|
|
1047
1099
|
recordIblMaterialBinding(
|
|
@@ -1194,7 +1246,9 @@ export function buildPerSubmeshMaterialBg(
|
|
|
1194
1246
|
}
|
|
1195
1247
|
}
|
|
1196
1248
|
physicalTextureInjections.push({
|
|
1197
|
-
slot
|
|
1249
|
+
slot: STANDARD_PHYSICAL_TEXTURE_FIELDS.indexOf(
|
|
1250
|
+
field as (typeof STANDARD_PHYSICAL_TEXTURE_FIELDS)[number],
|
|
1251
|
+
),
|
|
1198
1252
|
sampler: smSamplerForField(field),
|
|
1199
1253
|
view,
|
|
1200
1254
|
});
|
|
@@ -1216,6 +1270,23 @@ export function buildPerSubmeshMaterialBg(
|
|
|
1216
1270
|
} satisfies TransmissionBindGroupResources,
|
|
1217
1271
|
physicalTextureInjections,
|
|
1218
1272
|
);
|
|
1273
|
+
// Storage-capable devices share one Standard material BGL with the
|
|
1274
|
+
// scene-index GPU lane. Even direct draws need a complete entry for
|
|
1275
|
+
// binding(46), although their shader does not read the scene table. Reuse
|
|
1276
|
+
// the storage-backed mesh table as a neutral placeholder until a
|
|
1277
|
+
// producer-owned GPU scene table is available; GPU-driven draws replace it
|
|
1278
|
+
// with `deps.sceneMaterialBuffer`.
|
|
1279
|
+
if (runtime.device.caps.storageBuffer) {
|
|
1280
|
+
smMergedEntries.push({
|
|
1281
|
+
binding: 46,
|
|
1282
|
+
resource: {
|
|
1283
|
+
kind: 'buffer' as const,
|
|
1284
|
+
value: {
|
|
1285
|
+
buffer: deps.sceneMaterialBuffer ?? pipelineState.meshStorageBuffer.buffer,
|
|
1286
|
+
},
|
|
1287
|
+
},
|
|
1288
|
+
});
|
|
1289
|
+
}
|
|
1219
1290
|
const createBindGroup = (): BindGroup => {
|
|
1220
1291
|
const result = runtime.device.createBindGroup({
|
|
1221
1292
|
label: 'pbr-material-skylight-bg',
|
|
@@ -1283,6 +1354,7 @@ export function buildPerSubmeshMaterialBg(
|
|
|
1283
1354
|
smMaterialHandle !== undefined &&
|
|
1284
1355
|
!smHasVideoFields &&
|
|
1285
1356
|
materialResourcesResident &&
|
|
1357
|
+
deps.sceneMaterialBuffer === undefined &&
|
|
1286
1358
|
!hasActiveTransmissionBackdrop
|
|
1287
1359
|
) {
|
|
1288
1360
|
if (materialCacheKey !== undefined) {
|
|
@@ -1302,8 +1374,20 @@ export function buildPerSubmeshMaterialBg(
|
|
|
1302
1374
|
const ZERO_SKYLIGHT_PAYLOAD = new Float32Array([0, 0, 0, 0, 0, 0, 0, 1]);
|
|
1303
1375
|
|
|
1304
1376
|
/** The same scene resources back material bindings in depth and color passes. */
|
|
1305
|
-
|
|
1306
|
-
|
|
1377
|
+
/**
|
|
1378
|
+
* Resolve the renderer-owned Skylight bundle for both ordinary geometry and
|
|
1379
|
+
* prepared RenderFeature materials. Feature preparation runs before the
|
|
1380
|
+
* main pass is encoded, so it cannot rely on the geometry pass to initialize
|
|
1381
|
+
* the intensity buffer or to select the current IBL views. Keeping this
|
|
1382
|
+
* small argument-based helper as the single resolver makes the two paths use
|
|
1383
|
+
* identical resources while retaining the existing frame-local write.
|
|
1384
|
+
*/
|
|
1385
|
+
export function resolveMaterialSkylight(
|
|
1386
|
+
runtime: Pick<RenderSystemRuntime, 'device' | 'deviceScope'>,
|
|
1387
|
+
pipelineState: Pick<PipelineState, 'skylightFallback'>,
|
|
1388
|
+
skylight: SkylightSnapshot | undefined,
|
|
1389
|
+
skylightCount: number,
|
|
1390
|
+
) {
|
|
1307
1391
|
const skylightFallback = pipelineState.skylightFallback;
|
|
1308
1392
|
if (skylightFallback === null) {
|
|
1309
1393
|
throw new RhiError({
|
|
@@ -1378,3 +1462,8 @@ export function prepareMaterialSkylight(c: _InternalRenderPipelineContext) {
|
|
|
1378
1462
|
};
|
|
1379
1463
|
return { skylightResources, activeViews };
|
|
1380
1464
|
}
|
|
1465
|
+
|
|
1466
|
+
/** The same scene resources back material bindings in depth and color passes. */
|
|
1467
|
+
export function prepareMaterialSkylight(c: _InternalRenderPipelineContext) {
|
|
1468
|
+
return resolveMaterialSkylight(c.runtime, c.pipelineState, c.skylight, c.skylightCount);
|
|
1469
|
+
}
|
|
@@ -5,24 +5,18 @@
|
|
|
5
5
|
import type { World } from '@forgeax/engine-ecs';
|
|
6
6
|
import {
|
|
7
7
|
type BindGroup,
|
|
8
|
-
type BindGroupEntry,
|
|
9
8
|
type Buffer,
|
|
10
9
|
type RenderPipeline,
|
|
11
10
|
RhiError,
|
|
12
11
|
type RhiRenderPassEncoder,
|
|
13
|
-
type TextureView,
|
|
14
12
|
} from '@forgeax/engine-rhi';
|
|
15
|
-
import type {
|
|
13
|
+
import type { MaterialRenderState } from '@forgeax/engine-types';
|
|
16
14
|
import { GpuBuffer } from '../gpu-resource';
|
|
17
15
|
import {
|
|
18
16
|
GPU_BUFFER_USAGE_COPY_DST,
|
|
19
17
|
GPU_BUFFER_USAGE_STORAGE,
|
|
20
18
|
GPU_BUFFER_USAGE_UNIFORM,
|
|
21
19
|
} from '../gpu-usage';
|
|
22
|
-
import {
|
|
23
|
-
assembleMaterialWithSkylightEntries,
|
|
24
|
-
type SkylightBindGroupResources,
|
|
25
|
-
} from '../ibl/skylight-bind-group';
|
|
26
20
|
import type { InstanceBufferCacheEntry } from '../instance-buffer-cache';
|
|
27
21
|
import { SPRITE_PREMULTIPLIED_ALPHA_BLEND } from '../materials';
|
|
28
22
|
import { SPRITE_PASS_PER_INSTANCE_REGION_VARIANT_SET } from '../pbr-pipeline';
|
|
@@ -35,67 +29,15 @@ import type {
|
|
|
35
29
|
import { worldEntityKey } from './frame-snapshot';
|
|
36
30
|
import { recordGeometryDraws, resolveGeometryInstancesBindGroup } from './main-pass-geometry';
|
|
37
31
|
import {
|
|
38
|
-
BUILTIN_USER_REGION_TEXTURE_FIELDS,
|
|
39
|
-
defaultViewForUserRegionField,
|
|
40
|
-
residentTextureView,
|
|
41
|
-
} from './main-pass-material';
|
|
42
|
-
import {
|
|
43
|
-
extractEntryResourceHandle,
|
|
44
|
-
getOrCreatePerEntity,
|
|
45
32
|
MAX_UNIFORM_INSTANCES,
|
|
46
33
|
MESH_PER_ENTITY_STRIDE,
|
|
47
34
|
packInstanceStorageBuffer,
|
|
48
35
|
} from './mesh-ssbo';
|
|
49
36
|
import type { _InternalRenderPipelineContext } from './render-context';
|
|
50
|
-
import { MATERIAL_PER_ENTITY_STRIDE
|
|
37
|
+
import { MATERIAL_PER_ENTITY_STRIDE } from './render-context';
|
|
51
38
|
|
|
52
39
|
export type { SpriteInstancesSnapshot };
|
|
53
40
|
|
|
54
|
-
/**
|
|
55
|
-
* Build the sprite material's Standard user-region from the shared field-order
|
|
56
|
-
* owner. The sprite shader uses the same Standard material bind-group layout;
|
|
57
|
-
* keeping this projection derived from the shared list prevents IBL injection
|
|
58
|
-
* from moving ahead of newly added material texture pairs.
|
|
59
|
-
*/
|
|
60
|
-
export function buildSpritePassBaseMaterialEntries(
|
|
61
|
-
pipelineState: _InternalRenderPipelineContext['pipelineState'],
|
|
62
|
-
spriteTexView: TextureView,
|
|
63
|
-
): BindGroupEntry[] {
|
|
64
|
-
const entries: BindGroupEntry[] = [
|
|
65
|
-
{
|
|
66
|
-
binding: 0,
|
|
67
|
-
resource: {
|
|
68
|
-
kind: 'buffer' as const,
|
|
69
|
-
value: {
|
|
70
|
-
buffer: pipelineState.materialUniformBuffer.buffer,
|
|
71
|
-
offset: 0,
|
|
72
|
-
size: STANDARD_PBR_UBO_SIZE,
|
|
73
|
-
},
|
|
74
|
-
},
|
|
75
|
-
},
|
|
76
|
-
];
|
|
77
|
-
for (const [index, field] of BUILTIN_USER_REGION_TEXTURE_FIELDS.entries()) {
|
|
78
|
-
const view =
|
|
79
|
-
field === 'baseColorTexture'
|
|
80
|
-
? spriteTexView
|
|
81
|
-
: defaultViewForUserRegionField(field, pipelineState);
|
|
82
|
-
entries.push(
|
|
83
|
-
{
|
|
84
|
-
binding: 1 + index * 2,
|
|
85
|
-
resource: {
|
|
86
|
-
kind: 'sampler' as const,
|
|
87
|
-
value: index === 0 ? pipelineState.nearestSampler : pipelineState.defaultSampler,
|
|
88
|
-
},
|
|
89
|
-
},
|
|
90
|
-
{
|
|
91
|
-
binding: 2 + index * 2,
|
|
92
|
-
resource: { kind: 'textureView' as const, value: view },
|
|
93
|
-
},
|
|
94
|
-
);
|
|
95
|
-
}
|
|
96
|
-
return entries;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
41
|
/**
|
|
100
42
|
* Build the interleaved sprite instance payload consumed by this record owner.
|
|
101
43
|
* The extract stage validates the two packed arrays before they reach this
|
|
@@ -204,7 +146,6 @@ export function recordSpritePass(
|
|
|
204
146
|
materialWorld: World,
|
|
205
147
|
materialShaderId?: string,
|
|
206
148
|
) => BindGroup,
|
|
207
|
-
skylightResources: SkylightBindGroupResources,
|
|
208
149
|
graphPass?: RhiRenderPassEncoder,
|
|
209
150
|
selectedDispatch?: readonly DispatchEntry[],
|
|
210
151
|
): boolean {
|
|
@@ -405,7 +346,7 @@ export function recordSpritePass(
|
|
|
405
346
|
c,
|
|
406
347
|
spritePass,
|
|
407
348
|
matchedIndices,
|
|
408
|
-
|
|
349
|
+
resolveMaterialBindGroup,
|
|
409
350
|
spritePH,
|
|
410
351
|
spritePH_withRegion,
|
|
411
352
|
spriteLitPH,
|
|
@@ -509,7 +450,12 @@ function recordSpriteEntityDraws(
|
|
|
509
450
|
c: _InternalRenderPipelineContext,
|
|
510
451
|
spritePass: RhiRenderPassEncoder,
|
|
511
452
|
matchedIndices: Set<number> | null,
|
|
512
|
-
|
|
453
|
+
resolveMaterialBindGroup: (
|
|
454
|
+
materialSlot: number,
|
|
455
|
+
material: MaterialSnapshot,
|
|
456
|
+
entityKey: number,
|
|
457
|
+
materialWorld: World,
|
|
458
|
+
) => BindGroup,
|
|
513
459
|
spritePH: RenderPipeline | null,
|
|
514
460
|
spritePH_withRegion: RenderPipeline | null,
|
|
515
461
|
spriteLitPH: RenderPipeline | null,
|
|
@@ -518,10 +464,8 @@ function recordSpriteEntityDraws(
|
|
|
518
464
|
const {
|
|
519
465
|
runtime,
|
|
520
466
|
world,
|
|
521
|
-
store,
|
|
522
467
|
pipelineState,
|
|
523
468
|
frameState,
|
|
524
|
-
bindGroupCounts,
|
|
525
469
|
validatedOrdered,
|
|
526
470
|
meshBindGroup,
|
|
527
471
|
foldDispatchPlan,
|
|
@@ -737,6 +681,7 @@ function recordSpriteEntityDraws(
|
|
|
737
681
|
);
|
|
738
682
|
spritePass.setBindGroup(3, spriteInstBg);
|
|
739
683
|
spritePass.drawIndexed(spriteEntry.mesh.indexCount, spriteInstanceCount, 0, 0, 0);
|
|
684
|
+
c.onRenderableDraw?.(spriteEntry);
|
|
740
685
|
continue;
|
|
741
686
|
}
|
|
742
687
|
spriteBufUsage = GPU_BUFFER_USAGE_UNIFORM | GPU_BUFFER_USAGE_COPY_DST;
|
|
@@ -852,53 +797,19 @@ function recordSpriteEntityDraws(
|
|
|
852
797
|
|
|
853
798
|
const materialSlot = materialSlotIndices[i]?.[0] ?? 0;
|
|
854
799
|
|
|
855
|
-
//
|
|
856
|
-
//
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
| undefined;
|
|
863
|
-
let spriteTexView = pipelineState.defaultWhiteTextureView;
|
|
864
|
-
if (spriteTexHandle !== undefined) {
|
|
865
|
-
const tv = residentTextureView(spriteEntry.world ?? world, store, runtime, spriteTexHandle);
|
|
866
|
-
if (tv !== undefined) spriteTexView = tv as never;
|
|
867
|
-
}
|
|
868
|
-
const spritePassBaseMaterialEntries = buildSpritePassBaseMaterialEntries(
|
|
869
|
-
pipelineState,
|
|
870
|
-
spriteTexView,
|
|
871
|
-
);
|
|
872
|
-
const spritePassMergedEntries = assembleMaterialWithSkylightEntries(
|
|
873
|
-
spritePassBaseMaterialEntries,
|
|
874
|
-
skylightResources,
|
|
875
|
-
);
|
|
876
|
-
|
|
877
|
-
// Sprite-pass material BG cache: keyed on shader id (shared across all
|
|
878
|
-
// sprite entities) so entities using the same atlas texture share one
|
|
879
|
-
// BindGroup instead of creating one per entity (O5 fix — inner WeakMap
|
|
880
|
-
// chain naturally deduplicates by GPU resource object identity, so two
|
|
881
|
-
// entities with different atlases still get distinct BGs).
|
|
882
|
-
const spritePassBg: BindGroup = getOrCreatePerEntity(
|
|
883
|
-
frameState.materialBgShared,
|
|
884
|
-
'forgeax::sprite',
|
|
885
|
-
spritePassMergedEntries.map((e) => extractEntryResourceHandle(e)),
|
|
886
|
-
'sprite-pass-material',
|
|
887
|
-
() => {
|
|
888
|
-
const result = runtime.device.createBindGroup({
|
|
889
|
-
label: 'sprite-pass-material-bg',
|
|
890
|
-
layout: pipelineState.materialBindGroupLayout,
|
|
891
|
-
entries: spritePassMergedEntries,
|
|
892
|
-
});
|
|
893
|
-
if (!result.ok) throw result.error;
|
|
894
|
-
return result.value;
|
|
895
|
-
},
|
|
896
|
-
bindGroupCounts,
|
|
800
|
+
// The same material owner serves HDR and linear-LDR draws. Do not
|
|
801
|
+
// replace authored samplers, texture sources or cooked layouts here.
|
|
802
|
+
const spritePassBg = resolveMaterialBindGroup(
|
|
803
|
+
materialSlot,
|
|
804
|
+
spriteEntry.source.material,
|
|
805
|
+
spriteEntry.source.entityKey,
|
|
806
|
+
spriteEntry.world ?? world,
|
|
897
807
|
);
|
|
898
808
|
|
|
899
809
|
spritePass.setBindGroup(1, spritePassBg, [materialSlot * MATERIAL_PER_ENTITY_STRIDE]);
|
|
900
810
|
spritePass.setBindGroup(3, spriteInstancesBg);
|
|
901
811
|
spritePass.drawIndexed(spriteEntry.mesh.indexCount, spriteInstanceCount, 0, 0, 0);
|
|
812
|
+
c.onRenderableDraw?.(spriteEntry);
|
|
902
813
|
}
|
|
903
814
|
}
|
|
904
815
|
|
package/src/record/main-pass.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { World } from '@forgeax/engine-ecs';
|
|
2
2
|
import { probeVideoHighPerfUpload } from '@forgeax/engine-graphics-extras';
|
|
3
|
+
import type { GraphResourceResolver } from '@forgeax/engine-render-graph';
|
|
3
4
|
import {
|
|
4
5
|
type BindGroup,
|
|
5
6
|
RhiError,
|
|
@@ -14,9 +15,13 @@ import { buildBeginRenderPassDescriptor, standardTopologyBindGroupReady } from '
|
|
|
14
15
|
import { POINTS_LINES_MATERIAL_SHADER_ID } from '../points-lines/record';
|
|
15
16
|
import type { ReflectionProbeSelectionResult } from '../reflection/projection';
|
|
16
17
|
import type { RenderRecordPhase } from '../render-contract';
|
|
18
|
+
import type {
|
|
19
|
+
GpuDrivenStandardPbrFrameResources,
|
|
20
|
+
RenderPipelineGpuDrivenProjection,
|
|
21
|
+
} from '../render-pipeline';
|
|
17
22
|
import type { MaterialSnapshot } from '../render-system-extract';
|
|
18
23
|
import { resolveReflectionProbeBinding } from './frame-lighting';
|
|
19
|
-
import { getOpaqueResourceIdentity } from './frame-snapshot';
|
|
24
|
+
import { getOpaqueResourceIdentity, worldEntityKey } from './frame-snapshot';
|
|
20
25
|
import { recordGeometryDraws } from './main-pass-geometry';
|
|
21
26
|
import {
|
|
22
27
|
buildPerSubmeshMaterialBg as buildPerSubmeshMaterialBgImpl,
|
|
@@ -57,7 +62,15 @@ export type MainPassOptions = {
|
|
|
57
62
|
readonly passKind?: PassKind;
|
|
58
63
|
readonly clearColor?: readonly [number, number, number, number];
|
|
59
64
|
readonly recordMode?: 'opaque' | 'transmission' | 'transparent';
|
|
65
|
+
/** Exclude material/pass pairs already consumed by an earlier graph lane. */
|
|
66
|
+
readonly excludeSelector?: PassSelector;
|
|
67
|
+
/** Require the same material to contribute to another graph lane. */
|
|
68
|
+
readonly includeSelector?: PassSelector;
|
|
60
69
|
readonly transmissionBackdropView?: TextureView | null;
|
|
70
|
+
readonly gpuDriven?: {
|
|
71
|
+
readonly projection: RenderPipelineGpuDrivenProjection;
|
|
72
|
+
readonly resources: GraphResourceResolver;
|
|
73
|
+
};
|
|
61
74
|
};
|
|
62
75
|
|
|
63
76
|
function isTransmissionMaterial(material: MaterialSnapshot): boolean {
|
|
@@ -117,7 +130,7 @@ export function recordMainPass(
|
|
|
117
130
|
selector?: PassSelector,
|
|
118
131
|
options?: MainPassOptions,
|
|
119
132
|
graphPass?: RhiRenderPassEncoder,
|
|
120
|
-
):
|
|
133
|
+
): GpuDrivenStandardPbrFrameResources | undefined {
|
|
121
134
|
const {
|
|
122
135
|
runtime,
|
|
123
136
|
world,
|
|
@@ -143,6 +156,8 @@ export function recordMainPass(
|
|
|
143
156
|
materialSlots,
|
|
144
157
|
materialSlotOwners,
|
|
145
158
|
materialSlotCount,
|
|
159
|
+
gpuDrivenStandardPbrFrameResources,
|
|
160
|
+
gpuDrivenSceneMaterialBuffer,
|
|
146
161
|
} = c;
|
|
147
162
|
// bug-20260615 M3 / m3-1: sampleCount is threaded through every
|
|
148
163
|
// getMaterialShaderPipeline call site so the cache key / builder
|
|
@@ -280,7 +295,14 @@ export function recordMainPass(
|
|
|
280
295
|
const matchedIndices =
|
|
281
296
|
selector !== undefined ? buildMatchedRenderableIndices(dispatch, selector) : null;
|
|
282
297
|
const selectorMatchedMaterials =
|
|
283
|
-
selector !== undefined
|
|
298
|
+
selector !== undefined
|
|
299
|
+
? buildMatchedMaterialHandlesByRenderable(
|
|
300
|
+
dispatch,
|
|
301
|
+
selector,
|
|
302
|
+
options?.excludeSelector,
|
|
303
|
+
options?.includeSelector,
|
|
304
|
+
)
|
|
305
|
+
: null;
|
|
284
306
|
const matchedMaterials = matchedMaterialsForRecordMode(c, selectorMatchedMaterials, recordMode);
|
|
285
307
|
const selectedDispatch =
|
|
286
308
|
dispatch.length === 0
|
|
@@ -488,6 +510,14 @@ export function recordMainPass(
|
|
|
488
510
|
materialBgAssemblyCache: c.materialBgAssemblyCache,
|
|
489
511
|
frameState,
|
|
490
512
|
bindGroupCounts,
|
|
513
|
+
...(gpuDrivenStandardPbrFrameResources?.sceneMaterialBuffer === undefined &&
|
|
514
|
+
gpuDrivenSceneMaterialBuffer === undefined
|
|
515
|
+
? {}
|
|
516
|
+
: {
|
|
517
|
+
sceneMaterialBuffer:
|
|
518
|
+
gpuDrivenStandardPbrFrameResources?.sceneMaterialBuffer ??
|
|
519
|
+
gpuDrivenSceneMaterialBuffer,
|
|
520
|
+
}),
|
|
491
521
|
...(transmissionBackdropView === undefined ? {} : { transmissionBackdropView }),
|
|
492
522
|
};
|
|
493
523
|
const buildPerSubmeshMaterialBg = (
|
|
@@ -503,7 +533,6 @@ export function recordMainPass(
|
|
|
503
533
|
materialWorld,
|
|
504
534
|
materialShaderId,
|
|
505
535
|
);
|
|
506
|
-
|
|
507
536
|
// Static material resources are a property of the frame-local material
|
|
508
537
|
// slot, not of each submesh draw. Resolve them once here so the geometry
|
|
509
538
|
// loop only selects a prepared binding. Video fields remain entity-bound:
|
|
@@ -513,7 +542,7 @@ export function recordMainPass(
|
|
|
513
542
|
for (let materialSlot = 0; materialSlot < materialSlotCount; materialSlot += 1) {
|
|
514
543
|
const material = materialSlots[materialSlot];
|
|
515
544
|
if (material === undefined || (material.videoTextureFields?.size ?? 0) > 0) continue;
|
|
516
|
-
const owner =
|
|
545
|
+
const owner = materialSlotOwners[materialSlot];
|
|
517
546
|
if (owner === undefined) continue;
|
|
518
547
|
preparedMaterialBindGroups[materialSlot] = buildPerSubmeshMaterialBg(
|
|
519
548
|
material,
|
|
@@ -521,6 +550,19 @@ export function recordMainPass(
|
|
|
521
550
|
owner.world ?? world,
|
|
522
551
|
);
|
|
523
552
|
}
|
|
553
|
+
if (gpuDrivenStandardPbrFrameResources !== undefined) {
|
|
554
|
+
gpuDrivenStandardPbrFrameResources.materialBindGroups.length = 0;
|
|
555
|
+
gpuDrivenStandardPbrFrameResources.materialBindGroups.push(...preparedMaterialBindGroups);
|
|
556
|
+
gpuDrivenStandardPbrFrameResources.materialSlotIndicesByEntity.clear();
|
|
557
|
+
for (let index = 0; index < validatedOrdered.length; index += 1) {
|
|
558
|
+
const entry = validatedOrdered[index];
|
|
559
|
+
if (entry === undefined) continue;
|
|
560
|
+
gpuDrivenStandardPbrFrameResources.materialSlotIndicesByEntity.set(
|
|
561
|
+
worldEntityKey(entry.source.worldId, entry.source.entityKey),
|
|
562
|
+
materialSlotIndices[index] ?? [],
|
|
563
|
+
);
|
|
564
|
+
}
|
|
565
|
+
}
|
|
524
566
|
const resolveMaterialBindGroup = (
|
|
525
567
|
materialSlot: number,
|
|
526
568
|
material: MaterialSnapshot,
|
|
@@ -554,6 +596,7 @@ export function recordMainPass(
|
|
|
554
596
|
resolveMaterialBindGroup,
|
|
555
597
|
passKind,
|
|
556
598
|
selectedDispatch,
|
|
599
|
+
colorFormats,
|
|
557
600
|
);
|
|
558
601
|
};
|
|
559
602
|
if (c.profilePhase === undefined) {
|
|
@@ -566,6 +609,33 @@ export function recordMainPass(
|
|
|
566
609
|
);
|
|
567
610
|
}
|
|
568
611
|
|
|
612
|
+
if (options?.gpuDriven !== undefined) {
|
|
613
|
+
if (viewBindGroup === null) {
|
|
614
|
+
throw new RhiError({
|
|
615
|
+
code: 'rhi-not-available',
|
|
616
|
+
expected: 'main-pass Standard PBR view bind group for GPU-driven encode',
|
|
617
|
+
hint: 'publish the current frame view/light/shadow bind group before GPU raster',
|
|
618
|
+
});
|
|
619
|
+
}
|
|
620
|
+
if (
|
|
621
|
+
gpuDrivenStandardPbrFrameResources === undefined ||
|
|
622
|
+
gpuDrivenStandardPbrFrameResources.materialBindGroups.length === 0 ||
|
|
623
|
+
gpuDrivenStandardPbrFrameResources.materialBindGroups.some((group) => group === undefined)
|
|
624
|
+
) {
|
|
625
|
+
throw new RhiError({
|
|
626
|
+
code: 'rhi-not-available',
|
|
627
|
+
expected: 'complete main-pass Standard PBR material bind-group receipt',
|
|
628
|
+
hint: 'finish frame material producer assembly before GPU-driven encode',
|
|
629
|
+
});
|
|
630
|
+
}
|
|
631
|
+
options.gpuDriven.projection.encode(
|
|
632
|
+
viewBindGroup,
|
|
633
|
+
pass,
|
|
634
|
+
options.gpuDriven.resources,
|
|
635
|
+
gpuDrivenStandardPbrFrameResources,
|
|
636
|
+
);
|
|
637
|
+
}
|
|
638
|
+
|
|
569
639
|
// D-2: LDR sprite pass. Runs after the geometry pass when there are
|
|
570
640
|
// sprite entities in the draw list and the LDR path is active.
|
|
571
641
|
// The geometry pass used the bgra8unorm-srgb sRGB view (hardware sRGB
|
|
@@ -583,7 +653,6 @@ export function recordMainPass(
|
|
|
583
653
|
materialSlotIndices,
|
|
584
654
|
sampleCount,
|
|
585
655
|
resolveMaterialBindGroup,
|
|
586
|
-
skylightResources,
|
|
587
656
|
graphPass,
|
|
588
657
|
selectedDispatch,
|
|
589
658
|
);
|
|
@@ -593,6 +662,7 @@ export function recordMainPass(
|
|
|
593
662
|
if (!geometryPassEnded && graphPass === undefined) {
|
|
594
663
|
pass.end();
|
|
595
664
|
}
|
|
665
|
+
return gpuDrivenStandardPbrFrameResources;
|
|
596
666
|
}
|
|
597
667
|
|
|
598
668
|
export function encodeMainPass(
|
|
@@ -600,6 +670,6 @@ export function encodeMainPass(
|
|
|
600
670
|
pass: RhiRenderPassEncoder,
|
|
601
671
|
selector?: PassSelector,
|
|
602
672
|
options?: MainPassOptions,
|
|
603
|
-
):
|
|
604
|
-
recordMainPass(c, selector, options, pass);
|
|
673
|
+
): GpuDrivenStandardPbrFrameResources | undefined {
|
|
674
|
+
return recordMainPass(c, selector, options, pass);
|
|
605
675
|
}
|
|
@@ -41,7 +41,7 @@ export function uploadMaterialUniforms(c: _InternalRenderPipelineContext): void
|
|
|
41
41
|
);
|
|
42
42
|
for (let materialSlot = 0; materialSlot < materialSlots.length; materialSlot += 1) {
|
|
43
43
|
const mat = materialSlots[materialSlot];
|
|
44
|
-
const entry =
|
|
44
|
+
const entry = materialSlotOwners[materialSlot];
|
|
45
45
|
if (mat === undefined || entry === undefined) continue;
|
|
46
46
|
|
|
47
47
|
// feat-20260625-refactor-sprite-as-transparent-mesh M3 / w13 (D-2):
|