diff options
| author | salmonik <salmonik@tuta.io> | 2026-07-31 18:08:45 +0200 |
|---|---|---|
| committer | salmonik <salmonik@tuta.io> | 2026-07-31 18:08:45 +0200 |
| commit | 075c87d52a4d90c0f00f8ba7ba849677771a9be3 (patch) | |
| tree | 2d89bc491a3ac1d2d018f1f22c48274e77bd7a08 /CONTEXT.md | |
| parent | gop: RAM backbuffer — scrolling never reads the framebuffer (diff) | |
| download | rs-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 'CONTEXT.md')
| -rw-r--r-- | CONTEXT.md | 24 |
1 files changed, 16 insertions, 8 deletions
| @@ -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 |
