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 /shell/src/lib.rs | |
| 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 '')
| -rw-r--r-- | shell/src/lib.rs | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/shell/src/lib.rs b/shell/src/lib.rs index 4601b98..9644f01 100644 --- a/shell/src/lib.rs +++ b/shell/src/lib.rs | |||
| @@ -20,6 +20,9 @@ pub fn run() -> ! { | |||
| 20 | ); | 20 | ); |
| 21 | 21 | ||
| 22 | loop { | 22 | loop { |
| 23 | // Push any deferred scrolls so the prompt renders on a current | ||
| 24 | // framebuffer (e.g. after a streaming command's batch of output). | ||
| 25 | rsnix::vt::sync_scroll(); | ||
| 23 | // Print prompt | 26 | // Print prompt |
| 24 | gop_print!("> "); | 27 | gop_print!("> "); |
| 25 | serial_print!("> "); | 28 | serial_print!("> "); |
