@forgeax/engine-render 0.1.29 → 0.1.31
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 +248 -21
- package/dist/assembly/atmosphere-shader-prewarm.d.ts +1 -1
- package/dist/assembly/atmosphere-shader-prewarm.d.ts.map +1 -1
- package/dist/assembly/device-feature-admission.d.ts +4 -3
- package/dist/assembly/device-feature-admission.d.ts.map +1 -1
- package/dist/assembly/dynamic-geometry-host.d.ts +6 -0
- package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -1
- package/dist/assembly/host-contract.d.ts +6 -0
- package/dist/assembly/host-contract.d.ts.map +1 -1
- package/dist/assembly/material/assembly.d.ts +26 -3
- package/dist/assembly/material/assembly.d.ts.map +1 -1
- package/dist/assembly/material/pipeline-helpers.d.ts +24 -0
- package/dist/assembly/material/pipeline-helpers.d.ts.map +1 -0
- package/dist/assembly/material-shader-policy.d.ts.map +1 -1
- package/dist/assembly/recovery/device-loss-fanout.d.ts.map +1 -1
- package/dist/assembly/recovery/recovery-attempt.d.ts +1 -6
- package/dist/assembly/recovery/recovery-attempt.d.ts.map +1 -1
- package/dist/assembly/recovery/renderer-recover.d.ts +1 -0
- package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
- package/dist/assembly/renderer-facade.d.ts.map +1 -1
- package/dist/assembly/shader-prewarm-policy.d.ts +1 -1
- package/dist/assembly/shader-prewarm-policy.d.ts.map +1 -1
- package/dist/assembly/webgpu-ready.d.ts +1 -1
- package/dist/assembly/webgpu-ready.d.ts.map +1 -1
- package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
- package/dist/capture/scene-projection.d.ts +41 -0
- package/dist/capture/scene-projection.d.ts.map +1 -0
- package/dist/{chunk-BQVQOQJH.mjs → chunk-7MQ3XBSP.mjs} +20 -14
- package/dist/chunk-7MQ3XBSP.mjs.map +1 -0
- package/dist/{chunk-S4DNKQYQ.mjs → chunk-C3DDSXYK.mjs} +86 -33
- package/dist/chunk-C3DDSXYK.mjs.map +1 -0
- package/dist/{chunk-BTWH7BP4.mjs → chunk-FUUO4UND.mjs} +73 -29
- package/dist/chunk-FUUO4UND.mjs.map +1 -0
- package/dist/{chunk-NRNXBLIJ.mjs → chunk-JRBDO2KB.mjs} +46 -6
- package/dist/chunk-JRBDO2KB.mjs.map +1 -0
- package/dist/{chunk-NICXSHAT.mjs → chunk-MDQJPY3T.mjs} +8 -6
- package/dist/chunk-MDQJPY3T.mjs.map +1 -0
- package/dist/{chunk-JQTSEI3Z.mjs → chunk-NO4WZCAH.mjs} +3 -3
- package/dist/chunk-NO4WZCAH.mjs.map +1 -0
- package/dist/{chunk-FUODTTIA.mjs → chunk-PSEQ6QPH.mjs} +621 -108
- package/dist/chunk-PSEQ6QPH.mjs.map +1 -0
- package/dist/{chunk-33XZFTQU.mjs → chunk-S5UE2T5P.mjs} +48 -6
- package/dist/chunk-S5UE2T5P.mjs.map +1 -0
- package/dist/components/directional-light.d.ts +2 -2
- package/dist/components/dynamic-resolution.d.ts +15 -0
- package/dist/components/dynamic-resolution.d.ts.map +1 -0
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/light-helpers.d.ts.map +1 -1
- package/dist/components/reflection-probe.d.ts +1 -0
- package/dist/components/reflection-probe.d.ts.map +1 -1
- package/dist/components/skylight.d.ts +4 -1
- package/dist/components/skylight.d.ts.map +1 -1
- package/dist/construct-renderer.mjs +2172 -796
- package/dist/construct-renderer.mjs.map +1 -1
- package/dist/device/device-scope.d.ts +2 -0
- package/dist/device/device-scope.d.ts.map +1 -1
- package/dist/device/gpu-residency.d.ts +2 -2
- package/dist/device/gpu-residency.d.ts.map +1 -1
- package/dist/dynamic-geometry.d.ts.map +1 -1
- package/dist/environment/background.d.ts +3 -2
- package/dist/environment/background.d.ts.map +1 -1
- package/dist/environment/ibl.d.ts +11 -0
- package/dist/environment/ibl.d.ts.map +1 -0
- package/dist/environment/storage.d.ts +14 -0
- package/dist/environment/storage.d.ts.map +1 -0
- package/dist/errors/gpu-driven.d.ts +2 -2
- package/dist/errors/gpu-driven.d.ts.map +1 -1
- package/dist/errors/render.d.ts +35 -1
- package/dist/errors/render.d.ts.map +1 -1
- package/dist/extract/camera.d.ts.map +1 -1
- package/dist/extract/contracts.d.ts +7 -0
- package/dist/extract/contracts.d.ts.map +1 -1
- package/dist/extract/gpu-driven.d.ts +18 -1
- package/dist/extract/gpu-driven.d.ts.map +1 -1
- package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
- package/dist/gpu-driven/material-artifacts.d.ts +24 -0
- package/dist/gpu-driven/material-artifacts.d.ts.map +1 -0
- package/dist/gpu-driven/material-bindings.d.ts +7 -0
- package/dist/gpu-driven/material-bindings.d.ts.map +1 -0
- package/dist/gpu-driven/prepared-draw.d.ts +2 -0
- package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
- package/dist/gpu-driven/production-raster.d.ts +27 -6
- package/dist/gpu-driven/production-raster.d.ts.map +1 -1
- package/dist/gpu-resource.d.ts +5 -2
- package/dist/gpu-resource.d.ts.map +1 -1
- package/dist/gpu-scene-schema.d.ts.map +1 -1
- package/dist/gpu-scene.d.ts.map +1 -1
- package/dist/hdrp-buffers.d.ts +3 -0
- package/dist/hdrp-buffers.d.ts.map +1 -1
- package/dist/ibl/IblPipelineCache.d.ts +2 -0
- package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
- package/dist/ibl/skylight-bind-group.d.ts +3 -1
- package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
- package/dist/index.d.ts +83 -81
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +7 -5
- package/dist/index.mjs.map +1 -1
- package/dist/inspection-types.d.ts +16 -1
- package/dist/inspection-types.d.ts.map +1 -1
- package/dist/internal.mjs +6 -6
- package/dist/material-row.d.ts +10 -0
- package/dist/material-row.d.ts.map +1 -1
- package/dist/pbr-pipeline.d.ts +3 -1
- package/dist/pbr-pipeline.d.ts.map +1 -1
- package/dist/pipeline/render-extent.d.ts +51 -0
- package/dist/pipeline/render-extent.d.ts.map +1 -0
- package/dist/pipeline/standard-build-context.d.ts +7 -0
- package/dist/pipeline/standard-build-context.d.ts.map +1 -0
- package/dist/pipeline/standard-forward-lane.d.ts +3 -2
- package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
- package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-post.d.ts +1 -1
- package/dist/pipeline/standard-post.d.ts.map +1 -1
- package/dist/pipeline/standard-profile.d.ts +2 -1
- package/dist/pipeline/standard-profile.d.ts.map +1 -1
- package/dist/pipeline-builder.d.ts +3 -1
- package/dist/pipeline-builder.d.ts.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/post-process-errors.d.ts +9 -2
- package/dist/post-process-errors.d.ts.map +1 -1
- package/dist/prepare/extended-lighting/resources.d.ts +3 -3
- package/dist/record/frame-lighting.d.ts.map +1 -1
- package/dist/record/frame-snapshot.d.ts +3 -8
- package/dist/record/frame-snapshot.d.ts.map +1 -1
- package/dist/record/frame.d.ts +3 -2
- package/dist/record/frame.d.ts.map +1 -1
- package/dist/record/main-pass-geometry.d.ts +7 -2
- package/dist/record/main-pass-geometry.d.ts.map +1 -1
- package/dist/record/main-pass-material.d.ts +6 -3
- package/dist/record/main-pass-material.d.ts.map +1 -1
- package/dist/record/main-pass.d.ts +2 -0
- package/dist/record/main-pass.d.ts.map +1 -1
- package/dist/record/prepared-material-bindings.d.ts.map +1 -1
- package/dist/record/recovery-pipeline.d.ts +9 -1
- package/dist/record/recovery-pipeline.d.ts.map +1 -1
- package/dist/record/render-context.d.ts +34 -3
- package/dist/record/render-context.d.ts.map +1 -1
- package/dist/record/shadow-pass.d.ts +2 -2
- package/dist/record/shadow-pass.d.ts.map +1 -1
- package/dist/record/typed-frame-graph.d.ts +5 -2
- package/dist/record/typed-frame-graph.d.ts.map +1 -1
- package/dist/recovery/render-system-candidate.d.ts.map +1 -1
- package/dist/reflection/background.d.ts +14 -0
- package/dist/reflection/background.d.ts.map +1 -0
- package/dist/reflection/filter.d.ts.map +1 -1
- package/dist/reflection/projection.d.ts +1 -0
- package/dist/reflection/projection.d.ts.map +1 -1
- package/dist/reflection/record-owner.d.ts +4 -2
- package/dist/reflection/record-owner.d.ts.map +1 -1
- package/dist/render-contract.d.ts +47 -32
- package/dist/render-contract.d.ts.map +1 -1
- package/dist/render-graph-primitives.d.ts.map +1 -1
- package/dist/render-pipeline.d.ts +17 -1
- package/dist/render-pipeline.d.ts.map +1 -1
- package/dist/render-system-extract-tail.d.ts +9 -2
- package/dist/render-system-extract-tail.d.ts.map +1 -1
- package/dist/render-system-extract.d.ts +29 -2
- package/dist/render-system-extract.d.ts.map +1 -1
- package/dist/render-system.d.ts.map +1 -1
- package/dist/scene/render-scene.d.ts +2 -0
- package/dist/scene/render-scene.d.ts.map +1 -1
- package/dist/ssao-config.d.ts +8 -6
- package/dist/ssao-config.d.ts.map +1 -1
- package/dist/ssr/graph.d.ts.map +1 -1
- package/dist/temporal/gpu.d.ts.map +1 -1
- package/dist/temporal/index.mjs +5 -5
- package/dist/temporal/standard-scene-data.d.ts +2 -1
- package/dist/temporal/standard-scene-data.d.ts.map +1 -1
- package/dist/temporal/target-coverage-attachment.d.ts +15 -0
- package/dist/temporal/target-coverage-attachment.d.ts.map +1 -0
- package/dist/temporal/temporal-view.d.ts +6 -2
- package/dist/temporal/temporal-view.d.ts.map +1 -1
- package/dist/temporal/view.d.ts +6 -0
- package/dist/temporal/view.d.ts.map +1 -1
- package/dist/typed-render-graph-primitives.d.ts +6 -0
- package/dist/typed-render-graph-primitives.d.ts.map +1 -1
- package/dist/volume/component.d.ts +1 -0
- package/dist/volume/component.d.ts.map +1 -1
- package/package.json +21 -21
- package/src/__tests__/capture-scene-projection.unit.test.ts +24 -0
- package/src/__tests__/device-feature-admission.unit.test.ts +15 -24
- package/src/__tests__/device-loss-fanout.unit.test.ts +43 -0
- package/src/__tests__/dynamic-geometry-batch.unit.test.ts +157 -0
- package/src/__tests__/dynamic-geometry.unit.test.ts +36 -0
- package/src/__tests__/dynamic-resolution-plugin.integration.test.ts +81 -0
- package/src/__tests__/factory-contract.integration.test.ts +164 -1
- package/src/__tests__/frame-observation.contract.test.ts +21 -0
- package/src/__tests__/gpu-driven-baseline.characterization.test.ts +1 -1
- package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +20 -1
- package/src/__tests__/gpu-driven-lod-cache.unit.test.ts +0 -3
- package/src/__tests__/gpu-driven-mesh-world-identity.unit.test.ts +0 -3
- package/src/__tests__/gpu-driven-pbr.dawn.test.ts +11 -6
- package/src/__tests__/gpu-driven-production.integration.test.ts +13 -25
- package/src/__tests__/gpu-driven-view.unit.test.ts +1 -0
- package/src/__tests__/gpu-pass-timing-browser-runner.ts +15 -0
- package/src/__tests__/gpu-pass-timing.browser.test.ts +14 -1
- package/src/__tests__/gpu-resource-scope.unit.test.ts +71 -0
- package/src/__tests__/gpu-scene.unit.test.ts +55 -1
- package/src/__tests__/materials-standard-contract.unit.test.ts +5 -1
- package/src/__tests__/mesh-submission-lifetime.unit.test.ts +8 -0
- package/src/__tests__/morph-neutral-admission.unit.test.ts +19 -0
- package/src/__tests__/physical-clearcoat.integration.test.ts +6 -1
- package/src/__tests__/post-process-error-policy-owner.unit.test.ts +6 -5
- package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +216 -5
- package/src/__tests__/reflection-fallback-async-publication.unit.test.ts +68 -1
- package/src/__tests__/reflection-probe-authoring.unit.test.ts +12 -10
- package/src/__tests__/reflection-probe-box.dawn.test.ts +71 -0
- package/src/__tests__/reflection-probe-filter.unit.test.ts +9 -0
- package/src/__tests__/reflection-probe-orientation.dawn.test.ts +294 -0
- package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +5 -15
- package/src/__tests__/reflection-probe-updates.unit.test.ts +129 -0
- package/src/__tests__/render-error-code-owner.test-d.ts +3 -0
- package/src/__tests__/render-error-detail-ssot.test-d.ts +5 -1
- package/src/__tests__/render-extent.unit.test.ts +63 -0
- package/src/__tests__/render-scene-projection.unit.test.ts +3 -2
- package/src/__tests__/renderer-factory-material-contract.unit.test.ts +173 -9
- package/src/__tests__/shader-manifest-fixture.ts +6 -0
- package/src/__tests__/skinned-shadow-caster.test.ts +8 -1
- package/src/__tests__/specular-environment-scale.dawn.test.ts +4 -2
- package/src/__tests__/ssao-config.unit.test.ts +7 -0
- package/src/__tests__/ssao-surface.dawn.test.ts +252 -0
- package/src/__tests__/ssr-cube-silhouette.dawn.test.ts +270 -0
- package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +51 -43
- package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +4 -0
- package/src/__tests__/ssr-gpu-dispatch.ts +10 -5
- package/src/__tests__/ssr-graph-topology.unit.test.ts +2 -2
- package/src/__tests__/ssr-hiz.browser.test.ts +1 -1
- package/src/__tests__/ssr-hiz.dawn.test.ts +1 -1
- package/src/__tests__/ssr-spatial.integration.test.ts +1 -1
- package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +40 -0
- package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +238 -1
- package/src/__tests__/standard-profile-oracle.unit.test.ts +27 -0
- package/src/__tests__/taa-coverage-edge.dawn.test.ts +6 -0
- package/src/__tests__/taa-neighborhood-equivalence.dawn.test.ts +5 -1
- package/src/__tests__/taa-stability-feedback.ts +1 -0
- package/src/__tests__/temporal-reset-matrix.unit.test.ts +2 -2
- package/src/__tests__/temporal-view.unit.test.ts +17 -0
- package/src/__tests__/transmission-prewarm.unit.test.ts +57 -0
- package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +62 -13
- package/src/__tests__/volumetric-fog-topology.unit.test.ts +7 -7
- package/src/assembly/atmosphere-shader-prewarm.ts +3 -2
- package/src/assembly/device-feature-admission.ts +9 -4
- package/src/assembly/dynamic-geometry-host.ts +236 -163
- package/src/assembly/host-contract.ts +9 -0
- package/src/assembly/material/assembly.ts +350 -6
- package/src/assembly/material/pipeline-helpers.ts +100 -0
- package/src/assembly/material-shader-policy.ts +39 -18
- package/src/assembly/recovery/device-loss-fanout.ts +5 -0
- package/src/assembly/recovery/recovery-attempt.ts +2 -29
- package/src/assembly/recovery/renderer-recover.ts +6 -9
- package/src/assembly/renderer-facade.ts +22 -1
- package/src/assembly/shader-prewarm-policy.ts +14 -1
- package/src/assembly/webgpu-ready.ts +28 -19
- package/src/assembly/webgpu-renderer.ts +95 -95
- package/src/capture/scene-projection.ts +37 -0
- package/src/components/__tests__/dynamic-resolution-schema.unit.test.ts +65 -0
- package/src/components/__tests__/light-radius.integration.test.ts +59 -0
- package/src/components/directional-light.ts +3 -3
- package/src/components/dynamic-resolution.ts +67 -0
- package/src/components/index.ts +1 -0
- package/src/components/light-helpers.ts +6 -1
- package/src/components/reflection-probe.ts +1 -0
- package/src/components/skylight.ts +4 -1
- package/src/device/device-scope.ts +13 -7
- package/src/device/gpu-residency.ts +11 -11
- package/src/dynamic-geometry.ts +13 -8
- package/src/environment/background.ts +30 -12
- package/src/environment/ibl.ts +211 -0
- package/src/environment/storage.ts +63 -0
- package/src/errors/gpu-driven.ts +10 -3
- package/src/errors/render.ts +64 -0
- package/src/extract/camera.ts +12 -1
- package/src/extract/contracts.ts +10 -0
- package/src/extract/gpu-driven.ts +72 -17
- package/src/gpu-driven/batch-topology.ts +33 -11
- package/src/gpu-driven/material-artifacts.ts +179 -0
- package/src/gpu-driven/material-bindings.ts +41 -0
- package/src/gpu-driven/prepared-draw.ts +13 -2
- package/src/gpu-driven/production-raster.ts +681 -164
- package/src/gpu-resource.ts +21 -2
- package/src/gpu-scene-schema.ts +11 -2
- package/src/gpu-scene.ts +14 -3
- package/src/hdrp-buffers.ts +69 -0
- package/src/ibl/IblPipelineCache.ts +5 -0
- package/src/ibl/skylight-bind-group.ts +27 -17
- package/src/index.ts +92 -81
- package/src/inspection-types.ts +16 -1
- package/src/material-row.ts +60 -11
- package/src/pbr-pipeline.ts +13 -2
- package/src/pipeline/render-extent.ts +111 -0
- package/src/pipeline/standard-build-context.ts +7 -0
- package/src/pipeline/standard-forward-lane.ts +41 -24
- package/src/pipeline/standard-pipeline.ts +47 -18
- package/src/pipeline/standard-post.ts +4 -0
- package/src/pipeline/standard-profile.ts +2 -1
- package/src/pipeline-builder.ts +12 -3
- package/src/plugin.ts +4 -0
- package/src/post-process-errors.ts +26 -18
- package/src/prepare/__tests__/extended-lighting-capability.unit.test.ts +2 -2
- package/src/prepare/extended-lighting/resources.ts +3 -3
- package/src/record/__tests__/main-pass-geometry.unit.test.ts +68 -0
- package/src/record/__tests__/material-bg-cache.unit.test.ts +45 -0
- package/src/record/__tests__/material-slot-plan.unit.test.ts +9 -0
- package/src/record/__tests__/recovery-pipeline.unit.test.ts +47 -1
- package/src/record/__tests__/sprite-material-abi.unit.test.ts +7 -3
- package/src/record/__tests__/temporal-payload.unit.test.ts +2 -0
- package/src/record/frame-lighting.ts +3 -1
- package/src/record/frame-snapshot.ts +13 -11
- package/src/record/frame.ts +150 -74
- package/src/record/main-pass-geometry.ts +60 -9
- package/src/record/main-pass-material.ts +47 -19
- package/src/record/main-pass.ts +63 -4
- package/src/record/prepared-material-bindings.ts +4 -0
- package/src/record/recovery-pipeline.ts +56 -0
- package/src/record/render-context.ts +34 -3
- package/src/record/shadow-pass.ts +187 -50
- package/src/record/typed-frame-graph.ts +60 -3
- package/src/record/view-ubo.ts +1 -1
- package/src/recovery/render-system-candidate.ts +54 -11
- package/src/reflection/background.ts +151 -0
- package/src/reflection/filter.ts +3 -0
- package/src/reflection/projection.ts +16 -6
- package/src/reflection/record-owner.ts +282 -86
- package/src/render-contract.ts +50 -32
- package/src/render-graph-primitives.ts +28 -3
- package/src/render-pipeline.ts +20 -1
- package/src/render-system-extract-tail.ts +23 -3
- package/src/render-system-extract.ts +127 -42
- package/src/render-system.ts +35 -7
- package/src/scene/render-scene.ts +8 -0
- package/src/ssao-config.ts +25 -8
- package/src/ssr/graph.ts +78 -58
- package/src/temporal/gpu.ts +5 -0
- package/src/temporal/standard-scene-data.ts +7 -1
- package/src/temporal/target-coverage-attachment.ts +72 -0
- package/src/temporal/temporal-view.ts +10 -4
- package/src/temporal/view.ts +12 -2
- package/src/transmission/__tests__/standard-transmission.dawn.test.ts +24 -9
- package/src/typed-render-graph-primitives.ts +38 -0
- package/src/volume/component.ts +1 -0
- package/src/volume/passes.ts +3 -3
- package/dist/chunk-33XZFTQU.mjs.map +0 -1
- package/dist/chunk-BQVQOQJH.mjs.map +0 -1
- package/dist/chunk-BTWH7BP4.mjs.map +0 -1
- package/dist/chunk-FUODTTIA.mjs.map +0 -1
- package/dist/chunk-JQTSEI3Z.mjs.map +0 -1
- package/dist/chunk-NICXSHAT.mjs.map +0 -1
- package/dist/chunk-NRNXBLIJ.mjs.map +0 -1
- package/dist/chunk-S4DNKQYQ.mjs.map +0 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { transmissionBackdropAvailable } from '../assembly/device-feature-admission';
|
|
1
2
|
import { getOrCreateIblCache } from '../ibl/IblPipelineCache';
|
|
2
3
|
import type { _InternalRenderPipelineContext } from './render-context';
|
|
3
4
|
// @forgeax/engine-runtime - RenderSystem record stage: main-pass-material.
|
|
@@ -947,7 +948,7 @@ export interface PerSubmeshMaterialBgDeps {
|
|
|
947
948
|
readonly resolveReflectionProbeResources?: (
|
|
948
949
|
materialWorld: World,
|
|
949
950
|
entityKey: number,
|
|
950
|
-
) => SkylightBindGroupResources | undefined;
|
|
951
|
+
) => { readonly resources: SkylightBindGroupResources; readonly probeIndex: number } | undefined;
|
|
951
952
|
readonly materialBgShared: Map<string, WeakMap<object, unknown>>;
|
|
952
953
|
/** Cross-frame final BG reuse keyed by the stable source material handle. */
|
|
953
954
|
readonly materialBgAssemblyCache: Map<string, MaterialBgAssemblyCacheEntry>;
|
|
@@ -1007,6 +1008,7 @@ export function isMaterialBgAssemblyCacheHit(
|
|
|
1007
1008
|
skylightResources: SkylightBindGroupResources,
|
|
1008
1009
|
materialResourceEpoch: number,
|
|
1009
1010
|
transmissionBackdropView?: TextureView | null,
|
|
1011
|
+
sceneMaterialBuffer?: Buffer,
|
|
1010
1012
|
): cached is MaterialBgAssemblyCacheEntry {
|
|
1011
1013
|
if (transmissionBackdropView != null) return false;
|
|
1012
1014
|
return (
|
|
@@ -1014,9 +1016,11 @@ export function isMaterialBgAssemblyCacheHit(
|
|
|
1014
1016
|
cached.materialResourceEpoch === materialResourceEpoch &&
|
|
1015
1017
|
cached.materialBgl === materialBgl &&
|
|
1016
1018
|
cached.materialBuffer === materialBuffer &&
|
|
1019
|
+
cached.sceneMaterialBuffer === sceneMaterialBuffer &&
|
|
1017
1020
|
cached.skylightResources.irradianceView === skylightResources.irradianceView &&
|
|
1018
1021
|
cached.skylightResources.irradianceSampler === skylightResources.irradianceSampler &&
|
|
1019
1022
|
cached.skylightResources.prefilterView === skylightResources.prefilterView &&
|
|
1023
|
+
cached.skylightResources.skylightPrefilterView === skylightResources.skylightPrefilterView &&
|
|
1020
1024
|
cached.skylightResources.prefilterSampler === skylightResources.prefilterSampler &&
|
|
1021
1025
|
cached.skylightResources.brdfLutView === skylightResources.brdfLutView &&
|
|
1022
1026
|
cached.skylightResources.brdfLutSampler === skylightResources.brdfLutSampler &&
|
|
@@ -1046,13 +1050,13 @@ export function buildPerSubmeshMaterialBg(
|
|
|
1046
1050
|
bindGroupCounts,
|
|
1047
1051
|
frameState,
|
|
1048
1052
|
} = deps;
|
|
1049
|
-
const
|
|
1050
|
-
|
|
1053
|
+
const selectedProbe = resolveReflectionProbeResources?.(materialWorld, entityKey);
|
|
1054
|
+
const effectiveSkylightResources = selectedProbe?.resources ?? skylightResources;
|
|
1051
1055
|
const smMaterialHandle = submeshMaterial.materialHandle;
|
|
1052
1056
|
const materialCacheKey =
|
|
1053
1057
|
smMaterialHandle === undefined
|
|
1054
1058
|
? undefined
|
|
1055
|
-
: `${materialWorld.identity}:${smMaterialHandle}:${materialShaderId ?? ''}`;
|
|
1059
|
+
: `${materialWorld.identity}:${smMaterialHandle}:${materialShaderId ?? ''}:${selectedProbe?.probeIndex ?? 'sky'}`;
|
|
1056
1060
|
const smHasVideoFields = (submeshMaterial.videoTextureFields?.size ?? 0) > 0;
|
|
1057
1061
|
const smShaderId = materialShaderId;
|
|
1058
1062
|
// The cooked shader schema owns the resource ABI. A material snapshot may
|
|
@@ -1079,6 +1083,9 @@ export function buildPerSubmeshMaterialBg(
|
|
|
1079
1083
|
? BUILTIN_USER_REGION_TEXTURE_FIELDS
|
|
1080
1084
|
: userRegionTextureFieldOrder(smSchema).filter((field) => !physicalFields.includes(field));
|
|
1081
1085
|
const hasActiveTransmissionBackdrop = transmissionBackdropView != null;
|
|
1086
|
+
const sceneMaterialBuffer = runtime.device.caps.storageBuffer
|
|
1087
|
+
? (deps.sceneMaterialBuffer ?? pipelineState.meshStorageBuffer.buffer)
|
|
1088
|
+
: undefined;
|
|
1082
1089
|
const diagnosticsEnabled = materialDiagnosticsEnabled();
|
|
1083
1090
|
if (smMaterialHandle !== undefined && !smHasVideoFields && !hasActiveTransmissionBackdrop) {
|
|
1084
1091
|
const cached =
|
|
@@ -1092,8 +1099,8 @@ export function buildPerSubmeshMaterialBg(
|
|
|
1092
1099
|
effectiveSkylightResources,
|
|
1093
1100
|
store.materialResourceEpoch,
|
|
1094
1101
|
transmissionBackdropView,
|
|
1095
|
-
|
|
1096
|
-
|
|
1102
|
+
sceneMaterialBuffer,
|
|
1103
|
+
)
|
|
1097
1104
|
) {
|
|
1098
1105
|
if (diagnosticsEnabled) {
|
|
1099
1106
|
recordIblMaterialBinding(
|
|
@@ -1103,31 +1110,34 @@ export function buildPerSubmeshMaterialBg(
|
|
|
1103
1110
|
[
|
|
1104
1111
|
{
|
|
1105
1112
|
binding: 1 + smUserRegionFields.length * 2,
|
|
1106
|
-
resource: { kind: 'textureView', value:
|
|
1113
|
+
resource: { kind: 'textureView', value: effectiveSkylightResources.irradianceView },
|
|
1107
1114
|
},
|
|
1108
1115
|
{
|
|
1109
1116
|
binding: 2 + smUserRegionFields.length * 2,
|
|
1110
|
-
resource: { kind: 'sampler', value:
|
|
1117
|
+
resource: { kind: 'sampler', value: effectiveSkylightResources.irradianceSampler },
|
|
1111
1118
|
},
|
|
1112
1119
|
{
|
|
1113
1120
|
binding: 3 + smUserRegionFields.length * 2,
|
|
1114
|
-
resource: { kind: 'textureView', value:
|
|
1121
|
+
resource: { kind: 'textureView', value: effectiveSkylightResources.prefilterView },
|
|
1115
1122
|
},
|
|
1116
1123
|
{
|
|
1117
1124
|
binding: 4 + smUserRegionFields.length * 2,
|
|
1118
|
-
resource: { kind: 'sampler', value:
|
|
1125
|
+
resource: { kind: 'sampler', value: effectiveSkylightResources.prefilterSampler },
|
|
1119
1126
|
},
|
|
1120
1127
|
{
|
|
1121
1128
|
binding: 5 + smUserRegionFields.length * 2,
|
|
1122
|
-
resource: { kind: 'textureView', value:
|
|
1129
|
+
resource: { kind: 'textureView', value: effectiveSkylightResources.brdfLutView },
|
|
1123
1130
|
},
|
|
1124
1131
|
{
|
|
1125
1132
|
binding: 6 + smUserRegionFields.length * 2,
|
|
1126
|
-
resource: { kind: 'sampler', value:
|
|
1133
|
+
resource: { kind: 'sampler', value: effectiveSkylightResources.brdfLutSampler },
|
|
1127
1134
|
},
|
|
1128
1135
|
{
|
|
1129
1136
|
binding: 7 + smUserRegionFields.length * 2,
|
|
1130
|
-
resource: {
|
|
1137
|
+
resource: {
|
|
1138
|
+
kind: 'buffer',
|
|
1139
|
+
value: { buffer: effectiveSkylightResources.intensityBuffer },
|
|
1140
|
+
},
|
|
1131
1141
|
},
|
|
1132
1142
|
],
|
|
1133
1143
|
1 + smUserRegionFields.length * 2,
|
|
@@ -1264,10 +1274,14 @@ export function buildPerSubmeshMaterialBg(
|
|
|
1264
1274
|
const smMergedEntries = assembleMaterialWithSkylightEntries(
|
|
1265
1275
|
smBaseEntries,
|
|
1266
1276
|
effectiveSkylightResources,
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1277
|
+
transmissionBackdropAvailable(runtime.device.limits.maxSampledTexturesPerShaderStage)
|
|
1278
|
+
? ({
|
|
1279
|
+
sampler: transmissionSampler,
|
|
1280
|
+
...(transmissionBackdropView === undefined
|
|
1281
|
+
? {}
|
|
1282
|
+
: { backdropView: transmissionBackdropView }),
|
|
1283
|
+
} satisfies TransmissionBindGroupResources)
|
|
1284
|
+
: null,
|
|
1271
1285
|
physicalTextureInjections,
|
|
1272
1286
|
);
|
|
1273
1287
|
// Storage-capable devices share one Standard material BGL with the
|
|
@@ -1354,7 +1368,6 @@ export function buildPerSubmeshMaterialBg(
|
|
|
1354
1368
|
smMaterialHandle !== undefined &&
|
|
1355
1369
|
!smHasVideoFields &&
|
|
1356
1370
|
materialResourcesResident &&
|
|
1357
|
-
deps.sceneMaterialBuffer === undefined &&
|
|
1358
1371
|
!hasActiveTransmissionBackdrop
|
|
1359
1372
|
) {
|
|
1360
1373
|
if (materialCacheKey !== undefined) {
|
|
@@ -1363,6 +1376,7 @@ export function buildPerSubmeshMaterialBg(
|
|
|
1363
1376
|
materialResourceEpoch: store.materialResourceEpoch,
|
|
1364
1377
|
materialBgl: smMaterialBgl,
|
|
1365
1378
|
materialBuffer: pipelineState.materialUniformBuffer.buffer,
|
|
1379
|
+
...(sceneMaterialBuffer === undefined ? {} : { sceneMaterialBuffer }),
|
|
1366
1380
|
skylightResources: effectiveSkylightResources,
|
|
1367
1381
|
bindGroup: smBindGroup,
|
|
1368
1382
|
});
|
|
@@ -1387,6 +1401,7 @@ export function resolveMaterialSkylight(
|
|
|
1387
1401
|
pipelineState: Pick<PipelineState, 'skylightFallback'>,
|
|
1388
1402
|
skylight: SkylightSnapshot | undefined,
|
|
1389
1403
|
skylightCount: number,
|
|
1404
|
+
environmentIbl?: _InternalRenderPipelineContext['environmentIbl'],
|
|
1390
1405
|
) {
|
|
1391
1406
|
const skylightFallback = pipelineState.skylightFallback;
|
|
1392
1407
|
if (skylightFallback === null) {
|
|
@@ -1440,6 +1455,13 @@ export function resolveMaterialSkylight(
|
|
|
1440
1455
|
};
|
|
1441
1456
|
}
|
|
1442
1457
|
}
|
|
1458
|
+
if (environmentIbl !== undefined && skylight !== undefined && skylight.equirectHandle === 0) {
|
|
1459
|
+
activeViews = {
|
|
1460
|
+
irr: environmentIbl.irradiance,
|
|
1461
|
+
pref: environmentIbl.prefilter,
|
|
1462
|
+
brdf: activeViews?.brdf ?? skylightFallback.brdfLutView,
|
|
1463
|
+
};
|
|
1464
|
+
}
|
|
1443
1465
|
const skylightResources =
|
|
1444
1466
|
activeViews !== undefined
|
|
1445
1467
|
? {
|
|
@@ -1465,5 +1487,11 @@ export function resolveMaterialSkylight(
|
|
|
1465
1487
|
|
|
1466
1488
|
/** The same scene resources back material bindings in depth and color passes. */
|
|
1467
1489
|
export function prepareMaterialSkylight(c: _InternalRenderPipelineContext) {
|
|
1468
|
-
return resolveMaterialSkylight(
|
|
1490
|
+
return resolveMaterialSkylight(
|
|
1491
|
+
c.runtime,
|
|
1492
|
+
c.pipelineState,
|
|
1493
|
+
c.skylight,
|
|
1494
|
+
c.skylightCount,
|
|
1495
|
+
c.environmentIbl,
|
|
1496
|
+
);
|
|
1469
1497
|
}
|
package/src/record/main-pass.ts
CHANGED
|
@@ -8,7 +8,11 @@ import {
|
|
|
8
8
|
type TextureView,
|
|
9
9
|
} from '@forgeax/engine-rhi';
|
|
10
10
|
import type { PassKind, PassSelector } from '@forgeax/engine-types';
|
|
11
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
createGpuDrivenLightingBindGroup,
|
|
13
|
+
createHdrpUnifiedBindGroup,
|
|
14
|
+
getOrCreateHdrpBuffers,
|
|
15
|
+
} from '../hdrp-buffers';
|
|
12
16
|
import { getOrCreateIblCache } from '../ibl/IblPipelineCache';
|
|
13
17
|
import type { SkylightBindGroupResources } from '../ibl/skylight-bind-group';
|
|
14
18
|
import { buildBeginRenderPassDescriptor, standardTopologyBindGroupReady } from '../pipeline-spec';
|
|
@@ -67,6 +71,8 @@ export type MainPassOptions = {
|
|
|
67
71
|
/** Require the same material to contribute to another graph lane. */
|
|
68
72
|
readonly includeSelector?: PassSelector;
|
|
69
73
|
readonly transmissionBackdropView?: TextureView | null;
|
|
74
|
+
/** Select the material temporal entry's binary coverage output. */
|
|
75
|
+
readonly coverageOnly?: boolean;
|
|
70
76
|
readonly gpuDriven?: {
|
|
71
77
|
readonly projection: RenderPipelineGpuDrivenProjection;
|
|
72
78
|
readonly resources: GraphResourceResolver;
|
|
@@ -469,6 +475,13 @@ export function recordMainPass(
|
|
|
469
475
|
// which cannot render a PBR decal). Captures only frame-stable closure
|
|
470
476
|
// state; the caller passes the per-submesh material snapshot + entityKey
|
|
471
477
|
// (for video texture routing) and sets the dynamic UBO offset itself.
|
|
478
|
+
// Selection keys use the extracted frame index, never World.identity.
|
|
479
|
+
const hasProbeBindings = (c.reflectionProbes?.table.rows.length ?? 0) > 0;
|
|
480
|
+
const worldIndices = hasProbeBindings
|
|
481
|
+
? new Map(
|
|
482
|
+
validatedOrdered.map((entry) => [entry.world ?? world, entry.source.worldId] as const),
|
|
483
|
+
)
|
|
484
|
+
: undefined;
|
|
472
485
|
const perSubmeshMaterialBgDeps: PerSubmeshMaterialBgDeps = {
|
|
473
486
|
runtime,
|
|
474
487
|
pipelineState,
|
|
@@ -480,8 +493,10 @@ export function recordMainPass(
|
|
|
480
493
|
resolveRenderTargetTextureSource: runtime.resolveRenderTargetTextureSource,
|
|
481
494
|
resolveReflectionProbeResources: (materialWorld, entityKey) => {
|
|
482
495
|
const reflectionProbes = c.reflectionProbes;
|
|
483
|
-
if (reflectionProbes === undefined) return undefined;
|
|
484
|
-
const selection = reflectionProbes.selections.get(
|
|
496
|
+
if (reflectionProbes === undefined || !hasProbeBindings) return undefined;
|
|
497
|
+
const selection = reflectionProbes.selections.get(
|
|
498
|
+
`${worldIndices?.get(materialWorld)}:${entityKey}`,
|
|
499
|
+
);
|
|
485
500
|
if (selection === undefined) return undefined;
|
|
486
501
|
const binding = resolveReflectionProbeBinding(selection, reflectionProbes.table);
|
|
487
502
|
if (binding.useSkylight || binding.probeIndex === undefined) return undefined;
|
|
@@ -499,12 +514,13 @@ export function recordMainPass(
|
|
|
499
514
|
irradianceView: skylightResources.irradianceView,
|
|
500
515
|
irradianceSampler: skylightResources.irradianceSampler,
|
|
501
516
|
prefilterView: row.filteredView,
|
|
517
|
+
skylightPrefilterView: skylightResources.prefilterView,
|
|
502
518
|
prefilterSampler: row.sampler,
|
|
503
519
|
brdfLutView: skylightResources.brdfLutView,
|
|
504
520
|
brdfLutSampler: skylightResources.brdfLutSampler,
|
|
505
521
|
intensityBuffer: row.uniformBuffer,
|
|
506
522
|
};
|
|
507
|
-
return probeResources;
|
|
523
|
+
return { resources: probeResources, probeIndex: row.index };
|
|
508
524
|
},
|
|
509
525
|
materialBgShared: frameState.materialBgShared,
|
|
510
526
|
materialBgAssemblyCache: c.materialBgAssemblyCache,
|
|
@@ -551,12 +567,53 @@ export function recordMainPass(
|
|
|
551
567
|
);
|
|
552
568
|
}
|
|
553
569
|
if (gpuDrivenStandardPbrFrameResources !== undefined) {
|
|
570
|
+
gpuDrivenStandardPbrFrameResources.resolveClusteredMeshBindGroup = (binding) => {
|
|
571
|
+
const buffers = getOrCreateHdrpBuffers(
|
|
572
|
+
runtime,
|
|
573
|
+
frameState.installedPipelineConfig?.clusterGrid,
|
|
574
|
+
);
|
|
575
|
+
const layout =
|
|
576
|
+
binding.paletteBuffer === undefined
|
|
577
|
+
? pipelineState.hdrpMeshBindGroupLayout
|
|
578
|
+
: pipelineState.hdrpSkinMeshBindGroupLayout;
|
|
579
|
+
const group =
|
|
580
|
+
buffers === null || layout == null
|
|
581
|
+
? null
|
|
582
|
+
: createGpuDrivenLightingBindGroup(
|
|
583
|
+
runtime,
|
|
584
|
+
buffers,
|
|
585
|
+
layout,
|
|
586
|
+
binding,
|
|
587
|
+
c.hdrpSsaoBlurredView,
|
|
588
|
+
);
|
|
589
|
+
if (group === null)
|
|
590
|
+
throw new RhiError({
|
|
591
|
+
code: 'rhi-not-available',
|
|
592
|
+
expected: 'scene-index clustered lighting binding',
|
|
593
|
+
hint: 'publish scene rows and the current lighting/AO resources before indirect drawing',
|
|
594
|
+
});
|
|
595
|
+
return group;
|
|
596
|
+
};
|
|
554
597
|
gpuDrivenStandardPbrFrameResources.materialBindGroups.length = 0;
|
|
555
598
|
gpuDrivenStandardPbrFrameResources.materialBindGroups.push(...preparedMaterialBindGroups);
|
|
599
|
+
gpuDrivenStandardPbrFrameResources.colorFormats = colorFormats;
|
|
600
|
+
const selectedMaterialSlots = new Set<number>();
|
|
601
|
+
if (matchedMaterials === null)
|
|
602
|
+
delete gpuDrivenStandardPbrFrameResources.selectedMaterialSlots;
|
|
603
|
+
else gpuDrivenStandardPbrFrameResources.selectedMaterialSlots = selectedMaterialSlots;
|
|
556
604
|
gpuDrivenStandardPbrFrameResources.materialSlotIndicesByEntity.clear();
|
|
557
605
|
for (let index = 0; index < validatedOrdered.length; index += 1) {
|
|
558
606
|
const entry = validatedOrdered[index];
|
|
559
607
|
if (entry === undefined) continue;
|
|
608
|
+
const selected = matchedMaterials?.get(entry.renderableIndex);
|
|
609
|
+
const materials =
|
|
610
|
+
entry.source.materials.length > 0 ? entry.source.materials : [entry.source.material];
|
|
611
|
+
for (let slot = 0; slot < materials.length; slot += 1) {
|
|
612
|
+
const handle = materials[slot]?.materialHandle ?? -1;
|
|
613
|
+
const globalSlot = materialSlotIndices[index]?.[slot];
|
|
614
|
+
if (globalSlot !== undefined && selected?.has(handle))
|
|
615
|
+
selectedMaterialSlots.add(globalSlot);
|
|
616
|
+
}
|
|
560
617
|
gpuDrivenStandardPbrFrameResources.materialSlotIndicesByEntity.set(
|
|
561
618
|
worldEntityKey(entry.source.worldId, entry.source.entityKey),
|
|
562
619
|
materialSlotIndices[index] ?? [],
|
|
@@ -570,6 +627,7 @@ export function recordMainPass(
|
|
|
570
627
|
materialWorld: World = world,
|
|
571
628
|
materialShaderId: string | undefined = material.materialShaderId,
|
|
572
629
|
): BindGroup =>
|
|
630
|
+
!hasProbeBindings &&
|
|
573
631
|
materialShaderId === material.materialShaderId &&
|
|
574
632
|
materialShaderId !== POINTS_LINES_MATERIAL_SHADER_ID
|
|
575
633
|
? (preparedMaterialBindGroups[materialSlot] ??
|
|
@@ -597,6 +655,7 @@ export function recordMainPass(
|
|
|
597
655
|
passKind,
|
|
598
656
|
selectedDispatch,
|
|
599
657
|
colorFormats,
|
|
658
|
+
options?.coverageOnly ?? false,
|
|
600
659
|
);
|
|
601
660
|
};
|
|
602
661
|
if (c.profilePhase === undefined) {
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
materialValuesToLinearRuntime,
|
|
11
11
|
type SamplerAsset,
|
|
12
12
|
} from '@forgeax/engine-types';
|
|
13
|
+
import { transmissionBackdropAvailable } from '../assembly/device-feature-admission';
|
|
13
14
|
import { GPU_BUFFER_USAGE_COPY_DST, GPU_BUFFER_USAGE_UNIFORM } from '../gpu-usage';
|
|
14
15
|
import type { SkylightBindGroupResources } from '../ibl/skylight-bind-group';
|
|
15
16
|
import { assembleMaterialWithSkylightEntries } from '../ibl/skylight-bind-group';
|
|
@@ -205,6 +206,9 @@ export function preparedMaterialBindings(
|
|
|
205
206
|
brdfLutSampler: fallback.sampler,
|
|
206
207
|
intensityBuffer: fallback.intensityBuffer,
|
|
207
208
|
},
|
|
209
|
+
transmissionBackdropAvailable(runtime.device.limits.maxSampledTexturesPerShaderStage)
|
|
210
|
+
? undefined
|
|
211
|
+
: null,
|
|
208
212
|
);
|
|
209
213
|
// Per-shader PBR layouts reserve the scene-material SSBO at binding 46 on
|
|
210
214
|
// storage-capable devices. Prepared feature materials use this same layout,
|
|
@@ -31,6 +31,7 @@ import { geometryRenderStateForTopology } from './main-pass-material';
|
|
|
31
31
|
import type {
|
|
32
32
|
MaterialShaderPipelineEntry,
|
|
33
33
|
PipelineState,
|
|
34
|
+
RecoveryColdWorkGuard,
|
|
34
35
|
RenderSystemInternals,
|
|
35
36
|
} from './render-context';
|
|
36
37
|
|
|
@@ -38,6 +39,60 @@ export interface RecoveryPipelineReadiness {
|
|
|
38
39
|
readonly pipelineSpecs: readonly PipelineSpec[];
|
|
39
40
|
/** Re-resolve every candidate request and assert a stable cache hit. */
|
|
40
41
|
readonly assertPreparedCache: () => void;
|
|
42
|
+
readonly assertFirstRecoveryFrame: () => void;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Create the one-shot assertion used by the first frame after publication.
|
|
47
|
+
* Recording a miss is a failure at the owner seam; the draw path never gets a
|
|
48
|
+
* chance to submit a frame that hides a shader/pipeline or static-residency
|
|
49
|
+
* cold build behind an apparently successful receipt.
|
|
50
|
+
*/
|
|
51
|
+
export function createRecoveryColdWorkGuard(): RecoveryColdWorkGuard {
|
|
52
|
+
let armed = false;
|
|
53
|
+
let recording = false;
|
|
54
|
+
let finished = false;
|
|
55
|
+
let pipelineColdWork = 0;
|
|
56
|
+
let uploadColdWork = 0;
|
|
57
|
+
const fail = (kind: 'pipeline' | 'upload'): never => {
|
|
58
|
+
if (kind === 'pipeline') pipelineColdWork += 1;
|
|
59
|
+
else uploadColdWork += 1;
|
|
60
|
+
throw new Error(
|
|
61
|
+
`recovery first frame performed cold ${kind} work ` +
|
|
62
|
+
`(pipeline=${pipelineColdWork}, upload=${uploadColdWork})`,
|
|
63
|
+
);
|
|
64
|
+
};
|
|
65
|
+
return {
|
|
66
|
+
arm(): void {
|
|
67
|
+
armed = true;
|
|
68
|
+
finished = false;
|
|
69
|
+
pipelineColdWork = 0;
|
|
70
|
+
uploadColdWork = 0;
|
|
71
|
+
},
|
|
72
|
+
beginFrame(): void {
|
|
73
|
+
recording = true;
|
|
74
|
+
},
|
|
75
|
+
endFrame(): void {
|
|
76
|
+
recording = false;
|
|
77
|
+
},
|
|
78
|
+
notePipelineColdWork(): void {
|
|
79
|
+
if (armed && recording && !finished) fail('pipeline');
|
|
80
|
+
},
|
|
81
|
+
noteUploadColdWork(): void {
|
|
82
|
+
if (armed && recording && !finished) fail('upload');
|
|
83
|
+
},
|
|
84
|
+
finish(): void {
|
|
85
|
+
if (!armed || finished) return;
|
|
86
|
+
finished = true;
|
|
87
|
+
armed = false;
|
|
88
|
+
if (pipelineColdWork !== 0 || uploadColdWork !== 0) {
|
|
89
|
+
throw new Error(
|
|
90
|
+
`recovery first frame cold-work assertion failed ` +
|
|
91
|
+
`(pipeline=${pipelineColdWork}, upload=${uploadColdWork})`,
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
};
|
|
41
96
|
}
|
|
42
97
|
|
|
43
98
|
interface RecoveryPipelineRequest {
|
|
@@ -614,5 +669,6 @@ export function prepareRecoveryPipelineReadiness(input: {
|
|
|
614
669
|
return {
|
|
615
670
|
pipelineSpecs: Object.freeze(requests.map((request) => request.spec)),
|
|
616
671
|
assertPreparedCache,
|
|
672
|
+
assertFirstRecoveryFrame: assertPreparedCache,
|
|
617
673
|
};
|
|
618
674
|
}
|
|
@@ -88,7 +88,7 @@ export interface ReflectionProbeRecordState {
|
|
|
88
88
|
>;
|
|
89
89
|
/** Demand is derived from this frame's renderable/source selection. */
|
|
90
90
|
readonly fallbackDemand?: boolean;
|
|
91
|
-
/**
|
|
91
|
+
/** Non-neutral sources require a nonzero diagnostic sample when capture is enabled. */
|
|
92
92
|
readonly fallbackHasNonNeutral?: boolean;
|
|
93
93
|
readonly completeSubmission: (
|
|
94
94
|
submitted: boolean,
|
|
@@ -144,6 +144,22 @@ import type {
|
|
|
144
144
|
} from './frame-snapshot';
|
|
145
145
|
import type { FoldDispatchPlan } from './mesh-ssbo';
|
|
146
146
|
|
|
147
|
+
/**
|
|
148
|
+
* Armed only for the first published recovery frame. Candidate preparation
|
|
149
|
+
* must make every pipeline and static residency lookup a cache hit before this
|
|
150
|
+
* guard is armed; a miss during draw is a hard failure before queue submission.
|
|
151
|
+
* Explicit preparation between draws remains allowed, including new geometry
|
|
152
|
+
* admitted on the first fixed step after device recovery.
|
|
153
|
+
*/
|
|
154
|
+
export interface RecoveryColdWorkGuard {
|
|
155
|
+
arm(): void;
|
|
156
|
+
beginFrame(): void;
|
|
157
|
+
endFrame(): void;
|
|
158
|
+
notePipelineColdWork(): void;
|
|
159
|
+
noteUploadColdWork(): void;
|
|
160
|
+
finish(): void;
|
|
161
|
+
}
|
|
162
|
+
|
|
147
163
|
export interface RenderSystemRuntime {
|
|
148
164
|
readonly device: RhiDevice;
|
|
149
165
|
/** Current renderer device generation used to fence receipt-bound captures. */
|
|
@@ -178,7 +194,16 @@ export interface RenderSystemRuntime {
|
|
|
178
194
|
/** Producer-owned cooked Standard PBR artifact used by GPU-driven projection. */
|
|
179
195
|
readonly getMaterialShaderArtifact?: (
|
|
180
196
|
materialShaderId: string,
|
|
181
|
-
|
|
197
|
+
request?:
|
|
198
|
+
| {
|
|
199
|
+
readonly vertexColorAvailable?: boolean;
|
|
200
|
+
readonly deformation?: 'rigid' | 'skin';
|
|
201
|
+
readonly clustered?: boolean;
|
|
202
|
+
readonly reflectionFallback?: boolean;
|
|
203
|
+
readonly pass?: 'forward' | 'shadow' | 'depth';
|
|
204
|
+
readonly address?: 'direct' | 'scene-index';
|
|
205
|
+
}
|
|
206
|
+
| boolean,
|
|
182
207
|
) => MaterialShaderArtifact | undefined;
|
|
183
208
|
readonly getMaterialShaderPipeline?: (
|
|
184
209
|
materialShaderId: string,
|
|
@@ -221,7 +246,7 @@ export interface RenderSystemRuntime {
|
|
|
221
246
|
vertexLayout?: string,
|
|
222
247
|
vertexLayoutProjection?: VertexLayoutProjection,
|
|
223
248
|
shaderModuleMode?: RenderFeatureShaderModuleMode,
|
|
224
|
-
layoutKindOverride?: 'pbr' | 'pbr-skin',
|
|
249
|
+
layoutKindOverride?: 'pbr' | 'pbr-skin' | 'gpu-driven-pbr' | 'gpu-driven-skin',
|
|
225
250
|
/** Optional vertex entry override for receipt-owned scene-index passes. */
|
|
226
251
|
vertexEntryPoint?: string,
|
|
227
252
|
additionalColorFormats?: readonly GPUTextureFormat[],
|
|
@@ -249,6 +274,8 @@ export interface RenderSystemRuntime {
|
|
|
249
274
|
) => BindGroupLayout | undefined;
|
|
250
275
|
/** Handle-first factory for built-in same-frame GPU producers. */
|
|
251
276
|
readonly immediateShaderModuleFactory?: PipelineBuilderShaderModuleFactory;
|
|
277
|
+
/** Optional guard for the first recovery frame's cold-work boundary. */
|
|
278
|
+
readonly recoveryColdWorkGuard?: RecoveryColdWorkGuard | undefined;
|
|
252
279
|
readonly metrics: EngineMetrics;
|
|
253
280
|
readonly lookupPostProcess?: (
|
|
254
281
|
id: string,
|
|
@@ -422,6 +449,7 @@ export interface PipelineState {
|
|
|
422
449
|
readonly gpuDrivenPbrSkinPipelineLayout?: PipelineLayout | null;
|
|
423
450
|
readonly pbrProbePipelineLayout?: PipelineLayout | null;
|
|
424
451
|
readonly hdrpPbrPipelineLayout: PipelineLayout | null;
|
|
452
|
+
readonly hdrpMeshBindGroupLayout?: BindGroupLayout | null;
|
|
425
453
|
readonly hdrpProbePbrPipelineLayout?: PipelineLayout | null;
|
|
426
454
|
readonly hdrpClusterMembershipPipeline: ComputePipeline | null;
|
|
427
455
|
readonly hdrpClusterMembershipBindGroupLayout: BindGroupLayout | null;
|
|
@@ -462,6 +490,7 @@ export interface RenderSystemInternals extends RenderSystemRuntime {
|
|
|
462
490
|
readonly build?: string | undefined;
|
|
463
491
|
/** Host identity binding for the renderer-owned SSR dependency seam. */
|
|
464
492
|
readonly ssrIdentity?: SsrAdmissionIdentity | undefined;
|
|
493
|
+
readonly captureReflectionFallbackReadback?: boolean | undefined;
|
|
465
494
|
readonly standardProfile?: StandardProfile | undefined;
|
|
466
495
|
readonly standardPipeline: RenderFrameState['activePipeline'];
|
|
467
496
|
readonly featureHost?: RenderFeatureHost | undefined;
|
|
@@ -518,6 +547,8 @@ export interface RenderSystemInternals extends RenderSystemRuntime {
|
|
|
518
547
|
}
|
|
519
548
|
|
|
520
549
|
export interface _StandardForwardSceneView {
|
|
550
|
+
readonly environmentIbl?: { readonly irradiance: TextureView; readonly prefilter: TextureView };
|
|
551
|
+
readonly captureDispatch?: readonly DispatchEntry[];
|
|
521
552
|
readonly assets: AssetRegistry;
|
|
522
553
|
readonly store: import('../device/gpu-residency').GpuResidencyCache;
|
|
523
554
|
readonly pipelineState: PipelineState;
|