Skip to contentSkip to conversation

Fix spurious VGA updates

PATCH In review Samuel Thibault 1 participant 2 messages Apr 28, 2008

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Fix spurious VGA updates

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.

vga.c +12 -2
Index: hw/vga.c
===================================================================
@@ -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;
#1 lore raw
Quoted 5 lines · 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.

vga.c +10 -2
Index: hw/vga.c
===================================================================
@@ -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;