summaryrefslogtreecommitdiffstats
path: root/CONTEXT.md
diff options
context:
space:
mode:
authorsalmonik <salmonik@tuta.io>2026-07-31 18:08:45 +0200
committersalmonik <salmonik@tuta.io>2026-07-31 18:08:45 +0200
commit075c87d52a4d90c0f00f8ba7ba849677771a9be3 (patch)
tree2d89bc491a3ac1d2d018f1f22c48274e77bd7a08 /CONTEXT.md
parentgop: RAM backbuffer — scrolling never reads the framebuffer (diff)
downloadrs-dos-075c87d52a4d90c0f00f8ba7ba849677771a9be3.tar.gz
rs-dos-075c87d52a4d90c0f00f8ba7ba849677771a9be3.zip
vt: defer scrolls and batch framebuffer pushes
Streaming output scrolled one framebuffer push per line (each a ~3-8 MB write-only copy). The vt now scrolls the logical grid instantly in RAM and defers the display shift: N pending scrolls are pushed together as one shift_up_n — one push regardless of batch size. - vt: PENDING_SCROLLS counter; scroll_up shifts CELLS only; flush renders nothing while pending (the diff would otherwise re-rasterise the whole screen per line); sync_scroll() does one gop::shift_up_n + RENDERED mirror + normal diff flush (which re-blits just the newly exposed rows and the cursor). - Sync triggers: batch of 16 rows, ~40 ms of stream pause (100 Hz TICKS), any CSI sequence (full-screen apps like the editor render immediately), clear_all/set_cursor_visible, interactive input (tty read_line/read_byte), and the shell before each prompt. - gop: shift_up → shift_up_n(n) (one shadow memcpy + one push). Verified in QEMU: mmap/hexdump streaming renders in coherent batches with the prompt syncing at the end; clear wipes clean; the editor scrolls and redraws immediately (45-line file, gutter + status bar intact, cursor correct); save/exit/cat round-trip unchanged. Release and dev builds pass.
Diffstat (limited to '')
-rw-r--r--CONTEXT.md24
1 files changed, 16 insertions, 8 deletions
diff --git a/CONTEXT.md b/CONTEXT.md
index 32a6eca..8fa4025 100644
--- a/CONTEXT.md
+++ b/CONTEXT.md
@@ -163,14 +163,22 @@ Single Rust crate (`x86_64-unknown-uefi` target). Module breakdown:
163## Known issues / perf notes 163## Known issues / perf notes
164 164
165- **Scroll cost** — scrolling still shifts the whole framebuffer (a 165- **Scroll cost** — scrolling still shifts the whole framebuffer (a
166 ~3-8 MB pixel copy per row), but a RAM backbuffer (`gop::SHADOW`) 166 ~3-8 MB pixel copy per row), but two mechanisms make it fast on real
167 makes it fast on real hardware: every raster write goes to the shadow 167 hardware:
168 too, and scrolling is a cached shadow memcpy + one write-only push to 168 1. a RAM backbuffer (`gop::SHADOW`): every raster write goes to the
169 the display. The display is never *read* — that was the killer, since 169 shadow too; scrolling is a cached shadow memcpy + one write-only
170 real-hardware GOP framebuffers are uncacheable/write-combining and 170 push to the display — the display is never *read* (uncached reads
171 uncached reads cost a bus round-trip per cache line. Still on the 171 were the killer, since real-hardware GOP framebuffers are
172 someday list: a pan-based ring so scrolling never touches the whole 172 uncacheable/write-combining).
173 framebuffer at all. 173 2. deferred scroll batching (`vt::PENDING_SCROLLS`): the logical grid
174 scrolls instantly in RAM while the framebuffer shift+push is
175 deferred; N pending scrolls cost one push. Bursts of streaming
176 output (hexdump/cat) push every ~16 rows (or after ~40 ms of
177 pause), and the shell syncs before each prompt. Any CSI sequence
178 (full-screen apps like the editor) or interactive input pushes
179 immediately.
180 Still on the someday list: a pan-based ring so scrolling never touches
181 the whole framebuffer at all.
174- **Editor redraw** re-blits changed cells per keystroke (fine at 1280×800); 182- **Editor redraw** re-blits changed cells per keystroke (fine at 1280×800);
175 the "optimize drawing someday" item. 183 the "optimize drawing someday" item.
176- **ramfs only**: edited files live in memory, lost on reboot until disk 184- **ramfs only**: edited files live in memory, lost on reboot until disk