qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] Fix spurious VGA updates
@ 2008-04-28 10:32 Samuel Thibault
  2008-04-28 10:41 ` [Qemu-devel] " Samuel Thibault
  0 siblings, 1 reply; 2+ messages in thread
From: Samuel Thibault @ 2008-04-28 10:32 UTC (permalink / raw)
  To: qemu-devel

Hello,

VGA used to use
    bwidth = width * 4;
to detect how much memory it should check for dirtyness for each line to
be updated. This is however only valid in 32bit modes. The patch below
fixes that by using the exact number of bytes.

Index: hw/vga.c
===================================================================
--- hw/vga.c	(révision 4276)
+++ hw/vga.c	(copie de travail)
@@ -1418,7 +1418,7 @@
 static void vga_draw_graphic(VGAState *s, int full_update)
 {
     int y1, y, update, page_min, page_max, linesize, y_start, double_scan, mask;
-    int width, height, shift_control, line_offset, page0, page1, bwidth;
+    int width, height, shift_control, line_offset, page0, page1, bwidth, bits;
     int disp_width, multi_scan, multi_run;
     uint8_t *d;
     uint32_t v, addr1, addr;
@@ -1451,16 +1451,20 @@
         if (s->sr[0x01] & 8) {
             v = VGA_DRAW_LINE4D2;
             disp_width <<= 1;
+            bits = 2;
         } else {
             v = VGA_DRAW_LINE4;
+            bits = 4;
         }
     } else if (shift_control == 1) {
         full_update |= update_palette16(s);
         if (s->sr[0x01] & 8) {
             v = VGA_DRAW_LINE2D2;
             disp_width <<= 1;
+            bits = 2;
         } else {
             v = VGA_DRAW_LINE2;
+            bits = 4;
         }
     } else {
         switch(s->get_bpp(s)) {
@@ -1468,22 +1472,28 @@
         case 0:
             full_update |= update_palette256(s);
             v = VGA_DRAW_LINE8D2;
+            bits = 4;
             break;
         case 8:
             full_update |= update_palette256(s);
             v = VGA_DRAW_LINE8;
+            bits = 8;
             break;
         case 15:
             v = VGA_DRAW_LINE15;
+            bits = 16;
             break;
         case 16:
             v = VGA_DRAW_LINE16;
+            bits = 16;
             break;
         case 24:
             v = VGA_DRAW_LINE24;
+            bits = 24;
             break;
         case 32:
             v = VGA_DRAW_LINE32;
+            bits = 32;
             break;
         }
     }
@@ -1507,7 +1517,7 @@
            width, height, v, line_offset, s->cr[9], s->cr[0x17], s->line_compare, s->sr[0x01]);
 #endif
     addr1 = (s->start_addr * 4);
-    bwidth = width * 4;
+    bwidth = (width * bits + 7) / 8;
     y_start = -1;
     page_min = 0x7fffffff;
     page_max = -1;

^ permalink raw reply	[flat|nested] 2+ messages in thread

* [Qemu-devel] Re: [PATCH] Fix spurious VGA updates
  2008-04-28 10:32 [Qemu-devel] [PATCH] Fix spurious VGA updates Samuel Thibault
@ 2008-04-28 10:41 ` Samuel Thibault
  0 siblings, 0 replies; 2+ messages in thread
From: Samuel Thibault @ 2008-04-28 10:41 UTC (permalink / raw)
  To: qemu-devel

Samuel Thibault, le Mon 28 Apr 2008 11:32:49 +0100, a écrit :
> VGA used to use
>     bwidth = width * 4;
> to detect how much memory it should check for dirtyness for each line to
> be updated. This is however only valid in 32bit modes. The patch below
> fixes that by using the exact number of bytes.

Oops, sorry, width is used for bwidth, not disp_width, so that even in
double width mode, bits should be 4, please use patch below instead.

Index: hw/vga.c
===================================================================
--- hw/vga.c	(révision 4276)
+++ hw/vga.c	(copie de travail)
@@ -1418,7 +1418,7 @@
 static void vga_draw_graphic(VGAState *s, int full_update)
 {
     int y1, y, update, page_min, page_max, linesize, y_start, double_scan, mask;
-    int width, height, shift_control, line_offset, page0, page1, bwidth;
+    int width, height, shift_control, line_offset, page0, page1, bwidth, bits;
     int disp_width, multi_scan, multi_run;
     uint8_t *d;
     uint32_t v, addr1, addr;
@@ -1454,6 +1454,7 @@
         } else {
             v = VGA_DRAW_LINE4;
         }
+        bits = 4;
     } else if (shift_control == 1) {
         full_update |= update_palette16(s);
         if (s->sr[0x01] & 8) {
@@ -1462,28 +1463,35 @@
         } else {
             v = VGA_DRAW_LINE2;
         }
+        bits = 4;
     } else {
         switch(s->get_bpp(s)) {
         default:
         case 0:
             full_update |= update_palette256(s);
             v = VGA_DRAW_LINE8D2;
+            bits = 4;
             break;
         case 8:
             full_update |= update_palette256(s);
             v = VGA_DRAW_LINE8;
+            bits = 8;
             break;
         case 15:
             v = VGA_DRAW_LINE15;
+            bits = 16;
             break;
         case 16:
             v = VGA_DRAW_LINE16;
+            bits = 16;
             break;
         case 24:
             v = VGA_DRAW_LINE24;
+            bits = 24;
             break;
         case 32:
             v = VGA_DRAW_LINE32;
+            bits = 32;
             break;
         }
     }
@@ -1507,7 +1515,7 @@
            width, height, v, line_offset, s->cr[9], s->cr[0x17], s->line_compare, s->sr[0x01]);
 #endif
     addr1 = (s->start_addr * 4);
-    bwidth = width * 4;
+    bwidth = (width * bits + 7) / 8;
     y_start = -1;
     page_min = 0x7fffffff;
     page_max = -1;

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2008-04-28 10:41 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-04-28 10:32 [Qemu-devel] [PATCH] Fix spurious VGA updates Samuel Thibault
2008-04-28 10:41 ` [Qemu-devel] " Samuel Thibault

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).