@photivra/engine 2.21.0 → 2.23.0
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/CHANGELOG.md +150 -1
- package/CITATION.cff +1 -1
- package/README.md +6 -6
- package/SECURITY.md +1 -1
- package/THIRD_PARTY.md +11 -0
- package/dist/capture/c2pa-embed.d.ts +116 -0
- package/dist/capture/c2pa-embed.js +493 -0
- package/dist/capture/c2pa-embed.js.map +1 -0
- package/dist/capture/dng-import.d.ts +73 -8
- package/dist/capture/dng-import.js +315 -80
- package/dist/capture/dng-import.js.map +1 -1
- package/dist/capture/dng-opcodes.d.ts +96 -0
- package/dist/capture/dng-opcodes.js +391 -0
- package/dist/capture/dng-opcodes.js.map +1 -0
- package/dist/capture/dng-profile-maps.d.ts +99 -0
- package/dist/capture/dng-profile-maps.js +381 -0
- package/dist/capture/dng-profile-maps.js.map +1 -0
- package/dist/capture/dng-stage-image.d.ts +23 -0
- package/dist/capture/dng-stage-image.js +65 -0
- package/dist/capture/dng-stage-image.js.map +1 -0
- package/dist/capture/jpeg-xl-tiles.d.ts +22 -0
- package/dist/capture/jpeg-xl-tiles.js +151 -0
- package/dist/capture/jpeg-xl-tiles.js.map +1 -0
- package/dist/capture/lossy-jpeg.d.ts +17 -0
- package/dist/capture/lossy-jpeg.js +369 -0
- package/dist/capture/lossy-jpeg.js.map +1 -0
- package/dist/capture/native-raw-development.d.ts +2 -1
- package/dist/capture/native-raw-development.js.map +1 -1
- package/dist/color/neighbor-highlight-reconstruction.d.ts +76 -0
- package/dist/color/neighbor-highlight-reconstruction.js +257 -0
- package/dist/color/neighbor-highlight-reconstruction.js.map +1 -0
- package/dist/color/sensor-color-development.d.ts +5 -0
- package/dist/color/sensor-color-development.js +7 -1
- package/dist/color/sensor-color-development.js.map +1 -1
- package/dist/color/spectral-spikiness.d.ts +11 -0
- package/dist/color/spectral-spikiness.js +23 -0
- package/dist/color/spectral-spikiness.js.map +1 -0
- package/dist/core/execution-error.d.ts +21 -0
- package/dist/core/execution-error.js +12 -0
- package/dist/core/execution-error.js.map +1 -0
- package/dist/core/version.d.ts +1 -1
- package/dist/core/version.js +1 -1
- package/dist/core/version.js.map +1 -1
- package/dist/facade/catalogue-lens-signal.d.ts +26 -1
- package/dist/facade/catalogue-lens-signal.js +25 -7
- package/dist/facade/catalogue-lens-signal.js.map +1 -1
- package/dist/facade/diffraction-provider.d.ts +1 -1
- package/dist/facade/diffraction-provider.js +4 -4
- package/dist/facade/diffraction-provider.js.map +1 -1
- package/dist/facade/display-view-gpu-session.js +38 -6
- package/dist/facade/display-view-gpu-session.js.map +1 -1
- package/dist/facade/display-view-gpu.d.ts +13 -5
- package/dist/facade/display-view-gpu.js.map +1 -1
- package/dist/facade/display-view-normal.d.ts +15 -0
- package/dist/facade/display-view-normal.js +44 -0
- package/dist/facade/display-view-normal.js.map +1 -0
- package/dist/facade/display-view-rendering.d.ts +102 -0
- package/dist/facade/display-view-rendering.js +633 -0
- package/dist/facade/display-view-rendering.js.map +1 -0
- package/dist/facade/display-view.d.ts +37 -65
- package/dist/facade/display-view.js +147 -476
- package/dist/facade/display-view.js.map +1 -1
- package/dist/facade/expected-signal-setup.js +2 -2
- package/dist/facade/expected-signal-setup.js.map +1 -1
- package/dist/facade/fast-methods.d.ts +1 -1
- package/dist/facade/fast-methods.js +37 -8
- package/dist/facade/fast-methods.js.map +1 -1
- package/dist/facade/generic-lens-capture.d.ts +1 -1
- package/dist/facade/generic-lens-capture.js +1 -1
- package/dist/facade/generic-lens-capture.js.map +1 -1
- package/dist/facade/image-plane.js +41 -10
- package/dist/facade/image-plane.js.map +1 -1
- package/dist/facade/on-demand-kits.d.ts +14 -0
- package/dist/facade/on-demand-kits.js +36 -0
- package/dist/facade/on-demand-kits.js.map +1 -0
- package/dist/facade/opt-in-kit.d.ts +9 -0
- package/dist/facade/opt-in-kit.js +11 -0
- package/dist/facade/opt-in-kit.js.map +1 -0
- package/dist/facade/quality-kit.d.ts +21 -0
- package/dist/facade/quality-kit.js +23 -0
- package/dist/facade/quality-kit.js.map +1 -0
- package/dist/facade/quality-paths.d.ts +22 -0
- package/dist/facade/quality-paths.js +44 -0
- package/dist/facade/quality-paths.js.map +1 -0
- package/dist/facade/scene-radiance.d.ts +18 -2
- package/dist/facade/scene-radiance.js +6 -4
- package/dist/facade/scene-radiance.js.map +1 -1
- package/dist/facade/simulate-capture.d.ts +32 -13
- package/dist/facade/simulate-capture.js +162 -69
- package/dist/facade/simulate-capture.js.map +1 -1
- package/dist/facade/simulate-display-view.d.ts +10 -12
- package/dist/facade/simulate-display-view.js +57 -48
- package/dist/facade/simulate-display-view.js.map +1 -1
- package/dist/gpu/display-view-gpu-renderer.d.ts +43 -0
- package/dist/gpu/display-view-gpu-renderer.js +134 -0
- package/dist/gpu/display-view-gpu-renderer.js.map +1 -0
- package/dist/gpu/display-view-image-material-module.d.ts +3 -2
- package/dist/gpu/display-view-image-material-module.js +25 -3
- package/dist/gpu/display-view-image-material-module.js.map +1 -1
- package/dist/gpu/display-view-image-quality.d.ts +43 -1
- package/dist/gpu/display-view-image-quality.js +256 -11
- package/dist/gpu/display-view-image-quality.js.map +1 -1
- package/dist/gpu/display-view-quality-gpu.d.ts +13 -64
- package/dist/gpu/display-view-quality-gpu.js +55 -240
- package/dist/gpu/display-view-quality-gpu.js.map +1 -1
- package/dist/gpu/display-view-speed-gpu.d.ts +16 -16
- package/dist/gpu/display-view-speed-gpu.js +62 -19
- package/dist/gpu/display-view-speed-gpu.js.map +1 -1
- package/dist/gpu/image-kernel-accelerator.js +3 -0
- package/dist/gpu/image-kernel-accelerator.js.map +1 -1
- package/dist/gpu/image-kernel-execution.d.ts +2 -13
- package/dist/gpu/image-kernel-execution.js +2 -10
- package/dist/gpu/image-kernel-execution.js.map +1 -1
- package/dist/gpu/wgsl-display-view-coupled-stub.d.ts +13 -0
- package/dist/gpu/wgsl-display-view-coupled-stub.js +29 -0
- package/dist/gpu/wgsl-display-view-coupled-stub.js.map +1 -0
- package/dist/gpu/wgsl-display-view-coupled.d.ts +91 -0
- package/dist/gpu/wgsl-display-view-coupled.js +365 -0
- package/dist/gpu/wgsl-display-view-coupled.js.map +1 -0
- package/dist/gpu/wgsl-display-view-neighbors.d.ts +46 -0
- package/dist/gpu/wgsl-display-view-neighbors.js +114 -0
- package/dist/gpu/wgsl-display-view-neighbors.js.map +1 -0
- package/dist/gpu/wgsl-display-view-quality-kernel.d.ts +6 -9
- package/dist/gpu/wgsl-display-view-quality-kernel.js +113 -113
- package/dist/gpu/wgsl-display-view-quality-kernel.js.map +1 -1
- package/dist/gpu/wgsl-display-view-speed-kernel.d.ts +1 -41
- package/dist/gpu/wgsl-display-view-speed-kernel.js +73 -10
- package/dist/gpu/wgsl-display-view-speed-kernel.js.map +1 -1
- package/dist/index.d.ts +11 -3
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/output/camera-channel-response.d.ts +50 -0
- package/dist/output/camera-channel-response.js +69 -0
- package/dist/output/camera-channel-response.js.map +1 -0
- package/dist/output/native-capture-sdr.js +5 -2
- package/dist/output/native-capture-sdr.js.map +1 -1
- package/dist/output/sdr-rendering.d.ts +18 -1
- package/dist/output/sdr-rendering.js +39 -2
- package/dist/output/sdr-rendering.js.map +1 -1
- package/dist/sensor/native-sensor-report.d.ts +10 -0
- package/dist/sensor/native-sensor-report.js +16 -0
- package/dist/sensor/native-sensor-report.js.map +1 -0
- package/dist/sensor/sensor-characteristics.d.ts +81 -13
- package/dist/sensor/sensor-characteristics.js +10 -6
- package/dist/sensor/sensor-characteristics.js.map +1 -1
- package/docs/API_REFERENCE.md +117 -4
- package/docs/QUICK_START.md +37 -8
- package/docs/USAGE.md +105 -22
- package/docs/api/capture-c2pa-embed.md +177 -0
- package/docs/api/capture-dng-import.md +86 -10
- package/docs/api/capture-dng-opcodes.md +93 -0
- package/docs/api/capture-dng-profile-maps.md +141 -0
- package/docs/api/capture-dng-stage-image.md +43 -0
- package/docs/api/capture-jpeg-xl-tiles.md +33 -0
- package/docs/api/capture-lossy-jpeg.md +41 -0
- package/docs/api/capture-native-raw-development.md +2 -1
- package/docs/api/core-execution-error.md +43 -0
- package/docs/api/core-version.md +1 -1
- package/docs/api/exports.json +255 -5
- package/docs/api/facade-display-view-gpu.md +5 -2
- package/docs/api/facade-display-view.md +11 -15
- package/docs/api/facade-fast-methods.md +38 -9
- package/docs/api/facade-quality-paths.md +24 -0
- package/docs/api/facade-scene-radiance.md +1 -1
- package/docs/api/facade-simulate-capture.md +24 -7
- package/docs/api/facade-simulate-display-view.md +10 -12
- package/docs/api/gpu-image-kernel-execution.md +0 -36
- package/docs/api/output-camera-channel-response.md +55 -0
- package/docs/api/output-sdr-rendering.md +6 -1
- package/docs/api/sensor-sensor-characteristics.md +54 -2
- package/llms.txt +1 -0
- package/package.json +6 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"display-view-quality-gpu.js","sourceRoot":"","sources":["../../src/gpu/display-view-quality-gpu.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Host side of the display view's Quality path on the GPU (#479): the support check, the float64 tables (the lattice groups\n * and their combined diffraction kernels per material and channel, as the reference forms them; the bilinear and AHD\n * candidate kernels; the footprint geometry), the three passes per band of display rows (lattice materials, site moments,\n * display pixels; `wgsl-display-view-quality-kernel.ts`), the low-signal correction states (computed on the host with the\n * reference's own `computeDisplayViewCorrectionStates`, #447, uploaded as a sorted table and grown from the grid keys the\n * kernel records), and the reference's own float64 finishing per display pixel (`finishDisplayViewPixel` of the Speed host:\n * the quantization term, the seeded noise draw, the Cholesky factor, the clipped centre, the sRGB encode and the rounding),\n * so the noise draw is bit-identical to the CPU's.\n *\n * Defocus (#492 step 2c): out of focus the expected signal carries the defocus disc (or each node's diffraction kernel\n * convolved with it) as site kernels, up to radius 96. The site pass then reads a factored table, sums in blocks, and reads a\n * lattice whose uncertain points the host resolved with the reference's own material lookup; a band's site pass is split over\n * dispatches of at most `DISPLAY_VIEW_QUALITY_SITE_TAPS_PER_DISPATCH` taps. A defocused Speed request runs these passes with\n * its bilinear demosaic (docs/WEBGPU.md, \"Defocus on the GPU\").\n *\n * The float64 reference is `renderDisplayView` (facade/display-view.ts) on the exact-area-mean path with\n * `createDisplayViewExpectedSignal` (facade/expected-signal.ts), chart materials, with or without diffraction kernels,\n * the bilinear or the AHD candidates and the low-signal correction. Internal: not exported from the package.\n *\n * Flagged display pixels (an uncertain lattice material among the sites read, a missing correction state after the\n * states were computed, a correction-threshold decision within its bound, AHD's choice on the noise-free mosaic able to move\n * the pixel by more than DISPLAY_VIEW_QUALITY_CHOICE_SIGMA of its noise (#457), a non-finite output) are recomputed with the\n * reference, so they are exact. Every stage's wall-clock time is reported (`stageMilliseconds`); on a software adapter it\n * is not GPU performance.\n */\nimport { AHD_KEY_LEVELS, EXACT_AREA_MEAN_MAX_PIXELS, axisSums, computeDisplayViewCorrectionStates, displayViewCorrectionKey, displayViewDecidedSaturation, overlaps, renderDisplayView,\n ahdCandidateKernels, type AxisSums, type DisplayViewCorrectionSetup, type DisplayViewKernelTap, type DisplayViewRenderResult, type DisplayViewSetup } from \"../facade/display-view.js\";\nimport { displayViewSignalTables, type DisplayViewExpectedSignalInput, type GroupTables } from \"../facade/expected-signal.js\";\nimport type { DisplayViewGpuSetup } from \"../facade/display-view.js\";\nimport { createDisplayViewMaterialModules, type DisplayViewMaterialModules } from \"./display-view-composite-material-module.js\";\nimport { setDisplayViewGpuRendererFactory, type DisplayViewGpuConformanceCase, type DisplayViewGpuPart, type DisplayViewGpuRenderOutput, type DisplayViewGpuRenderer,\n type DisplayViewGpuRendererFactory, type DisplayViewGpuRequest, type DisplayViewGpuRuntimeHandle } from \"../facade/display-view-gpu.js\";\nimport { chartPresetMaterialModule } from \"./display-view-chart-material-module.js\";\nimport { DISPLAY_VIEW_SPEED_CONFORMANCE_CASE, CONFORMANCE_FRAME, recomputeRuns, sceneToneAndOffsetsReason, conformanceChannelAt, conformanceChart, conformanceResponses, conformanceSetup, conformanceVerdict, withConformanceAbort, axisRecord, displayViewSpeedGpuSupports, displayViewSpeedGpuUnsupportedReason, finishDisplayViewPixel, gaussLegendre16, queryGeometry,\n renderDisplayViewSpeedOnGpu, type DisplayViewGpuMaterialModule } from \"./display-view-speed-gpu.js\";\nimport { createHostYieldGate } from \"../capture/host-yield-cadence.js\";\nimport { createDefocusDiscSiteKernel } from \"../optics/defocus-disc-kernel.js\";\nimport { ImageKernelExecutionError, WEBGPU_F32_UNIT_ROUNDOFF, webGpuExecution, type ImageKernelExecution, type ImageKernelRelativeErrorBound } from \"./image-kernel-execution.js\";\nimport { BUFFER_USAGE, GpuResourceScope, abortedError, createComputePipeline, linearDispatch, runComputePass, type WebGpuRuntime, throwIfAborted as checkAbort } from \"./webgpu-runtime.js\";\nimport { DISPLAY_VIEW_QUALITY_AUX, DISPLAY_VIEW_QUALITY_BITMAP_WORDS, DISPLAY_VIEW_QUALITY_CANDIDATE_ENTRIES, DISPLAY_VIEW_QUALITY_CANDIDATE_FLOATS, DISPLAY_VIEW_QUALITY_FLAG, DISPLAY_VIEW_QUALITY_FLAG_WORDS,\n DISPLAY_VIEW_QUALITY_GEOMETRY_STRIDE, DISPLAY_VIEW_QUALITY_GROUP_WORDS, DISPLAY_VIEW_QUALITY_MAXIMUM_NODES, DISPLAY_VIEW_QUALITY_MAXIMUM_PIXELS_PER_AXIS, DISPLAY_VIEW_QUALITY_OUTPUT_FLOATS, DISPLAY_VIEW_QUALITY_PARAM_WORDS,\n DISPLAY_VIEW_QUALITY_PIXELS_WGSL, DISPLAY_VIEW_QUALITY_SITES_BLOCKED_WGSL, DISPLAY_VIEW_QUALITY_SITES_WGSL, DISPLAY_VIEW_QUALITY_SITE_FLOATS, DISPLAY_VIEW_QUALITY_TAP_WORDS, DISPLAY_VIEW_QUALITY_WORKGROUP_SIZE,\n assembleDisplayViewQualityLatticeWgsl } from \"./wgsl-display-view-quality-kernel.js\";\n\ntype PipelineSource = (label: string, code: string) => Promise<GPUComputePipeline>;\ntype YieldControl = ((signal: AbortSignal) => Promise<void>) | undefined;\n\n/** One WGSL rounding of + − × in either direction (W3C WGSL \"Floating Point Accuracy\"; #471, #487): twice the binary32 unit roundoff. */\nconst E = 2 * WEBGPU_F32_UNIT_ROUNDOFF;\n/** Every reported bound is doubled: the kernel's running bounds are first order, and their own float32 arithmetic rounds. */\nconst MARGIN = 2;\n/** The reference's own float64 rounding of its chains, relative. */\nconst CPU_RELATIVE = 2 ** -40;\n/** Table values above this are outside the float32 domain. */\nconst FLOAT32_SAFE_MAGNITUDE = 2 ** 120;\n/** Largest demosaic reach (AHD's candidates read 3 sites away) and lattice group count the tables hold. */\nconst MAXIMUM_REACH = 3, MAXIMUM_GROUPS = 64;\n/**\n * Largest site-kernel radius the gather takes: the diffraction cap (32 sites) plus the defocus disc's (64 sites), the largest\n * combined radius the reference builds (#492; `buildExpectedSignalInput`).\n */\nexport const DISPLAY_VIEW_QUALITY_MAXIMUM_KERNEL_RADIUS = 96;\n/**\n * Default largest number of taps one site-pass dispatch gathers (sites × taps per site), so that a band of a large defocus\n * kernel (up to 150 544 taps per site at radius 96) is split over several dispatches instead of one long one that an operating\n * system's GPU watchdog could reset (Windows' default TDR delay is 2 s). A choice, not a measurement: 2³⁰ taps take 0.1 s at an\n * assumed 10¹⁰ taps per second; at radius 94 it leaves about 7 100 sites (111 workgroups) per dispatch, fewer than a large GPU\n * runs at once. In focus a band stays one dispatch (400 taps per site at f/8). The hardware run of #475 records the site pass's\n * time and dispatch count (`stageMilliseconds.sites`, `siteDispatches`), which decide whether the budget or a gather split over\n * several invocations per site is needed.\n */\nexport const DISPLAY_VIEW_QUALITY_SITE_TAPS_PER_DISPATCH = 2 ** 30;\n/** The smallest positive normal float32: values below it may be flushed to zero by a device (WGSL allows it). */\nconst FLOAT32_MINIMUM_NORMAL = 2 ** -126;\n/** Candidate table entries per phase: the (2·reach + 1)² window. */\nconst WINDOW_SLOTS = (2 * MAXIMUM_REACH + 1) ** 2;\n/**\n * The host's output quantization term q(m) = s(e)²·Δ²/12 (`quantizationVariance`, s the sRGB EOTF's slope at the encoded mean e)\n * is evaluated at the GPU's mean, so it moves with the mean's error: dq/dm = 2·s′(e)·Δ²/12 (de/dm = 1/s), with\n * s′(e) = (2.4/1.055)·(1.4/1.055)·((e + 0.055)/1.055)^0.4 ≤ 3.02 on [0, 1] and 0 on the linear segment and outside [0, 1];\n * q is non-decreasing in m, with a jump of (s₊² − s₋²)·Δ²/12 ≤ 2.1·10⁻⁴·Δ²/12 at the segment join (linear m = 0.0031308).\n */\nconst QUANTIZATION_SLOPE = 6.04, QUANTIZATION_JOIN_JUMP = 2.1e-4, QUANTIZATION_JOIN = 0.0031308;\n/** Bytes per display pixel in the output buffers (moments plus the flag word). */\nconst OUTPUT_BYTES_PER_PIXEL = 4 * DISPLAY_VIEW_QUALITY_OUTPUT_FLOATS + 4 * DISPLAY_VIEW_QUALITY_FLAG_WORDS;\nconst SITE_BYTES = 4 * DISPLAY_VIEW_QUALITY_SITE_FLOATS;\n\n/** What a GPU render of a Quality display view needs: the reference's own setup and expected-signal input, plus the material module. */\nexport interface DisplayViewQualityGpuInput {\n setup: DisplayViewSetup;\n signalInput: DisplayViewExpectedSignalInput;\n material: DisplayViewGpuMaterialModule;\n /** Recompute flagged display pixels with the reference. Default true. */\n recomputeFlagged?: boolean;\n /** The states this renderer holds for the setup's correction key (grown by the render); a fresh store when absent. */\n states?: CorrectionStateStore;\n /**\n * #492: sum each site's taps in blocks (rows, groups; `DISPLAY_VIEW_QUALITY_SITES_BLOCKED_WGSL`), whose bound grows with the\n * kernel's width rather than its tap count. Default: when the setup's expected signal carries the defocus disc\n * (`setup.gpu.defocusRadius` > 0); in focus the tap-list pass runs as before.\n */\n blockedSum?: boolean;\n /** Largest taps (sites × taps per site) per site-pass dispatch; default `DISPLAY_VIEW_QUALITY_SITE_TAPS_PER_DISPATCH`. */\n maximumSiteTapsPerDispatch?: number;\n /** #581: an image-plane print's own passes 1 and 2 (`material` is then unused). */\n image?: DisplayViewQualityImagePasses;\n}\n/**\n * #581: an image-plane print's passes 1 and 2 (src/gpu/display-view-image-quality.ts): pass 1 writes `pointFloats` radiance values\n * per lattice point and a flag word; pass 2 is the blocked sum over them (the flags at binding 6).\n */\nexport interface DisplayViewQualityImagePasses {\n gather: SignalGather;\n siteGamma: number;\n pointFloats: number;\n lattice: [label: string, wgsl: string];\n sites: [label: string, wgsl: string];\n /** Runs pass 1 over a band's lattice windows, and with site kernels resolves its flagged points with the reference (their count). */\n runLattice(band: GpuResourceScope, pipeline: GPUComputePipeline, params: GPUBuffer, groups: GPUBuffer, groupWords: Uint32Array, latticeTotal: number, signal: AbortSignal):\n Promise<{ values: GPUBuffer; flags: GPUBuffer; resolved: number }>;\n}\n\n/** Wall-clock milliseconds per stage of one render (upload, dispatch and readback of each pass; host work apart). */\nexport interface DisplayViewQualityStageTimings {\n /** Pass 1: the lattice materials (the material module per lattice point). */\n lattice: number;\n /** Pass 2: the site electrons through the combined kernels, the readout moments and the white clip. */\n sites: number;\n /** Pass 3: the display pixels (demosaic candidates, development, covariance, correction), every dispatch of it. */\n pixels: number;\n /** The low-signal correction states computed on the host (the reference's own draws) and the table uploads. */\n states: number;\n /** The host finishing (quantization term, noise draw, Cholesky, encode) of every display pixel. */\n finishing: number;\n /** The reference's recomputation of flagged display pixels. */\n recompute: number;\n /** Pass 3 dispatches that were repeated because a correction state was missing. */\n pixelRedispatches: number;\n /** Pass 2 dispatches (one per band, or more where a band's sites × taps exceed the tap budget per dispatch, #492). */\n siteDispatches: number;\n}\n\n/** A GPU Quality display view of one region: the reference's result fields plus the execution label, the bounds, the flags and the timings. */\nexport interface DisplayViewQualityGpuResult extends DisplayViewRenderResult {\n execution: ImageKernelExecution;\n /** |E_gpu − E_cpu| ≤ relative·|E_cpu| + absolute for every component of every display pixel (linear light); `absolute` is the largest per-pixel term. */\n expectedValueBound: ImageKernelRelativeErrorBound;\n /** |V_gpu − V_cpu| ≤ relative·V_cpu + absolute for every covariance entry (linear light squared). */\n varianceBound: ImageKernelRelativeErrorBound;\n /** Per display pixel: the absolute terms of the two bounds (the kernel's running bounds, doubled). */\n expectedValueAbsoluteBound: Float32Array;\n varianceAbsoluteBound: Float32Array;\n /** Display pixels (region row-major) the kernel flagged, and those the host recomputed with the reference. */\n flaggedPixelIndices: Uint32Array;\n hostRecomputedPixelIndices: Uint32Array;\n /** The kernel's flag word per display pixel (`DISPLAY_VIEW_QUALITY_FLAG` bits). */\n pixelFlags: Uint32Array;\n /** #533: display pixels (not flagged) with a real pixel whose saturation the kernel left undecided; their count is the host reference's. */\n highlightRecomputedPixelIndices: Uint32Array;\n /** Correction states the render computed on the host (new to the store), and the states the table held at the end. */\n statesComputed: number;\n statesHeld: number;\n /** Taps per native site of the expected-signal gather (over every lattice group). */\n tapsPerSite: number;\n /** #492: whether the site pass summed in blocks (the defocus disc), and the relative bound of a site's electrons it used. */\n blockedSum: boolean;\n siteSumRelativeBound: number;\n /**\n * #492, blocked sum only: lattice points the material module flagged as uncertain that the host resolved with the reference's\n * own float64 `materialAt` at the reference's lattice point (so no site of a defocused render carries material uncertainty).\n */\n latticePointsResolved: number;\n stageMilliseconds: DisplayViewQualityStageTimings;\n}\n\n/**\n * The low-signal correction states a renderer holds for one correction key, as the GPU table reads them: grid keys ascending\n * with three float32 values each (the host keeps the float64 values; the table is their single rounding).\n */\nexport class CorrectionStateStore {\n readonly #known = new Map<number, [number, number, number]>();\n #keys: Int32Array<ArrayBuffer> = new Int32Array(0);\n #values: Float32Array<ArrayBuffer> = new Float32Array(0);\n #dirty = false;\n get size(): number { return this.#known.size; }\n has(key: number): boolean { return this.#known.has(key); }\n add(gridKeys: Int32Array, values: Float64Array): void {\n for (let i = 0; i < gridKeys.length; i++) {\n if (this.#known.has(gridKeys[i]!)) continue;\n this.#known.set(gridKeys[i]!, [values[3 * i]!, values[3 * i + 1]!, values[3 * i + 2]!]);\n this.#dirty = true;\n }\n }\n /** The sorted table (rebuilt when states were added since the last call). */\n table(): { keys: Int32Array<ArrayBuffer>; values: Float32Array<ArrayBuffer> } {\n if (this.#dirty) {\n const keys = Int32Array.from(this.#known.keys()).sort(), values = new Float32Array(3 * keys.length);\n keys.forEach((key, i) => { const v = this.#known.get(key)!; values[3 * i] = v[0]; values[3 * i + 1] = v[1]; values[3 * i + 2] = v[2]; });\n this.#keys = keys; this.#values = values; this.#dirty = false;\n }\n return { keys: this.#keys, values: this.#values };\n }\n}\n\n/**\n * Waits until the queue has finished the work submitted so far (`GPUQueue.onSubmittedWorkDone`), so a pass that reads nothing\n * back is timed with its own execution, not the next pass's wait. The passes depend on each other in order anyway.\n */\nasync function queueIdle(runtime: WebGpuRuntime, signal: AbortSignal): Promise<void> {\n const queue = runtime.device.queue as { onSubmittedWorkDone?: () => Promise<undefined> };\n if (typeof queue.onSubmittedWorkDone === \"function\") await runtime.guard(queue.onSubmittedWorkDone(), signal);\n}\n\n/** The footprint shape of a view: real pixels per display pixel along each axis, and whether the exact area mean applies. */\nexport function footprintShape(setup: DisplayViewSetup): { sx: number; sy: number; exact: boolean; maximumColumns: number; maximumRows: number } {\n const sx = setup.frameWidth / setup.viewWidth, sy = setup.frameHeight / setup.viewHeight, area = sx * sy;\n const exact = area <= Math.min(EXACT_AREA_MEAN_MAX_PIXELS, setup.samplesPerAxis * setup.samplesPerAxis);\n let maximumColumns = 0, maximumRows = 0;\n for (let i = 0; i < setup.region.width; i++) maximumColumns = Math.max(maximumColumns, overlaps((setup.region.x + i) * sx, (setup.region.x + i + 1) * sx, setup.frameWidth).w.length);\n for (let j = 0; j < setup.region.height; j++) maximumRows = Math.max(maximumRows, overlaps((setup.region.y + j) * sy, (setup.region.y + j + 1) * sy, setup.frameHeight).w.length);\n return { sx, sy, exact, maximumColumns, maximumRows };\n}\n\n/** The demosaic candidates of a setup (the bilinear kernels when it has none) and their reach in sites. */\nfunction candidatesOf(setup: DisplayViewSetup): { candidates: readonly (readonly (readonly (readonly DisplayViewKernelTap[])[])[])[]; count: number; reach: number } {\n const candidates = setup.candidates ?? setup.demosaic.map((phase) => [phase]), count = candidates[0]?.length ?? 0;\n const reach = Math.max(1, ...candidates.flat(3).map((t) => Math.max(Math.abs(t.dx), Math.abs(t.dy))));\n return { candidates, count, reach };\n}\n\n/** Fractional bits of a float64 (the smallest b with c·2^b an integer), or Infinity beyond 60. */\nfunction fractionalBits(c: number): number {\n for (let b = 0; b <= 60; b++) if (Number.isInteger(c * 2 ** b)) return b;\n return Infinity;\n}\n/** Whether p + c is exact in float32 for every integer p with |p| ≤ `span` (c has b fractional bits and |p + c| < 2^(24 − b)). */\nfunction exactLatticeConstant(c: number, span: number): boolean {\n const b = fractionalBits(c);\n return Math.fround(c) === c && b <= 22 && span + Math.abs(c) + 1 < 2 ** (24 - b);\n}\n\n/**\n * Why the Quality kernels do not cover a request, or null when they do: chart materials, the exact area mean (footprints of\n * at most 25 real pixels and 6 per axis), the identity or positive Reinhard tone curve, demosaic candidates within 3 sites\n * (1 or 2 per phase), at most 64 lattice groups, lattice constants exact in float32, no collect pass, and a raster at least\n * 2·reach + 2 sites on each axis (so a reflected border site lies in the band's window).\n */\nexport function displayViewQualityGpuUnsupportedReason(setup: DisplayViewSetup, signalInput: DisplayViewExpectedSignalInput): string | null {\n if (signalInput.largeKernel) return LARGE_DEFOCUS_REASON;\n if (signalInput.scene.kind !== \"materials\" && !signalInput.scene.image) return \"radiance scenes (caller functions) are not on the GPU\";\n if (!signalInput.kernels && !signalInput.queryPoint) return \"the expected signal has no query points\";\n if (setup.ahdCollect) return \"a collect pass of the correction states runs on the CPU\";\n if (setup.toneCurve !== \"identity\" && setup.toneCurve !== \"positive-reinhard-per-channel\") return \"unsupported tone curve \" + String(setup.toneCurve);\n if (setup.region.width < 1 || setup.region.height < 1) return \"an empty region\";\n if (signalInput.wavelengthsNm.length < 1 || signalInput.wavelengthsNm.length > DISPLAY_VIEW_QUALITY_MAXIMUM_NODES) return \"the site passes integrate 1 to \" + DISPLAY_VIEW_QUALITY_MAXIMUM_NODES + \" spectral nodes per site\";\n if (signalInput.kernels && (signalInput.kernels.radius < 0 || signalInput.kernels.radius > DISPLAY_VIEW_QUALITY_MAXIMUM_KERNEL_RADIUS))\n return \"a site kernel radius above \" + DISPLAY_VIEW_QUALITY_MAXIMUM_KERNEL_RADIUS + \" (the diffraction and defocus caps)\";\n const shape = footprintShape(setup);\n if (!shape.exact) return \"the stratified estimator (footprints above 25 real pixels) is not on the GPU\";\n if (shape.maximumColumns > DISPLAY_VIEW_QUALITY_MAXIMUM_PIXELS_PER_AXIS || shape.maximumRows > DISPLAY_VIEW_QUALITY_MAXIMUM_PIXELS_PER_AXIS)\n return \"a footprint touches more than \" + DISPLAY_VIEW_QUALITY_MAXIMUM_PIXELS_PER_AXIS + \" real pixels along an axis\";\n const { candidates, count, reach } = candidatesOf(setup);\n if (candidates.length !== 4 || (count !== 1 && count !== 2) || candidates.some((p) => p.length !== count || p.some((d) => d.length !== 3))) return \"each CFA phase needs 1 or 2 demosaic candidates with a kernel per channel\";\n if (reach > MAXIMUM_REACH) return \"demosaic kernels reaching more than \" + MAXIMUM_REACH + \" sites\";\n // The kernel treats a channel whose sites are all exactly at white as exact: its weights must sum exactly in float32 (dyadic, denominators to 256, magnitudes below 2^10).\n for (const t of candidates.flat(3)) if (!Number.isInteger(t.weight * 256) || Math.abs(t.weight) >= 1024) return \"demosaic weights that are not dyadic rationals (denominators to 256)\";\n for (let p = 0; p < 4; p++) for (let c = 0; c < 3; c++) {\n const taps = setup.demosaic[p]?.[c];\n if (!taps || taps.length < 1 || taps.length > 4 || taps.some((t) => Math.abs(t.dx) > 1 || Math.abs(t.dy) > 1)) return \"the site-variance kernels are not the bilinear kernels (at most 4 taps within one site)\";\n }\n if (setup.nativeWidth < 2 * reach + 2 || setup.nativeHeight < 2 * reach + 2) return \"a raster smaller than 2·reach + 2 sites\";\n const tables = displayViewSignalTables(signalInput);\n if (tables.groups.length < 1 || tables.groups.length > MAXIMUM_GROUPS) return \"the kernel holds 1 to \" + MAXIMUM_GROUPS + \" lattice groups\";\n const W = signalInput.nativeWidth, H = signalInput.nativeHeight, R = signalInput.kernels ? signalInput.kernels.radius : 0;\n if (!signalInput.kernels) {\n // Without diffraction the reference queries each offset's own point; the lattice pass forms it as (x + ix + c)·scale with the\n // group's shift, which is the same number only when ix + f equals the offset exactly (the grouping tolerates 1e-9).\n for (const group of tables.groups) for (const member of group.members) {\n const exact = signalInput.offsets.some((o) => o.x === member.ix + group.fx && o.y === member.iy + group.fy && o.weight === member.weight);\n if (!exact) return \"a query offset that its lattice group does not reproduce exactly\";\n }\n }\n for (const group of tables.groups) {\n const spanX = Math.max(Math.abs(group.minIx), Math.abs(group.maxIx)) + R + W, spanY = Math.max(Math.abs(group.minIy), Math.abs(group.maxIy)) + R + H;\n if (!exactLatticeConstant(0.5 + group.fx - W / 2, spanX) || !exactLatticeConstant(0.5 + group.fy - H / 2, spanY)) return \"a query offset whose lattice constant is not exact in float32\";\n }\n return null;\n}\n\n/** The lattice groups, taps and the spectral table of the expected signal (see the module comment). */\nexport interface SignalGather {\n /**\n * Per group: dpMin, dqMin, dpSpan, dqSpan (lattice extent beyond the site window), cu, cv; its first tap, and (with site\n * kernels) its dense tap rectangle cw × ch (dp = dpMin + dx, dq = dqMin + dy at tap first + dy·cw + dx).\n */\n groups: { dpMin: number; dqMin: number; dpSpan: number; dqSpan: number; cu: number; cv: number; firstTap: number; cw: number; ch: number }[];\n /** Per tap: group, dp − dpMin, dq − dqMin. */\n taps: Uint32Array<ArrayBuffer>;\n tapCount: number;\n /** Spectral nodes N. */\n nodes: number;\n /**\n * 2.21.0 (signals integrated from the material spectrum per site): per channel c, tap t and node n the channel's response and\n * kernel C_c(t, n) at (c·T + t)·N + n (`nodeKernels`; without site kernels the member's weight times A_c(λ_n)), then per material\n * m its spectral radiance L_m(λ_n) at 3·T·N + m·N + n, each float64 rounded once. No per-material channel value is formed: the\n * site pass integrates Σ_t Σ_n C_c(t, n)·L_{m_t}(λ_n).\n */\n table: Float32Array<ArrayBuffer>;\n /**\n * Per channel c and tap t (at c·T + t): a bound on the difference between any two materials' signals at that tap,\n * Σ_n C_c(t, n)·(max_m L_m(λ_n) − min_m L_m(λ_n)), from the spectra's envelope (no per-material value), rounded up.\n */\n spread: Float32Array<ArrayBuffer>;\n materials: number;\n /**\n * An absolute bound on what a device that flushes results below the float32 normal range (WGSL allows it) can drop from a site:\n * per tap the largest product C·max L below that range over the channels, plus one smallest normal per partial addition and\n * per compensation step ((T + 2)·N of them), float64.\n */\n tinyMass: number;\n}\nfunction signalGather(signalInput: DisplayViewExpectedSignalInput): SignalGather {\n const tables = displayViewSignalTables(signalInput), A = signalInput.electronsPerRadiance, N = signalInput.wavelengthsNm.length, spectra = tables.spectra;\n const W = signalInput.nativeWidth, H = signalInput.nativeHeight, R = signalInput.kernels ? signalInput.kernels.radius : 0, materials = spectra.length;\n // Taps in order: per group, with site kernels the dense rectangle row-major (tap (dx, dy) reads lattice offset (minIx − R + dx,\n // minIy − R + dy)), without them one tap per member. Plain loops: a radius-96 kernel has up to 150 544 taps.\n const tapGroup: number[] = [], tapDp: number[] = [], tapDq: number[] = [], tapIndex: number[] = [];\n const groups: SignalGather[\"groups\"] = [];\n tables.groups.forEach((group: GroupTables, g) => {\n const first = tapGroup.length;\n let dpMin = Infinity, dpMax = -Infinity, dqMin = Infinity, dqMax = -Infinity;\n const push = (dp: number, dq: number, index: number): void => {\n tapGroup.push(g); tapDp.push(dp); tapDq.push(dq); tapIndex.push(index);\n dpMin = Math.min(dpMin, dp); dpMax = Math.max(dpMax, dp); dqMin = Math.min(dqMin, dq); dqMax = Math.max(dqMax, dq);\n };\n if (signalInput.kernels) {\n for (let dy = 0; dy < group.ch; dy++) for (let dx = 0; dx < group.cw; dx++) push(group.minIx - R + dx, group.minIy - R + dy, dy * group.cw + dx);\n } else group.members.forEach((member, index) => push(member.ix, member.iy, index));\n groups.push({ dpMin, dqMin, dpSpan: dpMax - dpMin, dqSpan: dqMax - dqMin, cu: 0.5 + group.fx - W / 2, cv: 0.5 + group.fy - H / 2, firstTap: first,\n cw: signalInput.kernels ? group.cw : 0, ch: signalInput.kernels ? group.ch : 0 });\n });\n const T = tapGroup.length, taps = new Uint32Array(T * DISPLAY_VIEW_QUALITY_TAP_WORDS), spread = new Float32Array(3 * T);\n for (let t = 0; t < T; t++) {\n const g = tapGroup[t]!, group = groups[g]!;\n taps[t * DISPLAY_VIEW_QUALITY_TAP_WORDS] = g; taps[t * DISPLAY_VIEW_QUALITY_TAP_WORDS + 1] = tapDp[t]! - group.dpMin; taps[t * DISPLAY_VIEW_QUALITY_TAP_WORDS + 2] = tapDq[t]! - group.dqMin;\n }\n // Every value finite and non-negative, every spectrum value normal (a device may flush the others) and every sum in range.\n const domain = (): never => { throw new ImageKernelExecutionError(\"unsupported-float32-domain\", \"A site's spectral terms are outside the float32 domain.\"); };\n // The spectra and their envelope per node.\n const base = 3 * T * N, table = new Float32Array(base + materials * N), low = new Float64Array(N).fill(Infinity), high = new Float64Array(N).fill(-Infinity);\n let smallestL = Infinity;\n spectra.forEach((L, m) => {\n for (let n = 0; n < N; n++) {\n const l = L[n]!;\n if (!(l >= 0 && l <= FLOAT32_SAFE_MAGNITUDE)) domain();\n table[base + m * N + n] = l; low[n] = Math.min(low[n]!, l); high[n] = Math.max(high[n]!, l);\n if (l > 0) smallestL = Math.min(smallestL, l);\n }\n });\n if (smallestL < FLOAT32_MINIMUM_NORMAL) domain();\n let largestSum = 0, tinyMass = (T + 2) * N * FLOAT32_MINIMUM_NORMAL;\n for (let t = 0; t < T; t++) {\n const source = tables.groups[tapGroup[t]!]!, index = tapIndex[t]!;\n let tiny = 0;\n for (let c = 0; c < 3; c++) {\n let range = 0, mass = 0, tinyHere = 0;\n for (let n = 0; n < N; n++) {\n const value = signalInput.kernels ? source.nodeKernels[c]![index * N + n]! : source.members[index]!.weight * A[c]![n]!;\n if (!(value >= 0 && value <= FLOAT32_SAFE_MAGNITUDE)) domain();\n table[(c * T + t) * N + n] = value;\n if (materials > 0) {\n const top = value * high[n]!;\n range += value * (high[n]! - low[n]!); mass += top;\n // A kernel value or product below the normal range may be flushed: at most the product with the largest spectrum.\n if (value > 0 && (value < FLOAT32_MINIMUM_NORMAL || top < 2 * FLOAT32_MINIMUM_NORMAL)) tinyHere += top;\n }\n }\n // The spread rounded up (the float32 roundings of the operands, the products and the sum).\n spread[c * T + t] = Math.fround(range * (1 + (N + 4) * E));\n largestSum = Math.max(largestSum, mass);\n tiny = Math.max(tiny, tinyHere);\n }\n tinyMass += tiny;\n }\n if (!(largestSum * T <= FLOAT32_SAFE_MAGNITUDE)) domain();\n return { groups, taps, tapCount: T, nodes: N, table, spread, materials, tinyMass };\n}\n\n/**\n * The relative bound of a site's electrons (`params.site_gamma`): (T + 3)·E for the tap-list sum (#479), and with the blocked sum\n * (#492) (cw_max + ch_max + G + 3)·E, both unchanged by 2.21.0. Every term C_c(t, n)·L_m(λ_n) is non-negative and carries two host\n * roundings (u = E/2 each: the kernel value and the spectrum) and its product (E); the tap-list pass adds it into its node's\n * partial over the T taps (at most T − 1 inexact additions), the blocked pass into a row, group and total partial per node (at\n * most cw − 1 + ch − 1 + G − 1). The N node partials and the dark electrons (host-rounded, E/2) are then summed in integer\n * arithmetic and rounded once (E, `EXACT_SUM_WGSL`). So a site carries at most (T + 2.5)·E, or (cw + ch + G + 0.5)·E, inside the\n * bounds (docs/WEBGPU.md).\n */\nfunction siteSumRelativeBound(gather: SignalGather, blocked: boolean): number {\n if (!blocked) return (gather.tapCount + 3) * E;\n let cw = 0, ch = 0;\n for (const g of gather.groups) { cw = Math.max(cw, g.cw); ch = Math.max(ch, g.ch); }\n return (cw + ch + gather.groups.length + 3) * E;\n}\n\n/** The aux table: bilinear kernels and 1/Σw², the Gauss–Legendre rule, and the dense candidate weights per phase. */\nfunction auxTable(setup: DisplayViewSetup): Float32Array<ArrayBuffer> {\n const aux = new Float32Array(DISPLAY_VIEW_QUALITY_AUX.size), words = new Uint32Array(aux.buffer);\n for (let p = 0; p < 4; p++) for (let c = 0; c < 3; c++) {\n const taps = setup.demosaic[p]![c]!, base = DISPLAY_VIEW_QUALITY_AUX.bilinear + (p * 3 + c) * 16;\n let w2 = 0;\n taps.forEach((t, i) => { aux[base + 4 * i] = t.dx; aux[base + 4 * i + 1] = t.dy; aux[base + 4 * i + 2] = t.weight; w2 += t.weight * t.weight; });\n aux[DISPLAY_VIEW_QUALITY_AUX.inverseW2 + p * 3 + c] = 1 / w2;\n }\n const gl = gaussLegendre16();\n aux.set(gl.x, DISPLAY_VIEW_QUALITY_AUX.gaussLegendre); aux.set(gl.w, DISPLAY_VIEW_QUALITY_AUX.gaussLegendre + 16);\n const { candidates, count, reach } = candidatesOf(setup), side = 2 * reach + 1;\n for (let p = 0; p < 4; p++) {\n // Dense weights per slot and candidate, as the reference accumulates them (taps at one slot add).\n const dense = new Float64Array(2 * 3 * WINDOW_SLOTS);\n candidates[p]!.forEach((candidate, d) => candidate.forEach((list, c) => { for (const t of list) { const slot = (t.dy + reach) * side + t.dx + reach; { const at = (d * 3 + c) * WINDOW_SLOTS + slot; dense[at] = dense[at]! + t.weight; } } }));\n const base = DISPLAY_VIEW_QUALITY_AUX.candidates + p * DISPLAY_VIEW_QUALITY_AUX.candidatePhaseStride;\n let n = 0;\n for (let slot = 0; slot < side * side; slot++) {\n let used = false;\n for (let k = 0; k < 2 * 3 && !used; k++) if (dense[k * WINDOW_SLOTS + slot] !== 0) used = true;\n if (!used) continue;\n const entry = base + 4 + n * DISPLAY_VIEW_QUALITY_CANDIDATE_FLOATS;\n aux[entry] = (slot % side) - reach; aux[entry + 1] = Math.floor(slot / side) - reach;\n for (let k = 0; k < 6; k++) aux[entry + 2 + k] = dense[k * WINDOW_SLOTS + slot]!;\n n++;\n }\n if (n > DISPLAY_VIEW_QUALITY_CANDIDATE_ENTRIES) throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"The demosaic candidates read more slots than the table holds.\");\n words[base] = n;\n }\n void count;\n return aux;\n}\n\n/**\n * #492: replaces every lattice point the material module flagged (bit 31) by the reference's material at that point: group g's\n * point (p, q) is (p + 0.5 + f_x − W/2)·g, −(q + 0.5 + f_y − H/2)·g (with f = 0 written as the reference writes it), looked up\n * with the expected signal's own `materialAt`. Returns the count of points resolved.\n */\nfunction resolveUncertainLattice(lattice: Uint32Array, groupWords: Uint32Array, signalInput: DisplayViewExpectedSignalInput): number {\n const tables = displayViewSignalTables(signalInput), scene = signalInput.scene as Extract<DisplayViewExpectedSignalInput[\"scene\"], { kind: \"materials\" }>;\n const W = signalInput.nativeWidth, H = signalInput.nativeHeight, g = 2 / signalInput.outputWidth, groupInts = new Int32Array(groupWords.buffer, groupWords.byteOffset, groupWords.length);\n let resolved = 0;\n tables.groups.forEach((group, k) => {\n const base = k * DISPLAY_VIEW_QUALITY_GROUP_WORDS, lx0 = groupInts[base]!, ly0 = groupInts[base + 1]!, lw = groupWords[base + 2]!, lh = groupWords[base + 3]!, first = groupWords[base + 4]!;\n for (let local = 0; local < lw * lh; local++) {\n const raw = lattice[first + local]!;\n if ((raw >>> 31) === 0) continue;\n const p = lx0 + (local % lw), q = ly0 + Math.floor(local / lw);\n const m = scene.materialAt(latticeCoordinate(p, group.fx, W, g), -latticeCoordinate(q, group.fy, H, g));\n if (!(Number.isInteger(m) && m >= 0 && m < scene.materials.length)) throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"webgpu-f32 display view (Quality): a lattice point has no scene material; use cpu-reference.\");\n lattice[first + local] = m;\n resolved++;\n }\n });\n return resolved;\n}\n\n/**\n * One axis of the reference's lattice point (createDisplayViewExpectedSignal's latticeU / latticeV, written as it writes them):\n * (i + 0.5 − size/2)·g with no shift, (i + 0.5 + f − size/2)·g otherwise; v is its negative.\n */\nexport const latticeCoordinate = (i: number, f: number, size: number, g: number): number => (f === 0 ? i + 0.5 - size / 2 : i + 0.5 + f - size / 2) * g;\n/** The uniform parameters shared by the three passes (per-pass words are set per dispatch). */\nfunction constants(setup: DisplayViewSetup, signalInput: DisplayViewExpectedSignalInput, gather: SignalGather, reach: number, count: number, blocked: boolean): { params: ArrayBuffer; words: Uint32Array; ints: Int32Array; floats: Float32Array } {\n const params = new ArrayBuffer(4 * DISPLAY_VIEW_QUALITY_PARAM_WORDS), words = new Uint32Array(params), ints = new Int32Array(params), floats = new Float32Array(params);\n words[2] = setup.region.width; words[3] = setup.region.x; words[4] = setup.region.y; words[5] = setup.margin; words[6] = setup.nativeWidth; words[7] = setup.nativeHeight;\n words[8] = setup.region.width; words[9] = setup.toneCurve === \"positive-reinhard-per-channel\" ? 1 : 0; words[10] = reach; words[11] = count;\n words[16] = setup.ahdCorrection ? 1 : 0; words[18] = gather.tapCount; words[19] = gather.groups.length;\n for (let c = 0; c < 3; c++) words[21 + c] = setup.gains[c] === setup.clipLevel ? 1 : 0;\n for (let c = 0; c < 3; c++) { floats[24 + c] = setup.readout[c]!.perElectron; floats[28 + c] = setup.readout[c]!.darkElectrons; floats[32 + c] = setup.readout[c]!.constantVariance; floats[36 + c] = setup.gains[c]!; }\n floats[27] = 8.5 * 8.5; floats[31] = setup.clipLevel; floats[35] = setup.ahdCorrection ? setup.ahdCorrection.thresholdVariance : 0;\n for (let r = 0; r < 3; r++) for (let c = 0; c < 3; c++) floats[40 + r * 3 + c] = setup.matrix[r]![c]!;\n if (signalInput.kernels) { const g = 2 / signalInput.outputWidth; floats[39] = g; floats[49] = -g; }\n else {\n // Without diffraction the reference queries the environment's own points; the lattice model (x + c)·scale is checked against them (queryGeometry).\n const geometry = queryGeometry(signalInput);\n floats[39] = geometry.scaleU; floats[49] = geometry.scaleV;\n }\n floats[50] = siteSumRelativeBound(gather, blocked);\n // 2.21.0: the spectral nodes the site passes integrate.\n words[53] = gather.nodes;\n // What a flushing device can drop (both site passes), rounded up and kept normal so the uniform is not flushed either.\n floats[52] = Math.max(FLOAT32_MINIMUM_NORMAL, Math.fround(gather.tinyMass * (1 + 4 * E)));\n return { params, words, ints, floats };\n}\n\n/** The reference's correction setup of a display-view setup with the AHD correction. */\nfunction correctionSetup(setup: DisplayViewSetup): DisplayViewCorrectionSetup {\n return { seed: setup.seed, readout: setup.readout, gains: setup.gains, clipLevel: setup.clipLevel, matrix: setup.matrix, toneCurve: setup.toneCurve, ahdCorrection: setup.ahdCorrection! };\n}\n\n/** How far the host's quantization term Σ(w/A)²·q(m) can move with a mean bound Δm (see QUANTIZATION_SLOPE), doubled. */\nfunction quantizationBound(moments: Float32Array, o: number, meanBound: number, pixels: number, step: number): number {\n let join = 0;\n for (let c = 0; c < 3; c++) { const m = moments[o + c]!; if (m - meanBound <= QUANTIZATION_JOIN && m + meanBound >= QUANTIZATION_JOIN) join = QUANTIZATION_JOIN_JUMP; }\n return MARGIN * pixels * (QUANTIZATION_SLOPE * meanBound + join) * step * step / 12;\n}\n\n/** Renders one region of a Quality display view on the GPU (see the module comment). */\nexport async function renderDisplayViewQualityOnGpu(runtime: WebGpuRuntime, bandBytes: number, input: DisplayViewQualityGpuInput, abort: AbortController,\n yieldControl: YieldControl, pipelines: PipelineSource): Promise<DisplayViewQualityGpuResult> {\n const { setup, signalInput, material, image } = input;\n const reason = displayViewQualityGpuUnsupportedReason(setup, signalInput);\n if (reason) throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"webgpu-f32 display view (Quality): \" + reason + \"; use cpu-reference.\");\n const now = (): number => (typeof performance !== \"undefined\" ? performance.now() : Date.now());\n const timings: DisplayViewQualityStageTimings = { lattice: 0, sites: 0, pixels: 0, states: 0, finishing: 0, recompute: 0, pixelRedispatches: 0, siteDispatches: 0 };\n const { region, margin } = setup, shape = footprintShape(setup), { reach, count } = candidatesOf(setup);\n // #492: the defocus disc's kernels are summed in blocks (their dense rectangles), in focus the tap list runs as before.\n const blocked = !!image || (input.blockedSum ?? (setup.gpu?.defocusRadius ?? 0) > 0);\n if (blocked && !signalInput.kernels && !image) throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"webgpu-f32 display view (Quality): the blocked site sum needs site kernels; use cpu-reference.\");\n const tapBudget = input.maximumSiteTapsPerDispatch ?? DISPLAY_VIEW_QUALITY_SITE_TAPS_PER_DISPATCH;\n const gather = image?.gather ?? signalGather(signalInput), aux = auxTable(setup), { params, words, ints, floats } = constants(setup, signalInput, gather, reach, count, blocked);\n // #581: the print's site bound and its radiance values per lattice point (the site pass's node count in the last word).\n if (image) { floats[50] = image.siteGamma; words[55] = image.pointFloats; }\n const stride = DISPLAY_VIEW_QUALITY_GEOMETRY_STRIDE, geometry = new Float32Array((region.width + region.height) * stride);\n const columnSums: AxisSums[] = [], rowSums: AxisSums[] = [];\n for (let i = 0; i < region.width; i++) { axisRecord(geometry, i * stride, (region.x + i) * shape.sx, (region.x + i + 1) * shape.sx, setup.frameWidth, margin, shape.sx); columnSums.push(axisSums((region.x + i) * shape.sx, (region.x + i + 1) * shape.sx, setup.frameWidth, margin)); }\n for (let j = 0; j < region.height; j++) { axisRecord(geometry, (region.width + j) * stride, (region.y + j) * shape.sy, (region.y + j + 1) * shape.sy, setup.frameHeight, margin, shape.sy); rowSums.push(axisSums((region.y + j) * shape.sy, (region.y + j + 1) * shape.sy, setup.frameHeight, margin)); }\n const area = shape.sx * shape.sy, pixelCount = region.width * region.height;\n // The band's site window: the region's native columns plus the reach, clamped to the raster (border sites are reflected into it).\n const siteX0 = Math.max(0, Math.floor(region.x * shape.sx) + margin - reach), siteX1 = Math.min(setup.nativeWidth - 1, Math.min(setup.frameWidth - 1, Math.ceil((region.x + region.width) * shape.sx) - 1) + margin + reach);\n const siteW = siteX1 - siteX0 + 1;\n const siteRows = (row0: number, row1: number): { y0: number; y1: number } => ({ y0: Math.max(0, Math.floor((region.y + row0) * shape.sy) + margin - reach),\n y1: Math.min(setup.nativeHeight - 1, Math.min(setup.frameHeight - 1, Math.ceil((region.y + row1) * shape.sy) - 1) + margin + reach) });\n const bandBytesOf = (rows: number): number => {\n const { y0, y1 } = siteRows(0, rows), siteH = y1 - y0 + 1;\n let lattice = 0;\n for (const g of gather.groups) lattice += (siteW + g.dpSpan) * (siteH + g.dqSpan) * 4 * (image ? image.pointFloats + 1 : 1);\n return lattice + siteW * siteH * SITE_BYTES + rows * region.width * OUTPUT_BYTES_PER_PIXEL;\n };\n let rows = region.height;\n while (rows > 1 && bandBytesOf(rows) > bandBytes) rows = Math.ceil(rows / 2);\n // The value table (materials × 3 channels × taps) is one binding: with a large defocus kernel and many materials it can pass the\n // device's limit, which is then refused by name (never clipped).\n if (gather.table.byteLength > runtime.maximumStorageBindingBytes) throw new ImageKernelExecutionError(\"insufficient-limits\", \"The display view's kernel table (\" + gather.table.byteLength +\n \" bytes: 3 channels × \" + gather.tapCount + \" taps × \" + gather.nodes + \" spectral nodes, and the material spectra) exceeds the device's storage binding limit of \" + runtime.maximumStorageBindingBytes + \" bytes.\");\n const largestBinding = Math.max(bandBytesOf(rows), geometry.byteLength, gather.table.byteLength, 4 * DISPLAY_VIEW_QUALITY_BITMAP_WORDS);\n if (largestBinding > runtime.maximumStorageBindingBytes) throw new ImageKernelExecutionError(\"insufficient-limits\", \"One display-view band exceeds the device's storage binding limit.\");\n const latticePipeline = image ? await pipelines(...image.lattice) : await pipelines(\"photivra-display-view-quality-lattice:\" + material.id, assembleDisplayViewQualityLatticeWgsl(material.wgsl));\n const sitesPipeline = image ? await pipelines(...image.sites) : blocked ? await pipelines(\"photivra-display-view-quality-sites-blocked\", DISPLAY_VIEW_QUALITY_SITES_BLOCKED_WGSL) :\n await pipelines(\"photivra-display-view-quality-sites\", DISPLAY_VIEW_QUALITY_SITES_WGSL);\n const pixelsPipeline = await pipelines(\"photivra-display-view-quality-pixels\", DISPLAY_VIEW_QUALITY_PIXELS_WGSL);\n const moments = new Float32Array(pixelCount * DISPLAY_VIEW_QUALITY_OUTPUT_FLOATS), pixelFlags = new Uint32Array(pixelCount), masks = new Uint32Array(2 * pixelCount);\n const states = input.states ?? new CorrectionStateStore(), correction = setup.ahdCorrection ? correctionSetup(setup) : null;\n let statesComputed = 0, latticePointsResolved = 0;\n const scope = new GpuResourceScope(runtime);\n try {\n const auxBuffer = scope.upload(\"photivra-display-view-aux\", aux, BUFFER_USAGE.STORAGE);\n const geometryBuffer = scope.upload(\"photivra-display-view-geometry\", geometry, BUFFER_USAGE.STORAGE);\n // The blocked pass reads no tap records (its layout has no binding 2).\n const tapsBuffer = blocked ? null : scope.upload(\"photivra-display-view-taps\", gather.taps, BUFFER_USAGE.STORAGE);\n const tableBuffer = scope.upload(\"photivra-display-view-table\", gather.table, BUFFER_USAGE.STORAGE);\n const spreadBuffer = scope.upload(\"photivra-display-view-spread\", gather.spread, BUFFER_USAGE.STORAGE);\n // A module's binding is data uploaded per render or a buffer the module already holds on the device (#491: scene records).\n const materialGroup = image ? null : runtime.device.createBindGroup({ layout: latticePipeline.getBindGroupLayout(1), entries: material.bindings.map((b) => ({ binding: b.binding, resource: { buffer: b.buffer ??\n scope.upload(\"photivra-display-view-material-\" + b.binding, b.data, b.kind === \"uniform\" ? BUFFER_USAGE.UNIFORM : BUFFER_USAGE.STORAGE) } })) });\n const gate = createHostYieldGate();\n for (let row0 = 0; row0 < region.height; row0 += rows) {\n checkAbort(abort.signal);\n const row1 = Math.min(region.height, row0 + rows), count = (row1 - row0) * region.width, first = row0 * region.width;\n const { y0: siteY0, y1: siteY1 } = siteRows(row0, row1), siteH = siteY1 - siteY0 + 1;\n // Lattice windows per group, and the group records.\n const groupWords = new Uint32Array(gather.groups.length * DISPLAY_VIEW_QUALITY_GROUP_WORDS), groupInts = new Int32Array(groupWords.buffer), groupFloats = new Float32Array(groupWords.buffer);\n let latticeTotal = 0;\n gather.groups.forEach((g, index) => {\n const base = index * DISPLAY_VIEW_QUALITY_GROUP_WORDS, lw = siteW + g.dpSpan, lh = siteH + g.dqSpan;\n groupInts[base] = siteX0 + g.dpMin; groupInts[base + 1] = siteY0 + g.dqMin; groupWords[base + 2] = lw; groupWords[base + 3] = lh; groupWords[base + 4] = latticeTotal;\n groupWords[base + 5] = g.firstTap;\n groupFloats[base + 6] = g.cu; groupFloats[base + 7] = g.cv;\n latticeTotal += lw * lh;\n });\n words[1] = row0; ints[12] = siteX0; ints[13] = siteY0; words[14] = siteW; words[15] = siteH; words[20] = latticeTotal;\n const band = new GpuResourceScope(runtime);\n try {\n const groupBuffer = band.upload(\"photivra-display-view-groups\", groupWords, BUFFER_USAGE.STORAGE);\n const siteBuffer = band.buffer(\"photivra-display-view-sites\", siteW * siteH * SITE_BYTES, BUFFER_USAGE.STORAGE);\n // Pass 1: lattice materials (#581: an image-plane print's radiance per node, with its flags, and their host resolution).\n let t0 = now();\n words[0] = latticeTotal;\n const latticeParams = band.upload(\"photivra-display-view-params-lattice\", new Uint8Array(params.slice(0)), BUFFER_USAGE.UNIFORM);\n let latticeBuffer: GPUBuffer, pointFlags: GPUBuffer | null = null;\n if (image) {\n const pass = await image.runLattice(band, latticePipeline, latticeParams, groupBuffer, groupWords, latticeTotal, abort.signal);\n latticeBuffer = pass.values; pointFlags = pass.flags; latticePointsResolved += pass.resolved;\n } else {\n latticeBuffer = band.buffer(\"photivra-display-view-lattice\", latticeTotal * 4, BUFFER_USAGE.STORAGE | (blocked ? BUFFER_USAGE.COPY_SRC : 0));\n const latticeGroup = runtime.device.createBindGroup({ layout: latticePipeline.getBindGroupLayout(0), entries: [\n { binding: 0, resource: { buffer: latticeParams } }, { binding: 1, resource: { buffer: groupBuffer } }, { binding: 2, resource: { buffer: latticeBuffer } }] });\n const [latticeData] = await runComputePass(runtime, band, latticePipeline, [latticeGroup, materialGroup!], linearDispatch(latticeTotal, DISPLAY_VIEW_QUALITY_WORKGROUP_SIZE, runtime.maximumWorkgroupsPerDimension),\n blocked ? [{ buffer: latticeBuffer, bytes: latticeTotal * 4 }] : [], abort.signal);\n await queueIdle(runtime, abort.signal);\n if (blocked) {\n // #492: with a wide disc nearly every site reads some uncertain lattice point, and its spread over every material would flag\n // it. The host resolves each uncertain point with the reference's own material lookup at the reference's lattice point\n // (createDisplayViewExpectedSignal's latticeU/latticeV), so the sites read exactly the reference's materials.\n const lattice = new Uint32Array(latticeData!, 0, latticeTotal);\n const resolved = resolveUncertainLattice(lattice, groupWords, signalInput);\n if (resolved > 0) latticeBuffer = band.upload(\"photivra-display-view-lattice-resolved\", lattice, BUFFER_USAGE.STORAGE);\n latticePointsResolved += resolved;\n }\n }\n timings.lattice += now() - t0;\n // Pass 2: site moments, in chunks of whole workgroups of sites whose taps stay within the budget per dispatch (#492).\n t0 = now();\n const siteTotal = siteW * siteH, perDispatch = Math.max(DISPLAY_VIEW_QUALITY_WORKGROUP_SIZE,\n Math.floor(tapBudget / Math.max(1, gather.tapCount) / DISPLAY_VIEW_QUALITY_WORKGROUP_SIZE) * DISPLAY_VIEW_QUALITY_WORKGROUP_SIZE);\n for (let siteFirst = 0; siteFirst < siteTotal; siteFirst += perDispatch) {\n checkAbort(abort.signal);\n words[0] = Math.min(perDispatch, siteTotal - siteFirst); words[51] = siteFirst;\n const chunk = new GpuResourceScope(runtime);\n try {\n const siteParams = chunk.upload(\"photivra-display-view-params-sites\", new Uint8Array(params.slice(0)), BUFFER_USAGE.UNIFORM);\n const siteGroup = runtime.device.createBindGroup({ layout: sitesPipeline.getBindGroupLayout(0), entries: [\n { binding: 0, resource: { buffer: siteParams } }, { binding: 1, resource: { buffer: groupBuffer } }, ...(tapsBuffer ? [{ binding: 2, resource: { buffer: tapsBuffer } }] : []),\n { binding: 3, resource: { buffer: tableBuffer } }, { binding: 4, resource: { buffer: latticeBuffer } }, { binding: 5, resource: { buffer: siteBuffer } }, { binding: 6, resource: { buffer: pointFlags ?? spreadBuffer } },] });\n await runComputePass(runtime, chunk, sitesPipeline, siteGroup, linearDispatch(words[0], DISPLAY_VIEW_QUALITY_WORKGROUP_SIZE, runtime.maximumWorkgroupsPerDimension), [], abort.signal);\n await queueIdle(runtime, abort.signal);\n } finally { chunk.release(); }\n timings.siteDispatches++;\n }\n words[51] = 0;\n timings.sites += now() - t0;\n // Pass 3: display pixels, repeated once when a correction state was missing and has been computed.\n words[0] = count;\n const out = band.buffer(\"photivra-display-view-moments\", count * 4 * DISPLAY_VIEW_QUALITY_OUTPUT_FLOATS, BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);\n const flagBuffer = band.buffer(\"photivra-display-view-flags\", count * 4 * DISPLAY_VIEW_QUALITY_FLAG_WORDS, BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);\n const bitmapBuffer = band.buffer(\"photivra-display-view-bitmap\", 4 * DISPLAY_VIEW_QUALITY_BITMAP_WORDS, BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);\n for (let attempt = 0; ; attempt++) {\n checkAbort(abort.signal);\n t0 = now();\n const table = states.table(), stateKeys = table.keys.length > 0 ? table.keys : new Int32Array(1), stateValues = table.values.length > 0 ? table.values : new Float32Array(3);\n words[17] = table.keys.length;\n const pass = new GpuResourceScope(runtime);\n let data: ArrayBuffer, flagData: ArrayBuffer, bitmapData: ArrayBuffer;\n try {\n const pixelParams = pass.upload(\"photivra-display-view-params-pixels\", new Uint8Array(params.slice(0)), BUFFER_USAGE.UNIFORM);\n const keysBuffer = pass.upload(\"photivra-display-view-state-keys\", stateKeys, BUFFER_USAGE.STORAGE);\n const valuesBuffer = pass.upload(\"photivra-display-view-state-values\", stateValues, BUFFER_USAGE.STORAGE);\n const pixelGroup = runtime.device.createBindGroup({ layout: pixelsPipeline.getBindGroupLayout(0), entries: [\n { binding: 0, resource: { buffer: pixelParams } }, { binding: 1, resource: { buffer: auxBuffer } }, { binding: 2, resource: { buffer: geometryBuffer } },\n { binding: 3, resource: { buffer: siteBuffer } }, { binding: 4, resource: { buffer: keysBuffer } }, { binding: 5, resource: { buffer: valuesBuffer } },\n { binding: 6, resource: { buffer: bitmapBuffer } }, { binding: 7, resource: { buffer: out } }, { binding: 8, resource: { buffer: flagBuffer } }] });\n [data, flagData, bitmapData] = await runComputePass(runtime, pass, pixelsPipeline, pixelGroup, linearDispatch(count, DISPLAY_VIEW_QUALITY_WORKGROUP_SIZE, runtime.maximumWorkgroupsPerDimension),\n [{ buffer: out, bytes: count * 4 * DISPLAY_VIEW_QUALITY_OUTPUT_FLOATS }, { buffer: flagBuffer, bytes: count * 4 * DISPLAY_VIEW_QUALITY_FLAG_WORDS }, { buffer: bitmapBuffer, bytes: 4 * DISPLAY_VIEW_QUALITY_BITMAP_WORDS }], abort.signal) as [ArrayBuffer, ArrayBuffer, ArrayBuffer];\n } finally { pass.release(); }\n timings.pixels += now() - t0;\n const flagWords = new Uint32Array(flagData, 0, count * DISPLAY_VIEW_QUALITY_FLAG_WORDS), bandFlags = new Uint32Array(count);\n for (let i = 0; i < count; i++) bandFlags[i] = flagWords[DISPLAY_VIEW_QUALITY_FLAG_WORDS * i]!;\n let missing = false;\n for (let i = 0; i < count && !missing; i++) if ((bandFlags[i]! & DISPLAY_VIEW_QUALITY_FLAG.stateMissing) !== 0) missing = true;\n if (missing && correction && attempt === 0) {\n // The grid keys the band needs that the store lacks: compute them with the reference (the realm's cache serves known ones), then dispatch again.\n t0 = now();\n const bitmap = new Uint32Array(bitmapData, 0, DISPLAY_VIEW_QUALITY_BITMAP_WORDS), needed: number[] = [];\n for (let w = 0; w < DISPLAY_VIEW_QUALITY_BITMAP_WORDS; w++) {\n let bitsWord = bitmap[w]!;\n while (bitsWord !== 0) { const bit = 31 - Math.clz32(bitsWord); bitsWord &= ~(1 << bit); const key = w * 32 + bit; if (key < AHD_KEY_LEVELS ** 3 && !states.has(key)) needed.push(key); }\n }\n if (needed.length > 0) {\n const computed = await computeDisplayViewCorrectionStates({ ...correction, yieldControl: async () => { if (yieldControl) await yieldControl(abort.signal); }, checkAbort: () => checkAbort(abort.signal) }, Int32Array.from(needed));\n states.add(computed.gridKeys, computed.values);\n statesComputed += needed.length;\n }\n timings.states += now() - t0;\n timings.pixelRedispatches++;\n continue;\n }\n moments.set(new Float32Array(data, 0, count * DISPLAY_VIEW_QUALITY_OUTPUT_FLOATS), first * DISPLAY_VIEW_QUALITY_OUTPUT_FLOATS);\n pixelFlags.set(bandFlags, first);\n for (let i = 0; i < count; i++) { masks[2 * (first + i)] = flagWords[DISPLAY_VIEW_QUALITY_FLAG_WORDS * i + 1]!; masks[2 * (first + i) + 1] = flagWords[DISPLAY_VIEW_QUALITY_FLAG_WORDS * i + 2]!; }\n break;\n }\n } finally {\n band.release();\n }\n if (yieldControl && gate.due()) { await yieldControl(abort.signal); gate.restart(); }\n }\n } finally {\n scope.release();\n }\n checkAbort(abort.signal);\n // The reference's finishing per display pixel (float64).\n let t0 = now();\n const maximum = setup.bitDepth === 8 ? 255 : 65535, step = 1 / maximum;\n const samples = setup.bitDepth === 8 ? new Uint8Array(pixelCount * 3) : new Uint16Array(pixelCount * 3);\n const expected = new Float64Array(pixelCount * 3), noiseStd = new Float64Array(pixelCount * 3), saturated = new Float64Array(pixelCount);\n const meanBound = new Float32Array(pixelCount), varianceBound = new Float32Array(pixelCount);\n const flagged: number[] = [];\n let largestMean = 0, largestVariance = 0, sampleCount = 0, siteCount = 0, corrected = 0;\n const counts = new Int32Array(geometry.buffer);\n // #533: each display pixel's saturated-pixel share from the kernel's mask (the reference's arithmetic, exact where it decided).\n const columnOverlaps = Array.from({ length: region.width }, (_, i) => overlaps((region.x + i) * shape.sx, (region.x + i + 1) * shape.sx, setup.frameWidth));\n for (let ry = 0, i = 0; ry < region.height; ry++) {\n const rowOverlaps = overlaps((region.y + ry) * shape.sy, (region.y + ry + 1) * shape.sy, setup.frameHeight);\n for (let rx = 0; rx < region.width; rx++, i++) saturated[i] = displayViewDecidedSaturation(columnOverlaps[rx]!, rowOverlaps, area, masks[2 * i]!, masks[2 * i + 1]!);\n }\n for (let ry = 0, i = 0; ry < region.height; ry++) {\n const rowWw = rowSums[ry]!.ww, ny = counts[(region.width + ry) * stride + 1]!;\n for (let rx = 0; rx < region.width; rx++, i++) {\n const pixels = columnSums[rx]!.ww * rowWw / (area * area), vy = region.y + ry, vx = region.x + rx, o = i * DISPLAY_VIEW_QUALITY_OUTPUT_FLOATS;\n let flag = (pixelFlags[i]! & DISPLAY_VIEW_QUALITY_FLAG.recompute) !== 0;\n for (let k = 0; k < DISPLAY_VIEW_QUALITY_OUTPUT_FLOATS && !flag; k++) if (!Number.isFinite(moments[o + k]!)) flag = true;\n if (flag) { flagged.push(i); continue; }\n finishDisplayViewPixel(moments.subarray(o, o + 9), pixels, setup.seed, vy * setup.viewWidth + vx, step, maximum, samples, expected, noiseStd, i * 3);\n meanBound[i] = MARGIN * moments[o + 9]!;\n varianceBound[i] = MARGIN * moments[o + 10]! + quantizationBound(moments, o, meanBound[i]!, pixels, step);\n largestMean = Math.max(largestMean, meanBound[i]!); largestVariance = Math.max(largestVariance, varianceBound[i]!);\n if ((pixelFlags[i]! & DISPLAY_VIEW_QUALITY_FLAG.corrected) !== 0) corrected++;\n const nx = counts[rx * stride + 1]!;\n sampleCount += nx * ny; siteCount += (nx + 2 * reach) * (ny + 2 * reach);\n }\n }\n timings.finishing = now() - t0;\n // Flagged display pixels: the reference's own pixels (a region render is byte-identical to the whole view's pixels).\n t0 = now();\n const recomputed: number[] = [], highlights: number[] = [];\n // #533: unflagged display pixels with an undecided real pixel take the reference's count only (their samples stay the kernel's).\n const undecided: number[] = [], isFlagged = new Uint8Array(pixelCount);\n for (const i of flagged) isFlagged[i] = 1;\n for (let i = 0; i < pixelCount; i++) if (isFlagged[i] === 0 && (pixelFlags[i]! & DISPLAY_VIEW_QUALITY_FLAG.highlightUndecided) !== 0) undecided.push(i);\n if (input.recomputeFlagged !== false) await recomputeRuns(setup, signalInput, undecided, abort, (first, run, part) => { for (let k = 0; k < run; k++) { saturated[first + k] = part.saturated[k]!; highlights.push(first + k); } });\n if (flagged.length > 0) {\n if (input.recomputeFlagged === false) {\n // Without recomputation a flagged pixel keeps the kernel's values where they are finite (its bound then does not hold).\n for (const i of flagged) {\n const o = i * DISPLAY_VIEW_QUALITY_OUTPUT_FLOATS;\n let finite = true;\n for (let k = 0; k < DISPLAY_VIEW_QUALITY_OUTPUT_FLOATS && finite; k++) if (!Number.isFinite(moments[o + k]!)) finite = false;\n if (!finite) continue;\n const rx = i % region.width, ry = (i - rx) / region.width, pixels = columnSums[rx]!.ww * rowSums[ry]!.ww / (area * area);\n finishDisplayViewPixel(moments.subarray(o, o + 9), pixels, setup.seed, (region.y + ry) * setup.viewWidth + region.x + rx, step, maximum, samples, expected, noiseStd, i * 3);\n meanBound[i] = MARGIN * moments[o + 9]!; varianceBound[i] = MARGIN * moments[o + 10]! + quantizationBound(moments, o, meanBound[i]!, pixels, step);\n }\n } else await recomputeRuns(setup, signalInput, flagged, abort, (first, run, part) => {\n // The run's counts are the sums of its pixels' counts.\n samples.set(part.samples, first * 3); expected.set(part.expected, first * 3); noiseStd.set(part.noiseStd, first * 3); saturated.set(part.saturated, first);\n for (let k = 0; k < run; k++) { meanBound[first + k] = 0; varianceBound[first + k] = 0; recomputed.push(first + k); }\n corrected += part.ahdCorrectedPixelCount; sampleCount += part.sampleCount; siteCount += part.siteCount;\n });\n }\n timings.recompute = now() - t0;\n const relative = MARGIN * CPU_RELATIVE;\n const expectedValueBound: ImageKernelRelativeErrorBound = { kind: \"relative-to-reference\", relative, absolute: largestMean };\n const uncertain = flagged.length - recomputed.length + undecided.length - highlights.length;\n let saturatedPixelCount = 0;\n for (let i = 0; i < pixelCount; i++) saturatedPixelCount += saturated[i]!;\n return { samples, expected, noiseStd, sampleCount, siteCount, detailPixelCount: pixelCount, uniformPixelCount: 0, ahdCorrectedPixelCount: corrected, estimation: \"exact-area-mean\", saturated, saturatedPixelCount,\n execution: webGpuExecution(expectedValueBound, uncertain), expectedValueBound, varianceBound: { kind: \"relative-to-reference\", relative, absolute: largestVariance },\n expectedValueAbsoluteBound: meanBound, varianceAbsoluteBound: varianceBound, flaggedPixelIndices: Uint32Array.from(flagged), hostRecomputedPixelIndices: Uint32Array.from(recomputed),\n pixelFlags, highlightRecomputedPixelIndices: Uint32Array.from(highlights), statesComputed, statesHeld: states.size, tapsPerSite: gather.tapCount, blockedSum: blocked, siteSumRelativeBound: floats[50]!, latticePointsResolved, stageMilliseconds: timings };\n}\n\n/**\n * The GPU setup the material modules read for a Quality render (#491's `createDisplayViewMaterialModules`). The composite module\n * recovers the exact lattice point from the kernel's float32 point with the request's query offsets and the scale of its own\n * query points. With diffraction kernels the reference has no query points: it evaluates each lattice group's points with the\n * lattice formula (p + 0.5 + f − W/2)·g, −(q + 0.5 + f − H/2)·g (`createDisplayViewExpectedSignal`). The lattice pass forms\n * exactly that point per group, so the module is given the groups as its offsets and that formula as the query points; the\n * module's own checks (the model at the frame's corners within 2⁻⁴⁸, the offsets' separation, at most 16 offsets) then apply to\n * them as to a Speed lattice. Without diffraction the request's own offsets and query points are the lattice already (each\n * group member's point is checked to be its offset's, `displayViewQualityGpuUnsupportedReason`).\n */\nexport function qualityMaterialSetup(gpu: DisplayViewGpuSetup): DisplayViewGpuSetup {\n const input = gpu.signalInput;\n if (!input.kernels) return gpu;\n const groups = displayViewSignalTables(input).groups, W = input.nativeWidth, H = input.nativeHeight, g = 2 / input.outputWidth;\n const offsets = groups.map((group) => ({ x: group.fx, y: group.fy, weight: 1 / groups.length }));\n const queryPoint = (x: number, y: number, o: number, out: Float64Array): void => {\n const group = groups[o]!;\n out[0] = latticeCoordinate(x, group.fx, W, g); out[1] = -latticeCoordinate(y, group.fy, H, g);\n };\n const { kernels: _kernels, ...rest } = input;\n void _kernels;\n return { ...gpu, signalInput: { ...rest, offsets, queryPoint } };\n}\n\n/** The material module of a Quality render's scene (see `qualityMaterialSetup`). */\nexport function qualityMaterialModule(modules: DisplayViewMaterialModules, gpu: DisplayViewGpuSetup, signal: AbortSignal): Promise<DisplayViewGpuMaterialModule> {\n return modules.moduleFor(qualityMaterialSetup(gpu), signal);\n}\n\n/** The pixel-aperture samples per axis and anti-aliasing spots of a request. */\nexport function offsetCount(request: DisplayViewGpuRequest): number { return request.boxSamples * request.boxSamples * (request.antiAliasing ? 4 : 1); }\n\n/**\n * Why the Quality renderer does not support a prepared request (`DisplayViewGpuRenderer.supports`), or true: engine charts and\n * declared `material-layers` scenes (the material modules of `createDisplayViewMaterialModules`, #491), the identity or Reinhard\n * tone curve and at most 64 query offsets (lattice groups). `lens.defocus` out of focus is supported (#492 step 2c: the site pass\n * gathers the disc, or each node's diffraction kernel convolved with it, up to the reference's own caps of radius 64 and 96);\n * whether a view's footprints take the exact area mean, whether the device passes the composite probe, and whether the kernel\n * table fits the device's storage binding limit, is known only per render.\n */\nexport function displayViewQualityGpuSupports(request: DisplayViewGpuRequest): true | string {\n return sceneToneAndOffsetsReason(request, MAXIMUM_GROUPS);\n}\n\n/** A normalized, symmetric site kernel of radius R for the self-check (a binned Gaussian of width `sigma` sites). */\nfunction syntheticKernel(radius: number, sigma: number): Float64Array {\n const size = 2 * radius + 1, kernel = new Float64Array(size * size);\n let sum = 0;\n for (let v = -radius; v <= radius; v++) for (let u = -radius; u <= radius; u++) { const w = Math.exp(-0.5 * (u * u + v * v) / (sigma * sigma)); kernel[(v + radius) * size + u + radius] = w; sum += w; }\n for (let t = 0; t < kernel.length; t++) kernel[t] = kernel[t]! / sum;\n return kernel;\n}\n\n/**\n * The renderer's run-time self-checks (`DisplayViewGpuRenderer.conformanceCases`): a 38 × 26 checkerboard frame of 6 µm sites\n * shown at 13 × 9 (2.9 real pixels per display pixel) with the 2 × 2 box and a four-spot filter (16 offsets, four lattice groups),\n * the GPU against `renderDisplayView` within the a-priori bounds, every flagged pixel recomputed:\n *\n * - `display-view:quality:checkerboard-13x9-diffraction-ahd` (#479): synthetic radius-1 diffraction kernels at three spectral\n * nodes, the AHD candidates and the low-signal correction (few electrons per site, so the correction applies; 64 draws per\n * state keep the check short), the tap-list site pass;\n * - `display-view:quality:checkerboard-13x9-defocus-blocked` (#492): the engine's own defocus disc of 6.3 sites (radius 3) at\n * every node, the bilinear demosaic (a defocused Speed request's route), the blocked site sum, and a tap budget that splits\n * each band's site pass over several dispatches.\n */\nasync function runQualityConformance(handle: DisplayViewGpuRuntimeHandle, signal: AbortSignal | undefined, defocus: boolean): Promise<true | string> {\n const runtime = handle as WebGpuRuntime, { nativeWidth, nativeHeight, frameWidth, nodes } = CONFORMANCE_FRAME, { chart, scene } = conformanceChart();\n const offsets: { x: number; y: number; weight: number }[] = [];\n for (const [nx, ny] of [[-0.25, -0.25], [0.25, -0.25], [-0.25, 0.25], [0.25, 0.25]] as const) for (const [ax, ay] of [[-0.5, -0.5], [0.5, -0.5], [-0.5, 0.5], [0.5, 0.5]] as const) offsets.push({ x: nx - ax, y: ny - ay, weight: 1 / 16 });\n const disc = defocus ? createDefocusDiscSiteKernel(6.3)! : null;\n const kernels = disc ? { radius: disc.radius, perNode: nodes.map(() => disc.weights) } : { radius: 1, perNode: [syntheticKernel(1, 0.6), syntheticKernel(1, 0.7), syntheticKernel(1, 0.8)] };\n const signalInput: DisplayViewExpectedSignalInput = { nativeWidth, nativeHeight, outputWidth: frameWidth, wavelengthsNm: nodes, electronsPerRadiance: conformanceResponses(defocus ? 1 : 0.1),\n offsets, kernels, scene, channelAt: conformanceChannelAt };\n const setup = conformanceSetup(signalInput, { perElectron: defocus ? 1 / 40000 : 1 / 4000, darkElectrons: 0.07, constantVariance: 2.5e-7 }, 479, 5 + (disc ? disc.radius : 0), signal,\n defocus ? {} : { candidates: [0, 1, 2, 3].map((p) => ahdCandidateKernels(p % 2, Math.floor(p / 2))),\n ahdCorrection: { labMatrix: [[0.4124, 0.3576, 0.1805], [0.2126, 0.7152, 0.0722], [0.0193, 0.1192, 0.9505]].map((row) => row.map((v, c) => v * [1.1, 1, 1.6][c]!)), drawsPerState: 64, thresholdVariance: 1e-4 } });\n const reference = await renderDisplayView(setup);\n return await withConformanceAbort(runtime, signal, async (abort, pipelines) => {\n const gather = defocus ? { blockedSum: true, maximumSiteTapsPerDispatch: 64 * 4 * (2 * 3 + 2) ** 2 } : {};\n const gpu = await renderDisplayViewQualityOnGpu(runtime, 1 << 20, { setup, signalInput, material: chartPresetMaterialModule(chart), ...gather }, abort, undefined, pipelines);\n if (!defocus && (gpu.ahdCorrectedPixelCount === 0 || reference.ahdCorrectedPixelCount === 0)) return \"the self-check did not exercise the low-signal correction.\";\n if (defocus && (!gpu.blockedSum || gpu.stageMilliseconds.siteDispatches < 2)) return \"the self-check did not exercise the blocked site sum over several dispatches.\";\n // #533: the verdict includes the saturated-pixel count (the light squares sit at the white clip).\n return conformanceVerdict(reference, gpu);\n });\n}\n/** #479's self-check (see `runQualityConformance`). */\nexport const DISPLAY_VIEW_QUALITY_CONFORMANCE_CASE: DisplayViewGpuConformanceCase = { id: \"display-view:quality:checkerboard-13x9-diffraction-ahd\",\n run: (handle, signal) => runQualityConformance(handle, signal, false) };\n/** #492's self-check of the defocus disc's blocked site sum (see `runQualityConformance`). */\nexport const DISPLAY_VIEW_QUALITY_DEFOCUS_CONFORMANCE_CASE: DisplayViewGpuConformanceCase = { id: \"display-view:quality:checkerboard-13x9-defocus-blocked\",\n run: (handle, signal) => runQualityConformance(handle, signal, true) };\n\n/** The bilinear RGGB demosaic kernels per phase (phaseY·2 + phaseX) and channel, as `bilinearPhaseProfiles` gives them. */\nexport function bilinearKernels(): DisplayViewKernelTap[][][] {\n const cross = [[1, 0], [-1, 0], [0, 1], [0, -1]], diagonal = [[1, 1], [1, -1], [-1, 1], [-1, -1]], horizontal = [[1, 0], [-1, 0]], vertical = [[0, 1], [0, -1]];\n const average = (offsets: number[][]): DisplayViewKernelTap[] => offsets.map(([dx, dy]) => ({ dx: dx!, dy: dy!, weight: 1 / offsets.length })), self = [{ dx: 0, dy: 0, weight: 1 }];\n return [[self, average(cross), average(diagonal)], [average(horizontal), self, average(vertical)], [average(vertical), self, average(horizontal)], [average(diagonal), average(cross), self]];\n}\n\n/**\n * The display view's GPU renderer on one runtime (#481's `DisplayViewGpuRenderer`): the Speed kernel for requests it covers\n * (no diffraction, no AHD, no defocus disc, at most 16 offsets) and the Quality kernels for the rest (#492: a defocused Speed\n * request too, with its bilinear demosaic). One pipeline cache per device, one set of\n * material modules (#491: chart presets, composite charts, the 2.3 elements and material-layers scenes; `dispose` releases their\n * uploaded scene records), one correction-state store per correction key. `render` renders the part's region (`setup.gpu`\n * carries the expected signal's input and the chart; a setup without it, a coarse view or a frame the kernels do not cover\n * throws `unsupported-on-backend`), and throws `aborted` and `device-lost` as the accelerator's operations do.\n */\n/** #564: the GPU refusal of a defocus kernel above the direct radius (the CPU convolves it by runs). */\nconst LARGE_DEFOCUS_REASON = \"a defocus kernel radius above 64 sites (convolved by runs on the CPU, #564) is not on the GPU\";\n\nexport function createDisplayViewGpuRenderer(runtime: WebGpuRuntime, options: { maximumBandBytes?: number; yieldControl?: YieldControl } = {}): DisplayViewGpuRenderer {\n const pipelines = new Map<string, Promise<GPUComputePipeline>>(), stores = new Map<string, CorrectionStateStore>();\n const bandBytes = options.maximumBandBytes ?? Math.min(64 * 1024 * 1024, runtime.maximumStorageBindingBytes);\n const source: PipelineSource = (label, code) => {\n let pending = pipelines.get(label);\n if (!pending) { pending = createComputePipeline(runtime, label, code, undefined); pipelines.set(label, pending); pending.catch(() => pipelines.delete(label)); }\n return pending;\n };\n // #491: one set of material modules per device for both kernels (the preset module per chart; the composite module, its probe\n // and its uploaded scene records), released by `dispose`.\n const modules = createDisplayViewMaterialModules(runtime, source);\n return {\n id: \"photivra-display-view\",\n supports(request: DisplayViewGpuRequest): true | string {\n if (request.largeDefocus) return LARGE_DEFOCUS_REASON;\n // #492: out of focus the expected signal carries the defocus disc as site kernels, which only the Quality site pass gathers;\n // a Speed request then runs the Quality passes with its own bilinear demosaic (one candidate) and finishing.\n if (request.defocus) return displayViewQualityGpuSupports(request);\n const speed = displayViewSpeedGpuSupports(request);\n if (speed === true) return true;\n return displayViewQualityGpuSupports(request);\n },\n conformanceCases: [DISPLAY_VIEW_SPEED_CONFORMANCE_CASE, DISPLAY_VIEW_QUALITY_CONFORMANCE_CASE, DISPLAY_VIEW_QUALITY_DEFOCUS_CONFORMANCE_CASE],\n async render(part: DisplayViewGpuPart): Promise<DisplayViewGpuRenderOutput> {\n const { setup, signal } = part;\n if (!setup.gpu) throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"The display-view setup carries no GPU inputs (setup.gpu); use cpu-reference.\");\n const abort = new AbortController(), onAbort = (): void => abort.abort();\n if (signal?.aborted) throw abortedError();\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n try {\n const signalInput = setup.gpu.signalInput;\n let result: DisplayViewRenderResult & { expectedValueBound: ImageKernelRelativeErrorBound; execution: ImageKernelExecution };\n let material: DisplayViewGpuMaterialModule;\n if (displayViewSpeedGpuUnsupportedReason(setup, signalInput) === null) {\n material = await modules.moduleFor(setup.gpu, abort.signal);\n result = await renderDisplayViewSpeedOnGpu(runtime, bandBytes, { setup, signalInput, material }, abort, options.yieldControl, source);\n } else {\n // #581: an image-plane print brings its own passes 1 and 2.\n const image = (signalInput.scene as { image?: unknown }).image ? await modules.imagePasses(setup.gpu, abort.signal) : undefined;\n material = image ? { id: \"image-plane\", wgsl: \"\", bindings: [] } : await qualityMaterialModule(modules, setup.gpu, abort.signal);\n const key = displayViewCorrectionKey(setup);\n let states = key === null ? undefined : stores.get(key);\n if (key !== null && !states) { states = new CorrectionStateStore(); stores.set(key, states); }\n result = await renderDisplayViewQualityOnGpu(runtime, bandBytes, { setup, signalInput, material, ...(image ? { image } : {}), ...(states ? { states } : {}) }, abort, options.yieldControl, source);\n }\n return { samples: result.samples, expected: result.expected, noiseStd: result.noiseStd, sampleCount: result.sampleCount, siteCount: result.siteCount, detailPixelCount: result.detailPixelCount,\n uniformPixelCount: result.uniformPixelCount, ahdCorrectedPixelCount: result.ahdCorrectedPixelCount, estimation: result.estimation, saturated: result.saturated,\n saturatedPixelCount: result.saturatedPixelCount, errorBound: result.expectedValueBound,\n diagnosticUncertaintySampleCount: result.execution.diagnosticUncertaintySampleCount, ...(material.compositeProbe ? { compositeProbe: material.compositeProbe } : {}) };\n } finally { signal?.removeEventListener(\"abort\", onAbort); }\n },\n dispose(): void { modules.release(); stores.clear(); }\n };\n}\n\n/** The factory `prepareDisplayView` creates the renderer with (one per device): the Speed and Quality kernels behind one renderer. */\nexport const displayViewGpuRendererFactory: DisplayViewGpuRendererFactory = (handle: DisplayViewGpuRuntimeHandle) => createDisplayViewGpuRenderer(handle as WebGpuRuntime);\n\n/** Registers the combined renderer as the display view's GPU renderer and returns the factory registered before. */\nexport function registerDisplayViewGpuRenderer(): DisplayViewGpuRendererFactory | null {\n return setDisplayViewGpuRendererFactory(displayViewGpuRendererFactory);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"display-view-quality-gpu.js","sourceRoot":"","sources":["../../src/gpu/display-view-quality-gpu.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Host side of the display view's Quality path on the GPU (#479): the support check, the float64 tables (the lattice groups\n * and their combined diffraction kernels per material and channel, as the reference forms them; the bilinear and AHD\n * candidate kernels; the footprint geometry), the three passes per band of display rows (lattice materials, site moments,\n * display pixels; `wgsl-display-view-quality-kernel.ts`), and the reference's own float64 finishing per display pixel (`finishDisplayViewPixel` of the Speed host:\n * the quantization term, the seeded noise draw, the Cholesky factor, the clipped centre, the sRGB encode and the rounding),\n * so the noise draw is bit-identical to the CPU's.\n *\n * Defocus (#492 step 2c): out of focus the expected signal carries the defocus disc (or each node's diffraction kernel\n * convolved with it) as site kernels, up to radius 96. The site pass then reads a factored table, sums in blocks, and reads a\n * lattice whose uncertain points the host resolved with the reference's own material lookup; a band's site pass is split over\n * dispatches of at most `DISPLAY_VIEW_QUALITY_SITE_TAPS_PER_DISPATCH` taps. A defocused Speed request runs these passes with\n * its bilinear demosaic (docs/WEBGPU.md, \"Defocus on the GPU\").\n *\n * The float64 reference is `renderDisplayView` (facade/display-view.ts) on the exact-area-mean path with\n * `createDisplayViewExpectedSignal` (facade/expected-signal.ts), chart materials, with or without diffraction kernels,\n * the bilinear or the AHD candidates. Internal: not exported from the package.\n *\n * #594: this module and its WGSL load on demand (`prepareDisplayViewQualityGpu` in `display-view-gpu-renderer.ts`, a dynamic\n * import), at the first render that takes the Quality passes; the renderer and the Speed path never import it statically.\n *\n * Flagged display pixels (an uncertain lattice material among the sites read, AHD's choice on the noise-free mosaic able to move\n * the pixel by more than DISPLAY_VIEW_QUALITY_CHOICE_SIGMA of its noise (#457), a non-finite output) are recomputed with the\n * reference, so they are exact. Every stage's wall-clock time is reported (`stageMilliseconds`); on a software adapter it\n * is not GPU performance.\n */\nimport { axisSums, displayViewDecidedSaturation, overlaps, renderDisplayView,\n ahdCandidateKernels, type AxisSums, type DisplayViewKernelTap, type DisplayViewRenderResult, type DisplayViewSetup } from \"../facade/display-view.js\";\nimport { displayViewSignalTables, type DisplayViewExpectedSignalInput, type GroupTables } from \"../facade/expected-signal.js\";\nimport type { DisplayViewGpuSetup } from \"../facade/display-view.js\";\nimport type { DisplayViewMaterialModules } from \"./display-view-composite-material-module.js\";\nimport type { DisplayViewGpuConformanceCase, DisplayViewGpuRuntimeHandle } from \"../facade/display-view-gpu.js\";\nimport { chartPresetMaterialModule } from \"./display-view-chart-material-module.js\";\nimport { CONFORMANCE_FRAME, LARGE_DEFOCUS_REASON, recomputeRuns, footprintShape, conformanceChannelAt, conformanceChart, conformanceResponses, conformanceSetup, conformanceVerdict, withConformanceAbort, axisRecord, finishDisplayViewPixel, gaussLegendre16, queryGeometry,\n type DisplayViewGpuMaterialModule } from \"./display-view-speed-gpu.js\";\nimport { createHostYieldGate } from \"../capture/host-yield-cadence.js\";\nimport { createDefocusDiscSiteKernel } from \"../optics/defocus-disc-kernel.js\";\nimport { ImageKernelExecutionError, WEBGPU_F32_UNIT_ROUNDOFF, webGpuExecution, type ImageKernelExecution, type ImageKernelRelativeErrorBound } from \"./image-kernel-execution.js\";\nimport { BUFFER_USAGE, GpuResourceScope, linearDispatch, runComputePass, type WebGpuRuntime, throwIfAborted as checkAbort } from \"./webgpu-runtime.js\";\nimport { DISPLAY_VIEW_QUALITY_AUX, DISPLAY_VIEW_QUALITY_CANDIDATE_ENTRIES, DISPLAY_VIEW_QUALITY_CANDIDATE_FLOATS, DISPLAY_VIEW_QUALITY_FLAG, DISPLAY_VIEW_QUALITY_FLAG_WORDS,\n DISPLAY_VIEW_QUALITY_GEOMETRY_STRIDE, DISPLAY_VIEW_QUALITY_GROUP_WORDS, DISPLAY_VIEW_QUALITY_MAXIMUM_NODES, DISPLAY_VIEW_QUALITY_MAXIMUM_PIXELS_PER_AXIS, DISPLAY_VIEW_QUALITY_OUTPUT_FLOATS, DISPLAY_VIEW_QUALITY_PARAM_WORDS,\n DISPLAY_VIEW_QUALITY_PIXELS_WGSL, DISPLAY_VIEW_QUALITY_SITES_BLOCKED_WGSL, DISPLAY_VIEW_QUALITY_SITES_WGSL, DISPLAY_VIEW_QUALITY_SITE_FLOATS, DISPLAY_VIEW_QUALITY_TAP_WORDS, DISPLAY_VIEW_QUALITY_WORKGROUP_SIZE,\n assembleDisplayViewQualityLatticeWgsl, assembleDisplayViewQualityPixelsWgsl } from \"./wgsl-display-view-quality-kernel.js\";\nimport { SDR_LUMINANCE_WEIGHTS } from \"../output/sdr-rendering.js\";\n\ntype PipelineSource = (label: string, code: string) => Promise<GPUComputePipeline>;\ntype YieldControl = ((signal: AbortSignal) => Promise<void>) | undefined;\n\n/** One WGSL rounding of + − × in either direction (W3C WGSL \"Floating Point Accuracy\"; #471, #487): twice the binary32 unit roundoff. */\nconst E = 2 * WEBGPU_F32_UNIT_ROUNDOFF;\n/** Every reported bound is doubled: the kernel's running bounds are first order, and their own float32 arithmetic rounds. */\nconst MARGIN = 2;\n/** The reference's own float64 rounding of its chains, relative. */\nconst CPU_RELATIVE = 2 ** -40;\n/** Table values above this are outside the float32 domain. */\nconst FLOAT32_SAFE_MAGNITUDE = 2 ** 120;\n/** Largest demosaic reach (AHD's candidates read 3 sites away) and lattice group count the tables hold. */\nconst MAXIMUM_REACH = 3, MAXIMUM_GROUPS = 64;\n/**\n * Largest site-kernel radius the gather takes: the diffraction cap (32 sites) plus the defocus disc's (64 sites), the largest\n * combined radius the reference builds (#492; `buildExpectedSignalInput`).\n */\nexport const DISPLAY_VIEW_QUALITY_MAXIMUM_KERNEL_RADIUS = 96;\n/**\n * Default largest number of taps one site-pass dispatch gathers (sites × taps per site), so that a band of a large defocus\n * kernel (up to 150 544 taps per site at radius 96) is split over several dispatches instead of one long one that an operating\n * system's GPU watchdog could reset (Windows' default TDR delay is 2 s). A choice, not a measurement: 2³⁰ taps take 0.1 s at an\n * assumed 10¹⁰ taps per second; at radius 94 it leaves about 7 100 sites (111 workgroups) per dispatch, fewer than a large GPU\n * runs at once. In focus a band stays one dispatch (400 taps per site at f/8). The hardware run of #475 records the site pass's\n * time and dispatch count (`stageMilliseconds.sites`, `siteDispatches`), which decide whether the budget or a gather split over\n * several invocations per site is needed.\n */\nexport const DISPLAY_VIEW_QUALITY_SITE_TAPS_PER_DISPATCH = 2 ** 30;\n/** The smallest positive normal float32: values below it may be flushed to zero by a device (WGSL allows it). */\nconst FLOAT32_MINIMUM_NORMAL = 2 ** -126;\n/** Candidate table entries per phase: the (2·reach + 1)² window. */\nconst WINDOW_SLOTS = (2 * MAXIMUM_REACH + 1) ** 2;\n/**\n * The host's output quantization term q(m) = s(e)²·Δ²/12 (`quantizationVariance`, s the sRGB EOTF's slope at the encoded mean e)\n * is evaluated at the GPU's mean, so it moves with the mean's error: dq/dm = 2·s′(e)·Δ²/12 (de/dm = 1/s), with\n * s′(e) = (2.4/1.055)·(1.4/1.055)·((e + 0.055)/1.055)^0.4 ≤ 3.02 on [0, 1] and 0 on the linear segment and outside [0, 1];\n * q is non-decreasing in m, with a jump of (s₊² − s₋²)·Δ²/12 ≤ 2.1·10⁻⁴·Δ²/12 at the segment join (linear m = 0.0031308).\n */\nconst QUANTIZATION_SLOPE = 6.04, QUANTIZATION_JOIN_JUMP = 2.1e-4, QUANTIZATION_JOIN = 0.0031308;\n/** Bytes per display pixel in the output buffers (moments plus the flag word). */\nconst OUTPUT_BYTES_PER_PIXEL = 4 * DISPLAY_VIEW_QUALITY_OUTPUT_FLOATS + 4 * DISPLAY_VIEW_QUALITY_FLAG_WORDS;\nconst SITE_BYTES = 4 * DISPLAY_VIEW_QUALITY_SITE_FLOATS;\n\n/** What a GPU render of a Quality display view needs: the reference's own setup and expected-signal input, plus the material module. */\nexport interface DisplayViewQualityGpuInput {\n setup: DisplayViewSetup;\n signalInput: DisplayViewExpectedSignalInput;\n material: DisplayViewGpuMaterialModule;\n /** Recompute flagged display pixels with the reference. Default true. */\n recomputeFlagged?: boolean;\n /**\n * #492: sum each site's taps in blocks (rows, groups; `DISPLAY_VIEW_QUALITY_SITES_BLOCKED_WGSL`), whose bound grows with the\n * kernel's width rather than its tap count. Default: when the setup's expected signal carries the defocus disc\n * (`setup.gpu.defocusRadius` > 0); in focus the tap-list pass runs as before.\n */\n blockedSum?: boolean;\n /** Largest taps (sites × taps per site) per site-pass dispatch; default `DISPLAY_VIEW_QUALITY_SITE_TAPS_PER_DISPATCH`. */\n maximumSiteTapsPerDispatch?: number;\n /** #581: an image-plane print's own passes 1 and 2 (`material` is then unused). */\n image?: DisplayViewQualityImagePasses;\n}\n/**\n * #581: an image-plane print's passes 1 and 2 (src/gpu/display-view-image-quality.ts): pass 1 writes `pointFloats` radiance values\n * per lattice point and a flag word; pass 2 is the blocked sum over them (the flags at binding 6).\n */\nexport interface DisplayViewQualityImagePasses {\n gather: SignalGather;\n siteGamma: number;\n pointFloats: number;\n lattice: [label: string, wgsl: string];\n sites: [label: string, wgsl: string];\n /** Runs pass 1 over a band's lattice windows, and with site kernels resolves its flagged points with the reference (their count). */\n runLattice(band: GpuResourceScope, pipeline: GPUComputePipeline, params: GPUBuffer, groups: GPUBuffer, groupWords: Uint32Array, latticeTotal: number, signal: AbortSignal):\n Promise<{ values: GPUBuffer; flags: GPUBuffer; resolved: number }>;\n}\n\n/** Wall-clock milliseconds per stage of one render (upload, dispatch and readback of each pass; host work apart). */\nexport interface DisplayViewQualityStageTimings {\n /** Pass 1: the lattice materials (the material module per lattice point). */\n lattice: number;\n /** Pass 2: the site electrons through the combined kernels, the readout moments and the white clip. */\n sites: number;\n /** Pass 3: the display pixels (demosaic candidates, development, covariance), every dispatch of it. */\n pixels: number;\n /** The host finishing (quantization term, noise draw, Cholesky, encode) of every display pixel. */\n finishing: number;\n /** The reference's recomputation of flagged display pixels. */\n recompute: number;\n /** Pass 2 dispatches (one per band, or more where a band's sites × taps exceed the tap budget per dispatch, #492). */\n siteDispatches: number;\n}\n\n/** A GPU Quality display view of one region: the reference's result fields plus the execution label, the bounds, the flags and the timings. */\nexport interface DisplayViewQualityGpuResult extends DisplayViewRenderResult {\n execution: ImageKernelExecution;\n /** |E_gpu − E_cpu| ≤ relative·|E_cpu| + absolute for every component of every display pixel (linear light); `absolute` is the largest per-pixel term. */\n expectedValueBound: ImageKernelRelativeErrorBound;\n /** |V_gpu − V_cpu| ≤ relative·V_cpu + absolute for every covariance entry (linear light squared). */\n varianceBound: ImageKernelRelativeErrorBound;\n /** Per display pixel: the absolute terms of the two bounds (the kernel's running bounds, doubled). */\n expectedValueAbsoluteBound: Float32Array;\n varianceAbsoluteBound: Float32Array;\n /** Display pixels (region row-major) the kernel flagged, and those the host recomputed with the reference. */\n flaggedPixelIndices: Uint32Array;\n hostRecomputedPixelIndices: Uint32Array;\n /** The kernel's flag word per display pixel (`DISPLAY_VIEW_QUALITY_FLAG` bits). */\n pixelFlags: Uint32Array;\n /** #533: display pixels (not flagged) with a real pixel whose saturation the kernel left undecided; their count is the host reference's. */\n highlightRecomputedPixelIndices: Uint32Array;\n /** Taps per native site of the expected-signal gather (over every lattice group). */\n tapsPerSite: number;\n /** #492: whether the site pass summed in blocks (the defocus disc), and the relative bound of a site's electrons it used. */\n blockedSum: boolean;\n siteSumRelativeBound: number;\n /**\n * #492, blocked sum only: lattice points the material module flagged as uncertain that the host resolved with the reference's\n * own float64 `materialAt` at the reference's lattice point (so no site of a defocused render carries material uncertainty).\n */\n latticePointsResolved: number;\n stageMilliseconds: DisplayViewQualityStageTimings;\n}\n\n/**\n * Waits until the queue has finished the work submitted so far (`GPUQueue.onSubmittedWorkDone`), so a pass that reads nothing\n * back is timed with its own execution, not the next pass's wait. The passes depend on each other in order anyway.\n */\nasync function queueIdle(runtime: WebGpuRuntime, signal: AbortSignal): Promise<void> {\n const queue = runtime.device.queue as { onSubmittedWorkDone?: () => Promise<undefined> };\n if (typeof queue.onSubmittedWorkDone === \"function\") await runtime.guard(queue.onSubmittedWorkDone(), signal);\n}\n\n/** The demosaic candidates of a setup (the bilinear kernels when it has none) and their reach in sites. */\nfunction candidatesOf(setup: DisplayViewSetup): { candidates: readonly (readonly (readonly (readonly DisplayViewKernelTap[])[])[])[]; count: number; reach: number } {\n const candidates = setup.candidates ?? setup.demosaic.map((phase) => [phase]), count = candidates[0]?.length ?? 0;\n const reach = Math.max(1, ...candidates.flat(3).map((t) => Math.max(Math.abs(t.dx), Math.abs(t.dy))));\n return { candidates, count, reach };\n}\n\n/** Fractional bits of a float64 (the smallest b with c·2^b an integer), or Infinity beyond 60. */\nfunction fractionalBits(c: number): number {\n for (let b = 0; b <= 60; b++) if (Number.isInteger(c * 2 ** b)) return b;\n return Infinity;\n}\n/** Whether p + c is exact in float32 for every integer p with |p| ≤ `span` (c has b fractional bits and |p + c| < 2^(24 − b)). */\nfunction exactLatticeConstant(c: number, span: number): boolean {\n const b = fractionalBits(c);\n return Math.fround(c) === c && b <= 22 && span + Math.abs(c) + 1 < 2 ** (24 - b);\n}\n\n/**\n * Why the Quality kernels do not cover a request, or null when they do: chart materials, the exact area mean (footprints of\n * at most 25 real pixels and 6 per axis), the identity or positive Reinhard tone curve, demosaic candidates within 3 sites\n * (1 or 2 per phase), at most 64 lattice groups, lattice constants exact in float32, and a raster at least\n * 2·reach + 2 sites on each axis (so a reflected border site lies in the band's window).\n */\nexport function displayViewQualityGpuUnsupportedReason(setup: DisplayViewSetup, signalInput: DisplayViewExpectedSignalInput): string | null {\n if (signalInput.largeKernel) return LARGE_DEFOCUS_REASON;\n if (signalInput.scene.kind !== \"materials\" && !signalInput.scene.image) return \"radiance scenes (caller functions) are not on the GPU\";\n if (!signalInput.kernels && !signalInput.queryPoint) return \"the expected signal has no query points\";\n if (![\"identity\", \"positive-reinhard-per-channel\", \"extended-reinhard-luminance\", \"naka-rushton-luminance\"].includes(setup.toneCurve)) return \"unsupported tone curve \" + String(setup.toneCurve);\n if (setup.rendering && !setup.coupled) return \"the coupled rendering steps were not prepared\";\n if (setup.region.width < 1 || setup.region.height < 1) return \"an empty region\";\n if (signalInput.wavelengthsNm.length < 1 || signalInput.wavelengthsNm.length > DISPLAY_VIEW_QUALITY_MAXIMUM_NODES) return \"the site passes integrate 1 to \" + DISPLAY_VIEW_QUALITY_MAXIMUM_NODES + \" spectral nodes per site\";\n if (signalInput.kernels && (signalInput.kernels.radius < 0 || signalInput.kernels.radius > DISPLAY_VIEW_QUALITY_MAXIMUM_KERNEL_RADIUS))\n return \"a site kernel radius above \" + DISPLAY_VIEW_QUALITY_MAXIMUM_KERNEL_RADIUS + \" (the diffraction and defocus caps)\";\n const shape = footprintShape(setup);\n if (!shape.exact) return \"the stratified estimator (footprints above 25 real pixels) is not on the GPU\";\n if (shape.maximumColumns > DISPLAY_VIEW_QUALITY_MAXIMUM_PIXELS_PER_AXIS || shape.maximumRows > DISPLAY_VIEW_QUALITY_MAXIMUM_PIXELS_PER_AXIS)\n return \"a footprint touches more than \" + DISPLAY_VIEW_QUALITY_MAXIMUM_PIXELS_PER_AXIS + \" real pixels along an axis\";\n const { candidates, count, reach } = candidatesOf(setup);\n if (candidates.length !== 4 || (count !== 1 && count !== 2) || candidates.some((p) => p.length !== count || p.some((d) => d.length !== 3))) return \"each CFA phase needs 1 or 2 demosaic candidates with a kernel per channel\";\n if (reach > MAXIMUM_REACH) return \"demosaic kernels reaching more than \" + MAXIMUM_REACH + \" sites\";\n // The kernel treats a channel whose sites are all exactly at white as exact: its weights must sum exactly in float32 (dyadic, denominators to 256, magnitudes below 2^10).\n for (const t of candidates.flat(3)) if (!Number.isInteger(t.weight * 256) || Math.abs(t.weight) >= 1024) return \"demosaic weights that are not dyadic rationals (denominators to 256)\";\n for (let p = 0; p < 4; p++) for (let c = 0; c < 3; c++) {\n const taps = setup.demosaic[p]?.[c];\n if (!taps || taps.length < 1 || taps.length > 4 || taps.some((t) => Math.abs(t.dx) > 1 || Math.abs(t.dy) > 1)) return \"the site-variance kernels are not the bilinear kernels (at most 4 taps within one site)\";\n }\n if (setup.nativeWidth < 2 * reach + 2 || setup.nativeHeight < 2 * reach + 2) return \"a raster smaller than 2·reach + 2 sites\";\n const tables = displayViewSignalTables(signalInput);\n if (tables.groups.length < 1 || tables.groups.length > MAXIMUM_GROUPS) return \"the kernel holds 1 to \" + MAXIMUM_GROUPS + \" lattice groups\";\n const W = signalInput.nativeWidth, H = signalInput.nativeHeight, R = signalInput.kernels ? signalInput.kernels.radius : 0;\n if (!signalInput.kernels) {\n // Without diffraction the reference queries each offset's own point; the lattice pass forms it as (x + ix + c)·scale with the\n // group's shift, which is the same number only when ix + f equals the offset exactly (the grouping tolerates 1e-9).\n for (const group of tables.groups) for (const member of group.members) {\n const exact = signalInput.offsets.some((o) => o.x === member.ix + group.fx && o.y === member.iy + group.fy && o.weight === member.weight);\n if (!exact) return \"a query offset that its lattice group does not reproduce exactly\";\n }\n }\n for (const group of tables.groups) {\n const spanX = Math.max(Math.abs(group.minIx), Math.abs(group.maxIx)) + R + W, spanY = Math.max(Math.abs(group.minIy), Math.abs(group.maxIy)) + R + H;\n if (!exactLatticeConstant(0.5 + group.fx - W / 2, spanX) || !exactLatticeConstant(0.5 + group.fy - H / 2, spanY)) return \"a query offset whose lattice constant is not exact in float32\";\n }\n return null;\n}\n\n/** The lattice groups, taps and the spectral table of the expected signal (see the module comment). */\nexport interface SignalGather {\n /**\n * Per group: dpMin, dqMin, dpSpan, dqSpan (lattice extent beyond the site window), cu, cv; its first tap, and (with site\n * kernels) its dense tap rectangle cw × ch (dp = dpMin + dx, dq = dqMin + dy at tap first + dy·cw + dx).\n */\n groups: { dpMin: number; dqMin: number; dpSpan: number; dqSpan: number; cu: number; cv: number; firstTap: number; cw: number; ch: number }[];\n /** Per tap: group, dp − dpMin, dq − dqMin. */\n taps: Uint32Array<ArrayBuffer>;\n tapCount: number;\n /** Spectral nodes N. */\n nodes: number;\n /**\n * 2.21.0 (signals integrated from the material spectrum per site): per channel c, tap t and node n the channel's response and\n * kernel C_c(t, n) at (c·T + t)·N + n (`nodeKernels`; without site kernels the member's weight times A_c(λ_n)), then per material\n * m its spectral radiance L_m(λ_n) at 3·T·N + m·N + n, each float64 rounded once. No per-material channel value is formed: the\n * site pass integrates Σ_t Σ_n C_c(t, n)·L_{m_t}(λ_n).\n */\n table: Float32Array<ArrayBuffer>;\n /**\n * Per channel c and tap t (at c·T + t): a bound on the difference between any two materials' signals at that tap,\n * Σ_n C_c(t, n)·(max_m L_m(λ_n) − min_m L_m(λ_n)), from the spectra's envelope (no per-material value), rounded up.\n */\n spread: Float32Array<ArrayBuffer>;\n materials: number;\n /**\n * An absolute bound on what a device that flushes results below the float32 normal range (WGSL allows it) can drop from a site:\n * per tap the largest product C·max L below that range over the channels, plus one smallest normal per partial addition and\n * per compensation step ((T + 2)·N of them), float64.\n */\n tinyMass: number;\n}\nfunction signalGather(signalInput: DisplayViewExpectedSignalInput): SignalGather {\n const tables = displayViewSignalTables(signalInput), A = signalInput.electronsPerRadiance, N = signalInput.wavelengthsNm.length, spectra = tables.spectra;\n const W = signalInput.nativeWidth, H = signalInput.nativeHeight, R = signalInput.kernels ? signalInput.kernels.radius : 0, materials = spectra.length;\n // Taps in order: per group, with site kernels the dense rectangle row-major (tap (dx, dy) reads lattice offset (minIx − R + dx,\n // minIy − R + dy)), without them one tap per member. Plain loops: a radius-96 kernel has up to 150 544 taps.\n const tapGroup: number[] = [], tapDp: number[] = [], tapDq: number[] = [], tapIndex: number[] = [];\n const groups: SignalGather[\"groups\"] = [];\n tables.groups.forEach((group: GroupTables, g) => {\n const first = tapGroup.length;\n let dpMin = Infinity, dpMax = -Infinity, dqMin = Infinity, dqMax = -Infinity;\n const push = (dp: number, dq: number, index: number): void => {\n tapGroup.push(g); tapDp.push(dp); tapDq.push(dq); tapIndex.push(index);\n dpMin = Math.min(dpMin, dp); dpMax = Math.max(dpMax, dp); dqMin = Math.min(dqMin, dq); dqMax = Math.max(dqMax, dq);\n };\n if (signalInput.kernels) {\n for (let dy = 0; dy < group.ch; dy++) for (let dx = 0; dx < group.cw; dx++) push(group.minIx - R + dx, group.minIy - R + dy, dy * group.cw + dx);\n } else group.members.forEach((member, index) => push(member.ix, member.iy, index));\n groups.push({ dpMin, dqMin, dpSpan: dpMax - dpMin, dqSpan: dqMax - dqMin, cu: 0.5 + group.fx - W / 2, cv: 0.5 + group.fy - H / 2, firstTap: first,\n cw: signalInput.kernels ? group.cw : 0, ch: signalInput.kernels ? group.ch : 0 });\n });\n const T = tapGroup.length, taps = new Uint32Array(T * DISPLAY_VIEW_QUALITY_TAP_WORDS), spread = new Float32Array(3 * T);\n for (let t = 0; t < T; t++) {\n const g = tapGroup[t]!, group = groups[g]!;\n taps[t * DISPLAY_VIEW_QUALITY_TAP_WORDS] = g; taps[t * DISPLAY_VIEW_QUALITY_TAP_WORDS + 1] = tapDp[t]! - group.dpMin; taps[t * DISPLAY_VIEW_QUALITY_TAP_WORDS + 2] = tapDq[t]! - group.dqMin;\n }\n // Every value finite and non-negative, every spectrum value normal (a device may flush the others) and every sum in range.\n const domain = (): never => { throw new ImageKernelExecutionError(\"unsupported-float32-domain\", \"A site's spectral terms are outside the float32 domain.\"); };\n // The spectra and their envelope per node.\n const base = 3 * T * N, table = new Float32Array(base + materials * N), low = new Float64Array(N).fill(Infinity), high = new Float64Array(N).fill(-Infinity);\n let smallestL = Infinity;\n spectra.forEach((L, m) => {\n for (let n = 0; n < N; n++) {\n const l = L[n]!;\n if (!(l >= 0 && l <= FLOAT32_SAFE_MAGNITUDE)) domain();\n table[base + m * N + n] = l; low[n] = Math.min(low[n]!, l); high[n] = Math.max(high[n]!, l);\n if (l > 0) smallestL = Math.min(smallestL, l);\n }\n });\n if (smallestL < FLOAT32_MINIMUM_NORMAL) domain();\n let largestSum = 0, tinyMass = (T + 2) * N * FLOAT32_MINIMUM_NORMAL;\n for (let t = 0; t < T; t++) {\n const source = tables.groups[tapGroup[t]!]!, index = tapIndex[t]!;\n let tiny = 0;\n for (let c = 0; c < 3; c++) {\n let range = 0, mass = 0, tinyHere = 0;\n for (let n = 0; n < N; n++) {\n const value = signalInput.kernels ? source.nodeKernels[c]![index * N + n]! : source.members[index]!.weight * A[c]![n]!;\n if (!(value >= 0 && value <= FLOAT32_SAFE_MAGNITUDE)) domain();\n table[(c * T + t) * N + n] = value;\n if (materials > 0) {\n const top = value * high[n]!;\n range += value * (high[n]! - low[n]!); mass += top;\n // A kernel value or product below the normal range may be flushed: at most the product with the largest spectrum.\n if (value > 0 && (value < FLOAT32_MINIMUM_NORMAL || top < 2 * FLOAT32_MINIMUM_NORMAL)) tinyHere += top;\n }\n }\n // The spread rounded up (the float32 roundings of the operands, the products and the sum).\n spread[c * T + t] = Math.fround(range * (1 + (N + 4) * E));\n largestSum = Math.max(largestSum, mass);\n tiny = Math.max(tiny, tinyHere);\n }\n tinyMass += tiny;\n }\n if (!(largestSum * T <= FLOAT32_SAFE_MAGNITUDE)) domain();\n return { groups, taps, tapCount: T, nodes: N, table, spread, materials, tinyMass };\n}\n\n/**\n * The relative bound of a site's electrons (`params.site_gamma`): (T + 3)·E for the tap-list sum (#479), and with the blocked sum\n * (#492) (cw_max + ch_max + G + 3)·E, both unchanged by 2.21.0. Every term C_c(t, n)·L_m(λ_n) is non-negative and carries two host\n * roundings (u = E/2 each: the kernel value and the spectrum) and its product (E); the tap-list pass adds it into its node's\n * partial over the T taps (at most T − 1 inexact additions), the blocked pass into a row, group and total partial per node (at\n * most cw − 1 + ch − 1 + G − 1). The N node partials and the dark electrons (host-rounded, E/2) are then summed in integer\n * arithmetic and rounded once (E, `EXACT_SUM_WGSL`). So a site carries at most (T + 2.5)·E, or (cw + ch + G + 0.5)·E, inside the\n * bounds (docs/WEBGPU.md).\n */\nfunction siteSumRelativeBound(gather: SignalGather, blocked: boolean): number {\n if (!blocked) return (gather.tapCount + 3) * E;\n let cw = 0, ch = 0;\n for (const g of gather.groups) { cw = Math.max(cw, g.cw); ch = Math.max(ch, g.ch); }\n return (cw + ch + gather.groups.length + 3) * E;\n}\n\n/** The aux table: bilinear kernels and 1/Σw², the Gauss–Legendre rule, and the dense candidate weights per phase. */\nfunction auxTable(setup: DisplayViewSetup): Float32Array<ArrayBuffer> {\n const aux = new Float32Array(DISPLAY_VIEW_QUALITY_AUX.size), words = new Uint32Array(aux.buffer);\n for (let p = 0; p < 4; p++) for (let c = 0; c < 3; c++) {\n const taps = setup.demosaic[p]![c]!, base = DISPLAY_VIEW_QUALITY_AUX.bilinear + (p * 3 + c) * 16;\n let w2 = 0;\n taps.forEach((t, i) => { aux[base + 4 * i] = t.dx; aux[base + 4 * i + 1] = t.dy; aux[base + 4 * i + 2] = t.weight; w2 += t.weight * t.weight; });\n aux[DISPLAY_VIEW_QUALITY_AUX.inverseW2 + p * 3 + c] = 1 / w2;\n }\n const gl = gaussLegendre16();\n aux.set(gl.x, DISPLAY_VIEW_QUALITY_AUX.gaussLegendre); aux.set(gl.w, DISPLAY_VIEW_QUALITY_AUX.gaussLegendre + 16);\n const { candidates, count, reach } = candidatesOf(setup), side = 2 * reach + 1;\n for (let p = 0; p < 4; p++) {\n // Dense weights per slot and candidate, as the reference accumulates them (taps at one slot add).\n const dense = new Float64Array(2 * 3 * WINDOW_SLOTS);\n candidates[p]!.forEach((candidate, d) => candidate.forEach((list, c) => { for (const t of list) { const slot = (t.dy + reach) * side + t.dx + reach; { const at = (d * 3 + c) * WINDOW_SLOTS + slot; dense[at] = dense[at]! + t.weight; } } }));\n const base = DISPLAY_VIEW_QUALITY_AUX.candidates + p * DISPLAY_VIEW_QUALITY_AUX.candidatePhaseStride;\n let n = 0;\n for (let slot = 0; slot < side * side; slot++) {\n let used = false;\n for (let k = 0; k < 2 * 3 && !used; k++) if (dense[k * WINDOW_SLOTS + slot] !== 0) used = true;\n if (!used) continue;\n const entry = base + 4 + n * DISPLAY_VIEW_QUALITY_CANDIDATE_FLOATS;\n aux[entry] = (slot % side) - reach; aux[entry + 1] = Math.floor(slot / side) - reach;\n for (let k = 0; k < 6; k++) aux[entry + 2 + k] = dense[k * WINDOW_SLOTS + slot]!;\n n++;\n }\n if (n > DISPLAY_VIEW_QUALITY_CANDIDATE_ENTRIES) throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"The demosaic candidates read more slots than the table holds.\");\n words[base] = n;\n }\n void count;\n return aux;\n}\n\n/**\n * #492: replaces every lattice point the material module flagged (bit 31) by the reference's material at that point: group g's\n * point (p, q) is (p + 0.5 + f_x − W/2)·g, −(q + 0.5 + f_y − H/2)·g (with f = 0 written as the reference writes it), looked up\n * with the expected signal's own `materialAt`. Returns the count of points resolved.\n */\nfunction resolveUncertainLattice(lattice: Uint32Array, groupWords: Uint32Array, signalInput: DisplayViewExpectedSignalInput): number {\n const tables = displayViewSignalTables(signalInput), scene = signalInput.scene as Extract<DisplayViewExpectedSignalInput[\"scene\"], { kind: \"materials\" }>;\n const W = signalInput.nativeWidth, H = signalInput.nativeHeight, g = 2 / signalInput.outputWidth, groupInts = new Int32Array(groupWords.buffer, groupWords.byteOffset, groupWords.length);\n let resolved = 0;\n tables.groups.forEach((group, k) => {\n const base = k * DISPLAY_VIEW_QUALITY_GROUP_WORDS, lx0 = groupInts[base]!, ly0 = groupInts[base + 1]!, lw = groupWords[base + 2]!, lh = groupWords[base + 3]!, first = groupWords[base + 4]!;\n for (let local = 0; local < lw * lh; local++) {\n const raw = lattice[first + local]!;\n if ((raw >>> 31) === 0) continue;\n const p = lx0 + (local % lw), q = ly0 + Math.floor(local / lw);\n const m = scene.materialAt(latticeCoordinate(p, group.fx, W, g), -latticeCoordinate(q, group.fy, H, g));\n if (!(Number.isInteger(m) && m >= 0 && m < scene.materials.length)) throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"webgpu-f32 display view (Quality): a lattice point has no scene material; use cpu-reference.\");\n lattice[first + local] = m;\n resolved++;\n }\n });\n return resolved;\n}\n\n/**\n * One axis of the reference's lattice point (createDisplayViewExpectedSignal's latticeU / latticeV, written as it writes them):\n * (i + 0.5 − size/2)·g with no shift, (i + 0.5 + f − size/2)·g otherwise; v is its negative.\n */\nexport const latticeCoordinate = (i: number, f: number, size: number, g: number): number => (f === 0 ? i + 0.5 - size / 2 : i + 0.5 + f - size / 2) * g;\n/** The uniform parameters shared by the three passes (per-pass words are set per dispatch). */\nfunction constants(setup: DisplayViewSetup, signalInput: DisplayViewExpectedSignalInput, gather: SignalGather, reach: number, count: number, blocked: boolean): { params: ArrayBuffer; words: Uint32Array; ints: Int32Array; floats: Float32Array } {\n const params = new ArrayBuffer(4 * DISPLAY_VIEW_QUALITY_PARAM_WORDS), words = new Uint32Array(params), ints = new Int32Array(params), floats = new Float32Array(params);\n words[2] = setup.region.width; words[3] = setup.region.x; words[4] = setup.region.y; words[5] = setup.margin; words[6] = setup.nativeWidth; words[7] = setup.nativeHeight;\n words[8] = setup.region.width; words[9] = setup.toneCurve === \"positive-reinhard-per-channel\" ? 1 : 0; words[10] = reach; words[11] = count;\n words[18] = gather.tapCount; words[19] = gather.groups.length;\n for (let c = 0; c < 3; c++) words[21 + c] = setup.gains[c] === setup.clipLevel ? 1 : 0;\n for (let c = 0; c < 3; c++) { floats[24 + c] = setup.readout[c]!.perElectron; floats[28 + c] = setup.readout[c]!.darkElectrons; floats[32 + c] = setup.readout[c]!.constantVariance; floats[36 + c] = setup.gains[c]!; }\n floats[27] = 8.5 * 8.5; floats[31] = setup.clipLevel;\n for (let r = 0; r < 3; r++) for (let c = 0; c < 3; c++) floats[40 + r * 3 + c] = setup.matrix[r]![c]!;\n if (signalInput.kernels) { const g = 2 / signalInput.outputWidth; floats[39] = g; floats[49] = -g; }\n else {\n // Without diffraction the reference queries the environment's own points; the lattice model (x + c)·scale is checked against them (queryGeometry).\n const geometry = queryGeometry(signalInput);\n floats[39] = geometry.scaleU; floats[49] = geometry.scaleV;\n }\n floats[50] = siteSumRelativeBound(gather, blocked);\n // 2.21.0: the spectral nodes the site passes integrate.\n words[53] = gather.nodes;\n // What a flushing device can drop (both site passes), rounded up and kept normal so the uniform is not flushed either.\n floats[52] = Math.max(FLOAT32_MINIMUM_NORMAL, Math.fround(gather.tinyMass * (1 + 4 * E)));\n return { params, words, ints, floats };\n}\n\n/** How far the host's quantization term Σ(w/A)²·q(m) can move with a mean bound Δm (see QUANTIZATION_SLOPE), doubled. */\nfunction quantizationBound(moments: Float32Array, o: number, meanBound: number, pixels: number, step: number): number {\n let join = 0;\n for (let c = 0; c < 3; c++) { const m = moments[o + c]!; if (m - meanBound <= QUANTIZATION_JOIN && m + meanBound >= QUANTIZATION_JOIN) join = QUANTIZATION_JOIN_JUMP; }\n return MARGIN * pixels * (QUANTIZATION_SLOPE * meanBound + join) * step * step / 12;\n}\n\n/** Renders one region of a Quality display view on the GPU (see the module comment). */\nexport async function renderDisplayViewQualityOnGpu(runtime: WebGpuRuntime, bandBytes: number, input: DisplayViewQualityGpuInput, abort: AbortController,\n yieldControl: YieldControl, pipelines: PipelineSource): Promise<DisplayViewQualityGpuResult> {\n const { setup, signalInput, material, image } = input;\n const reason = displayViewQualityGpuUnsupportedReason(setup, signalInput);\n if (reason) throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"webgpu-f32 display view (Quality): \" + reason + \"; use cpu-reference.\");\n const now = (): number => (typeof performance !== \"undefined\" ? performance.now() : Date.now());\n const timings: DisplayViewQualityStageTimings = { lattice: 0, sites: 0, pixels: 0, finishing: 0, recompute: 0, siteDispatches: 0 };\n const { region, margin } = setup, shape = footprintShape(setup), { reach, count } = candidatesOf(setup);\n // #492: the defocus disc's kernels are summed in blocks (their dense rectangles), in focus the tap list runs as before.\n const blocked = !!image || (input.blockedSum ?? (setup.gpu?.defocusRadius ?? 0) > 0);\n if (blocked && !signalInput.kernels && !image) throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"webgpu-f32 display view (Quality): the blocked site sum needs site kernels; use cpu-reference.\");\n const tapBudget = input.maximumSiteTapsPerDispatch ?? DISPLAY_VIEW_QUALITY_SITE_TAPS_PER_DISPATCH;\n const gather = image?.gather ?? signalGather(signalInput), aux = auxTable(setup), { params, words, ints, floats } = constants(setup, signalInput, gather, reach, count, blocked);\n // #581: the print's site bound and its radiance values per lattice point (the site pass's node count in the last word).\n if (image) { floats[50] = image.siteGamma; words[55] = image.pointFloats; }\n const stride = DISPLAY_VIEW_QUALITY_GEOMETRY_STRIDE, geometry = new Float32Array((region.width + region.height) * stride);\n const columnSums: AxisSums[] = [], rowSums: AxisSums[] = [];\n for (let i = 0; i < region.width; i++) { axisRecord(geometry, i * stride, (region.x + i) * shape.sx, (region.x + i + 1) * shape.sx, setup.frameWidth, margin, shape.sx); columnSums.push(axisSums((region.x + i) * shape.sx, (region.x + i + 1) * shape.sx, setup.frameWidth, margin)); }\n for (let j = 0; j < region.height; j++) { axisRecord(geometry, (region.width + j) * stride, (region.y + j) * shape.sy, (region.y + j + 1) * shape.sy, setup.frameHeight, margin, shape.sy); rowSums.push(axisSums((region.y + j) * shape.sy, (region.y + j + 1) * shape.sy, setup.frameHeight, margin)); }\n const area = shape.sx * shape.sy, pixelCount = region.width * region.height;\n // The band's site window: the region's native columns plus the reach, clamped to the raster (border sites are reflected into it).\n const siteX0 = Math.max(0, Math.floor(region.x * shape.sx) + margin - reach), siteX1 = Math.min(setup.nativeWidth - 1, Math.min(setup.frameWidth - 1, Math.ceil((region.x + region.width) * shape.sx) - 1) + margin + reach);\n const siteW = siteX1 - siteX0 + 1;\n const siteRows = (row0: number, row1: number): { y0: number; y1: number } => ({ y0: Math.max(0, Math.floor((region.y + row0) * shape.sy) + margin - reach),\n y1: Math.min(setup.nativeHeight - 1, Math.min(setup.frameHeight - 1, Math.ceil((region.y + row1) * shape.sy) - 1) + margin + reach) });\n const bandBytesOf = (rows: number): number => {\n const { y0, y1 } = siteRows(0, rows), siteH = y1 - y0 + 1;\n let lattice = 0;\n for (const g of gather.groups) lattice += (siteW + g.dpSpan) * (siteH + g.dqSpan) * 4 * (image ? image.pointFloats + 1 : 1);\n return lattice + siteW * siteH * SITE_BYTES + rows * region.width * OUTPUT_BYTES_PER_PIXEL;\n };\n let rows = region.height;\n while (rows > 1 && bandBytesOf(rows) > bandBytes) rows = Math.ceil(rows / 2);\n // The value table (materials × 3 channels × taps) is one binding: with a large defocus kernel and many materials it can pass the\n // device's limit, which is then refused by name (never clipped).\n if (gather.table.byteLength > runtime.maximumStorageBindingBytes) throw new ImageKernelExecutionError(\"insufficient-limits\", \"The display view's kernel table (\" + gather.table.byteLength +\n \" bytes: 3 channels × \" + gather.tapCount + \" taps × \" + gather.nodes + \" spectral nodes, and the material spectra) exceeds the device's storage binding limit of \" + runtime.maximumStorageBindingBytes + \" bytes.\");\n const largestBinding = Math.max(bandBytesOf(rows), geometry.byteLength, gather.table.byteLength);\n if (largestBinding > runtime.maximumStorageBindingBytes) throw new ImageKernelExecutionError(\"insufficient-limits\", \"One display-view band exceeds the device's storage binding limit.\");\n const latticePipeline = image ? await pipelines(...image.lattice) : await pipelines(\"photivra-display-view-quality-lattice:\" + material.id, assembleDisplayViewQualityLatticeWgsl(material.wgsl));\n const sitesPipeline = image ? await pipelines(...image.sites) : blocked ? await pipelines(\"photivra-display-view-quality-sites-blocked\", DISPLAY_VIEW_QUALITY_SITES_BLOCKED_WGSL) :\n await pipelines(\"photivra-display-view-quality-sites\", DISPLAY_VIEW_QUALITY_SITES_WGSL);\n // #593, #601: the coupled steps' text and constants, loaded on demand for a view that asks for them.\n const coupled = setup.rendering ? await import(\"./wgsl-display-view-coupled.js\") : null;\n const coupledConstants = coupled ? coupled.displayViewCoupledConstants(setup, SDR_LUMINANCE_WEIGHTS, gaussLegendre16()) : new Float32Array(1);\n // #605: the neighbor reconstruction's ratios from the host, in a second dispatch per band (wgsl-display-view-neighbors.ts).\n const neighbors = setup.coupled?.neighbors && coupled;\n const pixelsPipeline = coupled ? await pipelines(\"photivra-display-view-quality-pixels+coupled\" + (neighbors ? \"+neighbors\" : \"\"), assembleDisplayViewQualityPixelsWgsl(coupled.displayViewCoupledWgsl(!!neighbors)))\n : await pipelines(\"photivra-display-view-quality-pixels\", DISPLAY_VIEW_QUALITY_PIXELS_WGSL);\n const moments = new Float32Array(pixelCount * DISPLAY_VIEW_QUALITY_OUTPUT_FLOATS), pixelFlags = new Uint32Array(pixelCount), masks = new Uint32Array(2 * pixelCount);\n let latticePointsResolved = 0;\n const scope = new GpuResourceScope(runtime);\n try {\n // #593, #601: the coupled steps' constants follow the aux table's own entries (one zero word without them).\n const auxWithCoupled = new Float32Array(aux.length + coupledConstants.length);\n auxWithCoupled.set(aux); auxWithCoupled.set(coupledConstants, aux.length);\n const auxBuffer = scope.upload(\"photivra-display-view-aux\", auxWithCoupled, BUFFER_USAGE.STORAGE);\n const geometryBuffer = scope.upload(\"photivra-display-view-geometry\", geometry, BUFFER_USAGE.STORAGE);\n // The blocked pass reads no tap records (its layout has no binding 2).\n const tapsBuffer = blocked ? null : scope.upload(\"photivra-display-view-taps\", gather.taps, BUFFER_USAGE.STORAGE);\n const tableBuffer = scope.upload(\"photivra-display-view-table\", gather.table, BUFFER_USAGE.STORAGE);\n const spreadBuffer = scope.upload(\"photivra-display-view-spread\", gather.spread, BUFFER_USAGE.STORAGE);\n // A module's binding is data uploaded per render or a buffer the module already holds on the device (#491: scene records).\n const materialGroup = image ? null : runtime.device.createBindGroup({ layout: latticePipeline.getBindGroupLayout(1), entries: material.bindings.map((b) => ({ binding: b.binding, resource: { buffer: b.buffer ??\n scope.upload(\"photivra-display-view-material-\" + b.binding, b.data, b.kind === \"uniform\" ? BUFFER_USAGE.UNIFORM : BUFFER_USAGE.STORAGE) } })) });\n const gate = createHostYieldGate();\n for (let row0 = 0; row0 < region.height; row0 += rows) {\n checkAbort(abort.signal);\n const row1 = Math.min(region.height, row0 + rows), count = (row1 - row0) * region.width, first = row0 * region.width;\n const { y0: siteY0, y1: siteY1 } = siteRows(row0, row1), siteH = siteY1 - siteY0 + 1;\n // Lattice windows per group, and the group records.\n const groupWords = new Uint32Array(gather.groups.length * DISPLAY_VIEW_QUALITY_GROUP_WORDS), groupInts = new Int32Array(groupWords.buffer), groupFloats = new Float32Array(groupWords.buffer);\n let latticeTotal = 0;\n gather.groups.forEach((g, index) => {\n const base = index * DISPLAY_VIEW_QUALITY_GROUP_WORDS, lw = siteW + g.dpSpan, lh = siteH + g.dqSpan;\n groupInts[base] = siteX0 + g.dpMin; groupInts[base + 1] = siteY0 + g.dqMin; groupWords[base + 2] = lw; groupWords[base + 3] = lh; groupWords[base + 4] = latticeTotal;\n groupWords[base + 5] = g.firstTap;\n groupFloats[base + 6] = g.cu; groupFloats[base + 7] = g.cv;\n latticeTotal += lw * lh;\n });\n words[1] = row0; ints[12] = siteX0; ints[13] = siteY0; words[14] = siteW; words[15] = siteH; words[20] = latticeTotal;\n const band = new GpuResourceScope(runtime);\n try {\n const groupBuffer = band.upload(\"photivra-display-view-groups\", groupWords, BUFFER_USAGE.STORAGE);\n const siteBuffer = band.buffer(\"photivra-display-view-sites\", siteW * siteH * SITE_BYTES, BUFFER_USAGE.STORAGE);\n // Pass 1: lattice materials (#581: an image-plane print's radiance per node, with its flags, and their host resolution).\n let t0 = now();\n words[0] = latticeTotal;\n const latticeParams = band.upload(\"photivra-display-view-params-lattice\", new Uint8Array(params.slice(0)), BUFFER_USAGE.UNIFORM);\n let latticeBuffer: GPUBuffer, pointFlags: GPUBuffer | null = null;\n if (image) {\n const pass = await image.runLattice(band, latticePipeline, latticeParams, groupBuffer, groupWords, latticeTotal, abort.signal);\n latticeBuffer = pass.values; pointFlags = pass.flags; latticePointsResolved += pass.resolved;\n } else {\n latticeBuffer = band.buffer(\"photivra-display-view-lattice\", latticeTotal * 4, BUFFER_USAGE.STORAGE | (blocked ? BUFFER_USAGE.COPY_SRC : 0));\n const latticeGroup = runtime.device.createBindGroup({ layout: latticePipeline.getBindGroupLayout(0), entries: [\n { binding: 0, resource: { buffer: latticeParams } }, { binding: 1, resource: { buffer: groupBuffer } }, { binding: 2, resource: { buffer: latticeBuffer } }] });\n const [latticeData] = await runComputePass(runtime, band, latticePipeline, [latticeGroup, materialGroup!], linearDispatch(latticeTotal, DISPLAY_VIEW_QUALITY_WORKGROUP_SIZE, runtime.maximumWorkgroupsPerDimension),\n blocked ? [{ buffer: latticeBuffer, bytes: latticeTotal * 4 }] : [], abort.signal);\n await queueIdle(runtime, abort.signal);\n if (blocked) {\n // #492: with a wide disc nearly every site reads some uncertain lattice point, and its spread over every material would flag\n // it. The host resolves each uncertain point with the reference's own material lookup at the reference's lattice point\n // (createDisplayViewExpectedSignal's latticeU/latticeV), so the sites read exactly the reference's materials.\n const lattice = new Uint32Array(latticeData!, 0, latticeTotal);\n const resolved = resolveUncertainLattice(lattice, groupWords, signalInput);\n if (resolved > 0) latticeBuffer = band.upload(\"photivra-display-view-lattice-resolved\", lattice, BUFFER_USAGE.STORAGE);\n latticePointsResolved += resolved;\n }\n }\n timings.lattice += now() - t0;\n // Pass 2: site moments, in chunks of whole workgroups of sites whose taps stay within the budget per dispatch (#492).\n t0 = now();\n const siteTotal = siteW * siteH, perDispatch = Math.max(DISPLAY_VIEW_QUALITY_WORKGROUP_SIZE,\n Math.floor(tapBudget / Math.max(1, gather.tapCount) / DISPLAY_VIEW_QUALITY_WORKGROUP_SIZE) * DISPLAY_VIEW_QUALITY_WORKGROUP_SIZE);\n for (let siteFirst = 0; siteFirst < siteTotal; siteFirst += perDispatch) {\n checkAbort(abort.signal);\n words[0] = Math.min(perDispatch, siteTotal - siteFirst); words[51] = siteFirst;\n const chunk = new GpuResourceScope(runtime);\n try {\n const siteParams = chunk.upload(\"photivra-display-view-params-sites\", new Uint8Array(params.slice(0)), BUFFER_USAGE.UNIFORM);\n const siteGroup = runtime.device.createBindGroup({ layout: sitesPipeline.getBindGroupLayout(0), entries: [\n { binding: 0, resource: { buffer: siteParams } }, { binding: 1, resource: { buffer: groupBuffer } }, ...(tapsBuffer ? [{ binding: 2, resource: { buffer: tapsBuffer } }] : []),\n { binding: 3, resource: { buffer: tableBuffer } }, { binding: 4, resource: { buffer: latticeBuffer } }, { binding: 5, resource: { buffer: siteBuffer } }, { binding: 6, resource: { buffer: pointFlags ?? spreadBuffer } },] });\n await runComputePass(runtime, chunk, sitesPipeline, siteGroup, linearDispatch(words[0], DISPLAY_VIEW_QUALITY_WORKGROUP_SIZE, runtime.maximumWorkgroupsPerDimension), [], abort.signal);\n await queueIdle(runtime, abort.signal);\n } finally { chunk.release(); }\n timings.siteDispatches++;\n }\n words[51] = 0;\n timings.sites += now() - t0;\n // Pass 3: display pixels.\n words[0] = count;\n const out = band.buffer(\"photivra-display-view-moments\", count * 4 * DISPLAY_VIEW_QUALITY_OUTPUT_FLOATS, BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);\n checkAbort(abort.signal);\n t0 = now();\n let data: ArrayBuffer | undefined;\n const run = async (contents = new Uint32Array(count * DISPLAY_VIEW_QUALITY_FLAG_WORDS)): Promise<Uint32Array> => {\n const pass = new GpuResourceScope(runtime);\n try {\n const flagBuffer = pass.upload(\"photivra-display-view-flags\", contents, BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);\n const pixelParams = pass.upload(\"photivra-display-view-params-pixels\", new Uint8Array(params.slice(0)), BUFFER_USAGE.UNIFORM);\n const pixelGroup = runtime.device.createBindGroup({ layout: pixelsPipeline.getBindGroupLayout(0), entries: [\n { binding: 0, resource: { buffer: pixelParams } }, { binding: 1, resource: { buffer: auxBuffer } }, { binding: 2, resource: { buffer: geometryBuffer } },\n { binding: 3, resource: { buffer: siteBuffer } }, { binding: 4, resource: { buffer: out } }, { binding: 5, resource: { buffer: flagBuffer } }] });\n const [moment, flagData] = await runComputePass(runtime, pass, pixelsPipeline, pixelGroup, linearDispatch(count, DISPLAY_VIEW_QUALITY_WORKGROUP_SIZE, runtime.maximumWorkgroupsPerDimension),\n [{ buffer: out, bytes: count * 4 * DISPLAY_VIEW_QUALITY_OUTPUT_FLOATS }, { buffer: flagBuffer, bytes: count * 4 * DISPLAY_VIEW_QUALITY_FLAG_WORDS }], abort.signal) as [ArrayBuffer, ArrayBuffer];\n data = moment;\n return new Uint32Array(flagData, 0, count * DISPLAY_VIEW_QUALITY_FLAG_WORDS);\n } finally { pass.release(); }\n };\n const flagWords = neighbors ? await neighbors.dispatchWithNeighborRatios(setup, geometry, first, count, runtime.maximumStorageBindingBytes, run) : await run();\n timings.pixels += now() - t0;\n moments.set(new Float32Array(data!, 0, count * DISPLAY_VIEW_QUALITY_OUTPUT_FLOATS), first * DISPLAY_VIEW_QUALITY_OUTPUT_FLOATS);\n for (let i = 0; i < count; i++) {\n pixelFlags[first + i] = flagWords[DISPLAY_VIEW_QUALITY_FLAG_WORDS * i]!;\n masks[2 * (first + i)] = flagWords[DISPLAY_VIEW_QUALITY_FLAG_WORDS * i + 1]!; masks[2 * (first + i) + 1] = flagWords[DISPLAY_VIEW_QUALITY_FLAG_WORDS * i + 2]!;\n }\n } finally {\n band.release();\n }\n if (yieldControl && gate.due()) { await yieldControl(abort.signal); gate.restart(); }\n }\n } finally {\n scope.release();\n }\n checkAbort(abort.signal);\n // The reference's finishing per display pixel (float64).\n let t0 = now();\n const maximum = setup.bitDepth === 8 ? 255 : 65535, step = 1 / maximum;\n const samples = setup.bitDepth === 8 ? new Uint8Array(pixelCount * 3) : new Uint16Array(pixelCount * 3);\n const expected = new Float64Array(pixelCount * 3), noiseStd = new Float64Array(pixelCount * 3), saturated = new Float64Array(pixelCount);\n const meanBound = new Float32Array(pixelCount), varianceBound = new Float32Array(pixelCount);\n const flagged: number[] = [];\n let largestMean = 0, largestVariance = 0, sampleCount = 0, siteCount = 0;\n const counts = new Int32Array(geometry.buffer);\n // #533: each display pixel's saturated-pixel share from the kernel's mask (the reference's arithmetic, exact where it decided).\n const columnOverlaps = Array.from({ length: region.width }, (_, i) => overlaps((region.x + i) * shape.sx, (region.x + i + 1) * shape.sx, setup.frameWidth));\n for (let ry = 0, i = 0; ry < region.height; ry++) {\n const rowOverlaps = overlaps((region.y + ry) * shape.sy, (region.y + ry + 1) * shape.sy, setup.frameHeight);\n for (let rx = 0; rx < region.width; rx++, i++) saturated[i] = displayViewDecidedSaturation(columnOverlaps[rx]!, rowOverlaps, area, masks[2 * i]!, masks[2 * i + 1]!);\n }\n for (let ry = 0, i = 0; ry < region.height; ry++) {\n const rowWw = rowSums[ry]!.ww, ny = counts[(region.width + ry) * stride + 1]!;\n for (let rx = 0; rx < region.width; rx++, i++) {\n const pixels = columnSums[rx]!.ww * rowWw / (area * area), vy = region.y + ry, vx = region.x + rx, o = i * DISPLAY_VIEW_QUALITY_OUTPUT_FLOATS;\n let flag = (pixelFlags[i]! & DISPLAY_VIEW_QUALITY_FLAG.recompute) !== 0;\n for (let k = 0; k < DISPLAY_VIEW_QUALITY_OUTPUT_FLOATS && !flag; k++) if (!Number.isFinite(moments[o + k]!)) flag = true;\n if (flag) { flagged.push(i); continue; }\n finishDisplayViewPixel(moments.subarray(o, o + 9), pixels, setup.seed, vy * setup.viewWidth + vx, step, maximum, samples, expected, noiseStd, i * 3);\n meanBound[i] = MARGIN * moments[o + 9]!;\n varianceBound[i] = MARGIN * moments[o + 10]! + quantizationBound(moments, o, meanBound[i]!, pixels, step);\n largestMean = Math.max(largestMean, meanBound[i]!); largestVariance = Math.max(largestVariance, varianceBound[i]!);\n const nx = counts[rx * stride + 1]!;\n sampleCount += nx * ny; siteCount += (nx + 2 * reach) * (ny + 2 * reach);\n }\n }\n timings.finishing = now() - t0;\n // Flagged display pixels: the reference's own pixels (a region render is byte-identical to the whole view's pixels).\n t0 = now();\n const recomputed: number[] = [], highlights: number[] = [];\n // #533: unflagged display pixels with an undecided real pixel take the reference's count only (their samples stay the kernel's).\n const undecided: number[] = [], isFlagged = new Uint8Array(pixelCount);\n for (const i of flagged) isFlagged[i] = 1;\n for (let i = 0; i < pixelCount; i++) if (isFlagged[i] === 0 && (pixelFlags[i]! & DISPLAY_VIEW_QUALITY_FLAG.highlightUndecided) !== 0) undecided.push(i);\n if (input.recomputeFlagged !== false) await recomputeRuns(setup, signalInput, undecided, abort, (first, run, part) => { for (let k = 0; k < run; k++) { saturated[first + k] = part.saturated[k]!; highlights.push(first + k); } });\n if (flagged.length > 0) {\n if (input.recomputeFlagged === false) {\n // Without recomputation a flagged pixel keeps the kernel's values where they are finite (its bound then does not hold).\n for (const i of flagged) {\n const o = i * DISPLAY_VIEW_QUALITY_OUTPUT_FLOATS;\n let finite = true;\n for (let k = 0; k < DISPLAY_VIEW_QUALITY_OUTPUT_FLOATS && finite; k++) if (!Number.isFinite(moments[o + k]!)) finite = false;\n if (!finite) continue;\n const rx = i % region.width, ry = (i - rx) / region.width, pixels = columnSums[rx]!.ww * rowSums[ry]!.ww / (area * area);\n finishDisplayViewPixel(moments.subarray(o, o + 9), pixels, setup.seed, (region.y + ry) * setup.viewWidth + region.x + rx, step, maximum, samples, expected, noiseStd, i * 3);\n meanBound[i] = MARGIN * moments[o + 9]!; varianceBound[i] = MARGIN * moments[o + 10]! + quantizationBound(moments, o, meanBound[i]!, pixels, step);\n }\n } else await recomputeRuns(setup, signalInput, flagged, abort, (first, run, part) => {\n // The run's counts are the sums of its pixels' counts.\n samples.set(part.samples, first * 3); expected.set(part.expected, first * 3); noiseStd.set(part.noiseStd, first * 3); saturated.set(part.saturated, first);\n for (let k = 0; k < run; k++) { meanBound[first + k] = 0; varianceBound[first + k] = 0; recomputed.push(first + k); }\n sampleCount += part.sampleCount; siteCount += part.siteCount;\n });\n }\n timings.recompute = now() - t0;\n const relative = MARGIN * CPU_RELATIVE;\n const expectedValueBound: ImageKernelRelativeErrorBound = { kind: \"relative-to-reference\", relative, absolute: largestMean };\n const uncertain = flagged.length - recomputed.length + undecided.length - highlights.length;\n let saturatedPixelCount = 0;\n for (let i = 0; i < pixelCount; i++) saturatedPixelCount += saturated[i]!;\n return { samples, expected, noiseStd, sampleCount, siteCount, detailPixelCount: pixelCount, uniformPixelCount: 0, estimation: \"exact-area-mean\", saturated, saturatedPixelCount,\n execution: webGpuExecution(expectedValueBound, uncertain), expectedValueBound, varianceBound: { kind: \"relative-to-reference\", relative, absolute: largestVariance },\n expectedValueAbsoluteBound: meanBound, varianceAbsoluteBound: varianceBound, flaggedPixelIndices: Uint32Array.from(flagged), hostRecomputedPixelIndices: Uint32Array.from(recomputed),\n pixelFlags, highlightRecomputedPixelIndices: Uint32Array.from(highlights), tapsPerSite: gather.tapCount, blockedSum: blocked, siteSumRelativeBound: floats[50]!, latticePointsResolved, stageMilliseconds: timings };\n}\n\n/**\n * The GPU setup the material modules read for a Quality render (#491's `createDisplayViewMaterialModules`). The composite module\n * recovers the exact lattice point from the kernel's float32 point with the request's query offsets and the scale of its own\n * query points. With diffraction kernels the reference has no query points: it evaluates each lattice group's points with the\n * lattice formula (p + 0.5 + f − W/2)·g, −(q + 0.5 + f − H/2)·g (`createDisplayViewExpectedSignal`). The lattice pass forms\n * exactly that point per group, so the module is given the groups as its offsets and that formula as the query points; the\n * module's own checks (the model at the frame's corners within 2⁻⁴⁸, the offsets' separation, at most 16 offsets) then apply to\n * them as to a Speed lattice. Without diffraction the request's own offsets and query points are the lattice already (each\n * group member's point is checked to be its offset's, `displayViewQualityGpuUnsupportedReason`).\n */\nexport function qualityMaterialSetup(gpu: DisplayViewGpuSetup): DisplayViewGpuSetup {\n const input = gpu.signalInput;\n if (!input.kernels) return gpu;\n const groups = displayViewSignalTables(input).groups, W = input.nativeWidth, H = input.nativeHeight, g = 2 / input.outputWidth;\n const offsets = groups.map((group) => ({ x: group.fx, y: group.fy, weight: 1 / groups.length }));\n const queryPoint = (x: number, y: number, o: number, out: Float64Array): void => {\n const group = groups[o]!;\n out[0] = latticeCoordinate(x, group.fx, W, g); out[1] = -latticeCoordinate(y, group.fy, H, g);\n };\n const { kernels: _kernels, ...rest } = input;\n void _kernels;\n return { ...gpu, signalInput: { ...rest, offsets, queryPoint } };\n}\n\n/** The material module of a Quality render's scene (see `qualityMaterialSetup`). */\nexport function qualityMaterialModule(modules: DisplayViewMaterialModules, gpu: DisplayViewGpuSetup, signal: AbortSignal): Promise<DisplayViewGpuMaterialModule> {\n return modules.moduleFor(qualityMaterialSetup(gpu), signal);\n}\n\n/** A normalized, symmetric site kernel of radius R for the self-check (a binned Gaussian of width `sigma` sites). */\nfunction syntheticKernel(radius: number, sigma: number): Float64Array {\n const size = 2 * radius + 1, kernel = new Float64Array(size * size);\n let sum = 0;\n for (let v = -radius; v <= radius; v++) for (let u = -radius; u <= radius; u++) { const w = Math.exp(-0.5 * (u * u + v * v) / (sigma * sigma)); kernel[(v + radius) * size + u + radius] = w; sum += w; }\n for (let t = 0; t < kernel.length; t++) kernel[t] = kernel[t]! / sum;\n return kernel;\n}\n\n/**\n * The renderer's run-time self-checks (`DisplayViewGpuRenderer.conformanceCases`): a 38 × 26 checkerboard frame of 6 µm sites\n * shown at 13 × 9 (2.9 real pixels per display pixel) with the 2 × 2 box and a four-spot filter (16 offsets, four lattice groups),\n * the GPU against `renderDisplayView` within the a-priori bounds, every flagged pixel recomputed:\n *\n * - `display-view:quality:checkerboard-13x9-diffraction-ahd` (#479): synthetic radius-1 diffraction kernels at three spectral\n * nodes, the AHD candidates at few electrons per site, the tap-list site pass;\n * - `display-view:quality:checkerboard-13x9-defocus-blocked` (#492): the engine's own defocus disc of 6.3 sites (radius 3) at\n * every node, the bilinear demosaic (a defocused Speed request's route), the blocked site sum, and a tap budget that splits\n * each band's site pass over several dispatches.\n */\nasync function runQualityConformance(handle: DisplayViewGpuRuntimeHandle, signal: AbortSignal | undefined, defocus: boolean): Promise<true | string> {\n const runtime = handle as WebGpuRuntime, { nativeWidth, nativeHeight, frameWidth, nodes } = CONFORMANCE_FRAME, { chart, scene } = conformanceChart();\n const offsets: { x: number; y: number; weight: number }[] = [];\n for (const [nx, ny] of [[-0.25, -0.25], [0.25, -0.25], [-0.25, 0.25], [0.25, 0.25]] as const) for (const [ax, ay] of [[-0.5, -0.5], [0.5, -0.5], [-0.5, 0.5], [0.5, 0.5]] as const) offsets.push({ x: nx - ax, y: ny - ay, weight: 1 / 16 });\n const disc = defocus ? createDefocusDiscSiteKernel(6.3)! : null;\n const kernels = disc ? { radius: disc.radius, perNode: nodes.map(() => disc.weights) } : { radius: 1, perNode: [syntheticKernel(1, 0.6), syntheticKernel(1, 0.7), syntheticKernel(1, 0.8)] };\n const signalInput: DisplayViewExpectedSignalInput = { nativeWidth, nativeHeight, outputWidth: frameWidth, wavelengthsNm: nodes, electronsPerRadiance: conformanceResponses(defocus ? 1 : 0.1),\n offsets, kernels, scene, channelAt: conformanceChannelAt };\n const setup = conformanceSetup(signalInput, { perElectron: defocus ? 1 / 40000 : 1 / 4000, darkElectrons: 0.07, constantVariance: 2.5e-7 }, 479, 5 + (disc ? disc.radius : 0), signal,\n defocus ? {} : { candidates: [0, 1, 2, 3].map((p) => ahdCandidateKernels(p % 2, Math.floor(p / 2))),\n ahdChoice: { labMatrix: [[0.4124, 0.3576, 0.1805], [0.2126, 0.7152, 0.0722], [0.0193, 0.1192, 0.9505]].map((row) => row.map((v, c) => v * [1.1, 1, 1.6][c]!)) } });\n const reference = await renderDisplayView(setup);\n return await withConformanceAbort(runtime, signal, async (abort, pipelines) => {\n const gather = defocus ? { blockedSum: true, maximumSiteTapsPerDispatch: 64 * 4 * (2 * 3 + 2) ** 2 } : {};\n const gpu = await renderDisplayViewQualityOnGpu(runtime, 1 << 20, { setup, signalInput, material: chartPresetMaterialModule(chart), ...gather }, abort, undefined, pipelines);\n if (defocus && (!gpu.blockedSum || gpu.stageMilliseconds.siteDispatches < 2)) return \"the self-check did not exercise the blocked site sum over several dispatches.\";\n // #533: the verdict includes the saturated-pixel count (the light squares sit at the white clip).\n return conformanceVerdict(reference, gpu);\n });\n}\n/** #479's self-check (see `runQualityConformance`). */\nexport const DISPLAY_VIEW_QUALITY_CONFORMANCE_CASE: DisplayViewGpuConformanceCase = { id: \"display-view:quality:checkerboard-13x9-diffraction-ahd\",\n run: (handle, signal) => runQualityConformance(handle, signal, false) };\n/** #492's self-check of the defocus disc's blocked site sum (see `runQualityConformance`). */\nexport const DISPLAY_VIEW_QUALITY_DEFOCUS_CONFORMANCE_CASE: DisplayViewGpuConformanceCase = { id: \"display-view:quality:checkerboard-13x9-defocus-blocked\",\n run: (handle, signal) => runQualityConformance(handle, signal, true) };\n/** #594: the Quality kernels' self-check cases, run before the first render that takes the Quality passes (`onDemandConformanceCases`). */\nexport const DISPLAY_VIEW_QUALITY_CONFORMANCE_CASES: readonly DisplayViewGpuConformanceCase[] = Object.freeze([DISPLAY_VIEW_QUALITY_CONFORMANCE_CASE, DISPLAY_VIEW_QUALITY_DEFOCUS_CONFORMANCE_CASE]);\n"]}
|