From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LNtLz-0005uB-1M for qemu-devel@nongnu.org; Fri, 16 Jan 2009 13:23:35 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LNtLx-0005t8-33 for qemu-devel@nongnu.org; Fri, 16 Jan 2009 13:23:34 -0500 Received: from [199.232.76.173] (port=53715 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LNtLw-0005sT-Hs for qemu-devel@nongnu.org; Fri, 16 Jan 2009 13:23:32 -0500 Received: from qw-out-1920.google.com ([74.125.92.149]:48243) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LNtLw-00021d-62 for qemu-devel@nongnu.org; Fri, 16 Jan 2009 13:23:32 -0500 Received: by qw-out-1920.google.com with SMTP id 5so373515qwc.4 for ; Fri, 16 Jan 2009 10:23:31 -0800 (PST) Message-ID: <4970D097.5050709@codemonkey.ws> Date: Fri, 16 Jan 2009 12:23:19 -0600 From: Anthony Liguori MIME-Version: 1.0 Subject: Re: [Qemu-devel] [PATCH] fix screendump References: <4970CAEC.9060702@eu.citrix.com> In-Reply-To: <4970CAEC.9060702@eu.citrix.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Stefano Stabellini wrote: > Hi all, > this patch fixes the screendump functionality that was recently broken; > it must be applied *after* PATCH 5, 6 and 7 of the original displaystate > change patch series. > Hrm, I dislike that, this series is really not bisecting friendly. What's the decision on the PPC fix? Are we going with Laurent's fix or yours? I'll start testing the rest of the series and the new patches. Regards, Anthony Liguori > In fact the other patches make much easier to solve the screendump > problem because they make the console switching mechanism more robust. > > Signed-off-by: Stefano Stabellini > > diff --git a/hw/vga.c b/hw/vga.c > index f376ca6..50bd85f 100644 > --- a/hw/vga.c > +++ b/hw/vga.c > @@ -2533,8 +2533,6 @@ int pci_vga_init(PCIBus *bus, uint8_t *vga_ram_base, > /********************************************************/ > /* vga screen dump */ > > -static int vga_save_w, vga_save_h; > - > static void vga_save_dpy_update(DisplayState *s, > int x, int y, int w, int h) > { > @@ -2548,30 +2546,39 @@ static void vga_save_dpy_refresh(DisplayState *s) > { > } > > -int ppm_save(const char *filename, uint8_t *data, > - int w, int h, int linesize) > +int ppm_save(const char *filename, struct DisplaySurface *ds) > { > FILE *f; > uint8_t *d, *d1; > - unsigned int v; > + uint32_t v; > int y, x; > + uint8_t r, g, b; > > f = fopen(filename, "wb"); > if (!f) > return -1; > fprintf(f, "P6\n%d %d\n%d\n", > - w, h, 255); > - d1 = data; > - for(y = 0; y < h; y++) { > + ds->width, ds->height, 255); > + d1 = ds->data; > + for(y = 0; y < ds->height; y++) { > d = d1; > - for(x = 0; x < w; x++) { > - v = *(uint32_t *)d; > - fputc((v >> 16) & 0xff, f); > - fputc((v >> 8) & 0xff, f); > - fputc((v) & 0xff, f); > - d += 4; > + for(x = 0; x < ds->width; x++) { > + if (ds->pf.bits_per_pixel == 32) > + v = *(uint32_t *)d; > + else > + v = (uint32_t) (*(uint16_t *)d); > + r = ((v >> ds->pf.rshift) & ds->pf.rmax) * 256 / > + (ds->pf.rmax + 1); > + g = ((v >> ds->pf.gshift) & ds->pf.gmax) * 256 / > + (ds->pf.gmax + 1); > + b = ((v >> ds->pf.bshift) & ds->pf.bmax) * 256 / > + (ds->pf.bmax + 1); > + fputc(r, f); > + fputc(g, f); > + fputc(b, f); > + d += ds->pf.bytes_per_pixel; > } > - d1 += linesize; > + d1 += ds->linesize; > } > fclose(f); > return 0; > @@ -2613,15 +2620,13 @@ static void vga_screen_dump_common(VGAState *s, const char *filename, > dcl.dpy_resize = vga_save_dpy_resize; > dcl.dpy_refresh = vga_save_dpy_refresh; > register_displaychangelistener(ds, &dcl); > - ds->surface = qemu_create_displaysurface(ds_get_width(saved_ds), > - ds_get_height(saved_ds), 32, 4 * ds_get_width(saved_ds)); > + ds->surface = qemu_create_displaysurface(w, h, 32, 4 * w); > > s->ds = ds; > s->graphic_mode = -1; > vga_update_display(s); > > - ppm_save(filename, ds_get_data(ds), vga_save_w, vga_save_h, > - ds_get_linesize(ds)); > + ppm_save(filename, ds->surface); > > qemu_free_displaysurface(ds->surface); > s->ds = saved_ds; > diff --git a/hw/vga_int.h b/hw/vga_int.h > index 5d06eed..f97e98f 100644 > --- a/hw/vga_int.h > +++ b/hw/vga_int.h > @@ -202,8 +202,7 @@ void vga_dirty_log_stop(VGAState *s); > uint32_t vga_mem_readb(void *opaque, target_phys_addr_t addr); > void vga_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val); > void vga_invalidate_scanlines(VGAState *s, int y1, int y2); > -int ppm_save(const char *filename, uint8_t *data, > - int w, int h, int linesize); > +int ppm_save(const char *filename, struct DisplaySurface *ds); > > void vga_draw_cursor_line_8(uint8_t *d1, const uint8_t *src1, > int poffset, int w, > diff --git a/hw/vmware_vga.c b/hw/vmware_vga.c > index 5b60074..950a98c 100644 > --- a/hw/vmware_vga.c > +++ b/hw/vmware_vga.c > @@ -975,7 +975,10 @@ static void vmsvga_screen_dump(void *opaque, const char *filename) > } > > if (s->depth == 32) { > - ppm_save(filename, s->vram, s->width, s->height, ds_get_linesize(s->ds)); > + DisplaySurface *ds = qemu_create_displaysurface_from(s->width, > + s->height, 32, ds_get_linesize(s->ds), s->vram); > + ppm_save(filename, ds); > + qemu_free(ds); > } > } > > > >