[Spice-devel] [PATCH 02/12] qxl-wddm-dod: Use rendering offload thread
Frediano Ziglio
fziglio at redhat.com
Mon Mar 20 12:08:02 UTC 2017
>
> Instead of sending drawable commands down from presentation
> callback, collect drawables objects and pass them to dedicated
> thread for processing. This reduce peak load of presentation
> callback.
>
> Signed-off-by: Javier Celaya <javier.celaya at flexvdi.com>
> Signed-off-by: Yuri Benditovich <yuri.benditovich at daynix.com>
> ---
> qxldod/QxlDod.cpp | 43 +++++++++++++++++++++++++++++++++----------
> qxldod/QxlDod.h | 4 ++--
> 2 files changed, 35 insertions(+), 12 deletions(-)
>
> diff --git a/qxldod/QxlDod.cpp b/qxldod/QxlDod.cpp
> index b952bf9..01de9b3 100755
> --- a/qxldod/QxlDod.cpp
> +++ b/qxldod/QxlDod.cpp
> @@ -3794,11 +3794,20 @@ QxlDevice::ExecutePresentDisplayOnly(
> SIZE_T sizeRects = NumDirtyRects*sizeof(RECT);
> SIZE_T size = sizeof(DoPresentMemory) + sizeMoves + sizeRects;
>
> + QXLDrawable **pDrawables = reinterpret_cast<QXLDrawable **>(new
> (NonPagedPoolNx) BYTE[sizeof(QXLDrawable *)*(NumDirtyRects + NumMoves +
> 1)]);
here would be
QXLDrawable **pDrawables = new (NonPagedPoolNx) QXLDrawable *[NumDirtyRects + NumMoves + 1];
is non paged memory needed? Both functions (producer and consumer) are in paged areas.
> + UINT nIndex = 0;
> +
> + if (!pDrawables)
> + {
> + return STATUS_NO_MEMORY;
> + }
> +
> DoPresentMemory* ctx = reinterpret_cast<DoPresentMemory*>
> (new (NonPagedPoolNx) BYTE[size]);
>
DoPresentMemory* ctx = new (NonPagedPoolNx) DoPresentMemory;
same comments as above
> if (!ctx)
> {
> + delete[] reinterpret_cast<BYTE*>(pDrawables);
delete[] pDrawables;
> return STATUS_NO_MEMORY;
> }
>
> @@ -3828,6 +3837,8 @@ QxlDevice::ExecutePresentDisplayOnly(
> PMDL mdl = IoAllocateMdl((PVOID)SrcAddr, sizeToMap, FALSE, FALSE,
> NULL);
> if(!mdl)
> {
> + delete[] reinterpret_cast<BYTE*>(ctx);
> + delete[] reinterpret_cast<BYTE*>(pDrawables);
similar to above, in this case "delete ctx;"
> return STATUS_INSUFFICIENT_RESOURCES;
> }
>
> @@ -3844,6 +3855,8 @@ QxlDevice::ExecutePresentDisplayOnly(
> {
> Status = GetExceptionCode();
> IoFreeMdl(mdl);
> + delete[] reinterpret_cast<BYTE*>(ctx);
> + delete[] reinterpret_cast<BYTE*>(pDrawables);
ditto
> return Status;
> }
>
> @@ -3857,6 +3870,8 @@ QxlDevice::ExecutePresentDisplayOnly(
> Status = STATUS_INSUFFICIENT_RESOURCES;
> MmUnlockPages(mdl);
> IoFreeMdl(mdl);
> + delete[] reinterpret_cast<BYTE*>(ctx);
> + delete[] reinterpret_cast<BYTE*>(pDrawables);
ditto
> return Status;
> }
>
> @@ -3922,7 +3937,9 @@ 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));
>
> - CopyBits(*pDestRect, *pSourcePoint);
> + pDrawables[nIndex] = CopyBits(*pDestRect, *pSourcePoint);
> +
> + if (pDrawables[nIndex]) nIndex++;
> }
>
> // Copy all the dirty rects from source image to video frame buffer.
> @@ -3936,11 +3953,13 @@ QxlDevice::ExecutePresentDisplayOnly(
> 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,
> + pDrawables[nIndex] = BltBits(&DstBltInfo,
> &SrcBltInfo,
> 1,
> pDirtyRect,
> &sourcePoint);
> +
> + if (pDrawables[nIndex]) nIndex++;
> }
>
> // Unmap unmap and unlock the pages.
> @@ -3951,6 +3970,10 @@ QxlDevice::ExecutePresentDisplayOnly(
> }
> delete [] reinterpret_cast<BYTE*>(ctx);
>
> + pDrawables[nIndex] = NULL;
> +
> + PostToWorkerThread(pDrawables);
> +
> return STATUS_SUCCESS;
> }
>
> @@ -4364,7 +4387,7 @@ VOID QxlDevice::SetImageId(InternalImage *internal,
> }
> }
>
> -void QxlDevice::CopyBits(const RECT& rect, const POINT& sourcePoint)
> +QXLDrawable *QxlDevice::CopyBits(const RECT& rect, const POINT& sourcePoint)
> {
This CopyBits and BltBits are not doing anymore the operation, should
be renamed to something like PrepareCopyBits (better names welcome)
> PAGED_CODE();
> QXLDrawable *drawable;
> @@ -4373,18 +4396,18 @@ void QxlDevice::CopyBits(const RECT& rect, const
> POINT& sourcePoint)
>
> if (!(drawable = Drawable(QXL_COPY_BITS, &rect, NULL, 0))) {
> DbgPrint(TRACE_LEVEL_ERROR, ("Cannot get Drawable.\n"));
> - return;
> + return NULL;
> }
>
> 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__));
> +
> + return drawable;
> }
>
> -VOID QxlDevice::BltBits (
> +QXLDrawable *QxlDevice::BltBits (
> BLT_INFO* pDst,
> CONST BLT_INFO* pSrc,
> UINT NumRects,
> @@ -4407,7 +4430,7 @@ VOID QxlDevice::BltBits (
>
> if (!(drawable = Drawable(QXL_DRAW_COPY, pRects, NULL, 0))) {
> DbgPrint(TRACE_LEVEL_ERROR, ("Cannot get Drawable.\n"));
> - return;
> + return NULL;
> }
>
> CONST RECT* pRect = &pRects[0];
> @@ -4480,9 +4503,9 @@ VOID QxlDevice::BltBits (
> drawable->surfaces_rects[0].top,
> drawable->surfaces_rects[0].bottom,
> drawable->u.copy.src_bitmap));
>
> - PushDrawable(drawable);
> -
> DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
> +
> + return drawable;
> }
>
> VOID QxlDevice::PutBytesAlign(QXLDataChunk **chunk_ptr, UINT8 **now_ptr,
> diff --git a/qxldod/QxlDod.h b/qxldod/QxlDod.h
> index 4a62680..f441f4b 100755
> --- a/qxldod/QxlDod.h
> +++ b/qxldod/QxlDod.h
> @@ -495,12 +495,12 @@ public:
> BOOLEAN IsBIOSCompatible() { return FALSE; }
> protected:
> NTSTATUS GetModeList(DXGK_DISPLAY_INFORMATION* pDispInfo);
> - VOID BltBits (BLT_INFO* pDst,
> + QXLDrawable *BltBits (BLT_INFO* pDst,
> CONST BLT_INFO* pSrc,
> UINT NumRects,
> _In_reads_(NumRects) CONST RECT *pRects,
> POINT* pSourcePoint);
> - void CopyBits(const RECT& rect, const POINT& sourcePoint);
> + QXLDrawable *CopyBits(const RECT& rect, const POINT& sourcePoint);
> QXLDrawable *Drawable(UINT8 type,
> CONST RECT *area,
> CONST RECT *clip,
Frediano
More information about the Spice-devel
mailing list