diff --git a/docs/dev/outstanding.md b/docs/dev/outstanding.md index 2f5dc57..1c1a498 100644 --- a/docs/dev/outstanding.md +++ b/docs/dev/outstanding.md @@ -200,6 +200,10 @@ Two measurements say it costs more than it saves on the interactive path. Neithe about the export path or about a device under memory pressure, which is where the case for it actually lives — and that is spike S6, which has not run. +**2026-09-27:** the export path does now tile, for the one case that forced it — a linear DNG +wider than any texture. See the note under FR-DSP-2 in [requirements.md](requirements.md). The +interactive path is unchanged and S6 is still unrun. + **FR-DSP-4 — Progressive refinement. Built in 0.15.0.** While a gesture moves the canvas renders a half-resolution draft, and the sharp frame lands once, 120 ms after the last movement: the decision is `ui/dr-ui/src/refine.rs`, a debounce whose every draft re-arms the settle timer, driven diff --git a/docs/dev/requirements.md b/docs/dev/requirements.md index 5a1ffb9..6e0d195 100644 --- a/docs/dev/requirements.md +++ b/docs/dev/requirements.md @@ -748,6 +748,15 @@ tiles are reused. > number from the device the clause is about rather than from the one it is not. If S6 finds the > fused pass inside budget there too, FR-DSP-2 becomes a scheduling concern for export and > thumbnailing as frame-budget.md proposes; if not, S6 names the stage to tile. +> +> **2026-09-27: the export half is built, for sources larger than one texture.** A linear DNG +> past 8192 pixels (a stitched panorama, 22927×8966 in the case that prompted it) opens on a +> reduced copy, and a render finer than the copy samples a window of the full resolution +> through the fused shader's source-window uniforms. The export is drawn in 4096-pixel tiles +> grown by the detail chain's reach (`dr_pipeline::tiles`, `ComposedDetail::reach`) and matches +> the untiled render to within one code value (`core/dr-gpu/tests/source_window.rs`). The +> interactive path is still one dispatch over the viewport: a zoomed canvas cuts one window +> and keeps it while the view stays inside, which is not the tile cache this clause describes. **FR-DSP-3 — Interactive latency.** Moving a slider updates the visible region within one frame budget at proxy resolution. When a full-resolution result is needed it is computed @@ -2152,6 +2161,11 @@ tiling. GPU memory headroom is configurable. Where an allocation fails, work is memory or refused with a typed error (`GpuError::TooLarge`) — never rendered by a CPU pipeline, which does not exist (NFR-R8). +> **2026-09-27:** a linear DNG larger than one texture is no longer refused. It is developed from +> a reduced copy and full-resolution windows, and exported in tiles (FR-DSP-2's note). A CFA file +> too large for one texture, or whose photosites overrun the device's storage-buffer limits on +> upload, is still refused, and there is still no headroom budget. + **NFR-RES-3 — Mobile power.** On Android the app shall not render continuously when idle. Battery and thermal behaviour are first-class concerns; background sync respects metered-connection and battery-saver settings.