Commit 14778c2064166a8d1d07b22f0af9eee4fa490e60
1 parent
6e60065f
Coalesce virtual console screen updates.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6374 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
33 additions
and
7 deletions
console.c
@@ -139,6 +139,11 @@ struct TextConsole { | @@ -139,6 +139,11 @@ struct TextConsole { | ||
139 | TextCell *cells; | 139 | TextCell *cells; |
140 | int text_x[2], text_y[2], cursor_invalidate; | 140 | int text_x[2], text_y[2], cursor_invalidate; |
141 | 141 | ||
142 | + int update_x0; | ||
143 | + int update_y0; | ||
144 | + int update_x1; | ||
145 | + int update_y1; | ||
146 | + | ||
142 | enum TTYState state; | 147 | enum TTYState state; |
143 | int esc_params[MAX_ESC_PARAMS]; | 148 | int esc_params[MAX_ESC_PARAMS]; |
144 | int nb_esc_params; | 149 | int nb_esc_params; |
@@ -537,6 +542,18 @@ static inline void text_update_xy(TextConsole *s, int x, int y) | @@ -537,6 +542,18 @@ static inline void text_update_xy(TextConsole *s, int x, int y) | ||
537 | s->text_y[1] = MAX(s->text_y[1], y); | 542 | s->text_y[1] = MAX(s->text_y[1], y); |
538 | } | 543 | } |
539 | 544 | ||
545 | +static void invalidate_xy(TextConsole *s, int x, int y) | ||
546 | +{ | ||
547 | + if (s->update_x0 > x * FONT_WIDTH) | ||
548 | + s->update_x0 = x * FONT_WIDTH; | ||
549 | + if (s->update_y0 > y * FONT_HEIGHT) | ||
550 | + s->update_y0 = y * FONT_HEIGHT; | ||
551 | + if (s->update_x1 < (x + 1) * FONT_WIDTH) | ||
552 | + s->update_x1 = (x + 1) * FONT_WIDTH; | ||
553 | + if (s->update_y1 < (y + 1) * FONT_HEIGHT) | ||
554 | + s->update_y1 = (y + 1) * FONT_HEIGHT; | ||
555 | +} | ||
556 | + | ||
540 | static void update_xy(TextConsole *s, int x, int y) | 557 | static void update_xy(TextConsole *s, int x, int y) |
541 | { | 558 | { |
542 | TextCell *c; | 559 | TextCell *c; |
@@ -556,8 +573,7 @@ static void update_xy(TextConsole *s, int x, int y) | @@ -556,8 +573,7 @@ static void update_xy(TextConsole *s, int x, int y) | ||
556 | c = &s->cells[y1 * s->width + x]; | 573 | c = &s->cells[y1 * s->width + x]; |
557 | vga_putcharxy(s->ds, x, y2, c->ch, | 574 | vga_putcharxy(s->ds, x, y2, c->ch, |
558 | &(c->t_attrib)); | 575 | &(c->t_attrib)); |
559 | - dpy_update(s->ds, x * FONT_WIDTH, y2 * FONT_HEIGHT, | ||
560 | - FONT_WIDTH, FONT_HEIGHT); | 576 | + invalidate_xy(s, x, y2); |
561 | } | 577 | } |
562 | } | 578 | } |
563 | } | 579 | } |
@@ -591,8 +607,7 @@ static void console_show_cursor(TextConsole *s, int show) | @@ -591,8 +607,7 @@ static void console_show_cursor(TextConsole *s, int show) | ||
591 | } else { | 607 | } else { |
592 | vga_putcharxy(s->ds, x, y, c->ch, &(c->t_attrib)); | 608 | vga_putcharxy(s->ds, x, y, c->ch, &(c->t_attrib)); |
593 | } | 609 | } |
594 | - dpy_update(s->ds, x * FONT_WIDTH, y * FONT_HEIGHT, | ||
595 | - FONT_WIDTH, FONT_HEIGHT); | 610 | + invalidate_xy(s, x, y); |
596 | } | 611 | } |
597 | } | 612 | } |
598 | } | 613 | } |
@@ -626,8 +641,8 @@ static void console_refresh(TextConsole *s) | @@ -626,8 +641,8 @@ static void console_refresh(TextConsole *s) | ||
626 | if (++y1 == s->total_height) | 641 | if (++y1 == s->total_height) |
627 | y1 = 0; | 642 | y1 = 0; |
628 | } | 643 | } |
629 | - dpy_update(s->ds, 0, 0, ds_get_width(s->ds), ds_get_height(s->ds)); | ||
630 | console_show_cursor(s, 1); | 644 | console_show_cursor(s, 1); |
645 | + dpy_update(s->ds, 0, 0, ds_get_width(s->ds), ds_get_height(s->ds)); | ||
631 | } | 646 | } |
632 | 647 | ||
633 | static void console_scroll(int ydelta) | 648 | static void console_scroll(int ydelta) |
@@ -703,8 +718,10 @@ static void console_put_lf(TextConsole *s) | @@ -703,8 +718,10 @@ static void console_put_lf(TextConsole *s) | ||
703 | vga_fill_rect(s->ds, 0, (s->height - 1) * FONT_HEIGHT, | 718 | vga_fill_rect(s->ds, 0, (s->height - 1) * FONT_HEIGHT, |
704 | s->width * FONT_WIDTH, FONT_HEIGHT, | 719 | s->width * FONT_WIDTH, FONT_HEIGHT, |
705 | color_table[0][s->t_attrib_default.bgcol]); | 720 | color_table[0][s->t_attrib_default.bgcol]); |
706 | - dpy_update(s->ds, 0, 0, | ||
707 | - s->width * FONT_WIDTH, s->height * FONT_HEIGHT); | 721 | + s->update_x0 = 0; |
722 | + s->update_y0 = 0; | ||
723 | + s->update_x1 = s->width * FONT_WIDTH; | ||
724 | + s->update_y1 = s->height * FONT_HEIGHT; | ||
708 | } | 725 | } |
709 | } | 726 | } |
710 | } | 727 | } |
@@ -1062,11 +1079,20 @@ static int console_puts(CharDriverState *chr, const uint8_t *buf, int len) | @@ -1062,11 +1079,20 @@ static int console_puts(CharDriverState *chr, const uint8_t *buf, int len) | ||
1062 | TextConsole *s = chr->opaque; | 1079 | TextConsole *s = chr->opaque; |
1063 | int i; | 1080 | int i; |
1064 | 1081 | ||
1082 | + s->update_x0 = s->width * FONT_WIDTH; | ||
1083 | + s->update_y0 = s->height * FONT_HEIGHT; | ||
1084 | + s->update_x1 = 0; | ||
1085 | + s->update_y1 = 0; | ||
1065 | console_show_cursor(s, 0); | 1086 | console_show_cursor(s, 0); |
1066 | for(i = 0; i < len; i++) { | 1087 | for(i = 0; i < len; i++) { |
1067 | console_putchar(s, buf[i]); | 1088 | console_putchar(s, buf[i]); |
1068 | } | 1089 | } |
1069 | console_show_cursor(s, 1); | 1090 | console_show_cursor(s, 1); |
1091 | + if (ds_get_bits_per_pixel(s->ds) && s->update_x0 < s->update_x1) { | ||
1092 | + dpy_update(s->ds, s->update_x0, s->update_y0, | ||
1093 | + s->update_x1 - s->update_x0, | ||
1094 | + s->update_y1 - s->update_y0); | ||
1095 | + } | ||
1070 | return len; | 1096 | return len; |
1071 | } | 1097 | } |
1072 | 1098 |