[Spice-devel] [PATCH qxl-wddm-dod v6 4/4] Fix source buffer mapping in PresentDisplayOnly
Frediano Ziglio
fziglio at redhat.com
Wed Sep 28 11:37:32 UTC 2016
>
> Part of source image mapped by PresentDisplayOnly
> should be big enough to cover all rectangles being
> transferred.
>
> Signed-off-by: Sameeh Jubran <sameeh at daynix.com>
> Signed-off-by: Dmitry Fleytman <dmitry at daynix.com>
> ---
> qxldod/QxlDod.cpp | 28 +++++++++++++++++++++++-----
> qxldod/QxlDod.h | 2 ++
> 2 files changed, 25 insertions(+), 5 deletions(-)
>
> diff --git a/qxldod/QxlDod.cpp b/qxldod/QxlDod.cpp
> index 577b4ff..1f54174 100755
> --- a/qxldod/QxlDod.cpp
> +++ b/qxldod/QxlDod.cpp
> @@ -3772,12 +3772,11 @@ QxlDevice::ExecutePresentDisplayOnly(
> ctx->Mdl = NULL;
> ctx->DisplaySource = this;
>
> - // Alternate between synch and asynch execution, for demonstrating
> - // that a real hardware implementation can do either
> -
> + // Source bitmap is in user mode, must be locked under __try/__except
> + // and mapped to kernel space before use.
> {
> - // Map Source into kernel space, as Blt will be executed by system
> worker thread
> - UINT sizeToMap = ctx->SrcPitch * ctx->SrcHeight;
> + LONG maxHeight = GetMaxSourceMappingHeight(ctx->Moves,
> ctx->NumMoves, ctx->DirtyRect, ctx->NumDirtyRects);
> + UINT sizeToMap = ctx->SrcPitch * maxHeight;
>
> PMDL mdl = IoAllocateMdl((PVOID)SrcAddr, sizeToMap, FALSE, FALSE,
> NULL);
> if(!mdl)
> @@ -4691,6 +4690,25 @@ void QxlDevice::SetMonitorConfig(QXLHead *
> monitor_config)
> AsyncIo(QXL_IO_MONITORS_CONFIG_ASYNC, 0);
> }
>
> +LONG QxlDevice::GetMaxSourceMappingHeight(D3DKMT_MOVE_RECT* Moves, ULONG
> NumMoves, RECT* DirtyRects, ULONG NumDirtyRects)
> +{
> + LONG maxHeight = 0;
> + if (Moves != NULL) {
> + for (UINT i = 0; i < NumMoves; i++) {
> + const POINT& pSourcePoint = Moves[i].SourcePoint;
> + const RECT& pDestRect = Moves[i].DestRect;
> + maxHeight = MAX(maxHeight, pDestRect.bottom - pDestRect.top +
> pSourcePoint.y);
> + }
> + }
> + if (DirtyRects != NULL) {
> + for (UINT i = 0; i < NumDirtyRects; i++) {
> + const RECT& pDirtyRect = DirtyRects[i];
> + maxHeight = MAX(maxHeight, pDirtyRect.bottom);
> + }
> + }
> + return maxHeight;
> +}
> +
> QXL_PAGED
> NTSTATUS QxlDevice::Escape(_In_ CONST DXGKARG_ESCAPE* pEscape)
> {
> diff --git a/qxldod/QxlDod.h b/qxldod/QxlDod.h
> index ac33faa..f4a115b 100755
> --- a/qxldod/QxlDod.h
> +++ b/qxldod/QxlDod.h
> @@ -647,6 +647,8 @@ private:
> QXL_PAGED
> void SetMonitorConfig(QXLHead* monitor_config);
>
> + static LONG GetMaxSourceMappingHeight(D3DKMT_MOVE_RECT* Moves, ULONG
> NumMoves, RECT* DirtyRects, ULONG NumDirtyRects);
> +
> private:
> PUCHAR m_IoBase;
> BOOLEAN m_IoMapped;
Acked-by: Frediano Ziglio <fziglio at redhat.com>
Frediano
More information about the Spice-devel
mailing list