qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Gerd Hoffmann <kraxel@redhat.com>
To: qemu-devel@nongnu.org
Cc: Gerd Hoffmann <kraxel@redhat.com>
Subject: [Qemu-devel] [PATCH 07/22] vga: fix text mode updating
Date: Thu,  1 Nov 2012 14:04:02 +0100	[thread overview]
Message-ID: <1351775057-3938-8-git-send-email-kraxel@redhat.com> (raw)
In-Reply-To: <1351775057-3938-1-git-send-email-kraxel@redhat.com>

With both text (curses) and graphics (vnc/sdl/spice/...) display active
vga text mode emulation fails to update both correctly.  Depending on
whenever vga_update_text() or vga_draw_text() happens to be called first
only the text display or only the graphics display will see display
resolution changes and full redraws.

Fix it by calling both text/gfx resize functions in both code paths and
keep track of full screen redraws needed in VGACommonState fields.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/vga.c     |   19 +++++++++++++++++++
 hw/vga_int.h |    2 ++
 2 files changed, 21 insertions(+), 0 deletions(-)

diff --git a/hw/vga.c b/hw/vga.c
index dc8ddde..f31dbdd 100644
--- a/hw/vga.c
+++ b/hw/vga.c
@@ -1346,6 +1346,7 @@ static void vga_draw_text(VGACommonState *s, int full_update)
         s->last_scr_width = width * cw;
         s->last_scr_height = height * cheight;
         qemu_console_resize(s->ds, s->last_scr_width, s->last_scr_height);
+        dpy_text_resize(s->ds, width, height);
         s->last_depth = 0;
         s->last_width = width;
         s->last_height = height;
@@ -1359,6 +1360,14 @@ static void vga_draw_text(VGACommonState *s, int full_update)
     palette = s->last_palette;
     x_incr = cw * ((ds_get_bits_per_pixel(s->ds) + 7) >> 3);
 
+    if (full_update) {
+        s->full_update_text = 1;
+    }
+    if (s->full_update_gfx) {
+        s->full_update_gfx = 0;
+        full_update |= 1;
+    }
+
     cursor_offset = ((s->cr[VGA_CRTC_CURSOR_HI] << 8) |
                      s->cr[VGA_CRTC_CURSOR_LO]) - s->start_addr;
     if (cursor_offset != s->cursor_offset ||
@@ -2052,7 +2061,9 @@ static void vga_update_text(void *opaque, console_ch_t *chardata)
             cw != s->last_cw || cheight != s->last_ch) {
             s->last_scr_width = width * cw;
             s->last_scr_height = height * cheight;
+            qemu_console_resize(s->ds, s->last_scr_width, s->last_scr_height);
             dpy_text_resize(s->ds, width, height);
+            s->last_depth = 0;
             s->last_width = width;
             s->last_height = height;
             s->last_ch = cheight;
@@ -2060,6 +2071,14 @@ static void vga_update_text(void *opaque, console_ch_t *chardata)
             full_update = 1;
         }
 
+        if (full_update) {
+            s->full_update_gfx = 1;
+        }
+        if (s->full_update_text) {
+            s->full_update_text = 0;
+            full_update |= 1;
+        }
+
         /* Update "hardware" cursor */
         cursor_offset = ((s->cr[VGA_CRTC_CURSOR_HI] << 8) |
                          s->cr[VGA_CRTC_CURSOR_LO]) - s->start_addr;
diff --git a/hw/vga_int.h b/hw/vga_int.h
index 22f1706..d4da777 100644
--- a/hw/vga_int.h
+++ b/hw/vga_int.h
@@ -154,6 +154,8 @@ typedef struct VGACommonState {
     vga_hw_invalidate_ptr invalidate;
     vga_hw_screen_dump_ptr screen_dump;
     vga_hw_text_update_ptr text_update;
+    bool full_update_text;
+    bool full_update_gfx;
     /* hardware mouse cursor support */
     uint32_t invalidated_y_table[VGA_MAX_HEIGHT / 32];
     void (*cursor_invalidate)(struct VGACommonState *s);
-- 
1.7.1

  parent reply	other threads:[~2012-11-01 13:04 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-11-01 13:03 [Qemu-devel] [PULL 00/22] console cleanups & pixman rendering Gerd Hoffmann
2012-11-01 13:03 ` [Qemu-devel] [PATCH 01/22] console: QLIST-ify display change listeners Gerd Hoffmann
2012-11-01 13:03 ` [Qemu-devel] [PATCH 02/22] console: add unregister_displaychangelistener Gerd Hoffmann
2012-11-01 13:03 ` [Qemu-devel] [PATCH 03/22] console: move set_mouse + cursor_define callbacks Gerd Hoffmann
2012-11-01 13:03 ` [Qemu-devel] [PATCH 04/22] console: s/TextConsole/QemuConsole/ Gerd Hoffmann
2012-11-01 13:04 ` [Qemu-devel] [PATCH 05/22] console: untangle gfx & txt updates Gerd Hoffmann
2012-11-02  7:20   ` Jan Kiszka
2012-11-02 14:44     ` Peter Maydell
2012-11-01 13:04 ` [Qemu-devel] [PATCH 06/22] console: init displaychangelisteners on register Gerd Hoffmann
2012-11-01 13:04 ` Gerd Hoffmann [this message]
2012-11-01 13:04 ` [Qemu-devel] [PATCH 08/22] console: remove dpy_gfx_fill Gerd Hoffmann
2012-11-01 13:04 ` [Qemu-devel] [PATCH 09/22] console: remove DisplayAllocator Gerd Hoffmann
2012-11-01 13:04 ` [Qemu-devel] [PATCH 10/22] pixman: add submodule Gerd Hoffmann
2012-11-01 13:04 ` [Qemu-devel] [PATCH 11/22] pixman: windup in configure & makefiles Gerd Hoffmann
2012-11-01 13:04 ` [Qemu-devel] [PATCH 12/22] pixman: helper functions Gerd Hoffmann
2012-11-01 13:04 ` [Qemu-devel] [PATCH 13/22] pixman: add pixman image to DisplaySurface Gerd Hoffmann
2012-11-01 13:04 ` [Qemu-devel] [PATCH 14/22] console: make qemu_alloc_display static Gerd Hoffmann
2012-11-01 13:04 ` [Qemu-devel] [PATCH 15/22] console: don't set PixelFormat alpha fields for 32bpp Gerd Hoffmann
2012-11-01 13:04 ` [Qemu-devel] [PATCH 16/22] qxl: stop direct access to DisplaySurface fields Gerd Hoffmann
2012-11-01 13:04 ` [Qemu-devel] [PATCH 17/22] vga: " Gerd Hoffmann
2012-11-01 13:04 ` [Qemu-devel] [PATCH 18/22] pixman: switch screendump function Gerd Hoffmann
2012-11-01 13:04 ` [Qemu-devel] [PATCH 19/22] pixman/vnc: use pixman images in vnc Gerd Hoffmann
2012-11-01 13:04 ` [Qemu-devel] [PATCH 20/22] pixman/vnc: remove rgb_prepare_row* functions Gerd Hoffmann
2012-11-01 13:04 ` [Qemu-devel] [PATCH 21/22] pixman/vnc: remove dead code Gerd Hoffmann
2012-11-01 13:04 ` [Qemu-devel] [PATCH 22/22] pixman: drop obsolete fields from DisplaySurface Gerd Hoffmann
2012-11-01 19:33 ` [Qemu-devel] [PULL 00/22] console cleanups & pixman rendering Anthony Liguori
2012-11-02 16:14   ` Andreas Färber
2012-11-02 16:32     ` Andreas Färber
2012-11-03 12:33       ` Blue Swirl

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1351775057-3938-8-git-send-email-kraxel@redhat.com \
    --to=kraxel@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).