[Spice-devel] [PATCH qxl-wddm-dod] Implements screen to screen move correctly
Frediano Ziglio
fziglio at redhat.com
Mon Dec 5 12:51:43 UTC 2016
ping
Maybe this requires some follow ups for VgaDevice and
possibly avoinind taking into account moves during mapping
computation.
Frediano
>
> Doing some fast check on Windows 8.1 you could note that
> moving windows you got a weird effect were windows were a
> bit misaligned.
> As documented in DXGKARG_PRESENT_DISPLAYONLY page
> NumMoves/pMoves fields point to an array of screen-to-screen
> moves while our code implemented them as an image drawing
> (the same implementation of dirty rects) causing the weird
> effect mentioned.
> This patch implement the moves using QXL_COPY_BITS operation
> instead of a QXL_DRAW_COPY fixing the issue and avoiding sending
> image to the server making the move/scroll operations on the
> guest faster (and taking less bandwidth).
> It seems that Windows 10 doesn't send the move commands but
> instead send only dirty rects so you can't note this problem
> using Windows 10.
>
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
> qxldod/QxlDod.cpp | 26 +++++++++++++++++++++-----
> qxldod/QxlDod.h | 1 +
> 2 files changed, 22 insertions(+), 5 deletions(-)
>
> diff --git a/qxldod/QxlDod.cpp b/qxldod/QxlDod.cpp
> index 68e3383..7adbec4 100755
> --- a/qxldod/QxlDod.cpp
> +++ b/qxldod/QxlDod.cpp
> @@ -3738,11 +3738,7 @@ QxlDevice::ExecutePresentDisplayOnly(
> DbgPrint(TRACE_LEVEL_INFORMATION, ("--- %d SourcePoint.x = %ld,
> SourcePoint.y = %ld, DestRect.bottom = %ld, DestRect.left = %ld,
> DestRect.right = %ld, DestRect.top = %ld\n",
> i , pSourcePoint->x, pSourcePoint->y, pDestRect->bottom,
> pDestRect->left, pDestRect->right, pDestRect->top));
>
> - BltBits(&DstBltInfo,
> - &SrcBltInfo,
> - 1,
> - pDestRect,
> - pSourcePoint);
> + CopyBits(*pDestRect, *pSourcePoint);
> }
>
> // Copy all the dirty rects from source image to video frame buffer.
> @@ -4184,6 +4180,26 @@ VOID QxlDevice::SetImageId(InternalImage *internal,
> }
> }
>
> +void QxlDevice::CopyBits(const RECT& rect, const POINT& sourcePoint)
> +{
> + PAGED_CODE();
> + QXLDrawable *drawable;
> +
> + DbgPrint(TRACE_LEVEL_VERBOSE, ("---> %s device %d\n",
> __FUNCTION__,m_Id));
> +
> + if (!(drawable = Drawable(QXL_COPY_BITS, &rect, NULL, 0))) {
> + DbgPrint(TRACE_LEVEL_ERROR, ("Cannot get Drawable.\n"));
> + return;
> + }
> +
> + drawable->u.copy_bits.src_pos.x = sourcePoint.x;
> + drawable->u.copy_bits.src_pos.y = sourcePoint.y;
> +
> + PushDrawable(drawable);
> +
> + DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
> +}
> +
> VOID QxlDevice::BltBits (
> BLT_INFO* pDst,
> CONST BLT_INFO* pSrc,
> diff --git a/qxldod/QxlDod.h b/qxldod/QxlDod.h
> index b151484..324c3d6 100755
> --- a/qxldod/QxlDod.h
> +++ b/qxldod/QxlDod.h
> @@ -487,6 +487,7 @@ protected:
> UINT NumRects,
> _In_reads_(NumRects) CONST RECT *pRects,
> POINT* pSourcePoint);
> + void QxlDevice::CopyBits(const RECT& rect, const POINT& sourcePoint);
> QXLDrawable *Drawable(UINT8 type,
> CONST RECT *area,
> CONST RECT *clip,
More information about the Spice-devel
mailing list