qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Alon Levy <alevy@redhat.com>
To: Gerd Hoffmann <kraxel@redhat.com>
Cc: elmarco@redhat.com, yhalperi@redhat.com, qemu-devel@nongnu.org,
	spice-devel@freedesktop.org
Subject: Re: [Qemu-devel] [RFC v4 4/9] qxl: screen_dump in vga: do a single ppm_save
Date: Wed, 22 Feb 2012 13:26:16 +0100	[thread overview]
Message-ID: <20120222122616.GB607@garlic.redhat.com> (raw)
In-Reply-To: <4F44CD10.2040103@redhat.com>

On Wed, Feb 22, 2012 at 12:10:08PM +0100, Gerd Hoffmann wrote:
> On 02/21/12 22:39, Alon Levy wrote:
> > Using vga->screen_dump results in a number of calls to ppm_save,
> > instead of a single one.
> 
> Can you investigate why?

oh, I know why. vga_screen_dump implementation:

    screen_dump_filename = filename;
    vga_invalidate_display(s);
->  vga_hw_update();
    screen_dump_filename = NULL;

And the only user of screen_dump_filename is:

static void vga_save_dpy_update(DisplayState *ds,
                                int x, int y, int w, int h)
{
    if (screen_dump_filename) {
        ppm_save(screen_dump_filename, ds->surface);
    }
}

vga_save_dpy_update is called on any dpy_update, registered after the
first vga_screen_dump call.

Since there are a number of callers to dpy_update: vga_draw_text calls
it potentially once every line, vga_draw_graphic the same.
vga_draw_blank calls it once.

> 
> > Lacking time to test all the possible users of
> > vga->screen_dump, avoid the redundant calls by doing the vga_hw_update+
> > ppm_save in qxl_hw_screen_dump.
> 
> I'd prefer to fix the root cause instead of adding workarounds.
> 

This seems to work, only tested with -vga qxl and in vga mode:


diff --git a/hw/vga.c b/hw/vga.c
index c1029db..51f20c1 100644
--- a/hw/vga.c
+++ b/hw/vga.c
@@ -163,8 +163,6 @@ static uint16_t expand2[256];
 static uint8_t expand4to8[16];
 
 static void vga_screen_dump(void *opaque, const char *filename);
-static const char *screen_dump_filename;
-static DisplayChangeListener *screen_dump_dcl;
 
 static void vga_update_memory_access(VGACommonState *s)
 {
@@ -2364,22 +2362,6 @@ void vga_init_vbe(VGACommonState *s, MemoryRegion *system_memory)
 /********************************************************/
 /* vga screen dump */
 
-static void vga_save_dpy_update(DisplayState *ds,
-                                int x, int y, int w, int h)
-{
-    if (screen_dump_filename) {
-        ppm_save(screen_dump_filename, ds->surface);
-    }
-}
-
-static void vga_save_dpy_resize(DisplayState *s)
-{
-}
-
-static void vga_save_dpy_refresh(DisplayState *s)
-{
-}
-
 int ppm_save(const char *filename, struct DisplaySurface *ds)
 {
     FILE *f;
@@ -2389,10 +2371,12 @@ int ppm_save(const char *filename, struct DisplaySurface *ds)
     uint8_t r, g, b;
     int ret;
     char *linebuf, *pbuf;
+    static int calls;
 
     f = fopen(filename, "wb");
     if (!f)
         return -1;
+    fprintf(stderr, "ppm_save %d\n", ++calls);
     fprintf(f, "P6\n%d %d\n%d\n",
             ds->width, ds->height, 255);
     linebuf = g_malloc(ds->width * 3);
@@ -2423,29 +2407,13 @@ int ppm_save(const char *filename, struct DisplaySurface *ds)
     return 0;
 }
 
-static DisplayChangeListener* vga_screen_dump_init(DisplayState *ds)
-{
-    DisplayChangeListener *dcl;
-
-    dcl = g_malloc0(sizeof(DisplayChangeListener));
-    dcl->dpy_update = vga_save_dpy_update;
-    dcl->dpy_resize = vga_save_dpy_resize;
-    dcl->dpy_refresh = vga_save_dpy_refresh;
-    register_displaychangelistener(ds, dcl);
-    return dcl;
-}
-
 /* save the vga display in a PPM image even if no display is
    available */
 static void vga_screen_dump(void *opaque, const char *filename)
 {
     VGACommonState *s = opaque;
 
-    if (!screen_dump_dcl)
-        screen_dump_dcl = vga_screen_dump_init(s->ds);
-
-    screen_dump_filename = filename;
     vga_invalidate_display(s);
     vga_hw_update();
-    screen_dump_filename = NULL;
+    ppm_save(filename, s->ds->surface);
 }

> cheers,
>   Gerd

  reply	other threads:[~2012-02-22 12:26 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-02-21 21:39 [Qemu-devel] [RFC v4 0/9] qxl: fix hangs caused by qxl_render_update Alon Levy
2012-02-21 21:39 ` [Qemu-devel] [RFC v4 1/9] console: don't call console_select unnecessarily Alon Levy
2012-02-21 21:39 ` [Qemu-devel] [RFC v4 2/9] sdl: remove NULL check, g_malloc0 can't fail Alon Levy
2012-02-21 21:39 ` [Qemu-devel] [RFC v4 3/9] qxl: drop qxl_spice_update_area_async definition Alon Levy
2012-02-21 21:39 ` [Qemu-devel] [RFC v4 4/9] qxl: screen_dump in vga: do a single ppm_save Alon Levy
2012-02-22 11:10   ` Gerd Hoffmann
2012-02-22 12:26     ` Alon Levy [this message]
2012-02-22 13:58       ` Gerd Hoffmann
2012-02-22 14:25         ` [Qemu-devel] [Spice-devel] " Alon Levy
2012-02-22 14:37           ` Gerd Hoffmann
2012-02-22 15:27             ` Alon Levy
2012-02-21 21:39 ` [Qemu-devel] [RFC v4 5/9] qxl: require spice >= 0.8.2 Alon Levy
2012-02-22 11:11   ` Gerd Hoffmann
2012-02-21 21:39 ` [Qemu-devel] [RFC v4 6/9] qxl: remove flipped Alon Levy
2012-02-22 11:18   ` Gerd Hoffmann
2012-02-22 12:28     ` Alon Levy
2012-02-22 14:09       ` Gerd Hoffmann
2012-02-22 14:23         ` Alon Levy
2012-02-22 19:00         ` Alon Levy
2012-02-21 21:39 ` [Qemu-devel] [RFC v4 7/9] qxl: introduce QXLCookie Alon Levy
2012-02-22 11:23   ` Gerd Hoffmann
2012-02-21 21:39 ` [Qemu-devel] [RFC v4 8/9] qxl: make qxl_render_update async Alon Levy
2012-02-22 11:41   ` Gerd Hoffmann
2012-02-22 12:30     ` Alon Levy
2012-02-21 21:39 ` [Qemu-devel] [RFC v4 9/9] qxl-render: call ppm_save on bh Alon Levy
2012-02-22 11:46   ` Gerd Hoffmann
2012-02-22 12:34     ` Alon Levy
2012-02-22 12:45     ` Alon Levy
2012-02-22 18:59     ` Alon Levy
2012-02-21 22:17 ` [Qemu-devel] [Spice-devel] [RFC v4 0/9] qxl: fix hangs caused by qxl_render_update Alon Levy

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=20120222122616.GB607@garlic.redhat.com \
    --to=alevy@redhat.com \
    --cc=elmarco@redhat.com \
    --cc=kraxel@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=spice-devel@freedesktop.org \
    --cc=yhalperi@redhat.com \
    /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).