@photivra/engine 2.20.0 → 2.21.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 +178 -1
- package/CITATION.cff +1 -1
- package/README.md +7 -6
- package/SECURITY.md +1 -1
- package/THIRD_PARTY.md +7 -0
- package/dist/capture/dng-lens-correction-opcodes.d.ts +2 -2
- package/dist/capture/dng-lens-correction-opcodes.js +2 -2
- package/dist/capture/dng-lens-correction-opcodes.js.map +1 -1
- package/dist/capture/exposure-build-up-stage.d.ts +16 -0
- package/dist/capture/exposure-build-up-stage.js +4 -0
- package/dist/capture/exposure-build-up-stage.js.map +1 -0
- package/dist/capture/native-environment-lean.d.ts +2 -1
- package/dist/capture/native-environment-lean.js +41 -73
- package/dist/capture/native-environment-lean.js.map +1 -1
- package/dist/capture/native-environment-tabulated.js +4 -3
- package/dist/capture/native-environment-tabulated.js.map +1 -1
- package/dist/capture/native-raw.d.ts +3 -2
- package/dist/capture/native-raw.js +5 -4
- package/dist/capture/native-raw.js.map +1 -1
- package/dist/capture/sensor-raw-producer.d.ts +4 -1
- package/dist/capture/sensor-raw-producer.js +12 -3
- package/dist/capture/sensor-raw-producer.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/equipment/generic-lens-catalogue.d.ts +3 -2
- package/dist/equipment/generic-lens-catalogue.js +18 -5
- package/dist/equipment/generic-lens-catalogue.js.map +1 -1
- package/dist/equipment/generic-tier-assets.d.ts +32 -0
- package/dist/equipment/generic-tier-assets.js +16 -11
- package/dist/equipment/generic-tier-assets.js.map +1 -1
- package/dist/equipment/sensor-profile-body.d.ts +78 -0
- package/dist/equipment/sensor-profile-body.js +77 -0
- package/dist/equipment/sensor-profile-body.js.map +1 -0
- package/dist/equipment/sensor-profiles.d.ts +8 -0
- package/dist/equipment/sensor-profiles.js +82 -0
- package/dist/equipment/sensor-profiles.js.map +1 -0
- package/dist/facade/catalogue-lens-signal.d.ts +2 -2
- package/dist/facade/catalogue-lens-signal.js +58 -71
- package/dist/facade/catalogue-lens-signal.js.map +1 -1
- package/dist/facade/chart-radiance-batch.js +2 -1
- package/dist/facade/chart-radiance-batch.js.map +1 -1
- package/dist/facade/defocus-image-space-provider.d.ts +7 -0
- package/dist/facade/defocus-image-space-provider.js +64 -76
- package/dist/facade/defocus-image-space-provider.js.map +1 -1
- package/dist/facade/display-view-gpu-session.js +2 -0
- package/dist/facade/display-view-gpu-session.js.map +1 -1
- package/dist/facade/display-view-gpu.d.ts +6 -1
- package/dist/facade/display-view-gpu.js.map +1 -1
- package/dist/facade/display-view-lens-signal.js +25 -23
- package/dist/facade/display-view-lens-signal.js.map +1 -1
- package/dist/facade/display-view.js +5 -23
- package/dist/facade/display-view.js.map +1 -1
- package/dist/facade/expected-signal-setup.d.ts +3 -1
- package/dist/facade/expected-signal-setup.js +1 -1
- package/dist/facade/expected-signal-setup.js.map +1 -1
- package/dist/facade/expected-signal.d.ts +47 -14
- package/dist/facade/expected-signal.js +117 -112
- package/dist/facade/expected-signal.js.map +1 -1
- package/dist/facade/exposure-build-up.d.ts +70 -0
- package/dist/facade/exposure-build-up.js +164 -0
- package/dist/facade/exposure-build-up.js.map +1 -0
- package/dist/facade/fast-methods.js +9 -1
- package/dist/facade/fast-methods.js.map +1 -1
- package/dist/facade/generic-lens-capture.d.ts +2 -2
- package/dist/facade/generic-lens-capture.js +2 -2
- package/dist/facade/generic-lens-capture.js.map +1 -1
- package/dist/facade/image-plane-enable.d.ts +7 -0
- package/dist/facade/image-plane-enable.js +17 -0
- package/dist/facade/image-plane-enable.js.map +1 -0
- package/dist/facade/image-plane-lattice-data.d.ts +6 -0
- package/dist/facade/image-plane-lattice-data.js +10 -0
- package/dist/facade/image-plane-lattice-data.js.map +1 -0
- package/dist/facade/image-plane-support.d.ts +33 -0
- package/dist/facade/image-plane-support.js +11 -0
- package/dist/facade/image-plane-support.js.map +1 -0
- package/dist/facade/image-plane.d.ts +36 -0
- package/dist/facade/image-plane.js +353 -0
- package/dist/facade/image-plane.js.map +1 -0
- package/dist/facade/mixed-illumination.d.ts +108 -0
- package/dist/facade/mixed-illumination.js +174 -0
- package/dist/facade/mixed-illumination.js.map +1 -0
- package/dist/facade/representative-light-sources.d.ts +72 -0
- package/dist/facade/representative-light-sources.js +124 -0
- package/dist/facade/representative-light-sources.js.map +1 -0
- package/dist/facade/scene-radiance.d.ts +129 -4
- package/dist/facade/scene-radiance.js +48 -13
- package/dist/facade/scene-radiance.js.map +1 -1
- package/dist/facade/simulate-capture.d.ts +39 -10
- package/dist/facade/simulate-capture.js +252 -92
- package/dist/facade/simulate-capture.js.map +1 -1
- package/dist/facade/simulate-display-view.js +14 -6
- package/dist/facade/simulate-display-view.js.map +1 -1
- package/dist/gpu/chart-composite-gpu.d.ts +13 -1
- package/dist/gpu/chart-composite-gpu.js +48 -9
- package/dist/gpu/chart-composite-gpu.js.map +1 -1
- package/dist/gpu/chart-radiance-gpu.js +4 -30
- package/dist/gpu/chart-radiance-gpu.js.map +1 -1
- package/dist/gpu/display-view-composite-material-module.d.ts +10 -4
- package/dist/gpu/display-view-composite-material-module.js +39 -13
- package/dist/gpu/display-view-composite-material-module.js.map +1 -1
- package/dist/gpu/display-view-image-material-module.d.ts +86 -0
- package/dist/gpu/display-view-image-material-module.js +339 -0
- package/dist/gpu/display-view-image-material-module.js.map +1 -0
- package/dist/gpu/display-view-image-quality.d.ts +45 -0
- package/dist/gpu/display-view-image-quality.js +380 -0
- package/dist/gpu/display-view-image-quality.js.map +1 -0
- package/dist/gpu/display-view-quality-gpu.d.ts +67 -1
- package/dist/gpu/display-view-quality-gpu.js +136 -205
- package/dist/gpu/display-view-quality-gpu.js.map +1 -1
- package/dist/gpu/display-view-speed-gpu.d.ts +51 -3
- package/dist/gpu/display-view-speed-gpu.js +131 -93
- package/dist/gpu/display-view-speed-gpu.js.map +1 -1
- package/dist/gpu/wgsl-display-view-quality-kernel.d.ts +29 -15
- package/dist/gpu/wgsl-display-view-quality-kernel.js +58 -36
- package/dist/gpu/wgsl-display-view-quality-kernel.js.map +1 -1
- package/dist/gpu/wgsl-display-view-speed-kernel.d.ts +21 -6
- package/dist/gpu/wgsl-display-view-speed-kernel.js +46 -11
- package/dist/gpu/wgsl-display-view-speed-kernel.js.map +1 -1
- package/dist/gpu/wgsl-exact-sum.d.ts +20 -0
- package/dist/gpu/wgsl-exact-sum.js +42 -0
- package/dist/gpu/wgsl-exact-sum.js.map +1 -0
- package/dist/index.d.ts +11 -3
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/motion/subject-motion.d.ts +66 -0
- package/dist/motion/subject-motion.js +52 -0
- package/dist/motion/subject-motion.js.map +1 -0
- package/dist/optics/generic-lens-lateral-color.d.ts +83 -0
- package/dist/optics/generic-lens-lateral-color.js +77 -0
- package/dist/optics/generic-lens-lateral-color.js.map +1 -0
- package/dist/optics/generic-lens-psf.js +54 -46
- package/dist/optics/generic-lens-psf.js.map +1 -1
- package/dist/optics/lens-psf-profile.d.ts +7 -0
- package/dist/optics/lens-psf-profile.js +2 -1
- package/dist/optics/lens-psf-profile.js.map +1 -1
- package/dist/output/developed-lens-corrections.d.ts +19 -5
- package/dist/output/developed-lens-corrections.js +28 -9
- package/dist/output/developed-lens-corrections.js.map +1 -1
- package/dist/output/generic-lens-corrections.d.ts +41 -5
- package/dist/output/generic-lens-corrections.js +52 -8
- package/dist/output/generic-lens-corrections.js.map +1 -1
- package/dist/output/print-plan.d.ts +41 -5
- package/dist/output/print-plan.js +59 -14
- package/dist/output/print-plan.js.map +1 -1
- package/dist/sensor/binomial-sample.d.ts +3 -0
- package/dist/sensor/binomial-sample.js +86 -0
- package/dist/sensor/binomial-sample.js.map +1 -0
- package/dist/sensor/sensor-characteristics.d.ts +10 -0
- package/dist/sensor/sensor-characteristics.js +20 -9
- package/dist/sensor/sensor-characteristics.js.map +1 -1
- package/docs/AGENT_GUIDE.md +1 -0
- package/docs/API_REFERENCE.md +98 -1
- package/docs/QUICK_START.md +125 -0
- package/docs/USAGE.md +92 -1
- package/docs/api/core-version.md +1 -1
- package/docs/api/equipment-generic-lens-catalogue.md +10 -5
- package/docs/api/equipment-sensor-profile-body.md +64 -0
- package/docs/api/equipment-sensor-profiles.md +86 -0
- package/docs/api/exports.json +207 -2
- package/docs/api/facade-exposure-build-up.md +105 -0
- package/docs/api/facade-fast-methods.md +9 -1
- package/docs/api/facade-image-plane-enable.md +16 -0
- package/docs/api/facade-mixed-illumination.md +67 -0
- package/docs/api/facade-representative-light-sources.md +131 -0
- package/docs/api/facade-scene-radiance.md +54 -3
- package/docs/api/facade-simulate-capture.md +26 -6
- package/docs/api/motion-subject-motion.md +23 -0
- package/docs/api/optics-generic-lens-lateral-color.md +79 -0
- package/docs/api/output-developed-lens-corrections.md +10 -1
- package/docs/api/output-generic-lens-corrections.md +40 -4
- package/docs/api/output-print-plan.md +35 -1
- package/llms.txt +2 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-composite-gpu.js","sourceRoot":"","sources":["../../src/gpu/chart-composite-gpu.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Host side of the composite-chart radiance kernel (#477, wgsl-chart-composite-kernel.ts): packs a resolved\n * chart's geometry (`chartGeometry`) and a declared scene's mask layers into the kernel's record arrays,\n * keeps the packed records and their GPU buffers per scene so a prepared view uploads them once, probes the\n * device's double-float32 arithmetic, dispatches in bands, and recomputes flagged points with the float64\n * reference. Internal; the public entry point is `ImageKernelAccelerator.evaluateChartRadiance`.\n */\nimport { createHostYieldGate } from \"../capture/host-yield-cadence.js\";\nimport type { ChartRadianceBatchPlan } from \"../facade/chart-radiance-batch.js\";\nimport { chartGeometry, type ChartGeometry, type ResolvedChartScene } from \"../facade/chart-scenes.js\";\nimport type { ResolvedChartMaskLayer } from \"../facade/chart-material-layers.js\";\nimport { ImageKernelExecutionError, webGpuExecution, type ChartCompositeProbeComponent, type ChartCompositeProbeMismatch, type ChartCompositeProbeRecord,\n type ImageKernelExecution } from \"./image-kernel-execution.js\";\nimport type { ChartRadianceResult } from \"./image-kernel-accelerator.js\";\nimport { BUFFER_USAGE, GpuResourceScope, linearDispatch, runComputePass, type WebGpuRuntime, throwIfAborted as checkAbort } from \"./webgpu-runtime.js\";\nimport { CHART_COMPOSITE_PROBE_LABEL, CHART_COMPOSITE_PROBE_OUTPUTS, CHART_COMPOSITE_PROBE_WGSL, CHART_COMPOSITE_WORKGROUP_SIZE, CHART_ELEMENT_KIND,\n CHART_PLACEMENT, CHART_RECORD_STRIDE, chartCompositeLabel, chartCompositeWgsl } from \"./wgsl-chart-composite-kernel.js\";\n\ntype PipelineSource = (label: string, code: string) => Promise<GPUComputePipeline>;\ntype YieldControl = ((signal: AbortSignal) => Promise<void>) | undefined;\n\nconst f = Math.fround;\nconst FLOAT32_SAFE_MAGNITUDE = 2 ** 120;\n/** Frame-unit magnitude limit for GPU points (shared with the preset kernel). */\nconst MAXIMUM_COORDINATE = 2 ** 20;\n/** The rough angle's allowance when the star's sector window is sized: the WGSL atan2 bound (4096 ULP, about 2^-10 rad) with a 4× margin. */\nconst STAR_ANGLE_ALLOWANCE = 2 ** -8;\n\n// --- double-float32 in JavaScript (Math.fround after every operation): the probe's expected values and the test emulation ---\nexport type Dw = readonly [hi: number, lo: number];\nexport function dwSplit(x: number): Dw { const hi = f(x), lo = f(x - hi); return [hi, lo]; }\nexport function twoSum(a: number, b: number): Dw { const s = f(a + b), bb = f(s - a); return [s, f(f(a - f(s - bb)) + f(b - bb))]; }\nexport function quickTwoSum(a: number, b: number): Dw { const s = f(a + b); return [s, f(b - f(s - a))]; }\nfunction veltkamp(a: number): Dw { const t = f(4097 * a), h = f(t - f(t - a)); return [h, f(a - h)]; }\nexport function twoProd(a: number, b: number): Dw {\n const p = f(a * b), [ah, al] = veltkamp(a), [bh, bl] = veltkamp(b);\n const e = f(f(f(f(f(ah * bh) - p) + f(ah * bl)) + f(al * bh)) + f(al * bl));\n return [p, e];\n}\nexport function dwAdd(a: Dw, b: Dw): Dw {\n const s = twoSum(a[0], b[0]), t = twoSum(a[1], b[1]);\n const c = f(s[1] + t[0]), v = quickTwoSum(s[0], c);\n const w = f(v[1] + t[1]);\n return quickTwoSum(v[0], w);\n}\nexport function dwSub(a: Dw, b: Dw): Dw { return dwAdd(a, [-b[0], -b[1]]); }\nexport function dwMul(a: Dw, b: Dw): Dw {\n const p = twoProd(a[0], b[0]), t = f(f(a[0] * b[1]) + f(a[1] * b[0])), l = f(p[1] + t);\n return quickTwoSum(p[0], l);\n}\n\n/**\n * fma on float32 operands with one rounding to nearest (ties to even), as a fused `fma` evaluates it: the product of two float32\n * values is exact in float64 (48 significant bits), the float64 TwoSum gives the sum's exact error, and the one case where rounding\n * the float64 sum to float32 differs from rounding the exact sum (the float64 sum lands on a float32 midpoint) is resolved by the error's sign.\n */\nexport function fmaF32(a: number, b: number, c: number): number {\n const p = a * b, s = p + c, bb = s - p, e = (p - (s - bb)) + (c - bb), r = f(s);\n if (e === 0 || r === s || !Number.isFinite(r)) return r;\n const other = nextFloat32(r, s > r ? 1 : -1);\n if (Math.abs(s - r) !== Math.abs(other - s)) return r;\n return (e > 0) === (other > r) ? other : r;\n}\nconst bits32 = new Float32Array(1), int32 = new Int32Array(bits32.buffer);\n/** The float32 neighbour of a finite float32 x toward +∞ (direction 1) or −∞ (−1). */\nfunction nextFloat32(x: number, direction: 1 | -1): number {\n if (x === 0) return direction * 2 ** -149;\n bits32[0] = x;\n int32[0] = int32[0]! + ((x > 0) === (direction > 0) ? 1 : -1);\n return bits32[0]!;\n}\n/** The fma TwoProduct: p = fl(a·b) and its exact error fma(a, b, −p) (exact for a fused fma; Joldes, Muller & Popescu 2017, Algorithm 2). */\nexport function twoProdFma(a: number, b: number): Dw { const p = f(a * b); return [p, fmaF32(a, b, -p)]; }\n/** The cross-term sum t = a.h·b.l + a.l·b.h of a double-word product: unfused (the default), or with one of the two products fused into the addition. */\nexport function dwCrossTerm(a: Dw, b: Dw, contraction: \"none\" | \"first\" | \"second\" = \"none\"): number {\n if (contraction === \"first\") return fmaF32(a[0], b[1], f(a[1] * b[0]));\n if (contraction === \"second\") return fmaF32(a[1], b[0], f(a[0] * b[1]));\n return f(f(a[0] * b[1]) + f(a[1] * b[0]));\n}\n/**\n * The fma path's double-word product (`d_mul_fma`): s = fma(a.h, b.h, t), lo = fl(fma(a.h, b.h, −s) + t), with t the cross-term\n * sum. No rounded product is an operand of an addition, so a contraction cannot change it; see docs/WEBGPU.md for its error bound.\n */\nexport function dwMulFma(a: Dw, b: Dw, t: number = dwCrossTerm(a, b)): Dw {\n const s = fmaF32(a[0], b[0], t);\n return [s, f(fmaF32(a[0], b[0], -s) + t)];\n}\n/** The Dekker path's double-word product with a given cross-term sum (`dwMul` is it with the unfused one). */\nexport function dwMulDekker(a: Dw, b: Dw, t: number = dwCrossTerm(a, b)): Dw {\n const p = twoProd(a[0], b[0]), l = f(p[1] + t);\n return quickTwoSum(p[0], l);\n}\n\n/**\n * Probe inputs (x, y, z, w): pairs whose TwoSum and TwoProduct low parts are non-zero, double words to add and multiply, and sums and\n * products that a directed (truncating or upward) rounding would place on the other neighbour than round-to-nearest: 1 + 3·2^-26\n * rounds up to 1 + 2^-23 (nearest) but down to 1 (truncation); −1 − 3·2^-26 the mirror; 1.25 · (1 + 2^-23) likewise. The last four\n * (2.11.0, the M5 Pro finding) are normalized double words whose products have non-zero TwoProduct errors on both operand pairs, so\n * a contraction of the Dekker path's final Fast2Sum (which then adds the product's error twice) shows in the double-word product.\n */\nexport const PROBE_INPUTS: readonly (readonly [number, number, number, number])[] = /* @__PURE__ */ Object.freeze([\n [1, 2 ** -30, 1.5, 2 ** -29], [3.7, 1e-8, -2.25, 3e-9], [0.1, 0.7, 12345.678, -0.0001], [1e6, 1e-3, 1e-6, 1e-9], [-5.5, 2 ** -26, 7, -(2 ** -27)],\n [0.3333333, 0.6666667, 1.0000001, 0.99999994], [1024.5, 1e-5, 0.0078125, 3e-10], [2.5e-3, 4.1e-11, 999.75, 2 ** -40],\n [1, 3 * 2 ** -26, 1.25, 1 + 2 ** -23], [-1, -3 * 2 ** -26, -1.25, 1 + 2 ** -23], [1 + 2 ** -23, 1.25, 1, 5 * 2 ** -26], [0.75, 2 ** -25 + 2 ** -27, 3, 2 ** -24 + 2 ** -26],\n [1.1, 2.2e-9, 1.3, -3.1e-9], [0.7071068, -1.2e-8, 0.7071067, 2.9e-8], [123.456, 3.3e-6, -0.0123, 4.4e-10], [3.14159274, -8.7422777e-8, 2.7182817, 8.2e-8]\n]);\n/** The components of the probe in output order (see `CHART_COMPOSITE_PROBE_WGSL`). */\nexport const PROBE_COMPONENTS: readonly ChartCompositeProbeComponent[] = /* @__PURE__ */ Object.freeze([\"two-sum\", \"two-product\", \"double-word-add\", \"double-word-multiply\", \"fma-two-product\", \"fma-double-word-multiply\"]);\n/**\n * The probe's output per input on a device that evaluates as written, round to nearest, unfused, with a fused `fma`, in the shader's\n * order: [TwoSum lo, Dekker TwoProduct lo, double-word sum lo, fma TwoProduct lo, Dekker product hi, lo, fma product hi, lo].\n */\nexport function probeExpectation(input: readonly [number, number, number, number]): [number, number, number, number, number, number, number, number] {\n const [x, y, z, w] = input.map(f) as [number, number, number, number];\n const q = dwMulDekker([x, y], [z, w]), qf = dwMulFma([x, y], [z, w]);\n return [twoSum(x, y)[1], twoProd(x, y)[1], dwAdd([x, y], [z, w])[1], twoProdFma(x, y)[1], q[0], q[1], qf[0], qf[1]];\n}\nconst hex32 = (x: number): string => { bits32[0] = x; return \"0x\" + (int32[0]! >>> 0).toString(16).padStart(8, \"0\"); };\n\n/**\n * Classifies the probe's output (`CHART_COMPOSITE_PROBE_OUTPUTS` floats per input of `PROBE_INPUTS`). TwoSum, both TwoProducts and the\n * double-word sum must equal their exact values bit for bit (each is error-free, or a fixed sequence of roundings to nearest); a\n * double-word product must equal the written-order evaluation for the unfused cross-term sum t = a.h·b.l + a.l·b.h or for either\n * product of t fused into its addition (a contraction WGSL permits, \"Reassociation and Fusion\", and harmless there: t is an ordinary\n * bounded sum). Anything else is a mismatch, recorded with the float32 bits.\n */\nexport function classifyChartCompositeProbe(got: Float32Array): ChartCompositeProbeRecord {\n const counts = Object.fromEntries(PROBE_COMPONENTS.map((c) => [c, 0])) as Record<ChartCompositeProbeComponent, number>;\n const inputs = Object.fromEntries(PROBE_COMPONENTS.map((c) => [c, [] as number[]])) as Record<ChartCompositeProbeComponent, number[]>;\n const mismatches: ChartCompositeProbeMismatch[] = [];\n let nonFinite = false, sumZero = true;\n const miss = (component: ChartCompositeProbeComponent, input: number, g: number, want: number): void => {\n counts[component]++;\n inputs[component].push(input);\n if (!Number.isFinite(g)) nonFinite = true;\n if ((component === \"two-sum\" || component === \"double-word-add\") && g !== 0) sumZero = false;\n if (mismatches.length < 8) mismatches.push({ component, input, got: hex32(g), want: hex32(want) });\n };\n PROBE_INPUTS.forEach((row, i) => {\n const [x, y, z, w] = row.map(f) as [number, number, number, number], o = got.subarray(8 * i, 8 * i + 8), want = probeExpectation(row);\n for (const [k, component] of [[0, \"two-sum\"], [1, \"two-product\"], [2, \"double-word-add\"]] as const) if (!Object.is(o[k], want[k])) miss(component, i, o[k]!, want[k]);\n const products = (mul: (a: Dw, b: Dw, t: number) => Dw, h: number, l: number, component: ChartCompositeProbeComponent): void => {\n const candidates = ([\"none\", \"first\", \"second\"] as const).map((c) => mul([x, y], [z, w], dwCrossTerm([x, y], [z, w], c)));\n if (!candidates.some((c) => Object.is(c[0], h) && Object.is(c[1], l))) miss(component, i, Object.is(candidates[0]![0], h) ? l : h, Object.is(candidates[0]![0], h) ? candidates[0]![1] : candidates[0]![0]);\n };\n products(dwMulDekker, o[4]!, o[5]!, \"double-word-multiply\");\n if (!Object.is(o[3], want[3])) miss(\"fma-two-product\", i, o[3]!, want[3]);\n products(dwMulFma, o[6]!, o[7]!, \"fma-double-word-multiply\");\n });\n mismatches.sort((a, b) => PROBE_COMPONENTS.indexOf(a.component) - PROBE_COMPONENTS.indexOf(b.component) || a.input - b.input);\n const sums = counts[\"two-sum\"] + counts[\"double-word-add\"], dekker = counts[\"two-product\"] + counts[\"double-word-multiply\"];\n const fma = counts[\"fma-two-product\"] + counts[\"fma-double-word-multiply\"];\n const deviceClass: ChartCompositeProbeRecord[\"deviceClass\"] = nonFinite ? \"other\" : sums > 0 ? (sumZero ? \"reassociated\" : \"other\") : dekker > 0 ? \"contracted\" : \"exact\";\n const productPath = sums > 0 || nonFinite ? null : dekker === 0 ? \"dekker\" : fma === 0 ? \"fma\" : null;\n return Object.freeze({ deviceClass, productPath, fmaFused: counts[\"fma-two-product\"] === 0, inputs: PROBE_INPUTS.length, mismatchCounts: Object.freeze(counts),\n mismatchedInputs: Object.freeze(Object.fromEntries(PROBE_COMPONENTS.map((c) => [c, Object.freeze(inputs[c])])) as Record<ChartCompositeProbeComponent, readonly number[]>),\n mismatches: Object.freeze(mismatches.map((m) => Object.freeze(m))) });\n}\n\n/** The components' names in a log line, with the probe output they are (s.l, m.l, a.l, q of the probe before 2.11.0; mf.l, qf of the fma path). */\nconst COMPONENT_NAMES: Record<ChartCompositeProbeComponent, string> = { \"two-sum\": \"TwoSum (s.l)\", \"two-product\": \"TwoProduct (m.l)\", \"double-word-add\": \"double-word add (a.l)\",\n \"double-word-multiply\": \"double-word multiply (q)\", \"fma-two-product\": \"fma TwoProduct (mf.l)\", \"fma-double-word-multiply\": \"fma double-word multiply (qf)\" };\n/**\n * One log line for a probe record: the class, the chosen path, each differing component with its count and the probe input\n * indices that differ, and the first difference with its float32 bits.\n */\nexport function describeChartCompositeProbe(probe: ChartCompositeProbeRecord): string {\n const differing = PROBE_COMPONENTS.filter((c) => probe.mismatchCounts[c] > 0).map((c) => COMPONENT_NAMES[c] + \" ×\" + probe.mismatchCounts[c] + \" [\" + probe.mismatchedInputs[c].join(\",\") + \"]\");\n const first = probe.mismatches[0];\n return \"class \" + probe.deviceClass + \", product path \" + (probe.productPath ?? \"none\") + \", fma \" + (probe.fmaFused ? \"fused\" : \"not fused\") +\n (differing.length ? \"; differing of \" + probe.inputs + \" inputs: \" + differing.join(\", \") : \"\") +\n (first ? \"; first: \" + COMPONENT_NAMES[first.component] + \" input \" + first.input + \" got \" + first.got + \" want \" + first.want : \"\");\n}\n\n/** The probe's refusal: `unsupported-on-backend` with the probe record (`probe`) for the execution diagnostics. */\nexport class ChartCompositeProbeError extends ImageKernelExecutionError {\n constructor(readonly probe: ChartCompositeProbeRecord) {\n super(\"unsupported-on-backend\", \"This device does not evaluate the composite chart kernel's double-float32 arithmetic as written (\" + describeChartCompositeProbe(probe) +\n \"); use cpu-reference for composite charts, 2.3 elements and material-layers scenes.\");\n }\n}\n\n/** Packed records of one scene: the kernel's float and integer arrays and its material count. */\nexport interface PackedChartScene { af: Float32Array<ArrayBuffer>; ai: Uint32Array<ArrayBuffer>; materials: number; elementCount: number; layerCount: number }\n\nclass Packer {\n readonly af: number[] = [];\n readonly ai: number[] = [];\n floats(values: readonly number[]): number { const at = this.af.length; for (const x of values) this.af.push(x); return at; }\n ints(values: readonly number[]): number { const at = this.ai.length; for (const x of values) this.ai.push(x); return at; }\n reserveInts(count: number): number { const at = this.ai.length; for (let i = 0; i < count; i++) this.ai.push(0); return at; }\n}\n\n/** Sector boundary table of a Siemens star (bar or sine profile): directions, per-sector levels from the reference, bucket index and search window. */\nexport function starSectorTable(chart: ResolvedChartScene, g: Extract<ChartGeometry, { kind: \"siemens-star\" }>):\n { thetas: Float64Array; levels: Uint32Array; buckets: Uint32Array; window: number } {\n const set = new Set<number>(), normalize = (t: number): number => { let x = t; while (x <= -Math.PI) x += 2 * Math.PI; while (x > Math.PI) x -= 2 * Math.PI; return x; };\n if (g.profile === \"bar\") {\n for (let k = 1; k <= 2 * g.cycles; k++) set.add(normalize(Math.PI * (k / g.cycles - 1)));\n } else {\n for (let L = 1; L < 1024; L++) {\n const a = Math.asin(L / 512 - 1);\n for (let m = 0; m < g.cycles; m++) { set.add(normalize((a + 2 * Math.PI * m) / g.cycles - Math.PI)); set.add(normalize((Math.PI - a + 2 * Math.PI * m) / g.cycles - Math.PI)); }\n }\n }\n const thetas = Float64Array.from(set).sort(), n = thetas.length, rho = g.r / 2;\n const levels = new Uint32Array(n);\n for (let k = 0; k < n; k++) {\n const next = k + 1 < n ? thetas[k + 1]! : thetas[0]! + 2 * Math.PI, mid = (thetas[k]! + next) / 2;\n levels[k] = chart.materialAt(rho * Math.cos(mid), rho * Math.sin(mid));\n }\n const buckets = new Uint32Array(n);\n for (let j = 0; j < n; j++) {\n const start = -Math.PI + 2 * Math.PI * j / n;\n let lo = 0, hi = n;\n while (lo < hi) { const mid = (lo + hi) >> 1; if (thetas[mid]! >= start) hi = mid; else lo = mid + 1; }\n buckets[j] = lo;\n }\n // The window: the most boundaries any angular interval of the allowance (plus two buckets) can hold, capped so the window spans under a half turn.\n const reach = STAR_ANGLE_ALLOWANCE + 4 * Math.PI / n;\n let window = 1;\n for (let k = 0; k < n; k++) {\n let count = 0;\n for (let i = 1; i <= n; i++) { const t = k + i < n ? thetas[k + i]! : thetas[(k + i) % n]! + 2 * Math.PI; if (t - thetas[k]! <= 2 * reach) count++; else break; }\n window = Math.max(window, count + 1);\n }\n window = Math.min(window, Math.max(0, Math.floor(n / 4) - 1));\n return { thetas, levels, buckets, window };\n}\n\nfunction packElement(p: Packer, chart: ResolvedChartScene, offset: number, header: number, placement: { mode: number; cu: number; cv: number; hw: number; hh: number; scale: number }): void {\n const g = chartGeometry(chart);\n const [cuH, cuL] = dwSplit(placement.cu), [cvH, cvL] = dwSplit(placement.cv), [sH, sL] = dwSplit(placement.scale);\n const foff = p.floats([cuH, cuL, cvH, cvL, placement.hw, placement.hh, sH, sL, 0, 0]);\n const kindName = g.kind === \"composite\" ? null : g.kind;\n if (kindName === null) throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"A composite cannot be a composite element.\");\n const kind = CHART_ELEMENT_KIND[kindName];\n let ioff = 0;\n switch (g.kind) {\n case \"uniform\": break;\n case \"slanted-edge\": p.floats([g.c, g.s]); break;\n case \"siemens-star\": {\n const table = starSectorTable(chart, g), n = table.thetas.length;\n const dirs: number[] = [];\n for (let k = 0; k < n; k++) { const t = table.thetas[k]!, c = dwSplit(Math.cos(t)), s = dwSplit(Math.sin(t)); dirs.push(c[0], c[1], s[0], s[1]); }\n p.floats([g.r * g.r]);\n const dirsOff = p.floats(dirs), levelsOff = p.ints(Array.from(table.levels)), bucketsOff = p.ints(Array.from(table.buckets));\n ioff = p.ints([n, dirsOff, levelsOff, bucketsOff, n, table.window, chart.materials.length - 1]);\n break;\n }\n case \"step-wedge\": ioff = p.ints([g.steps]); break;\n case \"checkerboard\": p.floats([g.size, chart.aspect]); break;\n case \"point-grid\": {\n p.floats([g.cellW, g.cellH, chart.aspect, g.radius * g.radius]);\n const centers = p.floats(g.centers.flatMap((c) => [c.u, c.v]));\n ioff = p.ints([g.columns, g.rows, centers]);\n break;\n }\n case \"patches\": p.floats([g.cellW, g.cellH, chart.aspect, g.gap / 2, 1 - g.gap / 2]); ioff = p.ints([g.columns, g.rows, g.count, g.backgroundIndex]); break;\n case \"dead-leaves\": {\n p.floats([g.u0, g.v0, g.cell]);\n const cells = g.nx * g.ny, csr = p.reserveInts(cells + 1), entries: number[] = [];\n for (let c = 0; c < cells; c++) {\n p.ai[csr + c] = entries.length;\n for (let e = g.head[c]!; e >= 0; e = g.next[e]!) entries.push(g.entryDisk[e]!);\n }\n p.ai[csr + cells] = entries.length;\n const entriesOff = p.ints(entries), disks: number[] = [];\n for (let d = 0; d < g.diskCount; d++) disks.push(g.X[d]!, g.Y[d]!, g.R2[d]!, g.level[d]!);\n const disksOff = p.floats(disks);\n ioff = p.ints([g.nx, g.ny, csr, entriesOff, disksOff, g.mean]);\n break;\n }\n case \"bar-groups\": {\n const digits: number[] = [], rows: number[] = [];\n for (const group of g.groups) {\n const b = group.verticalBars, h = group.horizontalBars, label = group.label;\n let digitIndex = 0;\n if (label) { digitIndex = digits.length; digits.push(label.text.length, ...Array.from(label.text, (ch) => ch.charCodeAt(0) - 48)); }\n rows.push(group.cell.u0, group.cell.u1, b.u0, b.v0, b.u1, b.v1, h.u0, h.v0, h.u1, h.v1, group.lineWidth, label ? 1 : 0,\n label?.u0 ?? 0, label?.v0 ?? 0, label?.height ?? 0, digitIndex);\n }\n const gf = p.floats(rows), digitsOff = p.ints(digits.length ? digits : [0]);\n ioff = p.ints([g.groups.length, gf, digitsOff]);\n break;\n }\n case \"hyperbolic-wedge\": p.floats([chart.aspect, g.ph, g.lw0, g.lw1 - g.lw0, 2 * chart.aspect]); ioff = p.ints([g.orientation === \"horizontal\" ? 0 : 1, g.lines]); break;\n case \"zone-plate\": { const [kH, kL] = dwSplit(g.k); p.floats([g.r * g.r, kH, kL]); break; }\n case \"slanted-squares\": p.floats([g.cellW, g.cellH, chart.aspect, g.c, g.s, g.half]); ioff = p.ints([g.columns, g.rows]); break;\n case \"line-grid\": p.floats([g.spacing, g.half]); break;\n case \"fiducial\": p.floats([g.r * g.r, g.inner * g.inner]); ioff = p.ints([g.inverted ? 1 : 0]); break;\n default: throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"Unsupported chart element.\");\n }\n p.ai[header] = kind; p.ai[header + 1] = offset; p.ai[header + 2] = ioff; p.ai[header + 3] = foff; p.ai[header + 4] = placement.mode;\n}\n\nfunction packLayer(p: Packer, layer: ResolvedChartMaskLayer, header: number): void {\n const r = layer.rectangle;\n const foff = p.floats([r.u0, r.v0, r.u1, r.v1, layer.scaleX, layer.scaleY, layer.cellWidth, layer.cellHeight]);\n const shapesOff = p.reserveInts(CHART_RECORD_STRIDE.shape * layer.shapes.length);\n layer.shapes.forEach((shape, k) => {\n const h = shapesOff + CHART_RECORD_STRIDE.shape * k;\n if (shape.kind === \"annulus\") {\n p.ai[h] = 1; p.ai[h + 1] = p.floats([...shape.box, shape.centerX, shape.centerY, shape.inner2, shape.outer2]); p.ai[h + 2] = 0;\n } else {\n const data = p.floats([...shape.box]), edges = shape.edges.length / 4;\n for (let e = 0; e < edges; e++) p.floats([shape.edges[4 * e]!, shape.edges[4 * e + 1]!, shape.edges[4 * e + 2]!, shape.edges[4 * e + 3]!]);\n p.ai[h] = 0; p.ai[h + 1] = data; p.ai[h + 2] = edges;\n }\n });\n const cells = layer.cellsX * layer.cellsY, cellStart = p.reserveInts(cells + 1), list: number[] = [];\n for (let c = 0; c < cells; c++) { p.ai[cellStart + c] = list.length; list.push(...layer.cells[c]!); }\n p.ai[cellStart + cells] = list.length;\n const cellList = p.ints(list.length ? list : [0]);\n const words = [layer.cellsX, layer.cellsY, cellStart, cellList, shapesOff, layer.shapes.length, foff, layer.backgroundMaterial, layer.inkMaterial];\n words.forEach((w, i) => { p.ai[header + i] = w; });\n}\n\n/** Packs the plan's chart (a composite, an element preset, or the chart under layers) and its layers into the kernel's record arrays. */\nexport function packChartScene(plan: ChartRadianceBatchPlan): PackedChartScene {\n const p = new Packer(), chart = plan.chart, g = chartGeometry(chart), layers = plan.layers?.layers ?? [];\n const elements = g.kind === \"composite\" ? g.elements : [];\n const elementCount = elements.length + 1;\n p.reserveInts(4);\n const he = p.reserveInts(CHART_RECORD_STRIDE.element * elementCount), hl = p.reserveInts(CHART_RECORD_STRIDE.layer * layers.length);\n const frame = { mode: CHART_PLACEMENT.frame, cu: 0, cv: 0, hw: 0, hh: 0, scale: 1 };\n packElement(p, g.kind === \"composite\" ? g.background : chart, 0, he, frame);\n elements.forEach((e, i) => packElement(p, e.chart, e.offset, he + CHART_RECORD_STRIDE.element * (i + 1),\n { mode: e.ellipse ? CHART_PLACEMENT.ellipse : CHART_PLACEMENT.rectangle, cu: e.cu, cv: e.cv, hw: e.hw, hh: e.hh, scale: e.scale }));\n layers.forEach((layer, l) => packLayer(p, layer, hl + CHART_RECORD_STRIDE.layer * l));\n p.ai[0] = elementCount; p.ai[1] = layers.length; p.ai[2] = he; p.ai[3] = hl;\n for (const x of p.af) if (!(Math.abs(x) <= FLOAT32_SAFE_MAGNITUDE)) throw new ImageKernelExecutionError(\"unsupported-float32-domain\", \"A chart constant exceeds the float32 domain.\");\n for (const x of p.ai) if (!(Number.isInteger(x) && x >= 0 && x <= 0xffffffff)) throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"Chart records exceed the kernel's index range.\");\n return { af: Float32Array.from(p.af), ai: Uint32Array.from(p.ai), materials: plan.materials.length, elementCount, layerCount: layers.length };\n}\n\n/** Per-material values in float64 (the reference's operations), rounded once; a failing spectrum is NaN and its points are recomputed. */\nexport function chartMaterialTable(plan: ChartRadianceBatchPlan): Float32Array<ArrayBuffer> {\n const nm = plan.wavelengthsNanometers, stride = plan.mode === \"radiance\" ? nm.length : plan.columns, materials = plan.materials.length;\n const table = new Float32Array(materials * stride);\n for (let m = 0; m < materials; m++) {\n for (let c = 0; c < stride; c++) {\n let value: number;\n try {\n if (plan.mode === \"radiance\") value = plan.materialRadiance(m, nm[c]!);\n else { value = 0; const row = plan.channelWeights![c]!; for (let j = 0; j < nm.length; j++) value += row[j]! * plan.materialRadiance(m, nm[j]!); }\n } catch { value = Number.NaN; }\n if (Math.abs(value) > FLOAT32_SAFE_MAGNITUDE) throw new ImageKernelExecutionError(\"unsupported-float32-domain\", \"Chart values exceed the float32 domain.\");\n table[m * stride + c] = value;\n }\n }\n return table;\n}\n\n/** The scene key of a batch input: the scene's data and the aspect (every record derives from them). */\nexport function chartSceneKey(scene: unknown, aspect: number): string { return aspect + \"|\" + JSON.stringify(scene); }\n\n/**\n * The device's double-float32 probe (`CHART_COMPOSITE_PROBE_WGSL`, classified by `classifyChartCompositeProbe`): resolves with the probe\n * record (its `productPath` is the variant the composite kernel is compiled with), or rejects with `ChartCompositeProbeError`\n * (`unsupported-on-backend`, the record in `probe`) on a device that neither product path holds on. Run once per accelerator by\n * `ChartSceneUploads.probe`, and once per display-view renderer by the composite material module (#491).\n */\nexport async function probeChartCompositeDevice(runtime: WebGpuRuntime, pipelines: PipelineSource, signal: AbortSignal): Promise<ChartCompositeProbeRecord> {\n const pipeline = await pipelines(CHART_COMPOSITE_PROBE_LABEL, CHART_COMPOSITE_PROBE_WGSL), scope = new GpuResourceScope(runtime);\n const bytes = 4 * CHART_COMPOSITE_PROBE_OUTPUTS * PROBE_INPUTS.length;\n let record: ChartCompositeProbeRecord;\n try {\n const input = scope.upload(\"photivra-chart-probe-in\", Float32Array.from(PROBE_INPUTS.flat()), BUFFER_USAGE.STORAGE);\n const output = scope.buffer(\"photivra-chart-probe-out\", bytes, BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);\n // The rounding barrier's zero word (CHART_COMPOSITE_PROBE_WGSL `probe_zero`).\n const zero = scope.upload(\"photivra-chart-probe-zero\", new Uint32Array(4), BUFFER_USAGE.UNIFORM);\n const bindGroup = runtime.device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), entries: [{ binding: 0, resource: { buffer: input } }, { binding: 1, resource: { buffer: output } },\n { binding: 2, resource: { buffer: zero } }] });\n const [data] = await runComputePass(runtime, scope, pipeline, bindGroup, [PROBE_INPUTS.length, 1], [{ buffer: output, bytes }], signal);\n record = classifyChartCompositeProbe(new Float32Array(data!, 0, CHART_COMPOSITE_PROBE_OUTPUTS * PROBE_INPUTS.length));\n } finally { scope.release(); }\n if (record.productPath === null) throw new ChartCompositeProbeError(record);\n return record;\n}\n\ninterface UploadedScene { key: string; scope: GpuResourceScope; af: GPUBuffer; ai: GPUBuffer; packed: PackedChartScene }\n\n/** Per accelerator: the uploaded records of recent scenes (a prepared view's scene is uploaded once) and the device probe. */\nexport class ChartSceneUploads {\n readonly #entries: UploadedScene[] = [];\n #probed: Promise<ChartCompositeProbeRecord> | null = null;\n constructor(private readonly runtime: WebGpuRuntime, private readonly keep = 4) {}\n /** The device's double-float32 probe, run once per accelerator (single flight; a refusal is retried on the next call): the record, or `ChartCompositeProbeError`. */\n probe(pipelines: PipelineSource, signal: AbortSignal): Promise<ChartCompositeProbeRecord> {\n this.#probed ??= probeChartCompositeDevice(this.runtime, pipelines, signal).catch((error: unknown) => { this.#probed = null; throw error; });\n return this.#probed;\n }\n get(plan: ChartRadianceBatchPlan, scene: unknown, aspect: number): UploadedScene {\n const key = chartSceneKey(scene, aspect), index = this.#entries.findIndex((e) => e.key === key);\n if (index >= 0) { const [entry] = this.#entries.splice(index, 1); this.#entries.push(entry!); return entry!; }\n const packed = packChartScene(plan);\n if (Math.max(packed.af.byteLength, packed.ai.byteLength) > this.runtime.maximumStorageBindingBytes) {\n throw new ImageKernelExecutionError(\"insufficient-limits\", \"Chart records exceed the device's storage binding limit.\");\n }\n const scope = new GpuResourceScope(this.runtime);\n const entry: UploadedScene = { key, scope, af: scope.upload(\"photivra-chart-floats\", packed.af, BUFFER_USAGE.STORAGE), ai: scope.upload(\"photivra-chart-records\", packed.ai, BUFFER_USAGE.STORAGE), packed };\n this.#entries.push(entry);\n while (this.#entries.length > this.keep) this.#entries.shift()!.scope.release();\n return entry;\n }\n /** Scenes currently uploaded (for tests). */\n get size(): number { return this.#entries.length; }\n release(): void { for (const entry of this.#entries.splice(0)) entry.scope.release(); }\n}\n\n/** Points as float32 pairs (hi, lo) per coordinate: the float64 point to 2^-48. */\nexport function splitPoints(points: Float32Array | Float64Array): Float32Array<ArrayBuffer> {\n const out = new Float32Array(points.length * 2);\n for (let i = 0; i < points.length; i++) { const hi = f(points[i]!); out[2 * i] = hi; out[2 * i + 1] = f(points[i]! - hi); }\n return out;\n}\n\nexport async function evaluateChartCompositeOnGpu(runtime: WebGpuRuntime, bandBytes: number, plan: ChartRadianceBatchPlan, scene: unknown, points: Float32Array | Float64Array,\n indices: Uint8Array | Uint16Array | undefined, abort: AbortController, yieldControl: YieldControl, pipelines: PipelineSource, uploads: ChartSceneUploads): Promise<ChartRadianceResult> {\n for (let i = 0; i < points.length; i++) {\n if (Math.abs(points[i]!) > MAXIMUM_COORDINATE) throw new ImageKernelExecutionError(\"unsupported-float32-domain\", \"Chart points beyond 2^20 frame units are outside the float32 domain.\");\n }\n const probe = await uploads.probe(pipelines, abort.signal), path = probe.productPath ?? \"dekker\";\n const uploaded = uploads.get(plan, scene, plan.chart.aspect), table = chartMaterialTable(plan), radianceMode = plan.mode === \"radiance\";\n const columns = plan.columns, stride = radianceMode ? plan.wavelengthsNanometers.length : columns, count = plan.queryCount;\n const bytesPerQuery = 16 + 4 * columns + 4 + 4, rows = Math.max(1, Math.floor(bandBytes / bytesPerQuery));\n if (Math.max(table.byteLength, Math.min(rows, count) * 4 * columns) > runtime.maximumStorageBindingBytes) {\n throw new ImageKernelExecutionError(\"insufficient-limits\", \"Chart tables or bands exceed the device's storage binding limit.\");\n }\n const params = new ArrayBuffer(16), words = new Uint32Array(params);\n words[1] = stride; words[2] = radianceMode ? 1 : 0; words[3] = 0; // words[3]: the rounding barrier's zero (chartCompositeWgsl `params.zero`)\n const pipeline = await pipelines(chartCompositeLabel(path), chartCompositeWgsl(path));\n const values = new Float32Array(count * columns), recomputed: number[] = [], split = splitPoints(points);\n const scope = new GpuResourceScope(runtime);\n try {\n const tableBuffer = scope.upload(\"photivra-chart-table\", table, BUFFER_USAGE.STORAGE), gate = createHostYieldGate();\n for (let first = 0; first < count; first += rows) {\n checkAbort(abort.signal);\n const n = Math.min(rows, count - first);\n words[0] = n;\n const band = new GpuResourceScope(runtime);\n try {\n const pointBuffer = band.upload(\"photivra-chart-points\", split.subarray(4 * first, 4 * (first + n)), BUFFER_USAGE.STORAGE);\n const selectors = band.upload(\"photivra-chart-selectors\", indices ? Uint32Array.from(indices.subarray(first, first + n)) : new Uint32Array(1), BUFFER_USAGE.STORAGE);\n const out = band.buffer(\"photivra-chart-values\", n * 4 * columns, BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);\n const flagBuffer = band.buffer(\"photivra-chart-flags\", n * 4, BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);\n const uniform = band.upload(\"photivra-chart-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: pointBuffer } }, { binding: 2, resource: { buffer: tableBuffer } },\n { binding: 3, resource: { buffer: uploaded.af } }, { binding: 4, resource: { buffer: uploaded.ai } }, { binding: 5, resource: { buffer: selectors } },\n { binding: 6, resource: { buffer: out } }, { binding: 7, resource: { buffer: flagBuffer } }] });\n const [valueData, flagData] = await runComputePass(runtime, band, pipeline, bindGroup, linearDispatch(n, CHART_COMPOSITE_WORKGROUP_SIZE, runtime.maximumWorkgroupsPerDimension),\n [{ buffer: out, bytes: n * 4 * columns }, { buffer: flagBuffer, bytes: n * 4 }], abort.signal);\n values.set(new Float32Array(valueData!, 0, n * columns), first * columns);\n const bandFlags = new Uint32Array(flagData!, 0, n);\n for (let i = 0; i < n; i++) {\n let recompute = bandFlags[i] !== 0;\n for (let c = 0; c < columns && !recompute; c++) if (!Number.isFinite(values[(first + i) * columns + c]!)) recompute = true;\n if (recompute) recomputed.push(first + i);\n }\n } finally { band.release(); }\n if (yieldControl && gate.due()) { await yieldControl(abort.signal); gate.restart(); }\n }\n } finally { scope.release(); }\n checkAbort(abort.signal);\n for (const q of recomputed) for (let c = 0; c < columns; c++) values[q * columns + c] = plan.queryValue(points, indices, q, c);\n const execution: ImageKernelExecution = webGpuExecution({ kind: \"relative-to-reference\", relative: 2 ** -24, absolute: 2 ** -126 }, 0);\n return { plan, values, columns, execution, hostRecomputedQueryIndices: Uint32Array.from(recomputed) };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"chart-composite-gpu.js","sourceRoot":"","sources":["../../src/gpu/chart-composite-gpu.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Host side of the composite-chart radiance kernel (#477, wgsl-chart-composite-kernel.ts): packs a resolved\n * chart's geometry (`chartGeometry`) and a declared scene's mask layers into the kernel's record arrays,\n * keeps the packed records and their GPU buffers per scene so a prepared view uploads them once, probes the\n * device's double-float32 arithmetic, dispatches in bands, and recomputes flagged points with the float64\n * reference. Internal; the public entry point is `ImageKernelAccelerator.evaluateChartRadiance`.\n */\nimport { createHostYieldGate } from \"../capture/host-yield-cadence.js\";\nimport type { ChartRadianceBatchPlan } from \"../facade/chart-radiance-batch.js\";\nimport { chartGeometry, type ChartGeometry, type ResolvedChartScene } from \"../facade/chart-scenes.js\";\nimport type { ResolvedChartMaskLayer } from \"../facade/chart-material-layers.js\";\nimport { ImageKernelExecutionError, webGpuExecution, type ChartCompositeProbeComponent, type ChartCompositeProbeMismatch, type ChartCompositeProbeRecord,\n type ImageKernelExecution } from \"./image-kernel-execution.js\";\nimport type { ChartRadianceResult } from \"./image-kernel-accelerator.js\";\nimport { BUFFER_USAGE, GpuResourceScope, linearDispatch, runComputePass, type WebGpuRuntime, throwIfAborted as checkAbort } from \"./webgpu-runtime.js\";\nimport { CHART_COMPOSITE_PROBE_LABEL, CHART_COMPOSITE_PROBE_OUTPUTS, CHART_COMPOSITE_PROBE_WGSL, CHART_COMPOSITE_WORKGROUP_SIZE, CHART_ELEMENT_KIND,\n CHART_PLACEMENT, CHART_RECORD_STRIDE, chartCompositeLabel, chartCompositeWgsl } from \"./wgsl-chart-composite-kernel.js\";\n\ntype PipelineSource = (label: string, code: string) => Promise<GPUComputePipeline>;\ntype YieldControl = ((signal: AbortSignal) => Promise<void>) | undefined;\n\nconst f = Math.fround;\nconst FLOAT32_SAFE_MAGNITUDE = 2 ** 120;\n/** Frame-unit magnitude limit for GPU points (shared with the preset kernel). */\nconst MAXIMUM_COORDINATE = 2 ** 20;\n/** The rough angle's allowance when the star's sector window is sized: the WGSL atan2 bound (4096 ULP, about 2^-10 rad) with a 4× margin. */\nconst STAR_ANGLE_ALLOWANCE = 2 ** -8;\n\n// --- double-float32 in JavaScript (Math.fround after every operation): the probe's expected values and the test emulation ---\nexport type Dw = readonly [hi: number, lo: number];\nexport function dwSplit(x: number): Dw { const hi = f(x), lo = f(x - hi); return [hi, lo]; }\nexport function twoSum(a: number, b: number): Dw { const s = f(a + b), bb = f(s - a); return [s, f(f(a - f(s - bb)) + f(b - bb))]; }\nexport function quickTwoSum(a: number, b: number): Dw { const s = f(a + b); return [s, f(b - f(s - a))]; }\nfunction veltkamp(a: number): Dw { const t = f(4097 * a), h = f(t - f(t - a)); return [h, f(a - h)]; }\nexport function twoProd(a: number, b: number): Dw {\n const p = f(a * b), [ah, al] = veltkamp(a), [bh, bl] = veltkamp(b);\n const e = f(f(f(f(f(ah * bh) - p) + f(ah * bl)) + f(al * bh)) + f(al * bl));\n return [p, e];\n}\nexport function dwAdd(a: Dw, b: Dw): Dw {\n const s = twoSum(a[0], b[0]), t = twoSum(a[1], b[1]);\n const c = f(s[1] + t[0]), v = quickTwoSum(s[0], c);\n const w = f(v[1] + t[1]);\n return quickTwoSum(v[0], w);\n}\nexport function dwSub(a: Dw, b: Dw): Dw { return dwAdd(a, [-b[0], -b[1]]); }\nexport function dwMul(a: Dw, b: Dw): Dw {\n const p = twoProd(a[0], b[0]), t = f(f(a[0] * b[1]) + f(a[1] * b[0])), l = f(p[1] + t);\n return quickTwoSum(p[0], l);\n}\n\n/**\n * fma on float32 operands with one rounding to nearest (ties to even), as a fused `fma` evaluates it: the product of two float32\n * values is exact in float64 (48 significant bits), the float64 TwoSum gives the sum's exact error, and the one case where rounding\n * the float64 sum to float32 differs from rounding the exact sum (the float64 sum lands on a float32 midpoint) is resolved by the error's sign.\n */\nexport function fmaF32(a: number, b: number, c: number): number {\n const p = a * b, s = p + c, bb = s - p, e = (p - (s - bb)) + (c - bb), r = f(s);\n if (e === 0 || r === s || !Number.isFinite(r)) return r;\n const other = nextFloat32(r, s > r ? 1 : -1);\n if (Math.abs(s - r) !== Math.abs(other - s)) return r;\n return (e > 0) === (other > r) ? other : r;\n}\nconst bits32 = new Float32Array(1), int32 = new Int32Array(bits32.buffer);\n/** The float32 neighbour of a finite float32 x toward +∞ (direction 1) or −∞ (−1). */\nfunction nextFloat32(x: number, direction: 1 | -1): number {\n if (x === 0) return direction * 2 ** -149;\n bits32[0] = x;\n int32[0] = int32[0]! + ((x > 0) === (direction > 0) ? 1 : -1);\n return bits32[0]!;\n}\n/** The fma TwoProduct: p = fl(a·b) and its exact error fma(a, b, −p) (exact for a fused fma; Joldes, Muller & Popescu 2017, Algorithm 2). */\nexport function twoProdFma(a: number, b: number): Dw { const p = f(a * b); return [p, fmaF32(a, b, -p)]; }\n/** The cross-term sum t = a.h·b.l + a.l·b.h of a double-word product: unfused (the default), or with one of the two products fused into the addition. */\nexport function dwCrossTerm(a: Dw, b: Dw, contraction: \"none\" | \"first\" | \"second\" = \"none\"): number {\n if (contraction === \"first\") return fmaF32(a[0], b[1], f(a[1] * b[0]));\n if (contraction === \"second\") return fmaF32(a[1], b[0], f(a[0] * b[1]));\n return f(f(a[0] * b[1]) + f(a[1] * b[0]));\n}\n/**\n * The fma path's double-word product (`d_mul_fma`): s = fma(a.h, b.h, t), lo = fl(fma(a.h, b.h, −s) + t), with t the cross-term\n * sum. No rounded product is an operand of an addition, so a contraction cannot change it; see docs/WEBGPU.md for its error bound.\n */\nexport function dwMulFma(a: Dw, b: Dw, t: number = dwCrossTerm(a, b)): Dw {\n const s = fmaF32(a[0], b[0], t);\n return [s, f(fmaF32(a[0], b[0], -s) + t)];\n}\n/** The Dekker path's double-word product with a given cross-term sum (`dwMul` is it with the unfused one). */\nexport function dwMulDekker(a: Dw, b: Dw, t: number = dwCrossTerm(a, b)): Dw {\n const p = twoProd(a[0], b[0]), l = f(p[1] + t);\n return quickTwoSum(p[0], l);\n}\n\n/**\n * Probe inputs (x, y, z, w): pairs whose TwoSum and TwoProduct low parts are non-zero, double words to add and multiply, and sums and\n * products that a directed (truncating or upward) rounding would place on the other neighbour than round-to-nearest: 1 + 3·2^-26\n * rounds up to 1 + 2^-23 (nearest) but down to 1 (truncation); −1 − 3·2^-26 the mirror; 1.25 · (1 + 2^-23) likewise. The last four\n * (2.11.0, the M5 Pro finding) are normalized double words whose products have non-zero TwoProduct errors on both operand pairs, so\n * a contraction of the Dekker path's final Fast2Sum (which then adds the product's error twice) shows in the double-word product.\n */\nexport const PROBE_INPUTS: readonly (readonly [number, number, number, number])[] = /* @__PURE__ */ Object.freeze([\n [1, 2 ** -30, 1.5, 2 ** -29], [3.7, 1e-8, -2.25, 3e-9], [0.1, 0.7, 12345.678, -0.0001], [1e6, 1e-3, 1e-6, 1e-9], [-5.5, 2 ** -26, 7, -(2 ** -27)],\n [0.3333333, 0.6666667, 1.0000001, 0.99999994], [1024.5, 1e-5, 0.0078125, 3e-10], [2.5e-3, 4.1e-11, 999.75, 2 ** -40],\n [1, 3 * 2 ** -26, 1.25, 1 + 2 ** -23], [-1, -3 * 2 ** -26, -1.25, 1 + 2 ** -23], [1 + 2 ** -23, 1.25, 1, 5 * 2 ** -26], [0.75, 2 ** -25 + 2 ** -27, 3, 2 ** -24 + 2 ** -26],\n [1.1, 2.2e-9, 1.3, -3.1e-9], [0.7071068, -1.2e-8, 0.7071067, 2.9e-8], [123.456, 3.3e-6, -0.0123, 4.4e-10], [3.14159274, -8.7422777e-8, 2.7182817, 8.2e-8]\n]);\n/** The components of the probe in output order (see `CHART_COMPOSITE_PROBE_WGSL`). */\nexport const PROBE_COMPONENTS: readonly ChartCompositeProbeComponent[] = /* @__PURE__ */ Object.freeze([\"two-sum\", \"two-product\", \"double-word-add\", \"double-word-multiply\", \"fma-two-product\", \"fma-double-word-multiply\"]);\n/**\n * The probe's output per input on a device that evaluates as written, round to nearest, unfused, with a fused `fma`, in the shader's\n * order: [TwoSum lo, Dekker TwoProduct lo, double-word sum lo, fma TwoProduct lo, Dekker product hi, lo, fma product hi, lo].\n */\nexport function probeExpectation(input: readonly [number, number, number, number]): [number, number, number, number, number, number, number, number] {\n const [x, y, z, w] = input.map(f) as [number, number, number, number];\n const q = dwMulDekker([x, y], [z, w]), qf = dwMulFma([x, y], [z, w]);\n return [twoSum(x, y)[1], twoProd(x, y)[1], dwAdd([x, y], [z, w])[1], twoProdFma(x, y)[1], q[0], q[1], qf[0], qf[1]];\n}\nconst hex32 = (x: number): string => { bits32[0] = x; return \"0x\" + (int32[0]! >>> 0).toString(16).padStart(8, \"0\"); };\n\n/**\n * Classifies the probe's output (`CHART_COMPOSITE_PROBE_OUTPUTS` floats per input of `PROBE_INPUTS`). TwoSum, both TwoProducts and the\n * double-word sum must equal their exact values bit for bit (each is error-free, or a fixed sequence of roundings to nearest); a\n * double-word product must equal the written-order evaluation for the unfused cross-term sum t = a.h·b.l + a.l·b.h or for either\n * product of t fused into its addition (a contraction WGSL permits, \"Reassociation and Fusion\", and harmless there: t is an ordinary\n * bounded sum). Anything else is a mismatch, recorded with the float32 bits.\n */\nexport function classifyChartCompositeProbe(got: Float32Array): ChartCompositeProbeRecord {\n const counts = Object.fromEntries(PROBE_COMPONENTS.map((c) => [c, 0])) as Record<ChartCompositeProbeComponent, number>;\n const inputs = Object.fromEntries(PROBE_COMPONENTS.map((c) => [c, [] as number[]])) as Record<ChartCompositeProbeComponent, number[]>;\n const mismatches: ChartCompositeProbeMismatch[] = [];\n let nonFinite = false, sumZero = true;\n const miss = (component: ChartCompositeProbeComponent, input: number, g: number, want: number): void => {\n counts[component]++;\n inputs[component].push(input);\n if (!Number.isFinite(g)) nonFinite = true;\n if ((component === \"two-sum\" || component === \"double-word-add\") && g !== 0) sumZero = false;\n if (mismatches.length < 8) mismatches.push({ component, input, got: hex32(g), want: hex32(want) });\n };\n PROBE_INPUTS.forEach((row, i) => {\n const [x, y, z, w] = row.map(f) as [number, number, number, number], o = got.subarray(8 * i, 8 * i + 8), want = probeExpectation(row);\n for (const [k, component] of [[0, \"two-sum\"], [1, \"two-product\"], [2, \"double-word-add\"]] as const) if (!Object.is(o[k], want[k])) miss(component, i, o[k]!, want[k]);\n const products = (mul: (a: Dw, b: Dw, t: number) => Dw, h: number, l: number, component: ChartCompositeProbeComponent): void => {\n const candidates = ([\"none\", \"first\", \"second\"] as const).map((c) => mul([x, y], [z, w], dwCrossTerm([x, y], [z, w], c)));\n if (!candidates.some((c) => Object.is(c[0], h) && Object.is(c[1], l))) miss(component, i, Object.is(candidates[0]![0], h) ? l : h, Object.is(candidates[0]![0], h) ? candidates[0]![1] : candidates[0]![0]);\n };\n products(dwMulDekker, o[4]!, o[5]!, \"double-word-multiply\");\n if (!Object.is(o[3], want[3])) miss(\"fma-two-product\", i, o[3]!, want[3]);\n products(dwMulFma, o[6]!, o[7]!, \"fma-double-word-multiply\");\n });\n mismatches.sort((a, b) => PROBE_COMPONENTS.indexOf(a.component) - PROBE_COMPONENTS.indexOf(b.component) || a.input - b.input);\n const sums = counts[\"two-sum\"] + counts[\"double-word-add\"], dekker = counts[\"two-product\"] + counts[\"double-word-multiply\"];\n const fma = counts[\"fma-two-product\"] + counts[\"fma-double-word-multiply\"];\n const deviceClass: ChartCompositeProbeRecord[\"deviceClass\"] = nonFinite ? \"other\" : sums > 0 ? (sumZero ? \"reassociated\" : \"other\") : dekker > 0 ? \"contracted\" : \"exact\";\n const productPath = sums > 0 || nonFinite ? null : dekker === 0 ? \"dekker\" : fma === 0 ? \"fma\" : null;\n return Object.freeze({ deviceClass, productPath, fmaFused: counts[\"fma-two-product\"] === 0, inputs: PROBE_INPUTS.length, mismatchCounts: Object.freeze(counts),\n mismatchedInputs: Object.freeze(Object.fromEntries(PROBE_COMPONENTS.map((c) => [c, Object.freeze(inputs[c])])) as Record<ChartCompositeProbeComponent, readonly number[]>),\n mismatches: Object.freeze(mismatches.map((m) => Object.freeze(m))) });\n}\n\n/** The components' names in a log line, with the probe output they are (s.l, m.l, a.l, q of the probe before 2.11.0; mf.l, qf of the fma path). */\nconst COMPONENT_NAMES: Record<ChartCompositeProbeComponent, string> = { \"two-sum\": \"TwoSum (s.l)\", \"two-product\": \"TwoProduct (m.l)\", \"double-word-add\": \"double-word add (a.l)\",\n \"double-word-multiply\": \"double-word multiply (q)\", \"fma-two-product\": \"fma TwoProduct (mf.l)\", \"fma-double-word-multiply\": \"fma double-word multiply (qf)\" };\n/**\n * One log line for a probe record: the class, the chosen path, each differing component with its count and the probe input\n * indices that differ, and the first difference with its float32 bits.\n */\nexport function describeChartCompositeProbe(probe: ChartCompositeProbeRecord): string {\n const differing = PROBE_COMPONENTS.filter((c) => probe.mismatchCounts[c] > 0).map((c) => COMPONENT_NAMES[c] + \" ×\" + probe.mismatchCounts[c] + \" [\" + probe.mismatchedInputs[c].join(\",\") + \"]\");\n const first = probe.mismatches[0];\n return \"class \" + probe.deviceClass + \", product path \" + (probe.productPath ?? \"none\") + \", fma \" + (probe.fmaFused ? \"fused\" : \"not fused\") +\n (differing.length ? \"; differing of \" + probe.inputs + \" inputs: \" + differing.join(\", \") : \"\") +\n (first ? \"; first: \" + COMPONENT_NAMES[first.component] + \" input \" + first.input + \" got \" + first.got + \" want \" + first.want : \"\");\n}\n\n/** The probe's refusal: `unsupported-on-backend` with the probe record (`probe`) for the execution diagnostics. */\nexport class ChartCompositeProbeError extends ImageKernelExecutionError {\n constructor(readonly probe: ChartCompositeProbeRecord) {\n super(\"unsupported-on-backend\", \"This device does not evaluate the composite chart kernel's double-float32 arithmetic as written (\" + describeChartCompositeProbe(probe) +\n \"); use cpu-reference for composite charts, 2.3 elements and material-layers scenes.\");\n }\n}\n\n/** Packed records of one scene: the kernel's float and integer arrays and its material count. */\nexport interface PackedChartScene { af: Float32Array<ArrayBuffer>; ai: Uint32Array<ArrayBuffer>; materials: number; elementCount: number; layerCount: number }\n\nclass Packer {\n readonly af: number[] = [];\n readonly ai: number[] = [];\n floats(values: readonly number[]): number { const at = this.af.length; for (const x of values) this.af.push(x); return at; }\n ints(values: readonly number[]): number { const at = this.ai.length; for (const x of values) this.ai.push(x); return at; }\n reserveInts(count: number): number { const at = this.ai.length; for (let i = 0; i < count; i++) this.ai.push(0); return at; }\n}\n\n/** Sector boundary table of a Siemens star (bar or sine profile): directions, per-sector levels from the reference, bucket index and search window. */\nexport function starSectorTable(chart: ResolvedChartScene, g: Extract<ChartGeometry, { kind: \"siemens-star\" }>):\n { thetas: Float64Array; levels: Uint32Array; buckets: Uint32Array; window: number } {\n const set = new Set<number>(), normalize = (t: number): number => { let x = t; while (x <= -Math.PI) x += 2 * Math.PI; while (x > Math.PI) x -= 2 * Math.PI; return x; };\n if (g.profile === \"bar\") {\n for (let k = 1; k <= 2 * g.cycles; k++) set.add(normalize(Math.PI * (k / g.cycles - 1)));\n } else {\n for (let L = 1; L < 1024; L++) {\n const a = Math.asin(L / 512 - 1);\n for (let m = 0; m < g.cycles; m++) { set.add(normalize((a + 2 * Math.PI * m) / g.cycles - Math.PI)); set.add(normalize((Math.PI - a + 2 * Math.PI * m) / g.cycles - Math.PI)); }\n }\n }\n const thetas = Float64Array.from(set).sort(), n = thetas.length, rho = g.r / 2;\n const levels = new Uint32Array(n);\n for (let k = 0; k < n; k++) {\n const next = k + 1 < n ? thetas[k + 1]! : thetas[0]! + 2 * Math.PI, mid = (thetas[k]! + next) / 2;\n levels[k] = chart.materialAt(rho * Math.cos(mid), rho * Math.sin(mid));\n }\n const buckets = new Uint32Array(n);\n for (let j = 0; j < n; j++) {\n const start = -Math.PI + 2 * Math.PI * j / n;\n let lo = 0, hi = n;\n while (lo < hi) { const mid = (lo + hi) >> 1; if (thetas[mid]! >= start) hi = mid; else lo = mid + 1; }\n buckets[j] = lo;\n }\n // The window: the most boundaries any angular interval of the allowance (plus two buckets) can hold, capped so the window spans under a half turn.\n const reach = STAR_ANGLE_ALLOWANCE + 4 * Math.PI / n;\n let window = 1;\n for (let k = 0; k < n; k++) {\n let count = 0;\n for (let i = 1; i <= n; i++) { const t = k + i < n ? thetas[k + i]! : thetas[(k + i) % n]! + 2 * Math.PI; if (t - thetas[k]! <= 2 * reach) count++; else break; }\n window = Math.max(window, count + 1);\n }\n window = Math.min(window, Math.max(0, Math.floor(n / 4) - 1));\n return { thetas, levels, buckets, window };\n}\n\nfunction packElement(p: Packer, chart: ResolvedChartScene, offset: number, header: number, placement: { mode: number; cu: number; cv: number; hw: number; hh: number; scale: number }): void {\n const g = chartGeometry(chart);\n const [cuH, cuL] = dwSplit(placement.cu), [cvH, cvL] = dwSplit(placement.cv), [sH, sL] = dwSplit(placement.scale);\n const foff = p.floats([cuH, cuL, cvH, cvL, placement.hw, placement.hh, sH, sL, 0, 0]);\n const kindName = g.kind === \"composite\" ? null : g.kind;\n if (kindName === null) throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"A composite cannot be a composite element.\");\n const kind = CHART_ELEMENT_KIND[kindName];\n let ioff = 0;\n switch (g.kind) {\n case \"uniform\": break;\n case \"slanted-edge\": p.floats([g.c, g.s]); break;\n case \"siemens-star\": {\n const table = starSectorTable(chart, g), n = table.thetas.length;\n const dirs: number[] = [];\n for (let k = 0; k < n; k++) { const t = table.thetas[k]!, c = dwSplit(Math.cos(t)), s = dwSplit(Math.sin(t)); dirs.push(c[0], c[1], s[0], s[1]); }\n p.floats([g.r * g.r]);\n const dirsOff = p.floats(dirs), levelsOff = p.ints(Array.from(table.levels)), bucketsOff = p.ints(Array.from(table.buckets));\n ioff = p.ints([n, dirsOff, levelsOff, bucketsOff, n, table.window, chart.materials.length - 1]);\n break;\n }\n case \"step-wedge\": ioff = p.ints([g.steps]); break;\n case \"checkerboard\": p.floats([g.size, chart.aspect]); break;\n case \"point-grid\": {\n p.floats([g.cellW, g.cellH, chart.aspect, g.radius * g.radius]);\n const centers = p.floats(g.centers.flatMap((c) => [c.u, c.v]));\n ioff = p.ints([g.columns, g.rows, centers]);\n break;\n }\n case \"patches\": p.floats([g.cellW, g.cellH, chart.aspect, g.gap / 2, 1 - g.gap / 2]); ioff = p.ints([g.columns, g.rows, g.count, g.backgroundIndex]); break;\n case \"dead-leaves\": {\n p.floats([g.u0, g.v0, g.cell]);\n const cells = g.nx * g.ny, csr = p.reserveInts(cells + 1), entries: number[] = [];\n for (let c = 0; c < cells; c++) {\n p.ai[csr + c] = entries.length;\n for (let e = g.head[c]!; e >= 0; e = g.next[e]!) entries.push(g.entryDisk[e]!);\n }\n p.ai[csr + cells] = entries.length;\n const entriesOff = p.ints(entries), disks: number[] = [];\n for (let d = 0; d < g.diskCount; d++) disks.push(g.X[d]!, g.Y[d]!, g.R2[d]!, g.level[d]!);\n const disksOff = p.floats(disks);\n ioff = p.ints([g.nx, g.ny, csr, entriesOff, disksOff, g.mean]);\n break;\n }\n case \"bar-groups\": {\n const digits: number[] = [], rows: number[] = [];\n for (const group of g.groups) {\n const b = group.verticalBars, h = group.horizontalBars, label = group.label;\n let digitIndex = 0;\n if (label) { digitIndex = digits.length; digits.push(label.text.length, ...Array.from(label.text, (ch) => ch.charCodeAt(0) - 48)); }\n rows.push(group.cell.u0, group.cell.u1, b.u0, b.v0, b.u1, b.v1, h.u0, h.v0, h.u1, h.v1, group.lineWidth, label ? 1 : 0,\n label?.u0 ?? 0, label?.v0 ?? 0, label?.height ?? 0, digitIndex);\n }\n const gf = p.floats(rows), digitsOff = p.ints(digits.length ? digits : [0]);\n ioff = p.ints([g.groups.length, gf, digitsOff]);\n break;\n }\n case \"hyperbolic-wedge\": p.floats([chart.aspect, g.ph, g.lw0, g.lw1 - g.lw0, 2 * chart.aspect]); ioff = p.ints([g.orientation === \"horizontal\" ? 0 : 1, g.lines]); break;\n case \"zone-plate\": { const [kH, kL] = dwSplit(g.k); p.floats([g.r * g.r, kH, kL]); break; }\n case \"slanted-squares\": p.floats([g.cellW, g.cellH, chart.aspect, g.c, g.s, g.half]); ioff = p.ints([g.columns, g.rows]); break;\n case \"line-grid\": p.floats([g.spacing, g.half]); break;\n case \"fiducial\": p.floats([g.r * g.r, g.inner * g.inner]); ioff = p.ints([g.inverted ? 1 : 0]); break;\n default: throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"Unsupported chart element.\");\n }\n p.ai[header] = kind; p.ai[header + 1] = offset; p.ai[header + 2] = ioff; p.ai[header + 3] = foff; p.ai[header + 4] = placement.mode;\n}\n\nfunction packLayer(p: Packer, layer: ResolvedChartMaskLayer, header: number): void {\n const r = layer.rectangle;\n const foff = p.floats([r.u0, r.v0, r.u1, r.v1, layer.scaleX, layer.scaleY, layer.cellWidth, layer.cellHeight]);\n const shapesOff = p.reserveInts(CHART_RECORD_STRIDE.shape * layer.shapes.length);\n layer.shapes.forEach((shape, k) => {\n const h = shapesOff + CHART_RECORD_STRIDE.shape * k;\n if (shape.kind === \"annulus\") {\n p.ai[h] = 1; p.ai[h + 1] = p.floats([...shape.box, shape.centerX, shape.centerY, shape.inner2, shape.outer2]); p.ai[h + 2] = 0;\n } else {\n const data = p.floats([...shape.box]), edges = shape.edges.length / 4;\n for (let e = 0; e < edges; e++) p.floats([shape.edges[4 * e]!, shape.edges[4 * e + 1]!, shape.edges[4 * e + 2]!, shape.edges[4 * e + 3]!]);\n p.ai[h] = 0; p.ai[h + 1] = data; p.ai[h + 2] = edges;\n }\n });\n const cells = layer.cellsX * layer.cellsY, cellStart = p.reserveInts(cells + 1), list: number[] = [];\n for (let c = 0; c < cells; c++) { p.ai[cellStart + c] = list.length; list.push(...layer.cells[c]!); }\n p.ai[cellStart + cells] = list.length;\n const cellList = p.ints(list.length ? list : [0]);\n const words = [layer.cellsX, layer.cellsY, cellStart, cellList, shapesOff, layer.shapes.length, foff, layer.backgroundMaterial, layer.inkMaterial];\n words.forEach((w, i) => { p.ai[header + i] = w; });\n}\n\n/** Packs the plan's chart (a composite, an element preset, or the chart under layers) and its layers into the kernel's record arrays. */\nexport function packChartScene(plan: ChartRadianceBatchPlan): PackedChartScene {\n const p = new Packer(), chart = plan.chart, g = chartGeometry(chart), layers = plan.layers?.layers ?? [];\n const elements = g.kind === \"composite\" ? g.elements : [];\n const elementCount = elements.length + 1;\n p.reserveInts(4);\n const he = p.reserveInts(CHART_RECORD_STRIDE.element * elementCount), hl = p.reserveInts(CHART_RECORD_STRIDE.layer * layers.length);\n const frame = { mode: CHART_PLACEMENT.frame, cu: 0, cv: 0, hw: 0, hh: 0, scale: 1 };\n packElement(p, g.kind === \"composite\" ? g.background : chart, 0, he, frame);\n elements.forEach((e, i) => packElement(p, e.chart, e.offset, he + CHART_RECORD_STRIDE.element * (i + 1),\n { mode: e.ellipse ? CHART_PLACEMENT.ellipse : CHART_PLACEMENT.rectangle, cu: e.cu, cv: e.cv, hw: e.hw, hh: e.hh, scale: e.scale }));\n layers.forEach((layer, l) => packLayer(p, layer, hl + CHART_RECORD_STRIDE.layer * l));\n p.ai[0] = elementCount; p.ai[1] = layers.length; p.ai[2] = he; p.ai[3] = hl;\n for (const x of p.af) if (!(Math.abs(x) <= FLOAT32_SAFE_MAGNITUDE)) throw new ImageKernelExecutionError(\"unsupported-float32-domain\", \"A chart constant exceeds the float32 domain.\");\n for (const x of p.ai) if (!(Number.isInteger(x) && x >= 0 && x <= 0xffffffff)) throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"Chart records exceed the kernel's index range.\");\n return { af: Float32Array.from(p.af), ai: Uint32Array.from(p.ai), materials: plan.materials.length, elementCount, layerCount: layers.length };\n}\n\n/**\n * The material table the chart kernels read. Radiance mode: each material's radiance at each wavelength in float64 (the reference's\n * operations), rounded once; a failing spectrum is NaN and its points are recomputed. Spectral-integral mode (2.21.0, signals are\n * integrated from the material spectrum per query): each material's index in every column (exact in float32), so the kernel\n * returns the material a query reads and the host integrates that query's spectrum against the channel weights\n * (`integrateChartQueries`); no per-material channel value is formed.\n */\nexport function chartMaterialTable(plan: ChartRadianceBatchPlan): Float32Array<ArrayBuffer> {\n const nm = plan.wavelengthsNanometers, stride = plan.mode === \"radiance\" ? nm.length : plan.columns, materials = plan.materials.length;\n const table = new Float32Array(materials * stride);\n if (plan.mode !== \"radiance\") {\n // A query whose integral leaves the float32 range is non-finite and recomputed by the reference (integrateChartQueries).\n for (let m = 0; m < table.length; m++) table[m] = Math.floor(m / stride);\n return table;\n }\n for (let m = 0; m < materials; m++) {\n for (let c = 0; c < stride; c++) {\n let value: number;\n try { value = plan.materialRadiance(m, nm[c]!); } catch { value = Number.NaN; }\n if (Math.abs(value) > FLOAT32_SAFE_MAGNITUDE) throw new ImageKernelExecutionError(\"unsupported-float32-domain\", \"Chart values exceed the float32 domain.\");\n table[m * stride + c] = value;\n }\n }\n return table;\n}\n\n/**\n * Spectral-integral mode (2.21.0): replaces each query's material index (the kernel's output, `chartMaterialTable`) by its integral\n * Σ_j w_cj·L_m(λ_j) per column, formed from the material's spectrum (kept per material) in the reference's order and rounded\n * once, as the query is read. Queries already in `recomputed` are left to the reference; a query whose spectrum fails joins them.\n */\nexport function integrateChartQueries(plan: ChartRadianceBatchPlan, values: Float32Array, recomputed: number[]): void {\n if (plan.mode === \"radiance\") return;\n const nm = plan.wavelengthsNanometers, C = plan.columns, spectra = new Map<number, number[] | null>(), skip = new Set(recomputed);\n for (let q = 0; q < plan.queryCount; q++) {\n if (skip.has(q)) continue;\n const m = values[q * C]!;\n if (!spectra.has(m)) { try { spectra.set(m, nm.map((w) => plan.materialRadiance(m, w))); } catch { spectra.set(m, null); } }\n const L = spectra.get(m);\n let finite = !!L;\n for (let c = 0; c < C && L; c++) {\n let v = 0;\n plan.channelWeights![c]!.forEach((w, j) => { v += w * L[j]!; });\n values[q * C + c] = v;\n finite &&= Number.isFinite(values[q * C + c]!);\n }\n if (!finite) recomputed.push(q);\n }\n}\n\n/** The scene key of a batch input: the scene's data and the aspect (every record derives from them). */\nexport function chartSceneKey(scene: unknown, aspect: number): string { return aspect + \"|\" + JSON.stringify(scene); }\n\n/**\n * The device's double-float32 probe (`CHART_COMPOSITE_PROBE_WGSL`, classified by `classifyChartCompositeProbe`): resolves with the probe\n * record (its `productPath` is the variant the composite kernel is compiled with), or rejects with `ChartCompositeProbeError`\n * (`unsupported-on-backend`, the record in `probe`) on a device that neither product path holds on. Run once per accelerator by\n * `ChartSceneUploads.probe`, and once per display-view renderer by the composite material module (#491).\n */\nexport async function probeChartCompositeDevice(runtime: WebGpuRuntime, pipelines: PipelineSource, signal: AbortSignal): Promise<ChartCompositeProbeRecord> {\n const pipeline = await pipelines(CHART_COMPOSITE_PROBE_LABEL, CHART_COMPOSITE_PROBE_WGSL), scope = new GpuResourceScope(runtime);\n const bytes = 4 * CHART_COMPOSITE_PROBE_OUTPUTS * PROBE_INPUTS.length;\n let record: ChartCompositeProbeRecord;\n try {\n const input = scope.upload(\"photivra-chart-probe-in\", Float32Array.from(PROBE_INPUTS.flat()), BUFFER_USAGE.STORAGE);\n const output = scope.buffer(\"photivra-chart-probe-out\", bytes, BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);\n // The rounding barrier's zero word (CHART_COMPOSITE_PROBE_WGSL `probe_zero`).\n const zero = scope.upload(\"photivra-chart-probe-zero\", new Uint32Array(4), BUFFER_USAGE.UNIFORM);\n const bindGroup = runtime.device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), entries: [{ binding: 0, resource: { buffer: input } }, { binding: 1, resource: { buffer: output } },\n { binding: 2, resource: { buffer: zero } }] });\n const [data] = await runComputePass(runtime, scope, pipeline, bindGroup, [PROBE_INPUTS.length, 1], [{ buffer: output, bytes }], signal);\n record = classifyChartCompositeProbe(new Float32Array(data!, 0, CHART_COMPOSITE_PROBE_OUTPUTS * PROBE_INPUTS.length));\n } finally { scope.release(); }\n if (record.productPath === null) throw new ChartCompositeProbeError(record);\n return record;\n}\n\ninterface UploadedScene { key: string; scope: GpuResourceScope; af: GPUBuffer; ai: GPUBuffer; packed: PackedChartScene }\n\n/** Per accelerator: the uploaded records of recent scenes (a prepared view's scene is uploaded once) and the device probe. */\nexport class ChartSceneUploads {\n readonly #entries: UploadedScene[] = [];\n #probed: Promise<ChartCompositeProbeRecord> | null = null;\n constructor(private readonly runtime: WebGpuRuntime, private readonly keep = 4) {}\n /** The device's double-float32 probe, run once per accelerator (single flight; a refusal is retried on the next call): the record, or `ChartCompositeProbeError`. */\n probe(pipelines: PipelineSource, signal: AbortSignal): Promise<ChartCompositeProbeRecord> {\n this.#probed ??= probeChartCompositeDevice(this.runtime, pipelines, signal).catch((error: unknown) => { this.#probed = null; throw error; });\n return this.#probed;\n }\n get(plan: ChartRadianceBatchPlan, scene: unknown, aspect: number): UploadedScene {\n const key = chartSceneKey(scene, aspect), index = this.#entries.findIndex((e) => e.key === key);\n if (index >= 0) { const [entry] = this.#entries.splice(index, 1); this.#entries.push(entry!); return entry!; }\n const packed = packChartScene(plan);\n if (Math.max(packed.af.byteLength, packed.ai.byteLength) > this.runtime.maximumStorageBindingBytes) {\n throw new ImageKernelExecutionError(\"insufficient-limits\", \"Chart records exceed the device's storage binding limit.\");\n }\n const scope = new GpuResourceScope(this.runtime);\n const entry: UploadedScene = { key, scope, af: scope.upload(\"photivra-chart-floats\", packed.af, BUFFER_USAGE.STORAGE), ai: scope.upload(\"photivra-chart-records\", packed.ai, BUFFER_USAGE.STORAGE), packed };\n this.#entries.push(entry);\n while (this.#entries.length > this.keep) this.#entries.shift()!.scope.release();\n return entry;\n }\n /** Scenes currently uploaded (for tests). */\n get size(): number { return this.#entries.length; }\n release(): void { for (const entry of this.#entries.splice(0)) entry.scope.release(); }\n}\n\n/** Points as float32 pairs (hi, lo) per coordinate: the float64 point to 2^-48. */\nexport function splitPoints(points: Float32Array | Float64Array): Float32Array<ArrayBuffer> {\n const out = new Float32Array(points.length * 2);\n for (let i = 0; i < points.length; i++) { const hi = f(points[i]!); out[2 * i] = hi; out[2 * i + 1] = f(points[i]! - hi); }\n return out;\n}\n\nexport async function evaluateChartCompositeOnGpu(runtime: WebGpuRuntime, bandBytes: number, plan: ChartRadianceBatchPlan, scene: unknown, points: Float32Array | Float64Array,\n indices: Uint8Array | Uint16Array | undefined, abort: AbortController, yieldControl: YieldControl, pipelines: PipelineSource, uploads: ChartSceneUploads): Promise<ChartRadianceResult> {\n for (let i = 0; i < points.length; i++) {\n if (Math.abs(points[i]!) > MAXIMUM_COORDINATE) throw new ImageKernelExecutionError(\"unsupported-float32-domain\", \"Chart points beyond 2^20 frame units are outside the float32 domain.\");\n }\n const probe = await uploads.probe(pipelines, abort.signal), path = probe.productPath ?? \"dekker\";\n const uploaded = uploads.get(plan, scene, plan.chart.aspect), table = chartMaterialTable(plan), radianceMode = plan.mode === \"radiance\";\n const columns = plan.columns, stride = radianceMode ? plan.wavelengthsNanometers.length : columns, count = plan.queryCount;\n const bytesPerQuery = 16 + 4 * columns + 4 + 4, rows = Math.max(1, Math.floor(bandBytes / bytesPerQuery));\n if (Math.max(table.byteLength, Math.min(rows, count) * 4 * columns) > runtime.maximumStorageBindingBytes) {\n throw new ImageKernelExecutionError(\"insufficient-limits\", \"Chart tables or bands exceed the device's storage binding limit.\");\n }\n const params = new ArrayBuffer(16), words = new Uint32Array(params);\n words[1] = stride; words[2] = radianceMode ? 1 : 0; words[3] = 0; // words[3]: the rounding barrier's zero (chartCompositeWgsl `params.zero`)\n const pipeline = await pipelines(chartCompositeLabel(path), chartCompositeWgsl(path));\n const values = new Float32Array(count * columns), recomputed: number[] = [], split = splitPoints(points);\n const scope = new GpuResourceScope(runtime);\n try {\n const tableBuffer = scope.upload(\"photivra-chart-table\", table, BUFFER_USAGE.STORAGE), gate = createHostYieldGate();\n for (let first = 0; first < count; first += rows) {\n checkAbort(abort.signal);\n const n = Math.min(rows, count - first);\n words[0] = n;\n const band = new GpuResourceScope(runtime);\n try {\n const pointBuffer = band.upload(\"photivra-chart-points\", split.subarray(4 * first, 4 * (first + n)), BUFFER_USAGE.STORAGE);\n const selectors = band.upload(\"photivra-chart-selectors\", indices ? Uint32Array.from(indices.subarray(first, first + n)) : new Uint32Array(1), BUFFER_USAGE.STORAGE);\n const out = band.buffer(\"photivra-chart-values\", n * 4 * columns, BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);\n const flagBuffer = band.buffer(\"photivra-chart-flags\", n * 4, BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);\n const uniform = band.upload(\"photivra-chart-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: pointBuffer } }, { binding: 2, resource: { buffer: tableBuffer } },\n { binding: 3, resource: { buffer: uploaded.af } }, { binding: 4, resource: { buffer: uploaded.ai } }, { binding: 5, resource: { buffer: selectors } },\n { binding: 6, resource: { buffer: out } }, { binding: 7, resource: { buffer: flagBuffer } }] });\n const [valueData, flagData] = await runComputePass(runtime, band, pipeline, bindGroup, linearDispatch(n, CHART_COMPOSITE_WORKGROUP_SIZE, runtime.maximumWorkgroupsPerDimension),\n [{ buffer: out, bytes: n * 4 * columns }, { buffer: flagBuffer, bytes: n * 4 }], abort.signal);\n values.set(new Float32Array(valueData!, 0, n * columns), first * columns);\n const bandFlags = new Uint32Array(flagData!, 0, n);\n for (let i = 0; i < n; i++) {\n let recompute = bandFlags[i] !== 0;\n for (let c = 0; c < columns && !recompute; c++) if (!Number.isFinite(values[(first + i) * columns + c]!)) recompute = true;\n if (recompute) recomputed.push(first + i);\n }\n } finally { band.release(); }\n if (yieldControl && gate.due()) { await yieldControl(abort.signal); gate.restart(); }\n }\n } finally { scope.release(); }\n checkAbort(abort.signal);\n integrateChartQueries(plan, values, recomputed);\n for (const q of recomputed) for (let c = 0; c < columns; c++) values[q * columns + c] = plan.queryValue(points, indices, q, c);\n const execution: ImageKernelExecution = webGpuExecution({ kind: \"relative-to-reference\", relative: 2 ** -24, absolute: 2 ** -126 }, 0);\n return { plan, values, columns, execution, hostRecomputedQueryIndices: Uint32Array.from(recomputed) };\n}\n"]}
|
|
@@ -11,10 +11,9 @@ import { calculatePointGridCenters } from "../facade/chart-scenes.js";
|
|
|
11
11
|
import { ImageKernelExecutionError, webGpuExecution } from "./image-kernel-execution.js";
|
|
12
12
|
import { BUFFER_USAGE, GpuResourceScope, linearDispatch, runComputePass, throwIfAborted as checkAbort } from "./webgpu-runtime.js";
|
|
13
13
|
import { CHART_PRESET_CODE, CHART_RADIANCE_WGSL, CHART_WORKGROUP_SIZE } from "./wgsl-chart-kernel.js";
|
|
14
|
-
import { evaluateChartCompositeOnGpu } from "./chart-composite-gpu.js";
|
|
14
|
+
import { chartMaterialTable, evaluateChartCompositeOnGpu, integrateChartQueries } from "./chart-composite-gpu.js";
|
|
15
15
|
/** Frame-unit magnitude limit for GPU points. */
|
|
16
16
|
export const CHART_GPU_MAXIMUM_COORDINATE = 2 ** 20;
|
|
17
|
-
const FLOAT32_SAFE_MAGNITUDE = 2 ** 120;
|
|
18
17
|
export async function evaluateChartRadianceOnCpu(input, abort, yieldControl, execution) {
|
|
19
18
|
const plan = calculateChartRadianceBatchPlan(input), points = input.points.slice(), indices = input.wavelengthIndices?.slice();
|
|
20
19
|
const values = new Float64Array(plan.queryCount * plan.columns), gate = createHostYieldGate();
|
|
@@ -80,33 +79,6 @@ export function chartGpuConstants(plan) {
|
|
|
80
79
|
default: throw new ImageKernelExecutionError("unsupported-on-backend", "webgpu-f32 classifies the eight 2.0 chart presets; use cpu-reference for " + chart.preset + ".");
|
|
81
80
|
}
|
|
82
81
|
}
|
|
83
|
-
/** Per-material values in float64, with the reference's operations; a material whose spectrum fails is NaN (recomputed on the host). */
|
|
84
|
-
function materialTable(plan) {
|
|
85
|
-
const materials = plan.chart.materials.length, nm = plan.wavelengthsNanometers, stride = plan.mode === "radiance" ? nm.length : plan.columns;
|
|
86
|
-
const table = new Float32Array(materials * stride);
|
|
87
|
-
for (let m = 0; m < materials; m++) {
|
|
88
|
-
for (let c = 0; c < stride; c++) {
|
|
89
|
-
let value;
|
|
90
|
-
try {
|
|
91
|
-
if (plan.mode === "radiance")
|
|
92
|
-
value = plan.materialRadiance(m, nm[c]);
|
|
93
|
-
else {
|
|
94
|
-
value = 0;
|
|
95
|
-
const row = plan.channelWeights[c];
|
|
96
|
-
for (let j = 0; j < nm.length; j++)
|
|
97
|
-
value += row[j] * plan.materialRadiance(m, nm[j]);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
catch {
|
|
101
|
-
value = Number.NaN;
|
|
102
|
-
}
|
|
103
|
-
if (Math.abs(value) > FLOAT32_SAFE_MAGNITUDE)
|
|
104
|
-
throw new ImageKernelExecutionError("unsupported-float32-domain", "Chart values exceed the float32 domain.");
|
|
105
|
-
table[m * stride + c] = value;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
return table;
|
|
109
|
-
}
|
|
110
82
|
export async function evaluateChartRadianceOnGpu(runtime, bandBytes, input, abort, yieldControl, pipelines, uploads) {
|
|
111
83
|
const plan = calculateChartRadianceBatchPlan(input), points = input.points.slice(), indices = input.wavelengthIndices?.slice();
|
|
112
84
|
const presetCode = chartGpuPresetCode(plan);
|
|
@@ -116,7 +88,7 @@ export async function evaluateChartRadianceOnGpu(runtime, bandBytes, input, abor
|
|
|
116
88
|
if (Math.abs(points[i]) > CHART_GPU_MAXIMUM_COORDINATE)
|
|
117
89
|
throw new ImageKernelExecutionError("unsupported-float32-domain", "Chart points beyond 2^20 frame units are outside the float32 domain.");
|
|
118
90
|
}
|
|
119
|
-
const { ints, floats, aux } = chartGpuConstants(plan), table =
|
|
91
|
+
const { ints, floats, aux } = chartGpuConstants(plan), table = chartMaterialTable(plan), radianceMode = plan.mode === "radiance";
|
|
120
92
|
const columns = plan.columns, stride = radianceMode ? plan.wavelengthsNanometers.length : columns, count = plan.queryCount;
|
|
121
93
|
const bytesPerQuery = 8 + 4 * columns + 4 + 4;
|
|
122
94
|
const rows = Math.max(1, Math.floor(bandBytes / bytesPerQuery));
|
|
@@ -179,6 +151,8 @@ export async function evaluateChartRadianceOnGpu(runtime, bandBytes, input, abor
|
|
|
179
151
|
scope.release();
|
|
180
152
|
}
|
|
181
153
|
checkAbort(abort.signal);
|
|
154
|
+
// Spectral integrals: each query's material spectrum against the channel weights, when it is read (2.21.0).
|
|
155
|
+
integrateChartQueries(plan, values, recomputed);
|
|
182
156
|
// Flagged points (and any whose material spectrum failed): the reference's own value, rounded once to float32.
|
|
183
157
|
for (const q of recomputed)
|
|
184
158
|
for (let c = 0; c < columns; c++)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-radiance-gpu.js","sourceRoot":"","sources":["../../src/gpu/chart-radiance-gpu.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Host side of the `webgpu-f32` chart-radiance stage (#277): per-material value tables in float64 (the\n * reference's own operations), preset constants, banded dispatch, readback, and host recomputation of\n * flagged points with the reference. The float64 reference is `calculateChartRadianceBatch`\n * (facade/chart-radiance-batch.ts). Internal; the public entry point is the image-kernel accelerator.\n */\nimport { createHostYieldGate } from \"../capture/host-yield-cadence.js\";\nimport { calculateChartRadianceBatchPlan, type ChartRadianceBatchInput, type ChartRadianceBatchPlan } from \"../facade/chart-radiance-batch.js\";\nimport { calculatePointGridCenters } from \"../facade/chart-scenes.js\";\nimport { ImageKernelExecutionError, webGpuExecution, type ImageKernelExecution } from \"./image-kernel-execution.js\";\nimport type { ChartRadianceResult } from \"./image-kernel-accelerator.js\";\nimport { BUFFER_USAGE, GpuResourceScope, linearDispatch, runComputePass, type WebGpuRuntime, throwIfAborted as checkAbort } from \"./webgpu-runtime.js\";\nimport { CHART_PRESET_CODE, CHART_RADIANCE_WGSL, CHART_WORKGROUP_SIZE } from \"./wgsl-chart-kernel.js\";\nimport { evaluateChartCompositeOnGpu, type ChartSceneUploads } from \"./chart-composite-gpu.js\";\n\ntype PipelineSource = (label: string, code: string) => Promise<GPUComputePipeline>;\ntype YieldControl = ((signal: AbortSignal) => Promise<void>) | undefined;\n\n/** Frame-unit magnitude limit for GPU points. */\nexport const CHART_GPU_MAXIMUM_COORDINATE = 2 ** 20;\nconst FLOAT32_SAFE_MAGNITUDE = 2 ** 120;\n\nexport async function evaluateChartRadianceOnCpu(input: ChartRadianceBatchInput, abort: AbortController, yieldControl: YieldControl,\n execution: ImageKernelExecution): Promise<ChartRadianceResult> {\n const plan = calculateChartRadianceBatchPlan(input), points = input.points.slice(), indices = input.wavelengthIndices?.slice();\n const values = new Float64Array(plan.queryCount * plan.columns), gate = createHostYieldGate();\n for (let q = 0; q < plan.queryCount; q++) {\n for (let c = 0; c < plan.columns; c++) values[q * plan.columns + c] = plan.queryValue(points, indices, q, c);\n if ((q & 0xffff) === 0xffff) {\n checkAbort(abort.signal);\n if (yieldControl && gate.due()) { await yieldControl(abort.signal); gate.restart(); }\n }\n }\n checkAbort(abort.signal);\n return { plan, values, columns: plan.columns, execution, hostRecomputedQueryIndices: new Uint32Array(0) };\n}\n\n/**\n * The preset code of a chart the preset kernel (wgsl-chart-kernel.ts) classifies, or undefined. That kernel covers\n * the eight 2.0 presets as plain charts (a Siemens star only with the bar profile). Everything else, the 2.3\n * elements, the sine star, `composite` charts and `material-layers` scenes, runs on the composite kernel (#477,\n * chart-composite-gpu.ts). @internal\n */\nexport function chartGpuPresetCode(plan: ChartRadianceBatchPlan): number | undefined {\n const preset = plan.chart.preset;\n if (plan.layers || !Object.prototype.hasOwnProperty.call(CHART_PRESET_CODE, preset) || plan.chart.parameters.profile === \"sine\") return undefined;\n return CHART_PRESET_CODE[preset as keyof typeof CHART_PRESET_CODE];\n}\n\n/** Preset constants (uniform words 3–5 and floats 8–15) and the auxiliary table. @internal */\nexport function chartGpuConstants(plan: ChartRadianceBatchPlan): { ints: [number, number, number]; floats: number[]; aux: Float32Array<ArrayBuffer> } {\n const chart = plan.chart, p = chart.parameters as Record<string, number>, aspect = chart.aspect;\n switch (chart.preset) {\n case \"uniform\": return { ints: [0, 0, 0], floats: [], aux: new Float32Array(1) };\n case \"slanted-edge\": {\n // The same float64 constants as resolveChartScene.\n const t = p.angleDegrees! * Math.PI / 180;\n return { ints: [0, 0, 0], floats: [Math.cos(t), Math.sin(t)], aux: new Float32Array(1) };\n }\n case \"siemens-star\": {\n const cycles = p.cycles!, r = p.radiusFraction! * aspect, aux = new Float32Array(2 * (2 * cycles + 1));\n // Sector boundaries: phase·2·cycles = k ⇔ θ = π(k/cycles − 1).\n for (let k = 0; k <= 2 * cycles; k++) { const b = Math.PI * (k / cycles - 1); aux[2 * k] = Math.cos(b); aux[2 * k + 1] = Math.sin(b); }\n return { ints: [cycles, 0, 0], floats: [r * r], aux };\n }\n case \"step-wedge\": return { ints: [p.steps!, 0, 0], floats: [p.steps! / 2], aux: new Float32Array(1) };\n case \"grey-ramp\": return { ints: [1024, 0, 0], floats: [512], aux: new Float32Array(1) };\n case \"checkerboard\": return { ints: [0, 0, 0], floats: [p.squaresAcross! / 2, aspect], aux: new Float32Array(1) };\n case \"point-grid\": {\n const columns = p.columns!, rows = p.rows!, centers = calculatePointGridCenters({ columns, rows, aspect });\n return { ints: [columns, rows, 0], floats: [columns / 2, aspect, rows / (2 * aspect), p.radius! * p.radius!],\n aux: Float32Array.from(centers.flatMap(c => [c.u, c.v])) };\n }\n case \"patches\": {\n const columns = p.columns!, rows = p.rows!, count = (chart.parameters.patchIds as readonly string[]).length;\n return { ints: [columns, rows, count], floats: [columns / 2, aspect, rows / (2 * aspect), p.gapFraction! / 2, 1 - p.gapFraction! / 2],\n aux: new Float32Array(1) };\n }\n default: throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"webgpu-f32 classifies the eight 2.0 chart presets; use cpu-reference for \" + chart.preset + \".\");\n }\n}\n\n/** Per-material values in float64, with the reference's operations; a material whose spectrum fails is NaN (recomputed on the host). */\nfunction materialTable(plan: ChartRadianceBatchPlan): Float32Array<ArrayBuffer> {\n const materials = plan.chart.materials.length, nm = plan.wavelengthsNanometers, stride = plan.mode === \"radiance\" ? nm.length : plan.columns;\n const table = new Float32Array(materials * stride);\n for (let m = 0; m < materials; m++) {\n for (let c = 0; c < stride; c++) {\n let value: number;\n try {\n if (plan.mode === \"radiance\") value = plan.materialRadiance(m, nm[c]!);\n else {\n value = 0;\n const row = plan.channelWeights![c]!;\n for (let j = 0; j < nm.length; j++) value += row[j]! * plan.materialRadiance(m, nm[j]!);\n }\n } catch {\n value = Number.NaN;\n }\n if (Math.abs(value) > FLOAT32_SAFE_MAGNITUDE) throw new ImageKernelExecutionError(\"unsupported-float32-domain\", \"Chart values exceed the float32 domain.\");\n table[m * stride + c] = value;\n }\n }\n return table;\n}\n\nexport async function evaluateChartRadianceOnGpu(runtime: WebGpuRuntime, bandBytes: number, input: ChartRadianceBatchInput, abort: AbortController,\n yieldControl: YieldControl, pipelines: PipelineSource, uploads: ChartSceneUploads): Promise<ChartRadianceResult> {\n const plan = calculateChartRadianceBatchPlan(input), points = input.points.slice(), indices = input.wavelengthIndices?.slice();\n const presetCode = chartGpuPresetCode(plan);\n if (presetCode === undefined) return evaluateChartCompositeOnGpu(runtime, bandBytes, plan, input.scene, points, indices, abort, yieldControl, pipelines, uploads);\n for (let i = 0; i < points.length; i++) {\n if (Math.abs(points[i]!) > CHART_GPU_MAXIMUM_COORDINATE) throw new ImageKernelExecutionError(\"unsupported-float32-domain\", \"Chart points beyond 2^20 frame units are outside the float32 domain.\");\n }\n const { ints, floats, aux } = chartGpuConstants(plan), table = materialTable(plan), radianceMode = plan.mode === \"radiance\";\n const columns = plan.columns, stride = radianceMode ? plan.wavelengthsNanometers.length : columns, count = plan.queryCount;\n const bytesPerQuery = 8 + 4 * columns + 4 + 4;\n const rows = Math.max(1, Math.floor(bandBytes / bytesPerQuery));\n if (Math.max(table.byteLength, aux.byteLength, Math.min(rows, count) * 4 * columns) > runtime.maximumStorageBindingBytes) {\n throw new ImageKernelExecutionError(\"insufficient-limits\", \"Chart tables or bands exceed the device's storage binding limit.\");\n }\n const params = new ArrayBuffer(64), words = new Uint32Array(params), f = new Float32Array(params);\n words[1] = stride; words[2] = presetCode; words[3] = ints[0]; words[4] = ints[1]; words[5] = ints[2]; words[6] = radianceMode ? 1 : 0;\n f.set(floats, 8);\n const pipeline = await pipelines(\"photivra-chart-radiance\", CHART_RADIANCE_WGSL);\n const values = new Float32Array(count * columns), recomputed: number[] = [];\n const scope = new GpuResourceScope(runtime);\n try {\n const tableBuffer = scope.upload(\"photivra-chart-table\", table, BUFFER_USAGE.STORAGE);\n const auxBuffer = scope.upload(\"photivra-chart-aux\", aux, BUFFER_USAGE.STORAGE);\n const gate = createHostYieldGate();\n for (let first = 0; first < count; first += rows) {\n checkAbort(abort.signal);\n const n = Math.min(rows, count - first);\n words[0] = n;\n const band = new GpuResourceScope(runtime);\n try {\n const pointBuffer = band.upload(\"photivra-chart-points\", new Float32Array(points.subarray(2 * first, 2 * (first + n))), BUFFER_USAGE.STORAGE);\n const selectors = band.upload(\"photivra-chart-selectors\", indices ? Uint32Array.from(indices.subarray(first, first + n)) : new Uint32Array(1), BUFFER_USAGE.STORAGE);\n const out = band.buffer(\"photivra-chart-values\", n * 4 * columns, BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);\n const flagBuffer = band.buffer(\"photivra-chart-flags\", n * 4, BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);\n const uniform = band.upload(\"photivra-chart-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: pointBuffer } }, { binding: 2, resource: { buffer: tableBuffer } },\n { binding: 3, resource: { buffer: auxBuffer } }, { binding: 4, resource: { buffer: selectors } }, { binding: 5, resource: { buffer: out } },\n { binding: 6, resource: { buffer: flagBuffer } }] });\n const [valueData, flagData] = await runComputePass(runtime, band, pipeline, bindGroup, linearDispatch(n, CHART_WORKGROUP_SIZE, runtime.maximumWorkgroupsPerDimension),\n [{ buffer: out, bytes: n * 4 * columns }, { buffer: flagBuffer, bytes: n * 4 }], abort.signal);\n values.set(new Float32Array(valueData!, 0, n * columns), first * columns);\n const bandFlags = new Uint32Array(flagData!, 0, n);\n for (let i = 0; i < n; i++) {\n let recompute = bandFlags[i] !== 0;\n for (let c = 0; c < columns && !recompute; c++) if (!Number.isFinite(values[(first + i) * columns + c]!)) recompute = true;\n if (recompute) recomputed.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 // Flagged points (and any whose material spectrum failed): the reference's own value, rounded once to float32.\n for (const q of recomputed) for (let c = 0; c < columns; c++) values[q * columns + c] = plan.queryValue(points, indices, q, c);\n const execution = webGpuExecution({ kind: \"relative-to-reference\", relative: 2 ** -24, absolute: 2 ** -126 }, 0);\n return { plan, values, columns, execution, hostRecomputedQueryIndices: Uint32Array.from(recomputed) };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"chart-radiance-gpu.js","sourceRoot":"","sources":["../../src/gpu/chart-radiance-gpu.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Host side of the `webgpu-f32` chart-radiance stage (#277): per-material value tables in float64 (the\n * reference's own operations), preset constants, banded dispatch, readback, and host recomputation of\n * flagged points with the reference. The float64 reference is `calculateChartRadianceBatch`\n * (facade/chart-radiance-batch.ts). Internal; the public entry point is the image-kernel accelerator.\n */\nimport { createHostYieldGate } from \"../capture/host-yield-cadence.js\";\nimport { calculateChartRadianceBatchPlan, type ChartRadianceBatchInput, type ChartRadianceBatchPlan } from \"../facade/chart-radiance-batch.js\";\nimport { calculatePointGridCenters } from \"../facade/chart-scenes.js\";\nimport { ImageKernelExecutionError, webGpuExecution, type ImageKernelExecution } from \"./image-kernel-execution.js\";\nimport type { ChartRadianceResult } from \"./image-kernel-accelerator.js\";\nimport { BUFFER_USAGE, GpuResourceScope, linearDispatch, runComputePass, type WebGpuRuntime, throwIfAborted as checkAbort } from \"./webgpu-runtime.js\";\nimport { CHART_PRESET_CODE, CHART_RADIANCE_WGSL, CHART_WORKGROUP_SIZE } from \"./wgsl-chart-kernel.js\";\nimport { chartMaterialTable, evaluateChartCompositeOnGpu, integrateChartQueries, type ChartSceneUploads } from \"./chart-composite-gpu.js\";\n\ntype PipelineSource = (label: string, code: string) => Promise<GPUComputePipeline>;\ntype YieldControl = ((signal: AbortSignal) => Promise<void>) | undefined;\n\n/** Frame-unit magnitude limit for GPU points. */\nexport const CHART_GPU_MAXIMUM_COORDINATE = 2 ** 20;\n\nexport async function evaluateChartRadianceOnCpu(input: ChartRadianceBatchInput, abort: AbortController, yieldControl: YieldControl,\n execution: ImageKernelExecution): Promise<ChartRadianceResult> {\n const plan = calculateChartRadianceBatchPlan(input), points = input.points.slice(), indices = input.wavelengthIndices?.slice();\n const values = new Float64Array(plan.queryCount * plan.columns), gate = createHostYieldGate();\n for (let q = 0; q < plan.queryCount; q++) {\n for (let c = 0; c < plan.columns; c++) values[q * plan.columns + c] = plan.queryValue(points, indices, q, c);\n if ((q & 0xffff) === 0xffff) {\n checkAbort(abort.signal);\n if (yieldControl && gate.due()) { await yieldControl(abort.signal); gate.restart(); }\n }\n }\n checkAbort(abort.signal);\n return { plan, values, columns: plan.columns, execution, hostRecomputedQueryIndices: new Uint32Array(0) };\n}\n\n/**\n * The preset code of a chart the preset kernel (wgsl-chart-kernel.ts) classifies, or undefined. That kernel covers\n * the eight 2.0 presets as plain charts (a Siemens star only with the bar profile). Everything else, the 2.3\n * elements, the sine star, `composite` charts and `material-layers` scenes, runs on the composite kernel (#477,\n * chart-composite-gpu.ts). @internal\n */\nexport function chartGpuPresetCode(plan: ChartRadianceBatchPlan): number | undefined {\n const preset = plan.chart.preset;\n if (plan.layers || !Object.prototype.hasOwnProperty.call(CHART_PRESET_CODE, preset) || plan.chart.parameters.profile === \"sine\") return undefined;\n return CHART_PRESET_CODE[preset as keyof typeof CHART_PRESET_CODE];\n}\n\n/** Preset constants (uniform words 3–5 and floats 8–15) and the auxiliary table. @internal */\nexport function chartGpuConstants(plan: ChartRadianceBatchPlan): { ints: [number, number, number]; floats: number[]; aux: Float32Array<ArrayBuffer> } {\n const chart = plan.chart, p = chart.parameters as Record<string, number>, aspect = chart.aspect;\n switch (chart.preset) {\n case \"uniform\": return { ints: [0, 0, 0], floats: [], aux: new Float32Array(1) };\n case \"slanted-edge\": {\n // The same float64 constants as resolveChartScene.\n const t = p.angleDegrees! * Math.PI / 180;\n return { ints: [0, 0, 0], floats: [Math.cos(t), Math.sin(t)], aux: new Float32Array(1) };\n }\n case \"siemens-star\": {\n const cycles = p.cycles!, r = p.radiusFraction! * aspect, aux = new Float32Array(2 * (2 * cycles + 1));\n // Sector boundaries: phase·2·cycles = k ⇔ θ = π(k/cycles − 1).\n for (let k = 0; k <= 2 * cycles; k++) { const b = Math.PI * (k / cycles - 1); aux[2 * k] = Math.cos(b); aux[2 * k + 1] = Math.sin(b); }\n return { ints: [cycles, 0, 0], floats: [r * r], aux };\n }\n case \"step-wedge\": return { ints: [p.steps!, 0, 0], floats: [p.steps! / 2], aux: new Float32Array(1) };\n case \"grey-ramp\": return { ints: [1024, 0, 0], floats: [512], aux: new Float32Array(1) };\n case \"checkerboard\": return { ints: [0, 0, 0], floats: [p.squaresAcross! / 2, aspect], aux: new Float32Array(1) };\n case \"point-grid\": {\n const columns = p.columns!, rows = p.rows!, centers = calculatePointGridCenters({ columns, rows, aspect });\n return { ints: [columns, rows, 0], floats: [columns / 2, aspect, rows / (2 * aspect), p.radius! * p.radius!],\n aux: Float32Array.from(centers.flatMap(c => [c.u, c.v])) };\n }\n case \"patches\": {\n const columns = p.columns!, rows = p.rows!, count = (chart.parameters.patchIds as readonly string[]).length;\n return { ints: [columns, rows, count], floats: [columns / 2, aspect, rows / (2 * aspect), p.gapFraction! / 2, 1 - p.gapFraction! / 2],\n aux: new Float32Array(1) };\n }\n default: throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"webgpu-f32 classifies the eight 2.0 chart presets; use cpu-reference for \" + chart.preset + \".\");\n }\n}\n\nexport async function evaluateChartRadianceOnGpu(runtime: WebGpuRuntime, bandBytes: number, input: ChartRadianceBatchInput, abort: AbortController,\n yieldControl: YieldControl, pipelines: PipelineSource, uploads: ChartSceneUploads): Promise<ChartRadianceResult> {\n const plan = calculateChartRadianceBatchPlan(input), points = input.points.slice(), indices = input.wavelengthIndices?.slice();\n const presetCode = chartGpuPresetCode(plan);\n if (presetCode === undefined) return evaluateChartCompositeOnGpu(runtime, bandBytes, plan, input.scene, points, indices, abort, yieldControl, pipelines, uploads);\n for (let i = 0; i < points.length; i++) {\n if (Math.abs(points[i]!) > CHART_GPU_MAXIMUM_COORDINATE) throw new ImageKernelExecutionError(\"unsupported-float32-domain\", \"Chart points beyond 2^20 frame units are outside the float32 domain.\");\n }\n const { ints, floats, aux } = chartGpuConstants(plan), table = chartMaterialTable(plan), radianceMode = plan.mode === \"radiance\";\n const columns = plan.columns, stride = radianceMode ? plan.wavelengthsNanometers.length : columns, count = plan.queryCount;\n const bytesPerQuery = 8 + 4 * columns + 4 + 4;\n const rows = Math.max(1, Math.floor(bandBytes / bytesPerQuery));\n if (Math.max(table.byteLength, aux.byteLength, Math.min(rows, count) * 4 * columns) > runtime.maximumStorageBindingBytes) {\n throw new ImageKernelExecutionError(\"insufficient-limits\", \"Chart tables or bands exceed the device's storage binding limit.\");\n }\n const params = new ArrayBuffer(64), words = new Uint32Array(params), f = new Float32Array(params);\n words[1] = stride; words[2] = presetCode; words[3] = ints[0]; words[4] = ints[1]; words[5] = ints[2]; words[6] = radianceMode ? 1 : 0;\n f.set(floats, 8);\n const pipeline = await pipelines(\"photivra-chart-radiance\", CHART_RADIANCE_WGSL);\n const values = new Float32Array(count * columns), recomputed: number[] = [];\n const scope = new GpuResourceScope(runtime);\n try {\n const tableBuffer = scope.upload(\"photivra-chart-table\", table, BUFFER_USAGE.STORAGE);\n const auxBuffer = scope.upload(\"photivra-chart-aux\", aux, BUFFER_USAGE.STORAGE);\n const gate = createHostYieldGate();\n for (let first = 0; first < count; first += rows) {\n checkAbort(abort.signal);\n const n = Math.min(rows, count - first);\n words[0] = n;\n const band = new GpuResourceScope(runtime);\n try {\n const pointBuffer = band.upload(\"photivra-chart-points\", new Float32Array(points.subarray(2 * first, 2 * (first + n))), BUFFER_USAGE.STORAGE);\n const selectors = band.upload(\"photivra-chart-selectors\", indices ? Uint32Array.from(indices.subarray(first, first + n)) : new Uint32Array(1), BUFFER_USAGE.STORAGE);\n const out = band.buffer(\"photivra-chart-values\", n * 4 * columns, BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);\n const flagBuffer = band.buffer(\"photivra-chart-flags\", n * 4, BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);\n const uniform = band.upload(\"photivra-chart-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: pointBuffer } }, { binding: 2, resource: { buffer: tableBuffer } },\n { binding: 3, resource: { buffer: auxBuffer } }, { binding: 4, resource: { buffer: selectors } }, { binding: 5, resource: { buffer: out } },\n { binding: 6, resource: { buffer: flagBuffer } }] });\n const [valueData, flagData] = await runComputePass(runtime, band, pipeline, bindGroup, linearDispatch(n, CHART_WORKGROUP_SIZE, runtime.maximumWorkgroupsPerDimension),\n [{ buffer: out, bytes: n * 4 * columns }, { buffer: flagBuffer, bytes: n * 4 }], abort.signal);\n values.set(new Float32Array(valueData!, 0, n * columns), first * columns);\n const bandFlags = new Uint32Array(flagData!, 0, n);\n for (let i = 0; i < n; i++) {\n let recompute = bandFlags[i] !== 0;\n for (let c = 0; c < columns && !recompute; c++) if (!Number.isFinite(values[(first + i) * columns + c]!)) recompute = true;\n if (recompute) recomputed.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 // Spectral integrals: each query's material spectrum against the channel weights, when it is read (2.21.0).\n integrateChartQueries(plan, values, recomputed);\n // Flagged points (and any whose material spectrum failed): the reference's own value, rounded once to float32.\n for (const q of recomputed) for (let c = 0; c < columns; c++) values[q * columns + c] = plan.queryValue(points, indices, q, c);\n const execution = webGpuExecution({ kind: \"relative-to-reference\", relative: 2 ** -24, absolute: 2 ** -126 }, 0);\n return { plan, values, columns, execution, hostRecomputedQueryIndices: Uint32Array.from(recomputed) };\n}\n"]}
|
|
@@ -3,6 +3,7 @@ import type { DisplayViewExpectedSignalInput } from "../facade/expected-signal.j
|
|
|
3
3
|
import type { DisplayViewGpuSetup } from "../facade/display-view.js";
|
|
4
4
|
import { type WebGpuRuntime } from "./webgpu-runtime.js";
|
|
5
5
|
import type { DisplayViewGpuMaterialModule } from "./display-view-speed-gpu.js";
|
|
6
|
+
import type { DisplayViewQualityImagePasses } from "./display-view-quality-gpu.js";
|
|
6
7
|
type PipelineSource = (label: string, code: string) => Promise<GPUComputePipeline>;
|
|
7
8
|
/** The module's id in the pipeline cache (one shader per product path for every composite scene; the scene is data): the Dekker path's. */
|
|
8
9
|
export declare const CHART_COMPOSITE_MATERIAL_MODULE_ID = "chart-composite";
|
|
@@ -25,11 +26,14 @@ export declare const DISPLAY_VIEW_LATTICE: Readonly<{
|
|
|
25
26
|
words: 12;
|
|
26
27
|
}>;
|
|
27
28
|
/**
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* defines `material_at(p: vec2<f32>)` (see the module comment). The constants E and SLACK come from the kernel's preamble. `path`
|
|
31
|
-
* is the double-word product path the device's probe chose (default Dekker's).
|
|
29
|
+
* #581: the composite kernel's common part (double-float32 with its rounding barrier, the bound arithmetic, `bfloor`) renamed for a
|
|
30
|
+
* display-view module (shared by the composite and the image-plane modules); the kernel's preamble gives E and SLACK.
|
|
32
31
|
*/
|
|
32
|
+
export declare function displayViewModuleCommonWgsl(path: ChartCompositeProductPath): string;
|
|
33
|
+
/** The lattice uniform and the offsets table of a display-view module (@group(1) bindings 2 and 3; `DISPLAY_VIEW_LATTICE`). */
|
|
34
|
+
export declare const LATTICE_BINDINGS_WGSL = "struct LatticeParams {\n scale_u_hi: f32, scale_u_lo: f32, scale_v_hi: f32, scale_v_lo: f32,\n chart_k_hi: f32, chart_k_lo: f32, chart_aspect: f32, tolerance: f32,\n offsets: u32, placed: u32, surround: u32, zero: u32,\n};\n@group(1) @binding(2) var<uniform> lattice: LatticeParams;\n@group(1) @binding(3) var<storage, read> lattice_offsets: array<vec4<f32>>;";
|
|
35
|
+
/** The exact lattice point recovery (see the module comment), shared by the composite and the image-plane modules. */
|
|
36
|
+
export declare const LATTICE_POINT_WGSL = "// The exact lattice point of one axis from the kernel's p = fl(fl(x + c)\u00B7scale): the offset whose constant c puts p/scale\n// nearest an integer x, then (x + c)\u00B7scale in double-float32 from the exact integer and the float64 constants (hi + lo).\nfn lattice_point(p: f32, scale: D, axis: u32) -> D {\n let rough = p / scale.h;\n var best = 3.0e38; var site = 0.0; var c_hi = 0.0; var c_lo = 0.0;\n for (var o = 0u; o < lattice.offsets; o = o + 1u) {\n let row = lattice_offsets[o];\n let hi = select(row.z, row.x, axis == 0u);\n let lo = select(row.w, row.y, axis == 0u);\n let d = rough - hi;\n let n = round(d);\n let r = abs(d - n);\n if (r < best) { best = r; site = n; c_hi = hi; c_lo = lo; }\n }\n if (!(best <= lattice.tolerance)) { material_uncertain = true; }\n return d_mul(d_add(D(site, 0.0), D(c_hi, c_lo)), scale);\n}";
|
|
33
37
|
export declare function chartCompositeMaterialWgsl(path?: ChartCompositeProductPath): string;
|
|
34
38
|
/** A fixed-size chart's placement for the module: chart-local frame units per frame unit (m/h) and the chart's aspect. */
|
|
35
39
|
export interface DisplayViewChartPlacement {
|
|
@@ -60,6 +64,8 @@ export declare function displayViewLatticeConstants(signalInput: DisplayViewExpe
|
|
|
60
64
|
export interface DisplayViewMaterialModules {
|
|
61
65
|
/** The module of a setup's scene, or an `unsupported-on-backend` error (a caller function scene, a failed probe, a materials mismatch). */
|
|
62
66
|
moduleFor(gpu: DisplayViewGpuSetup, signal: AbortSignal): Promise<DisplayViewGpuMaterialModule>;
|
|
67
|
+
/** #581: an image-plane print's Quality passes (after `prepareImagePlaneScenes()`), or an `unsupported-on-backend` error. */
|
|
68
|
+
imagePasses(gpu: DisplayViewGpuSetup, signal: AbortSignal): Promise<DisplayViewQualityImagePasses>;
|
|
63
69
|
/** Uploaded scenes (for tests). */
|
|
64
70
|
readonly uploadedScenes: number;
|
|
65
71
|
release(): void;
|