@photivra/engine 2.11.1 → 2.13.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 +94 -1
- package/CITATION.cff +1 -1
- package/NODE_SUPPORT.md +2 -4
- package/README.md +6 -6
- package/SECURITY.md +1 -1
- package/THIRD_PARTY.md +1 -0
- package/dist/capture/export-jpeg.d.ts +1 -1
- package/dist/capture/export-jpeg.js +6 -4
- package/dist/capture/export-jpeg.js.map +1 -1
- 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/exposure/auto-iso-slowest-shutter.d.ts +120 -0
- package/dist/exposure/auto-iso-slowest-shutter.js +216 -0
- package/dist/exposure/auto-iso-slowest-shutter.js.map +1 -0
- package/dist/exposure/exposure-mode-resolver.d.ts +57 -1
- package/dist/exposure/exposure-mode-resolver.js +238 -33
- package/dist/exposure/exposure-mode-resolver.js.map +1 -1
- package/dist/facade/diffraction-provider.js +12 -13
- package/dist/facade/diffraction-provider.js.map +1 -1
- package/dist/facade/display-view.d.ts +27 -0
- package/dist/facade/display-view.js +234 -65
- package/dist/facade/display-view.js.map +1 -1
- package/dist/facade/simulate-capture.d.ts +159 -3
- package/dist/facade/simulate-capture.js +203 -10
- package/dist/facade/simulate-capture.js.map +1 -1
- package/dist/facade/simulate-display-view.js +2 -2
- package/dist/facade/simulate-display-view.js.map +1 -1
- package/dist/gpu/display-view-quality-gpu.d.ts +2 -1
- package/dist/gpu/display-view-quality-gpu.js +24 -14
- package/dist/gpu/display-view-quality-gpu.js.map +1 -1
- package/dist/gpu/wgsl-display-view-quality-kernel.d.ts +13 -1
- package/dist/gpu/wgsl-display-view-quality-kernel.js +36 -2
- package/dist/gpu/wgsl-display-view-quality-kernel.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/optics/irradiance-convolution.d.ts +10 -0
- package/dist/optics/irradiance-convolution.js +48 -13
- package/dist/optics/irradiance-convolution.js.map +1 -1
- package/dist/output/print-jpeg.js +12 -9
- package/dist/output/print-jpeg.js.map +1 -1
- package/dist/output/text-metadata.d.ts +22 -2
- package/dist/output/text-metadata.js +58 -9
- package/dist/output/text-metadata.js.map +1 -1
- package/docs/API_REFERENCE.md +23 -1
- package/docs/QUICK_START.md +109 -3
- package/docs/USAGE.md +234 -1
- package/docs/api/core-version.md +1 -1
- package/docs/api/exports.json +77 -2
- package/docs/api/exposure-auto-iso-slowest-shutter.md +139 -0
- package/docs/api/exposure-exposure-mode-resolver.md +68 -0
- package/docs/api/facade-simulate-capture.md +153 -5
- package/docs/api/output-text-metadata.md +34 -0
- package/package.json +1 -1
|
@@ -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, 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, createDisplayViewExpectedSignal, displayViewCorrectionKey, 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 { resolvePortableChartScene } from \"../facade/chart-scenes.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, 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 } 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,\n DISPLAY_VIEW_QUALITY_GEOMETRY_STRIDE, DISPLAY_VIEW_QUALITY_GROUP_WORDS, 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: table 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;\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}\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 /** 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\nfunction checkAbort(signal: AbortSignal): void {\n if (signal.aborted) throw abortedError();\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. */\nfunction 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.scene.kind !== \"materials\") 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.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 value table of the expected signal (see the module comment). */\ninterface 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 /**\n * Per material m, channel c and tap t: the value at (m·3 + c)·T + t, float64 rounded once. Factored (the blocked pass, #492):\n * per row r (0: the neutral white, 1 + s: spectral material s) the value at (r·3 + c)·T + t, with `materialRows`.\n */\n table: Float32Array<ArrayBuffer>;\n /** Factored table only: per material its row and its reflectance (float32 bits; 1 for a spectral material). */\n materialRows: Uint32Array<ArrayBuffer> | null;\n /** Per channel c and tap t: the largest difference between two materials' values at that tap (at c·T + t), rounded up. */\n spread: Float32Array<ArrayBuffer>;\n materials: number;\n /** Σ_t of the largest positive value below the float32 normal range at tap t (over materials and channels), float64. */\n tinyMass: number;\n}\nfunction signalGather(signalInput: DisplayViewExpectedSignalInput, factored: boolean): SignalGather {\n const tables = displayViewSignalTables(signalInput), scene = signalInput.scene as Extract<DisplayViewExpectedSignalInput[\"scene\"], { kind: \"materials\" }>;\n const W = signalInput.nativeWidth, H = signalInput.nativeHeight, R = signalInput.kernels ? signalInput.kernels.radius : 0, materials = scene.materials.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 direct = (m: number, c: number): number => { const si = tables.spectralIndex[m]!; return si < 0 ? tables.reflectance[m]! * tables.neutralDirect[c]! : tables.spectralDirect[c]![si]!; };\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 const check = (value: number): number => {\n if (!(Math.abs(value) <= FLOAT32_SAFE_MAGNITUDE)) throw new ImageKernelExecutionError(\"unsupported-float32-domain\", \"A material's channel signal exceeds the float32 domain.\");\n return value;\n };\n const tiny = new Float64Array(T);\n if (factored && signalInput.kernels) {\n // #492: one neutral row (the white's combined kernel, which the reference scales by each neutral material's reflectance) and one\n // row per spectral material; the spread of a tap over the materials from the neutral reflectances' range and the spectral rows.\n const spectralCount = tables.spectral.length, rows = 1 + spectralCount, table = new Float32Array(rows * 3 * T), materialRows = new Uint32Array(2 * materials);\n const reflectanceBits = new Float32Array(materialRows.buffer);\n let neutralLow = Infinity, neutralHigh = -Infinity, neutralSmallest = Infinity;\n for (let m = 0; m < materials; m++) {\n const si = tables.spectralIndex[m]!;\n if (si < 0) {\n const r = check(tables.reflectance[m]!);\n materialRows[2 * m] = 0; reflectanceBits[2 * m + 1] = r;\n neutralLow = Math.min(neutralLow, r); neutralHigh = Math.max(neutralHigh, r);\n if (r > 0) neutralSmallest = Math.min(neutralSmallest, r);\n } else { materialRows[2 * m] = 1 + si; reflectanceBits[2 * m + 1] = 1; }\n }\n for (let t = 0; t < T; t++) {\n const source = tables.groups[tapGroup[t]!]!, index = tapIndex[t]!;\n for (let c = 0; c < 3; c++) {\n let low = Infinity, high = -Infinity;\n const white = check(source.neutral[c]![index]!);\n table[c * T + t] = white;\n if (neutralHigh >= neutralLow) {\n low = neutralLow * white; high = neutralHigh * white;\n // A neutral term r·N below the float32 normal range may be flushed: at most min(r_max·N, 2⁻¹²⁶).\n if (neutralSmallest * white < FLOAT32_MINIMUM_NORMAL && white > 0) tiny[t] = Math.max(tiny[t]!, Math.min(neutralHigh * white, FLOAT32_MINIMUM_NORMAL));\n }\n for (let si = 0; si < spectralCount; si++) {\n const value = check(source.spectral[c]![si]![index]!);\n table[((1 + si) * 3 + c) * T + t] = value;\n low = Math.min(low, value); high = Math.max(high, value);\n if (value > 0 && value < FLOAT32_MINIMUM_NORMAL) tiny[t] = Math.max(tiny[t]!, value);\n }\n spread[c * T + t] = Math.fround((high - low) * (1 + 4 * E));\n }\n }\n let tinyMass = 0;\n for (let t = 0; t < T; t++) tinyMass += tiny[t]!;\n return { groups, taps, tapCount: T, table, materialRows, spread, materials, tinyMass };\n }\n const table = new Float32Array(materials * 3 * T);\n for (let t = 0; t < T; t++) {\n const source = tables.groups[tapGroup[t]!]!, index = tapIndex[t]!;\n for (let c = 0; c < 3; c++) {\n let low = Infinity, high = -Infinity;\n for (let m = 0; m < materials; m++) {\n const si = tables.spectralIndex[m]!;\n const value = check(signalInput.kernels ? (si < 0 ? tables.reflectance[m]! * source.neutral[c]![index]! : source.spectral[c]![si]![index]!) : source.members[index]!.weight * direct(m, c));\n table[(m * 3 + c) * T + t] = value;\n low = Math.min(low, value); high = Math.max(high, value);\n if (value > 0 && value < FLOAT32_MINIMUM_NORMAL) tiny[t] = Math.max(tiny[t]!, value);\n }\n // The spread rounded up (a float32 rounding of the two values and of the difference).\n spread[c * T + t] = Math.fround((high - low) * (1 + 4 * E));\n }\n }\n let tinyMass = 0;\n for (let t = 0; t < T; t++) tinyMass += tiny[t]!;\n return { groups, taps, tapCount: T, table, materialRows: null, 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: a term carries two host roundings (u = E/2 each: its row value and the reflectance), the\n * product (E), at most cw additions in its row, ch in its group and G in the total, and the dark electrons' addition, all of\n * non-negative terms (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 u = group.fx === 0 ? (p + 0.5 - W / 2) * g : (p + 0.5 + group.fx - W / 2) * g, v = group.fy === 0 ? -(q + 0.5 - H / 2) * g : -(q + 0.5 + group.fy - H / 2) * g;\n const m = scene.materialAt(u, v);\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/** 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 // #492: the table values a device may flush to zero (blocked sum only), rounded up and kept normal so the uniform is not flushed either.\n if (blocked && gather.tinyMass > 0) 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 } = 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 = input.blockedSum ?? (setup.gpu?.defocusRadius ?? 0) > 0;\n if (blocked && !signalInput.kernels) 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 = signalGather(signalInput, blocked), aux = auxTable(setup), { params, words, ints, floats } = constants(setup, signalInput, gather, reach, count, blocked);\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;\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 (\" +\n (gather.materialRows ? gather.table.length / (3 * gather.tapCount) + \" rows (the neutral white and each spectral material)\" : gather.materials + \" materials\") + \" × 3 channels × \" +\n gather.tapCount + \" taps per site, \" + gather.table.byteLength + \" bytes) 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 = await pipelines(\"photivra-display-view-quality-lattice:\" + material.id, assembleDisplayViewQualityLatticeWgsl(material.wgsl));\n const sitesPipeline = 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);\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 const materialRowsBuffer = gather.materialRows ? scope.upload(\"photivra-display-view-material-rows\", gather.materialRows, BUFFER_USAGE.STORAGE) : null;\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 materialEntries = 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 materialGroup = runtime.device.createBindGroup({ layout: latticePipeline.getBindGroupLayout(1), entries: materialEntries });\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 let latticeBuffer = band.buffer(\"photivra-display-view-lattice\", latticeTotal * 4, BUFFER_USAGE.STORAGE | (blocked ? BUFFER_USAGE.COPY_SRC : 0));\n const siteBuffer = band.buffer(\"photivra-display-view-sites\", siteW * siteH * SITE_BYTES, BUFFER_USAGE.STORAGE);\n // Pass 1: lattice materials.\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 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 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: spreadBuffer } },\n ...(materialRowsBuffer ? [{ binding: 7, resource: { buffer: materialRowsBuffer } }] : [])] });\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, 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 }, { 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 bandFlags = new Uint32Array(flagData, 0, count);\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 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);\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 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 pixel (a one-pixel region render is byte-identical to the whole view's pixel).\n t0 = now();\n const recomputed: number[] = [];\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 {\n const signal = createDisplayViewExpectedSignal(signalInput);\n for (const i of flagged) {\n checkAbort(abort.signal);\n const rx = i % region.width, ry = (i - rx) / region.width;\n const pixel = await renderDisplayView({ ...setup, signal, region: { x: region.x + rx, y: region.y + ry, width: 1, height: 1 } });\n samples.set(pixel.samples, i * 3); expected.set(pixel.expected, i * 3); noiseStd.set(pixel.noiseStd, i * 3);\n meanBound[i] = 0; varianceBound[i] = 0;\n corrected += pixel.ahdCorrectedPixelCount; sampleCount += pixel.sampleCount; siteCount += pixel.siteCount;\n recomputed.push(i);\n }\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;\n return { samples, expected, noiseStd, sampleCount, siteCount, detailPixelCount: pixelCount, uniformPixelCount: 0, ahdCorrectedPixelCount: corrected, estimation: \"exact-area-mean\",\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, 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] = (group.fx === 0 ? (x + 0.5 - W / 2) : (x + 0.5 + group.fx - W / 2)) * g;\n out[1] = -(group.fy === 0 ? (y + 0.5 - H / 2) : (y + 0.5 + group.fy - H / 2)) * 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. */\nfunction 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 if (request.scene !== \"chart\" && request.scene !== \"material-layers\") return \"the scene is a caller \" + request.scene + \"; the GPU material lookup covers engine charts and declared material-layers scenes (describe the scene as material-layers)\";\n if (request.toneCurve !== \"identity\" && request.toneCurve !== \"positive-reinhard-per-channel\") return \"unsupported tone curve \" + String(request.toneCurve);\n if (offsetCount(request) > MAXIMUM_GROUPS) return \"more than \" + MAXIMUM_GROUPS + \" query offsets per site\";\n return true;\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;\n const nativeWidth = 40, nativeHeight = 28, margin = 1, frameWidth = 38, frameHeight = 26, nodes = [450, 550, 650];\n const chart = resolvePortableChartScene({ scene: { preset: \"checkerboard\", squaresAcross: 6 }, aspect: frameHeight / frameWidth });\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,\n electronsPerRadiance: defocus ? [Float64Array.of(9000, 30000, 4000), Float64Array.of(6000, 42000, 9000), Float64Array.of(30000, 9000, 3000)] :\n [Float64Array.of(900, 3000, 400), Float64Array.of(600, 4200, 900), Float64Array.of(3000, 900, 300)], offsets, kernels,\n scene: { kind: \"materials\", materialAt: (u, v) => chart.materialAt(u, v), materials: chart.materials.map((m) => ({ neutral: m.kind === \"neutral\" ? m.reflectance : 0.5 })), whiteRadiance: Float64Array.of(0.5, 0.9, 0.7) },\n channelAt: (x, y) => ((y & 1) === 0 ? ((x & 1) === 0 ? 0 : 1) : ((x & 1) === 0 ? 1 : 2)) };\n const readout = { perElectron: defocus ? 1 / 40000 : 1 / 4000, darkElectrons: 0.07, constantVariance: 2.5e-7 };\n const bilinear = bilinearKernels();\n const setup: DisplayViewSetup = { frameWidth, frameHeight, margin, nativeWidth, nativeHeight, viewWidth: 13, viewHeight: 9, region: { x: 0, y: 0, width: 13, height: 9 },\n samplesPerAxis: 16, reachSites: 5 + (disc ? disc.radius : 0), bitDepth: 8, seed: 479, signal: createDisplayViewExpectedSignal(signalInput), readout: [readout, readout, readout], demosaic: bilinear,\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 gains: [1.1, 1, 1.6], clipLevel: 1, matrix: [[3.08, -1.54, -0.54], [-0.92, 1.88, 0.045], [0.053, -0.2, 1.15]], toneCurve: \"identity\",\n yieldControl: async () => undefined, checkAbort: () => { if (signal?.aborted) throw abortedError(); } };\n const reference = await renderDisplayView(setup);\n const abort = new AbortController(), onAbort = (): void => abort.abort();\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n try {\n if (signal?.aborted) abort.abort();\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,\n (label, code) => createComputePipeline(runtime, label, code, abort.signal));\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 for (let i = 0; i < reference.expected.length; i++) {\n const p = Math.floor(i / 3), e0 = reference.expected[i]!, e1 = gpu.expected[i]!, v0 = reference.noiseStd[i]! * reference.noiseStd[i]!, v1 = gpu.noiseStd[i]! * gpu.noiseStd[i]!;\n const expectedLimit = gpu.expectedValueBound.relative * Math.abs(e0) + gpu.expectedValueAbsoluteBound[p]!, varianceLimit = gpu.varianceBound.relative * v0 + gpu.varianceAbsoluteBound[p]!;\n if (!(Math.abs(e1 - e0) <= expectedLimit)) return \"component \" + i + \": expected value \" + e1 + \" differs from the reference \" + e0 + \" by more than the a-priori bound \" + expectedLimit + \".\";\n if (!(Math.abs(v1 - v0) <= varianceLimit)) return \"component \" + i + \": variance \" + v1 + \" differs from the reference \" + v0 + \" by more than the a-priori bound \" + varianceLimit + \".\";\n if (Math.abs(gpu.samples[i]! - reference.samples[i]!) > 1) return \"component \" + i + \": sample \" + gpu.samples[i] + \" differs from the reference \" + reference.samples[i] + \" by more than one code.\";\n }\n return true;\n } finally { signal?.removeEventListener(\"abort\", onAbort); }\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. */\nfunction 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 */\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 // #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 material = 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, ...(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, 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`), 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, createDisplayViewExpectedSignal, displayViewCorrectionKey, 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 { resolvePortableChartScene } from \"../facade/chart-scenes.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, 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 } 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,\n DISPLAY_VIEW_QUALITY_GEOMETRY_STRIDE, DISPLAY_VIEW_QUALITY_GROUP_WORDS, 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: table 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;\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}\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 /** 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\nfunction checkAbort(signal: AbortSignal): void {\n if (signal.aborted) throw abortedError();\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. */\nfunction 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.scene.kind !== \"materials\") 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.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 value table of the expected signal (see the module comment). */\ninterface 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 /**\n * Per material m, channel c and tap t: the value at (m·3 + c)·T + t, float64 rounded once. Factored (the blocked pass, #492):\n * per row r (0: the neutral white, 1 + s: spectral material s) the value at (r·3 + c)·T + t, with `materialRows`.\n */\n table: Float32Array<ArrayBuffer>;\n /** Factored table only: per material its row and its reflectance (float32 bits; 1 for a spectral material). */\n materialRows: Uint32Array<ArrayBuffer> | null;\n /** Per channel c and tap t: the largest difference between two materials' values at that tap (at c·T + t), rounded up. */\n spread: Float32Array<ArrayBuffer>;\n materials: number;\n /** Σ_t of the largest positive value below the float32 normal range at tap t (over materials and channels), float64. */\n tinyMass: number;\n}\nfunction signalGather(signalInput: DisplayViewExpectedSignalInput, factored: boolean): SignalGather {\n const tables = displayViewSignalTables(signalInput), scene = signalInput.scene as Extract<DisplayViewExpectedSignalInput[\"scene\"], { kind: \"materials\" }>;\n const W = signalInput.nativeWidth, H = signalInput.nativeHeight, R = signalInput.kernels ? signalInput.kernels.radius : 0, materials = scene.materials.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 direct = (m: number, c: number): number => { const si = tables.spectralIndex[m]!; return si < 0 ? tables.reflectance[m]! * tables.neutralDirect[c]! : tables.spectralDirect[c]![si]!; };\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 const check = (value: number): number => {\n if (!(Math.abs(value) <= FLOAT32_SAFE_MAGNITUDE)) throw new ImageKernelExecutionError(\"unsupported-float32-domain\", \"A material's channel signal exceeds the float32 domain.\");\n return value;\n };\n const tiny = new Float64Array(T);\n if (factored && signalInput.kernels) {\n // #492: one neutral row (the white's combined kernel, which the reference scales by each neutral material's reflectance) and one\n // row per spectral material; the spread of a tap over the materials from the neutral reflectances' range and the spectral rows.\n const spectralCount = tables.spectral.length, rows = 1 + spectralCount, table = new Float32Array(rows * 3 * T), materialRows = new Uint32Array(2 * materials);\n const reflectanceBits = new Float32Array(materialRows.buffer);\n let neutralLow = Infinity, neutralHigh = -Infinity, neutralSmallest = Infinity;\n for (let m = 0; m < materials; m++) {\n const si = tables.spectralIndex[m]!;\n if (si < 0) {\n const r = check(tables.reflectance[m]!);\n materialRows[2 * m] = 0; reflectanceBits[2 * m + 1] = r;\n neutralLow = Math.min(neutralLow, r); neutralHigh = Math.max(neutralHigh, r);\n if (r > 0) neutralSmallest = Math.min(neutralSmallest, r);\n } else { materialRows[2 * m] = 1 + si; reflectanceBits[2 * m + 1] = 1; }\n }\n for (let t = 0; t < T; t++) {\n const source = tables.groups[tapGroup[t]!]!, index = tapIndex[t]!;\n for (let c = 0; c < 3; c++) {\n let low = Infinity, high = -Infinity;\n const white = check(source.neutral[c]![index]!);\n table[c * T + t] = white;\n if (neutralHigh >= neutralLow) {\n low = neutralLow * white; high = neutralHigh * white;\n // A neutral term r·N below the float32 normal range may be flushed: at most min(r_max·N, 2⁻¹²⁶).\n if (neutralSmallest * white < FLOAT32_MINIMUM_NORMAL && white > 0) tiny[t] = Math.max(tiny[t]!, Math.min(neutralHigh * white, FLOAT32_MINIMUM_NORMAL));\n }\n for (let si = 0; si < spectralCount; si++) {\n const value = check(source.spectral[c]![si]![index]!);\n table[((1 + si) * 3 + c) * T + t] = value;\n low = Math.min(low, value); high = Math.max(high, value);\n if (value > 0 && value < FLOAT32_MINIMUM_NORMAL) tiny[t] = Math.max(tiny[t]!, value);\n }\n spread[c * T + t] = Math.fround((high - low) * (1 + 4 * E));\n }\n }\n let tinyMass = 0;\n for (let t = 0; t < T; t++) tinyMass += tiny[t]!;\n return { groups, taps, tapCount: T, table, materialRows, spread, materials, tinyMass };\n }\n const table = new Float32Array(materials * 3 * T);\n for (let t = 0; t < T; t++) {\n const source = tables.groups[tapGroup[t]!]!, index = tapIndex[t]!;\n for (let c = 0; c < 3; c++) {\n let low = Infinity, high = -Infinity;\n for (let m = 0; m < materials; m++) {\n const si = tables.spectralIndex[m]!;\n const value = check(signalInput.kernels ? (si < 0 ? tables.reflectance[m]! * source.neutral[c]![index]! : source.spectral[c]![si]![index]!) : source.members[index]!.weight * direct(m, c));\n table[(m * 3 + c) * T + t] = value;\n low = Math.min(low, value); high = Math.max(high, value);\n if (value > 0 && value < FLOAT32_MINIMUM_NORMAL) tiny[t] = Math.max(tiny[t]!, value);\n }\n // The spread rounded up (a float32 rounding of the two values and of the difference).\n spread[c * T + t] = Math.fround((high - low) * (1 + 4 * E));\n }\n }\n let tinyMass = 0;\n for (let t = 0; t < T; t++) tinyMass += tiny[t]!;\n return { groups, taps, tapCount: T, table, materialRows: null, 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: a term carries two host roundings (u = E/2 each: its row value and the reflectance), the\n * product (E), at most cw additions in its row, ch in its group and G in the total, and the dark electrons' addition, all of\n * non-negative terms (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 u = group.fx === 0 ? (p + 0.5 - W / 2) * g : (p + 0.5 + group.fx - W / 2) * g, v = group.fy === 0 ? -(q + 0.5 - H / 2) * g : -(q + 0.5 + group.fy - H / 2) * g;\n const m = scene.materialAt(u, v);\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/** 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 // #492: the table values a device may flush to zero (blocked sum only), rounded up and kept normal so the uniform is not flushed either.\n if (blocked && gather.tinyMass > 0) 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 } = 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 = input.blockedSum ?? (setup.gpu?.defocusRadius ?? 0) > 0;\n if (blocked && !signalInput.kernels) 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 = signalGather(signalInput, blocked), aux = auxTable(setup), { params, words, ints, floats } = constants(setup, signalInput, gather, reach, count, blocked);\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;\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 (\" +\n (gather.materialRows ? gather.table.length / (3 * gather.tapCount) + \" rows (the neutral white and each spectral material)\" : gather.materials + \" materials\") + \" × 3 channels × \" +\n gather.tapCount + \" taps per site, \" + gather.table.byteLength + \" bytes) 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 = await pipelines(\"photivra-display-view-quality-lattice:\" + material.id, assembleDisplayViewQualityLatticeWgsl(material.wgsl));\n const sitesPipeline = 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);\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 const materialRowsBuffer = gather.materialRows ? scope.upload(\"photivra-display-view-material-rows\", gather.materialRows, BUFFER_USAGE.STORAGE) : null;\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 materialEntries = 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 materialGroup = runtime.device.createBindGroup({ layout: latticePipeline.getBindGroupLayout(1), entries: materialEntries });\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 let latticeBuffer = band.buffer(\"photivra-display-view-lattice\", latticeTotal * 4, BUFFER_USAGE.STORAGE | (blocked ? BUFFER_USAGE.COPY_SRC : 0));\n const siteBuffer = band.buffer(\"photivra-display-view-sites\", siteW * siteH * SITE_BYTES, BUFFER_USAGE.STORAGE);\n // Pass 1: lattice materials.\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 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 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: spreadBuffer } },\n ...(materialRowsBuffer ? [{ binding: 7, resource: { buffer: materialRowsBuffer } }] : [])] });\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, 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 }, { 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 bandFlags = new Uint32Array(flagData, 0, count);\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 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);\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 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[] = [];\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 {\n const signal = createDisplayViewExpectedSignal(signalInput);\n // Runs of consecutive flagged pixels along a row are rendered as one region (#457: AHD's choice flags stretches near\n // edges); a region render is byte-identical to the same pixels of the whole view, so each pixel equals its one-pixel\n // render, and the run's counts are the sums of its pixels' counts.\n for (let r = 0; r < flagged.length;) {\n checkAbort(abort.signal);\n const first = flagged[r]!, rx = first % region.width, ry = (first - rx) / region.width;\n let run = 1;\n while (r + run < flagged.length && flagged[r + run] === first + run && rx + run < region.width) run++;\n const part = await renderDisplayView({ ...setup, signal, region: { x: region.x + rx, y: region.y + ry, width: run, height: 1 } });\n samples.set(part.samples, first * 3); expected.set(part.expected, first * 3); noiseStd.set(part.noiseStd, first * 3);\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 r += run;\n }\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;\n return { samples, expected, noiseStd, sampleCount, siteCount, detailPixelCount: pixelCount, uniformPixelCount: 0, ahdCorrectedPixelCount: corrected, estimation: \"exact-area-mean\",\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, 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] = (group.fx === 0 ? (x + 0.5 - W / 2) : (x + 0.5 + group.fx - W / 2)) * g;\n out[1] = -(group.fy === 0 ? (y + 0.5 - H / 2) : (y + 0.5 + group.fy - H / 2)) * 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. */\nfunction 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 if (request.scene !== \"chart\" && request.scene !== \"material-layers\") return \"the scene is a caller \" + request.scene + \"; the GPU material lookup covers engine charts and declared material-layers scenes (describe the scene as material-layers)\";\n if (request.toneCurve !== \"identity\" && request.toneCurve !== \"positive-reinhard-per-channel\") return \"unsupported tone curve \" + String(request.toneCurve);\n if (offsetCount(request) > MAXIMUM_GROUPS) return \"more than \" + MAXIMUM_GROUPS + \" query offsets per site\";\n return true;\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;\n const nativeWidth = 40, nativeHeight = 28, margin = 1, frameWidth = 38, frameHeight = 26, nodes = [450, 550, 650];\n const chart = resolvePortableChartScene({ scene: { preset: \"checkerboard\", squaresAcross: 6 }, aspect: frameHeight / frameWidth });\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,\n electronsPerRadiance: defocus ? [Float64Array.of(9000, 30000, 4000), Float64Array.of(6000, 42000, 9000), Float64Array.of(30000, 9000, 3000)] :\n [Float64Array.of(900, 3000, 400), Float64Array.of(600, 4200, 900), Float64Array.of(3000, 900, 300)], offsets, kernels,\n scene: { kind: \"materials\", materialAt: (u, v) => chart.materialAt(u, v), materials: chart.materials.map((m) => ({ neutral: m.kind === \"neutral\" ? m.reflectance : 0.5 })), whiteRadiance: Float64Array.of(0.5, 0.9, 0.7) },\n channelAt: (x, y) => ((y & 1) === 0 ? ((x & 1) === 0 ? 0 : 1) : ((x & 1) === 0 ? 1 : 2)) };\n const readout = { perElectron: defocus ? 1 / 40000 : 1 / 4000, darkElectrons: 0.07, constantVariance: 2.5e-7 };\n const bilinear = bilinearKernels();\n const setup: DisplayViewSetup = { frameWidth, frameHeight, margin, nativeWidth, nativeHeight, viewWidth: 13, viewHeight: 9, region: { x: 0, y: 0, width: 13, height: 9 },\n samplesPerAxis: 16, reachSites: 5 + (disc ? disc.radius : 0), bitDepth: 8, seed: 479, signal: createDisplayViewExpectedSignal(signalInput), readout: [readout, readout, readout], demosaic: bilinear,\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 gains: [1.1, 1, 1.6], clipLevel: 1, matrix: [[3.08, -1.54, -0.54], [-0.92, 1.88, 0.045], [0.053, -0.2, 1.15]], toneCurve: \"identity\",\n yieldControl: async () => undefined, checkAbort: () => { if (signal?.aborted) throw abortedError(); } };\n const reference = await renderDisplayView(setup);\n const abort = new AbortController(), onAbort = (): void => abort.abort();\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n try {\n if (signal?.aborted) abort.abort();\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,\n (label, code) => createComputePipeline(runtime, label, code, abort.signal));\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 for (let i = 0; i < reference.expected.length; i++) {\n const p = Math.floor(i / 3), e0 = reference.expected[i]!, e1 = gpu.expected[i]!, v0 = reference.noiseStd[i]! * reference.noiseStd[i]!, v1 = gpu.noiseStd[i]! * gpu.noiseStd[i]!;\n const expectedLimit = gpu.expectedValueBound.relative * Math.abs(e0) + gpu.expectedValueAbsoluteBound[p]!, varianceLimit = gpu.varianceBound.relative * v0 + gpu.varianceAbsoluteBound[p]!;\n if (!(Math.abs(e1 - e0) <= expectedLimit)) return \"component \" + i + \": expected value \" + e1 + \" differs from the reference \" + e0 + \" by more than the a-priori bound \" + expectedLimit + \".\";\n if (!(Math.abs(v1 - v0) <= varianceLimit)) return \"component \" + i + \": variance \" + v1 + \" differs from the reference \" + v0 + \" by more than the a-priori bound \" + varianceLimit + \".\";\n if (Math.abs(gpu.samples[i]! - reference.samples[i]!) > 1) return \"component \" + i + \": sample \" + gpu.samples[i] + \" differs from the reference \" + reference.samples[i] + \" by more than one code.\";\n }\n return true;\n } finally { signal?.removeEventListener(\"abort\", onAbort); }\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. */\nfunction 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 */\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 // #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 material = 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, ...(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, 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"]}
|