@photivra/engine 2.9.0 → 2.11.1
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 +223 -1
- package/CITATION.cff +1 -1
- package/NODE_SUPPORT.md +21 -3
- package/README.md +6 -6
- package/SECURITY.md +1 -1
- package/THIRD_PARTY.md +2 -0
- package/dist/capture/native-environment-lean.js +89 -5
- package/dist/capture/native-environment-lean.js.map +1 -1
- package/dist/capture/native-environment-tabulated.d.ts +37 -0
- package/dist/capture/native-environment-tabulated.js +42 -6
- package/dist/capture/native-environment-tabulated.js.map +1 -1
- package/dist/core/portable-math.d.ts +19 -0
- package/dist/core/portable-math.js +82 -0
- package/dist/core/portable-math.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/facade/channel-response.d.ts +15 -0
- package/dist/facade/channel-response.js +33 -0
- package/dist/facade/channel-response.js.map +1 -0
- package/dist/facade/chart-material-layers.d.ts +115 -0
- package/dist/facade/chart-material-layers.js +224 -0
- package/dist/facade/chart-material-layers.js.map +1 -0
- package/dist/facade/chart-radiance-batch.d.ts +8 -2
- package/dist/facade/chart-radiance-batch.js +11 -4
- package/dist/facade/chart-radiance-batch.js.map +1 -1
- package/dist/facade/chart-scenes.d.ts +134 -0
- package/dist/facade/chart-scenes.js +32 -22
- package/dist/facade/chart-scenes.js.map +1 -1
- package/dist/facade/diffraction-provider.d.ts +8 -2
- package/dist/facade/diffraction-provider.js +120 -16
- package/dist/facade/diffraction-provider.js.map +1 -1
- package/dist/facade/display-view-gpu-session.d.ts +18 -0
- package/dist/facade/display-view-gpu-session.js +280 -0
- package/dist/facade/display-view-gpu-session.js.map +1 -0
- package/dist/facade/display-view-gpu.d.ts +146 -0
- package/dist/facade/display-view-gpu.js +59 -0
- package/dist/facade/display-view-gpu.js.map +1 -0
- package/dist/facade/display-view.d.ts +123 -1
- package/dist/facade/display-view.js +478 -116
- package/dist/facade/display-view.js.map +1 -1
- package/dist/facade/expected-signal-setup.d.ts +5 -0
- package/dist/facade/expected-signal-setup.js +18 -1
- package/dist/facade/expected-signal-setup.js.map +1 -1
- package/dist/facade/expected-signal.d.ts +80 -6
- package/dist/facade/expected-signal.js +200 -24
- package/dist/facade/expected-signal.js.map +1 -1
- package/dist/facade/scene-radiance.d.ts +4 -2
- package/dist/facade/scene-radiance.js +7 -4
- package/dist/facade/scene-radiance.js.map +1 -1
- package/dist/facade/simulate-capture.d.ts +81 -7
- package/dist/facade/simulate-capture.js +276 -53
- package/dist/facade/simulate-capture.js.map +1 -1
- package/dist/facade/simulate-display-view.d.ts +54 -3
- package/dist/facade/simulate-display-view.js +120 -27
- package/dist/facade/simulate-display-view.js.map +1 -1
- package/dist/gpu/chart-composite-gpu.d.ts +119 -0
- package/dist/gpu/chart-composite-gpu.js +572 -0
- package/dist/gpu/chart-composite-gpu.js.map +1 -0
- package/dist/gpu/chart-radiance-gpu.d.ts +6 -6
- package/dist/gpu/chart-radiance-gpu.js +9 -11
- package/dist/gpu/chart-radiance-gpu.js.map +1 -1
- package/dist/gpu/display-view-chart-material-module.d.ts +10 -0
- package/dist/gpu/display-view-chart-material-module.js +58 -0
- package/dist/gpu/display-view-chart-material-module.js.map +1 -0
- package/dist/gpu/display-view-composite-material-module.d.ts +68 -0
- package/dist/gpu/display-view-composite-material-module.js +248 -0
- package/dist/gpu/display-view-composite-material-module.js.map +1 -0
- package/dist/gpu/display-view-quality-gpu.d.ts +185 -0
- package/dist/gpu/display-view-quality-gpu.js +1000 -0
- package/dist/gpu/display-view-quality-gpu.js.map +1 -0
- package/dist/gpu/display-view-speed-gpu.d.ts +156 -0
- package/dist/gpu/display-view-speed-gpu.js +524 -0
- package/dist/gpu/display-view-speed-gpu.js.map +1 -0
- package/dist/gpu/image-kernel-accelerator.d.ts +23 -4
- package/dist/gpu/image-kernel-accelerator.js +58 -10
- package/dist/gpu/image-kernel-accelerator.js.map +1 -1
- package/dist/gpu/image-kernel-execution.d.ts +60 -3
- package/dist/gpu/image-kernel-execution.js +2 -2
- package/dist/gpu/image-kernel-execution.js.map +1 -1
- package/dist/gpu/sensor-stage-gpu.d.ts +11 -0
- package/dist/gpu/sensor-stage-gpu.js +42 -13
- package/dist/gpu/sensor-stage-gpu.js.map +1 -1
- package/dist/gpu/webgpu-runtime.d.ts +4 -2
- package/dist/gpu/webgpu-runtime.js +13 -4
- package/dist/gpu/webgpu-runtime.js.map +1 -1
- package/dist/gpu/webgpu-switch.d.ts +4 -0
- package/dist/gpu/webgpu-switch.js +29 -0
- package/dist/gpu/webgpu-switch.js.map +1 -0
- package/dist/gpu/wgsl-chart-composite-kernel.d.ts +52 -0
- package/dist/gpu/wgsl-chart-composite-kernel.js +515 -0
- package/dist/gpu/wgsl-chart-composite-kernel.js.map +1 -0
- package/dist/gpu/wgsl-chart-kernel.d.ts +11 -9
- package/dist/gpu/wgsl-chart-kernel.js +33 -27
- package/dist/gpu/wgsl-chart-kernel.js.map +1 -1
- package/dist/gpu/wgsl-display-view-quality-kernel.d.ts +95 -0
- package/dist/gpu/wgsl-display-view-quality-kernel.js +769 -0
- package/dist/gpu/wgsl-display-view-quality-kernel.js.map +1 -0
- package/dist/gpu/wgsl-display-view-speed-kernel.d.ts +75 -0
- package/dist/gpu/wgsl-display-view-speed-kernel.js +386 -0
- package/dist/gpu/wgsl-display-view-speed-kernel.js.map +1 -0
- package/dist/gpu/wgsl-sensor-kernel.d.ts +28 -9
- package/dist/gpu/wgsl-sensor-kernel.js +94 -50
- package/dist/gpu/wgsl-sensor-kernel.js.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/optics/defocus-disc-kernel.d.ts +61 -0
- package/dist/optics/defocus-disc-kernel.js +191 -0
- package/dist/optics/defocus-disc-kernel.js.map +1 -0
- package/dist/optics/irradiance-convolution.d.ts +11 -0
- package/dist/optics/irradiance-convolution.js +64 -24
- package/dist/optics/irradiance-convolution.js.map +1 -1
- package/dist/optics/scene-to-sensor-irradiance.d.ts +13 -0
- package/dist/optics/scene-to-sensor-irradiance.js +58 -24
- package/dist/optics/scene-to-sensor-irradiance.js.map +1 -1
- package/dist/optics/sensor-aperture-rays.js +2 -1
- package/dist/optics/sensor-aperture-rays.js.map +1 -1
- package/dist/optics/sensor-environment-query.js +4 -3
- package/dist/optics/sensor-environment-query.js.map +1 -1
- package/dist/optics/site-diffraction-kernel.d.ts +16 -0
- package/dist/optics/site-diffraction-kernel.js +60 -8
- package/dist/optics/site-diffraction-kernel.js.map +1 -1
- package/dist/processing/demosaic.js +114 -37
- package/dist/processing/demosaic.js.map +1 -1
- package/dist/schema/scene-radiance.d.ts +8 -0
- package/dist/schema/scene-radiance.js +28 -17
- package/dist/schema/scene-radiance.js.map +1 -1
- package/dist/sensor/environment-photo-signal.d.ts +21 -0
- package/dist/sensor/environment-photo-signal.js +68 -2
- package/dist/sensor/environment-photo-signal.js.map +1 -1
- package/docs/API_REFERENCE.md +60 -1
- package/docs/QUICK_START.md +120 -11
- package/docs/USAGE.md +82 -2
- package/docs/api/core-version.md +1 -1
- package/docs/api/exports.json +157 -2
- package/docs/api/facade-chart-material-layers.md +137 -0
- package/docs/api/facade-chart-radiance-batch.md +7 -2
- package/docs/api/facade-display-view-gpu.md +94 -0
- package/docs/api/facade-display-view.md +50 -0
- package/docs/api/facade-scene-radiance.md +3 -2
- package/docs/api/facade-simulate-capture.md +81 -12
- package/docs/api/facade-simulate-display-view.md +39 -2
- package/docs/api/gpu-image-kernel-accelerator.md +10 -3
- package/docs/api/gpu-image-kernel-execution.md +76 -4
- package/docs/api/gpu-webgpu-switch.md +23 -0
- package/package.json +3 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display-view-speed-gpu.js","sourceRoot":"","sources":["../../src/gpu/display-view-speed-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 Speed path on the GPU (#478): the support check, the float64 tables (site table,\n * overlaps over the scale, axis sums over the squared scale, 1/Σw²), banded dispatch of\n * `DISPLAY_VIEW_SPEED_KERNEL_WGSL`, and the finishing the CPU reference does after its per-sample loop: the output\n * quantization term, the seeded noise draw, the Cholesky factor, the clipped-normal centre, the sRGB encode and the\n * rounding, all with the reference's own float64 functions. So the noise draw is bit-identical to the CPU's, and only\n * the expected value and the covariance carry the float32 bound.\n *\n * The float64 reference is `renderDisplayView` (facade/display-view.ts) on the exact-area-mean path without\n * diffraction, with the bilinear demosaic and chart materials. Internal: not exported from the package. The\n * material lookup per query point is a module the caller supplies (`DisplayViewGpuMaterialModule`, the seam of\n * #477); `display-view-chart-material-module.ts` provides one for the eight 2.0 chart presets and\n * `display-view-composite-material-module.ts` (#491) one for composite charts, the 2.3 elements and `material-layers` scenes.\n */\nimport { DISPLAY_VIEW_NOISE_STREAM_ID, EXACT_AREA_MEAN_MAX_PIXELS, axisSums, clipCentre, createDisplayViewExpectedSignal, overlaps,\n quantizationVariance, renderDisplayView, type AxisSums, type DisplayViewKernelTap, type DisplayViewRenderResult, type DisplayViewSetup } from \"../facade/display-view.js\";\nimport type { DisplayViewExpectedSignalInput } from \"../facade/expected-signal.js\";\nimport { resolvePortableChartScene } from \"../facade/chart-scenes.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 { createDisplayViewMaterialModules } from \"./display-view-composite-material-module.js\";\nimport { chartPresetMaterialModule } from \"./display-view-chart-material-module.js\";\nimport { encodeSrgbComponentPortable } from \"../color/srgb-transfer.js\";\nimport { createDeterministicUniformStream, deriveNativeSiteStreamSeedUint32, samplePortableStandardNormal } from \"../sensor/stochastic-seed.js\";\nimport { createHostYieldGate } from \"../capture/host-yield-cadence.js\";\nimport { ImageKernelExecutionError, WEBGPU_F32_UNIT_ROUNDOFF, webGpuExecution, type ChartCompositeProbeRecord, 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_AUX, DISPLAY_VIEW_GEOMETRY_STRIDE, DISPLAY_VIEW_GPU_MAXIMUM_OFFSETS, DISPLAY_VIEW_GPU_MAXIMUM_PIXELS_PER_AXIS,\n DISPLAY_VIEW_OUTPUT_FLOATS, DISPLAY_VIEW_PARAM_WORDS, DISPLAY_VIEW_REINHARD_MEAN_U, DISPLAY_VIEW_REINHARD_VARIANCE_U, DISPLAY_VIEW_WORKGROUP_SIZE,\n assembleDisplayViewSpeedWgsl } from \"./wgsl-display-view-speed-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/** Higham's γ_k with E in place of u. */\nconst gammaE = (k: number): number => k * E / (1 - k * E);\n/** Every reported bound is doubled, as the sensor stage doubles its margins. */\nconst MARGIN = 2;\n/** Table values above this are outside the float32 domain. */\nconst FLOAT32_SAFE_MAGNITUDE = 2 ** 120;\n/** Roundings of the expected value's multiplicative chain (docs/WEBGPU.md, \"Display view (Speed)\"): site 9, readout 2, demosaic 4, WB 2, matrix 4, weights 3, up to 35 additions, 5 spare. */\nconst MEAN_ROUNDINGS = 64;\n/** Roundings of the variance chain: the squares double the readout, demosaic, WB and matrix counts. */\nconst VARIANCE_ROUNDINGS = 80;\n/** The reference's own float64 rounding of its chains, relative. */\nconst CPU_RELATIVE = 2 ** -40;\n/**\n * #496: the host's output quantization term q(m) = s(e)²·Δ²/12 (`quantizationVariance`, s the sRGB EOTF's slope at the encoded\n * mean e) 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 * The Quality kernel's constants (#479).\n */\nconst QUANTIZATION_SLOPE = 6.04, QUANTIZATION_JOIN_JUMP = 2.1e-4, QUANTIZATION_JOIN = 0.0031308;\n/** Workgroups per band are limited by the output buffer: DISPLAY_VIEW_OUTPUT_FLOATS floats plus one flag word per display pixel. */\nconst BYTES_PER_PIXEL = 4 * DISPLAY_VIEW_OUTPUT_FLOATS + 4;\n\n/**\n * The material lookup of a GPU display view (the seam of #477, GPU chart radiance for the composite chart and label\n * masks). `wgsl` defines `fn material_at(p: vec2<f32>) -> u32` (the material index of frame point p: u right, v up, the\n * same index space as the scene's `materialAt`) and declares `var<private> material_uncertain: bool`, which it sets to\n * true when p lies within its a-priori bound of a material boundary; the display pixel is then recomputed on the host\n * with the reference. The point p carries a relative error of at most 2E + 10⁻¹⁴ (E = 2⁻²³) against the reference's float64\n * query point (two float32 roundings of (x + c)·scale), which the module's bounds must cover. The module may use the\n * kernel's constants `E` (2⁻²³) and `SLACK` (10⁻¹⁴) and declares its buffers in @group(1); `bindings` are their\n * contents: `data` is uploaded once per render, `buffer` is a buffer the module already holds on the device (#491: scene\n * records uploaded once per renderer and reused across a view's parts).\n */\nexport interface DisplayViewGpuMaterialModule {\n /** Names the module in the pipeline cache; two modules with different `wgsl` need different ids. */\n readonly id: string;\n readonly wgsl: string;\n /** The composite module's device probe record (the product path it chose); absent for the chart-preset module. */\n readonly compositeProbe?: ChartCompositeProbeRecord;\n readonly bindings: readonly ({ binding: number; kind: \"uniform\" | \"storage\"; data: ArrayBufferView<ArrayBuffer>; buffer?: undefined } |\n { binding: number; kind: \"uniform\" | \"storage\"; buffer: GPUBuffer; data?: undefined })[];\n}\n\n/** What a GPU render of a display view needs: the reference's own setup and expected-signal input, plus the material module. */\nexport interface DisplayViewSpeedGpuInput {\n /** The render's setup, as `renderDisplayView` receives it (`setup.signal` is used only to recompute flagged pixels). */\n setup: DisplayViewSetup;\n /** The expected signal's input (the offsets, the materials table and the query points). */\n signalInput: DisplayViewExpectedSignalInput;\n material: DisplayViewGpuMaterialModule;\n /** Recompute flagged display pixels (a query point within its bound of a material boundary) with the reference. Default true. */\n recomputeFlagged?: boolean;\n}\n\n/** A GPU display view of one region: the reference's result fields plus the execution label, the bounds and the flagged pixels. */\nexport interface DisplayViewSpeedGpuResult 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 variance (the covariance diagonal, linear light squared). */\n varianceBound: ImageKernelRelativeErrorBound;\n /** Per display pixel: the absolute terms of the two bounds (the clip steps' running bound, already doubled). */\n expectedValueAbsoluteBound: Float32Array;\n varianceAbsoluteBound: Float32Array;\n /** Display pixels (region row-major) whose material lookup was uncertain; equal to `hostRecomputedPixelIndices` when recomputing. */\n flaggedPixelIndices: Uint32Array;\n hostRecomputedPixelIndices: Uint32Array;\n}\n\nfunction checkAbort(signal: AbortSignal): void {\n if (signal.aborted) throw abortedError();\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/**\n * Why the kernel does not cover a request, or null when it does. The kernel is the Speed path: the exact area mean\n * (views where a footprint holds at most 25 real pixels and at most K², and here at most 6 per axis), no diffraction\n * kernels, chart materials, the bilinear demosaic (no AHD candidates or correction), the identity or positive Reinhard\n * tone curve, and at most 16 query offsets.\n */\nexport function displayViewSpeedGpuUnsupportedReason(setup: DisplayViewSetup, signalInput: DisplayViewExpectedSignalInput): string | null {\n if (signalInput.kernels) return \"diffraction kernels (the Quality path) are not on the GPU\";\n if (signalInput.scene.kind !== \"materials\") return \"radiance scenes (caller functions) are not on the GPU\";\n if (!signalInput.queryPoint) return \"the expected signal has no query points\";\n if (setup.candidates || setup.ahdCorrection || setup.ahdCollect) return \"AHD candidates and the low-signal correction are not on the GPU\";\n if (setup.toneCurve !== \"identity\" && setup.toneCurve !== \"positive-reinhard-per-channel\") return \"unsupported tone curve \" + String(setup.toneCurve);\n if (signalInput.offsets.length < 1 || signalInput.offsets.length > DISPLAY_VIEW_GPU_MAXIMUM_OFFSETS) return \"the kernel holds 1 to \" + DISPLAY_VIEW_GPU_MAXIMUM_OFFSETS + \" query offsets\";\n if (setup.region.width < 1 || setup.region.height < 1) return \"an empty region\";\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_GPU_MAXIMUM_PIXELS_PER_AXIS || shape.maximumRows > DISPLAY_VIEW_GPU_MAXIMUM_PIXELS_PER_AXIS)\n return \"a footprint touches more than \" + DISPLAY_VIEW_GPU_MAXIMUM_PIXELS_PER_AXIS + \" real pixels along an axis\";\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 demosaic is not the bilinear kernels (at most 4 taps within one site)\";\n }\n return null;\n}\n\n/** The site table: Σ_λ A_c(λ)·L_m(λ) per material and channel in float64 (the reference's `materialSignalDirect`), rounded once to float32. */\nfunction siteTable(signalInput: DisplayViewExpectedSignalInput): Float32Array<ArrayBuffer> {\n const scene = signalInput.scene as Extract<DisplayViewExpectedSignalInput[\"scene\"], { kind: \"materials\" }>, A = signalInput.electronsPerRadiance, nodes = signalInput.wavelengthsNm.length;\n const neutral = [0, 1, 2].map((c) => { let s = 0; for (let n = 0; n < nodes; n++) s += A[c]![n]! * scene.whiteRadiance[n]!; return s; });\n const table = new Float32Array(scene.materials.length * 3);\n scene.materials.forEach((m, index) => {\n for (let c = 0; c < 3; c++) {\n let value: number;\n if (\"neutral\" in m) value = m.neutral * neutral[c]!;\n else { value = 0; for (let n = 0; n < nodes; n++) value += A[c]![n]! * m.radiance[n]!; }\n if (!(Math.abs(value) <= FLOAT32_SAFE_MAGNITUDE)) throw new ImageKernelExecutionError(\"unsupported-float32-domain\", \"A material's channel signal exceeds the float32 domain.\");\n table[index * 3 + c] = value;\n }\n });\n return table;\n}\n\n/**\n * The query-point scale and offsets: the reference's query point of offset o at site (x, y) is, up to its own float64\n * rounding, (x + 0.5 + o_x − W/2)·g and −(y + 0.5 + o_y − H/2)·g with g = 2/outputWidth frame units per site. The scale\n * is taken from the reference's own query points (two sites a frame apart, divided in float64), so a request whose\n * geometry differs is caught by the check against the reference at four corners (within 2^-40 relative).\n */\nexport function queryGeometry(signalInput: DisplayViewExpectedSignalInput): { scaleU: number; scaleV: number; offsetU: Float64Array; offsetV: Float64Array } {\n const W = signalInput.nativeWidth, H = signalInput.nativeHeight, point = new Float64Array(2), query = signalInput.queryPoint!;\n const x1 = W - 1, y1 = H - 1;\n query(0, 0, 0, point); const u0 = point[0]!, v0 = point[1]!;\n query(x1, 0, 0, point); const u1 = point[0]!;\n query(0, y1, 0, point); const v1 = point[1]!;\n const scaleU = (u1 - u0) / x1, scaleV = (v1 - v0) / y1;\n const offsetU = new Float64Array(signalInput.offsets.length), offsetV = new Float64Array(signalInput.offsets.length);\n for (let o = 0; o < signalInput.offsets.length; o++) {\n const offset = signalInput.offsets[o]!;\n offsetU[o] = 0.5 + offset.x - W / 2; offsetV[o] = 0.5 + offset.y - H / 2;\n // The model (x + c)·scale against the reference at the corners: a geometry the model does not describe is refused.\n for (const [x, y] of [[0, 0], [x1, 0], [0, y1], [x1, y1]] as const) {\n query(x, y, o, point);\n const mu = (x + offsetU[o]!) * scaleU, mv = (y + offsetV[o]!) * scaleV;\n if (!(Math.abs(mu - point[0]!) <= 2 ** -40 * (Math.abs(point[0]!) + 1) && Math.abs(mv - point[1]!) <= 2 ** -40 * (Math.abs(point[1]!) + 1)))\n throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"The request's query points are not a rectilinear site lattice; use cpu-reference.\");\n }\n }\n return { scaleU, scaleV, offsetU, offsetV };\n}\n\n/** Gauss–Legendre nodes and weights on [−1, 1], 16 points, by the reference's own construction (display-view.ts). */\nexport function gaussLegendre16(): { x: Float64Array; w: Float64Array } {\n const n = 16, x = new Float64Array(n), w = new Float64Array(n);\n for (let i = 0; i < n; i++) {\n let z = Math.cos(Math.PI * (i + 0.75) / (n + 0.5)), dp = 0;\n for (let it = 0; it < 100; it++) {\n let p0 = 1, p1 = z;\n for (let k = 2; k <= n; k++) { const p2 = ((2 * k - 1) * z * p1 - (k - 1) * p0) / k; p0 = p1; p1 = p2; }\n dp = n * (z * p1 - p0) / (z * z - 1);\n const dz = p1 / dp;\n z -= dz;\n if (Math.abs(dz) < 1e-16) break;\n }\n x[i] = z; w[i] = 2 / ((1 - z * z) * dp * dp);\n }\n return { x, w };\n}\n\n/** One axis record of the geometry buffer: first real pixel, count, overlaps over the scale, axis sums over the squared scale. */\nexport function axisRecord(geometry: Float32Array, at: number, start: number, end: number, limit: number, margin: number, scale: number): void {\n const { first, w } = overlaps(start, end, limit), sums = axisSums(start, end, limit, margin), scale2 = scale * scale;\n const words = new Int32Array(geometry.buffer, geometry.byteOffset, geometry.length);\n words[at] = first; words[at + 1] = w.length;\n for (let i = 0; i < w.length; i++) geometry[at + 2 + i] = w[i]! / scale;\n const order: (keyof AxisSums)[] = [\"bEven\", \"bOdd\", \"ppEven\", \"ppOdd\", \"qqEven\", \"qqOdd\", \"pqEven\", \"pqOdd\", \"ww\"];\n order.forEach((key, i) => { geometry[at + 8 + i] = sums[key] / scale2; });\n}\n\n/** The uniform parameters and the aux table of a render. */\nfunction constants(setup: DisplayViewSetup, signalInput: DisplayViewExpectedSignalInput): { params: ArrayBuffer; aux: Float32Array<ArrayBuffer> } {\n const params = new ArrayBuffer(4 * DISPLAY_VIEW_PARAM_WORDS), words = new Uint32Array(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] = signalInput.offsets.length;\n for (let c = 0; c < 3; c++) { floats[12 + c] = setup.readout[c]!.perElectron; floats[16 + c] = setup.readout[c]!.darkElectrons; floats[20 + c] = setup.readout[c]!.constantVariance; floats[24 + c] = setup.gains[c]!; }\n floats[15] = 8.5 * 8.5; floats[19] = setup.clipLevel;\n for (let r = 0; r < 3; r++) for (let c = 0; c < 3; c++) floats[28 + r * 3 + c] = setup.matrix[r]![c]!;\n const geometry = queryGeometry(signalInput);\n floats[37] = geometry.scaleU; floats[38] = geometry.scaleV;\n const aux = new Float32Array(DISPLAY_VIEW_AUX.size);\n for (let o = 0; o < signalInput.offsets.length; o++) { aux[DISPLAY_VIEW_AUX.offsets + 4 * o] = geometry.offsetU[o]!; aux[DISPLAY_VIEW_AUX.offsets + 4 * o + 1] = geometry.offsetV[o]!; aux[DISPLAY_VIEW_AUX.offsets + 4 * o + 2] = signalInput.offsets[o]!.weight; }\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_AUX.taps + (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_AUX.inverseW2 + p * 3 + c] = 1 / w2;\n }\n const gl = gaussLegendre16();\n aux.set(gl.x, DISPLAY_VIEW_AUX.gaussLegendre); aux.set(gl.w, DISPLAY_VIEW_AUX.gaussLegendre + 16);\n return { params, aux };\n}\n\n/** The a-priori relative bounds of the expected value and the variance (docs/WEBGPU.md, \"Display view (Speed)\"), doubled. */\nexport function displayViewSpeedGpuRelativeBounds(toneCurve: DisplayViewSetup[\"toneCurve\"]): { mean: number; variance: number } {\n const reinhard = toneCurve === \"positive-reinhard-per-channel\";\n return { mean: MARGIN * (gammaE(MEAN_ROUNDINGS) + CPU_RELATIVE + (reinhard ? DISPLAY_VIEW_REINHARD_MEAN_U * E : 0)),\n variance: MARGIN * (gammaE(VARIANCE_ROUNDINGS) + CPU_RELATIVE + (reinhard ? DISPLAY_VIEW_REINHARD_VARIANCE_U * E : 0)) };\n}\n\n/**\n * The reference's finishing of one display pixel from its linear-light moments (display-view.ts, after the sample loop):\n * the output quantization term, the seeded noise draw (`sensor.noiseSeed`, the display pixel's view index, stream 33),\n * the Cholesky factor, the clipped-normal centre, the sRGB encode and the rounding; the same functions, so the draw and\n * every operation after the moments are the CPU's. `moments` holds m0 m1 m2 v00 v11 v22 c01 c02 c12 (the variances\n * without the quantization term); `pixels` is Σ_j (w_j/A)².\n */\nexport function finishDisplayViewPixel(moments: ArrayLike<number>, pixels: number, seed: number, index: number, step: number, maximum: number,\n samples: Uint8Array | Uint16Array, expected: Float64Array, noiseStd: Float64Array, o: number): void {\n const mean0 = moments[0]!, mean1 = moments[1]!, mean2 = moments[2]!;\n const q0 = quantizationVariance(mean0, step), q1 = quantizationVariance(mean1, step), q2 = quantizationVariance(mean2, step);\n const v00 = moments[3]! + pixels * q0, v11 = moments[4]! + pixels * q1, v22 = moments[5]! + pixels * q2, v01 = moments[6]!, v02 = moments[7]!, v12 = moments[8]!;\n const noise = createDeterministicUniformStream(deriveNativeSiteStreamSeedUint32(seed, index, DISPLAY_VIEW_NOISE_STREAM_ID));\n const z0 = samplePortableStandardNormal(noise), z1 = samplePortableStandardNormal(noise), z2 = samplePortableStandardNormal(noise);\n const l00 = Math.sqrt(Math.max(0, v00)), l10 = l00 > 0 ? v01 / l00 : 0, l20 = l00 > 0 ? v02 / l00 : 0;\n const l11 = Math.sqrt(Math.max(0, v11 - l10 * l10)), l21 = l11 > 0 ? (v12 - l20 * l10) / l11 : 0;\n const l22 = Math.sqrt(Math.max(0, v22 - l20 * l20 - l21 * l21));\n const n0 = clipCentre(mean0, v00) + l00 * z0, n1 = clipCentre(mean1, v11) + l10 * z0 + l11 * z1, n2 = clipCentre(mean2, v22) + l20 * z0 + l21 * z1 + l22 * z2;\n samples[o] = Math.round(encodeSrgbComponentPortable(n0 < 0 ? 0 : n0 > 1 ? 1 : n0) * maximum);\n samples[o + 1] = Math.round(encodeSrgbComponentPortable(n1 < 0 ? 0 : n1 > 1 ? 1 : n1) * maximum);\n samples[o + 2] = Math.round(encodeSrgbComponentPortable(n2 < 0 ? 0 : n2 > 1 ? 1 : n2) * maximum);\n expected[o] = mean0; expected[o + 1] = mean1; expected[o + 2] = mean2;\n noiseStd[o] = Math.sqrt(Math.max(0, v00)); noiseStd[o + 1] = Math.sqrt(Math.max(0, v11)); noiseStd[o + 2] = Math.sqrt(Math.max(0, v22));\n}\n\n/**\n * #496: how far the host's quantization term Σ(w/A)²·q(m) of a display pixel can move when each component's mean carries the\n * bound relative·|m| + absolute (see QUANTIZATION_SLOPE), the largest over the three components, doubled. Added to the pixel's\n * absolute variance bound; it changes no computed value.\n */\nexport function displayViewSpeedQuantizationBound(moments: ArrayLike<number>, relative: number, absolute: number, pixels: number, step: number): number {\n let largest = 0;\n for (let c = 0; c < 3; c++) {\n const m = moments[c]!, bound = relative * Math.abs(m) + absolute;\n largest = Math.max(largest, QUANTIZATION_SLOPE * bound + (m - bound <= QUANTIZATION_JOIN && m + bound >= QUANTIZATION_JOIN ? QUANTIZATION_JOIN_JUMP : 0));\n }\n return MARGIN * pixels * largest * step * step / 12;\n}\n\n/** Renders one region of a Speed display view on the GPU (see the module comment). */\nexport async function renderDisplayViewSpeedOnGpu(runtime: WebGpuRuntime, bandBytes: number, input: DisplayViewSpeedGpuInput, abort: AbortController,\n yieldControl: YieldControl, pipelines: PipelineSource): Promise<DisplayViewSpeedGpuResult> {\n const { setup, signalInput, material } = input;\n const reason = displayViewSpeedGpuUnsupportedReason(setup, signalInput);\n if (reason) throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"webgpu-f32 display view (Speed): \" + reason + \"; use cpu-reference.\");\n const { region, margin } = setup, shape = footprintShape(setup), table = siteTable(signalInput), { params, aux } = constants(setup, signalInput);\n const stride = DISPLAY_VIEW_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 const rows = Math.max(1, Math.min(region.height, Math.floor(bandBytes / (region.width * BYTES_PER_PIXEL))));\n if (Math.max(rows * region.width * 4 * DISPLAY_VIEW_OUTPUT_FLOATS, geometry.byteLength, table.byteLength) > runtime.maximumStorageBindingBytes)\n throw new ImageKernelExecutionError(\"insufficient-limits\", \"One display-view band exceeds the device's storage binding limit.\");\n const pipeline = await pipelines(\"photivra-display-view-speed:\" + material.id, assembleDisplayViewSpeedWgsl(material.wgsl));\n const moments = new Float32Array(pixelCount * DISPLAY_VIEW_OUTPUT_FLOATS), flagged: number[] = [];\n const words = new Uint32Array(params);\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 const tableBuffer = scope.upload(\"photivra-display-view-table\", table, BUFFER_USAGE.STORAGE);\n const materialEntries = material.bindings.map((b) => ({ binding: b.binding, resource: { buffer: b.buffer ?? 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: pipeline.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 words[0] = count; words[1] = row0;\n const band = new GpuResourceScope(runtime);\n try {\n const out = band.buffer(\"photivra-display-view-moments\", count * 4 * DISPLAY_VIEW_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 uniform = band.upload(\"photivra-display-view-params\", new Uint8Array(params), BUFFER_USAGE.UNIFORM);\n const bindGroup = runtime.device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), entries: [\n { binding: 0, resource: { buffer: uniform } }, { binding: 1, resource: { buffer: auxBuffer } }, { binding: 2, resource: { buffer: geometryBuffer } },\n { binding: 3, resource: { buffer: tableBuffer } }, { binding: 4, resource: { buffer: out } }, { binding: 5, resource: { buffer: flagBuffer } }] });\n const [data, flagData] = await runComputePass(runtime, band, pipeline, [bindGroup, materialGroup], linearDispatch(count, DISPLAY_VIEW_WORKGROUP_SIZE, runtime.maximumWorkgroupsPerDimension),\n [{ buffer: out, bytes: count * 4 * DISPLAY_VIEW_OUTPUT_FLOATS }, { buffer: flagBuffer, bytes: count * 4 }], abort.signal);\n moments.set(new Float32Array(data!, 0, count * DISPLAY_VIEW_OUTPUT_FLOATS), first * DISPLAY_VIEW_OUTPUT_FLOATS);\n const bandFlags = new Uint32Array(flagData!, 0, count);\n for (let i = 0; i < count; i++) {\n let flag = bandFlags[i] !== 0;\n for (let k = 0; k < DISPLAY_VIEW_OUTPUT_FLOATS && !flag; k++) if (!Number.isFinite(moments[(first + i) * DISPLAY_VIEW_OUTPUT_FLOATS + k]!)) flag = true;\n if (flag) flagged.push(first + i);\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 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 let largestMean = 0, largestVariance = 0, sampleCount = 0, siteCount = 0;\n const counts = new Int32Array(geometry.buffer), relative = displayViewSpeedGpuRelativeBounds(setup.toneCurve);\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_OUTPUT_FLOATS;\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]!; varianceBound[i] = MARGIN * moments[o + 10]! + displayViewSpeedQuantizationBound(moments.subarray(o, o + 3), relative.mean, meanBound[i]!, pixels, step);\n largestMean = Math.max(largestMean, meanBound[i]!); largestVariance = Math.max(largestVariance, varianceBound[i]!);\n const nx = counts[rx * stride + 1]!;\n sampleCount += nx * ny; siteCount += (nx + 2) * (ny + 2);\n }\n }\n // Flagged display pixels: the reference's own pixel (a one-pixel region render is byte-identical to the whole view's pixel).\n const recomputed: number[] = [];\n if (input.recomputeFlagged !== false && flagged.length > 0) {\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 recomputed.push(i);\n }\n }\n const expectedValueBound: ImageKernelRelativeErrorBound = { kind: \"relative-to-reference\", relative: relative.mean, absolute: largestMean };\n const uncertain = flagged.length - recomputed.length;\n return { samples, expected, noiseStd, sampleCount, siteCount, detailPixelCount: pixelCount, uniformPixelCount: 0, ahdCorrectedPixelCount: 0, estimation: \"exact-area-mean\",\n execution: webGpuExecution(expectedValueBound, uncertain), expectedValueBound,\n varianceBound: { kind: \"relative-to-reference\", relative: relative.variance, absolute: largestVariance },\n expectedValueAbsoluteBound: meanBound, varianceAbsoluteBound: varianceBound,\n flaggedPixelIndices: Uint32Array.from(flagged), hostRecomputedPixelIndices: Uint32Array.from(recomputed) };\n}\n\n/** The pixel-aperture samples per axis and anti-aliasing spots a request may have for the kernel's offset table. */\nfunction offsetCount(request: DisplayViewGpuRequest): number { return request.boxSamples * request.boxSamples * (request.antiAliasing ? 4 : 1); }\n\n/**\n * Why the Speed renderer does not support a prepared request (`DisplayViewGpuRenderer.supports`), or true. It covers every\n * engine chart (the 2.0 presets through `display-view-chart-material-module.ts`; composites, the 2.3 elements, the sine star\n * and fixed-size charts through the composite module, #491) and declared `material-layers` scenes, never a caller scene\n * function, without AHD or diffraction, with the identity or Reinhard tone curve and at most 16 query offsets; whether a\n * view's footprints take the exact area mean, and whether the device passes the composite kernel's probe, is known only per\n * render (`displayViewSpeedGpuUnsupportedReason`, `createDisplayViewMaterialModules`).\n */\nexport function displayViewSpeedGpuSupports(request: DisplayViewGpuRequest): true | string {\n if (request.ahd) return \"AHD (the Quality demosaic) is not on the GPU\";\n if (request.diffraction) return \"diffraction (the Quality optics) is not on the GPU\";\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) > DISPLAY_VIEW_GPU_MAXIMUM_OFFSETS) return \"more than \" + DISPLAY_VIEW_GPU_MAXIMUM_OFFSETS + \" query offsets per site\";\n return true;\n}\n\n/** The bilinear RGGB demosaic kernels per phase (phaseY·2 + phaseX) and channel, as `bilinearPhaseProfiles` gives them, for the self-check. */\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 renderer's run-time self-check (`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, light squares at the white clip, the GPU against\n * `renderDisplayView` within the a-priori bounds, every flagged pixel recomputed.\n */\nexport const DISPLAY_VIEW_SPEED_CONFORMANCE_CASE: DisplayViewGpuConformanceCase = { id: \"display-view:speed:checkerboard-13x9\", async run(handle, signal): Promise<true | string> {\n // The handle is the engine's own runtime (the contract keeps WebGPU types out of the published declarations).\n const runtime = handle as WebGpuRuntime;\n const nativeWidth = 40, nativeHeight = 28, margin = 1, frameWidth = 38, frameHeight = 26, g = 2 / frameWidth, nodes = [450, 550, 650];\n const chart = resolvePortableChartScene({ scene: { preset: \"checkerboard\", squaresAcross: 6 }, aspect: frameHeight / frameWidth });\n const offsets = [[-0.25, -0.25], [0.25, -0.25], [-0.25, 0.25], [0.25, 0.25]].map(([x, y]) => ({ x: x!, y: y!, weight: 0.25 }));\n const signalInput: DisplayViewExpectedSignalInput = { nativeWidth, nativeHeight, outputWidth: frameWidth, wavelengthsNm: nodes,\n electronsPerRadiance: [Float64Array.of(9000, 30000, 4000), Float64Array.of(6000, 42000, 9000), Float64Array.of(30000, 9000, 3000)], offsets,\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 queryPoint: (x, y, o, out) => { out[0] = (x + 0.5 + offsets[o]!.x - nativeWidth / 2) * g; out[1] = -(y + 0.5 + offsets[o]!.y - nativeHeight / 2) * g; } };\n const readout = { perElectron: 1 / 60000, darkElectrons: 0.07, constantVariance: 1.5e-9 };\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: 2, bitDepth: 8, seed: 478, signal: createDisplayViewExpectedSignal(signalInput), readout: [readout, readout, readout], demosaic: bilinearKernels(),\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 gpu = await renderDisplayViewSpeedOnGpu(runtime, 1 << 20, { setup, signalInput, material: chartPresetMaterialModule(chart) }, abort, undefined,\n (label, code) => createComputePipeline(runtime, label, code, abort.signal));\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\n/**\n * The display view's Speed renderer on one runtime (#481's `DisplayViewGpuRenderer`): one pipeline cache per device, the\n * material modules of `createDisplayViewMaterialModules` (the preset module per resolved chart, the composite module with its\n * scene records uploaded once per scene). `render` renders the part's region (`setup.gpu` carries the expected signal's input\n * and the resolved scene; a setup without it, a caller scene, a coarse view, a frame the kernel does not cover or a device\n * that fails the composite probe throws `unsupported-on-backend`), and throws `aborted` and `device-lost` as the accelerator's\n * operations do. `dispose` releases the uploaded scene records.\n */\nexport function createDisplayViewSpeedGpuRenderer(runtime: WebGpuRuntime, options: { maximumBandBytes?: number; yieldControl?: YieldControl } = {}): DisplayViewGpuRenderer {\n const pipelines = new Map<string, Promise<GPUComputePipeline>>();\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 const modules = createDisplayViewMaterialModules(runtime, source);\n return {\n id: \"photivra-display-view-speed\",\n supports: displayViewSpeedGpuSupports,\n conformanceCases: [DISPLAY_VIEW_SPEED_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 material = await modules.moduleFor(setup.gpu, abort.signal);\n const result = await renderDisplayViewSpeedOnGpu(runtime, bandBytes, { setup, signalInput: setup.gpu.signalInput, material }, abort, options.yieldControl, source);\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(); }\n };\n}\n\n/** The factory `prepareDisplayView` creates the renderer with (one per device). */\nexport const displayViewSpeedGpuRendererFactory: DisplayViewGpuRendererFactory = (handle: DisplayViewGpuRuntimeHandle) => createDisplayViewSpeedGpuRenderer(handle as WebGpuRuntime);\n\n/**\n * Registers the Speed renderer as the display view's GPU renderer (`setDisplayViewGpuRendererFactory`) and returns the factory\n * registered before. Nothing registers it on import: the integration of #481 decides where the engine registers it.\n */\nexport function registerDisplayViewSpeedGpuRenderer(): DisplayViewGpuRendererFactory | null {\n return setDisplayViewGpuRendererFactory(displayViewSpeedGpuRendererFactory);\n}\n"]}
|
|
@@ -2,7 +2,7 @@ import { type NativeRawDevelopmentInput, type NativeRawDevelopmentOutput, type N
|
|
|
2
2
|
import type { SdrRenderingProfile } from "../output/sdr-rendering.js";
|
|
3
3
|
import { type NativeCaptureSdrInput, type NativeCaptureSdrOutput, type NativeCaptureSdrProvider } from "../output/native-capture-sdr.js";
|
|
4
4
|
import { type IrradianceConvolutionInput, type IrradianceConvolutionPlan } from "../optics/irradiance-convolution.js";
|
|
5
|
-
import { type ImageKernelBackend, type ImageKernelExecution, type ImageKernelFallbackReason, type ImageKernelRelativeErrorBound } from "./image-kernel-execution.js";
|
|
5
|
+
import { type ImageKernelAdapterDescription, type ImageKernelBackend, type ImageKernelExecution, type ImageKernelFallbackReason, type ImageKernelRelativeErrorBound } from "./image-kernel-execution.js";
|
|
6
6
|
import type { PackedSensorRawInput, PackedSensorRawResult } from "../capture/packed-sensor-raw.js";
|
|
7
7
|
import { type TemporalExposureSumInput, type TemporalExposureSumPlan } from "../motion/temporal-exposure-sum.js";
|
|
8
8
|
import type { ChartRadianceBatchInput, ChartRadianceBatchPlan } from "../facade/chart-radiance-batch.js";
|
|
@@ -33,9 +33,14 @@ export interface TemporalExposureSumResult {
|
|
|
33
33
|
execution: ImageKernelExecution;
|
|
34
34
|
}
|
|
35
35
|
export interface ImageKernelAcceleratorOptions {
|
|
36
|
-
/**
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
/**
|
|
37
|
+
* The one-boolean form. `true` is `backend: "webgpu-f32"` with `fallback: "cpu-reference"` unless `fallback` is given;
|
|
38
|
+
* `false` is `backend: "cpu-reference"`. Give `webgpu` or `backend`, not both.
|
|
39
|
+
*/
|
|
40
|
+
webgpu?: boolean;
|
|
41
|
+
/** Requested backend. `cpu-reference` is the reference and never touches WebGPU. Required unless `webgpu` is given. */
|
|
42
|
+
backend?: ImageKernelBackend;
|
|
43
|
+
/** Required with `backend: "webgpu-f32"`: use the CPU reference (labelled) or fail when WebGPU cannot be acquired. */
|
|
39
44
|
fallback?: "cpu-reference" | "fail";
|
|
40
45
|
/** WebGPU entry point; defaults to `navigator.gpu`. Supply a worker's `navigator.gpu` explicitly if needed. */
|
|
41
46
|
gpu?: unknown;
|
|
@@ -71,6 +76,8 @@ export interface ImageKernelAccelerator {
|
|
|
71
76
|
readonly backend: ImageKernelBackend;
|
|
72
77
|
readonly requestedBackend: ImageKernelBackend;
|
|
73
78
|
readonly fallbackReason: ImageKernelFallbackReason | null;
|
|
79
|
+
/** #481: the adapter of a `webgpu-f32` accelerator's device (null for `cpu-reference`, or when the browser gives no `GPUAdapter.info`). */
|
|
80
|
+
readonly adapter: ImageKernelAdapterDescription | null;
|
|
74
81
|
readonly state: ImageKernelAcceleratorState;
|
|
75
82
|
renderNativeCaptureSdr(input: NativeCaptureSdrInput, provider: NativeCaptureSdrProvider, options?: ImageKernelRunOptions): Promise<AcceleratedNativeCaptureSdrOutput>;
|
|
76
83
|
/** Takes ownership of `input.raw` exactly like `createNativeRawDevelopmentTask` (the caller's arrays are detached). */
|
|
@@ -86,6 +93,18 @@ export interface ImageKernelAccelerator {
|
|
|
86
93
|
}
|
|
87
94
|
/** Requests a backend. Never swaps backends silently: a fallback must be set in the options and is shown in every result label. */
|
|
88
95
|
export declare function createImageKernelAccelerator(options: ImageKernelAcceleratorOptions): Promise<ImageKernelAccelerator>;
|
|
96
|
+
/**
|
|
97
|
+
* Internal (#481, not exported from the package): the WebGPU runtime (`WebGpuRuntime`, typed `unknown` here so no WebGPU type reaches
|
|
98
|
+
* the published declarations) of an accelerator created by {@link createImageKernelAccelerator}, null for one on the CPU
|
|
99
|
+
* reference, or undefined when `value` is not such an accelerator.
|
|
100
|
+
*/
|
|
101
|
+
export declare function acceleratorRuntime(value: unknown): unknown;
|
|
102
|
+
/**
|
|
103
|
+
* Internal (#481, not exported from the package): runs the `webgpu-f32` convolution on a runtime (`WebGpuRuntime`, passed as
|
|
104
|
+
* `unknown` to keep WebGPU types out of the published declarations), for the display view's run-time conformance self-check.
|
|
105
|
+
* Pipelines are compiled per call; `signal` aborts the run.
|
|
106
|
+
*/
|
|
107
|
+
export declare function convolveIrradianceOnRuntime(runtime: unknown, input: IrradianceConvolutionInput, signal: AbortSignal | undefined): Promise<IrradianceConvolutionResult>;
|
|
89
108
|
/**
|
|
90
109
|
* A-priori float32 bound for every convolution output (all terms are non-negative):
|
|
91
110
|
* |v_f32 − v_ref| ≤ (γ_{T+3} + 2^-40)·v_ref + 2T·2^-126 + 2·S_max·Σ_t max_p w_{p,t}·[0 < w_{p,t} < 2^-126].
|
|
@@ -7,9 +7,11 @@
|
|
|
7
7
|
* Every result is labelled as a float32 approximation, with an error bound worked out in advance.
|
|
8
8
|
* A requested WebGPU backend falls back to the CPU only if the caller chose
|
|
9
9
|
* `fallback: "cpu-reference"`. The result label then names the backend that actually ran, and why.
|
|
10
|
-
*
|
|
10
|
+
* The simple form `{ webgpu: true | false }` chooses the backend with one boolean, and `setWebGpuEnabled(false)`
|
|
11
|
+
* (webgpu-switch.ts) keeps the whole realm on the CPU whatever callers ask. See docs/WEBGPU.md.
|
|
11
12
|
*/
|
|
12
13
|
import { InvalidConfigurationError } from "../core/configuration-error.js";
|
|
14
|
+
import { getWebGpuEnabled } from "./webgpu-switch.js";
|
|
13
15
|
import { InvalidScientificResultError } from "../core/validation.js";
|
|
14
16
|
import { requireAllowlistedRecord } from "../core/record-validation.js";
|
|
15
17
|
import { createHostYieldGate } from "../capture/host-yield-cadence.js";
|
|
@@ -26,6 +28,7 @@ import { simulateSensorRawOnCpu, simulateSensorRawOnGpu } from "./sensor-stage-g
|
|
|
26
28
|
import { calculateTemporalExposureSumPlan } from "../motion/temporal-exposure-sum.js";
|
|
27
29
|
import { sumTemporalExposureOnCpu, sumTemporalExposureOnGpu } from "./temporal-sum-gpu.js";
|
|
28
30
|
import { evaluateChartRadianceOnCpu, evaluateChartRadianceOnGpu } from "./chart-radiance-gpu.js";
|
|
31
|
+
import { ChartSceneUploads } from "./chart-composite-gpu.js";
|
|
29
32
|
const DEFAULT_BAND_BYTES = 64 * 1024 * 1024;
|
|
30
33
|
const MINIMUM_BAND_BYTES = 4096;
|
|
31
34
|
/** Limit on multiply-adds per convolution dispatch, to stay clear of the GPU watchdog timeout. */
|
|
@@ -59,23 +62,36 @@ function linkedAbort(signal) {
|
|
|
59
62
|
}
|
|
60
63
|
/** Requests a backend. Never swaps backends silently: a fallback must be set in the options and is shown in every result label. */
|
|
61
64
|
export async function createImageKernelAccelerator(options) {
|
|
62
|
-
const r = requireAllowlistedRecord(options, ["backend", "fallback", "gpu", "powerPreference", "maximumBandBytes", "signal"], "Invalid image-kernel accelerator options.");
|
|
63
|
-
if ((r.
|
|
64
|
-
|
|
65
|
-
|
|
65
|
+
const r = requireAllowlistedRecord(options, ["webgpu", "backend", "fallback", "gpu", "powerPreference", "maximumBandBytes", "signal"], "Invalid image-kernel accelerator options.");
|
|
66
|
+
if (r.webgpu !== undefined && (typeof r.webgpu !== "boolean" || r.backend !== undefined)) {
|
|
67
|
+
throw new InvalidConfigurationError("Invalid image-kernel accelerator options: webgpu must be a boolean, and excludes backend.");
|
|
68
|
+
}
|
|
69
|
+
// The boolean form resolves to the explicit form; everything below sees only backend and fallback.
|
|
70
|
+
const backend = r.webgpu === undefined ? r.backend : r.webgpu ? "webgpu-f32" : "cpu-reference";
|
|
71
|
+
const fallback = r.fallback ?? (r.webgpu === true ? "cpu-reference" : undefined);
|
|
72
|
+
if ((backend !== "cpu-reference" && backend !== "webgpu-f32") ||
|
|
73
|
+
(backend === "webgpu-f32" && fallback !== "cpu-reference" && fallback !== "fail") ||
|
|
74
|
+
(backend === "cpu-reference" && fallback !== undefined) ||
|
|
66
75
|
(r.powerPreference !== undefined && r.powerPreference !== "low-power" && r.powerPreference !== "high-performance") ||
|
|
67
76
|
(r.maximumBandBytes !== undefined && (typeof r.maximumBandBytes !== "number" || !Number.isSafeInteger(r.maximumBandBytes) ||
|
|
68
77
|
r.maximumBandBytes < MINIMUM_BAND_BYTES)) ||
|
|
69
78
|
(r.signal !== undefined && (typeof r.signal !== "object" || r.signal === null || typeof r.signal.aborted !== "boolean"))) {
|
|
70
79
|
throw new InvalidConfigurationError("Invalid image-kernel accelerator options: backend, explicit WebGPU fallback, power preference or band size.");
|
|
71
80
|
}
|
|
72
|
-
const requested =
|
|
81
|
+
const requested = backend;
|
|
73
82
|
if (requested === "cpu-reference")
|
|
74
83
|
return createAccelerator(requested, null, null, DEFAULT_BAND_BYTES);
|
|
84
|
+
if (!getWebGpuEnabled()) {
|
|
85
|
+
// The realm's switch (setWebGpuEnabled(false)) is honoured before any adapter is requested.
|
|
86
|
+
const message = "WebGPU is switched off in this realm (setWebGpuEnabled(false)).";
|
|
87
|
+
if (fallback === "fail")
|
|
88
|
+
throw new ImageKernelExecutionError("webgpu-disabled", message);
|
|
89
|
+
return createAccelerator(requested, "webgpu-disabled", null, DEFAULT_BAND_BYTES);
|
|
90
|
+
}
|
|
75
91
|
const gpu = "gpu" in r ? r.gpu : globalThis.navigator?.gpu;
|
|
76
92
|
const acquired = await acquireWebGpuRuntime(gpu, options.powerPreference, options.signal);
|
|
77
93
|
if ("failure" in acquired) {
|
|
78
|
-
if (
|
|
94
|
+
if (fallback === "fail")
|
|
79
95
|
throw new ImageKernelExecutionError(acquired.failure, acquired.message);
|
|
80
96
|
return createAccelerator(requested, acquired.failure, null, DEFAULT_BAND_BYTES);
|
|
81
97
|
}
|
|
@@ -83,9 +99,35 @@ export async function createImageKernelAccelerator(options) {
|
|
|
83
99
|
const band = Math.min(options.maximumBandBytes ?? DEFAULT_BAND_BYTES, runtime.maximumStorageBindingBytes);
|
|
84
100
|
return createAccelerator(requested, null, runtime, band);
|
|
85
101
|
}
|
|
102
|
+
/** The runtime behind each accelerator this module created (#481: a prepared display view shares an accelerator's device through it). */
|
|
103
|
+
const RUNTIMES = new WeakMap();
|
|
104
|
+
/**
|
|
105
|
+
* Internal (#481, not exported from the package): the WebGPU runtime (`WebGpuRuntime`, typed `unknown` here so no WebGPU type reaches
|
|
106
|
+
* the published declarations) of an accelerator created by {@link createImageKernelAccelerator}, null for one on the CPU
|
|
107
|
+
* reference, or undefined when `value` is not such an accelerator.
|
|
108
|
+
*/
|
|
109
|
+
export function acceleratorRuntime(value) {
|
|
110
|
+
return typeof value === "object" && value !== null ? RUNTIMES.get(value) : undefined;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Internal (#481, not exported from the package): runs the `webgpu-f32` convolution on a runtime (`WebGpuRuntime`, passed as
|
|
114
|
+
* `unknown` to keep WebGPU types out of the published declarations), for the display view's run-time conformance self-check.
|
|
115
|
+
* Pipelines are compiled per call; `signal` aborts the run.
|
|
116
|
+
*/
|
|
117
|
+
export async function convolveIrradianceOnRuntime(runtime, input, signal) {
|
|
118
|
+
const gpu = runtime, plan = calculateIrradianceConvolutionPlan(input), link = linkedAbort(signal);
|
|
119
|
+
try {
|
|
120
|
+
return await convolveOnGpu(gpu, 1 << 20, plan, input, link.controller, undefined, (label, code) => createComputePipeline(gpu, label, code, link.controller.signal));
|
|
121
|
+
}
|
|
122
|
+
finally {
|
|
123
|
+
link.dispose();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
86
126
|
function createAccelerator(requested, fallbackReason, runtime, bandBytes) {
|
|
87
127
|
let disposed = false, busy = false;
|
|
88
128
|
const pipelines = new Map();
|
|
129
|
+
// #477: a scene's chart records are uploaded once and reused by later calls (a prepared view's parts).
|
|
130
|
+
const chartUploads = runtime ? new ChartSceneUploads(runtime) : null;
|
|
89
131
|
const backend = runtime ? "webgpu-f32" : "cpu-reference";
|
|
90
132
|
function state() { return disposed ? "disposed" : runtime?.isLost() ? "lost" : "ready"; }
|
|
91
133
|
function pipeline(gpu, label, code, signal) {
|
|
@@ -126,8 +168,8 @@ function createAccelerator(requested, fallbackReason, runtime, bandBytes) {
|
|
|
126
168
|
}
|
|
127
169
|
}
|
|
128
170
|
const cpuLabel = () => cpuExecution(requested, fallbackReason);
|
|
129
|
-
|
|
130
|
-
backend, requestedBackend: requested, fallbackReason,
|
|
171
|
+
const accelerator = {
|
|
172
|
+
backend, requestedBackend: requested, fallbackReason, adapter: runtime?.adapter ?? null,
|
|
131
173
|
get state() { return state(); },
|
|
132
174
|
async renderNativeCaptureSdr(input, provider, options) {
|
|
133
175
|
const run = runOptions(options);
|
|
@@ -198,7 +240,10 @@ function createAccelerator(requested, fallbackReason, runtime, bandBytes) {
|
|
|
198
240
|
return operate(run.signal, async (abort) => {
|
|
199
241
|
if (!runtime)
|
|
200
242
|
return evaluateChartRadianceOnCpu(input, abort, run.yieldControl, cpuLabel());
|
|
201
|
-
|
|
243
|
+
// #477: the chart stage consults the realm's switch on every call; off, the reference runs and the label says so.
|
|
244
|
+
if (!getWebGpuEnabled())
|
|
245
|
+
return evaluateChartRadianceOnCpu(input, abort, run.yieldControl, cpuExecution(requested, "webgpu-disabled"));
|
|
246
|
+
return evaluateChartRadianceOnGpu(runtime, bandBytes, input, abort, run.yieldControl, (label, code) => pipeline(runtime, label, code, abort.signal), chartUploads);
|
|
202
247
|
});
|
|
203
248
|
},
|
|
204
249
|
dispose() {
|
|
@@ -206,9 +251,12 @@ function createAccelerator(requested, fallbackReason, runtime, bandBytes) {
|
|
|
206
251
|
return;
|
|
207
252
|
disposed = true;
|
|
208
253
|
pipelines.clear();
|
|
254
|
+
chartUploads?.release();
|
|
209
255
|
runtime?.destroy();
|
|
210
256
|
}
|
|
211
257
|
};
|
|
258
|
+
RUNTIMES.set(accelerator, runtime);
|
|
259
|
+
return accelerator;
|
|
212
260
|
}
|
|
213
261
|
function checkAbort(abort) {
|
|
214
262
|
if (abort.signal.aborted)
|