Fix spurious VGA updates
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
@@ -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 ;
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
@@ -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 ;