[Spice-devel] [PATCH 02/12] qxl-wddm-dod: Use rendering offload thread
Christophe de Dinechin
cdupontd at redhat.com
Tue Mar 21 14:13:09 UTC 2017
> On 21 Mar 2017, at 14:52, Christophe de Dinechin <cdupontd at redhat.com> wrote:
>
>>
>> On 21 Mar 2017, at 13:59, Yuri Benditovich <yuri.benditovich at daynix.com <mailto:yuri.benditovich at daynix.com>> wrote:
>>
>>
>>
>> On Mon, Mar 20, 2017 at 2:08 PM, Frediano Ziglio <fziglio at redhat.com <mailto:fziglio at redhat.com>> wrote:
>> >
>> > 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 <mailto:javier.celaya at flexvdi.com>>
>> > Signed-off-by: Yuri Benditovich <yuri.benditovich at daynix.com <mailto: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;
>>
>> Current commit intentionally does not change this, to make clear what is changed.
>
> Good.
>
> If we use a non-paged placement new, shouldn’t we use a corresponding placement delete?
Just checked by looking at the Microsoft sample code. They use plain delete. This still seems wrong to me. The underlying pool is not the same. It probably works because the pools share the same internal layout, so the same operator delete works in both cases.
>
>
>> Without changes in the code we can't just allocate less memory, as trailing RECT structures are used for
>> unneeded copy from parameters.
>> Removal of this completely unneeded 'ctx' is planned for further commits after all the HCK-related work is done.
>
>>
>>
>> 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)
>>
>> No problem, prefer to do it on later commits.
>>
>>
>> > 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
>>
>> _______________________________________________
>> Spice-devel mailing list
>> Spice-devel at lists.freedesktop.org <mailto:Spice-devel at lists.freedesktop.org>
>> https://lists.freedesktop.org/mailman/listinfo/spice-devel <https://lists.freedesktop.org/mailman/listinfo/spice-devel>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org <mailto:Spice-devel at lists.freedesktop.org>
> https://lists.freedesktop.org/mailman/listinfo/spice-devel <https://lists.freedesktop.org/mailman/listinfo/spice-devel>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20170321/e2490472/attachment-0001.html>
More information about the Spice-devel
mailing list