Commit 14778c2064166a8d1d07b22f0af9eee4fa490e60

Authored by pbrook
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 139 TextCell *cells;
140 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 147 enum TTYState state;
143 148 int esc_params[MAX_ESC_PARAMS];
144 149 int nb_esc_params;
... ... @@ -537,6 +542,18 @@ static inline void text_update_xy(TextConsole *s, int x, int y)
537 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 557 static void update_xy(TextConsole *s, int x, int y)
541 558 {
542 559 TextCell *c;
... ... @@ -556,8 +573,7 @@ static void update_xy(TextConsole *s, int x, int y)
556 573 c = &s->cells[y1 * s->width + x];
557 574 vga_putcharxy(s->ds, x, y2, c->ch,
558 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 607 } else {
592 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 641 if (++y1 == s->total_height)
627 642 y1 = 0;
628 643 }
629   - dpy_update(s->ds, 0, 0, ds_get_width(s->ds), ds_get_height(s->ds));
630 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 648 static void console_scroll(int ydelta)
... ... @@ -703,8 +718,10 @@ static void console_put_lf(TextConsole *s)
703 718 vga_fill_rect(s->ds, 0, (s->height - 1) * FONT_HEIGHT,
704 719 s->width * FONT_WIDTH, FONT_HEIGHT,
705 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 1079 TextConsole *s = chr->opaque;
1063 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 1086 console_show_cursor(s, 0);
1066 1087 for(i = 0; i < len; i++) {
1067 1088 console_putchar(s, buf[i]);
1068 1089 }
1069 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 1096 return len;
1071 1097 }
1072 1098  
... ...