From: Ian Jackson Date: Tue, 4 Aug 2009 14:53:20 +0000 (+0100) Subject: fix vnc screen corruption bugs and viewer exits X-Git-Tag: xen-3.3.2 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;ds=inline;p=qemu-xen-3.3-testing.git fix vnc screen corruption bugs and viewer exits I have been having problems with display corruption using raw encoding. I have also been having issues with the vncviewer client exiting with "rect too big". These problems appear when there are rapid changes to the framebuffer contents. [I've been using "find /" in my tests to generate a lot of text output.] The root cause of both problems appears to be the changing of the underlying framebuffer data during the creation of the update. [Hextile makes multiple passes over the data and gets badly confused if the data changes..] The attached patch pulls the pixel data from the "stable" old_data buffer rather than directly from the (changing) display surface. Submitted-by: Andrew Thomas Signed-off-by: Ian Jackson (cherry picked from commit 99a5a9155284ab47eda2be738be0115aa97ce0ff) cherry picked from commit 55fab1884cf0eae44f06ce97d15c20ca29b8fba2 Conflicts: vnc.c vnchextile.h --- diff --git a/vnc.c b/vnc.c index 01e22e54..4a8f5266 100644 --- a/vnc.c +++ b/vnc.c @@ -525,7 +525,7 @@ static void send_framebuffer_update_raw(VncState *vs, int x, int y, int w, int h vnc_framebuffer_update(vs, x, y, w, h, 0); - row = vs->ds->data + y * vs->ds->linesize + x * vs->depth; + row = vs->old_data + y * vs->ds->linesize + x * vs->depth; for (i = 0; i < h; i++) { vs->write_pixels(vs, row, w * vs->depth); row += vs->ds->linesize; diff --git a/vnchextile.h b/vnchextile.h index 29b74840..b921ff60 100644 --- a/vnchextile.h +++ b/vnchextile.h @@ -13,7 +13,7 @@ static void CONCAT(send_hextile_tile_, NAME)(VncState *vs, void *last_fg_, int *has_bg, int *has_fg) { - uint8_t *row = (vs->ds->data + y * vs->ds->linesize + x * vs->depth); + uint8_t *row = (vs->old_data + y * vs->ds->linesize + x * vs->depth); pixel_t *irow = (pixel_t *)row; int j, i; pixel_t *last_bg = (pixel_t *)last_bg_;