From 2b0f2fe5991556373b58204aff96a0aa3b93910d Mon Sep 17 00:00:00 2001 From: Jean Guyader Date: Tue, 1 Dec 2009 18:44:39 +0000 Subject: [PATCH] clear the framebuffer when we change resolution. --- master/series | 1 + master/vga-clear-hw-fb-on-resize | 33 ++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 master/vga-clear-hw-fb-on-resize diff --git a/master/series b/master/series index 45dfc47..3b80369 100644 --- a/master/series +++ b/master/series @@ -29,3 +29,4 @@ do-atapi-locking-properly atapi-succeed-on-lock-door pv_driver_throttling_disabled dont-carp-about-a-missing-battery +vga-clear-hw-fb-on-resize diff --git a/master/vga-clear-hw-fb-on-resize b/master/vga-clear-hw-fb-on-resize new file mode 100644 index 0000000..f081e2e --- /dev/null +++ b/master/vga-clear-hw-fb-on-resize @@ -0,0 +1,33 @@ +diff --git a/hw/vga.c b/hw/vga.c +index e4e27a9..c8d9077 100644 +--- a/hw/vga.c ++++ b/hw/vga.c +@@ -638,6 +638,12 @@ static void vbe_ioport_write_data(void *opaque, uint32_t addr, uint32_t val) + set_vram_mapping(s, s->lfb_addr, s->lfb_end); + } + ++ /* clear the screen (should be done in BIOS) */ ++ if (!(val & VBE_DISPI_NOCLEARMEM)) { ++ memset(s->vram_ptr, 0, ++ s->vbe_regs[VBE_DISPI_INDEX_YRES] * s->vbe_line_offset); ++ } ++ + s->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH] = + s->vbe_regs[VBE_DISPI_INDEX_XRES]; + s->vbe_regs[VBE_DISPI_INDEX_VIRT_HEIGHT] = +@@ -1313,6 +1319,7 @@ static void vga_draw_text(VGAState *s, int full_update) + cw != s->last_cw || cheight != s->last_ch || s->last_depth) { + s->last_scr_width = width * cw; + s->last_scr_height = height * cheight; ++ memset(s->vram_ptr + (s->start_addr * 4), 0x00, s->line_offset * height); + qemu_console_resize(s->ds, s->last_scr_width, s->last_scr_height); + s->last_depth = 0; + s->last_width = width; +@@ -1626,6 +1633,7 @@ static void vga_draw_graphic(VGAState *s, int full_update) + } else { + qemu_console_resize(s->ds, disp_width, height); + } ++ memset(s->vram_ptr + (s->start_addr * 4), 0x00, s->line_offset * height); + s->last_scr_width = disp_width; + s->last_scr_height = height; + s->last_width = disp_width; -- 2.39.5