fix screendump (Stefano Stabellini)

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.
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 <stefano.stabellini@eu.citrix.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>



git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6345 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
aliguori 2009-01-16 19:07:10 +00:00
parent 3023f3329d
commit e07d630ad2
3 changed files with 29 additions and 22 deletions

View File

@ -2533,8 +2533,6 @@ int pci_vga_init(PCIBus *bus, uint8_t *vga_ram_base,
/********************************************************/ /********************************************************/
/* vga screen dump */ /* vga screen dump */
static int vga_save_w, vga_save_h;
static void vga_save_dpy_update(DisplayState *s, static void vga_save_dpy_update(DisplayState *s,
int x, int y, int w, int h) 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 ppm_save(const char *filename, struct DisplaySurface *ds)
int w, int h, int linesize)
{ {
FILE *f; FILE *f;
uint8_t *d, *d1; uint8_t *d, *d1;
unsigned int v; uint32_t v;
int y, x; int y, x;
uint8_t r, g, b;
f = fopen(filename, "wb"); f = fopen(filename, "wb");
if (!f) if (!f)
return -1; return -1;
fprintf(f, "P6\n%d %d\n%d\n", fprintf(f, "P6\n%d %d\n%d\n",
w, h, 255); ds->width, ds->height, 255);
d1 = data; d1 = ds->data;
for(y = 0; y < h; y++) { for(y = 0; y < ds->height; y++) {
d = d1; d = d1;
for(x = 0; x < w; x++) { for(x = 0; x < ds->width; x++) {
v = *(uint32_t *)d; if (ds->pf.bits_per_pixel == 32)
fputc((v >> 16) & 0xff, f); v = *(uint32_t *)d;
fputc((v >> 8) & 0xff, f); else
fputc((v) & 0xff, f); v = (uint32_t) (*(uint16_t *)d);
d += 4; 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); fclose(f);
return 0; 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_resize = vga_save_dpy_resize;
dcl.dpy_refresh = vga_save_dpy_refresh; dcl.dpy_refresh = vga_save_dpy_refresh;
register_displaychangelistener(ds, &dcl); register_displaychangelistener(ds, &dcl);
ds->surface = qemu_create_displaysurface(ds_get_width(saved_ds), ds->surface = qemu_create_displaysurface(w, h, 32, 4 * w);
ds_get_height(saved_ds), 32, 4 * ds_get_width(saved_ds));
s->ds = ds; s->ds = ds;
s->graphic_mode = -1; s->graphic_mode = -1;
vga_update_display(s); vga_update_display(s);
ppm_save(filename, ds_get_data(ds), vga_save_w, vga_save_h, ppm_save(filename, ds->surface);
ds_get_linesize(ds));
qemu_free_displaysurface(ds->surface); qemu_free_displaysurface(ds->surface);
s->ds = saved_ds; s->ds = saved_ds;

View File

@ -202,8 +202,7 @@ void vga_dirty_log_stop(VGAState *s);
uint32_t vga_mem_readb(void *opaque, target_phys_addr_t addr); 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_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val);
void vga_invalidate_scanlines(VGAState *s, int y1, int y2); void vga_invalidate_scanlines(VGAState *s, int y1, int y2);
int ppm_save(const char *filename, uint8_t *data, int ppm_save(const char *filename, struct DisplaySurface *ds);
int w, int h, int linesize);
void vga_draw_cursor_line_8(uint8_t *d1, const uint8_t *src1, void vga_draw_cursor_line_8(uint8_t *d1, const uint8_t *src1,
int poffset, int w, int poffset, int w,

View File

@ -975,7 +975,10 @@ static void vmsvga_screen_dump(void *opaque, const char *filename)
} }
if (s->depth == 32) { 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);
} }
} }