@photivra/engine 2.12.0 → 2.14.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.
Files changed (148) hide show
  1. package/CHANGELOG.md +144 -1
  2. package/CITATION.cff +1 -1
  3. package/README.md +7 -7
  4. package/SECURITY.md +1 -1
  5. package/THIRD_PARTY.md +3 -0
  6. package/dist/camera/lens-projection.js +2 -1
  7. package/dist/camera/lens-projection.js.map +1 -1
  8. package/dist/capture/dng-import.js +1 -1
  9. package/dist/capture/dng-import.js.map +1 -1
  10. package/dist/capture/export-jpeg.d.ts +1 -1
  11. package/dist/capture/export-jpeg.js +6 -4
  12. package/dist/capture/export-jpeg.js.map +1 -1
  13. package/dist/capture/host-yield-cadence.js +1 -1
  14. package/dist/capture/host-yield-cadence.js.map +1 -1
  15. package/dist/capture/native-environment-optical-stage.js +1 -1
  16. package/dist/capture/native-environment-optical-stage.js.map +1 -1
  17. package/dist/capture/native-raw.js +1 -1
  18. package/dist/capture/native-raw.js.map +1 -1
  19. package/dist/capture/packed-sensor-raw.js +3 -3
  20. package/dist/capture/packed-sensor-raw.js.map +1 -1
  21. package/dist/capture/sensor-raw-producer.js +1 -1
  22. package/dist/capture/sensor-raw-producer.js.map +1 -1
  23. package/dist/color/capture-color.js +3 -3
  24. package/dist/color/capture-color.js.map +1 -1
  25. package/dist/color/chromatic-adaptation.js +2 -2
  26. package/dist/color/chromatic-adaptation.js.map +1 -1
  27. package/dist/color/color-matching-functions.js +1 -1
  28. package/dist/color/color-matching-functions.js.map +1 -1
  29. package/dist/color/colorimetry-math.js +2 -2
  30. package/dist/color/colorimetry-math.js.map +1 -1
  31. package/dist/color/illuminants.js +3 -3
  32. package/dist/color/illuminants.js.map +1 -1
  33. package/dist/color/rgb-color-spaces.js +1 -1
  34. package/dist/color/rgb-color-spaces.js.map +1 -1
  35. package/dist/color/sensor-color-development.js +1 -1
  36. package/dist/color/sensor-color-development.js.map +1 -1
  37. package/dist/core/record-validation.js +3 -3
  38. package/dist/core/record-validation.js.map +1 -1
  39. package/dist/core/version.d.ts +1 -1
  40. package/dist/core/version.js +1 -1
  41. package/dist/core/version.js.map +1 -1
  42. package/dist/equipment/generic-prime-lenses.js +3 -3
  43. package/dist/equipment/generic-prime-lenses.js.map +1 -1
  44. package/dist/equipment/generic-tier-assets.d.ts +23 -1
  45. package/dist/equipment/generic-tier-assets.js +58 -30
  46. package/dist/equipment/generic-tier-assets.js.map +1 -1
  47. package/dist/equipment/generic-tier-presets.d.ts +6 -3
  48. package/dist/equipment/generic-tier-presets.js +26 -13
  49. package/dist/equipment/generic-tier-presets.js.map +1 -1
  50. package/dist/exposure/auto-iso-slowest-shutter.d.ts +120 -0
  51. package/dist/exposure/auto-iso-slowest-shutter.js +217 -0
  52. package/dist/exposure/auto-iso-slowest-shutter.js.map +1 -0
  53. package/dist/exposure/exposure-mode-resolver.d.ts +57 -1
  54. package/dist/exposure/exposure-mode-resolver.js +238 -33
  55. package/dist/exposure/exposure-mode-resolver.js.map +1 -1
  56. package/dist/exposure/flash-ttl.js +1 -1
  57. package/dist/exposure/flash-ttl.js.map +1 -1
  58. package/dist/exposure/flash.js +1 -1
  59. package/dist/exposure/flash.js.map +1 -1
  60. package/dist/facade/chart-material-layers.js +2 -2
  61. package/dist/facade/chart-material-layers.js.map +1 -1
  62. package/dist/facade/chart-radiance-batch.js +1 -1
  63. package/dist/facade/chart-radiance-batch.js.map +1 -1
  64. package/dist/facade/chart-scenes.d.ts +45 -8
  65. package/dist/facade/chart-scenes.js +101 -44
  66. package/dist/facade/chart-scenes.js.map +1 -1
  67. package/dist/facade/color-patches.d.ts +129 -0
  68. package/dist/facade/color-patches.js +209 -0
  69. package/dist/facade/color-patches.js.map +1 -0
  70. package/dist/facade/diffraction-provider.js +12 -13
  71. package/dist/facade/diffraction-provider.js.map +1 -1
  72. package/dist/facade/display-view-gpu.js +1 -1
  73. package/dist/facade/display-view-gpu.js.map +1 -1
  74. package/dist/facade/display-view.d.ts +27 -0
  75. package/dist/facade/display-view.js +234 -65
  76. package/dist/facade/display-view.js.map +1 -1
  77. package/dist/facade/scene-radiance.js +2 -2
  78. package/dist/facade/scene-radiance.js.map +1 -1
  79. package/dist/facade/simulate-capture.d.ts +139 -12
  80. package/dist/facade/simulate-capture.js +209 -36
  81. package/dist/facade/simulate-capture.js.map +1 -1
  82. package/dist/facade/simulate-display-view.js +2 -2
  83. package/dist/facade/simulate-display-view.js.map +1 -1
  84. package/dist/gpu/chart-composite-gpu.js +2 -2
  85. package/dist/gpu/chart-composite-gpu.js.map +1 -1
  86. package/dist/gpu/display-view-composite-material-module.js +1 -1
  87. package/dist/gpu/display-view-composite-material-module.js.map +1 -1
  88. package/dist/gpu/display-view-quality-gpu.d.ts +2 -1
  89. package/dist/gpu/display-view-quality-gpu.js +24 -14
  90. package/dist/gpu/display-view-quality-gpu.js.map +1 -1
  91. package/dist/gpu/image-kernel-execution.js +2 -2
  92. package/dist/gpu/image-kernel-execution.js.map +1 -1
  93. package/dist/gpu/temporal-sum-gpu.js +23 -23
  94. package/dist/gpu/webgpu-runtime.js +1 -1
  95. package/dist/gpu/webgpu-runtime.js.map +1 -1
  96. package/dist/gpu/wgsl-chart-composite-kernel.js +318 -318
  97. package/dist/gpu/wgsl-chart-composite-kernel.js.map +1 -1
  98. package/dist/gpu/wgsl-chart-kernel.js +117 -117
  99. package/dist/gpu/wgsl-chart-kernel.js.map +1 -1
  100. package/dist/gpu/wgsl-display-view-quality-kernel.d.ts +13 -1
  101. package/dist/gpu/wgsl-display-view-quality-kernel.js +522 -488
  102. package/dist/gpu/wgsl-display-view-quality-kernel.js.map +1 -1
  103. package/dist/gpu/wgsl-display-view-speed-kernel.js +248 -248
  104. package/dist/gpu/wgsl-display-view-speed-kernel.js.map +1 -1
  105. package/dist/gpu/wgsl-kernels.js +203 -203
  106. package/dist/gpu/wgsl-kernels.js.map +1 -1
  107. package/dist/gpu/wgsl-sensor-kernel.js +302 -302
  108. package/dist/gpu/wgsl-sensor-kernel.js.map +1 -1
  109. package/dist/index.d.ts +8 -5
  110. package/dist/index.js +6 -3
  111. package/dist/index.js.map +1 -1
  112. package/dist/motion/temporal-exposure-sum.js +1 -1
  113. package/dist/motion/temporal-exposure-sum.js.map +1 -1
  114. package/dist/optics/diffraction-psf-profile.js +4 -4
  115. package/dist/optics/diffraction-psf-profile.js.map +1 -1
  116. package/dist/optics/front-of-lens-filter.js +1 -1
  117. package/dist/optics/front-of-lens-filter.js.map +1 -1
  118. package/dist/optics/irradiance-convolution.d.ts +10 -0
  119. package/dist/optics/irradiance-convolution.js +49 -14
  120. package/dist/optics/irradiance-convolution.js.map +1 -1
  121. package/dist/output/native-capture-sdr.js +1 -1
  122. package/dist/output/native-capture-sdr.js.map +1 -1
  123. package/dist/output/png-encoder.js +2 -2
  124. package/dist/output/png-encoder.js.map +1 -1
  125. package/dist/output/print-jpeg.js +13 -10
  126. package/dist/output/print-jpeg.js.map +1 -1
  127. package/dist/output/text-metadata.d.ts +22 -2
  128. package/dist/output/text-metadata.js +58 -9
  129. package/dist/output/text-metadata.js.map +1 -1
  130. package/dist/sensor/fixed-pattern-noise.js +1 -1
  131. package/dist/sensor/fixed-pattern-noise.js.map +1 -1
  132. package/dist/sensor/readout-exposure-linkage.js +1 -1
  133. package/dist/sensor/readout-exposure-linkage.js.map +1 -1
  134. package/docs/API_REFERENCE.md +49 -1
  135. package/docs/QUICK_START.md +104 -9
  136. package/docs/USAGE.md +241 -2
  137. package/docs/api/core-version.md +1 -1
  138. package/docs/api/equipment-generic-tier-assets.md +41 -1
  139. package/docs/api/equipment-generic-tier-presets.md +11 -3
  140. package/docs/api/exports.json +172 -2
  141. package/docs/api/exposure-auto-iso-slowest-shutter.md +139 -0
  142. package/docs/api/exposure-exposure-mode-resolver.md +68 -0
  143. package/docs/api/facade-chart-scenes.md +36 -5
  144. package/docs/api/facade-color-patches.md +150 -0
  145. package/docs/api/facade-simulate-capture.md +140 -9
  146. package/docs/api/output-text-metadata.md +34 -0
  147. package/llms.txt +1 -0
  148. package/package.json +2 -2
@@ -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, abortedError, linearDispatch, runComputePass, type WebGpuRuntime } 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])[] = 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[] = 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\nfunction checkAbort(signal: AbortSignal): void { if (signal.aborted) throw abortedError(); }\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, abortedError, linearDispatch, runComputePass, type WebGpuRuntime } 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\nfunction checkAbort(signal: AbortSignal): void { if (signal.aborted) throw abortedError(); }\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"]}
@@ -48,7 +48,7 @@ const KEPT_SCENES = 4;
48
48
  /** The corner check of the query-point model against the reference's own query points, relative to |p| + 1 (inside the composite kernel's 10⁻¹⁴ slack). */
49
49
  const MODEL_TOLERANCE = 2 ** -48;
50
50
  /** Layout of the lattice uniform (float32 / u32 words, 48 bytes) and the offsets table (one vec4 per offset: cu hi, cu lo, cv hi, cv lo). */
51
- export const DISPLAY_VIEW_LATTICE = Object.freeze({ scaleUHi: 0, scaleULo: 1, scaleVHi: 2, scaleVLo: 3, chartKHi: 4, chartKLo: 5, chartAspect: 6, tolerance: 7, offsets: 8, placed: 9, surround: 10, zero: 11, words: 12 });
51
+ export const DISPLAY_VIEW_LATTICE = /* @__PURE__ */ Object.freeze({ scaleUHi: 0, scaleULo: 1, scaleVHi: 2, scaleVLo: 3, chartKHi: 4, chartKLo: 5, chartAspect: 6, tolerance: 7, offsets: 8, placed: 9, surround: 10, zero: 11, words: 12 });
52
52
  /**
53
53
  * The composite kernel's classification (`material(p: vec4<f32>)` with its bound arithmetic, double-float32, cos polynomial,
54
54
  * elements and layers) renamed for the display-view kernel, its records bound at @group(1), and the lattice recovery that
@@ -1 +1 @@
1
- {"version":3,"file":"display-view-composite-material-module.js","sourceRoot":"","sources":["../../src/gpu/display-view-composite-material-module.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAClG,OAAO,EAAE,kBAAkB,EAAkC,MAAM,kCAAkC,CAAC;AACtG,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,yBAAyB,EAAyB,MAAM,0BAA0B,CAAC;AAErH,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AAMpF,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAsB,MAAM,qBAAqB,CAAC;AACzF,OAAO,EAAE,gCAAgC,EAAE,MAAM,qCAAqC,CAAC;AAKvF,iEAAiE;AACjE,MAAM,CAAC,GAAG,CAAC,GAAG,wBAAwB,CAAC;AACvC,2IAA2I;AAC3I,MAAM,CAAC,MAAM,kCAAkC,GAAG,iBAAiB,CAAC;AACpE,wFAAwF;AACxF,MAAM,UAAU,8BAA8B,CAAC,IAA+B,IAAY,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,kCAAkC,GAAG,MAAM,CAAC,CAAC,CAAC;AACxM,oHAAoH;AACpH,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,2JAA2J;AAC3J,MAAM,eAAe,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AAEjC,6IAA6I;AAC7I,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;AAE5N;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CAAC,OAAkC,QAAQ;IACnF,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACxL,IAAI,WAAW,GAAG,CAAC,IAAI,SAAS,GAAG,WAAW,IAAI,SAAS,GAAG,SAAS,IAAI,OAAO,GAAG,SAAS;QAAE,MAAM,IAAI,yBAAyB,CAAC,gBAAgB,EAAE,iEAAiE,CAAC,CAAC;IACzN,MAAM,MAAM,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,gCAAgC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC,OAAO,CAAC,oBAAoB,EAAE,cAAc,CAAC,CAAC;IAC7N,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;;;;;;;;;;EAUtD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BzC,CAAC;AACF,CAAC;AAQD;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CAAC,WAA2C,EAAE,SAA2C,EAAE,gBAAwB;IAC5J,MAAM,CAAC,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC,GAAG,WAAW,CAAC,YAAY,EAAE,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC;IAC/H,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,yBAAyB,CAAC,wBAAwB,EAAE,gFAAgF,CAAC,CAAC;IAC5J,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,gCAAgC;QAAE,MAAM,IAAI,yBAAyB,CAAC,wBAAwB,EAAE,wBAAwB,GAAG,gCAAgC,GAAG,iBAAiB,CAAC,CAAC;IAC5N,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAAE,MAAM,IAAI,yBAAyB,CAAC,wBAAwB,EAAE,sFAAsF,CAAC,CAAC;IAC/M,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1D,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IAAC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;IAC5D,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IAAC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;IAC7C,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IAAC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;IAC7C,MAAM,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;IACvD,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC;QAAE,MAAM,IAAI,yBAAyB,CAAC,wBAAwB,EAAE,8DAA8D,CAAC,CAAC;IACzN,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACnF,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;QAC3B,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/D,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;QACxG,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAU,EAAE,CAAC;YACnE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;YACtB,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAE,CAAC,GAAG,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAE,CAAC,GAAG,MAAM,CAAC;YAC7D,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,eAAe,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,eAAe,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBACvJ,MAAM,IAAI,yBAAyB,CAAC,wBAAwB,EAAE,gGAAgG,CAAC,CAAC;QACpK,CAAC;IACH,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvD,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC;QAAE,MAAM,IAAI,yBAAyB,CAAC,wBAAwB,EAAE,gFAAgF,CAAC,CAAC;IAC1K,4JAA4J;IAC5J,KAAK,MAAM,IAAI,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;YAAE,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/E,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,CAAC,CAAE,EAAE,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;gBACpF,IAAI,UAAU,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,GAAG,SAAS,CAAC;oBACnD,MAAM,IAAI,yBAAyB,CAAC,wBAAwB,EAAE,iGAAiG,CAAC,CAAC;YACrK,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,CAAC,GAAG,oBAAoB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;IACnI,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjE,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC;IAAC,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC;IAAC,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC;IAAC,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC;IACnL,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC3D,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;YAAE,MAAM,IAAI,yBAAyB,CAAC,wBAAwB,EAAE,oCAAoC,CAAC,CAAC;QACvM,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;QAAC,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;QAAC,MAAM,CAAC,oBAAoB,CAAC,WAAW,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC;IACtJ,CAAC;IACD,MAAM,CAAC,oBAAoB,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;IACnD,KAAK,CAAC,oBAAoB,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAAC,KAAK,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAAC,KAAK,CAAC,oBAAoB,CAAC,QAAQ,CAAC,GAAG,gBAAgB,CAAC;IACtK,KAAK,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,+CAA+C;IACrF,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC;QAC7D,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACzF,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC/D,CAAC;AAED,4IAA4I;AAC5I,SAAS,OAAO,CAAC,GAAwB;IACvC,IAAI,GAAG,CAAC,MAAM;QAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;IACzH,IAAI,GAAG,CAAC,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;IACzG,MAAM,IAAI,yBAAyB,CAAC,wBAAwB,EAAE,qLAAqL,CAAC,CAAC;AACvP,CAAC;AAkBD,MAAM,UAAU,gCAAgC,CAAC,OAAsB,EAAE,SAAyB;IAChG,MAAM,OAAO,GAAG,IAAI,OAAO,EAAoD,EAAE,OAAO,GAAsB,EAAE,CAAC;IACjH,IAAI,MAAM,GAA8C,IAAI,CAAC;IAC7D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAqC,CAAC;IAC1D,MAAM,KAAK,GAAG,CAAC,MAAmB,EAAsC,EAAE;QACxE,MAAM,KAAK,yBAAyB,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5H,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,CAAC,KAAiC,EAAmB,EAAE;QACrE,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5D,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,KAAM,CAAC,CAAC;YAAC,OAAO,KAAM,CAAC;QAAC,CAAC;QAClG,oEAAoE;QACpE,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAuC,CAAC,CAAC;QAC7I,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,0BAA0B;YAAE,MAAM,IAAI,yBAAyB,CAAC,qBAAqB,EAAE,0DAA0D,CAAC,CAAC;QACtN,MAAM,KAAK,GAAG,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAoB,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,oCAAoC,EAAE,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,qCAAqC,EAAE,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACpP,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,OAAO,OAAO,CAAC,MAAM,GAAG,WAAW;YAAE,OAAO,CAAC,KAAK,EAAG,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACtE,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IACF,OAAO;QACL,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM;YACzB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,IAAI,EAAE,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC;YAC7F,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxG,IAAI,cAAc,KAAK,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjE,MAAM,IAAI,yBAAyB,CAAC,wBAAwB,EAAE,4DAA4D,GAAG,cAAc,GAAG,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,uBAAuB,CAAC,CAAC;YAC1P,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAuC,CAAC,KAAK,SAAS,EAAE,CAAC;gBACjI,IAAI,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACtC,IAAI,CAAC,MAAM,EAAE,CAAC;oBAAC,MAAM,GAAG,yBAAyB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAAC,CAAC;gBACnG,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC;YAC1E,MAAM,OAAO,GAAG,2BAA2B,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YACvH,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBAAC,IAAI,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC;gBAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAAC,CAAC;YAC1F,OAAO,EAAE,EAAE,EAAE,8BAA8B,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE;oBAC/F,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE;oBAC1G,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE;iBAAC,EAAE,CAAC;QACrI,CAAC;QACD,IAAI,cAAc,KAAa,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QACvD,OAAO,KAAW,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;KAClF,CAAC;AACJ,CAAC","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * The composite-chart and mask-layer material module of the GPU display view (#491): the Speed kernel's `material_at`\n * (the seam of #478, `DisplayViewGpuMaterialModule`) built from the composite chart kernel's classification (#477,\n * `wgsl-chart-composite-kernel.ts`: `material()`, its bound arithmetic and double-float32), so that composite charts,\n * every 2.3 element as a plain chart, the sine-profile Siemens star and declared `material-layers` scenes render on the\n * GPU. The scene's packed records (`packChartScene`) are uploaded once per renderer and reused across a view's parts,\n * as the composite kernel reuses them per accelerator; the device probe of the composite kernel gates the module.\n *\n * **The query point.** The Speed kernel hands the module p = fl(fl(x + c)·scale) per axis: the site coordinate x plus the\n * offset constant c = 0.5 + o − W/2 (`DISPLAY_VIEW_AUX.offsets`), times the frame-units-per-site scale rounded once to\n * float32, so p carries up to 2E relative error (E = 2⁻²³) against the reference's float64 query point. The composite\n * kernel's chirp decisions (the zone plate's phase, the stars' sector cross products) need the point to about 2⁻⁴⁰; fed\n * p directly they would flag most of a 64-cycle sine star. The module therefore **recovers the exact lattice point**: it\n * knows the offsets c_o (uploaded as float32 hi + lo pairs) and the scale (hi + lo), divides p by the scale's high part\n * (within 6E·|s| of s = x + c_o), picks the offset whose c_o puts the quotient nearest an integer x, and re-forms the point\n * in double-float32 as (x + c_o)·scale from the exact integer and the float64 constants. The host admits a lattice only\n * when the recovery is unambiguous: the distinct fractional parts of the offsets (mod 1) lie more than four tolerances\n * apart, the tolerance being 8E·max|s| + 2⁻¹²; a point whose residual exceeds the tolerance on the device is flagged.\n * The recovered point differs from the exact (x + c_o)·g by at most about 2⁻⁴⁶ relative (two double-float32 operations\n * and the split constants' 2⁻⁴⁸), inside the composite kernel's own allowance for a point (DW = 2⁻⁴⁰ relative in `bd`).\n * The reference's own float64 query point differs from the exact lattice value by its float64 rounding only: measured at\n * most 5.6·10⁻¹⁶ absolute over every site and offset of the #491 fixtures, and checked by the host at the frame's four\n * corners within 2⁻⁴⁸·(|p| + 1); that is inside the composite kernel's 10⁻¹⁴ slack for the reference's rounding. So the\n * composite kernel's bounds and SAFETY factor (4) apply unchanged, and the module's point error is far inside the Speed\n * kernel's contract (≤ 2E + 10⁻¹⁴): no Speed bound term changes.\n *\n * **A fixed-size chart** (`chartSize`): the reference maps the frame point to chart-local units, cu = (u·m)/h with m the\n * metres per frame unit and h the chart's half width, and returns the surround material outside |cu| ≤ 1, |cv| ≤ aspect.\n * The module multiplies the recovered point by k = m/h (hi + lo) in double-float32 and tests the chart rectangle in bound\n * arithmetic (flagging points within their bound of its edge); the surround is the materials table's last entry.\n */\nimport { ImageKernelExecutionError, WEBGPU_F32_UNIT_ROUNDOFF } from \"./image-kernel-execution.js\";\nimport { chartCompositeWgsl, type ChartCompositeProductPath } from \"./wgsl-chart-composite-kernel.js\";\nimport { chartGpuPresetCode } from \"./chart-radiance-gpu.js\";\nimport { dwSplit, packChartScene, probeChartCompositeDevice, type PackedChartScene } from \"./chart-composite-gpu.js\";\nimport type { ChartCompositeProbeRecord } from \"./image-kernel-execution.js\";\nimport { chartPresetMaterialModule } from \"./display-view-chart-material-module.js\";\nimport type { ChartRadianceBatchPlan } from \"../facade/chart-radiance-batch.js\";\nimport type { ResolvedChartScene } from \"../facade/chart-scenes.js\";\nimport type { ResolvedChartMaterialLayers } from \"../facade/chart-material-layers.js\";\nimport type { DisplayViewExpectedSignalInput } from \"../facade/expected-signal.js\";\nimport type { DisplayViewGpuSetup } from \"../facade/display-view.js\";\nimport { BUFFER_USAGE, GpuResourceScope, type WebGpuRuntime } from \"./webgpu-runtime.js\";\nimport { DISPLAY_VIEW_GPU_MAXIMUM_OFFSETS } from \"./wgsl-display-view-speed-kernel.js\";\nimport type { DisplayViewGpuMaterialModule } from \"./display-view-speed-gpu.js\";\n\ntype PipelineSource = (label: string, code: string) => Promise<GPUComputePipeline>;\n\n/** One WGSL rounding of + − × in either direction (E = 2⁻²³). */\nconst E = 2 * WEBGPU_F32_UNIT_ROUNDOFF;\n/** 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. */\nexport const CHART_COMPOSITE_MATERIAL_MODULE_ID = \"chart-composite\";\n/** The module's id per product path (the fma path's shader is a different pipeline). */\nexport function chartCompositeMaterialModuleId(path: ChartCompositeProductPath): string { return path === \"dekker\" ? CHART_COMPOSITE_MATERIAL_MODULE_ID : CHART_COMPOSITE_MATERIAL_MODULE_ID + \"-fma\"; }\n/** Scenes whose records stay uploaded per renderer (the composite kernel keeps the same number per accelerator). */\nconst KEPT_SCENES = 4;\n/** The corner check of the query-point model against the reference's own query points, relative to |p| + 1 (inside the composite kernel's 10⁻¹⁴ slack). */\nconst MODEL_TOLERANCE = 2 ** -48;\n\n/** Layout of the lattice uniform (float32 / u32 words, 48 bytes) and the offsets table (one vec4 per offset: cu hi, cu lo, cv hi, cv lo). */\nexport const DISPLAY_VIEW_LATTICE = Object.freeze({ scaleUHi: 0, scaleULo: 1, scaleVHi: 2, scaleVLo: 3, chartKHi: 4, chartKLo: 5, chartAspect: 6, tolerance: 7, offsets: 8, placed: 9, surround: 10, zero: 11, words: 12 });\n\n/**\n * The composite kernel's classification (`material(p: vec4<f32>)` with its bound arithmetic, double-float32, cos polynomial,\n * elements and layers) renamed for the display-view kernel, its records bound at @group(1), and the lattice recovery that\n * defines `material_at(p: vec2<f32>)` (see the module comment). The constants E and SLACK come from the kernel's preamble. `path`\n * is the double-word product path the device's probe chose (default Dekker's).\n */\nexport function chartCompositeMaterialWgsl(path: ChartCompositeProductPath = \"dekker\"): string {\n const source = chartCompositeWgsl(path);\n const commonStart = source.indexOf(\"const DW: f32\"), commonEnd = source.indexOf(\"struct Params\"), bodyStart = source.indexOf(\"const SEGMENT_BOX\"), bodyEnd = source.indexOf(\"@compute\");\n if (commonStart < 0 || commonEnd < commonStart || bodyStart < commonEnd || bodyEnd < bodyStart) throw new ImageKernelExecutionError(\"gpu-validation\", \"The composite chart kernel's material functions were not found.\");\n const rename = (code: string): string => code.replace(/^const SLACK: f32 = [^\\n]*\\n/mu, \"\").replace(/\\bflagged\\b/gu, \"material_uncertain\").replace(/\\bmargin\\(/gu, \"bmargin(\").replace(/\\bparams\\.zero\\b/gu, \"lattice.zero\");\n return `${rename(source.slice(commonStart, commonEnd))}\n@group(1) @binding(0) var<storage, read> af: array<f32>;\n@group(1) @binding(1) var<storage, read> ai: array<u32>;\nstruct 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>>;\n${rename(source.slice(bodyStart, bodyEnd))}\n// The exact lattice point of one axis from the kernel's p = fl(fl(x + c)·scale): the offset whose constant c puts p/scale\n// nearest an integer x, then (x + c)·scale 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}\nfn material_at(p: vec2<f32>) -> u32 {\n var u = lattice_point(p.x, D(lattice.scale_u_hi, lattice.scale_u_lo), 0u);\n var v = lattice_point(p.y, D(lattice.scale_v_hi, lattice.scale_v_lo), 1u);\n if (lattice.placed != 0u) {\n let k = D(lattice.chart_k_hi, lattice.chart_k_lo);\n u = d_mul(u, k); v = d_mul(v, k);\n if (!(le(babs(bd(u)), bx(1.0)) && le(babs(bd(v)), bc(lattice.chart_aspect)))) { return lattice.surround; }\n }\n return material(vec4<f32>(u.h, u.l, v.h, v.l));\n}\n`;\n}\n\n/** A fixed-size chart's placement for the module: chart-local frame units per frame unit (m/h) and the chart's aspect. */\nexport interface DisplayViewChartPlacement { chartUnitsPerFrameUnit: number; aspect: number }\n\n/** The lattice constants of a render (see the module comment): the uniform words and the offsets table. */\nexport interface DisplayViewLatticeConstants { params: ArrayBuffer; offsets: Float32Array<ArrayBuffer>; tolerance: number; scaleU: number; scaleV: number }\n\n/**\n * The query lattice of an expected-signal input as the module needs it, or an `unsupported-on-backend` error: the scale per\n * axis from the reference's own query points (two sites a frame apart), the model (x + c)·scale checked against the reference\n * at the frame's four corners for every offset within 2⁻⁴⁸·(|p| + 1), the offsets as hi + lo pairs, and the recovery tolerance\n * 8E·max|x + c| + 2⁻¹², which the distinct fractional parts of the offsets must clear four times over.\n */\nexport function displayViewLatticeConstants(signalInput: DisplayViewExpectedSignalInput, placement: DisplayViewChartPlacement | null, surroundMaterial: number): DisplayViewLatticeConstants {\n const W = signalInput.nativeWidth, H = signalInput.nativeHeight, offsets = signalInput.offsets, query = signalInput.queryPoint;\n if (!query) throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"The expected signal has no query points (the Quality path); use cpu-reference.\");\n if (offsets.length < 1 || offsets.length > DISPLAY_VIEW_GPU_MAXIMUM_OFFSETS) throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"The kernel holds 1 to \" + DISPLAY_VIEW_GPU_MAXIMUM_OFFSETS + \" query offsets.\");\n if (!(W >= 2 && H >= 2 && W <= 2 ** 20 && H <= 2 ** 20)) throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"The native frame is outside the lattice recovery's range (2 to 2^20 sites per axis).\");\n const point = new Float64Array(2), x1 = W - 1, y1 = H - 1;\n query(0, 0, 0, point); const u0 = point[0]!, v0 = point[1]!;\n query(x1, 0, 0, point); const u1 = point[0]!;\n query(0, y1, 0, point); const v1 = point[1]!;\n const scaleU = (u1 - u0) / x1, scaleV = (v1 - v0) / y1;\n if (!(Number.isFinite(scaleU) && Number.isFinite(scaleV) && scaleU !== 0 && scaleV !== 0)) throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"The request's query lattice has no scale; use cpu-reference.\");\n const cu = new Float64Array(offsets.length), cv = new Float64Array(offsets.length);\n let smax = 0;\n for (let o = 0; o < offsets.length; o++) {\n const offset = offsets[o]!;\n cu[o] = 0.5 + offset.x - W / 2; cv[o] = 0.5 + offset.y - H / 2;\n smax = Math.max(smax, Math.abs(cu[o]!), Math.abs(x1 + cu[o]!), Math.abs(cv[o]!), Math.abs(y1 + cv[o]!));\n for (const [x, y] of [[0, 0], [x1, 0], [0, y1], [x1, y1]] as const) {\n query(x, y, o, point);\n const mu = (x + cu[o]!) * scaleU, mv = (y + cv[o]!) * scaleV;\n if (!(Math.abs(mu - point[0]!) <= MODEL_TOLERANCE * (Math.abs(point[0]!) + 1) && Math.abs(mv - point[1]!) <= MODEL_TOLERANCE * (Math.abs(point[1]!) + 1)))\n throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"The request's query points are not a rectilinear site lattice within 2^-48; use cpu-reference.\");\n }\n }\n const tolerance = Math.fround(8 * E * smax + 2 ** -12);\n if (!(tolerance < 1 / 8)) throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"The query lattice is too wide for the exact point recovery; use cpu-reference.\");\n // Distinct fractional parts of the offsets must be told apart on the device: more than four tolerances apart, or an exact integer apart (the same lattice).\n for (const axis of [cu, cv]) {\n for (let a = 0; a < axis.length; a++) for (let b = a + 1; b < axis.length; b++) {\n const delta = axis[a]! - axis[b]!, fractional = Math.abs(delta - Math.round(delta));\n if (fractional !== 0 && !(fractional > 4 * tolerance))\n throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"Two query offsets are too close (mod one site) for the exact point recovery; use cpu-reference.\");\n }\n }\n const params = new ArrayBuffer(4 * DISPLAY_VIEW_LATTICE.words), floats = new Float32Array(params), words = new Uint32Array(params);\n const [suH, suL] = dwSplit(scaleU), [svH, svL] = dwSplit(scaleV);\n floats[DISPLAY_VIEW_LATTICE.scaleUHi] = suH; floats[DISPLAY_VIEW_LATTICE.scaleULo] = suL; floats[DISPLAY_VIEW_LATTICE.scaleVHi] = svH; floats[DISPLAY_VIEW_LATTICE.scaleVLo] = svL;\n if (placement) {\n const [kH, kL] = dwSplit(placement.chartUnitsPerFrameUnit);\n if (!(Number.isFinite(kH) && kH > 0 && Number.isFinite(placement.aspect) && placement.aspect > 0)) throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"The chart placement is not finite.\");\n floats[DISPLAY_VIEW_LATTICE.chartKHi] = kH; floats[DISPLAY_VIEW_LATTICE.chartKLo] = kL; floats[DISPLAY_VIEW_LATTICE.chartAspect] = placement.aspect;\n }\n floats[DISPLAY_VIEW_LATTICE.tolerance] = tolerance;\n words[DISPLAY_VIEW_LATTICE.offsets] = offsets.length; words[DISPLAY_VIEW_LATTICE.placed] = placement ? 1 : 0; words[DISPLAY_VIEW_LATTICE.surround] = surroundMaterial;\n words[DISPLAY_VIEW_LATTICE.zero] = 0; // the rounding barrier's zero (`lattice.zero`)\n const table = new Float32Array(4 * offsets.length);\n for (let o = 0; o < offsets.length; o++) {\n const [uH, uL] = dwSplit(cu[o]!), [vH, vL] = dwSplit(cv[o]!);\n table[4 * o] = uH; table[4 * o + 1] = uL; table[4 * o + 2] = vH; table[4 * o + 3] = vL;\n }\n return { params, offsets: table, tolerance, scaleU, scaleV };\n}\n\n/** The resolved scene behind a GPU setup: the chart whose geometry is packed, the layers (or null) and the materials the kernel indexes. */\nfunction sceneOf(gpu: DisplayViewGpuSetup): { chart: ResolvedChartScene; layers: ResolvedChartMaterialLayers | null; materials: ResolvedChartScene[\"materials\"]; key: object } {\n if (gpu.layers) return { chart: gpu.layers.chart, layers: gpu.layers, materials: gpu.layers.materials, key: gpu.layers };\n if (gpu.chart) return { chart: gpu.chart, layers: null, materials: gpu.chart.materials, key: gpu.chart };\n throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"The GPU material lookup covers chart presets, composite charts and declared material-layers scenes; a caller scene function runs on cpu-reference (describe it as material-layers).\");\n}\n\ninterface UploadedRecords { key: object; scope: GpuResourceScope; af: GPUBuffer; ai: GPUBuffer; packed: PackedChartScene }\n\n/**\n * The material modules of one display-view renderer (one device): the chart-preset module for the eight 2.0 presets filling\n * the frame, the composite module for everything else the chart kernels classify. The composite module's device probe runs\n * once per renderer (single flight; a refusal is retried on the next render), its scene records are uploaded once per scene\n * and the four most recent kept until `release()`.\n */\nexport interface DisplayViewMaterialModules {\n /** The module of a setup's scene, or an `unsupported-on-backend` error (a caller function scene, a failed probe, a materials mismatch). */\n moduleFor(gpu: DisplayViewGpuSetup, signal: AbortSignal): Promise<DisplayViewGpuMaterialModule>;\n /** Uploaded scenes (for tests). */\n readonly uploadedScenes: number;\n release(): void;\n}\n\nexport function createDisplayViewMaterialModules(runtime: WebGpuRuntime, pipelines: PipelineSource): DisplayViewMaterialModules {\n const presets = new WeakMap<ResolvedChartScene, DisplayViewGpuMaterialModule>(), uploads: UploadedRecords[] = [];\n let probed: Promise<ChartCompositeProbeRecord> | null = null;\n const wgsl = new Map<ChartCompositeProductPath, string>();\n const probe = (signal: AbortSignal): Promise<ChartCompositeProbeRecord> => {\n probed ??= probeChartCompositeDevice(runtime, pipelines, signal).catch((error: unknown) => { probed = null; throw error; });\n return probed;\n };\n const records = (scene: ReturnType<typeof sceneOf>): UploadedRecords => {\n const index = uploads.findIndex((e) => e.key === scene.key);\n if (index >= 0) { const [entry] = uploads.splice(index, 1); uploads.push(entry!); return entry!; }\n // packChartScene reads the plan's chart, layers and materials only.\n const packed = packChartScene({ chart: scene.chart, layers: scene.layers, materials: scene.materials } as unknown as ChartRadianceBatchPlan);\n if (Math.max(packed.af.byteLength, packed.ai.byteLength) > runtime.maximumStorageBindingBytes) throw new ImageKernelExecutionError(\"insufficient-limits\", \"Chart records exceed the device's storage binding limit.\");\n const scope = new GpuResourceScope(runtime);\n const entry: UploadedRecords = { key: scene.key, scope, af: scope.upload(\"photivra-display-view-chart-floats\", packed.af, BUFFER_USAGE.STORAGE), ai: scope.upload(\"photivra-display-view-chart-records\", packed.ai, BUFFER_USAGE.STORAGE), packed };\n uploads.push(entry);\n while (uploads.length > KEPT_SCENES) uploads.shift()!.scope.release();\n return entry;\n };\n return {\n async moduleFor(gpu, signal): Promise<DisplayViewGpuMaterialModule> {\n const scene = sceneOf(gpu), placement = gpu.placement ?? null, signalInput = gpu.signalInput;\n const tableMaterials = signalInput.scene.kind === \"materials\" ? signalInput.scene.materials.length : -1;\n if (tableMaterials !== scene.materials.length + (placement ? 1 : 0))\n throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"The expected signal's materials do not match the scene's (\" + tableMaterials + \" against \" + scene.materials.length + (placement ? \" plus the surround\" : \"\") + \"); use cpu-reference.\");\n if (!scene.layers && !placement && chartGpuPresetCode({ chart: scene.chart } as unknown as ChartRadianceBatchPlan) !== undefined) {\n let module = presets.get(scene.chart);\n if (!module) { module = chartPresetMaterialModule(scene.chart); presets.set(scene.chart, module); }\n return module;\n }\n const record = await probe(signal), path = record.productPath ?? \"dekker\";\n const lattice = displayViewLatticeConstants(signalInput, placement, scene.materials.length), uploaded = records(scene);\n let code = wgsl.get(path);\n if (code === undefined) { code = chartCompositeMaterialWgsl(path); wgsl.set(path, code); }\n return { id: chartCompositeMaterialModuleId(path), wgsl: code, compositeProbe: record, bindings: [\n { binding: 0, kind: \"storage\", buffer: uploaded.af }, { binding: 1, kind: \"storage\", buffer: uploaded.ai },\n { binding: 2, kind: \"uniform\", data: new Uint8Array(lattice.params) }, { binding: 3, kind: \"storage\", data: lattice.offsets }] };\n },\n get uploadedScenes(): number { return uploads.length; },\n release(): void { for (const entry of uploads.splice(0)) entry.scope.release(); }\n };\n}\n"]}
1
+ {"version":3,"file":"display-view-composite-material-module.js","sourceRoot":"","sources":["../../src/gpu/display-view-composite-material-module.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * The composite-chart and mask-layer material module of the GPU display view (#491): the Speed kernel's `material_at`\n * (the seam of #478, `DisplayViewGpuMaterialModule`) built from the composite chart kernel's classification (#477,\n * `wgsl-chart-composite-kernel.ts`: `material()`, its bound arithmetic and double-float32), so that composite charts,\n * every 2.3 element as a plain chart, the sine-profile Siemens star and declared `material-layers` scenes render on the\n * GPU. The scene's packed records (`packChartScene`) are uploaded once per renderer and reused across a view's parts,\n * as the composite kernel reuses them per accelerator; the device probe of the composite kernel gates the module.\n *\n * **The query point.** The Speed kernel hands the module p = fl(fl(x + c)·scale) per axis: the site coordinate x plus the\n * offset constant c = 0.5 + o − W/2 (`DISPLAY_VIEW_AUX.offsets`), times the frame-units-per-site scale rounded once to\n * float32, so p carries up to 2E relative error (E = 2⁻²³) against the reference's float64 query point. The composite\n * kernel's chirp decisions (the zone plate's phase, the stars' sector cross products) need the point to about 2⁻⁴⁰; fed\n * p directly they would flag most of a 64-cycle sine star. The module therefore **recovers the exact lattice point**: it\n * knows the offsets c_o (uploaded as float32 hi + lo pairs) and the scale (hi + lo), divides p by the scale's high part\n * (within 6E·|s| of s = x + c_o), picks the offset whose c_o puts the quotient nearest an integer x, and re-forms the point\n * in double-float32 as (x + c_o)·scale from the exact integer and the float64 constants. The host admits a lattice only\n * when the recovery is unambiguous: the distinct fractional parts of the offsets (mod 1) lie more than four tolerances\n * apart, the tolerance being 8E·max|s| + 2⁻¹²; a point whose residual exceeds the tolerance on the device is flagged.\n * The recovered point differs from the exact (x + c_o)·g by at most about 2⁻⁴⁶ relative (two double-float32 operations\n * and the split constants' 2⁻⁴⁸), inside the composite kernel's own allowance for a point (DW = 2⁻⁴⁰ relative in `bd`).\n * The reference's own float64 query point differs from the exact lattice value by its float64 rounding only: measured at\n * most 5.6·10⁻¹⁶ absolute over every site and offset of the #491 fixtures, and checked by the host at the frame's four\n * corners within 2⁻⁴⁸·(|p| + 1); that is inside the composite kernel's 10⁻¹⁴ slack for the reference's rounding. So the\n * composite kernel's bounds and SAFETY factor (4) apply unchanged, and the module's point error is far inside the Speed\n * kernel's contract (≤ 2E + 10⁻¹⁴): no Speed bound term changes.\n *\n * **A fixed-size chart** (`chartSize`): the reference maps the frame point to chart-local units, cu = (u·m)/h with m the\n * metres per frame unit and h the chart's half width, and returns the surround material outside |cu| ≤ 1, |cv| ≤ aspect.\n * The module multiplies the recovered point by k = m/h (hi + lo) in double-float32 and tests the chart rectangle in bound\n * arithmetic (flagging points within their bound of its edge); the surround is the materials table's last entry.\n */\nimport { ImageKernelExecutionError, WEBGPU_F32_UNIT_ROUNDOFF } from \"./image-kernel-execution.js\";\nimport { chartCompositeWgsl, type ChartCompositeProductPath } from \"./wgsl-chart-composite-kernel.js\";\nimport { chartGpuPresetCode } from \"./chart-radiance-gpu.js\";\nimport { dwSplit, packChartScene, probeChartCompositeDevice, type PackedChartScene } from \"./chart-composite-gpu.js\";\nimport type { ChartCompositeProbeRecord } from \"./image-kernel-execution.js\";\nimport { chartPresetMaterialModule } from \"./display-view-chart-material-module.js\";\nimport type { ChartRadianceBatchPlan } from \"../facade/chart-radiance-batch.js\";\nimport type { ResolvedChartScene } from \"../facade/chart-scenes.js\";\nimport type { ResolvedChartMaterialLayers } from \"../facade/chart-material-layers.js\";\nimport type { DisplayViewExpectedSignalInput } from \"../facade/expected-signal.js\";\nimport type { DisplayViewGpuSetup } from \"../facade/display-view.js\";\nimport { BUFFER_USAGE, GpuResourceScope, type WebGpuRuntime } from \"./webgpu-runtime.js\";\nimport { DISPLAY_VIEW_GPU_MAXIMUM_OFFSETS } from \"./wgsl-display-view-speed-kernel.js\";\nimport type { DisplayViewGpuMaterialModule } from \"./display-view-speed-gpu.js\";\n\ntype PipelineSource = (label: string, code: string) => Promise<GPUComputePipeline>;\n\n/** One WGSL rounding of + − × in either direction (E = 2⁻²³). */\nconst E = 2 * WEBGPU_F32_UNIT_ROUNDOFF;\n/** 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. */\nexport const CHART_COMPOSITE_MATERIAL_MODULE_ID = \"chart-composite\";\n/** The module's id per product path (the fma path's shader is a different pipeline). */\nexport function chartCompositeMaterialModuleId(path: ChartCompositeProductPath): string { return path === \"dekker\" ? CHART_COMPOSITE_MATERIAL_MODULE_ID : CHART_COMPOSITE_MATERIAL_MODULE_ID + \"-fma\"; }\n/** Scenes whose records stay uploaded per renderer (the composite kernel keeps the same number per accelerator). */\nconst KEPT_SCENES = 4;\n/** The corner check of the query-point model against the reference's own query points, relative to |p| + 1 (inside the composite kernel's 10⁻¹⁴ slack). */\nconst MODEL_TOLERANCE = 2 ** -48;\n\n/** Layout of the lattice uniform (float32 / u32 words, 48 bytes) and the offsets table (one vec4 per offset: cu hi, cu lo, cv hi, cv lo). */\nexport const DISPLAY_VIEW_LATTICE = /* @__PURE__ */ Object.freeze({ scaleUHi: 0, scaleULo: 1, scaleVHi: 2, scaleVLo: 3, chartKHi: 4, chartKLo: 5, chartAspect: 6, tolerance: 7, offsets: 8, placed: 9, surround: 10, zero: 11, words: 12 });\n\n/**\n * The composite kernel's classification (`material(p: vec4<f32>)` with its bound arithmetic, double-float32, cos polynomial,\n * elements and layers) renamed for the display-view kernel, its records bound at @group(1), and the lattice recovery that\n * defines `material_at(p: vec2<f32>)` (see the module comment). The constants E and SLACK come from the kernel's preamble. `path`\n * is the double-word product path the device's probe chose (default Dekker's).\n */\nexport function chartCompositeMaterialWgsl(path: ChartCompositeProductPath = \"dekker\"): string {\n const source = chartCompositeWgsl(path);\n const commonStart = source.indexOf(\"const DW: f32\"), commonEnd = source.indexOf(\"struct Params\"), bodyStart = source.indexOf(\"const SEGMENT_BOX\"), bodyEnd = source.indexOf(\"@compute\");\n if (commonStart < 0 || commonEnd < commonStart || bodyStart < commonEnd || bodyEnd < bodyStart) throw new ImageKernelExecutionError(\"gpu-validation\", \"The composite chart kernel's material functions were not found.\");\n const rename = (code: string): string => code.replace(/^const SLACK: f32 = [^\\n]*\\n/mu, \"\").replace(/\\bflagged\\b/gu, \"material_uncertain\").replace(/\\bmargin\\(/gu, \"bmargin(\").replace(/\\bparams\\.zero\\b/gu, \"lattice.zero\");\n return `${rename(source.slice(commonStart, commonEnd))}\n@group(1) @binding(0) var<storage, read> af: array<f32>;\n@group(1) @binding(1) var<storage, read> ai: array<u32>;\nstruct 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>>;\n${rename(source.slice(bodyStart, bodyEnd))}\n// The exact lattice point of one axis from the kernel's p = fl(fl(x + c)·scale): the offset whose constant c puts p/scale\n// nearest an integer x, then (x + c)·scale 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}\nfn material_at(p: vec2<f32>) -> u32 {\n var u = lattice_point(p.x, D(lattice.scale_u_hi, lattice.scale_u_lo), 0u);\n var v = lattice_point(p.y, D(lattice.scale_v_hi, lattice.scale_v_lo), 1u);\n if (lattice.placed != 0u) {\n let k = D(lattice.chart_k_hi, lattice.chart_k_lo);\n u = d_mul(u, k); v = d_mul(v, k);\n if (!(le(babs(bd(u)), bx(1.0)) && le(babs(bd(v)), bc(lattice.chart_aspect)))) { return lattice.surround; }\n }\n return material(vec4<f32>(u.h, u.l, v.h, v.l));\n}\n`;\n}\n\n/** A fixed-size chart's placement for the module: chart-local frame units per frame unit (m/h) and the chart's aspect. */\nexport interface DisplayViewChartPlacement { chartUnitsPerFrameUnit: number; aspect: number }\n\n/** The lattice constants of a render (see the module comment): the uniform words and the offsets table. */\nexport interface DisplayViewLatticeConstants { params: ArrayBuffer; offsets: Float32Array<ArrayBuffer>; tolerance: number; scaleU: number; scaleV: number }\n\n/**\n * The query lattice of an expected-signal input as the module needs it, or an `unsupported-on-backend` error: the scale per\n * axis from the reference's own query points (two sites a frame apart), the model (x + c)·scale checked against the reference\n * at the frame's four corners for every offset within 2⁻⁴⁸·(|p| + 1), the offsets as hi + lo pairs, and the recovery tolerance\n * 8E·max|x + c| + 2⁻¹², which the distinct fractional parts of the offsets must clear four times over.\n */\nexport function displayViewLatticeConstants(signalInput: DisplayViewExpectedSignalInput, placement: DisplayViewChartPlacement | null, surroundMaterial: number): DisplayViewLatticeConstants {\n const W = signalInput.nativeWidth, H = signalInput.nativeHeight, offsets = signalInput.offsets, query = signalInput.queryPoint;\n if (!query) throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"The expected signal has no query points (the Quality path); use cpu-reference.\");\n if (offsets.length < 1 || offsets.length > DISPLAY_VIEW_GPU_MAXIMUM_OFFSETS) throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"The kernel holds 1 to \" + DISPLAY_VIEW_GPU_MAXIMUM_OFFSETS + \" query offsets.\");\n if (!(W >= 2 && H >= 2 && W <= 2 ** 20 && H <= 2 ** 20)) throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"The native frame is outside the lattice recovery's range (2 to 2^20 sites per axis).\");\n const point = new Float64Array(2), x1 = W - 1, y1 = H - 1;\n query(0, 0, 0, point); const u0 = point[0]!, v0 = point[1]!;\n query(x1, 0, 0, point); const u1 = point[0]!;\n query(0, y1, 0, point); const v1 = point[1]!;\n const scaleU = (u1 - u0) / x1, scaleV = (v1 - v0) / y1;\n if (!(Number.isFinite(scaleU) && Number.isFinite(scaleV) && scaleU !== 0 && scaleV !== 0)) throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"The request's query lattice has no scale; use cpu-reference.\");\n const cu = new Float64Array(offsets.length), cv = new Float64Array(offsets.length);\n let smax = 0;\n for (let o = 0; o < offsets.length; o++) {\n const offset = offsets[o]!;\n cu[o] = 0.5 + offset.x - W / 2; cv[o] = 0.5 + offset.y - H / 2;\n smax = Math.max(smax, Math.abs(cu[o]!), Math.abs(x1 + cu[o]!), Math.abs(cv[o]!), Math.abs(y1 + cv[o]!));\n for (const [x, y] of [[0, 0], [x1, 0], [0, y1], [x1, y1]] as const) {\n query(x, y, o, point);\n const mu = (x + cu[o]!) * scaleU, mv = (y + cv[o]!) * scaleV;\n if (!(Math.abs(mu - point[0]!) <= MODEL_TOLERANCE * (Math.abs(point[0]!) + 1) && Math.abs(mv - point[1]!) <= MODEL_TOLERANCE * (Math.abs(point[1]!) + 1)))\n throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"The request's query points are not a rectilinear site lattice within 2^-48; use cpu-reference.\");\n }\n }\n const tolerance = Math.fround(8 * E * smax + 2 ** -12);\n if (!(tolerance < 1 / 8)) throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"The query lattice is too wide for the exact point recovery; use cpu-reference.\");\n // Distinct fractional parts of the offsets must be told apart on the device: more than four tolerances apart, or an exact integer apart (the same lattice).\n for (const axis of [cu, cv]) {\n for (let a = 0; a < axis.length; a++) for (let b = a + 1; b < axis.length; b++) {\n const delta = axis[a]! - axis[b]!, fractional = Math.abs(delta - Math.round(delta));\n if (fractional !== 0 && !(fractional > 4 * tolerance))\n throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"Two query offsets are too close (mod one site) for the exact point recovery; use cpu-reference.\");\n }\n }\n const params = new ArrayBuffer(4 * DISPLAY_VIEW_LATTICE.words), floats = new Float32Array(params), words = new Uint32Array(params);\n const [suH, suL] = dwSplit(scaleU), [svH, svL] = dwSplit(scaleV);\n floats[DISPLAY_VIEW_LATTICE.scaleUHi] = suH; floats[DISPLAY_VIEW_LATTICE.scaleULo] = suL; floats[DISPLAY_VIEW_LATTICE.scaleVHi] = svH; floats[DISPLAY_VIEW_LATTICE.scaleVLo] = svL;\n if (placement) {\n const [kH, kL] = dwSplit(placement.chartUnitsPerFrameUnit);\n if (!(Number.isFinite(kH) && kH > 0 && Number.isFinite(placement.aspect) && placement.aspect > 0)) throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"The chart placement is not finite.\");\n floats[DISPLAY_VIEW_LATTICE.chartKHi] = kH; floats[DISPLAY_VIEW_LATTICE.chartKLo] = kL; floats[DISPLAY_VIEW_LATTICE.chartAspect] = placement.aspect;\n }\n floats[DISPLAY_VIEW_LATTICE.tolerance] = tolerance;\n words[DISPLAY_VIEW_LATTICE.offsets] = offsets.length; words[DISPLAY_VIEW_LATTICE.placed] = placement ? 1 : 0; words[DISPLAY_VIEW_LATTICE.surround] = surroundMaterial;\n words[DISPLAY_VIEW_LATTICE.zero] = 0; // the rounding barrier's zero (`lattice.zero`)\n const table = new Float32Array(4 * offsets.length);\n for (let o = 0; o < offsets.length; o++) {\n const [uH, uL] = dwSplit(cu[o]!), [vH, vL] = dwSplit(cv[o]!);\n table[4 * o] = uH; table[4 * o + 1] = uL; table[4 * o + 2] = vH; table[4 * o + 3] = vL;\n }\n return { params, offsets: table, tolerance, scaleU, scaleV };\n}\n\n/** The resolved scene behind a GPU setup: the chart whose geometry is packed, the layers (or null) and the materials the kernel indexes. */\nfunction sceneOf(gpu: DisplayViewGpuSetup): { chart: ResolvedChartScene; layers: ResolvedChartMaterialLayers | null; materials: ResolvedChartScene[\"materials\"]; key: object } {\n if (gpu.layers) return { chart: gpu.layers.chart, layers: gpu.layers, materials: gpu.layers.materials, key: gpu.layers };\n if (gpu.chart) return { chart: gpu.chart, layers: null, materials: gpu.chart.materials, key: gpu.chart };\n throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"The GPU material lookup covers chart presets, composite charts and declared material-layers scenes; a caller scene function runs on cpu-reference (describe it as material-layers).\");\n}\n\ninterface UploadedRecords { key: object; scope: GpuResourceScope; af: GPUBuffer; ai: GPUBuffer; packed: PackedChartScene }\n\n/**\n * The material modules of one display-view renderer (one device): the chart-preset module for the eight 2.0 presets filling\n * the frame, the composite module for everything else the chart kernels classify. The composite module's device probe runs\n * once per renderer (single flight; a refusal is retried on the next render), its scene records are uploaded once per scene\n * and the four most recent kept until `release()`.\n */\nexport interface DisplayViewMaterialModules {\n /** The module of a setup's scene, or an `unsupported-on-backend` error (a caller function scene, a failed probe, a materials mismatch). */\n moduleFor(gpu: DisplayViewGpuSetup, signal: AbortSignal): Promise<DisplayViewGpuMaterialModule>;\n /** Uploaded scenes (for tests). */\n readonly uploadedScenes: number;\n release(): void;\n}\n\nexport function createDisplayViewMaterialModules(runtime: WebGpuRuntime, pipelines: PipelineSource): DisplayViewMaterialModules {\n const presets = new WeakMap<ResolvedChartScene, DisplayViewGpuMaterialModule>(), uploads: UploadedRecords[] = [];\n let probed: Promise<ChartCompositeProbeRecord> | null = null;\n const wgsl = new Map<ChartCompositeProductPath, string>();\n const probe = (signal: AbortSignal): Promise<ChartCompositeProbeRecord> => {\n probed ??= probeChartCompositeDevice(runtime, pipelines, signal).catch((error: unknown) => { probed = null; throw error; });\n return probed;\n };\n const records = (scene: ReturnType<typeof sceneOf>): UploadedRecords => {\n const index = uploads.findIndex((e) => e.key === scene.key);\n if (index >= 0) { const [entry] = uploads.splice(index, 1); uploads.push(entry!); return entry!; }\n // packChartScene reads the plan's chart, layers and materials only.\n const packed = packChartScene({ chart: scene.chart, layers: scene.layers, materials: scene.materials } as unknown as ChartRadianceBatchPlan);\n if (Math.max(packed.af.byteLength, packed.ai.byteLength) > runtime.maximumStorageBindingBytes) throw new ImageKernelExecutionError(\"insufficient-limits\", \"Chart records exceed the device's storage binding limit.\");\n const scope = new GpuResourceScope(runtime);\n const entry: UploadedRecords = { key: scene.key, scope, af: scope.upload(\"photivra-display-view-chart-floats\", packed.af, BUFFER_USAGE.STORAGE), ai: scope.upload(\"photivra-display-view-chart-records\", packed.ai, BUFFER_USAGE.STORAGE), packed };\n uploads.push(entry);\n while (uploads.length > KEPT_SCENES) uploads.shift()!.scope.release();\n return entry;\n };\n return {\n async moduleFor(gpu, signal): Promise<DisplayViewGpuMaterialModule> {\n const scene = sceneOf(gpu), placement = gpu.placement ?? null, signalInput = gpu.signalInput;\n const tableMaterials = signalInput.scene.kind === \"materials\" ? signalInput.scene.materials.length : -1;\n if (tableMaterials !== scene.materials.length + (placement ? 1 : 0))\n throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"The expected signal's materials do not match the scene's (\" + tableMaterials + \" against \" + scene.materials.length + (placement ? \" plus the surround\" : \"\") + \"); use cpu-reference.\");\n if (!scene.layers && !placement && chartGpuPresetCode({ chart: scene.chart } as unknown as ChartRadianceBatchPlan) !== undefined) {\n let module = presets.get(scene.chart);\n if (!module) { module = chartPresetMaterialModule(scene.chart); presets.set(scene.chart, module); }\n return module;\n }\n const record = await probe(signal), path = record.productPath ?? \"dekker\";\n const lattice = displayViewLatticeConstants(signalInput, placement, scene.materials.length), uploaded = records(scene);\n let code = wgsl.get(path);\n if (code === undefined) { code = chartCompositeMaterialWgsl(path); wgsl.set(path, code); }\n return { id: chartCompositeMaterialModuleId(path), wgsl: code, compositeProbe: record, bindings: [\n { binding: 0, kind: \"storage\", buffer: uploaded.af }, { binding: 1, kind: \"storage\", buffer: uploaded.ai },\n { binding: 2, kind: \"uniform\", data: new Uint8Array(lattice.params) }, { binding: 3, kind: \"storage\", data: lattice.offsets }] };\n },\n get uploadedScenes(): number { return uploads.length; },\n release(): void { for (const entry of uploads.splice(0)) entry.scope.release(); }\n };\n}\n"]}
@@ -19,7 +19,8 @@
19
19
  * the bilinear or the AHD candidates and the low-signal correction. Internal: not exported from the package.
20
20
  *
21
21
  * Flagged display pixels (an uncertain lattice material among the sites read, a missing correction state after the
22
- * states were computed, a correction-threshold decision within its bound, a non-finite output) are recomputed with the
22
+ * states were computed, a correction-threshold decision within its bound, AHD's choice on the noise-free mosaic able to move
23
+ * the pixel by more than DISPLAY_VIEW_QUALITY_CHOICE_SIGMA of its noise (#457), a non-finite output) are recomputed with the
23
24
  * reference, so they are exact. Every stage's wall-clock time is reported (`stageMilliseconds`); on a software adapter it
24
25
  * is not GPU performance.
25
26
  */
@@ -20,7 +20,8 @@
20
20
  * the bilinear or the AHD candidates and the low-signal correction. Internal: not exported from the package.
21
21
  *
22
22
  * Flagged display pixels (an uncertain lattice material among the sites read, a missing correction state after the
23
- * states were computed, a correction-threshold decision within its bound, a non-finite output) are recomputed with the
23
+ * states were computed, a correction-threshold decision within its bound, AHD's choice on the noise-free mosaic able to move
24
+ * the pixel by more than DISPLAY_VIEW_QUALITY_CHOICE_SIGMA of its noise (#457), a non-finite output) are recomputed with the
24
25
  * reference, so they are exact. Every stage's wall-clock time is reported (`stageMilliseconds`); on a software adapter it
25
26
  * is not GPU performance.
26
27
  */
@@ -732,7 +733,7 @@ export async function renderDisplayViewQualityOnGpu(runtime, bandBytes, input, a
732
733
  }
733
734
  }
734
735
  timings.finishing = now() - t0;
735
- // Flagged display pixels: the reference's own pixel (a one-pixel region render is byte-identical to the whole view's pixel).
736
+ // Flagged display pixels: the reference's own pixels (a region render is byte-identical to the whole view's pixels).
736
737
  t0 = now();
737
738
  const recomputed = [];
738
739
  if (flagged.length > 0) {
@@ -754,19 +755,28 @@ export async function renderDisplayViewQualityOnGpu(runtime, bandBytes, input, a
754
755
  }
755
756
  else {
756
757
  const signal = createDisplayViewExpectedSignal(signalInput);
757
- for (const i of flagged) {
758
+ // Runs of consecutive flagged pixels along a row are rendered as one region (#457: AHD's choice flags stretches near
759
+ // edges); a region render is byte-identical to the same pixels of the whole view, so each pixel equals its one-pixel
760
+ // render, and the run's counts are the sums of its pixels' counts.
761
+ for (let r = 0; r < flagged.length;) {
758
762
  checkAbort(abort.signal);
759
- const rx = i % region.width, ry = (i - rx) / region.width;
760
- const pixel = await renderDisplayView({ ...setup, signal, region: { x: region.x + rx, y: region.y + ry, width: 1, height: 1 } });
761
- samples.set(pixel.samples, i * 3);
762
- expected.set(pixel.expected, i * 3);
763
- noiseStd.set(pixel.noiseStd, i * 3);
764
- meanBound[i] = 0;
765
- varianceBound[i] = 0;
766
- corrected += pixel.ahdCorrectedPixelCount;
767
- sampleCount += pixel.sampleCount;
768
- siteCount += pixel.siteCount;
769
- recomputed.push(i);
763
+ const first = flagged[r], rx = first % region.width, ry = (first - rx) / region.width;
764
+ let run = 1;
765
+ while (r + run < flagged.length && flagged[r + run] === first + run && rx + run < region.width)
766
+ run++;
767
+ const part = await renderDisplayView({ ...setup, signal, region: { x: region.x + rx, y: region.y + ry, width: run, height: 1 } });
768
+ samples.set(part.samples, first * 3);
769
+ expected.set(part.expected, first * 3);
770
+ noiseStd.set(part.noiseStd, first * 3);
771
+ for (let k = 0; k < run; k++) {
772
+ meanBound[first + k] = 0;
773
+ varianceBound[first + k] = 0;
774
+ recomputed.push(first + k);
775
+ }
776
+ corrected += part.ahdCorrectedPixelCount;
777
+ sampleCount += part.sampleCount;
778
+ siteCount += part.siteCount;
779
+ r += run;
770
780
  }
771
781
  }
772
782
  }