qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH] Fix spurious VGA updates


From: Samuel Thibault
Subject: [Qemu-devel] [PATCH] Fix spurious VGA updates
Date: Mon, 28 Apr 2008 11:32:49 +0100
User-agent: Mutt/1.5.12-2006-07-14

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;




reply via email to

[Prev in Thread] Current Thread [Next in Thread]