[Spice-devel] [PATCH qxl-wddm-dod v5 3/7] Use frame buffer in VGA mode only

Frediano Ziglio fziglio at redhat.com
Mon Sep 26 16:02:09 UTC 2016


> 
> Framebuffer should only be used in VGA mode, as WDDM DOD
> driver doesn't use the frame buffer (bar0), so no
> reason to map in into memory. However the mode is only known
> at runtime therefore framebuffer logic should be active when the
> driver is operating in vga mode only.
> 
> There were rare BSOD failures when the mapping failed.
> 
> Signed-off-by: Sameeh Jubran <sameeh at daynix.com>
> Signed-off-by: Dmitry Fleytman <dmitry at daynix.com>

Acked-by: Frediano Ziglio <fziglio at redhat.com>

Frediano

> ---
>  qxldod/QxlDod.cpp | 38 +++++++++++++++++++++-----------------
>  qxldod/QxlDod.h   |  4 ++++
>  2 files changed, 25 insertions(+), 17 deletions(-)
> 
> diff --git a/qxldod/QxlDod.cpp b/qxldod/QxlDod.cpp
> index 136daf7..85d6d94 100755
> --- a/qxldod/QxlDod.cpp
> +++ b/qxldod/QxlDod.cpp
> @@ -224,9 +224,7 @@ VOID QxlDod::CleanUp(VOID)
>      {
>          if (m_CurrentModes[Source].FrameBuffer.Ptr)
>          {
> -            UnmapFrameBuffer(m_CurrentModes[Source].FrameBuffer.Ptr,
> m_CurrentModes[Source].DispInfo.Height *
> m_CurrentModes[Source].DispInfo.Pitch);
> -            m_CurrentModes[Source].FrameBuffer.Ptr = NULL;
> -            m_CurrentModes[Source].Flags.FrameBufferIsActive = FALSE;
> +            m_pHWDevice->ReleaseFrameBuffer(&m_CurrentModes[Source]);
>          }
>      }
>  }
> @@ -1419,11 +1417,7 @@ NTSTATUS QxlDod::CommitVidPn(_In_ CONST
> DXGKARG_COMMITVIDPN* CONST pCommitVidPn)
>      if (m_CurrentModes[pCommitVidPn->AffectedVidPnSourceId].FrameBuffer.Ptr
>      &&
>          !m_CurrentModes[pCommitVidPn->AffectedVidPnSourceId].Flags.DoNotMapOrUnmap)
>      {
> -        Status =
> UnmapFrameBuffer(m_CurrentModes[pCommitVidPn->AffectedVidPnSourceId].FrameBuffer.Ptr,
> -
> m_CurrentModes[pCommitVidPn->AffectedVidPnSourceId].DispInfo.Pitch
> * m_CurrentModes[pCommitVidPn->AffectedVidPnSourceId].DispInfo.Height);
> -        m_CurrentModes[pCommitVidPn->AffectedVidPnSourceId].FrameBuffer.Ptr
> = NULL;
> -
> m_CurrentModes[pCommitVidPn->AffectedVidPnSourceId].Flags.FrameBufferIsActive
> = FALSE;
> -
> +        Status =
> m_pHWDevice->ReleaseFrameBuffer(&m_CurrentModes[pCommitVidPn->AffectedVidPnSourceId]);
>          if (!NT_SUCCESS(Status))
>          {
>              goto CommitVidPnExit;
> @@ -1548,15 +1542,7 @@ NTSTATUS QxlDod::SetSourceModeAndPath(CONST
> D3DKMDT_VIDPN_SOURCE_MODE* pSourceMo
>      pCurrentBddMode->DispInfo.Height =
>      pSourceMode->Format.Graphics.PrimSurfSize.cy;
>      pCurrentBddMode->DispInfo.Pitch =
>      pSourceMode->Format.Graphics.PrimSurfSize.cx *
>      BPPFromPixelFormat(pCurrentBddMode->DispInfo.ColorFormat) /
>      BITS_PER_BYTE;
>  
> -
> -    if (!pCurrentBddMode->Flags.DoNotMapOrUnmap)
> -    {
> -        // Map the new frame buffer
> -        QXL_ASSERT(pCurrentBddMode->FrameBuffer.Ptr == NULL);
> -        Status = MapFrameBuffer(pCurrentBddMode->DispInfo.PhysicAddress,
> -                                pCurrentBddMode->DispInfo.Pitch *
> pCurrentBddMode->DispInfo.Height,
> -                                &(pCurrentBddMode->FrameBuffer.Ptr));
> -    }
> +    Status = m_pHWDevice->AcquireFrameBuffer(pCurrentBddMode);
>  
>      if (NT_SUCCESS(Status))
>      {
> @@ -2991,6 +2977,24 @@ VOID VgaDevice::ResetDevice(VOID)
>  {
>  }
>  
> +NTSTATUS VgaDevice::AcquireFrameBuffer(CURRENT_BDD_MODE* pCurrentBddMode)
> +{
> +    // Map the new frame buffer
> +    QXL_ASSERT(pCurrentBddMode->FrameBuffer.Ptr == NULL);
> +    NTSTATUS status =
> MapFrameBuffer(pCurrentBddMode->DispInfo.PhysicAddress,
> +        pCurrentBddMode->DispInfo.Pitch * pCurrentBddMode->DispInfo.Height,
> +        &(pCurrentBddMode->FrameBuffer.Ptr));
> +    return status;
> +}
> +
> +NTSTATUS VgaDevice::ReleaseFrameBuffer(CURRENT_BDD_MODE* pCurrentBddMode)
> +{
> +    NTSTATUS status = UnmapFrameBuffer(pCurrentBddMode->FrameBuffer.Ptr,
> pCurrentBddMode->DispInfo.Height * pCurrentBddMode->DispInfo.Pitch);
> +    pCurrentBddMode->FrameBuffer.Ptr = NULL;
> +    pCurrentBddMode->Flags.FrameBufferIsActive = FALSE;
> +    return status;
> +}
> +
>  __declspec(code_seg("PAGE"))
>  NTSTATUS  VgaDevice::SetPointerShape(_In_ CONST DXGKARG_SETPOINTERSHAPE*
>  pSetPointerShape)
>  {
> diff --git a/qxldod/QxlDod.h b/qxldod/QxlDod.h
> index 8b90616..585b235 100755
> --- a/qxldod/QxlDod.h
> +++ b/qxldod/QxlDod.h
> @@ -232,6 +232,8 @@ public:
>      virtual BOOLEAN InterruptRoutine(_In_ PDXGKRNL_INTERFACE pDxgkInterface,
>      _In_  ULONG MessageNumber) = 0;
>      virtual VOID DpcRoutine(PVOID) = 0;
>      virtual VOID ResetDevice(void) = 0;
> +    virtual NTSTATUS AcquireFrameBuffer(CURRENT_BDD_MODE* pCurrentBddMode) {
> return STATUS_SUCCESS; }
> +    virtual NTSTATUS ReleaseFrameBuffer(CURRENT_BDD_MODE* pCurrentBddMode) {
> return STATUS_SUCCESS; }
>  
>      __declspec(code_seg("PAGE"))
>      virtual ULONG GetModeCount(void) = 0;
> @@ -320,6 +322,8 @@ public:
>      BOOLEAN InterruptRoutine(_In_ PDXGKRNL_INTERFACE pDxgkInterface, _In_
>      ULONG MessageNumber);
>      VOID DpcRoutine(PVOID);
>      VOID ResetDevice(VOID);
> +    NTSTATUS AcquireFrameBuffer(CURRENT_BDD_MODE* pCurrentBddMode);
> +    NTSTATUS ReleaseFrameBuffer(CURRENT_BDD_MODE* pCurrentBddMode);
>      __declspec(code_seg("PAGE"))
>      NTSTATUS SetPointerShape(_In_ CONST DXGKARG_SETPOINTERSHAPE*
>      pSetPointerShape);
>      __declspec(code_seg("PAGE"))


More information about the Spice-devel mailing list