@photivra/engine 2.18.0 → 2.20.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 (335) hide show
  1. package/CHANGELOG.md +179 -1
  2. package/CITATION.cff +1 -1
  3. package/NODE_SUPPORT.md +7 -5
  4. package/README.md +6 -6
  5. package/SECURITY.md +1 -1
  6. package/THIRD_PARTY.md +14 -10
  7. package/dist/capture/dng-lens-correction-opcodes.d.ts +32 -0
  8. package/dist/capture/dng-lens-correction-opcodes.js +119 -0
  9. package/dist/capture/dng-lens-correction-opcodes.js.map +1 -0
  10. package/dist/capture/focus-control.js +2 -75
  11. package/dist/capture/focus-control.js.map +1 -1
  12. package/dist/capture/native-environment-lean.d.ts +1 -0
  13. package/dist/capture/native-environment-lean.js +2 -6
  14. package/dist/capture/native-environment-lean.js.map +1 -1
  15. package/dist/capture/native-environment-optical-stage.d.ts +1 -0
  16. package/dist/capture/native-environment-optical-stage.js +2 -5
  17. package/dist/capture/native-environment-optical-stage.js.map +1 -1
  18. package/dist/capture/native-environment-raw.js +1 -5
  19. package/dist/capture/native-environment-raw.js.map +1 -1
  20. package/dist/capture/native-raw-dng.d.ts +6 -0
  21. package/dist/capture/native-raw-dng.js +16 -2
  22. package/dist/capture/native-raw-dng.js.map +1 -1
  23. package/dist/capture/release-sequence.js +2 -47
  24. package/dist/capture/release-sequence.js.map +1 -1
  25. package/dist/capture/sensor-raw-producer.js +3 -5
  26. package/dist/capture/sensor-raw-producer.js.map +1 -1
  27. package/dist/color/white-balance.d.ts +2 -0
  28. package/dist/color/white-balance.js +3 -56
  29. package/dist/color/white-balance.js.map +1 -1
  30. package/dist/composition/image-formation-plan.d.ts +1 -0
  31. package/dist/composition/image-formation-plan.js +3 -49
  32. package/dist/composition/image-formation-plan.js.map +1 -1
  33. package/dist/core/evidence-provenance.js +1 -16
  34. package/dist/core/evidence-provenance.js.map +1 -1
  35. package/dist/core/record-validation.d.ts +54 -0
  36. package/dist/core/record-validation.js +176 -0
  37. package/dist/core/record-validation.js.map +1 -1
  38. package/dist/core/scientific-assurance.js +1 -18
  39. package/dist/core/scientific-assurance.js.map +1 -1
  40. package/dist/core/shared-helpers.d.ts +35 -0
  41. package/dist/core/shared-helpers.js +38 -0
  42. package/dist/core/shared-helpers.js.map +1 -0
  43. package/dist/core/spectral-composition.js +1 -36
  44. package/dist/core/spectral-composition.js.map +1 -1
  45. package/dist/core/spectral.js +1 -19
  46. package/dist/core/spectral.js.map +1 -1
  47. package/dist/core/version.d.ts +1 -1
  48. package/dist/core/version.js +1 -1
  49. package/dist/core/version.js.map +1 -1
  50. package/dist/equipment/exposure-capabilities.d.ts +1 -0
  51. package/dist/equipment/exposure-capabilities.js +2 -36
  52. package/dist/equipment/exposure-capabilities.js.map +1 -1
  53. package/dist/equipment/generic-lens-catalogue.d.ts +8 -2
  54. package/dist/equipment/generic-lens-catalogue.js +31 -2
  55. package/dist/equipment/generic-lens-catalogue.js.map +1 -1
  56. package/dist/equipment/generic-tier-assets.js +2 -3
  57. package/dist/equipment/generic-tier-assets.js.map +1 -1
  58. package/dist/equipment/generic-tier-presets.js +2 -3
  59. package/dist/equipment/generic-tier-presets.js.map +1 -1
  60. package/dist/equipment/iso-capabilities.js +2 -49
  61. package/dist/equipment/iso-capabilities.js.map +1 -1
  62. package/dist/equipment/metering-capabilities.js +1 -26
  63. package/dist/equipment/metering-capabilities.js.map +1 -1
  64. package/dist/equipment/release-capabilities.js +1 -53
  65. package/dist/equipment/release-capabilities.js.map +1 -1
  66. package/dist/exposure/auto-iso-slowest-shutter.js +1 -7
  67. package/dist/exposure/auto-iso-slowest-shutter.js.map +1 -1
  68. package/dist/exposure/exposure-duration-control.js +1 -16
  69. package/dist/exposure/exposure-duration-control.js.map +1 -1
  70. package/dist/exposure/exposure-mode-resolver.js +1 -17
  71. package/dist/exposure/exposure-mode-resolver.js.map +1 -1
  72. package/dist/exposure/filtered-exposure-time.d.ts +93 -0
  73. package/dist/exposure/filtered-exposure-time.js +129 -0
  74. package/dist/exposure/filtered-exposure-time.js.map +1 -0
  75. package/dist/exposure/flash-ttl.d.ts +1 -0
  76. package/dist/exposure/flash-ttl.js +1 -1
  77. package/dist/exposure/flash-ttl.js.map +1 -1
  78. package/dist/exposure/flash.js +1 -49
  79. package/dist/exposure/flash.js.map +1 -1
  80. package/dist/exposure/metering-scene-radiance.js +1 -25
  81. package/dist/exposure/metering-scene-radiance.js.map +1 -1
  82. package/dist/exposure/metering-target.js +1 -30
  83. package/dist/exposure/metering-target.js.map +1 -1
  84. package/dist/exposure/metering-temporal.js +1 -8
  85. package/dist/exposure/metering-temporal.js.map +1 -1
  86. package/dist/exposure/metering.js +1 -72
  87. package/dist/exposure/metering.js.map +1 -1
  88. package/dist/exposure/program-line.js +1 -45
  89. package/dist/exposure/program-line.js.map +1 -1
  90. package/dist/facade/develop-joined-parts.d.ts +29 -0
  91. package/dist/facade/develop-joined-parts.js +33 -0
  92. package/dist/facade/develop-joined-parts.js.map +1 -0
  93. package/dist/facade/display-view-gpu.d.ts +7 -4
  94. package/dist/facade/display-view-gpu.js +4 -4
  95. package/dist/facade/display-view-gpu.js.map +1 -1
  96. package/dist/facade/display-view-lens-signal.d.ts +1 -1
  97. package/dist/facade/display-view-lens-signal.js +5 -3
  98. package/dist/facade/display-view-lens-signal.js.map +1 -1
  99. package/dist/facade/display-view.d.ts +3 -1
  100. package/dist/facade/display-view.js +1 -1
  101. package/dist/facade/display-view.js.map +1 -1
  102. package/dist/facade/fast-methods.d.ts +50 -0
  103. package/dist/facade/fast-methods.js +50 -0
  104. package/dist/facade/fast-methods.js.map +1 -0
  105. package/dist/facade/fast-resolution.d.ts +12 -0
  106. package/dist/facade/fast-resolution.js +18 -0
  107. package/dist/facade/fast-resolution.js.map +1 -0
  108. package/dist/facade/generic-lens-capture.d.ts +6 -3
  109. package/dist/facade/generic-lens-capture.js +6 -3
  110. package/dist/facade/generic-lens-capture.js.map +1 -1
  111. package/dist/facade/simulate-capture.d.ts +88 -16
  112. package/dist/facade/simulate-capture.js +279 -153
  113. package/dist/facade/simulate-capture.js.map +1 -1
  114. package/dist/facade/simulate-display-view.d.ts +3 -2
  115. package/dist/facade/simulate-display-view.js +22 -12
  116. package/dist/facade/simulate-display-view.js.map +1 -1
  117. package/dist/gpu/chart-composite-gpu.js +1 -3
  118. package/dist/gpu/chart-composite-gpu.js.map +1 -1
  119. package/dist/gpu/chart-radiance-gpu.js +1 -5
  120. package/dist/gpu/chart-radiance-gpu.js.map +1 -1
  121. package/dist/gpu/display-view-quality-gpu.d.ts +13 -1
  122. package/dist/gpu/display-view-quality-gpu.js +4 -8
  123. package/dist/gpu/display-view-quality-gpu.js.map +1 -1
  124. package/dist/gpu/display-view-speed-gpu.js +3 -25
  125. package/dist/gpu/display-view-speed-gpu.js.map +1 -1
  126. package/dist/gpu/sensor-stage-gpu.js +1 -5
  127. package/dist/gpu/sensor-stage-gpu.js.map +1 -1
  128. package/dist/gpu/webgpu-runtime.d.ts +2 -0
  129. package/dist/gpu/webgpu-runtime.js +3 -0
  130. package/dist/gpu/webgpu-runtime.js.map +1 -1
  131. package/dist/index.d.ts +11 -1
  132. package/dist/index.js +8 -0
  133. package/dist/index.js.map +1 -1
  134. package/dist/motion/camera-rotation.js +1 -6
  135. package/dist/motion/camera-rotation.js.map +1 -1
  136. package/dist/motion/capture-rotation-inverse-mapping.d.ts +12 -0
  137. package/dist/motion/capture-rotation-inverse-mapping.js +2 -2
  138. package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
  139. package/dist/motion/capture-rotation-temporal-quadrature.d.ts +1 -0
  140. package/dist/motion/capture-rotation-temporal-quadrature.js +1 -1
  141. package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
  142. package/dist/motion/capture-rotation-trajectory.js +2 -17
  143. package/dist/motion/capture-rotation-trajectory.js.map +1 -1
  144. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +1 -0
  145. package/dist/motion/capture-translation-parallax-temporal-quadrature.js +3 -14
  146. package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -1
  147. package/dist/motion/extended-object-projection.js +5 -40
  148. package/dist/motion/extended-object-projection.js.map +1 -1
  149. package/dist/optics/aperture-diameter.d.ts +47 -0
  150. package/dist/optics/aperture-diameter.js +50 -0
  151. package/dist/optics/aperture-diameter.js.map +1 -0
  152. package/dist/optics/atmospheric-haze.js +1 -7
  153. package/dist/optics/atmospheric-haze.js.map +1 -1
  154. package/dist/optics/brown-conrady-distortion.js +1 -7
  155. package/dist/optics/brown-conrady-distortion.js.map +1 -1
  156. package/dist/optics/complex-pupil-psf.d.ts +1 -0
  157. package/dist/optics/complex-pupil-psf.js +2 -84
  158. package/dist/optics/complex-pupil-psf.js.map +1 -1
  159. package/dist/optics/detail-limit.d.ts +182 -0
  160. package/dist/optics/detail-limit.js +336 -0
  161. package/dist/optics/detail-limit.js.map +1 -0
  162. package/dist/optics/focus-state.js +1 -11
  163. package/dist/optics/focus-state.js.map +1 -1
  164. package/dist/optics/front-of-lens-filter.d.ts +5 -0
  165. package/dist/optics/front-of-lens-filter.js +3 -65
  166. package/dist/optics/front-of-lens-filter.js.map +1 -1
  167. package/dist/optics/generic-lens-psf.d.ts +18 -2
  168. package/dist/optics/generic-lens-psf.js +25 -2
  169. package/dist/optics/generic-lens-psf.js.map +1 -1
  170. package/dist/optics/generic-nd-filter-presets.d.ts +12 -0
  171. package/dist/optics/generic-nd-filter-presets.js +48 -0
  172. package/dist/optics/generic-nd-filter-presets.js.map +1 -0
  173. package/dist/optics/illumination-vignetting.js +1 -6
  174. package/dist/optics/illumination-vignetting.js.map +1 -1
  175. package/dist/optics/lens-psf-profile.d.ts +4 -1
  176. package/dist/optics/lens-psf-profile.js +12 -111
  177. package/dist/optics/lens-psf-profile.js.map +1 -1
  178. package/dist/optics/longitudinal-chromatic-aberration.js +1 -7
  179. package/dist/optics/longitudinal-chromatic-aberration.js.map +1 -1
  180. package/dist/optics/pupil-vignetting.js +1 -7
  181. package/dist/optics/pupil-vignetting.js.map +1 -1
  182. package/dist/optics/radial-distortion.js +1 -6
  183. package/dist/optics/radial-distortion.js.map +1 -1
  184. package/dist/optics/scene-to-sensor-irradiance.d.ts +13 -0
  185. package/dist/optics/scene-to-sensor-irradiance.js +11 -96
  186. package/dist/optics/scene-to-sensor-irradiance.js.map +1 -1
  187. package/dist/optics/stray-light.d.ts +1 -0
  188. package/dist/optics/stray-light.js +1 -1
  189. package/dist/optics/stray-light.js.map +1 -1
  190. package/dist/optics/zernike-wavefront.js +1 -7
  191. package/dist/optics/zernike-wavefront.js.map +1 -1
  192. package/dist/output/capture-geometry.js +1 -8
  193. package/dist/output/capture-geometry.js.map +1 -1
  194. package/dist/output/crop-to-match-focal-length.d.ts +62 -0
  195. package/dist/output/crop-to-match-focal-length.js +63 -0
  196. package/dist/output/crop-to-match-focal-length.js.map +1 -0
  197. package/dist/output/developed-lens-corrections.d.ts +62 -0
  198. package/dist/output/developed-lens-corrections.js +135 -0
  199. package/dist/output/developed-lens-corrections.js.map +1 -0
  200. package/dist/output/generic-lens-corrections.d.ts +5 -7
  201. package/dist/output/generic-lens-corrections.js +11 -10
  202. package/dist/output/generic-lens-corrections.js.map +1 -1
  203. package/dist/output/geometric-transforms.js +1 -4
  204. package/dist/output/geometric-transforms.js.map +1 -1
  205. package/dist/output/lens-corrections.d.ts +12 -2
  206. package/dist/output/lens-corrections.js +22 -7
  207. package/dist/output/lens-corrections.js.map +1 -1
  208. package/dist/output/native-capture-sdr.d.ts +2 -2
  209. package/dist/output/native-capture-sdr.js +3 -2
  210. package/dist/output/native-capture-sdr.js.map +1 -1
  211. package/dist/output/print-contrast-reference.js +1 -1
  212. package/dist/output/print-contrast-reference.js.map +1 -1
  213. package/dist/output/print-size-blur-noise.d.ts +110 -0
  214. package/dist/output/print-size-blur-noise.js +138 -0
  215. package/dist/output/print-size-blur-noise.js.map +1 -0
  216. package/dist/processing/development-detail.d.ts +29 -0
  217. package/dist/processing/development-detail.js +128 -107
  218. package/dist/processing/development-detail.js.map +1 -1
  219. package/dist/schema/illumination-temporal.js +3 -72
  220. package/dist/schema/illumination-temporal.js.map +1 -1
  221. package/dist/schema/illumination.d.ts +1 -0
  222. package/dist/schema/illumination.js +2 -65
  223. package/dist/schema/illumination.js.map +1 -1
  224. package/dist/schema/scene-radiance-temporal.js +2 -14
  225. package/dist/schema/scene-radiance-temporal.js.map +1 -1
  226. package/dist/schema/scene-radiance.js +2 -60
  227. package/dist/schema/scene-radiance.js.map +1 -1
  228. package/dist/schema/validation.d.ts +2 -0
  229. package/dist/schema/validation.js +2 -17
  230. package/dist/schema/validation.js.map +1 -1
  231. package/dist/sensor/accumulated-charge.js +2 -59
  232. package/dist/sensor/accumulated-charge.js.map +1 -1
  233. package/dist/sensor/architecture.js +1 -16
  234. package/dist/sensor/architecture.js.map +1 -1
  235. package/dist/sensor/camera-saturation-capacity.d.ts +1 -0
  236. package/dist/sensor/camera-saturation-capacity.js +3 -55
  237. package/dist/sensor/camera-saturation-capacity.js.map +1 -1
  238. package/dist/sensor/capture-color-sampling-binding.js +1 -26
  239. package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
  240. package/dist/sensor/capture-mode-timing.js +1 -39
  241. package/dist/sensor/capture-mode-timing.js.map +1 -1
  242. package/dist/sensor/capture-mode.js +1 -23
  243. package/dist/sensor/capture-mode.js.map +1 -1
  244. package/dist/sensor/color-sampling.js +1 -26
  245. package/dist/sensor/color-sampling.js.map +1 -1
  246. package/dist/sensor/constant-rate-temporal-integration.js +2 -46
  247. package/dist/sensor/constant-rate-temporal-integration.js.map +1 -1
  248. package/dist/sensor/dark-current.js +2 -45
  249. package/dist/sensor/dark-current.js.map +1 -1
  250. package/dist/sensor/eqe-electron-rate.js +2 -41
  251. package/dist/sensor/eqe-electron-rate.js.map +1 -1
  252. package/dist/sensor/exposure-window.d.ts +7 -0
  253. package/dist/sensor/exposure-window.js +9 -24
  254. package/dist/sensor/exposure-window.js.map +1 -1
  255. package/dist/sensor/iso-gain.js +1 -7
  256. package/dist/sensor/iso-gain.js.map +1 -1
  257. package/dist/sensor/iso-signal-chain.js +1 -43
  258. package/dist/sensor/iso-signal-chain.js.map +1 -1
  259. package/dist/sensor/optical-stack.js +1 -25
  260. package/dist/sensor/optical-stack.js.map +1 -1
  261. package/dist/sensor/photon-energy.js +1 -26
  262. package/dist/sensor/photon-energy.js.map +1 -1
  263. package/dist/sensor/physical-charge-capacity.js +3 -77
  264. package/dist/sensor/physical-charge-capacity.js.map +1 -1
  265. package/dist/sensor/radiometry-readiness.js +2 -23
  266. package/dist/sensor/radiometry-readiness.js.map +1 -1
  267. package/dist/sensor/raw-readout.d.ts +3 -0
  268. package/dist/sensor/raw-readout.js +4 -66
  269. package/dist/sensor/raw-readout.js.map +1 -1
  270. package/dist/sensor/raw-reconstruction.js +2 -64
  271. package/dist/sensor/raw-reconstruction.js.map +1 -1
  272. package/dist/sensor/readout-exposure-linkage.js +1 -9
  273. package/dist/sensor/readout-exposure-linkage.js.map +1 -1
  274. package/dist/sensor/readout-timing.js +4 -79
  275. package/dist/sensor/readout-timing.js.map +1 -1
  276. package/dist/sensor/response-application-compatibility.d.ts +2 -0
  277. package/dist/sensor/response-application-compatibility.js +4 -35
  278. package/dist/sensor/response-application-compatibility.js.map +1 -1
  279. package/dist/sensor/response-operating-range.d.ts +1 -0
  280. package/dist/sensor/response-operating-range.js +3 -79
  281. package/dist/sensor/response-operating-range.js.map +1 -1
  282. package/dist/sensor/responsivity-photocurrent.js +4 -114
  283. package/dist/sensor/responsivity-photocurrent.js.map +1 -1
  284. package/dist/sensor/sampling-aperture.js +1 -25
  285. package/dist/sensor/sampling-aperture.js.map +1 -1
  286. package/dist/sensor/sensor-characteristics.d.ts +137 -0
  287. package/dist/sensor/sensor-characteristics.js +115 -0
  288. package/dist/sensor/sensor-characteristics.js.map +1 -0
  289. package/dist/sensor/spatial-sample-reduction.js +3 -24
  290. package/dist/sensor/spatial-sample-reduction.js.map +1 -1
  291. package/dist/sensor/spatial-sampling-quadrature.js +1 -3
  292. package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
  293. package/dist/sensor/spatio-spectral-reduction.js +1 -18
  294. package/dist/sensor/spatio-spectral-reduction.js.map +1 -1
  295. package/dist/sensor/spectral-coverage.d.ts +10 -1
  296. package/dist/sensor/spectral-coverage.js +1 -1
  297. package/dist/sensor/spectral-coverage.js.map +1 -1
  298. package/dist/sensor/spectral-quadrature.js +3 -41
  299. package/dist/sensor/spectral-quadrature.js.map +1 -1
  300. package/dist/sensor/spectral-response.js +1 -47
  301. package/dist/sensor/spectral-response.js.map +1 -1
  302. package/dist/sensor/temporal-photo-signal.d.ts +3 -0
  303. package/dist/sensor/temporal-photo-signal.js +5 -2
  304. package/dist/sensor/temporal-photo-signal.js.map +1 -1
  305. package/dist/stabilization/camera-shake.js +1 -6
  306. package/dist/stabilization/camera-shake.js.map +1 -1
  307. package/dist/stabilization/system.d.ts +9 -0
  308. package/dist/stabilization/system.js +7 -86
  309. package/dist/stabilization/system.js.map +1 -1
  310. package/docs/AGENT_GUIDE.md +5 -0
  311. package/docs/API_REFERENCE.md +116 -3
  312. package/docs/QUICK_START.md +178 -14
  313. package/docs/USAGE.md +111 -3
  314. package/docs/api/capture-native-raw-dng.md +6 -0
  315. package/docs/api/core-version.md +1 -1
  316. package/docs/api/equipment-generic-lens-catalogue.md +7 -2
  317. package/docs/api/exports.json +203 -3
  318. package/docs/api/exposure-filtered-exposure-time.md +105 -0
  319. package/docs/api/facade-develop-joined-parts.md +32 -0
  320. package/docs/api/facade-display-view-gpu.md +5 -2
  321. package/docs/api/facade-fast-methods.md +91 -0
  322. package/docs/api/facade-simulate-capture.md +72 -16
  323. package/docs/api/facade-simulate-display-view.md +3 -2
  324. package/docs/api/optics-aperture-diameter.md +51 -0
  325. package/docs/api/optics-detail-limit.md +203 -0
  326. package/docs/api/optics-generic-nd-filter-presets.md +34 -0
  327. package/docs/api/optics-lens-psf-profile.md +3 -1
  328. package/docs/api/output-crop-to-match-focal-length.md +67 -0
  329. package/docs/api/output-developed-lens-corrections.md +12 -0
  330. package/docs/api/output-generic-lens-corrections.md +3 -10
  331. package/docs/api/output-lens-corrections.md +11 -1
  332. package/docs/api/output-print-size-blur-noise.md +115 -0
  333. package/docs/api/sensor-sensor-characteristics.md +105 -0
  334. package/llms.txt +5 -0
  335. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"chart-composite-gpu.js","sourceRoot":"","sources":["../../src/gpu/chart-composite-gpu.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Host side of the composite-chart radiance kernel (#477, wgsl-chart-composite-kernel.ts): packs a resolved\n * chart's geometry (`chartGeometry`) and a declared scene's mask layers into the kernel's record arrays,\n * keeps the packed records and their GPU buffers per scene so a prepared view uploads them once, probes the\n * device's double-float32 arithmetic, dispatches in bands, and recomputes flagged points with the float64\n * reference. Internal; the public entry point is `ImageKernelAccelerator.evaluateChartRadiance`.\n */\nimport { createHostYieldGate } from \"../capture/host-yield-cadence.js\";\nimport type { ChartRadianceBatchPlan } from \"../facade/chart-radiance-batch.js\";\nimport { chartGeometry, type ChartGeometry, type ResolvedChartScene } from \"../facade/chart-scenes.js\";\nimport type { ResolvedChartMaskLayer } from \"../facade/chart-material-layers.js\";\nimport { ImageKernelExecutionError, webGpuExecution, type ChartCompositeProbeComponent, type ChartCompositeProbeMismatch, type ChartCompositeProbeRecord,\n type ImageKernelExecution } from \"./image-kernel-execution.js\";\nimport type { ChartRadianceResult } from \"./image-kernel-accelerator.js\";\nimport { BUFFER_USAGE, GpuResourceScope, 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"]}
1
+ {"version":3,"file":"chart-composite-gpu.js","sourceRoot":"","sources":["../../src/gpu/chart-composite-gpu.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Host side of the composite-chart radiance kernel (#477, wgsl-chart-composite-kernel.ts): packs a resolved\n * chart's geometry (`chartGeometry`) and a declared scene's mask layers into the kernel's record arrays,\n * keeps the packed records and their GPU buffers per scene so a prepared view uploads them once, probes the\n * device's double-float32 arithmetic, dispatches in bands, and recomputes flagged points with the float64\n * reference. Internal; the public entry point is `ImageKernelAccelerator.evaluateChartRadiance`.\n */\nimport { createHostYieldGate } from \"../capture/host-yield-cadence.js\";\nimport type { ChartRadianceBatchPlan } from \"../facade/chart-radiance-batch.js\";\nimport { chartGeometry, type ChartGeometry, type ResolvedChartScene } from \"../facade/chart-scenes.js\";\nimport type { ResolvedChartMaskLayer } from \"../facade/chart-material-layers.js\";\nimport { ImageKernelExecutionError, webGpuExecution, type ChartCompositeProbeComponent, type ChartCompositeProbeMismatch, type ChartCompositeProbeRecord,\n type ImageKernelExecution } from \"./image-kernel-execution.js\";\nimport type { ChartRadianceResult } from \"./image-kernel-accelerator.js\";\nimport { BUFFER_USAGE, GpuResourceScope, linearDispatch, runComputePass, type WebGpuRuntime, throwIfAborted as checkAbort } from \"./webgpu-runtime.js\";\nimport { CHART_COMPOSITE_PROBE_LABEL, CHART_COMPOSITE_PROBE_OUTPUTS, CHART_COMPOSITE_PROBE_WGSL, CHART_COMPOSITE_WORKGROUP_SIZE, CHART_ELEMENT_KIND,\n CHART_PLACEMENT, CHART_RECORD_STRIDE, chartCompositeLabel, chartCompositeWgsl } from \"./wgsl-chart-composite-kernel.js\";\n\ntype PipelineSource = (label: string, code: string) => Promise<GPUComputePipeline>;\ntype YieldControl = ((signal: AbortSignal) => Promise<void>) | undefined;\n\nconst f = Math.fround;\nconst FLOAT32_SAFE_MAGNITUDE = 2 ** 120;\n/** Frame-unit magnitude limit for GPU points (shared with the preset kernel). */\nconst MAXIMUM_COORDINATE = 2 ** 20;\n/** The rough angle's allowance when the star's sector window is sized: the WGSL atan2 bound (4096 ULP, about 2^-10 rad) with a 4× margin. */\nconst STAR_ANGLE_ALLOWANCE = 2 ** -8;\n\n// --- double-float32 in JavaScript (Math.fround after every operation): the probe's expected values and the test emulation ---\nexport type Dw = readonly [hi: number, lo: number];\nexport function dwSplit(x: number): Dw { const hi = f(x), lo = f(x - hi); return [hi, lo]; }\nexport function twoSum(a: number, b: number): Dw { const s = f(a + b), bb = f(s - a); return [s, f(f(a - f(s - bb)) + f(b - bb))]; }\nexport function quickTwoSum(a: number, b: number): Dw { const s = f(a + b); return [s, f(b - f(s - a))]; }\nfunction veltkamp(a: number): Dw { const t = f(4097 * a), h = f(t - f(t - a)); return [h, f(a - h)]; }\nexport function twoProd(a: number, b: number): Dw {\n const p = f(a * b), [ah, al] = veltkamp(a), [bh, bl] = veltkamp(b);\n const e = f(f(f(f(f(ah * bh) - p) + f(ah * bl)) + f(al * bh)) + f(al * bl));\n return [p, e];\n}\nexport function dwAdd(a: Dw, b: Dw): Dw {\n const s = twoSum(a[0], b[0]), t = twoSum(a[1], b[1]);\n const c = f(s[1] + t[0]), v = quickTwoSum(s[0], c);\n const w = f(v[1] + t[1]);\n return quickTwoSum(v[0], w);\n}\nexport function dwSub(a: Dw, b: Dw): Dw { return dwAdd(a, [-b[0], -b[1]]); }\nexport function dwMul(a: Dw, b: Dw): Dw {\n const p = twoProd(a[0], b[0]), t = f(f(a[0] * b[1]) + f(a[1] * b[0])), l = f(p[1] + t);\n return quickTwoSum(p[0], l);\n}\n\n/**\n * fma on float32 operands with one rounding to nearest (ties to even), as a fused `fma` evaluates it: the product of two float32\n * values is exact in float64 (48 significant bits), the float64 TwoSum gives the sum's exact error, and the one case where rounding\n * the float64 sum to float32 differs from rounding the exact sum (the float64 sum lands on a float32 midpoint) is resolved by the error's sign.\n */\nexport function fmaF32(a: number, b: number, c: number): number {\n const p = a * b, s = p + c, bb = s - p, e = (p - (s - bb)) + (c - bb), r = f(s);\n if (e === 0 || r === s || !Number.isFinite(r)) return r;\n const other = nextFloat32(r, s > r ? 1 : -1);\n if (Math.abs(s - r) !== Math.abs(other - s)) return r;\n return (e > 0) === (other > r) ? other : r;\n}\nconst bits32 = new Float32Array(1), int32 = new Int32Array(bits32.buffer);\n/** The float32 neighbour of a finite float32 x toward +∞ (direction 1) or −∞ (−1). */\nfunction nextFloat32(x: number, direction: 1 | -1): number {\n if (x === 0) return direction * 2 ** -149;\n bits32[0] = x;\n int32[0] = int32[0]! + ((x > 0) === (direction > 0) ? 1 : -1);\n return bits32[0]!;\n}\n/** The fma TwoProduct: p = fl(a·b) and its exact error fma(a, b, −p) (exact for a fused fma; Joldes, Muller & Popescu 2017, Algorithm 2). */\nexport function twoProdFma(a: number, b: number): Dw { const p = f(a * b); return [p, fmaF32(a, b, -p)]; }\n/** The cross-term sum t = a.h·b.l + a.l·b.h of a double-word product: unfused (the default), or with one of the two products fused into the addition. */\nexport function dwCrossTerm(a: Dw, b: Dw, contraction: \"none\" | \"first\" | \"second\" = \"none\"): number {\n if (contraction === \"first\") return fmaF32(a[0], b[1], f(a[1] * b[0]));\n if (contraction === \"second\") return fmaF32(a[1], b[0], f(a[0] * b[1]));\n return f(f(a[0] * b[1]) + f(a[1] * b[0]));\n}\n/**\n * The fma path's double-word product (`d_mul_fma`): s = fma(a.h, b.h, t), lo = fl(fma(a.h, b.h, −s) + t), with t the cross-term\n * sum. No rounded product is an operand of an addition, so a contraction cannot change it; see docs/WEBGPU.md for its error bound.\n */\nexport function dwMulFma(a: Dw, b: Dw, t: number = dwCrossTerm(a, b)): Dw {\n const s = fmaF32(a[0], b[0], t);\n return [s, f(fmaF32(a[0], b[0], -s) + t)];\n}\n/** The Dekker path's double-word product with a given cross-term sum (`dwMul` is it with the unfused one). */\nexport function dwMulDekker(a: Dw, b: Dw, t: number = dwCrossTerm(a, b)): Dw {\n const p = twoProd(a[0], b[0]), l = f(p[1] + t);\n return quickTwoSum(p[0], l);\n}\n\n/**\n * Probe inputs (x, y, z, w): pairs whose TwoSum and TwoProduct low parts are non-zero, double words to add and multiply, and sums and\n * products that a directed (truncating or upward) rounding would place on the other neighbour than round-to-nearest: 1 + 3·2^-26\n * rounds up to 1 + 2^-23 (nearest) but down to 1 (truncation); −1 − 3·2^-26 the mirror; 1.25 · (1 + 2^-23) likewise. The last four\n * (2.11.0, the M5 Pro finding) are normalized double words whose products have non-zero TwoProduct errors on both operand pairs, so\n * a contraction of the Dekker path's final Fast2Sum (which then adds the product's error twice) shows in the double-word product.\n */\nexport const PROBE_INPUTS: readonly (readonly [number, number, number, number])[] = /* @__PURE__ */ Object.freeze([\n [1, 2 ** -30, 1.5, 2 ** -29], [3.7, 1e-8, -2.25, 3e-9], [0.1, 0.7, 12345.678, -0.0001], [1e6, 1e-3, 1e-6, 1e-9], [-5.5, 2 ** -26, 7, -(2 ** -27)],\n [0.3333333, 0.6666667, 1.0000001, 0.99999994], [1024.5, 1e-5, 0.0078125, 3e-10], [2.5e-3, 4.1e-11, 999.75, 2 ** -40],\n [1, 3 * 2 ** -26, 1.25, 1 + 2 ** -23], [-1, -3 * 2 ** -26, -1.25, 1 + 2 ** -23], [1 + 2 ** -23, 1.25, 1, 5 * 2 ** -26], [0.75, 2 ** -25 + 2 ** -27, 3, 2 ** -24 + 2 ** -26],\n [1.1, 2.2e-9, 1.3, -3.1e-9], [0.7071068, -1.2e-8, 0.7071067, 2.9e-8], [123.456, 3.3e-6, -0.0123, 4.4e-10], [3.14159274, -8.7422777e-8, 2.7182817, 8.2e-8]\n]);\n/** The components of the probe in output order (see `CHART_COMPOSITE_PROBE_WGSL`). */\nexport const PROBE_COMPONENTS: readonly ChartCompositeProbeComponent[] = /* @__PURE__ */ Object.freeze([\"two-sum\", \"two-product\", \"double-word-add\", \"double-word-multiply\", \"fma-two-product\", \"fma-double-word-multiply\"]);\n/**\n * The probe's output per input on a device that evaluates as written, round to nearest, unfused, with a fused `fma`, in the shader's\n * order: [TwoSum lo, Dekker TwoProduct lo, double-word sum lo, fma TwoProduct lo, Dekker product hi, lo, fma product hi, lo].\n */\nexport function probeExpectation(input: readonly [number, number, number, number]): [number, number, number, number, number, number, number, number] {\n const [x, y, z, w] = input.map(f) as [number, number, number, number];\n const q = dwMulDekker([x, y], [z, w]), qf = dwMulFma([x, y], [z, w]);\n return [twoSum(x, y)[1], twoProd(x, y)[1], dwAdd([x, y], [z, w])[1], twoProdFma(x, y)[1], q[0], q[1], qf[0], qf[1]];\n}\nconst hex32 = (x: number): string => { bits32[0] = x; return \"0x\" + (int32[0]! >>> 0).toString(16).padStart(8, \"0\"); };\n\n/**\n * Classifies the probe's output (`CHART_COMPOSITE_PROBE_OUTPUTS` floats per input of `PROBE_INPUTS`). TwoSum, both TwoProducts and the\n * double-word sum must equal their exact values bit for bit (each is error-free, or a fixed sequence of roundings to nearest); a\n * double-word product must equal the written-order evaluation for the unfused cross-term sum t = a.h·b.l + a.l·b.h or for either\n * product of t fused into its addition (a contraction WGSL permits, \"Reassociation and Fusion\", and harmless there: t is an ordinary\n * bounded sum). Anything else is a mismatch, recorded with the float32 bits.\n */\nexport function classifyChartCompositeProbe(got: Float32Array): ChartCompositeProbeRecord {\n const counts = Object.fromEntries(PROBE_COMPONENTS.map((c) => [c, 0])) as Record<ChartCompositeProbeComponent, number>;\n const inputs = Object.fromEntries(PROBE_COMPONENTS.map((c) => [c, [] as number[]])) as Record<ChartCompositeProbeComponent, number[]>;\n const mismatches: ChartCompositeProbeMismatch[] = [];\n let nonFinite = false, sumZero = true;\n const miss = (component: ChartCompositeProbeComponent, input: number, g: number, want: number): void => {\n counts[component]++;\n inputs[component].push(input);\n if (!Number.isFinite(g)) nonFinite = true;\n if ((component === \"two-sum\" || component === \"double-word-add\") && g !== 0) sumZero = false;\n if (mismatches.length < 8) mismatches.push({ component, input, got: hex32(g), want: hex32(want) });\n };\n PROBE_INPUTS.forEach((row, i) => {\n const [x, y, z, w] = row.map(f) as [number, number, number, number], o = got.subarray(8 * i, 8 * i + 8), want = probeExpectation(row);\n for (const [k, component] of [[0, \"two-sum\"], [1, \"two-product\"], [2, \"double-word-add\"]] as const) if (!Object.is(o[k], want[k])) miss(component, i, o[k]!, want[k]);\n const products = (mul: (a: Dw, b: Dw, t: number) => Dw, h: number, l: number, component: ChartCompositeProbeComponent): void => {\n const candidates = ([\"none\", \"first\", \"second\"] as const).map((c) => mul([x, y], [z, w], dwCrossTerm([x, y], [z, w], c)));\n if (!candidates.some((c) => Object.is(c[0], h) && Object.is(c[1], l))) miss(component, i, Object.is(candidates[0]![0], h) ? l : h, Object.is(candidates[0]![0], h) ? candidates[0]![1] : candidates[0]![0]);\n };\n products(dwMulDekker, o[4]!, o[5]!, \"double-word-multiply\");\n if (!Object.is(o[3], want[3])) miss(\"fma-two-product\", i, o[3]!, want[3]);\n products(dwMulFma, o[6]!, o[7]!, \"fma-double-word-multiply\");\n });\n mismatches.sort((a, b) => PROBE_COMPONENTS.indexOf(a.component) - PROBE_COMPONENTS.indexOf(b.component) || a.input - b.input);\n const sums = counts[\"two-sum\"] + counts[\"double-word-add\"], dekker = counts[\"two-product\"] + counts[\"double-word-multiply\"];\n const fma = counts[\"fma-two-product\"] + counts[\"fma-double-word-multiply\"];\n const deviceClass: ChartCompositeProbeRecord[\"deviceClass\"] = nonFinite ? \"other\" : sums > 0 ? (sumZero ? \"reassociated\" : \"other\") : dekker > 0 ? \"contracted\" : \"exact\";\n const productPath = sums > 0 || nonFinite ? null : dekker === 0 ? \"dekker\" : fma === 0 ? \"fma\" : null;\n return Object.freeze({ deviceClass, productPath, fmaFused: counts[\"fma-two-product\"] === 0, inputs: PROBE_INPUTS.length, mismatchCounts: Object.freeze(counts),\n mismatchedInputs: Object.freeze(Object.fromEntries(PROBE_COMPONENTS.map((c) => [c, Object.freeze(inputs[c])])) as Record<ChartCompositeProbeComponent, readonly number[]>),\n mismatches: Object.freeze(mismatches.map((m) => Object.freeze(m))) });\n}\n\n/** The components' names in a log line, with the probe output they are (s.l, m.l, a.l, q of the probe before 2.11.0; mf.l, qf of the fma path). */\nconst COMPONENT_NAMES: Record<ChartCompositeProbeComponent, string> = { \"two-sum\": \"TwoSum (s.l)\", \"two-product\": \"TwoProduct (m.l)\", \"double-word-add\": \"double-word add (a.l)\",\n \"double-word-multiply\": \"double-word multiply (q)\", \"fma-two-product\": \"fma TwoProduct (mf.l)\", \"fma-double-word-multiply\": \"fma double-word multiply (qf)\" };\n/**\n * One log line for a probe record: the class, the chosen path, each differing component with its count and the probe input\n * indices that differ, and the first difference with its float32 bits.\n */\nexport function describeChartCompositeProbe(probe: ChartCompositeProbeRecord): string {\n const differing = PROBE_COMPONENTS.filter((c) => probe.mismatchCounts[c] > 0).map((c) => COMPONENT_NAMES[c] + \" ×\" + probe.mismatchCounts[c] + \" [\" + probe.mismatchedInputs[c].join(\",\") + \"]\");\n const first = probe.mismatches[0];\n return \"class \" + probe.deviceClass + \", product path \" + (probe.productPath ?? \"none\") + \", fma \" + (probe.fmaFused ? \"fused\" : \"not fused\") +\n (differing.length ? \"; differing of \" + probe.inputs + \" inputs: \" + differing.join(\", \") : \"\") +\n (first ? \"; first: \" + COMPONENT_NAMES[first.component] + \" input \" + first.input + \" got \" + first.got + \" want \" + first.want : \"\");\n}\n\n/** The probe's refusal: `unsupported-on-backend` with the probe record (`probe`) for the execution diagnostics. */\nexport class ChartCompositeProbeError extends ImageKernelExecutionError {\n constructor(readonly probe: ChartCompositeProbeRecord) {\n super(\"unsupported-on-backend\", \"This device does not evaluate the composite chart kernel's double-float32 arithmetic as written (\" + describeChartCompositeProbe(probe) +\n \"); use cpu-reference for composite charts, 2.3 elements and material-layers scenes.\");\n }\n}\n\n/** Packed records of one scene: the kernel's float and integer arrays and its material count. */\nexport interface PackedChartScene { af: Float32Array<ArrayBuffer>; ai: Uint32Array<ArrayBuffer>; materials: number; elementCount: number; layerCount: number }\n\nclass Packer {\n readonly af: number[] = [];\n readonly ai: number[] = [];\n floats(values: readonly number[]): number { const at = this.af.length; for (const x of values) this.af.push(x); return at; }\n ints(values: readonly number[]): number { const at = this.ai.length; for (const x of values) this.ai.push(x); return at; }\n reserveInts(count: number): number { const at = this.ai.length; for (let i = 0; i < count; i++) this.ai.push(0); return at; }\n}\n\n/** Sector boundary table of a Siemens star (bar or sine profile): directions, per-sector levels from the reference, bucket index and search window. */\nexport function starSectorTable(chart: ResolvedChartScene, g: Extract<ChartGeometry, { kind: \"siemens-star\" }>):\n { thetas: Float64Array; levels: Uint32Array; buckets: Uint32Array; window: number } {\n const set = new Set<number>(), normalize = (t: number): number => { let x = t; while (x <= -Math.PI) x += 2 * Math.PI; while (x > Math.PI) x -= 2 * Math.PI; return x; };\n if (g.profile === \"bar\") {\n for (let k = 1; k <= 2 * g.cycles; k++) set.add(normalize(Math.PI * (k / g.cycles - 1)));\n } else {\n for (let L = 1; L < 1024; L++) {\n const a = Math.asin(L / 512 - 1);\n for (let m = 0; m < g.cycles; m++) { set.add(normalize((a + 2 * Math.PI * m) / g.cycles - Math.PI)); set.add(normalize((Math.PI - a + 2 * Math.PI * m) / g.cycles - Math.PI)); }\n }\n }\n const thetas = Float64Array.from(set).sort(), n = thetas.length, rho = g.r / 2;\n const levels = new Uint32Array(n);\n for (let k = 0; k < n; k++) {\n const next = k + 1 < n ? thetas[k + 1]! : thetas[0]! + 2 * Math.PI, mid = (thetas[k]! + next) / 2;\n levels[k] = chart.materialAt(rho * Math.cos(mid), rho * Math.sin(mid));\n }\n const buckets = new Uint32Array(n);\n for (let j = 0; j < n; j++) {\n const start = -Math.PI + 2 * Math.PI * j / n;\n let lo = 0, hi = n;\n while (lo < hi) { const mid = (lo + hi) >> 1; if (thetas[mid]! >= start) hi = mid; else lo = mid + 1; }\n buckets[j] = lo;\n }\n // The window: the most boundaries any angular interval of the allowance (plus two buckets) can hold, capped so the window spans under a half turn.\n const reach = STAR_ANGLE_ALLOWANCE + 4 * Math.PI / n;\n let window = 1;\n for (let k = 0; k < n; k++) {\n let count = 0;\n for (let i = 1; i <= n; i++) { const t = k + i < n ? thetas[k + i]! : thetas[(k + i) % n]! + 2 * Math.PI; if (t - thetas[k]! <= 2 * reach) count++; else break; }\n window = Math.max(window, count + 1);\n }\n window = Math.min(window, Math.max(0, Math.floor(n / 4) - 1));\n return { thetas, levels, buckets, window };\n}\n\nfunction packElement(p: Packer, chart: ResolvedChartScene, offset: number, header: number, placement: { mode: number; cu: number; cv: number; hw: number; hh: number; scale: number }): void {\n const g = chartGeometry(chart);\n const [cuH, cuL] = dwSplit(placement.cu), [cvH, cvL] = dwSplit(placement.cv), [sH, sL] = dwSplit(placement.scale);\n const foff = p.floats([cuH, cuL, cvH, cvL, placement.hw, placement.hh, sH, sL, 0, 0]);\n const kindName = g.kind === \"composite\" ? null : g.kind;\n if (kindName === null) throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"A composite cannot be a composite element.\");\n const kind = CHART_ELEMENT_KIND[kindName];\n let ioff = 0;\n switch (g.kind) {\n case \"uniform\": break;\n case \"slanted-edge\": p.floats([g.c, g.s]); break;\n case \"siemens-star\": {\n const table = starSectorTable(chart, g), n = table.thetas.length;\n const dirs: number[] = [];\n for (let k = 0; k < n; k++) { const t = table.thetas[k]!, c = dwSplit(Math.cos(t)), s = dwSplit(Math.sin(t)); dirs.push(c[0], c[1], s[0], s[1]); }\n p.floats([g.r * g.r]);\n const dirsOff = p.floats(dirs), levelsOff = p.ints(Array.from(table.levels)), bucketsOff = p.ints(Array.from(table.buckets));\n ioff = p.ints([n, dirsOff, levelsOff, bucketsOff, n, table.window, chart.materials.length - 1]);\n break;\n }\n case \"step-wedge\": ioff = p.ints([g.steps]); break;\n case \"checkerboard\": p.floats([g.size, chart.aspect]); break;\n case \"point-grid\": {\n p.floats([g.cellW, g.cellH, chart.aspect, g.radius * g.radius]);\n const centers = p.floats(g.centers.flatMap((c) => [c.u, c.v]));\n ioff = p.ints([g.columns, g.rows, centers]);\n break;\n }\n case \"patches\": p.floats([g.cellW, g.cellH, chart.aspect, g.gap / 2, 1 - g.gap / 2]); ioff = p.ints([g.columns, g.rows, g.count, g.backgroundIndex]); break;\n case \"dead-leaves\": {\n p.floats([g.u0, g.v0, g.cell]);\n const cells = g.nx * g.ny, csr = p.reserveInts(cells + 1), entries: number[] = [];\n for (let c = 0; c < cells; c++) {\n p.ai[csr + c] = entries.length;\n for (let e = g.head[c]!; e >= 0; e = g.next[e]!) entries.push(g.entryDisk[e]!);\n }\n p.ai[csr + cells] = entries.length;\n const entriesOff = p.ints(entries), disks: number[] = [];\n for (let d = 0; d < g.diskCount; d++) disks.push(g.X[d]!, g.Y[d]!, g.R2[d]!, g.level[d]!);\n const disksOff = p.floats(disks);\n ioff = p.ints([g.nx, g.ny, csr, entriesOff, disksOff, g.mean]);\n break;\n }\n case \"bar-groups\": {\n const digits: number[] = [], rows: number[] = [];\n for (const group of g.groups) {\n const b = group.verticalBars, h = group.horizontalBars, label = group.label;\n let digitIndex = 0;\n if (label) { digitIndex = digits.length; digits.push(label.text.length, ...Array.from(label.text, (ch) => ch.charCodeAt(0) - 48)); }\n rows.push(group.cell.u0, group.cell.u1, b.u0, b.v0, b.u1, b.v1, h.u0, h.v0, h.u1, h.v1, group.lineWidth, label ? 1 : 0,\n label?.u0 ?? 0, label?.v0 ?? 0, label?.height ?? 0, digitIndex);\n }\n const gf = p.floats(rows), digitsOff = p.ints(digits.length ? digits : [0]);\n ioff = p.ints([g.groups.length, gf, digitsOff]);\n break;\n }\n case \"hyperbolic-wedge\": p.floats([chart.aspect, g.ph, g.lw0, g.lw1 - g.lw0, 2 * chart.aspect]); ioff = p.ints([g.orientation === \"horizontal\" ? 0 : 1, g.lines]); break;\n case \"zone-plate\": { const [kH, kL] = dwSplit(g.k); p.floats([g.r * g.r, kH, kL]); break; }\n case \"slanted-squares\": p.floats([g.cellW, g.cellH, chart.aspect, g.c, g.s, g.half]); ioff = p.ints([g.columns, g.rows]); break;\n case \"line-grid\": p.floats([g.spacing, g.half]); break;\n case \"fiducial\": p.floats([g.r * g.r, g.inner * g.inner]); ioff = p.ints([g.inverted ? 1 : 0]); break;\n default: throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"Unsupported chart element.\");\n }\n p.ai[header] = kind; p.ai[header + 1] = offset; p.ai[header + 2] = ioff; p.ai[header + 3] = foff; p.ai[header + 4] = placement.mode;\n}\n\nfunction packLayer(p: Packer, layer: ResolvedChartMaskLayer, header: number): void {\n const r = layer.rectangle;\n const foff = p.floats([r.u0, r.v0, r.u1, r.v1, layer.scaleX, layer.scaleY, layer.cellWidth, layer.cellHeight]);\n const shapesOff = p.reserveInts(CHART_RECORD_STRIDE.shape * layer.shapes.length);\n layer.shapes.forEach((shape, k) => {\n const h = shapesOff + CHART_RECORD_STRIDE.shape * k;\n if (shape.kind === \"annulus\") {\n p.ai[h] = 1; p.ai[h + 1] = p.floats([...shape.box, shape.centerX, shape.centerY, shape.inner2, shape.outer2]); p.ai[h + 2] = 0;\n } else {\n const data = p.floats([...shape.box]), edges = shape.edges.length / 4;\n for (let e = 0; e < edges; e++) p.floats([shape.edges[4 * e]!, shape.edges[4 * e + 1]!, shape.edges[4 * e + 2]!, shape.edges[4 * e + 3]!]);\n p.ai[h] = 0; p.ai[h + 1] = data; p.ai[h + 2] = edges;\n }\n });\n const cells = layer.cellsX * layer.cellsY, cellStart = p.reserveInts(cells + 1), list: number[] = [];\n for (let c = 0; c < cells; c++) { p.ai[cellStart + c] = list.length; list.push(...layer.cells[c]!); }\n p.ai[cellStart + cells] = list.length;\n const cellList = p.ints(list.length ? list : [0]);\n const words = [layer.cellsX, layer.cellsY, cellStart, cellList, shapesOff, layer.shapes.length, foff, layer.backgroundMaterial, layer.inkMaterial];\n words.forEach((w, i) => { p.ai[header + i] = w; });\n}\n\n/** Packs the plan's chart (a composite, an element preset, or the chart under layers) and its layers into the kernel's record arrays. */\nexport function packChartScene(plan: ChartRadianceBatchPlan): PackedChartScene {\n const p = new Packer(), chart = plan.chart, g = chartGeometry(chart), layers = plan.layers?.layers ?? [];\n const elements = g.kind === \"composite\" ? g.elements : [];\n const elementCount = elements.length + 1;\n p.reserveInts(4);\n const he = p.reserveInts(CHART_RECORD_STRIDE.element * elementCount), hl = p.reserveInts(CHART_RECORD_STRIDE.layer * layers.length);\n const frame = { mode: CHART_PLACEMENT.frame, cu: 0, cv: 0, hw: 0, hh: 0, scale: 1 };\n packElement(p, g.kind === \"composite\" ? g.background : chart, 0, he, frame);\n elements.forEach((e, i) => packElement(p, e.chart, e.offset, he + CHART_RECORD_STRIDE.element * (i + 1),\n { mode: e.ellipse ? CHART_PLACEMENT.ellipse : CHART_PLACEMENT.rectangle, cu: e.cu, cv: e.cv, hw: e.hw, hh: e.hh, scale: e.scale }));\n layers.forEach((layer, l) => packLayer(p, layer, hl + CHART_RECORD_STRIDE.layer * l));\n p.ai[0] = elementCount; p.ai[1] = layers.length; p.ai[2] = he; p.ai[3] = hl;\n for (const x of p.af) if (!(Math.abs(x) <= FLOAT32_SAFE_MAGNITUDE)) throw new ImageKernelExecutionError(\"unsupported-float32-domain\", \"A chart constant exceeds the float32 domain.\");\n for (const x of p.ai) if (!(Number.isInteger(x) && x >= 0 && x <= 0xffffffff)) throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"Chart records exceed the kernel's index range.\");\n return { af: Float32Array.from(p.af), ai: Uint32Array.from(p.ai), materials: plan.materials.length, elementCount, layerCount: layers.length };\n}\n\n/** Per-material values in float64 (the reference's operations), rounded once; a failing spectrum is NaN and its points are recomputed. */\nexport function chartMaterialTable(plan: ChartRadianceBatchPlan): Float32Array<ArrayBuffer> {\n const nm = plan.wavelengthsNanometers, stride = plan.mode === \"radiance\" ? nm.length : plan.columns, materials = plan.materials.length;\n const table = new Float32Array(materials * stride);\n for (let m = 0; m < materials; m++) {\n for (let c = 0; c < stride; c++) {\n let value: number;\n try {\n if (plan.mode === \"radiance\") value = plan.materialRadiance(m, nm[c]!);\n else { value = 0; const row = plan.channelWeights![c]!; for (let j = 0; j < nm.length; j++) value += row[j]! * plan.materialRadiance(m, nm[j]!); }\n } catch { value = Number.NaN; }\n if (Math.abs(value) > FLOAT32_SAFE_MAGNITUDE) throw new ImageKernelExecutionError(\"unsupported-float32-domain\", \"Chart values exceed the float32 domain.\");\n table[m * stride + c] = value;\n }\n }\n return table;\n}\n\n/** The scene key of a batch input: the scene's data and the aspect (every record derives from them). */\nexport function chartSceneKey(scene: unknown, aspect: number): string { return aspect + \"|\" + JSON.stringify(scene); }\n\n/**\n * The device's double-float32 probe (`CHART_COMPOSITE_PROBE_WGSL`, classified by `classifyChartCompositeProbe`): resolves with the probe\n * record (its `productPath` is the variant the composite kernel is compiled with), or rejects with `ChartCompositeProbeError`\n * (`unsupported-on-backend`, the record in `probe`) on a device that neither product path holds on. Run once per accelerator by\n * `ChartSceneUploads.probe`, and once per display-view renderer by the composite material module (#491).\n */\nexport async function probeChartCompositeDevice(runtime: WebGpuRuntime, pipelines: PipelineSource, signal: AbortSignal): Promise<ChartCompositeProbeRecord> {\n const pipeline = await pipelines(CHART_COMPOSITE_PROBE_LABEL, CHART_COMPOSITE_PROBE_WGSL), scope = new GpuResourceScope(runtime);\n const bytes = 4 * CHART_COMPOSITE_PROBE_OUTPUTS * PROBE_INPUTS.length;\n let record: ChartCompositeProbeRecord;\n try {\n const input = scope.upload(\"photivra-chart-probe-in\", Float32Array.from(PROBE_INPUTS.flat()), BUFFER_USAGE.STORAGE);\n const output = scope.buffer(\"photivra-chart-probe-out\", bytes, BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);\n // The rounding barrier's zero word (CHART_COMPOSITE_PROBE_WGSL `probe_zero`).\n const zero = scope.upload(\"photivra-chart-probe-zero\", new Uint32Array(4), BUFFER_USAGE.UNIFORM);\n const bindGroup = runtime.device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), entries: [{ binding: 0, resource: { buffer: input } }, { binding: 1, resource: { buffer: output } },\n { binding: 2, resource: { buffer: zero } }] });\n const [data] = await runComputePass(runtime, scope, pipeline, bindGroup, [PROBE_INPUTS.length, 1], [{ buffer: output, bytes }], signal);\n record = classifyChartCompositeProbe(new Float32Array(data!, 0, CHART_COMPOSITE_PROBE_OUTPUTS * PROBE_INPUTS.length));\n } finally { scope.release(); }\n if (record.productPath === null) throw new ChartCompositeProbeError(record);\n return record;\n}\n\ninterface UploadedScene { key: string; scope: GpuResourceScope; af: GPUBuffer; ai: GPUBuffer; packed: PackedChartScene }\n\n/** Per accelerator: the uploaded records of recent scenes (a prepared view's scene is uploaded once) and the device probe. */\nexport class ChartSceneUploads {\n readonly #entries: UploadedScene[] = [];\n #probed: Promise<ChartCompositeProbeRecord> | null = null;\n constructor(private readonly runtime: WebGpuRuntime, private readonly keep = 4) {}\n /** The device's double-float32 probe, run once per accelerator (single flight; a refusal is retried on the next call): the record, or `ChartCompositeProbeError`. */\n probe(pipelines: PipelineSource, signal: AbortSignal): Promise<ChartCompositeProbeRecord> {\n this.#probed ??= probeChartCompositeDevice(this.runtime, pipelines, signal).catch((error: unknown) => { this.#probed = null; throw error; });\n return this.#probed;\n }\n get(plan: ChartRadianceBatchPlan, scene: unknown, aspect: number): UploadedScene {\n const key = chartSceneKey(scene, aspect), index = this.#entries.findIndex((e) => e.key === key);\n if (index >= 0) { const [entry] = this.#entries.splice(index, 1); this.#entries.push(entry!); return entry!; }\n const packed = packChartScene(plan);\n if (Math.max(packed.af.byteLength, packed.ai.byteLength) > this.runtime.maximumStorageBindingBytes) {\n throw new ImageKernelExecutionError(\"insufficient-limits\", \"Chart records exceed the device's storage binding limit.\");\n }\n const scope = new GpuResourceScope(this.runtime);\n const entry: UploadedScene = { key, scope, af: scope.upload(\"photivra-chart-floats\", packed.af, BUFFER_USAGE.STORAGE), ai: scope.upload(\"photivra-chart-records\", packed.ai, BUFFER_USAGE.STORAGE), packed };\n this.#entries.push(entry);\n while (this.#entries.length > this.keep) this.#entries.shift()!.scope.release();\n return entry;\n }\n /** Scenes currently uploaded (for tests). */\n get size(): number { return this.#entries.length; }\n release(): void { for (const entry of this.#entries.splice(0)) entry.scope.release(); }\n}\n\n/** Points as float32 pairs (hi, lo) per coordinate: the float64 point to 2^-48. */\nexport function splitPoints(points: Float32Array | Float64Array): Float32Array<ArrayBuffer> {\n const out = new Float32Array(points.length * 2);\n for (let i = 0; i < points.length; i++) { const hi = f(points[i]!); out[2 * i] = hi; out[2 * i + 1] = f(points[i]! - hi); }\n return out;\n}\n\nexport async function evaluateChartCompositeOnGpu(runtime: WebGpuRuntime, bandBytes: number, plan: ChartRadianceBatchPlan, scene: unknown, points: Float32Array | Float64Array,\n indices: Uint8Array | Uint16Array | undefined, abort: AbortController, yieldControl: YieldControl, pipelines: PipelineSource, uploads: ChartSceneUploads): Promise<ChartRadianceResult> {\n for (let i = 0; i < points.length; i++) {\n if (Math.abs(points[i]!) > MAXIMUM_COORDINATE) throw new ImageKernelExecutionError(\"unsupported-float32-domain\", \"Chart points beyond 2^20 frame units are outside the float32 domain.\");\n }\n const probe = await uploads.probe(pipelines, abort.signal), path = probe.productPath ?? \"dekker\";\n const uploaded = uploads.get(plan, scene, plan.chart.aspect), table = chartMaterialTable(plan), radianceMode = plan.mode === \"radiance\";\n const columns = plan.columns, stride = radianceMode ? plan.wavelengthsNanometers.length : columns, count = plan.queryCount;\n const bytesPerQuery = 16 + 4 * columns + 4 + 4, rows = Math.max(1, Math.floor(bandBytes / bytesPerQuery));\n if (Math.max(table.byteLength, Math.min(rows, count) * 4 * columns) > runtime.maximumStorageBindingBytes) {\n throw new ImageKernelExecutionError(\"insufficient-limits\", \"Chart tables or bands exceed the device's storage binding limit.\");\n }\n const params = new ArrayBuffer(16), words = new Uint32Array(params);\n words[1] = stride; words[2] = radianceMode ? 1 : 0; words[3] = 0; // words[3]: the rounding barrier's zero (chartCompositeWgsl `params.zero`)\n const pipeline = await pipelines(chartCompositeLabel(path), chartCompositeWgsl(path));\n const values = new Float32Array(count * columns), recomputed: number[] = [], split = splitPoints(points);\n const scope = new GpuResourceScope(runtime);\n try {\n const tableBuffer = scope.upload(\"photivra-chart-table\", table, BUFFER_USAGE.STORAGE), gate = createHostYieldGate();\n for (let first = 0; first < count; first += rows) {\n checkAbort(abort.signal);\n const n = Math.min(rows, count - first);\n words[0] = n;\n const band = new GpuResourceScope(runtime);\n try {\n const pointBuffer = band.upload(\"photivra-chart-points\", split.subarray(4 * first, 4 * (first + n)), BUFFER_USAGE.STORAGE);\n const selectors = band.upload(\"photivra-chart-selectors\", indices ? Uint32Array.from(indices.subarray(first, first + n)) : new Uint32Array(1), BUFFER_USAGE.STORAGE);\n const out = band.buffer(\"photivra-chart-values\", n * 4 * columns, BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);\n const flagBuffer = band.buffer(\"photivra-chart-flags\", n * 4, BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);\n const uniform = band.upload(\"photivra-chart-params\", new Uint8Array(params), BUFFER_USAGE.UNIFORM);\n const bindGroup = runtime.device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), entries: [\n { binding: 0, resource: { buffer: uniform } }, { binding: 1, resource: { buffer: pointBuffer } }, { binding: 2, resource: { buffer: tableBuffer } },\n { binding: 3, resource: { buffer: uploaded.af } }, { binding: 4, resource: { buffer: uploaded.ai } }, { binding: 5, resource: { buffer: selectors } },\n { binding: 6, resource: { buffer: out } }, { binding: 7, resource: { buffer: flagBuffer } }] });\n const [valueData, flagData] = await runComputePass(runtime, band, pipeline, bindGroup, linearDispatch(n, CHART_COMPOSITE_WORKGROUP_SIZE, runtime.maximumWorkgroupsPerDimension),\n [{ buffer: out, bytes: n * 4 * columns }, { buffer: flagBuffer, bytes: n * 4 }], abort.signal);\n values.set(new Float32Array(valueData!, 0, n * columns), first * columns);\n const bandFlags = new Uint32Array(flagData!, 0, n);\n for (let i = 0; i < n; i++) {\n let recompute = bandFlags[i] !== 0;\n for (let c = 0; c < columns && !recompute; c++) if (!Number.isFinite(values[(first + i) * columns + c]!)) recompute = true;\n if (recompute) recomputed.push(first + i);\n }\n } finally { band.release(); }\n if (yieldControl && gate.due()) { await yieldControl(abort.signal); gate.restart(); }\n }\n } finally { scope.release(); }\n checkAbort(abort.signal);\n for (const q of recomputed) for (let c = 0; c < columns; c++) values[q * columns + c] = plan.queryValue(points, indices, q, c);\n const execution: ImageKernelExecution = webGpuExecution({ kind: \"relative-to-reference\", relative: 2 ** -24, absolute: 2 ** -126 }, 0);\n return { plan, values, columns, execution, hostRecomputedQueryIndices: Uint32Array.from(recomputed) };\n}\n"]}
@@ -9,16 +9,12 @@ import { createHostYieldGate } from "../capture/host-yield-cadence.js";
9
9
  import { calculateChartRadianceBatchPlan } from "../facade/chart-radiance-batch.js";
10
10
  import { calculatePointGridCenters } from "../facade/chart-scenes.js";
11
11
  import { ImageKernelExecutionError, webGpuExecution } from "./image-kernel-execution.js";
12
- import { BUFFER_USAGE, GpuResourceScope, abortedError, linearDispatch, runComputePass } from "./webgpu-runtime.js";
12
+ import { BUFFER_USAGE, GpuResourceScope, linearDispatch, runComputePass, throwIfAborted as checkAbort } from "./webgpu-runtime.js";
13
13
  import { CHART_PRESET_CODE, CHART_RADIANCE_WGSL, CHART_WORKGROUP_SIZE } from "./wgsl-chart-kernel.js";
14
14
  import { evaluateChartCompositeOnGpu } from "./chart-composite-gpu.js";
15
15
  /** Frame-unit magnitude limit for GPU points. */
16
16
  export const CHART_GPU_MAXIMUM_COORDINATE = 2 ** 20;
17
17
  const FLOAT32_SAFE_MAGNITUDE = 2 ** 120;
18
- function checkAbort(signal) {
19
- if (signal.aborted)
20
- throw abortedError();
21
- }
22
18
  export async function evaluateChartRadianceOnCpu(input, abort, yieldControl, execution) {
23
19
  const plan = calculateChartRadianceBatchPlan(input), points = input.points.slice(), indices = input.wavelengthIndices?.slice();
24
20
  const values = new Float64Array(plan.queryCount * plan.columns), gate = createHostYieldGate();
@@ -1 +1 @@
1
- {"version":3,"file":"chart-radiance-gpu.js","sourceRoot":"","sources":["../../src/gpu/chart-radiance-gpu.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Host side of the `webgpu-f32` chart-radiance stage (#277): per-material value tables in float64 (the\n * reference's own operations), preset constants, banded dispatch, readback, and host recomputation of\n * flagged points with the reference. The float64 reference is `calculateChartRadianceBatch`\n * (facade/chart-radiance-batch.ts). Internal; the public entry point is the image-kernel accelerator.\n */\nimport { createHostYieldGate } from \"../capture/host-yield-cadence.js\";\nimport { calculateChartRadianceBatchPlan, type ChartRadianceBatchInput, type ChartRadianceBatchPlan } from \"../facade/chart-radiance-batch.js\";\nimport { calculatePointGridCenters } from \"../facade/chart-scenes.js\";\nimport { ImageKernelExecutionError, webGpuExecution, type ImageKernelExecution } from \"./image-kernel-execution.js\";\nimport type { ChartRadianceResult } from \"./image-kernel-accelerator.js\";\nimport { BUFFER_USAGE, GpuResourceScope, abortedError, linearDispatch, runComputePass, type WebGpuRuntime } from \"./webgpu-runtime.js\";\nimport { CHART_PRESET_CODE, CHART_RADIANCE_WGSL, CHART_WORKGROUP_SIZE } from \"./wgsl-chart-kernel.js\";\nimport { evaluateChartCompositeOnGpu, type ChartSceneUploads } from \"./chart-composite-gpu.js\";\n\ntype PipelineSource = (label: string, code: string) => Promise<GPUComputePipeline>;\ntype YieldControl = ((signal: AbortSignal) => Promise<void>) | undefined;\n\n/** Frame-unit magnitude limit for GPU points. */\nexport const CHART_GPU_MAXIMUM_COORDINATE = 2 ** 20;\nconst FLOAT32_SAFE_MAGNITUDE = 2 ** 120;\n\n\nfunction checkAbort(signal: AbortSignal): void {\n if (signal.aborted) throw abortedError();\n}\n\nexport async function evaluateChartRadianceOnCpu(input: ChartRadianceBatchInput, abort: AbortController, yieldControl: YieldControl,\n execution: ImageKernelExecution): Promise<ChartRadianceResult> {\n const plan = calculateChartRadianceBatchPlan(input), points = input.points.slice(), indices = input.wavelengthIndices?.slice();\n const values = new Float64Array(plan.queryCount * plan.columns), gate = createHostYieldGate();\n for (let q = 0; q < plan.queryCount; q++) {\n for (let c = 0; c < plan.columns; c++) values[q * plan.columns + c] = plan.queryValue(points, indices, q, c);\n if ((q & 0xffff) === 0xffff) {\n checkAbort(abort.signal);\n if (yieldControl && gate.due()) { await yieldControl(abort.signal); gate.restart(); }\n }\n }\n checkAbort(abort.signal);\n return { plan, values, columns: plan.columns, execution, hostRecomputedQueryIndices: new Uint32Array(0) };\n}\n\n/**\n * The preset code of a chart the preset kernel (wgsl-chart-kernel.ts) classifies, or undefined. That kernel covers\n * the eight 2.0 presets as plain charts (a Siemens star only with the bar profile). Everything else, the 2.3\n * elements, the sine star, `composite` charts and `material-layers` scenes, runs on the composite kernel (#477,\n * chart-composite-gpu.ts). @internal\n */\nexport function chartGpuPresetCode(plan: ChartRadianceBatchPlan): number | undefined {\n const preset = plan.chart.preset;\n if (plan.layers || !Object.prototype.hasOwnProperty.call(CHART_PRESET_CODE, preset) || plan.chart.parameters.profile === \"sine\") return undefined;\n return CHART_PRESET_CODE[preset as keyof typeof CHART_PRESET_CODE];\n}\n\n/** Preset constants (uniform words 3–5 and floats 8–15) and the auxiliary table. @internal */\nexport function chartGpuConstants(plan: ChartRadianceBatchPlan): { ints: [number, number, number]; floats: number[]; aux: Float32Array<ArrayBuffer> } {\n const chart = plan.chart, p = chart.parameters as Record<string, number>, aspect = chart.aspect;\n switch (chart.preset) {\n case \"uniform\": return { ints: [0, 0, 0], floats: [], aux: new Float32Array(1) };\n case \"slanted-edge\": {\n // The same float64 constants as resolveChartScene.\n const t = p.angleDegrees! * Math.PI / 180;\n return { ints: [0, 0, 0], floats: [Math.cos(t), Math.sin(t)], aux: new Float32Array(1) };\n }\n case \"siemens-star\": {\n const cycles = p.cycles!, r = p.radiusFraction! * aspect, aux = new Float32Array(2 * (2 * cycles + 1));\n // Sector boundaries: phase·2·cycles = k ⇔ θ = π(k/cycles − 1).\n for (let k = 0; k <= 2 * cycles; k++) { const b = Math.PI * (k / cycles - 1); aux[2 * k] = Math.cos(b); aux[2 * k + 1] = Math.sin(b); }\n return { ints: [cycles, 0, 0], floats: [r * r], aux };\n }\n case \"step-wedge\": return { ints: [p.steps!, 0, 0], floats: [p.steps! / 2], aux: new Float32Array(1) };\n case \"grey-ramp\": return { ints: [1024, 0, 0], floats: [512], aux: new Float32Array(1) };\n case \"checkerboard\": return { ints: [0, 0, 0], floats: [p.squaresAcross! / 2, aspect], aux: new Float32Array(1) };\n case \"point-grid\": {\n const columns = p.columns!, rows = p.rows!, centers = calculatePointGridCenters({ columns, rows, aspect });\n return { ints: [columns, rows, 0], floats: [columns / 2, aspect, rows / (2 * aspect), p.radius! * p.radius!],\n aux: Float32Array.from(centers.flatMap(c => [c.u, c.v])) };\n }\n case \"patches\": {\n const columns = p.columns!, rows = p.rows!, count = (chart.parameters.patchIds as readonly string[]).length;\n return { ints: [columns, rows, count], floats: [columns / 2, aspect, rows / (2 * aspect), p.gapFraction! / 2, 1 - p.gapFraction! / 2],\n aux: new Float32Array(1) };\n }\n default: throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"webgpu-f32 classifies the eight 2.0 chart presets; use cpu-reference for \" + chart.preset + \".\");\n }\n}\n\n/** Per-material values in float64, with the reference's operations; a material whose spectrum fails is NaN (recomputed on the host). */\nfunction materialTable(plan: ChartRadianceBatchPlan): Float32Array<ArrayBuffer> {\n const materials = plan.chart.materials.length, nm = plan.wavelengthsNanometers, stride = plan.mode === \"radiance\" ? nm.length : plan.columns;\n const table = new Float32Array(materials * stride);\n for (let m = 0; m < materials; m++) {\n for (let c = 0; c < stride; c++) {\n let value: number;\n try {\n if (plan.mode === \"radiance\") value = plan.materialRadiance(m, nm[c]!);\n else {\n value = 0;\n const row = plan.channelWeights![c]!;\n for (let j = 0; j < nm.length; j++) value += row[j]! * plan.materialRadiance(m, nm[j]!);\n }\n } catch {\n value = Number.NaN;\n }\n if (Math.abs(value) > FLOAT32_SAFE_MAGNITUDE) throw new ImageKernelExecutionError(\"unsupported-float32-domain\", \"Chart values exceed the float32 domain.\");\n table[m * stride + c] = value;\n }\n }\n return table;\n}\n\nexport async function evaluateChartRadianceOnGpu(runtime: WebGpuRuntime, bandBytes: number, input: ChartRadianceBatchInput, abort: AbortController,\n yieldControl: YieldControl, pipelines: PipelineSource, uploads: ChartSceneUploads): Promise<ChartRadianceResult> {\n const plan = calculateChartRadianceBatchPlan(input), points = input.points.slice(), indices = input.wavelengthIndices?.slice();\n const presetCode = chartGpuPresetCode(plan);\n if (presetCode === undefined) return evaluateChartCompositeOnGpu(runtime, bandBytes, plan, input.scene, points, indices, abort, yieldControl, pipelines, uploads);\n for (let i = 0; i < points.length; i++) {\n if (Math.abs(points[i]!) > CHART_GPU_MAXIMUM_COORDINATE) throw new ImageKernelExecutionError(\"unsupported-float32-domain\", \"Chart points beyond 2^20 frame units are outside the float32 domain.\");\n }\n const { ints, floats, aux } = chartGpuConstants(plan), table = materialTable(plan), radianceMode = plan.mode === \"radiance\";\n const columns = plan.columns, stride = radianceMode ? plan.wavelengthsNanometers.length : columns, count = plan.queryCount;\n const bytesPerQuery = 8 + 4 * columns + 4 + 4;\n const rows = Math.max(1, Math.floor(bandBytes / bytesPerQuery));\n if (Math.max(table.byteLength, aux.byteLength, Math.min(rows, count) * 4 * columns) > runtime.maximumStorageBindingBytes) {\n throw new ImageKernelExecutionError(\"insufficient-limits\", \"Chart tables or bands exceed the device's storage binding limit.\");\n }\n const params = new ArrayBuffer(64), words = new Uint32Array(params), f = new Float32Array(params);\n words[1] = stride; words[2] = presetCode; words[3] = ints[0]; words[4] = ints[1]; words[5] = ints[2]; words[6] = radianceMode ? 1 : 0;\n f.set(floats, 8);\n const pipeline = await pipelines(\"photivra-chart-radiance\", CHART_RADIANCE_WGSL);\n const values = new Float32Array(count * columns), recomputed: number[] = [];\n const scope = new GpuResourceScope(runtime);\n try {\n const tableBuffer = scope.upload(\"photivra-chart-table\", table, BUFFER_USAGE.STORAGE);\n const auxBuffer = scope.upload(\"photivra-chart-aux\", aux, BUFFER_USAGE.STORAGE);\n const gate = createHostYieldGate();\n for (let first = 0; first < count; first += rows) {\n checkAbort(abort.signal);\n const n = Math.min(rows, count - first);\n words[0] = n;\n const band = new GpuResourceScope(runtime);\n try {\n const pointBuffer = band.upload(\"photivra-chart-points\", new Float32Array(points.subarray(2 * first, 2 * (first + n))), BUFFER_USAGE.STORAGE);\n const selectors = band.upload(\"photivra-chart-selectors\", indices ? Uint32Array.from(indices.subarray(first, first + n)) : new Uint32Array(1), BUFFER_USAGE.STORAGE);\n const out = band.buffer(\"photivra-chart-values\", n * 4 * columns, BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);\n const flagBuffer = band.buffer(\"photivra-chart-flags\", n * 4, BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);\n const uniform = band.upload(\"photivra-chart-params\", new Uint8Array(params), BUFFER_USAGE.UNIFORM);\n const bindGroup = runtime.device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), entries: [\n { binding: 0, resource: { buffer: uniform } }, { binding: 1, resource: { buffer: pointBuffer } }, { binding: 2, resource: { buffer: tableBuffer } },\n { binding: 3, resource: { buffer: auxBuffer } }, { binding: 4, resource: { buffer: selectors } }, { binding: 5, resource: { buffer: out } },\n { binding: 6, resource: { buffer: flagBuffer } }] });\n const [valueData, flagData] = await runComputePass(runtime, band, pipeline, bindGroup, linearDispatch(n, CHART_WORKGROUP_SIZE, runtime.maximumWorkgroupsPerDimension),\n [{ buffer: out, bytes: n * 4 * columns }, { buffer: flagBuffer, bytes: n * 4 }], abort.signal);\n values.set(new Float32Array(valueData!, 0, n * columns), first * columns);\n const bandFlags = new Uint32Array(flagData!, 0, n);\n for (let i = 0; i < n; i++) {\n let recompute = bandFlags[i] !== 0;\n for (let c = 0; c < columns && !recompute; c++) if (!Number.isFinite(values[(first + i) * columns + c]!)) recompute = true;\n if (recompute) recomputed.push(first + i);\n }\n } finally {\n band.release();\n }\n if (yieldControl && gate.due()) { await yieldControl(abort.signal); gate.restart(); }\n }\n } finally {\n scope.release();\n }\n checkAbort(abort.signal);\n // Flagged points (and any whose material spectrum failed): the reference's own value, rounded once to float32.\n for (const q of recomputed) for (let c = 0; c < columns; c++) values[q * columns + c] = plan.queryValue(points, indices, q, c);\n const execution = webGpuExecution({ kind: \"relative-to-reference\", relative: 2 ** -24, absolute: 2 ** -126 }, 0);\n return { plan, values, columns, execution, hostRecomputedQueryIndices: Uint32Array.from(recomputed) };\n}\n"]}
1
+ {"version":3,"file":"chart-radiance-gpu.js","sourceRoot":"","sources":["../../src/gpu/chart-radiance-gpu.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Host side of the `webgpu-f32` chart-radiance stage (#277): per-material value tables in float64 (the\n * reference's own operations), preset constants, banded dispatch, readback, and host recomputation of\n * flagged points with the reference. The float64 reference is `calculateChartRadianceBatch`\n * (facade/chart-radiance-batch.ts). Internal; the public entry point is the image-kernel accelerator.\n */\nimport { createHostYieldGate } from \"../capture/host-yield-cadence.js\";\nimport { calculateChartRadianceBatchPlan, type ChartRadianceBatchInput, type ChartRadianceBatchPlan } from \"../facade/chart-radiance-batch.js\";\nimport { calculatePointGridCenters } from \"../facade/chart-scenes.js\";\nimport { ImageKernelExecutionError, webGpuExecution, type ImageKernelExecution } from \"./image-kernel-execution.js\";\nimport type { ChartRadianceResult } from \"./image-kernel-accelerator.js\";\nimport { BUFFER_USAGE, GpuResourceScope, linearDispatch, runComputePass, type WebGpuRuntime, throwIfAborted as checkAbort } from \"./webgpu-runtime.js\";\nimport { CHART_PRESET_CODE, CHART_RADIANCE_WGSL, CHART_WORKGROUP_SIZE } from \"./wgsl-chart-kernel.js\";\nimport { evaluateChartCompositeOnGpu, type ChartSceneUploads } from \"./chart-composite-gpu.js\";\n\ntype PipelineSource = (label: string, code: string) => Promise<GPUComputePipeline>;\ntype YieldControl = ((signal: AbortSignal) => Promise<void>) | undefined;\n\n/** Frame-unit magnitude limit for GPU points. */\nexport const CHART_GPU_MAXIMUM_COORDINATE = 2 ** 20;\nconst FLOAT32_SAFE_MAGNITUDE = 2 ** 120;\n\nexport async function evaluateChartRadianceOnCpu(input: ChartRadianceBatchInput, abort: AbortController, yieldControl: YieldControl,\n execution: ImageKernelExecution): Promise<ChartRadianceResult> {\n const plan = calculateChartRadianceBatchPlan(input), points = input.points.slice(), indices = input.wavelengthIndices?.slice();\n const values = new Float64Array(plan.queryCount * plan.columns), gate = createHostYieldGate();\n for (let q = 0; q < plan.queryCount; q++) {\n for (let c = 0; c < plan.columns; c++) values[q * plan.columns + c] = plan.queryValue(points, indices, q, c);\n if ((q & 0xffff) === 0xffff) {\n checkAbort(abort.signal);\n if (yieldControl && gate.due()) { await yieldControl(abort.signal); gate.restart(); }\n }\n }\n checkAbort(abort.signal);\n return { plan, values, columns: plan.columns, execution, hostRecomputedQueryIndices: new Uint32Array(0) };\n}\n\n/**\n * The preset code of a chart the preset kernel (wgsl-chart-kernel.ts) classifies, or undefined. That kernel covers\n * the eight 2.0 presets as plain charts (a Siemens star only with the bar profile). Everything else, the 2.3\n * elements, the sine star, `composite` charts and `material-layers` scenes, runs on the composite kernel (#477,\n * chart-composite-gpu.ts). @internal\n */\nexport function chartGpuPresetCode(plan: ChartRadianceBatchPlan): number | undefined {\n const preset = plan.chart.preset;\n if (plan.layers || !Object.prototype.hasOwnProperty.call(CHART_PRESET_CODE, preset) || plan.chart.parameters.profile === \"sine\") return undefined;\n return CHART_PRESET_CODE[preset as keyof typeof CHART_PRESET_CODE];\n}\n\n/** Preset constants (uniform words 3–5 and floats 8–15) and the auxiliary table. @internal */\nexport function chartGpuConstants(plan: ChartRadianceBatchPlan): { ints: [number, number, number]; floats: number[]; aux: Float32Array<ArrayBuffer> } {\n const chart = plan.chart, p = chart.parameters as Record<string, number>, aspect = chart.aspect;\n switch (chart.preset) {\n case \"uniform\": return { ints: [0, 0, 0], floats: [], aux: new Float32Array(1) };\n case \"slanted-edge\": {\n // The same float64 constants as resolveChartScene.\n const t = p.angleDegrees! * Math.PI / 180;\n return { ints: [0, 0, 0], floats: [Math.cos(t), Math.sin(t)], aux: new Float32Array(1) };\n }\n case \"siemens-star\": {\n const cycles = p.cycles!, r = p.radiusFraction! * aspect, aux = new Float32Array(2 * (2 * cycles + 1));\n // Sector boundaries: phase·2·cycles = k ⇔ θ = π(k/cycles − 1).\n for (let k = 0; k <= 2 * cycles; k++) { const b = Math.PI * (k / cycles - 1); aux[2 * k] = Math.cos(b); aux[2 * k + 1] = Math.sin(b); }\n return { ints: [cycles, 0, 0], floats: [r * r], aux };\n }\n case \"step-wedge\": return { ints: [p.steps!, 0, 0], floats: [p.steps! / 2], aux: new Float32Array(1) };\n case \"grey-ramp\": return { ints: [1024, 0, 0], floats: [512], aux: new Float32Array(1) };\n case \"checkerboard\": return { ints: [0, 0, 0], floats: [p.squaresAcross! / 2, aspect], aux: new Float32Array(1) };\n case \"point-grid\": {\n const columns = p.columns!, rows = p.rows!, centers = calculatePointGridCenters({ columns, rows, aspect });\n return { ints: [columns, rows, 0], floats: [columns / 2, aspect, rows / (2 * aspect), p.radius! * p.radius!],\n aux: Float32Array.from(centers.flatMap(c => [c.u, c.v])) };\n }\n case \"patches\": {\n const columns = p.columns!, rows = p.rows!, count = (chart.parameters.patchIds as readonly string[]).length;\n return { ints: [columns, rows, count], floats: [columns / 2, aspect, rows / (2 * aspect), p.gapFraction! / 2, 1 - p.gapFraction! / 2],\n aux: new Float32Array(1) };\n }\n default: throw new ImageKernelExecutionError(\"unsupported-on-backend\", \"webgpu-f32 classifies the eight 2.0 chart presets; use cpu-reference for \" + chart.preset + \".\");\n }\n}\n\n/** Per-material values in float64, with the reference's operations; a material whose spectrum fails is NaN (recomputed on the host). */\nfunction materialTable(plan: ChartRadianceBatchPlan): Float32Array<ArrayBuffer> {\n const materials = plan.chart.materials.length, nm = plan.wavelengthsNanometers, stride = plan.mode === \"radiance\" ? nm.length : plan.columns;\n const table = new Float32Array(materials * stride);\n for (let m = 0; m < materials; m++) {\n for (let c = 0; c < stride; c++) {\n let value: number;\n try {\n if (plan.mode === \"radiance\") value = plan.materialRadiance(m, nm[c]!);\n else {\n value = 0;\n const row = plan.channelWeights![c]!;\n for (let j = 0; j < nm.length; j++) value += row[j]! * plan.materialRadiance(m, nm[j]!);\n }\n } catch {\n value = Number.NaN;\n }\n if (Math.abs(value) > FLOAT32_SAFE_MAGNITUDE) throw new ImageKernelExecutionError(\"unsupported-float32-domain\", \"Chart values exceed the float32 domain.\");\n table[m * stride + c] = value;\n }\n }\n return table;\n}\n\nexport async function evaluateChartRadianceOnGpu(runtime: WebGpuRuntime, bandBytes: number, input: ChartRadianceBatchInput, abort: AbortController,\n yieldControl: YieldControl, pipelines: PipelineSource, uploads: ChartSceneUploads): Promise<ChartRadianceResult> {\n const plan = calculateChartRadianceBatchPlan(input), points = input.points.slice(), indices = input.wavelengthIndices?.slice();\n const presetCode = chartGpuPresetCode(plan);\n if (presetCode === undefined) return evaluateChartCompositeOnGpu(runtime, bandBytes, plan, input.scene, points, indices, abort, yieldControl, pipelines, uploads);\n for (let i = 0; i < points.length; i++) {\n if (Math.abs(points[i]!) > CHART_GPU_MAXIMUM_COORDINATE) throw new ImageKernelExecutionError(\"unsupported-float32-domain\", \"Chart points beyond 2^20 frame units are outside the float32 domain.\");\n }\n const { ints, floats, aux } = chartGpuConstants(plan), table = materialTable(plan), radianceMode = plan.mode === \"radiance\";\n const columns = plan.columns, stride = radianceMode ? plan.wavelengthsNanometers.length : columns, count = plan.queryCount;\n const bytesPerQuery = 8 + 4 * columns + 4 + 4;\n const rows = Math.max(1, Math.floor(bandBytes / bytesPerQuery));\n if (Math.max(table.byteLength, aux.byteLength, Math.min(rows, count) * 4 * columns) > runtime.maximumStorageBindingBytes) {\n throw new ImageKernelExecutionError(\"insufficient-limits\", \"Chart tables or bands exceed the device's storage binding limit.\");\n }\n const params = new ArrayBuffer(64), words = new Uint32Array(params), f = new Float32Array(params);\n words[1] = stride; words[2] = presetCode; words[3] = ints[0]; words[4] = ints[1]; words[5] = ints[2]; words[6] = radianceMode ? 1 : 0;\n f.set(floats, 8);\n const pipeline = await pipelines(\"photivra-chart-radiance\", CHART_RADIANCE_WGSL);\n const values = new Float32Array(count * columns), recomputed: number[] = [];\n const scope = new GpuResourceScope(runtime);\n try {\n const tableBuffer = scope.upload(\"photivra-chart-table\", table, BUFFER_USAGE.STORAGE);\n const auxBuffer = scope.upload(\"photivra-chart-aux\", aux, BUFFER_USAGE.STORAGE);\n const gate = createHostYieldGate();\n for (let first = 0; first < count; first += rows) {\n checkAbort(abort.signal);\n const n = Math.min(rows, count - first);\n words[0] = n;\n const band = new GpuResourceScope(runtime);\n try {\n const pointBuffer = band.upload(\"photivra-chart-points\", new Float32Array(points.subarray(2 * first, 2 * (first + n))), BUFFER_USAGE.STORAGE);\n const selectors = band.upload(\"photivra-chart-selectors\", indices ? Uint32Array.from(indices.subarray(first, first + n)) : new Uint32Array(1), BUFFER_USAGE.STORAGE);\n const out = band.buffer(\"photivra-chart-values\", n * 4 * columns, BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);\n const flagBuffer = band.buffer(\"photivra-chart-flags\", n * 4, BUFFER_USAGE.STORAGE | BUFFER_USAGE.COPY_SRC);\n const uniform = band.upload(\"photivra-chart-params\", new Uint8Array(params), BUFFER_USAGE.UNIFORM);\n const bindGroup = runtime.device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), entries: [\n { binding: 0, resource: { buffer: uniform } }, { binding: 1, resource: { buffer: pointBuffer } }, { binding: 2, resource: { buffer: tableBuffer } },\n { binding: 3, resource: { buffer: auxBuffer } }, { binding: 4, resource: { buffer: selectors } }, { binding: 5, resource: { buffer: out } },\n { binding: 6, resource: { buffer: flagBuffer } }] });\n const [valueData, flagData] = await runComputePass(runtime, band, pipeline, bindGroup, linearDispatch(n, CHART_WORKGROUP_SIZE, runtime.maximumWorkgroupsPerDimension),\n [{ buffer: out, bytes: n * 4 * columns }, { buffer: flagBuffer, bytes: n * 4 }], abort.signal);\n values.set(new Float32Array(valueData!, 0, n * columns), first * columns);\n const bandFlags = new Uint32Array(flagData!, 0, n);\n for (let i = 0; i < n; i++) {\n let recompute = bandFlags[i] !== 0;\n for (let c = 0; c < columns && !recompute; c++) if (!Number.isFinite(values[(first + i) * columns + c]!)) recompute = true;\n if (recompute) recomputed.push(first + i);\n }\n } finally {\n band.release();\n }\n if (yieldControl && gate.due()) { await yieldControl(abort.signal); gate.restart(); }\n }\n } finally {\n scope.release();\n }\n checkAbort(abort.signal);\n // Flagged points (and any whose material spectrum failed): the reference's own value, rounded once to float32.\n for (const q of recomputed) for (let c = 0; c < columns; c++) values[q * columns + c] = plan.queryValue(points, indices, q, c);\n const execution = webGpuExecution({ kind: \"relative-to-reference\", relative: 2 ** -24, absolute: 2 ** -126 }, 0);\n return { plan, values, columns, execution, hostRecomputedQueryIndices: Uint32Array.from(recomputed) };\n}\n"]}
@@ -24,7 +24,7 @@
24
24
  * reference, so they are exact. Every stage's wall-clock time is reported (`stageMilliseconds`); on a software adapter it
25
25
  * is not GPU performance.
26
26
  */
27
- import { type DisplayViewRenderResult, type DisplayViewSetup } from "../facade/display-view.js";
27
+ import { type DisplayViewKernelTap, type DisplayViewRenderResult, type DisplayViewSetup } from "../facade/display-view.js";
28
28
  import { type DisplayViewExpectedSignalInput } from "../facade/expected-signal.js";
29
29
  import type { DisplayViewGpuSetup } from "../facade/display-view.js";
30
30
  import { type DisplayViewMaterialModules } from "./display-view-composite-material-module.js";
@@ -133,6 +133,14 @@ export declare class CorrectionStateStore {
133
133
  values: Float32Array<ArrayBuffer>;
134
134
  };
135
135
  }
136
+ /** The footprint shape of a view: real pixels per display pixel along each axis, and whether the exact area mean applies. */
137
+ export declare function footprintShape(setup: DisplayViewSetup): {
138
+ sx: number;
139
+ sy: number;
140
+ exact: boolean;
141
+ maximumColumns: number;
142
+ maximumRows: number;
143
+ };
136
144
  /**
137
145
  * Why the Quality kernels do not cover a request, or null when they do: chart materials, the exact area mean (footprints of
138
146
  * at most 25 real pixels and 6 per axis), the identity or positive Reinhard tone curve, demosaic candidates within 3 sites
@@ -155,6 +163,8 @@ export declare function renderDisplayViewQualityOnGpu(runtime: WebGpuRuntime, ba
155
163
  export declare function qualityMaterialSetup(gpu: DisplayViewGpuSetup): DisplayViewGpuSetup;
156
164
  /** The material module of a Quality render's scene (see `qualityMaterialSetup`). */
157
165
  export declare function qualityMaterialModule(modules: DisplayViewMaterialModules, gpu: DisplayViewGpuSetup, signal: AbortSignal): Promise<DisplayViewGpuMaterialModule>;
166
+ /** The pixel-aperture samples per axis and anti-aliasing spots of a request. */
167
+ export declare function offsetCount(request: DisplayViewGpuRequest): number;
158
168
  /**
159
169
  * Why the Quality renderer does not support a prepared request (`DisplayViewGpuRenderer.supports`), or true: engine charts and
160
170
  * declared `material-layers` scenes (the material modules of `createDisplayViewMaterialModules`, #491), the identity or Reinhard
@@ -168,6 +178,8 @@ export declare function displayViewQualityGpuSupports(request: DisplayViewGpuReq
168
178
  export declare const DISPLAY_VIEW_QUALITY_CONFORMANCE_CASE: DisplayViewGpuConformanceCase;
169
179
  /** #492's self-check of the defocus disc's blocked site sum (see `runQualityConformance`). */
170
180
  export declare const DISPLAY_VIEW_QUALITY_DEFOCUS_CONFORMANCE_CASE: DisplayViewGpuConformanceCase;
181
+ /** The bilinear RGGB demosaic kernels per phase (phaseY·2 + phaseX) and channel, as `bilinearPhaseProfiles` gives them. */
182
+ export declare function bilinearKernels(): DisplayViewKernelTap[][][];
171
183
  export declare function createDisplayViewGpuRenderer(runtime: WebGpuRuntime, options?: {
172
184
  maximumBandBytes?: number;
173
185
  yieldControl?: YieldControl;
@@ -35,7 +35,7 @@ import { DISPLAY_VIEW_SPEED_CONFORMANCE_CASE, axisRecord, displayViewSpeedGpuSup
35
35
  import { createHostYieldGate } from "../capture/host-yield-cadence.js";
36
36
  import { createDefocusDiscSiteKernel } from "../optics/defocus-disc-kernel.js";
37
37
  import { ImageKernelExecutionError, WEBGPU_F32_UNIT_ROUNDOFF, webGpuExecution } from "./image-kernel-execution.js";
38
- import { BUFFER_USAGE, GpuResourceScope, abortedError, createComputePipeline, linearDispatch, runComputePass } from "./webgpu-runtime.js";
38
+ import { BUFFER_USAGE, GpuResourceScope, abortedError, createComputePipeline, linearDispatch, runComputePass, throwIfAborted as checkAbort } from "./webgpu-runtime.js";
39
39
  import { DISPLAY_VIEW_QUALITY_AUX, DISPLAY_VIEW_QUALITY_BITMAP_WORDS, DISPLAY_VIEW_QUALITY_CANDIDATE_ENTRIES, DISPLAY_VIEW_QUALITY_CANDIDATE_FLOATS, DISPLAY_VIEW_QUALITY_FLAG, DISPLAY_VIEW_QUALITY_FLAG_WORDS, DISPLAY_VIEW_QUALITY_GEOMETRY_STRIDE, DISPLAY_VIEW_QUALITY_GROUP_WORDS, DISPLAY_VIEW_QUALITY_MAXIMUM_PIXELS_PER_AXIS, DISPLAY_VIEW_QUALITY_OUTPUT_FLOATS, DISPLAY_VIEW_QUALITY_PARAM_WORDS, DISPLAY_VIEW_QUALITY_PIXELS_WGSL, DISPLAY_VIEW_QUALITY_SITES_BLOCKED_WGSL, DISPLAY_VIEW_QUALITY_SITES_WGSL, DISPLAY_VIEW_QUALITY_SITE_FLOATS, DISPLAY_VIEW_QUALITY_TAP_WORDS, DISPLAY_VIEW_QUALITY_WORKGROUP_SIZE, assembleDisplayViewQualityLatticeWgsl } from "./wgsl-display-view-quality-kernel.js";
40
40
  /** One WGSL rounding of + − × in either direction (W3C WGSL "Floating Point Accuracy"; #471, #487): twice the binary32 unit roundoff. */
41
41
  const E = 2 * WEBGPU_F32_UNIT_ROUNDOFF;
@@ -107,10 +107,6 @@ export class CorrectionStateStore {
107
107
  return { keys: this.#keys, values: this.#values };
108
108
  }
109
109
  }
110
- function checkAbort(signal) {
111
- if (signal.aborted)
112
- throw abortedError();
113
- }
114
110
  /**
115
111
  * Waits until the queue has finished the work submitted so far (`GPUQueue.onSubmittedWorkDone`), so a pass that reads nothing
116
112
  * back is timed with its own execution, not the next pass's wait. The passes depend on each other in order anyway.
@@ -121,7 +117,7 @@ async function queueIdle(runtime, signal) {
121
117
  await runtime.guard(queue.onSubmittedWorkDone(), signal);
122
118
  }
123
119
  /** The footprint shape of a view: real pixels per display pixel along each axis, and whether the exact area mean applies. */
124
- function footprintShape(setup) {
120
+ export function footprintShape(setup) {
125
121
  const sx = setup.frameWidth / setup.viewWidth, sy = setup.frameHeight / setup.viewHeight, area = sx * sy;
126
122
  const exact = area <= Math.min(EXACT_AREA_MEAN_MAX_PIXELS, setup.samplesPerAxis * setup.samplesPerAxis);
127
123
  let maximumColumns = 0, maximumRows = 0;
@@ -861,7 +857,7 @@ export function qualityMaterialModule(modules, gpu, signal) {
861
857
  return modules.moduleFor(qualityMaterialSetup(gpu), signal);
862
858
  }
863
859
  /** The pixel-aperture samples per axis and anti-aliasing spots of a request. */
864
- function offsetCount(request) { return request.boxSamples * request.boxSamples * (request.antiAliasing ? 4 : 1); }
860
+ export function offsetCount(request) { return request.boxSamples * request.boxSamples * (request.antiAliasing ? 4 : 1); }
865
861
  /**
866
862
  * Why the Quality renderer does not support a prepared request (`DisplayViewGpuRenderer.supports`), or true: engine charts and
867
863
  * declared `material-layers` scenes (the material modules of `createDisplayViewMaterialModules`, #491), the identity or Reinhard
@@ -967,7 +963,7 @@ export const DISPLAY_VIEW_QUALITY_CONFORMANCE_CASE = { id: "display-view:quality
967
963
  export const DISPLAY_VIEW_QUALITY_DEFOCUS_CONFORMANCE_CASE = { id: "display-view:quality:checkerboard-13x9-defocus-blocked",
968
964
  run: (handle, signal) => runQualityConformance(handle, signal, true) };
969
965
  /** The bilinear RGGB demosaic kernels per phase (phaseY·2 + phaseX) and channel, as `bilinearPhaseProfiles` gives them. */
970
- function bilinearKernels() {
966
+ export function bilinearKernels() {
971
967
  const cross = [[1, 0], [-1, 0], [0, 1], [0, -1]], diagonal = [[1, 1], [1, -1], [-1, 1], [-1, -1]], horizontal = [[1, 0], [-1, 0]], vertical = [[0, 1], [0, -1]];
972
968
  const average = (offsets) => offsets.map(([dx, dy]) => ({ dx: dx, dy: dy, weight: 1 / offsets.length })), self = [{ dx: 0, dy: 0, weight: 1 }];
973
969
  return [[self, average(cross), average(diagonal)], [average(horizontal), self, average(vertical)], [average(vertical), self, average(horizontal)], [average(diagonal), average(cross), self]];