summaryrefslogtreecommitdiffstats
path: root/shell/src
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 /shell/src
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--shell/src/lib.rs3
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!("> ");