In hw/xenfb.c, xenfb_guest_copy() function doesn't handle xenfb->depth=32 case. When xenfb->depth=32, it will report error and won't copy data from the guest framebuffer region into QEMU's displaysurface, thus when enter CTRL+ALT+2 to qemu monitor console then CTRL+ALT+1 back to guest X window, the screen cannot be restored.
This patch adds two things: 1. when xenfb->depth equals destination bpp, do not need data translation, simply copy data from guest framebuffer into QEMU's displaysurface. 2. when xenfb->depth and destination bpp differs, add processing for xenfb->depth=32 case.
diff -r e4f337bb97f7 tools/ioemu-qemu-xen/hw/xenfb.c --- a/hw/xenfb.c Wed Oct 20 19:39:28 2010 +0800 +++ b/hw/xenfb.c Wed Oct 20 21:42:37 2010 +0800 @@ -612,6 +612,12 @@ uint8_t *data = ""> if (!is_buffer_shared(xenfb->c.ds->surface)) { + if (xenfb->depth == bpp) { + for (line = y; line < (y+h); line++) { + memcpy (data + (line * linesize) + (x * bpp / 8), xenfb->pixels + xenfb->offset + (line * xenfb->row_stride) + (x * xenfb->depth / 8), w * xenfb->depth / 8); + } + } + else{ switch (xenfb->depth) { case 8: if (bpp == 16) { @@ -631,9 +637,17 @@ oops = 1; } break; + case 32: + if (bpp == 16) { + BLT(uint32_t, uint16_t, 8, 8, 8, 5, 6, 5); + } else { + oops = 1; + } + break; default: oops = 1; } + } } if (oops) /* should not happen */ xen_be_printf(&xenfb->c.xendev, 0, "%s: oops: convert %d -> %d bpp?\n",
|