[Spice-devel] [PATCH] qxl-wddm-dod: Enable hardware pointer acceleration

Yuri Benditovich yuri.benditovich at daynix.com
Fri Nov 18 13:49:56 UTC 2016


Windows disables hw pointer acceleration and draws the cursor
in frame buffer if the driver does not report pointer capabilities
in QueryAdapterInfo. In this mode OS usually does not send pointer
commands to the driver or does it with pointer set to invisible
state. This mode of operation consumes CPU time and device-to-host
traffic. Now we enable pointer hardware acceleration.

Signed-off-by: Yuri Benditovich <yuri.benditovich at daynix.com>
---
 qxldod/QxlDod.cpp | 30 +++++++++++++-----------------
 qxldod/QxlDod.h   |  3 ---
 2 files changed, 13 insertions(+), 20 deletions(-)

diff --git a/qxldod/QxlDod.cpp b/qxldod/QxlDod.cpp
index 85343e4..724e89f 100755
--- a/qxldod/QxlDod.cpp
+++ b/qxldod/QxlDod.cpp
@@ -406,12 +406,10 @@ NTSTATUS QxlDod::QueryAdapterInfo(_In_ CONST DXGKARG_QUERYADAPTERINFO* pQueryAda
             pDriverCaps->WDDMVersion = DXGKDDI_WDDMv1_2;
             pDriverCaps->HighestAcceptableAddress.QuadPart = -1;
 
-            if (m_pHWDevice->EnablePointer()) {
-                pDriverCaps->MaxPointerWidth  = POINTER_SIZE;
-                pDriverCaps->MaxPointerHeight = POINTER_SIZE;
-                pDriverCaps->PointerCaps.Monochrome = 1;
-                pDriverCaps->PointerCaps.Color = 1;
-            }
+            pDriverCaps->MaxPointerWidth  = POINTER_SIZE;
+            pDriverCaps->MaxPointerHeight = POINTER_SIZE;
+            pDriverCaps->PointerCaps.Monochrome = 1;
+            pDriverCaps->PointerCaps.Color = 1;
 
             pDriverCaps->SupportNonVGA = TRUE;
 
@@ -4428,7 +4426,7 @@ NTSTATUS  QxlDevice::SetPointerShape(_In_ CONST DXGKARG_SETPOINTERSHAPE* pSetPoi
                                  pSetPointerShape->Height,
                                  pSetPointerShape->XHot,
                                  pSetPointerShape->YHot));
-    if (!EnablePointer() || (!pSetPointerShape->Flags.Monochrome && !pSetPointerShape->Flags.Color))
+    if (!pSetPointerShape->Flags.Monochrome && !pSetPointerShape->Flags.Color)
         return STATUS_UNSUCCESSFUL;
 
     QXLCursorCmd *cursor_cmd;
@@ -4508,17 +4506,15 @@ NTSTATUS QxlDevice::SetPointerPosition(_In_ CONST DXGKARG_SETPOINTERPOSITION* pS
                                  pSetPointerPosition->VidPnSourceId,
                                  pSetPointerPosition->X,
                                  pSetPointerPosition->Y));
-    if (EnablePointer()) {
-        QXLCursorCmd *cursor_cmd = CursorCmd();
-        if (pSetPointerPosition->X < 0) {
-           cursor_cmd->type = QXL_CURSOR_HIDE;
-        } else {
-           cursor_cmd->type = QXL_CURSOR_MOVE;
-           cursor_cmd->u.position.x = (INT16)pSetPointerPosition->X;
-           cursor_cmd->u.position.y = (INT16)pSetPointerPosition->Y;
-        }
-        PushCursorCmd(cursor_cmd);
+    QXLCursorCmd *cursor_cmd = CursorCmd();
+    if (pSetPointerPosition->X < 0) {
+        cursor_cmd->type = QXL_CURSOR_HIDE;
+    } else {
+        cursor_cmd->type = QXL_CURSOR_MOVE;
+        cursor_cmd->u.position.x = (INT16)pSetPointerPosition->X;
+        cursor_cmd->u.position.y = (INT16)pSetPointerPosition->Y;
     }
+    PushCursorCmd(cursor_cmd);
     DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
     return STATUS_SUCCESS;
 }
diff --git a/qxldod/QxlDod.h b/qxldod/QxlDod.h
index 1d5cf53..8503f29 100755
--- a/qxldod/QxlDod.h
+++ b/qxldod/QxlDod.h
@@ -245,7 +245,6 @@ public:
     USHORT GetModeNumber(USHORT idx) {return m_ModeNumbers[idx];}
     USHORT GetCurrentModeIndex(void) {return m_CurrentMode;}
     VOID SetCurrentModeIndex(USHORT idx) {m_CurrentMode = idx;}
-    virtual BOOLEAN EnablePointer(void) = 0;
     virtual NTSTATUS ExecutePresentDisplayOnly(_In_ BYTE*             DstAddr,
                                  _In_ UINT              DstBitPerPixel,
                                  _In_ BYTE*             SrcAddr,
@@ -289,7 +288,6 @@ public:
     NTSTATUS SetPowerState(DEVICE_POWER_STATE DevicePowerState, DXGK_DISPLAY_INFORMATION* pDispInfo);
     NTSTATUS HWInit(PCM_RESOURCE_LIST pResList, DXGK_DISPLAY_INFORMATION* pDispInfo);
     NTSTATUS HWClose(void);
-    BOOLEAN EnablePointer(void) { return TRUE; }
     NTSTATUS ExecutePresentDisplayOnly(_In_ BYTE*             DstAddr,
                                  _In_ UINT              DstBitPerPixel,
                                  _In_ BYTE*             SrcAddr,
@@ -464,7 +462,6 @@ public:
     NTSTATUS SetPowerState(DEVICE_POWER_STATE DevicePowerState, DXGK_DISPLAY_INFORMATION* pDispInfo);
     NTSTATUS HWInit(PCM_RESOURCE_LIST pResList, DXGK_DISPLAY_INFORMATION* pDispInfo);
     NTSTATUS HWClose(void);
-    BOOLEAN EnablePointer(void) { return FALSE; }
     NTSTATUS ExecutePresentDisplayOnly(_In_ BYTE*             DstAddr,
                     _In_ UINT              DstBitPerPixel,
                     _In_ BYTE*             SrcAddr,
-- 
2.7.0.windows.1



More information about the Spice-devel mailing list