From 27713ea7653798c75d371545a8148e5526d27112 Mon Sep 17 00:00:00 2001 From: Sameeh Jubran Date: Thu, 16 Jun 2016 17:04:50 +0300 Subject: [PATCH] Fixing Move rectangles implementation As documented in MSDN, "DxgkDdiPresentDisplayOnly" should copy each "move rectangle" from a given source point in the source buffer to the destination. The current implementation doesn't take into account the shift of the given source point at all. This patch fixies the issue. Signed-off-by: Sameeh Jubran Signed-off-by: Dmitry Fleytman Acked-by: Frediano Ziglio --- qxldod/QxlDod.cpp | 19 +++++++++++++------ qxldod/QxlDod.h | 3 ++- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/qxldod/QxlDod.cpp b/qxldod/QxlDod.cpp index e9eb199..6a73690 100755 --- a/qxldod/QxlDod.cpp +++ b/qxldod/QxlDod.cpp @@ -3752,20 +3752,26 @@ QxlDevice::ExecutePresentDisplayOnly( BltBits(&DstBltInfo, &SrcBltInfo, 1, - pDestRect); + pDestRect, + pSourcePoint); } // Copy all the dirty rects from source image to video frame buffer. for (UINT i = 0; i < ctx->NumDirtyRects; i++) { RECT* pDirtyRect = &ctx->DirtyRect[i]; - DbgPrint(TRACE_LEVEL_INFORMATION, ("--- %d pDirtyRect->bottom = %ld, pDirtyRect->left = %ld, pDirtyRect->right = %ld, pDirtyRect->top = %ld\n", + POINT sourcePoint; + sourcePoint.x = pDirtyRect->left; + sourcePoint.y = pDirtyRect->top; + + DbgPrint(TRACE_LEVEL_INFORMATION, ("--- %d pDirtyRect->bottom = %ld, pDirtyRect->left = %ld, pDirtyRect->right = %ld, pDirtyRect->top = %ld\n", i, pDirtyRect->bottom, pDirtyRect->left, pDirtyRect->right, pDirtyRect->top)); BltBits(&DstBltInfo, &SrcBltInfo, 1, - pDirtyRect); + pDirtyRect, + &sourcePoint); } // Unmap unmap and unlock the pages. @@ -4170,7 +4176,8 @@ VOID QxlDevice::BltBits ( BLT_INFO* pDst, CONST BLT_INFO* pSrc, UINT NumRects, - _In_reads_(NumRects) CONST RECT *pRects) + _In_reads_(NumRects) CONST RECT *pRects, + POINT* pSourcePoint) { QXLDrawable *drawable; Resource *image_res; @@ -4233,8 +4240,8 @@ VOID QxlDevice::BltBits ( internal->image.bitmap.stride = line_size; UINT8* src = (UINT8*)pSrc->pBits+ - (pRect->top) * pSrc->Pitch + - (pRect->left * 4); + (pSourcePoint->y) * pSrc->Pitch + + (pSourcePoint->x * 4); UINT8* src_end = src - pSrc->Pitch; src += pSrc->Pitch * (height - 1); UINT8* dest = chunk->data; diff --git a/qxldod/QxlDod.h b/qxldod/QxlDod.h index 8675e53..b9b793a 100755 --- a/qxldod/QxlDod.h +++ b/qxldod/QxlDod.h @@ -470,7 +470,8 @@ protected: VOID BltBits (BLT_INFO* pDst, CONST BLT_INFO* pSrc, UINT NumRects, - _In_reads_(NumRects) CONST RECT *pRects); + _In_reads_(NumRects) CONST RECT *pRects, + POINT* pSourcePoint); QXLDrawable *Drawable(UINT8 type, CONST RECT *area, CONST RECT *clip,