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

Frediano Ziglio fziglio at redhat.com
Fri Nov 18 17:07:47 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>
> 
> Hi. I can see that client mode is working now however when
> I drag a window or resize one I got 2 pointers instead of 1.
> This happens to me using either remote-viewer or virt-manager.
> With Windows 7 I get a single pointer and client mode working.
> I'm not sure but even with FlexVDI driver you don't have this issue.
> Or is this a first patch and you are going to send another
> to fix the double pointer problem?
> 
> > ---
> >  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,
> 

Small testing of FlexVDI looks like they mainly turn off the client
pointer when a window is moving as apparently in this situation
Windows is rendering the mouse directly.

Frediano


More information about the Spice-devel mailing list