@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
|
@@ -19,7 +19,6 @@ import {
|
|
|
19
19
|
postProcessShaderEntrySignature,
|
|
20
20
|
postProcessShaderPipelineLabel,
|
|
21
21
|
} from '../../fullscreen-post-process-pass';
|
|
22
|
-
import { resolveStandardPbrProgram } from '../../gpu-driven/pbr-program';
|
|
23
22
|
import type { PipelineState, RenderSystemInternals } from '../../record/render-context';
|
|
24
23
|
import type {
|
|
25
24
|
RecoveryGraphCandidate,
|
|
@@ -143,6 +142,9 @@ export interface RendererRecoveryDependencies {
|
|
|
143
142
|
readonly getMaterialShaderPipelineEntry: NonNullable<
|
|
144
143
|
RenderSystemInternals['getMaterialShaderPipelineEntry']
|
|
145
144
|
>;
|
|
145
|
+
readonly getMaterialShaderArtifact: NonNullable<
|
|
146
|
+
RenderSystemInternals['getMaterialShaderArtifact']
|
|
147
|
+
>;
|
|
146
148
|
readonly getCachedMaterialShaderBindingContract: NonNullable<
|
|
147
149
|
RenderSystemInternals['getMaterialShaderBindingContract']
|
|
148
150
|
>;
|
|
@@ -201,6 +203,7 @@ export function createRendererRecovery(deps: RendererRecoveryDependencies): Rend
|
|
|
201
203
|
buildPipeline,
|
|
202
204
|
getMaterialShaderPipeline,
|
|
203
205
|
getMaterialShaderPipelineEntry,
|
|
206
|
+
getMaterialShaderArtifact,
|
|
204
207
|
getCachedMaterialShaderBindingContract,
|
|
205
208
|
getParamSchema,
|
|
206
209
|
getMaterialBindGroupLayout,
|
|
@@ -329,6 +332,7 @@ export function createRendererRecovery(deps: RendererRecoveryDependencies): Rend
|
|
|
329
332
|
candidateShaderCatalog.installMaterialArtifact(identifier, {
|
|
330
333
|
source: entry.value.source,
|
|
331
334
|
paramSchema: entry.value.paramSchema,
|
|
335
|
+
...(entry.value.receipt === undefined ? {} : { receipt: entry.value.receipt }),
|
|
332
336
|
});
|
|
333
337
|
}
|
|
334
338
|
}
|
|
@@ -571,14 +575,7 @@ export function createRendererRecovery(deps: RendererRecoveryDependencies): Rend
|
|
|
571
575
|
dynamicTextureStore: { value: candidateState.dynamicTextureStore },
|
|
572
576
|
getMaterialShaderPipeline: { value: getMaterialShaderPipeline },
|
|
573
577
|
getMaterialShaderPipelineEntry: { value: getMaterialShaderPipelineEntry },
|
|
574
|
-
getMaterialShaderArtifact: {
|
|
575
|
-
value: (materialShaderId: string, vertexColorAvailable = false) =>
|
|
576
|
-
resolveStandardPbrProgram(
|
|
577
|
-
candidatePipelineState.gpuDrivenPbrPrograms,
|
|
578
|
-
materialShaderId,
|
|
579
|
-
vertexColorAvailable,
|
|
580
|
-
)?.artifact,
|
|
581
|
-
},
|
|
578
|
+
getMaterialShaderArtifact: { value: getMaterialShaderArtifact },
|
|
582
579
|
getMaterialShaderBindingContract: { value: getCachedMaterialShaderBindingContract },
|
|
583
580
|
getParamSchema: { value: getParamSchema },
|
|
584
581
|
getMaterialBindGroupLayout: { value: getMaterialBindGroupLayout },
|
|
@@ -30,6 +30,7 @@ import type {
|
|
|
30
30
|
RenderProfile,
|
|
31
31
|
RenderResult,
|
|
32
32
|
} from '../render-contract';
|
|
33
|
+
import { resolveSsaoParameters } from '../ssao-config';
|
|
33
34
|
import type { RendererHostImplementation } from './host-contract';
|
|
34
35
|
import { createRendererLifecycle, isRendererStateOperational } from './renderer-lifecycle';
|
|
35
36
|
|
|
@@ -108,6 +109,8 @@ export function exposeRenderer(renderer: RendererHostImplementation): Renderer {
|
|
|
108
109
|
candidate: DynamicGeometryCandidate,
|
|
109
110
|
ordering: DynamicGeometryOrdering,
|
|
110
111
|
) => renderer.acceptDynamicGeometry(candidate, ordering),
|
|
112
|
+
acceptDynamicGeometryCandidates: (candidates, ordering) =>
|
|
113
|
+
renderer.acceptDynamicGeometryCandidates(candidates, ordering),
|
|
111
114
|
dynamicGeometryReceipt: (candidate: DynamicGeometryCandidate) =>
|
|
112
115
|
renderer.dynamicGeometryReceipt(candidate),
|
|
113
116
|
cancelDynamicGeometry: (candidate: DynamicGeometryCandidate) =>
|
|
@@ -349,9 +352,26 @@ export function validateRenderProfile(profile: RenderProfile): string | undefine
|
|
|
349
352
|
if (profile.shadows !== 'off' && profile.shadows !== 'hard' && profile.shadows !== 'filtered') {
|
|
350
353
|
return "RenderProfile.shadows must be 'off', 'hard', or 'filtered'";
|
|
351
354
|
}
|
|
352
|
-
for (const field of ['pbr', 'ibl'
|
|
355
|
+
for (const field of ['pbr', 'ibl'] as const) {
|
|
353
356
|
if (typeof profile[field] !== 'boolean') return `RenderProfile.${field} must be boolean`;
|
|
354
357
|
}
|
|
358
|
+
if (
|
|
359
|
+
typeof profile.ssao !== 'boolean' &&
|
|
360
|
+
(typeof profile.ssao !== 'object' || profile.ssao === null || Array.isArray(profile.ssao))
|
|
361
|
+
)
|
|
362
|
+
return 'RenderProfile.ssao must be boolean or AO parameters';
|
|
363
|
+
if (typeof profile.ssao === 'object') {
|
|
364
|
+
if (
|
|
365
|
+
Object.keys(profile.ssao).some(
|
|
366
|
+
(key) => !['radius', 'bias', 'intensity', 'quality'].includes(key),
|
|
367
|
+
)
|
|
368
|
+
)
|
|
369
|
+
return 'RenderProfile.ssao contains an unsupported parameter';
|
|
370
|
+
const resolved = resolveSsaoParameters(profile.ssao);
|
|
371
|
+
if (!resolved.ok) return resolved.error.hint;
|
|
372
|
+
}
|
|
373
|
+
if (profile.ssao !== false && profile.renderPath !== 'deferred')
|
|
374
|
+
return 'SSAO needs current depth and normals: set renderPath to deferred';
|
|
355
375
|
const stages = STANDARD_POST_STAGE_NAMES;
|
|
356
376
|
if (
|
|
357
377
|
!Array.isArray(profile.postStages) ||
|
|
@@ -366,6 +386,7 @@ export function validateRenderProfile(profile: RenderProfile): string | undefine
|
|
|
366
386
|
export function freezeRenderProfile(profile: RenderProfile): RenderProfile {
|
|
367
387
|
return Object.freeze({
|
|
368
388
|
...profile,
|
|
389
|
+
ssao: typeof profile.ssao === 'object' ? Object.freeze({ ...profile.ssao }) : profile.ssao,
|
|
369
390
|
postStages: Object.freeze([...profile.postStages]) as RenderProfile['postStages'],
|
|
370
391
|
});
|
|
371
392
|
}
|
|
@@ -2,7 +2,13 @@ import type { Result, RhiError, ShaderModule } from '@forgeax/engine-rhi';
|
|
|
2
2
|
import { findVariantByKey, type MaterialShaderManifestEntry } from '@forgeax/engine-shader';
|
|
3
3
|
|
|
4
4
|
/** Minimum sampled-texture limit needed by Standard transmission variants. */
|
|
5
|
-
export const STANDARD_PBR_REQUIRED_SAMPLED_TEXTURES =
|
|
5
|
+
export const STANDARD_PBR_REQUIRED_SAMPLED_TEXTURES = 18;
|
|
6
|
+
|
|
7
|
+
function isOrdinaryMaterialVariant(
|
|
8
|
+
variant: MaterialShaderManifestEntry['variants'][number],
|
|
9
|
+
): boolean {
|
|
10
|
+
return variant.defines.COVERAGE_ONLY !== true;
|
|
11
|
+
}
|
|
6
12
|
|
|
7
13
|
/** Select HDRP variants that must be seeded during ready-state construction. */
|
|
8
14
|
export function selectHdrpPbrPrewarmVariants(
|
|
@@ -27,6 +33,7 @@ export function selectHdrpPbrPrewarmVariants(
|
|
|
27
33
|
return (
|
|
28
34
|
variants.filter(
|
|
29
35
|
(variant) =>
|
|
36
|
+
isOrdinaryMaterialVariant(variant) &&
|
|
30
37
|
variant.defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable &&
|
|
31
38
|
(!('EXTENDED_LIGHTING_AVAILABLE' in variant.defines) ||
|
|
32
39
|
variant.defines.EXTENDED_LIGHTING_AVAILABLE === extendedLightingShaderAvailable) &&
|
|
@@ -49,6 +56,7 @@ export function selectSkinPrewarmVariants(
|
|
|
49
56
|
return (
|
|
50
57
|
manifestEntry?.variants.filter(
|
|
51
58
|
(variant) =>
|
|
59
|
+
isOrdinaryMaterialVariant(variant) &&
|
|
52
60
|
variant.defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable &&
|
|
53
61
|
(storageBufferCapable || variant.defines.CLUSTER_FORWARD_AVAILABLE !== true) &&
|
|
54
62
|
variant.defines.PROBE_BLEND_AVAILABLE !== true,
|
|
@@ -70,6 +78,7 @@ export function selectGpuDrivenSceneIndexVariant(
|
|
|
70
78
|
): MaterialShaderManifestEntry['variants'][number] | undefined {
|
|
71
79
|
return manifestEntry?.variants.find(
|
|
72
80
|
(variant) =>
|
|
81
|
+
isOrdinaryMaterialVariant(variant) &&
|
|
73
82
|
variant.defines.STORAGE_BUFFER_AVAILABLE === true &&
|
|
74
83
|
variant.defines.GPU_DRIVEN_SCENE_INDEX_AVAILABLE === true &&
|
|
75
84
|
(!('CLUSTER_FORWARD_AVAILABLE' in variant.defines) ||
|
|
@@ -83,6 +92,8 @@ export function selectGpuDrivenSceneIndexVariant(
|
|
|
83
92
|
variant.defines.DIRECTIONAL_PCSS_AVAILABLE === directionalPcssAvailable) &&
|
|
84
93
|
(!('PROJECTOR_AVAILABLE' in variant.defines) ||
|
|
85
94
|
variant.defines.PROJECTOR_AVAILABLE === projectorAvailable) &&
|
|
95
|
+
(!('REFLECTION_FALLBACK_AVAILABLE' in variant.defines) ||
|
|
96
|
+
variant.defines.REFLECTION_FALLBACK_AVAILABLE === false) &&
|
|
86
97
|
(!('TRANSMISSION_AVAILABLE' in variant.defines) ||
|
|
87
98
|
variant.defines.TRANSMISSION_AVAILABLE === false),
|
|
88
99
|
);
|
|
@@ -103,6 +114,7 @@ export function selectProbePrewarmVariants(
|
|
|
103
114
|
manifestEntry?.variants.filter((variant) => {
|
|
104
115
|
const defines = variant.defines;
|
|
105
116
|
return (
|
|
117
|
+
isOrdinaryMaterialVariant(variant) &&
|
|
106
118
|
defines.PROBE_BLEND_AVAILABLE === true &&
|
|
107
119
|
defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable &&
|
|
108
120
|
(!('WEBGL2_COMPAT' in defines) || defines.WEBGL2_COMPAT === webgl2Downlevel) &&
|
|
@@ -156,6 +168,7 @@ export function selectStandardPbrTransmissionPrewarmVariants(
|
|
|
156
168
|
for (const transmissionAvailable of [false, true]) {
|
|
157
169
|
const declared = manifestEntry.variants.find(
|
|
158
170
|
(variant) =>
|
|
171
|
+
isOrdinaryMaterialVariant(variant) &&
|
|
159
172
|
variant.defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable &&
|
|
160
173
|
variant.defines.CLUSTER_FORWARD_AVAILABLE === standardBootClusterAxis() &&
|
|
161
174
|
variant.defines.VERTEX_COLOR_AVAILABLE === false &&
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { GpuDrivenPbrProgram } from '../gpu-driven/pbr-program';
|
|
2
|
+
import { transmissionBackdropAvailable } from './device-feature-admission';
|
|
2
3
|
// WebGPU generation-scoped ready-state builder.
|
|
3
4
|
// This owner performs one complete device-generation promotion; it receives
|
|
4
5
|
// policy/adapters and returns a fully prepared PipelineState.
|
|
@@ -225,18 +226,11 @@ export async function buildReadyWebGPU(
|
|
|
225
226
|
setVolumetricFogShaderSources: (sources: VolumetricFogShaderSources) => void,
|
|
226
227
|
/** Install manifest-owned SSR utility sources only after all five modules compile. */
|
|
227
228
|
setSsrShaderSources: (sources: SsrShaderSources) => void,
|
|
228
|
-
/** Install manifest-owned atmosphere utility sources only after
|
|
229
|
+
/** Install manifest-owned atmosphere utility sources only after all modules compile. */
|
|
229
230
|
setAtmosphereShaderSources: (sources: AtmosphereShaderSources) => void,
|
|
230
231
|
): Promise<PipelineState> {
|
|
231
232
|
const extendedLightingShaderAvailable = deriveExtendedLightingCapability(rhiDevice).admitted;
|
|
232
|
-
//
|
|
233
|
-
// front so both Step 2 (shader-module compile, where we patch engine
|
|
234
|
-
// entries to the STORAGE_BUFFER_AVAILABLE=false variant) and Step 3
|
|
235
|
-
// (buildPbrPipelineLayouts, which switches between read-only-storage
|
|
236
|
-
// and uniform BGL entries) walk the same axis. Step 0 already ran in
|
|
237
|
-
// `prepareMaterialShaders`; this is an idempotent re-read driven by
|
|
238
|
-
// `device.limits.maxStorageBuffersPerShaderStage`, which is 0 on the
|
|
239
|
-
// wgpu-wasm WebGL2 backend (downlevel_webgl2_defaults).
|
|
233
|
+
// Shader and layout construction consume the same storage capability.
|
|
240
234
|
const capValue = (rhiDevice.limits as Readonly<Record<string, number>>)
|
|
241
235
|
.maxStorageBuffersPerShaderStage;
|
|
242
236
|
const webgl2Downlevel = rhiDevice.caps.backendKind === 'wgpu-webgl2';
|
|
@@ -386,6 +380,7 @@ export async function buildReadyWebGPU(
|
|
|
386
380
|
let iblIrradianceEntry: ManifestEntry | undefined;
|
|
387
381
|
let iblPrefilterEntry: ManifestEntry | undefined;
|
|
388
382
|
let iblBrdfLutEntry: ManifestEntry | undefined;
|
|
383
|
+
let probeBackgroundEntry: ManifestEntry | undefined;
|
|
389
384
|
let fxaaEntry: ManifestEntry | undefined;
|
|
390
385
|
let skyboxEntry: ManifestEntry | undefined;
|
|
391
386
|
let bloomBrightEntry: ManifestEntry | undefined;
|
|
@@ -441,6 +436,10 @@ export async function buildReadyWebGPU(
|
|
|
441
436
|
iblBrdfLutEntry ??= entry;
|
|
442
437
|
continue;
|
|
443
438
|
}
|
|
439
|
+
if (entry.wgsl.includes('probe_background_fs')) {
|
|
440
|
+
probeBackgroundEntry ??= entry;
|
|
441
|
+
continue;
|
|
442
|
+
}
|
|
444
443
|
if (entry.wgsl.includes('f_schlick')) {
|
|
445
444
|
pbrEntry ??= entry;
|
|
446
445
|
continue;
|
|
@@ -522,6 +521,7 @@ export async function buildReadyWebGPU(
|
|
|
522
521
|
const exact = ms.variants.find(
|
|
523
522
|
(v) =>
|
|
524
523
|
v.defines.STORAGE_BUFFER_AVAILABLE === false &&
|
|
524
|
+
v.defines.COVERAGE_ONLY !== true &&
|
|
525
525
|
(!('CLUSTER_FORWARD_AVAILABLE' in v.defines) ||
|
|
526
526
|
v.defines.CLUSTER_FORWARD_AVAILABLE === false) &&
|
|
527
527
|
(!('VERTEX_COLOR_AVAILABLE' in v.defines) ||
|
|
@@ -564,6 +564,7 @@ export async function buildReadyWebGPU(
|
|
|
564
564
|
const exact = ms.variants.find(
|
|
565
565
|
(variant) =>
|
|
566
566
|
variant.defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable &&
|
|
567
|
+
variant.defines.COVERAGE_ONLY !== true &&
|
|
567
568
|
(!('CLUSTER_FORWARD_AVAILABLE' in variant.defines) ||
|
|
568
569
|
variant.defines.CLUSTER_FORWARD_AVAILABLE === false) &&
|
|
569
570
|
(!('VERTEX_COLOR_AVAILABLE' in variant.defines) ||
|
|
@@ -642,13 +643,7 @@ export async function buildReadyWebGPU(
|
|
|
642
643
|
}
|
|
643
644
|
}
|
|
644
645
|
}
|
|
645
|
-
//
|
|
646
|
-
// createIblPipelines runs (called downstream by the internal
|
|
647
|
-
// GpuResidencyCache equirect-to-cubemap projection during the first Skylight
|
|
648
|
-
// dispatch). When all 4 are present, register them; otherwise leave
|
|
649
|
-
// the cache untouched (charter F1: tests / non-IBL hosts that ship
|
|
650
|
-
// empty / 3-entry manifests still boot, and the IBL pipeline cache's
|
|
651
|
-
// own error surfacing covers the "missing" case downstream).
|
|
646
|
+
// Publish the generation's compiled IBL programs before resource preparation.
|
|
652
647
|
if (
|
|
653
648
|
iblEquirectEntry !== undefined &&
|
|
654
649
|
iblIrradianceEntry !== undefined &&
|
|
@@ -660,6 +655,9 @@ export async function buildReadyWebGPU(
|
|
|
660
655
|
irradiance: iblIrradianceEntry.wgsl,
|
|
661
656
|
prefilter: iblPrefilterEntry.wgsl,
|
|
662
657
|
brdfLut: iblBrdfLutEntry.wgsl,
|
|
658
|
+
...(probeBackgroundEntry === undefined
|
|
659
|
+
? {}
|
|
660
|
+
: { probeBackground: probeBackgroundEntry.wgsl }),
|
|
663
661
|
});
|
|
664
662
|
}
|
|
665
663
|
// Points/Lines are an engine-owned record path rather than a producer
|
|
@@ -986,7 +984,8 @@ export async function buildReadyWebGPU(
|
|
|
986
984
|
const coloredUnlitVariant = unlitManifestEntry?.variants.find(
|
|
987
985
|
(variant) =>
|
|
988
986
|
variant.defines.VERTEX_COLOR_AVAILABLE === true &&
|
|
989
|
-
variant.defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable
|
|
987
|
+
variant.defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable &&
|
|
988
|
+
variant.defines.COVERAGE_ONLY !== true,
|
|
990
989
|
);
|
|
991
990
|
if (coloredUnlitVariant !== undefined && coloredUnlitVariant.composedWgsl !== unlitEntry.wgsl) {
|
|
992
991
|
const coloredUnlitShaderResult = await runShimStep(
|
|
@@ -1013,7 +1012,8 @@ export async function buildReadyWebGPU(
|
|
|
1013
1012
|
const uncoloredUnlitVariant = unlitManifestEntry?.variants.find(
|
|
1014
1013
|
(variant) =>
|
|
1015
1014
|
variant.defines.VERTEX_COLOR_AVAILABLE === false &&
|
|
1016
|
-
variant.defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable
|
|
1015
|
+
variant.defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable &&
|
|
1016
|
+
variant.defines.COVERAGE_ONLY !== true,
|
|
1017
1017
|
);
|
|
1018
1018
|
if (uncoloredUnlitVariant !== undefined) {
|
|
1019
1019
|
seedShaderModule(
|
|
@@ -1411,7 +1411,10 @@ export async function buildReadyWebGPU(
|
|
|
1411
1411
|
// feat-20260612-hdrp-ssao M6 / w27: SSAO shader module compilation.
|
|
1412
1412
|
// Optional manifest entry — absent on legacy manifests (zero-overhead
|
|
1413
1413
|
// opt-out, same as bloom). Identified by 'fs_ssao_calc' content marker.
|
|
1414
|
-
|
|
1414
|
+
// The GLES translator cannot read raw depth through this SSAO program.
|
|
1415
|
+
// Keep optional AO out of fallback startup; requesting it is refused by
|
|
1416
|
+
// the record owner instead of breaking every AO-disabled renderer.
|
|
1417
|
+
if (ssaoEntry !== undefined && !webgl2Downlevel) {
|
|
1415
1418
|
const entry = ssaoEntry;
|
|
1416
1419
|
const ssaoShaderResult = await runShimStep(
|
|
1417
1420
|
() =>
|
|
@@ -1460,6 +1463,9 @@ export async function buildReadyWebGPU(
|
|
|
1460
1463
|
storageBuffer: storageBufferCapable,
|
|
1461
1464
|
extendedLighting: extendedLightingShaderAvailable,
|
|
1462
1465
|
projectorAvailable,
|
|
1466
|
+
transmissionBackdrop: transmissionBackdropAvailable(
|
|
1467
|
+
rhiDevice.limits.maxSampledTexturesPerShaderStage,
|
|
1468
|
+
),
|
|
1463
1469
|
}),
|
|
1464
1470
|
),
|
|
1465
1471
|
'webgpu-runtime-error',
|
|
@@ -1485,6 +1491,7 @@ export async function buildReadyWebGPU(
|
|
|
1485
1491
|
// (URP layout) so the manifest entry's URP variant WGSL still builds a
|
|
1486
1492
|
// valid PSO instead of hard-disabling the entire HDRP-variant build path.
|
|
1487
1493
|
let hdrpPbrPipelineLayoutHandle: PipelineLayout | null = null;
|
|
1494
|
+
let hdrpMeshBindGroupLayoutHandle: BindGroupLayout | null = null;
|
|
1488
1495
|
let hdrpProbePbrPipelineLayoutHandle: PipelineLayout | null = null;
|
|
1489
1496
|
// The cluster layout is storage-buffer backed. On the WebGL2/fallback
|
|
1490
1497
|
// capability tier its uniform-buffer projection exceeds the backend's
|
|
@@ -1493,6 +1500,7 @@ export async function buildReadyWebGPU(
|
|
|
1493
1500
|
const hdrpUnifiedBglDesc = createHdrpBindGroupLayoutDescriptor();
|
|
1494
1501
|
const hdrpUnifiedBglRes = rhiDevice.createBindGroupLayout(hdrpUnifiedBglDesc);
|
|
1495
1502
|
if (hdrpUnifiedBglRes.ok) {
|
|
1503
|
+
hdrpMeshBindGroupLayoutHandle = hdrpUnifiedBglRes.value;
|
|
1496
1504
|
const hdrpPlRes = rhiDevice.createPipelineLayout({
|
|
1497
1505
|
label: 'hdrp-pbr-pl',
|
|
1498
1506
|
bindGroupLayouts: [
|
|
@@ -3919,6 +3927,7 @@ export async function buildReadyWebGPU(
|
|
|
3919
3927
|
// HDRP variant uses the unified group(2) layout built above.
|
|
3920
3928
|
hdrpPbrPipelineLayout:
|
|
3921
3929
|
unlitModule !== null && pbrModule !== null ? hdrpPbrPipelineLayoutHandle : null,
|
|
3930
|
+
hdrpMeshBindGroupLayout: hdrpMeshBindGroupLayoutHandle,
|
|
3922
3931
|
hdrpProbePbrPipelineLayout:
|
|
3923
3932
|
unlitModule !== null && pbrModule !== null ? hdrpProbePbrPipelineLayoutHandle : null,
|
|
3924
3933
|
hdrpClusterMembershipPipeline,
|