From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:49849) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S2614-0006Ri-Mi for qemu-devel@nongnu.org; Mon, 27 Feb 2012 14:13:47 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1S2613-0007c4-DA for qemu-devel@nongnu.org; Mon, 27 Feb 2012 14:13:46 -0500 Received: from mx1.redhat.com ([209.132.183.28]:41966) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S2613-0007bb-52 for qemu-devel@nongnu.org; Mon, 27 Feb 2012 14:13:45 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q1RJDhnQ012323 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 27 Feb 2012 14:13:43 -0500 Date: Mon, 27 Feb 2012 21:13:37 +0200 From: Alon Levy Message-ID: <20120227191337.GM7395@garlic.redhat.com> References: <1330337410-21905-1-git-send-email-kraxel@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1330337410-21905-1-git-send-email-kraxel@redhat.com> Subject: Re: [Qemu-devel] [PATCH] qxl: properly handle upright and non-shared surfaces List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Gerd Hoffmann Cc: qemu-devel@nongnu.org On Mon, Feb 27, 2012 at 11:10:10AM +0100, Gerd Hoffmann wrote: > Although qxl creates a shared displaysurface when the qxl surface is > upright and doesn't need to be flipped there is no guarantee that the > surface doesn't become unshared for some reason. Rename qxl_flip to > qxl_blit and fix it to handle both flip and non-flip cases. Reviewed-by: Alon Levy just a few nitpicks. > > Signed-off-by: Gerd Hoffmann > --- > hw/qxl-render.c | 20 +++++++++++++------- > 1 files changed, 13 insertions(+), 7 deletions(-) > > diff --git a/hw/qxl-render.c b/hw/qxl-render.c > index f323a4d..25857f6 100644 > --- a/hw/qxl-render.c > +++ b/hw/qxl-render.c > @@ -21,25 +21,31 @@ > > #include "qxl.h" > > -static void qxl_flip(PCIQXLDevice *qxl, QXLRect *rect) > +static void qxl_blit(PCIQXLDevice *qxl, QXLRect *rect) > { > uint8_t *src; > uint8_t *dst = qxl->vga.ds->surface->data; > int len, i; > > - if (qxl->guest_primary.qxl_stride > 0) { > + if (is_buffer_shared(qxl->vga.ds->surface)) { ok, /me regrets not liking this predicate and using qxl_stride > 0 instead. > return; > } > if (!qxl->guest_primary.data) { > dprint(qxl, 1, "%s: initializing guest_primary.data\n", __func__); > qxl->guest_primary.data = memory_region_get_ram_ptr(&qxl->vga.vram); > } > - dprint(qxl, 1, "%s: stride %d, [%d, %d, %d, %d]\n", __func__, > + dprint(qxl, 2, "%s: stride %d, [%d, %d, %d, %d]\n", __func__, You know 2 is used right now for high frequency stuff, like interface_get_command? I think this should be lower. Anyway, not a big deal. > qxl->guest_primary.qxl_stride, > rect->left, rect->right, rect->top, rect->bottom); > src = qxl->guest_primary.data; > - src += (qxl->guest_primary.surface.height - rect->top - 1) * > - qxl->guest_primary.abs_stride; > + if (qxl->guest_primary.qxl_stride < 0) { > + /* qxl surface is upside down, walk src scanlines > + * in reverse order to flip it */ This passed checkpatch.pl? I demand equal mistreatment! :) > + src += (qxl->guest_primary.surface.height - rect->top - 1) * > + qxl->guest_primary.abs_stride; > + } else { > + src += rect->top * qxl->guest_primary.abs_stride; > + } > dst += rect->top * qxl->guest_primary.abs_stride; > src += rect->left * qxl->guest_primary.bytes_pp; > dst += rect->left * qxl->guest_primary.bytes_pp; > @@ -48,7 +54,7 @@ static void qxl_flip(PCIQXLDevice *qxl, QXLRect *rect) > for (i = rect->top; i < rect->bottom; i++) { > memcpy(dst, src, len); > dst += qxl->guest_primary.abs_stride; > - src -= qxl->guest_primary.abs_stride; > + src += qxl->guest_primary.qxl_stride; > } > } > > @@ -132,7 +138,7 @@ static void qxl_render_update_area_unlocked(PCIQXLDevice *qxl) > if (qemu_spice_rect_is_empty(qxl->dirty+i)) { > break; > } > - qxl_flip(qxl, qxl->dirty+i); > + qxl_blit(qxl, qxl->dirty+i); > dpy_update(vga->ds, > qxl->dirty[i].left, qxl->dirty[i].top, > qxl->dirty[i].right - qxl->dirty[i].left, > -- > 1.7.1 > >