@forgeax/engine-render 0.1.32 → 0.1.33
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 +379 -33
- package/dist/assembly/analytic-fog-registration.d.ts +3 -0
- package/dist/assembly/analytic-fog-registration.d.ts.map +1 -0
- package/dist/assembly/fxaa-registration.d.ts +4 -0
- package/dist/assembly/fxaa-registration.d.ts.map +1 -0
- package/dist/assembly/lod-observation.d.ts +4 -0
- package/dist/assembly/lod-observation.d.ts.map +1 -0
- package/dist/assembly/motion-blur-registration.d.ts +3 -0
- package/dist/assembly/motion-blur-registration.d.ts.map +1 -0
- package/dist/assembly/renderer-facade.d.ts.map +1 -1
- package/dist/assembly/temporal-post-process-prewarm.d.ts +13 -0
- package/dist/assembly/temporal-post-process-prewarm.d.ts.map +1 -0
- package/dist/assembly/webgpu-ready-contract.d.ts +4 -3
- package/dist/assembly/webgpu-ready-contract.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/bloom-admission.d.ts +13 -0
- package/dist/bloom-admission.d.ts.map +1 -0
- package/dist/{chunk-DRR7D3KX.mjs → chunk-3RTCJTH4.mjs} +12 -9
- package/dist/chunk-3RTCJTH4.mjs.map +1 -0
- package/dist/{chunk-S665NJNF.mjs → chunk-LEAXOMYJ.mjs} +3 -3
- package/dist/{chunk-S665NJNF.mjs.map → chunk-LEAXOMYJ.mjs.map} +1 -1
- package/dist/{chunk-6TFBXLRJ.mjs → chunk-NB2S7ZRX.mjs} +155 -11
- package/dist/chunk-NB2S7ZRX.mjs.map +1 -0
- package/dist/{chunk-LULCA3OF.mjs → chunk-NNQL7CB3.mjs} +4 -4
- package/dist/{chunk-LULCA3OF.mjs.map → chunk-NNQL7CB3.mjs.map} +1 -1
- package/dist/{chunk-4NNZQCL3.mjs → chunk-OO3DRYK7.mjs} +66 -200
- package/dist/chunk-OO3DRYK7.mjs.map +1 -0
- package/dist/{chunk-GWCEMDVR.mjs → chunk-PLAXOOX5.mjs} +232 -7
- package/dist/chunk-PLAXOOX5.mjs.map +1 -0
- package/dist/{chunk-JRIPCMYC.mjs → chunk-VOZWDM3L.mjs} +283 -193
- package/dist/chunk-VOZWDM3L.mjs.map +1 -0
- package/dist/{chunk-JCIRYQ4V.mjs → chunk-ZDQWGQW7.mjs} +10 -4
- package/dist/chunk-ZDQWGQW7.mjs.map +1 -0
- package/dist/components/atmosphere.d.ts +2 -0
- package/dist/components/atmosphere.d.ts.map +1 -1
- package/dist/components/camera.d.ts +20 -4
- package/dist/components/camera.d.ts.map +1 -1
- package/dist/components/mesh-filter.d.ts +6 -5
- package/dist/components/mesh-filter.d.ts.map +1 -1
- package/dist/components/motion-blur.d.ts +1 -0
- package/dist/components/motion-blur.d.ts.map +1 -1
- package/dist/construct-renderer.mjs +2865 -526
- package/dist/construct-renderer.mjs.map +1 -1
- package/dist/device/gpu-residency.d.ts +6 -0
- package/dist/device/gpu-residency.d.ts.map +1 -1
- package/dist/environment/analytic-fog.d.ts +6 -0
- package/dist/environment/analytic-fog.d.ts.map +1 -0
- package/dist/errors/render.d.ts +6 -2
- 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/environment.d.ts +2 -0
- package/dist/extract/environment.d.ts.map +1 -1
- package/dist/features/error-reporting.d.ts +13 -0
- package/dist/features/error-reporting.d.ts.map +1 -0
- package/dist/features/host.d.ts +5 -0
- package/dist/features/host.d.ts.map +1 -1
- package/dist/features/motion-blur/motion-blur-feature.d.ts +20 -2
- package/dist/features/motion-blur/motion-blur-feature.d.ts.map +1 -1
- package/dist/features/motion-blur/motion-blur-params.d.ts +21 -0
- package/dist/features/motion-blur/motion-blur-params.d.ts.map +1 -1
- package/dist/features/motion-blur/motion-blur-runtime.d.ts +54 -0
- package/dist/features/motion-blur/motion-blur-runtime.d.ts.map +1 -0
- package/dist/features/plan.d.ts +7 -4
- package/dist/features/plan.d.ts.map +1 -1
- package/dist/features/prepared-gpu-work.d.ts +9 -5
- package/dist/features/prepared-gpu-work.d.ts.map +1 -1
- package/dist/features/render-graph-compute.d.ts.map +1 -1
- package/dist/features/render-graph-contribution.d.ts.map +1 -1
- package/dist/gpu-driven/material-artifacts.d.ts.map +1 -1
- package/dist/gpu-driven/prepared-draw.d.ts +7 -0
- package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
- package/dist/gpu-driven/production-raster.d.ts +3 -1
- package/dist/gpu-driven/production-raster.d.ts.map +1 -1
- package/dist/gpu-driven/view-gpu.d.ts +9 -0
- package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
- package/dist/gpu-scene.d.ts +6 -1
- package/dist/gpu-scene.d.ts.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +5 -5
- package/dist/inspection-types.d.ts +43 -2
- package/dist/inspection-types.d.ts.map +1 -1
- package/dist/instances.d.ts +8 -1
- package/dist/instances.d.ts.map +1 -1
- package/dist/internal.mjs +6 -6
- package/dist/pipeline/standard-post.d.ts +28 -19
- package/dist/pipeline/standard-post.d.ts.map +1 -1
- package/dist/pipeline-spec.d.ts +2 -2
- package/dist/record/frame-snapshot.d.ts +3 -0
- 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 +5 -2
- package/dist/record/frame.d.ts.map +1 -1
- package/dist/record/main-pass-geometry.d.ts.map +1 -1
- package/dist/record/mesh-ssbo.d.ts +6 -5
- package/dist/record/mesh-ssbo.d.ts.map +1 -1
- package/dist/record/render-context.d.ts +12 -28
- package/dist/record/render-context.d.ts.map +1 -1
- package/dist/record/shadow-pass.d.ts.map +1 -1
- package/dist/record/skybox-post-pass.d.ts +5 -3
- package/dist/record/skybox-post-pass.d.ts.map +1 -1
- package/dist/record/typed-frame-graph.d.ts +1 -1
- package/dist/record/typed-frame-graph.d.ts.map +1 -1
- package/dist/recovery/render-system-candidate.d.ts.map +1 -1
- package/dist/render-contract.d.ts +24 -4
- package/dist/render-contract.d.ts.map +1 -1
- package/dist/render-pipeline.d.ts +3 -1
- package/dist/render-pipeline.d.ts.map +1 -1
- package/dist/render-system-extract-tail.d.ts.map +1 -1
- package/dist/render-system-extract.d.ts +8 -1
- package/dist/render-system-extract.d.ts.map +1 -1
- package/dist/render-system.d.ts +7 -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/temporal/frame-coordinator.d.ts.map +1 -1
- package/dist/temporal/frame.d.ts +7 -0
- package/dist/temporal/frame.d.ts.map +1 -1
- package/dist/temporal/index.mjs +5 -5
- package/dist/temporal/view.d.ts +6 -1
- package/dist/temporal/view.d.ts.map +1 -1
- package/dist/typed-render-graph-primitives.d.ts +10 -7
- package/dist/typed-render-graph-primitives.d.ts.map +1 -1
- package/dist/volume/component.d.ts +0 -1
- package/dist/volume/component.d.ts.map +1 -1
- package/dist/volume/passes.d.ts.map +1 -1
- package/dist/volume/temporal.d.ts +3 -1
- package/dist/volume/temporal.d.ts.map +1 -1
- package/package.json +21 -21
- package/src/__tests__/analytic-fog-graph.unit.test.ts +199 -0
- package/src/__tests__/analytic-fog-optics.unit.test.ts +38 -0
- package/src/__tests__/bloom-exact-zero.unit.test.ts +112 -18
- package/src/__tests__/bloom-lifecycle.integration.test.ts +17 -4
- package/src/__tests__/dynamic-resolution-plugin.integration.test.ts +20 -0
- package/src/__tests__/environment-fog-lanes.integration.test.ts +14 -0
- package/src/__tests__/environment-selection.unit.test.ts +12 -0
- package/src/__tests__/factory-contract.integration.test.ts +331 -68
- package/src/__tests__/frame-camera-selection.unit.test.ts +39 -1
- package/src/__tests__/frame-plan-contract.unit.test.ts +2 -0
- package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +2 -1
- package/src/__tests__/gpu-driven-shadow-views.dawn.test.ts +1 -1
- package/src/__tests__/gpu-driven-shadow-views.integration.test.ts +1 -1
- package/src/__tests__/gpu-driven-view-gpu-evidence.ts +11 -0
- package/src/__tests__/gpu-resource-store-stride.unit.test.ts +12 -0
- package/src/__tests__/gpu-scene.unit.test.ts +91 -0
- package/src/__tests__/instances-store.unit.test.ts +75 -0
- package/src/__tests__/mesh-submission-lifetime.unit.test.ts +31 -0
- package/src/__tests__/motion-blur-compute.dawn.test.ts +583 -0
- package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +21 -0
- package/src/__tests__/prepared-graphics-lifecycle.unit.test.ts +86 -0
- package/src/__tests__/public-surface.test-d.ts +8 -0
- package/src/__tests__/render-error-code-owner.test-d.ts +2 -0
- package/src/__tests__/render-feature-error-reporting.unit.test.ts +24 -0
- package/src/__tests__/render-feature-stage-fault-recovery.unit.test.ts +23 -0
- package/src/__tests__/render-scene-temporal-retry.unit.test.ts +31 -0
- package/src/__tests__/renderer-frame-transaction.integration.test.ts +7 -1
- package/src/__tests__/shader-manifest-fixture.ts +4 -4
- package/src/__tests__/skinned-shadow-caster.test.ts +2 -0
- package/src/__tests__/standard-lighting-write.unit.test.ts +2 -1
- package/src/__tests__/standard-pipeline.dawn.test.ts +1 -1
- package/src/__tests__/standard-pipeline.integration.test.ts +18 -8
- package/src/__tests__/temporal-reset-matrix.unit.test.ts +10 -0
- package/src/__tests__/temporal-view.unit.test.ts +2 -1
- package/src/__tests__/typed-pipeline-topology.unit.test.ts +20 -4
- package/src/__tests__/volume-optics-oracle.unit.test.ts +3 -1
- package/src/__tests__/volumetric-fog-budget-recovery.integration.test.ts +177 -13
- package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +447 -61
- package/src/__tests__/volumetric-fog-temporal.unit.test.ts +27 -0
- package/src/__tests__/volumetric-fog-topology.unit.test.ts +19 -3
- package/src/assembly/analytic-fog-registration.ts +14 -0
- package/src/assembly/fxaa-registration.ts +17 -0
- package/src/assembly/lod-observation.ts +12 -0
- package/src/assembly/motion-blur-registration.ts +17 -0
- package/src/assembly/renderer-facade.ts +2 -0
- package/src/assembly/temporal-post-process-prewarm.ts +40 -0
- package/src/assembly/webgpu-ready-contract.ts +8 -3
- package/src/assembly/webgpu-ready.ts +181 -245
- package/src/assembly/webgpu-renderer.ts +16 -31
- package/src/bloom-admission.ts +21 -0
- package/src/components/__tests__/motion-blur.unit.test.ts +1 -0
- package/src/components/atmosphere.ts +4 -0
- package/src/components/camera.ts +66 -10
- package/src/components/mesh-filter.ts +11 -9
- package/src/components/motion-blur.ts +1 -0
- package/src/device/gpu-residency.ts +56 -12
- package/src/environment/analytic-fog.ts +44 -0
- package/src/environment/background.ts +2 -2
- package/src/errors/render.ts +14 -1
- package/src/extract/camera.ts +20 -7
- package/src/extract/contracts.ts +7 -0
- package/src/extract/environment.ts +4 -0
- package/src/features/error-reporting.ts +78 -0
- package/src/features/host.ts +25 -12
- package/src/features/motion-blur/__tests__/motion-blur-feature.unit.test.ts +111 -1
- package/src/features/motion-blur/__tests__/motion-blur-params.unit.test.ts +58 -3
- package/src/features/motion-blur/motion-blur-feature.ts +1519 -15
- package/src/features/motion-blur/motion-blur-params.ts +70 -2
- package/src/features/motion-blur/motion-blur-runtime.ts +176 -0
- package/src/features/plan.ts +25 -8
- package/src/features/prepared-gpu-work.ts +86 -35
- package/src/features/render-graph-compute.ts +13 -5
- package/src/features/render-graph-contribution.ts +2 -0
- package/src/gpu-driven/material-artifacts.ts +2 -7
- package/src/gpu-driven/prepared-draw.ts +15 -10
- package/src/gpu-driven/production-raster.ts +83 -7
- package/src/gpu-driven/view-gpu.ts +17 -0
- package/src/gpu-scene.ts +188 -21
- package/src/index.ts +32 -0
- package/src/inspection-types.ts +60 -2
- package/src/instances.ts +80 -1
- package/src/pipeline/standard-post.ts +307 -78
- package/src/pipeline-spec.ts +5 -5
- package/src/points-lines/__tests__/view-ubo.unit.test.ts +2 -1
- package/src/record/__tests__/temporal-payload.unit.test.ts +2 -1
- package/src/record/frame-snapshot.ts +5 -1
- package/src/record/frame-targets.ts +10 -6
- package/src/record/frame.ts +163 -22
- package/src/record/main-pass-geometry.ts +30 -1
- package/src/record/main-pass-sprite-draws.ts +6 -1
- package/src/record/mesh-ssbo.ts +43 -6
- package/src/record/render-context.ts +12 -28
- package/src/record/shadow-pass.ts +6 -1
- package/src/record/skybox-post-pass.ts +122 -196
- package/src/record/typed-frame-graph.ts +153 -9
- package/src/recovery/render-system-candidate.ts +22 -10
- package/src/render-contract.ts +23 -4
- package/src/render-pipeline.ts +6 -1
- package/src/render-system-extract-tail.ts +16 -0
- package/src/render-system-extract.ts +45 -13
- package/src/render-system.ts +255 -120
- package/src/scene/render-scene.ts +85 -4
- package/src/temporal/__tests__/temporal-frame-transaction.unit.test.ts +36 -0
- package/src/temporal/frame-coordinator.ts +8 -1
- package/src/temporal/frame.ts +20 -0
- package/src/temporal/view.ts +13 -2
- package/src/typed-render-graph-primitives.ts +121 -48
- package/src/volume/component.ts +0 -1
- package/src/volume/passes.ts +8 -4
- package/src/volume/resources.ts +1 -1
- package/src/volume/temporal.ts +11 -0
- package/dist/chunk-4NNZQCL3.mjs.map +0 -1
- package/dist/chunk-6TFBXLRJ.mjs.map +0 -1
- package/dist/chunk-DRR7D3KX.mjs.map +0 -1
- package/dist/chunk-GWCEMDVR.mjs.map +0 -1
- package/dist/chunk-JCIRYQ4V.mjs.map +0 -1
- package/dist/chunk-JRIPCMYC.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/pipeline/render-extent.ts","../src/render-pipeline.ts","../src/light-buffer-layout.ts","../src/pipeline-spec.ts","../src/record/mesh-ssbo.ts","../src/ssao-buffers.ts","../src/hdrp-buffers.ts","../src/cluster-binner.ts","../src/pipeline/standard-lighting/errors.ts","../src/pipeline/standard-lighting/membership.ts","../src/pipeline/standard-lighting/prepare.ts","../src/pipeline/standard-lighting/transport.ts","../src/post-process-errors.ts","../src/ssao-config.ts","../src/record/helpers.ts","../src/record/view-ubo.ts","../src/record/frame-lighting.ts","../src/ibl/IblPipelineCache.ts","../src/points-lines/record.ts","../src/gpu-resource.ts","../src/assembly/shader-prewarm-policy.ts","../src/assembly/device-feature-admission.ts","../src/ibl/skylight-bind-group.ts","../src/render-data.ts","../src/record/render-context.ts","../src/record/main-pass-material.ts","../src/record/main-pass-geometry.ts","../src/record/main-pass-sprite-draws.ts","../src/gpu-scene-schema.ts","../src/scene/visibility/lod-selector.ts","../src/gpu-driven/batch-topology.ts","../src/scene/visibility/occlusion-confidence.ts","../src/gpu-driven/view-gpu.ts","../src/gpu-driven/shadow-views.ts","../src/record/shadow-pass.ts","../src/record/main-pass.ts","../src/assembly/webgpu-ready-contract.ts","../src/bloom-admission.ts","../src/record/skybox-post-pass.ts","../src/fullscreen-post-process-pass.ts","../src/render-graph-primitives.ts","../src/temporal/gpu.ts","../src/typed-render-graph-primitives.ts","../src/temporal/standard-scene-data.ts"],"names":["ok","parts","err","cache","RhiError","mat4","vec3","hdrpBuffers","toShared","deriveVertexLayoutProjection","bytesPerRow","blockBytesPerRow","derive","resolveAssetHandle","materialDiagnosticsEnabled","result","instanceDraws","STANDARD_PIPELINE_PARAM_SCHEMA","RenderGraphError","record","shadowPipeline","probeVideoHighPerfUpload","buildPerSubmeshMaterialBg","transformed"],"mappings":"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","file":"chunk-VOZWDM3L.mjs","sourcesContent":["/** Immutable dimensions shared by every Standard graph consumer. */\nexport interface RenderExtent {\n readonly outputWidth: number;\n readonly outputHeight: number;\n readonly internalWidth: number;\n readonly internalHeight: number;\n readonly scale: number;\n readonly generation: number;\n}\n\nexport interface RenderExtentInput {\n readonly outputWidth: number;\n readonly outputHeight: number;\n readonly requestedScale: number;\n readonly generation: number;\n}\n\nexport type RenderExtentDomain = 'internal' | 'output' | 'authoring';\n\n/** Project the immutable extent into a graph texture descriptor size. */\nexport function renderExtentSize(\n extent: RenderExtent,\n domain: RenderExtentDomain,\n): { readonly width: number; readonly height: number } {\n if (domain === 'internal') {\n return { width: extent.internalWidth, height: extent.internalHeight };\n }\n return { width: extent.outputWidth, height: extent.outputHeight };\n}\n\nexport type StandardLightingLane = 'direct' | 'clustered' | 'cpu-webgl2';\n\nexport interface StandardExtentDomainPlan {\n readonly extent: RenderExtent;\n readonly lane: StandardLightingLane;\n readonly topologyKey: string;\n readonly dynamicDelta: 0 | 1;\n readonly domains: {\n readonly internal: { readonly width: number; readonly height: number };\n readonly output: { readonly width: number; readonly height: number };\n readonly authoring: { readonly width: number; readonly height: number };\n };\n readonly resources: readonly {\n readonly name: string;\n readonly domain: 'internal' | 'output' | 'authoring';\n }[];\n}\n\nconst MIN_SCALE = 0.5;\nconst MAX_SCALE = 1;\nconst SCALE_STEPS = 32;\nconst AXIS_ALIGNMENT = 8;\n\nfunction alignedAxis(output: number, scale: number): number {\n return Math.max(AXIS_ALIGNMENT, Math.floor((output * scale) / AXIS_ALIGNMENT) * AXIS_ALIGNMENT);\n}\n\nfunction finiteDimension(value: number): number {\n return Math.max(1, Math.floor(value));\n}\n\n/** Derive the one immutable Standard extent before graph construction. */\nexport function deriveRenderExtent(input: RenderExtentInput): RenderExtent {\n const outputWidth = finiteDimension(input.outputWidth);\n const outputHeight = finiteDimension(input.outputHeight);\n const clamped = Math.min(MAX_SCALE, Math.max(MIN_SCALE, input.requestedScale));\n const scale = Math.round(clamped * SCALE_STEPS) / SCALE_STEPS;\n const nativeSurface = outputWidth < AXIS_ALIGNMENT || outputHeight < AXIS_ALIGNMENT;\n const internalWidth = nativeSurface ? outputWidth : alignedAxis(outputWidth, scale);\n const internalHeight = nativeSurface ? outputHeight : alignedAxis(outputHeight, scale);\n return Object.freeze({\n outputWidth,\n outputHeight,\n internalWidth,\n internalHeight,\n scale: nativeSurface ? 1 : scale,\n generation: input.generation,\n });\n}\n\n/** Describe Standard's shared internal/output/authoring domain assignment. */\nexport function standardExtentDomainPlan(\n extent: RenderExtent,\n lane: StandardLightingLane,\n): StandardExtentDomainPlan {\n const domains = {\n internal: { width: extent.internalWidth, height: extent.internalHeight },\n output: { width: extent.outputWidth, height: extent.outputHeight },\n authoring: { width: extent.outputWidth, height: extent.outputHeight },\n } as const;\n return Object.freeze({\n extent,\n lane,\n topologyKey: `standard:${extent.internalWidth}x${extent.internalHeight}:${extent.outputWidth}x${extent.outputHeight}:g${extent.generation}`,\n dynamicDelta: extent.scale === 1 ? 0 : 1,\n domains,\n resources: Object.freeze([\n { name: 'scene', domain: 'internal' },\n { name: 'depth', domain: 'internal' },\n { name: 'g-buffer', domain: 'internal' },\n { name: 'scene-temporal', domain: 'internal' },\n { name: 'ssao', domain: 'internal' },\n { name: 'taa-history', domain: 'output' },\n { name: 'bloom', domain: 'output' },\n { name: 'output', domain: 'output' },\n { name: 'overlay', domain: 'output' },\n { name: 'observation', domain: 'output' },\n { name: 'shadow', domain: 'authoring' },\n ] satisfies StandardExtentDomainPlan['resources']),\n });\n}\n","// @forgeax/engine-render - typed render-pipeline topology contract.\n//\n// `RenderPipeline` is the typed topology contribution used by the Standard host.\n// The host owns the single active pipeline identity and its lifecycle; producers\n// contribute graph declarations through this interface instead of publishing a\n// second renderer authority.\n//\n// Naming note (requirements line 155): `RenderPipeline` here is the forgeax engine\n// concept name. The RHI GPU `RenderPipeline` handle (`@forgeax/engine-rhi`) is a\n// separate, internal opaque-handle type distinguished by module path (AGENTS.md RHI\n// form rules - \"opaque handles distinguished by module path\"); it is not exposed to\n// AI users. Files importing both alias the RHI one locally.\n//\n// Pipelines declare topology once through a typed builder. The renderer compiles,\n// executes, retires, finishes, and submits the resulting graph.\n\nimport type {\n ColorValueDomain,\n GraphAccess,\n GraphBuffer,\n GraphResourceResolver,\n GraphTexture,\n GraphTextureDescriptor,\n GraphTextureView,\n GraphTextureViewDescriptor,\n RenderGraphBuilder,\n RenderGraphError,\n RenderGraphFrame,\n} from '@forgeax/engine-render-graph';\nimport type {\n BindGroup,\n Buffer,\n RhiCaps,\n RhiError,\n RhiRenderPassEncoder,\n TextureFormat,\n} from '@forgeax/engine-rhi';\nimport { ok, type Result } from '@forgeax/engine-types';\nimport type { Tonemap } from './components/camera';\nimport type { DepthOfFieldSide } from './components/depth-of-field';\nimport type { DirectionalShadowFilterLabel } from './components/directional-shadow-filter';\nimport type { RenderError } from './errors/render';\nimport type { RenderFeatureTargetKind } from './features/targets';\nimport type { ShadowViewIdentity, ShadowViewProjection } from './gpu-driven/shadow-views';\nimport {\n GPU_TEXTURE_USAGE_COPY_SRC,\n GPU_TEXTURE_USAGE_RENDER_ATTACHMENT,\n} from './gpu-texture-usage';\nimport type { RenderExtent } from './pipeline/render-extent';\nimport type { StandardTopologyInputValue } from './pipeline/standard-lighting/topology';\nimport { STANDARD_POST_STAGE_NAMES, type StandardProfile } from './pipeline/standard-profile';\nimport type { SurfaceProfile } from './record/render-context';\nimport type { FrameObservationDomain, RenderPipelineContext } from './render-contract';\nimport type { OcclusionFrameProjection } from './scene/visibility/occlusion-runtime';\nimport type { SsrSpatialAdmission } from './ssr/admission';\nimport type { TransmissionDemand } from './transmission/projection';\n\nexport type { RenderPipelineContext } from './render-contract';\n\nexport type RenderColorDomain = 'linearHdr' | 'linearLdr' | 'displayEncoded';\n\n/** Backend admission inputs used by the existing Render candidate owner. */\nexport interface DirectionalShadowBackendAdmissionInput {\n readonly backendKind: 'webgpu' | 'wgpu-webgl2' | 'null';\n readonly requested: 'off' | DirectionalShadowFilterLabel;\n readonly candidate: 'accepted' | 'failed';\n readonly lastKnownGood?: DirectionalShadowFilterLabel | undefined;\n}\n\n/** Bounded, truthful Directional effective-profile projection. */\nexport interface DirectionalShadowBackendAdmission {\n readonly requested: 'off' | DirectionalShadowFilterLabel;\n readonly effective: 'off' | DirectionalShadowFilterLabel | 'rhi-null-structural';\n readonly status: 'accepted' | 'fallback' | 'rejected';\n readonly fallbackReason?: 'webgl2-unsupported' | 'rhi-null-structural' | 'candidate-failed';\n readonly lastKnownGood: boolean;\n readonly pixelEvidence: 'available' | 'not-available';\n}\n\n/**\n * Resolve a Directional profile only after the selected production candidate\n * has been admitted. WebGL2 and RhiNull are the sole declared fallbacks;\n * capable candidate failure retains a compatible LKG and never silently maps\n * a failed PCSS request to PCF.\n */\nexport function resolveDirectionalShadowBackendAdmission(\n input: DirectionalShadowBackendAdmissionInput,\n): DirectionalShadowBackendAdmission {\n if (input.requested === 'off') {\n return {\n requested: 'off',\n effective: 'off',\n status: 'accepted',\n lastKnownGood: false,\n pixelEvidence: 'not-available',\n };\n }\n if (input.backendKind === 'null') {\n return {\n requested: input.requested,\n effective: 'rhi-null-structural',\n status: 'fallback',\n fallbackReason: 'rhi-null-structural',\n lastKnownGood: false,\n pixelEvidence: 'not-available',\n };\n }\n if (input.backendKind === 'wgpu-webgl2') {\n const effective =\n input.requested === 'pcssMedium'\n ? 'pcf3'\n : input.requested === 'pcssHigh'\n ? 'pcf5'\n : input.requested;\n return {\n requested: input.requested,\n effective,\n status: effective === input.requested ? 'accepted' : 'fallback',\n ...(effective === input.requested ? {} : { fallbackReason: 'webgl2-unsupported' as const }),\n lastKnownGood: false,\n pixelEvidence: 'available',\n };\n }\n if (input.candidate === 'accepted') {\n return {\n requested: input.requested,\n effective: input.requested,\n status: 'accepted',\n lastKnownGood: false,\n pixelEvidence: 'available',\n };\n }\n if (input.lastKnownGood !== undefined) {\n return {\n requested: input.requested,\n effective: input.lastKnownGood,\n status: 'rejected',\n fallbackReason: 'candidate-failed',\n lastKnownGood: true,\n pixelEvidence: 'available',\n };\n }\n return {\n requested: input.requested,\n effective: input.requested,\n status: 'rejected',\n fallbackReason: 'candidate-failed',\n lastKnownGood: false,\n pixelEvidence: 'available',\n };\n}\n\nexport interface ToneOutputContract {\n readonly input: RenderColorDomain;\n readonly toneMapped: boolean;\n readonly mapped: 'linearLdr';\n readonly finalCapture: 'displayEncoded';\n readonly exposureStage: 'linearHdr' | 'none';\n}\n\nexport type RenderPostStageName = (typeof STANDARD_POST_STAGE_NAMES)[number];\nexport type RenderPostDomainStage = readonly [\n RenderPostStageName,\n ColorValueDomain,\n ColorValueDomain,\n];\n\n/**\n * Single post-stage domain contract shared by the Standard lighting lanes.\n * The selected scene domain for transparent geometry is explicit; every later\n * stage follows the same linear blend, output-transform, anti-alias, post-effect, and present sequence.\n */\nexport function resolvePostColorDomainContract(\n sceneDomain: 'linear-ldr' | 'linear-hdr',\n): readonly RenderPostDomainStage[] {\n const scene: ColorValueDomain = sceneDomain;\n const [transparentBlend, bloom, outputTransform, fxaa, postEffect, present] =\n STANDARD_POST_STAGE_NAMES;\n return [\n [transparentBlend, scene, scene],\n [bloom, 'linear-hdr', 'linear-hdr'],\n [outputTransform, scene, 'display-encoded'],\n [fxaa, 'display-encoded', 'display-encoded'],\n [postEffect, 'display-encoded', 'display-encoded'],\n [present, 'display-encoded', 'display-encoded'],\n ];\n}\n\n/**\n * Describe the built-in output stages without moving color-domain policy into\n * a mode name. Tone-enabled cameras render HDR, apply exposure and the\n * selected curve in the fullscreen pass, then reach the encoded surface.\n */\nexport function resolveToneOutputContract(tonemap: Tonemap): ToneOutputContract {\n if (tonemap === 'none') {\n return {\n input: 'linearLdr',\n toneMapped: false,\n mapped: 'linearLdr',\n finalCapture: 'displayEncoded',\n exposureStage: 'none',\n };\n }\n return {\n input: 'linearHdr',\n toneMapped: true,\n mapped: 'linearLdr',\n finalCapture: 'displayEncoded',\n exposureStage: 'linearHdr',\n };\n}\n\n/** Stable facts that may change graph topology and therefore its compiled identity. */\nexport interface RenderPipelineTopology {\n readonly pipelineId: string;\n readonly standardProfile?: StandardProfile | undefined;\n readonly config: import('@forgeax/engine-types').RenderPipelineAsset['config'];\n /**\n * The record stage had no Camera and injected the synthetic clear-only\n * snapshot. Keep that fact explicit so a normal no-tone Camera still uses\n * the float Output Transform while the empty-scene contract can write its\n * clear directly to the surface.\n */\n readonly clearOnly?: boolean | undefined;\n /** Selected atmosphere requires the graph-owned sky producer and background. */\n readonly atmosphere?: boolean | undefined;\n /** Finite-depth distance / exponential-height fog; no volume history. */\n readonly analyticFog?: boolean | undefined;\n /** Whether Standard main draws carry the producer-owned fallback MRT. */\n readonly reflectionFallback?: { readonly enabled: boolean } | undefined;\n readonly surface: {\n readonly width: number;\n readonly height: number;\n readonly storageFormat: import('@forgeax/engine-rhi').TextureFormat;\n readonly viewFormat: import('@forgeax/engine-rhi').TextureFormat;\n readonly profile?: SurfaceProfile | undefined;\n };\n /** Renderer-owned immutable dimensions for Standard graph consumers. */\n readonly extent?: RenderExtent;\n readonly camera: Pick<\n RenderPipelineContext['camera'],\n 'tonemap' | 'antialias' | 'bloom' | 'bloomIntensity'\n > & {\n /** Shape-only DoF admission; optical values remain per-frame UBO data. */\n readonly depthOfField?:\n | {\n readonly blurSide: DepthOfFieldSide;\n readonly useNear: boolean;\n readonly useFar: boolean;\n }\n | undefined;\n };\n /** Frame-stable Standard output policy; no raw RHI handles enter topology. */\n readonly output?: {\n readonly autoExposure: boolean;\n /** Camera-owned Bradford white balance is part of the same output pass. */\n readonly whiteBalance?: boolean;\n readonly temperature?: number;\n readonly tint?: number;\n readonly colorLut: boolean;\n readonly colorLutStrength: number;\n readonly lutSourceKey?: string;\n };\n /** Detached spatial SSR admission; graph resources remain renderer-owned. */\n readonly ssr?: SsrSpatialAdmission | undefined;\n readonly temporal?: {\n readonly taa: boolean;\n readonly motionBlur: boolean;\n };\n readonly shadow: {\n readonly directional:\n | 'disabled'\n | {\n readonly mapSize: number;\n readonly cascadeCount: 1 | 2 | 3 | 4;\n };\n readonly spotMapSize: number;\n readonly pointCount: number;\n readonly pointFaceSize: number;\n readonly spotCount: number;\n };\n /**\n * Authored volume topology facts. Identity/generation/digest are runtime\n * residency facts and deliberately do not participate in graph topology.\n */\n readonly volumetricFog?: {\n readonly enabled: boolean;\n readonly lightKind?: 'directional' | 'point' | 'spot' | undefined;\n readonly lightEntity?: number | undefined;\n readonly pointLightEntity?: number | undefined;\n readonly spotLightEntity?: number | undefined;\n readonly projector?:\n | {\n readonly guid: string;\n readonly generation: number;\n readonly revision: number;\n }\n | undefined;\n readonly format?: TextureFormat | undefined;\n readonly extent?:\n | {\n readonly width: number;\n readonly height: number;\n readonly depth: number;\n }\n | undefined;\n /** Renderer-owned froxel grid derived from the compiled surface extent. */\n readonly froxelExtent?:\n | {\n readonly width: number;\n readonly height: number;\n readonly depth: number;\n }\n | undefined;\n /** Renderer-owned 2D resolve/history extent derived from the same profile. */\n readonly resolvedExtent?:\n | {\n readonly width: number;\n readonly height: number;\n readonly depth: number;\n }\n | undefined;\n };\n readonly lane: {\n readonly compute: boolean;\n readonly storageBuffer: boolean;\n readonly multisample: boolean;\n readonly maxColorAttachments: number;\n };\n readonly featureTopologySignature: string;\n readonly gpuDrivenTopologySignature: string;\n /** Stable Cluster transport/layout facts; excludes per-frame light payloads. */\n readonly standardLightingTopologySignature?: string | undefined;\n /** Internal graph fact; renderer callers do not configure transmission demand. */\n readonly transmissionDemand?: TransmissionDemand | undefined;\n}\n\n/** Resolve the built-in final-output dither policy from the pipeline asset. */\nexport function resolveOutputDither(\n config: import('@forgeax/engine-types').RenderPipelineAsset['config'],\n): boolean {\n return config?.outputDither ?? true;\n}\n\nexport interface RenderPipelineFrame extends RenderPipelineContext, RenderGraphFrame {}\n\nexport interface RenderPipelineTarget {\n readonly texture: GraphTexture;\n readonly view: GraphTextureView;\n readonly format: TextureFormat;\n readonly sampleCount: 1 | 4;\n readonly domain?: ColorValueDomain | undefined;\n readonly resolveTarget?: GraphTextureView | undefined;\n}\n\nexport function createRenderPipelineTarget(\n graph: RenderGraphBuilder<RenderPipelineFrame>,\n label: string,\n descriptor: GraphTextureDescriptor,\n viewDescriptor: GraphTextureViewDescriptor = {},\n): Result<RenderPipelineTarget, RenderGraphError> {\n const texture = graph.createTexture(label, descriptor);\n if (!texture.ok) return texture;\n const view = graph.view(texture.value, { label: `${label}.view`, ...viewDescriptor });\n if (!view.ok) return view;\n return ok({\n texture: texture.value,\n view: view.value,\n format: viewDescriptor.format ?? descriptor.format,\n sampleCount: descriptor.sampleCount === 4 ? 4 : 1,\n ...(descriptor.domain === undefined ? {} : { domain: descriptor.domain }),\n });\n}\n\nexport function importRenderPipelineSurface(\n graph: RenderGraphBuilder<RenderPipelineFrame>,\n topology: RenderPipelineTopology,\n): Result<\n { readonly display?: RenderPipelineTarget; readonly storage: RenderPipelineTarget },\n RenderGraphError\n> {\n const texture = graph.importTexture(\n 'surface',\n {\n format: topology.surface.storageFormat,\n size: 'surface',\n // The imported surface is the final encoded endpoint. Keeping this\n // semantic fact on the graph resource lets detached inspection project\n // from the compiled graph instead of re-inferring it from format names.\n domain: 'display-encoded',\n usage:\n GPU_TEXTURE_USAGE_RENDER_ATTACHMENT |\n (topology.surface.profile?.kind === 'raw-only' ? 0 : GPU_TEXTURE_USAGE_COPY_SRC),\n viewFormats: [\n ...(topology.surface.profile?.viewFormats ??\n (topology.surface.storageFormat === topology.surface.viewFormat\n ? []\n : [topology.surface.viewFormat])),\n ],\n },\n (frame) => frame.currentTexture,\n );\n if (!texture.ok) return texture;\n const display =\n topology.surface.profile?.hasDisplayEndpoint === false\n ? undefined\n : graph.importView(\n texture.value,\n { label: 'surface.display', format: topology.surface.viewFormat },\n (frame) => frame.view,\n );\n if (display !== undefined && !display.ok) return display;\n const storage = graph.importView(\n texture.value,\n { label: 'surface.storage', format: topology.surface.storageFormat },\n (frame) => {\n if (topology.surface.storageFormat === topology.surface.viewFormat) return frame.view;\n const resolved = frame.runtime.device.createTextureView(frame.currentTexture, {\n format: topology.surface.storageFormat,\n });\n if (!resolved.ok) throw resolved.error;\n return resolved.value;\n },\n );\n if (!storage.ok) return storage;\n return ok({\n ...(display === undefined\n ? {}\n : {\n display: {\n texture: texture.value,\n view: display.value,\n format: topology.surface.viewFormat,\n sampleCount: 1 as const,\n domain: 'display-encoded' as const,\n },\n }),\n storage: {\n texture: texture.value,\n view: storage.value,\n format: topology.surface.storageFormat,\n sampleCount: 1,\n domain: 'display-encoded',\n },\n });\n}\n\nexport interface RenderPipelineFeatureTarget {\n /** Optional semantic alias when a pipeline exposes multiple color roles. */\n readonly name?: string;\n readonly kind: RenderFeatureTargetKind;\n readonly texture: GraphTexture;\n readonly view: GraphTextureView;\n readonly resolveTarget?: GraphTextureView | undefined;\n readonly format: TextureFormat;\n readonly sampleCount: 1 | 4;\n}\n\nexport interface RenderPipelineGpuDrivenProjection {\n readonly accesses: readonly GraphAccess[];\n encode(\n viewBindGroup: BindGroup,\n pass: RhiRenderPassEncoder,\n resources: GraphResourceResolver,\n frameResources: GpuDrivenStandardPbrFrameResources,\n ): void;\n}\n\n/** Exact scene rows selected by an indirect batch; palette offsets are global. */\nexport interface GpuDrivenSceneMeshBinding {\n readonly meshBuffer: Buffer;\n readonly meshBytes: number;\n readonly paletteBuffer?: Buffer;\n}\n\n/** Producer-owned Standard PBR resources resolved during graph execution. */\nexport interface GpuDrivenStandardPbrFrameResources {\n readonly materialBindGroups: (BindGroup | undefined)[];\n /** Frame-global material slots keyed by the retained scene entity identity. */\n readonly materialSlotIndicesByEntity: Map<number, readonly number[]>;\n readonly instancesBindGroup: BindGroup;\n readonly materialStride: number;\n /** The current pass selects material membership and attachment formats. */\n selectedMaterialSlots?: ReadonlySet<number>;\n colorFormats?: readonly TextureFormat[];\n /** Exact producer-owned numeric Material table consumed by scene-index PBR. */\n readonly sceneMaterialBuffer: Buffer;\n resolveClusteredMeshBindGroup?: (binding: GpuDrivenSceneMeshBinding) => BindGroup;\n}\n\nexport interface RenderPipelineBuildContext<FrameCtx extends RenderPipelineFrame> {\n readonly graph: RenderGraphBuilder<FrameCtx>;\n /** Per-frame camera values consumed by optical fullscreen features. */\n readonly camera?: {\n readonly depthOfField?:\n | import('./features/depth-of-field/depth-of-field-params').DepthOfFieldParams\n | undefined;\n };\n /** Optional Standard-only output-domain coverage producer input. */\n readonly targetCoverage?: import('./temporal/target-coverage-attachment').TargetCoverageAttachment;\n /** Explicit receipt-bound color domains requested for this frame. */\n readonly observationCaptureDomains?: readonly FrameObservationDomain[] | undefined;\n /**\n * The single prepared Standard lighting projection for this frame. The\n * Forward and Deferred adapters consume this value; they never inspect raw\n * light snapshots, cluster config, or capability facts themselves.\n */\n readonly standardLighting?: StandardTopologyInputValue;\n /**\n * Renderer-owned capability facts needed for admission decisions. The\n * Standard temporal producer must use the live device probe rather than\n * inferring rgba16float support from the selected surface format.\n */\n readonly capabilities?: Pick<RhiCaps, 'rgba16floatRenderable'>;\n /** Prepared typed graph resources owned by RenderSystem/RenderFrameState. */\n readonly standardOutput?: {\n readonly autoExposure?: {\n readonly histogram: GraphBuffer;\n readonly state: GraphBuffer;\n readonly candidate: GraphBuffer;\n /** Authored camera/time parameters consumed by the GPU adapt stage. */\n readonly parameters: GraphBuffer;\n };\n readonly colorLut?: {\n readonly view: GraphTextureView;\n readonly sampler: import('@forgeax/engine-rhi').Sampler;\n readonly strength: number;\n readonly bindGroupLayout: import('@forgeax/engine-rhi').BindGroupLayout;\n readonly bindGroup: BindGroup;\n };\n };\n /**\n * Renderer-owned TAA history targets. The graph sees only imported typed\n * targets; opaque RHI handles remain inside RenderFrameState.\n */\n readonly taaHistory?: {\n readonly currentColor: RenderPipelineTarget;\n readonly previousColor: RenderPipelineTarget;\n readonly currentTemporal: RenderPipelineTarget;\n readonly previousTemporal: RenderPipelineTarget;\n readonly currentStability: RenderPipelineTarget;\n readonly previousStability: RenderPipelineTarget;\n };\n /** Renderer-owned SSR temporal history targets for the admitted spatial chain. */\n readonly ssrHistory?: {\n readonly previous: RenderPipelineTarget;\n readonly output: RenderPipelineTarget;\n readonly previousSurface: RenderPipelineTarget;\n readonly outputSurface: RenderPipelineTarget;\n readonly params: GraphBuffer;\n };\n /** Renderer-owned, prewarmed encoder for one graph mip level. */\n readonly encodeTransmissionMip?: (input: {\n readonly pass: RhiRenderPassEncoder;\n readonly frame: FrameCtx;\n readonly resources: GraphResourceResolver;\n readonly source: GraphTextureView;\n readonly destination: GraphTextureView;\n readonly level: number;\n }) => void;\n /** Renderer-owned occlusion query state for the primary scene pass. */\n readonly occlusion?: OcclusionFrameProjection;\n projectGpuDriven(target: {\n readonly format: TextureFormat;\n readonly sampleCount: 1 | 4;\n readonly additionalColorFormats?: readonly TextureFormat[];\n }): Result<RenderPipelineGpuDrivenProjection | undefined, RenderPipelineBuildError>;\n projectGpuDrivenShadow?(\n identity: ShadowViewIdentity,\n ): Result<ShadowViewProjection | undefined, RenderGraphError>;\n contributeFeatures(\n targets: readonly RenderPipelineFeatureTarget[],\n semanticTargets?: readonly RenderPipelineTarget[],\n namedTargets?: Readonly<Record<string, RenderPipelineTarget>>,\n standardSurfaceAccesses?: readonly GraphAccess[],\n ): Result<void, RenderPipelineBuildError>;\n /** Prepare feature-owned shadow draws and their early compute producers once. */\n contributeShadowFeatures?(): Result<\n import('./features/render-graph-raster').RenderFeatureShadowDraws<FrameCtx> | undefined,\n RenderPipelineBuildError\n >;\n /** Add renderer-owned cube capture work to the active pipeline graph. */\n contributeCubeCaptures?(\n environmentCube?: import('./environment/ibl').GraphEnvironment,\n ): Result<void, RenderPipelineBuildError>;\n /** Whether a producer-owned feature is installed for this graph build. */\n hasFeature?(identity: string): boolean;\n}\n\nexport type RenderPipelineBuildError = RenderGraphError | RenderError | RhiError;\n\n/**\n * Registrable, installable, hot-swappable render topology.\n *\n * `build` declares resources and passes only. The renderer owns compilation,\n * last-known-good replacement, execution, retirement, and the single frame submit.\n * Feature contributions enter through `contributeFeatures`, so compute-produced\n * buffers and later raster reads remain inside the same typed dependency graph.\n */\nexport interface RenderPipeline<FrameCtx extends RenderPipelineFrame = RenderPipelineFrame> {\n build(\n context: RenderPipelineBuildContext<FrameCtx>,\n topology: RenderPipelineTopology,\n ): Result<void, RenderPipelineBuildError>;\n}\n","// @forgeax/engine-render - host-side DirectLightSlot ABI and buffer helpers.\n//\n// Point, Spot, and Rect snapshots share one five-row, 80-byte Cluster slot.\n// The same packer is used by the Cluster producer and every Cluster consumer;\n// this is the only local-light transport.\n\nimport { err, ok, type Result, RhiError } from '@forgeax/engine-rhi';\nimport type {\n PointLightSnapshot,\n RectAreaDirectLightSnapshot,\n SpotLightSnapshot,\n} from './render-system-extract';\n// Owns the byte-frozen std430 layout (D-S2). Point, Spot, and Rect all use the\n// same five-row DirectLightSlot; the kind and resource identities are carried\n// by the metadata row. Point uses the angular lanes as neutral values. Spot\n// uses row 3's x/y/z lanes for volume shadow receiver controls and w for the\n// extended-lighting roll angle. Rect uses row 2/3 for its two tangent axes.\n//\n// AC anchor: requirements AC-04 (c) + C-7 (16 B alignment); plan-strategy\n// section 2 D-S2 (byte-frozen layout); research Finding 2 (Bevy\n// invRangeSquared naming) + Finding 9 (Bevy storage buffer pattern).\n//\n// Cap gate: maxStorageBuffersPerShaderStage >= 4 (Cluster occupies four\n// storage entries: meshSSBO + light_data + cluster_grid + light_index_list;\n// default WebGPU minimum is 8, requirements assumption A-7 + plan R-4). The closed\n// `RhiErrorCode` union has no `'rhi-not-supported'` member; the\n// plan-strategy phrasing collapses onto the spec-aligned `'limit-exceeded'`\n// arm which already documents \"input value exceeded device.limits.<name>\"\n// (RhiError JSDoc on packages/rhi/src/errors.ts). Reusing `'limit-exceeded'`\n// keeps `RhiErrorCode` count at 18 (AGENTS.md error model evolution\n// contract: minor add-only; w20a explicitly forbids count drift).\n\n/**\n * Minimum storage-buffer count needed by the M3 record stage.\n *\n * 1. Mesh SSBO (entity_world + normalMatrix; per-renderable dynamic\n * offset, 256 B stride).\n * 2. Cluster light_data SSBO.\n * 3. Cluster membership grid SSBO.\n * 4. Cluster light-index-list SSBO.\n *\n * Cluster needs four storage-backed resources in the Standard bind group.\n * This is the complete local-light transport.\n */\nexport const STORAGE_BUFFER_MIN_REQUIRED = 4;\n\n/** Byte size of one Point/Spot/Rect DirectLightSlot. */\nexport const BYTES_PER_DIRECT_LIGHT_SLOT = 80;\n/** std430 slot aliases retained for the WebGPU ready-state sizing table. */\nexport const POINT_LIGHT_STD430_BYTES = BYTES_PER_DIRECT_LIGHT_SLOT;\nexport const SPOT_LIGHT_STD430_BYTES = BYTES_PER_DIRECT_LIGHT_SLOT;\n\n/**\n * Cap gate at createRenderer time: check whether the device has enough\n * storage-buffer slots for the PBR pipeline (M3 requires\n * `STORAGE_BUFFER_MIN_REQUIRED = 4`). Returns a three-way signal:\n *\n * - `Result.ok(true)` — storage buffer capable (cap >= 4);\n * - `Result.ok(false)` — no storage buffer capability at all (cap === 0);\n * consumer walks the uniform-fallback path;\n * - `Result.err(RhiError)` — cap in (0, 4); not enough storage slots to run\n * but also not a clean zero-cap uniform-fallback case (e.g. downlevel\n * adapter with 1-3 slots). The error carries `'limit-exceeded'` with\n * `LimitExceededDetail` shape.\n *\n * Uniform-fallback path decision (plan D-5): `cap === 0` is the wgpu\n * WebGL2 backend signal (`downlevel_webgl2_defaults().limits.\n * maxStorageBuffersPerShaderStage = 0`). It remains a mesh/instance fallback;\n * local-light frames require the single Cluster storage transport.\n */\n/** Closed direct-light kind carried by the unified five-row slot. */\nexport const DirectLightSlotKind = {\n POINT: 0,\n SPOT: 1,\n RECT_AREA: 2,\n} as const;\nexport type DirectLightSlotKind = 'point' | 'spot' | 'rect-area';\n\n/** Metadata identity used for absent shadow, IES, and Cookie resources. */\nexport const DIRECT_LIGHT_SLOT_METADATA_SENTINEL = 0xffffffff;\n/**\n * SpotLight projector marker carried in the shared shadow identity word. The\n * lower 30 bits retain the selected shadow tile; projector-only spots use tile\n * zero because their matrix is deliberately published in View lane zero.\n */\nexport const DIRECT_LIGHT_SLOT_PROJECTOR_FLAG = 0x40000000;\nexport const DIRECT_LIGHT_SLOT_TILE_MASK = DIRECT_LIGHT_SLOT_PROJECTOR_FLAG - 1;\n/** Byte size of the five-row Point/Spot/Rect transport slot. */\nexport const DIRECT_LIGHT_SLOT_FLOAT_COUNT =\n BYTES_PER_DIRECT_LIGHT_SLOT / Float32Array.BYTES_PER_ELEMENT;\n\n/** Five vec4 rows shared by host packing and the WGSL direct-light consumer. */\nexport const DIRECT_LIGHT_SLOT_LAYOUT = {\n byteSize: BYTES_PER_DIRECT_LIGHT_SLOT,\n rowByteOffsets: [0, 16, 32, 48, 64],\n positionOffset: 0,\n rangeOffset: 12,\n colorOffset: 16,\n firstAngleOffset: 28,\n primaryAxisOffset: 32,\n secondAngleOffset: 44,\n auxiliaryAxisOffset: 48,\n metadataByteOffset: 64,\n kindByteOffset: 64,\n shadowByteOffset: 68,\n iesProfileByteOffset: 72,\n cookieByteOffset: 76,\n /** Spot-only roll angle stored in the fourth row's w lane. */\n rollDegByteOffset: 60,\n floatCount: DIRECT_LIGHT_SLOT_FLOAT_COUNT,\n vec4Count: 5,\n} as const;\n\ntype DirectLightModifierMetadata = {\n readonly iesProfileSlice?: number;\n readonly cookieSlice?: number;\n};\n\nexport type DirectLightSnapshot =\n | (PointLightSnapshot & DirectLightModifierMetadata)\n | (SpotLightSnapshot & DirectLightModifierMetadata)\n | (RectAreaDirectLightSnapshot & DirectLightModifierMetadata);\n\nfunction directLightMetadata(value: number | undefined): number {\n return value === undefined ? DIRECT_LIGHT_SLOT_METADATA_SENTINEL : value >>> 0;\n}\n\n/**\n * Pack one Point, Spot, or Rect snapshot into the unified five-row slot.\n *\n * Row 0 is position plus inverse range. Row 1 is color plus the first\n * angular/size fact. Row 2 is the primary axis plus the second angular/size\n * fact. Row 3 is the auxiliary Rect axis. Row 4 is four u32 identities.\n */\nexport function packDirectLightSlot(\n snapshot: DirectLightSnapshot,\n projectorSelected?: boolean,\n): Float32Array {\n const out = new Float32Array(DIRECT_LIGHT_SLOT_FLOAT_COUNT);\n out[0] = snapshot.position[0] ?? 0;\n out[1] = snapshot.position[1] ?? 0;\n out[2] = snapshot.position[2] ?? 0;\n out[3] = snapshot.invRangeSquared;\n out[4] = snapshot.color[0] ?? 0;\n out[5] = snapshot.color[1] ?? 0;\n out[6] = snapshot.color[2] ?? 0;\n\n if (snapshot.kind === 'point') {\n out[7] = 1;\n } else if (snapshot.kind === 'spot') {\n out[7] = snapshot.cosInner;\n out[8] = snapshot.direction[0] ?? 0;\n out[9] = snapshot.direction[1] ?? 0;\n out[10] = snapshot.direction[2] ?? 0;\n out[11] = snapshot.cosOuter;\n // Row 3 is the Rect auxiliary axis for RectArea lights. Spot uses x/y/z\n // for its receiver controls and w for roll; the surface direct-light\n // owner only consumes w, while the volume owner consumes the full row.\n out[12] = snapshot.depthBias ?? 0.005;\n out[13] = snapshot.normalBias ?? 0.05;\n out[14] = snapshot.shadowIntensity ?? 1;\n out[15] = snapshot.rollDeg ?? 0;\n } else {\n out[7] = snapshot.halfWidth;\n out[8] = snapshot.axisY[0] ?? 0;\n out[9] = snapshot.axisY[1] ?? 0;\n out[10] = snapshot.axisY[2] ?? 0;\n out[11] = snapshot.halfHeight;\n out[12] = snapshot.axisX[0] ?? 0;\n out[13] = snapshot.axisX[1] ?? 0;\n out[14] = snapshot.axisX[2] ?? 0;\n }\n\n const metadata = new Uint32Array(out.buffer);\n metadata[16] =\n snapshot.kind === 'point'\n ? DirectLightSlotKind.POINT\n : snapshot.kind === 'spot'\n ? DirectLightSlotKind.SPOT\n : DirectLightSlotKind.RECT_AREA;\n const spotProjectorSelected =\n snapshot.kind === 'spot' &&\n (projectorSelected ??\n (snapshot.projectorAsset !== undefined && snapshot.lightViewProj !== undefined));\n const spotShadowMetadata =\n snapshot.kind === 'spot'\n ? spotProjectorSelected\n ? DIRECT_LIGHT_SLOT_PROJECTOR_FLAG |\n ((snapshot.shadowAtlasTile >= 0 ? snapshot.shadowAtlasTile : 0) &\n DIRECT_LIGHT_SLOT_TILE_MASK)\n : directLightMetadata(snapshot.shadowAtlasTile)\n : undefined;\n metadata[17] = directLightMetadata(\n snapshot.kind === 'point'\n ? snapshot.shadowAtlasLayer\n : snapshot.kind === 'spot'\n ? spotShadowMetadata\n : undefined,\n );\n metadata[18] = directLightMetadata(snapshot.iesProfileSlice);\n metadata[19] = directLightMetadata(\n spotProjectorSelected && snapshot.kind === 'spot'\n ? snapshot.projectorSlice\n : snapshot.cookieSlice,\n );\n return out;\n}\n\nexport function assertStorageBufferCap(cap: number): Result<boolean, RhiError> {\n if (cap >= STORAGE_BUFFER_MIN_REQUIRED) {\n return ok(true);\n }\n if (cap === 0) {\n return ok(false);\n }\n return err(\n new RhiError({\n code: 'limit-exceeded',\n expected: `device.limits.maxStorageBuffersPerShaderStage >= ${STORAGE_BUFFER_MIN_REQUIRED}, or exactly 0 for the mesh-only fallback`,\n hint: `device.limits.maxStorageBuffersPerShaderStage = ${cap} < ${STORAGE_BUFFER_MIN_REQUIRED} and != 0. WebGPU spec default minimum is 8; this adapter cannot run the unified Cluster local-light path.`,\n detail: {\n maxStorageBufferBindingSize: cap,\n requestedBytes: STORAGE_BUFFER_MIN_REQUIRED,\n },\n }),\n );\n}\n","// PipelineSpec 4-axis SSOT — single-file type + derive-fn + entrypoint + error model.\n//\n// feat-20260615-pipeline-spec-ssot M1: Establish PipelineSpec 4-axis type SSOT.\n// M1-T1: type definitions + KNOWN_PASS_KINDS + PipelineSpecError closed union.\n// M1-T2: 6 pure derive functions.\n// M1-T3: deriveBglShapeFromShader helper.\n// M1-T4: getOrBuildPipeline entrypoint + PipelineCache.\n// M1-T5: 12 SPEC_CONST boot-time table.\n//\n// Design axiom: PipelineSpec is business-agnostic — no 'pbr' / 'sprite' / 'skybox'\n// / 'fullscreen-*' strings appear on the type surface (plan-strategy D-7).\n// BGL shape taxonomy lives in the ShaderCatalog implementation, not in spec.\n//\n// Charter alignment:\n// F1: single file entrypoint (getOrBuildPipeline) — AI user indexes once\n// P1: progressive disclosure — types at top, fns mid, error model bottom\n// P3: explicit failure — closed PipelineSpecError union, no silent routes\n// P4: consistent abstraction — 4-axis aligns with wgpu/Bevy/Three.js\n\nimport {\n DEFAULT_VERTEX_ATTRIBUTE_MAP,\n deriveVertexBufferLayout,\n deriveVertexBufferLayoutFromProjection,\n deriveVertexLayoutProjection,\n type VertexLayoutProjection,\n} from '@forgeax/engine-geometry';\nimport {\n err,\n KNOWN_PASS_KINDS,\n type MaterialRenderState,\n ok,\n type PrimitiveTopology,\n type Result,\n} from '@forgeax/engine-types';\nimport { VertexColorVariantConflictError } from './errors/render';\n\nexport {\n type BglKind,\n type BindGroupLayoutDescriptorOutput,\n buildBindGroupLayoutDescriptor,\n createHdrpBindGroupLayoutDescriptor,\n} from './pbr-pipeline';\n\n// Re-export KNOWN_PASS_KINDS from @forgeax/engine-types for single-file discoverability (charter F1).\nexport { KNOWN_PASS_KINDS };\n\n/**\n * The engine-owned deferred material target layout. `fs_gbuffer` returns\n * normal+roughness, albedo+metallic, and emissive+AO in this order.\n */\nexport const DEFERRED_COLOR_FORMATS: readonly GPUTextureFormat[] = [\n 'rgba16float',\n 'rgba8unorm',\n 'rgba16float',\n];\n\n/** Derive the color attachment shape for a material pass kind. */\nexport function colorFormatsForPassKind(\n passKind: string,\n defaultColorFormat: GPUTextureFormat,\n): readonly GPUTextureFormat[] {\n if (passKindPolicyTable[passKind]?.shape === 'depth-only') return [];\n if (passKind === 'deferred') return DEFERRED_COLOR_FORMATS;\n return [defaultColorFormat];\n}\n\n// ══════════════════════════════════════════════════════════════════════════════\n// PipelineSpec — immutable 4-axis data description (D-7: business-agnostic)\n// ══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Pipeline specification — immutable 4-axis data that completely determines\n * what `device.createRenderPipeline(...)` does for a material shader pass.\n *\n * The 4 axes are:\n * - `shader`: which WGSL source + material param schema + pass kind + variant set\n * - `attachments`: color/depth/stencil formats + sample count (MSAA)\n * - `geometry`: primitive topology + vertex attribute layout + index format\n * - `renderState`: optional per-material render-state overrides (blend/cull/depth/stencil)\n *\n * Business-agnostic: no `'pbr'` / `'sprite'` / `'skybox'` strings pollute this\n * type. BGL shape taxonomy is derived from `ShaderCatalog` internal reflection\n * and never appears on the spec surface (plan-strategy D-7).\n *\n * @see plan-strategy §1 (4-axis) · D-7 (business-agnostic) · requirements §3.1\n */\nexport type { PipelineSpec } from './pipeline-spec-types';\n\nimport type { PipelineSpec } from './pipeline-spec-types';\n// ══════════════════════════════════════════════════════════════════════════════\n// PipelineSpecError — closed union (5 + 2 transit codes)\n// ══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Closed union of PipelineSpec error codes.\n *\n * 5 business codes:\n * - `'spec-inconsistent'`: axis mutual exclusion violated\n * - `'unknown-pass-kind'`: passKind not in KNOWN_PASS_KINDS or registered\n * - `'shader-bgl-reflection-mismatch'`: reflected BGL shape != shader declaration\n * - `'attachment-format-incompatible'`: depth/stencil format vs PSO mismatch\n * - `'unsupported-vertex-layout'`: vertex attributes don't match shader vs_main\n *\n * 2 transit codes:\n * - `'pipeline-build-failed'`: wraps RhiError from device.createRenderPipeline\n * - `'shader-not-registered'`: ShaderCatalog lookup returned undefined\n *\n * @see requirements §3.4 · AC-10 · charter P3\n */\nexport type PipelineSpecErrorCode =\n | 'spec-inconsistent'\n | 'unknown-pass-kind'\n | 'shader-bgl-reflection-mismatch'\n | 'attachment-format-incompatible'\n | 'unsupported-vertex-layout'\n | 'pipeline-build-failed'\n | 'shader-not-registered';\n\n/**\n * Structured pipeline-spec error — carries `.code` (discriminated union) +\n * `.detail` (narrowed per code) + `.hint` (AI-user actionable prose).\n *\n * Inherits from `Error` so it integrates with existing catch blocks; the\n * `.code` field enables exhaustive `switch` narrowing without string parsing\n * (charter P3).\n */\nexport class PipelineSpecError extends Error {\n readonly code: PipelineSpecErrorCode;\n /**\n * Narrowed detail payload — shape depends on `code`.\n *\n * - `'spec-inconsistent'`: `{ reason: string }`\n * - `'unknown-pass-kind'`: `{ expected: readonly string[]; actual: string; hint?: string }`\n * - `'shader-bgl-reflection-mismatch'`: `{ reflected: unknown; declared: unknown }`\n * - `'attachment-format-incompatible'`: `{ reason: string; expected?: string; actual?: string }`\n * - `'unsupported-vertex-layout'`: `{ specAttrs: string[]; shaderAttrs: string[] }`\n * - `'pipeline-build-failed'`: `{ gpuMessage?: string; cause?: unknown }`\n * - `'shader-not-registered'`: `{ shaderId: string; hint?: string }`\n */\n readonly detail: Record<string, unknown>;\n\n constructor(args: {\n code: PipelineSpecErrorCode;\n detail: Record<string, unknown>;\n hint?: string;\n }) {\n super(\n args.hint !== undefined\n ? `PipelineSpecError [${args.code}]: ${args.hint}`\n : `PipelineSpecError [${args.code}]`,\n );\n this.name = 'PipelineSpecError';\n this.code = args.code;\n this.detail = args.detail;\n }\n}\n\n// ══════════════════════════════════════════════════════════════════════════════\n// renderStateHashSuffix — deterministic hash of MaterialRenderState\n// ══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Material snapshots hand the renderer immutable render-state objects. Keep\n * the serialized suffix by object identity just like the vertex-layout\n * digest below; the hot path otherwise sorts keys and serializes the same\n * state once per renderable. Callers must not mutate a MaterialRenderState\n * after passing it to the renderer (the PipelineSpec contract is immutable).\n */\nconst RENDER_STATE_HASH_CACHE = new WeakMap<object, string>();\n\n/**\n * Deterministic hash suffix for MaterialRenderState (sorted keys, JSON.stringify).\n *\n * Returns `''` when `renderState` is `undefined` or has zero entries,\n * preserving cache-key byte-compatibility with the pre-M1 shape.\n */\nexport function renderStateHash(renderState: MaterialRenderState | undefined): string {\n if (renderState === undefined) return '';\n const cached = RENDER_STATE_HASH_CACHE.get(renderState);\n if (cached !== undefined) return cached;\n const sorted = Object.keys(renderState).sort();\n if (sorted.length === 0) {\n RENDER_STATE_HASH_CACHE.set(renderState, '');\n return '';\n }\n const payload: Record<string, unknown> = {};\n for (const k of sorted) {\n const v = renderState[k as keyof MaterialRenderState];\n if (v !== undefined) payload[k] = v;\n }\n const result = `:${JSON.stringify(payload)}`;\n RENDER_STATE_HASH_CACHE.set(renderState, result);\n return result;\n}\n\n// ══════════════════════════════════════════════════════════════════════════════\n// 6 pure derive functions (M1-T2)\n// ══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Compute a deterministic cache key from a PipelineSpec.\n *\n * The key covers all 4 axes + BGL shape hash (derived from ShaderCatalog\n * reflection via {@link deriveBglShapeFromShader}). Two specs that produce\n * the same cache key MUST produce byte-identical PSO descriptors.\n *\n * Algorithm: concatenate each axis segment with `:` separators, hash the\n * BGL shape for compactness, and emit a single cache-key string.\n *\n * @see plan-strategy §3.1 · requirements AC-02\n */\nexport function cacheKeyOf(spec: PipelineSpec): string {\n const { shader, attachments, geometry, renderState } = spec;\n const topoSegment = geometry.topology;\n const stripSegment =\n (topoSegment === 'line-strip' || topoSegment === 'triangle-strip') &&\n geometry.stripIndexFormat !== undefined\n ? `:${geometry.stripIndexFormat}`\n : '';\n\n // The geometry owner publishes one immutable projection. Legacy callers may\n // still provide only the map; derive the same projection at this boundary.\n const vlDigest =\n geometry.vertexLayoutProjection?.digest ??\n deriveVertexLayoutProjection(geometry.vertexLayout).digest;\n\n const uvSetCountSegment =\n geometry.shaderUvSetCount !== undefined ? `:uvsc${geometry.shaderUvSetCount}` : '';\n // Prepared graphics may publish an explicit multi-stream layout (particle\n // material-input lanes are the canonical example). The attribute map alone\n // cannot describe those streams or their lane stride, so include the\n // normalized descriptors in the cache identity as well.\n const vertexBuffersSegment =\n geometry.vertexBuffers === undefined\n ? ''\n : `:vbs:${JSON.stringify(\n geometry.vertexBuffers.map((buffer) => ({\n arrayStride: buffer.arrayStride,\n stepMode: buffer.stepMode ?? 'vertex',\n attributes: [...buffer.attributes].map((attribute) => ({\n shaderLocation: attribute.shaderLocation,\n offset: attribute.offset,\n format: attribute.format,\n })),\n })),\n )}`;\n\n // bug-20260708 M2 (b): sentinel `~` distinguishes `variantSet=undefined`\n // (no-variant / default-variant request) from canonical all-true key `''`\n // (all variant axes true). Prior `?? ''` collapsed the two into the same\n // cache key, causing the first-cached pipeline to win and unrelated\n // variantSet requests to reuse its shader module (research R-11 / R-12).\n // `~` (ASCII 0x7E) is a reserved sentinel char — no legitimate\n // variantSet literal contains it; guarded by\n // `pipeline-cache-keying.unit.test.ts` sentinel-conflict assertions.\n const variantSegment = shader.variantSet === undefined ? '~' : shader.variantSet;\n return (\n [\n shader.id,\n shader.passKind,\n variantSegment,\n attachments.colorFormats.join(','),\n attachments.depthFormat ?? '',\n String(attachments.sampleCount),\n topoSegment,\n stripSegment,\n `vl:${vlDigest}`,\n renderStateHash(renderState),\n ].join(':') +\n vertexBuffersSegment +\n uvSetCountSegment +\n (shader.fragmentConstants === undefined\n ? ''\n : `:fragment-constants:${JSON.stringify(\n Object.entries(shader.fragmentConstants).sort(([left], [right]) =>\n left.localeCompare(right),\n ),\n )}`) +\n (shader.vertexEntry === undefined && shader.fragmentEntry === undefined\n ? ''\n : `:entries:${JSON.stringify([shader.vertexEntry ?? null, shader.fragmentEntry ?? null])}`)\n );\n}\n\n/**\n * Reconcile the authored vertex-color shader axis with the geometry-owned\n * projection. COLOR_0 is a geometry fact and cannot be selected independently\n * by a material variant.\n */\nexport function variantSetFromVertexLayoutProjection(\n projection: VertexLayoutProjection,\n authoredVariantSet: string | undefined,\n): Result<string, VertexColorVariantConflictError> {\n const projected = projection.attributes.some((attribute) => attribute.key === 'color');\n const axis = `VERTEX_COLOR_AVAILABLE=${projected ? 'true' : 'false'}`;\n if (authoredVariantSet === undefined) return ok(axis);\n if (projected && authoredVariantSet === '') return ok(authoredVariantSet);\n\n const authoredParts = authoredVariantSet.split('+');\n const authoredColorPart = authoredParts.find((part) =>\n part.startsWith('VERTEX_COLOR_AVAILABLE='),\n );\n if (authoredColorPart === undefined) {\n const parts = authoredParts.filter((part) => part.length > 0);\n parts.push(axis);\n return ok(parts.join('+'));\n }\n\n const authoredValue = authoredColorPart.slice('VERTEX_COLOR_AVAILABLE='.length);\n const authored = authoredValue === 'true';\n if ((authoredValue !== 'true' && authoredValue !== 'false') || authored !== projected) {\n return err(new VertexColorVariantConflictError(authoredValue, projected));\n }\n const parts = authoredParts.filter(\n (part) => part.length > 0 && !part.startsWith('VERTEX_COLOR_AVAILABLE='),\n );\n parts.push(axis);\n return ok(parts.join('+'));\n}\n\n/** Explicit geometry and lighting facts survive composition before manifest key canonicalization. */\nexport function standardCapabilityVariantSet(\n clustered: boolean,\n storageBuffer: boolean,\n vertexColorAvailable: boolean,\n): string {\n return `CLUSTER_FORWARD_AVAILABLE=${clustered}+STORAGE_BUFFER_AVAILABLE=${storageBuffer}+VERTEX_COLOR_AVAILABLE=${vertexColorAvailable}`;\n}\n\n/**\n * Project the frame-owned Standard topology onto its material variant axes.\n *\n * `StandardTopologyInputValue.kind` is the only runtime authority for the\n * cluster axis: a frame with local lights must request the clustered artifact,\n * while the no-local-light topology requests the direct artifact. Keeping\n * this projection beside the canonical key builder prevents PBR, skin, and\n * sprite-lit record owners from independently inferring the active lane from\n * whichever bind group happened to be constructed first.\n */\nexport function standardTopologyVariantSet(\n topology: { readonly kind: 'no-local-lights' | 'clustered' } | undefined,\n storageBuffer: boolean,\n vertexColorAvailable: boolean,\n probeBlendAvailable = false,\n): string {\n const capabilityVariantSet = standardCapabilityVariantSet(\n topology?.kind === 'clustered',\n storageBuffer,\n vertexColorAvailable,\n );\n if (!probeBlendAvailable || !storageBuffer) return capabilityVariantSet;\n return `${capabilityVariantSet}+PROBE_BLEND_AVAILABLE=true`;\n}\n\n/**\n * Keep a clustered frame fail-closed when its unified group(2) resource is\n * unavailable. A missing group is not evidence that the frame is direct; it\n * is an invalid prepared resource state.\n */\nexport function standardTopologyBindGroupReady(\n topology: { readonly kind: 'no-local-lights' | 'clustered' } | undefined,\n clusterBindGroup: unknown,\n): boolean {\n return (\n topology?.kind !== 'clustered' || (clusterBindGroup !== null && clusterBindGroup !== undefined)\n );\n}\n\n/** Derive the storage axis for Standard-compatible unlit material draws. */\nexport function standardStorageVariantSet(\n storageBuffer: boolean,\n vertexColorAvailable: boolean,\n): string {\n if (storageBuffer && vertexColorAvailable) return '';\n return `STORAGE_BUFFER_AVAILABLE=${storageBuffer}+VERTEX_COLOR_AVAILABLE=${vertexColorAvailable}`;\n}\n\n/**\n * Build a `GPURenderPipelineDescriptor` from a PipelineSpec + shader modules.\n *\n * Pure derivation: same (spec, modules) always produces the same descriptor.\n * Consumed by `getOrBuildPipeline` on cache miss; also available as a public\n * helper for AI users who want the descriptor shape without going through the\n * cache entrypoint.\n *\n * @param spec - the pipeline spec (4 axes)\n * @param modules - `{ vertex: GPUShaderModule; fragment: GPUShaderModule }`\n * @returns a complete WebGPU render-pipeline descriptor\n * @see plan-strategy §3.2 · requirements AC-02\n */\nexport function buildPipelineDescriptor(\n spec: PipelineSpec,\n modules: {\n vertex: unknown;\n fragment: unknown;\n vertexEntryPoint?: string;\n fragmentEntryPoint?: string;\n layout?: unknown;\n },\n): Record<string, unknown> {\n // M2-T4: derive vertex buffers from spec.geometry.vertexLayout via\n // deriveVertexBufferLayout (imported from vertex-attribute-layout.ts).\n // Empty vertexLayout (fullscreen-post passes) → [].\n // Non-empty (material shaders) → interleaved single-buffer layout.\n //\n // Entry points default to 'vs_main' / 'fs_main' for the 3 standard material\n // shaders; fullscreen-post passes (skybox 'skybox_fs', SSAO 'vs_ssao' / 'fs_ssao_calc')\n // pass custom entry points through the modules parameter.\n //\n // The optional `layout` field, when present, is forwarded to the descriptor\n // so that the provider can detect it is already set and avoid overwriting.\n\n const { attachments, geometry, renderState } = spec;\n\n // A supplied projection is the geometry owner's immutable GPU descriptor.\n // Do not re-derive it from a possibly stale attribute map.\n const vertexBuffers =\n geometry.vertexBuffers ??\n (geometry.vertexLayoutProjection === undefined\n ? deriveVertexBufferLayout(geometry.vertexLayout, {\n ...(geometry.shaderUvSetCount !== undefined\n ? { shaderUvSetCount: geometry.shaderUvSetCount }\n : {}),\n })\n : deriveVertexBufferLayoutFromProjection(geometry.vertexLayoutProjection, {\n ...(geometry.shaderUvSetCount !== undefined\n ? { shaderUvSetCount: geometry.shaderUvSetCount }\n : {}),\n }));\n\n const descriptor: Record<string, unknown> = {\n vertex: {\n module: modules.vertex,\n entryPoint: spec.shader.vertexEntry ?? modules.vertexEntryPoint ?? 'vs_main',\n buffers: vertexBuffers,\n },\n };\n\n // Fragment stage: absent for shadow-caster (depth-only), present for forward.\n if (attachments.colorFormats.length > 0) {\n descriptor.fragment = {\n module: modules.fragment,\n entryPoint: spec.shader.fragmentEntry ?? modules.fragmentEntryPoint ?? 'fs_main',\n ...(spec.shader.fragmentConstants === undefined\n ? {}\n : { constants: spec.shader.fragmentConstants }),\n targets: attachments.colorFormats.map((fmt) => {\n const target: Record<string, unknown> = { format: fmt };\n if (renderState?.blend !== undefined) {\n target.blend = renderState.blend;\n }\n return target;\n }),\n };\n }\n\n // Layout: forward if provided by caller (fullscreen-post passes set it).\n if (modules.layout !== undefined) {\n descriptor.layout = modules.layout;\n }\n\n // Primitive state.\n const primitive: Record<string, unknown> = {\n topology: geometry.topology,\n cullMode: renderState?.cullMode ?? 'back',\n frontFace: renderState?.frontFace ?? 'ccw',\n };\n if (geometry.topology.endsWith('strip') && geometry.stripIndexFormat !== undefined) {\n primitive.stripIndexFormat = geometry.stripIndexFormat;\n }\n descriptor.primitive = primitive;\n\n // Depth-stencil state.\n if (attachments.depthFormat !== undefined) {\n const ds: Record<string, unknown> = {\n format: attachments.depthFormat,\n depthWriteEnabled: renderState?.depthWriteEnabled ?? true,\n depthCompare: renderState?.depthCompare ?? 'less',\n };\n if (renderState?.stencilReadMask !== undefined) {\n ds.stencilReadMask = renderState.stencilReadMask;\n }\n if (renderState?.stencilWriteMask !== undefined) {\n ds.stencilWriteMask = renderState.stencilWriteMask;\n }\n if (renderState?.stencil !== undefined) {\n ds.stencilFront = renderState.stencil;\n ds.stencilBack = renderState.stencil;\n }\n descriptor.depthStencil = ds;\n }\n\n // Multisample: absent for sampleCount=1 (undefined). For each value > 1,\n // emit { count: sampleCount } so forward-compat sample counts (2, 8, …)\n // flow through to the descriptor without requiring a type change.\n if (attachments.sampleCount > 1) {\n descriptor.multisample = {\n count: attachments.sampleCount,\n ...(renderState?.alphaToCoverageEnabled === true && { alphaToCoverageEnabled: true }),\n };\n }\n\n return descriptor;\n}\n\n// ══════════════════════════════════════════════════════════════════════════════\n// passKindPolicyTable — closed map: passKind → attachment shape + default ops\n// ══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Default colour-attachment ops carried by a passKind policy.\n *\n * `clearValue` is `undefined` for `loadOp='load'` policies (no clear value\n * is emitted into the descriptor when the prior contents are loaded).\n */\nexport interface AttachmentColorOps {\n readonly loadOp: 'clear' | 'load';\n readonly storeOp: 'store' | 'discard';\n readonly clearValue: GPUColor | undefined;\n}\n\n/**\n * Default depth-attachment ops carried by a passKind policy.\n *\n * `stencilLoadOp` / `stencilStoreOp` are absent on the policy itself — the\n * stencil-op gate is auto-derived from `specAttachments.depthFormat` at call\n * time (`'depth24plus-stencil8'` → `'clear'+'discard'`; everything else\n * elides stencil ops). This collapses the R3/R5 stencil-op duplicates that\n * previously lived inline at every forward-pass beginRenderPass call site.\n */\nexport interface AttachmentDepthOps {\n readonly loadOp: 'clear' | 'load';\n readonly storeOp: 'store' | 'discard';\n readonly clearValue: number;\n}\n\n/**\n * Attachment policy for a single passKind — declares the colour / depth shape\n * the pass produces and the default load/store ops. Per-call-site overrides\n * (skybox vs main forward differing on `colorLoadOp`, sprite-split forward\n * differing on both `colorLoadOp` and `depthLoadOp`) flow through the\n * `options` parameter of {@link buildBeginRenderPassDescriptor}.\n *\n * `shape` discriminator drives which attachment slots the descriptor emits:\n * - `'depth-only'` → empty `colorAttachments[]`, `depthStencilAttachment` set\n * - `'color-only'` → populated `colorAttachments[]`, no `depthStencilAttachment`\n * - `'color-and-depth'` → both\n */\nexport interface PassKindAttachmentPolicy {\n readonly shape: 'depth-only' | 'color-only' | 'color-and-depth';\n readonly defaultColorOps: AttachmentColorOps | undefined;\n readonly defaultDepthOps: AttachmentDepthOps | undefined;\n}\n\n/**\n * Closed map of passKind → attachment policy. Covers the 10 attachment shapes\n * the runtime ships (per plan-strategy M4):\n *\n * 1. `'forward'` — main geometry pass: color+depth(+stencil-gated)\n * 2. `'deferred'` — HDRP G-Buffer geometry pass: MRT color+depth\n * 3. `'shadow-caster'` — directional shadow caster: depth-only\n * 4. `'point-shadow-caster'` — HDRP point-shadow caster: depth-only\n * 5. `'skybox'` — fullscreen skybox: color-only clear/store\n * 6. `'tonemap'` — HDR→LDR tonemap fullscreen: color-only clear/store\n * 7. `'bloom-downsample'` / `'bloom-upsample'` — multiscale Bloom pyramid:\n * color-only clear/store\n * 8. `'bloom-composite'` — bloom add-back: color-only load/store (NOT clear)\n * 9. `'fxaa'` — fullscreen FXAA: color-only clear/store\n * 10. `'post-process'` — generic fullscreen primitive (SSAO, render-graph\n * fullscreen-post-process-pass dispatcher, M2 tonemap pre-warm slot):\n * color-only clear/store\n *\n * Sprite-split forward sub-pass reuses the `'forward'` policy with\n * `options.colorLoadOp='load'` + `options.depthLoadOp='load'`.\n *\n * Stencil-op gate is NOT in this table — it is derived from\n * `specAttachments.depthFormat` inside the helper (depth24plus-stencil8\n * → emit `stencilLoadOp:'clear' / stencilStoreOp:'discard'`).\n */\nexport const passKindPolicyTable: Readonly<Record<string, PassKindAttachmentPolicy>> = {\n forward: {\n shape: 'color-and-depth',\n defaultColorOps: {\n loadOp: 'clear',\n storeOp: 'store',\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n },\n defaultDepthOps: { loadOp: 'clear', storeOp: 'store', clearValue: 1 },\n },\n deferred: {\n shape: 'color-and-depth',\n defaultColorOps: {\n loadOp: 'clear',\n storeOp: 'store',\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n },\n defaultDepthOps: { loadOp: 'clear', storeOp: 'store', clearValue: 1 },\n },\n temporal: {\n shape: 'color-and-depth',\n defaultColorOps: {\n loadOp: 'clear',\n storeOp: 'store',\n clearValue: { r: 0, g: 0, b: -1, a: 1 },\n },\n defaultDepthOps: { loadOp: 'clear', storeOp: 'store', clearValue: 1 },\n },\n 'shadow-caster': {\n shape: 'depth-only',\n defaultColorOps: undefined,\n defaultDepthOps: { loadOp: 'clear', storeOp: 'store', clearValue: 1 },\n },\n 'point-shadow-caster': {\n shape: 'depth-only',\n defaultColorOps: undefined,\n defaultDepthOps: { loadOp: 'clear', storeOp: 'store', clearValue: 1 },\n },\n skybox: {\n shape: 'color-only',\n defaultColorOps: {\n loadOp: 'clear',\n storeOp: 'store',\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n },\n defaultDepthOps: undefined,\n },\n tonemap: {\n shape: 'color-only',\n defaultColorOps: {\n loadOp: 'clear',\n storeOp: 'store',\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n },\n defaultDepthOps: undefined,\n },\n 'bloom-downsample': {\n shape: 'color-only',\n defaultColorOps: {\n loadOp: 'clear',\n storeOp: 'store',\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n },\n defaultDepthOps: undefined,\n },\n 'bloom-upsample': {\n shape: 'color-only',\n defaultColorOps: {\n loadOp: 'clear',\n storeOp: 'store',\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n },\n defaultDepthOps: undefined,\n },\n 'bloom-composite': {\n shape: 'color-only',\n defaultColorOps: {\n loadOp: 'load',\n storeOp: 'store',\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n },\n defaultDepthOps: undefined,\n },\n fxaa: {\n shape: 'color-only',\n defaultColorOps: {\n loadOp: 'clear',\n storeOp: 'store',\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n },\n defaultDepthOps: undefined,\n },\n 'post-process': {\n shape: 'color-only',\n defaultColorOps: {\n loadOp: 'clear',\n storeOp: 'store',\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n },\n defaultDepthOps: undefined,\n },\n};\n\n/**\n * Build a `GPURenderPassDescriptor` from spec attachments + resolved views +\n * a passKind policy lookup.\n *\n * The helper is the single SSOT for `device.beginRenderPass(...)` descriptor\n * shape — every record-stage call site routes through it (plan-strategy M4\n * AC-06). It dispatches on `passKindPolicyTable[passKind]` to pick the\n * attachment shape (depth-only / color-only / color-and-depth) and applies\n * default color/depth load+store ops; per-call overrides (sprite-split's\n * `loadOp:'load'`, main pass's dynamic `mainColorLoadOp`, skybox's specific\n * clearColor) flow through `options`.\n *\n * Stencil-op gate is auto-derived from `specAttachments.depthFormat`:\n * - `'depth24plus-stencil8'` → emits `stencilLoadOp:'clear', stencilStoreOp:'discard'`\n * - every other depth format → omits stencil ops entirely\n *\n * This collapses the R3/R5 stencil-op duplicates that previously lived inline\n * at every forward-pass beginRenderPass site.\n *\n * @param specAttachments - the attachments axis from a PipelineSpec\n * @param viewBindings - resolved texture views: `{ colorViews, depthView?, resolveTargets? }`\n * @param passKind - one of the keys in {@link passKindPolicyTable}\n * @param options - per-call ops overrides (loadOp / clearValue / label)\n * @returns a WebGPU render-pass descriptor\n * @throws PipelineSpecError(`'unknown-pass-kind'`) when passKind is not registered\n * @see plan-strategy M4 · requirements AC-06\n */\nexport function buildBeginRenderPassDescriptor(\n specAttachments: PipelineSpec['attachments'],\n viewBindings: {\n readonly colorViews: readonly unknown[];\n readonly resolveTargets?: readonly (unknown | undefined)[];\n readonly depthView?: unknown;\n },\n passKind: string,\n options?: {\n readonly colorLoadOp?: 'clear' | 'load';\n readonly colorStoreOp?: 'store' | 'discard';\n readonly clearColor?: GPUColor;\n readonly depthLoadOp?: 'clear' | 'load';\n readonly depthStoreOp?: 'store' | 'discard';\n readonly label?: string;\n },\n): Record<string, unknown> {\n const policy = passKindPolicyTable[passKind];\n if (policy === undefined) {\n throw new PipelineSpecError({\n code: 'unknown-pass-kind',\n detail: { expected: Object.keys(passKindPolicyTable), actual: passKind },\n hint: `passKind '${passKind}' is not in passKindPolicyTable; register an attachment policy or pick an existing one (e.g. 'post-process' for fullscreen-quad passes)`,\n });\n }\n\n const out: Record<string, unknown> = {};\n if (options?.label !== undefined) {\n out.label = options.label;\n }\n\n // Colour attachments: depth-only → empty array; otherwise iterate colorViews\n // and apply policy default ops + per-call overrides. resolveTargets[i] === undefined\n // means \"no resolve for this slot\"; only present slots emit a `resolveTarget`.\n if (policy.shape === 'depth-only') {\n out.colorAttachments = [];\n } else {\n const colorOps = policy.defaultColorOps;\n if (colorOps === undefined) {\n throw new PipelineSpecError({\n code: 'spec-inconsistent',\n detail: {\n reason: 'policy-shape-color-without-colorOps',\n actual: passKind,\n },\n hint: `passKind '${passKind}' has shape='${policy.shape}' but no defaultColorOps; fix passKindPolicyTable entry`,\n });\n }\n const loadOp = options?.colorLoadOp ?? colorOps.loadOp;\n const storeOp = options?.colorStoreOp ?? colorOps.storeOp;\n const clearValue = options?.clearColor ?? colorOps.clearValue;\n\n out.colorAttachments = viewBindings.colorViews.map((view, i) => {\n const slot: Record<string, unknown> = {\n view,\n loadOp,\n storeOp,\n };\n const resolveTarget = viewBindings.resolveTargets?.[i];\n if (resolveTarget !== undefined) {\n slot.resolveTarget = resolveTarget;\n }\n // Emit clearValue only when load is 'clear' AND a value is available.\n if (loadOp === 'clear' && clearValue !== undefined) {\n slot.clearValue = clearValue;\n }\n return slot;\n });\n }\n\n // Depth-stencil attachment: emitted iff policy declares depth ops AND\n // the spec carries a depthFormat. Stencil ops auto-derived from format.\n if (policy.shape !== 'color-only' && policy.defaultDepthOps !== undefined) {\n const dOps = policy.defaultDepthOps;\n const depthLoadOp = options?.depthLoadOp ?? dOps.loadOp;\n const depthStoreOp = options?.depthStoreOp ?? dOps.storeOp;\n const ds: Record<string, unknown> = {\n view: viewBindings.depthView,\n depthLoadOp,\n depthStoreOp,\n };\n if (depthLoadOp === 'clear') {\n ds.depthClearValue = dOps.clearValue;\n }\n // Stencil-op gate: only depth24plus-stencil8 carries a stencil aspect.\n if (specAttachments.depthFormat === 'depth24plus-stencil8') {\n ds.stencilClearValue = 0;\n ds.stencilLoadOp = 'clear';\n ds.stencilStoreOp = 'discard';\n }\n out.depthStencilAttachment = ds;\n }\n\n return out;\n}\n\n/**\n * Validate a PipelineSpec before attempting to build.\n *\n * Fail-fast checks (charter P5) covering axis mutual-exclusion rules.\n * Returns `Result<void, PipelineSpecError>` — ok for valid specs,\n * err with structured code + detail for invalid ones.\n *\n * Checks:\n * 1. `sampleCount=4` with empty `colorFormats` → `'spec-inconsistent'`\n * 2. Pass kind not in `KNOWN_PASS_KINDS` → `'unknown-pass-kind'`\n * 3. `depthFormat` undefined but `renderState` implies depth testing →\n * `'attachment-format-incompatible'`\n *\n * @see plan-strategy §3.2 · requirements AC-02 · charter P5\n */\nexport function validateSpec(\n spec: PipelineSpec,\n):\n | { ok: true }\n | { ok: false; code: PipelineSpecErrorCode; detail: Record<string, unknown>; hint?: string } {\n // Check 1: sampleCount=4 with empty colorFormats is inconsistent —\n // multisample requires a colour target to resolve to.\n if (spec.attachments.sampleCount === 4 && spec.attachments.colorFormats.length === 0) {\n return {\n ok: false,\n code: 'spec-inconsistent',\n detail: { reason: 'sample-count-format-incompatible' },\n hint: 'sampleCount=4 requires at least one colorFormat; shadow-caster (depth-only) passes should use sampleCount=1',\n };\n }\n\n // Check 2: unknown pass kind\n if (!KNOWN_PASS_KINDS.includes(spec.shader.passKind)) {\n return {\n ok: false,\n code: 'unknown-pass-kind',\n detail: { expected: KNOWN_PASS_KINDS, actual: spec.shader.passKind },\n hint: `passKind '${spec.shader.passKind}' is not in KNOWN_PASS_KINDS; register custom pass kinds via ShaderCatalog`,\n };\n }\n\n // Check 3: depth-testing renderState without a depthFormat\n const depthOnly = passKindPolicyTable[spec.shader.passKind]?.shape === 'depth-only';\n const depthRequired = !!spec.renderState?.depthCompare || depthOnly;\n if (!spec.attachments.depthFormat && depthRequired) {\n return {\n ok: false,\n code: 'attachment-format-incompatible',\n detail: {\n reason: 'depth-requirement-without-depth-format',\n expected: 'depthFormat must be set when depth testing or a depth-only pass is requested',\n actual: `depthFormat=${String(spec.attachments.depthFormat)}, depthCompare=${spec.renderState?.depthCompare}`,\n },\n hint: 'set attachments.depthFormat (e.g. depth24plus-stencil8 or depth32float) when renderState specifies depthCompare',\n };\n }\n\n return { ok: true };\n}\n\n// ══════════════════════════════════════════════════════════════════════════════\n// PipelineCache — Map<string, RenderPipeline> container (D-12)\n// ══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Pipeline cache — Map from cacheKeyOf(spec) to opaque RenderPipeline handle.\n *\n * Constructed once at createRenderer boot time; shared across all call sites.\n * Consumers call `getOrBuildPipeline(spec, deviceProvider, cache)` — the\n * entrypoint does cache lookup internally; consumers never touch the Map\n * directly.\n *\n * @see plan-strategy D-12 · requirements §3.2\n */\nexport type PipelineCache = Map<string, unknown>;\n\n// ══════════════════════════════════════════════════════════════════════════════\n// getOrBuildPipeline — single entrypoint (D-12)\n// ══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Device factory interface consumed by {@link getOrBuildPipeline}.\n *\n * Slim abstraction: only `createRenderPipeline` is needed; the entrypoint\n * does not depend on the full `RhiDevice` interface so it can be tested\n * with a mock.\n */\nexport interface PipelineDeviceProvider {\n createRenderPipeline(\n descriptor: Record<string, unknown>,\n ): { ok: true; value: unknown } | { ok: false; error: unknown };\n}\n\n/**\n * Single entrypoint for obtaining a render pipeline from a spec.\n *\n * Cache-hit path: key = cacheKeyOf(spec), returns cached handle immediately.\n * Cache-miss path: validates spec → builds descriptor → calls device.createRenderPipeline\n * → caches result → returns handle.\n * Build failure: throws PipelineSpecError (charter P3 fail-fast, no silent fallback).\n *\n * Pure function: same (spec, deviceProvider, cache) always produces the same result.\n * Boot-time call site: createRenderer wires the real device; record-stage call site\n * uses ctx.runtime.device (same entrypoint, same signature).\n *\n * @param spec - immutable 4-axis pipeline specification\n * @param deviceProvider - factory with createRenderPipeline method\n * @param cache - the PipelineCache (shared across boot + record stage)\n * @returns a RenderPipeline handle (opaque, typed as unknown for M1)\n * @throws PipelineSpecError on validation failure or build failure\n * @see plan-strategy D-12 · requirements AC-03 · charter F1\n */\nexport function getOrBuildPipeline(\n spec: PipelineSpec,\n deviceProvider: PipelineDeviceProvider,\n cache: PipelineCache,\n modules?: {\n vertex: unknown;\n fragment: unknown;\n vertexEntryPoint?: string;\n fragmentEntryPoint?: string;\n layout?: unknown;\n },\n): unknown {\n const key = cacheKeyOf(spec);\n\n // Cache hit — return immediately.\n const cached = cache.get(key);\n if (cached !== undefined) return cached;\n\n // Cache miss — validate, build, cache, return.\n const validation = validateSpec(spec);\n if (!validation.ok) {\n throw new PipelineSpecError({\n code: validation.code,\n detail: validation.detail,\n ...(validation.hint !== undefined ? { hint: validation.hint } : {}),\n });\n }\n\n const descriptor = buildPipelineDescriptor(\n spec,\n modules ?? { vertex: undefined, fragment: undefined },\n );\n const result = deviceProvider.createRenderPipeline(descriptor);\n\n if (!result.ok) {\n throw new PipelineSpecError({\n code: 'pipeline-build-failed',\n detail: { cause: result.error },\n hint: 'device.createRenderPipeline failed for spec; inspect gpuMessage on the error detail',\n });\n }\n\n cache.set(key, result.value);\n return result.value;\n}\n\n// ══════════════════════════════════════════════════════════════════════════════\n// SPEC_CONST_TABLE — 12 boot-time pre-warm variants (M1-T5)\n// ══════════════════════════════════════════════════════════════════════════════\n\nconst PROCEDURAL_ATTR_LAYOUT = DEFAULT_VERTEX_ATTRIBUTE_MAP;\n\nconst HDR_FORMAT: GPUTextureFormat = 'rgba16float';\nconst DEPTH_DS: GPUTextureFormat = 'depth24plus-stencil8';\n\n/**\n * Default LDR view format used when callers ask for the SPEC_CONST table\n * without an explicit swap-chain format. Kept for the backward-compatible\n * `SPEC_CONST_TABLE` export consumed by unit tests that exercise the\n * spec/cache-keying layer in isolation. Runtime callers always pass the\n * format selected by `selectSwapChainFormat` (Channel 2 BGRA / Channel 3\n * RGBA / dawn-node RGBA — see bug-20260615 fix-up note in `createRenderer`).\n */\nconst DEFAULT_LDR_FORMAT: GPUTextureFormat = 'bgra8unorm-srgb';\n\nconst TRI_GEOMETRY = {\n topology: 'triangle-list' as PrimitiveTopology,\n stripIndexFormat: undefined,\n vertexLayout: PROCEDURAL_ATTR_LAYOUT,\n};\n\n// feat-city-glb multi-UV tiling: the built-in standard PBR shader now declares\n// UV sets @location(6..12), so naga reflects uvSetCount=8 for it and the URP\n// record path threads `shaderUvSetCount: 8` into every standard-pbr spec\n// (createRenderer.ts buildPipelineContext / getMaterialShaderPipeline).\n// The boot-time prewarm must match on both axes: the PSO vertex layout includes\n// all declared UV slots, and the cacheKey carries `:uvsc8`. For single-UV\n// meshes deriveVertexBufferLayout clamp-to-last aliases every missing set onto\n// the last mesh set (48-byte stride unchanged), so existing geometry remains\n// byte-stable.\n// unlit stays on TRI_GEOMETRY (its shader declares only @location(0..3)).\nconst TRI_GEOMETRY_PBR = {\n topology: 'triangle-list' as PrimitiveTopology,\n stripIndexFormat: undefined,\n vertexLayout: PROCEDURAL_ATTR_LAYOUT,\n shaderUvSetCount: 8,\n};\n\n// M6 fix-up: non-clustered boot-variant key string for the standard PBR shader.\n// Mirrors the boot-time variantSet computed at createRenderer.ts step 1b when\n// clustered lighting is not yet admitted and `storageBufferCapable=true` (the\n// surface). The default record path requests this exact string at every\n// `getMaterialShaderPipeline` call site, so seeding the table with these\n// variants keeps the default cache lookup hot from frame 1 instead of\n// skip-drawing the first ~1 frames while the async compile resolves.\nconst STANDARD_BOOT_VARIANT_SET = standardCapabilityVariantSet(false, true, false);\n\n/**\n * Build the boot-time pre-warm table: 15 standard PipelineSpec variants.\n *\n * feat-20260625-refactor-sprite-as-transparent-mesh M3 / w14 (AC-12): the\n * four `forgeax::default-sprite` entries (LDR S1 + LDR S4 + HDR S1 + HDR S4)\n * are gone — sprite PSO lands lazily through the generic\n * per-MaterialShader pipeline cache. Pre-feat count was 19; post-feat 15.\n *\n * Matrix:\n * - 8 base material variants — {unlit, standard-pbr} x {LDR, HDR} x {S1, S4}\n * - 4 non-clustered standard-pbr — standard-pbr (variantSet=STANDARD_BOOT_VARIANT_SET)\n * x {LDR, HDR} x {S1, S4}; the default record path requests these specs by\n * `getMaterialShaderPipeline` keying off `cacheKeyOf` so the boot-time\n * prewarm seeds `materialShaderPipelineCache` and avoids a 1-frame\n * async-compile skip-draw (M6 fix-up; see render-system-record.ts)\n * - 3 fullscreen-post — tonemap (LDR S1) + skybox (HDR S1, HDR S4)\n *\n * Total: 15. The non-clustered variant is PBR-only because:\n * - unlit record path passes `variantSet=undefined` (the no-variant\n * boot-default entries already cover it; createRenderer.ts §unlitRsp)\n * - sprite goes through `getMaterialShaderPipeline('forgeax::sprite', ...)`\n * lazily at first transparent-LDR-split draw — no boot-time pre-warm.\n * - clustered variant (`variantSet=''` or compound `=true` form) is registered\n * lazily when the clustered Standard profile activates, not at boot — adding clustered\n * prewarm here would build PSOs against the URP layout (the boot-time\n * `pbrModule` is the non-clustered variant before a frame admits local lights)\n *\n * `ldrViewFormat` parameterises the LDR color attachment format. Callers\n * pass the runtime-resolved swap-chain view format (Channel 2 typically\n * `bgra8unorm-srgb`; Channel 3 wgpu-wasm and dawn-node typically\n * `rgba8unorm-srgb`). Hard-coding `bgra8unorm-srgb` at module load made\n * the pre-warmed PSOs incompatible with the actual RenderPass color\n * attachment on Channel 3 / dawn-node, producing whole-commandBuffer\n * invalid errors on every frame (bug-20260615 fix-up — see\n * `createRenderer` boot-time pre-warm site).\n *\n * Fullscreen passes (fxaa / bloom x 3 / SSAO x 2) are lazy-build — they\n * use the same getOrBuildPipeline entrypoint but are not in this table.\n *\n * @see plan-strategy D-4 · research R-D4 · requirements AC-16\n * @see bug-20260612-webgpu-canvas-format-prefer-bgra-shipped (same trap shape)\n */\nexport function buildSpecConstTable(\n ldrViewFormat: GPUTextureFormat,\n): readonly Readonly<PipelineSpec>[] {\n const TRI_ATTACHMENTS_LDR_S1 = {\n colorFormats: [ldrViewFormat],\n depthFormat: DEPTH_DS,\n sampleCount: 1 as const,\n };\n\n const TRI_ATTACHMENTS_LDR_S4 = {\n colorFormats: [ldrViewFormat],\n depthFormat: DEPTH_DS,\n sampleCount: 4 as const,\n };\n\n // feat-20260625-refactor-sprite-as-transparent-mesh M3 / w14 (AC-12 / D-7):\n // SPRITE_ATTACHMENTS_LDR_S1 / S4 (the dedicated non-srgb storage-format\n // attachments the sprite spec entries consumed) were deleted alongside the\n // four `forgeax::default-sprite` SPEC_CONST entries. The bgra8unorm storage\n // format itself is still enforced at the LDR sprite sub-pass attachment\n // level (the WebGPU pipeline `colorFormats` derive from the actual render\n // pass attachment view, which is built off `pipelineState.format` =\n // swap-chain storage format — see `render-system-record.ts` LDR split\n // beginRenderPass call). The triggering source migrated from the\n // spec-table id to `material.transparent` (derived by the extract stage\n // from `passes[0].renderState.blend !== undefined`, the\n // post-feat-20260626-collapse SSOT; w7 onwards).\n\n const TRI_ATTACHMENTS_HDR_S1 = {\n colorFormats: [HDR_FORMAT],\n depthFormat: DEPTH_DS,\n sampleCount: 1 as const,\n };\n\n const TRI_ATTACHMENTS_HDR_S4 = {\n colorFormats: [HDR_FORMAT],\n depthFormat: DEPTH_DS,\n sampleCount: 4 as const,\n };\n\n return [\n // unlit LDR S1\n {\n shader: { id: 'forgeax::default-unlit', passKind: 'forward', variantSet: undefined },\n attachments: TRI_ATTACHMENTS_LDR_S1,\n geometry: TRI_GEOMETRY,\n renderState: undefined,\n },\n // unlit LDR S4\n {\n shader: { id: 'forgeax::default-unlit', passKind: 'forward', variantSet: undefined },\n attachments: TRI_ATTACHMENTS_LDR_S4,\n geometry: TRI_GEOMETRY,\n renderState: undefined,\n },\n // unlit HDR S1\n {\n shader: { id: 'forgeax::default-unlit', passKind: 'forward', variantSet: undefined },\n attachments: TRI_ATTACHMENTS_HDR_S1,\n geometry: TRI_GEOMETRY,\n renderState: undefined,\n },\n // unlit HDR S4\n {\n shader: { id: 'forgeax::default-unlit', passKind: 'forward', variantSet: undefined },\n attachments: TRI_ATTACHMENTS_HDR_S4,\n geometry: TRI_GEOMETRY,\n renderState: undefined,\n },\n // standard LDR S1\n {\n shader: { id: 'forgeax::default-standard-pbr', passKind: 'forward', variantSet: undefined },\n attachments: TRI_ATTACHMENTS_LDR_S1,\n geometry: TRI_GEOMETRY_PBR,\n renderState: undefined,\n },\n // standard LDR S4\n {\n shader: { id: 'forgeax::default-standard-pbr', passKind: 'forward', variantSet: undefined },\n attachments: TRI_ATTACHMENTS_LDR_S4,\n geometry: TRI_GEOMETRY_PBR,\n renderState: undefined,\n },\n // standard HDR S1\n {\n shader: { id: 'forgeax::default-standard-pbr', passKind: 'forward', variantSet: undefined },\n attachments: TRI_ATTACHMENTS_HDR_S1,\n geometry: TRI_GEOMETRY_PBR,\n renderState: undefined,\n },\n // standard HDR S4\n {\n shader: { id: 'forgeax::default-standard-pbr', passKind: 'forward', variantSet: undefined },\n attachments: TRI_ATTACHMENTS_HDR_S4,\n geometry: TRI_GEOMETRY_PBR,\n renderState: undefined,\n },\n\n // ── M6 fix-up: non-clustered standard-pbr prewarm ─────────────────────────\n // The default record path (`getMaterialShaderPipeline`) requests\n // `variantSet=STANDARD_BOOT_VARIANT_SET` for standard-shading entities; pre-M6\n // the silent `selectStandardFallbackPipeline` shim served the no-variant\n // boot prewarm during the 1-frame async-compile warmup. With M6's\n // explicit-failure surface, those requests must hit the boot prewarm\n // by their own variantSet — these 4 entries close that gap.\n\n // standard PBR URP LDR S1\n {\n shader: {\n id: 'forgeax::default-standard-pbr',\n passKind: 'forward',\n variantSet: STANDARD_BOOT_VARIANT_SET,\n },\n attachments: TRI_ATTACHMENTS_LDR_S1,\n geometry: TRI_GEOMETRY_PBR,\n renderState: undefined,\n },\n // standard PBR URP LDR S4\n {\n shader: {\n id: 'forgeax::default-standard-pbr',\n passKind: 'forward',\n variantSet: STANDARD_BOOT_VARIANT_SET,\n },\n attachments: TRI_ATTACHMENTS_LDR_S4,\n geometry: TRI_GEOMETRY_PBR,\n renderState: undefined,\n },\n // standard PBR URP HDR S1\n {\n shader: {\n id: 'forgeax::default-standard-pbr',\n passKind: 'forward',\n variantSet: STANDARD_BOOT_VARIANT_SET,\n },\n attachments: TRI_ATTACHMENTS_HDR_S1,\n geometry: TRI_GEOMETRY_PBR,\n renderState: undefined,\n },\n // standard PBR URP HDR S4\n {\n shader: {\n id: 'forgeax::default-standard-pbr',\n passKind: 'forward',\n variantSet: STANDARD_BOOT_VARIANT_SET,\n },\n attachments: TRI_ATTACHMENTS_HDR_S4,\n geometry: TRI_GEOMETRY_PBR,\n renderState: undefined,\n },\n\n // feat-20260625-refactor-sprite-as-transparent-mesh M3 / w14 (AC-12 / D-7):\n // the four `forgeax::default-sprite` boot-time pre-warm entries (LDR S1\n // + LDR S4 + HDR S1 + HDR S4) are gone. Sprite PSO lands lazily through\n // the generic per-MaterialShader pipeline cache keyed on\n // `forgeax::sprite` + premultiplied-alpha renderState; SPEC_CONST_TABLE\n // shrinks from 19 to 15 entries (-4 boot-time PSOs).\n\n // ── M2-T4: fullscreen-post boot-time pre-warm (tonemap + skybox) ──────────\n //\n // Tonemap (LDR S1): fullscreen triangle writes to swap-chain LDR view format\n // (parameterised — `ldrViewFormat`; see buildSpecConstTable jsdoc + bug-20260615).\n // Skybox (HDR S1 + S4): fullscreen triangle writes to rgba16float; MSAA variant\n // has sampleCount=4. Both use empty vertexLayout (fullscreen triangle, no\n // attributes) and cullMode='none' (forward cull for fullscreen-quad passthrough).\n //\n // Shadow-probe / fxaa / Bloom 10-pass / SSAO 2-stage are lazy-build — not in\n // SPEC_CONST_TABLE (R-D4 decision: only entries that are always-present on\n // every boot).\n\n // tonemap LDR S1 (writes to runtime-resolved swap-chain LDR view format)\n {\n shader: { id: 'forgeax::post::tonemap', passKind: 'post-process', variantSet: undefined },\n attachments: {\n colorFormats: [ldrViewFormat],\n depthFormat: undefined,\n sampleCount: 1 as const,\n },\n geometry: {\n topology: 'triangle-list' as PrimitiveTopology,\n stripIndexFormat: undefined,\n vertexLayout: {},\n },\n renderState: {\n cullMode: 'none',\n },\n },\n\n // skybox HDR S1 (writes to rgba16float, no depth)\n {\n shader: { id: 'forgeax::skybox::cube', passKind: 'skybox', variantSet: undefined },\n attachments: {\n colorFormats: [HDR_FORMAT],\n depthFormat: undefined,\n sampleCount: 1 as const,\n },\n geometry: {\n topology: 'triangle-list' as PrimitiveTopology,\n stripIndexFormat: undefined,\n vertexLayout: {},\n },\n renderState: {\n cullMode: 'none',\n },\n },\n\n // skybox HDR S4 (MSAA variant)\n {\n shader: { id: 'forgeax::skybox::cube', passKind: 'skybox', variantSet: undefined },\n attachments: {\n colorFormats: [HDR_FORMAT],\n depthFormat: undefined,\n sampleCount: 4 as const,\n },\n geometry: {\n topology: 'triangle-list' as PrimitiveTopology,\n stripIndexFormat: undefined,\n vertexLayout: {},\n },\n renderState: {\n cullMode: 'none',\n },\n },\n ];\n}\n\n/**\n * Derive the material-only pre-warm table for a native linear-LDR target.\n *\n * The regular SPEC_CONST table targets the swap-chain view, while the\n * tonemap=none path records geometry directly into the graph-owned\n * `rgba16float` target. Keep that second attachment matrix derived from the\n * same material specs so the first frame does not depend on an asynchronous\n * lazy PSO build.\n */\nexport function buildLinearLdrMaterialSpecTable(\n ldrViewFormat: GPUTextureFormat,\n): readonly Readonly<PipelineSpec>[] {\n return buildSpecConstTable(ldrViewFormat)\n .filter(\n (spec) =>\n spec.shader.passKind === 'forward' && spec.attachments.colorFormats[0] === ldrViewFormat,\n )\n .map((spec) => ({\n ...spec,\n attachments: {\n ...spec.attachments,\n colorFormats: [HDR_FORMAT],\n },\n }));\n}\n\n/**\n * Backward-compatible SPEC_CONST_TABLE — the table built with the default\n * LDR view format (`bgra8unorm-srgb`). Unit tests that exercise the\n * spec/cache-keying layer in isolation import this directly. Runtime\n * callers MUST call `buildSpecConstTable(swapChainFormats.view)` instead\n * so the pre-warmed PSO color format matches the actual RenderPass color\n * attachment on every backend (bug-20260615 fix-up).\n */\nexport const SPEC_CONST_TABLE: readonly Readonly<PipelineSpec>[] =\n buildSpecConstTable(DEFAULT_LDR_FORMAT);\n","import { mat3 } from '@forgeax/engine-math';\nimport { type BindGroup, type Buffer, RhiError, type RhiQueue } from '@forgeax/engine-rhi';\nimport { ok, type Result } from '@forgeax/engine-types';\nimport type { DispatchEntry } from '../render-system-extract';\nimport {\n TRANSPARENT_SORT_MODE_LAYER_Y,\n TRANSPARENT_SORT_MODE_LAYER_Z,\n type TransparentSortConfig,\n} from '../systems/transparent-sort-config';\nimport type { ValidatedRenderable } from './frame-snapshot';\n\n/**\n * Stride between per-renderable `entity_world` mat4 slots inside the\n * shared `pipelineState.meshStorageBuffer`. The 256-byte alignment is\n * required because the storage buffer is bound with\n * `hasDynamicOffset: true` and WebGPU spec\n * `minStorageBufferOffsetAlignment` defaults to 256.\n */\nexport const MESH_PER_ENTITY_STRIDE = 256;\n\n// The storage-buffer Mesh struct also carries the temporal previous transform\n// and reactive metadata when STORAGE_BUFFER_AVAILABLE is true:\n// mat4 (64 B) + mat3 (48 B) + previous mat4 (64 B) + vec4 (16 B) = 192 B.\n// The BindGroup entry's `size` must cover the complete reflected struct, not\n// only the first world transform and normal matrix.\nexport const MESH_SSBO_BYTES = 192;\n\n// bug-20260610: WebGL2 fallback shader declares `array<Mesh, 128>` as a\n// uniform buffer; binding must cover the full array size. The storage\n// variant binds a single 112-B slot via dynamic offset, but the uniform\n// variant requires the whole 14336-B range visible to the shader.\nexport const MESH_UBO_FULL_ARRAY_BYTES = 112 * 128;\n\n// bug-20260723-webgl2-instancing-uniform-range: the WebGL2 fallback shader\n// declares `array<InstanceData, 128>` in the instances bind group. Even when\n// a draw carries fewer transforms, the buffer binding must expose the full\n// array range or wgpu rejects the draw at submit time with a late\n// min-binding-size mismatch.\nexport const INSTANCE_UBO_FULL_ARRAY_BYTES = 80 * 128;\n\nexport const MAX_UNIFORM_INSTANCES = 128;\n\n/** The storage-backed InstanceData layout is current + previous mat4. */\nexport const INSTANCE_STORAGE_STRIDE_FLOATS = 32;\n\nfunction hasStableGenerationColumn(generations: Uint32Array | undefined, count: number): boolean {\n if (generations === undefined || generations.length !== count) return false;\n const seen = new Set<number>();\n for (const generation of generations) {\n if (generation === 0 || seen.has(generation)) return false;\n seen.add(generation);\n }\n return true;\n}\n\n/**\n * Project the ECS transform snapshot into the storage-backed InstanceData\n * layout. Unique identity generations select the previous matrix only when\n * the producer proves that the instance survived. Replaced slots seed\n * previous=current; reordered slots map back to the real prior ordinal so a\n * compaction cannot exchange velocities. Uniform-backed variants keep the\n * compact 16-float payload and do not use this projection.\n */\nexport function packInstanceStorageBuffer(\n transforms: Float32Array,\n previousTransforms: Float32Array = transforms,\n generations?: Uint32Array,\n previousGenerations?: Uint32Array,\n): Float32Array {\n const count = Math.floor(transforms.length / 16);\n const out = new Float32Array(count * INSTANCE_STORAGE_STRIDE_FLOATS);\n const previousCount = Math.floor(previousTransforms.length / 16);\n const generationInput = generations !== undefined || previousGenerations !== undefined;\n const identityProof =\n hasStableGenerationColumn(generations, count) &&\n hasStableGenerationColumn(previousGenerations, previousCount);\n const previousIndexByGeneration = identityProof\n ? new Map(\n Array.from(previousGenerations ?? [], (generation, index) => [generation, index] as const),\n )\n : undefined;\n for (let i = 0; i < count; i++) {\n const sourceBase = i * 16;\n const targetBase = i * INSTANCE_STORAGE_STRIDE_FLOATS;\n const previousIndex = identityProof\n ? previousIndexByGeneration?.get(generations?.[i] ?? 0)\n : !generationInput && previousCount === count\n ? i\n : undefined;\n const sameIdentity = previousIndex !== undefined && previousIndex < previousCount;\n const previousBase = (previousIndex ?? i) * 16;\n for (let k = 0; k < 16; k++) {\n const value = transforms[sourceBase + k] ?? 0;\n out[targetBase + k] = value;\n out[targetBase + 16 + k] = sameIdentity\n ? (previousTransforms[previousBase + k] ?? value)\n : value;\n }\n }\n return out;\n}\n\n/**\n * M3 / w12: extracts the underlying GPU resource object from a bind\n * group entry descriptor. Returns the raw object reference (Buffer,\n * TextureView, or Sampler) usable as a WeakMap chain key.\n */\nexport function extractEntryResourceHandle(entry: {\n resource: { kind: string; value: unknown };\n}): object {\n const v = entry.resource.value;\n if (typeof v === 'object' && v !== null && 'buffer' in (v as Record<string, unknown>)) {\n return (v as { buffer: object }).buffer;\n }\n return v as object;\n}\n\n// Object-only terminal marker keeps a shorter resource chain from colliding\n// with a longer chain that shares the same prefix.\nconst BIND_GROUP_CHAIN_LEAF_KEY: object = {};\n\n/**\n * feat-20260622-handle-to-id-allocator-elimination M2 / w7: walks a nested\n * WeakMap chain to find or create a BindGroup leaf. Each handle in the\n * `handles` array is a chain node; a dedicated object terminal marker points\n * to the final Map<string, BindGroup> keyed by `variant` (D-2). The marker\n * prevents variable-depth chains with a shared prefix from treating a nested\n * WeakMap as a leaf. Chain keys are always object references, never numeric\n * ids — GC reclaims entries for dead handles automatically.\n *\n * On cache hit returns the cached BindGroup. On miss calls `factory`,\n * bumps `bindGroupCounts.createBindGroup`, stores the result at the leaf,\n * and returns it. Hit/miss accounting is observable via `bindGroupCounts`\n * (D-8: the skin probe reads `counts.createBindGroup` delta).\n */\nexport function getOrCreateFromChain(\n root: WeakMap<object, unknown>,\n handles: readonly object[],\n variant: string,\n factory: () => BindGroup,\n counts: { createBindGroup: number; keys: string[] },\n): BindGroup {\n let node = root;\n for (const h of handles) {\n let next = node.get(h) as WeakMap<object, unknown> | undefined;\n if (next === undefined) {\n next = new WeakMap();\n node.set(h, next);\n }\n node = next;\n }\n let leaf = node.get(BIND_GROUP_CHAIN_LEAF_KEY) as Map<string, BindGroup> | undefined;\n if (leaf === undefined) {\n leaf = new Map();\n node.set(BIND_GROUP_CHAIN_LEAF_KEY, leaf);\n }\n const hit = leaf.get(variant);\n if (hit !== undefined) return hit;\n const bg = factory();\n counts.createBindGroup += 1;\n counts.keys.push(variant);\n leaf.set(variant, bg);\n return bg;\n}\n\n/**\n * Result-preserving sibling of `getOrCreateFromChain`. RHI creation can fail\n * transiently during recovery or capability probing; a failed attempt must\n * not enter the cache and must remain a structured Result for the caller.\n */\nexport function getOrCreateFromChainResult<E>(\n root: WeakMap<object, unknown>,\n handles: readonly object[],\n variant: string,\n factory: () => Result<BindGroup, E>,\n counts: { createBindGroup: number; keys: string[] },\n): Result<BindGroup, E> {\n let node = root;\n for (const h of handles) {\n let next = node.get(h) as WeakMap<object, unknown> | undefined;\n if (next === undefined) {\n next = new WeakMap();\n node.set(h, next);\n }\n node = next;\n }\n let leaf = node.get(BIND_GROUP_CHAIN_LEAF_KEY) as Map<string, BindGroup> | undefined;\n if (leaf === undefined) {\n leaf = new Map();\n node.set(BIND_GROUP_CHAIN_LEAF_KEY, leaf);\n }\n const hit = leaf.get(variant);\n if (hit !== undefined) return ok(hit);\n const created = factory();\n if (!created.ok) return created;\n counts.createBindGroup += 1;\n counts.keys.push(variant);\n leaf.set(variant, created.value);\n return created;\n}\n\n/**\n * Read a cached bind group using the same variable-depth chain contract as\n * `getOrCreateFromChain`. Readers must traverse the terminal marker instead\n * of assuming that the last handle directly stores the variant map.\n */\nexport function findFromChain(\n root: WeakMap<object, unknown>,\n handles: readonly object[],\n variant: string,\n): BindGroup | undefined {\n let node = root;\n for (const handle of handles) {\n const next = node.get(handle);\n if (next === undefined) return undefined;\n node = next as WeakMap<object, unknown>;\n }\n const leaf = node.get(BIND_GROUP_CHAIN_LEAF_KEY) as Map<string, BindGroup> | undefined;\n return leaf?.get(variant);\n}\n\n/**\n * feat-20260622-handle-to-id-allocator-elimination M2 / w8: per-entity bind\n * group lookup-or-create helper (D-2). Two-step lookup: outer Map.get(outerKey)\n * finds or lazily creates an inner WeakMap chain, then delegates to\n * `getOrCreateFromChain` for the chain walk. outerKey is `string | number`\n * to cover both per-entity (number entityKey) and material-shared\n * (string shaderId) caches (D-1 / OQ-1).\n */\nexport function getOrCreatePerEntity(\n outerMap: Map<string | number, WeakMap<object, unknown>>,\n outerKey: string | number,\n handles: readonly object[],\n variant: string,\n factory: () => BindGroup,\n counts: { createBindGroup: number; keys: string[] },\n): BindGroup {\n let inner = outerMap.get(outerKey) as WeakMap<object, unknown> | undefined;\n if (inner === undefined) {\n inner = new WeakMap();\n outerMap.set(outerKey, inner);\n }\n return getOrCreateFromChain(inner, handles, variant, factory, counts);\n}\n\n/**\n * feat-20260622-handle-to-id-allocator-elimination M2 / w8: evicts per-entity\n * cache entries whose entityKey is not in the validated set. Works on\n * Map<entityKey, WeakMap<handle, BindGroup>> by iterating the outer Map keys\n * and deleting entries for which validatedEntityKeys.has(ek) is false.\n * No string parsing, no Number / Number.isNaN — the entityKey is already a\n * number (D-1 / RD4).\n *\n * @internal — exported for unit test access (AC-08)\n */\nexport function cleanPerEntityCache(\n cache: Map<number, WeakMap<object, unknown>>,\n validatedEntityKeys: Set<number>,\n): void {\n for (const ek of cache.keys()) {\n if (!validatedEntityKeys.has(ek)) {\n cache.delete(ek);\n }\n }\n}\n\n/**\n * feat-20260608-mesh-ssbo-dynamic-grow-l1-lift-1024-entity-cap M3 / T-M3-04:\n * record-stage entry-point hook to the closure-scoped mesh-SSBO grow\n * controller (createRenderer.ts). Called once per frame, after\n * `validatedOrdered` has been finalised and BEFORE the first per-entity\n * `queue.writeBuffer`. Returns Result-like (never throws — D-5):\n *\n * - `{ ok: true }` — slotCount already covers `neededSlots` (idempotent\n * short-circuit), or the controller successfully grew\n * in this call. Caller proceeds with the frame.\n * - `{ ok: false, code, degradedToSlotCount }` — controller hit ceiling /\n * capacity and ALREADY fired the structured error\n * via errorRegistry. Caller truncates the draw\n * list to the largest complete entity prefix that\n * fits within `degradedToSlotCount` slots (graceful\n * degradation per plan-strategy D-2): renders the\n * subset that fits, discards overflow, no black\n * frame.\n *\n * This helper does NOT re-fire on `ok:false` — the controller is the single\n * fire site (createRenderer.ts grow factory), so callers see exactly one\n * structured error per ceiling event (charter P3 explicit failure: no\n * double-fire).\n *\n * Dev-mode visibility: when grow actually grew (slotCount transition) AND\n * `import.meta.env?.DEV` is truthy, a single `console.info('[mesh-ssbo] ...')`\n * line reports the before / after / requested counts. The optional-chain\n * keeps non-vite envs (dawn-node smoke, plain tsup tests) silent —\n * `import.meta.env` is undefined there, the chain short-circuits to\n * undefined, the if-guard is falsy (AC-11 + plan-strategy §2.D-3).\n *\n * Bind-group cache invalidation is automatic: on grow, the controller\n * mutates `meshSsboState.mesh.buffer` / `.material.buffer` in place\n * (wrapper-object identity preserved, inner buffer replaced — research §F8).\n * Downstream the fresh inner buffer object is a new WeakMap chain key, so\n * `getOrCreateFromChain` misses and rebuilds the BindGroup on the next frame\n * (AC-07; T-M3-03 (a) test).\n *\n * @internal — exported for unit-test access (`mesh-ssbo-grow.test.ts`\n * T-M3-01 / T-M3-02 / T-M3-03 cover idempotency, ceiling, dev info).\n */\nexport function ensureMeshSsboCapacity(\n internals: {\n readonly growMeshSsbo?:\n | ((neededSlots: number) =>\n | { readonly ok: true }\n | {\n readonly ok: false;\n readonly code: 'mesh-ssbo-ceiling-reached' | 'mesh-ssbo-capacity-exceeded';\n readonly degradedToSlotCount: number;\n })\n | undefined;\n readonly meshSsboState?: { readonly slotCount: number } | undefined;\n },\n neededSlots: number,\n):\n | { readonly ok: true }\n | {\n readonly ok: false;\n readonly code: 'mesh-ssbo-ceiling-reached' | 'mesh-ssbo-capacity-exceeded';\n readonly degradedToSlotCount: number;\n } {\n // Empty scene / no controller wired (legacy / test fixture path).\n if (neededSlots <= 0) return { ok: true };\n const grow = internals.growMeshSsbo;\n if (grow === undefined) return { ok: true };\n // Idempotent guard — current slotCount already covers neededSlots.\n // The controller's own internal guard catches this too, but bailing here\n // skips the spy / tracing overhead and matches the AC-09 contract that\n // grow runs at most once per frame transition.\n const before = internals.meshSsboState?.slotCount ?? 0;\n if (before > 0 && before >= neededSlots) return { ok: true };\n const result = grow(neededSlots);\n // Note: ok:false has already fired the structured error inside the\n // controller (createRenderer.ts grow factory). Do NOT double-fire here.\n if (!result.ok) return result;\n // Dev-mode visibility — only on a real slotCount transition (skip\n // no-op idempotent paths above; ceiling path returned early on ok:false).\n const after = internals.meshSsboState?.slotCount ?? before;\n if (after !== before) {\n // Module-local binding read (NOT `recordModule.devModeProbe`) so vitest\n // ESM-readonly export forced us to expose the probe as a settable holder\n // (`setMeshSsboDevModeProbeForTests`) instead of a `vi.spyOn` target.\n if (meshSsboDevModeProbe()) {\n // biome-ignore lint/suspicious/noConsole: AC-11 mandates a `[mesh-ssbo]` info line in dev mode (vite build dead-strips this branch via the `import.meta.env.DEV` constant fold; tsup / esbuild prod sets NODE_ENV=production).\n console.info(\n '[mesh-ssbo] grew slotCount: %d -> %d (requested=%d)',\n before,\n after,\n neededSlots,\n );\n }\n }\n return result;\n}\n\n/**\n * Test seam: a closure-local function pointer ensureMeshSsboCapacity reads\n * for the dev-mode gate. Defaults to `isMeshSsboDevMode`; tests swap it out\n * via `setMeshSsboDevModeProbeForTests` because vitest 4.x export bindings\n * are non-writable (ESM spec) and `import.meta.env.DEV` is build-time-frozen\n * by the vite transform — neither `vi.spyOn(recordModule, 'isMeshSsboDevMode')`\n * nor `vi.stubEnv('DEV', false)` toggles it at runtime.\n */\nlet meshSsboDevModeProbe: () => boolean = isMeshSsboDevMode;\n\n/**\n * @internal — test-only injection seam for `ensureMeshSsboCapacity`'s\n * dev-mode gate. Pass `undefined` to restore the production probe\n * (`isMeshSsboDevMode`). Production code paths NEVER call this.\n */\nexport function setMeshSsboDevModeProbeForTests(probe: (() => boolean) | undefined): void {\n meshSsboDevModeProbe = probe ?? isMeshSsboDevMode;\n}\n\n/**\n * Dev-mode probe for `ensureMeshSsboCapacity`'s console.info gate\n * (plan-strategy §2.D-3 + AC-11). True when the build is in dev mode:\n * - `import.meta.env?.DEV` is truthy (vite dev / vitest), OR\n * - `process.env.NODE_ENV !== 'production'` (esbuild / tsup / dawn-node).\n * Optional-chain keeps it safe in non-vite ESM envs that never inject\n * `import.meta.env` (the chain short-circuits to undefined → falsy).\n *\n * Vite's `import.meta.env.DEV` is constant-folded at build time, so the\n * production bundle dead-code-strips the entire branch even though the\n * test fall-through reads `process.env.NODE_ENV`.\n *\n * @internal — exported as a function (not a const) so unit tests can\n * `vi.spyOn(...).mockReturnValue(false)` to exercise the dev=false path\n * (vitest 4.x cannot toggle `import.meta.env.DEV` at runtime — it is\n * compile-time-frozen by the vite transform).\n */\nexport function isMeshSsboDevMode(): boolean {\n const importMetaDev = (import.meta as { env?: { DEV?: unknown } }).env?.DEV;\n if (importMetaDev) return true;\n // Fallback for tsup / esbuild / dawn-node where import.meta.env is absent:\n // NODE_ENV !== 'production' counts as dev. NODE_ENV unset (undefined)\n // also counts as dev so test envs without explicit NODE_ENV log too —\n // production builds always set NODE_ENV='production'. We read process via\n // globalThis to keep this file @types/node-free (rest of the package is\n // browser-typed; engine-runtime ships ESM into both browser + dawn-node).\n const proc = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process;\n if (proc !== undefined && proc.env?.NODE_ENV === 'production') return false;\n if (proc === undefined) return false;\n return true;\n}\n\n/**\n * Module-scoped reusable scratch for batched mesh-SSBO uploads (O2).\n * Grows monotonically; never shrinks. One allocation per render session\n * instead of one per entity per frame.\n *\n * @internal\n */\nlet _meshSsboScratch = new Uint8Array(0);\n/** @internal */\nlet _meshSsboScratchFloats = new Float32Array(0);\n\n/**\n * feat-20260704 M3/w21: per-renderable `entity_world` upload (batched). All N\n * mat4+normalMatrix slots are assembled into a single contiguous scratch\n * buffer, then flushed as one `writeBuffer` call instead of N individual\n * calls. Extracted verbatim from `recordFrame` (frame.ts) — the module-scoped\n * `_meshSsboScratch` let and its only reassignment site now co-locate in this\n * file so the two mesh-SSBO module lets live together (AC-06).\n *\n * feat-20260518 M3 / w14 (AC-08): each 256-byte slot carries a 16-float mat4\n * at [0..64B) and a 48-byte mat3 normalMatrix at [64..112B) (3 vec4 columns;\n * padding at indices 19/23/27 stays 0). The mat3 =\n * transpose(invert(mat3(worldFromLocal))) for correct normal transform under\n * non-uniform scale.\n *\n * feat-20260622-chunk-gpu-instancing-sprite-tilemap M1 / w4-record-swap (D-1):\n * fold-bucket heads write identity into their slot; the fold path assembles\n * per-instance world matrices into the @group(3) instances buffer instead\n * (sprite/unlit shaders ignore normals; AC-01/AC-02).\n *\n * @internal\n */\nexport function uploadMeshSsboBatch(\n queue: RhiQueue,\n meshStorageBuffer: { readonly buffer: Buffer },\n validatedOrdered: readonly ValidatedRenderable[],\n foldDispatchPlan: FoldDispatchPlan | null,\n startSlot = 0,\n): void {\n const slotCount = validatedOrdered.length;\n const neededBytes = slotCount * MESH_PER_ENTITY_STRIDE;\n // Grow the module-scoped scratch monotonically; zero the used range.\n if (_meshSsboScratch.length < neededBytes) {\n _meshSsboScratch = new Uint8Array(neededBytes);\n _meshSsboScratchFloats = new Float32Array(_meshSsboScratch.buffer);\n } else {\n _meshSsboScratch.fill(0, 0, neededBytes);\n }\n const normalMatrixScratch = mat3.create();\n const strideFloats = MESH_PER_ENTITY_STRIDE / Float32Array.BYTES_PER_ELEMENT;\n for (let i = 0; i < slotCount; i++) {\n const entry = validatedOrdered[i];\n if (entry === undefined) continue;\n // Address the reusable flat view directly. Constructing one typed-array\n // wrapper per visible entity made this otherwise contiguous upload create\n // tens of thousands of short-lived JS objects every frame.\n const slot = i * strideFloats;\n const isFoldHead = foldDispatchPlan?.headBuckets.has(i) === true;\n if (isFoldHead) {\n // identity mat4\n _meshSsboScratchFloats[slot] = 1;\n _meshSsboScratchFloats[slot + 5] = 1;\n _meshSsboScratchFloats[slot + 10] = 1;\n _meshSsboScratchFloats[slot + 15] = 1;\n // identity mat3 normal (cols at slot offsets 16/20/24)\n _meshSsboScratchFloats[slot + 16] = 1;\n _meshSsboScratchFloats[slot + 20] = 1;\n _meshSsboScratchFloats[slot + 24] = 1;\n // Fold heads use the instance storage path; keep the mesh temporal\n // fields deterministic for shader variants that still read the slot.\n _meshSsboScratchFloats[slot + 28] = 1;\n _meshSsboScratchFloats[slot + 33] = 1;\n _meshSsboScratchFloats[slot + 38] = 1;\n _meshSsboScratchFloats[slot + 43] = 1;\n _meshSsboScratchFloats[slot + 44] = 1;\n _meshSsboScratchFloats[slot + 45] = 1;\n } else {\n const worldFromLocal = entry.source.transform.world;\n for (let k = 0; k < 16; k++) _meshSsboScratchFloats[slot + k] = worldFromLocal[k] ?? 0;\n const normal = mat3.normalMatrix(normalMatrixScratch, worldFromLocal);\n _meshSsboScratchFloats[slot + 16] = normal[0] ?? 0;\n _meshSsboScratchFloats[slot + 17] = normal[1] ?? 0;\n _meshSsboScratchFloats[slot + 18] = normal[2] ?? 0;\n _meshSsboScratchFloats[slot + 20] = normal[3] ?? 0;\n _meshSsboScratchFloats[slot + 21] = normal[4] ?? 0;\n _meshSsboScratchFloats[slot + 22] = normal[5] ?? 0;\n _meshSsboScratchFloats[slot + 24] = normal[6] ?? 0;\n _meshSsboScratchFloats[slot + 25] = normal[7] ?? 0;\n _meshSsboScratchFloats[slot + 26] = normal[8] ?? 0;\n const previousWorld = entry.source.temporal?.previousTransform.world ?? worldFromLocal;\n for (let k = 0; k < 16; k++) {\n _meshSsboScratchFloats[slot + 28 + k] = previousWorld[k] ?? 0;\n }\n let reactiveMaterial = false;\n for (const material of entry.source.materials) {\n const shader = material.materialShaderId;\n if (\n material.transparent === true ||\n shader === 'forgeax::sprite' ||\n shader === 'forgeax::sprite-lit' ||\n (shader !== undefined && !shader.startsWith('forgeax::'))\n ) {\n reactiveMaterial = true;\n break;\n }\n }\n _meshSsboScratchFloats[slot + 44] =\n entry.source.temporal?.reactive === true || reactiveMaterial ? 1 : 0;\n _meshSsboScratchFloats[slot + 45] = entry.source.temporal?.motionValid === false ? 0 : 1;\n }\n }\n if (neededBytes > 0) {\n const meshUpload = queue.writeBuffer(\n meshStorageBuffer.buffer,\n startSlot * MESH_PER_ENTITY_STRIDE,\n _meshSsboScratch,\n 0,\n neededBytes,\n );\n if (!meshUpload.ok) throw meshUpload.error;\n }\n}\n\n/**\n * Per-bucket descriptor produced by {@link foldDispatchBuckets}.\n *\n * One bucket = one fold-eligible run of consecutive DispatchEntry whose\n * `(layer, sortKey, materialHandle)` triple is equal. Singleton buckets\n * (bucketSize=1) appear when the mode bypasses fold (D-5 mode 2/3) or\n * when consecutive entries differ in one of the three keys.\n *\n * Fields:\n * - `entries` — original DispatchEntry slice for this bucket (preserves\n * the input ordering); the consumer uses these to look up per-entity\n * material BG handles, mesh handles (which are bucket-uniform by\n * construction since materialHandle key is included), etc.\n * - `bucketSize` — `entries.length`. Surfaced as a top-level field so\n * the consumer can pass it directly as `instanceCount` to\n * `drawIndexed`.\n * - `transforms` — assembled Float32Array of bucketSize world mat4s,\n * stride=16 floats per instance, column-major. Suitable for direct\n * `device.queue.writeBuffer` into an instance buffer used at @group(3).\n * - `materialHandle` / `layer` / `sortKey` — the three-tuple key for this\n * bucket. `sortKey` is mode-dependent: posZ (world[14]) for mode 0\n * (LAYER_Z), posY (world[13]) for mode 1 (LAYER_Y). Consumed by the\n * dispatch loop for bind-group selection / sort-stability invariants.\n */\nexport interface FoldBucket {\n readonly entries: readonly DispatchEntry[];\n readonly bucketSize: number;\n readonly transforms: Float32Array;\n readonly materialHandle: number;\n readonly layer: number;\n readonly sortKey: number;\n}\n\n/**\n * Minimal renderable shape consumed by the helper. The real\n * `RenderableSnapshot` carries many more fields; the helper only reads\n * `transform.world` (a Float32Array of 16 column-major floats) and\n * `material.transparent` (the LDR-split-sub-pass fold gate, see PR #502\n * fix + feat-20260625 R2 fix-up: geometry-pass entities — non-transparent\n * materials — MUST stay singleton because the sprite-pass dispatch path\n * that consumes `headBuckets` does not run for them; folding them would\n * overwrite their mesh-SSBO slot with identity and collapse 3D geometry\n * to origin).\n *\n * Production callers pass `RenderableSnapshot[]` straight through —\n * `RenderableSnapshot.material.transparent` is `boolean | undefined`\n * (derived by the extract stage from `passes[0].renderState.blend !==\n * undefined`, the post-feat-20260626-collapse SSOT; see\n * `MaterialSnapshot.transparent`), structurally compatible with this\n * minimal shape. The gate read inside the helper uses `=== true` /\n * `!== true` so both `false` and `undefined` enter the singleton branch.\n *\n * feat-20260625-refactor-sprite-as-transparent-mesh R2 fix-up: the\n * transparent flag identifies the LDR split sub-pass, while the shader id\n * identifies the sprite owner that is safe to fold. Standard PBR Alpha Blend\n * remains singleton so its geometry pass keeps one projection row per draw.\n */\nexport interface FoldRenderableLike {\n readonly transform: { readonly world: Float32Array };\n readonly material: { readonly transparent?: boolean | undefined };\n}\n\nconst FOLDABLE_TRANSPARENT_SHADER_IDS = new Set(['forgeax::sprite', 'forgeax::sprite-lit']);\n\nfunction isFoldEligible(entry: DispatchEntry, renderables: readonly FoldRenderableLike[]): boolean {\n return (\n renderables[entry.renderableIndex]?.material.transparent === true &&\n entry.materialShaderId !== undefined &&\n FOLDABLE_TRANSPARENT_SHADER_IDS.has(entry.materialShaderId)\n );\n}\n\n/**\n * Linear-scan fold operator (plan-strategy D-1).\n *\n * Walks `orderedEntries` (must be transparent-sort-ordered when mode=0;\n * the helper trusts the input ordering and only checks adjacent equality\n * — non-consecutive entries with equal keys are NOT merged, preserving\n * stable-sort semantics).\n *\n * @param orderedEntries — DispatchEntry[] in transparent-sort order. Empty\n * array yields zero buckets (defensive empty-bucket suppression).\n * @param mode — current `TransparentSortConfig.mode`. Modes 0 (LAYER_Z)\n * and 1 (LAYER_Y) enable fold using the appropriate sort-axis coordinate\n * (posZ / posY respectively). Modes 2 and 3 produce singleton buckets\n * per entry (D-5 bypass).\n * @param renderables — parallel snapshot array indexed by\n * `DispatchEntry.renderableIndex`. The helper reads `transform.world`\n * to (a) extract the sort-axis coordinate for the bucket key (posZ\n * world[14] for mode 0, posY world[13] for mode 1), and (b) copy 16\n * floats per entry into the assembled transforms buffer. Out-of-range /\n * missing renderables defensively contribute a zero mat4 slot.\n * @returns Array of FoldBucket descriptors in input order.\n */\nexport function foldDispatchBuckets(\n orderedEntries: readonly DispatchEntry[],\n mode: TransparentSortConfig['mode'],\n renderables: readonly FoldRenderableLike[],\n): readonly FoldBucket[] {\n if (orderedEntries.length === 0) return [];\n\n // Bypass branch (D-5): modes 2 (LAYER_YZ) and 3 (DISTANCE) cannot fold\n // — their sort keys are composite foot-Y formulas or per-entity camera\n // distances, not reducible to a single world-mat4 coordinate read.\n // Each entry produces its own singleton bucket; the dispatch consumer\n // treats bucketSize=1 identically to per-entity drawIndexed (charter P3\n // silent fallback — no error fired).\n //\n // Mode 1 (LAYER_Y) falls through to the fold branch below and uses posY\n // (world[13]) as the sort-axis bucket key.\n if (mode !== TRANSPARENT_SORT_MODE_LAYER_Z && mode !== TRANSPARENT_SORT_MODE_LAYER_Y) {\n const out: FoldBucket[] = [];\n for (let i = 0; i < orderedEntries.length; i++) {\n const e = orderedEntries[i];\n if (e === undefined) continue;\n out.push(makeSingletonBucket(e, renderables, mode));\n }\n return out;\n }\n\n // Fold branch (mode 0 = LAYER_Z, mode 1 = LAYER_Y): linear scan, collect\n // runs with equal (layer, sortKey, materialHandle). sortKey is posZ for\n // mode 0, posY for mode 1 — see readSortKey().\n //\n // Transparent-pass-only gate (PR #502 fix + feat-20260625 R2 fix-up):\n // the only dispatch site that consumes `headBuckets` to emit one\n // instanced drawIndexed per bucket is the transparent-pass loop in\n // `render-system-record.ts` (~line 5500; routed via `splitLdrSprite`\n // filter on `material.transparent === true`). The geometry-pass loop\n // (~line 4660) iterates `validatedOrdered` and emits per-entity\n // drawIndexed unchanged; it does NOT branch on `headBuckets`. So when\n // a non-transparent entry (geometry-pass: unlit / standard-PBR / skin)\n // is folded into a multi-entry bucket, the mesh-SSBO upload loop\n // (~line 2710) still overwrites its mesh slot with identity (because\n // `headBuckets.has(i)` is true), but the geometry-pass then reads\n // identity and renders the 3D geometry at the origin — collapsing the\n // frame to black (hello-room CI regression).\n //\n // Concept-count fix: encode \"fold is transparent-sprite-sub-pass-only\" at the\n // head selection point — the gate is the single bucket-key invariant\n // that makes both dispatch sites correct without coupling identity-\n // overwrite logic to a separate check (avoiding the D-9 shared-exit\n // violation that selecting fix-location B would produce).\n //\n // Non-transparent entries (`transparent !== true`) always produce\n // singleton buckets (bucketSize=1), which `buildFoldDispatchPlan`\n // filters out (`if (bucket.bucketSize <= 1) continue`), so they never\n // enter `headBuckets` / `skipIndices` — the mesh-SSBO upload,\n // transparent-pass, and geometry-pass loops all see them as byte-\n // identical to the pre-fold per-entity path.\n //\n // feat-20260625 R2 fix-up: pre-feat the gate was `shadingModel ===\n // 'sprite'`; M3 / w15 narrowed the shadingModel union to\n // `'unlit' | undefined`. The current gate retains the transparent SSOT\n // and adds the explicit sprite shader identity so Standard PBR Alpha Blend\n // cannot enter this fold path.\n const buckets: FoldBucket[] = [];\n let runStart = 0;\n while (runStart < orderedEntries.length) {\n const head = orderedEntries[runStart];\n if (head === undefined) {\n runStart += 1;\n continue;\n }\n // Transparent-pass-only gate (feat-20260625 R2 fix-up): non-transparent\n // heads emit a singleton bucket and advance the cursor by 1 — no run\n // extension. `RenderableSnapshot.material.transparent` is the SSOT\n // carrier (extract stage derives it from the first pass's\n // `renderState.blend !== undefined`, post-feat-20260626-collapse;\n // see `MaterialSnapshot.transparent`).\n if (!isFoldEligible(head, renderables)) {\n buckets.push(makeSingletonBucket(head, renderables, mode));\n runStart += 1;\n continue;\n }\n const headSortKey = readSortKey(mode, head.renderableIndex, renderables);\n let runEnd = runStart + 1;\n while (runEnd < orderedEntries.length) {\n const cand = orderedEntries[runEnd];\n if (cand === undefined) break;\n if (cand.layer !== head.layer) break;\n if (cand.materialHandle !== head.materialHandle) break;\n // Defensive: cand transparent must also be true to join the run.\n // Same materialHandle implies same transparent flag in production\n // (material asset identity), but the check costs O(1) per cand and\n // makes the bucket invariant locally readable.\n if (!isFoldEligible(cand, renderables)) break;\n const candSortKey = readSortKey(mode, cand.renderableIndex, renderables);\n if (candSortKey !== headSortKey) break;\n runEnd += 1;\n }\n\n const run = orderedEntries.slice(runStart, runEnd);\n const transforms = assembleTransforms(run, renderables);\n buckets.push({\n entries: run,\n bucketSize: run.length,\n transforms,\n materialHandle: head.materialHandle,\n layer: head.layer,\n sortKey: headSortKey,\n });\n runStart = runEnd;\n }\n return buckets;\n}\n\nfunction makeSingletonBucket(\n entry: DispatchEntry,\n renderables: readonly FoldRenderableLike[],\n mode: TransparentSortConfig['mode'],\n): FoldBucket {\n const transforms = new Float32Array(16);\n const w = renderables[entry.renderableIndex]?.transform.world;\n if (w !== undefined) transforms.set(w);\n const sortKey = readSortKey(mode, entry.renderableIndex, renderables);\n return {\n entries: [entry],\n bucketSize: 1,\n transforms,\n materialHandle: entry.materialHandle,\n layer: entry.layer,\n sortKey,\n };\n}\n\nfunction assembleTransforms(\n run: readonly DispatchEntry[],\n renderables: readonly FoldRenderableLike[],\n): Float32Array {\n const out = new Float32Array(run.length * 16);\n for (let i = 0; i < run.length; i++) {\n const e = run[i];\n if (e === undefined) continue;\n const w = renderables[e.renderableIndex]?.transform.world;\n if (w !== undefined) out.set(w, i * 16);\n }\n return out;\n}\n\nfunction readSortKey(\n mode: TransparentSortConfig['mode'],\n renderableIndex: number,\n renderables: readonly FoldRenderableLike[],\n): number {\n const w = renderables[renderableIndex]?.transform.world;\n if (w === undefined) return 0;\n // mode 0 (LAYER_Z): sort-axis is Z, column 3 row 2 = world[14].\n // mode 1 (LAYER_Y): sort-axis is Y, column 3 row 1 = world[13].\n return ((mode === TRANSPARENT_SORT_MODE_LAYER_Z ? w[14] : w[13]) ?? 0) as number;\n}\n\n/**\n * Per-validatedOrdered-index fold metadata consumed by the record-stage\n * dispatch loops. Built from {@link foldDispatchBuckets} output by\n * {@link buildFoldDispatchPlan}; see plan-strategy §3.2 sequence diagram.\n *\n * Field semantics (consumer contract, w4-record-swap):\n * - `headBuckets[i]` is non-null when validatedOrdered index `i` is the\n * **bucket head** of a non-singleton (bucketSize > 1) fold bucket. The\n * dispatch loop overrides @group(3) instances BG to a transient buffer\n * holding `bucket.transforms` and emits `drawIndexed(idxCount,\n * bucket.bucketSize)` instead of per-entity drawIndexed.\n * - `skipIndices.has(i)` is true when index `i` is a non-head member of\n * a non-singleton fold bucket; the dispatch loop emits `continue`.\n * - Singleton buckets (bucketSize === 1) leave both arrays empty for\n * that index — dispatch falls through to the existing per-entity path\n * byte-identically (mode-bypass / non-foldable head / fold-disabled).\n *\n * Note: the maps are keyed on `validatedOrderedIndex`, NOT\n * `renderableIndex`. The dispatch loops iterate `validatedOrdered` by\n * positional index `i`, and that index drives mesh SSBO slot offset\n * (`i * MESH_PER_ENTITY_STRIDE`), material UBO slot, and per-entity bind\n * group cache keys, all of which the swap must coordinate with.\n */\nexport interface FoldDispatchPlan {\n readonly headBuckets: ReadonlyMap<number, FoldBucket>;\n readonly skipIndices: ReadonlySet<number>;\n readonly foldedBucketCount: number;\n}\n\n/**\n * Build the per-validatedOrdered-index fold metadata from a\n * {@link foldDispatchBuckets} output.\n *\n * @param buckets — output of {@link foldDispatchBuckets}; ordered by\n * transparent-sort scan order.\n * @param renderableIndexToValidatedIndex — map from `DispatchEntry.renderableIndex`\n * to the validated-ordered index `i` (the loop counter the dispatch\n * loops use). Caller builds this once per frame from `validatedOrdered`.\n * @returns FoldDispatchPlan keyed by validated-ordered index.\n *\n * Empty / all-singleton input yields empty maps + `foldedBucketCount=0`,\n * which the dispatch loops treat as \"no fold this frame\" — byte-identical\n * to pre-feat behavior.\n */\nexport function buildFoldDispatchPlan(\n buckets: readonly FoldBucket[],\n renderableIndexToValidatedIndex: ReadonlyMap<number, number>,\n): FoldDispatchPlan {\n const headBuckets = new Map<number, FoldBucket>();\n const skipIndices = new Set<number>();\n let foldedBucketCount = 0;\n for (const bucket of buckets) {\n if (bucket.bucketSize <= 1) continue;\n const headEntry = bucket.entries[0];\n if (headEntry === undefined) continue;\n const headValidatedIdx = renderableIndexToValidatedIndex.get(headEntry.renderableIndex);\n if (headValidatedIdx === undefined) continue;\n headBuckets.set(headValidatedIdx, bucket);\n foldedBucketCount += 1;\n for (let i = 1; i < bucket.entries.length; i++) {\n const memberEntry = bucket.entries[i];\n if (memberEntry === undefined) continue;\n const memberValidatedIdx = renderableIndexToValidatedIndex.get(memberEntry.renderableIndex);\n if (memberValidatedIdx === undefined) continue;\n skipIndices.add(memberValidatedIdx);\n }\n }\n return { headBuckets, skipIndices, foldedBucketCount };\n}\n\n/**\n * WebGL2 uniform-fallback per-bucket instance-count ceiling\n * (feat-20260622-chunk-gpu-instancing-sprite-tilemap M2 / D-2 +\n * research N-1).\n *\n * 128 instances * 64 B/mat4 stride = 8192 B, comfortably below the WebGL2\n * minimum 16384 B UBO size, leaving headroom for the per-frame material\n * UBO slice. Locked at the type level via `RhiInstancingExceedsUniformCapDetail.limit`\n * (literal 128) — a future cap change would be a major evolution, not a\n * runtime knob.\n */\nexport const FOLD_UNIFORM_INSTANCE_CAP = 128;\n\n/**\n * Minimal `RhiCapabilities` shape consumed by the cap-fallback helper.\n *\n * The real `RhiDevice.caps` carries many feature flags; the helper only\n * reads `storageBuffer` (the WebGL2 / WebGPU split signal — true on\n * WebGPU + dawn / wgpu native paths, false on the WebGL2 uniform-only\n * fallback path). Mirrors the field name on the production `RhiCaps`\n * type so the dispatch site can pass `runtime.device.caps` straight in.\n */\nexport interface FoldCapsLike {\n readonly storageBuffer: boolean;\n}\n\n/**\n * Decision POD returned by {@link evaluateFoldBucketUniformCap}.\n *\n * Fields:\n * - `fallback` — `true` when the bucket must NOT fold and the dispatch\n * site must route it through the per-entity drawIndexed exit (the\n * same exit the mode-gate bypass uses, plan-strategy D-9 \"shared\n * fallback exit\"). `false` when the bucket can fold normally.\n * - `error` — the structured RhiError to fire alongside the fallback.\n * Always populated when `fallback === true`; always `undefined` when\n * `fallback === false` (charter proposition 4: explicit failure on\n * the failure path; silent success on the success path).\n *\n * Caller contract: when `fallback === true`, fire the error via the\n * runtime error registry AND draw the bucket's entries individually\n * (each as a 1-instance drawIndexed). Skipping the fallback while still\n * firing the error would leave the frame visually wrong (uniform buffer\n * write would clip at 128 entries).\n */\nexport interface FoldBucketCapDecision {\n readonly fallback: boolean;\n readonly error: RhiError | undefined;\n}\n\n/**\n * Decide whether a fold bucket fits the WebGL2 uniform-fallback per-bucket\n * instance-count ceiling, returning the structured RhiError + fallback\n * intent the dispatch site needs to act on\n * (feat-20260622-chunk-gpu-instancing-sprite-tilemap M2 / w11 +\n * plan-strategy D-2 + D-9 + AC-05).\n *\n * Decision matrix:\n *\n * | caps.storageBuffer | bucketSize | fallback | error |\n * |:--|:--|:--|:--|\n * | `true` | every | `false` | `undefined` (WebGPU has no per-binding instance cap inside the storage buffer's `maxStorageBufferBindingSize`; the byte-cap path emits `'limit-exceeded'` separately) |\n * | `false` | `<= 128` | `false` | `undefined` (fits inside the WebGL2 minimum 16384 B UBO with headroom) |\n * | `false` | `> 128` | `true` | `RhiError({ code: 'instancing-exceeds-uniform-cap', detail: { requested, limit: 128, scope } })` |\n *\n * Singleton buckets (`bucketSize === 1`) always pass — they are the\n * mode-gate bypass output and never need the cap check (the cap is\n * about *folded* bucket arity, not about per-entity per-frame work).\n *\n * @param bucket — the FoldBucket whose `bucketSize` is the sole input\n * (instance count = bucketSize); other fields are not consulted.\n * @param caps — the runtime's RHI capability flags\n * (`runtime.device.caps`); only `storageBuffer` is read.\n * @param scope — closed `'sprite' | 'tilemap-chunk'` discriminator the\n * dispatch site picks based on the call site (sprite-pass primary\n * sprite entry vs tilemap-chunk-derived entry). Surfaced verbatim on\n * the error's `.detail.scope` so AI users can branch their recovery\n * on which dispatch site overflowed.\n * @returns a {@link FoldBucketCapDecision} POD; never throws.\n */\nexport function evaluateFoldBucketUniformCap(\n bucket: FoldBucket,\n caps: FoldCapsLike,\n scope: 'sprite' | 'tilemap-chunk',\n): FoldBucketCapDecision {\n if (caps.storageBuffer) return { fallback: false, error: undefined };\n if (bucket.bucketSize <= FOLD_UNIFORM_INSTANCE_CAP) {\n return { fallback: false, error: undefined };\n }\n const error = new RhiError({\n code: 'instancing-exceeds-uniform-cap',\n expected: `bucket instance count <= ${FOLD_UNIFORM_INSTANCE_CAP} (uniform fallback cap)`,\n hint: `reduce the bucket size (smaller layer/material groupings), switch to a WebGPU-capable backend (storage buffers lift the cap), or accept the per-cell drawIndexed fallback for ${scope}`,\n detail: {\n requested: bucket.bucketSize,\n limit: FOLD_UNIFORM_INSTANCE_CAP,\n scope,\n },\n });\n return { fallback: true, error };\n}\n\n/**\n * Closed metric key for the AC-06 fold counter\n * (feat-20260622-chunk-gpu-instancing-sprite-tilemap M3 / D-3).\n *\n * Semantics — count of instanced `drawIndexed` calls the fold operator\n * emits this frame; one increment per non-singleton head bucket retained\n * after the M2 / w11 cap-fallback filter. NOT entity count, NOT pre-\n * filter bucket count — cap-overrun buckets that the dispatch site\n * routed through the per-entity fallback exit do not count.\n *\n * Naming follows the EngineMetrics dot-namespace convention\n * (`<feature>.<event>`); `render.instancing.*` covers both sprite and\n * tilemap-chunk dispatch sites without scope ambiguity (research F-5,\n * plan-strategy §8.2). The owning host evidence reads\n * `ownerMetrics.snapshot()['render.instancing.foldedDraws']`.\n */\nexport const FOLDED_DRAWS_METRIC_KEY = 'render.instancing.foldedDraws';\n\n/**\n * Minimal `EngineMetrics` shape consumed by {@link incrementFoldedDrawsMetric}.\n *\n * The real `EngineMetrics` carries `snapshot()` + `reset()` too; the\n * helper only writes, so the consumed surface narrows to a single\n * method. Lets the unit test inject a `vi.fn()` mock without faking the\n * read APIs.\n */\nexport interface FoldMetricsLike {\n increment(name: string): void;\n}\n\n/**\n * Bump the AC-06 `render.instancing.foldedDraws` counter once per fold-\n * eligible head bucket in `plan` (M3 / w13, plan-strategy D-3).\n *\n * Single counter-write site for the metric — the record-stage consumer\n * calls this once per `recordFrame` after the cap-fallback filter\n * (M2 / w11) so cap-overrun buckets do not contribute (their members\n * fall through to per-entity drawIndexed, which is not an instanced\n * draw). `plan.foldedBucketCount` is the SSOT for \"how many instanced\n * drawIndexed will this frame emit\"; passing the same plan to this\n * helper keeps the metric and the actual dispatch in lockstep.\n *\n * Mode-bypass plans (D-5: mode != 0 yields singleton-only buckets which\n * `buildFoldDispatchPlan` filters out) carry `foldedBucketCount === 0`\n * and produce no increments — per-entity drawIndexed is not folded so\n * the metric correctly stays at 0.\n *\n * @param plan — output of {@link buildFoldDispatchPlan} after possible\n * cap-fallback filtering by the record-stage consumer.\n * @param metrics — the owner-provided EngineMetrics counter; only\n * `increment(name)` is called. Empty `plan.foldedBucketCount === 0`\n * produces zero calls (no metric churn for fold-disabled frames).\n */\nexport function incrementFoldedDrawsMetric(plan: FoldDispatchPlan, metrics: FoldMetricsLike): void {\n for (let i = 0; i < plan.foldedBucketCount; i++) {\n metrics.increment(FOLDED_DRAWS_METRIC_KEY);\n }\n}\n","// @forgeax/engine-runtime — SSAO per-runtime persistent GPU buffers.\n//\n// feat-20260612-hdrp-ssao M1 / w4.\n//\n// Owner of 3 SSAO GPU resources, lazily allocated per RenderSystemRuntime,\n// following the getOrCreateHdrpBuffers WeakMap pattern (research F12):\n// (1) kernel UBO — 64 padded vec4 samples (1024 B), label hdrp-ssao-kernel\n// (2) noise texture — 4x4 rgba32float, label hdrp-ssao-noise, NEAREST/REPEAT\n// (3) uniform UBO — 3 mat4 + vec4 intensityPad (256 B aligned),\n// label hdrp-ssao-uniform\n//\n// plan-strategy D-1: uniform carries view + projection + inverseProjection.\n// plan-strategy D-C: intensity, radius, and bias are carried at offset 192\n// (the existing vec4 slot), so the lighting shader can mix(1.0, ssao*ao,\n// intensity) without a new UBO.\n// The kernel uses a uniform buffer on every backend. 1024 B is below the\n// WebGL2 minimum fragment UBO size, so SSAO does not need a storage-buffer\n// capability gate.\n\nimport type { Buffer, Sampler, Texture, TextureView } from '@forgeax/engine-rhi';\nimport { GPU_TEXTURE_USAGE_COPY_DST, GPU_TEXTURE_USAGE_TEXTURE_BINDING } from './gpu-texture-usage';\nimport { GPU_BUFFER_USAGE_COPY_DST, GPU_BUFFER_USAGE_UNIFORM } from './gpu-usage';\nimport type { RenderSystemRuntime } from './record/render-context';\n\n// Deterministic host-side SSAO data is owned by the buffer allocator because\n// these values have no consumer outside the resources they initialize.\nexport const SSAO_KERNEL_SAMPLE_COUNT = 64;\nconst NOISE_SIZE = 16;\n\nfunction mulberry32(seed: number): () => number {\n let state = seed | 0;\n return () => {\n state = (state + 0x6d2b79f5) | 0;\n let t = Math.imul(state ^ (state >>> 15), 1 | state);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\nfunction lerp(a: number, b: number, t: number): number {\n return a + t * (b - a);\n}\n\nexport function generateSsaoKernel(seed: number = 0): readonly Float32Array[] {\n const rand = mulberry32(seed);\n const kernel: Float32Array[] = [];\n for (let i = 0; i < SSAO_KERNEL_SAMPLE_COUNT; i++) {\n let x = rand() * 2 - 1;\n let y = rand() * 2 - 1;\n let z = rand();\n const len = Math.sqrt(x * x + y * y + z * z);\n x /= len;\n y /= len;\n z /= len;\n const r = rand();\n x *= r;\n y *= r;\n z *= r;\n const scale = lerp(0.1, 1.0, (i / SSAO_KERNEL_SAMPLE_COUNT) ** 2);\n const sample = new Float32Array(3);\n sample[0] = x * scale;\n sample[1] = y * scale;\n sample[2] = z * scale;\n kernel.push(sample);\n }\n return kernel;\n}\n\nexport function generateSsaoNoise(seed: number = 0): Float32Array {\n const rand = mulberry32(seed);\n const noise = new Float32Array(NOISE_SIZE * 3);\n for (let i = 0; i < NOISE_SIZE; i++) {\n noise[i * 3 + 0] = rand() * 2 - 1;\n noise[i * 3 + 1] = rand() * 2 - 1;\n noise[i * 3 + 2] = 0;\n }\n return noise;\n}\n\n// Each vec3<f32> in a WGSL array is 16B (12B payload + 4B padding).\n// 64 samples * 16 B/sample = 1024 B.\nconst BYTES_PER_KERNEL_ELEMENT = 16;\n\n// SSAO uniform layout (plan-strategy §D-1 + §D-C, M7 round-2):\n// bytes [0..63] view mat4x4<f32>\n// bytes [64..127] projection mat4x4<f32>\n// bytes [128..191] inverseProjection mat4x4<f32>\n// bytes [192..207] intensityPad vec4<f32> // x = intensity, y = radius, z = bias, w = pad\n// bytes [208..255] padding // align to 256B WebGPU UBO offset\n//\n// The total is rounded to 256B so the same UBO can host an additional\n// shader-side scalar binding at the tail without re-allocation.\nconst UNIFORM_INTENSITY_OFFSET_BYTES = 192;\nconst UNIFORM_BYTES = 256;\nexport const SSAO_UNIFORM_INTENSITY_OFFSET = UNIFORM_INTENSITY_OFFSET_BYTES;\nexport const SSAO_UNIFORM_BYTES = UNIFORM_BYTES;\n\n// ── 1x1 white fallback texture (plan-strategy §D-B) ───────────────────────\n//\n// Single-PSO invariant: the HDRP unified BGL always declares a binding 7\n// texture_2d<f32>. When SSAO is disabled (or its resources are not yet\n// allocated), the bind group binds this 1x1 r8unorm texture filled with\n// 0xFF. r8unorm normalizes 255 -> 1.0, so the lighting shader reads\n// `ssaoFactor = 1.0`, and `mix(1.0, ssao*ao, intensity) = ao` collapses\n// back to the round-1 baseline (ambient = baked-AO only). No shader\n// recompile across enable/disable.\n\ninterface SsaoFallbackResources {\n readonly device: RenderSystemRuntime['device'];\n readonly texture: Texture;\n readonly view: TextureView;\n readonly sampler: Sampler;\n}\n\nconst fallbackCache = new WeakMap<RenderSystemRuntime, SsaoFallbackResources>();\n\n/**\n * Lazily allocate the 1x1 r8unorm white fallback texture + a sampler for\n * SSAO disabled / resource-missing path. Cached per RenderSystemRuntime so\n * subsequent calls reuse the same resources (charter P5 one-owner).\n *\n * Returns `null` if `device.createTexture` / `createTextureView` /\n * `createSampler` / `queue.writeTexture` fails; the caller (createBindGroup)\n * propagates the structured RhiError that landed on `runtime.errorRegistry`.\n */\nexport function getOrCreateSsaoFallbackTexture(\n runtime: RenderSystemRuntime,\n): SsaoFallbackResources | null {\n const cached = fallbackCache.get(runtime);\n if (cached !== undefined && cached.device === runtime.device) return cached;\n if (cached !== undefined) fallbackCache.delete(runtime);\n\n const device = runtime.device;\n const texRes = device.createTexture({\n label: 'hdrp-ssao-fallback-white',\n size: { width: 1, height: 1, depthOrArrayLayers: 1 },\n mipLevelCount: 1,\n sampleCount: 1,\n dimension: '2d',\n format: 'r8unorm',\n usage: GPU_TEXTURE_USAGE_TEXTURE_BINDING | GPU_TEXTURE_USAGE_COPY_DST,\n textureBindingViewDimension: undefined,\n });\n if (!texRes.ok) {\n runtime.errorRegistry.fire(texRes.error);\n return null;\n }\n\n // r8unorm: a single byte 0xFF normalizes to 1.0 (white => AO = 1.0).\n const whitePixel = new Uint8Array([255]);\n const writeRes = device.queue.writeTexture(\n {\n texture: texRes.value,\n mipLevel: 0,\n origin: { x: 0, y: 0, z: 0 },\n },\n whitePixel,\n { offset: 0, bytesPerRow: 256, rowsPerImage: 1 },\n { width: 1, height: 1, depthOrArrayLayers: 1 },\n );\n if (!writeRes.ok) {\n runtime.errorRegistry.fire(writeRes.error);\n return null;\n }\n\n const viewRes = device.createTextureView(texRes.value, {\n label: 'hdrp-ssao-fallback-white-view',\n format: 'r8unorm',\n dimension: '2d',\n aspect: 'all',\n baseMipLevel: 0,\n mipLevelCount: 1,\n baseArrayLayer: 0,\n arrayLayerCount: 1,\n });\n if (!viewRes.ok) {\n runtime.errorRegistry.fire(viewRes.error);\n return null;\n }\n\n const samplerRes = device.createSampler({\n label: 'hdrp-ssao-fallback-sampler',\n magFilter: 'linear',\n minFilter: 'linear',\n mipmapFilter: 'linear',\n addressModeU: 'clamp-to-edge',\n addressModeV: 'clamp-to-edge',\n addressModeW: 'clamp-to-edge',\n });\n if (!samplerRes.ok) {\n runtime.errorRegistry.fire(samplerRes.error);\n return null;\n }\n\n const resources: SsaoFallbackResources = {\n device,\n texture: texRes.value,\n view: viewRes.value,\n sampler: samplerRes.value,\n };\n fallbackCache.set(runtime, resources);\n return resources;\n}\n\n/**\n * SSAO GPU resources owned by this module (plan-strategy D-1, D-4).\n *\n * Fields are readonly per charter P5: one resource, one owner.\n */\nexport interface SsaoBuffers {\n /** Device identity that owns every handle in this bundle. */\n readonly device: RenderSystemRuntime['device'];\n /** 64 padded vec4 uniform buffer for hemisphere samples. */\n readonly kernelBuffer: Buffer;\n readonly kernelBytes: number;\n /** 4x4 rgba32float noise texture for per-pixel TBN rotation. */\n readonly noiseTexture: Texture;\n /** SSAO uniform UBO: view (mat4) + projection (mat4) + inverseProjection (mat4). */\n readonly uniformBuffer: Buffer;\n readonly uniformBytes: number;\n}\n\nconst cache = new WeakMap<RenderSystemRuntime, SsaoBuffers>();\n\n/**\n * Lazily allocate the 3 SSAO GPU resources for `runtime`. Returns the\n * same `SsaoBuffers` object on subsequent calls (per-RenderSystem\n * stable identity, WeakMap).\n *\n * On `device.createBuffer` / `device.createTexture` failure, fires a\n * structured error on the runtime's error registry and returns `null`.\n *\n * @returns SsaoBuffers on success, null if an allocation fails.\n */\nexport function getOrCreateSsaoBuffers(runtime: RenderSystemRuntime): SsaoBuffers | null {\n const cached = cache.get(runtime);\n if (cached !== undefined && cached.device === runtime.device) return cached;\n if (cached !== undefined) cache.delete(runtime);\n\n const device = runtime.device;\n\n // (1) Kernel UBO — 64 padded vec4 samples (1024 B).\n const kernelSamples = generateSsaoKernel();\n const kernelData = new Float32Array(SSAO_KERNEL_SAMPLE_COUNT * 4); // 4 floats per padded vec3\n for (let i = 0; i < SSAO_KERNEL_SAMPLE_COUNT; i++) {\n const s = kernelSamples[i];\n if (s === undefined) continue;\n kernelData[i * 4 + 0] = s[0] ?? 0;\n kernelData[i * 4 + 1] = s[1] ?? 0;\n kernelData[i * 4 + 2] = s[2] ?? 0;\n // kernelData[i * 4 + 3] = 0 (padding for std140 vec3 alignment)\n }\n\n const kernelBufferRes = device.createBuffer({\n label: 'hdrp-ssao-kernel',\n size: SSAO_KERNEL_SAMPLE_COUNT * BYTES_PER_KERNEL_ELEMENT,\n usage: GPU_BUFFER_USAGE_UNIFORM | GPU_BUFFER_USAGE_COPY_DST,\n mappedAtCreation: false,\n });\n if (!kernelBufferRes.ok) {\n runtime.errorRegistry.fire(kernelBufferRes.error);\n return null;\n }\n\n // Upload kernel data to the buffer.\n const kernelWriteRes = device.queue.writeBuffer(kernelBufferRes.value, 0, kernelData);\n if (!kernelWriteRes.ok) {\n runtime.errorRegistry.fire(kernelWriteRes.error);\n return null;\n }\n\n // (2) Noise texture — 4x4 rgba32float, NEAREST/REPEAT.\n const noiseData = generateSsaoNoise();\n // Pad to rgba32float: 16 texels * 4 floats = 64 floats.\n const noiseRgba = new Float32Array(16 * 4);\n for (let i = 0; i < 16; i++) {\n noiseRgba[i * 4 + 0] = noiseData[i * 3 + 0] ?? 0;\n noiseRgba[i * 4 + 1] = noiseData[i * 3 + 1] ?? 0;\n noiseRgba[i * 4 + 2] = 0;\n noiseRgba[i * 4 + 3] = 1; // alpha = 1 for rgba32float\n }\n\n const noiseTexRes = device.createTexture({\n label: 'hdrp-ssao-noise',\n size: { width: 4, height: 4, depthOrArrayLayers: 1 },\n mipLevelCount: 1,\n sampleCount: 1,\n dimension: '2d',\n format: 'rgba32float',\n usage: GPU_TEXTURE_USAGE_COPY_DST | GPU_TEXTURE_USAGE_TEXTURE_BINDING,\n textureBindingViewDimension: undefined,\n });\n if (!noiseTexRes.ok) {\n runtime.errorRegistry.fire(noiseTexRes.error);\n return null;\n }\n\n // Direct CPU-to-GPU upload via writeTexture (no alignment requirement\n // unlike copyBufferToTexture; WebGPU spec §19.2). 4x4 rgba32float texture\n // = 16 texels * 4 floats * 4 bytes/float = 256 bytes.\n // The forgeax Texture brand wraps a raw GPUTexture; cast through unknown\n // follows the createRenderer.ts fallback-pixel pattern (line 4330).\n const noiseCopyRes = device.queue.writeTexture(\n {\n texture: noiseTexRes.value,\n mipLevel: 0,\n origin: { x: 0, y: 0, z: 0 },\n },\n noiseRgba,\n { offset: 0, bytesPerRow: 4 * 4 * 4, rowsPerImage: 4 },\n { width: 4, height: 4, depthOrArrayLayers: 1 },\n );\n if (!noiseCopyRes.ok) {\n runtime.errorRegistry.fire(noiseCopyRes.error);\n return null;\n }\n\n // (3) SSAO uniform UBO — 3 mat4 (192 B).\n const uniformBufRes = device.createBuffer({\n label: 'hdrp-ssao-uniform',\n size: UNIFORM_BYTES,\n usage: GPU_BUFFER_USAGE_UNIFORM | GPU_BUFFER_USAGE_COPY_DST,\n mappedAtCreation: false,\n });\n if (!uniformBufRes.ok) {\n runtime.errorRegistry.fire(uniformBufRes.error);\n return null;\n }\n\n const buffers: SsaoBuffers = {\n device,\n kernelBuffer: kernelBufferRes.value,\n kernelBytes: SSAO_KERNEL_SAMPLE_COUNT * BYTES_PER_KERNEL_ELEMENT,\n noiseTexture: noiseTexRes.value,\n uniformBuffer: uniformBufRes.value,\n uniformBytes: UNIFORM_BYTES,\n };\n\n cache.set(runtime, buffers);\n return buffers;\n}\n","// @forgeax/engine-runtime - HDRP per-runtime persistent GPU buffers.\n//\n// feat-20260608-cluster-lighting Round-2 fix-up [w18-fix-r2] (F-1 / F-2):\n//\n// The HDRP cluster-forward path needs four persistent GPU buffers (light_data\n// SSBO, cluster_grid SSBO, light_index_list SSBO, cluster_uniform UBO) on BGL\n// slots 3..6 (plan D-1). Round-1 declared them only as graph resources -- no\n// underlying RHI buffers existed, so the graph fail-fast'd on dangling-read\n// every frame and the binner output was discarded.\n//\n// This module owns the lazy, per-runtime allocation of those buffers via a\n// WeakMap keyed on RenderSystemRuntime. The HDRP buildGraph reaches in via\n// `getOrCreateHdrpBuffers(runtime)`; subsequent calls in the same frame return\n// the cached pair so `device.queue.writeBuffer` lands on the same handles as\n// the (eventual) bind-group layout consumer (charter P5: one resource, one\n// owner; AC-13: 4 RHI buffers actually exist on slot 3..6 layout).\n//\n// Storage usage flags come from the render package's dependency-free buffer\n// usage owner; this module stays decoupled from renderer bootstrap.\n//\n// Sizes:\n// - light_data : 256 x 80 B = 20 480 B\n// - cluster_grid : maxGridCells x 8 B = 64 x 64 x 64 x 8 B = 2 097 152 B max\n// (plan D-grid: x,y,z each in [1..64]; maxCells=262144;\n// stride 2 u32 = 8B; we allocate at the install-time\n// grid passed via DEFAULT_CLUSTER_GRID 16x9x24=3456 cells).\n// - light_index_list : 65536 u32 = 262 144 B\n// - cluster_uniform : = 32 B (2 vec4 std140)\n//\n// AC-14: cluster_uniform is allocated once with the install-time grid; runtime\n// grid changes do NOT trigger PSO rebuild because grid lives in the UBO not in\n// shader specialization. (Shader-side draw is M-future; this AC is satisfied\n// by the buffer being a UBO with field-level updates.)\n\nimport {\n type BindGroup,\n type BindGroupLayout,\n type BindGroupLayoutDescriptor,\n type Buffer,\n RhiError,\n type Sampler,\n type TextureView,\n} from '@forgeax/engine-rhi';\nimport { GPU_SHADER_STAGE_COMPUTE } from './gpu-stage';\nimport {\n GPU_BUFFER_USAGE_COPY_DST,\n GPU_BUFFER_USAGE_STORAGE,\n GPU_BUFFER_USAGE_UNIFORM,\n} from './gpu-usage';\nimport { BYTES_PER_DIRECT_LIGHT_SLOT } from './light-buffer-layout';\nimport { createPbrSkinMeshBindGroupEntries } from './pbr-pipeline';\nimport {\n CLUSTER_GRID_STRIDE_U32,\n DEFAULT_CLUSTER_GRID,\n LIGHT_INDEX_LIST_CAPACITY,\n MAX_LIGHTS,\n} from './pipeline/standard-profile';\nimport { createHdrpBindGroupLayoutDescriptor } from './pipeline-spec';\nimport { MESH_PER_ENTITY_STRIDE } from './record/mesh-ssbo';\nimport type { RenderSystemRuntime } from './record/render-context';\nimport type { GpuDrivenSceneMeshBinding } from './render-pipeline';\nimport { getOrCreateSsaoFallbackTexture } from './ssao-buffers';\n\nexport { getOrCreateSsaoFallbackTexture } from './ssao-buffers';\n\n/** Bind-group layout used only by the WebGPU cluster membership producer. */\nexport function createHdrpClusterMembershipBindGroupLayoutDescriptor(): BindGroupLayoutDescriptor {\n return {\n label: 'hdrp-cluster-membership-bgl',\n entries: [\n {\n binding: 0,\n visibility: GPU_SHADER_STAGE_COMPUTE,\n buffer: { type: 'read-only-storage', hasDynamicOffset: false },\n },\n {\n binding: 1,\n visibility: GPU_SHADER_STAGE_COMPUTE,\n buffer: { type: 'storage', hasDynamicOffset: false },\n },\n {\n binding: 2,\n visibility: GPU_SHADER_STAGE_COMPUTE,\n buffer: { type: 'uniform', hasDynamicOffset: false },\n },\n {\n binding: 3,\n visibility: GPU_SHADER_STAGE_COMPUTE,\n buffer: { type: 'read-only-storage', hasDynamicOffset: false },\n },\n ],\n };\n}\n\n/**\n * The persistent HDRP GPU buffers (plan D-1, BGL slot 3..6) plus the unified\n * BGL layout for group(2) (plan D-6, feat-20260609-hdrp-cluster-fragment-ggx M3).\n *\n * AC-11: light_data stride = `BYTES_PER_DIRECT_LIGHT_SLOT` = 80 (double-sided\n * lock with WGSL hdrp-cluster-forward.wgsl DirectLightSlot).\n * AC-13: 4 distinct RHI Buffer handles, ready for slot-3..6 BGL binding.\n * AC-14: clusterUniform is a uniform buffer (not storage); runtime grid change\n * is a writeBuffer field update, not a PSO rebuild.\n * AC-06: unifiedBindGroupLayout is the 7-entry group(2) BGL (mesh SSBO +\n * cluster 4 buffer).\n */\nexport interface HdrpBuffers {\n /** Device identity that owns every handle in this bundle. */\n readonly device: RenderSystemRuntime['device'];\n /** light_data -- the full 256 x 80 B DirectLightSlot budget. */\n readonly lightDataBuffer: Buffer;\n readonly lightDataBytes: number;\n /** cluster_grid SSBO -- gridX*gridY*gridZ * 2 u32, BGL slot 4. */\n readonly clusterGridBuffer: Buffer;\n readonly clusterGridBytes: number;\n /** light_index_list SSBO -- 65536 u32 = 256 KiB, BGL slot 5. */\n readonly lightIndexListBuffer: Buffer;\n readonly lightIndexListBytes: number;\n /** cluster_uniform UBO -- 32 B (2 vec4 std140), BGL slot 6. */\n readonly clusterUniformBuffer: Buffer;\n readonly clusterUniformBytes: number;\n /** CPU-produced light AABBs consumed by the optional WebGPU membership pass. */\n readonly lightBoundsBuffer: Buffer;\n readonly lightBoundsBytes: number;\n /** The grid the buffers were sized for; cluster_grid is sized by gridX*gridY*gridZ. */\n readonly grid: { readonly x: number; readonly y: number; readonly z: number };\n /** Unified BGL layout for group(2). */\n readonly unifiedBindGroupLayout: BindGroupLayout;\n}\n\nconst cache = new WeakMap<RenderSystemRuntime, HdrpBuffers>();\n\n/**\n * Lazily allocate the 4 persistent HDRP buffers for `runtime`. Returns the same\n * `HdrpBuffers` object on subsequent calls (per-RenderSystem stable identity).\n *\n * On `device.createBuffer` failure, fires a structured RhiError on the runtime's\n * error registry and returns `null`; HDRP buildGraph treats null as a hard\n * pipeline disable (charter P3 explicit failure).\n *\n * `grid` defaults to `DEFAULT_CLUSTER_GRID` when undefined (matches the M5\n * record-stage default). A smaller grid reuses the existing capacity. When a\n * later install requests a larger grid, this owner allocates a complete new\n * bundle, publishes it atomically, and retires the previous bundle after the\n * device queue fence so graph and bind-group caches never observe a partially\n * replaced resource set.\n */\nexport function getOrCreateHdrpBuffers(\n runtime: RenderSystemRuntime,\n grid: { x: number; y: number; z: number } = DEFAULT_CLUSTER_GRID,\n): HdrpBuffers | null {\n // Cluster has one code-level transport. Capability failure is handled by\n // Standard transport admission; this owner never creates a second UBO ABI.\n if (runtime.device.caps?.storageBuffer !== true) return null;\n // Contract tests and reduced host adapters may advertise storage buffers\n // without implementing the resource-creation surface. Treat that as a\n // capability miss rather than dereferencing an absent method; callers\n // already route `null` through the structured cluster-transport fallback.\n const deviceSurface = runtime.device as unknown as {\n readonly createBuffer?: unknown;\n readonly createBindGroupLayout?: unknown;\n readonly destroyBuffer?: unknown;\n };\n if (\n typeof deviceSurface.createBuffer !== 'function' ||\n typeof deviceSurface.createBindGroupLayout !== 'function' ||\n typeof deviceSurface.destroyBuffer !== 'function'\n ) {\n return null;\n }\n const cached = cache.get(runtime);\n if (cached !== undefined && cached.device === runtime.device) {\n const requestedCells = grid.x * grid.y * grid.z;\n const cachedCells = cached.grid.x * cached.grid.y * cached.grid.z;\n if (requestedCells <= cachedCells) return cached;\n }\n const device = runtime.device;\n const clusterUniformBytes = 32;\n const lightDataBytes = MAX_LIGHTS * BYTES_PER_DIRECT_LIGHT_SLOT;\n const clusterCells = grid.x * grid.y * grid.z;\n const clusterGridBytes = clusterCells * CLUSTER_GRID_STRIDE_U32 * 4;\n const lightIndexListBytes = LIGHT_INDEX_LIST_CAPACITY * 4;\n const lightBoundsBytes = MAX_LIGHTS * 6 * 4;\n const created: Buffer[] = [];\n const releaseCreated = (): void => {\n for (const buffer of created) {\n const result = device.destroyBuffer(buffer);\n if (!result.ok) runtime.errorRegistry.fire(result.error);\n }\n created.length = 0;\n };\n const failAllocation = (error: RhiError): null => {\n runtime.errorRegistry.fire(error);\n releaseCreated();\n return null;\n };\n\n const lightData = device.createBuffer({\n label: 'hdrp-light-data',\n size: lightDataBytes,\n usage: GPU_BUFFER_USAGE_STORAGE | GPU_BUFFER_USAGE_COPY_DST,\n mappedAtCreation: false,\n });\n if (!lightData.ok) {\n return failAllocation(lightData.error);\n }\n created.push(lightData.value);\n const clusterGrid = device.createBuffer({\n label: 'hdrp-cluster-grid',\n size: clusterGridBytes,\n usage: GPU_BUFFER_USAGE_STORAGE | GPU_BUFFER_USAGE_COPY_DST,\n mappedAtCreation: false,\n });\n if (!clusterGrid.ok) {\n return failAllocation(clusterGrid.error);\n }\n created.push(clusterGrid.value);\n const lightIndexList = device.createBuffer({\n label: 'hdrp-light-index-list',\n size: lightIndexListBytes,\n usage: GPU_BUFFER_USAGE_STORAGE | GPU_BUFFER_USAGE_COPY_DST,\n mappedAtCreation: false,\n });\n if (!lightIndexList.ok) {\n return failAllocation(lightIndexList.error);\n }\n created.push(lightIndexList.value);\n const clusterUniform = device.createBuffer({\n label: 'hdrp-cluster-uniform',\n size: clusterUniformBytes,\n usage: GPU_BUFFER_USAGE_UNIFORM | GPU_BUFFER_USAGE_COPY_DST,\n mappedAtCreation: false,\n });\n if (!clusterUniform.ok) {\n return failAllocation(clusterUniform.error);\n }\n created.push(clusterUniform.value);\n const lightBounds = device.createBuffer({\n label: 'hdrp-light-bounds',\n size: lightBoundsBytes,\n usage: GPU_BUFFER_USAGE_STORAGE | GPU_BUFFER_USAGE_COPY_DST,\n mappedAtCreation: false,\n });\n if (!lightBounds.ok) {\n return failAllocation(lightBounds.error);\n }\n created.push(lightBounds.value);\n\n // Create the unified 7-entry BGL layout for group(2)\n // (plan D-6, feat-20260609-hdrp-cluster-fragment-ggx M3).\n // The HDRP BGL descriptor is owned by pipeline-spec and shared with the\n // pipeline dispatcher and its byte-identical tests.\n const unifiedBglRes = device.createBindGroupLayout(createHdrpBindGroupLayoutDescriptor());\n if (!unifiedBglRes.ok) {\n return failAllocation(unifiedBglRes.error);\n }\n const buffers: HdrpBuffers = {\n device,\n lightDataBuffer: lightData.value,\n lightDataBytes,\n clusterGridBuffer: clusterGrid.value,\n clusterGridBytes,\n lightIndexListBuffer: lightIndexList.value,\n lightIndexListBytes,\n clusterUniformBuffer: clusterUniform.value,\n clusterUniformBytes,\n lightBoundsBuffer: lightBounds.value,\n lightBoundsBytes,\n grid: { x: grid.x, y: grid.y, z: grid.z },\n unifiedBindGroupLayout: unifiedBglRes.value,\n };\n cache.set(runtime, buffers);\n if (cached !== undefined) {\n retireHdrpBuffers(runtime, cached);\n }\n return buffers;\n}\n\n/**\n * Drop the cached bundle before a device recovery or renderer disposal. The\n * bundle carries the old device identity, so retirement fences that device's\n * queue instead of consulting the replacement runtime device.\n */\nexport function resetHdrpBuffers(runtime: RenderSystemRuntime): void {\n const cached = cache.get(runtime);\n if (cached === undefined) return;\n cache.delete(runtime);\n retireHdrpBuffers(runtime, cached);\n}\n\nfunction retireHdrpBuffers(runtime: RenderSystemRuntime, buffers: HdrpBuffers): void {\n const device = buffers.device;\n const destroy = (): void => {\n for (const buffer of [\n buffers.lightDataBuffer,\n buffers.clusterGridBuffer,\n buffers.lightIndexListBuffer,\n buffers.clusterUniformBuffer,\n buffers.lightBoundsBuffer,\n ]) {\n const result = device.destroyBuffer(buffer);\n if (!result.ok) runtime.errorRegistry.fire(result.error);\n }\n };\n const queue = device.queue as {\n readonly onSubmittedWorkDone?: () => Promise<undefined>;\n };\n if (typeof queue.onSubmittedWorkDone === 'function') {\n queue.onSubmittedWorkDone().then(destroy, destroy);\n } else {\n // Minimal null/test devices may not expose queue fences; they also have no\n // submitted work that can retain the old bundle, so release synchronously.\n destroy();\n }\n}\n\n/**\n * Build the 8-float cluster_uniform std140 payload.\n *\n * [0] gridX u32 (cast in shader)\n * [1] gridY u32\n * [2] gridZ u32\n * [3] lightCount u32 (vec4 alignment; capped by MAX_LIGHTS)\n * [4] near f32\n * [5] far f32\n * [6] logFarOverNear f32\n * [7] ssaoIntensity f32 (scope-amend-webgl2-ubo: folded from removed\n * dedicated @binding(9) UBO; lighting shader\n * reads `cluster_uniform.near_far_log.w`)\n *\n * Matches `__tests__/hdrp-bgl-slots.test.ts CLUSTER_UNIFORM_LAYOUT`.\n *\n * Note: u32 values written into a Float32Array view are bit-pattern correct\n * because writeBuffer copies raw bytes; the WGSL `var<uniform>` declares the\n * field as u32 / f32 per its position so the device reinterprets correctly.\n * Use a Uint32Array view for the integer slots to keep the bit pattern intact.\n */\nexport function packClusterUniform(\n grid: { x: number; y: number; z: number },\n near: number,\n far: number,\n ssaoIntensity: number = 0,\n lightCount: number = 0,\n): ArrayBuffer {\n const buf = new ArrayBuffer(32);\n const u32 = new Uint32Array(buf);\n const f32 = new Float32Array(buf);\n u32[0] = grid.x >>> 0;\n u32[1] = grid.y >>> 0;\n u32[2] = grid.z >>> 0;\n u32[3] = Math.min(Math.max(lightCount, 0), MAX_LIGHTS) >>> 0;\n f32[4] = near;\n f32[5] = far;\n // logFarOverNear: log(far/near) used by the shader for log-z slice mapping.\n // Guard against near=0 / far<=near (returns 0; downstream uses fallback).\n f32[6] = near > 0 && far > near ? Math.log(far / near) : 0;\n // f32[7] = SSAO intensity (default 0 = disabled-equivalent: mix(1.0, x, 0) = 1).\n f32[7] = ssaoIntensity;\n return buf;\n}\n\n/**\n * Consumers pass the same mesh storage buffer + stride that URP uses, so the\n * dynamic offset (`i * MESH_PER_ENTITY_STRIDE`) at `setBindGroup(2, ...)`\n * stays valid across both pipelines.\n */\n/**\n * Build the unified group(2) BindGroup for HDRP — binding 0 = mesh SSBO\n * (dynamic offset, same buffer URP binds), bindings 3..6 = the cluster\n * buffers from `getOrCreateHdrpBuffers`.\n *\n * feat-20260609-hdrp-cluster-fragment-ggx M4 / w19. Called per-frame from the\n * recordFrame HDRP block after binner+writeBuffer; the resulting BindGroup\n * lands on `passCtx.hdrpClusterBindGroup` and recordMainPass binds it at\n * group(2) when the prepared Standard topology selects clustered lighting.\n *\n * Returns `null` on `device.createBindGroup` failure (a structured RhiError\n * is fired on `runtime.errorRegistry`); recordMainPass gracefully falls back\n * to the URP mesh bindGroup when null.\n *\n * Plan D-1 / D-4: the mesh SSBO buffer + stride mirror the URP path, so the\n * single dynamic offset issued at `setBindGroup(2, ...)` covers binding 0 of\n * the unified BGL just as it covers binding 0 of the URP mesh BGL.\n */\n/**\n * SSAO bind-group input (plan-strategy §D-B, M7;\n * scope-amend-webgl2-ubo: dedicated @binding(9) intensity UBO removed).\n *\n * The HDRP unified BGL always declares 7 entries (cluster 5 + ssao 2); the\n * caller supplies one of two shapes depending on `config.ssao?.enabled`:\n *\n * { enabled: true, ssaoBlurredView }\n * -> binding 7 = real ssaoBlurred view\n * -> binding 8 = real ssao sampler (lazy-allocated alongside fallback)\n *\n * { enabled: false }\n * -> binding 7 = 1x1 white fallback texture (AO = 1.0)\n * -> binding 8 = fallback sampler\n *\n * Intensity flows via `cluster_uniform.near_far_log.w` (binding 6); the host\n * writes intensity=0 when SSAO is disabled so the lighting blend\n * `mix(1.0, ssao*ao, 0) = 1.0` collapses to the round-1 baseline. The\n * \"always-7-entries\" invariant lets every PBR PSO use the same pipeline\n * layout regardless of SSAO state — toggling the runtime config never\n * triggers shader recompile (charter P4 one consistent abstraction).\n *\n * `ssaoBuffers` is no longer carried in the enabled variant: the SSAO\n * compute-side UBO continues to live on the SSAO compute pipeline's own\n * group(0) BGL, decoupled from the lighting-stage group(2).\n */\nexport type SsaoBindOptions =\n | {\n readonly enabled: true;\n readonly ssaoBlurredView: TextureView;\n }\n | { readonly enabled: false };\n\nfunction standardLightingEntries(\n hdrpBuffers: HdrpBuffers,\n ssaoTexView: TextureView,\n ssaoSampler: Sampler,\n): import('@forgeax/engine-rhi').BindGroupEntry[] {\n return [\n {\n binding: 3,\n resource: {\n kind: 'buffer',\n value: { buffer: hdrpBuffers.lightDataBuffer },\n },\n },\n {\n binding: 4,\n resource: {\n kind: 'buffer',\n value: { buffer: hdrpBuffers.clusterGridBuffer },\n },\n },\n {\n binding: 5,\n resource: {\n kind: 'buffer',\n value: { buffer: hdrpBuffers.lightIndexListBuffer },\n },\n },\n {\n binding: 6,\n resource: {\n kind: 'buffer',\n value: { buffer: hdrpBuffers.clusterUniformBuffer },\n },\n },\n {\n binding: 7,\n resource: { kind: 'textureView', value: ssaoTexView },\n },\n {\n binding: 8,\n resource: { kind: 'sampler', value: ssaoSampler },\n },\n ];\n}\n\nconst sceneLightingBindings = new WeakMap<\n HdrpBuffers,\n WeakMap<\n Buffer,\n {\n readonly layout: BindGroupLayout;\n readonly palette: Buffer | undefined;\n readonly ssao: TextureView;\n readonly bindGroup: BindGroup;\n }\n >\n>();\n\n/** Bind a complete GPU scene-row projection alongside the current lighting/AO resources. */\nexport function createGpuDrivenLightingBindGroup(\n runtime: RenderSystemRuntime,\n buffers: HdrpBuffers,\n layout: BindGroupLayout,\n binding: GpuDrivenSceneMeshBinding,\n ssaoView?: TextureView,\n): BindGroup | null {\n const fallback = getOrCreateSsaoFallbackTexture(runtime);\n if (fallback === null) return null;\n const ssao = ssaoView ?? fallback.view;\n let cache = sceneLightingBindings.get(buffers);\n if (cache === undefined) {\n cache = new WeakMap();\n sceneLightingBindings.set(buffers, cache);\n }\n const cached = cache.get(binding.meshBuffer);\n if (cached?.layout === layout && cached.palette === binding.paletteBuffer && cached.ssao === ssao)\n return cached.bindGroup;\n const result = runtime.device.createBindGroup({\n label: 'gpu-driven-scene-lighting',\n layout,\n entries: [\n {\n binding: 0,\n resource: {\n kind: 'buffer',\n value: { buffer: binding.meshBuffer, size: binding.meshBytes },\n },\n },\n ...(binding.paletteBuffer === undefined\n ? []\n : [1, 2].map((index) => ({\n binding: index,\n resource: {\n kind: 'buffer' as const,\n value: { buffer: binding.paletteBuffer as Buffer },\n },\n }))),\n ...standardLightingEntries(buffers, ssao, fallback.sampler),\n ],\n });\n if (!result.ok) {\n runtime.errorRegistry.fire(result.error);\n return null;\n }\n cache.set(binding.meshBuffer, {\n layout,\n palette: binding.paletteBuffer,\n ssao,\n bindGroup: result.value,\n });\n return result.value;\n}\n\n/** Standard surface resources without scene geometry tables. */\nexport function createStandardSurfaceLightingBindGroup(\n runtime: RenderSystemRuntime,\n layout: BindGroupLayout,\n grid: { readonly x: number; readonly y: number; readonly z: number },\n ssaoOptions: SsaoBindOptions = { enabled: false },\n): BindGroup | null {\n const buffers = getOrCreateHdrpBuffers(runtime, grid);\n const fallback = getOrCreateSsaoFallbackTexture(runtime);\n if (buffers === null || fallback === null) return null;\n const result = runtime.device.createBindGroup({\n label: 'standard-surface-lighting',\n layout,\n entries: standardLightingEntries(\n buffers,\n ssaoOptions.enabled ? ssaoOptions.ssaoBlurredView : fallback.view,\n fallback.sampler,\n ),\n });\n if (!result.ok) {\n runtime.errorRegistry.fire(result.error);\n return null;\n }\n return result.value;\n}\n\nexport function createHdrpUnifiedBindGroup(\n runtime: RenderSystemRuntime,\n hdrpBuffers: HdrpBuffers,\n meshStorageBuffer: Buffer,\n ssaoOptions: SsaoBindOptions = { enabled: false },\n): BindGroup | null {\n const fallback = getOrCreateSsaoFallbackTexture(runtime);\n if (fallback === null) return null;\n\n const ssaoTexView: TextureView = ssaoOptions.enabled\n ? ssaoOptions.ssaoBlurredView\n : fallback.view;\n const ssaoSampler: Sampler = fallback.sampler;\n\n const result = runtime.device.createBindGroup({\n label: 'hdrp-unified-bg-group2',\n layout: hdrpBuffers.unifiedBindGroupLayout,\n entries: [\n {\n binding: 0,\n resource: {\n kind: 'buffer',\n value: {\n buffer: meshStorageBuffer,\n offset: 0,\n size: MESH_PER_ENTITY_STRIDE,\n },\n },\n },\n ...standardLightingEntries(hdrpBuffers, ssaoTexView, ssaoSampler),\n ],\n });\n if (!result.ok) {\n runtime.errorRegistry.fire(result.error);\n return null;\n }\n return result.value;\n}\n\n/** Build the clustered skin group(2) bind group with one shared palette window. */\nexport function createHdrpSkinUnifiedBindGroup(\n runtime: RenderSystemRuntime,\n hdrpBuffers: HdrpBuffers,\n layout: BindGroupLayout,\n meshStorageBuffer: Buffer,\n paletteBuffer: Buffer,\n paletteBindingWindowBytes: number,\n ssaoOptions: SsaoBindOptions = { enabled: false },\n): BindGroup | null {\n const fallback = getOrCreateSsaoFallbackTexture(runtime);\n if (fallback === null) return null;\n const meshSize = MESH_PER_ENTITY_STRIDE;\n const result = runtime.device.createBindGroup({\n label: 'hdrp-skin-unified-bg-group2',\n layout,\n entries: [\n ...createPbrSkinMeshBindGroupEntries(\n meshStorageBuffer,\n meshSize,\n paletteBuffer,\n paletteBindingWindowBytes,\n ),\n { binding: 3, resource: { kind: 'buffer', value: { buffer: hdrpBuffers.lightDataBuffer } } },\n {\n binding: 4,\n resource: { kind: 'buffer', value: { buffer: hdrpBuffers.clusterGridBuffer } },\n },\n {\n binding: 5,\n resource: { kind: 'buffer', value: { buffer: hdrpBuffers.lightIndexListBuffer } },\n },\n {\n binding: 6,\n resource: { kind: 'buffer', value: { buffer: hdrpBuffers.clusterUniformBuffer } },\n },\n {\n binding: 7,\n resource: {\n kind: 'textureView',\n value: ssaoOptions.enabled ? ssaoOptions.ssaoBlurredView : fallback.view,\n },\n },\n { binding: 8, resource: { kind: 'sampler', value: fallback.sampler } },\n ],\n });\n if (!result.ok) {\n runtime.errorRegistry.fire(result.error);\n return null;\n }\n return result.value;\n}\n\n/**\n * Build the compute-only bind group for ordered cluster membership output.\n * Its group is intentionally separate from the fragment group: the same\n * light-index buffer is read-only in the fragment pipeline but read-write in\n * the producer pipeline, which WebGPU represents with different binding\n * types.\n */\nexport function createHdrpClusterMembershipBindGroup(\n runtime: RenderSystemRuntime,\n hdrpBuffers: HdrpBuffers,\n layout: BindGroupLayout,\n): BindGroup | null {\n const result = runtime.device.createBindGroup({\n label: 'hdrp-cluster-membership-bg',\n layout,\n entries: [\n {\n binding: 0,\n resource: { kind: 'buffer', value: { buffer: hdrpBuffers.clusterGridBuffer } },\n },\n {\n binding: 1,\n resource: { kind: 'buffer', value: { buffer: hdrpBuffers.lightIndexListBuffer } },\n },\n {\n binding: 2,\n resource: { kind: 'buffer', value: { buffer: hdrpBuffers.clusterUniformBuffer } },\n },\n {\n binding: 3,\n resource: { kind: 'buffer', value: { buffer: hdrpBuffers.lightBoundsBuffer } },\n },\n ],\n });\n if (!result.ok) {\n runtime.errorRegistry.fire(result.error);\n return null;\n }\n return result.value;\n}\n\n/** Sentinel error class re-export for tests asserting the error path. */\nexport { RhiError as HdrpBufferAllocError };\n","// @forgeax/engine-runtime — CPU cluster-forward binner (M3 pure functions)\n// feat-20260608-cluster-lighting.\n//\n// Transplants Bevy's clustered_forward CPU math skeleton (research Finding 1)\n// from WGSL to pure TypeScript. Four internal pure functions ported from\n// Bevy cluster.wgsl lines 75-200:\n// cluster_space_object_aabb — sphere -> view-space NDC AABB\n// ndc_position_to_cluster — NDC coords -> cluster index (XY+Z)\n// calculate_sphere_cluster_bounds — AABB -> cluster-cell range\n// view_z_to_z_slice — log-z inverse mapping (idTech6 formula)\n//\n// Public surface:\n// bin(lights, view, proj, grid, near, far, clusterGrid, lightIndexList, capacity)\n// -> Result<writtenLightIndexCount, ClusterBinError>\n//\n// deriveCullingRadius(range, intensity, threshold) — D-8 +Infinity fallback\n//\n// Constraints:\n// D-3: pure function + Result<number, ClusterBinError> + out param + no throw\n// D-8: spot uses sphere proxy (radius=range)\n// D-binner: CPU main thread, no GPU compute / worker\n// OOS-4: cone-AABB tight culling deferred\n// AGENTS.md conventions: structured errors, never throw for expected failures\n//\n// Capacity: max 65536 light index list entries (hard cap, AC-24).\n// Grid: {x,y,z} each in [1, 64] integers (validated at install time).\n\nimport { type Mat4, type Vec3, vec3 } from '@forgeax/engine-math';\nimport { err, ok, type Result } from '@forgeax/engine-rhi';\nimport type { RectAreaWorldFrame } from './render-system-extract';\n\n// ── types ──────────────────────────────────────────────────────────────────\n\nexport type ClusterBinErrorCode = 'index-overflow';\n\nexport interface ClusterBinError {\n readonly code: ClusterBinErrorCode;\n readonly expected: string;\n readonly hint: string;\n readonly detail: IndexOverflowDetail;\n}\n\nexport interface IndexOverflowDetail {\n readonly actual: number;\n readonly capacity: number;\n}\n\n/**\n * View-space NDC axis-aligned bounding box.\n * `min` and `max` are NDC coordinates clamped to [-1, 1] for XY;\n * Z may extend to projection-space depth values.\n */\nexport interface ClusterAabb {\n readonly min: Vec3;\n readonly max: Vec3;\n}\n\n/** Unsigned integer 3D cluster cell coordinate. */\nexport interface Uvec3 {\n readonly x: number;\n readonly y: number;\n readonly z: number;\n}\n\n/** Cluster cell range in the unsigned grid. */\nexport interface ClusterBounds {\n readonly min: Uvec3;\n readonly max: Uvec3;\n}\n\ntype MutableClusterBounds = {\n min: { x: number; y: number; z: number };\n max: { x: number; y: number; z: number };\n};\n\n/**\n * Reusable typed scratch for cluster-major output. The binner must emit one\n * contiguous light-index run per cluster, so counts and cursors replace the\n * per-frame `number[][]` staging lists without changing output order.\n */\nexport interface ClusterBinScratch {\n clusterCounts: Uint32Array;\n clusterCursors: Uint32Array;\n lightBounds: Int32Array;\n clusterDeltas: Int32Array;\n aabbOutput: ClusterAabb;\n boundsOutput: MutableClusterBounds;\n}\n\n/**\n * Selects the membership materialization owner after bounds and occupancy are\n * derived. The default keeps the existing CPU list writer; the WebGPU\n * producer uses the same CPU-owned scratch and leaves the ordered list to a\n * later compute pass.\n */\nexport interface ClusterBinOptions {\n readonly writeMembership?: boolean;\n}\n\nexport type ClusterBinProfilePhase =\n | 'light-bounds-and-occupancy'\n | 'light-bounds-and-occupancy/light-aabb'\n | 'light-bounds-and-occupancy/cluster-occupancy'\n | 'cluster-reserve'\n | 'light-index-write'\n | 'light-index-write/bounds-read'\n | 'light-index-write/cluster-write';\n\nexport type ClusterBinProfileRunner = <T>(phase: ClusterBinProfilePhase, action: () => T) => T;\n\nfunction runClusterBinProfilePhase<T>(\n runner: ClusterBinProfileRunner | undefined,\n phase: ClusterBinProfilePhase,\n action: () => T,\n): T {\n return runner === undefined ? action() : runner(phase, action);\n}\n\nexport function createClusterBinScratch(): ClusterBinScratch {\n return {\n clusterCounts: new Uint32Array(0),\n clusterCursors: new Uint32Array(0),\n lightBounds: new Int32Array(0),\n clusterDeltas: new Int32Array(0),\n aabbOutput: {\n min: vec3.create(0, 0, 0),\n max: vec3.create(0, 0, 0),\n },\n boundsOutput: {\n min: { x: 0, y: 0, z: 0 },\n max: { x: 0, y: 0, z: 0 },\n },\n };\n}\n\nfunction ensureScratchCapacity(\n scratch: ClusterBinScratch,\n clusterCount: number,\n lightCount: number,\n gridX: number,\n gridY: number,\n gridZ: number,\n): void {\n if (scratch.clusterCounts.length < clusterCount) {\n scratch.clusterCounts = new Uint32Array(clusterCount);\n scratch.clusterCursors = new Uint32Array(clusterCount);\n }\n if (scratch.lightBounds.length < lightCount * 6) {\n scratch.lightBounds = new Int32Array(lightCount * 6);\n }\n const differenceVolumeSize = (gridX + 1) * (gridY + 1) * (gridZ + 1);\n if (scratch.clusterDeltas.length < differenceVolumeSize) {\n scratch.clusterDeltas = new Int32Array(differenceVolumeSize);\n }\n}\n\n// ── deriveCullingRadius ────────────────────────────────────────────────────\n\n/**\n * Compute a culling radius for a punctual light.\n *\n * If `range` is finite, returns it verbatim (D-8 sphere proxy).\n * If `range === +Infinity`, derives a finite radius from the distance at which\n * the light's perceptible contribution drops below `threshold`.\n *\n * Formula: `sqrt(intensity / threshold)` gives the distance at which attenuation\n * = threshold (assuming E=1/r^2 falloff for point lights).\n * Cap to a conservative 1000 units to prevent overly large bounds.\n */\nexport function deriveCullingRadius(range: number, intensity: number, threshold = 0.001): number {\n if (Number.isFinite(range)) {\n return Math.max(0, range);\n }\n const derived = Math.sqrt(intensity / threshold);\n return Math.min(derived, 1000);\n}\n\n/** Conservative bounding-sphere radius for a finite Rect and its light range. */\nexport function rectAreaClusterRadius(frame: RectAreaWorldFrame, range: number): number {\n return Math.max(0, range) + Math.hypot(frame.halfWidth, frame.halfHeight);\n}\n\n/** Test the finite Rect's closest-point distance against a strict range window. */\nexport function rectAreaIsInRange(\n frame: RectAreaWorldFrame,\n point: ArrayLike<number>,\n range: number,\n): boolean {\n const toPoint = vec3.create(\n (point[0] ?? 0) - (frame.center[0] ?? 0),\n (point[1] ?? 0) - (frame.center[1] ?? 0),\n (point[2] ?? 0) - (frame.center[2] ?? 0),\n );\n const localX = Math.min(\n frame.halfWidth,\n Math.max(-frame.halfWidth, vec3.dot(toPoint, frame.axisX)),\n );\n const localY = Math.min(\n frame.halfHeight,\n Math.max(-frame.halfHeight, vec3.dot(toPoint, frame.axisY)),\n );\n const dx = (toPoint[0] ?? 0) - (frame.axisX[0] ?? 0) * localX - (frame.axisY[0] ?? 0) * localY;\n const dy = (toPoint[1] ?? 0) - (frame.axisX[1] ?? 0) * localX - (frame.axisY[1] ?? 0) * localY;\n const dz = (toPoint[2] ?? 0) - (frame.axisX[2] ?? 0) * localX - (frame.axisY[2] ?? 0) * localY;\n return dx * dx + dy * dy + dz * dz < range * range;\n}\n\n// ── view_z_to_z_slice ──────────────────────────────────────────────────────\n\n/**\n * Map view-space z (negative, camera-forward) to a cluster Z slice index.\n *\n * Implements the idTech6 inverse log-z formula (research §2):\n * slice = floor(log(-view_z / near) / log(far / near) * gridZ)\n *\n * Clamped to [0, gridZ - 1].\n */\nexport function viewZToZSlice(viewZ: number, gridZ: number, near: number, far: number): number {\n if (viewZ >= -near) {\n return 0;\n }\n const logFarOverNear = Math.log(far / near);\n const slice = Math.floor((Math.log(-viewZ / near) / logFarOverNear) * gridZ);\n if (slice < 0) return 0;\n if (slice >= gridZ) return gridZ - 1;\n return slice;\n}\n\n// ── cluster_space_object_aabb ───────────────────────────────────────────────\n\n/**\n * Compute view-space NDC AABB for a sphere (light culling proxy).\n *\n * Ported from Bevy `cluster_space_object_aabb` (cluster.wgsl lines 75-140).\n *\n * Steps:\n * 1. Transform sphere center to view space via view matrix.\n * 2. Expand by radius to get view-AABB corners.\n * 3. Project 4 key corners to NDC.\n * 4. Clamp to [-1, 1] for XY ; Z is kept as projected depth.\n */\nexport function clusterSpaceObjectAabb(\n center: Vec3,\n radius: number,\n view: Mat4,\n proj: Mat4,\n output?: ClusterAabb,\n): ClusterAabb {\n const result =\n output ??\n ({\n min: vec3.create(0, 0, 0),\n max: vec3.create(0, 0, 0),\n } satisfies ClusterAabb);\n const cx = center[0] ?? 0;\n const cy = center[1] ?? 0;\n const cz = center[2] ?? 0;\n\n const v00 = view[0] ?? 0;\n const v01 = view[1] ?? 0;\n const v02 = view[2] ?? 0;\n const v10 = view[4] ?? 0;\n const v11 = view[5] ?? 0;\n const v12 = view[6] ?? 0;\n const v20 = view[8] ?? 0;\n const v21 = view[9] ?? 0;\n const v22 = view[10] ?? 0;\n const v30 = view[12] ?? 0;\n const v31 = view[13] ?? 0;\n const v32 = view[14] ?? 0;\n\n const vx = v00 * cx + v10 * cy + v20 * cz + v30;\n const vy = v01 * cx + v11 * cy + v21 * cz + v31;\n const vz = v02 * cx + v12 * cy + v22 * cz + v32;\n\n const viewScaleX = Math.hypot(v00, v01, v02);\n const viewScaleY = Math.hypot(v10, v11, v12);\n const viewScaleZ = Math.hypot(v20, v21, v22);\n\n const rx = radius * viewScaleX;\n const ry = radius * viewScaleY;\n const rz = radius * viewScaleZ;\n\n const vMinX = vx - rx;\n const vMaxX = vx + rx;\n const vMinY = vy - ry;\n const vMaxY = vy + ry;\n // View-space camera looks down -Z, so view_z < 0 in front of camera. The\n // sphere's view-space z-extent is [vMinZ, vMaxZ] with vMinZ <= vMaxZ in raw\n // sign-order; vMinZ is the FARTHEST (most negative) edge, vMaxZ is the\n // NEAREST edge (could be positive if the sphere crosses the near plane).\n //\n // M4.5-followup: previously we did `minViewZ = max(vMinZ, -1e-5)` which\n // collapses the FAR edge of every visible light to view_z ~= 0, which the\n // log-z slice mapping then bins as slice 0. Result: every light only ever\n // wrote into slice 0/0/0 .. {gx-1}/{gy-1}/0 -- floor pixels at view_z=-3..-9\n // (slice 13..17) found 0 lights and rendered black. The clamp must guard\n // the NEAR edge (vMaxZ) instead so projectToNdc never receives a positive\n // or zero view_z, while letting the far edge flow through to its real\n // log-z slice.\n const vMinZ = vz - rz;\n const vMaxZ = vz + rz;\n\n const minViewZ = vMinZ;\n const maxViewZ = Math.min(vMaxZ, -1e-5);\n\n // If even the near edge of the sphere is behind the camera, the light\n // contributes nothing. Caller (calculateSphereClusterBounds) returns\n // min > max which the bin loop treats as cull.\n if (minViewZ > maxViewZ) {\n result.min[0] = 1;\n result.min[1] = 1;\n result.min[2] = -1e-5;\n result.max[0] = -1;\n result.max[1] = -1;\n result.max[2] = -1e-5;\n return result;\n }\n\n let ndcMinX = Infinity;\n let ndcMaxX = -Infinity;\n let ndcMinY = Infinity;\n let ndcMaxY = -Infinity;\n\n const p00 = proj[0] ?? 0;\n const p10 = proj[4] ?? 0;\n const p20 = proj[8] ?? 0;\n const p30 = proj[12] ?? 0;\n const p01 = proj[1] ?? 0;\n const p11 = proj[5] ?? 0;\n const p21 = proj[9] ?? 0;\n const p31 = proj[13] ?? 0;\n const p23 = proj[11] ?? 0;\n\n // In the engine's perspective matrices clip.w depends only on view-space z.\n // The XY extrema of each z face are therefore the interval of one linear\n // form, avoiding eight corner projections and their temporary tuples.\n const perspectiveWOnlyZ =\n Math.abs(proj[3] ?? 0) < 1e-8 &&\n Math.abs(proj[7] ?? 0) < 1e-8 &&\n Math.abs(proj[15] ?? 0) < 1e-8 &&\n Math.abs(p23) >= 1e-5;\n\n if (perspectiveWOnlyZ) {\n const xExtent = Math.abs(p00) * rx + Math.abs(p10) * ry;\n const yExtent = Math.abs(p01) * rx + Math.abs(p11) * ry;\n for (let face = 0; face < 2; face++) {\n const zTest = face === 0 ? minViewZ : maxViewZ;\n if (zTest > 0) continue;\n const invW = 1 / (p23 * zTest);\n const xCenter = p20 * zTest + p30;\n const yCenter = p21 * zTest + p31;\n const x0 = (xCenter - xExtent) * invW;\n const x1 = (xCenter + xExtent) * invW;\n const y0 = (yCenter - yExtent) * invW;\n const y1 = (yCenter + yExtent) * invW;\n ndcMinX = Math.min(ndcMinX, x0, x1);\n ndcMaxX = Math.max(ndcMaxX, x0, x1);\n ndcMinY = Math.min(ndcMinY, y0, y1);\n ndcMaxY = Math.max(ndcMaxY, y0, y1);\n }\n } else {\n const corners: Array<[number, number]> = [\n [vMinX, vMinY],\n [vMinX, vMaxY],\n [vMaxX, vMinY],\n [vMaxX, vMaxY],\n ];\n\n for (const zTest of [minViewZ, maxViewZ]) {\n if (zTest <= 0) {\n for (const corner of corners) {\n const sx = corner[0];\n const sy = corner[1];\n const ndc = projectToNdc(sx, sy, zTest, proj);\n ndcMinX = Math.min(ndcMinX, ndc[0]);\n ndcMaxX = Math.max(ndcMaxX, ndc[0]);\n ndcMinY = Math.min(ndcMinY, ndc[1]);\n ndcMaxY = Math.max(ndcMaxY, ndc[1]);\n }\n }\n }\n }\n\n ndcMinX = Math.max(ndcMinX, -1);\n ndcMinY = Math.max(ndcMinY, -1);\n ndcMaxX = Math.min(ndcMaxX, 1);\n ndcMaxY = Math.min(ndcMaxY, 1);\n\n // M4.5-followup: aabb.min/max[2] now carries VIEW-SPACE z (negative), not\n // projected-NDC z. calculateSphereClusterBounds + ndcPositionToCluster +\n // viewZToZSlice all want view_z to do the log-z slice mapping; passing the\n // projected NDC z (>= 0) collapsed every light to slice 0 so cube/floor\n // fragments outside that slice received zero light.\n result.min[0] = ndcMinX;\n result.min[1] = ndcMinY;\n result.min[2] = minViewZ;\n result.max[0] = ndcMaxX;\n result.max[1] = ndcMaxY;\n result.max[2] = maxViewZ;\n return result;\n}\n\n/**\n * Project a view-space point to NDC via the perspective projection matrix.\n * Returns [ndc_x, ndc_y, ndc_z].\n */\nfunction projectToNdc(vx: number, vy: number, vz: number, proj: Mat4): [number, number, number] {\n const p00 = proj[0] ?? 0;\n const p10 = proj[4] ?? 0;\n const p20 = proj[8] ?? 0;\n const p30 = proj[12] ?? 0;\n const p01 = proj[1] ?? 0;\n const p11 = proj[5] ?? 0;\n const p21 = proj[9] ?? 0;\n const p31 = proj[13] ?? 0;\n const p02 = proj[2] ?? 0;\n const p12 = proj[6] ?? 0;\n const p22 = proj[10] ?? 0;\n const p32 = proj[14] ?? 0;\n const p03 = proj[3] ?? 0;\n const p13 = proj[7] ?? 0;\n const p23 = proj[11] ?? 0;\n const p33 = proj[15] ?? 0;\n\n const cx = p00 * vx + p10 * vy + p20 * vz + p30;\n const cy = p01 * vx + p11 * vy + p21 * vz + p31;\n const cz = p02 * vx + p12 * vy + p22 * vz + p32;\n const cw = p03 * vx + p13 * vy + p23 * vz + p33;\n\n if (Math.abs(cw) < 1e-10) {\n return [vx < 0 ? -1 : 1, vy < 0 ? -1 : 1, cz];\n }\n\n const invW = 1 / cw;\n return [cx * invW, cy * invW, cz * invW];\n}\n\n// ── ndc_position_to_cluster ─────────────────────────────────────────────────\n\n/**\n * Map an NDC point to its cluster cell index (XY + Z).\n *\n * XY: floor((ndc.xy * 0.5 + 0.5) * gridXy) clamped to [0, gridXy - 1].\n * Z: delegated to view_z_to_z_slice with the given view-space z.\n */\nexport function ndcPositionToCluster(\n ndc: Vec3,\n viewZ: number,\n gridX: number,\n gridY: number,\n gridZ: number,\n near: number,\n far: number,\n): Uvec3 {\n const ndcX = ndc[0] ?? 0;\n const ndcY = ndc[1] ?? 0;\n\n let cx = Math.floor((ndcX * 0.5 + 0.5) * gridX);\n let cy = Math.floor((ndcY * 0.5 + 0.5) * gridY);\n\n if (cx < 0) cx = 0;\n if (cx >= gridX) cx = gridX - 1;\n if (cy < 0) cy = 0;\n if (cy >= gridY) cy = gridY - 1;\n\n const cz = viewZToZSlice(viewZ, gridZ, near, far);\n\n return { x: cx, y: cy, z: cz };\n}\n\n// ── calculate_sphere_cluster_bounds ─────────────────────────────────────────\n\n/**\n * Convert an NDC AABB to a range of cluster cell indices.\n *\n * Computes cluster indices for AABB min and max, then clamps and\n * orders the result so `min <= max` in each axis.\n *\n * If the sphere is entirely behind the camera, returns min > max\n * in at least one axis (cull signal).\n */\nexport function calculateSphereClusterBounds(\n aabb: ClusterAabb,\n gridX: number,\n gridY: number,\n gridZ: number,\n near: number,\n far: number,\n output?: MutableClusterBounds,\n): ClusterBounds {\n const result =\n output ??\n ({\n min: { x: 0, y: 0, z: 0 },\n max: { x: 0, y: 0, z: 0 },\n } satisfies MutableClusterBounds);\n const minZ = aabb.min[2] ?? 0;\n const maxZ = aabb.max[2] ?? 0;\n\n const idxMin = ndcPositionToCluster(aabb.min, minZ, gridX, gridY, gridZ, near, far);\n const idxMax = ndcPositionToCluster(aabb.max, maxZ, gridX, gridY, gridZ, near, far);\n\n result.min.x = Math.min(idxMin.x, idxMax.x);\n result.min.y = Math.min(idxMin.y, idxMax.y);\n result.min.z = Math.min(idxMin.z, idxMax.z);\n result.max.x = Math.max(idxMin.x, idxMax.x);\n result.max.y = Math.max(idxMin.y, idxMax.y);\n result.max.z = Math.max(idxMin.z, idxMax.z);\n return result;\n}\n\n// ── bin ─────────────────────────────────────────────────────────────────────\n\n/**\n * Main entry point: assign punctual lights to cluster cells.\n *\n * Light-major loop: for each light, compute its sphere-AABB and iterate the\n * intersecting cluster cells, appending the light index to the light_index_list\n * and updating cluster_grid offsets.\n *\n * @param lights — array of { position: Vec3, range: number }\n * @param view — view matrix (column-major 16 floats)\n * @param proj — projection matrix (column-major 16 floats)\n * @param grid — cluster grid dimensions { x, y, z }\n * @param near — near plane distance\n * @param far — far plane distance\n * @param clusterGrid — caller-owned Uint32Array, length = grid.x * grid.y * grid.z * 2.\n * Format: [offset, count] pairs. offset = start index in lightIndexList; count = number of lights.\n * @param lightIndexList — caller-owned Uint32Array for light index storage.\n * @param capacity — max entries in lightIndexList (hard cap, typically 65536).\n * @param scratch — optional per-render-system typed scratch reused across frames.\n *\n * @returns `ok(written light-index entry count)` on success; `err(ClusterBinError)` with code\n * 'index-overflow' on overflow. The count lets the upload owner avoid copying unused capacity.\n */\nexport function bin(\n lights: ReadonlyArray<{ readonly position: Vec3; readonly range: number }>,\n view: Mat4,\n proj: Mat4,\n grid: { readonly x: number; readonly y: number; readonly z: number },\n near: number,\n far: number,\n clusterGrid: Uint32Array,\n lightIndexList: Uint32Array,\n capacity: number,\n scratch?: ClusterBinScratch,\n profile?: ClusterBinProfileRunner,\n options: ClusterBinOptions = {},\n): Result<number, ClusterBinError> {\n const gridX = grid.x;\n const gridY = grid.y;\n const gridZ = grid.z;\n const clusterCount = gridX * gridY * gridZ;\n const binScratch = scratch ?? createClusterBinScratch();\n\n ensureScratchCapacity(binScratch, clusterCount, lights.length, gridX, gridY, gridZ);\n const { clusterCounts, clusterCursors, lightBounds, clusterDeltas } = binScratch;\n\n clusterGrid.fill(0, 0, clusterCount * 2);\n clusterCounts.fill(0, 0, clusterCount);\n\n let attemptedTotal = 0;\n\n runClusterBinProfilePhase(profile, 'light-bounds-and-occupancy', () => {\n runClusterBinProfilePhase(profile, 'light-bounds-and-occupancy/light-aabb', () => {\n for (let lightIdx = 0; lightIdx < lights.length; lightIdx++) {\n const boundsOffset = lightIdx * 6;\n lightBounds[boundsOffset] = -1;\n const light = lights[lightIdx];\n if (!light) continue;\n const radius = deriveCullingRadius(light.range, 1);\n\n if (radius <= 0) {\n continue;\n }\n\n const aabb = clusterSpaceObjectAabb(\n light.position,\n radius,\n view,\n proj,\n binScratch.aabbOutput,\n );\n\n const bounds = calculateSphereClusterBounds(\n aabb,\n gridX,\n gridY,\n gridZ,\n near,\n far,\n binScratch.boundsOutput,\n );\n if (\n bounds.min.x > bounds.max.x ||\n bounds.min.y > bounds.max.y ||\n bounds.min.z > bounds.max.z\n ) {\n continue;\n }\n\n lightBounds[boundsOffset] = bounds.min.x;\n lightBounds[boundsOffset + 1] = bounds.min.y;\n lightBounds[boundsOffset + 2] = bounds.min.z;\n lightBounds[boundsOffset + 3] = bounds.max.x;\n lightBounds[boundsOffset + 4] = bounds.max.y;\n lightBounds[boundsOffset + 5] = bounds.max.z;\n }\n });\n\n runClusterBinProfilePhase(profile, 'light-bounds-and-occupancy/cluster-occupancy', () => {\n const diffX = gridX + 1;\n const diffY = gridY + 1;\n const diffRow = diffX * diffY;\n clusterDeltas.fill(0, 0, diffRow * (gridZ + 1));\n\n const addDifference = (x: number, y: number, z: number, delta: number): void => {\n const index = z * diffRow + y * diffX + x;\n clusterDeltas[index] = (clusterDeltas[index] ?? 0) + delta;\n };\n\n for (let lightIdx = 0; lightIdx < lights.length; lightIdx++) {\n const boundsOffset = lightIdx * 6;\n if ((lightBounds[boundsOffset] ?? -1) < 0) continue;\n const minX = lightBounds[boundsOffset] ?? 0;\n const minY = lightBounds[boundsOffset + 1] ?? 0;\n const minZ = lightBounds[boundsOffset + 2] ?? 0;\n const maxX = lightBounds[boundsOffset + 3] ?? -1;\n const maxY = lightBounds[boundsOffset + 4] ?? -1;\n const maxZ = lightBounds[boundsOffset + 5] ?? -1;\n const endX = maxX + 1;\n const endY = maxY + 1;\n const endZ = maxZ + 1;\n addDifference(minX, minY, minZ, 1);\n addDifference(endX, minY, minZ, -1);\n addDifference(minX, endY, minZ, -1);\n addDifference(minX, minY, endZ, -1);\n addDifference(endX, endY, minZ, 1);\n addDifference(endX, minY, endZ, 1);\n addDifference(minX, endY, endZ, 1);\n addDifference(endX, endY, endZ, -1);\n }\n for (let cz = 0; cz < gridZ; cz++) {\n for (let cy = 0; cy < gridY; cy++) {\n for (let cx = 0; cx < gridX; cx++) {\n const diffIdx = cz * diffRow + cy * diffX + cx;\n let count = clusterDeltas[diffIdx] ?? 0;\n if (cx > 0) count += clusterDeltas[diffIdx - 1] ?? 0;\n if (cy > 0) count += clusterDeltas[diffIdx - diffX] ?? 0;\n if (cz > 0) count += clusterDeltas[diffIdx - diffRow] ?? 0;\n if (cx > 0 && cy > 0) count -= clusterDeltas[diffIdx - diffX - 1] ?? 0;\n if (cx > 0 && cz > 0) count -= clusterDeltas[diffIdx - diffRow - 1] ?? 0;\n if (cy > 0 && cz > 0) count -= clusterDeltas[diffIdx - diffRow - diffX] ?? 0;\n if (cx > 0 && cy > 0 && cz > 0) {\n count += clusterDeltas[diffIdx - diffRow - diffX - 1] ?? 0;\n }\n clusterDeltas[diffIdx] = count;\n const clusterIdx = cz * gridY * gridX + cy * gridX + cx;\n clusterCounts[clusterIdx] = count;\n attemptedTotal += count;\n }\n }\n }\n });\n });\n\n if (attemptedTotal > capacity) {\n return err({\n code: 'index-overflow',\n expected: `writeCount <= ${capacity}`,\n hint: `light index list overflow: needed ${attemptedTotal} entries, capacity ${capacity}; reduce lights, shrink grid, or shrink ranges (overrun = ${attemptedTotal - capacity})`,\n detail: { actual: attemptedTotal, capacity },\n });\n }\n\n // Reserve one contiguous output run per cluster. The second light-major pass\n // below preserves each cluster's original light ordering without allocating\n // one JavaScript array per cluster.\n const writeCount = runClusterBinProfilePhase(profile, 'cluster-reserve', () => {\n let reserved = 0;\n for (let ci = 0; ci < clusterCount; ci++) {\n const base = ci * 2;\n clusterGrid[base] = reserved;\n clusterGrid[base + 1] = clusterCounts[ci] ?? 0;\n clusterCursors[ci] = reserved;\n reserved += clusterCounts[ci] ?? 0;\n }\n return reserved;\n });\n\n if (options.writeMembership !== false) {\n runClusterBinProfilePhase(profile, 'light-index-write', () => {\n for (let lightIdx = 0; lightIdx < lights.length; lightIdx++) {\n const boundsOffset = lightIdx * 6;\n let valid = false;\n let minX = 0;\n let minY = 0;\n let minZ = 0;\n let maxX = -1;\n let maxY = -1;\n let maxZ = -1;\n runClusterBinProfilePhase(profile, 'light-index-write/bounds-read', () => {\n if ((lightBounds[boundsOffset] ?? -1) < 0) return;\n valid = true;\n minX = lightBounds[boundsOffset] ?? 0;\n minY = lightBounds[boundsOffset + 1] ?? 0;\n minZ = lightBounds[boundsOffset + 2] ?? 0;\n maxX = lightBounds[boundsOffset + 3] ?? -1;\n maxY = lightBounds[boundsOffset + 4] ?? -1;\n maxZ = lightBounds[boundsOffset + 5] ?? -1;\n });\n if (!valid) continue;\n runClusterBinProfilePhase(profile, 'light-index-write/cluster-write', () => {\n for (let cz = minZ; cz <= maxZ; cz++) {\n for (let cy = minY; cy <= maxY; cy++) {\n for (let cx = minX; cx <= maxX; cx++) {\n const clusterIdx = cz * gridY * gridX + cy * gridX + cx;\n const cursor = clusterCursors[clusterIdx] ?? 0;\n lightIndexList[cursor] = lightIdx;\n clusterCursors[clusterIdx] = cursor + 1;\n }\n }\n }\n });\n }\n });\n }\n\n return ok(writeCount);\n}\n","import type { ClusterBinError } from '../../cluster-binner';\nimport { StandardClusterIndexOverflowError } from '../../errors/render';\n\nexport function fromClusterBinError(error: ClusterBinError): StandardClusterIndexOverflowError {\n return new StandardClusterIndexOverflowError(error.detail.actual, error.detail.capacity);\n}\n","import { err, ok, type Result } from '@forgeax/engine-types';\nimport { bin, type ClusterBinScratch, createClusterBinScratch } from '../../cluster-binner';\nimport type { RenderError } from '../../errors/render';\nimport { fromClusterBinError } from './errors';\nimport type { StandardClusterLayout } from './layout';\nimport type { StandardLightFrame } from './light-frame';\n\nexport interface StandardClusterMembership {\n readonly clusterGrid: Uint32Array;\n readonly lightIndexList: Uint32Array;\n readonly lightBounds: Int32Array;\n readonly membershipEntryCount: number;\n readonly scratch: ClusterBinScratch;\n}\n\nexport function deriveStandardMembership(\n frame: StandardLightFrame,\n layout: StandardClusterLayout,\n scratch = createClusterBinScratch(),\n): Result<StandardClusterMembership, RenderError> {\n const clusterGrid = new Uint32Array(layout.clusterGridU32Length);\n const lightIndexList = new Uint32Array(layout.lightIndexListCapacity);\n const result = bin(\n frame.local,\n frame.view,\n frame.projection,\n layout.grid,\n frame.near,\n frame.far,\n clusterGrid,\n lightIndexList,\n layout.lightIndexListCapacity,\n scratch,\n );\n if (!result.ok) return err(fromClusterBinError(result.error));\n return ok({\n clusterGrid,\n lightIndexList,\n lightBounds: scratch.lightBounds.slice(0, frame.local.length * 6),\n membershipEntryCount: result.value,\n scratch,\n });\n}\n","import { err, ok, type Result } from '@forgeax/engine-types';\nimport { type RenderError, StandardLightBudgetExceededError } from '../../errors/render';\nimport { MAX_LIGHTS } from '../standard-profile';\nimport { createStandardClusterLayout, type StandardClusterLayout } from './layout';\nimport type { StandardLightFrame } from './light-frame';\nimport { deriveStandardMembership, type StandardClusterMembership } from './membership';\n\nexport type { StandardLightFrame } from './light-frame';\n\nexport interface PreparedStandardLighting extends StandardClusterMembership {\n readonly directional: StandardLightFrame['directional'];\n readonly local: StandardLightFrame['local'];\n readonly layout: StandardClusterLayout;\n readonly membershipLightCount: number;\n readonly renderPath: NonNullable<StandardLightFrame['renderPath']>;\n readonly maxLights: StandardLightFrame['lightCount'];\n}\n\nexport function prepareStandardLighting(\n frame: StandardLightFrame,\n): Result<PreparedStandardLighting, RenderError> {\n if (frame.local.length > frame.lightCount || frame.local.length > MAX_LIGHTS) {\n return err(new StandardLightBudgetExceededError(frame.local.length, frame.lightCount));\n }\n const layout = createStandardClusterLayout(frame.grid);\n const membership = deriveStandardMembership(frame, layout);\n if (!membership.ok) return membership;\n return ok({\n ...membership.value,\n directional: frame.directional,\n local: frame.local,\n layout,\n membershipLightCount: frame.local.length,\n renderPath: frame.renderPath,\n maxLights: frame.lightCount,\n });\n}\n","import { err, ok, type Result } from '@forgeax/engine-types';\nimport { type RenderError, StandardClusterTransportUnavailableError } from '../../errors/render';\nimport { BYTES_PER_DIRECT_LIGHT_SLOT } from '../../light-buffer-layout';\nimport type { PreparedStandardLighting } from './prepare';\n\nexport interface StandardClusterCapabilities {\n readonly compute: boolean;\n readonly storageBuffer: boolean;\n /**\n * The graph producer is ready to encode the selected compute lane. The\n * renderer supplies this from the actual pipeline + bind-group layout; it is\n * required so capability admission cannot forge a GPU producer from\n * `compute` alone.\n */\n readonly membershipPipelineReady: boolean;\n}\n\n/** Only transports with storage-backed membership representation exist. */\nexport type StandardClusterTransportKind = 'compute-storage' | 'cpu-storage';\nexport type StandardClusterMembershipProducer = 'cpu' | 'gpu';\n\nexport interface StandardClusterTransport {\n readonly kind: StandardClusterTransportKind;\n readonly producer: StandardClusterMembershipProducer;\n readonly layout: PreparedStandardLighting['layout'];\n readonly requestedLightCount: number;\n readonly admittedLightCount: number;\n readonly membershipEntryCount: number;\n readonly occupiedClusterCount: number;\n readonly clusterGridBytes: number;\n readonly lightIndexListBytes: number;\n readonly lightDataBytes: number;\n readonly lightBoundsBytes: number;\n}\n\nfunction occupiedClusterCount(prepared: PreparedStandardLighting): number {\n let occupied = 0;\n for (let index = 1; index < prepared.clusterGrid.length; index += 2) {\n if ((prepared.clusterGrid[index] ?? 0) > 0) occupied += 1;\n }\n return occupied;\n}\n\n/**\n * Select a transport from one prepared frame. Capability facts choose only a\n * producer/storage pair; all counts and byte sizes come from that frame.\n */\nexport function selectStandardClusterTransport(\n capabilities: StandardClusterCapabilities,\n prepared: PreparedStandardLighting,\n): Result<StandardClusterTransport, RenderError> {\n const requested = prepared.local.length;\n if (!capabilities.storageBuffer) {\n return err(\n new StandardClusterTransportUnavailableError(\n requested,\n 'enable a proven storage-buffer Cluster transport; compute without storage is not a membership path',\n ),\n );\n }\n\n const producer: StandardClusterMembershipProducer =\n capabilities.compute && capabilities.membershipPipelineReady ? 'gpu' : 'cpu';\n const kind: StandardClusterTransportKind = producer === 'gpu' ? 'compute-storage' : 'cpu-storage';\n return ok({\n kind,\n producer,\n layout: prepared.layout,\n requestedLightCount: requested,\n admittedLightCount: requested,\n membershipEntryCount: prepared.membershipEntryCount,\n occupiedClusterCount: occupiedClusterCount(prepared),\n clusterGridBytes: prepared.layout.clusterGridU32Length * Uint32Array.BYTES_PER_ELEMENT,\n lightIndexListBytes: prepared.membershipEntryCount * Uint32Array.BYTES_PER_ELEMENT,\n lightDataBytes: requested * BYTES_PER_DIRECT_LIGHT_SLOT,\n lightBoundsBytes: prepared.lightBounds.byteLength,\n });\n}\n","// @forgeax/engine-runtime - fullscreen post-process error model\n// (feat-20260604-resource-owning-render-graph-and-fullscreen-postpr M2 / w12;\n// feat-20260609-learn-render-4-5-framebuffers-demo-offscreen-rt-an M1 / T-2\n// added 'fullscreen-input-not-found').\n//\n// Closed PostProcessErrorCode union + PostProcessError discriminated-union class.\n// - 'post-process-already-registered' (programmer error) -> fullscreen effect registration THROWS a\n// PostProcessError, mirroring ShaderCatalog.installMaterialArtifact's Map.has -> throw\n// fail-fast (research Finding M2-4). A second register under the same id is a coding\n// mistake that must surface immediately.\n// - 'post-process-not-found' (runtime path) -> the typed fullscreen plan returns Result.err with\n// this code when the supplied id resolves to no registered post-process (stale / wrong\n// id). AI users branch on `err.code === 'post-process-not-found'` by property access.\n// - 'fullscreen-input-not-found' (runtime path, feat-20260609 M1 / D-2) -> the\n// dispatchFullscreenPass generic branch THROWS this when reads[0] references a\n// graph resource key that the per-pass resolve context cannot resolve (typo /\n// an unregistered colorTarget / mis-ordered color-target declaration vs the typed fullscreen pass).\n// - 'ssao-radius-non-positive' (runtime path, feat-20260612-hdrp-ssao M2 / w10) ->\n// SSAO radius parameter <= 0; fires when config.ssao.radius value is non-positive.\n// - 'ssao-bias-negative' (runtime path, feat-20260612-hdrp-ssao M2 / w10) ->\n// SSAO bias parameter < 0; fires when config.ssao.bias value is negative.\n//\n// D-1: a NEW independent union rather than folding into RuntimeErrorCode /\n// RuntimeErrorCode's members are render / skin / shadow domain; a separate union\n// keeps the post-process error surface cohesive and additively evolvable.\n//\n// Also per D-4: the fullscreen effect channel is parallel to installMaterialArtifact;\n// material shader errors carry 4-BGL / 12-float-vertex / depth / triangle-list semantics,\n// while post-process errors carry 0-vertex-buffer / no-depth / input-texture-BGL semantics.\n// Mixing the two error spaces would confuse AI users who branch on code for diagnostics.\n//\n// PostProcessError is exposed as a discriminated union (variant per code, AppError pattern)\n// so `if (err.code === 'X')` simultaneously narrows `err.detail` to the per-code payload.\n//\n// Related: requirements M2 AC-08 + AC-19; plan-strategy D-4 / D-9; charter P3 / P4;\n// feat-20260609 M1 plan-decisions D-2 (L-1 lock to scheme B - new closed-set member).\n\n/**\n * Closed union of fullscreen post-process error codes.\n *\n * AI users perform exhaustive `switch (err.code)` without a default\n * and TS guards completeness (AC-08).\n *\n * | code | channel | trigger |\n * |:--|:--|:--|\n * | `'post-process-already-registered'` | throw | a second fullscreen effect registration under an already-registered `id` |\n * | `'post-process-not-found'` | throw / `Result.err` | a typed fullscreen plan whose `shader` id resolves to no registered post-process |\n * | `'fullscreen-input-not-found'` | throw | a typed fullscreen plan whose `reads` key is not a graph-declared color target, or a depth key missing TEXTURE_BINDING (D-4) |\n * | `'ssao-radius-non-positive'` | throw | SSAO `radius <= 0` |\n * | `'ssao-bias-negative'` | throw | SSAO `bias < 0` |\n * | `'params-size-mismatch'` | throw | a fullscreen effect declaration with `params.byteSize < 16` or `defaultValue.length !== byteSize` (feat-20260621 M-A4 / D-4) |\n * | `'params-update-size-mismatch'` | throw | per-frame data-driven write where `PostProcessParams.data` byteLength !== registered `params.byteSize` (feat-20260621 M-A4 / D-4) |\n */\nexport type PostProcessErrorCode = keyof typeof POST_PROCESS_POLICY;\n\n/**\n * Detail for `'post-process-already-registered'`: the post-process id that was already taken.\n * AI consumers read `.detail.id` by property access (charter P4), no message parsing.\n */\nexport interface PostProcessPreviouslyRegisteredDetail {\n readonly id: string;\n}\n\n/**\n * Detail for `'post-process-not-found'`: the post-process id that resolved to no\n * registered entry. Read via `.detail.id` after the code guard.\n */\nexport interface PostProcessNotFoundDetail {\n readonly id: string;\n}\n\n/**\n * Detail for `'fullscreen-input-not-found'`: the graph resource key that the\n * per-pass resolve context could not resolve, plus the pass name that referenced\n * it. Both fields are read via property access after `if (err.code === 'fullscreen-input-not-found')`\n * (charter P4); the AI user immediately knows WHICH key to declare and WHICH\n * pass needs wiring.\n */\nexport interface FullscreenInputNotFoundDetail {\n /** The reads[0] key that resolved to undefined (e.g. 'offscreenColor' / 'hdrColor'). */\n readonly readsKey: string;\n /** The name assigned to the typed fullscreen pass (e.g. 'pp' / 'post'). */\n readonly passName: string;\n}\n\n/**\n * Detail for `'ssao-radius-non-positive'`: the SSAO radius parameter was zero or negative.\n * AI consumers read `.detail.paramName` / `.detail.value` by property access (charter P4).\n */\nexport interface SsaoRadiusNonPositiveDetail {\n readonly paramName: string;\n readonly value: number;\n}\n\n/**\n * Detail for `'ssao-bias-negative'`: the SSAO bias parameter was negative.\n * AI consumers read `.detail.paramName` / `.detail.value` by property access.\n */\nexport interface SsaoBiasNegativeDetail {\n readonly paramName: string;\n readonly value: number;\n}\n\n/**\n * Detail for `'params-size-mismatch'`: the register call's byteSize / defaultValue.length\n * is invalid. Carries `byteSize` (the declared size) and `actualLength` (defaultValue.length).\n * AI consumers read `.detail.byteSize` / `.detail.actualLength` after the code guard.\n */\nexport interface PostProcessParamsSizeMismatchDetail {\n readonly byteSize: number;\n readonly actualLength: number;\n}\n\n/**\n * Detail for `'params-update-size-mismatch'`: the per-frame data-driven write\n * (PostProcessParams.data) had a byteLength that did not equal the registered\n * `params.byteSize`. Carries `byteSize` (registered) + `actualLength` (the\n * supplied data byteLength). AI consumers read `.detail.byteSize` /\n * `.detail.actualLength` after the code guard.\n *\n * NOTE (feat-20260621 M-A2): this code is wired here so dispatchFullscreenPass\n * can fail-fast on a mismatched per-frame write; the full error-model\n * formalization (expected/hint refinement, JSDoc member count, public\n * PostProcessError union variant) is finished in M-A4.\n */\nexport interface PostProcessParamsUpdateSizeMismatchDetail {\n readonly byteSize: number;\n readonly actualLength: number;\n}\n\n/**\n * Conditional resolver from `PostProcessErrorCode` to its detail payload type. Used by the\n * constructor signature so `new PostProcessError({ code: 'X', detail })` narrows the\n * `detail` parameter to the variant payload at compile time.\n */\nexport type PostProcessErrorDetailFor<C extends PostProcessErrorCode> =\n C extends 'ssao-parameter-invalid'\n ? { readonly paramName: string; readonly value: unknown }\n : C extends 'post-process-already-registered'\n ? PostProcessPreviouslyRegisteredDetail\n : C extends 'post-process-not-found'\n ? PostProcessNotFoundDetail\n : C extends 'fullscreen-input-not-found'\n ? FullscreenInputNotFoundDetail\n : C extends 'ssao-radius-non-positive'\n ? SsaoRadiusNonPositiveDetail\n : C extends 'ssao-bias-negative'\n ? SsaoBiasNegativeDetail\n : C extends 'params-size-mismatch'\n ? PostProcessParamsSizeMismatchDetail\n : C extends 'params-update-size-mismatch'\n ? PostProcessParamsUpdateSizeMismatchDetail\n : never;\n\n/**\n * Tagged union of `.detail` payloads. The variants are unique by structural fields\n * (`{ id }` for the two id-by-string variants vs `{ readsKey, passName }` for the\n * graph-resource-miss variant); the code discriminator narrows the intent across\n * the two id-shaped variants.\n */\nexport type PostProcessErrorDetail = PostProcessErrorDetailFor<PostProcessErrorCode>;\n\nconst POST_PROCESS_POLICY = {\n 'post-process-already-registered': {\n expected: 'each post-process id is registered at most once',\n hint: (detail) =>\n `post-process id '${(detail as PostProcessPreviouslyRegisteredDetail).id}' is already ` +\n 'registered; same-id re-register is forbidden. Pick a distinct id ' +\n '(engine builtins use the forgeax:: prefix; user passes use <package>::<id>).',\n },\n 'post-process-not-found': {\n expected: 'typed fullscreen plan references a registered post-process id',\n hint: (detail) =>\n `no post-process is registered for id '${(detail as PostProcessNotFoundDetail).id}'. ` +\n 'For Engine-owned effects, rebuild the shader manifest with that Engine entry enabled. ' +\n `For custom effects, register '${(detail as PostProcessNotFoundDetail).id}' with the feature host ({source, reads?}), ` +\n 'then reference it from a typed fullscreen RenderFeaturePlan.',\n },\n 'fullscreen-input-not-found': {\n expected: 'reads key must be a graph-declared colorTarget with TEXTURE_BINDING',\n hint: (detail) => {\n const d = detail as FullscreenInputNotFoundDetail;\n return (\n `fullscreen pass '${d.passName}' references reads key '${d.readsKey}' but that key is not ` +\n `declared as a graph color target, or the target is not sampleable as a texture. ` +\n `First declare graph color target '${d.readsKey}' with its format and size ` +\n `(or check spelling) before the typed fullscreen pass '${d.passName}' reads it. ` +\n `If '${d.readsKey}' is a depth target, ensure it has TEXTURE_BINDING usage (0x04) ` +\n `and is declared via graph.addColorTarget. Consider switching pipeline if your pipeline does not expose a sampleable depth target.`\n );\n },\n },\n 'ssao-parameter-invalid': {\n expected: 'finite non-negative SSAO intensity and low, medium, or high quality',\n hint: () =>\n 'Set ssao.intensity to a finite non-negative value and ssao.quality to low, medium, or high.',\n },\n 'ssao-radius-non-positive': {\n expected: 'SSAO radius must be > 0',\n hint: (detail) => {\n const d = detail as SsaoRadiusNonPositiveDetail;\n return (\n `SSAO parameter '${d.paramName}' is ${d.value}, must be greater than 0. ` +\n `Set config.ssao.${d.paramName} to a positive value (default 0.5) or disable SSAO with config.ssao.enabled = false.`\n );\n },\n },\n 'ssao-bias-negative': {\n expected: 'SSAO bias must be >= 0',\n hint: (detail) => {\n const d = detail as SsaoBiasNegativeDetail;\n return (\n `SSAO parameter '${d.paramName}' is ${d.value}, must be >= 0. ` +\n `Set config.ssao.${d.paramName} to a non-negative value (default 0.025) or disable SSAO.`\n );\n },\n },\n 'params-size-mismatch': {\n expected: 'params.byteSize >= 16 and defaultValue.length === byteSize',\n hint: (detail) => {\n const d = detail as PostProcessParamsSizeMismatchDetail;\n return (\n `params.byteSize is ${d.byteSize} but defaultValue.length is ${d.actualLength}. ` +\n 'The UBO byteSize must be >= 16 B and defaultValue.length must equal byteSize. ' +\n 'Pass a defaultValue Uint8Array whose .length matches byteSize exactly.'\n );\n },\n },\n 'params-update-size-mismatch': {\n expected: 'PostProcessParams.data byteLength === registered params.byteSize',\n hint: (detail) => {\n const d = detail as PostProcessParamsUpdateSizeMismatchDetail;\n return (\n `PostProcessParams.data byteLength is ${d.actualLength} but the registered ` +\n `params.byteSize is ${d.byteSize}. The per-frame data-driven write must match ` +\n 'the registered byteSize exactly; check the PostProcessParams.data you assign each frame.'\n );\n },\n },\n} satisfies Record<\n string,\n {\n readonly expected: string;\n readonly hint: (detail: unknown) => string;\n }\n>;\n\nclass PostProcessErrorClass<C extends PostProcessErrorCode> extends Error {\n readonly code: C;\n readonly expected: string;\n readonly hint: string;\n readonly detail: PostProcessErrorDetailFor<C>;\n\n constructor(args: { code: C; detail: PostProcessErrorDetailFor<C> }) {\n const policy = POST_PROCESS_POLICY[args.code];\n const hint = policy.hint(args.detail);\n super(`post-process: ${args.code} (${hint})`);\n this.name = 'PostProcessError';\n this.code = args.code;\n this.expected = policy.expected;\n this.hint = hint;\n this.detail = args.detail;\n }\n}\n\n/**\n * Variant intersection: a `PostProcessErrorClass` instance whose `code` literal narrows to\n * `C` and whose `detail` narrows to `PostProcessErrorDetailFor<C>`, so `if (err.code === 'X')`\n * simultaneously narrows `err.detail` (charter P3 + P4 discriminated union).\n */\ntype PostProcessErrorVariant<C extends PostProcessErrorCode> = PostProcessErrorClass<C> & {\n readonly code: C;\n readonly detail: PostProcessErrorDetailFor<C>;\n};\n\ninterface PostProcessErrorConstructor {\n new <C extends PostProcessErrorCode>(args: {\n code: C;\n detail: PostProcessErrorDetailFor<C>;\n }): PostProcessErrorVariant<C>;\n readonly prototype: PostProcessErrorClass<PostProcessErrorCode>;\n}\n\n/**\n * Public PostProcessError type - mapped from the authoritative code union.\n *\n * ```ts\n * function recover(err: PostProcessError): string {\n * switch (err.code) {\n * case 'post-process-already-registered': return `id taken: ${err.detail.id}`;\n * case 'post-process-not-found': return `bad id: ${err.detail.id}`;\n * case 'fullscreen-input-not-found': return `bad reads key: ${err.detail.readsKey} on pass ${err.detail.passName}`;\n * }\n * }\n * ```\n */\nexport type PostProcessError = {\n [C in PostProcessErrorCode]: PostProcessErrorVariant<C>;\n}[PostProcessErrorCode];\n\n/**\n * PostProcessError constructor - `new PostProcessError({ code, detail })`.\n *\n * The generic `C` is inferred from the literal `code` argument, which narrows `detail` to\n * the per-code payload (`PostProcessErrorDetailFor<C>`) and narrows the return type to the\n * corresponding `PostProcessErrorVariant<C>` so the call site walks the discriminated union\n * without manual cast (AppError pattern; TS class declarations cannot directly express\n * `<C> ... PostProcessErrorVariant<C>` polymorphism, hence the typed-cast affordance).\n */\nexport const PostProcessError: PostProcessErrorConstructor = PostProcessErrorClass;\n","// @forgeax/engine-render - SSAO parameter authority.\n\nimport { err, ok, type RenderPipelineAsset, type Result } from '@forgeax/engine-types';\nimport { PostProcessError } from './post-process-errors';\n\nexport const SSAO_DEFAULT_RADIUS = 0.5;\nexport const SSAO_DEFAULT_BIAS = 0.025;\nexport const SSAO_DEFAULT_INTENSITY = 1.0;\n\nexport type SsaoParameterConfig = Omit<\n NonNullable<NonNullable<RenderPipelineAsset['config']>['ssao']>,\n 'enabled'\n>;\n\nexport const SSAO_SAMPLE_COUNTS = { low: 16, medium: 32, high: 64 } as const;\n\nexport interface ResolvedSsaoParameters {\n readonly radius: number;\n readonly bias: number;\n readonly intensity: number;\n readonly quality: 'low' | 'medium' | 'high';\n}\n\n/**\n * Apply the public defaults without deciding whether the values are valid.\n * The record stage uses this only after the graph build has validated the\n * active HDRP configuration, or for the disabled/default fallback payload.\n */\nexport function getSsaoParameters(config: SsaoParameterConfig | undefined): ResolvedSsaoParameters {\n return {\n radius: config?.radius ?? SSAO_DEFAULT_RADIUS,\n bias: config?.bias ?? SSAO_DEFAULT_BIAS,\n intensity: config?.intensity ?? SSAO_DEFAULT_INTENSITY,\n quality: config?.quality ?? 'high',\n };\n}\n\n/**\n * Resolve and validate the SSAO configuration used by both graph routes.\n * Invalid values remain structured PostProcessErrors instead of becoming\n * NaNs or silently falling back to shader literals.\n */\nexport function resolveSsaoParameters(\n config: SsaoParameterConfig | undefined,\n): Result<ResolvedSsaoParameters, PostProcessError> {\n const resolved = getSsaoParameters(config);\n if (!Number.isFinite(resolved.radius) || resolved.radius <= 0) {\n return err(\n new PostProcessError({\n code: 'ssao-radius-non-positive',\n detail: { paramName: 'radius', value: resolved.radius },\n }),\n );\n }\n if (!Number.isFinite(resolved.bias) || resolved.bias < 0) {\n return err(\n new PostProcessError({\n code: 'ssao-bias-negative',\n detail: { paramName: 'bias', value: resolved.bias },\n }),\n );\n }\n if (\n !Number.isFinite(resolved.intensity) ||\n resolved.intensity < 0 ||\n !Object.hasOwn(SSAO_SAMPLE_COUNTS, resolved.quality)\n ) {\n const paramName =\n !Number.isFinite(resolved.intensity) || resolved.intensity < 0 ? 'intensity' : 'quality';\n return err(\n new PostProcessError({\n code: 'ssao-parameter-invalid',\n detail: { paramName, value: resolved[paramName] },\n }),\n );\n }\n return ok(resolved);\n}\n","// @forgeax/engine-runtime - RenderSystem record stage: helpers.\n// Extracted from render-system-record.ts (feat-20260704 M3/w17, pure move).\n\nimport { resolveAssetHandle } from '@forgeax/engine-assets-runtime';\nimport type { World } from '@forgeax/engine-ecs';\nimport { type Mat4, mat4 } from '@forgeax/engine-math';\nimport type { EquirectAsset } from '@forgeax/engine-types';\nimport { toShared } from '@forgeax/engine-types';\nimport { EquirectProjectionFailedError } from '../errors/render';\nimport { isStandardPbrMaterialShader } from '../pbr-pipeline';\nimport type { CameraSnapshot } from '../render-contract';\nimport type { MaterialSnapshot, SkyboxSnapshot, SkylightSnapshot } from '../render-system-extract';\nimport type { RenderFrameState } from './frame-snapshot';\nimport type { RenderSystemInternals } from './render-context';\n\n/** Convert pass-owned shader definitions into the manifest's canonical variant key. */\nexport function variantSetFromDefines(\n defines: Readonly<Record<string, string>> | undefined,\n): string | undefined {\n if (defines === undefined) return undefined;\n const entries = Object.entries(defines);\n if (entries.length === 0) return undefined;\n return entries\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([name, value]) => `${name}=${value}`)\n .join('+');\n}\n\n/**\n * Select the equirect source for the shared lazy projection.\n *\n * Skylight uses handle 0 as a real \"solid-color ambient\" sentinel, so nullish\n * coalescing cannot distinguish \"no equirect\" from a valid snapshot. Prefer a\n * non-zero Skylight handle and fall back to SkyboxBackground otherwise.\n */\nexport function selectLazyEquirectHandle(\n skylight: Pick<SkylightSnapshot, 'equirectHandle'> | undefined,\n skybox: Pick<SkyboxSnapshot, 'equirectHandle'> | undefined,\n): number {\n const skylightHandle = skylight?.equirectHandle ?? 0;\n return skylightHandle !== 0 ? skylightHandle : (skybox?.equirectHandle ?? 0);\n}\n\n/**\n * feat-20260608-multi-light-warn-once M3: warn-once latch for directional\n * N>1 overrun. Fires console.warn at most once per RenderSystem lifetime.\n * Extracted as a pure helper so the warn-once logic is directly testable\n * without a full recordFrame argument list (AC-05 (c)).\n */\nexport function warnMultiLightDirectional(\n frameState: Pick<RenderFrameState, 'warnedMultiLightDirectional'>,\n directionalCount: number,\n envOverride?: { env?: { NODE_ENV?: string } },\n): void {\n if (!frameState.warnedMultiLightDirectional && directionalCount > 1) {\n frameState.warnedMultiLightDirectional = true;\n const env =\n envOverride ?? (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process;\n if (env?.env?.NODE_ENV !== 'production') {\n console.warn(\n '[forgeax] render-system-multi-light directional: at most 1 entity (got N=' +\n directionalCount +\n '). First entity used; rest dropped.',\n {\n code: 'render-system-multi-light',\n expected: 'at most 1 directional',\n detail: { type: 'directional', got: directionalCount },\n },\n );\n }\n }\n}\n\n/**\n * feat-20260630-equirect-kind-internalized-ibl-declarative-skyligh M3 / w19:\n * once-warn for >1 Skylight entity (first archetype hit wins). Fires at most\n * once per RenderSystem lifetime and names the WINNING entity handle so the\n * scene author can tell which Skylight is used and that the rest are ignored\n * (F-8: warn carries conflicting entity info; charter P3 explicit failure with\n * a warn-once signal floor, no per-frame flooding).\n */\nexport function warnMultiSkylight(\n frameState: Pick<RenderFrameState, 'warnedMultiSkylight'>,\n skylightCount: number,\n winningEntityHandle: number,\n): void {\n if (!frameState.warnedMultiSkylight && skylightCount > 1) {\n frameState.warnedMultiSkylight = true;\n console.warn(\n `[forgeax] Skylight: ${skylightCount} Skylight entities found; using entity ` +\n `${winningEntityHandle} (first by archetype order) for IBL ambient. The other ` +\n `${skylightCount - 1} Skylight ${skylightCount - 1 === 1 ? 'entity is' : 'entities are'} ignored. ` +\n `Keep a single Skylight per scene, or reorder so the intended one is first.`,\n );\n }\n}\n\n/**\n * feat-20260630-equirect-kind-internalized-ibl-declarative-skyligh M3 / w19:\n * once-warn for >1 SkyboxBackground entity (mirrors warnMultiSkylight). Names\n * the winning entity handle; fires once per RenderSystem lifetime.\n */\nexport function warnMultiSkybox(\n frameState: Pick<RenderFrameState, 'warnedMultiSkybox'>,\n skyboxCount: number,\n winningEntityHandle: number,\n): void {\n if (!frameState.warnedMultiSkybox && skyboxCount > 1) {\n frameState.warnedMultiSkybox = true;\n console.warn(\n `[forgeax] SkyboxBackground: ${skyboxCount} SkyboxBackground entities found; using ` +\n `entity ${winningEntityHandle} (first by archetype order). The other ` +\n `${skyboxCount - 1} ${skyboxCount - 1 === 1 ? 'entity is' : 'entities are'} ignored. ` +\n `Keep a single SkyboxBackground per scene.`,\n );\n }\n}\n\n/**\n * feat-20260630-equirect-kind-internalized-ibl-declarative-skyligh M3 / w18:\n * lazy equirect-to-cubemap projection trigger. Driven once per frame from\n * `recordFrame` for the active equirect handle (Skylight's, or the\n * SkyboxBackground's when no Skylight cubemap is present -- both reuse one\n * handle). Implements the plan-strategy D-4 state machine:\n *\n * undefined (no entry) -> resolve POD + fire-and-forget projection; the\n * store selects rgba8 output on WebGL2\n * (the store writes status:'pending'\n * synchronously, so this launches once)\n * pending -> in flight; bind white fallback (no fire)\n * ready -> bound by recordMainPass's IBL cache check\n * failed -> fire EquirectProjectionFailedError ONCE\n * per handle (R-2/AC-09 no retry)\n * Fire-and-forget: `_uploadCubemapFromEquirect` is invoked WITHOUT await so the\n * record stay synchronous; the store mutates its own status map and (on\n * success) the per-device IblPipelineCache, which recordMainPass reads on a\n * later frame. The structured error from a fire-and-forget failure is reported\n * via the explicit `status === 'failed'` arm here (read on the next frame), not\n * by awaiting the promise (which would block record).\n */\nexport function driveLazyEquirectProjection(\n internals: RenderSystemInternals,\n world: World,\n frameState: Pick<RenderFrameState, 'firedEquirectProjectionFailedHandles'>,\n equirectHandle: number,\n): void {\n const store = internals.gpuStore;\n const handle = toShared<'EquirectAsset'>(equirectHandle);\n const status = store.getCubemapStatus(handle);\n\n if (status === 'failed') {\n // Fire the structured error exactly once per failed source (the store\n // records failed permanently and never retries; R-2 / AC-09).\n if (!frameState.firedEquirectProjectionFailedHandles.has(equirectHandle)) {\n frameState.firedEquirectProjectionFailedHandles.add(equirectHandle);\n internals.errorRegistry.fire(new EquirectProjectionFailedError(equirectHandle));\n }\n return;\n }\n\n // 'pending' and 'ready' are both handled downstream (white fallback while\n // pending; real IBL once ready). Only the first sight ('undefined') launches.\n if (status !== undefined) return;\n\n // First sight: resolve the equirect POD and fire-and-forget the projection.\n const podRes = resolveAssetHandle<EquirectAsset>(world, handle);\n if (!podRes.ok || podRes.value.kind !== 'equirect') {\n // The handle does not resolve to a live equirect POD (stale / wrong kind).\n // Launch nothing; the store stays empty and the white fallback holds. The\n // skybox / IBL degradation paths surface the missing resource per their own\n // gates -- this trigger only drives a valid equirect source.\n return;\n }\n // Fire-and-forget: do NOT await. The store writes status:'pending'\n // synchronously (before its first await), so a re-entry next frame\n // short-circuits and this launches exactly once.\n void store._uploadCubemapFromEquirect(world, handle, podRes.value);\n}\n\n/**\n * Returns true when a MaterialSnapshot uses a builtin standard/PBR shader\n * that will render black with zero lights.\n *\n * The default mid-grey fallback (materialShaderId === undefined) is excluded\n * — it routes through defaultMaterialSnapshot and never triggers the\n * zero-light warning. Custom shaders are also excluded: their lighting\n * contract is authored by the shader and cannot be inferred from this\n * generic diagnostic.\n *\n * @internal — exported so AC-02 zero-light-warning test can anchor to\n * the production implementation rather than a test-local copy.\n */\nexport function isLitMaterialSnapshot(material: MaterialSnapshot): boolean {\n return isStandardPbrMaterialShader(material.materialShaderId);\n}\n\nexport function computeViewMatrix(camera: CameraSnapshot): Mat4 {\n // feat-20260601 D-3: view = invert(camera world mat4). The camera's resolved\n // world mat4 (propagateTransforms output) is read straight off the snapshot;\n // no recompose from decomposed TRS.\n const cameraFromWorld = mat4.create();\n mat4.invert(cameraFromWorld, camera.world);\n return cameraFromWorld;\n}\n\nexport function computeProjectionMatrix(camera: CameraSnapshot): Mat4 {\n // feat-20260613 M6 / w20: branch on projection variant. The view UBO\n // record path needs the right matrix shape so the main pass renders\n // correctly under both perspective and orthographic cameras (mirrors\n // the CSM extract fix in render-system-extract.ts).\n const proj = mat4.create();\n if (camera.projection === 'orthographic') {\n mat4.orthographic(\n proj,\n camera.orthoLeft,\n camera.orthoRight,\n camera.orthoTop,\n camera.orthoBottom,\n camera.near,\n camera.far,\n );\n } else {\n mat4.perspective(proj, camera.fov, camera.aspect, camera.near, camera.far);\n }\n return proj;\n}\n","// @forgeax/engine-runtime - RenderSystem record stage: view-ubo.\n// feat-20260704 M3/w18: the View UBO + CSM/spot-shadow matrix pack assembly\n// extracted verbatim from `recordFrame` (frame.ts). Builds the 240-float View\n// UBO payload (worldViewProj, directional light, camera pos, per-cascade\n// lightViewProj matrices, split planes, shadow bias, folded spot lightViewProj\n// lanes) and flushes it in one queue.writeBuffer round-trip. Kept as a\n// standalone function so recordFrame stays an orchestration skeleton (D-2).\n\nimport { mat4 } from '@forgeax/engine-math';\nimport type { Buffer, RhiQueue } from '@forgeax/engine-rhi';\nimport type { DirectionalShadowQuality } from '../components/directional-shadow-filter';\nimport type { PointsLinesStyle } from '../points-lines/snapshot';\nimport type { CameraSnapshot } from '../render-contract';\nimport type {\n DirectionalLightSnapshot,\n ExtractedLights,\n SpotLightSnapshot,\n} from '../render-system-extract';\nimport { SHADOW_ATLAS_DEFAULT_LAYERS } from '../shadow-atlas';\nimport type { TemporalView as LegacyTemporalView } from '../temporal/temporal-view';\nimport type { TemporalView } from '../temporal/view';\nimport { computeProjectionMatrix, computeViewMatrix } from './helpers';\n\nexport const VIEW_UNIFORM_BYTES = 960;\nexport const POINTS_LINES_VIEW_BYTES = 160;\nexport const POINTS_LINES_VIEW_SLOT_STRIDE = 256;\nexport const POINTS_LINES_VIEW_SLOT_COUNT = 1024;\nexport const POINTS_LINES_VIEW_BUFFER_SIZE =\n POINTS_LINES_VIEW_SLOT_STRIDE * POINTS_LINES_VIEW_SLOT_COUNT;\nexport const VIEW_UNIFORM_SLOT_STRIDE = 1024;\nexport const POINT_SHADOW_VIEW_SLOT_COUNT = 24;\nexport const CUBE_CAPTURE_VIEW_SLOT_BASE = 1 + POINT_SHADOW_VIEW_SLOT_COUNT;\nexport const REFLECTION_PROBE_VIEW_SLOT_BASE = CUBE_CAPTURE_VIEW_SLOT_BASE + 6;\nexport const REFLECTION_PROBE_VIEW_SLOT_COUNT = 16;\nexport const VIEW_UNIFORM_BUFFER_SIZE =\n VIEW_UNIFORM_SLOT_STRIDE * (REFLECTION_PROBE_VIEW_SLOT_BASE + REFLECTION_PROBE_VIEW_SLOT_COUNT);\n\nexport function pointShadowViewOffset(layer: number, face: number): number {\n return VIEW_UNIFORM_SLOT_STRIDE * (1 + layer * 6 + face);\n}\n\n/** Project the accepted Directional quality union into the frozen View ABI. */\nfunction directionalShadowFilterCarrier(\n quality: DirectionalShadowQuality | undefined,\n): readonly [number, number, number, number] {\n if (quality === undefined) return [0, 0, 0, 0];\n if (quality.kind === 'pcss') {\n return [\n quality.preset === 'medium' ? 4 : 5,\n quality.angularRadiusRadians,\n quality.maxPenumbraTexels,\n 0,\n ];\n }\n switch (quality.kernel) {\n case 1:\n return [1, 0, 0, 0];\n case 3:\n return [2, 0, 0, 0];\n case 5:\n return [3, 0, 0, 0];\n }\n}\n\nexport function writePointsLinesViewUbo(\n queue: RhiQueue,\n buffer: Buffer,\n camera: CameraSnapshot,\n width: number,\n height: number,\n model?: ArrayLike<number>,\n style?: PointsLinesStyle,\n byteOffset = 0,\n): void {\n const projection = computeProjectionMatrix(camera);\n const view = computeViewMatrix(camera);\n const worldViewProj = mat4.create();\n mat4.multiply(worldViewProj, projection, view);\n const payload = new Float32Array(40);\n payload.set(worldViewProj);\n if (model === undefined) {\n payload[16] = 1;\n payload[21] = 1;\n payload[26] = 1;\n payload[31] = 1;\n } else {\n for (let index = 0; index < 16; index += 1) {\n payload[16 + index] = model[index] ?? 0;\n }\n }\n payload[32] = width;\n payload[33] = height;\n if (style?.kind === 'points') {\n payload[36] = style.sizePx;\n payload[38] = style.shape === 'circle' ? 1 : 0;\n } else if (style?.kind === 'lines') {\n payload[36] = style.widthPx;\n payload[37] = 1;\n } else {\n payload[36] = 1;\n }\n const uploaded = queue.writeBuffer(buffer, byteOffset, payload);\n if (!uploaded.ok) throw uploaded.error;\n}\n\n/**\n * feat-20260704 M3/w18: assemble + upload the per-frame View UBO payload.\n *\n * feat-20260518 M3 / w14 (AC-07 / AC-09): builds the full view UBO payload.\n * Single queue.writeBuffer covers the whole payload (one round-trip per frame,\n * charter P5 consistent abstraction). Outgoing-direction convention\n * (DirectionalLight @semantics outgoing): the host uploads light.direction\n * verbatim; the shader negates it internally via\n * `let l = normalize(-view.lightDir)` to get the L vector for BRDF (single\n * SSOT, no double-negation).\n *\n * feat-20260520-directional-light-shadow-mapping M1b / w7 + feat-20260613-csm\n * M4 / w16+w25: viewPayload is 240 floats. Layout matches common.wgsl View\n * struct byte-for-byte:\n * [ 0..15] worldViewProj, [16..18] lightDir, [20..22] lightColor,\n * [24..26] cameraPos, [28..43] lightViewProj0 (was lightSpaceMatrix),\n * [44..59] inverseViewProj, [60..75] lightViewProj1,\n * [76..91] lightViewProj2, [92..107] lightViewProj3,\n * [108..123] splitPlanes (vec4 lanes: split/world texel/depth span/reserved),\n * [124] cascadeCount, [125] cascadeBlend,\n * [126] depthBias, [127] normalBias,\n * [128..131] directionalShadowFilter (profile/radius/max penumbra/reserved),\n * [132..195] spotLightViewProj array<mat4x4<f32>, 4> (feat-20260625 w25:\n * folded from standalone binding 9 to fix WebGL2 fragment uniform-buffer\n * overflow; lane N = spot with shadowAtlasTile === N, 16 f32 / lane,\n * 16 B-aligned at byte 528 = float 132).\n * [236..239] ssrParams (maxDistance, thickness, maxRoughness, enabled).\n *\n * @internal\n */\nexport function writeViewUbo(\n queue: RhiQueue,\n viewUniformBuffer: Buffer,\n camera: CameraSnapshot,\n light: DirectionalLightSnapshot,\n lights: ExtractedLights,\n spotShadowSnapshots: readonly SpotLightSnapshot[],\n temporalOrOffset?: TemporalView | LegacyTemporalView | number,\n projectorSpotIndex?: number,\n): void {\n const byteOffset = typeof temporalOrOffset === 'number' ? temporalOrOffset : 0;\n const resolvedTemporal = typeof temporalOrOffset === 'number' ? undefined : temporalOrOffset;\n // Compose worldViewProj once per frame (view * proj).\n const projMatrix = computeProjectionMatrix(camera);\n const viewMatrix = computeViewMatrix(camera);\n const unjitteredViewProjection = mat4.create();\n mat4.multiply(unjitteredViewProjection, projMatrix, viewMatrix);\n const jitteredProjection = mat4.create();\n if (resolvedTemporal?.currentJitterUv !== undefined) {\n const jitter = mat4.identity(mat4.create());\n jitter[12] = resolvedTemporal.currentJitterUv[0] * 2;\n jitter[13] = resolvedTemporal.currentJitterUv[1] * -2;\n mat4.multiply(jitteredProjection, jitter, projMatrix);\n } else {\n for (let i = 0; i < 16; i += 1) jitteredProjection[i] = projMatrix[i] ?? 0;\n }\n const mainProjection = mat4.create();\n mat4.multiply(mainProjection, jitteredProjection, viewMatrix);\n\n const VIEW_PAYLOAD_FLOATS = 240;\n const viewPayload = new Float32Array(VIEW_PAYLOAD_FLOATS);\n for (let i = 0; i < 16; i++) viewPayload[i] = mainProjection[i] ?? 0;\n viewPayload[16] = light.direction[0] ?? 0;\n viewPayload[17] = light.direction[1] ?? -1;\n viewPayload[18] = light.direction[2] ?? 0;\n viewPayload[20] = light.color[0] ?? 0;\n viewPayload[21] = light.color[1] ?? 0;\n viewPayload[22] = light.color[2] ?? 0;\n viewPayload[24] = camera.position[0] ?? 0;\n viewPayload[25] = camera.position[1] ?? 0;\n viewPayload[26] = camera.position[2] ?? 0;\n // lightViewProj[0] at [28..43] (replaces lightSpaceMatrix).\n if (lights.lightViewProj !== undefined && lights.lightViewProj[0] !== undefined) {\n for (let i = 0; i < 16; i++) viewPayload[28 + i] = lights.lightViewProj[0][i] ?? 0;\n }\n // inverseViewProj at [44..59] — unchanged position.\n // Host pre-computes mat4.invert so the skybox fragment shader avoids\n // per-pixel matrix inversion (charter P4 consistent abstraction).\n const inverseViewProj = mat4.create();\n mat4.invert(inverseViewProj, mainProjection);\n for (let i = 0; i < 16; i++) viewPayload[44 + i] = inverseViewProj[i] ?? 0;\n // lightViewProj[1..3] at [60..107].\n if (lights.lightViewProj !== undefined) {\n for (let c = 1; c <= 3; c++) {\n const base = 60 + (c - 1) * 16;\n const lvp = lights.lightViewProj[c];\n if (lvp !== undefined) {\n for (let i = 0; i < 16; i++) viewPayload[base + i] = lvp[i] ?? 0;\n }\n }\n }\n\n // Temporal ABI tail: current and last-successful unjittered projections\n // stay separate from the jittered main projection and never advance on a\n // failed submission. The fixed 240-float payload already reserves these\n // 36 slots at byte offsets 784..920.\n const previous = resolvedTemporal?.previousUnjitteredViewProjection;\n for (let i = 0; i < 16; i += 1) {\n viewPayload[196 + i] = unjitteredViewProjection[i] ?? 0;\n // No previous successful frame exists on first frame/reset. Keep this\n // lane zeroed instead of copying current state into a history slot.\n viewPayload[212 + i] = previous?.[i] ?? 0;\n }\n viewPayload[228] = camera.near;\n viewPayload[229] = camera.far;\n viewPayload[230] = camera.projection === 'orthographic' ? 1 : 0;\n const previousCameraPosition =\n resolvedTemporal !== undefined && 'previousCameraPosition' in resolvedTemporal\n ? resolvedTemporal.previousCameraPosition\n : undefined;\n if (previousCameraPosition !== undefined) {\n viewPayload[232] = previousCameraPosition[0] ?? 0;\n viewPayload[233] = previousCameraPosition[1] ?? 0;\n viewPayload[234] = previousCameraPosition[2] ?? 0;\n viewPayload[235] = 1;\n }\n // SSR uses the fixed View tail as its single per-camera parameter carrier.\n // Admission has already validated these values; the enabled lane remains\n // zero when the component is absent so disabled frames carry no demand.\n const ssr = camera.screenSpaceReflection;\n if (ssr !== undefined) {\n viewPayload[236] = ssr.maxDistance;\n viewPayload[237] = ssr.thickness;\n viewPayload[238] = ssr.maxRoughness;\n viewPayload[239] = 1;\n }\n // splitPlanes at [108..123] (four vec4 lanes: split/world texel/depth span/reserved).\n if (lights.splitPlanes !== undefined) {\n for (let s = 0; s < 4; s++) {\n for (let lane = 0; lane < 4; lane++) {\n viewPayload[108 + s * 4 + lane] = lights.splitPlanes[s * 4 + lane] ?? 0;\n }\n }\n }\n // cascadeCount / cascadeBlend at [124..125].\n viewPayload[124] = lights.cascadeCount ?? 0;\n viewPayload[125] = lights.cascadeBlend ?? 0;\n // M1 directional shadow carrier: bias remains at [126]/[127], while the\n // accepted quality union occupies the existing four-float tail [128..131].\n // Point and Spot pcfKernelSize stay in their own snapshot paths and never\n // enter this Directional View projection.\n viewPayload[126] = lights.depthBias ?? 0.00001;\n viewPayload[127] = lights.normalBias ?? 0.05;\n const filterCarrier = directionalShadowFilterCarrier(lights.directionalShadowQuality);\n viewPayload[128] = filterCarrier[0] ?? 0;\n viewPayload[129] = filterCarrier[1] ?? 0;\n viewPayload[130] = filterCarrier[2] ?? 0;\n viewPayload[131] = filterCarrier[3] ?? 0;\n\n // feat-20260625-spot-light-shadow-mapping w25 (scope-amend webkit-fallback):\n // spotLightViewProj array<mat4x4<f32>, 4> at floats [132..195] (byte 528,\n // 16 B-aligned after directionalShadowFilter). Lane N = the spot with\n // `shadowAtlasTile === N` (cap = 4); the perspective matrix was already\n // computed by the extract stage (SpotLightSnapshot.lightViewProj) — record\n // never recomputes it (Derive). The accepted projector is identified by its\n // spot index, not by a negative shadow tile: a projector-only spot publishes\n // its matrix in lane 0 so the shader never samples a zero matrix. Shadowed\n // projector spots keep their shadow tile lane and carry the projector bit in\n // the DirectLightSlot identity word.\n // Folded from the former standalone binding 9 UBO to keep the WebGL2\n // fallback fragment uniform-buffer count <= 11 (GLES 3.0).\n {\n const SPOT_LVP_BASE_FLOAT = 132;\n const SPOT_LVP_LANE_COUNT = 4;\n const SPOT_LVP_FLOATS_PER_LANE = 16;\n const spotSnaps = spotShadowSnapshots;\n for (let i = 0; i < spotSnaps.length; i++) {\n const ss = spotSnaps[i];\n if (ss === undefined) continue;\n const tile = ss.shadowAtlasTile;\n const lvp = ss.lightViewProj;\n if (lvp === undefined) continue;\n const lane =\n tile >= 0 && tile < SPOT_LVP_LANE_COUNT ? tile : i === projectorSpotIndex ? 0 : -1;\n if (lane < 0) continue;\n const base = SPOT_LVP_BASE_FLOAT + lane * SPOT_LVP_FLOATS_PER_LANE;\n for (let f = 0; f < SPOT_LVP_FLOATS_PER_LANE; f++) {\n viewPayload[base + f] = lvp[f] ?? 0;\n }\n }\n }\n\n const viewUploadResult = queue.writeBuffer(viewUniformBuffer, byteOffset, viewPayload);\n if (!viewUploadResult.ok) throw viewUploadResult.error;\n\n for (const snapshot of lights.pointShadow ?? []) {\n if (snapshot.shadowAtlasLayer < 0 || snapshot.shadowAtlasLayer >= SHADOW_ATLAS_DEFAULT_LAYERS)\n continue;\n for (let face = 0; face < 6; face += 1) {\n const facePayload = viewPayload.slice();\n const matrix = snapshot.shadowMatrices.subarray(face * 16, (face + 1) * 16);\n facePayload.set(matrix, 28);\n const uploaded = queue.writeBuffer(\n viewUniformBuffer,\n pointShadowViewOffset(snapshot.shadowAtlasLayer, face),\n facePayload,\n );\n if (!uploaded.ok) throw uploaded.error;\n }\n }\n}\n","// @forgeax/engine-runtime - RenderSystem record stage: per-frame lighting.\n// feat-20260704 M5/w31: further-split from frame.ts (AC-05 <=1500 lines/file).\n// Pure leaf helpers invoked once each from recordFrame; behavior verbatim.\n\nimport { mat4, vec3 } from '@forgeax/engine-math';\nimport {\n type BindGroup,\n type BindGroupEntry,\n type BindGroupLayout,\n type RhiDevice,\n RhiError,\n type TextureView,\n} from '@forgeax/engine-rhi';\nimport { err, ok, type Result, toShared } from '@forgeax/engine-types';\nimport {\n PointShadowAtlasBoundsViolationError,\n PointShadowAtlasUninitializedError,\n type RenderError,\n RendererOperationError,\n StandardClusterTransportUnavailableError,\n} from '../errors/render';\nimport {\n createHdrpClusterMembershipBindGroup,\n createHdrpUnifiedBindGroup,\n getOrCreateHdrpBuffers,\n packClusterUniform,\n} from '../hdrp-buffers';\nimport { DIRECT_LIGHT_SLOT_FLOAT_COUNT, packDirectLightSlot } from '../light-buffer-layout';\nimport {\n type PreparedStandardLighting,\n prepareStandardLighting,\n} from '../pipeline/standard-lighting/prepare';\nimport type { StandardTopologyInputValue } from '../pipeline/standard-lighting/topology';\nimport {\n type StandardClusterTransport,\n selectStandardClusterTransport,\n} from '../pipeline/standard-lighting/transport';\nimport { DEFAULT_CLUSTER_GRID, DEFAULT_STANDARD_PROFILE } from '../pipeline/standard-profile';\nimport {\n COOKIE_MATRIX_BYTES,\n COOKIE_SLICE_SIZE,\n IES_SLICE_HEIGHT,\n IES_SLICE_WIDTH,\n} from '../prepare/extended-lighting/resources';\nimport type { ReflectionProbeTable } from '../reflection/gpu-table';\nimport type { ReflectionProbeSelectionResult } from '../reflection/projection';\nimport type { CameraSnapshot, RenderHdrpClusterPhase } from '../render-contract';\nimport type {\n DirectionalLightSnapshot,\n ExtractedLights,\n RenderableSnapshot,\n SkyboxSnapshot,\n SkylightSnapshot,\n} from '../render-system-extract';\nimport {\n SHADOW_ATLAS_DEFAULT_FACE_SIZE,\n SHADOW_ATLAS_DEFAULT_LAYERS,\n ShadowAtlas,\n} from '../shadow-atlas';\nimport { getOrCreateSsaoBuffers } from '../ssao-buffers';\nimport { getSsaoParameters, SSAO_SAMPLE_COUNTS } from '../ssao-config';\n// extendedLighting keeps Spot modifier factors on the existing light record\n// path; no additional render pass or submit owner is introduced.\nimport type { BindGroupCounts, RenderFrameState } from './frame-snapshot';\nimport {\n computeProjectionMatrix,\n computeViewMatrix,\n isLitMaterialSnapshot,\n warnMultiLightDirectional,\n} from './helpers';\nimport { getOrCreateFromChain, MESH_SSBO_BYTES, MESH_UBO_FULL_ARRAY_BYTES } from './mesh-ssbo';\nimport type { PipelineState, RecordProfileRunner, RenderSystemInternals } from './render-context';\nimport { POINTS_LINES_VIEW_BYTES, VIEW_UNIFORM_BYTES } from './view-ubo';\n\nexport interface StandardReflectionProbeBinding {\n readonly probeIndex: number | undefined;\n readonly useSkylight: boolean;\n}\n\nexport function resolveReflectionProbeBinding(\n selection: ReflectionProbeSelectionResult,\n table?: ReflectionProbeTable,\n): StandardReflectionProbeBinding {\n if (selection.kind !== 'probe') return { probeIndex: undefined, useSkylight: true };\n const primitiveKey = `${selection.worldId}:${selection.entityKey}`;\n const tableIndex = table?.cpuIndexByPrimitive(primitiveKey);\n return { probeIndex: tableIndex ?? selection.entityKey, useSkylight: false };\n}\n\nexport function projectDeviceOwnedBindGroup<T>(\n state:\n | {\n readonly device: RhiDevice;\n readonly layout: BindGroupLayout;\n readonly bindGroup: T;\n }\n | null\n | undefined,\n device: RhiDevice,\n layout: BindGroupLayout | null,\n): T | null {\n return state !== null && state !== undefined && state.device === device && state.layout === layout\n ? state.bindGroup\n : null;\n}\n\nfunction runHdrpClusterProfilePhase<T>(\n runner: RecordProfileRunner | undefined,\n phase: RenderHdrpClusterPhase,\n action: () => T,\n): T {\n return runner === undefined ? action() : runner(phase, action);\n}\n\nfunction mapClusterUploadFailure(\n resource: string,\n error: {\n readonly code: string;\n readonly expected: string;\n readonly hint: string;\n readonly detail?: unknown;\n },\n): RendererOperationError<'device-operation-failed'> {\n return new RendererOperationError('device-operation-failed', {\n operation: 'draw',\n cause: {\n code: error.code,\n expected: `queue.writeBuffer succeeds for Standard Cluster ${resource}`,\n hint: `repair the device write for Standard Cluster ${resource} and retry the frame`,\n detail: error,\n },\n });\n}\n\n/**\n * feat-20260704 M3/w18: per-frame bind-group cache resolution, extracted\n * verbatim from `recordFrame`. Walks the handle-identity WeakMap caches\n * (feat-20260531 M2 + feat-20260622 M3) to resolve or lazily create the view\n * (@group 0), mesh (@group 2), and — when HDRP is active — HDRP-unified cluster\n * bind groups. Raster groups may be null with no validated meshes; the Cluster\n * producer follows the accepted lighting topology independently. `bindGroupCounts` accounting +\n * cache maps are threaded through explicitly.\n *\n * @internal\n */\nexport function buildPerFrameBindGroups(\n internals: RenderSystemInternals,\n frameState: RenderFrameState,\n pipelineState: PipelineState,\n hasValidated: boolean,\n bindGroupCounts: BindGroupCounts,\n graphTargets?: {\n readonly directionalShadow?: TextureView | undefined;\n readonly spotShadow?: TextureView | undefined;\n readonly projector?: TextureView | undefined;\n readonly projectorSampler?: import('@forgeax/engine-rhi').Sampler | undefined;\n },\n includeView = true,\n standardLighting?: StandardTopologyInputValue,\n): {\n viewBindGroup: BindGroup | null;\n meshBindGroup: BindGroup | null;\n hdrpClusterBindGroup: BindGroup | null;\n hdrpClusterMembershipBindGroup: BindGroup | null;\n} {\n // View main (#1) chain = b0(viewUniformBuffer), b3(graph shadowDepth view or\n // shadowFallbackTextureView), b4(shadowSampler), b5(atlas view), b6\n // (shadowParams); variant 'view-main'. Local lights are never mirrored in\n // the view group: Standard consumes the one Cluster group(2) payload.\n // Mesh (#2) chain = inner b0 buffer (meshStorageBuffer.buffer); variant 'mesh'.\n let viewBindGroup: BindGroup | null = null;\n let meshBindGroup: BindGroup | null = null;\n // Standard clustered group(2) bind group. Non-null when the prepared\n // topology selects the cluster transport and its persistent allocation\n // succeeds; consumed by recordMainPass at `setBindGroup(2, ...)`.\n let hdrpClusterBindGroup: BindGroup | null = null;\n // The prepared Standard topology is the per-frame authority for whether\n // group(2) carries Cluster storage. A missing declaration is the prewarm /\n // non-Standard path and must not allocate or bind the Cluster bundle based\n // on the install-time pipeline identity alone.\n const clusteredLighting = standardLighting?.kind === 'clustered';\n const membershipLayout = pipelineState.hdrpClusterMembershipBindGroupLayout;\n const membership = frameState.hdrpClusterMembership;\n // The graph's Cluster producer also serves RenderFeature consumers and\n // warmup frames with no ordinary meshes. Its lifetime follows the accepted\n // lighting topology, not the ordinary raster validation count.\n const expectedHdrpBuffers = clusteredLighting\n ? getOrCreateHdrpBuffers(internals, frameState.installedPipelineConfig?.clusterGrid)\n : null;\n const currentMembership =\n expectedHdrpBuffers !== null &&\n membership?.clusterGridBuffer === expectedHdrpBuffers.clusterGridBuffer\n ? projectDeviceOwnedBindGroup(membership, internals.device, membershipLayout)\n : null;\n if (membership !== null && currentMembership === null) {\n frameState.hdrpClusterMembership = null;\n }\n const hdrpClusterMembershipBindGroup: BindGroup | null = clusteredLighting\n ? currentMembership\n : null;\n if (hasValidated) {\n // Shadow atlas view comes from the typed graph target.\n // Graph owns the texture lifecycle; record-stage reads the resolved\n // view each frame (D-2 SSOT). When the graph has not allocated the\n // target (castShadow:false or shadowMapSize=0),\n // `getColorTargetView` returns undefined and we fall through to the\n // 1x1 fallback view that keeps the BGL satisfied.\n if (includeView) {\n const shadowSampler = pipelineState.perPassResources.shadowSampler;\n if (shadowSampler === null) {\n return {\n viewBindGroup: null,\n meshBindGroup: null,\n hdrpClusterBindGroup: null,\n hdrpClusterMembershipBindGroup,\n };\n }\n const graphShadowView = graphTargets?.directionalShadow;\n const b3View =\n graphShadowView !== undefined ? graphShadowView : pipelineState.shadowFallbackTextureView;\n // feat-20260612-point-light-shadows-urp-hdrp Round-2 F-1: bind the real\n // ShadowAtlas cube_array view when point shadows are active in this\n // frame; otherwise the 1x1x6 fallback (cleared to 1.0 = fully lit).\n const pointShadowAtlas = frameState.pointShadowAtlas;\n const atlasViewMaybe = pointShadowAtlas?.isAllocated()\n ? pointShadowAtlas.getAtlasView()\n : null;\n const b5View =\n atlasViewMaybe !== null ? atlasViewMaybe : pipelineState.shadowAtlasFallbackTextureView;\n // feat-20260625-spot-light-shadow-mapping M2 / w21 (D-1 fragment side +\n // D-5): bind the real `spotShadowDepth` 2D atlas view (graph-owned) when\n // spot shadows run this frame; otherwise the 1x1 depth fallback cleared to\n // 1.0 (fully lit) — same `texture_depth_2d` shape as binding 3, so it\n // satisfies the BGL without a dedicated spot fallback allocation. binding\n // 9 always binds the real spotLightViewProj UBO (zeroed lanes are safe via\n // the shadowAtlasTile >= 0 shader gate).\n const graphSpotShadowView = graphTargets?.spotShadow;\n const b8View =\n graphSpotShadowView !== undefined\n ? graphSpotShadowView\n : pipelineState.shadowFallbackTextureView;\n const extendedLighting = pipelineState.extendedLightingAvailable ?? true;\n const iesProfileTextureView = pipelineState.iesProfileTextureView;\n const cookieTextureView = pipelineState.cookieTextureView;\n const cookieMatrixBuffer = pipelineState.cookieMatrixBuffer;\n const ltcLambertTextureView = pipelineState.ltcLambertTextureView;\n const ltcGgxTextureView = pipelineState.ltcGgxTextureView;\n const extendedLightingResources =\n extendedLighting &&\n iesProfileTextureView !== undefined &&\n cookieTextureView !== undefined &&\n cookieMatrixBuffer !== undefined &&\n ltcLambertTextureView !== undefined &&\n ltcGgxTextureView !== undefined\n ? {\n sampler: pipelineState.defaultSampler,\n iesProfileTextureView,\n cookieTextureView,\n ltcLambertTextureView,\n ltcGgxTextureView,\n cookieMatrixBuffer,\n }\n : undefined;\n if (extendedLighting && extendedLightingResources === undefined) {\n return {\n viewBindGroup: null,\n meshBindGroup: null,\n hdrpClusterBindGroup: null,\n hdrpClusterMembershipBindGroup,\n };\n }\n const extendedLightingViews =\n extendedLightingResources !== undefined\n ? [\n extendedLightingResources.sampler,\n extendedLightingResources.iesProfileTextureView,\n extendedLightingResources.cookieTextureView,\n extendedLightingResources.ltcLambertTextureView,\n extendedLightingResources.ltcGgxTextureView,\n extendedLightingResources.cookieMatrixBuffer,\n ]\n : [];\n const projectorAvailable = pipelineState.projectorAvailable !== false;\n const b11View = graphTargets?.projector ?? pipelineState.defaultWhiteTextureView;\n const b12Sampler = graphTargets?.projectorSampler ?? pipelineState.defaultSampler;\n viewBindGroup = getOrCreateFromChain(\n frameState.viewBindGroupCache,\n [\n pipelineState.viewUniformBuffer,\n b3View,\n shadowSampler,\n b5View,\n pipelineState.shadowParamsBuffer,\n b8View,\n ...extendedLightingViews,\n ...(extendedLightingResources === undefined && projectorAvailable\n ? [b11View, b12Sampler]\n : []),\n pipelineState.pointsLinesViewBuffer ?? pipelineState.viewUniformBuffer,\n ],\n 'view-main',\n () => {\n const entries: BindGroupEntry[] = [\n {\n binding: 0,\n resource: {\n kind: 'buffer',\n value: { buffer: pipelineState.viewUniformBuffer, size: VIEW_UNIFORM_BYTES },\n },\n },\n {\n binding: 3,\n resource: {\n kind: 'textureView',\n value: b3View,\n },\n },\n {\n binding: 4,\n resource: {\n kind: 'sampler',\n value: shadowSampler,\n },\n },\n // feat-20260612-point-light-shadows-urp-hdrp Round-2 F-1:\n // cube_array shadow atlas view (real ShadowAtlas when point\n // shadows are active; else 1x1x6 fallback).\n {\n binding: 5,\n resource: {\n kind: 'textureView',\n value: b5View,\n },\n },\n // feat-20260612-point-light-shadows-urp-hdrp Round-2 F-1:\n // shadowParams UBO (`array<vec4<f32>, 4>` = 64 B). Lane N\n // stores `(near, far, depthBias, normalBias)` for the point light\n // with shadowAtlasLayer === N. Updated per frame from\n // `pointShadowSnapshots` below.\n {\n binding: 6,\n resource: {\n kind: 'buffer',\n value: { buffer: pipelineState.shadowParamsBuffer },\n },\n },\n // feat-20260613-csm-cascaded-shadow-maps M5 / w28 (rebased to\n // binding 7 on 2026-06-13 to make room for point-shadow 5/6):\n // forward shaders declare binding 7 in common.wgsl (shared\n // view BGL) but never reference it; only shadow_caster.wgsl\n // reads it. Host writes a stable singleton buffer so every\n // forward bind group entry stays populated.\n {\n binding: 7,\n resource: {\n kind: 'buffer',\n value: { buffer: pipelineState.shadowCasterCascadeBuffer },\n },\n },\n // feat-20260625-spot-light-shadow-mapping M3 / w21 (D-5):\n // spot shadow 2D atlas (real spotShadowDepth view when spot\n // shadows run this frame, else the 1x1 depth fallback). Always-on.\n {\n binding: 8,\n resource: {\n kind: 'textureView',\n value: b8View,\n },\n },\n {\n binding: 10,\n resource: {\n kind: 'buffer',\n value: {\n buffer: pipelineState.pointsLinesViewBuffer ?? pipelineState.viewUniformBuffer,\n size: POINTS_LINES_VIEW_BYTES,\n },\n },\n },\n ...(extendedLightingResources === undefined && projectorAvailable\n ? [\n { binding: 11, resource: { kind: 'textureView' as const, value: b11View } },\n { binding: 12, resource: { kind: 'sampler' as const, value: b12Sampler } },\n ]\n : []),\n ...(extendedLightingResources !== undefined\n ? [\n {\n binding: 9,\n resource: {\n kind: 'sampler' as const,\n value: extendedLightingResources.sampler,\n },\n },\n {\n binding: 11,\n resource: {\n kind: 'textureView' as const,\n value: extendedLightingResources.iesProfileTextureView,\n },\n },\n {\n binding: 12,\n resource: {\n kind: 'textureView' as const,\n value: extendedLightingResources.cookieTextureView,\n },\n },\n {\n binding: 13,\n resource: {\n kind: 'textureView' as const,\n value: extendedLightingResources.ltcLambertTextureView,\n },\n },\n {\n binding: 14,\n resource: {\n kind: 'textureView' as const,\n value: extendedLightingResources.ltcGgxTextureView,\n },\n },\n {\n binding: 15,\n resource: {\n kind: 'buffer' as const,\n value: {\n buffer: extendedLightingResources.cookieMatrixBuffer,\n size: COOKIE_MATRIX_BYTES,\n },\n },\n },\n ]\n : []),\n // feat-20260625-spot-light-shadow-mapping w25: the per-spot\n // fragment-read lightViewProj matrices fold into the View UBO\n // (binding 0, `view.spotLightViewProj`) — no standalone binding 9\n // (WebGL2 fragment uniform-buffer budget). binding 10 is the\n // dedicated vertex-only Points/Lines viewport UBO.\n ];\n const viewBindGroupResult = internals.device.createBindGroup({\n label: 'pbr-view-bg',\n layout: pipelineState.viewBindGroupLayout,\n entries,\n });\n if (!viewBindGroupResult.ok) throw viewBindGroupResult.error;\n return viewBindGroupResult.value;\n },\n bindGroupCounts,\n );\n }\n\n // M3 / w10 (D-3 hard constraint): use the inner `.buffer` as the\n // WeakMap chain key so the cache tracks the underlying GPU buffer\n // identity. The wrapper object's identity is stable across grow\n // events; using the wrapper would defeat AC-07 cache invalidation.\n meshBindGroup = getOrCreateFromChain(\n frameState.meshBindGroupCache,\n [pipelineState.meshStorageBuffer.buffer],\n 'mesh',\n () => {\n // bug-20260610: WebGL2 fallback path needs the binding to cover the\n // whole `array<Mesh, 128>` uniform buffer (14336 B) instead of a\n // single dynamic-offset slot (112 B). `caps.storageBuffer === false`\n // is the same proxy createRenderer uses to pick the uniform variant.\n const meshBindSize = internals.device.caps.storageBuffer\n ? MESH_SSBO_BYTES\n : MESH_UBO_FULL_ARRAY_BYTES;\n const meshBindGroupResult = internals.device.createBindGroup({\n label: 'pbr-mesh-bg',\n layout: pipelineState.meshBindGroupLayout,\n entries: [\n {\n binding: 0,\n resource: {\n kind: 'buffer',\n value: {\n buffer: pipelineState.meshStorageBuffer.buffer,\n offset: 0,\n size: meshBindSize,\n },\n },\n },\n ],\n });\n if (!meshBindGroupResult.ok) throw meshBindGroupResult.error;\n return meshBindGroupResult.value;\n },\n bindGroupCounts,\n );\n\n // feat-20260609-hdrp-cluster-fragment-ggx M4 / w19: when HDRP is active,\n // build the unified group(2) BindGroup that carries the mesh SSBO at\n // binding 0 + the 4 cluster buffers at bindings 3..6. The bindGroup\n // shares the mesh SSBO with URP's `meshBindGroup` (same `meshStorageBuffer.buffer`\n // + same per-entity stride), so the dynamic offset issued at\n // `setBindGroup(2, ...)` covers binding 0 of either layout. Cached\n // alongside `meshBindGroupCache` keyed on the mesh SSBO + cluster\n // buffer identities; cache invalidates on a buffer-grow event the same\n // way the mesh path does (handle id rotation).\n if (clusteredLighting) {\n const hdrpBuffers = expectedHdrpBuffers;\n if (hdrpBuffers !== null) {\n // D-3: buffer dimension uses the inner `.buffer` (same constraint\n // as the mesh path) so a grow event rotates the chain key.\n hdrpClusterBindGroup = getOrCreateFromChain(\n frameState.meshBindGroupCache,\n [\n pipelineState.meshStorageBuffer.buffer,\n hdrpBuffers.lightDataBuffer,\n hdrpBuffers.clusterGridBuffer,\n hdrpBuffers.lightIndexListBuffer,\n hdrpBuffers.clusterUniformBuffer,\n ],\n 'hdrp-unified',\n () => {\n const bg = createHdrpUnifiedBindGroup(\n internals,\n hdrpBuffers,\n pipelineState.meshStorageBuffer.buffer,\n );\n if (bg === null) {\n throw new RhiError({\n code: 'webgpu-runtime-error',\n expected: 'HDRP unified BindGroup creation succeeds when HDRP is active',\n hint: 'inspect prior errorRegistry events for createBindGroup failure detail',\n });\n }\n return bg;\n },\n bindGroupCounts,\n );\n }\n }\n }\n return { viewBindGroup, meshBindGroup, hdrpClusterBindGroup, hdrpClusterMembershipBindGroup };\n}\n\n/**\n * feat-20260704 M3/w18: per-frame lighting preparation, extracted verbatim from\n * `recordFrame`. (1) pin the point + spot shadow snapshot lists onto frameState\n * for the shadow caster\n * pass closures + lazy-allocate the point-shadow cube_array atlas on first\n * non-empty frame (AC-09 zero-shadow zero-alloc). (3) derive the directional\n * fallback and the unified local-light corpus used by Standard Cluster.\n *\n * @internal\n */\nexport function prepareFrameLighting(\n internals: RenderSystemInternals,\n frameState: RenderFrameState,\n lights: ExtractedLights,\n camera: CameraSnapshot,\n pipelineState?: Pick<\n PipelineState,\n 'hdrpClusterMembershipPipeline' | 'hdrpClusterMembershipBindGroupLayout'\n >,\n): Result<\n {\n light: DirectionalLightSnapshot;\n pointLights: ExtractedLights['point'];\n spotLights: ExtractedLights['spot'];\n rectLights: ExtractedLights['rect'];\n totalLightCount: number;\n standard: StandardTopologyInputValue;\n },\n RenderError\n> {\n if (lights.directionalCount > 1) {\n warnMultiLightDirectional(frameState, lights.directionalCount);\n }\n // feat-20260621-merge-directionallightshadow-into-directionallight M3 / m3-t2:\n // the AC-04/AC-22 \"shadow disabled by missing component\" once-warn is gone.\n // After merging DirectionalLightShadow into DirectionalLight there is no\n // orphan-shadow / missing-companion configuration to warn about -- castShadow\n // defaults true on the single component, so the warn condition can never\n // arise. The error class + RuntimeErrorCode member have been removed in M4 (m4-t2).\n\n // feat-20260612-point-light-shadows-urp-hdrp M3 / T-M3-2 (plan-strategy §D-1):\n // project lights.pointShadow onto frameState so the URP point shadow caster\n // pass can read the snapshot list during graph execute. Lazy-allocate the\n // cube_array atlas on first non-empty frame; zero-shadow scenes never\n // touch the GPU here (AC-09). The snapshot list is stable for the\n // duration of recordFrame; its count is part of the typed topology key.\n frameState.pointShadowSnapshots = lights.pointShadow;\n // feat-20260625-spot-light-shadow-mapping M2 / w9 (D-2): pin the spot\n // snapshots for the spotShadowDepth caster pass closure. The spot atlas is\n // a graph-owned typed target, not a runtime ShadowAtlas, so graph compilation\n // owns the depth texture lifetime.\n frameState.spotShadowSnapshots = lights.spot;\n if (lights.pointShadow.length > 0) {\n if (frameState.pointShadowAtlas === null) {\n const firstSnap = lights.pointShadow[0];\n const faceSize = firstSnap?.mapSize ?? SHADOW_ATLAS_DEFAULT_FACE_SIZE;\n frameState.pointShadowAtlas = new ShadowAtlas(internals.device, {\n faceSize,\n layers: SHADOW_ATLAS_DEFAULT_LAYERS,\n });\n }\n try {\n frameState.pointShadowAtlas.ensure();\n } catch (e) {\n if (\n e instanceof PointShadowAtlasUninitializedError ||\n e instanceof PointShadowAtlasBoundsViolationError\n ) {\n internals.errorRegistry.fire(e);\n } else {\n throw e;\n }\n }\n }\n\n // ExtractedLights three-arm consumption (R-10 preparation; M2 / w16):\n //\n // - lights.directional : feeds the View UBO at slot [16..23]\n // (lightDir + lightColor; existing path).\n // - lights.point/spot/rect[] : packed into the one unified Standard\n // Cluster payload below. No per-kind light\n // transport exists at the renderer boundary.\n //\n // Each variant carries the discriminant `kind` so the record-time packing\n // call sites can run exhaustive switch (charter P2 + AC-03).\n const directionalLight: DirectionalLightSnapshot | undefined = lights.directional;\n const pointLights = lights.point;\n const spotLights = lights.spot;\n const rectLights = lights.rect;\n\n // Case C: 0 DirectionalLight = legitimate scene; the View UBO falls\n // back to a zero-intensity directional payload so the shader's\n // `view.lightDir * view.lightColor` term contributes nothing\n // (physically-correct black under standard, untouched under unlit).\n const light: DirectionalLightSnapshot = directionalLight ?? {\n kind: 'directional' as const,\n direction: vec3.create(0, -1, 0),\n color: vec3.create(0, 0, 0),\n intensity: 0,\n };\n\n const totalLightCount =\n (directionalLight !== undefined ? 1 : 0) +\n pointLights.length +\n spotLights.length +\n rectLights.length;\n\n const clusterGrid = frameState.installedPipelineConfig?.clusterGrid ?? DEFAULT_CLUSTER_GRID;\n const local = [\n ...pointLights.map((source) => ({\n kind: 'point' as const,\n shadowed: source.shadowAtlasLayer !== undefined && source.shadowAtlasLayer >= 0,\n position: source.position,\n range:\n Number.isFinite(source.invRangeSquared) && source.invRangeSquared > 0\n ? Math.sqrt(1 / source.invRangeSquared)\n : 1000,\n source,\n })),\n ...spotLights.map((source) => ({\n kind: 'spot' as const,\n shadowed:\n source.castShadow && source.shadowAtlasTile >= 0 && source.lightViewProj !== undefined,\n position: source.position,\n range:\n Number.isFinite(source.invRangeSquared) && source.invRangeSquared > 0\n ? Math.sqrt(1 / source.invRangeSquared)\n : 1000,\n source,\n })),\n ...rectLights.map((source) => ({\n kind: 'rect-area' as const,\n shadowed: false,\n position: source.position,\n range:\n (Number.isFinite(source.invRangeSquared) && source.invRangeSquared > 0\n ? Math.sqrt(1 / source.invRangeSquared)\n : 1000) + Math.hypot(source.halfWidth, source.halfHeight),\n source,\n })),\n ];\n const prepared = prepareStandardLighting({\n directional: directionalLight,\n local,\n view: computeViewMatrix(camera),\n projection: computeProjectionMatrix(camera),\n near: camera.near,\n far: camera.far,\n grid: clusterGrid,\n lightCount: internals.standardProfile?.lightCount ?? DEFAULT_STANDARD_PROFILE.lightCount,\n renderPath: internals.standardProfile?.renderPath ?? DEFAULT_STANDARD_PROFILE.renderPath,\n });\n if (!prepared.ok) return prepared;\n // Storage-capable Standard frames keep the same Cluster ABI even when the\n // local-light corpus is empty. Directional-only scenes still need the\n // unified mesh group(2) contract so their PBR draws do not select a second\n // local-light layout; the existing transport emits a zero-light payload and\n // the graph remains structurally identical. The no-storage backend has no\n // storage-backed local-light representation, so a directional-only frame\n // remains the sole no-local transport case.\n if (prepared.value.local.length === 0 && !internals.device.caps.storageBuffer) {\n return ok({\n light,\n pointLights,\n spotLights,\n rectLights,\n totalLightCount,\n standard: { kind: 'no-local-lights', prepared: prepared.value },\n });\n }\n const transport = selectStandardClusterTransport(\n {\n compute: internals.device.caps.compute,\n storageBuffer: internals.device.caps.storageBuffer,\n membershipPipelineReady:\n pipelineState !== undefined &&\n pipelineState.hdrpClusterMembershipPipeline !== null &&\n pipelineState.hdrpClusterMembershipBindGroupLayout !== null,\n },\n prepared.value,\n );\n if (!transport.ok) return transport;\n\n return ok({\n light,\n pointLights,\n spotLights,\n rectLights,\n totalLightCount,\n standard: { kind: 'clustered', prepared: prepared.value, transport: transport.value },\n });\n}\n\nfunction modifierDigest(data: Uint8Array): number {\n let hash = 2166136261;\n for (let index = 0; index < data.length; index += 1) {\n hash ^= data[index] ?? 0;\n hash = Math.imul(hash, 16777619);\n }\n return hash >>> 0;\n}\n\n/** Upload authored Spot modifier payloads into the renderer-owned array lane. */\nexport function writeSpotModifierTextures(\n internals: RenderSystemInternals,\n pipelineState: PipelineState,\n spots: readonly ExtractedLights['spot'][number][],\n): void {\n const iesTexture = pipelineState.iesProfileTexture;\n const cookieTexture = pipelineState.cookieTexture;\n const cookieMatrixBuffer = pipelineState.cookieMatrixBuffer;\n if (iesTexture === undefined && cookieTexture === undefined && cookieMatrixBuffer === undefined)\n return;\n let state = pipelineState.spotModifierUploadState;\n if (state === undefined) {\n state = { ies: new Map(), cookie: new Map(), cookieMatrix: new Map() };\n pipelineState.spotModifierUploadState = state;\n } else if (state.cookieMatrix === undefined) {\n state = { ...state, cookieMatrix: new Map() };\n pipelineState.spotModifierUploadState = state;\n }\n for (const spot of spots) {\n if (spot.iesProfileSlice !== undefined && spot.iesProfileData !== undefined && iesTexture) {\n if (spot.iesProfileData.byteLength === IES_SLICE_WIDTH * IES_SLICE_HEIGHT * 2) {\n const digest = modifierDigest(spot.iesProfileData);\n if (state.ies.get(spot.iesProfileSlice) !== digest) {\n const result = internals.device.queue.writeTexture(\n { texture: iesTexture, mipLevel: 0, origin: { x: 0, y: 0, z: spot.iesProfileSlice } },\n spot.iesProfileData,\n { offset: 0, bytesPerRow: IES_SLICE_WIDTH * 2, rowsPerImage: IES_SLICE_HEIGHT },\n { width: IES_SLICE_WIDTH, height: IES_SLICE_HEIGHT, depthOrArrayLayers: 1 },\n );\n if (!result.ok) throw result.error;\n state.ies.set(spot.iesProfileSlice, digest);\n }\n }\n }\n // Authored Cookie and the SpotLight projector share the same\n // fixed 256x256 array transport on the extended topology. Their shader\n // projection remains distinct: Cookie uses cookieMatrices, projector\n // uses View.spotLightViewProj. Upload both identities when a frame carries\n // both fields, while the direct-light metadata selects the one in use.\n for (const modifier of [\n {\n slice: spot.cookieSlice,\n data: spot.cookieData,\n matrix: spot.cookieMatrix,\n },\n {\n slice: spot.projectorSlice,\n data: spot.projectorData,\n matrix: spot.projectorMatrix,\n },\n ]) {\n if (modifier.slice !== undefined && modifier.data !== undefined && cookieTexture) {\n if (modifier.data.byteLength === COOKIE_SLICE_SIZE * COOKIE_SLICE_SIZE * 4) {\n const digest = modifierDigest(modifier.data);\n if (state.cookie.get(modifier.slice) !== digest) {\n const result = internals.device.queue.writeTexture(\n { texture: cookieTexture, mipLevel: 0, origin: { x: 0, y: 0, z: modifier.slice } },\n modifier.data,\n { offset: 0, bytesPerRow: COOKIE_SLICE_SIZE * 4, rowsPerImage: COOKIE_SLICE_SIZE },\n { width: COOKIE_SLICE_SIZE, height: COOKIE_SLICE_SIZE, depthOrArrayLayers: 1 },\n );\n if (!result.ok) throw result.error;\n state.cookie.set(modifier.slice, digest);\n }\n }\n }\n if (modifier.slice !== undefined && modifier.matrix !== undefined && cookieMatrixBuffer) {\n const matrixBytes = new Uint8Array(\n modifier.matrix.buffer,\n modifier.matrix.byteOffset,\n modifier.matrix.byteLength,\n );\n const digest = modifierDigest(matrixBytes);\n if (state.cookieMatrix.get(modifier.slice) !== digest) {\n const result = internals.device.queue.writeBuffer(\n cookieMatrixBuffer,\n modifier.slice * 16 * Float32Array.BYTES_PER_ELEMENT,\n modifier.matrix,\n );\n if (!result.ok) throw result.error;\n state.cookieMatrix.set(modifier.slice, digest);\n }\n }\n }\n }\n}\n\n/**\n * feat-20260704 M3/w18: write the point-shadow params UBO (bound at viewBg\n * binding 6), extracted verbatim from `recordFrame`.\n *\n * feat-20260612-point-light-shadows-urp-hdrp Round-2 F-1: 4 lanes x vec4<f32>;\n * lane[shadowAtlasLayer] = (near, far, depthBias, normalBias). Lanes for non-shadow\n * slots stay zero (the WGSL sample path is gated by PointLight.shadowAtlasLayer\n * >= 0). Always writes the full 64 B so stale non-zero lanes from a previous\n * frame's allocation cannot poison the current frame.\n *\n * @internal\n */\nexport function writeShadowParamsBuffer(\n internals: RenderSystemInternals,\n frameState: RenderFrameState,\n pipelineState: PipelineState,\n): void {\n const SHADOW_PARAMS_LANE_COUNT = 4;\n const SHADOW_PARAMS_FLOATS_PER_LANE = 4;\n const shadowParamsArr = new Float32Array(\n SHADOW_PARAMS_LANE_COUNT * SHADOW_PARAMS_FLOATS_PER_LANE,\n );\n for (let i = 0; i < frameState.pointShadowSnapshots.length; i++) {\n const ps = frameState.pointShadowSnapshots[i];\n if (ps === undefined) continue;\n const layer = ps.shadowAtlasLayer;\n if (layer < 0 || layer >= SHADOW_PARAMS_LANE_COUNT) continue;\n const base = layer * SHADOW_PARAMS_FLOATS_PER_LANE;\n const near = ps.nearPlane;\n const far = ps.farPlane;\n shadowParamsArr[base] = near;\n shadowParamsArr[base + 1] = far;\n shadowParamsArr[base + 2] = ps.depthBias;\n shadowParamsArr[base + 3] = ps.normalBias;\n }\n const shadowParamsWriteRes = internals.device.queue.writeBuffer(\n pipelineState.shadowParamsBuffer,\n 0,\n shadowParamsArr,\n );\n if (!shadowParamsWriteRes.ok) {\n internals.errorRegistry.fire(shadowParamsWriteRes.error);\n }\n}\n\n/**\n * feat-20260704 M3/w18: zero-light standard-material once-warn, extracted\n * verbatim from `recordFrame`.\n *\n * feat-20260520-skylight-ibl-cubemap M4 / t27 (AC-10): fires once per\n * RenderSystem lifetime when the 0-light three-condition conjunction holds — no\n * Skylight, 0 direct light (totalLightCount === 0), AND at least one builtin\n * standard/PBR material (which renders black with no light). Custom shaders\n * own their lighting contract and cannot be classified by this generic\n * diagnostic. Suppressed under NODE_ENV=production.\n *\n * @internal\n */\nexport function warnZeroLightStandard(\n frameState: RenderFrameState,\n renderables: readonly RenderableSnapshot[],\n skylight: SkylightSnapshot | undefined,\n totalLightCount: number,\n): void {\n const hasStandardMaterial = renderables.some((r) => isLitMaterialSnapshot(r.material));\n if (\n skylight === undefined &&\n totalLightCount === 0 &&\n hasStandardMaterial &&\n !frameState.warnedZeroLightStandard\n ) {\n frameState.warnedZeroLightStandard = true;\n const env = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process;\n if (env?.env?.NODE_ENV !== 'production') {\n console.warn(\n '[forgeax] standard material renders black with 0 lights of every type (no Skylight, and directional + point + spot all empty); spawn at least one light (Skylight, DirectionalLight, PointLight, or SpotLight) or switch material to an unlit shader (Materials.unlit(...)). See AGENTS.md section Breaking changes 2026-05-19.',\n );\n }\n }\n}\n\n/**\n * Write the one prepared Standard Cluster payload into the persistent buffers.\n * Membership has already been derived by `prepareFrameLighting`; this function\n * only packs/uploads that immutable result and never re-runs the binner.\n *\n * @internal\n */\nexport function writeHdrpClusterAndSsaoBuffers(\n internals: RenderSystemInternals,\n frameState: RenderFrameState,\n camera: CameraSnapshot,\n prepared: PreparedStandardLighting,\n transport: StandardClusterTransport,\n profilePhase?: RecordProfileRunner,\n gpuMembershipPipelineReady = false,\n membershipBindGroupLayout: BindGroupLayout | null = null,\n projectorLightSlotIndex?: number,\n pipelineState?: PipelineState,\n): Result<void, RenderError> {\n const configuredClusterGrid = prepared.layout.grid;\n const gpuMembership = transport.producer === 'gpu';\n if (gpuMembership && (!gpuMembershipPipelineReady || membershipBindGroupLayout === null)) {\n return err(\n new StandardClusterTransportUnavailableError(\n prepared.local.length,\n 'the selected GPU Cluster producer requires a ready membership pipeline and bind-group layout',\n ),\n );\n }\n const hdrpBuffers = getOrCreateHdrpBuffers(internals, configuredClusterGrid);\n if (hdrpBuffers === null) {\n return err(\n new StandardClusterTransportUnavailableError(\n prepared.local.length,\n 'the selected Standard Cluster transport could not allocate its persistent buffers',\n ),\n );\n }\n const existingMembership = projectDeviceOwnedBindGroup(\n frameState.hdrpClusterMembership,\n internals.device,\n membershipBindGroupLayout,\n );\n const membershipMatchesBuffers =\n existingMembership !== null &&\n frameState.hdrpClusterMembership?.clusterGridBuffer === hdrpBuffers.clusterGridBuffer;\n if (!membershipMatchesBuffers) frameState.hdrpClusterMembership = null;\n if (\n gpuMembership &&\n membershipBindGroupLayout !== null &&\n frameState.hdrpClusterMembership === null\n ) {\n const bindGroup = createHdrpClusterMembershipBindGroup(\n internals,\n hdrpBuffers,\n membershipBindGroupLayout,\n );\n if (bindGroup === null) {\n return err(\n new StandardClusterTransportUnavailableError(\n prepared.local.length,\n 'the selected GPU Cluster producer could not create its membership bind group',\n ),\n );\n }\n frameState.hdrpClusterMembership = {\n device: internals.device,\n layout: membershipBindGroupLayout,\n bindGroup,\n clusterGridBuffer: hdrpBuffers.clusterGridBuffer,\n };\n }\n\n if (pipelineState !== undefined) {\n const preparedSpots: ExtractedLights['spot'][number][] = [];\n for (const local of prepared.local) {\n if (local.source?.kind === 'spot') preparedSpots.push(local.source);\n }\n writeSpotModifierTextures(internals, pipelineState, preparedSpots);\n }\n\n const gridX = prepared.layout.grid.x;\n const gridY = prepared.layout.grid.y;\n const gridZ = prepared.layout.grid.z;\n const clusterGridBuf = prepared.clusterGrid;\n const lightIndexListBuf = prepared.lightIndexList;\n const lightIndexCount = prepared.membershipEntryCount;\n\n // Falsify injection point retained for the real prepared payload. It edits\n // only this frame's projection and never creates a second membership owner.\n const envFalsify = (globalThis as { process?: { env?: Record<string, string | undefined> } })\n .process?.env;\n if (envFalsify?.FORGEAX_HDRP_FALSIFY_CLUSTER_GRID_ZERO) clusterGridBuf.fill(0);\n\n const hdrpPayload = runHdrpClusterProfilePhase(\n profilePhase,\n 'record/scene-state/hdrp-cluster/payload-packing',\n () => {\n const lightDataPayload = new Float32Array(\n prepared.layout.lightDataSlotCount * DIRECT_LIGHT_SLOT_FLOAT_COUNT,\n );\n let slotIdx = 0;\n for (const local of prepared.local) {\n const source = local.source;\n if (source === undefined) return null;\n const projectorSelected =\n projectorLightSlotIndex === undefined ? undefined : projectorLightSlotIndex === slotIdx;\n const packed = packDirectLightSlot(source, projectorSelected);\n lightDataPayload.set(packed, slotIdx * DIRECT_LIGHT_SLOT_FLOAT_COUNT);\n slotIdx += 1;\n }\n\n // scope-amend-webgl2-ubo: SSAO intensity is folded into the\n // cluster_uniform .w lane (formerly pad), removing the dedicated\n // @binding(9) UBO that pushed fragment-stage UBO count past\n // WebGL2's max_uniform_buffers_per_shader_stage=11. Disabled-SSAO\n // path writes 0 so `mix(1.0, ssao*ao, 0.0) = 1.0` in the lighting\n // shader (no PSO recompile across enable/disable).\n const clusterSsaoConfig = frameState.installedPipelineConfig?.ssao;\n const clusterSsaoIntensity =\n clusterSsaoConfig !== undefined && clusterSsaoConfig.enabled === true\n ? (clusterSsaoConfig.intensity ?? 1.0)\n : 0;\n const clusterUniformPayload = packClusterUniform(\n { x: gridX, y: gridY, z: gridZ },\n camera.near,\n camera.far,\n clusterSsaoIntensity,\n transport.admittedLightCount,\n );\n\n return {\n hdrpBuffers,\n lightDataUploadPayload: lightDataPayload.subarray(\n 0,\n slotIdx * DIRECT_LIGHT_SLOT_FLOAT_COUNT,\n ),\n clusterUniformPayload: new Uint8Array(clusterUniformPayload),\n };\n },\n );\n\n if (hdrpPayload === null) {\n return err(\n new StandardClusterTransportUnavailableError(\n prepared.local.length,\n 'the prepared Standard Cluster payload could not be materialized',\n ),\n );\n }\n\n const bufferUpload = runHdrpClusterProfilePhase(\n profilePhase,\n 'record/scene-state/hdrp-cluster/buffer-upload',\n (): Result<void, RenderError> => {\n const { hdrpBuffers, lightDataUploadPayload, clusterUniformPayload } = hdrpPayload;\n const lightDataUpload = internals.device.queue.writeBuffer(\n hdrpBuffers.lightDataBuffer,\n 0,\n lightDataUploadPayload,\n );\n if (!lightDataUpload.ok)\n return err(mapClusterUploadFailure('light-data', lightDataUpload.error));\n\n if (gpuMembership) {\n const lightBoundsUpload = internals.device.queue.writeBuffer(\n hdrpBuffers.lightBoundsBuffer,\n 0,\n prepared.lightBounds,\n );\n if (!lightBoundsUpload.ok)\n return err(mapClusterUploadFailure('light-bounds', lightBoundsUpload.error));\n }\n const clusterGridUpload = internals.device.queue.writeBuffer(\n hdrpBuffers.clusterGridBuffer,\n 0,\n clusterGridBuf.subarray(0, gridX * gridY * gridZ * 2),\n );\n if (!clusterGridUpload.ok)\n return err(mapClusterUploadFailure('cluster-grid', clusterGridUpload.error));\n\n if (!gpuMembership && lightIndexCount > 0) {\n const lightIndexListUpload = internals.device.queue.writeBuffer(\n hdrpBuffers.lightIndexListBuffer,\n 0,\n lightIndexListBuf.subarray(0, lightIndexCount),\n );\n if (!lightIndexListUpload.ok) {\n return err(mapClusterUploadFailure('light-index-list', lightIndexListUpload.error));\n }\n }\n\n const clusterUniformUpload = internals.device.queue.writeBuffer(\n hdrpBuffers.clusterUniformBuffer,\n 0,\n clusterUniformPayload,\n );\n if (!clusterUniformUpload.ok) {\n return err(mapClusterUploadFailure('cluster-uniform', clusterUniformUpload.error));\n }\n return ok(undefined);\n },\n );\n if (!bufferUpload.ok) return bufferUpload;\n\n // ── feat-20260612-hdrp-ssao M1 / w6 + M7 / w33 ───────────────\n // Per-frame SSAO uniform write (plan-strategy D-1 + D-C):\n // view + projection + inverseProjection at offsets 0/64/128 +\n // intensityPad (vec4 — x=intensity, y=radius, z=bias) at offset 192;\n // total 256 B (matches host SSAO_UNIFORM_BYTES + WGSL struct).\n // Single writeBuffer covers all four fields so one queue entry\n // updates the entire UBO.\n // Separate from View UBO (592 B invariant); does not affect\n // material PSO bytecode.\n //\n // Writes when HDRP is active; config.ssao?.enabled guard comes in\n // M4 / w19 after the config.ssao type narrowing is added.\n const ssaoUpload = runHdrpClusterProfilePhase(\n profilePhase,\n 'record/scene-state/hdrp-cluster/buffer-upload',\n (): Result<void, RenderError> => {\n if (frameState.installedPipelineConfig?.ssao?.enabled !== true) return ok(undefined);\n const ssaoBufs = getOrCreateSsaoBuffers(internals);\n if (ssaoBufs === null) return ok(undefined);\n const sProj = computeProjectionMatrix(camera);\n const sView = computeViewMatrix(camera);\n // inverseProjection = inverse(projection): NDC -> view-space.\n const invProjOnly = mat4.create();\n mat4.invert(invProjOnly, sProj);\n\n // Float32Array of 64 (256 B): 3 mat4 (48) + intensityPad vec4 (4)\n // + 12 trailing padding floats. We only fill the declared region.\n const ssaoUniformPayload = new Float32Array(64);\n ssaoUniformPayload.set(sView, 0);\n ssaoUniformPayload.set(sProj, 16);\n ssaoUniformPayload.set(invProjOnly, 32);\n // intensityPad carries the same resolved values as the graph SSAO\n // calc pass; this early write keeps the shared UBO valid before the\n // typed fullscreen pass executes.\n const ssaoConfig = frameState.installedPipelineConfig?.ssao;\n const parameters = getSsaoParameters(\n ssaoConfig !== undefined && ssaoConfig.enabled === true ? ssaoConfig : undefined,\n );\n ssaoUniformPayload[48] = parameters.intensity;\n ssaoUniformPayload[49] = parameters.radius;\n ssaoUniformPayload[50] = parameters.bias;\n ssaoUniformPayload[51] = SSAO_SAMPLE_COUNTS[parameters.quality];\n\n const ssaoUniformRes = internals.device.queue.writeBuffer(\n ssaoBufs.uniformBuffer,\n 0,\n ssaoUniformPayload,\n );\n if (!ssaoUniformRes.ok)\n return err(mapClusterUploadFailure('ssao-uniform', ssaoUniformRes.error));\n return ok(undefined);\n },\n );\n if (!ssaoUpload.ok) return ssaoUpload;\n return ok(undefined);\n}\n\n/**\n * feat-20260704 M3/w18: resolve `tonemapActive` + `skyboxActive` for this\n * frame, extracted verbatim from `recordFrame`.\n *\n * feat-20260519-tonemap-reinhard-mvp: tonemap is active when the camera carries\n * `tonemap !== 'none'` (routes geometry into the HDR offscreen target + a\n * fullscreen tonemap pass). feat-20260531-skybox-env-background M2 / w9: skybox\n * is active only when a SkyboxBackground entity is present AND tonemap is active\n * (hdrColor is only allocated on the tonemap path). M3 / w20: once-warn when\n * tonemap is 'none' but a skybox exists (config issue, not resource-timing —\n * no structured error). M3 / w18: skybox degrades to clear-colour for a frame\n * while its cubemap view is not yet resident (lazy equirect projection pending\n * / failed; the lazy trigger owns the fire-once-on-failed error).\n *\n * @internal\n */\nexport function resolveSkyboxActive(\n internals: RenderSystemInternals,\n frameState: RenderFrameState,\n camera: CameraSnapshot,\n skybox: SkyboxSnapshot | undefined,\n): { tonemapActive: boolean; skyboxActive: boolean } {\n const tonemapActive = camera.tonemap !== 'none';\n let skyboxActive = skybox !== undefined && tonemapActive;\n // feat-20260531-skybox-env-background M3 / w20: once-warn when camera\n // tonemap is 'none' but a SkyboxBackground entity exists. The skybox\n // pass requires the HDR render target allocated by the tonemap path;\n // without it the skybox is skipped for this frame. This is a config\n // issue, not a resource-timing issue -- don't fire a structured error\n // (plan-strategy D-2 NOTE, charter P3 non-silent).\n if (skybox !== undefined && !tonemapActive && !frameState.warnedSkyboxTonemapNone) {\n frameState.warnedSkyboxTonemapNone = true;\n console.warn(\n '[forgeax] SkyboxBackground: skybox requires tonemap active (camera.tonemap !== \"none\") to write HDR target. The skybox pass will be skipped for this frame.',\n );\n }\n // feat-20260531-skybox-env-background M3 / w18: degradation when cubemap\n // GPU view is not ready. getCubemapGpuView returns undefined if the\n // equirect-to-cube upload has not completed yet.\n if (skybox !== undefined && tonemapActive) {\n const cubemapView = internals.gpuStore.getCubemapGpuView(\n toShared<'EquirectAsset'>(skybox.equirectHandle),\n );\n if (cubemapView === undefined) {\n // The skybox reuses the Skylight's equirect handle; the cubemap\n // projection is driven lazily by the single trigger in `driveLazy\n // EquirectProjection` above (it owns the fire-and-forget launch AND the\n // fire-once-on-failed structured error). While the projection is\n // pending or has failed the cube view is not resident, so the skybox\n // pass degrades to the clear-colour background for this frame\n // (charter P3: it activates once the shared projection flips to\n // 'ready'). No error is fired here -- 'pending' is a normal transition\n // (firing per frame would flood the channel), and 'failed' is reported\n // once by the lazy trigger. (feat-20260630 M3 / w18.)\n skyboxActive = false;\n }\n }\n return { tonemapActive, skyboxActive };\n}\n","// IblPipelineCache.ts -- DeviceScope-generation cache for IBL precompute.\n//\n// Plan-strategy D-1/D-7: cache for 4 GPU passes (equirect->cube /\n// irradiance / prefilter / BRDF LUT). M2 provides the cache skeleton;\n// M3 (t18/t20) wires real shader math from ibl.wgsl.\n//\n// The cache is keyed by the renderer-owned DeviceScope generation. Raw device\n// handles are inputs to pipeline creation, never cache or lifecycle owners.\n//\n// Public surface (M3):\n// - getOrCreateIblCache(scope): get or initialize the generation cache\n// - iblCacheSize(): introspection hook\n// - hasIblCache(scope): introspection hook\n// - setIblWgslSource(source): set the ibl.wgsl WGSL source string\n// - createIblShaderModules(device, factory): create shader modules from ibl.wgsl\n// - createIblPipelines(scope, device, factory, modules): create 4 render pipelines\n// - runIblPrecompute(opts): execute 4 GPU precompute passes (M3 t20)\n//\n// M3 t20: pipeline slots are filled with real render pipelines loaded from\n// ibl.wgsl, replacing the M2 stub undefined slots. The 4 GPU passes are\n// executed in the standard order (equirect->cube -> irradiance -> prefilter\n// -> BRDF LUT), with counters set post-execution per AC-04/05/06.\n\n// ─── RHI-owned handles ───────────────────────────────────────────────────────\n\nimport {\n type BindGroup,\n type BindGroupLayout,\n type Buffer,\n err,\n ok,\n type RenderPipeline,\n type Result,\n type RhiCommandEncoder,\n type RhiDevice,\n type RhiError,\n type RhiRenderPassEncoder,\n type Sampler,\n type ShaderModule,\n type Texture,\n type TextureFormat,\n type TextureView,\n} from '@forgeax/engine-rhi';\nimport type { DeviceScope } from '../device/device-scope';\nimport { createIblKernelCache, type IblKernelCache } from './kernel-cache';\n\nexport {\n createIblKernelCache,\n type IblKernelCache,\n resetIblKernelCaches,\n} from './kernel-cache';\n\nimport { GPU_SHADER_STAGE_FRAGMENT, GPU_SHADER_STAGE_VERTEX } from '../gpu-stage';\nimport {\n GPU_TEXTURE_USAGE_COPY_DST,\n GPU_TEXTURE_USAGE_COPY_SRC,\n GPU_TEXTURE_USAGE_RENDER_ATTACHMENT_AND_TEXTURE_BINDING,\n} from '../gpu-texture-usage';\n\n/**\n * Shader module factory (async, injected via configureGpuDevice).\n * Mirrors `MipmapShaderModuleFactory` from mipmap-generator.\n */\n/**\n * IBL is assembled by the renderer's device owner, so it consumes the full\n * opaque RHI device rather than a structurally-compatible raw/shim split.\n * Keeping the owner as RhiDevice makes the backend boundary explicit: raw\n * GPU handles can only exist inside an RHI implementation or a test readback.\n */\nexport type IblRhiOwner = RhiDevice;\n\nexport type IblShaderModuleFactory = (\n device: IblRhiOwner,\n desc: { code: string; label?: string },\n) => Promise<Result<ShaderModule, RhiError>>;\n\nexport interface IblPipelineSet {\n readonly equirectToCubePipeline: RenderPipeline;\n readonly irradiancePipeline: RenderPipeline;\n readonly prefilterPipeline: RenderPipeline;\n readonly brdfLutPipeline: RenderPipeline;\n}\n\nexport interface IblPipelineError {\n readonly code: 'ibl-pipeline-create-failed' | 'ibl-shader-module-missing';\n readonly expected: string;\n readonly hint: string;\n readonly detail: { readonly stage: string; readonly rhiCode?: RhiError['code'] };\n}\n\n/**\n * Per-DeviceScope-generation IBL pipeline cache instance.\n *\n * M3.5 (round-2 t52): the 4 pipeline slots are mutable so createIblPipelines\n * can fill them after construction. The output textures and views are\n * promoted here only after a completed precompute submission.\n */\nexport interface IblPipelineCache {\n /** Reusable generation-scoped kernel state; per-probe outputs stay elsewhere. */\n readonly probeKernel: IblKernelCache;\n /** Color format shared by all precompute outputs for this device. */\n outputFormat?: TextureFormat;\n /** Equirectangular-to-cubemap pipeline. */\n equirectToCubePipeline?: RenderPipeline;\n /** Diffuse irradiance convolution pipeline. */\n irradiancePipeline?: RenderPipeline;\n /** Specular prefilter pipeline. */\n prefilterPipeline?: RenderPipeline;\n /** BRDF integration LUT pipeline. */\n brdfLutPipeline?: RenderPipeline;\n\n /** Face uniforms BGL (shared across equirect/irradiance/prefilter, D-9). */\n faceUniformsBgl?: BindGroupLayout;\n /** group(1) BGL for the equirect-to-cube pass (texture_2d + sampler). */\n equirectGroup1Bgl?: BindGroupLayout;\n /** group(1) BGL for irradiance + prefilter (texture_cube + sampler). */\n cubeGroup1Bgl?: BindGroupLayout;\n /** group(0) BGL for prefilter (face + prefilter uniforms). */\n prefilterGroup0Bgl?: BindGroupLayout;\n\n /** Irradiance cubemap texture (32x32; outputFormat, cube). */\n irradianceTexture?: Texture;\n /** Irradiance cubemap view (dimension:cube). */\n irradianceView?: TextureView;\n /** Per-face 2D views for irradiance (render-attachment use). */\n irradianceFaceViews?: ReadonlyArray<TextureView>;\n /** Specular prefilter cubemap (128x128, 5 mip levels). */\n prefilterTexture?: Texture;\n /** Prefilter cubemap view (dimension:cube, all mips). */\n prefilterView?: TextureView;\n /** Per-face 2D views per mip for prefilter (5 mips x 6 faces). */\n prefilterFaceViewsByMip?: ReadonlyArray<ReadonlyArray<TextureView>>;\n /** BRDF LUT (256x256; outputFormat). */\n brdfLutTexture?: Texture;\n /** BRDF LUT view. */\n brdfLutView?: TextureView;\n\n /** Counter: times irradiance pass has executed. AC-04: == 1 after first cook. */\n irradianceBakeCount: number;\n /** Counter: times prefilter pass has executed. AC-05: == 1 after first cook. */\n prefilterBakeCount: number;\n /** Counter: times BRDF LUT pass has executed. AC-06: == 1 after first cook. */\n brdfLutBakeCount: number;\n}\n\n/**\n * Cache ownership follows the renderer's DeviceScope generation. A cache is\n * never recovered by looking up an opaque device handle, so every pipeline and\n * side texture is born under the same lifecycle owner as the rest of the\n * renderer resources.\n */\nconst scopeCaches: WeakMap<DeviceScope, IblPipelineCache> = new WeakMap();\n\n/**\n * Get or create the current-generation IBL pipeline cache.\n */\nexport function getOrCreateIblCache(scope: DeviceScope): IblPipelineCache {\n const existing = scopeCaches.get(scope);\n if (existing !== undefined) return existing;\n\n const cache: IblPipelineCache = {\n probeKernel: createIblKernelCache(scope.generation),\n irradianceBakeCount: 0,\n prefilterBakeCount: 0,\n brdfLutBakeCount: 0,\n };\n scopeCaches.set(scope, cache);\n return cache;\n}\n\n/**\n * Check whether a DeviceScope generation has an active cache entry.\n */\nexport function hasIblCache(scope: DeviceScope): boolean {\n return scopeCaches.has(scope);\n}\n\n// ─── M3.5 composed ibl-* shader source registry ─────────────────────────────\n//\n// 4 composed WGSL strings -- one per render pipeline. Each string is the\n// output of @forgeax/engine-naga composeShader after merging ibl_shared +\n// the per-pass module. Built by ShaderCatalog / vite-plugin-shader at\n// build-time so the runtime cache never reaches into engine-naga\n// (AGENTS.md grep gate forbids).\n\nexport interface IblComposedShaders {\n /** ibl-equirect-to-cube composed (cubemap_vs + equirectToCube_fs). */\n readonly equirectToCube: string;\n /** ibl-irradiance composed (cubemap_vs + irradianceConvolve_fs). */\n readonly irradiance: string;\n /** ibl-prefilter composed (cubemap_vs + prefilterEnv_fs). */\n readonly prefilter: string;\n /** ibl-brdf-lut composed (fullscreen_vs + brdfLutBake_fs). */\n readonly brdfLut: string;\n readonly probeBackground?: string;\n}\n\nlet iblComposedShadersCache: IblComposedShaders | undefined;\n\nexport function getIblProbeBackgroundSource(): string | undefined {\n return iblComposedShadersCache?.probeBackground;\n}\n\n/**\n * Inject the composed ibl-* shader sources used by createIblPipelines.\n * Called once by the engine bootstrap (createRenderer step \"shader-load\")\n * with the 4 composed entries from ShaderCatalog.\n */\nexport function setIblComposedShaders(sources: IblComposedShaders): void {\n iblComposedShadersCache = sources;\n}\n\n// ─── Standard cube vertices for cubemap face rendering ───────────────────────\n// 36 vertices (6 faces * 2 triangles * 3 vertices), vec3<f32> format.\n// Unit cube [-1, 1]^3 centered at origin.\nexport const CUBEMAP_FACE_VERTICES = new Float32Array([\n // +X face (+1, 0, 0)\n 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0,\n // -X face (-1, 0, 0)\n -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0,\n 1.0,\n // +Y face (0, +1, 0)\n -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0,\n // -Y face (0, -1, 0)\n -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0,\n 1.0,\n // +Z face (0, 0, +1)\n -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0,\n // -Z face (0, 0, -1)\n 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0,\n -1.0,\n]);\n\n// 6 capture view-projection matrices (right-handed, from origin).\n// Projection Y is negated for WebGPU top-left framebuffer origin.\n// Target directions: +X, -X, +Y, -Y, +Z, -Z.\n// Up vectors: -Y for X/Z faces, +Z for +Y, -Z for -Y.\nexport const CAPTURE_VIEW_PROJS = buildCaptureViewProjs();\n\nfunction buildCaptureViewProjs(): Float32Array[] {\n const targets: [number, number, number][] = [\n [1, 0, 0],\n [-1, 0, 0],\n [0, 1, 0],\n [0, -1, 0],\n [0, 0, 1],\n [0, 0, -1],\n ];\n const ups: [number, number, number][] = [\n [0, -1, 0],\n [0, -1, 0],\n [0, 0, 1],\n [0, 0, -1],\n [0, -1, 0],\n [0, -1, 0],\n ];\n\n const proj = cubemapCaptureProjection(Math.PI / 2, 0.1, 10.0);\n\n return targets.map((_t, i) => {\n const t = _t;\n const u = ups[i] ?? [0, -1, 0];\n const view = lookAtMatrix([0, 0, 0], t, u);\n return mulMat4(proj, view);\n });\n}\n\nfunction cubemapCaptureProjection(fovy: number, near: number, far: number): Float32Array {\n const f = 1.0 / Math.tan(fovy / 2);\n const nf = 1.0 / (near - far);\n // biome-ignore format: manual column-major mat4\n return new Float32Array([\n f, 0, 0, 0,\n 0, -f, 0, 0,\n 0, 0, (far + near) * nf, -1,\n 0, 0, 2 * far * near * nf, 0,\n ]);\n}\n\nfunction lookAtMatrix(\n eye: readonly number[],\n target: readonly number[],\n up: readonly number[],\n): Float32Array {\n const [ex, ey0, ez] = [eye[0] ?? 0, eye[1] ?? 0, eye[2] ?? 0];\n const [tx, ty, tz] = [target[0] ?? 0, target[1] ?? 0, target[2] ?? 0];\n const [upx, upy, upz] = [up[0] ?? 0, up[1] ?? 0, up[2] ?? 0];\n let fx = ex - tx,\n fy = ey0 - ty,\n fz = ez - tz;\n const fLen = Math.sqrt(fx * fx + fy * fy + fz * fz);\n fx /= fLen;\n fy /= fLen;\n fz /= fLen;\n\n let rx = upy * fz - upz * fy;\n let ry = upz * fx - upx * fz;\n let rz = upx * fy - upy * fx;\n const rLen = Math.sqrt(rx * rx + ry * ry + rz * rz);\n rx /= rLen;\n ry /= rLen;\n rz /= rLen;\n\n const ux = fy * rz - fz * ry;\n const uy = fz * rx - fx * rz;\n const uz = fx * ry - fy * rx;\n\n return new Float32Array([\n rx,\n ux,\n fx,\n 0,\n ry,\n uy,\n fy,\n 0,\n rz,\n uz,\n fz,\n 0,\n -(rx * ex + ry * ey0 + rz * ez),\n -(ux * ex + uy * ey0 + uz * ez),\n -(fx * ex + fy * ey0 + fz * ez),\n 1,\n ]);\n}\n\n// Column-major matrix product `r = a * b` where each Float32Array stores\n// 4 contiguous column vectors of 4 floats (WGSL `mat4x4<f32>` uniform\n// layout). For column-major storage `flat[c*4 + row] = M[col=c, row]`, so:\n// (a * b)[col=c, row=r] = sum_k a[col=k, row=r] * b[col=c, row=k]\n// flat_out[c*4 + r] = sum_k a[k*4 + r] * b[c*4 + k]\n//\n// The prior row-major iteration silently transposed the result, producing\n// `b * a` in WGSL's view -- IBL equirect-to-cube vertices then projected\n// to clip with w=0 / w=-1, every face fell outside the [-1,1] frustum, no\n// fragments drew, and every downstream IBL texture (irradiance / prefilter)\n// inherited the clearValue=(0,0,0,1). Demo 3x3 sphere matrix rendered\n// pure black because `ambient = kD * 0 + specular * 0 = 0` and there are\n// no direct lights in the IBL demo scene.\nfunction mulMat4(a: Float32Array, b: Float32Array): Float32Array {\n const r = new Float32Array(16);\n for (let c = 0; c < 4; c++) {\n for (let row = 0; row < 4; row++) {\n let sum = 0;\n for (let k = 0; k < 4; k++) {\n sum += (a[k * 4 + row] ?? 0) * (b[c * 4 + k] ?? 0);\n }\n r[c * 4 + row] = sum;\n }\n }\n return r;\n}\n\n// ─── M3.5 t52: createIblPipelines (4 independent GPURenderPipelines) ─────────\n\n// IBL output texture sizes (plan D-10 SSOT, mirrored in ibl-brdf-lut.wgsl).\nexport const IRRADIANCE_SIZE = 32;\nexport const PREFILTER_SIZE = 128;\nexport const PREFILTER_MIP_LEVELS = 5;\nexport const BRDF_LUT_SIZE = 256;\n\n/**\n * Create 4 independent GPURenderPipelines + their shared / per-pass bind\n * group layouts. Pipeline slots are stored on the per-device cache and\n * survive across calls (D-1 startup-once cook).\n *\n * D-9: faceUniforms BGL (@group(0) for equirect/irradiance/prefilter) is\n * a single instance reused across 3 pipelines (binary-compatible).\n * group(1) is per-pipeline: texture_2d for equirect, texture_cube for\n * irradiance + prefilter, none for brdf-lut.\n */\nexport async function createIblPipelines(\n scope: DeviceScope,\n device: IblRhiOwner,\n factory: IblShaderModuleFactory,\n cubeOutputFormat: TextureFormat = 'rgba16float',\n): Promise<Result<IblPipelineSet, RhiError | IblPipelineError>> {\n const cache = getOrCreateIblCache(scope);\n if (\n cache.equirectToCubePipeline !== undefined &&\n cache.irradiancePipeline !== undefined &&\n cache.prefilterPipeline !== undefined &&\n cache.brdfLutPipeline !== undefined\n ) {\n return ok({\n equirectToCubePipeline: cache.equirectToCubePipeline,\n irradiancePipeline: cache.irradiancePipeline,\n prefilterPipeline: cache.prefilterPipeline,\n brdfLutPipeline: cache.brdfLutPipeline,\n });\n }\n // Keep the output format on the per-device cache so the four pipelines and\n // their lazily-created side textures cannot drift. WebGL2 may need the\n // renderable rgba8 fallback even when the source equirect remains float.\n const outputFormat = cubeOutputFormat;\n cache.outputFormat = outputFormat;\n\n const composed = iblComposedShadersCache;\n // Mock-device path: factory returns synthetic modules. Both production\n // (composed) and unit-test (placeholder code) paths converge here.\n const fallbackCode = '@vertex fn vs() -> @builtin(position) vec4<f32> { return vec4<f32>(0.0); }';\n const src = composed ?? {\n equirectToCube: fallbackCode,\n irradiance: fallbackCode,\n prefilter: fallbackCode,\n brdfLut: fallbackCode,\n };\n\n const modules = await Promise.all([\n factory(device, { code: src.equirectToCube, label: 'ibl-equirect-to-cube' }),\n factory(device, { code: src.irradiance, label: 'ibl-irradiance' }),\n factory(device, { code: src.prefilter, label: 'ibl-prefilter' }),\n factory(device, { code: src.brdfLut, label: 'ibl-brdf-lut' }),\n ]);\n for (const m of modules) {\n if (!m.ok) return err(m.error);\n }\n const shaderModules = modules.flatMap((module) => (module.ok ? [module.value] : []));\n if (shaderModules.length !== 4) {\n return err(iblPipelineError('shader-modules', 'ibl-shader-module-missing'));\n }\n const [mEq, mIr, mPr, mBr] = shaderModules;\n if (mEq === undefined || mIr === undefined || mPr === undefined || mBr === undefined) {\n return err(iblPipelineError('shader-modules', 'ibl-shader-module-missing'));\n }\n\n // D-9: faceUniforms BGL shared across 3 pipelines (equirect / irradiance /\n // prefilter). The prefilter additionally needs binding(1) for prefUniforms;\n // we keep a separate BGL for the prefilter group(0) to honour the WGSL\n // declaration in ibl-prefilter.wgsl.\n const faceBgl = device.createBindGroupLayout({\n label: 'ibl-face-uniforms-bgl',\n entries: [{ binding: 0, visibility: GPU_SHADER_STAGE_VERTEX, buffer: { type: 'uniform' } }],\n });\n if (!faceBgl.ok) return err(faceBgl.error);\n cache.faceUniformsBgl = faceBgl.value;\n\n const prefilterGroup0 = device.createBindGroupLayout({\n label: 'ibl-prefilter-group0-bgl',\n entries: [\n { binding: 0, visibility: GPU_SHADER_STAGE_VERTEX, buffer: { type: 'uniform' } },\n { binding: 1, visibility: GPU_SHADER_STAGE_FRAGMENT, buffer: { type: 'uniform' } },\n ],\n });\n if (!prefilterGroup0.ok) return err(prefilterGroup0.error);\n cache.prefilterGroup0Bgl = prefilterGroup0.value;\n\n const equirectGroup1 = device.createBindGroupLayout({\n label: 'ibl-equirect-group1-bgl',\n entries: [\n {\n binding: 0,\n visibility: GPU_SHADER_STAGE_FRAGMENT,\n texture: { sampleType: 'float', viewDimension: '2d' },\n },\n {\n binding: 1,\n visibility: GPU_SHADER_STAGE_FRAGMENT,\n sampler: { type: 'filtering' },\n },\n ],\n });\n if (!equirectGroup1.ok) return err(equirectGroup1.error);\n cache.equirectGroup1Bgl = equirectGroup1.value;\n\n const cubeGroup1 = device.createBindGroupLayout({\n label: 'ibl-cube-group1-bgl',\n entries: [\n {\n binding: 0,\n visibility: GPU_SHADER_STAGE_FRAGMENT,\n texture: { sampleType: 'float', viewDimension: 'cube' },\n },\n {\n binding: 1,\n visibility: GPU_SHADER_STAGE_FRAGMENT,\n sampler: { type: 'filtering' },\n },\n ],\n });\n if (!cubeGroup1.ok) return err(cubeGroup1.error);\n cache.cubeGroup1Bgl = cubeGroup1.value;\n\n // Pipeline layouts.\n const equirectLayout = device.createPipelineLayout({\n label: 'ibl-equirect-pipeline-layout',\n bindGroupLayouts: [faceBgl.value, equirectGroup1.value],\n });\n if (!equirectLayout.ok) return err(equirectLayout.error);\n const irradianceLayout = device.createPipelineLayout({\n label: 'ibl-irradiance-pipeline-layout',\n bindGroupLayouts: [faceBgl.value, cubeGroup1.value],\n });\n if (!irradianceLayout.ok) return err(irradianceLayout.error);\n const prefilterLayout = device.createPipelineLayout({\n label: 'ibl-prefilter-pipeline-layout',\n bindGroupLayouts: [prefilterGroup0.value, cubeGroup1.value],\n });\n if (!prefilterLayout.ok) return err(prefilterLayout.error);\n const brdfLutLayout = device.createPipelineLayout({\n label: 'ibl-brdf-lut-pipeline-layout',\n bindGroupLayouts: [],\n });\n if (!brdfLutLayout.ok) return err(brdfLutLayout.error);\n\n const vertexLayout3F = {\n arrayStride: 12,\n attributes: [{ shaderLocation: 0, offset: 0, format: 'float32x3' as const }],\n };\n\n const pipeEquirect = device.createRenderPipeline({\n label: 'ibl-equirect-to-cube-pipeline',\n layout: equirectLayout.value,\n vertex: { module: mEq, entryPoint: 'cubemap_vs', buffers: [vertexLayout3F] },\n fragment: {\n module: mEq,\n entryPoint: 'equirectToCube_fs',\n targets: [{ format: cubeOutputFormat }],\n },\n primitive: { topology: 'triangle-list', cullMode: 'none' },\n });\n if (!pipeEquirect.ok) return err(pipeEquirect.error);\n cache.equirectToCubePipeline = pipeEquirect.value;\n\n const pipeIrradiance = device.createRenderPipeline({\n label: 'ibl-irradiance-pipeline',\n layout: irradianceLayout.value,\n vertex: { module: mIr, entryPoint: 'cubemap_vs', buffers: [vertexLayout3F] },\n fragment: {\n module: mIr,\n entryPoint: 'irradianceConvolve_fs',\n targets: [{ format: cubeOutputFormat }],\n },\n primitive: { topology: 'triangle-list', cullMode: 'none' },\n });\n if (!pipeIrradiance.ok) return err(pipeIrradiance.error);\n cache.irradiancePipeline = pipeIrradiance.value;\n\n const pipePrefilter = device.createRenderPipeline({\n label: 'ibl-prefilter-pipeline',\n layout: prefilterLayout.value,\n vertex: { module: mPr, entryPoint: 'cubemap_vs', buffers: [vertexLayout3F] },\n fragment: {\n module: mPr,\n entryPoint: 'prefilterEnv_fs',\n targets: [{ format: cubeOutputFormat }],\n },\n primitive: { topology: 'triangle-list', cullMode: 'none' },\n });\n if (!pipePrefilter.ok) return err(pipePrefilter.error);\n cache.prefilterPipeline = pipePrefilter.value;\n\n const pipeBrdfLut = device.createRenderPipeline({\n label: 'ibl-brdf-lut-pipeline',\n layout: brdfLutLayout.value,\n vertex: { module: mBr, entryPoint: 'fullscreen_vs', buffers: [] },\n fragment: {\n module: mBr,\n entryPoint: 'brdfLutBake_fs',\n targets: [{ format: cubeOutputFormat }],\n },\n primitive: { topology: 'triangle-list', cullMode: 'none' },\n });\n if (!pipeBrdfLut.ok) return err(pipeBrdfLut.error);\n cache.brdfLutPipeline = pipeBrdfLut.value;\n\n return ok({\n equirectToCubePipeline: pipeEquirect.value,\n irradiancePipeline: pipeIrradiance.value,\n prefilterPipeline: pipePrefilter.value,\n brdfLutPipeline: pipeBrdfLut.value,\n });\n}\n\nfunction iblPipelineError(\n stage: string,\n code: IblPipelineError['code'],\n cause?: RhiError,\n): IblPipelineError {\n return {\n code,\n expected: `${stage} completed through the RHI Result contract`,\n hint: `inspect the ${stage} RHI error before retrying IBL pipeline creation`,\n detail: { stage, ...(cause === undefined ? {} : { rhiCode: cause.code }) },\n };\n}\n\n// ─── M3.5 t53: runIblPrecompute (4-pass dispatch + queue.submit) ─────────────\n\n/**\n * Options consumed by runIblPrecompute. The caller (the internal\n * GpuResidencyCache equirect-to-cubemap projection) provides the equirect input\n * + cubemap target GPU resources; the face-uniform / prefilter-uniform buffers\n * come from the t55 helpers.\n */\nexport interface RunIblPrecomputeOptions {\n readonly scope: DeviceScope;\n readonly device: IblRhiOwner;\n readonly equirectGpuTex: Texture;\n readonly equirectView: TextureView;\n readonly cubeGpuTex: Texture;\n readonly cubeView: TextureView;\n readonly cubeFaceViews: ReadonlyArray<TextureView>;\n readonly faceUniformsBuffer: Buffer;\n readonly prefilterUniformsBuffer: Buffer;\n readonly cubeVertexBuffer: Buffer;\n}\n\ninterface IblPrecomputeCandidate {\n irradianceTexture: Texture;\n irradianceView: TextureView;\n irradianceFaceViews: ReadonlyArray<TextureView>;\n prefilterTexture: Texture;\n prefilterView: TextureView;\n prefilterFaceViewsByMip: ReadonlyArray<ReadonlyArray<TextureView>>;\n brdfLutTexture: Texture;\n brdfLutView: TextureView;\n}\n\nexport interface IblPrecomputeError {\n readonly code: 'ibl-precompute-not-dispatched';\n readonly expected: string;\n readonly hint: string;\n readonly detail?: { readonly stage: string; readonly rhiCode?: RhiError['code'] };\n}\n\n/**\n * Execute the 4 IBL precompute passes (equirect-to-cube / irradiance /\n * prefilter / brdf-lut) as ordered, stage-bounded submissions. Outputs stay\n * candidate-local until every queue completion fence and generation check\n * pass.\n *\n * Counter invariant (AC-20, plan D-7 / N-3): the\n * `irradiance/prefilter/brdfLut BakeCount` counters are incremented\n * AFTER queue.submit returns. If submit throws or returns Result.err, the\n * counters stay at 0 -- this is the prime safety guard against the\n * round-1 \"counter += 1 as dispatch proxy\" anti-pattern.\n *\n * Returns Result.err with code='ibl-precompute-not-dispatched' when the\n * underlying device lacks queue.submit or one of the 4 pipelines was not\n * created (createIblPipelines must run first).\n */\nexport async function runIblPrecompute(\n opts: RunIblPrecomputeOptions,\n): Promise<Result<{ submitted: boolean }, IblPrecomputeError>> {\n const { device, scope } = opts;\n const cache = getOrCreateIblCache(scope);\n const outputFormat = cache.outputFormat ?? 'rgba16float';\n const generation = scope.generation;\n const candidate: Partial<IblPrecomputeCandidate> = {};\n const fail = (stage: string, cause?: RhiError): Promise<Result<never, IblPrecomputeError>> => {\n // Candidate textures are adopted by the DeviceScope immediately after\n // allocation, so every failure is retired with the owning generation.\n return Promise.resolve(err(badAlloc(stage, cause)));\n };\n\n if (\n cache.equirectToCubePipeline === undefined ||\n cache.irradiancePipeline === undefined ||\n cache.prefilterPipeline === undefined ||\n cache.brdfLutPipeline === undefined\n ) {\n return err({\n code: 'ibl-precompute-not-dispatched',\n expected: '4 IBL pipelines created via createIblPipelines',\n hint: 'check IblPipelineCache.createIblPipelines was called before runIblPrecompute; counters must not increment before queue.submit',\n detail: { stage: 'pipeline-cache' },\n });\n }\n\n // Allocate side textures (irradiance / prefilter / brdf-lut) lazily.\n // M5-amend Bug 1: dawn readback (t51 + reference baker) copies the\n // side textures back to a buffer via copyTextureToBuffer, which\n // requires the TextureUsage::CopySrc bit on the source. Without it\n // Dawn fails-fast \"usage doesn't include CopySrc\".\n\n {\n const textureResult = device.createTexture({\n label: 'ibl-irradiance-cube',\n size: { width: IRRADIANCE_SIZE, height: IRRADIANCE_SIZE, depthOrArrayLayers: 6 },\n mipLevelCount: 1,\n sampleCount: 1,\n dimension: '2d',\n format: outputFormat,\n usage:\n GPU_TEXTURE_USAGE_RENDER_ATTACHMENT_AND_TEXTURE_BINDING |\n GPU_TEXTURE_USAGE_COPY_DST |\n GPU_TEXTURE_USAGE_COPY_SRC,\n viewFormats: [],\n textureBindingViewDimension: undefined,\n });\n if (!textureResult.ok) return fail('irradiance-texture', textureResult.error);\n candidate.irradianceTexture = adoptIblTexture(scope, device, textureResult.value);\n const cubeViewResult = device.createTextureView(textureResult.value, {\n label: 'ibl-irradiance-cube-view',\n dimension: 'cube',\n arrayLayerCount: 6,\n });\n if (!cubeViewResult.ok) return fail('irradiance-view', cubeViewResult.error);\n candidate.irradianceView = cubeViewResult.value;\n const faceViews: TextureView[] = [];\n for (let f = 0; f < 6; f++) {\n const viewResult = device.createTextureView(textureResult.value, {\n label: `ibl-irradiance-face-${f}`,\n dimension: '2d',\n baseArrayLayer: f,\n arrayLayerCount: 1,\n });\n if (!viewResult.ok) return fail('irradiance-face-view', viewResult.error);\n faceViews.push(viewResult.value);\n }\n candidate.irradianceFaceViews = faceViews;\n }\n\n {\n const textureResult = device.createTexture({\n label: 'ibl-prefilter-cube',\n size: { width: PREFILTER_SIZE, height: PREFILTER_SIZE, depthOrArrayLayers: 6 },\n mipLevelCount: PREFILTER_MIP_LEVELS,\n sampleCount: 1,\n dimension: '2d',\n format: outputFormat,\n usage:\n GPU_TEXTURE_USAGE_RENDER_ATTACHMENT_AND_TEXTURE_BINDING |\n GPU_TEXTURE_USAGE_COPY_DST |\n GPU_TEXTURE_USAGE_COPY_SRC,\n viewFormats: [],\n textureBindingViewDimension: undefined,\n });\n if (!textureResult.ok) return fail('prefilter-texture', textureResult.error);\n candidate.prefilterTexture = adoptIblTexture(scope, device, textureResult.value);\n const cubeViewResult = device.createTextureView(textureResult.value, {\n label: 'ibl-prefilter-cube-view',\n dimension: 'cube',\n arrayLayerCount: 6,\n baseMipLevel: 0,\n mipLevelCount: PREFILTER_MIP_LEVELS,\n });\n if (!cubeViewResult.ok) return fail('prefilter-view', cubeViewResult.error);\n candidate.prefilterView = cubeViewResult.value;\n const mipViews: TextureView[][] = [];\n for (let m = 0; m < PREFILTER_MIP_LEVELS; m++) {\n const faces: TextureView[] = [];\n for (let f = 0; f < 6; f++) {\n const viewResult = device.createTextureView(textureResult.value, {\n label: `ibl-prefilter-mip${m}-face${f}`,\n dimension: '2d',\n baseMipLevel: m,\n mipLevelCount: 1,\n baseArrayLayer: f,\n arrayLayerCount: 1,\n });\n if (!viewResult.ok) return fail('prefilter-face-view', viewResult.error);\n faces.push(viewResult.value);\n }\n mipViews.push(faces);\n }\n candidate.prefilterFaceViewsByMip = mipViews;\n }\n\n {\n const textureResult = device.createTexture({\n label: 'ibl-brdf-lut',\n size: { width: BRDF_LUT_SIZE, height: BRDF_LUT_SIZE, depthOrArrayLayers: 1 },\n mipLevelCount: 1,\n sampleCount: 1,\n dimension: '2d',\n format: outputFormat,\n usage:\n GPU_TEXTURE_USAGE_RENDER_ATTACHMENT_AND_TEXTURE_BINDING |\n GPU_TEXTURE_USAGE_COPY_DST |\n GPU_TEXTURE_USAGE_COPY_SRC,\n viewFormats: [],\n textureBindingViewDimension: undefined,\n });\n if (!textureResult.ok) return fail('brdf-lut-texture', textureResult.error);\n candidate.brdfLutTexture = adoptIblTexture(scope, device, textureResult.value);\n const viewResult = device.createTextureView(textureResult.value, {\n label: 'ibl-brdf-lut-view',\n dimension: '2d',\n });\n if (!viewResult.ok) return fail('brdf-lut-view', viewResult.error);\n candidate.brdfLutView = viewResult.value;\n }\n\n // Shared sampler (filtering, linear-linear).\n // U=repeat because equirect wraps horizontally (atan2 seam at ±π);\n // V=clamp because equirect poles are clamped vertically.\n const samplerResult = device.createSampler({\n label: 'ibl-precompute-sampler',\n magFilter: 'linear',\n minFilter: 'linear',\n mipmapFilter: 'linear',\n addressModeU: 'repeat',\n addressModeV: 'clamp-to-edge',\n addressModeW: 'clamp-to-edge',\n });\n if (!samplerResult.ok) return fail('sampler', samplerResult.error);\n const sampler: Sampler = samplerResult.value;\n\n let encoderResult = device.createCommandEncoder({\n label: 'ibl-precompute-encoder-equirect-to-cube',\n });\n if (!encoderResult.ok) return fail('encoder-equirect-to-cube', encoderResult.error);\n let encoder: RhiCommandEncoder = encoderResult.value;\n\n const submitStage = async (stage: string, createNextEncoder: boolean) => {\n const finishRes = encoder.finish();\n if (!finishRes.ok) return err(badAlloc(`${stage}-finish`, finishRes.error));\n const submitRes = device.queue.submit([finishRes.value]);\n if (!submitRes.ok) return err(badAlloc(`${stage}-submit`, submitRes.error));\n try {\n await device.queue.onSubmittedWorkDone();\n } catch {\n return err(badAlloc(`${stage}-fence`));\n }\n if (!scope.isAlive() || scope.generation !== generation) {\n return err(badAlloc(`${stage}-device-scope-generation`));\n }\n if (createNextEncoder) {\n encoderResult = device.createCommandEncoder({ label: `ibl-precompute-encoder-${stage}` });\n if (!encoderResult.ok) return err(badAlloc(`${stage}-next-encoder`, encoderResult.error));\n encoder = encoderResult.value;\n }\n return ok(true);\n };\n\n const faceUniformsBgl = cache.faceUniformsBgl;\n const equirectGroup1Bgl = cache.equirectGroup1Bgl;\n const cubeGroup1Bgl = cache.cubeGroup1Bgl;\n const prefilterGroup0Bgl = cache.prefilterGroup0Bgl;\n const equirectPipeline = cache.equirectToCubePipeline;\n const irradiancePipeline = cache.irradiancePipeline;\n const prefilterPipeline = cache.prefilterPipeline;\n const brdfLutPipeline = cache.brdfLutPipeline;\n const candidateIrradianceTexture = candidate.irradianceTexture;\n const candidateIrradianceView = candidate.irradianceView;\n const irrFaceViews = candidate.irradianceFaceViews;\n const candidatePrefilterTexture = candidate.prefilterTexture;\n const candidatePrefilterView = candidate.prefilterView;\n const prefMipViews = candidate.prefilterFaceViewsByMip;\n const candidateBrdfLutTexture = candidate.brdfLutTexture;\n const brdfLutView = candidate.brdfLutView;\n if (\n faceUniformsBgl === undefined ||\n equirectGroup1Bgl === undefined ||\n cubeGroup1Bgl === undefined ||\n prefilterGroup0Bgl === undefined ||\n equirectPipeline === undefined ||\n irradiancePipeline === undefined ||\n prefilterPipeline === undefined ||\n brdfLutPipeline === undefined ||\n candidateIrradianceTexture === undefined ||\n candidateIrradianceView === undefined ||\n irrFaceViews === undefined ||\n candidatePrefilterTexture === undefined ||\n candidatePrefilterView === undefined ||\n prefMipViews === undefined ||\n candidateBrdfLutTexture === undefined ||\n brdfLutView === undefined\n ) {\n return fail('ibl-cache-resources');\n }\n\n // Bind group: equirect group(1).\n const equirectBgResult = device.createBindGroup({\n label: 'ibl-equirect-bg',\n layout: equirectGroup1Bgl,\n entries: [\n { binding: 0, resource: { kind: 'textureView', value: opts.equirectView } },\n { binding: 1, resource: { kind: 'sampler', value: sampler } },\n ],\n });\n if (!equirectBgResult.ok) return fail('equirect-bg', equirectBgResult.error);\n const equirectBg: BindGroup = equirectBgResult.value;\n\n // Bind group: cube group(1) for irradiance + prefilter.\n const cubeBgResult = device.createBindGroup({\n label: 'ibl-cube-bg',\n layout: cubeGroup1Bgl,\n entries: [\n { binding: 0, resource: { kind: 'textureView', value: opts.cubeView } },\n { binding: 1, resource: { kind: 'sampler', value: sampler } },\n ],\n });\n if (!cubeBgResult.ok) return fail('cube-bg', cubeBgResult.error);\n const cubeBg: BindGroup = cubeBgResult.value;\n\n // (a) equirect-to-cube: 6 face draws.\n const cubeFaceViews = opts.cubeFaceViews;\n for (let face = 0; face < 6; face++) {\n const cubeFaceView = cubeFaceViews[face];\n if (cubeFaceView === undefined) return fail('cube-face-view');\n const pass: RhiRenderPassEncoder = encoder.beginRenderPass({\n label: 'ibl-equirect-to-cube',\n colorAttachments: [\n {\n view: cubeFaceView,\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n loadOp: 'clear',\n storeOp: 'store',\n },\n ],\n });\n // Face uniform: dynamic offset = face * 256.\n const faceBgResult = device.createBindGroup({\n label: `ibl-face-bg-${face}`,\n layout: faceUniformsBgl,\n entries: [\n {\n binding: 0,\n resource: {\n kind: 'buffer',\n value: {\n buffer: opts.faceUniformsBuffer,\n offset: face * 256,\n size: 64,\n },\n },\n },\n ],\n });\n if (!faceBgResult.ok) return fail('face-bg', faceBgResult.error);\n pass.setPipeline(equirectPipeline);\n pass.setBindGroup(0, faceBgResult.value);\n pass.setBindGroup(1, equirectBg);\n pass.setVertexBuffer(0, opts.cubeVertexBuffer);\n pass.draw(6, 1, face * 6, 0);\n pass.end();\n }\n\n const cubeStage = await submitStage('equirect-to-cube', true);\n if (!cubeStage.ok) return err(cubeStage.error);\n\n // (b) irradiance convolve: 6 face draws.\n for (let face = 0; face < 6; face++) {\n const irrFaceView = irrFaceViews[face];\n if (irrFaceView === undefined) return fail('irradiance-face-view');\n const pass: RhiRenderPassEncoder = encoder.beginRenderPass({\n label: 'ibl-irradiance',\n colorAttachments: [\n {\n view: irrFaceView,\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n loadOp: 'clear',\n storeOp: 'store',\n },\n ],\n });\n const faceBgResult = device.createBindGroup({\n label: `ibl-irr-face-bg-${face}`,\n layout: faceUniformsBgl,\n entries: [\n {\n binding: 0,\n resource: {\n kind: 'buffer',\n value: {\n buffer: opts.faceUniformsBuffer,\n offset: face * 256,\n size: 64,\n },\n },\n },\n ],\n });\n if (!faceBgResult.ok) return fail('irr-face-bg', faceBgResult.error);\n pass.setPipeline(irradiancePipeline);\n pass.setBindGroup(0, faceBgResult.value);\n pass.setBindGroup(1, cubeBg);\n pass.setVertexBuffer(0, opts.cubeVertexBuffer);\n pass.draw(6, 1, face * 6, 0);\n pass.end();\n\n const irradianceFaceStage = await submitStage(`irradiance-face-${face}`, true);\n if (!irradianceFaceStage.ok) return err(irradianceFaceStage.error);\n }\n\n // (c) prefilter env: 5 mips x 6 faces = 30 sub-passes.\n for (let mip = 0; mip < PREFILTER_MIP_LEVELS; mip++) {\n const mipFaceViews = prefMipViews[mip];\n if (mipFaceViews === undefined) return fail('prefilter-mip-views');\n for (let face = 0; face < 6; face++) {\n const subIdx = mip * 6 + face;\n const mipFaceView = mipFaceViews[face];\n if (mipFaceView === undefined) return fail('prefilter-face-view');\n const pass: RhiRenderPassEncoder = encoder.beginRenderPass({\n label: 'ibl-prefilter',\n colorAttachments: [\n {\n view: mipFaceView,\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n loadOp: 'clear',\n storeOp: 'store',\n },\n ],\n });\n const bgResult = device.createBindGroup({\n label: `ibl-pref-bg-${subIdx}`,\n layout: prefilterGroup0Bgl,\n entries: [\n {\n binding: 0,\n resource: {\n kind: 'buffer',\n value: {\n buffer: opts.faceUniformsBuffer,\n offset: face * 256,\n size: 64,\n },\n },\n },\n {\n binding: 1,\n resource: {\n kind: 'buffer',\n value: {\n buffer: opts.prefilterUniformsBuffer,\n offset: subIdx * 256,\n size: 16,\n },\n },\n },\n ],\n });\n if (!bgResult.ok) return fail('pref-bg', bgResult.error);\n pass.setPipeline(prefilterPipeline);\n pass.setBindGroup(0, bgResult.value);\n pass.setBindGroup(1, cubeBg);\n pass.setVertexBuffer(0, opts.cubeVertexBuffer);\n pass.draw(6, 1, face * 6, 0);\n pass.end();\n }\n }\n\n const prefilterStage = await submitStage('prefilter', true);\n if (!prefilterStage.ok) return err(prefilterStage.error);\n\n // (d) brdf-lut: fullscreen triangle.\n {\n const pass: RhiRenderPassEncoder = encoder.beginRenderPass({\n label: 'ibl-brdf-lut',\n colorAttachments: [\n {\n view: brdfLutView,\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n loadOp: 'clear',\n storeOp: 'store',\n },\n ],\n });\n pass.setPipeline(brdfLutPipeline);\n pass.draw(3, 1, 0, 0);\n pass.end();\n }\n\n // The final stage is fenced before the candidate is promoted.\n const brdfStage = await submitStage('brdf-lut', false);\n if (!brdfStage.ok) return err(brdfStage.error);\n\n const promoted: IblPrecomputeCandidate = {\n irradianceTexture: candidateIrradianceTexture,\n irradianceView: candidateIrradianceView,\n irradianceFaceViews: irrFaceViews,\n prefilterTexture: candidatePrefilterTexture,\n prefilterView: candidatePrefilterView,\n prefilterFaceViewsByMip: prefMipViews,\n brdfLutTexture: candidateBrdfLutTexture,\n brdfLutView,\n };\n // Previous outputs remain DeviceScope-owned until scope retirement. This\n // avoids destroying a texture still referenced by an already-recorded pass.\n cache.irradianceTexture = promoted.irradianceTexture;\n cache.irradianceView = promoted.irradianceView;\n cache.irradianceFaceViews = promoted.irradianceFaceViews;\n cache.prefilterTexture = promoted.prefilterTexture;\n cache.prefilterView = promoted.prefilterView;\n cache.prefilterFaceViewsByMip = promoted.prefilterFaceViewsByMip;\n cache.brdfLutTexture = promoted.brdfLutTexture;\n cache.brdfLutView = promoted.brdfLutView;\n\n // POST-SUBMIT counter increments (AC-20).\n cache.irradianceBakeCount += 1;\n cache.prefilterBakeCount += 1;\n cache.brdfLutBakeCount += 1;\n\n return ok({ submitted: true });\n}\n\nfunction adoptIblTexture(scope: DeviceScope, device: IblRhiOwner, texture: Texture): Texture {\n scope._adopt('texture', texture, (value) => {\n device.destroyTexture(value);\n });\n return texture;\n}\n\n// Local helper -- structured error payload shared across allocation paths.\nfunction badAlloc(stage: string, cause?: RhiError): IblPrecomputeError {\n return {\n code: 'ibl-precompute-not-dispatched',\n expected: `${stage} allocated successfully`,\n hint: `check the RHI Result for ${stage}; counters must not increment before queue.submit`,\n ...(cause === undefined ? {} : { detail: { stage, rhiCode: cause.code } }),\n };\n}\n","import type { PointsLinesExpandedGeometry } from './expansion-cache';\nimport type { PointsLinesRetainedSnapshot } from './snapshot';\n\nexport const POINTS_LINES_MATERIAL_SHADER_ID = 'forgeax::points-lines';\n\nexport type PointsLinesLane = 'direct' | 'clustered' | 'cpu-webgl2';\nexport type PointsLinesBackend = 'webgpu' | 'wgpu-webgl2' | 'null';\n\nexport interface PointsLinesLaneContract {\n readonly lane: PointsLinesLane;\n readonly backend: PointsLinesBackend;\n readonly authoring: 'shared';\n readonly evidence: 'runtime' | 'structural-only';\n readonly material: {\n readonly source: 'MaterialAsset';\n readonly shaderId: typeof POINTS_LINES_MATERIAL_SHADER_ID;\n readonly shadingModel: 'unlit';\n readonly clusteredLighting: false;\n readonly lit: false;\n };\n readonly graph: {\n readonly additionalAttachments: 0;\n readonly additionalPasses: 0;\n };\n readonly shadowDrawCount: 0;\n readonly capabilities: {\n readonly compute: false;\n readonly storage: false;\n readonly indirect: false;\n };\n}\n\nexport interface PointsLinesRecordPlan {\n readonly lane: PointsLinesLane;\n readonly backend: PointsLinesBackend;\n readonly materialShaderId: typeof POINTS_LINES_MATERIAL_SHADER_ID;\n readonly component: 'Points' | 'Lines';\n readonly meshGeneration: number;\n readonly materialGeneration: number;\n readonly vertexCount: number;\n readonly indexCount: number;\n readonly drawCount: 0 | 1;\n readonly shadowDrawCount: 0;\n readonly conservativeMarginPx: number;\n readonly graph: PointsLinesLaneContract['graph'];\n}\n\n/**\n * Describes the shared lane boundary without selecting a backend in authoring.\n * Every lane uses CPU-uploaded triangle expansion; capability flags therefore\n * stay false, including on WebGPU, and the graph remains the existing pass.\n */\nexport function createPointsLinesLaneContract(\n lane: PointsLinesLane,\n backend: PointsLinesBackend,\n): PointsLinesLaneContract {\n return {\n lane,\n backend,\n authoring: 'shared',\n evidence: backend === 'null' ? 'structural-only' : 'runtime',\n material: {\n source: 'MaterialAsset',\n shaderId: POINTS_LINES_MATERIAL_SHADER_ID,\n shadingModel: 'unlit',\n clusteredLighting: false,\n lit: false,\n },\n graph: { additionalAttachments: 0, additionalPasses: 0 },\n shadowDrawCount: 0,\n capabilities: { compute: false, storage: false, indirect: false },\n };\n}\n\n/**\n * Turns one retained expansion into the bounded draw facts consumed by the\n * existing record pass. The shader expands one quad per point or segment,\n * so the limits are exactly four vertices and six indices per primitive.\n */\nexport function createPointsLinesRecordPlan(\n snapshot: PointsLinesRetainedSnapshot,\n geometry: PointsLinesExpandedGeometry,\n contract: PointsLinesLaneContract,\n): PointsLinesRecordPlan {\n const primitiveCount = geometry.pointCount + geometry.segmentCount;\n const visible = snapshot.visible && primitiveCount > 0;\n const conservativeMarginPx =\n snapshot.style?.kind === 'points'\n ? snapshot.style.sizePx * 0.5\n : (snapshot.style?.widthPx ?? 0) * 0.5;\n return {\n lane: contract.lane,\n backend: contract.backend,\n materialShaderId: POINTS_LINES_MATERIAL_SHADER_ID,\n component: geometry.component,\n meshGeneration: snapshot.meshGeneration,\n materialGeneration: snapshot.materialGeneration,\n vertexCount: primitiveCount * 4,\n indexCount: primitiveCount * 6,\n drawCount: visible ? 1 : 0,\n shadowDrawCount: 0,\n conservativeMarginPx,\n graph: contract.graph,\n };\n}\n\nexport interface PointsLinesLaneAdapter {\n readonly contract: PointsLinesLaneContract;\n createRecordPlan(\n snapshot: PointsLinesRetainedSnapshot,\n geometry: PointsLinesExpandedGeometry,\n ): PointsLinesRecordPlan;\n}\n\nexport function createPointsLinesLaneAdapter(\n lane: PointsLinesLane,\n backend: PointsLinesBackend,\n): PointsLinesLaneAdapter {\n const contract = createPointsLinesLaneContract(lane, backend);\n return {\n contract,\n createRecordPlan: (snapshot, geometry) =>\n createPointsLinesRecordPlan(snapshot, geometry, contract),\n };\n}\n","// @forgeax/engine-runtime / gpu-resource\n//\n// feat-20260612-rhi-destroy-renderer-dispose-gpu-lifecycle / M2 / w7 + w8.\n//\n// Runtime-side wrappers around RHI Buffer / Texture opaque handles that\n// expose an explicit `.destroy()` lifecycle and an `isDestroyed` flag.\n//\n// Design rationale (charter + plan-strategy + architecture-principles):\n//\n// - SSOT (architecture-principles §1): the lifecycle bookkeeping (the\n// \"is this handle destroyed yet?\" fact) lives once in the RHI shim\n// layer (rhi-webgpu device.ts: BUFFER_META_MAP / TEXTURE_META_MAP;\n// rhi-wgpu device.ts: same shape over the wgpu wasm boundary). The\n// runtime wrapper does NOT keep its own destroyed: Set; it forwards\n// to `device.destroyBuffer(handle)` / `device.destroyTexture(handle)`\n// and lets the RHI shim be the authority. The local `destroyed`\n// boolean is a derived view (architecture-principles §2 Derive,\n// Don't Duplicate) for the synchronous `isDestroyed` getter --\n// flipped on the success branch of the forward, never on the err\n// branch (so a second destroy preserves the prior `true`).\n//\n// - Concept compression (charter F1 / AGENTS.md design axiom): a\n// single union `type GpuResource = GpuBuffer | GpuTexture` covers\n// both buffer and texture lifecycles so AI-user-facing code that\n// just wants \"a GPU resource I need to dispose\" reaches one\n// symbol. Parallel classes (not a runtime-tagged generic\n// `GpuResource<'buffer' | 'texture'>`) so the shape mirrors the\n// RHI opaque-handle taxonomy verbatim and TS narrowing on\n// instanceof / `'data' in r` keeps each branch typed end-to-end\n// (plan-strategy D-2).\n//\n// - v1 single-owner immortal (requirements §Constraints 8): no refcount,\n// no shared ownership, no move semantics. The wrapper holds the\n// handle once; whoever constructed it disposes it. A future\n// refcount layer (if needed) wraps GpuResource externally without\n// re-entering this file.\n//\n// - Plain boolean isDestroyed (plan-strategy D-5): no typed-state\n// narrowing (i.e. no `Live<GpuBuffer>` / `Destroyed<GpuBuffer>`\n// compile-time partition). The check happens at runtime via the\n// getter; the RHI fail-fast on second destroy is the structural\n// guard. Keeps the public type surface flat (charter F1: one\n// symbol, not three states).\n//\n// - RHI stays spec-aligned and opaque-handle-only (requirements\n// §Constraints 3): GpuResource is a runtime concept; the RHI package\n// exports no wrapper class.\n//\n// Failure paths (forwarded verbatim from RhiDevice):\n// - second `.destroy()` on the same wrapper -> `Result.err({ code:\n// 'destroy-after-destroy', ... })` (RHI errors.ts §RhiErrorCode;\n// introduced in feat-20260612 M1 / w1).\n\nimport type { Buffer, Result, RhiDevice, RhiError, Texture } from '@forgeax/engine-rhi';\nimport type { DeviceScope } from './device/device-scope';\n\n/**\n * Runtime wrapper around an RHI `Buffer` opaque handle that exposes\n * an explicit `.destroy()` lifecycle.\n *\n * Holds the device by reference (no clone); the device's own lifetime\n * outlives the buffer. After `.destroy()` returns ok, `isDestroyed`\n * flips to true; a second `.destroy()` returns err code\n * `'destroy-after-destroy'` forwarded from `device.destroyBuffer(...)`.\n *\n * @example\n * import { GpuBuffer } from './gpu-resource';\n * const created = device.createBuffer({ size: 64, usage: GPUBufferUsage.STORAGE });\n * if (!created.ok) return;\n * const gpuBuf = new GpuBuffer(device, created.value);\n * // ... use gpuBuf.handle in RHI calls ...\n * const r = gpuBuf.destroy();\n * if (!r.ok) {\n * // r.error.code is one of the RhiErrorCode union members,\n * // typically 'destroy-after-destroy' on a stale handle.\n * }\n */\nexport class GpuBuffer {\n readonly device: RhiDevice;\n readonly handle: Buffer;\n // SSOT note: the canonical destroyed: boolean lives on the RHI shim's\n // BUFFER_META_MAP. This local flag is a derived view written only on\n // the success branch of `device.destroyBuffer(...)`; charter §F1.\n private destroyed = false;\n private releaseScope: (() => void) | undefined;\n\n constructor(device: RhiDevice, handle: Buffer, scope?: DeviceScope) {\n this.device = device;\n this.handle = handle;\n if (scope !== undefined) {\n const ref = scope._adopt('buffer', this, (value) => {\n if (!value.isDestroyed) value.destroy();\n });\n this.releaseScope = () => scope._release(ref);\n }\n }\n\n get isDestroyed(): boolean {\n return this.destroyed;\n }\n\n /**\n * Destroy the underlying GPU buffer. Forwards to\n * `device.destroyBuffer(handle)`; on ok flips `isDestroyed` to true,\n * on err leaves the flag unchanged so a downstream second destroy\n * still surfaces the underlying RHI fail-fast.\n */\n destroy(): Result<void, RhiError> {\n const r = this.device.destroyBuffer(this.handle);\n if (r.ok) {\n this.destroyed = true;\n this.releaseScope?.();\n this.releaseScope = undefined;\n }\n return r;\n }\n}\n\n/**\n * Runtime wrapper around an RHI `Texture` opaque handle that exposes\n * an explicit `.destroy()` lifecycle. Mirrors `GpuBuffer` exactly --\n * the only difference is the underlying RHI surface\n * (`device.destroyTexture` instead of `device.destroyBuffer`) and the\n * handle brand. Same SSOT rationale: the destroyed bookkeeping lives\n * on the RHI shim's TEXTURE_META_MAP; the local flag is a derived view.\n *\n * @example\n * import { GpuTexture } from './gpu-resource';\n * const r = device.createTexture({ size: [w, h, 1], format: 'rgba8unorm', usage: ... });\n * if (!r.ok) return;\n * const gpuTex = new GpuTexture(device, r.value);\n * // ... use gpuTex.handle in RHI calls ...\n * gpuTex.destroy();\n */\nexport class GpuTexture {\n readonly device: RhiDevice;\n readonly handle: Texture;\n private destroyed = false;\n private releaseScope: (() => void) | undefined;\n\n constructor(device: RhiDevice, handle: Texture, scope?: DeviceScope) {\n this.device = device;\n this.handle = handle;\n if (scope !== undefined) {\n const ref = scope._adopt('texture', this, (value) => {\n if (!value.isDestroyed) value.destroy();\n });\n this.releaseScope = () => scope._release(ref);\n }\n }\n\n get isDestroyed(): boolean {\n return this.destroyed;\n }\n\n /**\n * Destroy the underlying GPU texture. Forwards to\n * `device.destroyTexture(handle)`; ok branch sets `isDestroyed=true`.\n */\n destroy(): Result<void, RhiError> {\n const r = this.device.destroyTexture(this.handle);\n if (r.ok) {\n this.destroyed = true;\n this.releaseScope?.();\n this.releaseScope = undefined;\n }\n return r;\n }\n}\n\n/**\n * Union of runtime-managed GPU resources requiring explicit\n * `.destroy()`. AI-user-facing code that needs to dispose \"a GPU\n * resource\" types its parameter as `GpuResource` and lets TS narrow\n * via `instanceof GpuBuffer / GpuTexture` if branch-specific access\n * is required. Charter F1 single-entry indexability.\n */\nexport type GpuResource = GpuBuffer | GpuTexture;\n","import type { Result, RhiError, ShaderModule } from '@forgeax/engine-rhi';\nimport { findVariantByKey, type MaterialShaderManifestEntry } from '@forgeax/engine-shader';\n\n/** Minimum sampled-texture limit needed by Standard transmission variants. */\nexport const STANDARD_PBR_REQUIRED_SAMPLED_TEXTURES = 18;\n\nfunction isOrdinaryMaterialVariant(\n variant: MaterialShaderManifestEntry['variants'][number],\n): boolean {\n return variant.defines.COVERAGE_ONLY !== true;\n}\n\n/** Select HDRP variants that must be seeded during ready-state construction. */\nexport function selectHdrpPbrPrewarmVariants(\n manifestEntry: MaterialShaderManifestEntry | undefined,\n storageBufferCapable: boolean,\n extendedLightingShaderAvailableOrTransmissionCapable = true,\n transmissionCapable = true,\n directionalPcssAvailable = true,\n projectorAvailable: boolean = true,\n): readonly MaterialShaderManifestEntry['variants'][number][] {\n const variants = manifestEntry?.variants ?? [];\n const hasExtendedLightingAxis = variants.some(\n (variant) => 'EXTENDED_LIGHTING_AVAILABLE' in variant.defines,\n );\n const extendedLightingShaderAvailable = hasExtendedLightingAxis\n ? extendedLightingShaderAvailableOrTransmissionCapable\n : true;\n const effectiveTransmissionCapable = hasExtendedLightingAxis\n ? transmissionCapable\n : extendedLightingShaderAvailableOrTransmissionCapable;\n if (!storageBufferCapable) return [];\n return (\n variants.filter(\n (variant) =>\n isOrdinaryMaterialVariant(variant) &&\n variant.defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable &&\n (!('EXTENDED_LIGHTING_AVAILABLE' in variant.defines) ||\n variant.defines.EXTENDED_LIGHTING_AVAILABLE === extendedLightingShaderAvailable) &&\n variant.defines.CLUSTER_FORWARD_AVAILABLE === true &&\n (!('DIRECTIONAL_PCSS_AVAILABLE' in variant.defines) ||\n variant.defines.DIRECTIONAL_PCSS_AVAILABLE === directionalPcssAvailable) &&\n (!('PROJECTOR_AVAILABLE' in variant.defines) ||\n variant.defines.PROJECTOR_AVAILABLE === projectorAvailable) &&\n variant.defines.PROBE_BLEND_AVAILABLE !== true &&\n (effectiveTransmissionCapable || variant.defines.TRANSMISSION_AVAILABLE !== true),\n ) ?? []\n );\n}\n\n/** Return every active-capability pbr-skin variant used by URP and HDRP draws. */\nexport function selectSkinPrewarmVariants(\n manifestEntry: MaterialShaderManifestEntry | undefined,\n storageBufferCapable: boolean,\n): readonly MaterialShaderManifestEntry['variants'][number][] {\n return (\n manifestEntry?.variants.filter(\n (variant) =>\n isOrdinaryMaterialVariant(variant) &&\n variant.defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable &&\n (storageBufferCapable || variant.defines.CLUSTER_FORWARD_AVAILABLE !== true) &&\n variant.defines.PROBE_BLEND_AVAILABLE !== true,\n ) ?? []\n );\n}\n\n/**\n * Select the explicit storage-backed, non-clustered GPU scene-index variant.\n * The GPU raster adapter owns a dedicated slot-3 BGL, so this source must not\n * be reused by direct, probe, clustered, or transmission material draws.\n */\nexport function selectGpuDrivenSceneIndexVariant(\n manifestEntry: MaterialShaderManifestEntry | undefined,\n extendedLightingAvailable: boolean,\n directionalPcssAvailable: boolean,\n projectorAvailable: boolean,\n vertexColorAvailable = false,\n): MaterialShaderManifestEntry['variants'][number] | undefined {\n return manifestEntry?.variants.find(\n (variant) =>\n isOrdinaryMaterialVariant(variant) &&\n variant.defines.STORAGE_BUFFER_AVAILABLE === true &&\n variant.defines.GPU_DRIVEN_SCENE_INDEX_AVAILABLE === true &&\n (!('CLUSTER_FORWARD_AVAILABLE' in variant.defines) ||\n variant.defines.CLUSTER_FORWARD_AVAILABLE === false) &&\n (variant.defines.VERTEX_COLOR_AVAILABLE === true) === vertexColorAvailable &&\n (!('PROBE_BLEND_AVAILABLE' in variant.defines) ||\n variant.defines.PROBE_BLEND_AVAILABLE === false) &&\n (!('EXTENDED_LIGHTING_AVAILABLE' in variant.defines) ||\n variant.defines.EXTENDED_LIGHTING_AVAILABLE === extendedLightingAvailable) &&\n (!('DIRECTIONAL_PCSS_AVAILABLE' in variant.defines) ||\n variant.defines.DIRECTIONAL_PCSS_AVAILABLE === directionalPcssAvailable) &&\n (!('PROJECTOR_AVAILABLE' in variant.defines) ||\n variant.defines.PROJECTOR_AVAILABLE === projectorAvailable) &&\n (!('REFLECTION_FALLBACK_AVAILABLE' in variant.defines) ||\n variant.defines.REFLECTION_FALLBACK_AVAILABLE === false) &&\n (!('TRANSMISSION_AVAILABLE' in variant.defines) ||\n variant.defines.TRANSMISSION_AVAILABLE === false),\n );\n}\n\n/** Select probe-enabled material modules for recovery candidate prewarming. */\nexport function selectProbePrewarmVariants(\n manifestEntry: MaterialShaderManifestEntry | undefined,\n storageBufferCapable: boolean,\n extendedLightingShaderAvailable = true,\n transmissionCapable = true,\n directionalPcssAvailable = true,\n projectorAvailable: boolean = true,\n webgl2Downlevel = false,\n): readonly MaterialShaderManifestEntry['variants'][number][] {\n if (!storageBufferCapable) return [];\n return (\n manifestEntry?.variants.filter((variant) => {\n const defines = variant.defines;\n return (\n isOrdinaryMaterialVariant(variant) &&\n defines.PROBE_BLEND_AVAILABLE === true &&\n defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable &&\n (!('WEBGL2_COMPAT' in defines) || defines.WEBGL2_COMPAT === webgl2Downlevel) &&\n (!('EXTENDED_LIGHTING_AVAILABLE' in defines) ||\n defines.EXTENDED_LIGHTING_AVAILABLE === extendedLightingShaderAvailable) &&\n (!('DIRECTIONAL_PCSS_AVAILABLE' in defines) ||\n defines.DIRECTIONAL_PCSS_AVAILABLE === directionalPcssAvailable) &&\n (!('PROJECTOR_AVAILABLE' in defines) ||\n defines.PROJECTOR_AVAILABLE === projectorAvailable) &&\n (transmissionCapable || defines.TRANSMISSION_AVAILABLE !== true)\n );\n }) ?? []\n );\n}\n\n/** Compile and seed a selected material-shader variant set without duplicate modules. */\nexport async function prewarmMaterialShaderVariants(\n variants: readonly MaterialShaderManifestEntry['variants'][number][],\n prewarmedModules: Map<string, ShaderModule>,\n compile: (\n variant: MaterialShaderManifestEntry['variants'][number],\n moduleLabel: string,\n ) => Promise<Result<ShaderModule, RhiError>>,\n seed: (moduleLabel: string, module: ShaderModule) => void,\n): Promise<void> {\n for (const variant of variants) {\n const moduleLabel = `module-forgeax::default-standard-pbr#${variant.definesKey}`;\n let module = prewarmedModules.get(variant.composedWgsl);\n if (module === undefined) {\n const result = await compile(variant, moduleLabel);\n if (!result.ok) throw result.error;\n module = result.value;\n prewarmedModules.set(variant.composedWgsl, module);\n }\n seed(moduleLabel, module);\n }\n}\n\n/** Select the declared Standard URP transmission variants for exact prewarm. */\nexport function selectStandardPbrTransmissionPrewarmVariants(\n manifestEntry: MaterialShaderManifestEntry | undefined,\n storageBufferCapable: boolean,\n directionalPcssAvailable = true,\n projectorAvailable: boolean = true,\n extendedLightingShaderAvailable = true,\n): readonly MaterialShaderManifestEntry['variants'][number][] {\n if (manifestEntry === undefined) {\n throw new Error('Standard material shader manifest row is missing');\n }\n const selected: MaterialShaderManifestEntry['variants'][number][] = [];\n for (const transmissionAvailable of [false, true]) {\n const declared = manifestEntry.variants.find(\n (variant) =>\n isOrdinaryMaterialVariant(variant) &&\n variant.defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable &&\n variant.defines.CLUSTER_FORWARD_AVAILABLE === standardBootClusterAxis() &&\n variant.defines.VERTEX_COLOR_AVAILABLE === false &&\n (!('DIRECTIONAL_PCSS_AVAILABLE' in variant.defines) ||\n variant.defines.DIRECTIONAL_PCSS_AVAILABLE === directionalPcssAvailable) &&\n (!('PROJECTOR_AVAILABLE' in variant.defines) ||\n variant.defines.PROJECTOR_AVAILABLE === projectorAvailable) &&\n (!('EXTENDED_LIGHTING_AVAILABLE' in variant.defines) ||\n variant.defines.EXTENDED_LIGHTING_AVAILABLE === extendedLightingShaderAvailable) &&\n variant.defines.PROBE_BLEND_AVAILABLE !== true &&\n variant.defines.TRANSMISSION_AVAILABLE === transmissionAvailable,\n );\n if (declared === undefined) {\n throw new Error(\n `Standard material shader manifest lacks exact TRANSMISSION_AVAILABLE=${transmissionAvailable} prewarm variant`,\n );\n }\n const exact = findVariantByKey(manifestEntry, declared.definesKey);\n if (exact === undefined) {\n throw new Error(\n `Standard material shader manifest exact lookup failed for TRANSMISSION_AVAILABLE=${transmissionAvailable}`,\n );\n }\n selected.push(exact);\n }\n return selected;\n}\n\nfunction standardBootClusterAxis(): boolean {\n return false;\n}\n","import type { RhiAdapter, RhiDevice } from '@forgeax/engine-rhi';\nimport { EXTENDED_LIGHTING_REQUIRED_SAMPLED_TEXTURES } from '../prepare/extended-lighting/resources';\nimport { STANDARD_PBR_REQUIRED_SAMPLED_TEXTURES } from './shader-prewarm-policy';\n\nconst COMPRESSION_FEATURES: GPUFeatureName[] = [\n 'texture-compression-bc',\n 'texture-compression-etc2',\n 'texture-compression-astc',\n];\n\n// The Standard transmission fragment ABI needs 18 sampled textures across its\n// material, IBL, clustered-light, and SSAO bindings. Ordinary Standard draws\n// use the non-transmission variant and remain valid on the WebGPU minimum of\n// 16. The extended-lighting topology reserves 21, so a device descriptor must\n// request that larger limit when the adapter can provide it; adapter limits are\n// not automatically inherited by requestDevice().\nexport { STANDARD_PBR_REQUIRED_SAMPLED_TEXTURES };\n\nexport function transmissionBackdropAvailable(limit: number | undefined): boolean {\n return limit === undefined || limit >= STANDARD_PBR_REQUIRED_SAMPLED_TEXTURES;\n}\n/**\n * The complete Standard physical root can declare all optional texture slots.\n * Its material group therefore needs one more sampled-texture entry than the\n * extended-lighting topology alone. Request this ceiling when the adapter can\n * provide it; lower-capability devices remain fail-closed at material\n * pipeline admission instead of receiving an invalid WebGPU layout.\n */\nexport const STANDARD_PHYSICAL_REQUIRED_SAMPLED_TEXTURES = 22;\n\nexport interface DeviceFeatureAdmissionOptions {\n readonly gpuPassTiming?: object | undefined;\n readonly captureGpuTimings?: boolean | undefined;\n}\n\nexport interface DeviceFeatureAdmission {\n readonly requiredFeatures: GPUFeatureName[];\n readonly requiredLimits?: {\n readonly maxSampledTexturesPerShaderStage: number;\n };\n}\n\ntype AdapterFeatureProbe = Pick<RhiAdapter, 'features'> & Partial<Pick<RhiAdapter, 'limits'>>;\n\nexport function deriveDeviceFeatureAdmission(\n adapter: AdapterFeatureProbe,\n options?: DeviceFeatureAdmissionOptions,\n): DeviceFeatureAdmission {\n const requiredFeatures = COMPRESSION_FEATURES.filter((feature) => adapter.features.has(feature));\n const timestampRequested =\n options?.gpuPassTiming !== undefined || options?.captureGpuTimings === true;\n if (timestampRequested && adapter.features.has('timestamp-query')) {\n requiredFeatures.push('timestamp-query');\n }\n const adapterSampledTextureLimit = adapter.limits?.maxSampledTexturesPerShaderStage ?? 0;\n const requiredSampledTextureLimit =\n adapterSampledTextureLimit >= STANDARD_PHYSICAL_REQUIRED_SAMPLED_TEXTURES\n ? STANDARD_PHYSICAL_REQUIRED_SAMPLED_TEXTURES\n : adapterSampledTextureLimit >= EXTENDED_LIGHTING_REQUIRED_SAMPLED_TEXTURES\n ? EXTENDED_LIGHTING_REQUIRED_SAMPLED_TEXTURES\n : adapterSampledTextureLimit >= STANDARD_PBR_REQUIRED_SAMPLED_TEXTURES\n ? STANDARD_PBR_REQUIRED_SAMPLED_TEXTURES\n : undefined;\n return {\n requiredFeatures,\n ...(requiredSampledTextureLimit === undefined\n ? {}\n : {\n requiredLimits: {\n maxSampledTexturesPerShaderStage: requiredSampledTextureLimit,\n },\n }),\n };\n}\n\nexport function deviceOptionsForAdapter(\n adapter: AdapterFeatureProbe,\n options?: DeviceFeatureAdmissionOptions,\n): DeviceFeatureAdmission | undefined {\n const admission = deriveDeviceFeatureAdmission(adapter, options);\n return admission.requiredFeatures.length === 0 && admission.requiredLimits === undefined\n ? undefined\n : admission;\n}\n\nexport function isTimestampQueryAdmitted(\n caps: Pick<RhiDevice['caps'], 'timestampQuery' | 'timestampPeriodNanoseconds'>,\n): boolean {\n return (\n caps.timestampQuery === true &&\n caps.timestampPeriodNanoseconds !== null &&\n Number.isFinite(caps.timestampPeriodNanoseconds) &&\n caps.timestampPeriodNanoseconds > 0\n );\n}\n","// skylight-bind-group.ts -- Skylight resources merged into @group(1) PBR\n// material BGL (binding 7..13) + fallback identity resource bundle. The\n// complete Standard material group appends transmission entries.\n//\n// Plan-strategy D-5 (round-4 REVISED): the round-2 stand-alone @group(4)\n// Skylight BindGroupLayout collided with WebGPU's default maxBindGroups=4\n// limit, blocking pbr-pl pipeline-layout creation in chrome-beta. Round-4\n// rewrites the contract: Skylight 7 entries are **appended** to the\n// existing PBR material BindGroupLayout at bindings 7..13; pipeline layout\n// stays at 4 slots `[view, material, mesh, instances]`; unlit pipeline is\n// untouched (it uses its own material BGL).\n//\n// Surface (M2 round-4 / t40 amend):\n// - mergeSkylightIntoMaterialBgl(materialBglEntries): given the existing\n// 7 PBR material BindGroupLayout entries (binding 0..6), returns the\n// merged 14-entry array with Skylight resources at binding 7..13\n// [irrTex, irrSampler, prefTex, prefSampler, brdfTex, brdfSampler,\n// uniform { intensity: f32 }]. The merge is a pure function -- caller\n// (createRenderer) is responsible for passing the result to\n// `device.createBindGroupLayout`.\n// - assembleMaterialWithSkylightEntries(materialEntries, skylightResources):\n// given the existing material BindGroupEntry values + a skylight\n// resource bundle (active or fallback), returns the merged material\n// array with the engine-owned transmission pair at the end, suitable for\n// `device.createBindGroup`. Charter P5 minimal\n// surface: this helper does NOT allocate samplers/textures itself.\n// - createSkylightFallback(device, queue): allocate a 1x1 white\n// irradiance/prefilter cube pair + a 1x1 BRDF approximation + intensity=0 uniform\n// buffer + a shared linear/clamp sampler. Returns the resource bundle\n// so createRenderer can wire it into PipelineState.skylightFallback;\n// no stand-alone bindGroup is created (that was the round-2 shape).\n//\n// All resources write into PipelineState.skylightFallback so the M4\n// recordFrame branch (Skylight present vs absent) selects active vs\n// fallback resources when assembling the PBR material BindGroup\n// (charter P4 consistent abstraction -- one BG layout, one assembly path).\n// The irradiance texture uses the canonical irradianceEOverPi payload semantic;\n// sampling applies the single E/pi normalization at the shader callsite.\n\nimport type {\n BindGroupEntry,\n Buffer,\n Result,\n RhiError,\n Sampler,\n SamplerDescriptor,\n Texture,\n TextureDescriptor,\n TextureView,\n TextureViewDescriptor,\n} from '@forgeax/engine-rhi';\nimport { GPU_SHADER_STAGE_FRAGMENT } from '../gpu-stage';\nimport {\n GPU_TEXTURE_USAGE_COPY_DST,\n GPU_TEXTURE_USAGE_TEXTURE_BINDING,\n} from '../gpu-texture-usage';\nimport { GPU_BUFFER_USAGE_COPY_DST, GPU_BUFFER_USAGE_UNIFORM } from '../gpu-usage';\n\n// The rhi shim enforces bytesPerRow % 256 === 0 uniformly (see\n// fallback-white texture upload in createRenderer.ts). Pad each 1x1 face\n// upload to a 256-byte row stride.\nexport const FALLBACK_BYTES_PER_ROW = 256;\n\n// Local alias for the @webgpu/types BindGroupLayoutEntry shape. Used at\n// object-literal push sites below to dodge the AC-08 (j) `as GPU<Type>`\n// grep gate (charter proposition 5 red line for shim leaks); the underlying\n// type is identical to GPUBindGroupLayoutEntry, so byte-level behavior is\n// unchanged. engine-rhi does not yet re-export a BindGroupLayoutEntry alias\n// (the public surface is BindGroupLayoutDescriptor which Picks `entries`);\n// once it does this alias collapses into a direct import.\ntype BglEntry = GPUBindGroupLayoutEntry;\n\n// ─── Device shim shapes ──────────────────────────────────────────────────────\n//\n// We accept a structural subset of RhiDevice so unit tests can pass a\n// mocked device without standing up the full RHI surface. The createRenderer\n// production path passes a real RhiDevice; both satisfy the interface.\n\n/**\n * Minimal RhiDevice subset used by the skylight fallback helper.\n * Mirrors RhiDevice for the methods touched by this module (charter P4\n * narrowest surface -- avoids dragging the full RhiDevice in for tests).\n */\nexport interface SkylightDevice {\n createSampler(desc: SamplerDescriptor): Result<Sampler, RhiError>;\n createTexture(desc: TextureDescriptor): Result<Texture, RhiError>;\n createTextureView(tex: Texture, desc: TextureViewDescriptor): Result<TextureView, RhiError>;\n createBuffer(desc: {\n label?: string | undefined;\n size: number;\n usage: number;\n mappedAtCreation?: boolean | undefined;\n }): Result<Buffer, RhiError>;\n}\n\n/**\n * Minimal queue subset used for fallback resource upload (zero-pixel\n * texture seed + intensity=0 uniform seed).\n */\nexport interface SkylightQueue {\n writeTexture(\n destination: {\n texture: Texture;\n mipLevel?: number;\n origin?: { x: number; y: number; z: number };\n },\n data: ArrayBufferView,\n dataLayout: { offset: number; bytesPerRow: number; rowsPerImage: number },\n size: { width: number; height: number; depthOrArrayLayers: number },\n ): Result<void, RhiError> | unknown;\n writeBuffer(\n buffer: Buffer,\n bufferOffset: number,\n data: ArrayBufferView,\n ): Result<void, RhiError> | unknown;\n}\n\n// ─── Public types ───────────────────────────────────────────────────────────\n\n/**\n * Skylight bind group resources (cube + cube + 2D LUT + intensity uniform).\n * The active set comes from the IblPipelineCache precompute path; the\n * fallback set is the 1x1 zero identity bundle below.\n */\nexport interface SkylightBindGroupResources {\n readonly irradianceView: TextureView;\n readonly irradianceSampler: Sampler;\n readonly prefilterView: TextureView;\n /** Present only when the per-draw prefilter slot was replaced by a local probe. */\n readonly skylightPrefilterView?: TextureView;\n readonly prefilterSampler: Sampler;\n readonly brdfLutView: TextureView;\n readonly brdfLutSampler: Sampler;\n readonly intensityBuffer: Buffer;\n}\n\n/**\n * Fallback resource bundle attached to `PipelineState.skylightFallback`.\n * The M4 round-4 recordFrame branch reads this bundle when\n * `skylightCount === 0` and feeds it through\n * `assembleMaterialWithSkylightEntries` so the PBR material BindGroup\n * binds the same 14-entry layout shape with zero data + intensity=0.\n *\n * No stand-alone `bindGroup` field: the round-2 stand-alone Skylight BG\n * is gone (D-5 round-4); the fallback resources flow into the PBR\n * material BG at binding 7..13.\n */\nexport interface SkylightFallback {\n readonly irradianceTexture: Texture;\n readonly irradianceView: TextureView;\n readonly prefilterTexture: Texture;\n readonly prefilterView: TextureView;\n readonly brdfLutTexture: Texture;\n readonly brdfLutView: TextureView;\n readonly sampler: Sampler;\n readonly intensityBuffer: Buffer;\n}\n\n// ─── Pure merger: BindGroupLayout entries (D-5 round-4) ─────────────────────\n\n/**\n * Append the 7 Skylight BindGroupLayout entries after the existing PBR\n * user-region entries. Pure function -- the\n * caller passes the result to `device.createBindGroupLayout`. Charter P4\n * consistent abstraction: one BGL holds material + Skylight together,\n * no second `@group(4)` allocated.\n *\n * Throws if the input is too short to contain the material UBO plus one\n * sampler/texture pair (defensive guard; mirrors charter P3 explicit failure).\n */\nexport function mergeSkylightIntoMaterialBgl(\n materialBglEntries: readonly GPUBindGroupLayoutEntry[],\n): GPUBindGroupLayoutEntry[] {\n if (materialBglEntries.length < 7) {\n throw new Error(\n `mergeSkylightIntoMaterialBgl: expected at least 7 material BGL entries (PBR layout), got ${materialBglEntries.length}`,\n );\n }\n const merged: GPUBindGroupLayoutEntry[] = [...materialBglEntries];\n const skylightBindingStart = materialBglEntries.length;\n // binding 7: irradianceMap (texture_cube)\n merged.push({\n binding: skylightBindingStart,\n visibility: GPU_SHADER_STAGE_FRAGMENT,\n texture: { sampleType: 'float', viewDimension: 'cube' },\n } as BglEntry);\n // binding 8: irradianceSampler\n merged.push({\n binding: skylightBindingStart + 1,\n visibility: GPU_SHADER_STAGE_FRAGMENT,\n sampler: { type: 'filtering' },\n } as BglEntry);\n // binding 9: prefilterMap (texture_cube)\n merged.push({\n binding: skylightBindingStart + 2,\n visibility: GPU_SHADER_STAGE_FRAGMENT,\n texture: { sampleType: 'float', viewDimension: 'cube' },\n } as BglEntry);\n // binding 10: prefilterSampler\n merged.push({\n binding: skylightBindingStart + 3,\n visibility: GPU_SHADER_STAGE_FRAGMENT,\n sampler: { type: 'filtering' },\n } as BglEntry);\n // binding 11: brdfLut (texture_2d)\n merged.push({\n binding: skylightBindingStart + 4,\n visibility: GPU_SHADER_STAGE_FRAGMENT,\n texture: { sampleType: 'float', viewDimension: '2d' },\n } as BglEntry);\n // binding 12: brdfLutSampler\n merged.push({\n binding: skylightBindingStart + 5,\n visibility: GPU_SHADER_STAGE_FRAGMENT,\n sampler: { type: 'filtering' },\n } as BglEntry);\n // binding 13: uniform { intensity: f32 }\n merged.push({\n binding: skylightBindingStart + 6,\n visibility: GPU_SHADER_STAGE_FRAGMENT,\n buffer: { type: 'uniform' },\n } as BglEntry);\n return merged;\n}\n\n// ─── Pure merger: BindGroupEntry values (assembly site) ─────────────────────\n\n/**\n * Append the 7 Skylight BindGroupEntry resources (binding 7..13) onto the\n * existing PBR material BindGroupEntry values (binding 0..6). The caller\n * passes the result to `device.createBindGroup` as part of the merged\n * material BG.\n *\n * The skylight argument may be the fallback identity bundle (rendered\n * with ambient=0) or the active IblPipelineCache output bundle. Same\n * call site, same layout shape -- charter P4 + F1 (AI users do not need\n * a `if (hasSkylight)` branch when writing demos).\n */\n/** Engine-owned material transmission injection resources. */\nexport interface TransmissionBindGroupResources {\n readonly sampler: Sampler;\n readonly backdropView?: TextureView | null;\n}\n\n/** Engine-owned texture injection resources derived from material parameters. */\nexport interface TextureInjectionResource {\n readonly slot: number;\n readonly sampler: Sampler;\n readonly view: TextureView;\n}\n\n// Lightmap (emissive + occlusion sampler/texture pair x 2) and transmission\n// injection starts are computed from the assembled list length on each push —\n// no hardcoded binding literals.\n\nexport function assembleMaterialWithSkylightEntries(\n materialEntries: readonly BindGroupEntry[],\n skylight: SkylightBindGroupResources,\n transmission?: TransmissionBindGroupResources | null | undefined,\n textureInjections: readonly TextureInjectionResource[] = [],\n): BindGroupEntry[] {\n // IBL injection start = end of the user-region. The user-region IS\n // `materialEntries` (UBO binding 0 + N sampler/texture pairs), so its length\n // is the injection start — was a hardcoded 7, now per-shader (a 4-texture\n // parallax material's user-region is 9 entries, so IBL lands at 9). This\n // mirrors the BGL-side `appendInjection(userRegion, 'ibl')` (D-1 / D-8),\n // which likewise reads `bgl.length`.\n const iblStart = materialEntries.length;\n const result: BindGroupEntry[] = [\n ...materialEntries,\n {\n binding: iblStart,\n resource: { kind: 'textureView', value: skylight.irradianceView },\n },\n {\n binding: iblStart + 1,\n resource: { kind: 'sampler', value: skylight.irradianceSampler },\n },\n {\n binding: iblStart + 2,\n resource: { kind: 'textureView', value: skylight.prefilterView },\n },\n {\n binding: iblStart + 3,\n resource: { kind: 'sampler', value: skylight.prefilterSampler },\n },\n {\n binding: iblStart + 4,\n resource: { kind: 'textureView', value: skylight.brdfLutView },\n },\n {\n binding: iblStart + 5,\n resource: { kind: 'sampler', value: skylight.brdfLutSampler },\n },\n {\n binding: iblStart + 6,\n resource: { kind: 'buffer', value: { buffer: skylight.intensityBuffer } },\n },\n ];\n // A null transmission omits the unavailable backdrop slots. Otherwise the\n // existing Skylight resources fill unused slots without changing their ABI.\n // Physical injections below keep their fixed binding numbers in either case.\n const transmissionSampler = transmission?.sampler ?? skylight.irradianceSampler;\n const transmissionView = transmission?.backdropView ?? skylight.brdfLutView;\n const transmissionStart = result.length;\n if (transmission !== null)\n result.push(\n {\n binding: transmissionStart,\n resource: { kind: 'sampler', value: transmissionSampler },\n },\n {\n binding: transmissionStart + 1,\n resource: { kind: 'textureView', value: transmissionView },\n },\n );\n // Standard physical maps occupy fixed bindings 26..45. The `slot` value\n // is the canonical index from STANDARD_PHYSICAL_TEXTURE_FIELDS; preserve\n // gaps for omitted authored maps instead of compacting this tail.\n const physicalStart = 26;\n for (let index = 0; index < textureInjections.length; index += 1) {\n const resource = textureInjections[index];\n if (resource === undefined) continue;\n const binding = physicalStart + resource.slot * 2;\n result.push(\n {\n binding,\n resource: { kind: 'sampler', value: resource.sampler },\n },\n {\n binding: binding + 1,\n resource: { kind: 'textureView', value: resource.view },\n },\n );\n }\n result.push({\n binding: 47,\n resource: {\n kind: 'textureView',\n value: skylight.skylightPrefilterView ?? skylight.prefilterView,\n },\n });\n return result;\n}\n\n// ─── Fallback constructor (createRenderer wires this into pipelineState) ────\n\n/**\n * Allocate the fallback Skylight resource bundle: 1x1 WHITE rgba16float\n * irradiance/prefilter texture_cube pair + 1x1 rg16float BRDF approximation\n * `[1, 0]` + a 16-byte uniform buffer + a single\n * linear / clamp-to-edge sampler reused across all three texture slots.\n *\n * Two regimes share this bundle (the per-frame Skylight uniform selects):\n * - No Skylight entity: render-system-record writes intensity=0, so\n * ambient = whiteIrradiance * kD * albedo * color * 0 == 0\n * -- physically black, no `if (hasSkylight)` shader branch (D-5 round-4).\n * - Skylight with NO cubemap (downstream integration #4): record writes the\n * user's intensity + color, so the WHITE irradiance gives an instant\n * solid-color ambient and a neutral white specular reflection with no\n * async precompute. The 1x1 BRDF approximation is intentionally roughness\n * independent; a real cubemap swaps in the prefiltered IBL views and LUT.\n *\n * No stand-alone BindGroupLayout / BindGroup is created here -- those\n * roles moved into the PBR material BGL factory (D-5 round-4). The\n * caller (createRenderer) feeds the resource handles below through\n * `assembleMaterialWithSkylightEntries` when composing the per-frame\n * material BindGroup.\n */\nexport function createSkylightFallback(\n device: SkylightDevice,\n queue: SkylightQueue,\n): SkylightFallback {\n // One sampler shared across the three texture slots. The PBR material\n // BindGroup still declares 3 separate sampler bindings (D-5 round-4\n // ordering at binding 8/10/12), so we pass the same handle three times\n // in assembleMaterialWithSkylightEntries; WebGPU spec permits sampler\n // reuse across BindGroupEntry slots.\n const samplerResult = device.createSampler({\n label: 'skylight-fallback-sampler',\n magFilter: 'linear',\n minFilter: 'linear',\n mipmapFilter: 'linear',\n addressModeU: 'clamp-to-edge',\n addressModeV: 'clamp-to-edge',\n addressModeW: 'clamp-to-edge',\n });\n if (!samplerResult.ok) throw samplerResult.error;\n const sampler = samplerResult.value;\n\n // 1x1 all-zero rgba16float cube (irradiance fallback). depthOrArrayLayers=6\n // gives the texture cube semantics (D-5 fallback shape; testable via\n // createTexture descriptor capture in unit tests).\n const irradianceTexResult = device.createTexture({\n label: 'skylight-fallback-irradiance-cube',\n size: { width: 1, height: 1, depthOrArrayLayers: 6 },\n mipLevelCount: 1,\n sampleCount: 1,\n dimension: '2d',\n format: 'rgba16float',\n usage: GPU_TEXTURE_USAGE_TEXTURE_BINDING | GPU_TEXTURE_USAGE_COPY_DST,\n viewFormats: [],\n textureBindingViewDimension: 'cube',\n });\n if (!irradianceTexResult.ok) throw irradianceTexResult.error;\n const irradianceTexture = irradianceTexResult.value;\n\n // 1x1 white rgba16float cube (prefilter fallback). A Skylight without an\n // equirect is still a white environment, so its specular input must not be\n // black just because the full prefilter bake is unavailable.\n const prefilterTexResult = device.createTexture({\n label: 'skylight-fallback-prefilter-cube',\n size: { width: 1, height: 1, depthOrArrayLayers: 6 },\n mipLevelCount: 1,\n sampleCount: 1,\n dimension: '2d',\n format: 'rgba16float',\n usage: GPU_TEXTURE_USAGE_TEXTURE_BINDING | GPU_TEXTURE_USAGE_COPY_DST,\n viewFormats: [],\n textureBindingViewDimension: 'cube',\n });\n if (!prefilterTexResult.ok) throw prefilterTexResult.error;\n const prefilterTexture = prefilterTexResult.value;\n\n // 1x1 rg16float BRDF approximation (A=1, B=0). This keeps the split-sum\n // specular response non-zero for the white-environment fallback; a real IBL\n // bake replaces it with the roughness/NdotV-dependent LUT.\n const brdfLutTexResult = device.createTexture({\n label: 'skylight-fallback-brdf-lut',\n size: { width: 1, height: 1, depthOrArrayLayers: 1 },\n mipLevelCount: 1,\n sampleCount: 1,\n dimension: '2d',\n format: 'rg16float',\n usage: GPU_TEXTURE_USAGE_TEXTURE_BINDING | GPU_TEXTURE_USAGE_COPY_DST,\n viewFormats: [],\n textureBindingViewDimension: undefined,\n });\n if (!brdfLutTexResult.ok) throw brdfLutTexResult.error;\n const brdfLutTexture = brdfLutTexResult.value;\n\n // 1x1 rgba16float = 8 bytes per pixel; 1x1 rg16float = 4 bytes per pixel.\n // The shim requires bytesPerRow % 256 === 0, so we pad each row to 256 bytes\n // (matches the fallback-white pattern in createRenderer.ts). Destination\n // stays 1x1; only the row stride is padded.\n //\n // A Skylight with no cubemap represents a flat white environment. Both\n // irradiance and prefilter are therefore white (half-float 1.0 = 0x3c00),\n // while the BRDF fallback approximates `A=1, B=0`. Crucially this does NOT\n // light scenes that lack a Skylight: the per-frame Skylight uniform writes\n // intensity 0 when no Skylight entity exists (render-system-record).\n const whitePixel = new Uint8Array(FALLBACK_BYTES_PER_ROW);\n {\n const dv = new DataView(whitePixel.buffer);\n // RGBA half-float 1.0 = 0x3c00 (little-endian) at byte offsets 0,2,4,6.\n dv.setUint16(0, 0x3c00, true);\n dv.setUint16(2, 0x3c00, true);\n dv.setUint16(4, 0x3c00, true);\n dv.setUint16(6, 0x3c00, true);\n }\n const brdfApproxPixel = new Uint8Array(FALLBACK_BYTES_PER_ROW);\n new DataView(brdfApproxPixel.buffer).setUint16(0, 0x3c00, true);\n for (const face of [0, 1, 2, 3, 4, 5]) {\n queue.writeTexture(\n {\n texture: irradianceTexture,\n mipLevel: 0,\n origin: { x: 0, y: 0, z: face },\n },\n whitePixel,\n { offset: 0, bytesPerRow: FALLBACK_BYTES_PER_ROW, rowsPerImage: 1 },\n { width: 1, height: 1, depthOrArrayLayers: 1 },\n );\n queue.writeTexture(\n {\n texture: prefilterTexture,\n mipLevel: 0,\n origin: { x: 0, y: 0, z: face },\n },\n whitePixel,\n { offset: 0, bytesPerRow: FALLBACK_BYTES_PER_ROW, rowsPerImage: 1 },\n { width: 1, height: 1, depthOrArrayLayers: 1 },\n );\n }\n queue.writeTexture(\n {\n texture: brdfLutTexture,\n mipLevel: 0,\n origin: { x: 0, y: 0, z: 0 },\n },\n brdfApproxPixel,\n { offset: 0, bytesPerRow: FALLBACK_BYTES_PER_ROW, rowsPerImage: 1 },\n { width: 1, height: 1, depthOrArrayLayers: 1 },\n );\n\n // Cube views over the depthOrArrayLayers=6 textures so the @group(1)\n // @binding(7,9) texture_cube bindings can sample them.\n const irradianceViewResult = device.createTextureView(irradianceTexture, {\n label: 'skylight-fallback-irradiance-cube-view',\n dimension: 'cube',\n arrayLayerCount: 6,\n });\n if (!irradianceViewResult.ok) throw irradianceViewResult.error;\n const irradianceView = irradianceViewResult.value;\n\n const prefilterViewResult = device.createTextureView(prefilterTexture, {\n label: 'skylight-fallback-prefilter-cube-view',\n dimension: 'cube',\n arrayLayerCount: 6,\n });\n if (!prefilterViewResult.ok) throw prefilterViewResult.error;\n const prefilterView = prefilterViewResult.value;\n\n const brdfLutViewResult = device.createTextureView(brdfLutTexture, {\n label: 'skylight-fallback-brdf-lut-view',\n dimension: '2d',\n });\n if (!brdfLutViewResult.ok) throw brdfLutViewResult.error;\n const brdfLutView = brdfLutViewResult.value;\n\n // The 64-byte Standard environment payload reserves two extra vec4 lanes\n // for probe-mode diffuse color and rotation. Ordinary Skylight leaves them zero.\n const intensityBufResult = device.createBuffer({\n label: 'skylight-fallback-intensity',\n size: 64,\n usage: GPU_BUFFER_USAGE_UNIFORM | GPU_BUFFER_USAGE_COPY_DST,\n });\n if (!intensityBufResult.ok) throw intensityBufResult.error;\n const intensityBuffer = intensityBufResult.value;\n queue.writeBuffer(intensityBuffer, 0, new Float32Array([0, 0, 0, 0, 0, 0, 0, 1]));\n\n return {\n irradianceTexture,\n irradianceView,\n prefilterTexture,\n prefilterView,\n brdfLutTexture,\n brdfLutView,\n sampler,\n intensityBuffer,\n };\n}\n","// @forgeax/engine-runtime - RenderData projection layer\n// (feat-20260601-device/gpu-residency-extraction M2 / w5).\n//\n// The middle of the three GPU-asset layers: AssetRegistry catalogues CPU asset\n// POD; `deriveRenderData*` PROJECTS a POD into the GPU descriptor a resource\n// build needs; GpuResidencyCache owns device-side resource life/death. These\n// projections are PURE -- they know the asset `kind` but never touch a device\n// (AC-07). The store consumes the descriptor and does the createTexture /\n// createBuffer / writeX work.\n//\n// Coverage is exactly the three GPU-resource kinds (mesh / texture / equirect,\n// the latter projected to a cubemap). Asset kinds with no GPU residency are\n// never projected -- the\n// `ensureResident` miss switch dispatches per-kind with no default, so a fourth\n// GPU-resource kind would surface as a `tsc -b` exhaustiveness error at the\n// switch rather than a silent fallthrough (AC-06).\n\nimport {\n bytesPerRow as blockBytesPerRow,\n blockParamsForFormat,\n isCompressedFormat,\n} from '@forgeax/engine-codec';\nimport {\n deriveVertexLayoutProjection,\n type VertexLayoutProjection,\n} from '@forgeax/engine-geometry';\nimport { err, ok, type Result } from '@forgeax/engine-rhi';\nimport {\n ASSET_ERROR_HINTS,\n type AssetError,\n deriveTextureLayout,\n type MeshAsset,\n type Submesh,\n type TextureAsset,\n type TextureShape,\n} from '@forgeax/engine-types';\nimport {\n GPU_TEXTURE_USAGE_COPY_DST,\n GPU_TEXTURE_USAGE_COPY_SRC,\n GPU_TEXTURE_USAGE_RENDER_ATTACHMENT_AND_TEXTURE_BINDING,\n GPU_TEXTURE_USAGE_TEXTURE_BINDING,\n} from './gpu-texture-usage';\nimport {\n GPU_BUFFER_USAGE_COPY_DST,\n GPU_BUFFER_USAGE_INDEX,\n GPU_BUFFER_USAGE_VERTEX,\n} from './gpu-usage';\n\n// AssetError without importing AssetRegistry: build the 4-field surface\n// (.code / .expected / .hint) directly against the @forgeax/engine-types SSOT\n// (charter P5 producer / consumer split; mirrors the store's RuntimeAssetError).\nclass ProjectionAssetError extends Error implements AssetError {\n readonly code: AssetError['code'];\n readonly expected: string;\n readonly hint: string;\n constructor(fields: { code: AssetError['code']; expected: string; hint: string }) {\n super(`[AssetError ${fields.code}] expected: ${fields.expected}; hint: ${fields.hint}`);\n this.name = 'AssetError';\n this.code = fields.code;\n this.expected = fields.expected;\n this.hint = fields.hint;\n }\n}\n\nfunction projectionError(fields: {\n code: AssetError['code'];\n expected: string;\n hint: string;\n}): AssetError {\n return new ProjectionAssetError(fields);\n}\n\n/** Descriptor for a mesh's GPU vertex + index buffers (projected from POD). */\nexport interface MeshRenderData {\n readonly vertexByteLength: number;\n /** Geometry-owned immutable layout facts used by all GPU consumers. */\n readonly layoutProjection: VertexLayoutProjection;\n /** Index byte length padded up to a 4-byte multiple (writeBuffer alignment). */\n readonly indexByteLength: number;\n readonly indexCount: number;\n readonly indexFormat: 'uint16' | 'uint32';\n readonly vertexUsage: number;\n readonly indexUsage: number;\n /**\n * Submeshes from the source MeshAsset, projected verbatim to the GPU store\n * so the record stage can iterate per-submesh draw calls (feat-20260608 M4 / w16).\n * Mirrors MeshAsset.submeshes (readonly Submesh[]) 1:1.\n */\n readonly submeshes: readonly Submesh[];\n}\n\n/** Descriptor for a sampled texture's GPU resource (projected from POD). */\nexport interface TextureRenderData {\n /** Logical width retained for existing projection consumers. */\n readonly width: number;\n /** Logical height retained for existing projection consumers. */\n readonly height: number;\n /** Authored shape; the residency layer must preserve this view dimension. */\n readonly shape: TextureShape;\n /** Array layers for `2d-array`, depth slices for `3d`, otherwise one. */\n readonly depthOrArrayLayers: number;\n /** Authored content extent; TextureAsset remains the logical asset SSOT. */\n readonly logicalExtent: TextureExtent;\n /** GPU allocation extent, derived from format + logicalExtent. */\n readonly physicalExtent: TextureExtent;\n /** Maps logical UVs away from block padding. */\n readonly uvScale: readonly [number, number];\n readonly format: GPUTextureFormat;\n readonly mipLevelCount: number;\n readonly usage: number;\n /**\n * Row pitch for the BASE mip (level 0) the store passes to `writeTexture`.\n * Derived from the canonical texture layout, so format-specific uncompressed\n * widths (for example R8 density) and block-compressed widths stay aligned\n * with the upload contract. The per-mip layout for a multi-level compressed\n * upload comes from {@link deriveMipUploadLayout}.\n */\n readonly bytesPerRow: number;\n /** True iff `format` is a block-compressed format (drives the store's upload arm). */\n readonly compressed: boolean;\n}\n\nexport interface TextureExtent {\n readonly width: number;\n readonly height: number;\n}\n\n/**\n * The sole logical-content to physical-storage projection for a texture.\n * Block sizes come from codec's format table; no physical dimensions are\n * authored or serialized with TextureAsset.\n */\nexport function deriveTextureExtent(\n format: GPUTextureFormat,\n width: number,\n height: number,\n): {\n readonly logicalExtent: TextureExtent;\n readonly physicalExtent: TextureExtent;\n readonly uvScale: readonly [number, number];\n} {\n const params = blockParamsForFormat(format);\n const physicalWidth = params === null ? width : Math.ceil(width / params.blockW) * params.blockW;\n const physicalHeight =\n params === null ? height : Math.ceil(height / params.blockH) * params.blockH;\n return {\n logicalExtent: { width, height },\n physicalExtent: { width: physicalWidth, height: physicalHeight },\n uvScale: [width / physicalWidth, height / physicalHeight],\n };\n}\n\n/** One mip level's GPU-upload layout (feat-20260707 M5 / w35, AC-08). */\nexport interface MipUploadLevel {\n /** Mip level index (0 = base / largest). */\n readonly level: number;\n /** Logical pixel width of this level (`baseWidth >> level`, min 1). */\n readonly width: number;\n /** Logical pixel height of this level (`baseHeight >> level`, min 1). */\n readonly height: number;\n /** Block-aligned storage dimensions for this logical mip. */\n readonly physicalWidth: number;\n readonly physicalHeight: number;\n /** Logical `writeTexture` copy width; full-subresource copies may end mid-block. */\n readonly copyWidth: number;\n /** Logical `writeTexture` copy height; full-subresource copies may end mid-block. */\n readonly copyHeight: number;\n /** Bytes per compressed row: `ceil(width / blockW) * bytesPerBlock`. */\n readonly bytesPerRow: number;\n /** Block rows: `ceil(height / blockH)` (the writeTexture `rowsPerImage`). */\n readonly rowsPerImage: number;\n /** Byte offset of this level in the mip-major payload (sum of prior levels). */\n readonly byteOffset: number;\n /** Byte length of this level (`bytesPerRow * rowsPerImage`). */\n readonly byteLength: number;\n}\n\n/**\n * Derive the per-mip GPU-upload layout for a block-compressed texture\n * (feat-20260707 M5 / w35, AC-08). Each level pads the pixel width up to a full\n * block (`ceil(width / blockW) * bytesPerBlock`) and counts block rows\n * (`ceil(height / blockH)`); `byteOffset` accumulates the prior levels' byte\n * lengths (mip-major layout). The GPU samples only the valid texel region, so a\n * non-4-multiple size or a 1x1 / 2x2 mip tail pads up to a block without image\n * corruption (t5). Block math is sourced from the codec block table (SSOT --\n * Derive, Don't Duplicate); TextureAsset carries no block fields (F-6).\n *\n * `format` must be a block-compressed format; callers branch on the projection's\n * `compressed` flag first (the uncompressed path uses the linear `width * 4`\n * pitch). Level dimensions floor-halve per mip, clamped to a 1-pixel minimum.\n */\nexport function deriveMipUploadLayout(\n format: GPUTextureFormat,\n baseWidth: number,\n baseHeight: number,\n mipLevelCount: number,\n): readonly MipUploadLevel[] {\n const params = blockParamsForFormat(format);\n if (params === null) return [];\n const levels: MipUploadLevel[] = [];\n let byteOffset = 0;\n for (let level = 0; level < mipLevelCount; level++) {\n const width = Math.max(1, baseWidth >> level);\n const height = Math.max(1, baseHeight >> level);\n const blockCols = Math.ceil(width / params.blockW);\n const blockRows = Math.ceil(height / params.blockH);\n const rowBytes = blockCols * params.bytesPerBlock;\n const byteLength = rowBytes * blockRows;\n levels.push({\n level,\n width,\n height,\n physicalWidth: blockCols * params.blockW,\n physicalHeight: blockRows * params.blockH,\n copyWidth: blockCols * params.blockW,\n copyHeight: blockRows * params.blockH,\n bytesPerRow: rowBytes,\n rowsPerImage: blockRows,\n byteOffset,\n byteLength,\n });\n byteOffset += byteLength;\n }\n return levels;\n}\n\n/** Descriptor for a cubemap built from an equirect source (projected from POD). */\nexport interface CubeRenderData {\n /** Square cube face edge length (== source equirect height). */\n readonly cubeFaceSize: number;\n /** Filterable output format the IBL pipeline BGL expects. */\n readonly outputFormat: 'rgba16float';\n /** True when the source is rgba32float and the store must pack to rgba16float. */\n readonly needsHalfConversion: boolean;\n readonly cubeUsage: number;\n}\n\n/**\n * Project a `MeshAsset` POD into its GPU vertex / index buffer descriptor.\n * Pure: computes byte lengths, the 4-byte-aligned index size, index format,\n * and the buffer usage flags the store's `createBuffer` calls need.\n */\nexport function deriveRenderDataMesh(mesh: MeshAsset): Result<MeshRenderData, AssetError> {\n // Vertex-only meshes (no `indices`) take the non-indexed draw path. Their\n // index-side fields are zeroed; `indexFormat` keeps a `'uint16'` placeholder\n // (never consumed when no index buffer is built).\n const indices = mesh.indices;\n const indexBytesUnpadded = indices === undefined ? 0 : indices.byteLength;\n const indexByteLength = ((indexBytesUnpadded + 3) >> 2) << 2;\n const layoutProjection = deriveVertexLayoutProjection(mesh.attributes);\n return ok({\n vertexByteLength: mesh.vertices.byteLength,\n layoutProjection,\n indexByteLength,\n indexCount: indices === undefined ? 0 : indices.length,\n indexFormat: indices instanceof Uint32Array ? 'uint32' : 'uint16',\n vertexUsage: GPU_BUFFER_USAGE_VERTEX | GPU_BUFFER_USAGE_COPY_DST,\n indexUsage: GPU_BUFFER_USAGE_INDEX | GPU_BUFFER_USAGE_COPY_DST,\n submeshes: mesh.submeshes,\n });\n}\n\n/**\n * Project a `TextureAsset` POD into its GPU texture descriptor. Pure: derives\n * the mip-level count (when `mipmap`), the row pitch, and the usage flags, and\n * fails fast if the POD's `format` and `colorSpace` are internally\n * inconsistent (a `-srgb` format requires an `srgb` colorSpace and vice versa).\n */\nexport function deriveRenderDataTexture(tex: TextureAsset): Result<TextureRenderData, AssetError> {\n const width = tex.shape.extent.width;\n const height = tex.shape.extent.height;\n const isSrgbFormat = tex.format.endsWith('-srgb');\n const expectedColorSpace: 'srgb' | 'linear' = isSrgbFormat ? 'srgb' : 'linear';\n if (tex.colorSpace !== expectedColorSpace) {\n return err(\n projectionError({\n code: 'invalid-source-format',\n expected: \"format ends in '-srgb' iff colorSpace is 'srgb' (linear otherwise)\",\n hint: ASSET_ERROR_HINTS['invalid-source-format'],\n }),\n );\n }\n\n const compressed = isCompressedFormat(tex.format);\n const layout = deriveTextureLayout({ shape: tex.shape, format: tex.format, mips: tex.mips });\n if (!layout.ok) {\n return err(\n projectionError({\n code: 'invalid-source-format',\n expected: layout.error.expected,\n hint: layout.error.hint,\n }),\n );\n }\n // feat-20260707 M5 / w35 (AC-09, D-9): a block-compressed texture cannot have\n // its mips GPU-generated (F-7). An OFFLINE chain baked into `data`\n // (mipLevelCount > 1, e.g. a KTX2 level chain) is the normal compressed path\n // and passes; requesting RUNTIME mip generation (`mipmap:true` with no offline\n // chain) fails fast with a self-recovery hint (fail-fast at the projection\n // layer -- producer self-validate).\n if (compressed && tex.mips.kind === 'generate') {\n return err(\n projectionError({\n code: 'mipgen-unsupported-compressed-format',\n expected:\n 'a compressed texture requesting mipmap:true must carry an offline mip chain (mipLevelCount > 1)',\n hint: ASSET_ERROR_HINTS['mipgen-unsupported-compressed-format'],\n }),\n );\n }\n\n // Uncompressed: runtime mip-gen count from the pixel size. Compressed: the\n // level count is authored (offline chain) -- honour the POD's mipLevelCount,\n // never re-derive it from the size (a compressed chain may stop early).\n const mipLevelCount = layout.value.levels.length;\n\n const baseLevel = layout.value.levels[0];\n if (baseLevel === undefined) {\n return err(\n projectionError({\n code: 'invalid-source-format',\n expected: 'texture layout contains a base mip level',\n hint: ASSET_ERROR_HINTS['invalid-source-format'],\n }),\n );\n }\n if (!compressed && tex.data.byteLength < baseLevel.byteLength) {\n return err(\n projectionError({\n code: 'invalid-source-format',\n expected: 'uncompressed texture data contains at least one complete base mip',\n hint: ASSET_ERROR_HINTS['invalid-source-format'],\n }),\n );\n }\n\n // Compressed rows derive from block format. Uncompressed row pitch derives\n // from the format, not aggregate payload length: imported images may retain\n // trailing decoder bytes and offline mip chains contain more than the base mip.\n const bytesPerRow = compressed\n ? (blockBytesPerRow(tex.format, width) ?? baseLevel.bytesPerRow)\n : baseLevel.bytesPerRow;\n\n // Compressed formats are not renderable -- RENDER_ATTACHMENT would fail\n // createTexture validation, and the runtime mipmap blit (which needs it) never\n // runs on a compressed texture anyway (the mip gate above rules out runtime\n // mip-gen). Both paths keep COPY_SRC so a real consumer can validate the\n // uploaded texture through the standard GPU readback contract.\n const usage = compressed\n ? GPU_TEXTURE_USAGE_TEXTURE_BINDING | GPU_TEXTURE_USAGE_COPY_DST | GPU_TEXTURE_USAGE_COPY_SRC\n : GPU_TEXTURE_USAGE_RENDER_ATTACHMENT_AND_TEXTURE_BINDING |\n GPU_TEXTURE_USAGE_COPY_DST |\n GPU_TEXTURE_USAGE_COPY_SRC;\n\n return ok({\n width,\n height,\n shape: tex.shape,\n depthOrArrayLayers:\n tex.shape.viewDimension === '2d'\n ? 1\n : tex.shape.viewDimension === '2d-array'\n ? tex.shape.extent.layers\n : tex.shape.extent.depth,\n ...deriveTextureExtent(tex.format, width, height),\n format: tex.format,\n mipLevelCount,\n usage,\n bytesPerRow,\n compressed,\n });\n}\n\n/**\n * Project an equirectangular HDR `TextureAsset` source into its cubemap\n * descriptor. Pure: validates the source is a linear HDR format, computes the\n * square cube face size (== source height), narrows the output to the filterable\n * `rgba16float` the IBL pipeline expects, and flags whether the store must pack\n * an rgba32float source down to rgba16float. The store keeps the resource build\n * (createTexture / cube + face views / IBL precompute) and the rgba32f->rgba16f\n * byte conversion.\n *\n * feat-20260707 M5 fix: the accepted-format whitelist is `rgba16float |\n * rgba32float` only -- a block-compressed HDR format (`bc6h-rgb-ufloat`) is NOT\n * accepted here. An equirect cube source drives equirect-to-cube / irradiance /\n * prefilter RENDER passes, and a BC6H texture is sample-only, never a color-\n * renderable render target (\"BC6HRGBUfloat is not color renderable\"). The\n * equirect is therefore always delivered uncompressed rgba16float; this\n * fail-fast whitelist is the projection-layer guard that rejects a non-\n * renderable cube source rather than letting it blow up at GPU createTexture.\n */\nexport function deriveRenderDataCubemap(source: TextureAsset): Result<CubeRenderData, AssetError> {\n const isAcceptedHdr = source.format === 'rgba16float' || source.format === 'rgba32float';\n if (!isAcceptedHdr || source.colorSpace !== 'linear') {\n return err(\n projectionError({\n code: 'invalid-source-format',\n expected: \"format 'rgba16float' or 'rgba32float' with colorSpace 'linear'\",\n hint: ASSET_ERROR_HINTS['invalid-source-format'],\n }),\n );\n }\n const sourceHeight = source.shape.viewDimension === '2d' ? source.shape.extent.height : 0;\n return ok({\n cubeFaceSize: sourceHeight,\n outputFormat: 'rgba16float',\n needsHalfConversion: source.format === 'rgba32float',\n cubeUsage:\n GPU_TEXTURE_USAGE_RENDER_ATTACHMENT_AND_TEXTURE_BINDING |\n GPU_TEXTURE_USAGE_COPY_DST |\n GPU_TEXTURE_USAGE_COPY_SRC,\n });\n}\n","import type { AssetRegistry, DynamicTextureStore } from '@forgeax/engine-assets-runtime';\nimport type { World } from '@forgeax/engine-ecs';\nimport type { VertexLayoutProjection } from '@forgeax/engine-geometry';\nimport type { Profiler } from '@forgeax/engine-profiler';\nimport type { CompiledRenderGraphInfo } from '@forgeax/engine-render-graph';\nimport type {\n BindGroup,\n BindGroupLayout,\n Buffer,\n ComputePipeline,\n PipelineLayout,\n Result,\n RhiCanvasContext,\n RhiCommandEncoder,\n RhiDevice,\n RenderPipeline as RhiRenderPipeline,\n Sampler,\n ShaderModule,\n Texture,\n TextureFormat,\n TextureView,\n} from '@forgeax/engine-rhi';\nimport { err, ok, RhiError } from '@forgeax/engine-rhi';\nimport {\n DEFAULT_STANDARD_PBR_PARAM_SCHEMA,\n type MaterialRuntimeArtifact,\n type MaterialShaderArtifact,\n} from '@forgeax/engine-shader';\nimport type {\n MaterialAsset,\n MaterialRenderState,\n ParamSchemaEntry,\n PassKind,\n PrimitiveTopology,\n VertexAttributeMap,\n} from '@forgeax/engine-types';\nimport { derive } from '@forgeax/engine-types';\nimport type { MaterialRenderProjection } from '../assembly/material/assembly';\nimport type { DeviceScope } from '../device/device-scope';\nimport type { MeshGpuHandles } from '../device/gpu-residency';\nimport type { EngineMetrics } from '../engine-metrics';\nimport type { RenderFeatureHost } from '../features/host';\nimport type { RenderFeatureShaderModuleMode } from '../features/types';\nimport type { GpuDrivenPbrProgram } from '../gpu-driven/pbr-program';\nimport type { GpuDrivenShadowBatchProjection } from '../gpu-driven/production-raster';\nimport type { ShadowViewStatePool } from '../gpu-driven/shadow-views';\nimport {\n GPU_TEXTURE_USAGE_COPY_SRC,\n GPU_TEXTURE_USAGE_RENDER_ATTACHMENT,\n GPU_TEXTURE_USAGE_TEXTURE_BINDING,\n} from '../gpu-texture-usage';\nimport type { SkylightFallback } from '../ibl/skylight-bind-group';\nimport type { BloomInspection } from '../inspection-types';\nimport type { HealthListenerRegistry, RhiErrorListenerRegistry } from '../lifecycle';\nimport type { PipelineGroup2Contract } from '../pbr-pipeline';\nimport type { StandardTopologyInputValue } from '../pipeline/standard-lighting/topology';\nimport type { StandardProfile } from '../pipeline/standard-profile';\nimport type { PipelineBuilderShaderModuleFactory } from '../pipeline-builder';\nimport type { PointsLinesInspection } from '../points-lines/inspection';\nimport type { PointsLinesRecordPlan } from '../points-lines/record';\nimport type { ReflectionProbeTable } from '../reflection/gpu-table';\nimport type { ReflectionProbeSelectionResult } from '../reflection/projection';\nimport type { FrameObservationDomain } from '../render-contract';\nimport type { SsrAdmissionIdentity } from '../ssr/identity';\nimport type { TypedFrameObservationCapture } from '../typed-render-graph-primitives';\nimport type { GpuPassTimingReason } from './gpu-pass-timing/errors';\nimport type {\n GpuPassTimingCapture,\n GpuPassTimingFrameIdentity,\n GpuPassTimingSession,\n} from './gpu-pass-timing/session';\n\nexport interface PointsLinesRecordSubmission {\n readonly plan: PointsLinesRecordPlan;\n readonly vertexBuffer: Buffer;\n readonly indexBuffer: Buffer;\n readonly layoutProjection: VertexLayoutProjection;\n}\n\nexport interface ReflectionProbeRecordState {\n readonly table: ReflectionProbeTable;\n readonly selections: ReadonlyMap<string, ReflectionProbeSelectionResult>;\n readonly graph: import('./typed-frame-graph').ReflectionProbeGraphState;\n /** Detached committed fallback projections joined by main-pass renderable key. */\n readonly fallbackProjections?: ReadonlyMap<\n string,\n import('../inspection-types').ReflectionFallbackReceipt\n >;\n /** Demand is derived from this frame's renderable/source selection. */\n readonly fallbackDemand?: boolean;\n /** Non-neutral sources require a nonzero diagnostic sample when capture is enabled. */\n readonly fallbackHasNonNeutral?: boolean;\n readonly completeSubmission: (\n submitted: boolean,\n completed?: Promise<unknown>,\n fallbackOutput?: {\n readonly format: TextureFormat;\n readonly size: { readonly width: number; readonly height: number };\n readonly frameId: number;\n readonly graphGeneration: number;\n readonly textureIdentity: number;\n readonly readback?: Promise<{\n readonly linearHdr: readonly [number, number, number, number];\n readonly hash: string;\n readonly graphGeneration: number;\n readonly textureIdentity: number;\n }>;\n },\n fallbackRequested?: boolean,\n ) => Promise<void>;\n}\n\nexport interface MaterialShaderPipelineEntry {\n readonly pipeline: RhiRenderPipeline;\n readonly group2Contract: PipelineGroup2Contract;\n}\n\nimport type {\n AtmosphereShaderSources,\n RenderDebugOverlay,\n RenderPipelineContext,\n RenderRecordPhase,\n SsrShaderSources,\n VolumetricFogShaderSources,\n} from '../render-contract';\nimport type { GpuDrivenStandardPbrFrameResources } from '../render-pipeline';\nimport type {\n DispatchEntry,\n MaterialSnapshot,\n ShadowCasterMembership,\n SkyboxSnapshot,\n SkylightSnapshot,\n} from '../render-system-extract';\nimport type { SkinPaletteAllocator } from '../systems/skin-palette-allocator';\nimport type { RenderTarget } from '../targets/contracts';\nimport type { RenderTargetPhysical } from '../targets/physical';\nimport type {\n BindGroupCounts,\n BloomFrameReceipts,\n DispatchCounts,\n MaterialBgAssemblyCacheEntry,\n RenderFrameState,\n ValidatedRenderable,\n} from './frame-snapshot';\nimport type { FoldDispatchPlan } from './mesh-ssbo';\n\n/**\n * Armed only for the first published recovery frame. Candidate preparation\n * must make every pipeline and static residency lookup a cache hit before this\n * guard is armed; a miss during draw is a hard failure before queue submission.\n * Explicit preparation between draws remains allowed, including new geometry\n * admitted on the first fixed step after device recovery.\n */\nexport interface RecoveryColdWorkGuard {\n arm(): void;\n beginFrame(): void;\n endFrame(): void;\n notePipelineColdWork(): void;\n noteUploadColdWork(): void;\n finish(): void;\n}\n\nexport interface RenderSystemRuntime {\n readonly device: RhiDevice;\n /** Current renderer device generation used to fence receipt-bound captures. */\n readonly deviceGeneration?: number;\n /** Public receipt identity reserved before graph encoding. */\n readonly observationFrameId?: number | undefined;\n /** Graph identity written by the typed graph for the current receipt. */\n observationGraphGeneration?: number | undefined;\n /** Renderer-owned capture bridge consumed after queue submission. */\n readonly observationCaptureOwner?:\n | {\n register(capture: TypedFrameObservationCapture): void;\n consume(frameNumber: number): readonly TypedFrameObservationCapture[];\n drain(): readonly TypedFrameObservationCapture[];\n }\n | undefined;\n /** Internal backend-fixture hook evaluated at the submit transaction edge. */\n readonly beforeSubmit?: ((device: RhiDevice) => RhiError | undefined) | undefined;\n readonly deviceScope: DeviceScope;\n /** Domains explicitly armed for the frame being encoded. */\n readonly observationCaptureDomains?: readonly FrameObservationDomain[] | undefined;\n /** Resolve a recorder/backend wrapper before configuring the native surface. */\n readonly resolveSurfaceDevice?: (device: RhiDevice) => Result<RhiDevice, RhiError>;\n readonly errorRegistry: RhiErrorListenerRegistry;\n readonly debugOverlay?: RenderDebugOverlay | undefined;\n readonly healthRegistry: HealthListenerRegistry;\n readonly getMaterialProjectionForPayload?: (\n material: MaterialAsset,\n ) => MaterialRenderProjection | undefined;\n readonly getMaterialProjection?: (materialGuid: string) => MaterialRenderProjection | undefined;\n readonly getMaterialArtifact?: (specializationKey: string) => MaterialRuntimeArtifact | undefined;\n /** Producer-owned cooked Standard PBR artifact used by GPU-driven projection. */\n readonly getMaterialShaderArtifact?: (\n materialShaderId: string,\n request?:\n | {\n readonly vertexColorAvailable?: boolean;\n readonly deformation?: 'rigid' | 'skin';\n readonly clustered?: boolean;\n readonly reflectionFallback?: boolean;\n readonly pass?: 'forward' | 'shadow' | 'depth';\n readonly address?: 'direct' | 'scene-index';\n }\n | boolean,\n ) => MaterialShaderArtifact | undefined;\n readonly getMaterialShaderPipeline?: (\n materialShaderId: string,\n isHdr: boolean,\n renderState?: MaterialRenderState,\n topology?: PrimitiveTopology,\n indexFormat?: 'uint16' | 'uint32',\n variantSet?: string,\n passKind?: PassKind,\n meshAttributes?: VertexAttributeMap,\n sampleCount?: number,\n colorFormatOverride?: GPUTextureFormat,\n shaderUvSetCount?: number,\n depthFormatOverride?: GPUTextureFormat | null,\n vertexLayout?: string,\n vertexLayoutProjection?: VertexLayoutProjection,\n shaderModuleMode?: RenderFeatureShaderModuleMode,\n layoutKindOverride?: 'pbr' | 'pbr-skin' | 'gpu-driven-pbr' | 'gpu-driven-skin',\n /** Optional vertex entry override for receipt-owned scene-index passes. */\n vertexEntryPoint?: string,\n additionalColorFormats?: readonly GPUTextureFormat[],\n vertexEntry?: string,\n fragmentEntry?: string,\n particleInputLanes?: number,\n fragmentConstants?: Readonly<Record<string, number>>,\n ) => RhiRenderPipeline | null;\n readonly getMaterialShaderPipelineEntry?: (\n materialShaderId: string,\n isHdr: boolean,\n renderState?: MaterialRenderState,\n topology?: PrimitiveTopology,\n indexFormat?: 'uint16' | 'uint32',\n variantSet?: string,\n passKind?: PassKind,\n meshAttributes?: VertexAttributeMap,\n sampleCount?: number,\n colorFormatOverride?: GPUTextureFormat,\n shaderUvSetCount?: number,\n depthFormatOverride?: GPUTextureFormat | null,\n vertexLayout?: string,\n vertexLayoutProjection?: VertexLayoutProjection,\n shaderModuleMode?: RenderFeatureShaderModuleMode,\n layoutKindOverride?: 'pbr' | 'pbr-skin' | 'gpu-driven-pbr' | 'gpu-driven-skin',\n /** Optional vertex entry override for receipt-owned scene-index passes. */\n vertexEntryPoint?: string,\n additionalColorFormats?: readonly GPUTextureFormat[],\n vertexEntry?: string,\n fragmentEntry?: string,\n particleInputLanes?: number,\n fragmentConstants?: Readonly<Record<string, number>>,\n ) => MaterialShaderPipelineEntry | null;\n /** Reflection-derived UV count included in the material PipelineSpec cache key. */\n readonly getMaterialShaderUvSetCount?: (materialShaderId: string) => number | undefined;\n readonly getMaterialShaderBindingContract?: (\n materialShaderId: string,\n ) =>\n | 'group-0'\n | 'group-0-resource'\n | 'view-only'\n | 'view-and-scene-depth'\n | 'render-material-with-scene-depth'\n | 'render-material-and-scene-depth'\n | 'render-material';\n readonly getParamSchema?: (materialShaderId: string) => readonly ParamSchemaEntry[] | undefined;\n readonly getMaterialBindGroupLayout?: (\n materialShaderId: string,\n materialParamSchema?: readonly ParamSchemaEntry[],\n ) => BindGroupLayout | undefined;\n /** Handle-first factory for built-in same-frame GPU producers. */\n readonly immediateShaderModuleFactory?: PipelineBuilderShaderModuleFactory;\n /** Optional guard for the first recovery frame's cold-work boundary. */\n readonly recoveryColdWorkGuard?: RecoveryColdWorkGuard | undefined;\n readonly metrics: EngineMetrics;\n readonly lookupPostProcess?: (\n id: string,\n ) => import('../fullscreen-post-process-pass').PostProcessShaderEntry | undefined;\n readonly getPostProcessParamsBuffer?: (id: string) => Buffer | undefined;\n readonly getPostProcessPipeline?: (\n id: string,\n bgl: BindGroupLayout,\n colorFormats: readonly GPUTextureFormat[],\n entry?: import('../fullscreen-post-process-pass').PostProcessShaderEntry,\n ) => RhiRenderPipeline | null;\n /** Candidate-owned post-process pipelines transferred at publication. */\n readonly getRecoveryPostProcessPipelines?: () => ReadonlyMap<string, RhiRenderPipeline>;\n readonly clearPostProcessPipelineCache?: (id: string) => void;\n readonly invalidateShaderModule?: (label: string) => void;\n readonly dynamicTextureStore?: DynamicTextureStore | undefined;\n /** Resolves a render-target source to the active generation-owned GPU view. */\n readonly resolveRenderTargetTextureSource?: (\n source: import('../targets/contracts').RenderTargetTextureSource,\n ) => import('../targets/material-source').RenderTargetMaterialSourceBinding | undefined;\n}\n\n/** Renderer-owned bridge from retained Points/Lines facts into main geometry. */\nexport interface PointsLinesRecordOwner {\n prepare(entry: ValidatedRenderable, clustered: boolean): PointsLinesRecordSubmission | undefined;\n beginFrame(): void;\n resetForDeviceLoss(): void;\n inspections(): readonly PointsLinesInspection[];\n}\n\nexport interface PerPassResources {\n depthTexture: Texture | null;\n depthTextureView: TextureView | null;\n depthTextureWidth: number;\n depthTextureHeight: number;\n configured: boolean;\n hdrColorTexture: Texture | null;\n hdrColorView: TextureView | null;\n hdrDepthTexture: Texture | null;\n hdrDepthView: TextureView | null;\n hdrTextureWidth: number;\n hdrTextureHeight: number;\n hdrDepthSampleCount: number;\n readonly fxaaPipeline: RhiRenderPipeline | null;\n readonly fxaaBindGroupLayout: BindGroupLayout | null;\n readonly fxaaSampler: Sampler | null;\n msaaColorTexture: Texture | null;\n msaaColorView: TextureView | null;\n msaaSpriteColorTexture: Texture | null;\n msaaSpriteColorView: TextureView | null;\n msaaDepthTexture: Texture | null;\n msaaDepthView: TextureView | null;\n msaaTextureWidth: number;\n msaaTextureHeight: number;\n hdrColorMsaaTexture: Texture | null;\n hdrColorMsaaView: TextureView | null;\n readonly skyboxPipeline: RhiRenderPipeline | null;\n readonly skyboxPipelineMsaa: RhiRenderPipeline | null;\n readonly skyboxBindGroupLayout: BindGroupLayout | null;\n readonly skyboxSampler: Sampler | null;\n readonly skyboxRotationBuffer: Buffer | null;\n bloomDownsamplePipeline: RhiRenderPipeline | null;\n bloomUpsamplePipeline: RhiRenderPipeline | null;\n bloomCompositePipeline: RhiRenderPipeline | null;\n bloomDownsampleBindGroupLayout: BindGroupLayout | null;\n bloomUpsampleBindGroupLayout: BindGroupLayout | null;\n bloomCompositeBindGroupLayout: BindGroupLayout | null;\n bloomSampler: Sampler | null;\n bloomDownsampleParamsBuffer: Buffer | null;\n bloomUpsampleParamsBuffer: Buffer | null;\n bloomCompositeParamsBuffer: Buffer | null;\n ensureBloomResources?: () => void;\n getBloomResources?: () => BloomPersistentBundle | null;\n commitBloomResources?: () => void;\n commitBloomFrameReceipts?: (receipts: BloomFrameReceipts) => void;\n discardBloomResources?: () => void;\n retireBloomResources?: (completion: Promise<unknown>) => void;\n /** Drain candidate, active, and fence-retiring Bloom generations. */\n drainBloomResources?: () => void;\n inspectBloomResources?: (graph?: CompiledRenderGraphInfo) => BloomInspection;\n ssaoCalcPipeline: RhiRenderPipeline | null;\n ssaoBlurPipeline: RhiRenderPipeline | null;\n ssaoBgl: BindGroupLayout | null;\n ssaoFilteringSampler: Sampler | null;\n ssaoDepthSampler: Sampler | null;\n ssaoFallbackRawView: TextureView | null;\n shadowTexture: Texture | null;\n shadowMapSize: number;\n shadowCascadeCount: number;\n shadowSampler: Sampler | null;\n shadowLightSpaceMatrix: Float32Array | null;\n shadowCsmLightViewProj: Float32Array | null;\n shadowCsmSelection: {\n readonly viewMatrix: Float32Array;\n readonly splitPlanes: Float32Array;\n } | null;\n}\n\n/** Renderer-private Bloom bundle selected for one record transaction. */\nexport interface BloomPersistentBundle {\n readonly scope: DeviceScope;\n readonly generation: number;\n readonly bloomDownsamplePipeline: RhiRenderPipeline | null;\n readonly bloomUpsamplePipeline: RhiRenderPipeline | null;\n readonly bloomCompositePipeline: RhiRenderPipeline | null;\n readonly bloomDownsampleBindGroupLayout: BindGroupLayout | null;\n readonly bloomUpsampleBindGroupLayout: BindGroupLayout | null;\n readonly bloomCompositeBindGroupLayout: BindGroupLayout | null;\n readonly bloomSampler: Sampler | null;\n readonly bloomDownsampleParamsBuffer: Buffer | null;\n readonly bloomUpsampleParamsBuffer: Buffer | null;\n readonly bloomCompositeParamsBuffer: Buffer | null;\n}\n\nexport interface PipelineState {\n /** Device that owns every opaque handle in this pipeline state. */\n readonly device: RhiDevice;\n readonly meshes: ReadonlyMap<number, MeshGpuHandles>;\n readonly format: TextureFormat;\n readonly colorAttachmentFormat: TextureFormat;\n /** Surface route committed by configureSurface for inspection provenance. */\n readonly surfaceProfile?: 'dual-view' | 'raw-only';\n readonly viewBindGroupLayout: BindGroupLayout;\n /** Device capability gate for the optional SpotLight projector binding. */\n readonly projectorAvailable?: boolean;\n readonly materialBindGroupLayout: BindGroupLayout;\n readonly meshBindGroupLayout: BindGroupLayout;\n readonly viewUniformBuffer: Buffer;\n readonly pointsLinesViewBuffer?: Buffer;\n readonly shadowCasterCascadeBuffer: Buffer;\n readonly materialUniformBuffer: { readonly buffer: Buffer; readonly sizeInBytes: number };\n readonly meshStorageBuffer: { readonly buffer: Buffer; readonly sizeInBytes: number };\n readonly instancesBindGroupLayout: BindGroupLayout;\n /** Probe-enabled slot-3 layout; omitted from no-probe bind groups. */\n readonly probeInstancesBindGroupLayout?: BindGroupLayout;\n readonly identityInstanceBuffer: Buffer;\n readonly defaultSampler: Sampler;\n readonly fallbackTextureView: TextureView;\n readonly unlitPipeline: RhiRenderPipeline | null;\n readonly standardPipeline: RhiRenderPipeline | null;\n /** Producer-owned Standard PBR module for this device generation. */\n readonly standardPbrShaderModule: ShaderModule | null;\n /** Producer-owned skinned Standard PBR module for this device generation. */\n readonly pbrSkinShaderModule: ShaderModule | null;\n /** Producer-resolved Standard PBR UV ABI count for geometry projection. */\n readonly standardPbrShaderUvSetCount: number;\n readonly unlitPipelineMsaa: RhiRenderPipeline | null;\n readonly unlitPipelineHdrMsaa: RhiRenderPipeline | null;\n readonly pbrPipelineLayout: PipelineLayout | null;\n /** Dedicated slot-3 layout for scene-index GPU-driven Standard PBR draws. */\n readonly gpuDrivenInstancesBindGroupLayout?: BindGroupLayout | null;\n readonly gpuDrivenPbrPipelineLayout?: PipelineLayout | null;\n /** Device-owned shader modules paired with their exact Standard PBR receipts. */\n readonly gpuDrivenPbrPrograms?: ReadonlyMap<string, GpuDrivenPbrProgram>;\n readonly gpuDrivenPbrSkinPipelineLayout?: PipelineLayout | null;\n readonly pbrProbePipelineLayout?: PipelineLayout | null;\n readonly hdrpPbrPipelineLayout: PipelineLayout | null;\n readonly hdrpMeshBindGroupLayout?: BindGroupLayout | null;\n readonly hdrpProbePbrPipelineLayout?: PipelineLayout | null;\n readonly hdrpClusterMembershipPipeline: ComputePipeline | null;\n readonly hdrpClusterMembershipBindGroupLayout: BindGroupLayout | null;\n readonly pbrSkinPipelineLayout: PipelineLayout | null;\n readonly pbrSkinProbePipelineLayout?: PipelineLayout | null;\n readonly pbrSkinMeshBindGroupLayout: BindGroupLayout | null;\n readonly hdrpSkinPipelineLayout: PipelineLayout | null;\n readonly hdrpSkinMeshBindGroupLayout: BindGroupLayout | null;\n readonly skinPaletteAllocator: SkinPaletteAllocator | null;\n readonly defaultWhiteTextureView: TextureView;\n readonly defaultNormalTextureView: TextureView;\n /** Missing anisotropy maps encode a neutral direction and unit strength. */\n readonly defaultAnisotropyTextureView?: TextureView;\n readonly unlitPipelineHdr: RhiRenderPipeline | null;\n readonly shadowFallbackTextureView: TextureView;\n readonly shadowAtlasFallbackTextureView: TextureView;\n readonly extendedLightingAvailable?: boolean;\n readonly iesProfileTexture?: Texture;\n readonly cookieTexture?: Texture;\n readonly cookieMatrixBuffer?: Buffer;\n spotModifierUploadState?: {\n readonly ies: Map<number, number>;\n readonly cookie: Map<number, number>;\n readonly cookieMatrix: Map<number, number>;\n };\n readonly iesProfileTextureView?: TextureView;\n readonly cookieTextureView?: TextureView;\n readonly ltcLambertTextureView?: TextureView;\n readonly ltcGgxTextureView?: TextureView;\n readonly shadowParamsBuffer: Buffer;\n readonly skylightFallback: SkylightFallback | null;\n readonly perPassResources: PerPassResources;\n}\n\nexport interface RenderSystemInternals extends RenderSystemRuntime {\n readonly canvas: HTMLCanvasElement | OffscreenCanvas;\n /** Build identity injected by the host's build-tool adapter. */\n readonly build?: string | undefined;\n /** Host identity binding for the renderer-owned SSR dependency seam. */\n readonly ssrIdentity?: SsrAdmissionIdentity | undefined;\n readonly captureReflectionFallbackReadback?: boolean | undefined;\n readonly standardProfile?: StandardProfile | undefined;\n readonly standardPipeline: RenderFrameState['activePipeline'];\n readonly featureHost?: RenderFeatureHost | undefined;\n /** Install a detached feature host only at the recovery publication boundary. */\n readonly setFeatureHost?: ((host: RenderFeatureHost) => void) | undefined;\n readonly shaderModuleFactory?: PipelineBuilderShaderModuleFactory;\n readonly createShaderModule?: (\n device: import('@forgeax/engine-rhi').RhiDevice,\n descriptor: { readonly code: string; readonly label?: string },\n ) => Promise<\n Result<import('@forgeax/engine-rhi').ShaderModule, import('@forgeax/engine-rhi').RhiError>\n >;\n /** Optional handle-first factory for feature-owned generated shader programs. */\n readonly immediateShaderModuleFactory?: PipelineBuilderShaderModuleFactory;\n readonly profiler?: Profiler | undefined;\n readonly context: RhiCanvasContext | null;\n readonly getPipelineState: () => PipelineState | null;\n readonly assets: AssetRegistry;\n readonly gpuStore: import('../device/gpu-residency').GpuResidencyCache;\n readonly growMeshSsbo?:\n | ((neededSlots: number) =>\n | { readonly ok: true }\n | {\n readonly ok: false;\n readonly code: 'mesh-ssbo-ceiling-reached' | 'mesh-ssbo-capacity-exceeded';\n readonly degradedToSlotCount: number;\n })\n | undefined;\n readonly meshSsboState?: { readonly slotCount: number } | undefined;\n readonly buildPostProcessPipeline?:\n | ((\n entry: import('../fullscreen-post-process-pass').PostProcessShaderEntry,\n bgl: BindGroupLayout,\n colorFormats: readonly GPUTextureFormat[],\n label: string,\n ) => RhiRenderPipeline | null)\n | undefined;\n gpuPassTimingSession?: GpuPassTimingSession | undefined;\n gpuPassTimingCapture?: GpuPassTimingCapture | undefined;\n gpuPassTimingSubmittedWork?: Promise<void> | undefined;\n gpuPassTimingFrameIdentity?: GpuPassTimingFrameIdentity | undefined;\n gpuPassTimingBeginReason?: GpuPassTimingReason | undefined;\n readonly getRenderTargetPhysical?: (target: RenderTarget) => RenderTargetPhysical | undefined;\n readonly encodeRenderTargetReadbacks?: (\n encoder: RhiCommandEncoder,\n faces?: readonly number[],\n ) => void;\n /** Composed renderer utility sources installed atomically at build-ready. */\n volumetricFogShaders?: VolumetricFogShaderSources | undefined;\n /** Composed renderer utility sources installed atomically at build-ready. */\n ssrShaders?: SsrShaderSources | undefined;\n /** Composed renderer utility sources installed atomically at build-ready. */\n atmosphereShaders?: AtmosphereShaderSources | undefined;\n}\n\nexport interface _StandardForwardSceneView {\n readonly environmentIbl?: { readonly irradiance: TextureView; readonly prefilter: TextureView };\n readonly captureDispatch?: readonly DispatchEntry[];\n readonly assets: AssetRegistry;\n readonly store: import('../device/gpu-residency').GpuResidencyCache;\n readonly pipelineState: PipelineState;\n readonly bloomResources?: BloomPersistentBundle | null;\n readonly runtime: RenderSystemRuntime;\n readonly validated: readonly ValidatedRenderable[];\n readonly validatedOrdered: readonly ValidatedRenderable[];\n readonly viewBindGroup: BindGroup | null;\n /** Dynamic View-UBO slot used by auxiliary cube/probe face cameras. */\n readonly viewBindGroupDynamicOffset?: number;\n readonly meshBindGroup: BindGroup | null;\n readonly frameState: RenderFrameState;\n readonly dispatchCounts: DispatchCounts;\n readonly bindGroupCounts: BindGroupCounts;\n readonly skylight: SkylightSnapshot | undefined;\n readonly skylightCount: number;\n readonly skybox: SkyboxSnapshot | undefined;\n readonly profilePhase?: <T>(phase: RenderRecordPhase, action: () => T) => T;\n readonly directionalShadowCacheReuse: boolean;\n readonly world: World;\n readonly tonemapActive: boolean;\n readonly geometryColorView: TextureView | null;\n readonly geometryDepthView: TextureView | null;\n readonly geometryDepthKey: string | null;\n readonly skyboxActive: boolean;\n readonly splitLdrSprite: boolean;\n readonly ldrSpritePassView: TextureView | null;\n readonly transparentColorFormat?: GPUTextureFormat;\n /** Second Standard main-pass attachment used by the fallback producer. */\n readonly reflectionFallbackColorFormat?: GPUTextureFormat;\n readonly dispatch: readonly DispatchEntry[];\n readonly hdrpClusterBindGroup: BindGroup | null;\n readonly hdrpClusterMembershipBindGroup: BindGroup | null;\n /** Prepared Standard lighting declaration accepted by this graph frame. */\n readonly standardLighting?: StandardTopologyInputValue;\n readonly foldDispatchPlan: FoldDispatchPlan | null;\n readonly materialSlotIndices: readonly (readonly number[])[];\n readonly materialSlots: readonly MaterialSnapshot[];\n readonly materialSlotOwners: readonly ValidatedRenderable[];\n readonly materialSlotCount: number;\n /** Filled by main-pass material producers before the GPU-driven raster tail. */\n readonly gpuDrivenStandardPbrFrameResources?: GpuDrivenStandardPbrFrameResources;\n /** Scene table retained by the renderer even when no draw is GPU-admitted. */\n readonly gpuDrivenSceneMaterialBuffer?: Buffer;\n /** Concrete main-pass draw identities already claimed by the capable GPU lane. */\n readonly gpuDrivenDrawKeys?: ReadonlySet<string>;\n readonly gpuDrivenShadowViews?: ShadowViewStatePool;\n readonly gpuDrivenShadowBatchProjections?: ReadonlyMap<\n string,\n ReadonlyMap<number, GpuDrivenShadowBatchProjection>\n >;\n /** Concrete ShadowCaster keys already claimed by the capable GPU subset. */\n readonly gpuDrivenShadowDrawKeys?: ReadonlySet<string>;\n /** View-scoped ShadowCaster claims for exact CPU residual routing. */\n readonly gpuDrivenShadowDrawKeysByView?: ReadonlyMap<string, ReadonlySet<string>>;\n /** Extracted structured ShadowCaster ownership facts. */\n readonly shadowCasterMembership?: readonly ShadowCasterMembership[];\n /** Complete retained ShadowCaster rows, including camera-culled casters. */\n readonly shadowValidatedOrdered?: readonly ValidatedRenderable[];\n /** Dispatch entries remapped to the complete retained ShadowCaster rows. */\n readonly shadowDispatch?: readonly DispatchEntry[];\n /** Mesh-SSBO slot base reserved for the retained ShadowCaster rows. */\n readonly shadowMeshSsboBase?: number;\n /** Renderer-stable world keys used by ShadowCaster ownership identities. */\n readonly shadowCasterWorldKeys?: readonly number[];\n readonly pointsLines: PointsLinesRecordOwner | undefined;\n readonly materialBgAssemblyCache: Map<string, MaterialBgAssemblyCacheEntry>;\n /** Record-stage proof callback; invoked only after a real draw command is encoded. */\n readonly onRenderableDraw?: (entry: ValidatedRenderable) => void;\n readonly reflectionProbes?: ReflectionProbeRecordState;\n materialUboPayloadCache?: {\n readonly materialSlots: readonly MaterialSnapshot[];\n readonly materialSlotCount: number;\n readonly payload: Uint8Array;\n };\n hdrpSsaoBlurredView?: TextureView;\n readonly occlusion?: import('../scene/visibility/occlusion-runtime').OcclusionFrameProjection;\n}\n\nexport type _InternalRenderPipelineContext = RenderPipelineContext & _StandardForwardSceneView;\n\nexport type RecordProfileRunner = <T>(phase: RenderRecordPhase, action: () => T) => T;\n\nexport const STANDARD_PBR_UBO_SIZE = derive(DEFAULT_STANDARD_PBR_PARAM_SCHEMA).uboLayout.totalBytes;\nexport const MATERIAL_PER_ENTITY_STRIDE = Math.ceil(STANDARD_PBR_UBO_SIZE / 256) * 256;\n\nexport type SwapChainFormatPair = {\n readonly storage: GPUTextureFormat;\n readonly view: GPUTextureFormat;\n readonly fallbackReason?: 'preferred-canvas-format-missing';\n};\n\n/** Internal closed projection of the concrete surface route. */\nexport type SurfaceProfile =\n | {\n readonly kind: 'dual-view';\n readonly storageFormat: GPUTextureFormat;\n readonly viewFormat: GPUTextureFormat;\n readonly viewFormats: readonly [GPUTextureFormat];\n readonly hasDisplayEndpoint: true;\n }\n | {\n readonly kind: 'raw-only';\n readonly storageFormat: GPUTextureFormat;\n readonly viewFormat: GPUTextureFormat;\n readonly viewFormats: readonly [];\n readonly hasDisplayEndpoint: false;\n };\n\nexport interface SurfaceCapabilityFacts {\n /** Concrete wgpu downlevel `SURFACE_VIEW_FORMATS` flag. */\n readonly surfaceViewFormats: boolean;\n readonly rawAttachment: boolean;\n readonly floatRenderAttachment: boolean;\n}\n\nexport function resolveSurfaceProfile(\n storageFormat: GPUTextureFormat,\n viewFormat: GPUTextureFormat,\n facts: SurfaceCapabilityFacts,\n): Result<SurfaceProfile, RhiError> {\n if (facts.surfaceViewFormats) {\n return ok({\n kind: 'dual-view',\n storageFormat,\n viewFormat,\n viewFormats: [viewFormat],\n hasDisplayEndpoint: true,\n });\n }\n if (!facts.rawAttachment || !facts.floatRenderAttachment) {\n return err(\n new RhiError({\n code: 'webgpu-runtime-error',\n expected: 'raw surface attachment and rgba16float render attachment capabilities',\n hint: 'surface profile cannot establish a raw-only linear output route',\n detail: {\n error: {\n code: 'surface-raw-endpoint-failed',\n message: 'raw-only surface capabilities are incomplete',\n },\n },\n }),\n );\n }\n return ok({\n kind: 'raw-only',\n storageFormat,\n viewFormat: storageFormat,\n viewFormats: [],\n hasDisplayEndpoint: false,\n });\n}\n\nexport type SurfaceBackendKind = 'webgpu' | 'wgpu-native' | 'wgpu-webgl2' | 'null';\n\nexport function resolveSurfaceFormatPair(\n _backendKind: SurfaceBackendKind,\n storage: GPUTextureFormat,\n view: GPUTextureFormat,\n): SwapChainFormatPair {\n return { storage, view };\n}\n\nfunction surfaceCapabilityFacts(\n device: RhiDevice,\n storageFormat: GPUTextureFormat,\n): SurfaceCapabilityFacts {\n const internal = device as unknown as { readonly surfaceViewFormats?: boolean };\n return {\n surfaceViewFormats: internal.surfaceViewFormats ?? device.caps?.backendKind !== 'wgpu-webgl2',\n rawAttachment: storageFormat === 'rgba8unorm' || storageFormat === 'bgra8unorm',\n floatRenderAttachment: device.caps?.rgba16floatRenderable ?? true,\n };\n}\n\nexport function configureSurface(\n context: RhiCanvasContext,\n device: RhiDevice,\n format: TextureFormat,\n colorAttachmentFormat: TextureFormat,\n): Result<void, RhiError> {\n const backendKind = device.caps?.backendKind ?? 'webgpu';\n const isWebGl2 = backendKind === 'wgpu-webgl2';\n const surfaceFormats = resolveSurfaceFormatPair(\n backendKind,\n format as GPUTextureFormat,\n colorAttachmentFormat as GPUTextureFormat,\n );\n const profile = resolveSurfaceProfile(\n surfaceFormats.storage,\n surfaceFormats.view,\n surfaceCapabilityFacts(device, surfaceFormats.storage),\n );\n if (!profile.ok) return profile;\n // WebGL2 surface pixels are proven by the compositor fixture, so it has no\n // surface consumer for optional TEXTURE_BINDING/COPY_SRC usage. The concrete\n // wgpu surface derives supported usages from SurfaceCapabilities and rejects\n // unsupported requests; this path requests only the guaranteed attachment\n // usage. Raw-only deliberately has no alternate view.\n const supportsTextureBinding =\n backendKind !== 'wgpu-webgl2' && (device.caps?.storageBuffer ?? true);\n const configured = context.configure({\n device,\n format: surfaceFormats.storage,\n alphaMode: isWebGl2 ? 'opaque' : 'premultiplied',\n usage:\n GPU_TEXTURE_USAGE_RENDER_ATTACHMENT |\n (supportsTextureBinding ? GPU_TEXTURE_USAGE_TEXTURE_BINDING : 0) |\n (isWebGl2 ? 0 : GPU_TEXTURE_USAGE_COPY_SRC),\n viewFormats: [...profile.value.viewFormats],\n });\n if (!configured.ok) return configured;\n if (\n isWebGl2 &&\n (context.presentationProof === undefined ||\n !context.presentationProof.descriptor ||\n !context.presentationProof.acquisition ||\n !context.presentationProof.validation ||\n typeof context.presentationProof.surfaceIdentity !== 'string' ||\n context.presentationProof.surfaceIdentity.length === 0 ||\n context.presentationProof.requested === undefined ||\n context.presentationProof.validated === undefined ||\n JSON.stringify(context.presentationProof.requested) !==\n JSON.stringify(context.presentationProof.validated))\n ) {\n return err(\n new RhiError({\n code: 'webgpu-runtime-error',\n expected: 'WebGL2 surface storage has descriptor, acquisition, and validation proof',\n hint: 'run the concrete presentation probe and retain the last-known-good graph when proof is absent',\n detail: {\n error: {\n code: 'surface-raw-endpoint-failed',\n message: 'surface storage raw endpoint proof is incomplete',\n },\n },\n }),\n );\n }\n return ok(undefined);\n}\n\nexport function selectSwapChainFormat(\n storageBufferCapable: boolean,\n surfaceViewFormats = true,\n): SwapChainFormatPair {\n if (!storageBufferCapable) {\n return {\n storage: 'rgba8unorm',\n view: surfaceViewFormats ? 'rgba8unorm-srgb' : 'rgba8unorm',\n };\n }\n const nav = (\n globalThis as { navigator?: { gpu?: { getPreferredCanvasFormat?: () => GPUTextureFormat } } }\n ).navigator;\n const gpu = nav?.gpu;\n const getPreferred = gpu?.getPreferredCanvasFormat;\n if (gpu !== undefined && typeof getPreferred === 'function') {\n const storage = getPreferred.call(gpu);\n const view =\n storage === 'rgba8unorm'\n ? 'rgba8unorm-srgb'\n : storage === 'bgra8unorm'\n ? 'bgra8unorm-srgb'\n : storage;\n return {\n storage,\n view: surfaceViewFormats ? view : storage,\n };\n }\n return {\n storage: 'rgba8unorm',\n view: surfaceViewFormats ? 'rgba8unorm-srgb' : 'rgba8unorm',\n fallbackReason: 'preferred-canvas-format-missing',\n };\n}\n","import { transmissionBackdropAvailable } from '../assembly/device-feature-admission';\nimport { getOrCreateIblCache } from '../ibl/IblPipelineCache';\nimport type { _InternalRenderPipelineContext } from './render-context';\n// @forgeax/engine-runtime - RenderSystem record stage: main-pass-material.\n// Extracted from render-system-record.ts (feat-20260704 M3/w17, pure move).\n\nimport { resolveAssetHandle } from '@forgeax/engine-assets-runtime';\nimport type { EntityHandle, World } from '@forgeax/engine-ecs';\nimport {\n VIDEO_ELEMENT_PROVIDER_KEY,\n type VideoElementProvider,\n} from '@forgeax/engine-graphics-extras';\nimport {\n type BindGroup,\n type BindGroupEntry,\n type BindGroupLayout,\n type Buffer,\n type RenderPipeline,\n RhiError,\n type Sampler,\n type TextureView,\n} from '@forgeax/engine-rhi';\nimport {\n DEFAULT_MSDF_TEXT_PARAM_SCHEMA,\n DEFAULT_SPRITE_PARAM_SCHEMA,\n DEFAULT_UNLIT_PARAM_SCHEMA,\n STANDARD_PHYSICAL_TEXTURE_FIELDS,\n STANDARD_PIPELINE_PARAM_SCHEMA,\n} from '@forgeax/engine-shader';\nimport type {\n Handle,\n ImageError,\n MaterialRenderState,\n ParamSchemaEntry,\n PrimitiveTopology,\n SamplerAsset,\n TextureAsset,\n} from '@forgeax/engine-types';\nimport { derive, handleSlot, resolveMaterialTextureCoordinates } from '@forgeax/engine-types';\nimport type { GpuResidencyCache } from '../device/gpu-residency';\nimport { VideoUploadUnsupportedError } from '../errors/render';\nimport {\n assembleMaterialWithSkylightEntries,\n type SkylightBindGroupResources,\n type TextureInjectionResource,\n type TransmissionBindGroupResources,\n} from '../ibl/skylight-bind-group';\nimport type { IblBindingEntryInspection } from '../mesh-material-bindings';\nimport type { PipelineGroup2Contract } from '../pbr-pipeline';\nimport {\n isCanonicalStandardPbrMaterialShader,\n isStandardPbrMaterialShader,\n physicalTextureFields,\n} from '../pbr-pipeline';\nimport { deriveTextureExtent } from '../render-data';\nimport type { MaterialSnapshot, SkylightSnapshot } from '../render-system-extract';\nimport type { RenderTargetTextureSource } from '../targets/contracts';\nimport {\n type RenderTargetMaterialSourceBinding,\n resolveRenderTargetMaterialSource,\n} from '../targets/material-source';\nimport type { StandardReflectionProbeBinding } from './frame-lighting';\nimport type {\n BindGroupCounts,\n MaterialBgAssemblyCacheEntry,\n RenderFrameState,\n} from './frame-snapshot';\nimport { getOpaqueResourceIdentity } from './frame-snapshot';\nimport { extractEntryResourceHandle, getOrCreatePerEntity } from './mesh-ssbo';\nimport {\n type PipelineState,\n type RenderSystemRuntime,\n STANDARD_PBR_UBO_SIZE,\n} from './render-context';\n\n/**\n * Resolve the group(2) resource layout from the material shader contract.\n * Standard clustered PBR consumes the unified cluster bind group; every other\n * material consumes the ordinary mesh bind group. Missing ordinary resources\n * remain missing so the caller can skip the draw rather than violate layout\n * compatibility by binding a cluster group.\n */\nexport function selectMaterialGroup2(\n clusterGroup: BindGroup | null,\n meshGroup: BindGroup | null,\n group2Contract: PipelineGroup2Contract,\n): BindGroup | null {\n if (group2Contract === 'cluster') return clusterGroup;\n if (group2Contract === 'mesh') return meshGroup;\n return null;\n}\n\n// Param schemas are immutable runtime contracts: the shader registry installs\n// them once and material snapshots only retain the same array reference. Keep\n// the expensive pure derivation on that identity so the per-submesh record\n// path does not rebuild the same UBO/texture maps for every visible material\n// on every frame. A WeakMap keeps this optimization bounded by the lifetime of\n// the schema owner and adds no global strong-reference lifetime.\nconst DERIVED_PARAM_SCHEMA_CACHE = new WeakMap<\n readonly ParamSchemaEntry[],\n ReturnType<typeof derive>\n>();\n\nfunction derivedParamSchema(schema: readonly ParamSchemaEntry[]): ReturnType<typeof derive> {\n const cached = DERIVED_PARAM_SCHEMA_CACHE.get(schema);\n if (cached !== undefined) return cached;\n const derived = derive(schema);\n DERIVED_PARAM_SCHEMA_CACHE.set(schema, derived);\n return derived;\n}\n\n// feat-20260601-customizable-render-pipeline-seam M2 / w12: the former\n// `RecordPassContext` (26-field full surface, including the `internals` kitchen-sink and\n// the 0-consumed `skyboxCount` residual) is DELETED. The per-frame shared state injected\n// into the render-graph pass execute closures is now the clean `RenderPipelineContext`\n// (defined in `render-system.ts`): `internals` is gone (replaced by the named\n// `assets` / `store` / `pipelineState` / `runtime` surfaces) so a pipeline author cannot\n// reach the runtime kitchen-sink through the public ctx (AC-08). The graph is\n// `RenderGraph<RenderPipelineContext>` so `execute(ctx)` forwards the object to each\n// closure with no `as` assertion.\n//\n// Encoder ownership (RD-4): `ctx.encoder` is the SHARED frame encoder used by the main /\n// tonemap / FXAA passes (finished + submitted once at frame end); the shadow pass opens\n// its OWN encoder internally + submits independently (the runtime-side manual barrier for\n// the depth write -> sample hazard).\n\n// M1 / w7: ensureLazyTexture DELETED — GPU texture ownership moved to render-graph\n// via addColorTarget + compile(device). The graph allocates transient/persistent\n// render targets during the compile allocation phase; pass execute closures resolve\n// TextureViews through resolve(name). PerPassResources texture slots still hold\n// the last-used views for bindgroup-invalidation self-checks (D-3 physical texture\n// identity), but the graph owns the create/destroy lifecycle.\n\n/**\n * Keep line primitives visible when they share a depth plane with filled\n * geometry. The same topology policy is consumed by the CPU and GPU-driven\n * raster lanes so a mixed mesh does not change appearance when ownership\n * moves between them.\n */\nexport function geometryRenderStateForTopology(\n topology: PrimitiveTopology,\n renderState: MaterialRenderState | undefined,\n): MaterialRenderState | undefined {\n if (topology !== 'line-list' && topology !== 'line-strip') return renderState;\n return {\n ...renderState,\n depthWriteEnabled: false,\n depthCompare: 'less-equal',\n };\n}\n\n/**\n * feat-20260604-learn-render-4.10-anti-aliasing-msaa M2 / w9: pick the static\n * unlit geometry pipeline handle for a (tonemapActive x msaaActive)\n * combination. The four mode axes (LDR/HDR x single/MSAA) map to the 14 static\n * pipeline handles built in createRenderer (7 base + 7 count=4 variants). A\n * pipeline's `multisample.count` must match the colour-attachment sampleCount,\n * so the count=4 variant is required whenever the camera carries\n * `antialias === 'msaa'`. Returns null when the requested pipeline was not\n * built (empty-manifest path / MSAA variant build failure) -- the caller fires\n * a structured `shader-compile-failed` on the null-narrow.\n */\n// feat-20260615-pipeline-spec-ssot M6-T1: the standard-shading fallback\n// selector was deleted. The pre-M6 selector silently substituted the\n// boot-time URP `pipelineState.standardPipeline*` whenever the per-\n// MaterialShader cache returned null and HDRP was inactive -- masking\n// real PipelineSpecError build failures behind a layout-compatible-but-\n// wrong PSO. Charter P3 explicit-failure now governs: a missing cache\n// entry surfaces as null, and the per-submesh\n// `if (smPipelineHandle === null) continue` skip-draw (which already\n// covered the HDRP-active and skin-shader miss-skip paths) is the single\n// uniform recovery shape across URP / HDRP / skin.\n\nexport function selectGeometryPipeline(\n pipelineState: PipelineState,\n tonemapActive: boolean,\n msaaActive: boolean,\n): RenderPipeline | null {\n if (tonemapActive) {\n return msaaActive ? pipelineState.unlitPipelineHdrMsaa : pipelineState.unlitPipelineHdr;\n }\n return msaaActive ? pipelineState.unlitPipelineMsaa : pipelineState.unlitPipeline;\n}\n\n/**\n * feat-city-glb Bug 5 (per-submesh transparency): true when EVERY submesh\n * material of the entity is transparent (blend). Used by the geometry pass to\n * decide whether to skip the whole entity (fully transparent → deferred to the\n * blend sub-pass) vs. draw its opaque submeshes and skip only the transparent\n * ones per-submesh.\n *\n * Falls back to the entity-level `material.transparent` when `materials` is\n * absent (single-material entities / test fixtures), byte-identical to the\n * pre-fix whole-entity gate.\n *\n * @internal\n */\nexport function isEntityFullyTransparent(source: {\n readonly material: MaterialSnapshot;\n readonly materials?: readonly MaterialSnapshot[];\n}): boolean {\n const mats = source.materials;\n if (mats === undefined || mats.length === 0) return source.material.transparent === true;\n for (let j = 0; j < mats.length; j++) {\n if (mats[j]?.transparent !== true) return false;\n }\n return true;\n}\n\n/**\n * feat-city-glb Bug 5: true when the entity has at least one transparent AND at\n * least one opaque submesh — i.e. it must be drawn in BOTH the geometry pass\n * (opaque submeshes) and the blend sub-pass (transparent submeshes). A pure-\n * opaque or pure-transparent entity returns false (handled by the whole-entity\n * fast paths).\n *\n * @internal\n */\nexport function entityHasTransparentSubmesh(source: {\n readonly material: MaterialSnapshot;\n readonly materials?: readonly MaterialSnapshot[];\n}): boolean {\n const mats = source.materials;\n if (mats === undefined) return source.material.transparent === true;\n for (let j = 0; j < mats.length; j++) {\n if (mats[j]?.transparent === true) return true;\n }\n return false;\n}\n\n/**\n * feat-20260601-device/gpu-residency-extraction M1 / D-9: resolve a texture's\n * GPU view through the pull-model residency store. The three steps replace the\n * pre-extraction single-call accessor on the registry:\n * 1. fetch the TextureAsset POD off the registry (CPU; registry keeps PODs)\n * 2. synchronously `ensureResident(handle, pod)` (first access builds the\n * GPU texture + prewarmed mipmap blit; subsequent access is O(1))\n * 3. return the GPU view (or undefined on POD miss / ensureResident err)\n *\n * Returns `undefined` when the POD is absent (handle never registered) or the\n * upload fails (a structured error is fired). Callers then fall back to their\n * existing placeholder view, preserving the pre-extraction fallback semantics.\n */\nfunction isImageError(error: unknown): error is ImageError {\n if (typeof error !== 'object' || error === null) return false;\n const code = (error as { readonly code?: unknown }).code;\n return typeof code === 'string' && code.startsWith('image-');\n}\n\nfunction materialDiagnosticsEnabled(): boolean {\n if (typeof globalThis !== 'object' || globalThis === null || !('process' in globalThis)) {\n return false;\n }\n const processValue = (\n globalThis as {\n readonly process?: { readonly env?: Record<string, string | undefined> };\n }\n ).process;\n return processValue?.env?.FORGEAX_MATERIAL_DIAGNOSTICS === '1';\n}\n\nexport function residentTextureView(\n world: World,\n store: GpuResidencyCache,\n runtime: RenderSystemRuntime,\n handle: Handle<'TextureAsset', 'shared'>,\n worldId: World | number = world,\n): TextureView | undefined {\n const podRes = resolveAssetHandle<TextureAsset>(world, handle);\n const diagnosticsEnabled = materialDiagnosticsEnabled();\n if (!podRes.ok) {\n if (diagnosticsEnabled) {\n console.error(\n `[render-material] texture resolve failed: ${JSON.stringify({ handle: handleSlot(handle), error: podRes.error })}`,\n );\n }\n return undefined;\n }\n const residentRes = store.ensureResident(handle, podRes.value, worldId);\n if (!residentRes.ok) {\n // Preserve the concrete asset-capability boundary on the renderer error\n // channel. In particular, WebGL2 texture-dimension refusal must not\n // collapse into the later debug-pink asset-not-registered fallback.\n if (residentRes.error instanceof RhiError || isImageError(residentRes.error)) {\n runtime.errorRegistry.fire(residentRes.error);\n }\n if (diagnosticsEnabled) {\n console.error(\n `[render-material] texture residency failed: ${JSON.stringify({\n handle: handleSlot(handle),\n pod: {\n kind: podRes.value.kind,\n shape: podRes.value.shape,\n format: podRes.value.format,\n dataByteLength: podRes.value.data.byteLength,\n mips: podRes.value.mips,\n },\n error: residentRes.error,\n })}`,\n );\n }\n return undefined;\n }\n const view = store.getTextureGpuView(handle, worldId);\n if (diagnosticsEnabled) {\n console.error(\n `[render-material] texture residency ready: ${JSON.stringify({\n handle: handleSlot(handle),\n pod: {\n kind: podRes.value.kind,\n shape: podRes.value.shape,\n format: podRes.value.format,\n dataByteLength: podRes.value.data.byteLength,\n mips: podRes.value.mips,\n },\n receipt: 'receipt' in residentRes.value ? residentRes.value.receipt : undefined,\n viewReady: view !== undefined,\n })}`,\n );\n }\n return view;\n}\n\nfunction residentSampler(\n world: World,\n store: GpuResidencyCache,\n runtime: RenderSystemRuntime,\n handle: Handle<'SamplerAsset', 'shared'>,\n worldId: World | number = world,\n): Sampler | undefined {\n const podRes = resolveAssetHandle<SamplerAsset>(world, handle);\n if (!podRes.ok) return undefined;\n const residentRes = store.ensureSamplerResident(handle, podRes.value, worldId);\n if (!residentRes.ok) {\n runtime.errorRegistry.fire(residentRes.error);\n return undefined;\n }\n return residentRes.value;\n}\n\n// feat-20260623-world-space-video-asset M4 / w16 (D-3): resolve the\n// current-frame GPU view for a video-sourced texture field through the\n// transient DynamicTextureStore, NOT the static `residentTextureView` /\n// `ensureResident` cache (video never enters that switch; AC-08).\n//\n// Per frame: ask the host-registered VideoElementProvider (World Resource,\n// D-1) for this entity's HTMLVideoElement, upload its current frame via\n// `store.uploadFrame` (copyExternalImageToTexture), and return the resulting\n// view. When the provider is absent / returns no element / the element has no\n// decodable dimensions yet, fall back to a previously-uploaded view and\n// finally to `undefined` (caller binds the default view this frame — charter\n// P3 graceful, no garbage sampling). A failed GPU upload fires the structured\n// RhiError on the engine channel and degrades to the default view.\n//\n// `highPerfAvailable` is the w17 capability probe; the high-perf\n// GPUExternalTexture branch is a reserved hook (OOS-5) — when it ever becomes\n// available the upload would route there. Today it is always false so the\n// general copyExternalImageToTexture path is the only one taken.\ntype DynamicTextureStore = import('@forgeax/engine-assets-runtime').DynamicTextureStore;\n\ntype VideoUploadFailureEpisodes = Map<number, Set<number>>;\n\n// The store is renderer-owned, so this keeps one failure episode per\n// renderer/entity/clip without creating a second video system or leaking\n// state across a replacement renderer.\nconst VIDEO_UPLOAD_FAILURE_EPISODES = new WeakMap<\n DynamicTextureStore,\n VideoUploadFailureEpisodes\n>();\n\nfunction markVideoUploadFailureEpisode(\n store: DynamicTextureStore,\n entityKey: number,\n clip: Handle<'VideoAsset', 'shared'>,\n): boolean {\n let clips = VIDEO_UPLOAD_FAILURE_EPISODES.get(store);\n if (clips === undefined) {\n clips = new Map();\n VIDEO_UPLOAD_FAILURE_EPISODES.set(store, clips);\n }\n let episodes = clips.get(entityKey);\n if (episodes === undefined) {\n episodes = new Set();\n clips.set(entityKey, episodes);\n }\n const clipId = handleSlot(clip);\n if (episodes.has(clipId)) return false;\n episodes.add(clipId);\n return true;\n}\n\nfunction clearVideoUploadFailureEpisode(\n store: DynamicTextureStore,\n entityKey: number,\n clip: Handle<'VideoAsset', 'shared'>,\n): void {\n const clips = VIDEO_UPLOAD_FAILURE_EPISODES.get(store);\n const episodes = clips?.get(entityKey);\n if (episodes === undefined) return;\n episodes.delete(handleSlot(clip));\n if (episodes.size === 0) clips?.delete(entityKey);\n if (clips?.size === 0) VIDEO_UPLOAD_FAILURE_EPISODES.delete(store);\n}\n\nexport function videoTextureView(\n world: World,\n store: DynamicTextureStore | undefined,\n runtime: RenderSystemRuntime,\n entityKey: number,\n clip: Handle<'VideoAsset', 'shared'>,\n highPerfAvailable: boolean,\n): TextureView | undefined {\n if (store === undefined) return undefined;\n const provider = world.hasResource(VIDEO_ELEMENT_PROVIDER_KEY)\n ? world.getResource<VideoElementProvider>(VIDEO_ELEMENT_PROVIDER_KEY)\n : undefined;\n const element = provider?.getElement(entityKey as EntityHandle, clip);\n // AC-10 double-miss: a VideoPlayer entity can reach NEITHER upload path this\n // frame — no host HTMLVideoElement (general copyExternalImageToTexture path)\n // AND no high-perf GPUExternalTexture path. This is the genuine \"this backend\n // exposes no usable video upload path\" case (no provider registered, or the\n // provider yields nothing while the high-perf reserved hook is unavailable —\n // OOS-5 keeps it always false today). Rather than silently binding the\n // default view, fire the structured VideoUploadUnsupportedError on the engine\n // error channel so an AI user can detect the dead path via `.code` / `.hint`\n // (charter P3; AC-10 signal lives on the REAL per-frame upload path, not an\n // orphan system). The default view is still bound this frame so the draw\n // does not crash (graceful degradation), but the failure is no longer silent.\n if (element === undefined && !highPerfAvailable) {\n if (markVideoUploadFailureEpisode(store, entityKey, clip)) {\n runtime.errorRegistry.fire(new VideoUploadUnsupportedError());\n }\n return store.getView(clip);\n }\n // D-2 / w17 high-perf reserved hook: a future GPUExternalTexture import path\n // would key off `highPerfAvailable` here. It is always false today\n // (importExternalTexture absent), so the general copyExternalImageToTexture\n // path below is the sole route end-to-end.\n if (element === undefined) {\n clearVideoUploadFailureEpisode(store, entityKey, clip);\n return store.getView(clip);\n }\n const width = element.videoWidth;\n const height = element.videoHeight;\n // Metadata dimensions can be non-zero before the decoder has produced a\n // current frame. WebGPU rejects copyExternalImageToTexture in that window\n // because the video element has no back resource yet; keep the previous\n // frame/default view until HAVE_CURRENT_DATA (2) is reached.\n if (width <= 0 || height <= 0 || element.readyState < 2) return store.getView(clip);\n const uploaded = store.uploadFrame(clip, element, width, height);\n if (uploaded === undefined) return store.getView(clip);\n if (!uploaded.ok) {\n runtime.errorRegistry.fire(uploaded.error);\n return store.getView(clip);\n }\n clearVideoUploadFailureEpisode(store, entityKey, clip);\n return uploaded.value;\n}\n\n// feat-20260621-learn-render-5-5-parallax M2 / w8 (D-3): the built-in\n// standard-PBR user-region texture field order, used when the shader is not\n// resolvable through getParamSchema (cross-worktree late-register). Mirrors\n// derive(default-standard-pbr).textureFieldNames.\nexport const BUILTIN_USER_REGION_TEXTURE_FIELDS: readonly string[] = [\n 'baseColorTexture',\n 'metallicRoughnessTexture',\n 'normalTexture',\n 'emissiveTexture',\n 'occlusionTexture',\n 'transmissionTexture',\n 'thicknessTexture',\n];\n\nconst LEGACY_MATERIAL_TEXTURE_SCALE_OFFSET = 80;\nconst LEGACY_MATERIAL_TEXTURE_SCALE_FIELDS = [\n 'baseColorTexture',\n 'metallicRoughnessTexture',\n 'normalTexture',\n 'emissiveTexture',\n 'occlusionTexture',\n] as const;\nconst DEFAULT_LEGACY_TEXTURE_SCALES = new Float32Array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1]);\n\nexport interface StandardReflectionProbeMaterialProjection {\n readonly probeIndex: number | undefined;\n readonly fallbackToSkylight: boolean;\n}\n\n/** Keeps the fallback output as a same-pass, linear-HDR material projection. */\nexport function standardPbrFallbackDemand(\n projection: StandardReflectionProbeMaterialProjection,\n): boolean {\n return projection.probeIndex !== undefined || projection.fallbackToSkylight;\n}\n\n/** Projects the selected scene row into the Standard material lane. */\nexport function projectReflectionProbeMaterialBinding(\n binding: StandardReflectionProbeBinding,\n): StandardReflectionProbeMaterialProjection {\n return {\n probeIndex: binding.probeIndex,\n fallbackToSkylight: binding.useSkylight,\n };\n}\n\n/** Derives the logical-content UV scale for an uploaded material texture. */\nexport function materialTextureUvScale(\n texture: Pick<TextureAsset, 'shape' | 'format'> | undefined,\n): readonly [number, number] {\n if (texture === undefined) return [1, 1];\n return deriveTextureExtent(\n texture.format,\n texture.shape.extent.width,\n texture.shape.extent.height,\n ).uvScale;\n}\n\nfunction materialTextureForField(\n material: MaterialSnapshot,\n field: string,\n): Handle<'TextureAsset', 'shared'> | undefined {\n if (field === 'emissiveTexture') return material.emissiveTexture;\n if (field === 'occlusionTexture') return material.occlusionTexture;\n return material.textureHandles?.get(field);\n}\n\n/** Resolve a renderer-local target source without entering AssetRegistry. */\nexport function materialRenderTargetSourceForField(\n material: MaterialSnapshot,\n field: string,\n resolveSource?: RenderSystemRuntime['resolveRenderTargetTextureSource'],\n): RenderTargetMaterialSourceBinding | undefined {\n const source = material.textureSources?.get(field) as RenderTargetTextureSource | undefined;\n return source === undefined\n ? undefined\n : (resolveSource?.(source) ?? resolveRenderTargetMaterialSource(source));\n}\n\n/**\n * Appends the engine-owned scale for every built-in material texture binding.\n * Asset dimensions remain logical; this is the sole record-stage projection\n * from a bound texture asset to its shader sampling coordinates.\n */\ntype MaterialUboPayload = ArrayBuffer | Uint8Array | Float32Array;\n\nfunction materialUboFloatView(payload: MaterialUboPayload): Float32Array {\n if (payload instanceof Float32Array) return payload;\n return payload instanceof Uint8Array\n ? new Float32Array(payload.buffer, payload.byteOffset, payload.byteLength / 4)\n : new Float32Array(payload);\n}\n\nfunction materialUboDataView(payload: MaterialUboPayload): DataView {\n if (payload instanceof Float32Array || payload instanceof Uint8Array) {\n return new DataView(payload.buffer, payload.byteOffset, payload.byteLength);\n }\n return new DataView(payload);\n}\n\n/** Write one schema value with the scalar type's actual WGSL bit encoding. */\nfunction writeNumericParamValue(\n view: DataView,\n entry: { readonly offset: number; readonly size: number; readonly type: string },\n value: number | readonly number[],\n): void {\n const values = typeof value === 'number' ? [value] : value;\n const width = entry.size / 4;\n const writeCount = Math.min(values.length, width);\n for (let index = 0; index < writeCount; index += 1) {\n const component = values[index];\n if (typeof component !== 'number') continue;\n const byteOffset = entry.offset + index * 4;\n switch (entry.type) {\n case 'i32':\n view.setInt32(byteOffset, component, true);\n break;\n case 'u32':\n view.setUint32(byteOffset, component, true);\n break;\n case 'f32':\n case 'vec2':\n case 'vec3':\n case 'vec4':\n case 'color':\n view.setFloat32(byteOffset, component, true);\n break;\n }\n }\n}\n\nexport function applyMaterialTextureUvScales(\n payload: MaterialUboPayload,\n material: MaterialSnapshot,\n world: World,\n): void {\n const f32 = materialUboFloatView(payload);\n const coordinateSchema = materialCoordinateSchema(material);\n if (coordinateSchema !== undefined) {\n const coordinateRecords = derivedParamSchema(coordinateSchema).coordinateRecords;\n for (const record of coordinateRecords) {\n const field = record.parameter;\n const handle = materialTextureForField(material, field);\n const resolvedTexture =\n handle === undefined ? undefined : resolveAssetHandle<TextureAsset>(world, handle);\n const texture = resolvedTexture?.ok === true ? resolvedTexture.value : undefined;\n const [u, v] = materialTextureUvScale(texture);\n const coordinates = resolveMaterialTextureCoordinates(\n material.textureCoordinates?.get(field),\n );\n const offset = record.offset / 4;\n f32[offset] = coordinates.transform.offset[0];\n f32[offset + 1] = coordinates.transform.offset[1];\n f32[offset + 2] = coordinates.transform.scale[0];\n f32[offset + 3] = coordinates.transform.scale[1];\n f32[offset + 4] = coordinates.set;\n f32[offset + 5] = coordinates.transform.rotation;\n f32[offset + 6] = u;\n f32[offset + 7] = v;\n }\n return;\n }\n // Unknown legacy material paths retain their historical packed scale tail.\n // Every registered Standard/material-schema path returns above and is\n // therefore fully schema-driven (including physical texture coordinates).\n const textureScaleOffset = LEGACY_MATERIAL_TEXTURE_SCALE_OFFSET;\n const hasTextureMetadata =\n material.textureCoordinates !== undefined ||\n material.textureHandles !== undefined ||\n material.videoTextureFields !== undefined ||\n material.baseColorTexture !== undefined ||\n material.metallicRoughnessTexture !== undefined ||\n material.normalTexture !== undefined ||\n material.emissiveTexture !== undefined ||\n material.occlusionTexture !== undefined;\n if (!hasTextureMetadata) {\n f32.set(DEFAULT_LEGACY_TEXTURE_SCALES, textureScaleOffset / 4);\n return;\n }\n const fields = LEGACY_MATERIAL_TEXTURE_SCALE_FIELDS;\n for (let index = 0; index < fields.length; index++) {\n const field = fields[index];\n if (field === undefined) continue;\n const handle = materialTextureForField(material, field);\n const resolved =\n handle === undefined ? undefined : resolveAssetHandle<TextureAsset>(world, handle);\n const texture = resolved?.ok === true ? resolved.value : undefined;\n const [u, v] = materialTextureUvScale(texture);\n const offset = textureScaleOffset / 4 + index * 2;\n f32[offset] = u;\n f32[offset + 1] = v;\n }\n}\n\nfunction materialCoordinateSchema(\n material: MaterialSnapshot,\n): readonly ParamSchemaEntry[] | undefined {\n if (material.materialParamSchema !== undefined && material.materialParamSchema.length > 0) {\n return material.materialParamSchema;\n }\n if (isStandardPbrMaterialShader(material.materialShaderId)) return STANDARD_PIPELINE_PARAM_SCHEMA;\n switch (material.materialShaderId) {\n case 'forgeax::default-unlit':\n return DEFAULT_UNLIT_PARAM_SCHEMA;\n case 'forgeax::sprite':\n case 'forgeax::sprite-lit':\n return DEFAULT_SPRITE_PARAM_SCHEMA;\n case 'forgeax::msdf-text':\n return DEFAULT_MSDF_TEXT_PARAM_SCHEMA;\n default:\n return undefined;\n }\n}\n\n/**\n * feat-20260621-learn-render-5-5-parallax M2 / w8 (D-3): ordered user-region\n * texture field names for a material's bind-group assembly, derived from the\n * shader's paramSchema via the `derive()` SSOT (insertion order = sampler/\n * texture pair order in derive().bglEntries). Falls back to the built-in\n * fields only when the schema is unavailable; an explicit empty schema means\n * the authored material has no user-region textures.\n */\nexport function userRegionTextureFieldOrder(\n schema: Parameters<typeof derive>[0] | undefined,\n): readonly string[] {\n if (schema === undefined) return BUILTIN_USER_REGION_TEXTURE_FIELDS;\n const fields = [...derivedParamSchema(schema).textureFieldNames];\n return fields;\n}\n\n/**\n * feat-20260621-learn-render-5-5-parallax M2 / w8: the fallback texture view\n * for a user-region field when no handle is provided (graceful, charter P3).\n * normalTexture decodes to a flat tangent normal; everything else (baseColor,\n * MR, height, ...) uses the 1x1 white default (height white -> zero displacement).\n */\nexport function defaultViewForUserRegionField(\n field: string,\n pipelineState: PipelineState,\n schema?: readonly ParamSchemaEntry[],\n): TextureView {\n const parameter = schema?.find((entry) => entry.name === field);\n if (parameter?.type === 'texture_cube') {\n // The renderer already owns a valid white cube for the Skylight fallback.\n // Use it until a receipt-promoted RenderTarget source becomes available;\n // binding a 2D view here would invalidate the custom cube material BGL.\n return pipelineState.skylightFallback?.prefilterView ?? pipelineState.defaultWhiteTextureView;\n }\n if (field === 'normalTexture') return pipelineState.defaultNormalTextureView;\n if (field === 'baseColorTexture') return pipelineState.fallbackTextureView;\n if (field === 'anisotropyTexture') {\n // The flat-normal fallback encodes a zero tangent direction and unit B\n // strength; the shader's zero-vector guard selects its neutral (1, 0)\n // axis. This keeps an absent anisotropy map neutral even on hosts that do\n // not allocate the optional dedicated identity texture.\n return pipelineState.defaultAnisotropyTextureView ?? pipelineState.defaultNormalTextureView;\n }\n return pipelineState.defaultWhiteTextureView;\n}\n\n/**\n * feat-20260527-sprite-nineslice M4 / w17 (AC-16): once-per-renderable\n * detection of \"Transform.scale below the four 9-slice corner anchors\". Pure\n * helper extracted out of recordFrame so unit tests can drive it without a\n * GPU device — the recordFrame loop calls this with its `transformWorld` /\n * `slices` / `renderableIndex` / `seenIndices` / `metrics` arguments.\n *\n * The scale-vs-anchor formula mirrors plan-strategy §D-3 — the world x scale must\n * accommodate `|slices.x| + |slices.z|`, and `scaleY` must accommodate\n * `|slices.y| + |slices.w|`. Slices ≡ all zero is a no-op (legacy quad\n * path); a breach increments `nineslice.scale-too-small` exactly once per\n * `renderableIndex` per RenderSystem lifetime via the `seenIndices` Set\n * (the same warn-once anchor pattern used for missing-texture sprites).\n *\n * @param transformWorld The entity's resolved GlobalTransform.world mat4 (16 floats column-major).\n * @param slices The four anchor distances `[left, top, right, bottom]`\n * (sentinel `bottom < 0` for tile mode is consumed via abs()).\n * @param renderableIndex The entity index into the validated renderables list.\n * @param seenIndices The per-frame-state guard Set; entries are added on increment.\n * @param metrics The owner-provided EngineMetrics counter.\n * @internal — exported for unit-test access (w17).\n */\nexport function detectNineSliceScaleTooSmall(\n transformWorld: Float32Array,\n slices: readonly [number, number, number, number],\n renderableIndex: number,\n seenIndices: Set<number>,\n metrics: { increment(name: string): void },\n): void {\n const anyNonZero = slices[0] !== 0 || slices[1] !== 0 || slices[2] !== 0 || slices[3] !== 0;\n if (!anyNonZero) return;\n const sx = Math.hypot(transformWorld[0] ?? 1, transformWorld[1] ?? 0, transformWorld[2] ?? 0);\n const sy = Math.hypot(transformWorld[4] ?? 0, transformWorld[5] ?? 1, transformWorld[6] ?? 0);\n const horizontalAnchor = Math.abs(slices[0]) + Math.abs(slices[2]);\n const verticalAnchor = Math.abs(slices[1]) + Math.abs(slices[3]);\n if (sx < horizontalAnchor || sy < verticalAnchor) {\n if (!seenIndices.has(renderableIndex)) {\n seenIndices.add(renderableIndex);\n metrics.increment('nineslice.scale-too-small');\n }\n }\n}\n\n/** Build one max-sized, schema-driven Standard material UBO payload. */\nexport function buildPbrMaterialUboPayload(material: MaterialSnapshot): Uint8Array {\n const buf = new Uint8Array(STANDARD_PBR_UBO_SIZE);\n writePbrMaterialUboPayload(buf, material);\n return buf;\n}\n\n/**\n * Write the standard material payload into caller-owned storage.\n *\n * The allocating wrapper above remains the helper/test surface, while the\n * frame recorder reuses one scratch slot for all materials. Field offsets are\n * read from the material's admitted schema; no Standard field offset table is\n * maintained in the record stage.\n */\nexport function writePbrMaterialUboPayload(\n buf: Uint8Array | Float32Array,\n material: MaterialSnapshot,\n): void {\n if (buf.byteLength < STANDARD_PBR_UBO_SIZE) {\n throw new RangeError(\n `writePbrMaterialUboPayload: expected at least ${STANDARD_PBR_UBO_SIZE} bytes, got ${buf.byteLength}`,\n );\n }\n buf.fill(0);\n const dataView = materialUboDataView(buf);\n const schema =\n material.materialParamSchema === undefined || material.materialParamSchema.length === 0\n ? STANDARD_PIPELINE_PARAM_SCHEMA\n : material.materialParamSchema;\n const snapshot = material.paramSnapshot;\n const fallback = (name: string, entry: (typeof schema)[number]): unknown => {\n switch (name) {\n case 'baseColor':\n return [\n material.baseColor[0] ?? 1,\n material.baseColor[1] ?? 1,\n material.baseColor[2] ?? 1,\n 1,\n ];\n case 'metallic':\n return material.metallic;\n case 'roughness':\n return material.roughness;\n case 'specularColor':\n return material.specularColor ?? [1, 1, 1];\n case 'normalScale':\n return material.normalScale ?? 1;\n case 'emissive':\n return material.emissive ?? [0, 0, 0];\n case 'emissiveIntensity':\n return material.emissiveIntensity ?? 0;\n case 'occlusionStrength':\n return material.occlusionStrength ?? 1;\n default:\n return entry.default;\n }\n };\n for (const entry of derivedParamSchema(schema).uboLayout.entries) {\n const value =\n snapshot?.[entry.name] ??\n fallback(entry.name, schema.find((item) => item.name === entry.name) ?? entry);\n if (typeof value === 'number') {\n writeNumericParamValue(dataView, entry, value);\n } else if (Array.isArray(value)) {\n writeNumericParamValue(dataView, entry, value);\n }\n }\n}\n\n/**\n * Generic std140 UBO writer driven by `derive(paramSchema).uboLayout.entries`\n * (feat-20260625-refactor-sprite-as-transparent-mesh M1 / w3, plan-strategy\n * section 2 D-2).\n *\n * For each numeric entry in the schema, looks up the matching value in\n * `paramSnapshot` and writes it at the std140 offset `derive` computed.\n * Vec / color entries pull from `paramSnapshot[name]` as a `readonly number[]`\n * (writes `min(size/4, value.length)` floats, padding with 0 if shorter for\n * the field's declared width); scalar entries pull a single number.\n *\n * Behaviour:\n * - schema or snapshot `undefined` -> no writes (caller may keep payload\n * baseline).\n * - missing snapshot field -> that field's bytes are left untouched\n * (overlay semantics; same shape the legacy inline overlay had).\n * - field type the writer cannot interpret (texture / sampler / storage_\n * buffer / value-type mismatch) -> skipped silently; `derive` strips\n * non-numeric entries from `uboLayout.entries` so the loop only iterates\n * numeric fields.\n *\n * The writer reads `paramSnapshot` only -- it does NOT call\n * `runtime.assets.get<MaterialAsset>` or cast `firstMaterial`. Gate R-H\n * (plan-strategy section 5.6) bans those paths through\n * `scripts/forgeax/check-render-record-no-material-asset-get.mjs`.\n *\n * standard-pbr remains byte-identical to `buildPbrMaterialUboPayload`: the\n * engine's stock PBR material ships `paramSnapshot: undefined`, so this\n * writer is a no-op on that path; the explicit field writes in the helper\n * above cover every byte. User shaders (sprite-shaped 4 x vec4 or another\n * paramSchema) get their fields written at the offsets declared by derive.\n *\n * @internal export-for-test (consumed inside `recordFrame` + render-system-\n * record.test.ts; not part of the package's public surface).\n */\nexport function applyParamSnapshotToUbo(\n payload: MaterialUboPayload,\n paramSchema: readonly ParamSchemaEntry[] | undefined,\n paramSnapshot:\n | Readonly<Record<string, number | readonly number[] | string | undefined>>\n | undefined,\n): void {\n if (paramSchema === undefined) return;\n if (paramSnapshot === undefined) return;\n const dataView = materialUboDataView(payload);\n const { uboLayout } = derivedParamSchema(paramSchema);\n for (const entry of uboLayout.entries) {\n const value = paramSnapshot[entry.name];\n if (value === undefined) continue;\n if (typeof value === 'number') {\n writeNumericParamValue(dataView, entry, value);\n continue;\n }\n if (Array.isArray(value)) {\n const arr = value as readonly number[];\n writeNumericParamValue(dataView, entry, arr);\n }\n // string values (texture GUIDs) belong to texture bindings, not the\n // UBO; derive's uboLayout.entries already strips non-numeric schema\n // entries, so we will not see a uboLayout entry whose snapshot value\n // is a string under normal flow. Skip defensively if we do.\n }\n}\n\n/**\n * Seed a schema-driven UBO with the defaults declared by its numeric contract.\n *\n * Prepared graphics (VFX and other feature-owned materials) do not pass\n * through the extracted `MaterialSnapshot` writer, so their payload starts as\n * zeroed storage. Applying the schema defaults first keeps that path\n * byte-compatible with the ordinary material writer while preserving the\n * snapshot writer's intentional overlay semantics.\n */\nexport function applyParamSchemaDefaultsToUbo(\n payload: MaterialUboPayload,\n paramSchema: readonly ParamSchemaEntry[] | undefined,\n): void {\n if (paramSchema === undefined) return;\n const defaults: Record<string, number | readonly number[]> = {};\n for (const entry of derivedParamSchema(paramSchema).uboLayout.entries) {\n const schemaEntry = paramSchema.find((candidate) => candidate.name === entry.name);\n const value = schemaEntry?.default;\n if (typeof value === 'number' || Array.isArray(value)) {\n defaults[entry.name] = value as number | readonly number[];\n }\n }\n applyParamSnapshotToUbo(payload, paramSchema, defaults);\n}\n\n/**\n * feat-20260704 M3/w19: shared per-submesh material bind-group assembly, hoisted\n * from the `buildPerSubmeshMaterialBg` closure inside recordMainPass so both the\n * geometry pass and the LDR blend sub-pass (extracted to separate functions)\n * call the identical layout.\n *\n * feat-city-glb Bug 5 (per-submesh transparency): a transparent PBR submesh\n * binds the identical metallic/roughness/normal/emissive/occlusion +\n * Skylight layout the geometry pass uses (the sub-pass previously bound a\n * sprite-only BG, which cannot render a PBR decal). The per-frame closure state\n * (runtime / pipelineState / world / store / skylightResources / the shared\n * material BG cache + counters) is threaded through `deps`; the caller passes\n * the per-submesh material snapshot + entityKey (video texture routing) and sets\n * the dynamic UBO offset itself.\n *\n * @internal\n */\nexport interface PerSubmeshMaterialBgDeps {\n readonly runtime: RenderSystemRuntime;\n readonly pipelineState: PipelineState;\n readonly world: World;\n readonly store: GpuResidencyCache;\n readonly materialSlice: number;\n readonly videoHighPerfAvailable: boolean;\n readonly skylightResources: SkylightBindGroupResources;\n readonly resolveRenderTargetTextureSource?: RenderSystemRuntime['resolveRenderTargetTextureSource'];\n readonly resolveReflectionProbeResources?: (\n materialWorld: World,\n entityKey: number,\n ) => { readonly resources: SkylightBindGroupResources; readonly probeIndex: number } | undefined;\n readonly materialBgShared: Map<string, WeakMap<object, unknown>>;\n /** Cross-frame final BG reuse keyed by the stable source material handle. */\n readonly materialBgAssemblyCache: Map<string, MaterialBgAssemblyCacheEntry>;\n /** Producer-owned numeric scene rows consumed by scene-index PBR draws. */\n readonly sceneMaterialBuffer?: Buffer;\n /** Active transmission backdrop; undefined/null means layout placeholder. */\n readonly transmissionBackdropView?: TextureView | null;\n readonly bindGroupCounts: BindGroupCounts;\n readonly frameState: RenderFrameState;\n}\n\nfunction recordIblMaterialBinding(\n frameState: RenderFrameState,\n materialBgl: BindGroupLayout,\n bindGroup: BindGroup,\n entries: readonly BindGroupEntry[],\n iblStart: number,\n cache: 'hit' | 'miss',\n): void {\n const receipt = frameState.iblBindingInspection;\n if (receipt === undefined) return;\n const skylightBindingStart = entries.findIndex((entry) => entry.binding === iblStart);\n if (skylightBindingStart < 0) return;\n const iblEntries = entries.slice(skylightBindingStart, skylightBindingStart + 7);\n const projected: IblBindingEntryInspection[] = [];\n for (const entry of iblEntries) {\n if (entry.resource.kind === 'externalTexture') continue;\n const value =\n entry.resource.kind === 'buffer' ? entry.resource.value.buffer : entry.resource.value;\n if (typeof value !== 'object' || value === null) continue;\n projected.push({\n binding: entry.binding,\n kind: entry.resource.kind,\n resourceIdentity: getOpaqueResourceIdentity(value as object),\n });\n }\n frameState.iblBindingInspection = {\n ...receipt,\n material: {\n bindGroupIdentity: getOpaqueResourceIdentity(bindGroup as object),\n materialBglIdentity: getOpaqueResourceIdentity(materialBgl as object),\n cache,\n skylightBindingStart: iblEntries[0]?.binding ?? 0,\n entries: projected,\n reflectionBindings: projected.map((entry) => entry.binding),\n },\n errors: [],\n };\n}\n\n/** @internal Exported only so buffer-generation invalidation stays regression-tested. */\nexport function isMaterialBgAssemblyCacheHit(\n cached: MaterialBgAssemblyCacheEntry | undefined,\n material: MaterialSnapshot,\n materialBgl: BindGroupLayout,\n materialBuffer: Buffer,\n skylightResources: SkylightBindGroupResources,\n materialResourceEpoch: number,\n transmissionBackdropView?: TextureView | null,\n sceneMaterialBuffer?: Buffer,\n): cached is MaterialBgAssemblyCacheEntry {\n if (transmissionBackdropView != null) return false;\n return (\n cached?.material === material &&\n cached.materialResourceEpoch === materialResourceEpoch &&\n cached.materialBgl === materialBgl &&\n cached.materialBuffer === materialBuffer &&\n cached.sceneMaterialBuffer === sceneMaterialBuffer &&\n cached.skylightResources.irradianceView === skylightResources.irradianceView &&\n cached.skylightResources.irradianceSampler === skylightResources.irradianceSampler &&\n cached.skylightResources.prefilterView === skylightResources.prefilterView &&\n cached.skylightResources.skylightPrefilterView === skylightResources.skylightPrefilterView &&\n cached.skylightResources.prefilterSampler === skylightResources.prefilterSampler &&\n cached.skylightResources.brdfLutView === skylightResources.brdfLutView &&\n cached.skylightResources.brdfLutSampler === skylightResources.brdfLutSampler &&\n cached.skylightResources.intensityBuffer === skylightResources.intensityBuffer\n );\n}\n\nexport function buildPerSubmeshMaterialBg(\n deps: PerSubmeshMaterialBgDeps,\n submeshMaterial: MaterialSnapshot,\n entityKey: number,\n materialWorld: World = deps.world,\n materialShaderId: string | undefined = submeshMaterial.materialShaderId,\n): BindGroup {\n const {\n runtime,\n pipelineState,\n store,\n materialSlice,\n videoHighPerfAvailable,\n skylightResources,\n resolveRenderTargetTextureSource,\n resolveReflectionProbeResources,\n materialBgShared,\n materialBgAssemblyCache,\n transmissionBackdropView,\n bindGroupCounts,\n frameState,\n } = deps;\n const selectedProbe = resolveReflectionProbeResources?.(materialWorld, entityKey);\n const effectiveSkylightResources = selectedProbe?.resources ?? skylightResources;\n const smMaterialHandle = submeshMaterial.materialHandle;\n const materialCacheKey =\n smMaterialHandle === undefined\n ? undefined\n : `${materialWorld.identity}:${smMaterialHandle}:${materialShaderId ?? ''}:${selectedProbe?.probeIndex ?? 'sky'}`;\n const smHasVideoFields = (submeshMaterial.videoTextureFields?.size ?? 0) > 0;\n const smShaderId = materialShaderId;\n // The cooked shader schema owns the resource ABI. A material snapshot may\n // carry only the authored values (for example a clearcoat-only root omits\n // the standard emissive/occlusion maps), while the Standard template still\n // declares those slots and expects neutral fallbacks to be bound.\n const smSchema =\n (smShaderId !== undefined ? runtime.getParamSchema?.(smShaderId) : undefined) ??\n submeshMaterial.materialParamSchema;\n const smPerShaderBgl =\n smShaderId !== undefined\n ? runtime.getMaterialBindGroupLayout?.(smShaderId, smSchema)\n : undefined;\n const smMaterialBgl = smPerShaderBgl ?? pipelineState.materialBindGroupLayout;\n const standardMaterial = isStandardPbrMaterialShader(smShaderId);\n const physicalFields =\n standardMaterial && smSchema !== undefined ? physicalTextureFields(smSchema) : [];\n // Standard's built-in shader owns the canonical seven-pair user region even\n // when the authored root only declares a subset. Physical maps are appended\n // after the reserved IBL/transmission tail, so compacting this list would\n // shift the shader's IBL bindings and invalidate the render pipeline.\n const smUserRegionFields =\n smPerShaderBgl === undefined || isCanonicalStandardPbrMaterialShader(smShaderId)\n ? BUILTIN_USER_REGION_TEXTURE_FIELDS\n : userRegionTextureFieldOrder(smSchema).filter((field) => !physicalFields.includes(field));\n const hasActiveTransmissionBackdrop = transmissionBackdropView != null;\n const sceneMaterialBuffer = runtime.device.caps.storageBuffer\n ? (deps.sceneMaterialBuffer ?? pipelineState.meshStorageBuffer.buffer)\n : undefined;\n const diagnosticsEnabled = materialDiagnosticsEnabled();\n if (smMaterialHandle !== undefined && !smHasVideoFields && !hasActiveTransmissionBackdrop) {\n const cached =\n materialCacheKey === undefined ? undefined : materialBgAssemblyCache.get(materialCacheKey);\n if (\n isMaterialBgAssemblyCacheHit(\n cached,\n submeshMaterial,\n smMaterialBgl,\n pipelineState.materialUniformBuffer.buffer,\n effectiveSkylightResources,\n store.materialResourceEpoch,\n transmissionBackdropView,\n sceneMaterialBuffer,\n )\n ) {\n if (diagnosticsEnabled) {\n recordIblMaterialBinding(\n frameState,\n smMaterialBgl,\n cached.bindGroup,\n [\n {\n binding: 1 + smUserRegionFields.length * 2,\n resource: { kind: 'textureView', value: effectiveSkylightResources.irradianceView },\n },\n {\n binding: 2 + smUserRegionFields.length * 2,\n resource: { kind: 'sampler', value: effectiveSkylightResources.irradianceSampler },\n },\n {\n binding: 3 + smUserRegionFields.length * 2,\n resource: { kind: 'textureView', value: effectiveSkylightResources.prefilterView },\n },\n {\n binding: 4 + smUserRegionFields.length * 2,\n resource: { kind: 'sampler', value: effectiveSkylightResources.prefilterSampler },\n },\n {\n binding: 5 + smUserRegionFields.length * 2,\n resource: { kind: 'textureView', value: effectiveSkylightResources.brdfLutView },\n },\n {\n binding: 6 + smUserRegionFields.length * 2,\n resource: { kind: 'sampler', value: effectiveSkylightResources.brdfLutSampler },\n },\n {\n binding: 7 + smUserRegionFields.length * 2,\n resource: {\n kind: 'buffer',\n value: { buffer: effectiveSkylightResources.intensityBuffer },\n },\n },\n ],\n 1 + smUserRegionFields.length * 2,\n 'hit',\n );\n }\n return cached.bindGroup;\n }\n }\n let materialResourcesResident = true;\n const smSamplerForField = (field: string | undefined): Sampler => {\n const handle = field === undefined ? undefined : submeshMaterial.samplerHandles?.get(field);\n if (handle === undefined) return pipelineState.defaultSampler;\n const sampler = residentSampler(materialWorld, store, runtime, handle);\n if (sampler === undefined) materialResourcesResident = false;\n return sampler ?? pipelineState.defaultSampler;\n };\n const smBaseEntries: BindGroupEntry[] = [\n {\n binding: 0,\n resource: {\n kind: 'buffer' as const,\n value: {\n buffer: pipelineState.materialUniformBuffer.buffer,\n offset: 0,\n size: materialSlice,\n },\n },\n },\n ];\n const smBglPairCount = smUserRegionFields.length;\n for (let fi = 0; fi < smBglPairCount; fi++) {\n const field = smUserRegionFields[fi];\n const samplerBinding = 1 + fi * 2;\n const textureBinding = samplerBinding + 1;\n let smView: TextureView =\n field !== undefined\n ? defaultViewForUserRegionField(field, pipelineState, smSchema)\n : pipelineState.defaultWhiteTextureView;\n const smVideoClip =\n field !== undefined ? submeshMaterial.videoTextureFields?.get(field) : undefined;\n const smTargetSource =\n field === undefined\n ? undefined\n : materialRenderTargetSourceForField(\n submeshMaterial,\n field,\n resolveRenderTargetTextureSource,\n );\n if (smTargetSource !== undefined) {\n // The Renderer host resolves the generation-checked physical view. A\n // candidate is never exposed here; until its matching FrameReceipt\n // completes, the material remains on the neutral fallback.\n if (smTargetSource.textureView !== undefined) smView = smTargetSource.textureView;\n else materialResourcesResident = false;\n } else if (smVideoClip !== undefined) {\n const view = videoTextureView(\n materialWorld,\n runtime.dynamicTextureStore,\n runtime,\n entityKey,\n smVideoClip,\n videoHighPerfAvailable,\n );\n if (view !== undefined) smView = view;\n } else {\n const smHandle =\n field === 'emissiveTexture'\n ? submeshMaterial.emissiveTexture\n : field === 'occlusionTexture'\n ? submeshMaterial.occlusionTexture\n : field !== undefined\n ? submeshMaterial.textureHandles?.get(field)\n : undefined;\n if (smHandle !== undefined) {\n const view = residentTextureView(materialWorld, store, runtime, smHandle);\n if (view !== undefined) smView = view;\n else materialResourcesResident = false;\n }\n }\n smBaseEntries.push(\n {\n binding: samplerBinding,\n resource: { kind: 'sampler' as const, value: smSamplerForField(field) },\n },\n {\n binding: textureBinding,\n resource: { kind: 'textureView' as const, value: smView },\n },\n );\n }\n // Physical Standard maps are deliberately appended after the stable IBL /\n // transmission tail. Keep their resource projection separate from the\n // user-region loop so the slot order is the same as\n // `appendTextureInjection(afterTransmission, physicalFields)` in the\n // layout owner.\n const physicalTextureInjections: TextureInjectionResource[] = [];\n for (let slot = 0; slot < physicalFields.length; slot += 1) {\n const field = physicalFields[slot];\n if (field === undefined) continue;\n let view = defaultViewForUserRegionField(field, pipelineState, smSchema);\n const targetSource = materialRenderTargetSourceForField(\n submeshMaterial,\n field,\n resolveRenderTargetTextureSource,\n );\n if (targetSource !== undefined) {\n if (targetSource.textureView !== undefined) view = targetSource.textureView;\n else materialResourcesResident = false;\n } else {\n const handle = submeshMaterial.textureHandles?.get(field);\n if (handle !== undefined) {\n const resident = residentTextureView(materialWorld, store, runtime, handle);\n if (resident !== undefined) view = resident;\n else materialResourcesResident = false;\n }\n }\n physicalTextureInjections.push({\n slot: STANDARD_PHYSICAL_TEXTURE_FIELDS.indexOf(\n field as (typeof STANDARD_PHYSICAL_TEXTURE_FIELDS)[number],\n ),\n sampler: smSamplerForField(field),\n view,\n });\n }\n // The backdrop is a full mip-chain view owned by the pipeline. Reuse the\n // pipeline's existing filtering/clamp sampler for screen-space sampling;\n // the material default sampler intentionally keeps repeat addressing for\n // authored UV textures and is not a backdrop sampler.\n const transmissionSampler =\n transmissionBackdropView != null\n ? effectiveSkylightResources.prefilterSampler\n : pipelineState.defaultSampler;\n const smMergedEntries = assembleMaterialWithSkylightEntries(\n smBaseEntries,\n effectiveSkylightResources,\n transmissionBackdropAvailable(runtime.device.limits.maxSampledTexturesPerShaderStage)\n ? ({\n sampler: transmissionSampler,\n ...(transmissionBackdropView === undefined\n ? {}\n : { backdropView: transmissionBackdropView }),\n } satisfies TransmissionBindGroupResources)\n : null,\n physicalTextureInjections,\n );\n // Storage-capable devices share one Standard material BGL with the\n // scene-index GPU lane. Even direct draws need a complete entry for\n // binding(46), although their shader does not read the scene table. Reuse\n // the storage-backed mesh table as a neutral placeholder until a\n // producer-owned GPU scene table is available; GPU-driven draws replace it\n // with `deps.sceneMaterialBuffer`.\n if (runtime.device.caps.storageBuffer) {\n smMergedEntries.push({\n binding: 46,\n resource: {\n kind: 'buffer' as const,\n value: {\n buffer: deps.sceneMaterialBuffer ?? pipelineState.meshStorageBuffer.buffer,\n },\n },\n });\n }\n const createBindGroup = (): BindGroup => {\n const result = runtime.device.createBindGroup({\n label: 'pbr-material-skylight-bg',\n layout: smMaterialBgl,\n entries: smMergedEntries,\n });\n if (!result.ok) throw result.error;\n return result.value;\n };\n const materialCacheHandles = smMergedEntries.map((entry) => extractEntryResourceHandle(entry));\n if (\n diagnosticsEnabled &&\n submeshMaterial.textureHandles === undefined &&\n smMaterialHandle !== undefined\n ) {\n console.error(\n `[render-material] scalar material cache handles: ${JSON.stringify({\n entityKey,\n materialHandle: smMaterialHandle,\n shader: smShaderId,\n paramSnapshot: submeshMaterial.paramSnapshot,\n handleTypes: materialCacheHandles.map((handle) => typeof handle),\n })}`,\n );\n }\n if (\n diagnosticsEnabled &&\n materialCacheHandles.some((handle) => typeof handle !== 'object' || handle === null)\n ) {\n console.error(\n `[render-material] invalid material cache handle: ${JSON.stringify({\n entityKey,\n materialHandle: smMaterialHandle,\n shader: smShaderId,\n entries: smMergedEntries.map((entry, index) => ({\n index,\n binding: entry.binding,\n kind: entry.resource.kind,\n handleType: typeof materialCacheHandles[index],\n })),\n })}`,\n );\n }\n const smBindGroup = hasActiveTransmissionBackdrop\n ? createBindGroup()\n : getOrCreatePerEntity(\n materialBgShared,\n smShaderId ?? '',\n materialCacheHandles,\n 'material-shared',\n createBindGroup,\n bindGroupCounts,\n );\n if (diagnosticsEnabled) {\n recordIblMaterialBinding(\n frameState,\n smMaterialBgl,\n smBindGroup,\n smMergedEntries,\n smBaseEntries.length,\n 'miss',\n );\n }\n if (\n smMaterialHandle !== undefined &&\n !smHasVideoFields &&\n materialResourcesResident &&\n !hasActiveTransmissionBackdrop\n ) {\n if (materialCacheKey !== undefined) {\n materialBgAssemblyCache.set(materialCacheKey, {\n material: submeshMaterial,\n materialResourceEpoch: store.materialResourceEpoch,\n materialBgl: smMaterialBgl,\n materialBuffer: pipelineState.materialUniformBuffer.buffer,\n ...(sceneMaterialBuffer === undefined ? {} : { sceneMaterialBuffer }),\n skylightResources: effectiveSkylightResources,\n bindGroup: smBindGroup,\n });\n }\n }\n return smBindGroup;\n}\n\nconst ZERO_SKYLIGHT_PAYLOAD = new Float32Array([0, 0, 0, 0, 0, 0, 0, 1]);\n\n/** The same scene resources back material bindings in depth and color passes. */\n/**\n * Resolve the renderer-owned Skylight bundle for both ordinary geometry and\n * prepared RenderFeature materials. Feature preparation runs before the\n * main pass is encoded, so it cannot rely on the geometry pass to initialize\n * the intensity buffer or to select the current IBL views. Keeping this\n * small argument-based helper as the single resolver makes the two paths use\n * identical resources while retaining the existing frame-local write.\n */\nexport function resolveMaterialSkylight(\n runtime: Pick<RenderSystemRuntime, 'device' | 'deviceScope'>,\n pipelineState: Pick<PipelineState, 'skylightFallback'>,\n skylight: SkylightSnapshot | undefined,\n skylightCount: number,\n environmentIbl?: _InternalRenderPipelineContext['environmentIbl'],\n) {\n const skylightFallback = pipelineState.skylightFallback;\n if (skylightFallback === null) {\n throw new RhiError({\n code: 'webgpu-runtime-error',\n expected: 'pipelineState.skylightFallback != null when PBR pipeline is active',\n hint: 'createRenderer must allocate skylightFallback alongside the PBR pipeline (D-5 round-4)',\n });\n }\n // feat-20260520-skylight-ibl-cubemap M4 round-4 / t60 (D-5 round-4):\n // select active vs fallback Skylight resources by `skylightCount` from\n // the extract stage. Active path reaches into the per-device\n // `IblPipelineCache` slots (irradianceView / prefilterView / brdfLutView)\n // populated by the internal equirect-to-cubemap projection; fallback uses the\n // 1x1-zero identity bundle that converges ambient to 0 (D-4 physical\n // convergence -- no `if (hasSkylight)` shader branch).\n // The samplers are reused from `skylightFallback.sampler` for both\n // paths (linear / clamp-to-edge is correct for IBL cube + 2D LUT\n // sampling either way). The intensity uniform is rewritten per-frame\n // when active so `sampleIblSpecular * intensity` carries the user's\n // Skylight.intensity value; fallback keeps intensity=0 (createSkylightFallback\n // seed) so ambient = 0 even when the same buffer is shared.\n let activeViews: { irr: TextureView; pref: TextureView; brdf: TextureView } | undefined;\n // Per-frame Skylight uniform: std140 32 B = [intensity, colorR, colorG,\n // colorB, rotation quaternion]. Default to all-zero so a transition from \"has Skylight\" ->\n // \"no Skylight\" does not leak the prior frame's ambient (intensity 0\n // muzzles everything, including the white fallback irradiance cube).\n runtime.device.queue.writeBuffer(skylightFallback.intensityBuffer, 0, ZERO_SKYLIGHT_PAYLOAD);\n if (skylight !== undefined && skylightCount >= 1) {\n // A Skylight exists. Write its intensity + color regardless of whether\n // a cubemap is bound: with a cubemap the IBL views below light the\n // ambient; WITHOUT one, the white fallback irradiance cube + this color\n // give an instant solid-color ambient (downstream integration #4) with\n // no async precompute. The white fallback only contributes when a\n // Skylight is present because the zero-payload above sets intensity 0\n // when no Skylight exists.\n const [cr, cg, cb] = skylight.color;\n const [qx, qy, qz, qw] = skylight.rotation;\n const uniformPayload = new Float32Array([skylight.intensity, cr, cg, cb, qx, qy, qz, qw]);\n runtime.device.queue.writeBuffer(skylightFallback.intensityBuffer, 0, uniformPayload);\n const cache = getOrCreateIblCache(runtime.deviceScope);\n if (\n cache.irradianceView !== undefined &&\n cache.prefilterView !== undefined &&\n cache.brdfLutView !== undefined\n ) {\n activeViews = {\n irr: cache.irradianceView,\n pref: cache.prefilterView,\n brdf: cache.brdfLutView,\n };\n }\n }\n if (environmentIbl !== undefined && skylight !== undefined && skylight.equirectHandle === 0) {\n activeViews = {\n irr: environmentIbl.irradiance,\n pref: environmentIbl.prefilter,\n brdf: activeViews?.brdf ?? skylightFallback.brdfLutView,\n };\n }\n const skylightResources =\n activeViews !== undefined\n ? {\n irradianceView: activeViews.irr,\n irradianceSampler: skylightFallback.sampler,\n prefilterView: activeViews.pref,\n prefilterSampler: skylightFallback.sampler,\n brdfLutView: activeViews.brdf,\n brdfLutSampler: skylightFallback.sampler,\n intensityBuffer: skylightFallback.intensityBuffer,\n }\n : {\n irradianceView: skylightFallback.irradianceView,\n irradianceSampler: skylightFallback.sampler,\n prefilterView: skylightFallback.prefilterView,\n prefilterSampler: skylightFallback.sampler,\n brdfLutView: skylightFallback.brdfLutView,\n brdfLutSampler: skylightFallback.sampler,\n intensityBuffer: skylightFallback.intensityBuffer,\n };\n return { skylightResources, activeViews };\n}\n\n/** The same scene resources back material bindings in depth and color passes. */\nexport function prepareMaterialSkylight(c: _InternalRenderPipelineContext) {\n return resolveMaterialSkylight(\n c.runtime,\n c.pipelineState,\n c.skylight,\n c.skylightCount,\n c.environmentIbl,\n );\n}\n","// @forgeax/engine-runtime - RenderSystem record stage: main-pass geometry draws.\n// feat-20260704 M5/w31: further-split from main-pass.ts (AC-05 <=1500 lines/file).\n// recordGeometryDraws + resolveGeometryInstanceBuffer, moved verbatim.\n\nimport type { World } from '@forgeax/engine-ecs';\nimport {\n type BindGroup,\n type Buffer,\n type RenderPipeline,\n RhiError,\n type RhiRenderPassEncoder,\n} from '@forgeax/engine-rhi';\nimport { STANDARD_TEXTURE_MASK_OVERRIDE } from '@forgeax/engine-shader';\nimport type { ParamSchemaEntry, PassKind, PrimitiveTopology } from '@forgeax/engine-types';\nimport { gpuDrivenDrawKey, gpuDrivenSourceDrawItemIndex } from '../extract/gpu-driven';\nimport { GpuBuffer } from '../gpu-resource';\nimport {\n GPU_BUFFER_USAGE_COPY_DST,\n GPU_BUFFER_USAGE_STORAGE,\n GPU_BUFFER_USAGE_UNIFORM,\n} from '../gpu-usage';\nimport { createHdrpSkinUnifiedBindGroup, getOrCreateHdrpBuffers } from '../hdrp-buffers';\nimport type { InstanceBufferCacheEntry } from '../instance-buffer-cache';\nimport { type InstanceCollectionFailureCode, instanceUploadRangesForResident } from '../instances';\nimport { SPRITE_PREMULTIPLIED_ALPHA_BLEND } from '../materials';\nimport {\n createPbrSkinMeshBindGroupEntries,\n isCanonicalStandardPbrMaterialShader,\n isStandardPbrMaterialShader,\n isStandardPbrSkinMaterialShader,\n materialBindGroupLayoutIdentity,\n pbrSkinMeshDynamicOffsets,\n physicalTextureFields,\n SKIN_MATERIAL_SHADER_ID,\n} from '../pbr-pipeline';\nimport {\n renderStateHash,\n standardStorageVariantSet,\n standardTopologyVariantSet,\n variantSetFromVertexLayoutProjection,\n} from '../pipeline-spec';\nimport type { PointsLinesRecordPlan } from '../points-lines/record';\nimport { POINTS_LINES_MATERIAL_SHADER_ID } from '../points-lines/record';\nimport type { RenderRecordPhase } from '../render-contract';\nimport type { DispatchEntry, MaterialSnapshot, RenderableSnapshot } from '../render-system-extract';\nimport {\n PROBE_BLEND_RECORD_BYTE_SIZE,\n PROBE_BLEND_RECORD_STRIDE,\n probeBlendRecordOffset,\n} from '../scene/probe-blend-record';\nimport {\n getOpaqueResourceIdentity,\n instanceCollectionCacheKey,\n worldEntityKey,\n} from './frame-snapshot';\nimport {\n geometryRenderStateForTopology,\n isEntityFullyTransparent,\n selectGeometryPipeline,\n selectMaterialGroup2,\n} from './main-pass-material';\nimport {\n getOrCreateFromChain,\n INSTANCE_STORAGE_STRIDE_FLOATS,\n INSTANCE_UBO_FULL_ARRAY_BYTES,\n MAX_UNIFORM_INSTANCES,\n MESH_PER_ENTITY_STRIDE,\n MESH_SSBO_BYTES,\n MESH_UBO_FULL_ARRAY_BYTES,\n packInstanceStorageBuffer,\n} from './mesh-ssbo';\nimport type { _InternalRenderPipelineContext, MaterialShaderPipelineEntry } from './render-context';\nimport { MATERIAL_PER_ENTITY_STRIDE } from './render-context';\nimport { POINTS_LINES_VIEW_SLOT_STRIDE, writePointsLinesViewUbo } from './view-ubo';\n\n/** Temporal ignores authored color entry points; opaque duplicates are idempotent. */\nexport function sameOpaqueTemporalDraw(a: DispatchEntry, b: DispatchEntry): boolean {\n return (\n (isStandardPbrMaterialShader(a.materialShaderId) ||\n (a.tags.SurfaceKind === 'standard' &&\n b.tags.SurfaceKind === 'standard' &&\n a.tags.SurfaceModule === b.tags.SurfaceModule)) &&\n a.materialShaderId === b.materialShaderId &&\n a.renderState?.blend === undefined &&\n b.renderState?.blend === undefined &&\n a.renderState?.stencil === undefined &&\n b.renderState?.stencil === undefined &&\n a.stencilReference === b.stencilReference &&\n renderStateHash(a.renderState) === renderStateHash(b.renderState)\n );\n}\n\ntype GeometryInstanceDraw = {\n readonly instanceBuffer: Buffer;\n readonly instanceBindGroup: BindGroup;\n /** -1 means the no-probe layout and therefore no dynamic offset. */\n readonly probeOffset: number;\n readonly instanceCount: number;\n};\n\ntype InstanceUploadResult =\n | {\n readonly ok: true;\n readonly ranges: readonly { readonly start: number; readonly end: number }[];\n readonly bytes: number;\n }\n | {\n readonly ok: false;\n readonly ranges: readonly { readonly start: number; readonly end: number }[];\n readonly bytes: number;\n };\n\ntype GeometryBindingState = {\n pipeline: RenderPipeline | null;\n instancesBuffer: Buffer | null;\n probeOffset: number;\n};\n\nfunction materialDiagnosticsEnabled(): boolean {\n if (typeof globalThis !== 'object' || globalThis === null || !('process' in globalThis)) {\n return false;\n }\n const processValue = (\n globalThis as {\n readonly process?: { readonly env?: Record<string, string | undefined> };\n }\n ).process;\n return processValue?.env?.FORGEAX_MATERIAL_DIAGNOSTICS === '1';\n}\n\ntype MaterialPipelineLookup = {\n readonly materialShaderId: string;\n readonly isHdrTarget: boolean;\n readonly renderStateKey: string;\n readonly topology: PrimitiveTopology;\n readonly indexFormat: 'uint16' | 'uint32';\n readonly variantSet: string | undefined;\n readonly vertexEntry: string | undefined;\n readonly fragmentEntry: string | undefined;\n readonly passKind: PassKind;\n readonly layoutProjection: import('@forgeax/engine-geometry').VertexLayoutProjection;\n readonly sampleCount: number;\n readonly colorFormatOverride: GPUTextureFormat | undefined;\n readonly additionalColorFormats: readonly GPUTextureFormat[] | undefined;\n readonly textureMask: number | undefined;\n readonly handle: MaterialShaderPipelineEntry | null;\n};\n\ntype GeometryRecordProfileSegment = 'material-bind-groups' | 'pipeline-selection' | 'draw-submit';\n\ntype GeometryRenderState = ReturnType<typeof geometryRenderStateForTopology>;\n\n/** Coverage is a dedicated temporal material variant, not a color/alpha tap. */\nexport function variantSetForCoveragePass(\n variantSet: string | undefined,\n coverageOnly: boolean,\n): string | undefined {\n if (!coverageOnly) return variantSet;\n if (variantSet?.includes('COVERAGE_ONLY=')) return variantSet;\n return variantSet === undefined || variantSet === ''\n ? 'COVERAGE_ONLY=true'\n : `${variantSet}+COVERAGE_ONLY=true`;\n}\n\nexport function isHdrGeometryTarget(\n tonemapActive: boolean,\n colorFormatOverride: GPUTextureFormat | undefined,\n): boolean {\n return colorFormatOverride === undefined ? tonemapActive : colorFormatOverride === 'rgba16float';\n}\n\nfunction gpuDrivenDrawIndicesBySubmesh(\n source: RenderableSnapshot,\n mesh: _InternalRenderPipelineContext['validatedOrdered'][number]['mesh'],\n): ReadonlyMap<number, number> {\n const draws = source.gpuDrivenDraws;\n if (draws === undefined || draws.length === 0) return new Map();\n const indices = new Map<number, number>();\n let hasStableSourceIdentity = false;\n for (const [compactIndex, draw] of draws.entries()) {\n const drawItemIndex = draw.drawItemIndex;\n if (drawItemIndex === undefined) continue;\n hasStableSourceIdentity = true;\n if (mesh.submeshes[drawItemIndex] !== undefined) indices.set(drawItemIndex, compactIndex);\n }\n if (hasStableSourceIdentity) return indices;\n\n // Legacy snapshots predating drawItemIndex are matched by their compact\n // geometry facts. New extracted snapshots never take this path.\n let nonIndexedFirst = 0;\n let drawCursor = 0;\n for (const [submeshIndex, submesh] of mesh.submeshes.entries()) {\n const first = mesh.indexed ? submesh.indexOffset : nonIndexedFirst;\n const count = mesh.indexed ? submesh.indexCount : submesh.vertexCount;\n if (!mesh.indexed) nonIndexedFirst += submesh.vertexCount;\n const draw = draws[drawCursor];\n if (\n draw !== undefined &&\n draw.first === first &&\n draw.count === count &&\n draw.materialSlot === submesh.materialSlot &&\n draw.topology === submesh.topology\n ) {\n indices.set(submeshIndex, drawCursor);\n drawCursor += 1;\n }\n }\n return indices;\n}\n\nfunction isGpuDrivenMainClaimedSubmesh(\n c: _InternalRenderPipelineContext,\n source: RenderableSnapshot,\n submeshIndex: number,\n drawIndices: ReadonlyMap<number, number>,\n): boolean {\n const drawItemIndex = drawIndices.get(submeshIndex);\n const draw = drawItemIndex === undefined ? undefined : source.gpuDrivenDraws?.[drawItemIndex];\n if (drawItemIndex === undefined || draw === undefined) return false;\n const material = source.materials[draw.materialSlot] ?? source.material;\n const sourceDrawItemIndex = gpuDrivenSourceDrawItemIndex(draw, drawItemIndex);\n return (\n c.gpuDrivenDrawKeys?.has(\n gpuDrivenDrawKey(\n worldEntityKey(source.worldId, source.entityKey),\n material.materialHandle ?? -1,\n sourceDrawItemIndex,\n ),\n ) === true\n );\n}\n\n/**\n * Select the transmission shader axis from authored material data, not the\n * canonical boot schema. The latter reserves transmission fields for the\n * shared Standard ABI even when a material remains base-only.\n */\nexport function requestsStandardTransmissionVariant(\n material: Pick<MaterialSnapshot, 'materialShaderId' | 'paramSnapshot'>,\n): boolean {\n return (\n material.materialShaderId === 'forgeax::default-standard-pbr' &&\n material.paramSnapshot?.transmission !== undefined\n );\n}\n\nfunction recordIblPipelineBinding(\n c: _InternalRenderPipelineContext,\n material: MaterialSnapshot,\n pipeline: RenderPipeline,\n materialGroup: BindGroup,\n): void {\n const receipt = c.frameState.iblBindingInspection;\n if (receipt === undefined || !isStandardPbrMaterialShader(material.materialShaderId)) return;\n const materialBgl =\n c.runtime.getMaterialBindGroupLayout?.(\n material.materialShaderId ?? 'forgeax::default-standard-pbr',\n ) ?? c.pipelineState.materialBindGroupLayout;\n c.frameState.iblBindingInspection = {\n ...receipt,\n pipeline: {\n pipelineIdentity: getOpaqueResourceIdentity(pipeline as object),\n effectiveMaterialLayoutIdentity: effectiveMaterialLayoutIdentity(\n material.materialShaderId ?? 'forgeax::default-standard-pbr',\n material.materialParamSchema,\n ),\n materialBglIdentity: getOpaqueResourceIdentity(materialBgl as object),\n bindGroupIdentity: getOpaqueResourceIdentity(materialGroup as object),\n drawFrameId: c.frameState.frameNumber,\n },\n };\n const materialReceipt = c.frameState.iblBindingInspection.material;\n const errors: string[] = [];\n if (\n materialReceipt !== undefined &&\n materialReceipt.materialBglIdentity !== getOpaqueResourceIdentity(materialBgl as object)\n ) {\n errors.push('material-pipeline-bgl-identity-mismatch');\n }\n if (\n materialReceipt !== undefined &&\n materialReceipt.bindGroupIdentity !== getOpaqueResourceIdentity(materialGroup as object)\n ) {\n errors.push('material-bind-group-identity-mismatch');\n }\n if (materialReceipt !== undefined) {\n const expectedResourceIdentities = [\n receipt.resources.irradiance.viewIdentity,\n receipt.resources.irradiance.samplerIdentity,\n receipt.resources.prefilter.viewIdentity,\n receipt.resources.prefilter.samplerIdentity,\n receipt.resources.brdfLut.viewIdentity,\n receipt.resources.brdfLut.samplerIdentity,\n receipt.resources.intensityBufferIdentity,\n ];\n const actualResourceIdentities = materialReceipt.entries\n .filter((entry) => entry.binding >= materialReceipt.skylightBindingStart)\n .slice(0, expectedResourceIdentities.length)\n .map((entry) => entry.resourceIdentity);\n if (\n actualResourceIdentities.length !== expectedResourceIdentities.length ||\n actualResourceIdentities.some(\n (identity, index) => identity !== expectedResourceIdentities[index],\n )\n ) {\n errors.push('material-ibl-resource-identity-mismatch');\n }\n }\n c.frameState.iblBindingInspection = {\n ...c.frameState.iblBindingInspection,\n status: errors.length === 0 ? 'binding-chain-consistent' : 'binding-chain-mismatch',\n errors,\n };\n}\n\nconst SHARED_BOOT_MATERIAL_SHADER_IDS = new Set([\n 'forgeax::default-unlit',\n 'forgeax::default-shadow-caster',\n 'forgeax::sprite',\n 'forgeax::sprite-lit',\n 'forgeax::default-sprite',\n 'forgeax::msdf-text',\n 'forgeax::default-standard-pbr',\n 'forgeax::pbr-skin',\n 'forgeax::default-standard-pbr-skin',\n]);\n\n/**\n * Returns the layout identity that can distinguish a material PSO in the\n * record cache. Shared boot shaders keep the boot layout identity even when a\n * manifest exposes a schema; Standard PBR only opts into a schema-derived\n * identity when authored clearcoat texture bindings extend that layout.\n */\nexport function effectiveMaterialLayoutIdentity(\n materialShaderId: string,\n materialParamSchema?: readonly ParamSchemaEntry[],\n): string | undefined {\n if (materialParamSchema === undefined) return undefined;\n const hasStandardPhysicalMaps =\n isStandardPbrMaterialShader(materialShaderId) &&\n physicalTextureFields(materialParamSchema).length > 0;\n if (SHARED_BOOT_MATERIAL_SHADER_IDS.has(materialShaderId) && !hasStandardPhysicalMaps) {\n return undefined;\n }\n return materialBindGroupLayoutIdentity(materialShaderId, materialParamSchema);\n}\n\n/**\n * Resolve the depth contract for a geometry pass without changing the base\n * material state. Temporal scene-data shares the main pass depth attachment:\n * it is read-only and accepts the equal depth produced by the shared raster\n * projection, while motion varyings remain unjittered. It rejects fragments behind the visible\n * surface.\n */\nexport function geometryRenderStateForPass(\n base: GeometryRenderState,\n passKind: PassKind,\n coverageOnly = false,\n): GeometryRenderState {\n if (passKind !== 'temporal') return base;\n return {\n ...base,\n depthWriteEnabled: coverageOnly,\n depthCompare: 'less-equal' as const,\n };\n}\n\nfunction geometryRecordPhase(\n passKind: PassKind,\n segment: GeometryRecordProfileSegment,\n): RenderRecordPhase {\n const pass = passKind === 'deferred' ? 'g-buffer' : 'forward';\n return `record/graph-execute/${pass}/${segment}` as RenderRecordPhase;\n}\n\nfunction profileGeometrySegment<T>(\n c: _InternalRenderPipelineContext,\n passKind: PassKind,\n segment: GeometryRecordProfileSegment,\n action: () => T,\n): T {\n const profilePhase = c.profilePhase;\n return profilePhase === undefined\n ? action()\n : profilePhase(geometryRecordPhase(passKind, segment), action);\n}\n\nfunction submitSubmeshDraws(\n pass: RhiRenderPassEncoder,\n state: GeometryBindingState,\n pipeline: RenderPipeline,\n instanceDraws: readonly GeometryInstanceDraw[],\n indexed: boolean,\n indexCount: number,\n vertexCount: number,\n indexOffset: number,\n onDraw?: () => void,\n): void {\n if (state.pipeline !== pipeline) {\n pass.setPipeline(pipeline);\n state.pipeline = pipeline;\n }\n for (const instanceDraw of instanceDraws) {\n if (\n instanceDraw.instanceBuffer !== state.instancesBuffer ||\n instanceDraw.probeOffset !== state.probeOffset\n ) {\n if (instanceDraw.probeOffset < 0) {\n pass.setBindGroup(3, instanceDraw.instanceBindGroup);\n } else {\n pass.setBindGroup(3, instanceDraw.instanceBindGroup, [instanceDraw.probeOffset]);\n }\n state.instancesBuffer = instanceDraw.instanceBuffer;\n state.probeOffset = instanceDraw.probeOffset;\n }\n if (indexed) {\n pass.drawIndexed(indexCount, instanceDraw.instanceCount, indexOffset, 0, 0);\n } else {\n pass.draw(vertexCount, instanceDraw.instanceCount, 0, 0);\n }\n onDraw?.();\n }\n}\n\n/**\n * Issues a prepared Points/Lines draw into the already-open geometry pass.\n * Pass lifetime, attachments, bind groups, and submission remain owned by the\n * existing main-pass interpreter.\n */\nexport function recordPointsLinesDraw(\n pass: RhiRenderPassEncoder,\n plan: PointsLinesRecordPlan,\n): void {\n if (plan.drawCount === 0) return;\n if (plan.indexCount > 0) {\n pass.drawIndexed(plan.indexCount, 1, 0, 0, 0);\n return;\n }\n pass.draw(plan.vertexCount, 1, 0, 0);\n}\n\n/**\n * feat-20260704 M3/w19: per-entity geometry (main colour) draw loop, extracted\n * verbatim from recordMainPass. Walks `c.validatedOrdered`, selects the\n * per-entity / per-submesh PBR / unlit / skin pipeline, uploads the per-submesh\n * material UBO slices, binds view / material / mesh / instances bind groups, and\n * issues the per-submesh draws into the already-begun geometry `pass`. Fully-\n * transparent entities are skipped here (drawn in the LDR blend sub-pass);\n * mixed meshes draw their opaque submeshes here and skip transparent submeshes.\n * The pass-selector match set, per-entity material-slot start table, MSAA sample\n * count, Standard group(2) bind group, fallback mesh group(2) bind group, and\n * the shared per-submesh material BG builder are threaded in explicitly.\n *\n * @internal\n */\nexport function recordGeometryDraws(\n c: _InternalRenderPipelineContext,\n pass: RhiRenderPassEncoder,\n matchedMaterials: ReadonlyMap<number, ReadonlySet<number>> | null,\n materialSlotIndices: readonly (readonly number[])[],\n sampleCount: number,\n meshGroup2: BindGroup | null,\n meshBindGroup: BindGroup | null,\n resolveMaterialBindGroup: (\n materialSlot: number,\n submeshMaterial: MaterialSnapshot,\n entityKey: number,\n materialWorld: World,\n materialShaderId?: string,\n ) => BindGroup,\n passKind: PassKind = 'forward',\n selectedDispatch?: readonly DispatchEntry[],\n colorFormats: readonly GPUTextureFormat[] = [],\n coverageOnly = false,\n): void {\n const {\n runtime,\n pipelineState,\n frameState,\n bindGroupCounts,\n dispatchCounts,\n tonemapActive,\n msaaActive,\n validatedOrdered,\n splitLdrSprite,\n viewBindGroup,\n viewBindGroupDynamicOffset = 0,\n } = c;\n const materialPasses = new Map<number, Map<number, DispatchEntry[]>>();\n for (const dispatch of selectedDispatch ?? []) {\n let byMaterial = materialPasses.get(dispatch.renderableIndex);\n if (byMaterial === undefined) {\n byMaterial = new Map();\n materialPasses.set(dispatch.renderableIndex, byMaterial);\n }\n const passes = byMaterial.get(dispatch.materialHandle);\n if (passes === undefined) byMaterial.set(dispatch.materialHandle, [dispatch]);\n else if (\n passKind !== 'temporal' ||\n !passes.some((previous) => sameOpaqueTemporalDraw(previous, dispatch))\n )\n passes.push(dispatch);\n }\n const diagnosticsEnabled = materialDiagnosticsEnabled();\n const colorFormatOverride = c.transparentColorFormat as GPUTextureFormat | undefined;\n // The prepared Standard topology is the frame authority. A bind-group\n // identity is only a resource result; using it to infer the shader lane\n // would silently fall back to URP when the clustered resource is missing.\n const clusteredLighting = c.standardLighting?.kind === 'clustered';\n // A no-tone frame may still render into the graph-owned rgba16float target\n // (the linear-LDR route). Shader variants must follow the attachment's\n // numeric domain rather than the camera's tone-map switch, otherwise the\n // LDR/OETF fragment entry point is encoded once here and again by the\n // output transform.\n const isHdrTarget = isHdrGeometryTarget(tonemapActive, colorFormatOverride);\n const withCoverageVariant = (variantSet: string | undefined): string | undefined =>\n variantSetForCoveragePass(variantSet, coverageOnly);\n let lastVertexBuffer: GpuBuffer | null = null;\n let lastIndexBuffer: GpuBuffer | null = null;\n const bindingState: GeometryBindingState = {\n pipeline: null,\n instancesBuffer: null,\n probeOffset: -1,\n };\n const identityInstanceBuffer = pipelineState.identityInstanceBuffer;\n const identityInstanceDraws: readonly GeometryInstanceDraw[] = [\n {\n instanceBuffer: identityInstanceBuffer,\n instanceBindGroup: resolveGeometryInstancesBindGroup(c, identityInstanceBuffer, undefined),\n probeOffset: -1,\n instanceCount: 1,\n },\n ];\n const profilePhase = c.profilePhase;\n const materialGroup1DynamicOffsets = new Uint32Array(1);\n const meshGroup2DynamicOffsets = [0];\n let lastStencilReference: number | null = null;\n // feat-20260625-refactor-sprite-as-transparent-mesh M3 / w14 (D-7):\n // sprite PSO selection no longer maintains a dedicated tag — the\n // generic materialShaderId path covers sprite via the same per-\n // MaterialShader pipeline cache PBR / unlit use. The 4-placeholder\n // BG bindings (D-1 candidate b) still apply via the generic per-\n // submesh BG construction below; sprite's `forgeax::sprite` shader\n // module ships through the same cache key formula.\n // Pipeline identity does not include material parameters or the material\n // asset handle. Keying this cache by material handle therefore misses for\n // every distinct asset even when all assets use the same PSO. The nested\n // table keeps lookup O(1) by shader and immutable render-state identity; the\n // renderer's authoritative cache still owns lifetime/invalidation, while\n // this frame-local table removes the hot call/lookup overhead.\n const materialPipelineLookupCache = new Map<string, Map<string, MaterialPipelineLookup[]>>();\n const recordOcclusionCandidate = (draw: () => void): void => {\n draw();\n };\n const resolveMaterialPipeline = (\n materialShaderId: string,\n renderState: MaterialSnapshot['renderState'],\n topology: PrimitiveTopology,\n indexFormat: 'uint16' | 'uint32',\n variantSet: string | undefined,\n colorFormat: GPUTextureFormat | undefined,\n layoutProjection: import('@forgeax/engine-geometry').VertexLayoutProjection,\n vertexEntry?: string,\n fragmentEntry?: string,\n textureMask?: number,\n ): MaterialShaderPipelineEntry | null => {\n const pipelineVariantSet = withCoverageVariant(variantSet);\n // The fallback MRT is an extension of the built-in Standard PBR output\n // contract only. The render pass may carry a second attachment whenever\n // another renderable needs S_fallback, but shaders such as unlit, sprite,\n // and the skin PBR variant still expose only @location(0). Passing that\n // attachment into their PSO would make WebGPU reject the pipeline before\n // the first draw (\"Color target has no corresponding fragment stage\n // output\"). Keep the graph attachment shared while deriving pipeline\n // targets from the shader's actual output contract.\n const reflectionFallbackFormats =\n materialShaderId === 'forgeax::default-standard-pbr' &&\n c.reflectionFallbackColorFormat !== undefined\n ? passKind === 'deferred'\n ? colorFormats.slice(1)\n : [c.reflectionFallbackColorFormat]\n : undefined;\n const renderStateKey = renderStateHash(renderState);\n const shaderLookupCache = materialPipelineLookupCache.get(materialShaderId);\n const cachedLookups = shaderLookupCache?.get(renderStateKey);\n if (cachedLookups !== undefined) {\n for (const cached of cachedLookups) {\n if (\n cached.isHdrTarget === isHdrTarget &&\n cached.renderStateKey === renderStateKey &&\n cached.topology === topology &&\n cached.indexFormat === indexFormat &&\n cached.variantSet === pipelineVariantSet &&\n cached.vertexEntry === vertexEntry &&\n cached.fragmentEntry === fragmentEntry &&\n cached.textureMask === textureMask &&\n cached.passKind === passKind &&\n cached.layoutProjection.digest === layoutProjection.digest &&\n cached.sampleCount === sampleCount &&\n cached.colorFormatOverride === colorFormat &&\n cached.additionalColorFormats?.join(',') === reflectionFallbackFormats?.join(',')\n ) {\n return cached.handle;\n }\n }\n }\n const resolvedVariantSetResult =\n runtime.getMaterialArtifact?.(materialShaderId) !== undefined\n ? ({ ok: true, value: undefined } as const)\n : pipelineVariantSet === undefined &&\n (materialShaderId === 'forgeax::sprite' || materialShaderId === 'forgeax::sprite-lit')\n ? ({ ok: true, value: undefined } as const)\n : variantSetFromVertexLayoutProjection(layoutProjection, pipelineVariantSet);\n if (!resolvedVariantSetResult.ok) {\n runtime.errorRegistry.fire(resolvedVariantSetResult.error);\n return null;\n }\n const resolvedVariantSet = resolvedVariantSetResult.value;\n const fallbackVariantSet =\n materialShaderId !== 'forgeax::default-standard-pbr'\n ? resolvedVariantSet\n : c.reflectionFallbackColorFormat !== undefined && resolvedVariantSet === ''\n ? ''\n : `${resolvedVariantSet === undefined || resolvedVariantSet === '' ? '' : `${resolvedVariantSet}+`}REFLECTION_FALLBACK_AVAILABLE=${c.reflectionFallbackColorFormat !== undefined}`;\n const resolvePipeline = () =>\n runtime.getMaterialShaderPipelineEntry?.(\n materialShaderId,\n isHdrTarget,\n renderState,\n topology,\n indexFormat,\n fallbackVariantSet,\n passKind,\n undefined,\n sampleCount,\n colorFormat,\n undefined,\n undefined,\n undefined,\n layoutProjection,\n undefined,\n undefined,\n undefined,\n reflectionFallbackFormats,\n vertexEntry,\n fragmentEntry,\n undefined,\n textureMask === undefined ? undefined : { [STANDARD_TEXTURE_MASK_OVERRIDE]: textureMask },\n ) ?? null;\n const handle =\n profilePhase === undefined\n ? resolvePipeline()\n : profileGeometrySegment(c, passKind, 'pipeline-selection', resolvePipeline);\n // A null handle is a transient async-build signal (`rhi-not-available`),\n // not a stable pipeline result. Do not memoize it in this frame's lookup:\n // caching the first pending lookup would turn a one-frame shader warm-up\n // into a permanent skip for every later frame in a tight smoke loop. The\n // owning runtime cache remains the SSOT; retrying here is bounded by the\n // existing per-frame draw path and preserves the explicit skip-draw\n // recovery while the pipeline becomes ready.\n if (handle !== null) {\n const nextLookup: MaterialPipelineLookup = {\n materialShaderId,\n isHdrTarget,\n renderStateKey,\n topology,\n indexFormat,\n variantSet: pipelineVariantSet,\n vertexEntry,\n fragmentEntry,\n passKind,\n layoutProjection,\n sampleCount,\n colorFormatOverride: colorFormat,\n additionalColorFormats: reflectionFallbackFormats,\n textureMask,\n handle,\n };\n if (shaderLookupCache === undefined) {\n materialPipelineLookupCache.set(\n materialShaderId,\n new Map([[renderStateKey, [nextLookup]]]),\n );\n } else if (cachedLookups === undefined) {\n shaderLookupCache.set(renderStateKey, [nextLookup]);\n } else {\n cachedLookups.push(nextLookup);\n }\n }\n return handle;\n };\n\n for (let i = 0; i < validatedOrdered.length; i++) {\n const entry = validatedOrdered[i];\n if (entry === undefined) continue;\n // Points/Lines share the Standard geometry pass. Their retained source\n // is prepared once by the renderer owner, while this loop remains the\n // sole pass/draw submission owner and preserves the authored topology.\n const pointsLinesSubmission = c.pointsLines?.prepare(entry, clusteredLighting);\n if (entry.source.pointsLines !== undefined && pointsLinesSubmission?.plan.drawCount !== 1)\n continue;\n\n // feat-20260609 M2: skip entities that don't match the pass selector.\n if (matchedMaterials !== null && !matchedMaterials.has(entry.renderableIndex)) continue;\n\n // D-2 generalised feat-20260625 M2 / w7: transparent entities are\n // dispatched in the separate sub-pass (bgra8unorm unorm view,\n // loadOp=load) so they must NOT be drawn here in the geometry pass\n // (bgra8unorm-srgb sRGB view, loadOp=clear). In the HDR path\n // (tonemapActive=true) or when there are no transparent entries,\n // splitLdrSprite=false and this guard is a no-op. Post-w13 the\n // legacy shadingModel arm is gone; transparent is the single SSOT\n // mirrored on `computeSplitLdrSprite`.\n //\n // feat-city-glb Bug 5 (per-submesh transparency): only skip the WHOLE\n // entity here when EVERY submesh is transparent (the sprite / fully-\n // transparent-mesh fast path, byte-identical to the pre-fix behavior for\n // single-material entities). A mixed mesh (opaque road submesh + BLEND\n // decal submesh) is NOT skipped at the entity level; its opaque submeshes\n // draw here and the per-submesh loop below skips the transparent ones\n // (they are drawn in the blend sub-pass instead).\n if (selectedDispatch === undefined && splitLdrSprite && isEntityFullyTransparent(entry.source))\n continue;\n\n const pipelineTag: 'unlit' = 'unlit';\n\n // w10: setStencilReference per draw when the dispatch entry carries\n // a stencil reference value (plan-strategy D-3: draw-call dynamic\n // state after setPipeline). Defaults to 0 when no reference is set\n // (WebGPU stencil reference default, semantically a no-op).\n const stencilReference = entry.stencilReference ?? 0;\n if (stencilReference !== lastStencilReference) {\n pass.setStencilReference(stencilReference);\n lastStencilReference = stencilReference;\n }\n\n if (pointsLinesSubmission !== undefined && entry.source.pointsLines !== undefined) {\n const pointsLinesMaterial: MaterialSnapshot = {\n ...entry.source.material,\n materialShaderId: POINTS_LINES_MATERIAL_SHADER_ID,\n materialParamSchema:\n runtime.getParamSchema?.(POINTS_LINES_MATERIAL_SHADER_ID) ??\n entry.source.material.materialParamSchema,\n };\n const materialSlot = materialSlotIndices[i]?.[0] ?? 0;\n const pointsLinesBindGroup = resolveMaterialBindGroup(\n materialSlot,\n pointsLinesMaterial,\n entry.source.entityKey,\n entry.world ?? c.world,\n );\n const pointsLinesPipelineEntry = resolveMaterialPipeline(\n POINTS_LINES_MATERIAL_SHADER_ID,\n {\n ...pointsLinesMaterial.renderState,\n cullMode: 'none',\n },\n 'triangle-list',\n 'uint32',\n undefined,\n colorFormatOverride,\n pointsLinesSubmission.layoutProjection,\n );\n if (pointsLinesPipelineEntry === null) continue;\n const pointsLinesPipeline = pointsLinesPipelineEntry.pipeline;\n if (pipelineState.pointsLinesViewBuffer === undefined) continue;\n writePointsLinesViewUbo(\n runtime.device.queue,\n pipelineState.pointsLinesViewBuffer,\n c.camera,\n c.targetW,\n c.targetH,\n entry.source.transform.world,\n entry.source.pointsLines.style,\n i * POINTS_LINES_VIEW_SLOT_STRIDE,\n );\n pass.setBindGroup(\n 0,\n viewBindGroup as BindGroup,\n new Uint32Array([0, i * POINTS_LINES_VIEW_SLOT_STRIDE]),\n 0,\n 2,\n );\n pass.setPipeline(pointsLinesPipeline);\n pass.setVertexBuffer(0, pointsLinesSubmission.vertexBuffer);\n pass.setIndexBuffer(pointsLinesSubmission.indexBuffer, 'uint32');\n materialGroup1DynamicOffsets[0] = materialSlot * MATERIAL_PER_ENTITY_STRIDE;\n pass.setBindGroup(1, pointsLinesBindGroup, materialGroup1DynamicOffsets, 0, 1);\n const pointsLinesMeshGroup = meshBindGroup ?? meshGroup2;\n if (pointsLinesMeshGroup === null) continue;\n pass.setBindGroup(2, pointsLinesMeshGroup, meshGroup2DynamicOffsets);\n const pointsLinesInstancesBg =\n identityInstanceDraws[0]?.instanceBindGroup ??\n resolveGeometryInstancesBindGroup(c, identityInstanceBuffer, undefined);\n pass.setBindGroup(3, pointsLinesInstancesBg);\n recordOcclusionCandidate(() => recordPointsLinesDraw(pass, pointsLinesSubmission.plan));\n c.onRenderableDraw?.(entry);\n pass.setBindGroup(0, viewBindGroup as BindGroup, [viewBindGroupDynamicOffset, 0]);\n continue;\n }\n\n if (entry.mesh.vertexBuffer !== lastVertexBuffer) {\n pass.setVertexBuffer(0, entry.mesh.vertexBuffer.handle);\n lastVertexBuffer = entry.mesh.vertexBuffer;\n }\n // feat-20260604 M4 / w11: vertex-only meshes (indexed === false) carry no\n // index buffer; skip setIndexBuffer entirely and dispatch via pass.draw\n // below. Indexed meshes keep the existing setIndexBuffer path unchanged.\n if (entry.mesh.indexed && entry.mesh.indexBuffer !== lastIndexBuffer) {\n if (entry.mesh.indexBuffer !== null) {\n pass.setIndexBuffer(entry.mesh.indexBuffer.handle, entry.mesh.indexFormat);\n lastIndexBuffer = entry.mesh.indexBuffer;\n }\n }\n\n // Dispatch counter bump — sprite folds into the same 2-bucket\n // surface for now (`pipelineDispatchCounts.{unlit, standard}`\n // mirror the original 2-pipeline scope; sprite-bucket counters\n // can land in a follow-up if AI users need them separately).\n // sprite entries do not bump either counter — the bench (M-4)\n // can read sprite render counts via the transparent bucket\n // length instead.\n if (pipelineTag === 'unlit') dispatchCounts.unlit += 1;\n\n const instanceDraws = resolveGeometryInstanceBuffer(c, entry, identityInstanceDraws, false);\n if (instanceDraws === null) continue;\n\n // feat-20260611 R2 / M8 / w28 (IS-14): skin entries need a 3-binding\n // group(2) BG matching `pbr-skin-pl` (binding 0 mesh-array UBO +\n // binding 1 current palette UBO + binding 2 previous palette UBO).\n // Building this here -- not in the\n // `meshBindGroup` factory above -- because the binding-shape\n // (1-entry vs 3-entry) is per-entry, not per-frame. URP / HDRP\n // entries keep using `meshGroup2` (1-entry mesh-array or HDRP\n // unified). The skin-variant cache key includes both buffer\n // identities so a future allocator-driven palette buffer rotation\n // invalidates the BG without manual eviction.\n //\n // PSO-availability gate: only swap to the skin BG when (a) the\n // skin pipeline layout itself was built (charter P3 fail-stop on\n // BGL-build failure), AND (b) the skin PSO cache returns a non-null\n // pipeline for this entry. Without (b), the per-submesh selector\n // below falls back to URP `standardPipeline` (`pbr-pl` layout,\n // 1-entry mesh-array BGL); binding the 3-entry skin BG against\n // that pipeline reproduces the exact `pbr-mesh-array-bgl ... does\n // not match layout pbr-skin-mesh-array-bgl` device error R1\n // captured. Mirrors the uniform null skip-draw pattern (M6-T1).\n let group2BindGroup: BindGroup = meshGroup2 as BindGroup;\n // feat-20260612-skin-palette-per-frame-upload M3 / m3-2: dyn-offset\n // tuple follows the skin group2 offset contract. Defaults to the\n // length-1 non-skin shape; the skin branch below re-computes with the\n // per-entity `entry.source.skin.byteOffset` cursor.\n meshGroup2DynamicOffsets[0] = i * MESH_PER_ENTITY_STRIDE;\n let group2DynamicOffsets: readonly number[] = meshGroup2DynamicOffsets;\n const isSkinEntry = entry.source.skin !== undefined;\n const probeBlendRecordAvailable =\n runtime.device.caps.storageBuffer && entry.source.probeBlendRecord !== undefined;\n // feat-20260612-skin-palette-per-frame-upload M1 / m1-3 + M6: the\n // record stage reads the GPU buffer reference through\n // `entry.source.skin.buffer` (per-slice carrier set at extract time\n // by allocateSlice). On the storage path every slice carries the\n // same shared buffer pointer, so the BG cache key collapses to one\n // entry per frame (miss=1 + hit=N-1). On the uniform fallback path\n // each slice carries its own per-entity 16320 B UBO, so the BG\n // cache key naturally splits per entity (one BG per buffer pointer)\n // -- there is no shared-buffer assumption to break under\n // 16 KiB UBO cap. Charter P3 explicit failure preserved: skin\n // entries skip when the pipeline layout is missing OR the slice\n // failed to allocate (no buffer field). dynOffset[1] = byteOffset\n // is 0 on the uniform path (entry already covers the full buffer)\n // and walks 0, 1536, 3072, ... on the storage path.\n const skinAllocator = pipelineState.skinPaletteAllocator;\n const skinSlice = entry.source.skin;\n // Authored Standard skin aliases deliberately publish the physical root\n // with only their STORAGE_BUFFER capability axis. Their composed WGSL is\n // the direct-lighting/palette (`skin`) ABI, even when the frame's\n // canonical Standard lane uses clustered lighting. Only the canonical\n // engine skin artifact can consume the HDRP unified skin group(2) layout;\n // selecting it from the frame topology alone would bind\n // `hdrp-skin-unified-bg-group2` to a three-entry URP skin PSO.\n const clusteredSkin =\n clusteredLighting &&\n entry.source.materials.every((material) => {\n const shaderId = material.materialShaderId;\n return (\n !isStandardPbrSkinMaterialShader(shaderId) ||\n isCanonicalStandardPbrMaterialShader(shaderId)\n );\n });\n const skinMeshBindGroupLayout = clusteredSkin\n ? pipelineState.hdrpSkinMeshBindGroupLayout\n : pipelineState.pbrSkinMeshBindGroupLayout;\n const hdrpSkinBuffers =\n isSkinEntry && clusteredSkin\n ? getOrCreateHdrpBuffers(runtime, frameState.installedPipelineConfig?.clusterGrid)\n : null;\n const skinResources =\n isSkinEntry &&\n skinMeshBindGroupLayout !== null &&\n skinAllocator !== null &&\n skinSlice !== undefined &&\n (!clusteredSkin || hdrpSkinBuffers !== null)\n ? {\n meshArrayBgl: skinMeshBindGroupLayout,\n paletteBuffer: skinSlice.buffer,\n paletteBindingWindowBytes: skinAllocator.bindingWindowBytes,\n hdrpBuffers: hdrpSkinBuffers,\n }\n : null;\n // Probe the skin PSO cache up front so we can decide whether to swap\n // to the skin BG. The same probe + selector is repeated in\n // the per-submesh loop below (the loop's variantSet derivation is\n // identical -- skin shader registers a single all-true variant so\n // the canonical empty-key rule applies on HDRP and the URP key is\n // the explicit expanded form, mirroring the standard PBR path).\n const skinVariantSetResult = variantSetFromVertexLayoutProjection(\n entry.mesh.layoutProjection,\n standardTopologyVariantSet(\n c.standardLighting,\n runtime.device.caps.storageBuffer,\n entry.mesh.layoutProjection.attributes.some((attribute) => attribute.key === 'color'),\n probeBlendRecordAvailable,\n ),\n );\n if (!skinVariantSetResult.ok) runtime.errorRegistry.fire(skinVariantSetResult.error);\n const skinVariantSet = skinVariantSetResult.ok\n ? withCoverageVariant(skinVariantSetResult.value)\n : undefined;\n const skinPsoProbe =\n skinResources !== null && skinVariantSetResult.ok\n ? (runtime.getMaterialShaderPipeline?.(\n SKIN_MATERIAL_SHADER_ID,\n isHdrTarget,\n entry.source.material.renderState,\n entry.mesh.submeshes[0]?.topology ?? 'triangle-list',\n entry.mesh.indexFormat,\n skinVariantSet,\n passKind,\n undefined, // meshAttributes — skin probe uses first submesh, derive from entry\n sampleCount,\n colorFormatOverride,\n undefined,\n undefined,\n undefined,\n entry.mesh.layoutProjection,\n undefined,\n undefined,\n undefined,\n ) ?? null)\n : null;\n if (skinResources !== null && skinPsoProbe !== null) {\n const meshBindSize = runtime.device.caps.storageBuffer\n ? MESH_SSBO_BYTES\n : MESH_UBO_FULL_ARRAY_BYTES;\n // m3-2 / D-8: skin BG cache miss / hit instrumentation. The chain\n // walk no longer exposes a string key to `.has()`, so we derive\n // hit/miss from the w7 `bindGroupCounts.createBindGroup` accounting:\n // snapshot the counter, run `getOrCreateFromChain`, and compare. A\n // delta of 1 means the factory ran (miss); 0 means a chain hit. This\n // publishes the per-frame counter the m3-1 acceptanceCheck reads\n // (miss=1 + hit=N-1 across N skin entries sharing one allocator\n // buffer + mesh SSBO). Field is optional + opt-in (read via\n // structural cast so prod paths that omit the counter pay nothing).\n const skinStats = (pipelineState as { _skinBgCacheStats?: { miss: number; hit: number } })\n ._skinBgCacheStats;\n const skinMissesBefore = bindGroupCounts.createBindGroup;\n const skinBindGroup: BindGroup = getOrCreateFromChain(\n frameState.meshBindGroupCache,\n [\n pipelineState.meshStorageBuffer.buffer,\n skinResources.paletteBuffer,\n ...(skinResources.hdrpBuffers === null\n ? []\n : [\n skinResources.hdrpBuffers.lightDataBuffer,\n skinResources.hdrpBuffers.clusterGridBuffer,\n skinResources.hdrpBuffers.lightIndexListBuffer,\n skinResources.hdrpBuffers.clusterUniformBuffer,\n ]),\n ],\n 'pbr-skin-mesh',\n () => {\n if (skinResources.hdrpBuffers !== null) {\n const result = createHdrpSkinUnifiedBindGroup(\n runtime,\n skinResources.hdrpBuffers,\n skinResources.meshArrayBgl,\n pipelineState.meshStorageBuffer.buffer,\n skinResources.paletteBuffer,\n skinResources.paletteBindingWindowBytes,\n );\n if (result === null) {\n throw new RhiError({\n code: 'webgpu-runtime-error',\n expected: 'HDRP clustered skin BindGroup creation succeeds',\n hint: 'inspect prior errorRegistry events for createBindGroup failure detail',\n });\n }\n return result;\n }\n const result = runtime.device.createBindGroup({\n label: 'pbr-skin-mesh-bg',\n layout: skinResources.meshArrayBgl,\n entries: createPbrSkinMeshBindGroupEntries(\n pipelineState.meshStorageBuffer.buffer,\n meshBindSize,\n skinResources.paletteBuffer,\n skinResources.paletteBindingWindowBytes,\n ),\n });\n if (!result.ok) throw result.error;\n return result.value;\n },\n bindGroupCounts,\n );\n if (skinStats !== undefined) {\n if (bindGroupCounts.createBindGroup > skinMissesBefore) skinStats.miss += 1;\n else skinStats.hit += 1;\n }\n group2BindGroup = skinBindGroup;\n // m3-2: dyn-offset tuple uses the per-entity palette cursor M2 m2-6\n // wrote at the extract stage.\n // Replaces the prior PR #353 hard-coded `0` second slot -- every\n // skin entry now points the palette window at its own slice while\n // sharing the worst-case BG entry size above.\n group2DynamicOffsets = pbrSkinMeshDynamicOffsets(\n i * MESH_PER_ENTITY_STRIDE,\n entry.source.skin?.byteOffset ?? 0,\n );\n } else if (isSkinEntry) {\n // Skin entry but skin PSO not ready (cache miss / async build pending,\n // or skin pipeline layout failed at boot). Skip the draw rather than\n // fall back to URP `pbr-pl` against the 6-attribute skin VBO -- that\n // path produced the layer-3 / layer-4 device errors R1 captured. Once\n // the async PSO compile resolves the cache hits and the next frame\n // routes the skin BG + skin pipeline together. Mirrors the uniform\n // null skip-draw shape (M6-T1, charter P3 explicit failure).\n if (diagnosticsEnabled) {\n console.error(\n `[render-material] skin draw skipped: ${JSON.stringify({\n entityKey: entry.source.entityKey,\n materialHandle: entry.source.material.materialHandle,\n reason: 'skin-pipeline-unavailable',\n skinResourcesReady: skinResources !== null,\n skinPsoReady: skinPsoProbe !== null,\n paletteBufferReady: skinSlice?.buffer !== undefined,\n paletteByteOffset: skinSlice?.byteOffset,\n })}`,\n );\n }\n continue;\n }\n // feat-20260520-2d-sprite-layer-mvp M-3 / w25 (@fallback sprite\n // bucket): sprite entries get a per-entity material BindGroup so\n // each sprite carries its own texture binding at @group(1) @binding(2).\n // Bindings 3..6 (metallicRoughness sampler/texture + normal\n // sampler/texture) bind `pipelineState.defaultSampler` +\n // `pipelineState.defaultWhiteTextureView` placeholders (D-1\n // candidate b — zero new GPU resource; the 1x1 white view was\n // already provisioned for unlit / standard fallback so the sprite\n // path adds 4 binding references, no new resource code).\n //\n // Missing-texture fallback (AC-18 path 4 + R7 isolation): when the\n // sprite texture has no GPU view, the binding uses\n // `defaultWhiteTextureView` as the fallback texture and the\n // material UBO upload above wrote debug-pink colorTint so the\n // sprite is visually distinct. The warn-once + RhiError surface\n // fires inside the upload loop. R7 isolation: this does NOT change\n // the existing unlit / standard bucket missing-texture handling —\n // those keep their silent-white fallback (a future\n // `feat-future-pbr-missing-texture-fallback-explicit` will retrofit).\n // bug-20260610 layer 7d: BG is per-submesh — each iteration of\n // the submesh draw loop below builds (or cache-hits) a BG with\n // matsForRebind[smIdx]'s 5 textureViews (baseColor / MR / normal /\n // emissive / occlusion). Cache key is 14-handle-id only (entityKey\n // dropped) so identical-material submeshes / entities dedup\n // globally. Sprite path is unchanged (single spriteBg, sprite\n // per-submesh OOS-1). The non-sprite branch leaves perSubmeshBg\n // declared but null; the submesh loop reassigns it per iteration\n // and the source-grep gate in skylight-fallback-path.test.ts /\n // systems.unit.test.ts continues to match\n // `setBindGroup\\s*\\(\\s*1\\s*,\\s*perSubmeshBg\\b` on the in-loop call.\n // feat-20260625-refactor-sprite-as-transparent-mesh M3 / w13 (D-1\n // candidate b): the sprite-specific BG construction is gone — sprite\n // materials reuse the same per-submesh BG path PBR / unlit use. The\n // 7-entry BGL is byte-for-byte shared (binding 0 = Material UBO,\n // 1 = baseColorSampler, 2 = baseColorTexture, 3-6 = filler samplers /\n // textureViews). Sprite's \"no metallic/normal/emissive/occlusion\n // texture\" simply falls through to `defaultWhite` / `defaultNormal`\n // — the same placeholders the unlit path already used. The generic\n // branch below builds the per-submesh BG.\n let perSubmeshBg: BindGroup | null = null;\n const gpuDrivenDrawIndices = gpuDrivenDrawIndicesBySubmesh(entry.source, entry.mesh);\n // feat-20260608 M4 / w16: per-submesh pipeline selection + draw loop.\n // Each submesh carries its own topology, so pipeline selection is per-submesh.\n // Vertex/index buffers and bind groups are set once (shared across all submeshes).\n // feat-20260608 M5 amend / w16-a: the material UBO bind (group=1)\n // ALSO moves into the loop -- the j-th submesh sees the j-th\n // material slot via dynamic offset (entitySlotStart + j) * 256.\n const matsForRebind = entry.source.materials;\n for (let smIdx = 0; smIdx < entry.mesh.submeshes.length; smIdx++) {\n const sm = entry.mesh.submeshes[smIdx];\n if (sm === undefined) continue;\n const matSlotIdx = sm.materialSlot;\n const submeshMaterial = matsForRebind[matSlotIdx] ?? entry.source.material;\n if (matchedMaterials !== null) {\n const materialHandles = matchedMaterials.get(entry.renderableIndex);\n const materialHandle = submeshMaterial.materialHandle ?? 0;\n if (materialHandles === undefined || !materialHandles.has(materialHandle)) continue;\n }\n if (\n passKind === 'forward' &&\n isGpuDrivenMainClaimedSubmesh(c, entry.source, smIdx, gpuDrivenDrawIndices)\n ) {\n continue;\n }\n const draws: readonly (DispatchEntry | undefined)[] =\n selectedDispatch === undefined\n ? [undefined]\n : (materialPasses.get(entry.renderableIndex)?.get(submeshMaterial.materialHandle ?? 0) ??\n []);\n for (const selectedPass of draws) {\n // Temporal projects the selected material's alpha/motion contract,\n // not its authored Forward entry points or color outputs.\n const vertexEntry = passKind === 'temporal' ? undefined : selectedPass?.vertexEntry;\n const fragmentEntry = passKind === 'temporal' ? undefined : selectedPass?.fragmentEntry;\n const selectedShaderId =\n selectedPass === undefined\n ? submeshMaterial.materialShaderId\n : selectedPass.materialShaderId;\n const selectedRenderState =\n selectedPass === undefined ? submeshMaterial.renderState : selectedPass.renderState;\n const selectedStencil =\n (selectedPass === undefined ? entry.stencilReference : selectedPass.stencilReference) ??\n 0;\n if (selectedStencil !== lastStencilReference) {\n pass.setStencilReference(selectedStencil);\n lastStencilReference = selectedStencil;\n }\n // feat-city-glb Bug 5 (per-submesh transparency): in the LDR split, a\n // transparent submesh is drawn in the blend sub-pass (non-sRGB view),\n // NOT here in the sRGB geometry pass. Skip it. Opaque submeshes of the\n // same (mixed) mesh still draw here. Single-material / fully-opaque\n // meshes are unaffected (their submesh materials are not transparent).\n if (\n splitLdrSprite &&\n (selectedPass === undefined\n ? submeshMaterial.transparent === true\n : selectedRenderState?.blend !== undefined)\n ) {\n continue;\n }\n // bug-20260610 layer 7d: per-submesh BG construction. Texture\n // views resolve from `matsForRebind[smIdx]` so the j-th submesh\n // sees its own materials[j] textures (baseColor / MR / normal /\n // emissive / occlusion). Pick slot j when materials.length covers\n // smIdx; otherwise fall back to slot 0 (count-mismatch already\n // filtered by extract; this guard handles the materials.length=1\n // single-material path mapped over multi-submesh meshes safely).\n // This BG drops entityKey: identical-texture-set submeshes\n // (whether on the same entity or different ones) share one BG via\n // the shaderId-outer `materialBgShared` cache. The 14 handle\n // objects form the WeakMap chain and fully discriminate the\n // binding state since sampler/textureView/buffer handle identities\n // are stable across frames.\n //\n // feat-20260625-refactor-sprite-as-transparent-mesh M3 / w13:\n // sprite materials now use the same per-submesh BG construction\n // (the sprite-specific BG branch above is deleted; sprite per-\n // submesh single-slot is still enforced via materialSlotIndices\n // and the sprite-shaped paramSnapshot fills the PBR-shaped BGL\n // bindings via fallback textures for the 4 unused slots).\n // feat-city-glb Bug 5: per-submesh material BG assembly extracted to\n // the shared `buildPerSubmeshMaterialBg` closure (also called by the\n // LDR blend sub-pass). Resolves the shader's user-region textures\n // (baseColor/MR/normal + a custom Nth texture), emissive/occlusion\n // injection, and Skylight merge; deduped cross-entity via the\n // shaderId-outer `materialBgShared` cache.\n const materialSlot =\n materialSlotIndices[i]?.[matSlotIdx] ?? materialSlotIndices[i]?.[0] ?? 0;\n const processValue = (\n globalThis as {\n process?: { env?: Record<string, string | undefined> };\n }\n ).process;\n if (\n processValue?.env?.FORGEAX_MATERIAL_PIPELINE_DIAGNOSTICS === '1' &&\n (submeshMaterial.materialShaderId === 'forgeax::default-standard-pbr' ||\n submeshMaterial.materialShaderId === 'forgeax::pbr-skin')\n ) {\n console.error(\n `[render-material] draw receipt: ${JSON.stringify({\n entityIndex: entry.renderableIndex,\n materialSlot,\n materialHandle: submeshMaterial.materialHandle,\n clearcoat: submeshMaterial.paramSnapshot?.clearcoat,\n shader: submeshMaterial.materialShaderId,\n })}`,\n );\n }\n perSubmeshBg =\n profilePhase === undefined\n ? resolveMaterialBindGroup(\n materialSlot,\n submeshMaterial,\n entry.source.entityKey,\n entry.world ?? c.world,\n selectedShaderId,\n )\n : profileGeometrySegment(c, passKind, 'material-bind-groups', () =>\n resolveMaterialBindGroup(\n materialSlot,\n submeshMaterial,\n entry.source.entityKey,\n entry.world ?? c.world,\n selectedShaderId,\n ),\n );\n materialGroup1DynamicOffsets[0] = materialSlot * MATERIAL_PER_ENTITY_STRIDE;\n pass.setBindGroup(1, perSubmeshBg, materialGroup1DynamicOffsets, 0, 1);\n const smTopology = sm.topology;\n const smMaterialShaderId =\n selectedPass !== undefined\n ? selectedShaderId\n : entry.source.skin !== undefined\n ? isStandardPbrSkinMaterialShader(submeshMaterial.materialShaderId)\n ? submeshMaterial.materialShaderId\n : SKIN_MATERIAL_SHADER_ID\n : submeshMaterial.materialShaderId;\n const probeBlendAvailable =\n probeBlendRecordAvailable && isStandardPbrMaterialShader(smMaterialShaderId);\n const isSpriteShader =\n smMaterialShaderId === 'forgeax::sprite' || smMaterialShaderId === 'forgeax::sprite-lit';\n // Preserve the dedicated sprite-pass state when the linear-LDR graph\n // routes a sprite through this generic geometry path. Negative scale\n // flips winding, so back-face culling would erase the quad.\n const basePipelineRenderState = isSpriteShader\n ? {\n ...selectedRenderState,\n depthWriteEnabled: false,\n depthCompare: 'less-equal' as const,\n cullMode: 'none' as const,\n blend: selectedRenderState?.blend ?? SPRITE_PREMULTIPLIED_ALPHA_BLEND,\n }\n : geometryRenderStateForTopology(smTopology, selectedRenderState);\n const pipelineRenderState = geometryRenderStateForPass(\n basePipelineRenderState,\n passKind,\n coverageOnly,\n );\n let smPipelineHandle: typeof pipelineState.unlitPipeline;\n let materialGroup2Contract: 'mesh' | 'skin' | 'cluster' | 'skin-cluster' | undefined;\n let materialPipelineEntry: MaterialShaderPipelineEntry | null = null;\n if (smMaterialShaderId === undefined || smMaterialShaderId === 'forgeax::default-unlit') {\n const unlitShaderId = smMaterialShaderId ?? 'forgeax::default-unlit';\n const unlitProjectionVariantResult = variantSetFromVertexLayoutProjection(\n entry.mesh.layoutProjection,\n undefined,\n );\n if (!unlitProjectionVariantResult.ok) {\n runtime.errorRegistry.fire(unlitProjectionVariantResult.error);\n continue;\n }\n const unlitHasColor =\n unlitProjectionVariantResult.value === 'VERTEX_COLOR_AVAILABLE=true';\n const unlitVariantSet = standardStorageVariantSet(\n runtime.device.caps.storageBuffer,\n unlitHasColor,\n );\n const unlitRsp = resolveMaterialPipeline(\n unlitShaderId,\n pipelineRenderState,\n smTopology,\n entry.mesh.indexFormat,\n unlitVariantSet,\n colorFormatOverride,\n entry.mesh.layoutProjection,\n vertexEntry,\n fragmentEntry,\n submeshMaterial.standardTextureMask,\n );\n materialPipelineEntry = unlitRsp;\n smPipelineHandle =\n unlitRsp?.pipeline ??\n (colorFormatOverride === undefined\n ? selectGeometryPipeline(pipelineState, isHdrTarget, msaaActive)\n : null);\n } else if (smMaterialShaderId !== undefined) {\n // feat-20260609 M4.5 / w38 (D-11): the variantSet handed to\n // getMaterialShaderPipeline MUST mirror the boot-time\n // `definesKey` rule at createRenderer.ts:2483-2485 (sortedEntries\n // .every(v=>v===true) ? '' : 'A=v+...'). manifest variant.definesKey\n // is `''` for the all-true variant, so HDRP (both axes true) must\n // pass the canonical empty key to hit that variant via\n // findVariantByKey. Passing the expanded form would produce a\n // miss and silently fall back to the registered default WGSL,\n // creating a layout/binding mismatch under HDRP.\n //\n // URP path passes the explicit expanded form because the URP\n // variant's manifest definesKey IS that exact non-empty string\n // (CLUSTER_FORWARD_AVAILABLE=false+STORAGE_BUFFER_AVAILABLE=true)\n // -- the canonical-empty rule only applies to the all-true case.\n const hasVertexColor = entry.mesh.layoutProjection.attributes.some(\n (attribute) => attribute.key === 'color',\n );\n // The all-true HDRP variant uses the canonical empty key only when\n // every variant axis is true. A plain mesh adds the geometry-owned\n // VERTEX_COLOR_AVAILABLE=false axis, so retain the two capability\n // axes explicitly or the selector would silently choose the URP\n // group(2) layout for an HDRP cluster bind group.\n const capabilityVariantSet = standardTopologyVariantSet(\n c.standardLighting,\n runtime.device.caps.storageBuffer,\n hasVertexColor,\n probeBlendAvailable,\n );\n const transmissionAvailable = requestsStandardTransmissionVariant(submeshMaterial);\n const materialCapabilityVariantSet =\n transmissionAvailable && !capabilityVariantSet.includes('TRANSMISSION_AVAILABLE=')\n ? `${capabilityVariantSet}+TRANSMISSION_AVAILABLE=true`\n : capabilityVariantSet;\n // Sprite's base request must retain the boot-selected artifact. Only\n // SpriteInstances uses the explicit empty key for the\n // PER_INSTANCE_REGION=true variant; synthesizing the generic PBR\n // capability axes for a base sprite would invent a lazy module label\n // that has no boot seed and skip the first HDR draw.\n const variantSet = isSpriteShader\n ? smMaterialShaderId === 'forgeax::sprite' && entry.source.spriteInstances !== undefined\n ? ''\n : undefined\n : entry.variantSet === undefined\n ? materialCapabilityVariantSet\n : `${materialCapabilityVariantSet}+${entry.variantSet}`;\n const cachedPipeline = resolveMaterialPipeline(\n smMaterialShaderId,\n pipelineRenderState,\n smTopology,\n entry.mesh.indexFormat,\n variantSet,\n colorFormatOverride,\n entry.mesh.layoutProjection,\n vertexEntry,\n fragmentEntry,\n submeshMaterial.standardTextureMask,\n );\n // feat-20260615-pipeline-spec-ssot M6-T1: cache miss resolves to\n // null uniformly across URP / HDRP / skin shaders. Charter P3\n // explicit failure: the pre-M6 URP-path silent fallback to the\n // boot-time `pipelineState.standardPipeline*` (M4.5-followup w43)\n // masked real PipelineSpecError build failures behind a\n // layout-compatible-but-wrong PSO. The per-submesh\n // `if (smPipelineHandle === null) continue` skip-draw (which\n // already covered HDRP-active and skin miss paths) is now the\n // single uniform recovery shape -- one frame of skip-draw on\n // first-touch, then the cached PSO flows in once the async\n // build resolves. The pre-loop skin-PSO probe still skips the\n // entire entry on first-submesh probe miss; this site only\n // fires on per-submesh topology variance miss.\n materialPipelineEntry = cachedPipeline;\n smPipelineHandle = cachedPipeline?.pipeline ?? null;\n } else {\n smPipelineHandle = selectGeometryPipeline(pipelineState, isHdrTarget, msaaActive);\n }\n\n if (smPipelineHandle === null) {\n if (diagnosticsEnabled) {\n console.error(\n `[render-material] draw skipped: ${JSON.stringify({\n entityKey: entry.source.entityKey,\n materialHandle: submeshMaterial.materialHandle,\n shader: smMaterialShaderId,\n reason: 'pipeline-unavailable',\n })}`,\n );\n }\n continue;\n }\n // The probe record is an ABI extension of the built-in Standard PBR\n // shaders only. RenderScene may retain a record on every projected\n // renderable, but unlit/custom shaders still use the one-binding\n // instances BGL and must never receive the probe bind group. Resolve\n // this per submesh so mixed-material meshes cannot cross the layouts.\n const instanceDraws = resolveGeometryInstanceBuffer(\n c,\n entry,\n identityInstanceDraws,\n probeBlendAvailable,\n );\n if (instanceDraws === null) continue;\n // Standard clustered PBR variants declare the unified cluster/SSAO\n // group(2) layout. Unlit and other URP-layout materials must bind the\n // ordinary mesh group instead; choosing one group for the whole pass\n // makes Dawn reject an otherwise valid unlit pipeline and invalidates\n // the command buffer before it reaches the surface.\n if (!isSkinEntry) {\n materialGroup2Contract = materialPipelineEntry?.group2Contract;\n if (materialGroup2Contract === undefined) continue;\n const selectedGroup = selectMaterialGroup2(\n meshGroup2,\n meshBindGroup,\n materialGroup2Contract,\n );\n if (selectedGroup === null) continue;\n group2BindGroup = selectedGroup;\n }\n if (diagnosticsEnabled && submeshMaterial.textureHandles !== undefined) {\n console.error(\n `[render-material] draw submitted: ${JSON.stringify({\n entityKey: entry.source.entityKey,\n materialHandle: submeshMaterial.materialHandle,\n shader: smMaterialShaderId,\n textureHandles: [...submeshMaterial.textureHandles.entries()].map(\n ([field, handle]) => ({\n field,\n handle,\n }),\n ),\n skin: isSkinEntry\n ? {\n resourcesReady: skinResources !== null,\n psoReady: skinPsoProbe !== null,\n paletteBufferReady: skinSlice?.buffer !== undefined,\n paletteByteOffset: skinSlice?.byteOffset,\n dynamicOffsets: [...group2DynamicOffsets],\n }\n : undefined,\n pipelineReady: true,\n })}`,\n );\n }\n pass.setBindGroup(2, group2BindGroup, group2DynamicOffsets);\n\n if (profilePhase === undefined) {\n recordOcclusionCandidate(() =>\n submitSubmeshDraws(\n pass,\n bindingState,\n smPipelineHandle,\n instanceDraws,\n entry.mesh.indexed,\n sm.indexCount,\n sm.vertexCount,\n sm.indexOffset,\n () => c.onRenderableDraw?.(entry),\n ),\n );\n } else {\n profileGeometrySegment(c, passKind, 'draw-submit', () =>\n recordOcclusionCandidate(() =>\n submitSubmeshDraws(\n pass,\n bindingState,\n smPipelineHandle,\n instanceDraws,\n entry.mesh.indexed,\n sm.indexCount,\n sm.vertexCount,\n sm.indexOffset,\n () => c.onRenderableDraw?.(entry),\n ),\n ),\n );\n }\n if (diagnosticsEnabled && perSubmeshBg !== null) {\n recordIblPipelineBinding(c, submeshMaterial, smPipelineHandle, perSubmeshBg);\n }\n }\n }\n }\n}\n\n/**\n * Resolve the per-entity @group(3) instance buffers for the geometry pass.\n *\n * @internal\n */\nfunction uploadInstanceRanges(\n c: _InternalRenderPipelineContext,\n inst: NonNullable<RenderableSnapshot['instances']>,\n buffer: Buffer,\n ranges: readonly { readonly start: number; readonly end: number }[],\n storageBacked: boolean,\n sourceOffsetInstances = 0,\n previousInst: NonNullable<RenderableSnapshot['temporal']>['previousInstances'] = undefined,\n): InstanceUploadResult {\n const strideBytes =\n (storageBacked ? INSTANCE_STORAGE_STRIDE_FLOATS : 16) * Float32Array.BYTES_PER_ELEMENT;\n const uploadedRanges: { start: number; end: number }[] = [];\n let uploadedBytes = 0;\n for (const range of ranges) {\n const start = Math.max(0, Math.min(inst.instanceCount, range.start));\n const end = Math.max(start, Math.min(inst.instanceCount, range.end));\n if (end <= start) continue;\n const source = inst.transforms.subarray(\n (sourceOffsetInstances + start) * 16,\n (sourceOffsetInstances + end) * 16,\n );\n // A generation-bearing previous collection is kept whole so a compacted\n // or reordered current range can resolve its real prior ordinal. Without\n // identity proof, keep the old range-local shape and let the packer seed\n // on count mismatch rather than pairing an unrelated slot.\n const hasIdentityProof =\n inst.generations !== undefined && previousInst?.generations !== undefined;\n const previousSource = hasIdentityProof\n ? previousInst?.transforms\n : previousInst?.transforms.subarray(\n (sourceOffsetInstances + start) * 16,\n (sourceOffsetInstances + end) * 16,\n );\n const currentGenerations = inst.generations?.subarray(\n sourceOffsetInstances + start,\n sourceOffsetInstances + end,\n );\n const previousGenerations = hasIdentityProof\n ? previousInst?.generations\n : previousInst?.generations?.subarray(\n sourceOffsetInstances + start,\n sourceOffsetInstances + end,\n );\n const payload = storageBacked\n ? packInstanceStorageBuffer(source, previousSource, currentGenerations, previousGenerations)\n : source;\n const written = c.runtime.device.queue.writeBuffer(buffer, start * strideBytes, payload);\n if (!written.ok) {\n c.runtime.errorRegistry.fire(written.error);\n return { ok: false, ranges: uploadedRanges, bytes: uploadedBytes };\n }\n uploadedRanges.push({ start, end });\n uploadedBytes += payload.byteLength;\n }\n return { ok: true, ranges: uploadedRanges, bytes: uploadedBytes };\n}\n\nexport function reportInstanceResidency(\n c: _InternalRenderPipelineContext,\n inst: NonNullable<RenderableSnapshot['instances']>,\n input: {\n readonly lane: 'direct-storage' | 'chunked-storage' | 'direct-uniform' | 'chunked-uniform';\n readonly requestedBytes: number;\n readonly supportedBytes: number | undefined;\n readonly uploadRanges: readonly { readonly start: number; readonly end: number }[];\n readonly uploadedBytes: number;\n },\n): void {\n if (inst.collectionId === undefined) return;\n c.frameState.instanceCollections?._reportResidency({\n collectionId: inst.collectionId,\n frameNumber: c.frameState.frameNumber,\n residentGeneration: c.runtime.deviceScope.generation,\n lane: input.lane,\n requestedBytes: input.requestedBytes,\n supportedBytes: input.supportedBytes,\n uploadRanges: input.uploadRanges,\n uploadedBytes: input.uploadedBytes,\n backend: c.runtime.device.caps.backendKind,\n });\n}\n\nfunction reportInstanceFailure(\n c: _InternalRenderPipelineContext,\n inst: NonNullable<RenderableSnapshot['instances']>,\n error: {\n readonly code: InstanceCollectionFailureCode;\n readonly expected: string;\n readonly hint: string;\n },\n requestedBytes: number,\n supportedBytes: number | undefined,\n): void {\n if (inst.collectionId === undefined) return;\n c.frameState.instanceCollections?._reportFailure({\n collectionId: inst.collectionId,\n code: error.code,\n expected: error.expected,\n hint: error.hint,\n facts: {\n requestedBytes,\n supportedBytes,\n backend: c.runtime.device.caps.backendKind,\n owner: 'renderer.instances',\n cause: error.code,\n recovery: error.hint,\n },\n });\n}\n\nfunction clearInstanceChunksForOwner(c: _InternalRenderPipelineContext, ownerKey: number): void {\n const chunks = c.frameState.instanceBufferChunks;\n if (chunks === undefined) return;\n const prefix = `${ownerKey}:`;\n for (const [key, entry] of chunks.entries()) {\n if (!key.startsWith(prefix)) continue;\n if (!entry.buffer.isDestroyed) {\n const destroyed = entry.buffer.destroy();\n if (!destroyed.ok) c.runtime.errorRegistry.fire(destroyed.error);\n }\n chunks.delete(key);\n }\n}\n\nexport function resolveStorageInstanceChunks(\n c: _InternalRenderPipelineContext,\n entry: _InternalRenderPipelineContext['validatedOrdered'][number],\n inst: NonNullable<RenderableSnapshot['instances']>,\n cap: number,\n probeBuffer: Buffer | undefined,\n probeOffset: number,\n): readonly GeometryInstanceDraw[] | null {\n const { runtime, frameState } = c;\n const strideBytes = INSTANCE_STORAGE_STRIDE_FLOATS * Float32Array.BYTES_PER_ELEMENT;\n const chunkCapacity = Math.floor(cap / strideBytes);\n if (chunkCapacity < 1) {\n reportInstanceFailure(\n c,\n inst,\n {\n code: 'limit-exceeded',\n expected: `maxStorageBufferBindingSize (${cap}) >= ${strideBytes}`,\n hint: 'use a backend with storage-buffer bindings large enough for one InstanceData record',\n },\n inst.instanceCount * strideBytes,\n cap,\n );\n runtime.errorRegistry.fire(\n new RhiError({\n code: 'limit-exceeded',\n expected: `maxStorageBufferBindingSize (${cap}) >= ${strideBytes}`,\n hint: 'use a backend with storage-buffer bindings large enough for one InstanceData record',\n detail: { maxStorageBufferBindingSize: cap, requestedBytes: strideBytes },\n }),\n );\n return null;\n }\n const ownerKey = instanceCollectionCacheKey(entry.source.worldId, inst);\n const chunks = frameState.instanceBufferChunks;\n const activeKeys = new Set<string>();\n const draws: GeometryInstanceDraw[] = [];\n const uploadedRanges: { start: number; end: number }[] = [];\n let uploadedBytes = 0;\n const dirtyRanges = inst.dirtyRanges ?? [{ start: 0, end: inst.instanceCount } as const];\n for (let start = 0; start < inst.instanceCount; start += chunkCapacity) {\n const end = Math.min(inst.instanceCount, start + chunkCapacity);\n const count = end - start;\n const chunkKey = `${ownerKey}:${start}`;\n activeKeys.add(chunkKey);\n // Keep stable-resident checks arithmetic-only; packing is deferred to the\n // upload path below, where a new or dirty range actually needs payload.\n const payloadBytes = count * strideBytes;\n const previous = chunks?.get(chunkKey);\n let active =\n previous !== undefined &&\n previous.uploadedArchVersion === inst.archVersion &&\n previous.uploadedByteLength === payloadBytes\n ? previous\n : undefined;\n let activeIsNew = false;\n if (active === undefined) {\n const created = runtime.device.createBuffer({\n size: payloadBytes,\n usage: GPU_BUFFER_USAGE_STORAGE | GPU_BUFFER_USAGE_COPY_DST,\n mappedAtCreation: false,\n });\n if (!created.ok) {\n runtime.errorRegistry.fire(created.error);\n reportInstanceFailure(c, inst, created.error, inst.instanceCount * strideBytes, cap);\n return null;\n }\n if (previous !== undefined && !previous.buffer.isDestroyed) {\n const destroyed = previous.buffer.destroy();\n if (!destroyed.ok) runtime.errorRegistry.fire(destroyed.error);\n }\n active = {\n buffer: new GpuBuffer(runtime.device, created.value),\n uploadedArchVersion: inst.archVersion,\n uploadedByteLength: payloadBytes,\n };\n activeIsNew = true;\n chunks?.set(chunkKey, active);\n if (chunks === undefined) frameState.transientInstanceBuffers.push(active);\n }\n if (active === undefined) return null;\n const localRanges = dirtyRanges\n .map((range) => ({\n start: Math.max(start, range.start) - start,\n end: Math.min(end, range.end) - start,\n }))\n .filter((range) => range.end > range.start);\n const needsUpload = activeIsNew || active.uploadedRevision !== inst.revision;\n const rangesToUpload = instanceUploadRangesForResident(activeIsNew, localRanges, {\n start: 0,\n end: count,\n });\n if (needsUpload && rangesToUpload.length > 0) {\n const upload = uploadInstanceRanges(\n c,\n inst,\n active.buffer.handle,\n rangesToUpload,\n true,\n start,\n entry.source.temporal?.previousInstances,\n );\n for (const range of upload.ranges) {\n uploadedRanges.push({ start: range.start + start, end: range.end + start });\n }\n uploadedBytes += upload.bytes;\n if (!upload.ok) {\n reportInstanceFailure(\n c,\n inst,\n {\n code: 'queue-write-buffer-failed',\n expected: 'the renderer-owned instance storage buffer accepts the dirty range',\n hint: 'retry after the active device is healthy or recover the renderer',\n },\n inst.instanceCount * strideBytes,\n cap,\n );\n return null;\n }\n }\n if (needsUpload) {\n if (inst.revision !== undefined) {\n const published = { ...active, uploadedRevision: inst.revision };\n active = published;\n chunks?.set(chunkKey, published);\n }\n }\n const activeBuffer = active;\n draws.push({\n instanceBuffer: activeBuffer.buffer.handle,\n instanceBindGroup: resolveGeometryInstancesBindGroup(\n c,\n activeBuffer.buffer.handle,\n probeBuffer,\n ),\n probeOffset,\n instanceCount: count,\n });\n }\n if (chunks !== undefined) {\n const prefix = `${ownerKey}:`;\n for (const [key, stale] of chunks.entries()) {\n if (!key.startsWith(prefix) || activeKeys.has(key)) continue;\n if (!stale.buffer.isDestroyed) {\n const destroyed = stale.buffer.destroy();\n if (!destroyed.ok) runtime.errorRegistry.fire(destroyed.error);\n }\n chunks.delete(key);\n }\n }\n reportInstanceResidency(c, inst, {\n lane: 'chunked-storage',\n requestedBytes: inst.instanceCount * strideBytes,\n supportedBytes: cap,\n uploadRanges: uploadedRanges,\n uploadedBytes,\n });\n return draws;\n}\n\nfunction resolveGeometryInstanceBuffer(\n c: _InternalRenderPipelineContext,\n entry: _InternalRenderPipelineContext['validatedOrdered'][number],\n identityInstanceDraws: readonly GeometryInstanceDraw[],\n useProbeBlend: boolean,\n): readonly GeometryInstanceDraw[] | null {\n const { runtime, pipelineState, frameState } = c;\n const inst = entry.source.instances;\n const probeBinding =\n !useProbeBlend ||\n !runtime.device.caps.storageBuffer ||\n entry.source.probeBlendRecord === undefined\n ? undefined\n : resolveProbeBlendBuffer(\n c,\n entry.source.probeBlendRecord,\n worldEntityKey(entry.source.worldId, entry.source.entityKey),\n );\n if (inst === undefined) {\n const identity = identityInstanceDraws[0];\n if (identity === undefined) return null;\n return [\n {\n ...identity,\n instanceBindGroup: resolveGeometryInstancesBindGroup(\n c,\n pipelineState.identityInstanceBuffer,\n probeBinding?.buffer,\n ),\n probeOffset: probeBinding?.offset ?? -1,\n },\n ];\n }\n // A present, empty Instances array means zero draws. Do not fall back to\n // the shared identity buffer, which would silently render one instance.\n if (inst.instanceCount === 0) return [];\n const entityCacheKey = instanceCollectionCacheKey(entry.source.worldId, inst);\n const revision = inst.revision;\n const dirtyRanges = inst.dirtyRanges;\n const sameRevision = (cached: InstanceBufferCacheEntry): boolean =>\n revision === undefined\n ? cached.uploadedRevision === undefined\n : cached.uploadedRevision === revision;\n const fullRange = [{ start: 0, end: inst.instanceCount }] as const;\n let instanceBuffer: Buffer = pipelineState.identityInstanceBuffer;\n let instanceCount = 1;\n {\n // feat-20260526-pbr-uniform-fallback-no-storage-buffer M3 / w13:\n // caps.storageBuffer===false -> uniform fallback with 128-instance\n // cap (128 * 64B = 8192B < WebGL2 min 16384B UBO limit).\n // caps.storageBuffer===true -> existing storage buffer path unchanged.\n const uniformFallback = runtime.device.caps.storageBuffer === false;\n let instanceBufferUsage = GPU_BUFFER_USAGE_STORAGE | GPU_BUFFER_USAGE_COPY_DST;\n\n if (uniformFallback && inst.instanceCount > MAX_UNIFORM_INSTANCES) {\n const ownerKey = instanceCollectionCacheKey(entry.source.worldId, inst);\n const chunks = frameState.instanceBufferChunks;\n const activeKeys = new Set<string>();\n const draws: GeometryInstanceDraw[] = [];\n const uniformStrideBytes = 16 * Float32Array.BYTES_PER_ELEMENT;\n const dirty = inst.dirtyRanges ?? fullRange;\n const uploadedRanges: { start: number; end: number }[] = [];\n let uploadedBytes = 0;\n for (let start = 0; start < inst.instanceCount; start += MAX_UNIFORM_INSTANCES) {\n const count = Math.min(MAX_UNIFORM_INSTANCES, inst.instanceCount - start);\n const chunkKey = `${ownerKey}:${start}`;\n activeKeys.add(chunkKey);\n const payloadBytes = count * uniformStrideBytes;\n const previous = chunks?.get(chunkKey);\n let active =\n previous !== undefined &&\n previous.uploadedArchVersion === inst.archVersion &&\n previous.uploadedByteLength === payloadBytes\n ? previous\n : undefined;\n let activeIsNew = false;\n if (active === undefined) {\n const created = runtime.device.createBuffer({\n size: INSTANCE_UBO_FULL_ARRAY_BYTES,\n usage: GPU_BUFFER_USAGE_UNIFORM | GPU_BUFFER_USAGE_COPY_DST,\n mappedAtCreation: false,\n });\n if (!created.ok) {\n runtime.errorRegistry.fire(created.error);\n reportInstanceFailure(\n c,\n inst,\n created.error,\n inst.instanceCount * uniformStrideBytes,\n MAX_UNIFORM_INSTANCES * uniformStrideBytes,\n );\n return null;\n }\n if (previous !== undefined && !previous.buffer.isDestroyed) {\n const destroyed = previous.buffer.destroy();\n if (!destroyed.ok) runtime.errorRegistry.fire(destroyed.error);\n }\n active = {\n buffer: new GpuBuffer(runtime.device, created.value),\n uploadedArchVersion: inst.archVersion,\n uploadedByteLength: payloadBytes,\n };\n activeIsNew = true;\n chunks?.set(chunkKey, active);\n if (chunks === undefined) frameState.transientInstanceBuffers.push(active);\n }\n const localRanges = dirty\n .map((range) => ({\n start: Math.max(start, range.start) - start,\n end: Math.min(start + count, range.end) - start,\n }))\n .filter((range) => range.end > range.start);\n const needsUpload = activeIsNew || !sameRevision(active);\n const rangesToUpload = instanceUploadRangesForResident(activeIsNew, localRanges, {\n start: 0,\n end: count,\n });\n if (needsUpload && rangesToUpload.length > 0) {\n const upload = uploadInstanceRanges(\n c,\n inst,\n active.buffer.handle,\n rangesToUpload,\n false,\n start,\n entry.source.temporal?.previousInstances,\n );\n for (const range of upload.ranges) {\n uploadedRanges.push({ start: range.start + start, end: range.end + start });\n }\n uploadedBytes += upload.bytes;\n if (!upload.ok) {\n reportInstanceFailure(\n c,\n inst,\n {\n code: 'queue-write-buffer-failed',\n expected: 'the renderer-owned instance uniform buffer accepts the dirty range',\n hint: 'retry after the active device is healthy or recover the renderer',\n },\n inst.instanceCount * uniformStrideBytes,\n MAX_UNIFORM_INSTANCES * uniformStrideBytes,\n );\n return null;\n }\n }\n if (needsUpload) {\n const published =\n revision === undefined ? active : { ...active, uploadedRevision: revision };\n active = published;\n chunks?.set(chunkKey, published);\n }\n draws.push({\n instanceBuffer: active.buffer.handle,\n instanceBindGroup: resolveGeometryInstancesBindGroup(\n c,\n active.buffer.handle,\n probeBinding?.buffer,\n ),\n probeOffset: probeBinding?.offset ?? -1,\n instanceCount: count,\n });\n }\n if (chunks !== undefined) {\n const prefix = `${ownerKey}:`;\n for (const [key, stale] of chunks.entries()) {\n if (!key.startsWith(prefix) || activeKeys.has(key)) continue;\n if (!stale.buffer.isDestroyed) {\n const destroyed = stale.buffer.destroy();\n if (!destroyed.ok) runtime.errorRegistry.fire(destroyed.error);\n }\n chunks.delete(key);\n }\n }\n reportInstanceResidency(c, inst, {\n lane: 'chunked-uniform',\n requestedBytes: inst.instanceCount * uniformStrideBytes,\n supportedBytes: MAX_UNIFORM_INSTANCES * uniformStrideBytes,\n uploadRanges: uploadedRanges,\n uploadedBytes,\n });\n return draws;\n }\n if (uniformFallback) {\n instanceBufferUsage = GPU_BUFFER_USAGE_UNIFORM | GPU_BUFFER_USAGE_COPY_DST;\n }\n\n {\n // Cap-gate (LimitExceededDetail single emit point — feat-20260514\n // M3 / w15 anchor): `requestedBytes <= maxStorageBufferBindingSize`.\n // Derive the size from the authoring count; storage packing is deferred\n // until uploadInstanceRanges confirms a new or dirty resident.\n const requestedBytes =\n inst.instanceCount *\n (uniformFallback ? 16 : INSTANCE_STORAGE_STRIDE_FLOATS) *\n Float32Array.BYTES_PER_ELEMENT;\n const cap = runtime.device.limits.maxStorageBufferBindingSize;\n if (!uniformFallback && typeof cap === 'number' && cap > 0 && requestedBytes > cap) {\n const chunked = resolveStorageInstanceChunks(\n c,\n entry,\n inst,\n cap,\n probeBinding?.buffer,\n probeBinding?.offset ?? -1,\n );\n return chunked;\n } else {\n // Look up the cached GPU buffer or create a fresh one when the\n // archetype version bumped or the byte length changed.\n // entityCacheKey is the worldEntityKey + collectionId namespace.\n const cached = frameState.instanceBuffers.get(entityCacheKey);\n let active: InstanceBufferCacheEntry | null = null;\n let activeIsNew = false;\n if (\n cached !== undefined &&\n cached.uploadedArchVersion === inst.archVersion &&\n cached.uploadedByteLength === requestedBytes\n ) {\n active = cached;\n } else if (requestedBytes > 0) {\n const bufRes = runtime.device.createBuffer({\n size: uniformFallback ? INSTANCE_UBO_FULL_ARRAY_BYTES : requestedBytes,\n usage: instanceBufferUsage,\n mappedAtCreation: false,\n });\n if (!bufRes.ok) {\n runtime.errorRegistry.fire(bufRes.error);\n reportInstanceFailure(c, inst, bufRes.error, requestedBytes, cap);\n } else {\n // feat-20260619 M4 / F12: destroy the old cached buffer\n // before replacing it with the new one (D-6).\n if (cached !== undefined && !cached.buffer.isDestroyed) {\n const r = cached.buffer.destroy();\n if (!r.ok) runtime.errorRegistry.fire(r.error);\n }\n const newBuffer = new GpuBuffer(runtime.device, bufRes.value);\n active = {\n buffer: newBuffer,\n uploadedArchVersion: inst.archVersion,\n uploadedByteLength: requestedBytes,\n };\n activeIsNew = true;\n if (active !== null) {\n // Keep the collection identity in the worldEntityKey namespace.\n frameState.instanceBuffers.set(entityCacheKey, active);\n }\n }\n }\n if (active !== null) {\n const needsUpload = activeIsNew || !sameRevision(active);\n const ranges = instanceUploadRangesForResident(\n activeIsNew,\n dirtyRanges ?? fullRange,\n fullRange[0],\n );\n let uploadRanges: readonly { readonly start: number; readonly end: number }[] = [];\n let uploadedBytes = 0;\n if (needsUpload && ranges.length > 0) {\n const upload = uploadInstanceRanges(\n c,\n inst,\n active.buffer.handle,\n ranges,\n !uniformFallback,\n 0,\n entry.source.temporal?.previousInstances,\n );\n uploadRanges = upload.ranges;\n uploadedBytes = upload.bytes;\n if (!upload.ok) {\n reportInstanceFailure(\n c,\n inst,\n {\n code: 'queue-write-buffer-failed',\n expected: 'the renderer-owned instance buffer accepts the dirty ranges',\n hint: 'retry after the active device is healthy or recover the renderer',\n },\n requestedBytes,\n uniformFallback\n ? MAX_UNIFORM_INSTANCES * Float32Array.BYTES_PER_ELEMENT * 16\n : typeof cap === 'number'\n ? cap\n : undefined,\n );\n return null;\n }\n }\n if (needsUpload) {\n const published =\n revision === undefined ? active : { ...active, uploadedRevision: revision };\n frameState.instanceBuffers.set(entityCacheKey, published);\n active = published;\n }\n instanceBuffer = active.buffer.handle;\n instanceCount = Math.max(1, inst.instanceCount);\n reportInstanceResidency(c, inst, {\n lane: uniformFallback ? 'direct-uniform' : 'direct-storage',\n requestedBytes,\n supportedBytes: uniformFallback\n ? MAX_UNIFORM_INSTANCES * Float32Array.BYTES_PER_ELEMENT * 16\n : typeof cap === 'number'\n ? cap\n : undefined,\n uploadRanges,\n uploadedBytes,\n });\n clearInstanceChunksForOwner(c, entityCacheKey);\n }\n }\n // The cache write above is keyed by worldEntityKey(worldId, cacheKey)\n // so separate worlds cannot alias their instance buffers.\n }\n }\n return [\n {\n instanceBuffer,\n instanceBindGroup: resolveGeometryInstancesBindGroup(c, instanceBuffer, probeBinding?.buffer),\n probeOffset: probeBinding?.offset ?? -1,\n instanceCount,\n },\n ];\n}\n\nexport function resolveProbeBlendBuffer(\n c: _InternalRenderPipelineContext,\n record: import('../scene/probe-blend-record').ProbeBlendRecord | undefined,\n entityKey?: number,\n): { readonly buffer: Buffer; readonly offset: number } {\n const { runtime, frameState } = c;\n const usage = runtime.device.caps.storageBuffer\n ? GPU_BUFFER_USAGE_STORAGE | GPU_BUFFER_USAGE_COPY_DST\n : GPU_BUFFER_USAGE_UNIFORM | GPU_BUFFER_USAGE_COPY_DST;\n if (record === undefined) throw new Error('probe blend record is required for probe allocation');\n if (entityKey === undefined) throw new Error('probe blend record requires an entity key');\n const offset = probeBlendRecordOffset(record.objectKey);\n const requiredCapacity = record.objectKey + 2;\n let buffer = frameState.probeBlendRecordBuffer;\n if (buffer === undefined || frameState.probeBlendRecordBufferCapacity < requiredCapacity) {\n const created = runtime.device.createBuffer({\n label: 'probe-blend-records',\n size: requiredCapacity * PROBE_BLEND_RECORD_STRIDE,\n usage,\n mappedAtCreation: false,\n });\n if (!created.ok) throw created.error;\n buffer = new GpuBuffer(runtime.device, created.value);\n frameState.probeBlendRecordBuffer = buffer;\n frameState.probeBlendRecordBufferCapacity = requiredCapacity;\n // The cache is tied to the previous backing allocation. A new buffer has\n // no valid record contents, so every later object must upload its full\n // 160B payload even when generation/bytes match the old allocation.\n frameState.probeBlendBuffers.clear();\n }\n const cached = frameState.probeBlendBuffers.get(entityKey);\n const unchanged =\n cached !== undefined &&\n cached.generation === record.generation &&\n cached.bytes.length === record.bytes.length &&\n cached.bytes.every((value, index) => value === record.bytes[index]);\n if (!unchanged) {\n const uploaded = runtime.device.queue.writeBuffer(buffer.handle, offset, record.bytes);\n if (!uploaded.ok) throw uploaded.error;\n // Publish the generation only after the complete 160B queue write succeeds.\n frameState.probeBlendBuffers.set(entityKey, {\n generation: record.generation,\n bytes: new Uint8Array(record.bytes),\n });\n }\n return { buffer: buffer.handle, offset };\n}\n\nexport function resolveGeometryInstancesBindGroup(\n c: _InternalRenderPipelineContext,\n instanceBuffer: Buffer,\n probeBuffer?: Buffer,\n): BindGroup {\n const { runtime, pipelineState, frameState, bindGroupCounts } = c;\n const layout =\n probeBuffer === undefined\n ? pipelineState.instancesBindGroupLayout\n : pipelineState.probeInstancesBindGroupLayout;\n if (layout === undefined) throw new Error('probe instances bind-group layout is unavailable');\n // A few record-only fixtures construct a minimal frame state and omit the\n // shared bind-group cache. Production frames always provide it, but keeping\n // this resolver total lets those fixtures exercise the same binding path\n // without weakening the production cache contract.\n const instancesBgShared = frameState.instancesBgShared ?? new WeakMap<object, unknown>();\n return getOrCreateFromChain(\n instancesBgShared,\n probeBuffer === undefined ? [layout, instanceBuffer] : [layout, instanceBuffer, probeBuffer],\n probeBuffer === undefined ? 'instances-no-probe' : 'instances-probe',\n () => {\n const result = runtime.device.createBindGroup({\n label: 'pbr-instances-bg',\n layout,\n entries: [\n {\n binding: 0,\n resource: {\n kind: 'buffer',\n value: { buffer: instanceBuffer },\n },\n },\n ...(probeBuffer === undefined\n ? []\n : [\n {\n binding: 1,\n resource: {\n kind: 'buffer' as const,\n value: { buffer: probeBuffer, offset: 0, size: PROBE_BLEND_RECORD_BYTE_SIZE },\n },\n },\n ]),\n ],\n });\n if (!result.ok) throw result.error;\n return result.value;\n },\n bindGroupCounts,\n );\n}\n","// @forgeax/engine-runtime - RenderSystem record stage: main-pass sprite draws.\n// feat-20260704 M5/w31: further-split from main-pass.ts (AC-05 <=1500 lines/file).\n// recordSpritePass + sprite entity/transparent/instance-buffer helpers, moved verbatim.\n\nimport type { World } from '@forgeax/engine-ecs';\nimport {\n type BindGroup,\n type Buffer,\n type RenderPipeline,\n RhiError,\n type RhiRenderPassEncoder,\n} from '@forgeax/engine-rhi';\nimport type { MaterialRenderState } from '@forgeax/engine-types';\nimport { GpuBuffer } from '../gpu-resource';\nimport {\n GPU_BUFFER_USAGE_COPY_DST,\n GPU_BUFFER_USAGE_STORAGE,\n GPU_BUFFER_USAGE_UNIFORM,\n} from '../gpu-usage';\nimport type { InstanceBufferCacheEntry } from '../instance-buffer-cache';\nimport { SPRITE_PREMULTIPLIED_ALPHA_BLEND } from '../materials';\nimport { SPRITE_PASS_PER_INSTANCE_REGION_VARIANT_SET } from '../pbr-pipeline';\nimport { buildBeginRenderPassDescriptor, standardTopologyVariantSet } from '../pipeline-spec';\nimport type {\n DispatchEntry,\n MaterialSnapshot,\n SpriteInstancesSnapshot,\n} from '../render-system-extract';\nimport { worldEntityKey } from './frame-snapshot';\nimport { recordGeometryDraws, resolveGeometryInstancesBindGroup } from './main-pass-geometry';\nimport {\n MAX_UNIFORM_INSTANCES,\n MESH_PER_ENTITY_STRIDE,\n packInstanceStorageBuffer,\n} from './mesh-ssbo';\nimport type { _InternalRenderPipelineContext } from './render-context';\nimport { MATERIAL_PER_ENTITY_STRIDE } from './render-context';\n\nexport type { SpriteInstancesSnapshot };\n\n/**\n * Build the interleaved sprite instance payload consumed by this record owner.\n * The extract stage validates the two packed arrays before they reach this\n * function, so the record path has one source of count-mismatch errors.\n */\nexport function interleaveSpriteInstanceBuffer(\n transforms: Float32Array,\n regions: Float32Array,\n includePrevious = false,\n): Float32Array {\n const count = transforms.length / 16;\n const stride = includePrevious ? 36 : 20;\n const regionOffset = includePrevious ? 32 : 16;\n const out = new Float32Array(count * stride);\n for (let i = 0; i < count; i++) {\n const dstBase = i * stride;\n const transformBase = i * 16;\n const regionBase = i * 4;\n for (let k = 0; k < 16; k++) out[dstBase + k] = transforms[transformBase + k] ?? 0;\n if (includePrevious) {\n for (let k = 0; k < 16; k++) {\n out[dstBase + 16 + k] = transforms[transformBase + k] ?? 0;\n }\n }\n for (let k = 0; k < 4; k++) {\n out[dstBase + regionOffset + k] = regions[regionBase + k] ?? 0;\n }\n }\n return out;\n}\n\n/**\n * Check whether the existing per-entity sprite buffer still matches the\n * extract snapshot and interleaved byte count.\n */\nexport function spriteInstancesCacheHit(\n entry: InstanceBufferCacheEntry | undefined,\n snapshot: SpriteInstancesSnapshot,\n requestedBytes: number,\n): boolean {\n return (\n entry !== undefined &&\n entry.uploadedArchVersion === snapshot.archVersion &&\n entry.uploadedByteLength === requestedBytes\n );\n}\n\n/**\n * Decide whether the LDR record needs the transparent sprite sub-pass. This\n * remains beside the sprite record owner so the frame stage and draw stage\n * share the same transparent-material rule.\n */\nexport function computeSplitLdrSprite(\n validatedOrdered: readonly (\n | {\n readonly source: {\n readonly material: MaterialSnapshot;\n readonly materials?: readonly MaterialSnapshot[];\n };\n }\n | undefined\n )[],\n tonemapActive: boolean,\n dispatch?: readonly DispatchEntry[],\n): boolean {\n if (tonemapActive) return false;\n if (dispatch !== undefined && dispatch.length > 0) {\n return dispatch.some(\n (pass) => pass.tags.LightMode === 'Forward' && pass.renderState?.blend !== undefined,\n );\n }\n for (const entry of validatedOrdered) {\n if (entry === undefined) continue;\n const materials = entry.source.materials;\n if (materials !== undefined) {\n if (materials.some((material) => material.transparent === true)) return true;\n } else if (entry.source.material.transparent === true) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * feat-20260704 M3/w19: LDR sprite split sub-pass, extracted verbatim from\n * recordMainPass. Runs after the geometry pass when there are sprite / LDR\n * transparent entities and the split path is active (splitLdrSprite && a raw\n * unorm swap-chain view exists). Ends the geometry `pass`, opens a `spritePass`\n * on the resolved transparent-pass view (loadOp=load), draws the sprite / sprite-lit\n * entities (fold-instanced where possible) then the generic per-submesh\n * transparent PBR submeshes, and ends the sprite pass. Returns the updated\n * `geometryPassEnded` flag so the caller skips the unconditional pass.end().\n *\n * @internal\n */\nexport function recordSpritePass(\n c: _InternalRenderPipelineContext,\n pass: RhiRenderPassEncoder,\n matchedIndices: Set<number> | null,\n materialSlotIndices: readonly (readonly number[])[],\n sampleCount: number,\n resolveMaterialBindGroup: (\n materialSlot: number,\n submeshMaterial: MaterialSnapshot,\n entityKey: number,\n materialWorld: World,\n materialShaderId?: string,\n ) => BindGroup,\n graphPass?: RhiRenderPassEncoder,\n selectedDispatch?: readonly DispatchEntry[],\n): boolean {\n const {\n runtime,\n pipelineState,\n encoder,\n msaaActive,\n ldrSpritePassView,\n ldrSpriteColorView,\n geometryDepthView,\n viewBindGroup,\n meshBindGroup,\n hdrpClusterBindGroup,\n viewBindGroupDynamicOffset = 0,\n splitLdrSprite,\n } = c;\n const clusteredLighting = c.standardLighting?.kind === 'clustered';\n const meshGroup2 = clusteredLighting ? hdrpClusterBindGroup : meshBindGroup;\n // The split pass is also used by the no-tone linear-LDR route. That route\n // keeps transparent draws in the graph-owned rgba16float attachment, so\n // sprite shaders must use their linear/HDR fragment entry point even though\n // the camera itself has no tone map enabled.\n const spriteIsHdr =\n c.tonemapActive || transparentPassColorFormat(c, pipelineState) === 'rgba16float';\n let geometryPassEnded = false;\n if (splitLdrSprite && (graphPass !== undefined || ldrSpritePassView !== null)) {\n if (graphPass === undefined) {\n pass.end();\n geometryPassEnded = true;\n }\n\n // feat-20260604 M2 / w9 (F-1): under MSAA the sprite sub-pass writes the\n // count=4 transparent-pass view of the SAME multisample texture the\n // geometry pass wrote (loadOp=load preserves geometry under sprites) and\n // resolves the combined result to the single-sample transparent-pass\n // view at this (last) pass end. Depth reuses the shared count=4\n // multisample depth (depthLoadOp=load preserves sprite-vs-mesh occlusion).\n // The single-\n // sample path is byte-for-byte unchanged (writes the swap-chain view).\n const spriteColorView = msaaActive ? ldrSpriteColorView : ldrSpritePassView;\n // sprite-split sub-pass: forward shape with both color and depth loaded\n // (preserves prior content from the main forward pass under the sprites).\n // Stencil ops auto-emitted by the helper because depthFormat carries\n // stencil8.\n const spritePass: RhiRenderPassEncoder =\n graphPass ??\n encoder.beginRenderPass(\n buildBeginRenderPassDescriptor(\n {\n // SSOT for the sprite-pass color format is the resolved transparent\n // attachment. Native linear-LDR frames use graph-owned `ldrColor`\n // (possibly rgba16float); swap-chain fallback frames use their raw\n // storage format. WebGPU requires the attachment format and PSO\n // target to match, so both are resolved by the same helper.\n colorFormats: [transparentPassColorFormat(c) as GPUTextureFormat],\n depthFormat: 'depth24plus-stencil8',\n sampleCount: msaaActive ? 4 : 1,\n },\n {\n colorViews: [spriteColorView],\n depthView: geometryDepthView,\n ...(msaaActive ? { resolveTargets: [ldrSpritePassView] } : {}),\n },\n 'forward',\n { colorLoadOp: 'load', depthLoadOp: 'load' },\n ) as never,\n );\n\n spritePass.setBindGroup(0, viewBindGroup as BindGroup, [viewBindGroupDynamicOffset, 0]);\n\n // feat-20260625-refactor-sprite-as-transparent-mesh M3 / w14 (D-7):\n // sprite PSO resolution migrated from the dedicated boot-time PSO\n // fields (deleted) to the generic per-MaterialShader pipeline cache.\n // feat-20260626-collapse M2 / M2-T2: blend factor pair literal moved\n // to the public `SPRITE_PREMULTIPLIED_ALPHA_BLEND` named constant\n // (re-exported from `@forgeax/engine-runtime`) so each AI user\n // building a transparent material declares the same blend by\n // reference; the previous implicit blend-state factory helper is\n // gone. Cache miss still surfaces as a structured\n // `shader-compile-failed` RhiError mirroring the pre-w14 behaviour.\n //\n // feat-20260608-tilemap-object-layer-rendering M2 / m2-t6 (D-8): sprite\n // pipeline cullMode='none'. H/V flip via negative scale x/y (tilemap\n // per-cell entity TRS form) inverts the triangle winding; cullMode='back'\n // would throw the flipped quad away. The sprite pass runs in the\n // alpha-blend transparent bucket back-to-front already, so cullMode='none'\n // adds no overdraw cost. Pre-feat-20260625 the dedicated spritePipeline\n // hard-coded 'none' (deleted in w14); the generic path must replicate\n // it here or the cullmode-flip dawn smoke goes black on negative-scale.\n const spritePremulBlend: MaterialRenderState = {\n depthWriteEnabled: false,\n depthCompare: 'less-equal',\n cullMode: 'none',\n blend: SPRITE_PREMULTIPLIED_ALPHA_BLEND,\n };\n // bug-20260629: PR #526 added PER_INSTANCE_REGION as a second variant\n // axis on sprite.wgsl. Build BOTH variants here; the per-entity loop\n // picks the right one based on whether the entity carries a\n // SpriteInstances snapshot:\n // - spritePH (PER_INSTANCE_REGION=false): regular per-entity sprites\n // + fold-bucket instanced draws (64-byte mat4 only instance buf);\n // UV region comes from the material UBO `region` slot.\n // - spritePH_withRegion (PER_INSTANCE_REGION=true): SpriteInstances\n // entities with 80-byte interleaved (mat4 64B + region 16B) per\n // instance; UV region comes from `instances[idx].region`.\n //\n // Without spritePH_withRegion the SpriteInstances data was uploaded\n // but the shader read bytes 64-79 as region=0 → black quads.\n //\n // feat-20260624-sprite-lit-shading-model-pure-2d-lighting M1' / t7:\n // sprite-lit walks the same LDR transparent split pass with mirror\n // PSO request shape (only materialShaderId string differs). The\n // sprite-lit PSO is fetched lazily per-entity below since the pass\n // mixes sprite + sprite-lit transparent entities. PSO cache strings\n // are isolated by `materialShaderId` (D-11), no slot collision.\n const spritePH =\n runtime.getMaterialShaderPipeline?.(\n 'forgeax::sprite',\n spriteIsHdr,\n spritePremulBlend,\n 'triangle-list',\n undefined,\n undefined,\n 'forward',\n undefined,\n msaaActive ? 4 : 1,\n // feat-20260625-refactor-sprite-as-transparent-mesh R2 fix-up:\n // the split sub-pass PSO must use the same attachment format as the\n // encoder. Native linear-LDR frames resolve graph-owned `ldrColor`\n // (possibly rgba16float); swap-chain fallback frames resolve their raw\n // storage format. `transparentPassColorFormat` is the single owner for\n // this format so lazy PSO construction cannot fall back to the geometry\n // sRGB view.\n transparentPassColorFormat(c, pipelineState) as GPUTextureFormat,\n ) ?? null;\n const spritePH_withRegion =\n runtime.getMaterialShaderPipeline?.(\n 'forgeax::sprite',\n spriteIsHdr,\n spritePremulBlend,\n 'triangle-list',\n undefined,\n SPRITE_PASS_PER_INSTANCE_REGION_VARIANT_SET,\n 'forward',\n undefined,\n msaaActive ? 4 : 1,\n transparentPassColorFormat(c) as GPUTextureFormat,\n ) ?? null;\n\n // bug-20260629: spritePH===null check moved OUTSIDE the entity loop so the\n // sprite pass is properly ended before returning. Inside the loop the early\n // `return` left spritePass open → render-pass-not-ended error every frame\n // where the pipeline is still being compiled (frame 0 on first load).\n //\n // feat-city-glb Bug 5: a missing sprite PSO must NOT abort the whole\n // sub-pass — the generic per-submesh PBR transparent loop below does not\n // depend on the sprite shader. Only skip the sprite ENTITIES when spritePH\n // is null (fire the diagnostic once, iff a sprite entity is actually\n // present), then fall through to the PBR loop. A PBR-only transparent\n // scene (e.g. a glTF BLEND decal, no sprites) renders regardless of\n // whether sprite.wgsl is in the manifest.\n let spriteUnavailableReported = false;\n const reportSpriteUnavailable = (): void => {\n if (spriteUnavailableReported) return;\n spriteUnavailableReported = true;\n runtime.errorRegistry.fire(\n new RhiError({\n code: 'shader-compile-failed',\n expected:\n 'manifest entries include sprite.wgsl + the engine triple (pbr + unlit + tonemap)',\n hint: 'verify @forgeax/engine-vite-plugin-shader emits manifest.json with the 4 engine entries (sprite.wgsl is required when spawning sprite materials); check vite plugin engineEntries option',\n }),\n );\n };\n\n // feat-20260624 M1' / t7: parallel sprite-lit PSO request — same\n // arg shape, only materialShaderId differs.\n const spriteLitPH =\n runtime.getMaterialShaderPipeline?.(\n 'forgeax::sprite-lit',\n spriteIsHdr,\n spritePremulBlend,\n 'triangle-list',\n undefined,\n // sprite-lit declares the same Standard capability axes as PBR. The\n // boot artifact is intentionally the direct compatibility variant,\n // so a clustered frame must request its explicit Cluster artifact;\n // otherwise the host binds the unified group(2) while the shader\n // still reads the now-cleared direct-light headers.\n standardTopologyVariantSet(c.standardLighting, runtime.device.caps.storageBuffer, false),\n 'forward',\n undefined,\n msaaActive ? 4 : 1,\n transparentPassColorFormat(c) as GPUTextureFormat,\n ) ?? null;\n recordSpriteEntityDraws(\n c,\n spritePass,\n matchedIndices,\n resolveMaterialBindGroup,\n spritePH,\n spritePH_withRegion,\n spriteLitPH,\n reportSpriteUnavailable,\n );\n\n // Keep program, geometry, bindings and dynamic offsets on the common draw path.\n recordSpriteTransparentPbrDraws(\n c,\n spritePass,\n matchedIndices,\n materialSlotIndices,\n sampleCount,\n resolveMaterialBindGroup,\n meshGroup2,\n selectedDispatch,\n );\n\n if (graphPass === undefined) spritePass.end();\n }\n return geometryPassEnded;\n}\n\n/** Non-sprite transparent Passes use the same geometry and binding owner as opaque draws. */\nfunction recordSpriteTransparentPbrDraws(\n c: _InternalRenderPipelineContext,\n pass: RhiRenderPassEncoder,\n matchedIndices: Set<number> | null,\n materialSlotIndices: readonly (readonly number[])[],\n sampleCount: number,\n resolveMaterialBindGroup: (\n slot: number,\n material: MaterialSnapshot,\n entityKey: number,\n world: World,\n shader?: string,\n ) => BindGroup,\n meshGroup2: BindGroup | null,\n selectedDispatch?: readonly DispatchEntry[],\n): void {\n const isSprite = (shader: string | undefined) =>\n shader === 'forgeax::sprite' || shader === 'forgeax::sprite-lit';\n const passes = selectedDispatch?.filter(\n (entry) =>\n entry.renderState?.blend !== undefined &&\n !isSprite(entry.materialShaderId) &&\n (matchedIndices === null || matchedIndices.has(entry.renderableIndex)),\n );\n const matched = new Map<number, Set<number>>();\n const add = (index: number, handle: number) => {\n let handles = matched.get(index);\n if (handles === undefined) {\n handles = new Set();\n matched.set(index, handles);\n }\n handles.add(handle);\n };\n if (passes !== undefined) {\n for (const entry of passes) add(entry.renderableIndex, entry.materialHandle);\n } else {\n for (const entry of c.validatedOrdered) {\n if (matchedIndices !== null && !matchedIndices.has(entry.renderableIndex)) continue;\n if (isSprite(entry.source.material.materialShaderId)) continue;\n for (const material of entry.source.materials) {\n if (material.transparent === true) add(entry.renderableIndex, material.materialHandle ?? 0);\n }\n }\n }\n recordGeometryDraws(\n {\n ...c,\n splitLdrSprite: false,\n transparentColorFormat: transparentPassColorFormat(c) as GPUTextureFormat,\n },\n pass,\n matched,\n materialSlotIndices,\n sampleCount,\n meshGroup2,\n c.meshBindGroup,\n resolveMaterialBindGroup,\n 'forward',\n passes,\n );\n}\n\n/**\n * feat-20260704 M3/w19: per-entity sprite / sprite-lit draw loop for the LDR\n * blend sub-pass, extracted verbatim from the sprite split pass. Selects the\n * sprite vs sprite-lit PSO per entity, resolves the per-entity / fold-bucket\n * instance buffer (fold-instanced drawIndexed where a fold bucket applies and\n * the entity has no explicit Instances), uploads the per-entity sprite material\n * UBO slice, binds view / material / mesh / instances groups, and issues the\n * draw. Non-sprite transparent submeshes are drawn separately\n * (recordSpriteTransparentPbrDraws). The loop-invariant sprite PSO handles + the\n * once-per-frame sprite-unavailable diagnostic are threaded in.\n *\n * @internal\n */\nfunction recordSpriteEntityDraws(\n c: _InternalRenderPipelineContext,\n spritePass: RhiRenderPassEncoder,\n matchedIndices: Set<number> | null,\n resolveMaterialBindGroup: (\n materialSlot: number,\n material: MaterialSnapshot,\n entityKey: number,\n materialWorld: World,\n ) => BindGroup,\n spritePH: RenderPipeline | null,\n spritePH_withRegion: RenderPipeline | null,\n spriteLitPH: RenderPipeline | null,\n reportSpriteUnavailable: () => void,\n): void {\n const {\n runtime,\n world,\n pipelineState,\n frameState,\n validatedOrdered,\n meshBindGroup,\n foldDispatchPlan,\n materialSlotIndices,\n } = c;\n let lastSpritePipelineHandle: RenderPipeline | null = null;\n let lastSpriteVertexBuffer: GpuBuffer | null = null;\n let lastSpriteIndexBuffer: GpuBuffer | null = null;\n for (let i = 0; i < validatedOrdered.length; i++) {\n const spriteEntry = validatedOrdered[i];\n // feat-20260625 M3 / w13: sub-pass entity filter migrated from\n // `shadingModel === 'sprite'` to `transparent === true` — the\n // shadingModel arm is gone post-feat (plan-strategy D-3).\n if (spriteEntry === undefined || spriteEntry.source.material.transparent !== true) continue;\n // feat-city-glb Bug 5 (per-submesh transparency): this loop is the\n // SPRITE path (whole-mesh sprite / sprite-lit PSO). Non-sprite\n // transparent materials (built-in PBR, incl. glTF alphaMode=BLEND) are\n // drawn per-submesh with their real shader in the dedicated PBR loop\n // below — so skip them here. Previously the 4.3-blending window (a PBR\n // material) was drawn through here with the sprite shader; it now flows\n // through the PBR loop, which is both correct and multi-submesh-capable.\n {\n const sid = spriteEntry.source.material.materialShaderId;\n const isSpriteShader = sid === 'forgeax::sprite' || sid === 'forgeax::sprite-lit';\n if (!isSpriteShader) continue;\n }\n // feat-20260622-chunk-gpu-instancing-sprite-tilemap M1 / w4-record-swap\n // (D-1): fold-bucket non-head member — skip; the bucket head emits one\n // instanced drawIndexed covering all members.\n if (foldDispatchPlan?.skipIndices.has(i) === true) {\n continue;\n }\n const foldHeadBucket = foldDispatchPlan?.headBuckets.get(i);\n\n // feat-20260609 M2: skip entities that don't match the pass selector.\n if (matchedIndices !== null && !matchedIndices.has(spriteEntry.renderableIndex)) {\n continue;\n }\n\n // feat-20260624 M1' / t7: select sprite vs sprite-lit PSO per\n // entity. Both paths share the LDR sub-pass + the same UBO\n // layout; only the shader module + fragment math differ. PSO\n // cache strings are isolated by materialShaderId (D-11) so\n // routing here keeps the cache slots disjoint.\n //\n // bug-20260629: SpriteInstances entities additionally need the\n // PER_INSTANCE_REGION=true variant so the shader reads UV region\n // from the 80B-per-instance interleaved buffer rather than from\n // the material UBO. Only the base sprite path has the per-instance\n // region variant compiled; sprite-lit + non-instances entities\n // keep the PER_INSTANCE_REGION=false variant.\n const entityShaderId = spriteEntry.source.material.materialShaderId;\n const useRegionVariant =\n entityShaderId !== 'forgeax::sprite-lit' && spriteEntry.source.spriteInstances !== undefined;\n const activeSpritePH =\n entityShaderId === 'forgeax::sprite-lit'\n ? spriteLitPH\n : useRegionVariant\n ? spritePH_withRegion\n : spritePH;\n if (activeSpritePH === null) {\n // Variant not yet compiled — for PER_INSTANCE_REGION=true the\n // variant cache fill is async on first use (mirrors the\n // spritePH===null guard above); falling back to the non-region\n // variant would render black quads (region read returns 0).\n // For sprite-lit the manifest may lack sprite-lit.wgsl; either\n // way fail-safe-skip is the closest the renderer can get to\n // \"show nothing visibly wrong\" without ending the sprite pass\n // (which would drop remaining sprite entities for the frame).\n if (entityShaderId === 'forgeax::sprite') {\n reportSpriteUnavailable();\n } else if (entityShaderId === 'forgeax::sprite-lit') {\n runtime.errorRegistry.fire(\n new RhiError({\n code: 'shader-compile-failed',\n expected:\n 'manifest entries include sprite.wgsl + sprite-lit.wgsl (when sprite-lit materials are used) + the engine triple (pbr + unlit + tonemap)',\n hint: 'verify @forgeax/engine-vite-plugin-shader emits manifest.json with sprite.wgsl AND sprite-lit.wgsl entries; check vite plugin engineEntries option',\n }),\n );\n }\n continue;\n }\n if (lastSpritePipelineHandle !== activeSpritePH) {\n spritePass.setPipeline(activeSpritePH);\n lastSpritePipelineHandle = activeSpritePH;\n }\n\n if (spriteEntry.mesh.vertexBuffer !== lastSpriteVertexBuffer) {\n spritePass.setVertexBuffer(0, spriteEntry.mesh.vertexBuffer.handle);\n lastSpriteVertexBuffer = spriteEntry.mesh.vertexBuffer;\n }\n const indexBuffer = spriteEntry.mesh.indexBuffer;\n if (indexBuffer !== null && indexBuffer !== lastSpriteIndexBuffer) {\n spritePass.setIndexBuffer(indexBuffer.handle, spriteEntry.mesh.indexFormat);\n lastSpriteIndexBuffer = indexBuffer;\n }\n\n // Instance buffer resolution: same cap-gate logic as the geometry\n // pass entity loop; sprites with Instances (e.g. hello-sprite-atlas\n // 100-instance walk-cycle) require per-entity storage buffer upload.\n // SSOT mirror of geometry pass instances block above (~line 1610):\n // identical cap-gate sequence (storageBuffer cap → limit-exceeded →\n // cache-lookup → createBuffer → writeBuffer); variable names carry\n // \"sprite\" prefix; logic divergence would be a bug.\n //\n // feat-20260622-chunk-gpu-instancing-sprite-tilemap M1 / w4-record-swap\n // (D-1): when `foldHeadBucket !== undefined` AND the sprite entity has\n // no explicit Instances component, assemble the bucket transforms into\n // a transient instance buffer + override `spriteInstanceCount =\n // bucket.bucketSize`. The mesh slot at `i*MESH_PER_ENTITY_STRIDE` was\n // already overwritten to identity in the mesh SSBO upload loop above,\n // so the shader computes `world = identity * bucket.transforms[idx] *\n // pos`, per-instance correct. Entities with explicit Instances bypass\n // fold (their per-entity Instances semantic wins); bucket key forces\n // such an entity to be a singleton bucket in practice because its\n // material is distinct or unfolded, but defensively check here as a\n // belt-and-suspenders guard.\n let spriteInstanceBuffer: Buffer = pipelineState.identityInstanceBuffer;\n let spriteInstanceCount = 1;\n const spriteInst = spriteEntry.source.instances;\n const useFold = foldHeadBucket !== undefined && spriteInst === undefined;\n if (useFold && foldHeadBucket !== undefined) {\n // w6 (D-8): bucket transient buffer reuse — composite cacheKey from\n // (materialHandle, layer, validatedOrdered head index) so the\n // existing `frameState.instanceBuffers` byteLength/archVersion path\n // covers static steady-state upload-skip. Numeric Map<number,…> key\n // requires a 32-bit-safe fold; we use a negative number-space prefix\n // (-1, -2, ...) by `((materialHandle << 16) | i)` shifted into the\n // negative half so it never collides with positive entity-Instances\n // cacheKeys (which are extracted from Instances component cacheKey\n // numeric ids, always non-negative). The `archVersion` proxy is\n // bucketSize (a structural-shape signal) so static frames hit the\n // cache.\n const bucketCacheKey = -1 - (((foldHeadBucket.materialHandle & 0xffff) << 16) | (i & 0xffff));\n const uniformFallback = runtime.device.caps.storageBuffer === false;\n const bucketPayload = uniformFallback\n ? foldHeadBucket.transforms\n : packInstanceStorageBuffer(foldHeadBucket.transforms);\n const bucketBytes = bucketPayload.byteLength;\n const bucketBufUsage = uniformFallback\n ? GPU_BUFFER_USAGE_UNIFORM | GPU_BUFFER_USAGE_COPY_DST\n : GPU_BUFFER_USAGE_STORAGE | GPU_BUFFER_USAGE_COPY_DST;\n const cachedBucket = frameState.instanceBuffers.get(bucketCacheKey);\n let activeBucket: InstanceBufferCacheEntry | null = null;\n if (\n cachedBucket !== undefined &&\n cachedBucket.uploadedArchVersion === foldHeadBucket.bucketSize &&\n cachedBucket.uploadedByteLength === bucketBytes\n ) {\n activeBucket = cachedBucket;\n } else if (bucketBytes > 0) {\n const bufRes = runtime.device.createBuffer({\n size: bucketBytes,\n usage: bucketBufUsage,\n mappedAtCreation: false,\n });\n if (!bufRes.ok) {\n runtime.errorRegistry.fire(bufRes.error);\n } else {\n if (cachedBucket !== undefined && !cachedBucket.buffer.isDestroyed) {\n const r = cachedBucket.buffer.destroy();\n if (!r.ok) runtime.errorRegistry.fire(r.error);\n }\n const newBuf = new GpuBuffer(runtime.device, bufRes.value);\n activeBucket = {\n buffer: newBuf,\n uploadedArchVersion: foldHeadBucket.bucketSize,\n uploadedByteLength: bucketBytes,\n };\n frameState.instanceBuffers.set(bucketCacheKey, activeBucket);\n }\n }\n if (activeBucket !== null) {\n const writeRes = runtime.device.queue.writeBuffer(\n activeBucket.buffer.handle,\n 0,\n bucketPayload,\n );\n if (!writeRes.ok) {\n runtime.errorRegistry.fire(writeRes.error);\n } else {\n spriteInstanceBuffer = activeBucket.buffer.handle;\n spriteInstanceCount = foldHeadBucket.bucketSize;\n }\n }\n } else if (spriteInst !== undefined) {\n const uniformFallback = runtime.device.caps.storageBuffer === false;\n let spriteBufUsage = GPU_BUFFER_USAGE_STORAGE | GPU_BUFFER_USAGE_COPY_DST;\n\n if (uniformFallback) {\n if (spriteInst.instanceCount > MAX_UNIFORM_INSTANCES) {\n runtime.errorRegistry.fire(\n new RhiError({\n code: 'limit-exceeded',\n expected: `instance count <= ${MAX_UNIFORM_INSTANCES} (uniform fallback cap)`,\n hint: `reduce instance count to ${MAX_UNIFORM_INSTANCES} or use a WebGPU-capable backend`,\n detail: {\n maxStorageBufferBindingSize: MAX_UNIFORM_INSTANCES * 64,\n requestedBytes: spriteInst.instanceCount * 64,\n },\n }),\n );\n spriteInstanceCount = spriteInst.instanceCount;\n spriteInstanceBuffer = pipelineState.identityInstanceBuffer;\n // Sprite shaders do not declare the Standard PBR Probe ABI. A\n // retained scene record must therefore not change their group(3)\n // bind-group shape.\n const spriteInstBg = resolveGeometryInstancesBindGroup(\n c,\n spriteInstanceBuffer,\n undefined,\n );\n spritePass.setBindGroup(3, spriteInstBg);\n spritePass.drawIndexed(spriteEntry.mesh.indexCount, spriteInstanceCount, 0, 0, 0);\n c.onRenderableDraw?.(spriteEntry);\n continue;\n }\n spriteBufUsage = GPU_BUFFER_USAGE_UNIFORM | GPU_BUFFER_USAGE_COPY_DST;\n }\n\n {\n const instancePayload = uniformFallback\n ? spriteInst.transforms\n : packInstanceStorageBuffer(\n spriteInst.transforms,\n spriteEntry.source.temporal?.previousInstances?.transforms,\n spriteInst.generations,\n spriteEntry.source.temporal?.previousInstances?.generations,\n );\n const requestedBytes = instancePayload.byteLength;\n const cap = runtime.device.limits.maxStorageBufferBindingSize;\n if (typeof cap === 'number' && requestedBytes > cap) {\n runtime.errorRegistry.fire(\n new RhiError({\n code: 'limit-exceeded',\n expected: `requestedBytes (${requestedBytes}) <= maxStorageBufferBindingSize (${cap})`,\n hint: 'reduce the sprite batch to fit within device.limits.maxStorageBufferBindingSize or use a storage-capable backend',\n detail: {\n maxStorageBufferBindingSize: cap,\n requestedBytes,\n },\n }),\n );\n } else {\n const cachedSprite = frameState.instanceBuffers.get(\n worldEntityKey(spriteEntry.source.worldId, spriteInst.cacheKey),\n );\n let activeSprite: InstanceBufferCacheEntry | null = null;\n if (\n cachedSprite !== undefined &&\n cachedSprite.uploadedArchVersion === spriteInst.archVersion &&\n cachedSprite.uploadedByteLength === requestedBytes\n ) {\n activeSprite = cachedSprite;\n } else if (requestedBytes > 0) {\n const bufRes = runtime.device.createBuffer({\n size: requestedBytes,\n usage: spriteBufUsage,\n mappedAtCreation: false,\n });\n if (!bufRes.ok) {\n runtime.errorRegistry.fire(bufRes.error);\n } else {\n // feat-20260619 M4 / F12: destroy the old cached buffer\n // before replacing it with the new one (D-6).\n if (cachedSprite !== undefined && !cachedSprite.buffer.isDestroyed) {\n const r = cachedSprite.buffer.destroy();\n if (!r.ok) runtime.errorRegistry.fire(r.error);\n }\n const newBuf = new GpuBuffer(runtime.device, bufRes.value);\n activeSprite = {\n buffer: newBuf,\n uploadedArchVersion: spriteInst.archVersion,\n uploadedByteLength: requestedBytes,\n };\n frameState.instanceBuffers.set(\n worldEntityKey(spriteEntry.source.worldId, spriteInst.cacheKey),\n activeSprite,\n );\n }\n }\n if (activeSprite !== null) {\n const writeRes = runtime.device.queue.writeBuffer(\n activeSprite.buffer.handle,\n 0,\n instancePayload,\n );\n if (!writeRes.ok) {\n runtime.errorRegistry.fire(writeRes.error);\n } else {\n spriteInstanceBuffer = activeSprite.buffer.handle;\n spriteInstanceCount = Math.max(1, spriteInst.instanceCount);\n }\n }\n }\n }\n }\n\n // feat-20260625-sprite-instances-and-tilemap-terrain-static-batch\n // M3 / w11: SpriteInstances 80B-per-instance interleaved upload path.\n // SSOT for the per-entity 2D mat4 + per-instance UV region buffer\n // (plan-strategy D-1 interleaved single buffer + single binding slot;\n // D-9 cacheKey = entity packed u32). The extract-stage validator\n // (M3 / w10) enforces the XOR contract `Instances XOR SpriteInstances`\n // (sprite-instances-mutually-exclusive-with-instances), so the\n // legacy `spriteInst` block above and this block are never both\n // active for the same entity.\n const _si = resolveSpriteInstancesBuffer(\n c,\n spriteEntry,\n spriteInstanceBuffer,\n spriteInstanceCount,\n );\n spriteInstanceBuffer = _si.buffer;\n spriteInstanceCount = _si.count;\n\n // sprite-lit's clustered variant declares the unified Standard group(2)\n // contract, while the regular sprite variants keep the direct mesh\n // contract. Select the resource from the same capability axis used to\n // request the pipeline; binding the ordinary mesh group to the clustered\n // sprite-lit pipeline is rejected by WebGPU before the draw is recorded.\n const spriteGroup2 =\n entityShaderId === 'forgeax::sprite-lit' && c.standardLighting?.kind === 'clustered'\n ? c.hdrpClusterBindGroup\n : meshBindGroup;\n\n // M3 / w12: LDR sprite split pass per-entity instances BG cache. Sprite\n // shaders do not declare the Standard PBR Probe ABI, so retained probe\n // records stay out of this bind-group path.\n const spriteInstancesBg = resolveGeometryInstancesBindGroup(c, spriteInstanceBuffer, undefined);\n\n spritePass.setBindGroup(2, spriteGroup2 as BindGroup, [i * MESH_PER_ENTITY_STRIDE]);\n\n const materialSlot = materialSlotIndices[i]?.[0] ?? 0;\n\n // The same material owner serves HDR and linear-LDR draws. Do not\n // replace authored samplers, texture sources or cooked layouts here.\n const spritePassBg = resolveMaterialBindGroup(\n materialSlot,\n spriteEntry.source.material,\n spriteEntry.source.entityKey,\n spriteEntry.world ?? world,\n );\n\n spritePass.setBindGroup(1, spritePassBg, [materialSlot * MATERIAL_PER_ENTITY_STRIDE]);\n spritePass.setBindGroup(3, spriteInstancesBg);\n spritePass.drawIndexed(spriteEntry.mesh.indexCount, spriteInstanceCount, 0, 0, 0);\n c.onRenderableDraw?.(spriteEntry);\n }\n}\n\n/**\n * feat-20260704 M3/w19: resolve the interleaved SpriteInstances (@group(3))\n * buffer + instanceCount for a sprite entity in the LDR blend sub-pass,\n * extracted verbatim from recordSpriteEntityDraws. Uploads the interleaved\n * mat4 + per-instance UV region transforms (cache-keyed on the snapshot); on\n * over-cap fires the structured limit-exceeded error and leaves the passed-in\n * fallback buffer/count. Returns the resolved (or unchanged) buffer + count.\n *\n * @internal\n */\nfunction resolveSpriteInstancesBuffer(\n c: _InternalRenderPipelineContext,\n spriteEntry: _InternalRenderPipelineContext['validatedOrdered'][number],\n fallbackBuffer: Buffer,\n fallbackCount: number,\n): { buffer: Buffer; count: number } {\n const { runtime, frameState } = c;\n let buffer = fallbackBuffer;\n let count = fallbackCount;\n const spriteInstancesSnap: SpriteInstancesSnapshot | undefined =\n spriteEntry.source.spriteInstances;\n if (spriteInstancesSnap !== undefined) {\n const uniformFallback = runtime.device.caps.storageBuffer === false;\n const interleaved = interleaveSpriteInstanceBuffer(\n spriteInstancesSnap.transforms,\n spriteInstancesSnap.regions,\n !uniformFallback,\n );\n const requestedBytes = interleaved.byteLength;\n const cap = runtime.device.limits.maxStorageBufferBindingSize;\n if (typeof cap === 'number' && requestedBytes > cap) {\n runtime.errorRegistry.fire(\n new RhiError({\n code: 'limit-exceeded',\n expected: `requestedBytes (${requestedBytes}) <= maxStorageBufferBindingSize (${cap})`,\n hint: 'reduce SpriteInstances instance count to fit within device.limits.maxStorageBufferBindingSize (144 bytes per instance: current mat4 64B + previous mat4 64B + region 16B)',\n detail: {\n maxStorageBufferBindingSize: cap,\n requestedBytes,\n },\n }),\n );\n } else {\n const cachedSpriteInst = frameState.instanceBuffers.get(\n worldEntityKey(spriteEntry.source.worldId, spriteInstancesSnap.cacheKey),\n );\n let activeSpriteInst: InstanceBufferCacheEntry | null = null;\n if (spriteInstancesCacheHit(cachedSpriteInst, spriteInstancesSnap, requestedBytes)) {\n activeSpriteInst = cachedSpriteInst ?? null;\n } else if (requestedBytes > 0) {\n const bufRes = runtime.device.createBuffer({\n size: requestedBytes,\n usage:\n (uniformFallback ? GPU_BUFFER_USAGE_UNIFORM : GPU_BUFFER_USAGE_STORAGE) |\n GPU_BUFFER_USAGE_COPY_DST,\n mappedAtCreation: false,\n });\n if (!bufRes.ok) {\n runtime.errorRegistry.fire(bufRes.error);\n } else {\n if (cachedSpriteInst !== undefined && !cachedSpriteInst.buffer.isDestroyed) {\n const r = cachedSpriteInst.buffer.destroy();\n if (!r.ok) runtime.errorRegistry.fire(r.error);\n }\n const newBuf = new GpuBuffer(runtime.device, bufRes.value);\n activeSpriteInst = {\n buffer: newBuf,\n uploadedArchVersion: spriteInstancesSnap.archVersion,\n uploadedByteLength: requestedBytes,\n };\n frameState.instanceBuffers.set(\n worldEntityKey(spriteEntry.source.worldId, spriteInstancesSnap.cacheKey),\n activeSpriteInst,\n );\n }\n }\n if (activeSpriteInst !== null && requestedBytes > 0) {\n const writeRes = runtime.device.queue.writeBuffer(\n activeSpriteInst.buffer.handle,\n 0,\n interleaved,\n );\n if (!writeRes.ok) {\n runtime.errorRegistry.fire(writeRes.error);\n } else {\n buffer = activeSpriteInst.buffer.handle;\n count = spriteInstancesSnap.instanceCount;\n }\n }\n }\n }\n return { buffer, count };\n}\n\nfunction transparentPassColorFormat(\n c: _InternalRenderPipelineContext,\n pipelineState: _InternalRenderPipelineContext['pipelineState'] = c.pipelineState,\n): string {\n if (c.transparentColorFormat !== undefined) return c.transparentColorFormat;\n if (!c.runtime.device.caps.storageBuffer) return pipelineState.colorAttachmentFormat;\n return pipelineState.format;\n}\n","import {\n GPU_DRIVEN_MATERIAL_ROW_BYTES,\n STANDARD_PIPELINE_PARAM_SCHEMA,\n} from '@forgeax/engine-shader';\nimport { derive, type NumericParamType } from '@forgeax/engine-types';\n\nexport type GpuSceneScalar = 'u32' | 'i32' | 'f32';\nexport type GpuSceneFieldType = GpuSceneScalar | 'vec3<f32>' | 'vec4<f32>' | 'mat4x4<f32>';\n\nexport interface GpuSceneField {\n readonly name: string;\n readonly type: GpuSceneFieldType;\n}\n\nexport interface GpuSceneTableSchema {\n readonly name: string;\n readonly fields: readonly GpuSceneField[];\n}\n\nexport interface GpuSceneFieldLayout extends GpuSceneField {\n readonly offset: number;\n readonly size: number;\n readonly alignment: number;\n}\n\nexport interface GpuSceneTableLayout {\n readonly name: string;\n readonly stride: number;\n readonly fields: readonly GpuSceneFieldLayout[];\n}\n\nconst TYPE_LAYOUT: Readonly<\n Record<GpuSceneFieldType, { readonly size: number; readonly alignment: number }>\n> = {\n u32: { size: 4, alignment: 4 },\n i32: { size: 4, alignment: 4 },\n f32: { size: 4, alignment: 4 },\n 'vec3<f32>': { size: 12, alignment: 16 },\n 'vec4<f32>': { size: 16, alignment: 16 },\n 'mat4x4<f32>': { size: 64, alignment: 16 },\n};\n\nfunction align(value: number, alignment: number): number {\n return Math.ceil(value / alignment) * alignment;\n}\n\nexport function deriveGpuSceneTableLayout(schema: GpuSceneTableSchema): GpuSceneTableLayout {\n let cursor = 0;\n let tableAlignment = 4;\n const fields = schema.fields.map((field) => {\n const typeLayout = TYPE_LAYOUT[field.type];\n cursor = align(cursor, typeLayout.alignment);\n tableAlignment = Math.max(tableAlignment, typeLayout.alignment);\n const layout: GpuSceneFieldLayout = { ...field, offset: cursor, ...typeLayout };\n cursor += typeLayout.size;\n return layout;\n });\n return { name: schema.name, stride: align(cursor, tableAlignment), fields };\n}\n\nexport function gpuSceneFieldOffset(layout: GpuSceneTableLayout, name: string): number {\n const field = layout.fields.find((candidate) => candidate.name === name);\n if (field === undefined) throw new RangeError(`${layout.name} has no field named ${name}`);\n return field.offset;\n}\n\nexport function gpuSceneWgsl(layout: GpuSceneTableLayout): string {\n const fields = layout.fields.map((field) => ` ${field.name}: ${field.type},`).join('\\n');\n return `struct ${layout.name} {\\n${fields}\\n};`;\n}\n\nfunction gpuSceneTypeForNumeric(type: NumericParamType): GpuSceneFieldType {\n switch (type) {\n case 'f32':\n return 'f32';\n case 'i32':\n return 'i32';\n case 'u32':\n return 'u32';\n case 'vec3':\n return 'vec3<f32>';\n case 'vec4':\n case 'color':\n return 'vec4<f32>';\n case 'vec2':\n throw new Error('Standard PBR GPU Scene material ABI does not admit vec2 fields');\n }\n}\n\n/**\n * Project the canonical Standard material UBO into the GPU Scene storage row.\n * The compiler-generated `MaterialParameters` struct, the row packer, and the\n * shadow alpha-mask reader all consume this projection, so a new root numeric\n * field or coordinate pair cannot silently create a second hand-written ABI.\n */\nfunction deriveStandardMaterialFields(): readonly GpuSceneField[] {\n const derived = derive(STANDARD_PIPELINE_PARAM_SCHEMA);\n const fields = [\n ...derived.numericMembers.map((member) => ({\n offset: member.offset,\n field: { name: member.name, type: gpuSceneTypeForNumeric(member.type) },\n })),\n ...derived.coordinateRecords.flatMap((record) => [\n {\n offset: record.offset,\n field: { name: record.transformMember, type: 'vec4<f32>' as const },\n },\n {\n offset: record.offset + 16,\n field: { name: record.metadataMember, type: 'vec4<f32>' as const },\n },\n ]),\n ];\n fields.sort((left, right) => left.offset - right.offset);\n return [\n ...fields.map(({ field }) => field),\n ...Array.from(\n { length: (GPU_DRIVEN_MATERIAL_ROW_BYTES - derived.totalBytes) / 16 },\n (_, index) => ({ name: `_gpuDrivenPadding${index}`, type: 'vec4<f32>' as const }),\n ),\n ];\n}\n\nexport const GPU_SCENE_SCHEMAS = Object.freeze({\n lod: {\n name: 'GpuSceneLod',\n fields: [\n { name: 'generation', type: 'u32' },\n { name: 'level', type: 'u32' },\n { name: 'firstIndex', type: 'u32' },\n { name: 'indexCount', type: 'u32' },\n { name: 'baseVertex', type: 'i32' },\n { name: 'screenCoverage', type: 'f32' },\n { name: 'hysteresis', type: 'f32' },\n { name: 'ready', type: 'u32' },\n ],\n },\n primitive: {\n name: 'GpuScenePrimitive',\n fields: [\n { name: 'generation', type: 'u32' },\n { name: 'flags', type: 'u32' },\n { name: 'transformIndex', type: 'u32' },\n { name: 'materialIndex', type: 'u32' },\n { name: 'drawTemplateIndex', type: 'u32' },\n { name: 'instanceStart', type: 'u32' },\n { name: 'instanceCount', type: 'u32' },\n { name: 'assetHandle', type: 'u32' },\n { name: 'localBoundsMin', type: 'vec4<f32>' },\n { name: 'localBoundsMax', type: 'vec4<f32>' },\n ],\n },\n instance: {\n name: 'GpuSceneInstance',\n fields: [\n { name: 'primitiveIndex', type: 'u32' },\n { name: 'transformIndex', type: 'u32' },\n { name: 'customDataStart', type: 'u32' },\n { name: 'flags', type: 'u32' },\n ],\n },\n transform: {\n name: 'GpuSceneTransform',\n fields: [\n { name: 'currentWorld', type: 'mat4x4<f32>' },\n { name: 'previousWorld', type: 'mat4x4<f32>' },\n ],\n },\n drawTemplate: {\n name: 'GpuSceneDrawTemplate',\n fields: [\n { name: 'pipelineClass', type: 'u32' },\n { name: 'materialIndex', type: 'u32' },\n { name: 'firstIndex', type: 'u32' },\n { name: 'indexCount', type: 'u32' },\n { name: 'baseVertex', type: 'i32' },\n { name: 'firstInstance', type: 'u32' },\n { name: 'passFlags', type: 'u32' },\n { name: 'reserved', type: 'u32' },\n ],\n },\n material: {\n name: 'GpuSceneMaterial',\n fields: deriveStandardMaterialFields(),\n },\n} satisfies Readonly<Record<string, GpuSceneTableSchema>>);\n\nexport const GPU_SCENE_LAYOUTS = Object.freeze(\n Object.fromEntries(\n Object.entries(GPU_SCENE_SCHEMAS).map(([name, schema]) => [\n name,\n deriveGpuSceneTableLayout(schema),\n ]),\n ) as {\n readonly [Name in keyof typeof GPU_SCENE_SCHEMAS]: GpuSceneTableLayout;\n },\n);\n\nexport const GPU_SCENE_WGSL = Object.values(GPU_SCENE_LAYOUTS).map(gpuSceneWgsl).join('\\n\\n');\n","import type { MeshLodLevel } from '@forgeax/engine-types';\n\nexport interface ProjectedHeightInput {\n readonly radius: number;\n readonly depth: number;\n readonly projection: 'perspective' | 'orthographic';\n readonly fov?: number;\n readonly orthoHeight?: number;\n}\n\nexport interface LodSelectorInput {\n /** Lower-detail levels in ascending detail order; LOD0 is implicit. */\n readonly levels: readonly Pick<MeshLodLevel, 'screenCoverage'>[];\n readonly projectedHeight: number;\n readonly previousLevel: number;\n readonly hysteresis: number;\n /** Index zero is the root and must remain the safe fallback. */\n readonly ready: readonly boolean[];\n readonly historyValid: boolean;\n}\n\nexport interface LodSelection {\n readonly level: number;\n readonly confidence: number;\n}\n\nexport function projectedHeight(input: ProjectedHeightInput): number {\n if (!Number.isFinite(input.radius) || input.radius <= 0 || !Number.isFinite(input.depth)) {\n return Number.NaN;\n }\n if (input.projection === 'perspective') {\n if (!Number.isFinite(input.fov) || (input.fov ?? 0) <= 0 || input.depth <= 0) return Number.NaN;\n return (2 * input.radius) / (input.depth * Math.tan((input.fov ?? 0) / 2));\n }\n if (!Number.isFinite(input.orthoHeight) || (input.orthoHeight ?? 0) <= 0) return Number.NaN;\n return (2 * input.radius) / (input.orthoHeight ?? 0);\n}\n\nfunction rawLevel(levels: readonly Pick<MeshLodLevel, 'screenCoverage'>[], height: number): number {\n for (let index = 0; index < levels.length; index += 1) {\n const threshold = levels[index]?.screenCoverage;\n if (threshold !== undefined && height >= threshold) return index;\n }\n return levels.length;\n}\n\nfunction hysteresisLevel(input: LodSelectorInput, raw: number): number {\n if (!input.historyValid || input.previousLevel < 0 || input.previousLevel > input.levels.length) {\n return raw;\n }\n const previous = input.previousLevel;\n if (raw === previous) return previous;\n const clampedHysteresis = Math.min(Math.max(input.hysteresis, 0), 0.99);\n // A downgrade crosses the next lower-detail threshold; an upgrade crosses\n // the threshold that introduced the current level. These are adjacent\n // boundaries even when a frame jumps over several levels.\n const thresholdIndex =\n raw > previous\n ? Math.min(previous, input.levels.length - 1)\n : Math.min(previous, input.levels.length) - 1;\n const threshold =\n thresholdIndex < 0\n ? input.levels[0]?.screenCoverage\n : input.levels[thresholdIndex]?.screenCoverage;\n if (threshold === undefined || !Number.isFinite(threshold)) return raw;\n const height = input.projectedHeight;\n if (raw > previous && height >= threshold * (1 - clampedHysteresis)) return previous;\n if (raw < previous && height < threshold * (1 + clampedHysteresis)) return previous;\n return raw;\n}\n\nexport function selectLod(input: LodSelectorInput): LodSelection {\n const root = 0;\n if (!Number.isFinite(input.projectedHeight) || input.projectedHeight <= 0) {\n return { level: root, confidence: 1 };\n }\n const raw = rawLevel(input.levels, input.projectedHeight);\n const selected = Math.max(root, Math.min(input.levels.length, hysteresisLevel(input, raw)));\n if (input.ready[selected] === true) return { level: selected, confidence: 1 };\n for (let level = selected - 1; level >= root; level -= 1) {\n if (input.ready[level] === true) return { level, confidence: 1 };\n }\n return { level: root, confidence: 1 };\n}\n","import type { PrimitiveTopology } from '@forgeax/engine-types';\nimport { gpuDrivenSourceDrawItemIndex } from '../extract/gpu-driven';\nimport type { BatchTopologyInspection } from '../inspection-types';\nimport type { CameraSnapshot } from '../render-contract';\nimport type { RenderSceneApplyResult, RenderSceneSlot } from '../scene/render-scene-types';\nimport { type GpuLodRow, selectGpuLod } from '../scene/visibility/gpu-lod';\nimport { projectedHeight as measureProjectedHeight } from '../scene/visibility/lod-selector';\nimport type { PreparedGpuDrivenDraw } from './prepared-draw';\n\nexport type { BatchTopologyInspection } from '../inspection-types';\n\n/** High bit in the compact candidate material lane marks a skin palette row. */\nexport const GPU_DRIVEN_SKIN_FLAG = 0x80000000;\n\nexport interface GpuDrivenBatchKey {\n readonly assetHandle: number;\n readonly drawKind: 'indexed' | 'non-indexed';\n readonly first: number;\n readonly count: number;\n readonly baseVertex: number;\n readonly materialSlot: number;\n readonly topology: PrimitiveTopology;\n readonly pipelineClass: string;\n readonly materialResourceClass: string;\n /** Stable producer-owned identity; topology never derives this from a shader name. */\n readonly preparedIdentity?: string;\n /** Resource identity projected by the prepared material contract. */\n readonly resourceIdentity?: string;\n /** Closed admission lane for the prepared Standard PBR draw. */\n readonly admission?: 'opaque' | 'alpha-mask';\n}\n\nexport interface GpuDrivenCandidate {\n readonly primitiveIndex: number;\n readonly generation: number;\n readonly drawItemIndex: number;\n readonly instanceOrdinal: number;\n readonly prepared?: PreparedGpuDrivenDraw;\n /** Absolute coverage rows uploaded to the GPU selector; root is implicit. */\n readonly lodCoverages?: readonly number[];\n readonly lodHysteresis?: number;\n readonly projectedHeight?: number;\n readonly lodRanges?: readonly {\n readonly first: number;\n readonly count: number;\n readonly baseVertex: number;\n }[];\n}\n\nexport interface GpuDrivenBatch {\n readonly batchId: number;\n readonly generation: number;\n readonly key: GpuDrivenBatchKey;\n readonly candidates: readonly GpuDrivenCandidate[];\n readonly visibleBase: number;\n readonly visibleCapacity: number;\n readonly indirectOffset: number;\n}\n\nexport interface SubmissionPlan {\n readonly revision: number;\n /** Payload-only updates keep topology revision stable but still invalidate the plan snapshot. */\n readonly payloadRevision: number;\n readonly batches: readonly GpuDrivenBatch[];\n readonly candidateCount: number;\n readonly visibleCapacity: number;\n}\n\nexport interface GpuLodCandidateInput {\n readonly candidate: GpuDrivenCandidate;\n readonly rows: readonly GpuLodRow[];\n readonly projectedHeight: number;\n readonly previousLevel: number;\n readonly historyValid: boolean;\n}\n\nexport interface GpuLodCompactCandidate {\n readonly candidate: GpuDrivenCandidate;\n readonly level: number;\n readonly confidence: number;\n}\n\n/** Selects one level per stable topology candidate without mutating membership. */\nexport function compactGpuLodCandidates(\n inputs: readonly GpuLodCandidateInput[],\n): readonly GpuLodCompactCandidate[] {\n return Object.freeze(\n inputs.map((input) => {\n const selection = selectGpuLod(input.rows, input);\n return Object.freeze({ candidate: input.candidate, ...selection });\n }),\n );\n}\n\nexport interface SubmissionCandidateMembershipEntry {\n readonly batchId: number;\n readonly candidate: GpuDrivenCandidate;\n}\n\n/**\n * Immutable reverse membership for one submission topology.\n *\n * Shadow views query the same candidate domain as the main view. Keeping the\n * primitive-to-batch join beside the immutable plan makes that lookup once per\n * topology instead of rescanning every batch for every view.\n */\nexport interface SubmissionCandidateMembership {\n readonly source: SubmissionPlan;\n readonly byPrimitiveIndex: ReadonlyMap<number, readonly SubmissionCandidateMembershipEntry[]>;\n}\n\nconst submissionCandidateMembershipCache = new WeakMap<\n SubmissionPlan,\n SubmissionCandidateMembership\n>();\n\nexport function buildSubmissionCandidateMembership(\n source: SubmissionPlan,\n): SubmissionCandidateMembership {\n const cached = submissionCandidateMembershipCache.get(source);\n if (cached !== undefined) return cached;\n\n const mutable = new Map<number, SubmissionCandidateMembershipEntry[]>();\n for (const batch of source.batches) {\n for (const candidate of batch.candidates) {\n const entries = mutable.get(candidate.primitiveIndex) ?? [];\n entries.push({ batchId: batch.batchId, candidate });\n mutable.set(candidate.primitiveIndex, entries);\n }\n }\n const byPrimitiveIndex = new Map<number, readonly SubmissionCandidateMembershipEntry[]>();\n for (const [primitiveIndex, entries] of mutable) {\n byPrimitiveIndex.set(primitiveIndex, Object.freeze(entries));\n }\n const membership: SubmissionCandidateMembership = {\n source,\n byPrimitiveIndex,\n };\n submissionCandidateMembershipCache.set(source, membership);\n return membership;\n}\n\n/**\n * Re-project one source topology for a view without changing batch identity.\n * The returned plan only changes candidate windows and keeps batch ids,\n * generations, draw ranges, and indirect offsets from the source plan.\n */\nexport function buildBatchAlignedSubmission(\n source: SubmissionPlan,\n candidatesByBatch: ReadonlyMap<number, readonly GpuDrivenCandidate[]>,\n): SubmissionPlan {\n let visibleBase = 0;\n const batches: GpuDrivenBatch[] = [];\n for (const sourceBatch of source.batches) {\n const candidates = candidatesByBatch.get(sourceBatch.batchId) ?? [];\n if (candidates.length === 0) continue;\n visibleBase = alignInstanceBase(visibleBase);\n batches.push(\n Object.freeze({\n ...sourceBatch,\n candidates: Object.freeze([...candidates]),\n visibleBase,\n visibleCapacity: candidates.length,\n }),\n );\n visibleBase += candidates.length;\n }\n return Object.freeze({\n revision: source.revision,\n payloadRevision: source.payloadRevision,\n batches: Object.freeze(batches),\n candidateCount: batches.reduce((total, batch) => total + batch.candidates.length, 0),\n visibleCapacity: visibleBase,\n });\n}\n\ninterface MutableBatch {\n readonly batchId: number;\n readonly generation: number;\n readonly key: GpuDrivenBatchKey;\n readonly candidates: Map<string, GpuDrivenCandidate>;\n}\n\ninterface EligibleGpuDrivenDraw {\n readonly sourceDrawIndex: number;\n readonly key: GpuDrivenBatchKey;\n readonly prepared?: PreparedGpuDrivenDraw;\n readonly projectedHeight?: number;\n readonly lodCoverages?: readonly number[];\n readonly lodHysteresis?: number;\n readonly lodRanges?: readonly {\n readonly first: number;\n readonly count: number;\n readonly baseVertex: number;\n }[];\n /** Candidate data that does not change batch compatibility. */\n readonly payloadRevision: string;\n}\n\ninterface MembershipDraw {\n readonly sourceDrawIndex: number;\n readonly key: GpuDrivenBatchKey;\n readonly batchText: string;\n readonly candidateKeyPrefix: string;\n readonly payloadRevision: string;\n}\n\ninterface MembershipProjection {\n readonly instanceCount: number;\n readonly hasLod: boolean;\n readonly draws: readonly MembershipDraw[];\n}\n\nfunction hasActiveAlphaMask(\n material: RenderSceneSlot['snapshot']['material'],\n prepared: PreparedGpuDrivenDraw,\n): boolean {\n const { cutoff, source } = prepared.alphaMask;\n if (cutoff.length === 0 || source.length === 0) return false;\n // Standard's shared receipt describes the alpha-clip interface; the actual\n // mode is selected by its authored cutoff. Custom producers own coverage in\n // their receipt, so a declared clip remains masked without guessing a field.\n if (\n prepared.identity.material === 'forgeax::default-standard-pbr' ||\n prepared.identity.material === 'forgeax::pbr-skin' ||\n prepared.identity.material === 'forgeax::default-standard-pbr-skin'\n ) {\n const value = material.paramSnapshot?.[cutoff];\n return typeof value === 'number' && value > 0;\n }\n return true;\n}\n\nfunction eligibleDraws(slot: RenderSceneSlot): readonly EligibleGpuDrivenDraw[] {\n const snapshot = slot.snapshot;\n const draws = snapshot.gpuDrivenDraws;\n if (\n draws === undefined ||\n draws.length === 0 ||\n snapshot.instances?.instanceCount === 0 ||\n snapshot.localAabb === undefined ||\n snapshot.morph !== undefined ||\n snapshot.spriteInstances !== undefined\n ) {\n return [];\n }\n const result: EligibleGpuDrivenDraw[] = [];\n for (let compactIndex = 0; compactIndex < draws.length; compactIndex += 1) {\n const draw = draws[compactIndex];\n if (draw === undefined) continue;\n const drawItemIndex = gpuDrivenSourceDrawItemIndex(draw, compactIndex);\n const prepared = draw.prepared;\n const material = snapshot.materials[draw.materialSlot] ?? snapshot.material;\n if (prepared !== undefined) {\n // Prepared producer identity is the admission proof; the material\n // identifier is only a consistency check, never a built-in allow-list.\n const materialIdentityMatches =\n material.materialShaderId === undefined ||\n prepared.identity.material === material.materialShaderId;\n const isAlphaBlend =\n material.transparent === true || material.renderState?.blend !== undefined;\n const cpuOnlyMaterialResources =\n (material.textureSources?.size ?? 0) > 0 || (material.videoTextureFields?.size ?? 0) > 0;\n const skinReady =\n prepared.identity.deformation !== 'skin' ||\n (snapshot.skin?.storageOrUniform === 'storage' &&\n snapshot.skin.customDataStart >= 0 &&\n Number.isInteger(snapshot.skin.customDataStart) &&\n hasFiniteOrderedBounds(snapshot.skin.bounds) &&\n prepared.skinPaletteAddress !== undefined);\n if (\n !materialIdentityMatches ||\n isAlphaBlend ||\n cpuOnlyMaterialResources ||\n (prepared.identity.deformation !== 'rigid' && prepared.identity.deformation !== 'skin') ||\n !skinReady\n )\n continue;\n const preparedIdentity = [\n prepared.identity.material,\n prepared.identity.geometry,\n prepared.identity.deformation,\n ...(prepared.receiptIdentity === undefined ? [] : [prepared.receiptIdentity]),\n ].join('|');\n const admission = hasActiveAlphaMask(material, prepared) ? 'alpha-mask' : 'opaque';\n result.push({\n sourceDrawIndex: drawItemIndex,\n key: {\n assetHandle: snapshot.assetHandle,\n drawKind: draw.kind,\n first: prepared.first,\n count: prepared.count,\n baseVertex: prepared.baseVertex,\n materialSlot: draw.materialSlot,\n topology: prepared.topology,\n pipelineClass: preparedIdentity,\n materialResourceClass: draw.materialResourceClass,\n preparedIdentity,\n resourceIdentity: draw.materialResourceClass,\n admission,\n },\n prepared,\n ...candidatePayload(draw, snapshot),\n });\n continue;\n }\n result.push({\n sourceDrawIndex: drawItemIndex,\n key: {\n assetHandle: snapshot.assetHandle,\n drawKind: draw.kind,\n first: draw.first,\n count: draw.count,\n baseVertex: draw.baseVertex,\n materialSlot: draw.materialSlot,\n topology: draw.topology,\n pipelineClass: draw.pipelineClass,\n materialResourceClass: draw.materialResourceClass,\n },\n ...candidatePayload(draw, snapshot),\n });\n }\n return result;\n}\n\nfunction candidatePayload(\n draw: NonNullable<RenderSceneSlot['snapshot']['gpuDrivenDraws']>[number],\n snapshot: RenderSceneSlot['snapshot'],\n): Pick<\n EligibleGpuDrivenDraw,\n 'lodCoverages' | 'lodHysteresis' | 'lodRanges' | 'payloadRevision' | 'projectedHeight'\n> {\n const lodCoverages =\n snapshot.lods === undefined\n ? undefined\n : [1, ...snapshot.lods.map((lod) => lod.screenCoverage)];\n const lodRanges = draw.lodRanges as EligibleGpuDrivenDraw['lodRanges'];\n const lodHysteresis = snapshot.lodHysteresis;\n const payloadRevision = JSON.stringify({\n projectedHeight: draw.projectedHeight,\n lodCoverages,\n lodHysteresis,\n lodRanges,\n prepared: draw.prepared,\n });\n return {\n ...(draw.projectedHeight === undefined ? {} : { projectedHeight: draw.projectedHeight }),\n ...(lodCoverages === undefined ? {} : { lodCoverages }),\n ...(lodHysteresis === undefined ? {} : { lodHysteresis }),\n ...(lodRanges === undefined ? {} : { lodRanges }),\n payloadRevision,\n };\n}\n\nfunction hasFiniteOrderedBounds(bounds: Float32Array | undefined): boolean {\n if (bounds === undefined || bounds.length < 6) return false;\n const minX = bounds[0];\n const minY = bounds[1];\n const minZ = bounds[2];\n const maxX = bounds[3];\n const maxY = bounds[4];\n const maxZ = bounds[5];\n return (\n minX !== undefined &&\n minY !== undefined &&\n minZ !== undefined &&\n maxX !== undefined &&\n maxY !== undefined &&\n maxZ !== undefined &&\n Number.isFinite(minX) &&\n Number.isFinite(minY) &&\n Number.isFinite(minZ) &&\n Number.isFinite(maxX) &&\n Number.isFinite(maxY) &&\n Number.isFinite(maxZ) &&\n minX <= maxX &&\n minY <= maxY &&\n minZ <= maxZ\n );\n}\n\nfunction keyText(key: GpuDrivenBatchKey): string {\n return JSON.stringify(key);\n}\n\n/**\n * A GPU indirect draw has one index/vertex range for the whole batch. LOD\n * selection is per candidate, so sharing a batch between LOD candidates would\n * let the first candidate's range serve every visible instance.\n */\nfunction candidateBatchText(\n key: GpuDrivenBatchKey,\n primitiveIndex: number,\n drawItemIndex: number,\n instanceOrdinal: number,\n hasLod: boolean,\n): string {\n return hasLod\n ? `${keyText(key)}|lod:${primitiveIndex}:${drawItemIndex}:${instanceOrdinal}`\n : keyText(key);\n}\n\nfunction drawBatchText(\n key: GpuDrivenBatchKey,\n primitiveIndex: number,\n drawItemIndex: number,\n hasLod: boolean,\n): string {\n return hasLod ? `${keyText(key)}|lod:${primitiveIndex}:${drawItemIndex}` : keyText(key);\n}\n\nfunction membershipProjection(\n slot: RenderSceneSlot,\n draws = eligibleDraws(slot),\n): MembershipProjection {\n const instanceCount = slot.snapshot.instances?.instanceCount ?? 1;\n const hasLod = (slot.snapshot.lods?.length ?? 0) > 0;\n return {\n instanceCount,\n hasLod,\n draws: draws.map((draw) => ({\n sourceDrawIndex: draw.sourceDrawIndex,\n key: draw.key,\n batchText: drawBatchText(draw.key, slot.slot, draw.sourceDrawIndex, hasLod),\n candidateKeyPrefix: `${slot.slot}:${draw.sourceDrawIndex}:`,\n payloadRevision: draw.payloadRevision,\n })),\n };\n}\n\nfunction alignInstanceBase(value: number): number {\n // Raster binds each batch's visible-index and compact-transform segment at\n // a static storage-buffer offset. WebGPU requires those offsets to satisfy\n // minStorageBufferOffsetAlignment (256 bytes on the portable baseline), so\n // both the u32 stream (64 entries) and mat4 stream (4 entries) align when\n // the shared instance base is a multiple of 64.\n return Math.ceil(value / 64) * 64;\n}\n\nexport function projectedHeightForCandidate(slot: RenderSceneSlot, camera: CameraSnapshot): number {\n const aabb = slot.snapshot.localAabb;\n if (aabb === undefined || aabb.length < 6) return Number.NaN;\n const halfX = Math.abs((aabb[3] ?? 0) - (aabb[0] ?? 0)) * 0.5;\n const halfY = Math.abs((aabb[4] ?? 0) - (aabb[1] ?? 0)) * 0.5;\n const halfZ = Math.abs((aabb[5] ?? 0) - (aabb[2] ?? 0)) * 0.5;\n const world = slot.snapshot.transform.world;\n const worldHalfX =\n Math.abs(world[0] ?? 0) * halfX +\n Math.abs(world[4] ?? 0) * halfY +\n Math.abs(world[8] ?? 0) * halfZ;\n const worldHalfY =\n Math.abs(world[1] ?? 0) * halfX +\n Math.abs(world[5] ?? 0) * halfY +\n Math.abs(world[9] ?? 0) * halfZ;\n const worldHalfZ =\n Math.abs(world[2] ?? 0) * halfX +\n Math.abs(world[6] ?? 0) * halfY +\n Math.abs(world[10] ?? 0) * halfZ;\n const radius = Math.hypot(worldHalfX, worldHalfY, worldHalfZ);\n const dx = (world[12] ?? 0) - (camera.position[0] ?? 0);\n const dy = (world[13] ?? 0) - (camera.position[1] ?? 0);\n const dz = (world[14] ?? 0) - (camera.position[2] ?? 0);\n return measureProjectedHeight({\n radius,\n depth: Math.hypot(dx, dy, dz),\n projection: camera.projection,\n fov: camera.fov,\n orthoHeight: Math.abs(camera.orthoTop - camera.orthoBottom),\n });\n}\n\n/** Stable compatibility grouping; per-view visibility never mutates this owner. */\nexport class BatchTopology {\n private readonly batches = new Map<string, MutableBatch>();\n private readonly membershipByPrimitive = new Map<number, MembershipProjection>();\n private readonly ineligiblePrimitives = new Set<number>();\n private readonly generationByBatchId: number[] = [];\n private readonly freeBatchIds: number[] = [];\n private revision = 0;\n private payloadRevision = 0;\n private rebuilds = 0;\n private patches = 0;\n private payloadPatches = 0;\n private membershipChecks = 0;\n private membershipAllocations = 0;\n private candidateAdds = 0;\n private candidateRemoves = 0;\n private cachedPlan: SubmissionPlan | undefined;\n\n rebuild(slots: readonly RenderSceneSlot[]): void {\n this.batches.clear();\n this.membershipByPrimitive.clear();\n this.ineligiblePrimitives.clear();\n this.generationByBatchId.length = 0;\n this.freeBatchIds.length = 0;\n for (const slot of slots) this.add(slot);\n this.revision += 1;\n this.payloadRevision += 1;\n this.rebuilds += 1;\n this.cachedPlan = undefined;\n }\n\n apply(delta: RenderSceneApplyResult): boolean {\n let changed = false;\n let topologyChanged = false;\n for (const removed of delta.removedSlots) {\n const removedChanged = this.remove(removed.slot);\n changed = removedChanged || changed;\n topologyChanged = removedChanged || topologyChanged;\n }\n for (const slot of delta.recreatedSlots) {\n const removedChanged = this.remove(slot.slot);\n const addedChanged = this.add(slot);\n changed = removedChanged || addedChanged || changed;\n topologyChanged = removedChanged || addedChanged || topologyChanged;\n }\n // Membership depends on source descriptors and instance cardinality.\n // Root matrices feed visibility without changing this dependency.\n const contentUpdatedSlots = delta.contentUpdatedSlots;\n const instanceUpdatedSlots = delta.instanceUpdatedSlots;\n const membershipUpdates = new Map<number, { slot: RenderSceneSlot; content: boolean }>();\n for (const slot of contentUpdatedSlots) {\n membershipUpdates.set(slot.slot, { slot, content: true });\n }\n // Instance cardinality is a membership input, including in mixed updates.\n for (const slot of instanceUpdatedSlots) {\n if (!membershipUpdates.has(slot.slot)) {\n membershipUpdates.set(slot.slot, { slot, content: false });\n }\n }\n for (const update of membershipUpdates.values()) {\n const { slot, content } = update;\n const eligible = eligibleDraws(slot);\n const next = membershipProjection(slot, eligible);\n // The projection is one descriptor per eligible source draw; candidate\n // identities are derived from the stable ordinal and are not stored as\n // N per-instance comparison records.\n this.membershipAllocations += next.draws.length;\n const previous = this.membershipByPrimitive.get(slot.slot);\n this.membershipChecks += 1;\n const topologyStable =\n previous !== undefined &&\n previous.instanceCount === next.instanceCount &&\n previous.hasLod === next.hasLod &&\n previous.draws.length === next.draws.length &&\n previous.draws.every((membership, index) => {\n const candidate = next.draws[index];\n return (\n candidate !== undefined &&\n membership.sourceDrawIndex === candidate.sourceDrawIndex &&\n membership.batchText === candidate.batchText\n );\n });\n if (!topologyStable) {\n const removedChanged = this.remove(slot.slot);\n const addedChanged = this.add(slot);\n changed = removedChanged || addedChanged || changed;\n topologyChanged = removedChanged || addedChanged || topologyChanged;\n continue;\n }\n if (!content) {\n this.membershipByPrimitive.set(slot.slot, next);\n continue;\n }\n let payloadChanged = false;\n let topologyFallback = false;\n for (let index = 0; index < next.draws.length; index += 1) {\n const oldMembership = previous.draws[index];\n const newMembership = next.draws[index];\n const draw = eligible[index];\n if (oldMembership === undefined || newMembership === undefined || draw === undefined) {\n continue;\n }\n if (oldMembership.payloadRevision === newMembership.payloadRevision) continue;\n for (let instanceOrdinal = 0; instanceOrdinal < next.instanceCount; instanceOrdinal += 1) {\n const batchText = candidateBatchText(\n draw.key,\n slot.slot,\n draw.sourceDrawIndex,\n instanceOrdinal,\n next.hasLod,\n );\n const batch = this.batches.get(batchText);\n const candidateKey = `${newMembership.candidateKeyPrefix}${instanceOrdinal}`;\n if (batch === undefined || !batch.candidates.has(candidateKey)) {\n const removedChanged = this.remove(slot.slot);\n const addedChanged = this.add(slot);\n changed = removedChanged || addedChanged || changed;\n topologyChanged = removedChanged || addedChanged || topologyChanged;\n topologyFallback = true;\n break;\n }\n batch.candidates.set(\n candidateKey,\n this.candidateFromEligible(slot, instanceOrdinal, draw),\n );\n }\n if (topologyFallback) break;\n payloadChanged = true;\n }\n this.membershipByPrimitive.set(slot.slot, next);\n if (payloadChanged) {\n changed = true;\n this.payloadRevision += 1;\n this.payloadPatches += 1;\n this.cachedPlan = undefined;\n }\n }\n for (const slot of delta.createdSlots) {\n const addedChanged = this.add(slot);\n changed = addedChanged || changed;\n topologyChanged = addedChanged || topologyChanged;\n }\n if (topologyChanged) {\n this.revision += 1;\n this.payloadRevision += 1;\n this.patches += 1;\n this.cachedPlan = undefined;\n }\n return changed;\n }\n\n plan(): SubmissionPlan {\n if (this.cachedPlan !== undefined) return this.cachedPlan;\n const ordered = [...this.batches.values()].sort((left, right) => left.batchId - right.batchId);\n let visibleBase = 0;\n const batches = ordered.map((batch): GpuDrivenBatch => {\n visibleBase = alignInstanceBase(visibleBase);\n const candidates = [...batch.candidates.values()].sort(\n (left, right) =>\n left.primitiveIndex - right.primitiveIndex ||\n left.drawItemIndex - right.drawItemIndex ||\n left.instanceOrdinal - right.instanceOrdinal,\n );\n const result = {\n batchId: batch.batchId,\n generation: batch.generation,\n key: batch.key,\n candidates,\n visibleBase,\n visibleCapacity: candidates.length,\n indirectOffset: batch.batchId * 20,\n };\n visibleBase += candidates.length;\n return Object.freeze(result);\n });\n this.cachedPlan = Object.freeze({\n revision: this.revision,\n payloadRevision: this.payloadRevision,\n batches: Object.freeze(batches),\n candidateCount: batches.reduce((total, batch) => total + batch.candidates.length, 0),\n visibleCapacity: visibleBase,\n });\n return this.cachedPlan;\n }\n\n inspect(): BatchTopologyInspection {\n let candidateCount = 0;\n for (const batch of this.batches.values()) candidateCount += batch.candidates.size;\n return {\n revision: this.revision,\n batchCount: this.batches.size,\n candidateCount,\n rebuilds: this.rebuilds,\n patches: this.patches,\n ineligible: this.ineligiblePrimitives.size,\n payloadPatches: this.payloadPatches,\n membershipChecks: this.membershipChecks,\n membershipAllocations: this.membershipAllocations,\n candidateAdds: this.candidateAdds,\n candidateRemoves: this.candidateRemoves,\n };\n }\n\n private add(slot: RenderSceneSlot): boolean {\n const draws = eligibleDraws(slot);\n if (draws.length === 0) {\n this.ineligiblePrimitives.add(slot.slot);\n return false;\n }\n this.ineligiblePrimitives.delete(slot.slot);\n const memberships = membershipProjection(slot, draws);\n const instanceCount = memberships.instanceCount;\n const hasLod = memberships.hasLod;\n this.membershipAllocations += memberships.draws.length;\n for (const draw of draws) {\n for (let instanceOrdinal = 0; instanceOrdinal < instanceCount; instanceOrdinal += 1) {\n const text = candidateBatchText(\n draw.key,\n slot.slot,\n draw.sourceDrawIndex,\n instanceOrdinal,\n hasLod,\n );\n let batch = this.batches.get(text);\n if (batch === undefined) {\n const reused = this.freeBatchIds.pop();\n const batchId = reused ?? this.generationByBatchId.length;\n const generation =\n reused === undefined ? 0 : (this.generationByBatchId[batchId] ?? -1) + 1;\n this.generationByBatchId[batchId] = generation;\n batch = { batchId, generation, key: draw.key, candidates: new Map() };\n this.batches.set(text, batch);\n }\n const candidateKey = `${slot.slot}:${draw.sourceDrawIndex}:${instanceOrdinal}`;\n batch.candidates.set(candidateKey, this.candidateFromEligible(slot, instanceOrdinal, draw));\n this.candidateAdds += 1;\n }\n }\n this.membershipByPrimitive.set(slot.slot, memberships);\n return true;\n }\n\n private remove(primitiveIndex: number): boolean {\n this.ineligiblePrimitives.delete(primitiveIndex);\n const memberships = this.membershipByPrimitive.get(primitiveIndex);\n this.membershipByPrimitive.delete(primitiveIndex);\n if (memberships === undefined) return false;\n for (const membership of memberships.draws) {\n const batchTexts = new Set<string>();\n for (\n let instanceOrdinal = 0;\n instanceOrdinal < memberships.instanceCount;\n instanceOrdinal += 1\n ) {\n const batchText = candidateBatchText(\n membership.key,\n primitiveIndex,\n membership.sourceDrawIndex,\n instanceOrdinal,\n memberships.hasLod,\n );\n batchTexts.add(batchText);\n const batch = this.batches.get(batchText);\n if (batch === undefined) continue;\n const candidateKey = `${membership.candidateKeyPrefix}${instanceOrdinal}`;\n if (!batch.candidates.delete(candidateKey)) continue;\n this.candidateRemoves += 1;\n }\n for (const batchText of batchTexts) {\n const batch = this.batches.get(batchText);\n if (batch !== undefined && batch.candidates.size === 0) {\n this.batches.delete(batchText);\n this.freeBatchIds.push(batch.batchId);\n }\n }\n }\n return true;\n }\n\n private candidateFromEligible(\n slot: RenderSceneSlot,\n instanceOrdinal: number,\n draw: EligibleGpuDrivenDraw,\n ): GpuDrivenCandidate {\n return {\n primitiveIndex: slot.slot,\n generation: slot.generation,\n drawItemIndex: draw.sourceDrawIndex,\n instanceOrdinal,\n ...(draw.projectedHeight === undefined ? {} : { projectedHeight: draw.projectedHeight }),\n ...(draw.lodCoverages === undefined ? {} : { lodCoverages: draw.lodCoverages }),\n ...(draw.lodRanges === undefined ? {} : { lodRanges: draw.lodRanges }),\n ...(draw.lodHysteresis === undefined ? {} : { lodHysteresis: draw.lodHysteresis }),\n ...(draw.prepared === undefined ? {} : { prepared: draw.prepared }),\n };\n }\n}\n","import { createVisibilityBudget, type VisibilityBudget } from './budget';\n\nexport type InvalidationReason =\n | 'cut'\n | 'teleport'\n | 'resize'\n | 'projection'\n | 'primitive'\n | 'bounds'\n | 'topology'\n | 'world-reorder'\n | 'detach'\n | 'failed-submit'\n | 'device-loss'\n | 'transparent';\n\nexport interface ConfidenceState {\n readonly status: 'visible' | 'hidden';\n readonly zeroStreak: number;\n readonly successfulSubmits: number;\n readonly queryable: boolean;\n readonly dirty: boolean;\n readonly lastResultGeneration: number | undefined;\n}\n\nexport type ConfidenceEvent =\n | { readonly type: 'result'; readonly samples: number; readonly submissionGeneration: number }\n | { readonly type: 'submit'; readonly submissionGeneration: number }\n | { readonly type: 'failure'; readonly submissionGeneration: number }\n | { readonly type: 'invalidate'; readonly reason: InvalidationReason };\n\nexport function createConfidenceState(): ConfidenceState {\n return {\n status: 'visible',\n zeroStreak: 0,\n successfulSubmits: 0,\n queryable: true,\n dirty: true,\n lastResultGeneration: undefined,\n };\n}\n\nexport function applyConfidenceEvent(\n state: ConfidenceState,\n event: ConfidenceEvent,\n budget: VisibilityBudget = createVisibilityBudget(),\n): ConfidenceState {\n if (event.type === 'result') {\n if (!Number.isFinite(event.samples) || event.samples < 0) {\n return { ...state, status: 'visible', dirty: true, queryable: true };\n }\n if (event.samples > 0) {\n return {\n ...state,\n status: 'visible',\n zeroStreak: 0,\n successfulSubmits: 0,\n queryable: true,\n dirty: false,\n lastResultGeneration: event.submissionGeneration,\n };\n }\n const zeroStreak = state.zeroStreak + 1;\n const hidden = zeroStreak >= 2;\n return {\n ...state,\n status: hidden ? 'hidden' : 'visible',\n zeroStreak,\n successfulSubmits: 0,\n queryable: true,\n // A first zero is only provisional evidence. Keep it dirty so the\n // producer naturally submits the second query; suppression requires two\n // real zero results rather than two hand-applied state transitions.\n dirty: !hidden,\n lastResultGeneration: event.submissionGeneration,\n };\n }\n if (event.type === 'submit') {\n const successfulSubmits = state.successfulSubmits + 1;\n if (successfulSubmits >= budget.expirySubmits) {\n return {\n ...state,\n status: 'visible',\n zeroStreak: 0,\n successfulSubmits: 0,\n queryable: true,\n dirty: true,\n };\n }\n return { ...state, successfulSubmits, dirty: state.dirty };\n }\n if (event.type === 'failure') {\n return {\n ...state,\n status: 'visible',\n zeroStreak: 0,\n successfulSubmits: 0,\n queryable: true,\n dirty: true,\n };\n }\n return {\n ...state,\n status: 'visible',\n zeroStreak: 0,\n successfulSubmits: 0,\n queryable: event.reason !== 'transparent' && event.reason !== 'detach',\n dirty: true,\n lastResultGeneration: undefined,\n };\n}\n\nexport function shouldIssueRetest(\n state: ConfidenceState,\n budget: VisibilityBudget = createVisibilityBudget(),\n): boolean {\n return (\n state.status === 'hidden' && state.queryable && state.successfulSubmits >= budget.retestSubmits\n );\n}\n\nfunction shouldQueryState(state: ConfidenceState, budget: VisibilityBudget): boolean {\n return (state.dirty && state.successfulSubmits === 0) || shouldIssueRetest(state, budget);\n}\n\nexport class OcclusionConfidenceScheduler {\n private readonly states = new Map<string, ConfidenceState>();\n private readonly wakeByGeneration = new Map<number, Set<string>>();\n private readonly expireByGeneration = new Map<number, Set<string>>();\n private readonly wakeHeap: number[] = [];\n private readonly expireHeap: number[] = [];\n private readonly wakeHeapMembers = new Set<number>();\n private readonly expireHeapMembers = new Set<number>();\n private readonly retestKeys = new Set<string>();\n private readonly scheduleByKey = new Map<\n string,\n { readonly wake: number; readonly expire: number }\n >();\n\n constructor(private readonly budget: VisibilityBudget = createVisibilityBudget()) {}\n\n ensure(key: string): ConfidenceState {\n const existing = this.states.get(key);\n if (existing !== undefined) return existing;\n const state = createConfidenceState();\n this.states.set(key, state);\n return state;\n }\n\n apply(key: string, event: ConfidenceEvent): ConfidenceState {\n this.unschedule(key);\n const next = applyConfidenceEvent(this.ensure(key), event, this.budget);\n this.states.set(key, next);\n this.refreshRetestKey(key, next);\n const anchor =\n event.type === 'result' || event.type === 'submit' || event.type === 'failure'\n ? event.submissionGeneration\n : next.lastResultGeneration;\n this.schedule(key, next, anchor);\n return next;\n }\n\n /** Apply an in-flight query submit without scheduling a same-generation wake. */\n applyInFlightSubmit(\n key: string,\n event: Extract<ConfidenceEvent, { readonly type: 'submit' }>,\n ): ConfidenceState {\n this.unschedule(key);\n const next = applyConfidenceEvent(this.ensure(key), event, this.budget);\n this.states.set(key, next);\n this.refreshRetestKey(key, next);\n this.scheduleExpiryOnly(key, next, event.submissionGeneration);\n return next;\n }\n\n drainRetests(limit: number): string[] {\n if (!Number.isSafeInteger(limit) || limit <= 0) return [];\n const result: string[] = [];\n for (const key of this.retestKeys) {\n if (result.length >= limit) break;\n result.push(key);\n }\n return result;\n }\n\n get(key: string): ConfidenceState | undefined {\n return this.states.get(key);\n }\n\n remove(key: string): void {\n this.unschedule(key);\n this.retestKeys.delete(key);\n this.states.delete(key);\n }\n\n /** Advance hidden evidence on a successful frame even when no query was issued for it. */\n advanceSuccessfulSubmits(\n submissionGeneration: number,\n excludedKeys?: ReadonlySet<string>,\n ): {\n readonly changed: boolean;\n readonly drawChangedKeys: readonly string[];\n readonly queryChangedKeys: readonly string[];\n } {\n let changed = false;\n const drawChangedKeys: string[] = [];\n const queryChangedKeys: string[] = [];\n // Expiry is consumed first. If a caller advances several generations in\n // one tick, an old expiry must win over a stale wake bucket; otherwise the\n // wake path could postpone visibility recovery indefinitely.\n const expireKeys = this.takeDue(\n this.expireByGeneration,\n this.expireHeap,\n this.expireHeapMembers,\n submissionGeneration,\n );\n for (const key of expireKeys) {\n const state = this.states.get(key);\n if (state === undefined || state.status !== 'hidden' || !state.queryable) continue;\n if (excludedKeys?.has(key)) {\n this.unschedule(key);\n this.schedule(key, state, submissionGeneration);\n continue;\n }\n const beforeQuery = shouldQueryState(state, this.budget);\n this.unschedule(key);\n const expiring =\n state.successfulSubmits >= this.budget.expirySubmits - 1\n ? state\n : { ...state, successfulSubmits: this.budget.expirySubmits - 1 };\n const expired = applyConfidenceEvent(\n expiring,\n {\n type: 'submit',\n submissionGeneration,\n },\n this.budget,\n );\n this.states.set(key, expired);\n this.refreshRetestKey(key, expired);\n changed = true;\n if (state.status !== expired.status || state.queryable !== expired.queryable) {\n drawChangedKeys.push(key);\n }\n if (beforeQuery !== shouldQueryState(expired, this.budget)) queryChangedKeys.push(key);\n }\n const wakeKeys = this.takeDue(\n this.wakeByGeneration,\n this.wakeHeap,\n this.wakeHeapMembers,\n submissionGeneration,\n );\n for (const key of wakeKeys) {\n const state = this.states.get(key);\n if (state === undefined || state.status !== 'hidden' || !state.queryable) continue;\n if (excludedKeys?.has(key)) {\n this.unschedule(key);\n this.schedule(key, state, submissionGeneration);\n continue;\n }\n const beforeQuery = shouldQueryState(state, this.budget);\n this.unschedule(key);\n const next: ConfidenceState =\n state.successfulSubmits >= this.budget.retestSubmits\n ? state\n : { ...state, successfulSubmits: this.budget.retestSubmits };\n this.states.set(key, next);\n this.refreshRetestKey(key, next);\n changed = changed || next !== state;\n if (state.status !== next.status || state.queryable !== next.queryable) {\n drawChangedKeys.push(key);\n }\n if (beforeQuery !== shouldQueryState(next, this.budget)) queryChangedKeys.push(key);\n this.scheduleExpiry(\n key,\n submissionGeneration + Math.max(1, this.budget.expirySubmits - next.successfulSubmits),\n );\n }\n return { changed, drawChangedKeys, queryChangedKeys };\n }\n\n clear(): void {\n this.states.clear();\n this.wakeByGeneration.clear();\n this.expireByGeneration.clear();\n this.scheduleByKey.clear();\n this.retestKeys.clear();\n this.wakeHeap.length = 0;\n this.expireHeap.length = 0;\n this.wakeHeapMembers.clear();\n this.expireHeapMembers.clear();\n }\n\n private schedule(key: string, state: ConfidenceState, anchorGeneration?: number): void {\n if (state.status !== 'hidden' || !state.queryable || state.lastResultGeneration === undefined) {\n return;\n }\n const anchor = anchorGeneration ?? state.lastResultGeneration;\n const wake = anchor + Math.max(0, this.budget.retestSubmits - state.successfulSubmits);\n const expire = anchor + Math.max(1, this.budget.expirySubmits - state.successfulSubmits);\n this.scheduleExpiry(key, expire);\n const entry = this.scheduleByKey.get(key);\n if (entry !== undefined && entry.wake === wake) return;\n this.addDue(this.wakeByGeneration, this.wakeHeap, this.wakeHeapMembers, wake, key);\n this.scheduleByKey.set(key, {\n wake,\n expire: entry?.expire ?? expire,\n });\n }\n\n private scheduleExpiry(key: string, expire: number): void {\n this.addDue(this.expireByGeneration, this.expireHeap, this.expireHeapMembers, expire, key);\n const entry = this.scheduleByKey.get(key);\n this.scheduleByKey.set(key, {\n wake: entry?.wake ?? Number.POSITIVE_INFINITY,\n expire,\n });\n }\n\n private scheduleExpiryOnly(key: string, state: ConfidenceState, anchorGeneration: number): void {\n if (state.status !== 'hidden' || !state.queryable || state.lastResultGeneration === undefined) {\n return;\n }\n const expire =\n anchorGeneration + Math.max(1, this.budget.expirySubmits - state.successfulSubmits);\n this.addDue(this.expireByGeneration, this.expireHeap, this.expireHeapMembers, expire, key);\n this.scheduleByKey.set(key, { wake: Number.POSITIVE_INFINITY, expire });\n }\n\n private unschedule(key: string): void {\n const entry = this.scheduleByKey.get(key);\n if (entry === undefined) return;\n if (Number.isFinite(entry.wake)) {\n removeDue(this.wakeByGeneration, this.wakeHeapMembers, entry.wake, key);\n }\n if (Number.isFinite(entry.expire)) {\n removeDue(this.expireByGeneration, this.expireHeapMembers, entry.expire, key);\n }\n this.scheduleByKey.delete(key);\n }\n\n private takeDue(\n source: Map<number, Set<string>>,\n heap: number[],\n heapMembers: Set<number>,\n generation: number,\n ): string[] {\n const result: string[] = [];\n while (heap[0] !== undefined && (heap[0] as number) <= generation) {\n const due = popMin(heap);\n heapMembers.delete(due);\n const keys = source.get(due);\n if (keys === undefined) continue;\n source.delete(due);\n result.push(...keys);\n }\n return result;\n }\n\n private addDue(\n source: Map<number, Set<string>>,\n heap: number[],\n heapMembers: Set<number>,\n generation: number,\n key: string,\n ): void {\n const set = source.get(generation) ?? new Set<string>();\n if (!source.has(generation)) {\n source.set(generation, set);\n if (!heapMembers.has(generation)) {\n heapMembers.add(generation);\n pushMin(heap, generation);\n }\n }\n set.add(key);\n }\n\n private refreshRetestKey(key: string, state: ConfidenceState): void {\n if (shouldIssueRetest(state, this.budget)) this.retestKeys.add(key);\n else this.retestKeys.delete(key);\n }\n}\n\nfunction removeDue(\n source: Map<number, Set<string>>,\n heapMembers: Set<number>,\n generation: number,\n key: string,\n): void {\n const keys = source.get(generation);\n if (keys === undefined) return;\n keys.delete(key);\n // The heap intentionally has no arbitrary-delete operation. Removing the\n // membership marker lets a later requeue of this same generation push a\n // fresh heap entry; the old heap entry is harmlessly skipped by takeDue.\n if (keys.size === 0) {\n source.delete(generation);\n heapMembers.delete(generation);\n }\n}\n\nfunction pushMin(heap: number[], value: number): void {\n heap.push(value);\n let index = heap.length - 1;\n while (index > 0) {\n const parent = Math.floor((index - 1) / 2);\n if ((heap[parent] as number) <= value) break;\n heap[index] = heap[parent] as number;\n index = parent;\n }\n heap[index] = value;\n}\n\nfunction popMin(heap: number[]): number {\n const first = heap[0] as number;\n const last = heap.pop() as number | undefined;\n if (last !== undefined && heap.length > 0) {\n let index = 0;\n while (true) {\n const left = index * 2 + 1;\n if (left >= heap.length) break;\n const right = left + 1;\n const child =\n right < heap.length && (heap[right] as number) < (heap[left] as number) ? right : left;\n if ((heap[child] as number) >= last) break;\n heap[index] = heap[child] as number;\n index = child;\n }\n heap[index] = last;\n }\n return first;\n}\n\nexport interface VisibilityDecisionInput {\n readonly authorVisible: boolean;\n readonly validBounds: boolean;\n readonly frustumVisible: boolean;\n readonly lodReady: boolean;\n readonly occlusion: Pick<ConfidenceState, 'status' | 'queryable'>;\n readonly lane?: 'cpu' | 'gpu';\n}\n\nexport interface VisibilityDecision {\n readonly draw: boolean;\n readonly stage: 'author' | 'bounds' | 'frustum' | 'lod' | 'occlusion';\n}\n\nexport function decideVisibility(input: VisibilityDecisionInput): VisibilityDecision {\n if (!input.authorVisible) return { draw: false, stage: 'author' };\n // Bounds are query input, not draw authority. Unknown or invalid bounds\n // skip frustum/query rejection and remain conservatively visible.\n if (!input.validBounds) return { draw: true, stage: 'bounds' };\n if (!input.frustumVisible) return { draw: false, stage: 'frustum' };\n if (!input.lodReady) return { draw: true, stage: 'lod' };\n if (input.occlusion.status === 'hidden' && input.occlusion.queryable) {\n return { draw: false, stage: 'occlusion' };\n }\n return { draw: true, stage: 'occlusion' };\n}\n\nexport interface RecoveredVisibilityState extends ConfidenceState {\n readonly retryCount: 1;\n}\n\nexport function recoverVisibilityAfterDeviceLoss(\n _state: ConfidenceState,\n _deviceGeneration: number,\n): RecoveredVisibilityState {\n return {\n status: 'visible',\n zeroStreak: 0,\n successfulSubmits: 0,\n queryable: true,\n dirty: true,\n lastResultGeneration: undefined,\n retryCount: 1,\n };\n}\n","import type {\n GraphBuffer,\n RenderGraphBuilder,\n RenderGraphFrame,\n} from '@forgeax/engine-render-graph';\nimport { RenderGraphError } from '@forgeax/engine-render-graph';\nimport type {\n BindGroup,\n BindGroupLayout,\n Buffer,\n ComputePipeline,\n PipelineLayout,\n Result,\n RhiDevice,\n} from '@forgeax/engine-rhi';\nimport { err, ok, RhiError } from '@forgeax/engine-rhi';\nimport type { GpuScene } from '../gpu-scene';\nimport { GPU_SCENE_LAYOUTS } from '../gpu-scene-schema';\nimport {\n GPU_BUFFER_USAGE_COPY_DST,\n GPU_BUFFER_USAGE_COPY_SRC,\n GPU_BUFFER_USAGE_INDIRECT,\n GPU_BUFFER_USAGE_MAP_READ,\n GPU_BUFFER_USAGE_STORAGE,\n GPU_BUFFER_USAGE_UNIFORM,\n} from '../gpu-usage';\nimport type { PipelineBuilderShaderModuleFactory } from '../pipeline-builder';\nimport type { GpuDrivenCandidate, SubmissionPlan } from './batch-topology';\nimport { GPU_DRIVEN_SKIN_FLAG } from './batch-topology';\n\nconst COMPUTE_STAGE = 0x4;\nconst WORKGROUP_SIZE = 64;\nconst LOD_ROW_STRIDE = GPU_SCENE_LAYOUTS.lod.stride;\nconst LOD_ROW_CAPACITY = 8;\nconst CANDIDATE_STRIDE = 48 + LOD_ROW_CAPACITY * LOD_ROW_STRIDE;\nconst BATCH_STRIDE = 32;\nconst VIEW_BYTES = 112;\n// visible + overflow + one bucket per selected LOD + selected/root index work.\n// The two work counters let inspection report geometry reduction from the\n// actual indirect draw ranges instead of treating submitted-instance count as\n// a proxy for vertex/index work.\nconst COUNTER_WORDS = 2 + LOD_ROW_CAPACITY + 2;\nconst GEOMETRY_WORK_COUNTER_OFFSET = 2 + LOD_ROW_CAPACITY;\nconst ROOT_GEOMETRY_WORK_COUNTER_OFFSET = GEOMETRY_WORK_COUNTER_OFFSET + 1;\nconst COUNTER_STRIDE = COUNTER_WORDS * 4;\ntype GpuDrivenAdmissionCandidate = GpuDrivenCandidate & {\n readonly submitAdmission?: boolean;\n};\n\nexport type GpuLodLane = 'gpu' | 'cpu';\n\nexport function selectGpuLodLane(caps: {\n readonly compute: boolean;\n readonly storageBuffer: boolean;\n readonly indirectDrawing: boolean;\n}): GpuLodLane {\n return caps.compute && caps.storageBuffer && caps.indirectDrawing ? 'gpu' : 'cpu';\n}\n\nexport const GPU_DRIVEN_VIEW_WGSL = /* wgsl */ `\nstruct PrimitiveRecord {\n generation: u32,\n flags: u32,\n transformIndex: u32,\n materialIndex: u32,\n drawTemplateIndex: u32,\n instanceStart: u32,\n instanceCount: u32,\n assetHandle: u32,\n localBoundsMin: vec4<f32>,\n localBoundsMax: vec4<f32>,\n};\n\nstruct TransformRecord {\n currentWorld: mat4x4<f32>,\n previousWorld: mat4x4<f32>,\n};\n\nstruct LodRecord {\n generation: u32,\n level: u32,\n firstIndex: u32,\n indexCount: u32,\n baseVertex: i32,\n screenCoverage: f32,\n hysteresis: f32,\n ready: u32,\n};\n\nstruct CandidateRecord {\n primitiveIndex: u32,\n generation: u32,\n instanceOrdinal: u32,\n materialSlot: u32,\n batchIndex: u32,\n visibleBase: u32,\n visibleCapacity: u32,\n // Low bit is admission; upper bits carry the batch-local projected Mesh row.\n // Suppressed candidates still contribute to the all-candidate LOD histogram,\n // but never enter the compacted visible stream. Packing both facts here\n // keeps the candidate ABI single-source when visibility compacts rows.\n submitAdmission: u32,\n projectedHeight: f32,\n previousLevel: u32,\n historyValid: u32,\n lodCount: u32,\n lodRows: array<LodRecord, 8>,\n};\n\nstruct InstanceRecord {\n primitiveIndex: u32,\n transformIndex: u32,\n customDataStart: u32,\n flags: u32,\n};\n\nstruct BatchRecord {\n visibleBase: u32,\n visibleCapacity: u32,\n count: u32,\n first: u32,\n baseVertex: i32,\n indirectIndex: u32,\n indexed: u32,\n candidateBase: u32,\n};\n\nstruct ViewConstants {\n planes: array<vec4<f32>, 6>,\n candidateCount: u32,\n batchCount: u32,\n pad0: u32,\n pad1: u32,\n};\n\nfn selectLodLevel(\n projectedHeight: f32,\n previousLevel: u32,\n historyValid: bool,\n rows: array<LodRecord, 8>,\n levelCount: u32,\n) -> u32 {\n // Row zero is the implicit root and has no transition threshold. Lower\n // levels carry the absolute boundary that introduces the preceding row.\n // This mirrors the CPU selector: height >= rows[1] selects root, height\n // between rows[2] and rows[1] selects level 1, and so on.\n var selected = levelCount - 1u;\n for (var level = 1u; level < levelCount; level += 1u) {\n if (projectedHeight >= rows[level].screenCoverage) {\n selected = level - 1u;\n break;\n }\n }\n if (historyValid && previousLevel < levelCount && selected != previousLevel) {\n var boundary = rows[previousLevel + 1u].screenCoverage;\n if (selected < previousLevel) { boundary = rows[previousLevel].screenCoverage; }\n let band = boundary * rows[previousLevel].hysteresis;\n if (abs(projectedHeight - boundary) <= band) { selected = previousLevel; }\n }\n if (selected >= levelCount || rows[selected].ready == 0u) { return 0u; }\n return selected;\n}\n\n@group(0) @binding(0) var<storage, read> primitives: array<PrimitiveRecord>;\n@group(0) @binding(1) var<storage, read> instances: array<InstanceRecord>;\n@group(0) @binding(2) var<storage, read> transforms: array<TransformRecord>;\n@group(0) @binding(3) var<storage, read> candidates: array<CandidateRecord>;\n@group(0) @binding(4) var<storage, read> batches: array<BatchRecord>;\n@group(0) @binding(5) var<uniform> view: ViewConstants;\n@group(0) @binding(6) var<storage, read_write> counters: array<atomic<u32>>;\n@group(0) @binding(7) var<storage, read_write> visibleIndices: array<vec2<u32>>;\n@group(0) @binding(8) var<storage, read_write> indirectArgs: array<u32>;\n\nfn counterIndex(batchIndex: u32) -> u32 { return batchIndex * ${COUNTER_WORDS}u; }\nfn overflowIndex(batchIndex: u32) -> u32 { return counterIndex(batchIndex) + 1u; }\nfn lodCounterIndex(batchIndex: u32, level: u32) -> u32 {\n return counterIndex(batchIndex) + 2u + level;\n}\n\nfn isVisible(primitive: PrimitiveRecord, world: mat4x4<f32>) -> bool {\n // GPU Scene bounds are optional. A producer that has not published local\n // bounds still belongs in the GPU lane; keep it conservatively visible\n // instead of silently dropping a valid draw.\n if ((primitive.flags & 5u) != 5u) { return false; }\n if ((primitive.flags & 2u) == 0u) { return true; }\n let localCenter = (primitive.localBoundsMin.xyz + primitive.localBoundsMax.xyz) * 0.5;\n let localExtent = (primitive.localBoundsMax.xyz - primitive.localBoundsMin.xyz) * 0.5;\n let worldCenter = (world * vec4<f32>(localCenter, 1.0)).xyz;\n let worldExtent =\n abs(world[0].xyz) * localExtent.x +\n abs(world[1].xyz) * localExtent.y +\n abs(world[2].xyz) * localExtent.z;\n for (var planeIndex = 0u; planeIndex < 6u; planeIndex += 1u) {\n let plane = view.planes[planeIndex];\n let radius = dot(abs(plane.xyz), worldExtent);\n if (dot(plane.xyz, worldCenter) + plane.w < -radius) { return false; }\n }\n return true;\n}\n\n@compute @workgroup_size(${WORKGROUP_SIZE})\nfn resetView(@builtin(global_invocation_id) id: vec3<u32>) {\n let batchIndex = id.x;\n if (batchIndex >= view.batchCount) { return; }\n atomicStore(&counters[counterIndex(batchIndex)], 0u);\n atomicStore(&counters[overflowIndex(batchIndex)], 0u);\n for (var level = 0u; level < ${LOD_ROW_CAPACITY}u; level += 1u) {\n atomicStore(&counters[lodCounterIndex(batchIndex, level)], 0u);\n }\n atomicStore(&counters[counterIndex(batchIndex) + ${GEOMETRY_WORK_COUNTER_OFFSET}u], 0u);\n atomicStore(&counters[counterIndex(batchIndex) + ${ROOT_GEOMETRY_WORK_COUNTER_OFFSET}u], 0u);\n}\n\n@compute @workgroup_size(${WORKGROUP_SIZE})\nfn cullView(@builtin(global_invocation_id) id: vec3<u32>) {\n let candidateIndex = id.x;\n if (candidateIndex >= view.candidateCount) { return; }\n let candidate = candidates[candidateIndex];\n let primitive = primitives[candidate.primitiveIndex];\n if (primitive.generation != candidate.generation) { return; }\n if (candidate.instanceOrdinal >= primitive.instanceCount) { return; }\n let instanceIndex = primitive.instanceStart + candidate.instanceOrdinal;\n let instance = instances[instanceIndex];\n let world = transforms[primitive.transformIndex].currentWorld * transforms[instance.transformIndex].currentWorld;\n let selectedLod = selectLodLevel(\n candidate.projectedHeight,\n candidate.previousLevel,\n candidate.historyValid != 0u,\n candidate.lodRows,\n candidate.lodCount,\n );\n if (candidate.lodRows[selectedLod].ready == 0u) { return; }\n // Selector counters describe the complete LOD population, including\n // candidates outside the frustum and candidates suppressed by the CPU\n // visibility facet. Submission counters below remain compacted draw facts.\n atomicAdd(&counters[lodCounterIndex(candidate.batchIndex, selectedLod)], 1u);\n if ((candidate.submitAdmission & 1u) == 0u) { return; }\n if (!isVisible(primitive, world)) { return; }\n atomicAdd(\n &counters[counterIndex(candidate.batchIndex) + ${GEOMETRY_WORK_COUNTER_OFFSET}u],\n candidate.lodRows[selectedLod].indexCount,\n );\n atomicAdd(\n &counters[counterIndex(candidate.batchIndex) + ${ROOT_GEOMETRY_WORK_COUNTER_OFFSET}u],\n candidate.lodRows[0u].indexCount,\n );\n let localVisible = atomicAdd(&counters[counterIndex(candidate.batchIndex)], 1u);\n if (localVisible >= candidate.visibleCapacity) {\n atomicStore(&counters[overflowIndex(candidate.batchIndex)], 1u);\n return;\n }\n var materialOrPalette = primitive.materialIndex + (candidate.materialSlot & 0x7fffffffu);\n if ((candidate.materialSlot & 0x80000000u) != 0u) {\n materialOrPalette = instance.customDataStart;\n }\n visibleIndices[candidate.visibleBase + localVisible] = vec2<u32>(\n candidate.submitAdmission >> 1u,\n materialOrPalette,\n );\n}\n\n@compute @workgroup_size(${WORKGROUP_SIZE})\nfn finalizeView(@builtin(global_invocation_id) id: vec3<u32>) {\n let batchIndex = id.x;\n if (batchIndex >= view.batchCount) { return; }\n let batch = batches[batchIndex];\n var visibleCount = min(\n atomicLoad(&counters[counterIndex(batchIndex)]),\n batch.visibleCapacity,\n );\n // Overflow is a failed generation, never a partially valid draw. Keep the\n // telemetry flag for the producer retry path but emit zero instances so no\n // subset of a visible batch reaches the rasterizer.\n if (atomicLoad(&counters[overflowIndex(batchIndex)]) != 0u) {\n visibleCount = 0u;\n }\n let args = batch.indirectIndex * 5u;\n let candidate = candidates[batch.candidateBase];\n let selectedLod = selectLodLevel(candidate.projectedHeight, candidate.previousLevel, candidate.historyValid != 0u, candidate.lodRows, candidate.lodCount);\n let lod = candidate.lodRows[selectedLod];\n indirectArgs[args] = select(batch.count, lod.indexCount, candidate.lodCount > 0u);\n indirectArgs[args + 1u] = visibleCount;\n indirectArgs[args + 2u] = select(batch.first, lod.firstIndex, candidate.lodCount > 0u && batch.indexed != 0u);\n indirectArgs[args + 3u] = select(0u, bitcast<u32>(lod.baseVertex), candidate.lodCount > 0u && batch.indexed != 0u);\n indirectArgs[args + 4u] = 0u;\n}\n`;\n\ninterface ViewBuffers {\n readonly candidates: Buffer;\n readonly batches: Buffer;\n readonly view: Buffer;\n readonly counters: Buffer;\n readonly visible: Buffer;\n readonly indirect: Buffer;\n readonly lodReadback: Buffer;\n}\n\ntype MutableViewBuffers = { -readonly [Name in keyof ViewBuffers]: ViewBuffers[Name] };\n\ntype LodTelemetryCopy = {\n readonly buffers: ViewBuffers;\n readonly plan: SubmissionPlan;\n readonly resourceGeneration: number;\n readonly submit?: GpuDrivenLodSubmitIdentity;\n};\n\nexport interface GpuDrivenLodSubmitIdentity {\n readonly frameId: number;\n readonly deviceGeneration: number;\n}\n\nexport interface GpuDrivenViewGraphResources {\n readonly primitive: GraphBuffer;\n readonly instance: GraphBuffer;\n readonly transform: GraphBuffer;\n readonly material: GraphBuffer;\n readonly visible: GraphBuffer;\n readonly indirect: GraphBuffer;\n readonly overflow: GraphBuffer;\n}\n\nexport interface GpuDrivenViewInspection {\n readonly topologyRevision: number | undefined;\n readonly candidateCount: number;\n readonly batchCount: number;\n readonly visibleCapacity: number;\n readonly candidateCapacity: number;\n /** Allocated visible-index capacity; distinct from logical candidates. */\n readonly visibleBufferCapacity: number;\n readonly batchCapacity: number;\n readonly indirectCapacity: number;\n readonly updateCount: number;\n readonly uploadBytes: number;\n readonly candidateUploadBytes: number;\n readonly batchUploadBytes: number;\n readonly viewConstantsUploadBytes: number;\n readonly bindGroupCreates: number;\n readonly bufferRebuilds: number;\n readonly resourceGeneration: number;\n}\n\nexport interface GpuDrivenViewBufferCapacities {\n readonly candidate: number;\n readonly visible: number;\n readonly batch: number;\n readonly indirect: number;\n}\n\nexport interface GpuDrivenLodSelectionInspection {\n readonly candidateCount: number;\n readonly batchCount: number;\n readonly indirectDrawCount: number;\n readonly visible: number;\n readonly occluded: number;\n /** True when the selector had to reject or clamp a visible candidate. */\n readonly overflow: boolean;\n readonly lodHistogram: readonly { readonly level: number; readonly count: number }[];\n readonly batches: readonly {\n readonly batchId: number;\n readonly candidateCount: number;\n readonly visible: number;\n readonly occluded: number;\n readonly overflow: boolean;\n readonly lodHistogram: readonly { readonly level: number; readonly count: number }[];\n }[];\n readonly worldSelections?: readonly {\n readonly worldKey: number;\n readonly primitiveSlot: number;\n readonly slotGeneration: number;\n readonly candidateCount: number;\n readonly visible: number;\n readonly occluded: number;\n readonly lodHistogram: readonly { readonly level: number; readonly count: number }[];\n }[];\n readonly geometryWork: number;\n readonly rootGeometryWork: number;\n /** Public receipt identity captured when the telemetry copy was encoded. */\n readonly submit?: GpuDrivenLodSubmitIdentity;\n}\n\nfunction nextCapacity(required: number): number {\n return 2 ** Math.ceil(Math.log2(Math.max(1, required)));\n}\n\n/** Selector batches with no admitted candidates never produce a raster draw. */\nfunction admittedRasterBatchCount(plan: SubmissionPlan): number {\n return plan.batches.reduce((count, batch) => count + (batch.visibleCapacity > 0 ? 1 : 0), 0);\n}\n\n/**\n * Derive each GPU-driven allocation from its own logical capacity domain.\n * Candidate records are dense; visible indices use the sparse, 64-entry\n * aligned ranges assigned by BatchTopology. Keeping these values separate is\n * what makes a large LOD candidate set bounded instead of multiplying the\n * candidate record and inline LOD-row buffers by the visible address space.\n */\nexport function deriveGpuDrivenViewBufferCapacities(\n plan: Pick<SubmissionPlan, 'candidateCount' | 'visibleCapacity' | 'batches'>,\n): GpuDrivenViewBufferCapacities {\n return Object.freeze({\n candidate: nextCapacity(plan.candidateCount),\n visible: nextCapacity(plan.visibleCapacity),\n batch: nextCapacity(plan.batches.length),\n indirect: nextCapacity(\n plan.batches.reduce((maximum, batch) => Math.max(maximum, batch.batchId + 1), 0),\n ),\n });\n}\n\nfunction bufferBinding(buffer: Buffer): {\n readonly kind: 'buffer';\n readonly value: { buffer: Buffer };\n} {\n return { kind: 'buffer', value: { buffer } };\n}\n\nexport class GpuDrivenView {\n private buffers: ViewBuffers | undefined;\n private supersededBuffers: ViewBuffers[] = [];\n private bindGroup: BindGroup | undefined;\n private candidateCapacity = 0;\n private visibleBufferCapacity = 0;\n private batchCapacity = 0;\n private indirectCapacity = 0;\n private plan: SubmissionPlan | undefined;\n private scenePrimitive: Buffer | undefined;\n private sceneInstance: Buffer | undefined;\n private sceneTransform: Buffer | undefined;\n private sceneMaterial: Buffer | undefined;\n private sceneCapacity = 0;\n private updateCount = 0;\n private uploadBytes = 0;\n private candidateUploadBytes = 0;\n private batchUploadBytes = 0;\n private viewConstantsUploadBytes = 0;\n private bindGroupCreates = 0;\n private bufferRebuilds = 0;\n private resourceGeneration = 0;\n /** The last readback copy that was actually encoded and is not consumed. */\n private telemetryPending: LodTelemetryCopy | undefined;\n /** Receipt identity for the copy pass encoded by the current frame. */\n private telemetrySubmit: GpuDrivenLodSubmitIdentity | undefined;\n /** Coalesce observers while the readback buffer is map-pending. */\n private lodSelectionReadback:\n | {\n readonly promise: Promise<GpuDrivenLodSelectionInspection | undefined>;\n }\n | undefined;\n private lodSelection: GpuDrivenLodSelectionInspection | undefined;\n\n private constructor(\n private readonly device: RhiDevice,\n private readonly bindGroupLayout: BindGroupLayout,\n private readonly pipelineLayout: PipelineLayout,\n private readonly resetPipeline: ComputePipeline,\n private readonly cullPipeline: ComputePipeline,\n private readonly finalizePipeline: ComputePipeline,\n private readonly labelPrefix: string,\n ) {}\n\n setTelemetrySubmit(identity: GpuDrivenLodSubmitIdentity | undefined): void {\n this.telemetrySubmit = identity;\n }\n\n static create(input: {\n readonly device: RhiDevice;\n readonly shaderModuleFactory: PipelineBuilderShaderModuleFactory;\n readonly labelPrefix?: string;\n }): Result<GpuDrivenView, RhiError> {\n const { device, shaderModuleFactory } = input;\n const labelPrefix = input.labelPrefix ?? 'gpu-driven-view';\n if (!device.caps.compute || !device.caps.storageBuffer || !device.caps.indirectDrawing) {\n return err(\n new RhiError({\n code: 'feature-not-enabled',\n expected: 'compute && storageBuffer && indirectDrawing',\n hint: 'use the CPU projection and direct submission fallback on this device',\n }),\n );\n }\n const layout = device.createBindGroupLayout({\n label: `${labelPrefix}-bgl`,\n entries: [\n { binding: 0, visibility: COMPUTE_STAGE, buffer: { type: 'read-only-storage' } },\n { binding: 1, visibility: COMPUTE_STAGE, buffer: { type: 'read-only-storage' } },\n { binding: 2, visibility: COMPUTE_STAGE, buffer: { type: 'read-only-storage' } },\n { binding: 3, visibility: COMPUTE_STAGE, buffer: { type: 'read-only-storage' } },\n { binding: 4, visibility: COMPUTE_STAGE, buffer: { type: 'read-only-storage' } },\n { binding: 5, visibility: COMPUTE_STAGE, buffer: { type: 'uniform' } },\n { binding: 6, visibility: COMPUTE_STAGE, buffer: { type: 'storage' } },\n { binding: 7, visibility: COMPUTE_STAGE, buffer: { type: 'storage' } },\n { binding: 8, visibility: COMPUTE_STAGE, buffer: { type: 'storage' } },\n ],\n });\n if (!layout.ok) return layout;\n const pipelineLayout = device.createPipelineLayout({\n label: `${labelPrefix}-pl`,\n bindGroupLayouts: [layout.value],\n });\n if (!pipelineLayout.ok) return pipelineLayout;\n const module = shaderModuleFactory.createShaderModule({\n label: 'gpu-driven-view',\n code: GPU_DRIVEN_VIEW_WGSL,\n });\n if (!module.ok) return module;\n const createPipeline = (entryPoint: string): Result<ComputePipeline, RhiError> =>\n device.createComputePipeline({\n label: `${labelPrefix}.${entryPoint}`,\n layout: pipelineLayout.value,\n compute: { module: module.value, entryPoint },\n });\n const reset = createPipeline('resetView');\n if (!reset.ok) return reset;\n const cull = createPipeline('cullView');\n if (!cull.ok) return cull;\n const finalize = createPipeline('finalizeView');\n if (!finalize.ok) return finalize;\n return ok(\n new GpuDrivenView(\n device,\n layout.value,\n pipelineLayout.value,\n reset.value,\n cull.value,\n finalize.value,\n labelPrefix,\n ),\n );\n }\n\n update(plan: SubmissionPlan, scene: GpuScene, planes: Float32Array): Result<void, RhiError> {\n this.candidateUploadBytes = 0;\n this.batchUploadBytes = 0;\n this.viewConstantsUploadBytes = 0;\n this.bindGroupCreates = 0;\n // The cached graph owns the readback copy. Do not arm an observation latch\n // here: a graph can be compiled but not submitted, and its copy can be\n // skipped while the previous mapAsync is pending. The encode callback\n // records only a copy that really reached the command encoder.\n this.lodSelection = undefined;\n const topologyChanged = this.plan !== plan;\n let buffersRebuilt = false;\n if (topologyChanged || this.buffers === undefined) {\n // Candidate records and compacted visible indices are different\n // capacity domains. LOD singleton batches align each visible segment\n // to 64 entries, so plan.visibleCapacity can be much larger than the\n // number of logical candidates. Never let that sparse address space\n // inflate candidate/LOD-row storage allocations.\n const capacities = deriveGpuDrivenViewBufferCapacities(plan);\n if (\n this.buffers === undefined ||\n capacities.candidate > this.candidateCapacity ||\n capacities.visible > this.visibleBufferCapacity ||\n capacities.batch > this.batchCapacity ||\n capacities.indirect > this.indirectCapacity\n ) {\n const rebuilt = this.rebuildBuffers(\n capacities.candidate,\n capacities.visible,\n capacities.batch,\n capacities.indirect,\n );\n if (!rebuilt.ok) return rebuilt;\n buffersRebuilt = true;\n }\n }\n const buffers = this.buffers;\n if (buffers === undefined) return ok(undefined);\n if (topologyChanged || buffersRebuilt) {\n const candidateBytes = new ArrayBuffer(Math.max(1, plan.candidateCount) * CANDIDATE_STRIDE);\n const candidates = new DataView(candidateBytes);\n const batchBytes = new ArrayBuffer(Math.max(1, plan.batches.length) * BATCH_STRIDE);\n const batches = new DataView(batchBytes);\n let candidateIndex = 0;\n for (let batchIndex = 0; batchIndex < plan.batches.length; batchIndex += 1) {\n const batch = plan.batches[batchIndex];\n if (batch === undefined) continue;\n const batchOffset = batchIndex * BATCH_STRIDE;\n batches.setUint32(batchOffset, batch.visibleBase, true);\n batches.setUint32(batchOffset + 4, batch.visibleCapacity, true);\n batches.setUint32(batchOffset + 8, batch.key.count, true);\n batches.setUint32(batchOffset + 12, batch.key.first, true);\n batches.setInt32(batchOffset + 16, batch.key.baseVertex, true);\n batches.setUint32(batchOffset + 20, batch.batchId, true);\n batches.setUint32(batchOffset + 24, batch.key.drawKind === 'indexed' ? 1 : 0, true);\n batches.setUint32(batchOffset + 28, candidateIndex, true);\n let visibleProjectionIndex = 0;\n for (const candidate of batch.candidates) {\n const admissionCandidate = candidate as GpuDrivenAdmissionCandidate;\n const candidateOffset = candidateIndex * CANDIDATE_STRIDE;\n candidates.setUint32(candidateOffset, candidate.primitiveIndex, true);\n candidates.setUint32(candidateOffset + 4, candidate.generation, true);\n candidates.setUint32(candidateOffset + 8, candidate.instanceOrdinal, true);\n const isSkin = candidate.prepared?.identity.deformation === 'skin';\n candidates.setUint32(\n candidateOffset + 12,\n batch.key.materialSlot | (isSkin ? GPU_DRIVEN_SKIN_FLAG : 0),\n true,\n );\n candidates.setUint32(candidateOffset + 16, batchIndex, true);\n candidates.setUint32(candidateOffset + 20, batch.visibleBase, true);\n candidates.setUint32(candidateOffset + 24, batch.visibleCapacity, true);\n const coverages = candidate.lodCoverages ?? [1];\n const ranges = [\n { first: batch.key.first, count: batch.key.count, baseVertex: batch.key.baseVertex },\n ...(candidate.lodRanges ?? []),\n ];\n const lodCount = Math.min(LOD_ROW_CAPACITY, Math.max(1, coverages.length, ranges.length));\n const admitted = admissionCandidate.submitAdmission !== false;\n candidates.setUint32(\n candidateOffset + 28,\n (visibleProjectionIndex << 1) | (admitted ? 1 : 0),\n true,\n );\n candidates.setFloat32(\n candidateOffset + 32,\n candidate.projectedHeight ?? Number.NaN,\n true,\n );\n candidates.setUint32(candidateOffset + 36, 0, true);\n candidates.setUint32(candidateOffset + 40, 0, true);\n candidates.setUint32(candidateOffset + 44, lodCount, true);\n for (let level = 0; level < lodCount; level += 1) {\n const rowOffset = candidateOffset + 48 + level * LOD_ROW_STRIDE;\n candidates.setUint32(rowOffset, candidate.generation, true);\n candidates.setUint32(rowOffset + 4, level, true);\n candidates.setUint32(rowOffset + 8, ranges[level]?.first ?? batch.key.first, true);\n candidates.setUint32(rowOffset + 12, ranges[level]?.count ?? batch.key.count, true);\n candidates.setInt32(\n rowOffset + 16,\n ranges[level]?.baseVertex ?? batch.key.baseVertex,\n true,\n );\n candidates.setFloat32(rowOffset + 20, coverages[level] ?? 0, true);\n candidates.setFloat32(rowOffset + 24, candidate.lodHysteresis ?? 0.08, true);\n candidates.setUint32(rowOffset + 28, 1, true);\n }\n if (admitted) visibleProjectionIndex += 1;\n candidateIndex += 1;\n }\n }\n const candidateWrite = this.device.queue.writeBuffer(\n buffers.candidates,\n 0,\n new Uint8Array(candidateBytes),\n );\n if (!candidateWrite.ok) return candidateWrite;\n const batchWrite = this.device.queue.writeBuffer(\n buffers.batches,\n 0,\n new Uint8Array(batchBytes),\n );\n if (!batchWrite.ok) return batchWrite;\n this.candidateUploadBytes = candidateBytes.byteLength;\n this.batchUploadBytes = batchBytes.byteLength;\n this.uploadBytes += candidateBytes.byteLength + batchBytes.byteLength;\n }\n const viewBytes = new ArrayBuffer(VIEW_BYTES);\n const viewFloats = new Float32Array(viewBytes);\n viewFloats.set(planes.subarray(0, 24));\n const viewU32 = new Uint32Array(viewBytes);\n viewU32[24] = plan.candidateCount;\n viewU32[25] = plan.batches.length;\n const viewWrite = this.device.queue.writeBuffer(buffers.view, 0, new Uint8Array(viewBytes));\n if (!viewWrite.ok) return viewWrite;\n this.viewConstantsUploadBytes = viewBytes.byteLength;\n this.uploadBytes += viewBytes.byteLength;\n const sceneChanged =\n this.scenePrimitive !== scene.primitiveBuffer ||\n this.sceneInstance !== scene.instanceBuffer ||\n this.sceneTransform !== scene.transformBuffer ||\n this.sceneMaterial !== scene.materialBuffer;\n if (this.bindGroup === undefined || sceneChanged || buffersRebuilt) {\n const binding = this.device.createBindGroup({\n label: `${this.labelPrefix}-bg`,\n layout: this.bindGroupLayout,\n entries: [\n { binding: 0, resource: bufferBinding(scene.primitiveBuffer) },\n { binding: 1, resource: bufferBinding(scene.instanceBuffer) },\n { binding: 2, resource: bufferBinding(scene.transformBuffer) },\n { binding: 3, resource: bufferBinding(buffers.candidates) },\n { binding: 4, resource: bufferBinding(buffers.batches) },\n { binding: 5, resource: bufferBinding(buffers.view) },\n { binding: 6, resource: bufferBinding(buffers.counters) },\n { binding: 7, resource: bufferBinding(buffers.visible) },\n { binding: 8, resource: bufferBinding(buffers.indirect) },\n ],\n });\n if (!binding.ok) return binding;\n this.bindGroup = binding.value;\n this.bindGroupCreates = 1;\n this.resourceGeneration += 1;\n }\n this.plan = plan;\n this.scenePrimitive = scene.primitiveBuffer;\n this.sceneInstance = scene.instanceBuffer;\n this.sceneTransform = scene.transformBuffer;\n this.sceneMaterial = scene.materialBuffer;\n this.sceneCapacity = scene.inspect().capacity;\n this.updateCount += 1;\n return ok(undefined);\n }\n\n inspect(): GpuDrivenViewInspection {\n return {\n topologyRevision: this.plan?.revision,\n candidateCount: this.plan?.candidateCount ?? 0,\n batchCount: this.plan?.batches.length ?? 0,\n visibleCapacity: this.plan?.visibleCapacity ?? 0,\n candidateCapacity: this.candidateCapacity,\n visibleBufferCapacity: this.visibleBufferCapacity,\n batchCapacity: this.batchCapacity,\n indirectCapacity: this.indirectCapacity,\n updateCount: this.updateCount,\n uploadBytes: this.uploadBytes,\n candidateUploadBytes: this.candidateUploadBytes,\n batchUploadBytes: this.batchUploadBytes,\n viewConstantsUploadBytes: this.viewConstantsUploadBytes,\n bindGroupCreates: this.bindGroupCreates,\n bufferRebuilds: this.bufferRebuilds,\n resourceGeneration: this.resourceGeneration,\n };\n }\n\n get visibleBuffer(): Buffer | undefined {\n return this.buffers?.visible;\n }\n\n get indirectBuffer(): Buffer | undefined {\n return this.buffers?.indirect;\n }\n\n get overflowBuffer(): Buffer | undefined {\n return this.buffers?.counters;\n }\n\n get overflowByteOffset(): number {\n return 4;\n }\n\n /** Read selected levels written by the GPU cull pass for the last submit. */\n readLodSelection(): Promise<GpuDrivenLodSelectionInspection | undefined> {\n const inFlight = this.lodSelectionReadback;\n if (inFlight !== undefined) return inFlight.promise;\n\n const buffers = this.buffers;\n const plan = this.plan;\n const copy = this.telemetryPending;\n if (\n buffers === undefined ||\n plan === undefined ||\n copy === undefined ||\n copy.buffers !== buffers ||\n copy.plan !== plan ||\n copy.resourceGeneration !== this.resourceGeneration ||\n typeof buffers.lodReadback.mapAsync !== 'function' ||\n buffers.lodReadback.mapState !== 'unmapped'\n ) {\n return Promise.resolve(this.lodSelection);\n }\n const promise = this.readLodSelectionCopy(buffers, plan, copy).finally(() => {\n if (this.lodSelectionReadback?.promise === promise) this.lodSelectionReadback = undefined;\n });\n this.lodSelectionReadback = { promise };\n return promise;\n }\n\n private async readLodSelectionCopy(\n buffers: ViewBuffers,\n plan: SubmissionPlan,\n copy: LodTelemetryCopy,\n ): Promise<GpuDrivenLodSelectionInspection | undefined> {\n const mapped = await buffers.lodReadback.mapAsync(GPU_BUFFER_USAGE_MAP_READ);\n if (!mapped.ok) return undefined;\n const range = mapped.value.getMappedRange();\n if (!range.ok) {\n mapped.value.unmap();\n return undefined;\n }\n try {\n const values = new DataView(range.value);\n let visible = 0;\n let overflow = false;\n let geometryWork = 0;\n let rootGeometryWork = 0;\n const histogram = new Map<number, number>();\n for (let batchIndex = 0; batchIndex < plan.batches.length; batchIndex += 1) {\n const offset = batchIndex * COUNTER_STRIDE;\n const batchOverflow = values.getUint32(offset + 4, true) !== 0;\n const batchVisible = batchOverflow\n ? 0\n : Math.min(\n values.getUint32(offset, true),\n plan.batches[batchIndex]?.visibleCapacity ?? 0,\n );\n visible += batchVisible;\n overflow ||= batchOverflow;\n geometryWork += values.getUint32(offset + GEOMETRY_WORK_COUNTER_OFFSET * 4, true);\n rootGeometryWork += values.getUint32(offset + ROOT_GEOMETRY_WORK_COUNTER_OFFSET * 4, true);\n for (let level = 0; level < LOD_ROW_CAPACITY; level += 1) {\n const count = values.getUint32(offset + (2 + level) * 4, true);\n if (count > 0) histogram.set(level, (histogram.get(level) ?? 0) + count);\n }\n }\n // A topology/resource replacement may have happened while mapAsync was\n // pending. Never publish those counters into the new plan/cache.\n if (\n this.buffers !== buffers ||\n this.plan !== plan ||\n this.resourceGeneration !== copy.resourceGeneration ||\n this.telemetryPending !== copy\n ) {\n return undefined;\n }\n const candidateCount = plan.candidateCount;\n this.lodSelection = Object.freeze({\n candidateCount,\n batchCount: plan.batches.length,\n // Selector-only batches remain in the plan/readback but the production\n // raster skips them. Report the actual nonzero-admission command count\n // so a benchmark cannot mistake selector batches for raster draws.\n indirectDrawCount: admittedRasterBatchCount(plan),\n visible,\n // A LOD histogram counts candidates that reached the selector, while\n // `visible` is the actual compacted submission count. Occlusion is the\n // difference between those candidate/visibility totals; using the\n // histogram here would mislabel a visible candidate dropped only by an\n // indirect-capacity overflow as occluded.\n occluded: Math.max(0, candidateCount - visible),\n overflow,\n lodHistogram: Object.freeze(\n [...histogram.entries()]\n .sort(([left], [right]) => left - right)\n .map(([level, count]) => Object.freeze({ level, count })),\n ),\n batches: Object.freeze(\n plan.batches.map((batch, batchIndex) => {\n const offset = batchIndex * COUNTER_STRIDE;\n const batchHistogram = new Map<number, number>();\n for (let level = 0; level < LOD_ROW_CAPACITY; level += 1) {\n const count = values.getUint32(offset + (2 + level) * 4, true);\n if (count > 0) batchHistogram.set(level, count);\n }\n const batchOverflow = values.getUint32(offset + 4, true) !== 0;\n const batchVisible = batchOverflow\n ? 0\n : Math.min(values.getUint32(offset, true), batch.visibleCapacity);\n return Object.freeze({\n batchId: batch.batchId,\n candidateCount: batch.candidates.length,\n visible: batchVisible,\n occluded: Math.max(0, batch.candidates.length - batchVisible),\n overflow: batchOverflow,\n lodHistogram: Object.freeze(\n [...batchHistogram.entries()]\n .sort(([left], [right]) => left - right)\n .map(([level, count]) => Object.freeze({ level, count })),\n ),\n });\n }),\n ),\n geometryWork,\n rootGeometryWork,\n ...(copy.submit === undefined ? {} : { submit: copy.submit }),\n });\n this.telemetryPending = undefined;\n return this.lodSelection;\n } finally {\n mapped.value.unmap();\n }\n }\n\n addPasses<FrameCtx extends RenderGraphFrame>(\n builder: RenderGraphBuilder<FrameCtx>,\n labelPrefix = 'gpu-driven',\n includeCompute = true,\n ): Result<GpuDrivenViewGraphResources, RenderGraphError> {\n const buffers = this.buffers;\n const bindGroup = this.bindGroup;\n const plan = this.plan;\n if (buffers === undefined || bindGroup === undefined || plan === undefined) {\n return err(\n new RenderGraphError({\n code: 'resource-descriptor-invalid',\n expected: 'GpuDrivenView.update(...) precedes addPasses(...)',\n hint: 'publish the current SubmissionPlan and view planes first',\n detail: {\n resourceLabel: 'gpu-driven-view',\n field: 'state',\n expected: 'updated',\n actual: 'not-updated',\n },\n }),\n );\n }\n const importBuffer = (name: string, buffer: Buffer, size: number, usage: number) =>\n builder.importBuffer(name, { size, usage }, () => buffer);\n const scenePrefix = labelPrefix === 'gpu-driven' ? 'gpu-scene' : `${labelPrefix}.scene`;\n const primitive = importBuffer(\n `${scenePrefix}.primitive`,\n this.scenePrimitive as Buffer,\n this.sceneCapacity * GPU_SCENE_LAYOUTS.primitive.stride,\n GPU_BUFFER_USAGE_STORAGE | GPU_BUFFER_USAGE_COPY_DST | GPU_BUFFER_USAGE_COPY_SRC,\n );\n if (!primitive.ok) return primitive;\n const transform = importBuffer(\n `${scenePrefix}.transform`,\n this.sceneTransform as Buffer,\n this.sceneCapacity * GPU_SCENE_LAYOUTS.transform.stride,\n GPU_BUFFER_USAGE_STORAGE | GPU_BUFFER_USAGE_COPY_DST | GPU_BUFFER_USAGE_COPY_SRC,\n );\n if (!transform.ok) return transform;\n const instance = importBuffer(\n `${scenePrefix}.instance`,\n this.sceneInstance as Buffer,\n this.sceneCapacity * GPU_SCENE_LAYOUTS.instance.stride,\n GPU_BUFFER_USAGE_STORAGE | GPU_BUFFER_USAGE_COPY_DST | GPU_BUFFER_USAGE_COPY_SRC,\n );\n if (!instance.ok) return instance;\n const material = importBuffer(\n `${scenePrefix}.material`,\n this.sceneMaterial as Buffer,\n this.sceneCapacity * GPU_SCENE_LAYOUTS.material.stride,\n GPU_BUFFER_USAGE_STORAGE | GPU_BUFFER_USAGE_COPY_DST | GPU_BUFFER_USAGE_COPY_SRC,\n );\n if (!material.ok) return material;\n const candidates = importBuffer(\n `${labelPrefix}.candidates`,\n buffers.candidates,\n this.candidateCapacity * CANDIDATE_STRIDE,\n GPU_BUFFER_USAGE_STORAGE | GPU_BUFFER_USAGE_COPY_DST,\n );\n if (!candidates.ok) return candidates;\n const batches = importBuffer(\n `${labelPrefix}.batches`,\n buffers.batches,\n this.batchCapacity * BATCH_STRIDE,\n GPU_BUFFER_USAGE_STORAGE | GPU_BUFFER_USAGE_COPY_DST,\n );\n if (!batches.ok) return batches;\n const view = importBuffer(\n `${labelPrefix}.view`,\n buffers.view,\n VIEW_BYTES,\n GPU_BUFFER_USAGE_UNIFORM | GPU_BUFFER_USAGE_COPY_DST,\n );\n if (!view.ok) return view;\n const counters = importBuffer(\n `${labelPrefix}.counters`,\n buffers.counters,\n this.batchCapacity * COUNTER_STRIDE,\n GPU_BUFFER_USAGE_STORAGE | GPU_BUFFER_USAGE_COPY_SRC,\n );\n if (!counters.ok) return counters;\n const lodReadback = importBuffer(\n `${labelPrefix}.lod-selection-readback`,\n buffers.lodReadback,\n this.batchCapacity * COUNTER_STRIDE,\n GPU_BUFFER_USAGE_MAP_READ | GPU_BUFFER_USAGE_COPY_DST,\n );\n if (!lodReadback.ok) return lodReadback;\n const visible = importBuffer(\n `${labelPrefix}.visible`,\n buffers.visible,\n this.visibleBufferCapacity * 8,\n GPU_BUFFER_USAGE_STORAGE | GPU_BUFFER_USAGE_COPY_SRC,\n );\n if (!visible.ok) return visible;\n const indirect = importBuffer(\n `${labelPrefix}.indirect`,\n buffers.indirect,\n this.indirectCapacity * 20,\n GPU_BUFFER_USAGE_STORAGE | GPU_BUFFER_USAGE_INDIRECT | GPU_BUFFER_USAGE_COPY_SRC,\n );\n if (!indirect.ok) return indirect;\n if (!includeCompute) {\n return ok({\n visible: visible.value,\n primitive: primitive.value,\n instance: instance.value,\n transform: transform.value,\n material: material.value,\n indirect: indirect.value,\n overflow: counters.value,\n });\n }\n const reset = builder.addComputePass(`${labelPrefix}.view-reset`, {\n accesses: [\n { resource: view.value, usage: 'uniform-read' },\n { resource: counters.value, usage: 'storage-read-write' },\n ],\n encode: ({ pass }) => {\n pass.setPipeline(this.resetPipeline);\n pass.setBindGroup(0, bindGroup);\n pass.dispatchWorkgroups(Math.ceil(Math.max(1, plan.batches.length) / WORKGROUP_SIZE));\n },\n });\n if (!reset.ok) return reset;\n const cull = builder.addComputePass(`${labelPrefix}.frustum-compact`, {\n accesses: [\n { resource: primitive.value, usage: 'storage-read' },\n { resource: instance.value, usage: 'storage-read' },\n { resource: transform.value, usage: 'storage-read' },\n { resource: candidates.value, usage: 'storage-read' },\n { resource: view.value, usage: 'uniform-read' },\n { resource: counters.value, usage: 'storage-read-write' },\n { resource: visible.value, usage: 'storage-read-write' },\n ],\n encode: ({ pass }) => {\n pass.setPipeline(this.cullPipeline);\n pass.setBindGroup(0, bindGroup);\n pass.dispatchWorkgroups(Math.ceil(Math.max(1, plan.candidateCount) / WORKGROUP_SIZE));\n },\n });\n if (!cull.ok) return cull;\n const finalize = builder.addComputePass(`${labelPrefix}.finalize-indirect`, {\n accesses: [\n { resource: batches.value, usage: 'storage-read' },\n { resource: view.value, usage: 'uniform-read' },\n { resource: counters.value, usage: 'storage-read' },\n { resource: indirect.value, usage: 'storage-read-write' },\n ],\n encode: ({ pass }) => {\n pass.setPipeline(this.finalizePipeline);\n pass.setBindGroup(0, bindGroup);\n pass.dispatchWorkgroups(Math.ceil(Math.max(1, plan.batches.length) / WORKGROUP_SIZE));\n },\n });\n if (!finalize.ok) return finalize;\n const graphResourceGeneration = this.resourceGeneration;\n const readback = builder.addCopyPass(`${labelPrefix}.lod-selection-readback`, {\n accesses: [\n { resource: counters.value, usage: 'copy-src' },\n { resource: lodReadback.value, usage: 'copy-dst' },\n ],\n encode: ({ encoder, resources }) => {\n // A cached graph may run while an observer is awaiting mapAsync on the\n // previous copy. WebGPU forbids submitting a copy into a\n // pending/mapped buffer; skip only this telemetry copy and keep the\n // raster/indirect work intact. RhiNull has no runtime mapState, so its\n // undefined value remains structurally executable.\n const mapState = buffers.lodReadback.mapState;\n if (mapState !== undefined && mapState !== 'unmapped') return;\n encoder.copyBufferToBuffer(\n resources.buffer(counters.value).unwrap(),\n resources.buffer(lodReadback.value).unwrap(),\n this.batchCapacity * COUNTER_STRIDE,\n );\n // The render graph is cached across camera-only LOD projection\n // changes. The pass closure therefore retains the graph-generation\n // plan while `this.plan` carries the plan uploaded for the frame that\n // is actually being submitted. Counters belong to that current plan;\n // retaining the stale closure plan would make every observation fail\n // the identity fence and silently leave the CPU level-0 placeholder.\n const submittedPlan = this.plan;\n if (\n this.buffers === buffers &&\n submittedPlan !== undefined &&\n this.resourceGeneration === graphResourceGeneration\n ) {\n this.telemetryPending = {\n buffers,\n plan: submittedPlan,\n resourceGeneration: graphResourceGeneration,\n ...(this.telemetrySubmit === undefined ? {} : { submit: this.telemetrySubmit }),\n };\n }\n },\n });\n if (!readback.ok) return readback;\n return ok({\n visible: visible.value,\n primitive: primitive.value,\n instance: instance.value,\n transform: transform.value,\n material: material.value,\n indirect: indirect.value,\n overflow: counters.value,\n });\n }\n\n dispose(): void {\n const buffers = [\n ...this.supersededBuffers,\n ...(this.buffers === undefined ? [] : [this.buffers]),\n ];\n this.supersededBuffers = [];\n this.buffers = undefined;\n this.bindGroup = undefined;\n this.plan = undefined;\n this.visibleBufferCapacity = 0;\n this.scenePrimitive = undefined;\n this.sceneInstance = undefined;\n this.sceneTransform = undefined;\n this.sceneMaterial = undefined;\n this.sceneCapacity = 0;\n this.telemetryPending = undefined;\n this.telemetrySubmit = undefined;\n this.lodSelectionReadback = undefined;\n this.lodSelection = undefined;\n this.destroyAfterSubmittedWork(buffers);\n void this.pipelineLayout;\n }\n\n /**\n * @internal\n * Accept the current buffer generation after its typed graph compiles.\n * Superseded imports stay alive while the last-known-good graph remains\n * executable, then retire behind the queue fence only after promotion.\n */\n _commitResourceReplacement(): void {\n const buffers = this.supersededBuffers;\n if (buffers.length === 0) return;\n this.supersededBuffers = [];\n this.destroyAfterSubmittedWork(buffers);\n }\n\n /**\n * @internal\n * Grow every view buffer after a GPU overflow was observed. The next\n * `update` rewrites the same plan into the replacement generation, so the\n * failed generation cannot be reused even when topology identity is stable.\n */\n _recoverFromOverflow(): Result<void, RhiError> {\n if (this.buffers === undefined) return ok(undefined);\n return this.rebuildBuffers(\n this.candidateCapacity * 2,\n this.visibleBufferCapacity * 2,\n this.batchCapacity * 2,\n this.indirectCapacity * 2,\n );\n }\n\n private rebuildBuffers(\n candidateCapacity: number,\n visibleCapacity: number,\n batchCapacity: number,\n indirectCapacity: number,\n ): Result<void, RhiError> {\n const nextCandidate = nextCapacity(candidateCapacity);\n const nextVisible = nextCapacity(visibleCapacity);\n const nextBatch = nextCapacity(batchCapacity);\n const nextIndirect = nextCapacity(indirectCapacity);\n const created: Partial<MutableViewBuffers> = {};\n const allocate = (\n name: keyof ViewBuffers,\n size: number,\n usage: number,\n ): Result<void, RhiError> => {\n const buffer = this.device.createBuffer({\n label: `gpu-driven-view-${name}`,\n size,\n usage,\n mappedAtCreation: false,\n });\n if (!buffer.ok) return buffer;\n created[name] = buffer.value;\n return ok(undefined);\n };\n const storage = GPU_BUFFER_USAGE_STORAGE | GPU_BUFFER_USAGE_COPY_SRC;\n const requests: readonly {\n readonly name: keyof ViewBuffers;\n readonly size: number;\n readonly usage: number;\n readonly storage: boolean;\n }[] = [\n {\n name: 'candidates',\n size: nextCandidate * CANDIDATE_STRIDE,\n usage: storage | GPU_BUFFER_USAGE_COPY_DST,\n storage: true,\n },\n {\n name: 'batches',\n size: nextBatch * BATCH_STRIDE,\n usage: storage | GPU_BUFFER_USAGE_COPY_DST,\n storage: true,\n },\n {\n name: 'view',\n size: VIEW_BYTES,\n usage: GPU_BUFFER_USAGE_UNIFORM | GPU_BUFFER_USAGE_COPY_DST,\n storage: false,\n },\n { name: 'counters', size: nextBatch * COUNTER_STRIDE, usage: storage, storage: true },\n { name: 'visible', size: nextVisible * 8, usage: storage, storage: true },\n {\n name: 'indirect',\n size: nextIndirect * 20,\n usage: storage | GPU_BUFFER_USAGE_INDIRECT,\n storage: true,\n },\n {\n name: 'lodReadback',\n size: nextBatch * COUNTER_STRIDE,\n usage: GPU_BUFFER_USAGE_MAP_READ | GPU_BUFFER_USAGE_COPY_DST,\n storage: false,\n },\n ];\n const maxBufferSize = Number(this.device.limits.maxBufferSize);\n const maxStorageBufferBindingSize = Number(this.device.limits.maxStorageBufferBindingSize);\n for (const request of requests) {\n const limit = request.storage ? maxStorageBufferBindingSize : maxBufferSize;\n if (!Number.isFinite(limit) || limit <= 0 || request.size <= limit) continue;\n return err(\n new RhiError({\n code: 'limit-exceeded',\n expected: `GPU-driven ${request.name} buffer (${request.size} B) fits within ${request.storage ? 'device.limits.maxStorageBufferBindingSize' : 'device.limits.maxBufferSize'} (${limit} B)`,\n hint: 'reduce the visible/candidate workload or split the GPU-driven buffer plan before retrying',\n detail: {\n maxStorageBufferBindingSize: limit,\n requestedBytes: request.size,\n },\n }),\n );\n }\n for (const request of requests) {\n const result = allocate(request.name, request.size, request.usage);\n if (!result.ok) {\n for (const buffer of Object.values(created)) this.device.destroyBuffer(buffer);\n return result;\n }\n }\n if (this.buffers !== undefined) this.supersededBuffers.push(this.buffers);\n this.buffers = created as ViewBuffers;\n this.candidateCapacity = nextCandidate;\n this.visibleBufferCapacity = nextVisible;\n this.batchCapacity = nextBatch;\n this.indirectCapacity = nextIndirect;\n this.bufferRebuilds += 1;\n this.bindGroup = undefined;\n this.telemetryPending = undefined;\n return ok(undefined);\n }\n\n private destroyAfterSubmittedWork(generations: readonly ViewBuffers[]): void {\n if (generations.length === 0) return;\n const release = (): void => {\n for (const buffers of generations) {\n for (const buffer of Object.values(buffers)) {\n this.device.destroyBuffer(buffer);\n }\n }\n };\n void this.device.queue.onSubmittedWorkDone().then(release, release);\n }\n}\nexport { decideVisibility } from '../scene/visibility/occlusion-confidence';\n","import {\n type GraphAccess,\n type GraphResourceResolver,\n type RenderGraphBuilder,\n RenderGraphError,\n type RenderGraphFrame,\n} from '@forgeax/engine-render-graph';\nimport type { Result, RhiDevice, RhiRenderPassEncoder } from '@forgeax/engine-rhi';\nimport { err, ok, RhiError } from '@forgeax/engine-rhi';\nimport type { GpuScene } from '../gpu-scene';\nimport type { PipelineBuilderShaderModuleFactory } from '../pipeline-builder';\nimport {\n buildBatchAlignedSubmission,\n buildSubmissionCandidateMembership,\n type GpuDrivenCandidate,\n type SubmissionPlan,\n} from './batch-topology';\nimport { GpuDrivenView, type GpuDrivenViewGraphResources } from './view-gpu';\n\nexport type ShadowViewKind = 'directional' | 'point' | 'spot';\n\nexport interface ShadowViewIdentity {\n readonly kind: ShadowViewKind;\n readonly index: number;\n /** Optional point-light index when `index` identifies the cube face. */\n readonly face?: number;\n}\n\nexport type ShadowViewCacheState = 'hit' | 'invalidated';\n\nexport interface ShadowViewUpdateInput {\n readonly identity: ShadowViewIdentity;\n readonly sourcePlan: SubmissionPlan;\n readonly scene: GpuScene;\n readonly planes: Float32Array;\n readonly cacheToken?: string;\n readonly candidatePrimitiveIndices?: readonly number[] | ReadonlySet<number>;\n}\n\nexport interface ShadowViewUpdate {\n readonly identity: ShadowViewIdentity;\n readonly cache: ShadowViewCacheState;\n readonly generation: number;\n readonly sourcePlan: SubmissionPlan;\n readonly plan: SubmissionPlan;\n readonly view: GpuDrivenView;\n}\n\nexport interface ShadowViewProjection {\n readonly identity: ShadowViewIdentity;\n readonly cache: ShadowViewCacheState;\n readonly generation: number;\n readonly plan: SubmissionPlan;\n readonly view: GpuDrivenView;\n readonly passNames: readonly string[];\n readonly graphResources: GpuDrivenViewGraphResources | undefined;\n}\n\nexport interface ShadowViewSubmission {\n readonly identity: ShadowViewIdentity;\n readonly cache: ShadowViewCacheState;\n readonly generation: number;\n readonly plan: SubmissionPlan;\n readonly view: GpuDrivenView;\n}\n\n/**\n * The only record-side hook a capable shadow lane needs after the shared\n * groups are bound. The callback owns material/mesh binding policy and emits\n * the indirect draws for this view; it receives the pool projection rather\n * than rebuilding a candidate list from the frame.\n */\nexport interface ShadowViewGpuRecordInput {\n readonly identity: ShadowViewIdentity;\n readonly projection: ShadowViewProjection;\n readonly pass: RhiRenderPassEncoder;\n readonly resources: GraphResourceResolver;\n}\n\nexport type ShadowViewGpuRecorder = (input: ShadowViewGpuRecordInput) => void;\n\nexport interface ShadowViewGpuPass {\n readonly projection: ShadowViewProjection;\n readonly resources: GraphResourceResolver;\n readonly record: ShadowViewGpuRecorder;\n}\n\nexport interface ShadowViewInspection {\n readonly identity: ShadowViewIdentity;\n readonly cache: ShadowViewCacheState;\n readonly generation: number;\n readonly sourceRevision: number;\n readonly candidateCount: number;\n readonly batchCount: number;\n readonly resourceGeneration: number;\n}\n\ninterface SceneBuffers {\n readonly primitive: GpuScene['primitiveBuffer'];\n readonly instance: GpuScene['instanceBuffer'];\n readonly transform: GpuScene['transformBuffer'];\n readonly material: GpuScene['materialBuffer'];\n}\n\ninterface ShadowViewRecord {\n readonly identity: ShadowViewIdentity;\n readonly view: GpuDrivenView;\n sourcePlan: SubmissionPlan;\n plan: SubmissionPlan;\n scene: GpuScene;\n cacheToken: string;\n contentRevision: number;\n planes: Float32Array;\n candidateSignature: string;\n generation: number;\n cache: ShadowViewCacheState;\n invalidated: boolean;\n published: boolean;\n resourceGeneration: number;\n sceneBuffers: SceneBuffers;\n}\n\nfunction identityKey(identity: ShadowViewIdentity): string {\n return `${identity.kind}:${identity.index}:${identity.face ?? ''}`;\n}\n\nexport function shadowViewIdentityKey(identity: ShadowViewIdentity): string {\n return identityKey(identity);\n}\n\nfunction validateIdentity(identity: ShadowViewIdentity): RhiError | undefined {\n if (!Number.isInteger(identity.index) || identity.index < 0) {\n return new RhiError({\n code: 'internal-error',\n expected: 'shadow view index is a non-negative integer',\n hint: 'publish a stable directional cascade, point face, or spot atlas index',\n });\n }\n if (\n identity.face !== undefined &&\n (!Number.isInteger(identity.face) || identity.face < 0 || identity.face > 5)\n ) {\n return new RhiError({\n code: 'internal-error',\n expected: 'point shadow face is an integer from 0 through 5',\n hint: 'publish a valid cube face for the point shadow view',\n });\n }\n return undefined;\n}\n\nfunction copyPlanes(planes: Float32Array): Result<Float32Array, RhiError> {\n if (planes.length < 24) {\n return err(\n new RhiError({\n code: 'internal-error',\n expected: 'shadow view publishes six clipping planes',\n hint: 'provide a 24-float frustum plane array before updating the view',\n }),\n );\n }\n return ok(new Float32Array(planes.subarray(0, 24)));\n}\n\nfunction samePlanes(left: Float32Array, right: Float32Array): boolean {\n if (left.length !== right.length) return false;\n for (let index = 0; index < left.length; index += 1) {\n if (left[index] !== right[index]) return false;\n }\n return true;\n}\n\nfunction sceneBuffers(scene: GpuScene): SceneBuffers {\n return {\n primitive: scene.primitiveBuffer,\n instance: scene.instanceBuffer,\n transform: scene.transformBuffer,\n material: scene.materialBuffer,\n };\n}\n\nfunction sameSceneBuffers(left: SceneBuffers, right: SceneBuffers): boolean {\n return (\n left.primitive === right.primitive &&\n left.instance === right.instance &&\n left.transform === right.transform &&\n left.material === right.material\n );\n}\n\nfunction candidateIndices(\n values: readonly number[] | ReadonlySet<number> | undefined,\n): Result<readonly number[] | undefined, RhiError> {\n if (values === undefined) return ok(undefined);\n const entries = Array.from(values);\n for (const entry of entries) {\n if (!Number.isInteger(entry) || entry < 0) {\n return err(\n new RhiError({\n code: 'internal-error',\n expected: 'shadow candidate primitive indices are non-negative integers',\n hint: 'derive ShadowCaster membership from the shared BatchTopology channel index',\n }),\n );\n }\n }\n return ok(Object.freeze([...new Set(entries)].sort((left, right) => left - right)));\n}\n\nfunction projectPlan(\n source: SubmissionPlan,\n primitiveIndices: readonly number[] | undefined,\n): SubmissionPlan {\n if (primitiveIndices === undefined) return source;\n const membership = buildSubmissionCandidateMembership(source);\n const candidatesByBatch = new Map<number, GpuDrivenCandidate[]>();\n for (const primitiveIndex of primitiveIndices) {\n for (const entry of membership.byPrimitiveIndex.get(primitiveIndex) ?? []) {\n const candidates = candidatesByBatch.get(entry.batchId) ?? [];\n candidates.push(entry.candidate);\n candidatesByBatch.set(entry.batchId, candidates);\n }\n }\n const immutableCandidates = new Map<number, readonly GpuDrivenCandidate[]>();\n for (const [batchId, candidates] of candidatesByBatch) {\n immutableCandidates.set(batchId, Object.freeze(candidates));\n }\n return buildBatchAlignedSubmission(source, immutableCandidates);\n}\n\nfunction candidateSignature(primitiveIndices: readonly number[] | undefined): string {\n return primitiveIndices === undefined ? '*' : primitiveIndices.join(',');\n}\n\nexport function shadowViewLabelPrefix(identity: ShadowViewIdentity): string {\n switch (identity.kind) {\n case 'directional':\n return `gpu-driven.shadow.directional-cascade-${identity.index}`;\n case 'point':\n return `gpu-driven.shadow.point-cube-face-${identity.index}${\n identity.face === undefined ? '' : `-${identity.face}`\n }`;\n case 'spot':\n return `gpu-driven.shadow.spot-atlas-${identity.index}`;\n }\n}\n\n/**\n * Accesses consumed by a shadow raster adapter. These are the same imported\n * scene and view-local resources written by GpuDrivenView.addPasses(...), so\n * the graph inserts the compute-to-raster dependency without a second graph\n * or a manual barrier owner.\n */\nexport function shadowViewRasterAccesses(\n resources: GpuDrivenViewGraphResources,\n): readonly GraphAccess[] {\n return Object.freeze([\n { resource: resources.primitive, usage: 'storage-read' },\n { resource: resources.instance, usage: 'storage-read' },\n { resource: resources.transform, usage: 'storage-read' },\n { resource: resources.material, usage: 'storage-read' },\n { resource: resources.visible, usage: 'storage-read' },\n { resource: resources.indirect, usage: 'indirect-read' },\n ] satisfies GraphAccess[]);\n}\n\nfunction passNames(identity: ShadowViewIdentity): readonly string[] {\n const prefix = shadowViewLabelPrefix(identity);\n return Object.freeze([\n `${prefix}.view-reset`,\n `${prefix}.frustum-compact`,\n `${prefix}.finalize-indirect`,\n ]);\n}\n\nfunction graphStateError(identity: ShadowViewIdentity): RenderGraphError {\n return new RenderGraphError({\n code: 'resource-descriptor-invalid',\n expected: 'ShadowViewStatePool.update(...) precedes project(...)',\n hint: 'publish the shared scene, topology channel, and view planes before graph projection',\n detail: {\n resourceLabel: identityKey(identity),\n field: 'state',\n expected: 'updated',\n actual: 'not-updated',\n },\n });\n}\n\n/**\n * Renderer-owned shadow view state. The pool shares one scene/topology source;\n * each directional, point, or spot entry owns only view constants, visibility,\n * counters, indirect arguments, and its cache decision.\n */\nexport class ShadowViewStatePool {\n private readonly records = new Map<string, ShadowViewRecord>();\n private readonly activeKeys = new Set<string>();\n private readonly retiring = new Map<string, ShadowViewRecord>();\n private readonly pendingPublication = new Set<string>();\n\n private constructor(\n private readonly device: RhiDevice,\n private readonly shaderModuleFactory: PipelineBuilderShaderModuleFactory,\n ) {}\n\n static create(input: {\n readonly device: RhiDevice;\n readonly shaderModuleFactory: PipelineBuilderShaderModuleFactory;\n }): Result<ShadowViewStatePool, RhiError> {\n return ok(new ShadowViewStatePool(input.device, input.shaderModuleFactory));\n }\n\n update(input: ShadowViewUpdateInput): Result<ShadowViewUpdate, RhiError> {\n const identityError = validateIdentity(input.identity);\n if (identityError !== undefined) return err(identityError);\n const planes = copyPlanes(input.planes);\n if (!planes.ok) return planes;\n const indices = candidateIndices(input.candidatePrimitiveIndices);\n if (!indices.ok) return indices;\n const key = identityKey(input.identity);\n this.activeKeys.add(key);\n this.retiring.delete(key);\n const previous = this.records.get(key);\n const token = input.cacheToken ?? '';\n const contentRevision = input.scene.contentRevision;\n const signature = candidateSignature(indices.value);\n const currentSceneBuffers = sceneBuffers(input.scene);\n const cacheHit =\n previous !== undefined &&\n !previous.invalidated &&\n previous.sourcePlan === input.sourcePlan &&\n previous.scene === input.scene &&\n previous.published &&\n previous.cacheToken === token &&\n previous.contentRevision === contentRevision &&\n previous.candidateSignature === signature &&\n samePlanes(previous.planes, planes.value) &&\n sameSceneBuffers(previous.sceneBuffers, currentSceneBuffers) &&\n previous.resourceGeneration === previous.view.inspect().resourceGeneration;\n if (cacheHit && previous !== undefined) {\n previous.cache = 'hit';\n return ok({\n identity: previous.identity,\n cache: 'hit',\n generation: previous.generation,\n sourcePlan: previous.sourcePlan,\n plan: previous.plan,\n view: previous.view,\n });\n }\n\n const selectedPlan = projectPlan(input.sourcePlan, indices.value);\n let view = previous?.view;\n if (view === undefined) {\n const created = GpuDrivenView.create({\n device: this.device,\n shaderModuleFactory: this.shaderModuleFactory,\n labelPrefix: `${shadowViewLabelPrefix(input.identity)}.view`,\n });\n if (!created.ok) return created;\n view = created.value;\n }\n const updated = view.update(selectedPlan, input.scene, planes.value);\n if (!updated.ok) return updated;\n const generation = (previous?.generation ?? 0) + 1;\n const record: ShadowViewRecord = {\n identity: Object.freeze({ ...input.identity }),\n view,\n sourcePlan: input.sourcePlan,\n plan: selectedPlan,\n scene: input.scene,\n cacheToken: token,\n contentRevision,\n planes: planes.value,\n candidateSignature: signature,\n generation,\n cache: 'invalidated',\n invalidated: false,\n published: false,\n resourceGeneration: view.inspect().resourceGeneration,\n sceneBuffers: currentSceneBuffers,\n };\n this.records.set(key, record);\n this.pendingPublication.add(key);\n return ok({\n identity: record.identity,\n cache: 'invalidated',\n generation,\n sourcePlan: record.sourcePlan,\n plan: record.plan,\n view: record.view,\n });\n }\n\n project<FrameCtx extends RenderGraphFrame>(\n builder: RenderGraphBuilder<FrameCtx>,\n identity: ShadowViewIdentity,\n ): Result<ShadowViewProjection, RenderGraphError> {\n const record = this.records.get(identityKey(identity));\n if (record === undefined) return err(graphStateError(identity));\n const cacheHit = record.cache === 'hit' && !record.invalidated;\n const projected = record.view.addPasses(\n builder,\n shadowViewLabelPrefix(record.identity),\n !cacheHit,\n );\n if (!projected.ok) return projected;\n return ok({\n identity: record.identity,\n cache: cacheHit ? 'hit' : 'invalidated',\n generation: record.generation,\n plan: record.plan,\n view: record.view,\n passNames: cacheHit ? Object.freeze([]) : passNames(record.identity),\n graphResources: projected.value,\n });\n }\n\n invalidate(identity?: ShadowViewIdentity): void {\n if (identity === undefined) {\n for (const record of this.records.values()) {\n record.invalidated = true;\n record.cache = 'invalidated';\n }\n return;\n }\n const record = this.records.get(identityKey(identity));\n if (record !== undefined) {\n record.invalidated = true;\n record.cache = 'invalidated';\n }\n }\n\n cacheState(identity: ShadowViewIdentity): ShadowViewCacheState | undefined {\n const record = this.records.get(identityKey(identity));\n if (record === undefined) return undefined;\n return record.invalidated ? 'invalidated' : record.cache;\n }\n\n cacheHit(identity: ShadowViewIdentity): boolean {\n return this.activeKeys.has(identityKey(identity)) && this.cacheState(identity) === 'hit';\n }\n\n isActive(identity: ShadowViewIdentity): boolean {\n return this.activeKeys.has(identityKey(identity));\n }\n\n submission(identity: ShadowViewIdentity): ShadowViewSubmission | undefined {\n const key = identityKey(identity);\n if (!this.activeKeys.has(key)) return undefined;\n const record = this.records.get(key);\n if (record === undefined) return undefined;\n return {\n identity: record.identity,\n cache: record.cache,\n generation: record.generation,\n plan: record.plan,\n view: record.view,\n };\n }\n\n /**\n * Keep only the active view identities for the current frame. Removed light\n * views are disposed through their own queue-fenced resource owner instead\n * of remaining in inspection or changing the compiled topology forever.\n */\n retain(identities: readonly ShadowViewIdentity[]): void {\n const active = new Set(identities.map(identityKey));\n for (const [key, record] of this.records) {\n if (active.has(key)) continue;\n this.activeKeys.delete(key);\n this.retiring.set(key, record);\n }\n }\n\n /** @internal Commit every view resource replacement after a successful submit. */\n _commitResourceReplacement(): void {\n for (const record of this.records.values()) record.view._commitResourceReplacement();\n for (const key of this.pendingPublication) {\n const record = this.records.get(key);\n if (record !== undefined) record.published = true;\n }\n this.pendingPublication.clear();\n for (const [key, record] of this.retiring) {\n record.view.dispose();\n this.records.delete(key);\n this.retiring.delete(key);\n }\n }\n\n /**\n * Abort a staged frame before its queue submit barrier. A candidate view\n * must not become a cache hit merely because graph encoding succeeded: the\n * next frame has to rebuild it after any submit/finish failure.\n */\n _abortResourceReplacement(): void {\n for (const key of this.pendingPublication) {\n const record = this.records.get(key);\n if (record === undefined) continue;\n record.published = false;\n record.invalidated = true;\n record.cache = 'invalidated';\n }\n this.pendingPublication.clear();\n }\n\n inspect(): readonly ShadowViewInspection[] {\n return Object.freeze(\n [...this.records.values()]\n .filter((record) => this.activeKeys.has(identityKey(record.identity)))\n .sort((left, right) =>\n identityKey(left.identity).localeCompare(identityKey(right.identity)),\n )\n .map((record) => {\n const view = record.view.inspect();\n return Object.freeze({\n identity: record.identity,\n cache: record.cache,\n generation: record.generation,\n sourceRevision: record.sourcePlan.revision,\n candidateCount: record.plan.candidateCount,\n batchCount: record.plan.batches.length,\n resourceGeneration: view.resourceGeneration,\n });\n }),\n );\n }\n\n dispose(): void {\n const views = new Set([...this.records.values()].map((record) => record.view));\n for (const view of views) view.dispose();\n this.records.clear();\n this.activeKeys.clear();\n this.retiring.clear();\n this.pendingPublication.clear();\n }\n}\n\nexport { ShadowViewStatePool as GpuDrivenShadowViewPool };\n","import { probeVideoHighPerfUpload } from '@forgeax/engine-graphics-extras';\nimport {\n type BindGroup,\n type BindGroupEntry,\n type Buffer,\n type RenderPipeline,\n RhiError,\n type RhiQueue,\n type RhiRenderPassEncoder,\n} from '@forgeax/engine-rhi';\nimport type { MaterialRenderState, PassSelector } from '@forgeax/engine-types';\nimport { transmissionBackdropAvailable } from '../assembly/device-feature-admission';\nimport { gpuDrivenShadowDrawKey } from '../extract/gpu-driven';\nimport type { SubmissionPlan } from '../gpu-driven/batch-topology';\nimport type { GpuDrivenShadowBatchProjection } from '../gpu-driven/production-raster';\nimport { type ShadowViewIdentity, shadowViewIdentityKey } from '../gpu-driven/shadow-views';\nimport type { GpuDrivenView } from '../gpu-driven/view-gpu';\nimport { GpuBuffer } from '../gpu-resource';\nimport {\n GPU_BUFFER_USAGE_COPY_DST,\n GPU_BUFFER_USAGE_STORAGE,\n GPU_BUFFER_USAGE_UNIFORM,\n} from '../gpu-usage';\nimport { assembleMaterialWithSkylightEntries } from '../ibl/skylight-bind-group';\nimport type { InstanceBufferCacheEntry } from '../instance-buffer-cache';\nimport { instanceUploadRangesForResident } from '../instances';\nimport {\n buildPbrMaterialUserRegionEntries,\n createPbrSkinMeshBindGroupEntries,\n pbrSkinMeshDynamicOffsets,\n SHADOW_CASTER_SHADER_ID,\n shadowCasterVariantSet,\n} from '../pbr-pipeline';\nimport { COOKIE_MATRIX_BYTES } from '../prepare/extended-lighting/resources';\nimport type {\n DispatchEntry,\n ExtractedLights,\n RenderableSnapshot,\n ShadowCasterMembership,\n} from '../render-system-extract';\nimport { matchPass } from '../systems/pass-selector';\nimport { instanceCollectionCacheKey, worldEntityKey } from './frame-snapshot';\nimport {\n reportInstanceResidency,\n resolveGeometryInstancesBindGroup,\n resolveStorageInstanceChunks,\n} from './main-pass-geometry';\nimport {\n buildPerSubmeshMaterialBg,\n type PerSubmeshMaterialBgDeps,\n prepareMaterialSkylight,\n} from './main-pass-material';\nimport {\n findFromChain,\n getOrCreateFromChain,\n getOrCreateFromChainResult,\n INSTANCE_UBO_FULL_ARRAY_BYTES,\n MAX_UNIFORM_INSTANCES,\n MESH_PER_ENTITY_STRIDE,\n MESH_SSBO_BYTES,\n MESH_UBO_FULL_ARRAY_BYTES,\n packInstanceStorageBuffer,\n} from './mesh-ssbo';\nimport type { _InternalRenderPipelineContext } from './render-context';\nimport { MATERIAL_PER_ENTITY_STRIDE, STANDARD_PBR_UBO_SIZE } from './render-context';\nimport { POINTS_LINES_VIEW_BYTES, pointShadowViewOffset, VIEW_UNIFORM_BYTES } from './view-ubo';\n\nexport const SHADOW_CASTER_SLOT_STRIDE = 256;\nexport const SHADOW_CASTER_BUFFER_SIZE = SHADOW_CASTER_SLOT_STRIDE * 8;\n\n/**\n * Renderer-owned capable shadow submission. The view/counter/indirect ABI is\n * shared with the main GPU-driven lane; this record only supplies the\n * prepared per-batch raster state that cannot be inferred from a raw scene.\n * When present, the capable lane emits one indirect command per topology batch\n * and never walks `validatedOrdered`.\n */\nexport interface GpuDrivenShadowBatch {\n readonly pipeline: RenderPipeline;\n readonly meshBindGroup: BindGroup;\n readonly visibleBindGroup: BindGroup;\n readonly deformation: 'rigid' | 'skin';\n /** Complete binding for this batch, including opaque batches after custom casters. */\n readonly materialGroup: BindGroup;\n readonly vertexBuffer: Buffer;\n readonly indexBuffer?: Buffer | undefined;\n readonly indexFormat?: 'uint16' | 'uint32' | undefined;\n}\n\nexport interface GpuDrivenShadowSubmission {\n readonly view: GpuDrivenView;\n readonly plan: SubmissionPlan;\n readonly batches: ReadonlyMap<number, GpuDrivenShadowBatch>;\n readonly instancesBindGroup?: BindGroup | undefined;\n}\n\nexport function directionalShadowCasterOffset(cascadeIndex: number): number {\n return SHADOW_CASTER_SLOT_STRIDE * cascadeIndex;\n}\n\nexport function spotShadowCasterOffset(tile: number): number {\n return SHADOW_CASTER_SLOT_STRIDE * (4 + tile);\n}\n\nexport function writeShadowCasterUniforms(\n queue: RhiQueue,\n buffer: Buffer,\n lights: ExtractedLights,\n): void {\n for (let cascade = 0; cascade < 4; cascade += 1) {\n const written = queue.writeBuffer(\n buffer,\n directionalShadowCasterOffset(cascade),\n new Uint32Array([cascade, 0, 0, 0]),\n );\n if (!written.ok) throw written.error;\n }\n for (const snapshot of lights.spot) {\n const tile = snapshot.shadowAtlasTile;\n if (tile < 0 || tile >= 4 || snapshot.lightViewProj === undefined) continue;\n const offset = spotShadowCasterOffset(tile);\n const header = queue.writeBuffer(buffer, offset, new Uint32Array([0, 1, 0, 0]));\n if (!header.ok) throw header.error;\n const matrix = queue.writeBuffer(buffer, offset + 16, snapshot.lightViewProj);\n if (!matrix.ok) throw matrix.error;\n }\n}\n\nfunction ensureTypedShadowViewBg(\n c: _InternalRenderPipelineContext,\n viewOffset: number,\n cascadeOffset: number,\n variant: string,\n): BindGroup | null {\n const { runtime, frameState, pipelineState } = c;\n const shadowSampler = pipelineState.perPassResources.shadowSampler;\n if (shadowSampler === null) return null;\n const extendedLighting = pipelineState.extendedLightingAvailable ?? false;\n const iesProfileTextureView = pipelineState.iesProfileTextureView;\n const cookieTextureView = pipelineState.cookieTextureView;\n const cookieMatrixBuffer = pipelineState.cookieMatrixBuffer;\n const ltcLambertTextureView = pipelineState.ltcLambertTextureView;\n const ltcGgxTextureView = pipelineState.ltcGgxTextureView;\n const extendedLightingCacheKeys: object[] = [];\n const extendedLightingEntries: BindGroupEntry[] = [];\n if (extendedLighting) {\n if (\n iesProfileTextureView === undefined ||\n cookieTextureView === undefined ||\n cookieMatrixBuffer === undefined ||\n ltcLambertTextureView === undefined ||\n ltcGgxTextureView === undefined\n ) {\n return null;\n }\n extendedLightingCacheKeys.push(\n pipelineState.defaultSampler,\n iesProfileTextureView,\n cookieTextureView,\n ltcLambertTextureView,\n ltcGgxTextureView,\n cookieMatrixBuffer,\n );\n extendedLightingEntries.push(\n {\n binding: 9,\n resource: { kind: 'sampler', value: pipelineState.defaultSampler },\n },\n {\n binding: 11,\n resource: { kind: 'textureView', value: iesProfileTextureView },\n },\n {\n binding: 12,\n resource: { kind: 'textureView', value: cookieTextureView },\n },\n {\n binding: 13,\n resource: { kind: 'textureView', value: ltcLambertTextureView },\n },\n {\n binding: 14,\n resource: { kind: 'textureView', value: ltcGgxTextureView },\n },\n {\n binding: 15,\n resource: {\n kind: 'buffer',\n value: { buffer: cookieMatrixBuffer, size: COOKIE_MATRIX_BYTES },\n },\n },\n );\n }\n const projectorAvailable = pipelineState.projectorAvailable !== false;\n try {\n return getOrCreateFromChain(\n frameState.viewBindGroupCache,\n [\n pipelineState.viewUniformBuffer,\n pipelineState.shadowFallbackTextureView,\n shadowSampler,\n pipelineState.shadowAtlasFallbackTextureView,\n pipelineState.shadowParamsBuffer,\n pipelineState.shadowCasterCascadeBuffer,\n pipelineState.shadowFallbackTextureView,\n ...(extendedLighting\n ? extendedLightingCacheKeys\n : projectorAvailable\n ? [pipelineState.defaultWhiteTextureView, pipelineState.defaultSampler]\n : []),\n pipelineState.pointsLinesViewBuffer ?? pipelineState.viewUniformBuffer,\n ],\n variant,\n () => {\n const created = runtime.device.createBindGroup({\n label: variant,\n layout: pipelineState.viewBindGroupLayout,\n entries: [\n {\n binding: 0,\n resource: {\n kind: 'buffer',\n value: {\n buffer: pipelineState.viewUniformBuffer,\n offset: viewOffset,\n size: VIEW_UNIFORM_BYTES,\n },\n },\n },\n {\n binding: 3,\n resource: { kind: 'textureView', value: pipelineState.shadowFallbackTextureView },\n },\n {\n binding: 4,\n resource: { kind: 'sampler', value: shadowSampler },\n },\n {\n binding: 5,\n resource: {\n kind: 'textureView',\n value: pipelineState.shadowAtlasFallbackTextureView,\n },\n },\n {\n binding: 6,\n resource: { kind: 'buffer', value: { buffer: pipelineState.shadowParamsBuffer } },\n },\n {\n binding: 7,\n resource: {\n kind: 'buffer',\n value: {\n buffer: pipelineState.shadowCasterCascadeBuffer,\n offset: cascadeOffset,\n size: POINTS_LINES_VIEW_BYTES,\n },\n },\n },\n {\n binding: 8,\n resource: { kind: 'textureView', value: pipelineState.shadowFallbackTextureView },\n },\n ...extendedLightingEntries,\n {\n binding: 10,\n resource: {\n kind: 'buffer',\n value: {\n buffer: pipelineState.pointsLinesViewBuffer ?? pipelineState.viewUniformBuffer,\n size: 80,\n },\n },\n },\n ...(!extendedLighting && projectorAvailable\n ? [\n {\n binding: 11,\n resource: {\n kind: 'textureView' as const,\n value: pipelineState.defaultWhiteTextureView,\n },\n },\n {\n binding: 12,\n resource: { kind: 'sampler' as const, value: pipelineState.defaultSampler },\n },\n ]\n : []),\n ],\n });\n if (!created.ok) throw created.error;\n return created.value;\n },\n c.bindGroupCounts,\n );\n } catch (error) {\n if (error instanceof RhiError) {\n runtime.errorRegistry.fire(error);\n return null;\n }\n throw error;\n }\n}\n\ninterface ShadowDispatch {\n readonly passIndex: number;\n readonly materialHandle: number;\n readonly vertexEntry: string | undefined;\n readonly fragmentEntry: string | undefined;\n readonly materialShaderId: string;\n readonly renderState: MaterialRenderState | undefined;\n readonly materialSlot: number | undefined;\n readonly paramSnapshot: DispatchEntry['paramSnapshot'];\n}\n\ntype ShadowDispatchMap = ReadonlyMap<number, ReadonlyMap<number, readonly ShadowDispatch[]>>;\n\nfunction shadowDispatchEntries(c: _InternalRenderPipelineContext): readonly DispatchEntry[] {\n return c.shadowDispatch ?? c.dispatch;\n}\n\nexport function shadowShaderMap(c: _InternalRenderPipelineContext): ShadowDispatchMap {\n const shaders = new Map<number, Map<number, ShadowDispatch[]>>();\n const shadowRows = c.shadowDispatch !== undefined;\n const rows = (shadowRows ? c.shadowValidatedOrdered : c.validatedOrdered) ?? [];\n const base = shadowRows ? c.validatedOrdered.length : 0;\n const slotsByRenderable = new Map(\n rows.map((row, index) => [row.renderableIndex, c.materialSlotIndices?.[base + index] ?? []]),\n );\n for (const entry of shadowDispatchEntries(c)) {\n if (entry.tags.LightMode !== 'ShadowCaster' || entry.materialShaderId === undefined) continue;\n let byMaterial = shaders.get(entry.renderableIndex);\n if (byMaterial === undefined) {\n byMaterial = new Map<number, ShadowDispatch[]>();\n shaders.set(entry.renderableIndex, byMaterial);\n }\n const candidateSlots = slotsByRenderable.get(entry.renderableIndex) ?? [];\n const materialSlot = candidateSlots.find(\n (slot) => c.materialSlots?.[slot]?.materialHandle === entry.materialHandle,\n );\n const dispatches = byMaterial.get(entry.materialHandle) ?? [];\n dispatches.push({\n passIndex: entry.passIndex,\n materialHandle: entry.materialHandle,\n vertexEntry: entry.vertexEntry,\n fragmentEntry: entry.fragmentEntry,\n materialShaderId:\n entry.materialShaderId === 'forgeax::default-standard-pbr'\n ? SHADOW_CASTER_SHADER_ID\n : entry.materialShaderId,\n renderState: entry.renderState,\n materialSlot,\n paramSnapshot: entry.paramSnapshot,\n });\n byMaterial.set(entry.materialHandle, dispatches);\n }\n return shaders;\n}\n\nfunction shadowRasterState(\n state: MaterialRenderState | undefined,\n reflected: boolean,\n): MaterialRenderState | undefined {\n return reflected ? { ...state, frontFace: state?.frontFace === 'cw' ? 'ccw' : 'cw' } : state;\n}\n\nfunction shadowPipeline(\n c: _InternalRenderPipelineContext,\n reflected = false,\n): RenderPipeline | null {\n return (\n c.runtime.getMaterialShaderPipeline?.(\n SHADOW_CASTER_SHADER_ID,\n false,\n shadowRasterState(undefined, reflected),\n 'triangle-list',\n undefined,\n shadowCasterVariantSet(c.runtime.device.caps.storageBuffer, false),\n 'shadow-caster',\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n 'pbr',\n ) ?? null\n );\n}\n\nfunction skinnedShadowMeshBindGroup(\n c: _InternalRenderPipelineContext,\n entry: _InternalRenderPipelineContext['validatedOrdered'][number],\n): BindGroup | null {\n const skin = entry.source.skin;\n const layout = c.pipelineState.pbrSkinMeshBindGroupLayout;\n const allocator = c.pipelineState.skinPaletteAllocator;\n if (skin === undefined || layout === null || allocator === null) return null;\n return getOrCreateFromChain(\n c.frameState.meshBindGroupCache,\n [c.pipelineState.meshStorageBuffer.buffer, skin.buffer],\n 'shadow-pbr-skin-mesh',\n () => {\n const created = c.runtime.device.createBindGroup({\n label: 'shadow-pbr-skin-mesh-bg',\n layout,\n entries: createPbrSkinMeshBindGroupEntries(\n c.pipelineState.meshStorageBuffer.buffer,\n c.runtime.device.caps.storageBuffer ? MESH_SSBO_BYTES : MESH_UBO_FULL_ARRAY_BYTES,\n skin.buffer,\n allocator.bindingWindowBytes,\n ),\n });\n if (!created.ok) throw created.error;\n return created.value;\n },\n c.bindGroupCounts,\n );\n}\n\n/**\n * Record the capable shadow lane from the shared view's indirect arguments.\n * The submission is an explicit prepared contract: missing view buffers or a\n * missing batch raster projection are terminal rather than a reason to fall\n * back to a CPU caster walk. The caller may then keep the existing CPU path\n * when no capable submission was published for the current view.\n */\nexport function recordGpuDrivenShadowIndirect(\n pass: RhiRenderPassEncoder,\n submission: GpuDrivenShadowSubmission,\n): void {\n const indirect = submission.view.indirectBuffer;\n if (indirect === undefined) {\n throw new RhiError({\n code: 'internal-error',\n expected: 'GPU-driven shadow view indirect buffer',\n hint: 'publish a prepared view generation before recording a capable shadow pass',\n });\n }\n const indexed = new Map<number, GpuDrivenShadowBatch>();\n for (const [batchId, batch] of submission.batches) indexed.set(batchId, batch);\n let currentPipeline: RenderPipeline | undefined;\n let currentVertex: Buffer | undefined;\n let currentIndex: Buffer | undefined;\n for (const batch of submission.plan.batches) {\n const raster = indexed.get(batch.batchId);\n if (raster === undefined) {\n throw new RhiError({\n code: 'internal-error',\n expected: `prepared shadow raster batch ${batch.batchId}`,\n hint: 'keep the shadow view plan and prepared batch projection on one generation',\n });\n }\n if (currentPipeline !== raster.pipeline) {\n pass.setPipeline(raster.pipeline);\n currentPipeline = raster.pipeline;\n }\n if (currentVertex !== raster.vertexBuffer) {\n pass.setVertexBuffer(0, raster.vertexBuffer);\n currentVertex = raster.vertexBuffer;\n }\n pass.setBindGroup(1, raster.materialGroup, [0]);\n if (raster.indexBuffer !== undefined) {\n if (raster.indexFormat === undefined) {\n throw new RhiError({\n code: 'internal-error',\n expected: `index format for prepared shadow raster batch ${batch.batchId}`,\n hint: 'publish the geometry layout projection with the capable shadow batch',\n });\n }\n if (currentIndex !== raster.indexBuffer) {\n pass.setIndexBuffer(raster.indexBuffer, raster.indexFormat);\n currentIndex = raster.indexBuffer;\n }\n pass.setBindGroup(2, raster.meshBindGroup, raster.deformation === 'skin' ? [0, 0, 0] : [0]);\n pass.setBindGroup(3, raster.visibleBindGroup);\n pass.drawIndexedIndirect(indirect, batch.indirectOffset);\n } else {\n pass.setBindGroup(2, raster.meshBindGroup, raster.deformation === 'skin' ? [0, 0, 0] : [0]);\n pass.setBindGroup(3, raster.visibleBindGroup);\n pass.drawIndirect(indirect, batch.indirectOffset);\n }\n }\n}\n\nfunction shadowDrawIndicesBySubmesh(\n source: RenderableSnapshot,\n mesh: _InternalRenderPipelineContext['validatedOrdered'][number]['mesh'],\n): ReadonlyMap<number, number> {\n const draws = source.gpuDrivenDraws;\n if (draws === undefined || draws.length === 0) return new Map();\n const indices = new Map<number, number>();\n let hasStableSourceIdentity = false;\n for (const [compactIndex, draw] of draws.entries()) {\n const drawItemIndex = draw.drawItemIndex;\n if (drawItemIndex === undefined) continue;\n hasStableSourceIdentity = true;\n if (mesh.submeshes[drawItemIndex] !== undefined) indices.set(drawItemIndex, compactIndex);\n }\n if (hasStableSourceIdentity) return indices;\n\n // Legacy snapshots predating drawItemIndex are matched by their compact\n // geometry facts. New extracted snapshots never take this path.\n let nonIndexedFirst = 0;\n let drawCursor = 0;\n for (const [submeshIndex, submesh] of mesh.submeshes.entries()) {\n const first = mesh.indexed ? submesh.indexOffset : nonIndexedFirst;\n const count = mesh.indexed ? submesh.indexCount : submesh.vertexCount;\n if (!mesh.indexed) nonIndexedFirst += submesh.vertexCount;\n const draw = draws[drawCursor];\n if (\n draw !== undefined &&\n draw.first === first &&\n draw.count === count &&\n draw.materialSlot === submesh.materialSlot &&\n draw.topology === submesh.topology\n ) {\n indices.set(submeshIndex, drawCursor);\n drawCursor += 1;\n }\n }\n return indices;\n}\n\nfunction isGpuShadowClaimedSubmesh(\n source: RenderableSnapshot,\n renderableIndex: number,\n submeshIndex: number,\n drawIndices: ReadonlyMap<number, number>,\n gpuDrivenShadowDrawKeys: ReadonlySet<string> | undefined,\n shadowDispatchByRenderableIdx: ShadowDispatchMap,\n shadowCasterMembership: readonly ShadowCasterMembership[] | undefined,\n shadowCasterWorldKeys: readonly number[] | undefined,\n): boolean {\n if (gpuDrivenShadowDrawKeys === undefined) return false;\n const drawItemIndex = drawIndices.get(submeshIndex);\n const draw = drawItemIndex === undefined ? undefined : source.gpuDrivenDraws?.[drawItemIndex];\n if (drawItemIndex === undefined || draw === undefined) return false;\n const material = source.materials[draw.materialSlot] ?? source.material;\n const worldEntity = worldEntityKey(\n shadowCasterWorldKeys?.[source.worldId] ?? source.worldId,\n source.entityKey,\n );\n const sourceDrawItemIndex = draw.drawItemIndex ?? drawItemIndex;\n if (shadowCasterMembership !== undefined) {\n const matching = shadowCasterMembership.filter(\n (membership) =>\n membership.worldEntity === worldEntity &&\n membership.materialHandle === (material.materialHandle ?? -1) &&\n membership.drawItemIndex === sourceDrawItemIndex,\n );\n if (\n matching.length === 0 ||\n matching.some((membership) => membership.cpuReason !== undefined)\n ) {\n return false;\n }\n return matching.every((membership) =>\n gpuDrivenShadowDrawKeys.has(\n gpuDrivenShadowDrawKey(\n membership.worldEntity,\n membership.materialHandle,\n membership.drawItemIndex,\n membership.passIndex,\n ),\n ),\n );\n }\n const dispatches =\n shadowDispatchByRenderableIdx.get(renderableIndex)?.get(material.materialHandle ?? 0) ?? [];\n if (dispatches.length > 0) {\n return dispatches.every((dispatch) =>\n gpuDrivenShadowDrawKeys.has(\n gpuDrivenShadowDrawKey(\n worldEntity,\n material.materialHandle ?? -1,\n draw.drawItemIndex ?? drawItemIndex,\n dispatch.passIndex,\n ),\n ),\n );\n }\n const base = gpuDrivenShadowDrawKey(\n worldEntity,\n material.materialHandle ?? -1,\n sourceDrawItemIndex,\n 0,\n ).split(':');\n return [...gpuDrivenShadowDrawKeys].some((key) => {\n const parts = key.split(':');\n return (\n parts.length === 4 && parts[0] === base[0] && parts[1] === base[1] && parts[2] === base[2]\n );\n });\n}\n\ninterface GpuDrivenShadowRecordResult {\n readonly claimedKeys: ReadonlySet<string>;\n}\n\nfunction shadowCasterKeys(c: _InternalRenderPipelineContext): ReadonlySet<string> {\n if (c.shadowCasterMembership !== undefined) {\n const keys = new Set<string>();\n for (const membership of c.shadowCasterMembership) {\n keys.add(\n gpuDrivenShadowDrawKey(\n membership.worldEntity,\n membership.materialHandle,\n membership.drawItemIndex,\n membership.passIndex,\n ),\n );\n }\n return keys;\n }\n return c.gpuDrivenShadowDrawKeys ?? new Set<string>();\n}\n\nfunction validateShadowOwnership(\n c: _InternalRenderPipelineContext,\n identity: ShadowViewIdentity,\n claimedKeys: ReadonlySet<string> | undefined,\n recordedKeys: ReadonlySet<string>,\n): void {\n if (\n c.shadowCasterMembership === undefined &&\n (c.gpuDrivenShadowDrawKeys === undefined || c.gpuDrivenShadowDrawKeys.size === 0)\n )\n return;\n const expectedKeys = shadowCasterKeys(c);\n const claimed = claimedKeys ?? new Set<string>();\n const overlap = [...claimed].filter((key) => recordedKeys.has(key));\n const union = new Set([...claimed, ...recordedKeys]);\n const missing = [...expectedKeys].filter((key) => !union.has(key));\n const unexpectedClaims = [...claimed].filter((key) => !expectedKeys.has(key));\n // `shadowCasterMembership` describes the concrete draws that the GPU\n // producer is eligible to claim. A renderable that stays on the CPU lane\n // (for example a clustered frame without a compatible GPU-driven PBR\n // variant, or a dynamic mesh whose producer receipt is not ready) still\n // records a valid ShadowCaster draw, but it has no membership row. Treating\n // every CPU-only key as an \"extra\" made the ownership check reject that\n // legitimate residual path and stopped the whole shadow pass. Ownership\n // needs two invariants here: a draw is never both GPU-claimed and CPU-\n // recorded, and every GPU-eligible membership is covered by one of those\n // lanes. CPU-only residuals are already owned by the record path.\n if (overlap.length === 0 && missing.length === 0 && unexpectedClaims.length === 0) return;\n throw new RhiError({\n code: 'internal-error',\n expected: `disjoint ShadowCaster ownership for ${shadowViewIdentityKey(identity)}`,\n hint: `claimed=${[...claimed].sort().join(',')} recorded=${[...recordedKeys].sort().join(',')} missing=${missing.sort().join(',')} unexpectedClaims=${unexpectedClaims.sort().join(',')}`,\n });\n}\n\nfunction hasUnclaimedShadowCasters(\n c: _InternalRenderPipelineContext,\n claimedKeys: ReadonlySet<string> | undefined,\n): boolean {\n const extractedKeys =\n c.shadowCasterMembership === undefined\n ? [...(c.gpuDrivenShadowDrawKeys ?? [])]\n : c.shadowCasterMembership.map((membership) =>\n gpuDrivenShadowDrawKey(\n membership.worldEntity,\n membership.materialHandle,\n membership.drawItemIndex,\n membership.passIndex,\n ),\n );\n if (extractedKeys.length === 0) return false;\n return claimedKeys === undefined || extractedKeys.some((key) => !claimedKeys.has(key));\n}\n\nfunction hasExpectedShadowCasters(c: _InternalRenderPipelineContext): boolean {\n if ((c.shadowCasterMembership?.length ?? 0) > 0) return true;\n if ((c.gpuDrivenShadowDrawKeys?.size ?? 0) > 0) return true;\n return shadowDispatchEntries(c).some((entry) => entry.tags.LightMode === 'ShadowCaster');\n}\n\nfunction recordGpuDrivenShadowIfPublished(\n c: _InternalRenderPipelineContext,\n pass: RhiRenderPassEncoder,\n identity: ShadowViewIdentity,\n): GpuDrivenShadowRecordResult | undefined {\n const viewSubmission = c.gpuDrivenShadowViews?.submission(identity);\n const projections = c.gpuDrivenShadowBatchProjections?.get(shadowViewIdentityKey(identity));\n if (viewSubmission === undefined) {\n return undefined;\n }\n if (projections === undefined) {\n throw new RhiError({\n code: 'rhi-not-available',\n expected: `GPU-driven shadow projection for ${shadowViewIdentityKey(identity)}`,\n hint: 'terminate the capable shadow frame instead of falling through to CPU caster enumeration',\n });\n }\n const batches = new Map<number, GpuDrivenShadowBatch>();\n for (const batch of viewSubmission.plan.batches) {\n const projection: GpuDrivenShadowBatchProjection | undefined = projections.get(batch.batchId);\n if (projection === undefined) {\n throw new RhiError({\n code: 'internal-error',\n expected: `projected mesh binding for GPU-driven shadow batch ${batch.batchId}`,\n hint: 'keep shadow batch scene rows aligned with the shared SubmissionPlan',\n });\n }\n const shadowArtifact = projection.shadowArtifact;\n const shadowReceipt = shadowArtifact.receipt;\n if (shadowReceipt === undefined) {\n throw new RhiError({\n code: 'rhi-not-available',\n expected: `published shadow MaterialProgramAbi for batch ${batch.batchId}`,\n hint: 'keep the shadow draw out of the capable lane until its producer receipt is ready',\n });\n }\n const shadowVariantSet =\n shadowArtifact.variantSet ??\n (shadowArtifact.material === SHADOW_CASTER_SHADER_ID\n ? shadowCasterVariantSet(\n c.runtime.device.caps.storageBuffer,\n projection.deformation === 'skin',\n true,\n batch.key.admission === 'alpha-mask',\n projection.vertexColorAvailable,\n )\n : undefined);\n const pipeline = c.runtime.getMaterialShaderPipeline?.(\n // A scene-index shadow artifact may retain the logical material id for\n // batching while its specialization key owns the actual WGSL module.\n shadowArtifact.specializationKey ?? shadowArtifact.material,\n false,\n shadowRasterState(undefined, identity.kind === 'point'),\n batch.key.topology,\n batch.key.drawKind === 'indexed' ? projection.mesh.indexFormat : undefined,\n shadowVariantSet,\n 'shadow-caster',\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n projection.mesh.layoutProjection,\n // The shadow projection carries the producer-validated receipt. Select\n // the immediate module adapter so a newly loaded custom Surface cannot\n // lose its first capable shadow draw to async pre-bake warm-up.\n 'immediate',\n projection.deformation === 'skin' ? 'gpu-driven-skin' : 'gpu-driven-pbr',\n shadowReceipt.sceneIndexEntry,\n undefined,\n projection.shadowVertexEntry,\n projection.shadowFragmentEntry,\n );\n if (pipeline === null || pipeline === undefined) {\n throw new RhiError({\n code: 'rhi-not-available',\n expected: `GPU-driven shadow pipeline variant for batch ${batch.batchId}`,\n hint: 'publish the exact scene-index shadow variant before entering the capable lane',\n });\n }\n if (batch.key.drawKind === 'indexed' && projection.mesh.indexBuffer === null) {\n throw new RhiError({\n code: 'internal-error',\n expected: `indexed mesh buffer for GPU-driven shadow batch ${batch.batchId}`,\n hint: 'keep the geometry residency and topology draw kind aligned before capable recording',\n });\n }\n const materialGroup =\n shadowArtifact.material !== SHADOW_CASTER_SHADER_ID\n ? ensureGpuDrivenCustomShadowMaterialBg(c, projection)\n : batch.key.admission === 'alpha-mask'\n ? ensureGpuDrivenAlphaMaskMaterialBg(c, projection)\n : ensureSpotShadowMaterialBg(c);\n if (materialGroup === null) {\n throw new RhiError({\n code: 'rhi-not-available',\n expected: 'material resources for every GPU shadow batch',\n hint: 'publish the shadow material binding before recording the indirect batch',\n });\n }\n batches.set(batch.batchId, {\n pipeline,\n meshBindGroup: projection.meshBindGroup,\n visibleBindGroup: projection.visibleBindGroup,\n deformation: projection.deformation,\n materialGroup,\n vertexBuffer: projection.mesh.vertexBuffer.handle,\n ...(batch.key.drawKind === 'indexed' && projection.mesh.indexBuffer !== null\n ? {\n indexBuffer: projection.mesh.indexBuffer.handle,\n indexFormat: projection.mesh.indexFormat,\n }\n : {}),\n });\n }\n const submission: GpuDrivenShadowSubmission = {\n view: viewSubmission.view,\n plan: viewSubmission.plan,\n batches,\n };\n recordGpuDrivenShadowIndirect(pass, submission);\n const viewKey = shadowViewIdentityKey(identity);\n const viewClaims = c.gpuDrivenShadowDrawKeysByView;\n return {\n claimedKeys:\n viewClaims === undefined\n ? (c.gpuDrivenShadowDrawKeys ?? new Set<string>())\n : (viewClaims.get(viewKey) ?? new Set<string>()),\n };\n}\n\nexport function encodeDirectionalShadowPass(\n c: _InternalRenderPipelineContext,\n pass: RhiRenderPassEncoder,\n cascadeIndex: number,\n viewport: { readonly x: number; readonly y: number; readonly w: number; readonly h: number },\n drawFeatures?: (view: BindGroup) => void,\n): void {\n const directionalIdentity = { kind: 'directional' as const, index: cascadeIndex };\n if (\n (c.gpuDrivenShadowViews?.cacheHit(directionalIdentity) === true ||\n (c.gpuDrivenShadowViews === undefined && c.directionalShadowCacheReuse)) &&\n drawFeatures === undefined\n )\n return;\n const pipeline = shadowPipeline(c);\n const viewBg = ensureTypedShadowViewBg(\n c,\n 0,\n directionalShadowCasterOffset(cascadeIndex),\n `view-shadow-directional-${cascadeIndex}`,\n );\n const materialBg = viewBg === null ? null : ensureSpotShadowMaterialBg(c);\n const capable = c.gpuDrivenShadowViews?.submission(directionalIdentity) !== undefined;\n if (viewBg === null || materialBg === null) {\n c.frameState.directionalShadowCacheRecorded = false;\n if (capable || hasExpectedShadowCasters(c)) {\n throw new RhiError({\n code: 'rhi-not-available',\n expected: 'directional ShadowCaster bind groups',\n hint: 'publish the view/material resources before recording the shadow lane',\n });\n }\n return;\n }\n c.frameState.directionalShadowCacheRecorded = true;\n pass.setViewport(viewport.x, viewport.y, viewport.w, viewport.h, 0, 1);\n drawFeatures?.(viewBg);\n pass.setBindGroup(0, viewBg, [0, 0]);\n pass.setBindGroup(1, materialBg, [0]);\n const gpuRecord = recordGpuDrivenShadowIfPublished(c, pass, directionalIdentity);\n const gpuRecorded = gpuRecord !== undefined;\n const claimedKeys = gpuRecord?.claimedKeys;\n if (capable && !gpuRecorded) {\n throw new RhiError({\n code: 'rhi-not-available',\n expected: 'capable directional GPU-driven shadow projection',\n hint: 'terminate the capable shadow frame instead of enumerating CPU casters',\n });\n }\n if (!hasUnclaimedShadowCasters(c, claimedKeys)) {\n if (gpuRecorded || (!capable && !hasExpectedShadowCasters(c))) {\n validateShadowOwnership(c, directionalIdentity, claimedKeys, new Set());\n return;\n }\n }\n if (pipeline === null) {\n if (gpuRecorded && !hasUnclaimedShadowCasters(c, claimedKeys)) {\n validateShadowOwnership(c, directionalIdentity, claimedKeys, new Set());\n return;\n }\n if (gpuRecorded) {\n throw new RhiError({\n code: 'rhi-not-available',\n expected: 'CPU residual directional shadow pipeline',\n hint: 'publish the legacy residual caster pipeline alongside the partial GPU shadow lane',\n });\n }\n throw new RhiError({\n code: 'rhi-not-available',\n expected: 'directional ShadowCaster pipeline',\n hint: 'publish the CPU ShadowCaster pipeline before recording residual casters',\n });\n }\n pass.setPipeline(pipeline);\n const legacyMeshBindGroup = c.meshBindGroup;\n if (legacyMeshBindGroup === null) {\n if (gpuRecorded && !hasUnclaimedShadowCasters(c, claimedKeys)) {\n validateShadowOwnership(c, directionalIdentity, claimedKeys, new Set());\n return;\n }\n if (gpuRecorded) {\n throw new RhiError({\n code: 'rhi-not-available',\n expected: 'CPU residual directional shadow mesh binding',\n hint: 'publish legacy mesh resources for the unclaimed ShadowCaster residual',\n });\n }\n throw new RhiError({\n code: 'rhi-not-available',\n expected: 'directional ShadowCaster mesh binding',\n hint: 'publish the CPU mesh binding before recording residual casters',\n });\n }\n if (gpuRecorded) pass.setBindGroup(1, materialBg, [0]);\n const recordedKeys = recordShadowCasterDraws(\n c,\n pass,\n pipeline,\n legacyMeshBindGroup,\n buildMatchedRenderableIndices(shadowDispatchEntries(c), { LightMode: ['ShadowCaster'] }),\n buildMatchedMaterialHandlesByRenderable(shadowDispatchEntries(c), {\n LightMode: ['ShadowCaster'],\n }),\n shadowShaderMap(c),\n claimedKeys,\n );\n validateShadowOwnership(c, directionalIdentity, claimedKeys, recordedKeys);\n c.frameState.directionalShadowCacheRecorded =\n cascadeIndex === 0 ? true : c.frameState.directionalShadowCacheRecorded;\n}\n\nexport function encodePointShadowPass(\n c: _InternalRenderPipelineContext,\n pass: RhiRenderPassEncoder,\n snapshotIndex: number,\n face: number,\n drawFeatures?: (view: BindGroup) => void,\n): void {\n const snapshot = c.frameState.pointShadowSnapshots[snapshotIndex];\n if (snapshot === undefined) return;\n const pipeline = shadowPipeline(c, true);\n const viewBg = ensureTypedShadowViewBg(\n c,\n pointShadowViewOffset(snapshot.shadowAtlasLayer, face),\n 0,\n `view-shadow-point-${snapshot.shadowAtlasLayer}-${face}`,\n );\n const materialBg = viewBg === null ? null : ensureSpotShadowMaterialBg(c);\n const pointIdentity = { kind: 'point' as const, index: snapshotIndex, face };\n const capable = c.gpuDrivenShadowViews?.submission(pointIdentity) !== undefined;\n if (viewBg === null || materialBg === null) {\n if (capable || hasExpectedShadowCasters(c))\n throw new RhiError({\n code: 'rhi-not-available',\n expected: 'point ShadowCaster bind groups',\n hint: 'publish the view/material resources before recording the shadow lane',\n });\n return;\n }\n if (pipeline === null && !capable && !hasExpectedShadowCasters(c) && drawFeatures === undefined)\n return;\n drawFeatures?.(viewBg);\n pass.setBindGroup(0, viewBg, [0, 0]);\n pass.setBindGroup(1, materialBg, [0]);\n const gpuRecord = recordGpuDrivenShadowIfPublished(c, pass, pointIdentity);\n const gpuRecorded = gpuRecord !== undefined;\n const claimedKeys = gpuRecord?.claimedKeys;\n if (capable && !gpuRecorded) {\n throw new RhiError({\n code: 'rhi-not-available',\n expected: 'capable point GPU-driven shadow projection',\n hint: 'terminate the capable shadow frame instead of enumerating CPU casters',\n });\n }\n if (!hasUnclaimedShadowCasters(c, claimedKeys)) {\n if (gpuRecorded || (!capable && !hasExpectedShadowCasters(c))) {\n validateShadowOwnership(c, pointIdentity, claimedKeys, new Set());\n return;\n }\n }\n if (pipeline === null) {\n if (gpuRecorded && !hasUnclaimedShadowCasters(c, claimedKeys)) {\n validateShadowOwnership(c, pointIdentity, claimedKeys, new Set());\n return;\n }\n if (gpuRecorded) {\n throw new RhiError({\n code: 'rhi-not-available',\n expected: 'CPU residual point shadow pipeline',\n hint: 'publish the legacy residual caster pipeline alongside the partial GPU shadow lane',\n });\n }\n throw new RhiError({\n code: 'rhi-not-available',\n expected: 'point ShadowCaster pipeline',\n hint: 'publish the CPU ShadowCaster pipeline before recording residual casters',\n });\n }\n pass.setPipeline(pipeline);\n const legacyMeshBindGroup = c.meshBindGroup;\n if (legacyMeshBindGroup === null) {\n if (gpuRecorded && !hasUnclaimedShadowCasters(c, claimedKeys)) {\n validateShadowOwnership(c, pointIdentity, claimedKeys, new Set());\n return;\n }\n if (gpuRecorded) {\n throw new RhiError({\n code: 'rhi-not-available',\n expected: 'CPU residual point shadow mesh binding',\n hint: 'publish legacy mesh resources for the unclaimed ShadowCaster residual',\n });\n }\n throw new RhiError({\n code: 'rhi-not-available',\n expected: 'point ShadowCaster mesh binding',\n hint: 'publish the CPU mesh binding before recording residual casters',\n });\n }\n if (gpuRecorded) pass.setBindGroup(1, materialBg, [0]);\n const recordedKeys = recordShadowCasterDraws(\n c,\n pass,\n pipeline,\n legacyMeshBindGroup,\n buildMatchedRenderableIndices(shadowDispatchEntries(c), { LightMode: ['ShadowCaster'] }),\n buildMatchedMaterialHandlesByRenderable(shadowDispatchEntries(c), {\n LightMode: ['ShadowCaster'],\n }),\n shadowShaderMap(c),\n claimedKeys,\n true,\n );\n validateShadowOwnership(c, pointIdentity, claimedKeys, recordedKeys);\n}\n\nexport function encodeSpotShadowPass(\n c: _InternalRenderPipelineContext,\n pass: RhiRenderPassEncoder,\n snapshotIndex: number,\n drawFeatures?: (view: BindGroup) => void,\n): void {\n const snapshot = c.frameState.spotShadowSnapshots.filter(\n (candidate) => candidate.shadowAtlasTile >= 0 && candidate.lightViewProj !== undefined,\n )[snapshotIndex];\n if (\n snapshot === undefined ||\n snapshot.shadowAtlasTile < 0 ||\n snapshot.lightViewProj === undefined\n ) {\n return;\n }\n const pipeline = shadowPipeline(c);\n const viewBg = ensureTypedShadowViewBg(\n c,\n 0,\n spotShadowCasterOffset(snapshot.shadowAtlasTile),\n `view-shadow-spot-${snapshot.shadowAtlasTile}`,\n );\n const materialBg = viewBg === null ? null : ensureSpotShadowMaterialBg(c);\n const spotIdentity = { kind: 'spot' as const, index: snapshotIndex };\n const capable = c.gpuDrivenShadowViews?.submission(spotIdentity) !== undefined;\n if (viewBg === null || materialBg === null) {\n if (capable || hasExpectedShadowCasters(c))\n throw new RhiError({\n code: 'rhi-not-available',\n expected: 'spot ShadowCaster bind groups',\n hint: 'publish the view/material resources before recording the shadow lane',\n });\n return;\n }\n if (pipeline === null && !capable && !hasExpectedShadowCasters(c) && drawFeatures === undefined)\n return;\n const tileSize = c.pipelineState.perPassResources.shadowMapSize;\n const tile = snapshot.shadowAtlasTile;\n pass.setViewport(\n (tile % 2) * tileSize,\n Math.floor(tile / 2) * tileSize,\n tileSize,\n tileSize,\n 0,\n 1,\n );\n drawFeatures?.(viewBg);\n pass.setBindGroup(0, viewBg, [0, 0]);\n pass.setBindGroup(1, materialBg, [0]);\n // Reuse the shared caster recorder. The compact spot-only loop used to\n // depend on instance bindings created by a directional pass, so a scene\n // containing only a SpotLight opened the atlas pass but emitted no caster\n // draws.\n const gpuRecord = recordGpuDrivenShadowIfPublished(c, pass, spotIdentity);\n const gpuRecorded = gpuRecord !== undefined;\n const claimedKeys = gpuRecord?.claimedKeys;\n if (capable && !gpuRecorded) {\n throw new RhiError({\n code: 'rhi-not-available',\n expected: 'capable spot GPU-driven shadow projection',\n hint: 'terminate the capable shadow frame instead of enumerating CPU casters',\n });\n }\n if (!hasUnclaimedShadowCasters(c, claimedKeys)) {\n if (gpuRecorded || (!capable && !hasExpectedShadowCasters(c))) {\n validateShadowOwnership(c, spotIdentity, claimedKeys, new Set());\n return;\n }\n }\n if (pipeline === null) {\n if (gpuRecorded && !hasUnclaimedShadowCasters(c, claimedKeys)) {\n validateShadowOwnership(c, spotIdentity, claimedKeys, new Set());\n return;\n }\n if (gpuRecorded) {\n throw new RhiError({\n code: 'rhi-not-available',\n expected: 'CPU residual spot shadow pipeline',\n hint: 'publish the legacy residual caster pipeline alongside the partial GPU shadow lane',\n });\n }\n throw new RhiError({\n code: 'rhi-not-available',\n expected: 'spot ShadowCaster pipeline',\n hint: 'publish the CPU ShadowCaster pipeline before recording residual casters',\n });\n }\n pass.setPipeline(pipeline);\n const legacyMeshBindGroup = c.meshBindGroup;\n if (legacyMeshBindGroup === null) {\n if (gpuRecorded && !hasUnclaimedShadowCasters(c, claimedKeys)) {\n validateShadowOwnership(c, spotIdentity, claimedKeys, new Set());\n return;\n }\n if (gpuRecorded) {\n throw new RhiError({\n code: 'rhi-not-available',\n expected: 'CPU residual spot shadow mesh binding',\n hint: 'publish legacy mesh resources for the unclaimed ShadowCaster residual',\n });\n }\n throw new RhiError({\n code: 'rhi-not-available',\n expected: 'spot ShadowCaster mesh binding',\n hint: 'publish the CPU mesh binding before recording residual casters',\n });\n }\n if (gpuRecorded) pass.setBindGroup(1, materialBg, [0]);\n const recordedKeys = recordShadowCasterDraws(\n c,\n pass,\n pipeline,\n legacyMeshBindGroup,\n buildMatchedRenderableIndices(shadowDispatchEntries(c), { LightMode: ['ShadowCaster'] }),\n buildMatchedMaterialHandlesByRenderable(shadowDispatchEntries(c), {\n LightMode: ['ShadowCaster'],\n }),\n shadowShaderMap(c),\n claimedKeys,\n );\n validateShadowOwnership(c, spotIdentity, claimedKeys, recordedKeys);\n}\n\n/**\n * feat-20260609 M2: filter dispatch entries by a {@link PassSelector}.\n *\n * Each dispatch entry carries `tags` (a free key-value map) sourced from the\n * material's per-pass tags. The selector is matched entry-by-entry via\n * {@link matchPass}; entries whose tags satisfy the selector are returned.\n * An empty selector returns the input array unchanged (match-all semantics).\n *\n * @param dispatch Per-frame dispatch entries (from the extract stage).\n * @param selector Pipeline-specific pass selector (e.g. `{ LightMode: ['Forward'] }`).\n * @returns Dispatch entries whose tags match the selector.\n */\nexport function filterDispatchBySelector(\n dispatch: readonly DispatchEntry[],\n selector: PassSelector,\n): readonly DispatchEntry[] {\n if (Object.keys(selector).length === 0) return dispatch;\n return dispatch.filter((e) => matchPass(e.tags, selector));\n}\n\n/**\n * feat-20260609 M2: build a set of renderable indices whose dispatch entries\n * match the given selector. Used by the record pass closures to skip entities\n * that do not belong to the current pass.\n *\n * Returns null when the dispatch array is empty (no dispatch-based filtering\n * to apply — draw all entities). Returns an empty set when dispatch is\n * non-empty but no entries matched (draw nothing). Returns a populated set\n * when at least one dispatch entry matched.\n */\nexport function buildMatchedRenderableIndices(\n dispatch: readonly DispatchEntry[],\n selector: PassSelector,\n): Set<number> | null {\n // PRODUCTION INVARIANT: in real frames extractFrame always populates\n // dispatch[] for every visible renderable (Forward + ShadowCaster tags\n // emitted per validated entity, including the default-material handle=0\n // path — see render-system-extract.ts default-material dispatch emission).\n // The empty-dispatch null fallback below exists ONLY for unit-test\n // fixtures that mock dispatch out (early w-* tests written before\n // dispatch existed). Returning null causes the downstream loop to skip\n // selector filtering, preserving back-compat for those fixtures. If a\n // future refactor moves dispatch population earlier or makes it\n // conditional, the test fixtures should be updated rather than this\n // fallback widened to production.\n if (dispatch.length === 0) return null;\n const filtered = filterDispatchBySelector(dispatch, selector);\n const set = new Set<number>();\n for (const e of filtered) {\n set.add(e.renderableIndex);\n }\n return set;\n}\n\n/**\n * Build the material handles whose dispatch entries match a graph pass.\n *\n * A renderable can own more than one material pass, so renderable-level\n * filtering is insufficient for geometry recording: a Deferred graph pass\n * must not draw the same renderable's Forward-only material. Keep the\n * renderable key in the result so mixed-material meshes retain their\n * per-submesh routing. An optional exclusion selector removes a material\n * handle when that same renderable/material pair also contributes to another\n * graph lane (for example Deferred Standard geometry after SSR composition).\n * An inclusion selector intersects membership by the same renderable/material\n * pair without replacing the selected shader pass or its authored entries.\n */\nexport function buildMatchedMaterialHandlesByRenderable(\n dispatch: readonly DispatchEntry[],\n selector: PassSelector,\n excludeSelector?: PassSelector,\n includeSelector?: PassSelector,\n): ReadonlyMap<number, ReadonlySet<number>> | null {\n if (dispatch.length === 0) return null;\n const matched = filterDispatchBySelector(dispatch, selector);\n const included =\n includeSelector === undefined\n ? undefined\n : new Set(\n filterDispatchBySelector(dispatch, includeSelector).map(\n (entry) => `${entry.renderableIndex}:${entry.materialHandle}`,\n ),\n );\n const excluded =\n excludeSelector === undefined\n ? undefined\n : new Set(\n filterDispatchBySelector(dispatch, excludeSelector).map(\n (entry) => `${entry.renderableIndex}:${entry.materialHandle}`,\n ),\n );\n const handlesByRenderable = new Map<number, Set<number>>();\n for (const entry of matched) {\n if (included !== undefined && !included.has(`${entry.renderableIndex}:${entry.materialHandle}`))\n continue;\n if (excluded?.has(`${entry.renderableIndex}:${entry.materialHandle}`)) continue;\n const handles = handlesByRenderable.get(entry.renderableIndex);\n if (handles === undefined) {\n handlesByRenderable.set(entry.renderableIndex, new Set([entry.materialHandle]));\n } else {\n handles.add(entry.materialHandle);\n }\n }\n return handlesByRenderable;\n}\n\n/**\n * feat-20260704 M3/w20: per-entity directional shadow-caster draw loop,\n * extracted verbatim from {@link encodeDirectionalShadowPass}. Walks `c.validatedOrdered`,\n * selects the per-entity shadow PSO (default vertex-only caster or a custom\n * cutout caster), binds the per-entity mesh dynamic-offset + instance buffer,\n * and issues the per-submesh depth draws. `shadowPass` view/material bind\n * groups (@group 0/1) are already set by the caller; this loop owns @group\n * 2/3 + the vertex/index/pipeline de-dup state. Receives the explicit\n * `_InternalRenderPipelineContext` (`c`) plus the caller-resolved\n * mesh bind group, pass-selector match set, and per-material\n * ShadowCaster dispatch map so no cross-function mutable state is introduced.\n */\nexport function recordShadowCasterDraws(\n c: _InternalRenderPipelineContext,\n shadowPass: RhiRenderPassEncoder,\n shadowPipeline: RenderPipeline,\n shadowMeshBindGroup: BindGroup,\n matchedIndices: Set<number> | null,\n matchedMaterialHandles: ReadonlyMap<number, ReadonlySet<number>> | null,\n shadowDispatchByRenderableIdx: ShadowDispatchMap,\n gpuDrivenShadowDrawKeys: ReadonlySet<string> | undefined,\n reflected = false,\n): ReadonlySet<string> {\n const {\n runtime,\n pipelineState,\n validatedOrdered: mainValidatedOrdered,\n shadowValidatedOrdered,\n } = c;\n const validatedOrdered = shadowValidatedOrdered ?? mainValidatedOrdered;\n const meshSsboBase = c.shadowMeshSsboBase ?? 0;\n // M-3 / w12: vertexBuffer/indexBuffer state locals migrate to GpuBuffer\n // (the wrapper) -- the de-dup compare uses wrapper identity (one wrapper\n // per RHI handle from gpuStore), and `.handle` is passed to the RHI\n // setVertexBuffer / setIndexBuffer call.\n let shadowLastVertexBuffer: GpuBuffer | null = null;\n let shadowLastIndexBuffer: GpuBuffer | null = null;\n const recordedKeys = new Set<string>();\n // bug-20260619-csm RC-3 (D-3): track the currently-bound shadow PSO so\n // per-entity setPipeline only fires on change (same de-dup discipline as\n // vertex/index buffers above). The default-shadow-caster PSO is already\n // bound by the setPipeline call above; the loop switches to a custom\n // ShadowCaster PSO when a material supplies one.\n let shadowLastPipeline: RenderPipeline = shadowPipeline;\n let materialDeps: PerSubmeshMaterialBgDeps | undefined;\n\n for (let i = 0; i < validatedOrdered.length; i++) {\n const entry = validatedOrdered[i];\n if (entry === undefined) continue;\n\n // feat-20260609 M2: skip entities that don't match the pass selector.\n if (matchedIndices !== null && !matchedIndices.has(entry.renderableIndex)) continue;\n\n const drawIndices = shadowDrawIndicesBySubmesh(entry.source, entry.mesh);\n const shadowSubmeshes = entry.mesh.submeshes.flatMap((submesh, submeshIndex) => {\n if (submesh.topology !== 'triangle-list' && submesh.topology !== 'triangle-strip') {\n return [];\n }\n if (matchedMaterialHandles !== null) {\n const handles = matchedMaterialHandles.get(entry.renderableIndex);\n const material = entry.source.materials[submesh.materialSlot] ?? entry.source.material;\n if (handles === undefined || !handles.has(material.materialHandle ?? -1)) return [];\n }\n return isGpuShadowClaimedSubmesh(\n entry.source,\n entry.renderableIndex,\n submeshIndex,\n drawIndices,\n gpuDrivenShadowDrawKeys,\n shadowDispatchByRenderableIdx,\n c.shadowCasterMembership,\n c.shadowCasterWorldKeys,\n )\n ? []\n : [{ submesh, submeshIndex }];\n });\n if (shadowSubmeshes.length === 0) continue;\n // feat-20260604-mesh-topology-debug-draw M5 / w14 (AC-09, D-A6): the\n // shadow caster PSO is triangle-list; it only projects triangle faces.\n // line-list / line-strip / point-list meshes have no surface to cast a\n // shadow, so skip them here. triangle-strip is still a face topology\n // and projects (the shadow PSO's fixed triangle-list rasterizes its\n // expanded triangles correctly enough for the depth pass).\n //\n // feat-20260608 M4 / w16: per-submesh shadow draw — iterate submeshes\n // and skip non-triangle submeshes individually (each submesh may differ).\n if (entry.mesh.vertexBuffer !== shadowLastVertexBuffer) {\n shadowPass.setVertexBuffer(0, entry.mesh.vertexBuffer.handle);\n shadowLastVertexBuffer = entry.mesh.vertexBuffer;\n }\n if (entry.mesh.indexed && entry.mesh.indexBuffer !== shadowLastIndexBuffer) {\n // indexed=true implies indexBuffer is non-null GpuBuffer.\n if (entry.mesh.indexBuffer !== null) {\n shadowPass.setIndexBuffer(entry.mesh.indexBuffer.handle, entry.mesh.indexFormat);\n shadowLastIndexBuffer = entry.mesh.indexBuffer;\n }\n }\n\n if (entry.source.skin !== undefined) {\n const skinMeshBindGroup = skinnedShadowMeshBindGroup(c, entry);\n if (skinMeshBindGroup === null) {\n throw new RhiError({\n code: 'rhi-not-available',\n expected: 'CPU skinned ShadowCaster mesh binding',\n hint: 'publish the skin mesh/palette bind group before recording the residual',\n });\n }\n shadowPass.setBindGroup(\n 2,\n skinMeshBindGroup,\n pbrSkinMeshDynamicOffsets(\n (meshSsboBase + i) * MESH_PER_ENTITY_STRIDE,\n entry.source.skin.byteOffset,\n ),\n );\n } else {\n shadowPass.setBindGroup(2, shadowMeshBindGroup, [\n (meshSsboBase + i) * MESH_PER_ENTITY_STRIDE,\n ]);\n }\n\n // C1 + C2 (w12): per-entity instance buffer + instanceCount\n let shadowInstanceDraws: readonly { readonly buffer: Buffer; readonly count: number }[] = [\n { buffer: pipelineState.identityInstanceBuffer, count: 1 },\n ];\n const shadowInst = entry.source.instances;\n if (shadowInst?.instanceCount === 0) continue;\n if (shadowInst !== undefined) {\n const uniformFallback = runtime.device.caps.storageBuffer === false;\n // Uniform fallback uses resident chunks because the shader's uniform\n // array is capped at MAX_UNIFORM_INSTANCES entries.\n if (uniformFallback && shadowInst.instanceCount > MAX_UNIFORM_INSTANCES) {\n const ownerKey = instanceCollectionCacheKey(entry.source.worldId, shadowInst);\n const chunks = c.frameState.instanceBufferChunks;\n const activeKeys = new Set<string>();\n const draws: { buffer: Buffer; count: number }[] = [];\n const strideBytes = 16 * Float32Array.BYTES_PER_ELEMENT;\n const dirtyRanges = shadowInst.dirtyRanges ?? [{ start: 0, end: shadowInst.instanceCount }];\n const uploadedRanges: { start: number; end: number }[] = [];\n let uploadedBytes = 0;\n let failed = false;\n for (let start = 0; start < shadowInst.instanceCount; start += MAX_UNIFORM_INSTANCES) {\n const count = Math.min(MAX_UNIFORM_INSTANCES, shadowInst.instanceCount - start);\n const chunkKey = `${ownerKey}:${start}`;\n activeKeys.add(chunkKey);\n const payloadBytes = count * strideBytes;\n const previous = chunks?.get(chunkKey);\n let active =\n previous !== undefined &&\n previous.uploadedArchVersion === shadowInst.archVersion &&\n previous.uploadedByteLength === payloadBytes\n ? previous\n : undefined;\n let activeIsNew = false;\n if (active === undefined) {\n const created = runtime.device.createBuffer({\n size: INSTANCE_UBO_FULL_ARRAY_BYTES,\n usage: GPU_BUFFER_USAGE_UNIFORM | GPU_BUFFER_USAGE_COPY_DST,\n mappedAtCreation: false,\n });\n if (!created.ok) {\n runtime.errorRegistry.fire(created.error);\n failed = true;\n break;\n }\n if (previous !== undefined && !previous.buffer.isDestroyed) {\n const destroyed = previous.buffer.destroy();\n if (!destroyed.ok) runtime.errorRegistry.fire(destroyed.error);\n }\n active = {\n buffer: new GpuBuffer(runtime.device, created.value),\n uploadedArchVersion: shadowInst.archVersion,\n uploadedByteLength: payloadBytes,\n };\n activeIsNew = true;\n chunks?.set(chunkKey, active);\n if (chunks === undefined) c.frameState.transientInstanceBuffers.push(active);\n }\n const localRanges = dirtyRanges\n .map((range) => ({\n start: Math.max(start, range.start) - start,\n end: Math.min(start + count, range.end) - start,\n }))\n .filter((range) => range.end > range.start);\n const rangesToUpload = instanceUploadRangesForResident(activeIsNew, localRanges, {\n start: 0,\n end: count,\n });\n const needsUpload =\n activeIsNew ||\n (shadowInst.revision !== undefined && active.uploadedRevision !== shadowInst.revision);\n if (needsUpload && rangesToUpload.length > 0) {\n for (const range of rangesToUpload) {\n const source = shadowInst.transforms.subarray(\n (start + range.start) * 16,\n (start + range.end) * 16,\n );\n const written = runtime.device.queue.writeBuffer(\n active.buffer.handle,\n range.start * strideBytes,\n source,\n );\n if (!written.ok) {\n runtime.errorRegistry.fire(written.error);\n failed = true;\n break;\n }\n uploadedRanges.push({ start: start + range.start, end: start + range.end });\n uploadedBytes += source.byteLength;\n }\n if (failed) break;\n }\n if (needsUpload && shadowInst.revision !== undefined) {\n active = { ...active, uploadedRevision: shadowInst.revision };\n chunks?.set(chunkKey, active);\n }\n draws.push({ buffer: active.buffer.handle, count });\n }\n shadowInstanceDraws = failed\n ? [{ buffer: pipelineState.identityInstanceBuffer, count: 1 }]\n : draws;\n if (chunks !== undefined) {\n const prefix = `${ownerKey}:`;\n for (const [key, stale] of chunks.entries()) {\n if (!key.startsWith(prefix) || activeKeys.has(key)) continue;\n if (!stale.buffer.isDestroyed) {\n const destroyed = stale.buffer.destroy();\n if (!destroyed.ok) runtime.errorRegistry.fire(destroyed.error);\n }\n chunks.delete(key);\n }\n }\n if (!failed) {\n reportInstanceResidency(c, shadowInst, {\n lane: 'chunked-uniform',\n requestedBytes: shadowInst.instanceCount * strideBytes,\n supportedBytes: MAX_UNIFORM_INSTANCES * strideBytes,\n uploadRanges: uploadedRanges,\n uploadedBytes,\n });\n }\n } else {\n const bufUsage = uniformFallback\n ? GPU_BUFFER_USAGE_UNIFORM | GPU_BUFFER_USAGE_COPY_DST\n : GPU_BUFFER_USAGE_STORAGE | GPU_BUFFER_USAGE_COPY_DST;\n const instancePayload = uniformFallback\n ? shadowInst.transforms\n : packInstanceStorageBuffer(\n shadowInst.transforms,\n entry.source.temporal?.previousInstances?.transforms,\n shadowInst.generations,\n entry.source.temporal?.previousInstances?.generations,\n );\n const requestedBytes = instancePayload.byteLength;\n const cap = runtime.device.limits.maxStorageBufferBindingSize;\n if (!uniformFallback && typeof cap === 'number' && cap > 0 && requestedBytes > cap) {\n const chunked = resolveStorageInstanceChunks(c, entry, shadowInst, cap, undefined, -1);\n if (chunked !== null) {\n shadowInstanceDraws = chunked.map((draw) => ({\n buffer: draw.instanceBuffer,\n count: draw.instanceCount,\n }));\n }\n } else {\n const instanceCacheKey = instanceCollectionCacheKey(entry.source.worldId, shadowInst);\n const cached = c.frameState.instanceBuffers.get(instanceCacheKey);\n let active: InstanceBufferCacheEntry | null = null;\n let activeIsNew = false;\n if (\n cached !== undefined &&\n cached.uploadedArchVersion === shadowInst.archVersion &&\n cached.uploadedByteLength === requestedBytes &&\n (shadowInst.revision === undefined\n ? cached.uploadedRevision === undefined\n : cached.uploadedRevision === shadowInst.revision)\n ) {\n active = cached;\n } else if (requestedBytes > 0) {\n const bufRes = runtime.device.createBuffer({\n size: requestedBytes,\n usage: bufUsage,\n mappedAtCreation: false,\n });\n if (!bufRes.ok) {\n runtime.errorRegistry.fire(bufRes.error);\n } else {\n // feat-20260619 M4 / F12: destroy the old cached buffer\n // before replacing it with the new one (D-6).\n if (cached !== undefined && !cached.buffer.isDestroyed) {\n const r = cached.buffer.destroy();\n if (!r.ok) runtime.errorRegistry.fire(r.error);\n }\n const newBuffer = new GpuBuffer(runtime.device, bufRes.value);\n active = {\n buffer: newBuffer,\n uploadedArchVersion: shadowInst.archVersion,\n uploadedByteLength: requestedBytes,\n };\n activeIsNew = true;\n if (active !== null) {\n // Keep the collection identity in the worldEntityKey namespace.\n c.frameState.instanceBuffers.set(instanceCacheKey, active);\n }\n }\n }\n if (active !== null) {\n const needsUpload =\n activeIsNew ||\n (shadowInst.revision !== undefined &&\n active.uploadedRevision !== shadowInst.revision);\n if (needsUpload) {\n const writeRes = runtime.device.queue.writeBuffer(\n active.buffer.handle,\n 0,\n instancePayload,\n );\n if (!writeRes.ok) {\n runtime.errorRegistry.fire(writeRes.error);\n continue;\n }\n if (shadowInst.revision !== undefined) {\n const published = { ...active, uploadedRevision: shadowInst.revision };\n c.frameState.instanceBuffers.set(instanceCacheKey, published);\n active = published;\n }\n }\n reportInstanceResidency(c, shadowInst, {\n lane: uniformFallback ? 'direct-uniform' : 'direct-storage',\n requestedBytes,\n supportedBytes: uniformFallback\n ? MAX_UNIFORM_INSTANCES * Float32Array.BYTES_PER_ELEMENT * 16\n : typeof cap === 'number'\n ? cap\n : undefined,\n uploadRanges: needsUpload ? [{ start: 0, end: shadowInst.instanceCount }] : [],\n uploadedBytes: needsUpload ? instancePayload.byteLength : 0,\n });\n shadowInstanceDraws = [\n { buffer: active.buffer.handle, count: Math.max(1, shadowInst.instanceCount) },\n ];\n }\n }\n }\n }\n\n // feat-20260608 M4 / w16: per-submesh shadow draw loop.\n // Only draw submeshes whose topology is triangle-list or triangle-strip\n // (line-list / point-list submeshes cast no shadow and are skipped).\n for (const { submesh: sm, submeshIndex } of shadowSubmeshes) {\n if (sm.topology !== 'triangle-list' && sm.topology !== 'triangle-strip') {\n continue;\n }\n\n // Resolve the ShadowCaster PSO for the material bound to this submesh.\n // Built-in materials normally use the shared vertex-only caster, but an\n // authored `cullMode:'none'`/`frontFace` must still reach that PSO so\n // two-sided casters (such as the Three.js teapot) populate the atlas\n // from both faces. Custom ShadowCaster shaders retain their own path.\n const submeshMaterial = entry.source.materials[sm.materialSlot] ?? entry.source.material;\n const shadowDispatches =\n shadowDispatchByRenderableIdx\n .get(entry.renderableIndex)\n ?.get(submeshMaterial.materialHandle ?? 0) ?? [];\n const compactDrawIndex = drawIndices.get(submeshIndex);\n const draw =\n compactDrawIndex === undefined\n ? undefined\n : entry.source.gpuDrivenDraws?.[compactDrawIndex];\n const drawItemIndex = draw?.drawItemIndex ?? compactDrawIndex ?? submeshIndex;\n const worldEntity = worldEntityKey(\n c.shadowCasterWorldKeys?.[entry.source.worldId] ?? entry.source.worldId,\n entry.source.entityKey,\n );\n const residualDispatches =\n gpuDrivenShadowDrawKeys === undefined\n ? shadowDispatches\n : shadowDispatches.filter(\n (dispatch) =>\n !gpuDrivenShadowDrawKeys.has(\n gpuDrivenShadowDrawKey(\n worldEntity,\n submeshMaterial.materialHandle ?? -1,\n drawItemIndex,\n dispatch.passIndex,\n ),\n ),\n );\n const passes = residualDispatches.length === 0 ? [undefined] : residualDispatches;\n if (gpuDrivenShadowDrawKeys !== undefined && residualDispatches.length === 0) continue;\n // Deformation selects the mesh/palette layout, never the material program.\n // Each residual keeps its authored shader, entries, state and bindings.\n for (const shadowDispatch of passes) {\n const entryShadowShaderId = shadowDispatch?.materialShaderId;\n const entryShadowRenderState = shadowRasterState(shadowDispatch?.renderState, reflected);\n const skinned = entry.source.skin !== undefined;\n let entryShadowPipeline: RenderPipeline | null = shadowPipeline;\n const needsDedicatedPipeline =\n shadowDispatch !== undefined || skinned || sm.topology !== 'triangle-list';\n if (shadowDispatch !== undefined && entryShadowShaderId === undefined) {\n throw new RhiError({\n code: 'rhi-not-available',\n expected: 'material shader identity for CPU ShadowCaster residual',\n hint: 'publish a producer-owned ShadowCaster shader identity before recording the residual',\n });\n }\n if (needsDedicatedPipeline) {\n entryShadowPipeline =\n runtime.getMaterialShaderPipeline?.(\n entryShadowShaderId ?? SHADOW_CASTER_SHADER_ID,\n false,\n entryShadowRenderState,\n sm.topology,\n entry.mesh.indexFormat,\n shadowCasterVariantSet(\n runtime.device.caps.storageBuffer,\n skinned,\n false,\n Number(shadowDispatch?.paramSnapshot?.alphaCutoff ?? 0) > 0,\n entry.mesh.layoutProjection.attributes.some(\n (attribute) => attribute.key === 'color',\n ),\n ),\n 'shadow-caster',\n undefined, // meshAttributes\n 1, // sampleCount\n undefined,\n undefined,\n undefined,\n undefined,\n entry.mesh.layoutProjection,\n // Built-in variants reuse validated prewarm modules, including\n // adapters with no synchronous shader factory. Authored residual\n // programs use their synchronous manifest producer at first draw.\n entryShadowShaderId === undefined || entryShadowShaderId === SHADOW_CASTER_SHADER_ID\n ? 'validated'\n : 'immediate',\n skinned ? 'pbr-skin' : 'pbr',\n undefined, // vertexEntryPoint\n undefined, // additionalColorFormats\n shadowDispatch?.vertexEntry,\n shadowDispatch?.fragmentEntry,\n ) ?? null;\n }\n if (entryShadowPipeline === null) {\n throw new RhiError({\n code: 'rhi-not-available',\n expected: `CPU ShadowCaster pipeline ${entryShadowShaderId ?? '<missing>'}`,\n hint: 'publish the exact residual ShadowCaster pipeline; do not substitute the default shader',\n });\n }\n if (entryShadowPipeline !== shadowLastPipeline && entryShadowPipeline !== null) {\n shadowPass.setPipeline(entryShadowPipeline);\n shadowLastPipeline = entryShadowPipeline;\n }\n if (shadowDispatch !== undefined && entryShadowShaderId !== undefined) {\n materialDeps ??= {\n runtime,\n pipelineState,\n world: c.world,\n store: c.store,\n materialSlice: STANDARD_PBR_UBO_SIZE,\n videoHighPerfAvailable: probeVideoHighPerfUpload(runtime.device),\n skylightResources: prepareMaterialSkylight(c).skylightResources,\n resolveRenderTargetTextureSource: runtime.resolveRenderTargetTextureSource,\n materialBgShared: c.frameState.materialBgShared,\n materialBgAssemblyCache: c.materialBgAssemblyCache,\n frameState: c.frameState,\n bindGroupCounts: c.bindGroupCounts,\n };\n const materialSlot =\n shadowDispatch?.materialSlot ??\n c.materialSlotIndices[i]?.[sm.materialSlot] ??\n c.materialSlotIndices[i]?.[0];\n if (materialSlot === undefined) {\n throw new RhiError({\n code: 'rhi-descriptor-invalid',\n expected: 'a prepared material slot for each shadow submesh',\n hint: 'repair material slot preparation before recording shadows',\n });\n }\n const materialGroup = buildPerSubmeshMaterialBg(\n materialDeps,\n submeshMaterial,\n entry.source.entityKey,\n entry.world ?? c.world,\n entryShadowShaderId,\n );\n shadowPass.setBindGroup(1, materialGroup, [materialSlot * MATERIAL_PER_ENTITY_STRIDE]);\n } else {\n const materialGroup = ensureSpotShadowMaterialBg(c);\n if (materialGroup === null) {\n throw new RhiError({\n code: 'rhi-not-available',\n expected: 'CPU residual shadow material bind group',\n hint: 'publish the residual material resources before recording shadows',\n });\n }\n shadowPass.setBindGroup(1, materialGroup, [0]);\n }\n for (const instanceDraw of shadowInstanceDraws) {\n const shadowInstancesBg = resolveGeometryInstancesBindGroup(c, instanceDraw.buffer);\n shadowPass.setBindGroup(3, shadowInstancesBg);\n if (entry.mesh.indexed) {\n shadowPass.drawIndexed(sm.indexCount, instanceDraw.count, sm.indexOffset, 0, 0);\n } else {\n shadowPass.draw(sm.vertexCount, instanceDraw.count, 0, 0);\n }\n }\n if (shadowDispatch !== undefined) {\n recordedKeys.add(\n gpuDrivenShadowDrawKey(\n worldEntity,\n submeshMaterial.materialHandle ?? -1,\n drawItemIndex,\n shadowDispatch.passIndex,\n ),\n );\n }\n }\n }\n }\n return recordedKeys;\n}\n\n/**\n * Build (or reuse) the neutral `shadow-material-singleton` @group(1) BG for\n * default casters without an authored material dispatch. Authored opaque and\n * masked residuals bind their own prepared material slots instead. Directional,\n * point, and spot passes share bindings only while every resource identity\n * matches; scene-table growth or recovery must create a fresh bind group.\n */\nfunction ensureSpotShadowMaterialBg(c: _InternalRenderPipelineContext): BindGroup | null {\n const { runtime, frameState, pipelineState } = c;\n const fb = pipelineState.skylightFallback;\n const sceneMaterialBuffer =\n c.gpuDrivenStandardPbrFrameResources?.sceneMaterialBuffer ??\n pipelineState.meshStorageBuffer.buffer;\n const handles = [\n pipelineState.materialBindGroupLayout,\n pipelineState.materialUniformBuffer.buffer,\n pipelineState.defaultSampler,\n pipelineState.defaultNormalTextureView,\n pipelineState.fallbackTextureView,\n sceneMaterialBuffer,\n ...(fb === null ? [] : [fb]),\n ];\n const cached = findFromChain(\n frameState.shadowMaterialBindGroups,\n handles,\n 'shadow-material-singleton',\n );\n if (cached !== undefined) return cached;\n const fallbackEntries: BindGroupEntry[] = buildPbrMaterialUserRegionEntries().map((entry) => {\n if (entry.buffer !== undefined) {\n return {\n binding: entry.binding,\n resource: {\n kind: 'buffer' as const,\n value: {\n buffer: pipelineState.materialUniformBuffer.buffer,\n offset: 0,\n size: STANDARD_PBR_UBO_SIZE,\n },\n },\n };\n }\n if (entry.sampler !== undefined) {\n return {\n binding: entry.binding,\n resource: { kind: 'sampler' as const, value: pipelineState.defaultSampler },\n };\n }\n return {\n binding: entry.binding,\n resource: {\n kind: 'textureView' as const,\n value:\n entry.binding === 6\n ? pipelineState.defaultNormalTextureView\n : pipelineState.fallbackTextureView,\n },\n };\n });\n const merged =\n fb !== null\n ? assembleMaterialWithSkylightEntries(\n fallbackEntries,\n {\n irradianceView: fb.irradianceView,\n irradianceSampler: fb.sampler,\n prefilterView: fb.prefilterView,\n prefilterSampler: fb.sampler,\n brdfLutView: fb.brdfLutView,\n brdfLutSampler: fb.sampler,\n intensityBuffer: fb.intensityBuffer,\n },\n transmissionBackdropAvailable(runtime.device.limits.maxSampledTexturesPerShaderStage)\n ? undefined\n : null,\n )\n : fallbackEntries;\n // Binding(46) is the optional scene-material storage table. The material\n // BGL intentionally omits it on the uniform-only WebGL2 lane, so emitting\n // an entry unconditionally creates a deferred-invalid bind group in wgpu's\n // downlevel backend and only surfaces at Queue::submit. GPU-driven alpha\n // batches build their own receipt-backed group and are storage-capable by\n // admission; this singleton only needs the optional slot when that same\n // capability is present.\n if (runtime.device.caps.storageBuffer) {\n // Scene-index shadow variants read MaterialParameters by the projected\n // row selected in visibleItems. The legacy singleton used the mesh SSBO\n // here because the old shadow vertex path never consumed binding(46); on\n // the capable scene-index lane that buffer is a different struct and can\n // make the alpha/depth fragment discard every caster. Reuse the frame's\n // producer-owned scene material table, with the mesh buffer only for\n // direct/legacy callers that do not publish one.\n merged.push({\n binding: 46,\n resource: {\n kind: 'buffer',\n value: { buffer: sceneMaterialBuffer },\n },\n });\n }\n const r = getOrCreateFromChainResult(\n frameState.shadowMaterialBindGroups,\n handles,\n 'shadow-material-singleton',\n () =>\n runtime.device.createBindGroup({\n label: 'shadow-material-bg',\n layout: pipelineState.materialBindGroupLayout,\n entries: merged,\n }),\n c.bindGroupCounts,\n );\n if (!r.ok) {\n runtime.errorRegistry.fire(r.error);\n return null;\n }\n return r.value;\n}\n\n/**\n * Assemble the material group for a GPU-driven alpha-mask caster from the\n * same material snapshot/residency owner as the main PBR pass. The shadow\n * shader only consumes the base-color pair and the scene-material table, but\n * the complete merged layout is still required by the shared pipeline.\n */\nfunction ensureGpuDrivenAlphaMaskMaterialBg(\n c: _InternalRenderPipelineContext,\n projection: GpuDrivenShadowBatchProjection,\n): BindGroup {\n const sceneMaterialBuffer = c.gpuDrivenStandardPbrFrameResources?.sceneMaterialBuffer;\n if (sceneMaterialBuffer === undefined) {\n throw new RhiError({\n code: 'rhi-not-available',\n expected: 'GPU Scene material buffer for alpha-mask shadow recording',\n hint: 'publish the receipt-derived scene material table before the capable shadow pass',\n });\n }\n const fallback = c.pipelineState.skylightFallback;\n if (fallback === null) {\n throw new RhiError({\n code: 'webgpu-runtime-error',\n expected: 'pipelineState.skylightFallback for alpha-mask shadow material layout',\n hint: 'create the merged Standard PBR material resources before recording shadows',\n });\n }\n const skylightResources = {\n irradianceView: fallback.irradianceView,\n irradianceSampler: fallback.sampler,\n prefilterView: fallback.prefilterView,\n prefilterSampler: fallback.sampler,\n brdfLutView: fallback.brdfLutView,\n brdfLutSampler: fallback.sampler,\n intensityBuffer: fallback.intensityBuffer,\n } satisfies import('../ibl/skylight-bind-group').SkylightBindGroupResources;\n const deps: PerSubmeshMaterialBgDeps = {\n runtime: c.runtime,\n pipelineState: c.pipelineState,\n world: c.world,\n store: c.store,\n materialSlice: STANDARD_PBR_UBO_SIZE,\n videoHighPerfAvailable: false,\n skylightResources,\n materialBgShared: c.frameState.materialBgShared,\n materialBgAssemblyCache: c.materialBgAssemblyCache,\n sceneMaterialBuffer,\n bindGroupCounts: c.bindGroupCounts,\n frameState: c.frameState,\n };\n const bindGroup = buildPerSubmeshMaterialBg(\n deps,\n projection.material,\n projection.materialEntityKey,\n c.world,\n );\n return bindGroup;\n}\n\n/**\n * Build the group(1) binding for a receipt-backed custom shadow program. The\n * ordinary shadow singleton is Standard-only; binding it for a custom layout\n * would make the pipeline appear executable while deferring a BGL mismatch to\n * submit. Custom resources therefore use the same material producer as the\n * main pass, using the selected scene-index row when the published custom ABI\n * declares that resource. No Standard-only alpha or shader rows are\n * synthesized for the custom artifact.\n */\nfunction ensureGpuDrivenCustomShadowMaterialBg(\n c: _InternalRenderPipelineContext,\n projection: GpuDrivenShadowBatchProjection,\n): BindGroup {\n const shaderId = projection.shadowArtifact.material;\n const fallback = c.pipelineState.skylightFallback;\n if (fallback === null) {\n throw new RhiError({\n code: 'rhi-not-available',\n expected: 'skylight resources for custom shadow material binding',\n hint: 'publish the custom material resource owner before recording the shadow lane',\n });\n }\n const sceneMaterialBuffer = c.gpuDrivenStandardPbrFrameResources?.sceneMaterialBuffer;\n if (sceneMaterialBuffer === undefined) {\n throw new RhiError({\n code: 'rhi-not-available',\n expected: 'producer-owned scene material buffer for custom shadow ABI',\n hint: 'publish the selected shadow MaterialProgramAbi scene-index resource before recording',\n });\n }\n const skylightResources = {\n irradianceView: fallback.irradianceView,\n irradianceSampler: fallback.sampler,\n prefilterView: fallback.prefilterView,\n prefilterSampler: fallback.sampler,\n brdfLutView: fallback.brdfLutView,\n brdfLutSampler: fallback.sampler,\n intensityBuffer: fallback.intensityBuffer,\n } satisfies import('../ibl/skylight-bind-group').SkylightBindGroupResources;\n const deps: PerSubmeshMaterialBgDeps = {\n runtime: c.runtime,\n pipelineState: c.pipelineState,\n world: c.world,\n store: c.store,\n materialSlice: STANDARD_PBR_UBO_SIZE,\n videoHighPerfAvailable: false,\n skylightResources,\n materialBgShared: c.frameState.materialBgShared,\n materialBgAssemblyCache: c.materialBgAssemblyCache,\n bindGroupCounts: c.bindGroupCounts,\n frameState: c.frameState,\n sceneMaterialBuffer,\n };\n const bindGroup = buildPerSubmeshMaterialBg(\n deps,\n projection.material,\n projection.materialEntityKey,\n c.world,\n shaderId,\n );\n return bindGroup;\n}\n","import type { World } from '@forgeax/engine-ecs';\nimport { probeVideoHighPerfUpload } from '@forgeax/engine-graphics-extras';\nimport type { GraphResourceResolver } from '@forgeax/engine-render-graph';\nimport {\n type BindGroup,\n RhiError,\n type RhiRenderPassEncoder,\n type TextureView,\n} from '@forgeax/engine-rhi';\nimport type { PassKind, PassSelector } from '@forgeax/engine-types';\nimport {\n createGpuDrivenLightingBindGroup,\n createHdrpUnifiedBindGroup,\n getOrCreateHdrpBuffers,\n} from '../hdrp-buffers';\nimport { getOrCreateIblCache } from '../ibl/IblPipelineCache';\nimport type { SkylightBindGroupResources } from '../ibl/skylight-bind-group';\nimport { buildBeginRenderPassDescriptor, standardTopologyBindGroupReady } from '../pipeline-spec';\nimport { POINTS_LINES_MATERIAL_SHADER_ID } from '../points-lines/record';\nimport type { ReflectionProbeSelectionResult } from '../reflection/projection';\nimport type { RenderRecordPhase } from '../render-contract';\nimport type {\n GpuDrivenStandardPbrFrameResources,\n RenderPipelineGpuDrivenProjection,\n} from '../render-pipeline';\nimport type { MaterialSnapshot } from '../render-system-extract';\nimport { resolveReflectionProbeBinding } from './frame-lighting';\nimport { getOpaqueResourceIdentity, worldEntityKey } from './frame-snapshot';\nimport { recordGeometryDraws } from './main-pass-geometry';\nimport {\n buildPerSubmeshMaterialBg as buildPerSubmeshMaterialBgImpl,\n type PerSubmeshMaterialBgDeps,\n prepareMaterialSkylight,\n} from './main-pass-material';\nimport { recordSpritePass } from './main-pass-sprite-draws';\nimport type { _InternalRenderPipelineContext } from './render-context';\nimport { STANDARD_PBR_UBO_SIZE } from './render-context';\nimport {\n buildMatchedMaterialHandlesByRenderable,\n buildMatchedRenderableIndices,\n filterDispatchBySelector,\n} from './shadow-pass';\n\nexport function standardReflectionProbeIndex(\n selection: ReflectionProbeSelectionResult,\n): number | undefined {\n return resolveReflectionProbeBinding(selection).probeIndex;\n}\n\nfunction materialDiagnosticsEnabled(): boolean {\n if (typeof globalThis !== 'object' || globalThis === null || !('process' in globalThis)) {\n return false;\n }\n const processValue = (\n globalThis as {\n readonly process?: { readonly env?: Record<string, string | undefined> };\n }\n ).process;\n return processValue?.env?.FORGEAX_MATERIAL_DIAGNOSTICS === '1';\n}\n\nexport type MainPassOptions = {\n readonly colorViews?: readonly (TextureView | null)[];\n readonly colorFormats?: readonly GPUTextureFormat[];\n readonly depthView?: TextureView | null;\n readonly passKind?: PassKind;\n readonly clearColor?: readonly [number, number, number, number];\n readonly recordMode?: 'opaque' | 'transmission' | 'transparent';\n /** Exclude material/pass pairs already consumed by an earlier graph lane. */\n readonly excludeSelector?: PassSelector;\n /** Require the same material to contribute to another graph lane. */\n readonly includeSelector?: PassSelector;\n readonly transmissionBackdropView?: TextureView | null;\n /** Select the material temporal entry's binary coverage output. */\n readonly coverageOnly?: boolean;\n readonly gpuDriven?: {\n readonly projection: RenderPipelineGpuDrivenProjection;\n readonly resources: GraphResourceResolver;\n };\n};\n\nfunction isTransmissionMaterial(material: MaterialSnapshot): boolean {\n return (\n material.materialShaderId === 'forgeax::default-standard-pbr' &&\n typeof material.paramSnapshot?.transmission === 'number' &&\n material.paramSnapshot.transmission > 0\n );\n}\n\nfunction matchesRecordMode(\n material: MaterialSnapshot,\n mode: 'opaque' | 'transmission' | 'transparent',\n): boolean {\n const transmission = isTransmissionMaterial(material);\n if (mode === 'transmission') return transmission;\n if (mode === 'transparent') return material.transparent === true && !transmission;\n return !transmission && material.transparent !== true;\n}\n\nfunction matchedMaterialsForRecordMode(\n c: _InternalRenderPipelineContext,\n matchedMaterials: ReadonlyMap<number, ReadonlySet<number>> | null,\n mode: 'opaque' | 'transmission' | 'transparent' | undefined,\n): ReadonlyMap<number, ReadonlySet<number>> | null {\n if (mode === undefined) return matchedMaterials;\n const filtered = new Map<number, ReadonlySet<number>>();\n for (const entry of c.validatedOrdered) {\n const dispatchHandles = matchedMaterials?.get(entry.renderableIndex);\n if (matchedMaterials !== null && dispatchHandles === undefined) continue;\n const candidateHandles =\n dispatchHandles ??\n (mode === 'transmission'\n ? []\n : entry.source.materials.map((material) => material.materialHandle ?? 0));\n const handles = new Set<number>();\n for (const handle of candidateHandles) {\n const material =\n entry.source.materials.find((candidate) => (candidate.materialHandle ?? 0) === handle) ??\n entry.source.material;\n if (matchesRecordMode(material, mode)) handles.add(handle);\n }\n if (handles.size > 0) filtered.set(entry.renderableIndex, handles);\n }\n return filtered;\n}\n\n/**\n * feat-20260529-rendergraph-pass-abstraction M4 / w13b: main forward\n * (geometry) pass recording, extracted verbatim from recordFrame. Uses the\n * SHARED frame encoder (c.encoder); the geometry + optional LDR sprite-split\n * sub-pass write into geometryColorView (HDR target or swap-chain view).\n * Driven by the render-graph 'main' pass execute closure.\n */\nexport function recordMainPass(\n c: _InternalRenderPipelineContext,\n selector?: PassSelector,\n options?: MainPassOptions,\n graphPass?: RhiRenderPassEncoder,\n): GpuDrivenStandardPbrFrameResources | undefined {\n const {\n runtime,\n world,\n store,\n pipelineState,\n encoder,\n clear,\n geometryColorView,\n geometryDepthView,\n validatedOrdered,\n viewBindGroup,\n viewBindGroupDynamicOffset = 0,\n meshBindGroup,\n frameState,\n bindGroupCounts,\n skyboxActive,\n splitLdrSprite,\n msaaActive,\n geometryColorResolveView,\n dispatch,\n hdrpClusterBindGroup,\n materialSlotIndices,\n materialSlots,\n materialSlotOwners,\n materialSlotCount,\n gpuDrivenStandardPbrFrameResources,\n gpuDrivenSceneMaterialBuffer,\n } = c;\n // bug-20260615 M3 / m3-1: sampleCount is threaded through every\n // getMaterialShaderPipeline call site so the cache key / builder\n // disambiguate count=1 vs count=4 PSOs. Derived from the per-camera\n // msaaActive boolean (already on the context).\n const sampleCount = msaaActive ? 4 : 1;\n const passKind = options?.passKind ?? 'forward';\n const recordMode = options?.recordMode;\n const transmissionBackdropView = options?.transmissionBackdropView;\n if (recordMode === 'transmission' && transmissionBackdropView == null) {\n throw new RhiError({\n code: 'webgpu-runtime-error',\n expected: 'transmissionBackdropView != null for transmission record mode',\n hint: 'the typed Standard transmission pass must resolve its private backdrop view',\n });\n }\n const colorViews = options?.colorViews ?? [geometryColorView];\n const colorFormats = options?.colorFormats ?? [\n (c.tonemapActive || c.transparentColorFormat === 'rgba16float'\n ? 'rgba16float'\n : pipelineState.colorAttachmentFormat) as GPUTextureFormat,\n ];\n const targetDepthView = options?.depthView ?? geometryDepthView;\n const clearColor = options?.clearColor ?? clear;\n // feat-20260623-world-space-video-asset M4 / w17 (D-2 / AC-09): high-perf\n // GPUExternalTexture upload availability for video sources, resolved by the\n // explicit RhiCaps-based capability probe. The probe checks\n // backendKind==='webgpu' AND `importExternalTexture` method presence; the\n // latter is absent today (OOS-5), so this is false and the general\n // copyExternalImageToTexture path (w16) is the sole route. The branch exists\n // so the AC-09 two-path reserved hook is code-review-verifiable, not a TODO.\n const videoHighPerfAvailable = probeVideoHighPerfUpload(runtime.device);\n // The prepared Standard topology is the frame authority. Do not infer the\n // shader lane from a resource that may be absent after a failed rebuild: a\n // clustered frame with no unified group must fail closed, never fall back to\n // a direct-lighting shader with an incompatible group(2) contract.\n const clusteredLighting = c.standardLighting?.kind === 'clustered';\n // A clustered topology still needs the unified group for every actual\n // material draw. A camera-only/clear frame has no group(2) consumer yet;\n // treating that harmless absence as a frame error would make the full\n // clustered ABI incompatible with valid zero-renderable frames.\n const clusteredBindGroupMissing =\n validatedOrdered.length > 0 &&\n !standardTopologyBindGroupReady(c.standardLighting, hdrpClusterBindGroup);\n // Standard clustered lighting swaps the\n // group(2) bindGroup for the unified 7-entry layout (mesh SSBO at binding 0\n // + cluster 4 buffer at bindings 3..6). The dynamic offset\n // (`i * MESH_PER_ENTITY_STRIDE`) stays valid because the unified BGL binds\n // the SAME mesh SSBO at binding 0; the cluster-forward shader reads the\n // cluster bindings off the rest of the layout. Plan D-1 (URP path zero\n // change) is preserved — when clustered lighting is not selected the\n // ordinary mesh bind group path runs verbatim.\n // feat-20260612-hdrp-ssao wiring fix: when the HDRP forward pass resolved a\n // real `ssaoBlurred` view (stashed on ctx by the pass execute closure), build\n // the unified group(2) bind group with that view at binding 7 so fs_main reads\n // the actual occlusion factor instead of the 1x1 white fallback. The default\n // `hdrpClusterBindGroup` (built ahead of graph.execute) always carries the\n // fallback because the transient SSAO texture does not exist that early.\n // Built per frame (the SSAO target is a graph transient, so no cross-frame\n // cache); HDRP-only and SSAO-only, so URP and SSAO-off paths are untouched.\n let hdrpSsaoBindGroup: BindGroup | null = null;\n if (clusteredLighting && hdrpClusterBindGroup !== null && c.hdrpSsaoBlurredView !== undefined) {\n const hdrpBuffers = getOrCreateHdrpBuffers(\n runtime,\n frameState.installedPipelineConfig?.clusterGrid,\n );\n if (hdrpBuffers !== null) {\n hdrpSsaoBindGroup = createHdrpUnifiedBindGroup(\n runtime,\n hdrpBuffers,\n pipelineState.meshStorageBuffer.buffer,\n { enabled: true, ssaoBlurredView: c.hdrpSsaoBlurredView },\n );\n }\n }\n const meshGroup2: BindGroup | null = clusteredLighting\n ? (hdrpSsaoBindGroup ?? hdrpClusterBindGroup)\n : meshBindGroup;\n // ── Geometry (main colour) pass ──────────────────────────────────\n // D-2: tracks whether the geometry pass was explicitly ended inside\n // the `if (validatedOrdered.length > 0)` block (sprite split path),\n // to avoid a double-end at the unconditional `pass.end()` below.\n let geometryPassEnded = false;\n // feat-20260531-skybox-env-background M2 / w8: condition main colour\n // loadOp on skyboxActive (AC-05). When skybox is active, the skybox\n // pass writes the far plane + cubemap colour to hdrColor before main;\n // main must load (not clear) to composite geometry on top. Depth\n // loadOp stays 'clear' -- skybox does not write depth, so main's\n // depth test naturally covers skybox pixels with foreground geometry.\n const mainColorLoadOp = skyboxActive ? 'load' : 'clear';\n // feat-20260604 M2 / w9-w10: MSAA resolve placement. When MSAA is active the\n // geometry pass writes a count=4 multisample target. The resolve to the\n // single-sample output (LDR swap-chain view / HDR hdrColor) happens at the\n // LAST pass that writes that multisample target: the main pass itself when\n // there is no LDR sprite split, or the sprite sub-pass end when there is\n // (F-1 -- geometry + sprites share one multisample texture; resolving at the\n // main pass would drop the sprites drawn after). The sprite sub-pass is\n // LDR-only, so under HDR the main pass always resolves.\n const mainPassResolves =\n passKind === 'forward' && msaaActive && geometryColorResolveView !== null && !splitLdrSprite;\n // forward main pass: depth24plus-stencil8 auto-emits stencil ops via the\n // helper's stencil-op gate (plan-strategy M4 R3/R5 stencil-op SSOT).\n // mainColorLoadOp toggles between 'clear' and 'load' (skyboxActive case).\n const pass: RhiRenderPassEncoder =\n graphPass ??\n encoder.beginRenderPass(\n buildBeginRenderPassDescriptor(\n {\n colorFormats,\n depthFormat: 'depth24plus-stencil8',\n sampleCount: msaaActive ? 4 : 1,\n },\n {\n colorViews,\n depthView: targetDepthView,\n ...(mainPassResolves ? { resolveTargets: [geometryColorResolveView] } : {}),\n },\n passKind,\n {\n colorLoadOp: mainColorLoadOp,\n clearColor: {\n r: clearColor[0] ?? 0,\n g: clearColor[1] ?? 0,\n b: clearColor[2] ?? 0,\n a: clearColor[3] ?? 1,\n },\n },\n ) as never,\n );\n\n // Geometry submission block: setPipeline + 4 bind groups + per-entity\n // material uploads + drawIndexed.\n\n // feat-20260609 M2: filter entities by pass selector.\n const matchedIndices =\n selector !== undefined ? buildMatchedRenderableIndices(dispatch, selector) : null;\n const selectorMatchedMaterials =\n selector !== undefined\n ? buildMatchedMaterialHandlesByRenderable(\n dispatch,\n selector,\n options?.excludeSelector,\n options?.includeSelector,\n )\n : null;\n const matchedMaterials = matchedMaterialsForRecordMode(c, selectorMatchedMaterials, recordMode);\n const selectedDispatch =\n dispatch.length === 0\n ? undefined\n : filterDispatchBySelector(\n dispatch,\n selector ?? { LightMode: [passKind === 'deferred' ? 'Deferred' : 'Forward'] },\n );\n const recordContext =\n recordMode === undefined\n ? c\n : {\n ...c,\n splitLdrSprite: recordMode === 'transparent' ? false : c.splitLdrSprite,\n };\n\n if (clusteredBindGroupMissing) {\n runtime.errorRegistry.fire(\n new RhiError({\n code: 'webgpu-runtime-error',\n expected: 'clustered Standard frame has a unified group(2) BindGroup',\n hint: 'repair the clustered buffer/layout admission before retrying the frame; direct URP fallback is unsafe',\n }),\n );\n }\n\n if (validatedOrdered.length > 0 && !clusteredBindGroupMissing) {\n // feat-20260518-pbr-direct-lighting-mvp M5 / w22.10 (D-4 + D-9 +\n // AC-07 std140): per-entity material slice grew from 32 B (legacy\n // baseColor:vec4 + metallic + roughness + 8B padding) to 48 B\n // mirroring the post-w22.10 `Material` WGSL struct field-for-field\n // (see STANDARD_PBR_UBO_SIZE JSDoc in render-system.ts). The dynamic-\n // offset stride is MATERIAL_PER_ENTITY_STRIDE; the BindGroup entry's\n // `size` remains the derived material payload size.\n const MATERIAL_SLICE = STANDARD_PBR_UBO_SIZE;\n // feat-20260515 M3 / T-M3-05 (research F-6 fix): materialBindGroup now\n // carries 3 entries -- the per-entity material UBO (binding 0,\n // dynamic-offset retained from D-P9), the default sampler (binding 1,\n // pipelineState.defaultSampler from createRenderer; research F-5\n // linear min/mag/mipmap + repeat addressMode), and the texture-view\n // (binding 2, resolved from MaterialSnapshot.baseColorTexture via\n // AssetRegistry.getTextureGpuView when present, falling back to the\n // pipelineState.fallbackTextureView 1x1 white pixel).\n //\n // The first validated renderable's material is sampled to choose the\n // texture-view (M3 milestone simplification; M5 lifts this to\n // per-entity slot writes once UV-driven sampling lands).\n //\n // feat-20260517-merge-mesh-renderer-material-renderer M3 / w10\n // (this commit): the prior structural cast over `firstMaterial`\n // (used to reach `baseColorTexture` before the snapshot carried\n // it as a first-class field) is removed in favour of direct\n // snapshot field access. `MaterialSnapshot` (extract-stage SSOT)\n // already declares `baseColorTexture` (M2 / w6); record reads it\n // directly with no asset registry round-trip and no cast --\n // Pipeline Isolation: extract owns the asset to snapshot\n // translation; record consumes the snapshot POD only (charter\n // proposition 5 consistent abstraction; AC-07 reverse-grep gate\n // `scripts/forgeax/check-render-record-no-material-asset-get.mjs`\n // forbids both the cast pattern and a direct material asset\n // typed-lookup regrowth in this file).\n // bug-20260522-per-entity-material-texture-binding D-1/D-2:\n // the pre-loop `firstMaterial` / `materialTextureView` / `\n // baseMaterialEntries` / single shared `materialBindGroup` are\n // removed. Each entity now creates its own per-entity material BG\n // inside the draw loop, resolving binding=2 from its own\n // `entry.source.material.baseColorTexture` (mirroring sprite path).\n //\n // feat-20260520-skylight-ibl-cubemap M3 round-4 / t48 amend: the\n // 14-entry merged BG (7 material + 7 Skylight) is now assembled per\n // entity inside the draw loop. The Skylight part stays scene-level\n // (single `skylightResources` resolved once below); only the first 7\n // material entries are rebuilt per-entity with the correct\n // per-entity textureView at binding=2.\n const { skylightResources, activeViews } = prepareMaterialSkylight(c);\n if (materialDiagnosticsEnabled()) {\n const activeCache =\n activeViews === undefined ? undefined : getOrCreateIblCache(runtime.deviceScope);\n const prefilterViewMipCount =\n activeCache?.prefilterFaceViewsByMip?.length ?? (activeViews === undefined ? 1 : 0);\n frameState.iblBindingInspection = {\n status: 'binding-chain-consistent',\n frameId: frameState.frameNumber,\n deviceGeneration: runtime.deviceScope.generation,\n active: activeViews === undefined ? 'fallback' : 'active',\n cache: {\n identity: getOpaqueResourceIdentity(\n (activeCache ?? pipelineState.skylightFallback) as object,\n ),\n generation: runtime.deviceScope.generation,\n prefilterMipCount: prefilterViewMipCount,\n prefilterViewMipCount,\n },\n sampler: {\n expected: {\n magFilter: 'linear',\n minFilter: 'linear',\n mipmapFilter: 'linear',\n addressModeU: 'clamp-to-edge',\n addressModeV: 'clamp-to-edge',\n addressModeW: 'clamp-to-edge',\n },\n identities: [\n getOpaqueResourceIdentity(skylightResources.irradianceSampler as object),\n getOpaqueResourceIdentity(skylightResources.prefilterSampler as object),\n getOpaqueResourceIdentity(skylightResources.brdfLutSampler as object),\n ],\n },\n resources: {\n irradiance: {\n viewIdentity: getOpaqueResourceIdentity(skylightResources.irradianceView as object),\n samplerIdentity: getOpaqueResourceIdentity(\n skylightResources.irradianceSampler as object,\n ),\n deviceGeneration: runtime.deviceScope.generation,\n },\n prefilter: {\n viewIdentity: getOpaqueResourceIdentity(skylightResources.prefilterView as object),\n samplerIdentity: getOpaqueResourceIdentity(\n skylightResources.prefilterSampler as object,\n ),\n deviceGeneration: runtime.deviceScope.generation,\n },\n brdfLut: {\n viewIdentity: getOpaqueResourceIdentity(skylightResources.brdfLutView as object),\n samplerIdentity: getOpaqueResourceIdentity(skylightResources.brdfLutSampler as object),\n deviceGeneration: runtime.deviceScope.generation,\n },\n intensityBufferIdentity: getOpaqueResourceIdentity(\n skylightResources.intensityBuffer as object,\n ),\n },\n errors: [],\n };\n }\n // Per-entity material uploads (D-P9 retained path).\n // feat-20260613 fix-issue-1 (D-8 channelMap split): the payload mirrors\n // the post-split sidecar paramSchema for default-standard-pbr (14 entries\n // packed std140 across a 96 B schema tail):\n // [0..3] baseColor vec4<f32> (offset 0)\n // [4] metallic f32 (offset 16)\n // [5] roughness f32 (offset 20)\n // [6] metallicChannel f32 (offset 24)\n // [7] roughnessChannel f32 (offset 28)\n // [8] aoChannel f32 (offset 32)\n // [9] extraChannel f32 (offset 36)\n // [12..14] emissive vec3<f32> (offset 48, vec3 align=16)\n // [15] emissiveIntensity f32 (offset 60)\n // [16] occlusionStrength f32 (offset 64)\n // Channel selectors default to (B,G,R,_) = (2,1,0,0) per glTF 2.0\n // KHR_materials_pbrSpecularGlossiness ARM packing; the fragment casts\n // each f32 to u32 at the pick_channel call site. The full 128 B bind window is\n // overwritten per-entity so unlit entities still produce a deterministic\n // payload (charter P3 explicit failure: zero-init via fresh ArrayBuffer).\n //\n // Material snapshots are interned by extract-owned identity before this\n // pass. Repeated scene instances therefore share one 256-byte UBO slot;\n // materialSlotIndices maps each authored submesh material to that slot.\n // feat-city-glb Bug 5 (per-submesh transparency): shared per-submesh\n // material bind-group assembly, called by BOTH the geometry pass and the\n // LDR blend sub-pass so a transparent PBR submesh binds the identical\n // metallic/roughness/normal/emissive/occlusion + Skylight layout\n // the geometry pass uses (the sub-pass previously bound a sprite-only BG,\n // which cannot render a PBR decal). Captures only frame-stable closure\n // state; the caller passes the per-submesh material snapshot + entityKey\n // (for video texture routing) and sets the dynamic UBO offset itself.\n // Selection keys use the extracted frame index, never World.identity.\n const hasProbeBindings = (c.reflectionProbes?.table.rows.length ?? 0) > 0;\n const worldIndices = hasProbeBindings\n ? new Map(\n validatedOrdered.map((entry) => [entry.world ?? world, entry.source.worldId] as const),\n )\n : undefined;\n const perSubmeshMaterialBgDeps: PerSubmeshMaterialBgDeps = {\n runtime,\n pipelineState,\n world,\n store,\n materialSlice: MATERIAL_SLICE,\n videoHighPerfAvailable,\n skylightResources,\n resolveRenderTargetTextureSource: runtime.resolveRenderTargetTextureSource,\n resolveReflectionProbeResources: (materialWorld, entityKey) => {\n const reflectionProbes = c.reflectionProbes;\n if (reflectionProbes === undefined || !hasProbeBindings) return undefined;\n const selection = reflectionProbes.selections.get(\n `${worldIndices?.get(materialWorld)}:${entityKey}`,\n );\n if (selection === undefined) return undefined;\n const binding = resolveReflectionProbeBinding(selection, reflectionProbes.table);\n if (binding.useSkylight || binding.probeIndex === undefined) return undefined;\n const row = reflectionProbes.table.rows.find(\n (candidate) => candidate.index === binding.probeIndex,\n );\n if (\n row?.filteredView === undefined ||\n row.sampler === undefined ||\n row.uniformBuffer === undefined\n ) {\n return undefined;\n }\n const probeResources: SkylightBindGroupResources = {\n irradianceView: skylightResources.irradianceView,\n irradianceSampler: skylightResources.irradianceSampler,\n prefilterView: row.filteredView,\n skylightPrefilterView: skylightResources.prefilterView,\n prefilterSampler: row.sampler,\n brdfLutView: skylightResources.brdfLutView,\n brdfLutSampler: skylightResources.brdfLutSampler,\n intensityBuffer: row.uniformBuffer,\n };\n return { resources: probeResources, probeIndex: row.index };\n },\n materialBgShared: frameState.materialBgShared,\n materialBgAssemblyCache: c.materialBgAssemblyCache,\n frameState,\n bindGroupCounts,\n ...(gpuDrivenStandardPbrFrameResources?.sceneMaterialBuffer === undefined &&\n gpuDrivenSceneMaterialBuffer === undefined\n ? {}\n : {\n sceneMaterialBuffer:\n gpuDrivenStandardPbrFrameResources?.sceneMaterialBuffer ??\n gpuDrivenSceneMaterialBuffer,\n }),\n ...(transmissionBackdropView === undefined ? {} : { transmissionBackdropView }),\n };\n const buildPerSubmeshMaterialBg = (\n submeshMaterial: MaterialSnapshot,\n entityKey: number,\n materialWorld: World = world,\n materialShaderId: string | undefined = submeshMaterial.materialShaderId,\n ): BindGroup =>\n buildPerSubmeshMaterialBgImpl(\n perSubmeshMaterialBgDeps,\n submeshMaterial,\n entityKey,\n materialWorld,\n materialShaderId,\n );\n // Static material resources are a property of the frame-local material\n // slot, not of each submesh draw. Resolve them once here so the geometry\n // loop only selects a prepared binding. Video fields remain entity-bound:\n // their current frame view is keyed by entityKey and must be resolved at\n // the draw site.\n const preparedMaterialBindGroups = new Array<BindGroup | undefined>(materialSlotCount);\n for (let materialSlot = 0; materialSlot < materialSlotCount; materialSlot += 1) {\n const material = materialSlots[materialSlot];\n if (material === undefined || (material.videoTextureFields?.size ?? 0) > 0) continue;\n const owner = materialSlotOwners[materialSlot];\n if (owner === undefined) continue;\n preparedMaterialBindGroups[materialSlot] = buildPerSubmeshMaterialBg(\n material,\n owner.source.entityKey,\n owner.world ?? world,\n );\n }\n if (gpuDrivenStandardPbrFrameResources !== undefined) {\n gpuDrivenStandardPbrFrameResources.resolveClusteredMeshBindGroup = (binding) => {\n const buffers = getOrCreateHdrpBuffers(\n runtime,\n frameState.installedPipelineConfig?.clusterGrid,\n );\n const layout =\n binding.paletteBuffer === undefined\n ? pipelineState.hdrpMeshBindGroupLayout\n : pipelineState.hdrpSkinMeshBindGroupLayout;\n const group =\n buffers === null || layout == null\n ? null\n : createGpuDrivenLightingBindGroup(\n runtime,\n buffers,\n layout,\n binding,\n c.hdrpSsaoBlurredView,\n );\n if (group === null)\n throw new RhiError({\n code: 'rhi-not-available',\n expected: 'scene-index clustered lighting binding',\n hint: 'publish scene rows and the current lighting/AO resources before indirect drawing',\n });\n return group;\n };\n gpuDrivenStandardPbrFrameResources.materialBindGroups.length = 0;\n gpuDrivenStandardPbrFrameResources.materialBindGroups.push(...preparedMaterialBindGroups);\n gpuDrivenStandardPbrFrameResources.colorFormats = colorFormats;\n const selectedMaterialSlots = new Set<number>();\n if (matchedMaterials === null)\n delete gpuDrivenStandardPbrFrameResources.selectedMaterialSlots;\n else gpuDrivenStandardPbrFrameResources.selectedMaterialSlots = selectedMaterialSlots;\n gpuDrivenStandardPbrFrameResources.materialSlotIndicesByEntity.clear();\n for (let index = 0; index < validatedOrdered.length; index += 1) {\n const entry = validatedOrdered[index];\n if (entry === undefined) continue;\n const selected = matchedMaterials?.get(entry.renderableIndex);\n const materials =\n entry.source.materials.length > 0 ? entry.source.materials : [entry.source.material];\n for (let slot = 0; slot < materials.length; slot += 1) {\n const handle = materials[slot]?.materialHandle ?? -1;\n const globalSlot = materialSlotIndices[index]?.[slot];\n if (globalSlot !== undefined && selected?.has(handle))\n selectedMaterialSlots.add(globalSlot);\n }\n gpuDrivenStandardPbrFrameResources.materialSlotIndicesByEntity.set(\n worldEntityKey(entry.source.worldId, entry.source.entityKey),\n materialSlotIndices[index] ?? [],\n );\n }\n }\n const resolveMaterialBindGroup = (\n materialSlot: number,\n material: MaterialSnapshot,\n entityKey: number,\n materialWorld: World = world,\n materialShaderId: string | undefined = material.materialShaderId,\n ): BindGroup =>\n !hasProbeBindings &&\n materialShaderId === material.materialShaderId &&\n materialShaderId !== POINTS_LINES_MATERIAL_SHADER_ID\n ? (preparedMaterialBindGroups[materialSlot] ??\n buildPerSubmeshMaterialBg(material, entityKey, materialWorld, materialShaderId))\n : buildPerSubmeshMaterialBg(material, entityKey, materialWorld, materialShaderId);\n\n pass.setBindGroup(0, viewBindGroup as BindGroup, [viewBindGroupDynamicOffset, 0]);\n\n // Track which (mesh-vertex-buffer, mesh-index-buffer, pipeline) combo\n // was last bound so consecutive entities sharing the same combo skip\n // the redundant rebinds (cheap GPU cost; net wins on workloads where\n // most entities share BUILTIN_CUBE + unlit). Initial nulls force the\n // first iteration to bind unconditionally.\n // M-3 / w12: vertexBuffer/indexBuffer state locals migrate to GpuBuffer.\n const recordGeometry = (): void => {\n recordGeometryDraws(\n recordContext,\n pass,\n matchedMaterials,\n materialSlotIndices,\n sampleCount,\n meshGroup2,\n meshBindGroup,\n resolveMaterialBindGroup,\n passKind,\n selectedDispatch,\n colorFormats,\n options?.coverageOnly ?? false,\n );\n };\n if (c.profilePhase === undefined) {\n recordGeometry();\n } else {\n const passName = passKind === 'deferred' ? 'g-buffer' : 'forward';\n c.profilePhase(\n `record/graph-execute/${passName}/geometry-loop` as RenderRecordPhase,\n recordGeometry,\n );\n }\n\n if (options?.gpuDriven !== undefined) {\n if (viewBindGroup === null) {\n throw new RhiError({\n code: 'rhi-not-available',\n expected: 'main-pass Standard PBR view bind group for GPU-driven encode',\n hint: 'publish the current frame view/light/shadow bind group before GPU raster',\n });\n }\n if (gpuDrivenStandardPbrFrameResources === undefined) {\n throw new RhiError({\n code: 'rhi-not-available',\n expected: 'complete main-pass Standard PBR material bind-group receipt',\n hint: 'finish frame material producer assembly before GPU-driven encode',\n });\n }\n options.gpuDriven.projection.encode(\n viewBindGroup,\n pass,\n options.gpuDriven.resources,\n gpuDrivenStandardPbrFrameResources,\n );\n }\n\n // D-2: LDR sprite pass. Runs after the geometry pass when there are\n // sprite entities in the draw list and the LDR path is active.\n // The geometry pass used the bgra8unorm-srgb sRGB view (hardware sRGB\n // encoding for unlit/standard/pbr output). The sprite pass uses the\n // bgra8unorm storage view (loadOp=load) so the sprite LDR pipeline\n // (target=bgra8unorm, blend=premultiplied-alpha) can write over the\n // already-encoded geometry pixels. Depth is loaded from the geometry\n // pass so sprite-vs-mesh occlusion (depthCompare=less-equal) is\n // preserved (plan-strategy §2 D-2 + §4 R-4).\n if (passKind === 'forward' && recordMode === undefined) {\n geometryPassEnded = recordSpritePass(\n c,\n pass,\n matchedIndices,\n materialSlotIndices,\n sampleCount,\n resolveMaterialBindGroup,\n graphPass,\n selectedDispatch,\n );\n }\n } // end if (validatedOrdered.length > 0) -- Case E falls through to pass.end()\n\n if (!geometryPassEnded && graphPass === undefined) {\n pass.end();\n }\n return gpuDrivenStandardPbrFrameResources;\n}\n\nexport function encodeMainPass(\n c: _InternalRenderPipelineContext,\n pass: RhiRenderPassEncoder,\n selector?: PassSelector,\n options?: MainPassOptions,\n): GpuDrivenStandardPbrFrameResources | undefined {\n return recordMainPass(c, selector, options, pass);\n}\n","import { VIEW_UNIFORM_BUFFER_SIZE } from '../record/view-ubo';\n\n/** Generation-scoped buffer and attachment constants used by the ready builder. */\nexport const VIEW_UBO_BYTES = VIEW_UNIFORM_BUFFER_SIZE;\nexport const MIPMAP_PREWARM_FORMATS: readonly GPUTextureFormat[] = [\n 'rgba8unorm-srgb',\n 'rgba8unorm',\n 'rgba16float',\n];\n// WebGPU requires every dynamic uniform-buffer binding offset to satisfy the\n// device's minimum uniform-buffer offset alignment. Keep one shared buffer\n// per pass family, with the small POD payload at the start of each 256-byte\n// slice so every level remains a single production path.\nexport const BLOOM_UNIFORM_PARAMS_STRIDE_BYTES = 256;\nexport const BLOOM_DOWNSAMPLE_PARAMS_BYTES = 5 * BLOOM_UNIFORM_PARAMS_STRIDE_BYTES;\nexport const BLOOM_UPSAMPLE_PARAMS_BYTES = 4 * BLOOM_UNIFORM_PARAMS_STRIDE_BYTES;\nexport const BLOOM_COMPOSITE_PARAMS_BYTES = 16;\nexport const HDR_COLOR_ATTACHMENT_FORMAT: GPUTextureFormat = 'rgba16float';\nexport const DEPTH_TEXTURE_FORMAT: GPUTextureFormat = 'depth24plus-stencil8';\n","import type { BloomEnabled, Tonemap } from './components/camera';\n\n/**\n * The one effective Standard Bloom admission used by graph, resource, and\n * record owners. Authoring remains Camera-owned; this is only the derived\n * zero/non-zero topology decision.\n */\nexport interface BloomAdmissionCamera {\n readonly bloom: BloomEnabled;\n readonly bloomIntensity: number;\n readonly tonemap: Tonemap;\n}\n\nexport function standardBloomAdmitted(camera: BloomAdmissionCamera | undefined): boolean {\n return (\n camera !== undefined &&\n camera.bloom === 'on' &&\n camera.bloomIntensity > 0 &&\n camera.tonemap !== 'none'\n );\n}\n","import type { ResolveContext } from '@forgeax/engine-render-graph';\nimport { RhiError, type RhiRenderPassEncoder, type TextureView } from '@forgeax/engine-rhi';\nimport { toShared } from '@forgeax/engine-types';\nimport { BLOOM_UNIFORM_PARAMS_STRIDE_BYTES } from '../assembly/webgpu-ready-contract';\nimport { standardBloomAdmitted } from '../bloom-admission';\nimport { buildBeginRenderPassDescriptor } from '../pipeline-spec';\nimport { FXAA_POST_PROCESS_ID } from '../render-contract';\nimport { resolveOutputDither } from '../render-pipeline';\nimport type { BloomFrameReceipts } from './frame-snapshot';\nimport { getOrCreateFromChain } from './mesh-ssbo';\nimport type { _InternalRenderPipelineContext } from './render-context';\nimport { VIEW_UNIFORM_BYTES } from './view-ubo';\n\n/**\n * feat-20260531-skybox-env-background M2 / w8: skybox pass recording stub.\n * Renders a fullscreen triangle that samples a cubemap using the camera's\n * inverseViewProj from the View UBO and writes the result to the hdrColor\n * render target. The pass runs after shadow and before main (D-1 topology).\n *\n * This stub early-returns when skyboxActive is false -- the actual execute\n * body is implemented in M3 / w16 (recordSkyboxPass execute). The render-\n * graph still declares the pass so the compile() step validates the\n * dependency edges (shadow -> skybox -> main) even before the execute\n * body is filled in.\n */\nexport function recordSkyboxPass(\n c: _InternalRenderPipelineContext,\n graphPass?: RhiRenderPassEncoder,\n): void {\n // Early-return when skybox is not active (no SkyboxBackground entity,\n // or tonemap is disabled -- plan-strategy D-2 NOTE). The graph still\n // compiles because the pass declaration is unconditional; only the\n // execute body is gated on skyboxActive.\n if (!c.skyboxActive) return;\n const skyboxSnapshot = c.skybox;\n if (skyboxSnapshot === undefined) return;\n\n const { runtime, store, encoder, pipelineState } = c;\n\n // Guard: hdrColorView must be allocated (tonemapActive implies it)\n const hdrColorView = pipelineState.perPassResources.hdrColorView;\n if (graphPass === undefined && hdrColorView === null) return;\n\n // feat-20260604 M2 / w10: under MSAA the skybox + main passes share the\n // count=4 multisample target (hdrColorMsaa); only the main pass (last to\n // write) resolves to the single-sample hdrColor (D-8 -- avoids a wasteful\n // mid-chain resolve). The skybox pass writes the multisample target with no\n // resolveTarget and uses the count=4 skybox pipeline variant.\n const skyboxColorView =\n graphPass === undefined\n ? c.msaaActive\n ? pipelineState.perPassResources.hdrColorMsaaView\n : hdrColorView\n : null;\n if (graphPass === undefined && skyboxColorView === null) return;\n\n // Guard: pipeline resources must exist (null when manifest has no\n // skybox entry -- legacy manifests continue to boot)\n const skyboxPipeline = c.msaaActive\n ? pipelineState.perPassResources.skyboxPipelineMsaa\n : pipelineState.perPassResources.skyboxPipeline;\n const skyboxBgl = pipelineState.perPassResources.skyboxBindGroupLayout;\n const skyboxSampler = pipelineState.perPassResources.skyboxSampler;\n const skyboxRotationBuffer = pipelineState.perPassResources.skyboxRotationBuffer;\n if (\n skyboxPipeline === null ||\n skyboxBgl === null ||\n skyboxSampler === null ||\n skyboxRotationBuffer === null\n )\n return;\n\n const rotation = skyboxSnapshot.rotation;\n const rotationUpload = runtime.device.queue.writeBuffer(\n skyboxRotationBuffer,\n 0,\n new Float32Array([rotation[0], rotation[1], rotation[2], rotation[3]]),\n );\n if (!rotationUpload.ok) throw rotationUpload.error;\n\n // Resolve cubemap GPU view from AssetRegistry. Returns undefined if\n // the cubemap has not been uploaded yet (async equirect upload in\n // progress). In that case, degradation to main pass loadOp:'clear'\n // is handled by the passCtx.skyboxActive gate above -- if the\n // cubemap isn't ready, skyboxActive is already false (see w18).\n const cubemapView = store.getCubemapGpuView(\n toShared<'EquirectAsset'>(skyboxSnapshot.equirectHandle),\n );\n if (cubemapView === undefined) return;\n\n // Identity-cached skybox BindGroup keyed on the cubemap GpuView. The only\n // varying binding is the cubemap view (sampler + View UBO are stable); it is\n // recreated on each internal equirect-to-cubemap projection (which may happen\n // mid-app asynchronously), so keying on its identity rebuilds exactly when the\n // cubemap changes. This supersedes the prior `hdrTextureWidth`/`Height`\n // size-guard, which tracked the wrong resource (the skybox BindGroup never\n // binds hdrColor -- it writes the color attachment) and missed cubemap\n // re-projections that reused the old cached bind group.\n const skyboxBg = getOrCreateFromChain(\n c.frameState.postProcessBgCache,\n [cubemapView],\n 'skybox',\n () => {\n const skyboxBgRes = runtime.device.createBindGroup({\n label: 'skybox-bg',\n layout: skyboxBgl,\n entries: [\n {\n binding: 0,\n resource: { kind: 'textureView', value: cubemapView },\n },\n {\n binding: 1,\n resource: { kind: 'sampler', value: skyboxSampler },\n },\n {\n binding: 2,\n resource: {\n kind: 'buffer',\n value: { buffer: pipelineState.viewUniformBuffer, size: VIEW_UNIFORM_BYTES },\n },\n },\n {\n binding: 3,\n resource: {\n kind: 'buffer',\n value: { buffer: skyboxRotationBuffer },\n },\n },\n ],\n });\n if (!skyboxBgRes.ok) throw skyboxBgRes.error;\n return skyboxBgRes.value;\n },\n c.bindGroupCounts,\n );\n\n // Skybox pass: clear hdrColor (first pass writing to it),\n // draw fullscreen triangle, write cubemap colour.\n // No depth/stencil -- skybox is the far plane; main pass depth test rejects\n // occluded skybox pixels (plan-strategy D-1). HDR target ('rgba16float') is\n // declared on specAttachments for descriptor parity, even though color-only\n // policies do not gate on format.\n const skyboxPass =\n graphPass ??\n encoder.beginRenderPass(\n buildBeginRenderPassDescriptor(\n { colorFormats: ['rgba16float'], depthFormat: undefined, sampleCount: 1 },\n { colorViews: [skyboxColorView as TextureView] },\n 'skybox',\n ) as never,\n );\n\n skyboxPass.setPipeline(skyboxPipeline);\n skyboxPass.setBindGroup(0, skyboxBg);\n skyboxPass.draw(3);\n if (graphPass === undefined) skyboxPass.end();\n}\n\nexport function encodeSkyboxPass(\n c: _InternalRenderPipelineContext,\n pass: RhiRenderPassEncoder,\n): void {\n recordSkyboxPass(c, pass);\n}\n\n/**\n * feat-20260529-rendergraph-pass-abstraction M4 / w13c: FXAA post-process\n * fullscreen pass, extracted verbatim from recordFrame. copyTextureToTexture\n * (swap-chain -> intermediate) then a fullscreen FXAA fragment pass writes\n * the anti-aliased result back into the swap-chain view, all on the SHARED\n * frame encoder (c.encoder). The pre-pass copy stays inside this closure\n * (graph first version models copy as a pass-internal op, not a separate\n * graph node). Gated on camera.antialias==='fxaa'. Driven by the 'fxaa'\n * graph pass.\n */\n// ── feat-20260531-bloom-first-declarative-render-graph-pass / w14 ──\n// Bloom execute closure placeholders. Real implementations in w15.\n// The graph must declare execute callbacks for addPass; these empty stubs\n// keep compile() satisfied until w15 fills in the actual record logic.\n//\n// Gate: Bloom off, zero intensity, or !tonemapActive => early-return.\n// The closures receive RenderPipelineContext and route to w15 record functions.\n\nconst EMPTY_BLOOM_RECEIPTS: BloomFrameReceipts = {\n uploadCount: 0,\n bindGroupCount: 0,\n encodeCount: 0,\n};\n\nfunction updateBloomReceipts(\n c: _InternalRenderPipelineContext,\n field: keyof BloomFrameReceipts,\n): void {\n const current = c.frameState.bloomFrameReceipts ?? EMPTY_BLOOM_RECEIPTS;\n c.frameState.bloomFrameReceipts = {\n ...current,\n [field]: current[field] + 1,\n };\n}\n\nfunction stageBloomUpload(c: _InternalRenderPipelineContext): void {\n updateBloomReceipts(c, 'uploadCount');\n}\n\nfunction stageBloomBindGroup(c: _InternalRenderPipelineContext): void {\n updateBloomReceipts(c, 'bindGroupCount');\n}\n\nfunction stageBloomEncode(c: _InternalRenderPipelineContext): void {\n updateBloomReceipts(c, 'encodeCount');\n}\n\nfunction throwBloomRecordFailure(expected: string): never {\n throw new RhiError({\n code: 'webgpu-runtime-error',\n expected,\n hint: 'repair the Bloom candidate resources before retrying the frame',\n });\n}\n\nfunction bloomRecordActive(c: _InternalRenderPipelineContext): boolean {\n return standardBloomAdmitted(c.camera) && c.tonemapActive;\n}\n\nexport function recordBloomDownsamplePass(\n _c: _InternalRenderPipelineContext,\n resolve?: ResolveContext,\n graphPass?: RhiRenderPassEncoder,\n level = 0,\n destinationSize?: { readonly width: number; readonly height: number },\n): void {\n const { runtime, encoder, camera, frameState, bindGroupCounts } = _c;\n const pp = _c.bloomResources;\n if (!bloomRecordActive(_c)) return;\n if (\n pp === undefined ||\n pp === null ||\n pp.bloomDownsamplePipeline === null ||\n pp.bloomDownsampleBindGroupLayout === null ||\n pp.bloomSampler === null ||\n pp.bloomDownsampleParamsBuffer === null\n ) {\n throwBloomRecordFailure('Bloom downsample resources are ready before encoding');\n }\n const downsamplePipeline = pp.bloomDownsamplePipeline;\n const downsampleLayout = pp.bloomDownsampleBindGroupLayout;\n const bloomSampler = pp.bloomSampler;\n const downsampleParamsBuffer = pp.bloomDownsampleParamsBuffer;\n const sourceName = level === 0 ? 'hdrColor' : `bloomDownsample${level - 1}`;\n const targetName = `bloomDownsample${level}`;\n const sourceView = resolve?.resolve(sourceName) as TextureView | undefined;\n const targetView = resolve?.resolve(targetName) as TextureView | undefined;\n if (sourceView === undefined || targetView === undefined) {\n throwBloomRecordFailure(`Bloom downsample level ${level} resolves source and target views`);\n }\n const size = destinationSize ?? {\n width: Math.max(1, Math.ceil(_c.targetW / 2)),\n height: Math.max(1, Math.ceil(_c.targetH / 2)),\n };\n const params = new Float32Array([\n camera.bloomThreshold,\n camera.bloomSoftKnee,\n size.width,\n size.height,\n level,\n 0,\n 0,\n 0,\n ]);\n const offset = level * BLOOM_UNIFORM_PARAMS_STRIDE_BYTES;\n const upload = runtime.device.queue.writeBuffer(pp.bloomDownsampleParamsBuffer, offset, params);\n if (!upload.ok) throw upload.error;\n stageBloomUpload(_c);\n const bindGroup = getOrCreateFromChain(\n frameState.postProcessBgCache,\n [sourceView, downsampleParamsBuffer],\n `bloom-downsample-${level}`,\n () => {\n const created = runtime.device.createBindGroup({\n label: `bloom-downsample-${level}-bg`,\n layout: downsampleLayout,\n entries: [\n { binding: 0, resource: { kind: 'textureView', value: sourceView } },\n { binding: 1, resource: { kind: 'sampler', value: bloomSampler } },\n {\n binding: 2,\n resource: {\n kind: 'buffer',\n value: { buffer: downsampleParamsBuffer, offset, size: 32 },\n },\n },\n ],\n });\n if (!created.ok) throw created.error;\n return created.value;\n },\n bindGroupCounts,\n );\n const pass =\n graphPass ??\n encoder.beginRenderPass(\n buildBeginRenderPassDescriptor(\n { colorFormats: ['rgba16float'], depthFormat: undefined, sampleCount: 1 },\n { colorViews: [targetView] },\n 'bloom-downsample',\n ) as never,\n );\n pass.setPipeline(downsamplePipeline);\n pass.setBindGroup(0, bindGroup);\n stageBloomBindGroup(_c);\n pass.draw(3, 1, 0, 0);\n stageBloomEncode(_c);\n if (graphPass === undefined) pass.end();\n}\n\nexport function recordBloomUpsamplePass(\n _c: _InternalRenderPipelineContext,\n resolve?: ResolveContext,\n graphPass?: RhiRenderPassEncoder,\n level = 0,\n): void {\n const { runtime, encoder, frameState, bindGroupCounts } = _c;\n const pp = _c.bloomResources;\n if (!bloomRecordActive(_c)) return;\n if (\n pp === undefined ||\n pp === null ||\n pp.bloomUpsamplePipeline === null ||\n pp.bloomUpsampleBindGroupLayout === null ||\n pp.bloomSampler === null ||\n pp.bloomUpsampleParamsBuffer === null\n ) {\n throwBloomRecordFailure('Bloom upsample resources are ready before encoding');\n }\n const upsamplePipeline = pp.bloomUpsamplePipeline;\n const upsampleLayout = pp.bloomUpsampleBindGroupLayout;\n const bloomSampler = pp.bloomSampler;\n const upsampleParamsBuffer = pp.bloomUpsampleParamsBuffer;\n const currentView = resolve?.resolve(`bloomDownsample${level}`) as TextureView | undefined;\n // The top upsample edge reconstructs from the next downsample level. Every\n // finer edge then consumes the already reconstructed coarser upsample. A\n // resolver miss is the single source of truth for the one-level pyramid\n // boundary; no alternate level-count or legacy H/V path is needed.\n const nextUpsampleView = resolve?.resolve(`bloomUpsample${level + 1}`) as TextureView | undefined;\n const coarseView =\n nextUpsampleView ??\n (resolve?.resolve(`bloomDownsample${level + 1}`) as TextureView | undefined);\n const targetView = resolve?.resolve(`bloomUpsample${level}`) as TextureView | undefined;\n if (currentView === undefined || coarseView === undefined || targetView === undefined) {\n throwBloomRecordFailure(`Bloom upsample level ${level} resolves adjacent pyramid views`);\n }\n const params = new Float32Array([_c.camera.bloomScatter, 0, 0, 0]);\n const offset = level * BLOOM_UNIFORM_PARAMS_STRIDE_BYTES;\n const upload = runtime.device.queue.writeBuffer(pp.bloomUpsampleParamsBuffer, offset, params);\n if (!upload.ok) throw upload.error;\n stageBloomUpload(_c);\n const bindGroup = getOrCreateFromChain(\n frameState.postProcessBgCache,\n [currentView, coarseView, upsampleParamsBuffer],\n `bloom-upsample-${level}`,\n () => {\n const created = runtime.device.createBindGroup({\n label: `bloom-upsample-${level}-bg`,\n layout: upsampleLayout,\n entries: [\n { binding: 0, resource: { kind: 'textureView', value: currentView } },\n { binding: 1, resource: { kind: 'textureView', value: coarseView } },\n { binding: 2, resource: { kind: 'sampler', value: bloomSampler } },\n {\n binding: 3,\n resource: { kind: 'buffer', value: { buffer: upsampleParamsBuffer, offset, size: 16 } },\n },\n ],\n });\n if (!created.ok) throw created.error;\n return created.value;\n },\n bindGroupCounts,\n );\n const pass =\n graphPass ??\n encoder.beginRenderPass(\n buildBeginRenderPassDescriptor(\n { colorFormats: ['rgba16float'], depthFormat: undefined, sampleCount: 1 },\n { colorViews: [targetView] },\n 'bloom-upsample',\n ) as never,\n );\n pass.setPipeline(upsamplePipeline);\n pass.setBindGroup(0, bindGroup);\n stageBloomBindGroup(_c);\n pass.draw(3, 1, 0, 0);\n stageBloomEncode(_c);\n if (graphPass === undefined) pass.end();\n}\n\nexport function recordBloomCompositePass(\n _c: _InternalRenderPipelineContext,\n resolve?: ResolveContext,\n graphPass?: RhiRenderPassEncoder,\n): void {\n const { runtime, encoder, camera, frameState, bindGroupCounts } = _c;\n const pp = _c.bloomResources;\n\n if (!bloomRecordActive(_c)) return;\n if (pp === null || pp === undefined) {\n throwBloomRecordFailure('Bloom persistent resources are ready before composite encoding');\n }\n if (\n pp.bloomCompositePipeline === null ||\n pp.bloomCompositeBindGroupLayout === null ||\n pp.bloomSampler === null ||\n pp.bloomCompositeParamsBuffer === null\n ) {\n throwBloomRecordFailure(\n 'Bloom composite pass has pipeline, layout, sampler, and params buffer',\n );\n }\n\n // hdrColor + reconstructed Bloom textures are owned by render-graph.\n // bug-20260625: composite READS hdrColor (scene, binding 0) and WRITES the\n // separate hdrComposited target -- never the same texture in one pass.\n const hdrColorView = resolve?.resolve('hdrColor') as TextureView | undefined;\n const bloomView = resolve?.resolve('bloomUpsample0') as TextureView | undefined;\n const finestBloomView =\n bloomView ?? (resolve?.resolve('bloomDownsample0') as TextureView | undefined);\n const hdrCompositedView = resolve?.resolve('hdrComposited') as TextureView | undefined;\n if (!hdrColorView || !finestBloomView || !hdrCompositedView) {\n throwBloomRecordFailure('Bloom composite pass resolves scene, finest Bloom, and target views');\n }\n const bglComposite = pp.bloomCompositeBindGroupLayout;\n const bloomSampler = pp.bloomSampler;\n const paramsBuffer = pp.bloomCompositeParamsBuffer;\n\n // 1. Write composite params UBO (16 B std140: intensity + 12 B pad).\n const compositeParams = new Float32Array(4);\n compositeParams[0] = camera.bloomIntensity;\n compositeParams[1] = 0;\n compositeParams[2] = 0;\n compositeParams[3] = 0;\n const paramsWrite = runtime.device.queue.writeBuffer(paramsBuffer, 0, compositeParams);\n if (!paramsWrite.ok) throw paramsWrite.error;\n stageBloomUpload(_c);\n\n // 2. Identity-cached BindGroup (2 tex: hdrColor + finest Bloom, 1 sampler,\n // 1 UBO). Keys on both sampled views: resize retires both hdrColor and\n // finest Bloom view, so a two-node chain rebuilds when either identity changes.\n const bindGroup = getOrCreateFromChain(\n frameState.postProcessBgCache,\n [hdrColorView, finestBloomView],\n 'bloom-composite',\n () => {\n const bgRes = runtime.device.createBindGroup({\n label: 'bloom-composite-bg',\n layout: bglComposite,\n entries: [\n { binding: 0, resource: { kind: 'textureView', value: hdrColorView } },\n { binding: 1, resource: { kind: 'textureView', value: finestBloomView } },\n { binding: 2, resource: { kind: 'sampler', value: bloomSampler } },\n {\n binding: 3,\n resource: { kind: 'buffer', value: { buffer: paramsBuffer } },\n },\n ],\n });\n if (!bgRes.ok) throw bgRes.error;\n return bgRes.value;\n },\n bindGroupCounts,\n );\n\n // 3. Render pass: write the separate hdrComposited target (bug-20260625).\n // The fragment shader outputs the COMPLETE composited colour\n // (scene + intensity*bloom, sampling scene from hdrColor itself), so the\n // destination needs no prior content -> loadOp='clear' (no stale dependency\n // on hdrComposited's previous-frame content, and no in-place hazard).\n const pass: RhiRenderPassEncoder =\n graphPass ??\n encoder.beginRenderPass(\n buildBeginRenderPassDescriptor(\n { colorFormats: ['rgba16float'], depthFormat: undefined, sampleCount: 1 },\n { colorViews: [hdrCompositedView] },\n 'bloom-composite',\n { colorLoadOp: 'clear' },\n ) as never,\n );\n pass.setPipeline(pp.bloomCompositePipeline);\n pass.setBindGroup(0, bindGroup);\n stageBloomBindGroup(_c);\n pass.draw(3, 1, 0, 0);\n stageBloomEncode(_c);\n if (graphPass === undefined) pass.end();\n}\n\nexport function recordFxaaPass(\n c: _InternalRenderPipelineContext,\n resolve: ResolveContext,\n graphPass?: RhiRenderPassEncoder,\n paramsOverride?: Uint8Array,\n): void {\n const { runtime, pipelineState, encoder, camera, currentTexture } = c;\n // FXAA samples the graph-owned LDR target and writes the current surface.\n // The surface is an output attachment only: no COPY_SRC usage, no\n // copyTextureToTexture, and no backend-specific surface sampling path.\n const fxaaActive = camera.antialias === 'fxaa';\n if (\n fxaaActive &&\n pipelineState.perPassResources.fxaaPipeline !== null &&\n pipelineState.perPassResources.fxaaBindGroupLayout !== null &&\n pipelineState.perPassResources.fxaaSampler !== null &&\n runtime.getPostProcessParamsBuffer !== undefined\n ) {\n // Typed graph calls provide explicit input/output keys. The legacy\n // ldrColor fallback is retained only for the direct surface owner.\n const inputView = (resolve.resolve('input') ?? resolve.resolve('ldrColor')) as\n | TextureView\n | undefined;\n if (inputView === undefined) return;\n\n const fxaaParams = runtime.getPostProcessParamsBuffer(FXAA_POST_PROCESS_ID);\n if (fxaaParams === undefined) return;\n const params = paramsOverride?.byteLength === 16 ? paramsOverride : new Float32Array(4);\n if (paramsOverride === undefined) {\n // Direct legacy FXAA remains the configured final surface writer. The\n // Standard LUT path supplies an explicit zero-valued override through\n // the graph dispatcher, so no graph shape or output-key inference is\n // used to select dither policy.\n params[0] = resolveOutputDither(c.frameState.installedPipelineConfig) ? 1 : 0;\n }\n const paramsWrite = runtime.device.queue.writeBuffer(fxaaParams, 0, params);\n if (!paramsWrite.ok) throw paramsWrite.error;\n\n // Compose the 3-entry FXAA BindGroup (input texture + sampler + params).\n // graph view identity changes when the graph reallocates on resize, so\n // the identity-keyed cache rebuilds against the live target. The params\n // buffer is also a key so a device recovery cannot retain a bind group\n // pointing at the retired resource.\n const fxaaBglLayout = pipelineState.perPassResources.fxaaBindGroupLayout;\n const fxaaSampler = pipelineState.perPassResources.fxaaSampler;\n const fxaaBg = getOrCreateFromChain(\n c.frameState.postProcessBgCache,\n [inputView, fxaaParams],\n 'fxaa',\n () => {\n const fxaaBgRes = runtime.device.createBindGroup({\n label: 'fxaa-bg',\n layout: fxaaBglLayout,\n entries: [\n {\n binding: 0,\n resource: {\n kind: 'textureView',\n value: inputView,\n },\n },\n {\n binding: 1,\n resource: { kind: 'sampler', value: fxaaSampler },\n },\n {\n binding: 2,\n resource: { kind: 'buffer', value: { buffer: fxaaParams } },\n },\n ],\n });\n if (!fxaaBgRes.ok) throw fxaaBgRes.error;\n return fxaaBgRes.value;\n },\n c.bindGroupCounts,\n );\n\n const fxaaColorFormat = runtime.device.caps.storageBuffer\n ? pipelineState.format\n : pipelineState.colorAttachmentFormat;\n let fxaaPass = graphPass;\n if (fxaaPass === undefined) {\n const fxaaOutputView = runtime.device.createTextureView(currentTexture, {\n format: fxaaColorFormat as GPUTextureFormat,\n });\n if (!fxaaOutputView.ok) {\n runtime.errorRegistry.fire(fxaaOutputView.error);\n return;\n }\n fxaaPass = encoder.beginRenderPass(\n buildBeginRenderPassDescriptor(\n {\n colorFormats: [fxaaColorFormat as GPUTextureFormat],\n depthFormat: undefined,\n sampleCount: 1,\n },\n { colorViews: [fxaaOutputView.value] },\n 'fxaa',\n ) as never,\n );\n }\n fxaaPass.setPipeline(pipelineState.perPassResources.fxaaPipeline);\n fxaaPass.setBindGroup(0, fxaaBg);\n fxaaPass.draw(3, 1, 0, 0);\n if (graphPass === undefined) fxaaPass.end();\n }\n}\n","// @forgeax/engine-runtime - FullscreenPostProcessPass primitive\n// (feat-20260604-resource-owning-render-graph-and-fullscreen-postpr M2 / w13).\n//\n// A declarative fullscreen post-process pass that:\n// - Uses the `fullscreen_triangle` vertex shader (common.wgsl:194, SSOT — not rewritten)\n// - Supports optional params UBO (FXAA has no params, tonemap has params — plan-strategy D-4 /\n// Finding M2-1)\n// - Auto-builds: input-texture BGL, pipeline, offscreen RT, ViewTarget ping-pong (KB-2),\n// and swap-chain non-srgb storage view write (R-COLORSPACE)\n// - Reads input texture, writes to declared color target with fullscreen 3-vertex draw\n//\n// Registered through the feature host ({source, params, reads?}) — a parallel\n// channel to installMaterialArtifact (D-4: material shader = 4-BGL / 12-float vertex / depth /\n// triangle-list; fullscreen post-process = 0 vertex buffer / no depth / input-texture BGL).\n\nimport type {\n BindGroup,\n BindGroupLayout,\n Buffer,\n RhiDevice,\n RhiError,\n RhiRenderPassEncoder,\n Sampler,\n TextureView,\n} from '@forgeax/engine-rhi';\nimport { GPU_SHADER_STAGE_FRAGMENT } from './gpu-stage';\nimport type { BglKind } from './pipeline-spec';\nimport { buildBindGroupLayoutDescriptor, type PipelineSpec } from './pipeline-spec';\n\n// Default fullscreen-post spec stub. The dispatcher's 'fullscreen-post' arm\n// reads spec.attachments.depthFormat / colorFormats[0] to derive the texture\n// binding's sampleType (R3 fix). Default colorFormats=['rgba16float'] gives\n// the historical 'float' / 'filtering' shape preserved across all existing\n// post-process call sites.\nconst FULLSCREEN_DEFAULT_SPEC: PipelineSpec = Object.freeze({\n shader: { id: '', passKind: 'forward', variantSet: undefined },\n attachments: {\n colorFormats: ['rgba16float'] as readonly GPUTextureFormat[],\n depthFormat: undefined,\n sampleCount: 1,\n },\n geometry: { topology: 'triangle-list', vertexLayout: {} },\n renderState: undefined,\n}) as PipelineSpec;\n\n// ─── Post-process read sample type union ─────────────────────────────────\n\n/**\n * Declared sample type for a post-process read entry.\n *\n * Closed union (plan-strategy D-7): only `'depth'` is an explicit sampleType\n * discriminant; color inputs are the default (bare `string` or un-suffixed\n * `{ key }`). Future texture types (`r32float`, etc.) are add-only.\n *\n * AI-user affordance: IDE autocomplete exposes `'depth'` at the register call\n * site; misspellings are caught by the type system (AC-08).\n */\nexport type PostProcessReadSampleType = 'depth';\n\n// ─── Post-process shader entry (owned by the fullscreen feature host) ──────\n\n/**\n * A fullscreen post-process shader entry owned by the feature host.\n *\n * Analogous to MaterialShaderEntry in the ShaderCatalog but with post-process-specific\n * fields: the input-texture + sampler BGL is auto-built by the primitive,\n * no paramSchema (params are passed inline via a {type, value} struct — plan-strategy D-4).\n *\n * `params` carries the WGSL struct definition + default value. When `params` is\n * `undefined`, the post-process shader has no params UBO. Special graph-owned\n * passes such as FXAA may still register an internal policy UBO separately.\n *\n * `reads` declares graph resource keys this pass samples as input texture(s).\n * If omitted, the pass samples the swap-chain color attachment (default path).\n *\n * Structured reads (plan-strategy D-1): each entry can be a bare string\n * (backward-compatible color input) or an object `{ key, sampleType? }`.\n * When `sampleType` is `'depth'`, the dispatcher resolves a depth-only view\n * and binds it at depthTex@3 / depthSampler@4 in the fullscreen bind group.\n */\nexport interface PostProcessShaderEntry {\n /** Composed WGSL source for the fragment stage (post-naga_oil). */\n readonly source: string;\n /** Fragment entry point selected by the typed graph; defaults to `fs_main`. */\n readonly fragmentEntryPoint?: string | undefined;\n /**\n * Params UBO schema. When undefined, the generic shader has no uniform buffer\n * and the BGL degrades to 2 entries (texture@0 + sampler@1). When present, the\n * primitive eager-creates a params UBO (at register, sized `byteSize`) and binds\n * it at bindgroup(1) binding(2) as part of a 3-entry BGL\n * (texture@0 + sampler@1 + buffer@2). feat-20260621 M-A2 / D-2.\n */\n readonly params?: PostProcessParamsSchema | undefined;\n /**\n * Graph resource keys this post-process reads (as input textures).\n * The primitive binds the first read as its input texture at @group(1)\n * @binding(0) (the sampler is @group(1) @binding(1); group 0 is reserved for a\n * future view bind group — dispatchFullscreenPass calls setBindGroup(1, ...)).\n * When empty or omitted, the pass reads the swap-chain directly.\n *\n * Each entry is either a bare string (backward-compatible color input) or an\n * object `{ key: string; sampleType?: PostProcessReadSampleType }` for typed\n * reads (e.g. `{ key: 'depth', sampleType: 'depth' }` for depth sampling).\n * Bare strings and `{ key }` without `sampleType` are equivalent — both\n * represent a color input (plan-strategy D-1 / D-7).\n */\n readonly reads?: readonly (string | PostProcessReadEntry)[] | undefined;\n}\n\nfunction postProcessSourceDigest(source: string): string {\n let first = 0x811c9dc5;\n let second = 0x9e3779b9;\n for (let index = 0; index < source.length; index += 1) {\n const code = source.charCodeAt(index);\n first = Math.imul(first ^ code, 0x01000193);\n second = Math.imul(second ^ (code + index), 0x01000193);\n }\n return `${source.length.toString(16)}-${(first >>> 0).toString(16).padStart(8, '0')}-${(second >>> 0).toString(16).padStart(8, '0')}`;\n}\n\n/** Content-addressed PSO label shared by the post-process pipeline factory. */\nexport function postProcessShaderPipelineLabel(identity: string, source: string): string {\n return `post-process-${identity}-pso-${postProcessSourceDigest(source)}`;\n}\n\n/** Content-addressed shader-module label shared by prewarm and lazy paths. */\nexport function postProcessShaderModuleLabel(identity: string, source: string): string {\n return `${postProcessShaderPipelineLabel(identity, source)}-module`;\n}\n\n/**\n * Stable declaration identity used by graph admission and the renderer's\n * device-bound pipeline cache. Shader source, bind-group-affecting params,\n * and graph reads must move together when a feature reuses its identity.\n */\nexport function postProcessShaderEntrySignature(entry: PostProcessShaderEntry): string {\n return JSON.stringify({\n source: entry.source,\n fragmentEntryPoint: entry.fragmentEntryPoint,\n params:\n entry.params === undefined\n ? undefined\n : {\n byteSize: entry.params.byteSize,\n defaultValue: Array.from(entry.params.defaultValue),\n },\n reads: entry.reads,\n });\n}\n\n/** Whether a feature binding opts into the temporal multi-read contract. */\nexport function isTemporalFullscreenBinding(values: Readonly<Record<string, unknown>>): boolean {\n return (\n values.temporal !== undefined ||\n values.shader === 'forgeax.taa-resolve' ||\n values.shader === 'forgeax.motion-blur'\n );\n}\n\n/**\n * Structured read entry for a post-process shader.\n *\n * `key` is the graph resource key (matching a graph color target).\n * `sampleType` is an optional type discriminant (D-1 SSOT); when omitted\n * the entry is treated as a color input (same as a bare string).\n */\nexport interface PostProcessReadEntry {\n readonly key: string;\n readonly sampleType?: PostProcessReadSampleType | undefined;\n}\n\n/**\n * Params schema: the WGSL struct definition + default byte array for a post-process\n * UBO. The primitive allocates a GPU buffer of `byteSize` and uploads `defaultValue`\n * at register time; the UBO is then updated per-frame via the data-driven\n * `PostProcessParams` ECS component (component `data` -> extract snapshot ->\n * dispatchFullscreenPass `queue.writeBuffer`), NOT via an imperative setter.\n * feat-20260621 M-A1/M-A2 / D-1.\n */\nexport interface PostProcessParamsSchema {\n /** Byte size of the WGSL params struct (must be UBO-aligned, min 16 B). */\n readonly byteSize: number;\n /** Default UBO contents (length must equal `byteSize`). */\n readonly defaultValue: Uint8Array;\n}\n\n// ─── Context passed to typed fullscreen feature injectors ─────────────────\n\n/**\n * The minimal surface a `registerFullscreenPostProcess` injector receives.\n * Contains the RHI device (for creating BGLs / pipelines / samplers) and the\n * error registry for structured failure reporting.\n */\nexport interface FullscreenPostProcessDeviceContext {\n readonly device: RhiDevice;\n readonly errorRegistry: {\n fire(error: RhiError): void;\n };\n}\n\n// ─── Built-in fullscreen post-process BGL + pipeline state ───────────────\n\n// Fullscreen bind-group layout: a single input-texture binding (0) +\n// a single sampler binding (1). The descriptor SSOT moved to\n// buildBindGroupLayoutDescriptor(spec, { kind: 'fullscreen-post' }) in\n// pipeline-spec.ts (D-13 round-2).\n//\n// Historical context: this BGL was duplicated across recordFxaaPass +\n// register-default-post-process before convergence (feat-20260609 framebuffers\n// demo M5R2 / T-12-a). R3 historical bug: the descriptor wrote sampleType:\n// 'float' for every input including depth32float views, tripping wgpu's\n// Filtering sampler vs UnfilterableFloat / Depth texture static-sample-pair\n// validation. The dispatcher derives sampleType from spec.attachments\n// (depth32float -> 'depth' + 'comparison' sampler; r32float ->\n// 'unfilterable-float'; else -> 'float' + 'filtering').\n\n/**\n * Create a linear clamp-to-edge sampler — reused across all fullscreen passes\n * (identical to the recordFxaaPass sampler).\n */\nfunction createFullscreenSampler(device: RhiDevice): Sampler | null {\n const res = device.createSampler({\n addressModeU: 'clamp-to-edge',\n addressModeV: 'clamp-to-edge',\n magFilter: 'linear',\n minFilter: 'linear',\n });\n if (!res.ok) return null;\n return res.value;\n}\n\n/**\n * Create a non-filtering depth sampler for post-process passes that read the\n * camera scene depth (plan-strategy D-2: nearest + clamp-to-edge).\n * Aligns with the SSAO depth sampler shape (render-graph-primitives.ts:634-647)\n * — NOT a comparison sampler (D-2 rejects comparison because the post-process\n * shader reads raw depth values via `textureSampleLevel`, not PCF shadow lookup).\n */\nfunction createDepthSampler(device: RhiDevice): Sampler | null {\n const res = device.createSampler({\n magFilter: 'nearest',\n minFilter: 'nearest',\n addressModeU: 'clamp-to-edge',\n addressModeV: 'clamp-to-edge',\n });\n if (!res.ok) return null;\n return res.value;\n}\n\n/**\n * Check whether the entry's {@link PostProcessShaderEntry.reads} declares a read\n * with `sampleType: 'depth'`. Used by {@link buildFullscreenPostProcessPass} to\n * select between the single-sample and multisample depth BGL variants and the\n * existing color-only kinds.\n */\nexport function entryHasDepthRead(entry: PostProcessShaderEntry): boolean {\n if (!entry.reads) return false;\n return entry.reads.some((r) => typeof r !== 'string' && r.sampleType === 'depth');\n}\n\n/**\n * Byte size of the minimal params UBO auto-allocated for a depth-reading entry\n * that declares no `params`. The `'fullscreen-post-with-scene-depth'` BGL always\n * declares `params@2`, so a bound UBO must exist even when the shader has no\n * user params (plan D-3: param-less depth effect gets a minimal 16B UBO). 16 B\n * is WebGPU's minimum uniform-buffer binding size.\n */\nexport const DEPTH_MIN_PARAMS_BYTE_SIZE = 16;\n\n// ─── Public: register / build a fullscreen post-process pass ─────────────\n\n/**\n * State of a registered fullscreen post-process pass.\n *\n * Created by the typed fullscreen feature graph and stored per-pass in the render system.\n * The `draw` method is called by the per-frame execute closure.\n */\nexport interface FullscreenPostProcessPassHandle {\n /** The pass name (same as the `color` target key). */\n readonly name: string;\n /** Execute one fullscreen draw: bind input texture, set pipeline, draw 3 vertices. */\n draw(encoder: RhiRenderPassEncoder, inputView: TextureView): void;\n /**\n * The per-frame params UBO this pass binds at group(1) binding(2), or null\n * when `entry.params === undefined` (param-less consumer, 2-entry BGL). The\n * dispatcher writes the snapshot bytes into it before draw and composes it\n * into the bind group via {@link createFullscreenBindGroup}.\n */\n readonly paramsBuffer: Buffer | null;\n}\n\n/**\n * Build a fullscreen post-process pass primitive.\n *\n * Creates BGL, sampler, and pipeline state from the registered shader entry.\n * Returns the pass handle + the BGL + the sampler so the caller can compose\n * bind groups. The BGL + sampler are shared across instances of the same shader.\n *\n * @returns The BGL, sampler, and a factory to create pass handles.\n */\nexport function buildFullscreenPostProcessPass(\n ctx: FullscreenPostProcessDeviceContext,\n entry: PostProcessShaderEntry,\n depthMultisampled = false,\n): {\n bindGroupLayout: BindGroupLayout;\n sampler: Sampler | null;\n depthSampler: Sampler | null;\n extraColorBindings: readonly number[];\n createHandle: (\n name: string,\n pipeline: unknown,\n paramsBuffer: Buffer | null,\n ) => FullscreenPostProcessPassHandle;\n} | null {\n const { device } = ctx;\n\n // Step 1: BGL (input texture + sampler [+ params buffer] [+ depth]).\n // D-13 round-2: route through dispatcher; sampleType derives from\n // spec.attachments (R3 fix). Default spec yields the historical 'float'\n // / 'filtering' shape for color inputs.\n // feat-20260621 D-2: when entry.params is present the BGL is the 3-entry\n // 'fullscreen-post-with-params' kind (adds buffer@2 uniform); otherwise the\n // 2-entry 'fullscreen-post' kind (param-less zero-regression, R-A7).\n // plan-strategy D-3: when entry.reads declares sampleType:'depth', use the\n // 5-entry scene-depth kind; depthMultisampled selects its multisampled\n // texture variant for a 4-sample scene target. params@2 is always present to\n // avoid 2x2 kind explosion.\n const hasDepth = entryHasDepthRead(entry);\n const bglKind: BglKind = hasDepth\n ? depthMultisampled\n ? 'fullscreen-post-with-scene-depth-msaa'\n : 'fullscreen-post-with-scene-depth'\n : entry.params !== undefined\n ? 'fullscreen-post-with-params'\n : 'fullscreen-post';\n const descriptor = buildBindGroupLayoutDescriptor(FULLSCREEN_DEFAULT_SPEC, { kind: bglKind });\n const colorReads = (entry.reads ?? []).filter(\n (read) => typeof read === 'string' || read.sampleType !== 'depth',\n );\n const extraColorCount = Math.max(0, colorReads.length - 1);\n const firstExtraBinding = hasDepth ? 5 : entry.params === undefined ? 2 : 3;\n for (let index = 0; index < extraColorCount; index += 1) {\n descriptor.entries.push({\n binding: firstExtraBinding + index,\n visibility: GPU_SHADER_STAGE_FRAGMENT,\n texture: { sampleType: 'float', viewDimension: '2d' },\n });\n }\n const bglRes = device.createBindGroupLayout(descriptor);\n if (!bglRes.ok) {\n ctx.errorRegistry.fire(bglRes.error);\n return null;\n }\n\n // Step 2: Samplers.\n const sampler = createFullscreenSampler(device);\n const depthSampler = hasDepth ? createDepthSampler(device) : null;\n\n return {\n bindGroupLayout: bglRes.value,\n sampler,\n depthSampler,\n extraColorBindings: Object.freeze(\n Array.from({ length: extraColorCount }, (_, index) => firstExtraBinding + index),\n ),\n createHandle: (name, pipeline, paramsBuffer) => ({\n name,\n paramsBuffer,\n draw(encoder, _inputView) {\n encoder.setPipeline(pipeline as never);\n // The bind group is composed per-frame by the record stage (mirrors\n // recordFxaaPass's lazy bindgroup compose in render-system-record.ts).\n // This draw() method only sets the pipeline — the caller is responsible\n // for bind group composition + setBindGroup before calling draw().\n encoder.draw(3, 1, 0, 0);\n },\n }),\n };\n}\n\n/**\n * Create a fullscreen bind group (lazy, per-frame). Composes the input texture\n * view + the linear sampler into group(1) (texture@0 + sampler@1). When\n * `paramsBuffer` is supplied (feat-20260621 D-2: `entry.params !== undefined`),\n * appends the per-frame params UBO at binding 2 (uniform), matching the 3-entry\n * `'fullscreen-post-with-params'` BGL. Omitting it yields the 2-entry shape\n * param-less consumers degrade to (R-A7).\n *\n * When `depthTexView` + `depthSampler` are supplied (plan-strategy D-3:\n * depth reads present), appends the depth texture view at binding 3 and the\n * non-filtering depth sampler at binding 4, matching the 5-entry\n * `'fullscreen-post-with-scene-depth'` BGL. Both must be supplied together\n * (or both omitted for existing color-only consumers — AC-03 zero-regression).\n */\nexport function createFullscreenBindGroup(\n device: RhiDevice,\n bgl: BindGroupLayout,\n inputView: TextureView,\n sampler: Sampler | null,\n paramsBuffer?: Buffer | null,\n depthTexView?: TextureView | null,\n depthSampler?: Sampler | null,\n additionalViews: readonly { readonly binding: number; readonly view: TextureView }[] = [],\n): BindGroup | null {\n const entries: { binding: number; resource: { kind: string; value: unknown } }[] = [\n { binding: 0, resource: { kind: 'textureView', value: inputView } },\n ];\n if (sampler) {\n entries.push({ binding: 1, resource: { kind: 'sampler', value: sampler } });\n }\n if (paramsBuffer) {\n // RHI buffer binding resource is `{ kind: 'buffer', value: { buffer } }` —\n // the nested `{ buffer }` wrapper is the GPUBufferBinding shape dawn expects\n // (mirrors createRenderer's shadow-probe UBO bindings). Passing the raw\n // handle as `value` makes dawn reject createBindGroup (\"no overload matched\n // ... member 'resource' for array element 2\").\n entries.push({ binding: 2, resource: { kind: 'buffer', value: { buffer: paramsBuffer } } });\n }\n if (depthTexView && depthSampler) {\n entries.push({ binding: 3, resource: { kind: 'textureView', value: depthTexView } });\n entries.push({ binding: 4, resource: { kind: 'sampler', value: depthSampler } });\n }\n for (const additional of additionalViews) {\n entries.push({\n binding: additional.binding,\n resource: { kind: 'textureView', value: additional.view },\n });\n }\n const res = device.createBindGroup({\n label: 'fullscreen-post-process-bg',\n layout: bgl,\n entries: entries as never,\n });\n if (!res.ok) return null;\n return res.value;\n}\n","// @forgeax/engine-render - low-level record/encode graph primitives.\n//\n// Standard owns pass topology through typed-render-graph-primitives. This module\n// retains the RHI-facing record helpers used by that typed graph: SSAO record\n// closures, fullscreen dispatch, depth resolution, and encoding.\n//\n// Public graph assembly does not depend on legacy add* wrappers.\nimport { mat4 } from '@forgeax/engine-math';\nimport type { ResolveContext } from '@forgeax/engine-render-graph';\nimport type {\n Buffer,\n RhiRenderPassEncoder,\n Sampler,\n Texture,\n TextureFormat,\n TextureView,\n} from '@forgeax/engine-rhi';\nimport { RhiError } from '@forgeax/engine-rhi';\nimport {\n buildFullscreenPostProcessPass,\n createFullscreenBindGroup,\n entryHasDepthRead,\n} from './fullscreen-post-process-pass';\nimport { buildBeginRenderPassDescriptor } from './pipeline-spec';\nimport { PostProcessError } from './post-process-errors';\nimport { computeProjectionMatrix, computeViewMatrix } from './record/helpers';\nimport { getOrCreateFromChain } from './record/mesh-ssbo';\nimport type { _InternalRenderPipelineContext } from './record/render-context';\nimport { recordFxaaPass } from './record/skybox-post-pass';\nimport type { RenderPipelineContext } from './render-contract';\nimport { getOrCreateSsaoBuffers, getOrCreateSsaoFallbackTexture } from './ssao-buffers';\nimport { getSsaoParameters, SSAO_SAMPLE_COUNTS } from './ssao-config';\n\ntype DepthResolutionContext = Pick<_InternalRenderPipelineContext, 'runtime'> & {\n readonly frameState: {\n readonly perFrameGraph?: {\n readonly getColorTargetTexture: (key: string) => Texture | undefined;\n } | null;\n };\n};\n\ntype RenderGraphRecordContext = _InternalRenderPipelineContext & {\n readonly frameState: _InternalRenderPipelineContext['frameState'] & {\n readonly perFrameGraph?: {\n readonly getColorTargetDescriptor: (\n key: string,\n ) => { readonly format: TextureFormat } | undefined;\n readonly getColorTargetView: (key: string) => TextureView | undefined;\n readonly getColorTargetTexture: (key: string) => Texture | undefined;\n } | null;\n };\n};\n\nfunction requireRenderGraphRecordContext(ctx: RenderPipelineContext): RenderGraphRecordContext {\n if (!('frameState' in ctx) || !('bindGroupCounts' in ctx) || !('geometryDepthKey' in ctx)) {\n throw new Error('typed render graph frame lacks the built-in record context');\n }\n return ctx as RenderGraphRecordContext;\n}\n\n/**\n * Resolve a depth-only view of a graph color target by key.\n *\n * On dawn the BindGroup validation rejects a default-view (aspect=all on a\n * depth+stencil texture) with \"Multiple aspects (Depth|Stencil) selected\".\n * A separate createTextureView({aspect:'depth-only'}) is required.\n *\n * @param internals - internal render pipeline context\n * @param key - graph color-target key to resolve depth from\n * @param label - debug label for the depth-only TextureView\n * @returns a depth-only TextureView, or null if the graph / texture is absent\n * or creation fires a structured error\n */\nexport function resolveDepthOnlyView(\n internals: DepthResolutionContext,\n key: string,\n label: string,\n preferredKey?: string | null,\n): TextureView | null {\n const graph = internals.frameState.perFrameGraph;\n if (graph === null || graph === undefined) return null;\n const preferredTexture =\n preferredKey === null || preferredKey === undefined\n ? undefined\n : graph.getColorTargetTexture(preferredKey);\n const tex = preferredTexture ?? graph.getColorTargetTexture(key);\n if (tex === undefined) return null;\n const res = internals.runtime.device.createTextureView(tex as never, {\n label,\n dimension: '2d',\n aspect: 'depth-only',\n baseMipLevel: 0,\n mipLevelCount: 1,\n baseArrayLayer: 0,\n arrayLayerCount: 1,\n });\n if (!res.ok) {\n internals.runtime.errorRegistry.fire(res.error);\n return null;\n }\n return res.value;\n}\n\n/**\n * Resolve a depth-only view of the graph's hdrDepth texture.\n *\n * Thin delegate to {@link resolveDepthOnlyView} (plan-strategy D-5: extract\n * the shared depth-only view helper, SSAO delegates). Behaviour is byte-identical\n * to the pre-extraction inline version. The SSAO BGL / bindings / sampler are\n * untouched (OOS-4).\n */\nfunction resolveHdrDepthDepthOnlyView(\n internals: DepthResolutionContext,\n hdrDepthKey: string,\n): TextureView | null {\n return resolveDepthOnlyView(internals, hdrDepthKey, 'ssao-hdr-depth-only-view');\n}\n\nfunction ensureSsaoRecordCompanions(internals: _InternalRenderPipelineContext): {\n filteringSampler: Sampler;\n depthSampler: Sampler;\n fallbackRawView: TextureView;\n} | null {\n const pp = internals.pipelineState.perPassResources;\n if (\n pp.ssaoFilteringSampler !== null &&\n pp.ssaoDepthSampler !== null &&\n pp.ssaoFallbackRawView !== null\n ) {\n return {\n filteringSampler: pp.ssaoFilteringSampler,\n depthSampler: pp.ssaoDepthSampler,\n fallbackRawView: pp.ssaoFallbackRawView as TextureView,\n };\n }\n\n const device = internals.runtime.device;\n\n if (pp.ssaoFilteringSampler === null) {\n // Despite the field name, this sampler is non-filtering (NEAREST):\n // bindings 3 (noise sampler) + 8 (ssaoSampler) pair with unfilterable\n // float textures (rgba32float noise / r8unorm ssaoRaw on dawn without\n // float32-filterable). The \"filtering\" label in the field name predates\n // the sampler-type split; the resource itself is non-filtering.\n const res = device.createSampler({\n label: 'ssao-noise-sampler',\n magFilter: 'nearest',\n minFilter: 'nearest',\n mipmapFilter: 'nearest',\n addressModeU: 'repeat',\n addressModeV: 'repeat',\n });\n if (!res.ok) {\n internals.runtime.errorRegistry.fire(res.error);\n return null;\n }\n pp.ssaoFilteringSampler = res.value;\n }\n\n if (pp.ssaoDepthSampler === null) {\n const res = device.createSampler({\n label: 'ssao-depth-sampler',\n magFilter: 'nearest',\n minFilter: 'nearest',\n mipmapFilter: 'nearest',\n addressModeU: 'clamp-to-edge',\n addressModeV: 'clamp-to-edge',\n });\n if (!res.ok) {\n internals.runtime.errorRegistry.fire(res.error);\n return null;\n }\n pp.ssaoDepthSampler = res.value;\n }\n\n if (pp.ssaoFallbackRawView === null) {\n const fb = getOrCreateSsaoFallbackTexture(internals.runtime);\n if (fb === null) return null;\n pp.ssaoFallbackRawView = fb.view;\n }\n\n return {\n filteringSampler: pp.ssaoFilteringSampler,\n depthSampler: pp.ssaoDepthSampler,\n fallbackRawView: pp.ssaoFallbackRawView as TextureView,\n };\n}\n\n/**\n * Pack the 256B SSAO uniform payload from the camera + config.ssao.\n *\n * Layout (plan-strategy D-1 + D-C):\n * floats [0..15] view mat4\n * floats [16..31] projection mat4\n * floats [32..47] inverseProjection mat4\n * floats [48..51] intensityPad vec4 (x=intensity, y=radius, z=bias)\n * floats [52..63] trailing zero-pad to round to 256B / 64f UBO alignment.\n */\nfunction buildSsaoUniformPayload(internals: _InternalRenderPipelineContext): Float32Array {\n const { camera, frameState } = internals;\n const sProj = computeProjectionMatrix(camera);\n if (camera.temporal?.currentJitterUv !== undefined) {\n const jitter = mat4.identity(mat4.create());\n jitter[12] = camera.temporal.currentJitterUv[0] * 2;\n jitter[13] = camera.temporal.currentJitterUv[1] * -2;\n mat4.multiply(sProj, jitter, sProj);\n }\n const sView = computeViewMatrix(camera);\n const invProj = mat4.create();\n mat4.invert(invProj, sProj);\n\n const out = new Float32Array(64);\n out.set(sView, 0);\n out.set(sProj, 16);\n out.set(invProj, 32);\n\n const ssaoConfig = frameState.installedPipelineConfig?.ssao;\n const parameters = getSsaoParameters(\n ssaoConfig !== undefined && ssaoConfig.enabled === true ? ssaoConfig : undefined,\n );\n out[48] = parameters.intensity;\n out[49] = parameters.radius;\n out[50] = parameters.bias;\n out[51] = SSAO_SAMPLE_COUNTS[parameters.quality];\n return out;\n}\n\n/**\n * recordSsaoCalcPass — fullscreen SSAO occlusion calculation (M8 / w38).\n *\n * Resolves the graph-owned half-resolution ssaoRaw color target, writes the\n * 256 B SSAO uniform (view/proj/invProj/intensity) once per frame, then runs\n * a 3-vertex fullscreen-triangle draw with fs_ssao_calc.\n *\n * Bind group entries (must match the 9-entry SSAO BGL declared in\n * createRenderer.ts; see hdrp-ssao.wgsl §BGL layout):\n * 0 ssao_uniform UBO 5 hdr_depth view\n * 1 ssao_kernel UBO 6 ssao_depth_sampler (non-filtering)\n * 2 ssao_noise_texture 7 fallback ssaoRaw view (calc never samples)\n * 3 ssao_noise_sampler 8 ssaoSampler (unused by calc, BGL slot)\n * 4 gbuffer_normal view\n *\n * Skips with no GPU work when the optional SSAO pipelines are unavailable\n * (manifest without hdrp-ssao.wgsl), when the dedicated BGL is null, when\n * the SSAO buffers fail to allocate, or when the graph cannot resolve the\n * required views.\n */\nexport interface SsaoCalcPassViews {\n readonly output: TextureView;\n readonly normal: TextureView;\n readonly depth: TextureView;\n readonly depthCacheKey: TextureView;\n}\n\nexport function recordSsaoCalcPass(\n _c: _InternalRenderPipelineContext,\n resolveCtx?: ResolveContext,\n ssaoRawKey?: string,\n gbuf0Key?: string,\n hdrDepthKey?: string,\n graphPass?: RhiRenderPassEncoder,\n graphViews?: SsaoCalcPassViews,\n): void {\n const { runtime, pipelineState, encoder } = _c;\n const pp = pipelineState.perPassResources;\n\n if (runtime.device.caps.backendKind === 'wgpu-webgl2') {\n throw new RhiError({\n code: 'feature-not-enabled',\n expected: 'SSAO raw depth sampling on a WebGPU-capable backend',\n hint: 'use WebGPU for SSAO or disable StandardProfile.ssao on the GLES fallback',\n });\n }\n if (pp.ssaoCalcPipeline === null || pp.ssaoBgl === null) {\n throw new PostProcessError({\n code: 'post-process-not-found',\n detail: { id: 'forgeax::post::ssao-calc' },\n });\n }\n if (graphViews === undefined && (resolveCtx === undefined || ssaoRawKey === undefined)) return;\n\n const ssaoRawView =\n graphViews?.output ?? (resolveCtx?.resolve(ssaoRawKey as string) as TextureView | undefined);\n const gbuf0View =\n graphViews?.normal ??\n (gbuf0Key !== undefined\n ? (resolveCtx?.resolve(gbuf0Key) as TextureView | undefined)\n : undefined);\n if (!ssaoRawView || !gbuf0View || (graphViews === undefined && hdrDepthKey === undefined)) return;\n\n // hdrDepth needs a depth-only view (BGL binding 5 sampleType=depth);\n // resolveCtx returns a default all-aspects view that dawn rejects when\n // paired with a depth sampler.\n const hdrDepthView = graphViews?.depth ?? resolveHdrDepthDepthOnlyView(_c, hdrDepthKey as string);\n if (hdrDepthView === null) return;\n\n // Cache key: the graph's pooled hdrDepth view (stable object per size, new\n // object on resize). The depth-only view above is created fresh every frame\n // so it cannot key the cache; the pooled all-aspects view co-varies with it\n // (both are views of the same transient hdrDepth texture) and changes exactly\n // on resize. Used only as a WeakMap key, never bound.\n const hdrDepthPooledView =\n graphViews?.depthCacheKey ??\n (resolveCtx?.resolve(hdrDepthKey as string) as TextureView | undefined);\n if (hdrDepthPooledView === undefined) return;\n\n const ssaoBufs = getOrCreateSsaoBuffers(runtime);\n if (ssaoBufs === null) return;\n\n const noiseViewRes = runtime.device.createTextureView(ssaoBufs.noiseTexture, {\n label: 'hdrp-ssao-noise-view',\n format: 'rgba32float',\n dimension: '2d',\n aspect: 'all',\n baseMipLevel: 0,\n mipLevelCount: 1,\n baseArrayLayer: 0,\n arrayLayerCount: 1,\n });\n if (!noiseViewRes.ok) {\n runtime.errorRegistry.fire(noiseViewRes.error);\n return;\n }\n\n const companions = ensureSsaoRecordCompanions(_c);\n if (companions === null) return;\n\n // Per-frame uniform write (D-C: view+proj+invProj+intensity at one queue\n // call). 256 B Float32Array (64 f32) lands in ssao_uniform UBO offset 0.\n const payload = buildSsaoUniformPayload(_c);\n const writeRes = runtime.device.queue.writeBuffer(ssaoBufs.uniformBuffer, 0, payload);\n if (!writeRes.ok) {\n runtime.errorRegistry.fire(writeRes.error);\n return;\n }\n\n // Identity-cached bind group: 9 entries mirror the BGL declared in\n // createRenderer. Keyed on the graph-pooled gbuf0 + hdrDepth views (both\n // retire + reallocate on resize), so the WeakMap misses after a resize and\n // rebuilds against the live textures. The noise / depth-only views bound\n // below are created fresh each frame but back stable textures; keying on the\n // resize-varying graph views is what makes invalidation correct. Replaces\n // the prior `=== null` slot cache that submitted a destroyed gbuf0/hdrDepth\n // after resize.\n const ssaoBgl = pp.ssaoBgl;\n const bindGroup = getOrCreateFromChain(\n _c.frameState.postProcessBgCache,\n [gbuf0View, hdrDepthPooledView],\n 'ssao-calc',\n () => {\n const bgRes = runtime.device.createBindGroup({\n label: 'ssao-calc-bg',\n layout: ssaoBgl,\n entries: [\n { binding: 0, resource: { kind: 'buffer', value: { buffer: ssaoBufs.uniformBuffer } } },\n { binding: 1, resource: { kind: 'buffer', value: { buffer: ssaoBufs.kernelBuffer } } },\n { binding: 2, resource: { kind: 'textureView', value: noiseViewRes.value } },\n {\n binding: 3,\n resource: { kind: 'sampler', value: companions.filteringSampler },\n },\n { binding: 4, resource: { kind: 'textureView', value: gbuf0View } },\n { binding: 5, resource: { kind: 'textureView', value: hdrDepthView } },\n { binding: 6, resource: { kind: 'sampler', value: companions.depthSampler } },\n { binding: 7, resource: { kind: 'textureView', value: companions.fallbackRawView } },\n { binding: 8, resource: { kind: 'sampler', value: companions.filteringSampler } },\n ],\n });\n if (!bgRes.ok) throw bgRes.error;\n return bgRes.value;\n },\n _c.bindGroupCounts,\n );\n\n const pass: RhiRenderPassEncoder =\n graphPass ??\n encoder.beginRenderPass(\n buildBeginRenderPassDescriptor(\n { colorFormats: ['r8unorm'], depthFormat: undefined, sampleCount: 1 },\n { colorViews: [ssaoRawView] },\n 'post-process',\n ) as never,\n );\n pass.setPipeline(pp.ssaoCalcPipeline);\n pass.setBindGroup(0, bindGroup);\n pass.draw(3, 1, 0, 0);\n if (graphPass === undefined) pass.end();\n}\n\n/**\n * recordSsaoBlurPass — fullscreen SSAO 4x4 box blur (M8 / w38).\n *\n * Reads the half-resolution ssaoRaw (R8), applies a 16-tap box blur, writes\n * the blurred result to ssaoBlurred. The BGL is the same 9-entry SSAO BGL\n * as the calc pass; the only difference is binding 7 carries the real\n * ssaoRaw view (vs the 1x1 fallback the calc pass binds).\n */\nexport interface SsaoBlurPassViews extends SsaoCalcPassViews {\n readonly raw: TextureView;\n}\n\nexport function recordSsaoBlurPass(\n _c: _InternalRenderPipelineContext,\n resolveCtx?: ResolveContext,\n ssaoBlurredKey?: string,\n ssaoRawKey?: string,\n gbuf0Key?: string,\n hdrDepthKey?: string,\n graphPass?: RhiRenderPassEncoder,\n graphViews?: SsaoBlurPassViews,\n): void {\n const { runtime, pipelineState, encoder } = _c;\n const pp = pipelineState.perPassResources;\n\n if (pp.ssaoBlurPipeline === null || pp.ssaoBgl === null) {\n throw new PostProcessError({\n code: 'post-process-not-found',\n detail: { id: 'forgeax::post::ssao-blur' },\n });\n }\n if (\n graphViews === undefined &&\n (resolveCtx === undefined || ssaoBlurredKey === undefined || ssaoRawKey === undefined)\n )\n return;\n\n const ssaoBlurredView =\n graphViews?.output ??\n (resolveCtx?.resolve(ssaoBlurredKey as string) as TextureView | undefined);\n const ssaoRawView =\n graphViews?.raw ?? (resolveCtx?.resolve(ssaoRawKey as string) as TextureView | undefined);\n const gbuf0View =\n graphViews?.normal ??\n (gbuf0Key !== undefined\n ? (resolveCtx?.resolve(gbuf0Key) as TextureView | undefined)\n : undefined);\n if (!ssaoBlurredView || !ssaoRawView) return;\n\n // hdrDepth depth-only view (see recordSsaoCalcPass).\n const hdrDepthView =\n graphViews?.depth ??\n (hdrDepthKey !== undefined ? resolveHdrDepthDepthOnlyView(_c, hdrDepthKey) : null);\n // Pooled hdrDepth view for the cache key (the depth-only view above is\n // recreated every frame; see recordSsaoCalcPass).\n const hdrDepthPooledView =\n graphViews?.depthCacheKey ??\n (hdrDepthKey !== undefined\n ? (resolveCtx?.resolve(hdrDepthKey) as TextureView | undefined)\n : undefined);\n\n const ssaoBufs = getOrCreateSsaoBuffers(runtime);\n if (ssaoBufs === null) return;\n\n const noiseViewRes = runtime.device.createTextureView(ssaoBufs.noiseTexture, {\n label: 'hdrp-ssao-noise-view',\n format: 'rgba32float',\n dimension: '2d',\n aspect: 'all',\n baseMipLevel: 0,\n mipLevelCount: 1,\n baseArrayLayer: 0,\n arrayLayerCount: 1,\n });\n if (!noiseViewRes.ok) {\n runtime.errorRegistry.fire(noiseViewRes.error);\n return;\n }\n\n const companions = ensureSsaoRecordCompanions(_c);\n if (companions === null) return;\n\n // The blur reads ssaoRaw via binding 7 + ssaoSampler at binding 8. The\n // remaining slots 0..6 are bound for BGL completeness (BGL is shared with\n // the calc pass): WebGPU requires every BGL slot carry a valid resource\n // even when the active fragment entry does not statically reference it.\n // gbuf0 + hdr_depth views are resolved from the graph; they must exist\n // because the typed SSAO graph declares them as reads on the blur node.\n if (gbuf0View === undefined || hdrDepthView === null || hdrDepthPooledView === undefined) return;\n // Identity-cached bind group keyed on the graph-pooled ssaoRaw + gbuf0 +\n // hdrDepth views (all retire + reallocate on resize). Replaces the prior\n // `=== null` slot cache that submitted destroyed transients after resize.\n const ssaoBgl = pp.ssaoBgl;\n const bindGroup = getOrCreateFromChain(\n _c.frameState.postProcessBgCache,\n [ssaoRawView, gbuf0View, hdrDepthPooledView],\n 'ssao-blur',\n () => {\n const bgRes = runtime.device.createBindGroup({\n label: 'ssao-blur-bg',\n layout: ssaoBgl,\n entries: [\n { binding: 0, resource: { kind: 'buffer', value: { buffer: ssaoBufs.uniformBuffer } } },\n { binding: 1, resource: { kind: 'buffer', value: { buffer: ssaoBufs.kernelBuffer } } },\n { binding: 2, resource: { kind: 'textureView', value: noiseViewRes.value } },\n {\n binding: 3,\n resource: { kind: 'sampler', value: companions.filteringSampler },\n },\n { binding: 4, resource: { kind: 'textureView', value: gbuf0View } },\n { binding: 5, resource: { kind: 'textureView', value: hdrDepthView } },\n { binding: 6, resource: { kind: 'sampler', value: companions.depthSampler } },\n { binding: 7, resource: { kind: 'textureView', value: ssaoRawView } },\n { binding: 8, resource: { kind: 'sampler', value: companions.filteringSampler } },\n ],\n });\n if (!bgRes.ok) throw bgRes.error;\n return bgRes.value;\n },\n _c.bindGroupCounts,\n );\n\n const pass: RhiRenderPassEncoder =\n graphPass ??\n encoder.beginRenderPass(\n buildBeginRenderPassDescriptor(\n { colorFormats: ['r8unorm'], depthFormat: undefined, sampleCount: 1 },\n { colorViews: [ssaoBlurredView] },\n 'post-process',\n ) as never,\n );\n pass.setPipeline(pp.ssaoBlurPipeline);\n pass.setBindGroup(0, bindGroup);\n pass.draw(3, 1, 0, 0);\n if (graphPass === undefined) pass.end();\n}\n\n/**\n * F-3 fix-up + feat-20260609 M1 / T-3 patch: per-frame fullscreen-post-process\n * dispatcher.\n *\n * Two-branch fan-out by shader id:\n * - `'fxaa'` (engine-built-in hardwire): delegate to `recordFxaaPass`. The\n * FXAA implementation owns its graph input view, surface output attachment,\n * pipeline cache, and bindgroup-resize invalidation; that mechanics is engine-internal and\n * not expressible through the generic public primitive. recordFxaaPass's\n * body is intentionally unchanged across this refactor to preserve the\n * AC-09 dualPassDiff=1069 (hello-fxaa) / 768 (learn-render-4-10-MSAA)\n * byte-equivalence with the pre-feat baseline.\n * - every other id (AI-user path): the M1 patch wires `reads[0]` through the\n * render-graph `resolveCtx` so the bind group samples the upstream\n * graph-owned color target (e.g. the typed scene pass writes `'offscreenColor'`,\n * a custom post-process pass declares `reads: ['offscreenColor']`).\n * Failure modes (charter P3 fail-fast):\n * - `lookupPostProcess(shader) === undefined` -> throw\n * `PostProcessError({code:'post-process-not-found'})`\n * - `reads.length > 0` but `resolveCtx.resolve(reads[0]) === undefined`\n * -> throw `PostProcessError({code:'fullscreen-input-not-found',\n * detail:{readsKey, passName}})`. AI users read err.detail.readsKey\n * to find the missing graph.addColorTarget declaration.\n * On success the dispatcher builds the input-texture BGL + sampler via\n * `buildFullscreenPostProcessPass`, composes the per-frame bind group\n * via `createFullscreenBindGroup`, opens a render pass writing the\n * declared `color` (resolved through the graph's color-target view, or\n * the swap-chain `ctx.view` when the graph has not allocated a target),\n * binds the input bind group at slot 1 (the 0 slot is reserved for\n * future view bind groups), and calls `handle.draw(pass)` which\n * internally does `setPipeline(pipeline)` + `draw(3, 1, 0, 0)` over the\n * fullscreen-triangle vertex shader.\n *\n * Extracted from the addPass execute closure so the topology fan-out is in\n * one named place; the typed graph has a single\n * call site, and future post-process branches (e.g. tonemap migrated onto\n * this dispatcher per OOS-3) extend this function rather than the addPass\n * inline closure.\n */\nfunction dispatchFullscreenPass(\n ctx: RenderPipelineContext,\n name: string,\n shader: string,\n color: string,\n reads: readonly string[],\n resolveCtx?: ResolveContext,\n compositeOverSwapchain = false,\n rawSwapchainOutput = false,\n graphPass?: RhiRenderPassEncoder,\n graphOutputFormat?: GPUTextureFormat,\n graphDepthView?: TextureView,\n paramsOverride?: Uint8Array,\n fragmentEntryPoint?: string,\n msaaActive = false,\n): void {\n if (shader === 'fxaa') {\n if (resolveCtx === undefined) {\n throw new PostProcessError({\n code: 'fullscreen-input-not-found',\n detail: { readsKey: reads[0] ?? 'ldrColor', passName: name },\n });\n }\n recordFxaaPass(requireRenderGraphRecordContext(ctx), resolveCtx, graphPass, paramsOverride);\n return;\n }\n const lookup = ctx.runtime.lookupPostProcess;\n const entry = lookup === undefined ? undefined : lookup(shader);\n if (entry === undefined) {\n throw new PostProcessError({\n code: 'post-process-not-found',\n detail: { id: shader },\n });\n }\n // feat-20260621 M4' composite-over-swap-chain: copy the current swap-chain\n // into the `color` scratch target BEFORE sampling, so the effect reads the\n // already-composited final image (shadows + tonemap + fxaa). Generalises the\n // built-in FXAA copy idiom. The `color` key is BOTH the copy dst and the\n // sampled input (resolve its GPU texture via `${color}::tex` for the copy,\n // its TextureView via `${color}` for the bind group).\n let inputView: TextureView | null;\n if (compositeOverSwapchain) {\n const scratchTex = resolveCtx?.resolve(`${color}::tex`);\n const scratchView = resolveCtx?.resolve(color);\n if (scratchTex === undefined || scratchView === undefined) {\n throw new PostProcessError({\n code: 'fullscreen-input-not-found',\n detail: { readsKey: color, passName: name },\n });\n }\n ctx.encoder.copyTextureToTexture(\n { texture: ctx.currentTexture as never, mipLevel: 0, origin: { x: 0, y: 0, z: 0 } },\n { texture: scratchTex as never, mipLevel: 0, origin: { x: 0, y: 0, z: 0 } },\n { width: ctx.targetW, height: ctx.targetH, depthOrArrayLayers: 1 },\n );\n inputView = scratchView as TextureView;\n } else if (reads.length === 0) {\n // reads === [] preserves the legacy swap-chain sample path (used by\n // tonemap-style passes that read the framebuffer directly).\n inputView = ctx.view;\n } else {\n // reads with a key MUST resolve through the graph compile output, otherwise\n // the dispatcher throws fullscreen-input-not-found (charter P3 fail-fast).\n const readsKey = reads[0] as string;\n const resolved = resolveCtx?.resolve(readsKey);\n if (resolved === undefined) {\n throw new PostProcessError({\n code: 'fullscreen-input-not-found',\n detail: { readsKey, passName: name },\n });\n }\n inputView = resolved as TextureView;\n }\n if (inputView === null) return;\n\n // ── BGL/Pipeline build (before depth resolution so built.depthSampler is\n // available for the depth threading block below; ctx.msaaActive selects\n // the multisampled depth BGL when the scene target uses sample=4) ───────\n const built = buildFullscreenPostProcessPass(\n { device: ctx.runtime.device, errorRegistry: ctx.runtime.errorRegistry },\n entry,\n msaaActive,\n );\n if (built === null) return;\n\n // ── plan-strategy D-6: depth read resolution (pipeline-agnostic, AC-02) ────\n // Iterate entry.reads looking for sampleType:'depth' entries. For each depth\n // entry, resolve a depth-only TextureView from the graph via\n // resolveDepthOnlyView, fail-fast on unresolvable keys. The depth sampler\n // is produced by buildFullscreenPostProcessPass (via createDepthSampler,\n // plan-strategy D-2: non-filtering nearest+clamp-to-edge).\n //\n // Both composite and non-composite branches handle depth symmetrically —\n // the depth resolution block is branch-agnostic (AC-02: no URP/HDRP\n // discrimination). Color input logic is unchanged (AC-03 zero-regression).\n let depthTexView: TextureView | null = graphDepthView ?? null;\n let depthSampler: Sampler | null = null;\n if (entry.reads && entry.reads.length > 0) {\n const internals = requireRenderGraphRecordContext(ctx);\n for (const read of entry.reads) {\n if (typeof read !== 'string' && read.sampleType === 'depth') {\n const depthKey = read.key;\n depthTexView ??= resolveDepthOnlyView(\n internals,\n depthKey,\n 'post-process-scene-depth-only-view',\n internals.geometryDepthKey,\n );\n if (depthTexView === null) {\n throw new PostProcessError({\n code: 'fullscreen-input-not-found',\n detail: { readsKey: depthKey, passName: name },\n });\n }\n depthSampler = built.depthSampler;\n }\n }\n }\n\n // feat-20260621 M4' composite-over-swap-chain write target: the swap-chain's\n // NON-srgb storage view (R-COLORSPACE — the scratch holds an already-sRGB-\n // encoded copy, so writing through the srgb view would double-encode; mirrors\n // recordFxaaPass). Otherwise resolve the declared color through the graph and\n // fall back to ctx.view (swap-chain srgb view) for normal post passes.\n let writeView: TextureView | null | undefined;\n // The attachment format follows the actual write target. Graph-owned\n // targets may be linear HDR/LDR textures (for example rgba16float), while\n // the swap-chain path uses the backend-selected surface view format.\n let writeFormat = ctx.pipelineState?.colorAttachmentFormat ?? 'rgba8unorm-srgb';\n if (graphPass !== undefined) {\n // Typed graph passes must write their declared output target. The frame\n // surface view is only the fallback for legacy passes; using it here\n // leaves a typed output target cleared while the next pass samples it.\n writeView = (resolveCtx?.resolve(color) as TextureView | undefined) ?? ctx.view;\n writeFormat = graphOutputFormat ?? writeFormat;\n } else if (rawSwapchainOutput && color === 'swapchain') {\n const rawViewRes = ctx.runtime.device.createTextureView(ctx.currentTexture, {});\n if (!rawViewRes.ok) {\n ctx.runtime.errorRegistry.fire(rawViewRes.error);\n return;\n }\n writeView = rawViewRes.value;\n writeFormat = ctx.pipelineState?.format ?? 'rgba8unorm';\n } else if (compositeOverSwapchain) {\n const storageViewRes = ctx.runtime.device.createTextureView(ctx.currentTexture, {});\n if (!storageViewRes.ok) {\n ctx.runtime.errorRegistry.fire(storageViewRes.error);\n return;\n }\n writeView = storageViewRes.value;\n writeFormat = ctx.pipelineState?.format ?? 'rgba8unorm';\n } else {\n const legacyGraph = requireRenderGraphRecordContext(ctx).frameState.perFrameGraph;\n const graphColorFormat = legacyGraph?.getColorTargetDescriptor(color)?.format;\n if (graphColorFormat !== undefined) writeFormat = graphColorFormat;\n const resolvedColor = (resolveCtx?.resolve(color) as TextureView | undefined) ?? null;\n writeView = legacyGraph?.getColorTargetView(color) ?? resolvedColor ?? ctx.view;\n }\n if (writeView === null || writeView === undefined) return;\n\n // feat-20260621 M-A2 / w8: per-frame data-driven params channel. When the\n // entry declares params, look up the per-id eager-created UBO + the per-frame\n // bytes from the PostProcessParams snapshot, fail-fast on a byteLength\n // mismatch, then writeBuffer + bind the UBO at group(1) binding(2). When\n // entry.params is undefined this whole block is skipped and the BGL degrades\n // to 2-entry (param-less zero-regression, R-A7).\n let paramsBuffer: Buffer | null = null;\n if (entry.params !== undefined) {\n const ubo = ctx.runtime.getPostProcessParamsBuffer?.(shader);\n if (ubo !== undefined) {\n // Typed graph passes may make a narrow, per-pass copy of the payload\n // (for example enabling final-surface dither without changing the\n // camera-owned SSOT). Use it when present, while preserving the normal\n // frame snapshot for legacy callers.\n const data = paramsOverride ?? ctx.postProcessParams.get(shader);\n if (data !== undefined) {\n if (data.byteLength !== entry.params.byteSize) {\n throw new PostProcessError({\n code: 'params-update-size-mismatch',\n detail: { byteSize: entry.params.byteSize, actualLength: data.byteLength },\n });\n }\n const writeResult = ctx.runtime.device.queue.writeBuffer(ubo, 0, data);\n if (!writeResult.ok) return;\n } else {\n const writeResult = ctx.runtime.device.queue.writeBuffer(ubo, 0, entry.params.defaultValue);\n if (!writeResult.ok) return;\n }\n paramsBuffer = ubo;\n }\n } else if (entryHasDepthRead(entry)) {\n // D-3: a param-less depth entry still binds the minimal UBO auto-allocated\n // at register (the 'fullscreen-post-with-scene-depth' BGL always declares\n // params@2). No per-frame write -- the buffer stays zero-filled.\n paramsBuffer = ctx.runtime.getPostProcessParamsBuffer?.(shader) ?? null;\n }\n\n const bindGroup = createFullscreenBindGroup(\n ctx.runtime.device,\n built.bindGroupLayout,\n inputView,\n built.sampler,\n paramsBuffer,\n depthTexView,\n depthSampler,\n built.extraColorBindings.map((binding, index) => {\n const read = entry.reads?.filter(\n (candidate) => typeof candidate === 'string' || candidate.sampleType !== 'depth',\n )[index + 1];\n const key = typeof read === 'string' ? read : read?.key;\n const view = key === undefined ? undefined : resolveCtx?.resolve(key);\n if (view === undefined) {\n throw new PostProcessError({\n code: 'fullscreen-input-not-found',\n detail: { readsKey: key ?? 'additional-read', passName: name },\n });\n }\n return { binding, view: view as TextureView };\n }),\n );\n if (bindGroup === null) return;\n\n // Pipeline source-of-truth (M4 / T-10-a, solving M1 CONCERN-1):\n // RenderSystemRuntime.getPostProcessPipeline is the sync wrapper over the\n // shared shader-module adapter (1-frame warmup). First frame after\n // fullscreen effect registration: shader compile is in flight -> returns null -> we\n // skip the pass for that frame. Second frame onward: cached pipeline is\n // returned synchronously.\n //\n // Color format SSOT: graph-owned writes use their resolved descriptor format;\n // swap-chain writes use the backend-aware surface format in pipelineState.\n // This keeps the PSO target and render-pass attachment identical when a\n // fullscreen pass writes an intermediate rgba16float target (for example\n // tonemap -> FXAA), while preserving the native surface storage/sRGB split.\n const lookupPipeline = ctx.runtime.getPostProcessPipeline;\n if (lookupPipeline === undefined) return;\n const postColorFormat = writeFormat;\n const pipelineEntry = fragmentEntryPoint === undefined ? entry : { ...entry, fragmentEntryPoint };\n const pipeline = lookupPipeline(shader, built.bindGroupLayout, [postColorFormat], pipelineEntry);\n if (pipeline === null) return;\n const handle = built.createHandle(name, pipeline, paramsBuffer);\n\n // Open a render pass writing into the resolved color target. Fullscreen\n // post-process passes are non-MSAA, depth-less, single-attachment.\n // setBindGroup(1, ...) (group=1 reserved per plan-strategy convention;\n // group=0 is reserved for future view bind groups, mirroring the\n // recordTonemap / recordSkybox pattern that uses slot 0 only when the\n // pipeline declares a single bind group at slot 0).\n const pass =\n graphPass ??\n ctx.encoder.beginRenderPass(\n buildBeginRenderPassDescriptor(\n {\n colorFormats: [writeFormat],\n depthFormat: undefined,\n sampleCount: 1,\n },\n { colorViews: [writeView] },\n 'post-process',\n ) as never,\n );\n pass.setBindGroup(1, bindGroup);\n handle.draw(pass, inputView);\n if (graphPass === undefined) pass.end();\n}\n\nexport function encodeFullscreenPass(\n ctx: RenderPipelineContext,\n pass: RhiRenderPassEncoder,\n input: {\n readonly name: string;\n readonly shader: string;\n readonly color: string;\n readonly reads: readonly string[];\n readonly resolve: ResolveContext;\n readonly outputFormat: GPUTextureFormat;\n readonly rawSwapchainOutput?: boolean | undefined;\n readonly depthView?: TextureView | undefined;\n readonly paramsOverride?: Uint8Array | undefined;\n readonly fragmentEntryPoint?: string | undefined;\n /** The depth target's actual sample count, when this typed pass reads depth. */\n readonly msaaActive?: boolean | undefined;\n },\n): void {\n dispatchFullscreenPass(\n ctx,\n input.name,\n input.shader,\n input.color,\n input.reads,\n input.resolve,\n false,\n input.rawSwapchainOutput ?? false,\n pass,\n input.outputFormat,\n input.depthView,\n input.paramsOverride,\n input.fragmentEntryPoint,\n // Legacy callers rely on the frame context's MSAA state. Typed callers\n // pass the actual depth target sample count explicitly so a single-sample\n // view can never select the multisampled shader by camera policy alone.\n input.msaaActive ?? ctx.msaaActive,\n );\n}\n","import type {\n BindGroupLayout,\n Buffer,\n RhiDevice,\n RhiQueue,\n Sampler,\n Texture,\n TextureFormat,\n TextureView,\n} from '@forgeax/engine-rhi';\nimport type { DeviceScope } from '../device/device-scope';\nimport {\n GPU_TEXTURE_USAGE_COPY_SRC,\n GPU_TEXTURE_USAGE_RENDER_ATTACHMENT,\n GPU_TEXTURE_USAGE_TEXTURE_BINDING,\n} from '../gpu-texture-usage';\nimport { GPU_BUFFER_USAGE_COPY_DST, GPU_BUFFER_USAGE_UNIFORM } from '../gpu-usage';\nimport type { RenderFrameState } from '../record/frame-snapshot';\n\nexport const TEMPORAL_HISTORY_FORMATS = Object.freeze({\n color: 'rgba16float',\n temporal: 'rgba16float',\n stability: 'r8unorm',\n} as const);\n\ninterface TemporalSurface {\n readonly texture: Texture;\n readonly view: TextureView;\n}\n\nexport interface TemporalGpuState {\n readonly device: RhiDevice;\n readonly scope: DeviceScope;\n readonly childScope: DeviceScope;\n width: number;\n height: number;\n valid: boolean;\n readIndex: 0 | 1;\n pendingIndex: 0 | 1 | undefined;\n readonly color: [TemporalSurface, TemporalSurface];\n readonly temporal: [TemporalSurface, TemporalSurface];\n readonly stability: [TemporalSurface, TemporalSurface];\n bindGroupLayout: BindGroupLayout | undefined;\n sampler: Sampler | undefined;\n temporalSampler: Sampler | undefined;\n paramsBuffer: Buffer | undefined;\n committed: boolean;\n}\n\nfunction createSurface(\n device: RhiDevice,\n childScope: DeviceScope,\n label: string,\n width: number,\n height: number,\n format: TextureFormat = TEMPORAL_HISTORY_FORMATS.color,\n): TemporalSurface {\n const texture = device.createTexture({\n label,\n size: { width, height, depthOrArrayLayers: 1 },\n format,\n textureBindingViewDimension: undefined,\n usage:\n GPU_TEXTURE_USAGE_COPY_SRC |\n GPU_TEXTURE_USAGE_RENDER_ATTACHMENT |\n GPU_TEXTURE_USAGE_TEXTURE_BINDING,\n });\n if (!texture.ok) throw texture.error;\n childScope._adopt('texture', texture.value, (value) => {\n device.destroyTexture(value);\n });\n const view = device.createTextureView(texture.value, {\n label: `${label}.view`,\n dimension: '2d',\n baseMipLevel: 0,\n mipLevelCount: 1,\n baseArrayLayer: 0,\n arrayLayerCount: 1,\n });\n if (!view.ok) throw view.error;\n return { texture: texture.value, view: view.value };\n}\n\nfunction createState(\n device: RhiDevice,\n scope: DeviceScope,\n width: number,\n height: number,\n): TemporalGpuState {\n const childScope = scope.createChild(`${scope.owner}:temporal`);\n try {\n return {\n device,\n scope,\n childScope,\n width,\n height,\n valid: false,\n readIndex: 0,\n pendingIndex: undefined,\n color: [\n createSurface(device, childScope, 'taa-history-color-a', width, height),\n createSurface(device, childScope, 'taa-history-color-b', width, height),\n ],\n temporal: [\n createSurface(\n device,\n childScope,\n 'taa-history-temporal-a',\n width,\n height,\n TEMPORAL_HISTORY_FORMATS.temporal,\n ),\n createSurface(\n device,\n childScope,\n 'taa-history-temporal-b',\n width,\n height,\n TEMPORAL_HISTORY_FORMATS.temporal,\n ),\n ],\n stability: [\n createSurface(\n device,\n childScope,\n 'taa-history-stability-a',\n width,\n height,\n TEMPORAL_HISTORY_FORMATS.stability,\n ),\n createSurface(\n device,\n childScope,\n 'taa-history-stability-b',\n width,\n height,\n TEMPORAL_HISTORY_FORMATS.stability,\n ),\n ],\n bindGroupLayout: undefined,\n sampler: undefined,\n temporalSampler: undefined,\n paramsBuffer: undefined,\n committed: false,\n };\n } catch (cause) {\n childScope.abandon();\n throw cause;\n }\n}\n\nexport function getTemporalParamsBuffer(state: TemporalGpuState): Buffer {\n if (state.paramsBuffer !== undefined) return state.paramsBuffer;\n const created = state.device.createBuffer({\n label: 'taa-resolve-params',\n size: 32,\n usage: GPU_BUFFER_USAGE_UNIFORM | GPU_BUFFER_USAGE_COPY_DST,\n mappedAtCreation: false,\n });\n if (!created.ok) {\n if (!state.committed) state.childScope.abandon();\n throw created.error;\n }\n state.childScope._adopt('buffer', created.value, (value) => {\n state.device.destroyBuffer(value);\n });\n const written = state.device.queue.writeBuffer(created.value, 0, new Uint8Array(32));\n if (!written.ok) {\n if (!state.committed) state.childScope.abandon();\n throw written.error;\n }\n state.paramsBuffer = created.value;\n return created.value;\n}\n\nexport function getTemporalGpuState(\n frameState: RenderFrameState,\n device: RhiDevice,\n scope: DeviceScope,\n width: number,\n height: number,\n): TemporalGpuState {\n const staged = frameState.temporalGpuState;\n if (\n staged !== undefined &&\n staged.scope === scope &&\n staged.width === width &&\n staged.height === height\n ) {\n return staged;\n }\n const existing = frameState.activeTemporalGpuState;\n if (\n existing !== undefined &&\n existing.scope === scope &&\n existing.width === width &&\n existing.height === height\n ) {\n return existing;\n }\n const next = createState(device, scope, width, height);\n frameState.temporalGpuState = next;\n return next;\n}\n\nexport function getTemporalBindGroupResources(state: TemporalGpuState): {\n readonly layout: BindGroupLayout;\n readonly sampler: Sampler | null;\n readonly temporalSampler: Sampler | null;\n} {\n if (state.bindGroupLayout !== undefined) {\n return {\n layout: state.bindGroupLayout,\n sampler: state.sampler ?? null,\n temporalSampler: state.temporalSampler ?? null,\n };\n }\n try {\n const layout = state.device.createBindGroupLayout({\n label: 'taa-resolve-bind-group',\n entries: [\n {\n binding: 0,\n visibility: 2,\n texture: { sampleType: 'float', viewDimension: '2d' },\n },\n { binding: 1, visibility: 2, sampler: { type: 'filtering' } },\n {\n binding: 2,\n visibility: 2,\n texture: { sampleType: 'float', viewDimension: '2d' },\n },\n { binding: 3, visibility: 2, sampler: { type: 'filtering' } },\n {\n binding: 4,\n visibility: 2,\n texture: { sampleType: 'unfilterable-float', viewDimension: '2d' },\n },\n { binding: 5, visibility: 2, sampler: { type: 'non-filtering' } },\n {\n binding: 6,\n visibility: 2,\n texture: { sampleType: 'unfilterable-float', viewDimension: '2d' },\n },\n { binding: 7, visibility: 2, sampler: { type: 'non-filtering' } },\n { binding: 8, visibility: 2, buffer: { type: 'uniform' } },\n { binding: 9, visibility: 2, texture: { sampleType: 'float', viewDimension: '2d' } },\n {\n binding: 10,\n visibility: 2,\n texture: { sampleType: 'unfilterable-float', viewDimension: '2d' },\n },\n {\n binding: 11,\n visibility: 2,\n texture: { sampleType: 'unfilterable-float', viewDimension: '2d' },\n },\n ],\n });\n if (!layout.ok) throw layout.error;\n state.childScope._adopt('binding', layout.value, () => undefined);\n const sampler = state.device.createSampler({\n addressModeU: 'clamp-to-edge',\n addressModeV: 'clamp-to-edge',\n magFilter: 'linear',\n minFilter: 'linear',\n });\n if (!sampler.ok) throw sampler.error;\n state.childScope._adopt('binding', sampler.value, () => undefined);\n const temporalSampler = state.device.createSampler({\n addressModeU: 'clamp-to-edge',\n addressModeV: 'clamp-to-edge',\n magFilter: 'nearest',\n minFilter: 'nearest',\n });\n if (!temporalSampler.ok) throw temporalSampler.error;\n state.childScope._adopt('binding', temporalSampler.value, () => undefined);\n state.bindGroupLayout = layout.value;\n state.sampler = sampler.value;\n state.temporalSampler = temporalSampler.value;\n return { layout: layout.value, sampler: sampler.value, temporalSampler: temporalSampler.value };\n } catch (cause) {\n if (!state.committed) {\n state.childScope.abandon();\n state.bindGroupLayout = undefined;\n state.sampler = undefined;\n state.temporalSampler = undefined;\n }\n throw cause;\n }\n}\n\nexport function temporalReadIndex(state: TemporalGpuState): 0 | 1 {\n return state.readIndex;\n}\n\nexport function temporalWriteIndex(state: TemporalGpuState): 0 | 1 {\n return state.readIndex === 0 ? 1 : 0;\n}\n\nexport function stageTemporalGpuSubmit(state: TemporalGpuState): void {\n state.pendingIndex = state.readIndex === 0 ? 1 : 0;\n}\n\nexport function hasPendingTemporalGpuSubmit(state: TemporalGpuState): boolean {\n return state.pendingIndex !== undefined;\n}\n\nexport function commitTemporalGpuSubmit(state: TemporalGpuState): boolean {\n if (state.pendingIndex === undefined) return false;\n state.readIndex = state.pendingIndex;\n state.pendingIndex = undefined;\n state.valid = true;\n state.committed = true;\n return true;\n}\n\nexport function abortTemporalGpuSubmit(state: TemporalGpuState): void {\n state.pendingIndex = undefined;\n}\n\nexport function retireTemporalGpuState(state: TemporalGpuState): void {\n state.pendingIndex = undefined;\n state.childScope.retire();\n state.valid = false;\n state.committed = false;\n state.bindGroupLayout = undefined;\n state.sampler = undefined;\n state.temporalSampler = undefined;\n state.paramsBuffer = undefined;\n}\n\nexport function retireTemporalGpuStateAfterFence(\n state: TemporalGpuState,\n queue: RhiQueue,\n retiring: Set<TemporalGpuState>,\n onFailure: (cause: unknown) => void,\n): void {\n if (state.childScope.state === 'retired' || state.childScope.state === 'abandoned') return;\n state.childScope.beginRetire();\n retiring.add(state);\n void queue.onSubmittedWorkDone().then(\n () => {\n retiring.delete(state);\n retireTemporalGpuState(state);\n },\n (cause) => {\n retiring.delete(state);\n onFailure(cause);\n retireTemporalGpuState(state);\n },\n );\n}\n","import {\n type GraphAccess,\n type GraphResourceResolver,\n type GraphTextureView,\n type RenderGraphBuilder,\n RenderGraphError,\n type ResolveContext,\n} from '@forgeax/engine-render-graph';\nimport {\n type Buffer,\n RhiError,\n type Texture,\n type TextureFormat,\n type TextureView,\n} from '@forgeax/engine-rhi';\nimport { err, ok, type PassKind, type PassSelector, type Result } from '@forgeax/engine-types';\nimport {\n GPU_TEXTURE_USAGE_COPY_SRC,\n GPU_TEXTURE_USAGE_RENDER_ATTACHMENT,\n GPU_TEXTURE_USAGE_TEXTURE_BINDING,\n} from './gpu-texture-usage';\nimport { GPU_BUFFER_USAGE_COPY_DST, GPU_BUFFER_USAGE_MAP_READ } from './gpu-usage';\nimport { buildPerFrameBindGroups } from './record/frame-lighting';\nimport { encodeMainPass } from './record/main-pass';\nimport type {\n _InternalRenderPipelineContext,\n RenderSystemInternals,\n} from './record/render-context';\nimport {\n encodeSkyboxPass,\n recordBloomCompositePass,\n recordBloomDownsamplePass,\n recordBloomUpsamplePass,\n} from './record/skybox-post-pass';\nimport { STANDARD_OUTPUT_TRANSFORM_FEATURE_ID } from './render-contract';\nimport {\n encodeFullscreenPass,\n recordSsaoBlurPass,\n recordSsaoCalcPass,\n} from './render-graph-primitives';\nimport type { RenderPipelineFrame, RenderPipelineGpuDrivenProjection } from './render-pipeline';\nimport { createRenderPipelineTarget, type RenderPipelineTarget } from './render-pipeline';\nimport type { OcclusionFrameProjection } from './scene/visibility/occlusion-runtime';\nimport {\n getTemporalBindGroupResources,\n getTemporalGpuState,\n getTemporalParamsBuffer,\n stageTemporalGpuSubmit,\n} from './temporal/gpu';\n\nfunction resolvedView(resources: GraphResourceResolver, view: GraphTextureView): TextureView {\n const result = resources.textureView(view);\n if (!result.ok) throw result.error;\n return result.value;\n}\n\nfunction throwTemporalEncodeFailure(expected: string, cause?: unknown): never {\n throw new RhiError({\n code: 'webgpu-runtime-error',\n expected,\n hint:\n cause === undefined\n ? 'retry the temporal frame after repairing its GPU resource'\n : String(cause),\n });\n}\n\nexport function typedFrameClearColor(frame: RenderPipelineFrame): GPUColor {\n return {\n r: frame.clear[0] ?? 0,\n g: frame.clear[1] ?? 0,\n b: frame.clear[2] ?? 0,\n a: frame.clear[3] ?? 1,\n };\n}\n\nfunction resolvedDepthView(\n frame: RenderPipelineFrame,\n resources: GraphResourceResolver,\n target: RenderPipelineTarget,\n): TextureView {\n const texture = resources.texture(target.texture);\n if (!texture.ok) throw texture.error;\n const view = frame.runtime.device.createTextureView(texture.value, {\n label: 'typed-ssao-depth-only-view',\n // Multisampled WebGPU textures still use a `2d` view dimension; the\n // sample count is carried by the source texture and WGSL type.\n dimension: '2d',\n aspect: 'depth-only',\n baseMipLevel: 0,\n mipLevelCount: 1,\n baseArrayLayer: 0,\n arrayLayerCount: 1,\n });\n if (!view.ok) throw view.error;\n return view.value;\n}\n\nexport type TypedFrameObservationDomain = 'linear-hdr' | 'linear-ldr' | 'final-srgb';\n\n/**\n * One graph-owned copy destination for a receipt-bound color-domain capture.\n * The buffer is created by the same encoder transaction as the source copy;\n * callers map it only after the matching receipt fence resolves.\n */\nexport interface TypedFrameObservationCapture {\n readonly domain: TypedFrameObservationDomain;\n /** Native source format is required so consumers can decode BGRA surfaces truthfully. */\n readonly format: TextureFormat;\n readonly device: import('@forgeax/engine-rhi').RhiDevice;\n readonly texture: Texture;\n readonly buffer: Buffer;\n readonly frameNumber: number;\n readonly deviceGeneration: number;\n readonly graphGeneration: number;\n readonly backendId: string;\n readonly width: number;\n readonly height: number;\n readonly bytesPerRow: number;\n}\n\nfunction observationBytesPerPixel(format: TextureFormat): number {\n return format === 'rgba16float' ? 8 : 4;\n}\n\nfunction observationBytesPerRow(width: number, format: TextureFormat): number {\n const unaligned = width * observationBytesPerPixel(format);\n return Math.ceil(unaligned / 256) * 256;\n}\n\nfunction addObservationCapturePass(\n graph: RenderGraphBuilder<RenderPipelineFrame>,\n target: RenderPipelineTarget,\n domain: TypedFrameObservationDomain,\n): Result<void, RenderGraphError> {\n return graph.addCopyPass(`${domain}-observation`, {\n accesses: [{ resource: target.view, usage: 'copy-src' }],\n encode: ({ encoder, frame, resources }) => {\n const texture = resources.texture(target.texture);\n if (!texture.ok) throw texture.error;\n const internal = frame as _InternalRenderPipelineContext;\n // The RenderSystem frame counter is the identity used by\n // observeCurrentFrame after this submission. The public receipt counter\n // is intentionally separate and is only used by receipt-bound copies;\n // using observationFrameId here makes a current source look stale by one\n // frame to the legacy same-frame observer.\n if (domain === 'linear-hdr') {\n internal.frameState.currentFrameObservationSource = {\n texture: texture.value,\n descriptor: {\n texture: texture.value,\n format: target.format,\n size: { width: frame.targetW, height: frame.targetH },\n usage:\n GPU_TEXTURE_USAGE_COPY_SRC |\n GPU_TEXTURE_USAGE_RENDER_ATTACHMENT |\n GPU_TEXTURE_USAGE_TEXTURE_BINDING,\n sample: target.sampleCount,\n },\n frameId: internal.frameState.frameNumber,\n pipelineId: 'forgeax::standard',\n backendId: frame.runtime.device.caps.backendKind,\n };\n }\n const owner = frame.runtime.observationCaptureOwner;\n if (owner === undefined) {\n // Standalone graph-contract tests do not assemble a renderer owner.\n // Preserve the legacy HDR source projection without allocating an\n // unowned readback buffer; production frames always inject the owner.\n return;\n }\n // Observation is an explicit host demand, not a property of every\n // submitted frame. The graph keeps its copy pass declaration so the\n // committed topology remains inspectable, but ordinary production\n // frames must not allocate a MAP_READ buffer or enqueue a copy.\n // The source projection is different: the Renderer owns the current\n // linear-HDR texture for every submitted frame, even when no host asked\n // for a MAP_READ copy. Consumers such as the auto-exposure meter use\n // this same-frame source; publishing it only on an explicit capture\n // would make ordinary frames appear to have no observation source.\n if (!frame.runtime.observationCaptureDomains?.includes(domain)) return;\n const width = frame.targetW;\n const height = frame.targetH;\n const bytesPerRow = observationBytesPerRow(width, target.format);\n const created = frame.runtime.device.createBuffer({\n label: `${domain}-observation-readback`,\n size: bytesPerRow * height,\n usage: GPU_BUFFER_USAGE_COPY_DST | GPU_BUFFER_USAGE_MAP_READ,\n mappedAtCreation: false,\n });\n if (!created.ok) throw created.error;\n try {\n encoder.copyTextureToBuffer(\n { texture: texture.value, mipLevel: 0, origin: { x: 0, y: 0, z: 0 } },\n { buffer: created.value, bytesPerRow, rowsPerImage: height },\n { width, height, depthOrArrayLayers: 1 },\n );\n // Publish the graph fence through the renderer runtime before any\n // capture is registered. The assembly consumes this renderer-issued\n // value for the receipt; it never derives the expected fence from the\n // first capture in an otherwise untrusted capture set.\n frame.runtime.observationGraphGeneration = internal.frameState.graphGeneration;\n owner.register({\n domain,\n format: target.format,\n device: frame.runtime.device,\n texture: texture.value,\n buffer: created.value,\n // The assembly reserves this public receipt identity before encoding.\n // The frame-state counter is an internal record counter and is not an\n // identity source when non-receipt frames are recorded.\n frameNumber: frame.runtime.observationFrameId ?? internal.frameState.frameNumber,\n deviceGeneration: frame.runtime.deviceGeneration ?? 0,\n graphGeneration: internal.frameState.graphGeneration,\n backendId: frame.runtime.device.caps.backendKind,\n width,\n height,\n bytesPerRow,\n });\n } catch (cause) {\n const destroyed = frame.runtime.device.destroyBuffer(created.value);\n if (!destroyed.ok) throw destroyed.error;\n throw cause;\n }\n },\n });\n}\n\nfunction legacyResolver(\n resources: GraphResourceResolver,\n targets: Readonly<Record<string, RenderPipelineTarget>>,\n): ResolveContext {\n return {\n resolve: (name) => {\n const target = targets[name];\n return target === undefined ? undefined : resolvedView(resources, target.view);\n },\n };\n}\n\nexport function addTypedSkyboxPass(\n graph: RenderGraphBuilder<RenderPipelineFrame>,\n color: RenderPipelineTarget,\n): Result<void, RenderGraphError> {\n return graph.addRasterPass('skybox', {\n accesses: [{ resource: color.view, usage: 'color-attachment' }],\n colorAttachments: [\n {\n view: color.view,\n loadOp: 'clear',\n storeOp: 'store',\n clearValue: typedFrameClearColor,\n },\n ],\n encode: ({ pass, frame }) => encodeSkyboxPass(frame as _InternalRenderPipelineContext, pass),\n });\n}\n\nexport interface TypedScenePassOptions {\n readonly environment?: import('./environment/ibl').GraphEnvironment | undefined;\n readonly name: string;\n readonly color: RenderPipelineTarget;\n readonly depth: RenderPipelineTarget;\n readonly resolve?: RenderPipelineTarget | undefined;\n readonly sampled?: readonly RenderPipelineTarget[] | undefined;\n readonly directionalShadow?: RenderPipelineTarget | undefined;\n readonly spotShadow?: RenderPipelineTarget | undefined;\n readonly ssao?: RenderPipelineTarget | undefined;\n readonly selector: PassSelector;\n readonly passKind?: PassKind | undefined;\n readonly colorTargets?: readonly RenderPipelineTarget[] | undefined;\n readonly clearColor?: readonly [number, number, number, number] | undefined;\n readonly colorLoadOp?: GPULoadOp | readonly GPULoadOp[] | undefined;\n readonly depthLoadOp?: GPULoadOp | undefined;\n readonly coverageOnly?: boolean | undefined;\n readonly recordMode?: 'opaque' | 'transmission' | 'transparent' | undefined;\n /** Exclude material/pass pairs consumed by an earlier graph lane. */\n readonly excludeSelector?: PassSelector | undefined;\n /** Require material membership in another lane without selecting its entries. */\n readonly includeSelector?: PassSelector | undefined;\n readonly transmissionBackdrop?: GraphTextureView | undefined;\n readonly extraAccesses?: readonly GraphAccess[] | undefined;\n readonly gpuDriven?: RenderPipelineGpuDrivenProjection | undefined;\n readonly occlusion?: OcclusionFrameProjection | undefined;\n}\n\nexport function addTypedScenePass(\n graph: RenderGraphBuilder<RenderPipelineFrame>,\n options: TypedScenePassOptions,\n): Result<void, RenderGraphError> {\n const colorTargets = options.colorTargets ?? [options.color];\n const accesses: GraphAccess[] = [\n ...colorTargets.map((target) => ({\n resource: target.view,\n usage: 'color-attachment' as const,\n })),\n { resource: options.depth.view, usage: 'depth-stencil-write' },\n ...(options.sampled ?? []).map((target) => ({\n resource: target.view,\n usage: 'sampled-read' as const,\n })),\n ...(options.transmissionBackdrop === undefined\n ? []\n : [{ resource: options.transmissionBackdrop, usage: 'sampled-read' as const }]),\n ...(options.environment === undefined\n ? []\n : [options.environment.irradiance, options.environment.prefilter].map((resource) => ({\n resource,\n usage: 'sampled-read' as const,\n }))),\n ...(options.extraAccesses ?? []),\n ...(options.gpuDriven?.accesses ?? []),\n ];\n if (options.resolve !== undefined) {\n accesses.push({ resource: options.resolve.view, usage: 'color-attachment' });\n }\n return graph.addRasterPass(options.name, {\n accesses,\n colorAttachments: colorTargets.map((target, index) => ({\n view: target.view,\n ...(index === 0 && options.resolve !== undefined\n ? { resolveTarget: options.resolve.view }\n : {}),\n loadOp:\n (typeof options.colorLoadOp === 'string'\n ? options.colorLoadOp\n : options.colorLoadOp?.[index]) ?? 'clear',\n storeOp: 'store',\n clearValue: {\n r: options.clearColor?.[0] ?? 0,\n g: options.clearColor?.[1] ?? 0,\n b: options.clearColor?.[2] ?? 0,\n a: options.clearColor?.[3] ?? 1,\n },\n })),\n depthStencilAttachment: {\n view: options.depth.view,\n depthClearValue: 1,\n depthLoadOp: options.depthLoadOp ?? 'clear',\n depthStoreOp: 'store',\n stencilClearValue: 0,\n stencilLoadOp: options.depthLoadOp ?? 'clear',\n stencilStoreOp: 'store',\n },\n occlusionQuerySet: options.occlusion?.querySet,\n encode: ({ pass, frame, resources }) => {\n const colorViews = colorTargets.map((target) => resolvedView(resources, target.view));\n const depthView = resolvedView(resources, options.depth.view);\n const resolveView =\n options.resolve === undefined ? null : resolvedView(resources, options.resolve.view);\n const internal = frame as _InternalRenderPipelineContext;\n const directionalShadow =\n options.directionalShadow === undefined\n ? undefined\n : resolvedView(resources, options.directionalShadow.view);\n const spotShadow =\n options.spotShadow === undefined\n ? undefined\n : resolvedView(resources, options.spotShadow.view);\n const ssao =\n options.ssao === undefined ? undefined : resolvedView(resources, options.ssao.view);\n const transmissionBackdrop =\n options.transmissionBackdrop === undefined\n ? null\n : resolvedView(resources, options.transmissionBackdrop);\n internal.frameState.currentDirectionalShadowView = directionalShadow ?? null;\n internal.frameState.currentSpotShadowView = spotShadow ?? null;\n const groups = buildPerFrameBindGroups(\n internal.runtime as RenderSystemInternals,\n internal.frameState,\n internal.pipelineState,\n internal.validated.length > 0 || options.gpuDriven !== undefined,\n internal.bindGroupCounts,\n {\n directionalShadow,\n spotShadow,\n projector: internal.spotLightProjector?.view ?? internal.volumetricFog?.projectorView,\n projectorSampler:\n internal.spotLightProjector?.sampler ?? internal.volumetricFog?.projectorSampler,\n },\n true,\n internal.standardLighting,\n );\n // GPU-driven indirect draws are encoded by `recordMainPass` after it\n // has populated the frame-global material bind-group receipt. Encoding\n // here would race that producer and either observe an empty receipt or\n // issue the same indirect draw twice. Keep this wrapper responsible for\n // resolving graph-owned attachments; the main-pass owner orders the\n // material producer before the GPU consumer.\n // The context carries the frame's primary occlusion projection for\n // pipeline construction, but only the pass that owns that projection\n // may begin its query. Forwarding it to deferred/temporal scene passes\n // leaves their descriptors without an occlusionQuerySet and makes Dawn\n // reject beginOcclusionQuery in those passes.\n const activeOcclusion = options.occlusion;\n const passContext: _InternalRenderPipelineContext = {\n ...internal,\n ...(options.environment === undefined\n ? {}\n : {\n environmentIbl: {\n irradiance: resolvedView(resources, options.environment.irradiance),\n prefilter: resolvedView(resources, options.environment.prefilter),\n },\n }),\n ...(activeOcclusion === undefined ? {} : { occlusion: activeOcclusion }),\n geometryColorView: colorViews[0] ?? null,\n geometryDepthView: depthView,\n geometryColorResolveView: resolveView,\n transparentColorFormat: colorTargets[0]?.format as GPUTextureFormat,\n ...((options.passKind === 'deferred'\n ? colorTargets[3]?.format\n : colorTargets[1]?.format) === 'rgba16float'\n ? { reflectionFallbackColorFormat: 'rgba16float' as const }\n : {}),\n msaaActive: colorTargets[0]?.sampleCount === 4,\n viewBindGroup: groups.viewBindGroup,\n meshBindGroup: groups.meshBindGroup,\n hdrpClusterBindGroup: groups.hdrpClusterBindGroup,\n hdrpClusterMembershipBindGroup: groups.hdrpClusterMembershipBindGroup,\n ...(ssao === undefined ? {} : { hdrpSsaoBlurredView: ssao }),\n };\n encodeMainPass(passContext, pass, options.selector, {\n colorViews,\n colorFormats: colorTargets.map((target) => target.format as GPUTextureFormat),\n depthView,\n passKind: options.passKind ?? 'forward',\n ...(options.clearColor === undefined ? {} : { clearColor: options.clearColor }),\n ...(options.recordMode === undefined ? {} : { recordMode: options.recordMode }),\n ...(options.coverageOnly === undefined ? {} : { coverageOnly: options.coverageOnly }),\n ...(options.excludeSelector === undefined\n ? {}\n : { excludeSelector: options.excludeSelector }),\n ...(options.includeSelector === undefined\n ? {}\n : { includeSelector: options.includeSelector }),\n ...(options.transmissionBackdrop === undefined\n ? {}\n : { transmissionBackdropView: transmissionBackdrop }),\n ...(options.gpuDriven === undefined\n ? {}\n : { gpuDriven: { projection: options.gpuDriven, resources } }),\n });\n // encodeMainPass receives a pass-local context so attachment and\n // bind-group overrides stay isolated. Its material UBO payload cache is\n // frame-owned, however: return it to the original context so the next\n // Standard scene pass can reuse the same validated slot projection.\n // This remains frame-local and keeps the existing writeBuffer, texture\n // readiness, UV-scale, and missing-texture diagnostic behavior intact.\n if (passContext.materialUboPayloadCache !== undefined) {\n internal.materialUboPayloadCache = passContext.materialUboPayloadCache;\n }\n if (activeOcclusion !== undefined) {\n const proxyResult = activeOcclusion.encodeProxyBounds(pass);\n if (!proxyResult.ok) throw proxyResult.error;\n }\n },\n });\n}\n\nexport function addTypedFrameObservationPass(\n graph: RenderGraphBuilder<RenderPipelineFrame>,\n target: RenderPipelineTarget,\n pipelineId: 'forgeax::standard',\n): Result<void, RenderGraphError> {\n void pipelineId;\n return addObservationCapturePass(graph, target, 'linear-hdr');\n}\n\n/** Publish the same-frame fallback MRT as a detached, copy-readable source. */\nexport function addReflectionFallbackObservationPass(\n graph: RenderGraphBuilder<RenderPipelineFrame>,\n target: RenderPipelineTarget,\n): Result<void, RenderGraphError> {\n return graph.addCopyPass('reflection-fallback-observation', {\n accesses: [{ resource: target.view, usage: 'copy-src' }],\n encode: ({ frame, resources }) => {\n const internal = frame as _InternalRenderPipelineContext;\n const texture = resources.texture(target.texture);\n if (!texture.ok) throw texture.error;\n internal.frameState.reflectionFallbackObservationSource = {\n texture: texture.value,\n descriptor: {\n texture: texture.value,\n format: target.format,\n size: { width: frame.targetW, height: frame.targetH },\n usage:\n GPU_TEXTURE_USAGE_COPY_SRC |\n GPU_TEXTURE_USAGE_RENDER_ATTACHMENT |\n GPU_TEXTURE_USAGE_TEXTURE_BINDING,\n sample: target.sampleCount,\n },\n frameId: internal.frameState.frameNumber,\n pipelineId: 'forgeax::standard',\n backendId: internal.runtime.device.caps.backendKind,\n };\n },\n });\n}\n\nexport interface TypedBloomTargets {\n readonly scene: RenderPipelineTarget;\n readonly composited: RenderPipelineTarget;\n readonly downsample: readonly RenderPipelineTarget[];\n readonly upsample: readonly RenderPipelineTarget[];\n readonly levelDimensions: readonly { readonly width: number; readonly height: number }[];\n}\n\n/** The semantic Bloom pass owner; graph inspection consumes these same identities. */\nexport const TYPED_BLOOM_PASS_NAMES = {\n downsample: 'bloom-downsample',\n upsample: 'bloom-upsample',\n composite: 'bloom-composite',\n} as const;\n\nexport function typedBloomLevelPassName(kind: 'downsample' | 'upsample', level: number): string {\n return `${TYPED_BLOOM_PASS_NAMES[kind]}-${level}`;\n}\n\nexport function addTypedBloomPasses(\n graph: RenderGraphBuilder<RenderPipelineFrame>,\n targets: TypedBloomTargets,\n): Result<void, RenderGraphError> {\n const named: Record<string, RenderPipelineTarget> = {\n hdrColor: targets.scene,\n hdrComposited: targets.composited,\n };\n targets.downsample.forEach((target, level) => {\n named[`bloomDownsample${level}`] = target;\n });\n targets.upsample.forEach((target, level) => {\n named[`bloomUpsample${level}`] = target;\n });\n\n const add = (\n name: string,\n reads: readonly RenderPipelineTarget[],\n write: RenderPipelineTarget,\n encode: (\n frame: _InternalRenderPipelineContext,\n resolve: ResolveContext,\n pass: import('@forgeax/engine-rhi').RhiRenderPassEncoder,\n level?: number,\n size?: { readonly width: number; readonly height: number },\n ) => void,\n level?: number,\n ): Result<void, RenderGraphError> => {\n const descriptor = {\n name,\n reads,\n write,\n encode,\n level,\n };\n const added = graph.addRasterPass(descriptor.name, {\n accesses: [\n ...descriptor.reads.map((target) => ({\n resource: target.view,\n usage: 'sampled-read' as const,\n })),\n { resource: descriptor.write.view, usage: 'color-attachment' },\n ],\n colorAttachments: [\n {\n view: descriptor.write.view,\n loadOp: 'clear',\n storeOp: 'store',\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n },\n ],\n encode: ({ pass, frame, resources }) =>\n descriptor.encode(\n frame as _InternalRenderPipelineContext,\n legacyResolver(resources, named),\n pass,\n descriptor.level,\n descriptor.level === undefined ? undefined : targets.levelDimensions[descriptor.level],\n ),\n });\n return added.ok ? ok(undefined) : added;\n };\n\n for (const [level, write] of targets.downsample.entries()) {\n const source = level === 0 ? targets.scene : targets.downsample[level - 1];\n if (source === undefined) {\n return err(\n new RenderGraphError({\n code: 'resource-resolution-failed',\n expected: 'Bloom downsample levels form one adjacent pyramid',\n hint: 'rebuild the Standard Bloom target declaration from one level list',\n detail: { resourceLabel: `bloom-level-${level}` },\n }),\n );\n }\n const added = add(\n typedBloomLevelPassName('downsample', level),\n [source],\n write,\n (frame, resolve, pass, passLevel) =>\n recordBloomDownsamplePass(\n frame,\n resolve,\n pass,\n passLevel ?? level,\n targets.levelDimensions[passLevel ?? level],\n ),\n level,\n );\n if (!added.ok) return added;\n }\n for (let level = targets.upsample.length - 1; level >= 0; level -= 1) {\n const current = targets.downsample[level];\n const coarse =\n level === targets.downsample.length - 2\n ? targets.downsample[level + 1]\n : targets.upsample[level + 1];\n const write = targets.upsample[level];\n if (current === undefined || coarse === undefined || write === undefined) {\n return err(\n new RenderGraphError({\n code: 'resource-resolution-failed',\n expected: 'Bloom downsample and upsample levels form one adjacent pyramid',\n hint: 'rebuild the Standard Bloom target declaration from one level list',\n detail: { resourceLabel: `bloom-level-${level}` },\n }),\n );\n }\n const added = add(\n typedBloomLevelPassName('upsample', level),\n [current, coarse],\n write,\n (frame, resolve, pass, passLevel) =>\n recordBloomUpsamplePass(frame, resolve, pass, passLevel ?? level),\n level,\n );\n if (!added.ok) return added;\n }\n const finest = targets.upsample[0] ?? targets.downsample[0];\n if (finest === undefined) {\n return err(\n new RenderGraphError({\n code: 'resource-resolution-failed',\n expected: 'Bloom has at least one downsample level',\n hint: 'derive Bloom levels from a positive output extent',\n detail: { resourceLabel: 'bloom-downsample-0' },\n }),\n );\n }\n return add(\n TYPED_BLOOM_PASS_NAMES.composite,\n [targets.scene, finest],\n targets.composited,\n (frame, resolve, pass) => recordBloomCompositePass(frame, resolve, pass),\n );\n}\n\nexport interface TypedSsaoTargets {\n readonly normal: RenderPipelineTarget;\n readonly depth: RenderPipelineTarget;\n readonly raw: RenderPipelineTarget;\n readonly blurred: RenderPipelineTarget;\n}\n\nexport function addTypedSsaoPasses(\n graph: RenderGraphBuilder<RenderPipelineFrame>,\n targets: TypedSsaoTargets,\n): Result<void, RenderGraphError> {\n const calc = graph.addRasterPass('ssao-calc', {\n accesses: [\n { resource: targets.normal.view, usage: 'sampled-read' },\n { resource: targets.depth.view, usage: 'sampled-read' },\n { resource: targets.raw.view, usage: 'color-attachment' },\n ],\n colorAttachments: [\n {\n view: targets.raw.view,\n loadOp: 'clear',\n storeOp: 'store',\n clearValue: { r: 1, g: 1, b: 1, a: 1 },\n },\n ],\n encode: ({ pass, frame, resources }) => {\n const normal = resolvedView(resources, targets.normal.view);\n const depthCacheKey = resolvedView(resources, targets.depth.view);\n recordSsaoCalcPass(\n frame as _InternalRenderPipelineContext,\n undefined,\n undefined,\n undefined,\n undefined,\n pass,\n {\n output: resolvedView(resources, targets.raw.view),\n normal,\n depth: resolvedDepthView(frame, resources, targets.depth),\n depthCacheKey,\n },\n );\n },\n });\n if (!calc.ok) return calc;\n\n return graph.addRasterPass('ssao-blur', {\n accesses: [\n { resource: targets.raw.view, usage: 'sampled-read' },\n { resource: targets.normal.view, usage: 'sampled-read' },\n { resource: targets.depth.view, usage: 'sampled-read' },\n { resource: targets.blurred.view, usage: 'color-attachment' },\n ],\n colorAttachments: [\n {\n view: targets.blurred.view,\n loadOp: 'clear',\n storeOp: 'store',\n clearValue: { r: 1, g: 1, b: 1, a: 1 },\n },\n ],\n encode: ({ pass, frame, resources }) => {\n const normal = resolvedView(resources, targets.normal.view);\n const depthCacheKey = resolvedView(resources, targets.depth.view);\n recordSsaoBlurPass(\n frame as _InternalRenderPipelineContext,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n pass,\n {\n output: resolvedView(resources, targets.blurred.view),\n raw: resolvedView(resources, targets.raw.view),\n normal,\n depth: resolvedDepthView(frame, resources, targets.depth),\n depthCacheKey,\n },\n );\n },\n });\n}\n\nexport interface TypedFullscreenPassOptions {\n readonly name: string;\n readonly shader: string;\n /** Optional fragment entry point override for composed fullscreen shaders. */\n readonly fragmentEntryPoint?: string | undefined;\n readonly input: RenderPipelineTarget;\n readonly output: RenderPipelineTarget;\n readonly outputOnly?: boolean | undefined;\n readonly rawSwapchainOutput?: boolean | undefined;\n readonly depth?: RenderPipelineTarget | undefined;\n readonly additionalReads?: readonly {\n readonly key: string;\n readonly target: RenderPipelineTarget;\n }[];\n /** Optional per-pass copy of the params UBO payload. */\n readonly paramsTransform?:\n | ((params: Uint8Array | undefined) => Uint8Array | undefined)\n | undefined;\n}\n\nexport interface TypedTemporalResolveTargets {\n readonly scene: RenderPipelineTarget;\n /** Output-domain coverage produced by the Standard raster witness. */\n readonly coverage?: RenderPipelineTarget | undefined;\n /** Paired output-domain depth used to keep the producer observable. */\n readonly coverageDepth?: RenderPipelineTarget | undefined;\n /** Optional producer-owned R-channel reactivity in current screen space. */\n readonly secondaryReactivity?: GraphTextureView;\n readonly currentTemporal: RenderPipelineTarget;\n readonly depth: RenderPipelineTarget;\n readonly historyColor: RenderPipelineTarget;\n readonly historyTemporal: RenderPipelineTarget;\n readonly historyStability: RenderPipelineTarget;\n readonly writeColor: RenderPipelineTarget;\n readonly writeTemporal: RenderPipelineTarget;\n readonly writeStability: RenderPipelineTarget;\n}\n\nexport function addTypedTemporalResolvePass(\n graph: RenderGraphBuilder<RenderPipelineFrame>,\n targets: TypedTemporalResolveTargets,\n): Result<void, RenderGraphError> {\n const added = graph.addRasterPass('taa-resolve', {\n accesses: [\n { resource: targets.scene.view, usage: 'sampled-read' },\n { resource: targets.currentTemporal.view, usage: 'sampled-read' },\n ...(targets.coverage === undefined\n ? []\n : [{ resource: targets.coverage.view, usage: 'sampled-read' as const }]),\n ...(targets.coverageDepth === undefined\n ? []\n : [{ resource: targets.coverageDepth.view, usage: 'sampled-read' as const }]),\n { resource: targets.historyColor.view, usage: 'sampled-read' },\n { resource: targets.historyTemporal.view, usage: 'sampled-read' },\n { resource: targets.historyStability.view, usage: 'sampled-read' },\n ...(targets.secondaryReactivity === undefined\n ? []\n : [{ resource: targets.secondaryReactivity, usage: 'sampled-read' as const }]),\n { resource: targets.writeColor.view, usage: 'color-attachment' },\n { resource: targets.writeTemporal.view, usage: 'color-attachment' },\n { resource: targets.writeStability.view, usage: 'color-attachment' },\n ],\n colorAttachments: [\n {\n view: targets.writeColor.view,\n loadOp: 'clear',\n storeOp: 'store',\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n },\n {\n view: targets.writeTemporal.view,\n loadOp: 'clear',\n storeOp: 'store',\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n },\n {\n view: targets.writeStability.view,\n loadOp: 'clear',\n storeOp: 'store',\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n },\n ],\n encode: ({ pass, frame, resources }) => {\n const internal = frame as _InternalRenderPipelineContext;\n const state = getTemporalGpuState(\n internal.frameState,\n frame.runtime.device,\n (frame.runtime as import('./record/render-context').RenderSystemRuntime).deviceScope,\n frame.targetW,\n frame.targetH,\n );\n const built = getTemporalBindGroupResources(state);\n const current = resolvedView(resources, targets.scene.view);\n const currentTemporal = resolvedView(resources, targets.currentTemporal.view);\n const historyColor = resolvedView(resources, targets.historyColor.view);\n const historyTemporal = resolvedView(resources, targets.historyTemporal.view);\n const historyStability = resolvedView(resources, targets.historyStability.view);\n const params = getTemporalParamsBuffer(state);\n if (params === undefined || built.sampler === null || built.temporalSampler === null) {\n throwTemporalEncodeFailure('TAA resolve has an admitted params buffer and sampler');\n }\n const payload = new ArrayBuffer(32);\n new Float32Array(payload).set([\n frame.camera.temporal?.currentJitterUv?.[0] ?? 0,\n frame.camera.temporal?.currentJitterUv?.[1] ?? 0,\n ]);\n const words = new Uint32Array(payload);\n words[2] = state.valid && (frame.camera.temporal?.historyValid ?? true) ? 1 : 0;\n words[3] = frame.camera.temporal?.temporalFrameIndex ?? 0;\n words[4] = Number(targets.secondaryReactivity !== undefined);\n words[5] = Number(targets.coverage !== undefined);\n const written = frame.runtime.device.queue.writeBuffer(params, 0, new Uint8Array(payload));\n if (!written.ok)\n throwTemporalEncodeFailure('TAA resolve params upload succeeds', written.error);\n const bindGroup = frame.runtime.device.createBindGroup({\n label: 'taa-resolve-bind-group',\n layout: built.layout,\n entries: [\n { binding: 0, resource: { kind: 'textureView', value: current } },\n { binding: 1, resource: { kind: 'sampler', value: built.sampler } },\n { binding: 2, resource: { kind: 'textureView', value: historyColor } },\n { binding: 3, resource: { kind: 'sampler', value: built.sampler } },\n { binding: 4, resource: { kind: 'textureView', value: historyTemporal } },\n { binding: 5, resource: { kind: 'sampler', value: built.temporalSampler } },\n { binding: 6, resource: { kind: 'textureView', value: currentTemporal } },\n { binding: 7, resource: { kind: 'sampler', value: built.temporalSampler } },\n { binding: 8, resource: { kind: 'buffer', value: { buffer: params } } },\n { binding: 9, resource: { kind: 'textureView', value: historyStability } },\n {\n binding: 10,\n resource: {\n kind: 'textureView',\n value:\n targets.secondaryReactivity === undefined\n ? currentTemporal\n : resolvedView(resources, targets.secondaryReactivity),\n },\n },\n {\n binding: 11,\n resource: {\n kind: 'textureView',\n value:\n targets.coverage === undefined\n ? currentTemporal\n : resolvedView(resources, targets.coverage.view),\n },\n },\n ] as never,\n });\n if (!bindGroup.ok) {\n throwTemporalEncodeFailure('TAA resolve bind group creation succeeds', bindGroup.error);\n }\n const pipeline = frame.runtime.getPostProcessPipeline?.('forgeax.taa-resolve', built.layout, [\n targets.writeColor.format,\n targets.writeTemporal.format,\n targets.writeStability.format,\n ] as GPUTextureFormat[]);\n if (pipeline === null || pipeline === undefined) {\n throwTemporalEncodeFailure('TAA resolve pipeline is ready before frame encoding');\n }\n pass.setPipeline(pipeline);\n pass.setBindGroup(1, bindGroup.value);\n pass.draw(3, 1, 0, 0);\n stageTemporalGpuSubmit(state);\n internal.frameState.temporalGpuState = state;\n },\n });\n return added;\n}\n\nexport function addTypedFullscreenPass(\n graph: RenderGraphBuilder<RenderPipelineFrame>,\n options: TypedFullscreenPassOptions,\n): Result<void, RenderGraphError> {\n return graph.addRasterPass(options.name, {\n accesses: [\n { resource: options.input.view, usage: 'sampled-read' },\n { resource: options.output.view, usage: 'color-attachment' },\n ...(options.depth === undefined\n ? []\n : [{ resource: options.depth.view, usage: 'sampled-read' as const }]),\n ...(options.additionalReads?.map((read) => ({\n resource: read.target.view,\n usage: 'sampled-read' as const,\n })) ?? []),\n ],\n colorAttachments: [\n {\n view: options.output.view,\n loadOp: 'clear',\n storeOp: 'store',\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n },\n ],\n encode: ({ pass, frame, resources }) => {\n if (options.outputOnly && frame.runtime.lookupPostProcess?.(options.shader) === undefined) {\n return;\n }\n encodeFullscreenPass(frame, pass, {\n name: options.name,\n shader: options.shader,\n color: 'output',\n reads: ['input'],\n resolve: legacyResolver(resources, {\n input: options.input,\n output: options.output,\n ldrColor: options.input,\n 'scene-color': options.input,\n ...(options.depth === undefined ? {} : { 'scene-depth': options.depth }),\n ...(options.additionalReads === undefined\n ? {}\n : Object.fromEntries(options.additionalReads.map((read) => [read.key, read.target]))),\n }),\n outputFormat: options.output.format as GPUTextureFormat,\n ...(options.depth === undefined\n ? {}\n : { depthView: resolvedDepthView(frame, resources, options.depth) }),\n ...(options.rawSwapchainOutput === undefined\n ? {}\n : { rawSwapchainOutput: options.rawSwapchainOutput }),\n ...(options.paramsTransform === undefined\n ? {}\n : {\n paramsOverride: options.paramsTransform(frame.postProcessParams.get(options.shader)),\n }),\n ...(options.fragmentEntryPoint === undefined\n ? {}\n : { fragmentEntryPoint: options.fragmentEntryPoint }),\n ...(options.depth === undefined ? {} : { msaaActive: options.depth.sampleCount === 4 }),\n });\n },\n });\n}\n\nexport function addTypedCompositePostEffects(\n graph: RenderGraphBuilder<RenderPipelineFrame>,\n effects: readonly string[],\n input: RenderPipelineTarget,\n output: RenderPipelineTarget,\n depth: RenderPipelineTarget,\n size: { readonly width: number; readonly height: number },\n): Result<void, RenderGraphError> {\n let currentInput = input;\n for (let index = 0; index < effects.length; index += 1) {\n const shader = effects[index];\n if (shader === undefined) continue;\n const effectInput = currentInput;\n const scratch = createRenderPipelineTarget(graph, `post-effect-scratch-${index}`, {\n format: output.format as GPUTextureFormat,\n size: 'surface',\n });\n if (!scratch.ok) return scratch;\n const effectOutput =\n index === effects.length - 1\n ? ok(output)\n : createRenderPipelineTarget(graph, `post-effect-output-${index}`, {\n format: output.format as GPUTextureFormat,\n size: 'surface',\n });\n if (!effectOutput.ok) return effectOutput;\n const copied = graph.addCopyPass(`post-effect-copy-${index}`, {\n accesses: [\n { resource: effectInput.view, usage: 'copy-src' },\n { resource: scratch.value.view, usage: 'copy-dst' },\n ],\n encode: ({ encoder, resources }) => {\n const source = resources.texture(effectInput.texture);\n if (!source.ok) throw source.error;\n const destination = resources.texture(scratch.value.texture);\n if (!destination.ok) throw destination.error;\n encoder.copyTextureToTexture(\n { texture: source.value as never, mipLevel: 0, origin: { x: 0, y: 0, z: 0 } },\n { texture: destination.value as never, mipLevel: 0, origin: { x: 0, y: 0, z: 0 } },\n { width: size.width, height: size.height, depthOrArrayLayers: 1 },\n );\n },\n });\n if (!copied.ok) return copied;\n const effect = addTypedFullscreenPass(graph, {\n name: `post-effect-${index}`,\n shader,\n input: scratch.value,\n output: effectOutput.value,\n depth,\n });\n if (!effect.ok) return effect;\n currentInput = effectOutput.value;\n }\n return ok(undefined);\n}\n\nexport function addTypedOutputTransformPass(\n graph: RenderGraphBuilder<RenderPipelineFrame>,\n input: RenderPipelineTarget,\n output: RenderPipelineTarget,\n options: {\n readonly outputOnly?: boolean;\n readonly dither?: boolean;\n readonly name?: string | undefined;\n readonly fragmentEntryPoint?: string | undefined;\n } = {},\n): Result<void, RenderGraphError> {\n const outputOnly = options.outputOnly ?? false;\n if (options.fragmentEntryPoint === 'fs_encode_only') {\n const ldrCapture = addObservationCapturePass(graph, input, 'linear-ldr');\n if (!ldrCapture.ok) return ldrCapture;\n }\n const transformed = addTypedFullscreenPass(graph, {\n name: options.name ?? (outputOnly ? 'present' : 'output-transform'),\n shader: STANDARD_OUTPUT_TRANSFORM_FEATURE_ID,\n input,\n output,\n outputOnly,\n rawSwapchainOutput: outputOnly,\n ...(options.dither !== undefined\n ? {\n paramsTransform: (params: Uint8Array | undefined): Uint8Array | undefined => {\n if (params === undefined || params.byteLength !== 16) return params;\n const transformed = params.slice();\n new DataView(\n transformed.buffer,\n transformed.byteOffset,\n transformed.byteLength,\n ).setFloat32(12, options.dither === true ? 1 : 0, true);\n return transformed;\n },\n }\n : {}),\n ...(options.fragmentEntryPoint === undefined\n ? {}\n : { fragmentEntryPoint: options.fragmentEntryPoint }),\n });\n if (!transformed.ok) return transformed;\n if (options.fragmentEntryPoint === 'fs_encode_only') {\n const finalCapture = addObservationCapturePass(graph, output, 'final-srgb');\n if (!finalCapture.ok) return finalCapture;\n }\n return ok(undefined);\n}\n","import type {\n GraphTextureDescriptor,\n RenderGraphBuilder,\n RenderGraphError,\n} from '@forgeax/engine-render-graph';\nimport { ok, type Result } from '@forgeax/engine-types';\nimport type { RenderExtent } from '../pipeline/render-extent';\nimport { renderExtentSize } from '../pipeline/render-extent';\nimport type { RenderPipelineFrame, RenderPipelineTarget } from '../render-pipeline';\nimport { createRenderPipelineTarget } from '../render-pipeline';\nimport { addTypedFullscreenPass, addTypedScenePass } from '../typed-render-graph-primitives';\n\nexport interface StandardTemporalDemandInput {\n readonly taa: boolean;\n readonly motionBlur: boolean;\n readonly ssr?: boolean;\n}\n\nexport interface StandardTemporalDemand {\n readonly consumerIds: readonly ('taa' | 'motion-blur' | 'ssr')[];\n readonly targetCount: 0 | 1;\n readonly producerPassCount: 0 | 1;\n readonly historyCount: 0 | 1;\n}\n\nexport interface StandardTemporalDemandDescription {\n readonly consumerCount: number;\n readonly targetCount: 0 | 1;\n readonly producerPassCount: 0 | 1;\n readonly historyCount: 0 | 1;\n readonly byteLength: 0 | 1;\n}\n\n/** Aggregate all temporal consumers before any graph resource is allocated. */\nexport function aggregateTemporalDemand(\n input: StandardTemporalDemandInput,\n): StandardTemporalDemand {\n const consumerIds = [\n ...(input.taa ? (['taa'] as const) : []),\n ...(input.motionBlur ? (['motion-blur'] as const) : []),\n ...(input.ssr ? (['ssr'] as const) : []),\n ];\n const requested = consumerIds.length > 0;\n return Object.freeze({\n consumerIds: Object.freeze(consumerIds),\n targetCount: requested ? 1 : 0,\n producerPassCount: requested ? 1 : 0,\n historyCount: input.taa ? 1 : 0,\n });\n}\n\nexport function describeTemporalDemand(\n demand: StandardTemporalDemand,\n): StandardTemporalDemandDescription {\n return {\n consumerCount: demand.consumerIds.length,\n targetCount: demand.targetCount,\n producerPassCount: demand.producerPassCount,\n historyCount: demand.historyCount,\n byteLength: demand.targetCount,\n };\n}\n\nexport type StandardTemporalLane = 'direct' | 'clustered' | 'cpu-webgl2' | 'rhi-null';\n\nexport type StandardTemporalLaneAdmission =\n | {\n readonly status: 'available';\n readonly schema: typeof import('./scene-data').SCENE_DATA_TEMPORAL_V1_SCHEMA;\n readonly producerId: 'forgeax::standard::scene-data';\n readonly structuralOnly: boolean;\n readonly format: 'rgba16float';\n }\n | {\n readonly status: 'unavailable';\n readonly reason: 'capability-missing' | 'producer-missing' | 'no-demand';\n readonly format?: never;\n };\n\nexport function standardTemporalLaneAdmission(input: {\n readonly lane: StandardTemporalLane;\n readonly demand: StandardTemporalDemand;\n readonly capabilities: {\n readonly compute: boolean;\n readonly storageBuffer: boolean;\n readonly rgba16floatRenderable: boolean;\n readonly filterable?: boolean;\n readonly copy?: boolean;\n readonly readback?: boolean;\n readonly producerPresent?: boolean;\n };\n}): StandardTemporalLaneAdmission {\n if (input.demand.targetCount === 0) return { status: 'unavailable', reason: 'no-demand' };\n if (input.capabilities.producerPresent === false)\n return { status: 'unavailable', reason: 'producer-missing' };\n if (\n !input.capabilities.rgba16floatRenderable ||\n input.capabilities.filterable === false ||\n input.capabilities.copy === false ||\n input.capabilities.readback === false\n ) {\n return { status: 'unavailable', reason: 'capability-missing' };\n }\n return {\n status: 'available',\n schema: 'forgeax::scene-data::temporal-v1',\n producerId: 'forgeax::standard::scene-data',\n structuralOnly: input.lane === 'rhi-null',\n format: 'rgba16float',\n };\n}\n\nexport function standardTemporalPostOrder(input: {\n readonly taa: boolean;\n readonly motionBlur: boolean;\n readonly bloom: boolean;\n}): readonly string[] {\n const order = ['scene'];\n if (input.taa || input.motionBlur) order.push('standard-scene-data');\n if (input.taa) order.push('taa-resolve');\n if (input.motionBlur) order.push('motion-blur');\n if (input.bloom) order.push('bloom', 'tone');\n order.push('output');\n return Object.freeze(order);\n}\n\nexport interface StandardSceneDataTargets {\n readonly temporal: RenderPipelineTarget;\n}\n\nconst TEMPORAL_TARGET: GraphTextureDescriptor = {\n format: 'rgba16float',\n size: 'surface',\n sampleCount: 1,\n};\n\n/** The single Standard TAA current-frame producer target. */\nexport function createStandardSceneDataTarget(\n graph: RenderGraphBuilder<RenderPipelineFrame>,\n extent?: RenderExtent,\n): Result<StandardSceneDataTargets, RenderGraphError> {\n const temporal = createRenderPipelineTarget(graph, 'standard-scene-temporal', {\n ...TEMPORAL_TARGET,\n size: extent === undefined ? TEMPORAL_TARGET.size : renderExtentSize(extent, 'internal'),\n });\n return temporal.ok ? ok({ temporal: temporal.value }) : temporal;\n}\n\nexport function addStandardSceneDataPass(\n graph: RenderGraphBuilder<RenderPipelineFrame>,\n target: RenderPipelineTarget,\n depth: RenderPipelineTarget,\n): Result<void, RenderGraphError> {\n return addTypedScenePass(graph, {\n name: 'standard-scene-data',\n color: target,\n depth,\n selector: { LightMode: ['Deferred', 'Forward'] },\n passKind: 'temporal',\n // The temporal producer re-rasterizes the current scene after the main\n // color pass has populated depth. Its output is a semantic motion target;\n // it must cover the same fragments even when TAA jitter moves the raster\n // edge by a subpixel, while the loaded scene depth remains the consumer's\n // depth-rejection source for Motion Blur/TAA.\n clearColor: [0, 0, -1, 1],\n colorLoadOp: 'clear',\n depthLoadOp: 'load',\n });\n}\n\nexport function addTaaResolvePass(\n graph: RenderGraphBuilder<RenderPipelineFrame>,\n current: RenderPipelineTarget,\n currentTemporal: RenderPipelineTarget,\n previousColor: RenderPipelineTarget,\n previousTemporal: RenderPipelineTarget,\n output: RenderPipelineTarget,\n): Result<void, RenderGraphError> {\n return addTypedFullscreenPass(graph, {\n name: 'taa-resolve',\n shader: 'forgeax.taa-resolve',\n input: current,\n output,\n additionalReads: [\n { key: 'scene-temporal', target: currentTemporal },\n { key: 'taa-history-color', target: previousColor },\n { key: 'taa-history-temporal', target: previousTemporal },\n ],\n });\n}\n"]}
|