[Spice-devel] [PATCH qxl-wddm-dod 22/26] Fix source buffer mapping in PresentDisplayOnly
Sameeh Jubran
sameeh at daynix.com
Tue Aug 9 15:31:27 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 a2d768c..0492581 100755
--- a/qxldod/QxlDod.cpp
+++ b/qxldod/QxlDod.cpp
@@ -3642,12 +3642,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)
@@ -4522,6 +4521,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++) {
+ POINT* pSourcePoint = &Moves[i].SourcePoint;
+ RECT* pDestRect = &Moves[i].DestRect;
+ maxHeight = MAX(maxHeight, pDestRect->bottom - pDestRect->top + pSourcePoint->y);
+ }
+ }
+ if (DirtyRects != NULL) {
+ for (UINT i = 0; i < NumDirtyRects; i++) {
+ RECT* pDirtyRect = &DirtyRects[i];
+ maxHeight = MAX(maxHeight, pDirtyRect->bottom);
+ }
+ }
+ return maxHeight;
+}
+
NTSTATUS QxlDevice::Escape(_In_ CONST DXGKARG_ESCAPE* pEscape)
{
PAGED_CODE();
diff --git a/qxldod/QxlDod.h b/qxldod/QxlDod.h
index e5cb410..a60787d 100755
--- a/qxldod/QxlDod.h
+++ b/qxldod/QxlDod.h
@@ -553,6 +553,8 @@ private:
NTSTATUS SetCustomDisplay(QXLEscapeSetCustomDisplay* custom_display);
void SetMonitorConfig(QXLHead* monitor_config);
+ LONG static GetMaxSourceMappingHeight(D3DKMT_MOVE_RECT* Moves, ULONG NumMoves, RECT* DirtyRects, ULONG NumDirtyRects);
+
private:
PUCHAR m_IoBase;
BOOLEAN m_IoMapped;
--
2.7.0.windows.1
More information about the Spice-devel
mailing list