bench_camera_raw dropped each GPU develop's Result with .ok(), so a
device fault or a refused size would have been timed and printed as a
GPU figure. try_time returns the first error instead, and main
propagates it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Step 1 of #6916: one wgpu fragment pass for develop's per-pixel stages
(white balance and exposure, Contrast without Texture or Clarity, Whites
and Blacks, Vibrance and Saturation, tone curves, Color Mixer, Color
Grading, vignette, grain in full-resolution coordinates).
- algo: camera_raw::per_pixel resolves those stages' constants and
tables; the CPU develop builds its own from the same functions, so its
output is unchanged bit for bit.
- gpu: CameraRawDevelop (camera_raw.rs, camera_raw.wgsl), curves and
Whites/Blacks rows in one R32Float table texture, readback for the
histogram and scopes. Built on demand, not with the compositor (#6419).
- ui-egui: the proxy worker develops on the GPU when the settings have no
spatial stage; Rendering Mode CPU, no GPU canvas, a software adapter, a
fault or a failed develop use the CPU develop. The pipeline builds on a
thread at the first open. describe() reports developMs and
developBackend.
GPU vs CPU at 8, 16 and 32 bits: at most 2.7e-5 (RTX 5060 Ti, Vulkan and
DX12), 6.7e-6 (WARP); tests hold 1/4096. 858x572 proxy, release: CPU
20.7-28.1 ms, GPU 2.7 ms.
Part of #6916.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>