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,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