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 |