[Spice-devel] [PATCH qxl-wddm-dod 19/26] Fixing framebuffer usage logic

Sameeh Jubran sameeh at daynix.com
Tue Aug 9 15:31:07 UTC 2016


From: Dmitry Fleytman <dmitry at daynix.com>

This patch fixes 2 issues:

  1. Framebuffer should only be used in vga mode,
     therefore when QxlDevice is active
     FrameBufferIsActive flag shouldn't be checked;
  2. FrameBufferIsActive flag should be set true
     on successfull frame buffer allocation only.

Signed-off-by: Sameeh Jubran <sameeh at daynix.com>
Signed-off-by: Dmitry Fleytman <dmitry at daynix.com>
---
 qxldod/QxlDod.cpp | 101 ++++++++++++++++++++++++++----------------------------
 1 file changed, 49 insertions(+), 52 deletions(-)

diff --git a/qxldod/QxlDod.cpp b/qxldod/QxlDod.cpp
index 557d796..6d07b5d 100755
--- a/qxldod/QxlDod.cpp
+++ b/qxldod/QxlDod.cpp
@@ -512,40 +512,37 @@ NTSTATUS QxlDod::PresentDisplayOnly(_In_ CONST DXGKARG_PRESENT_DISPLAYONLY* pPre
         return STATUS_SUCCESS;
     }
 
-    if (m_CurrentModes[pPresentDisplayOnly->VidPnSourceId].Flags.FrameBufferIsActive)
-    {
-
-        // If actual pixels are coming through, will need to completely zero out physical address next time in BlackOutScreen
-        m_CurrentModes[pPresentDisplayOnly->VidPnSourceId].ZeroedOutStart.QuadPart = 0;
-        m_CurrentModes[pPresentDisplayOnly->VidPnSourceId].ZeroedOutEnd.QuadPart = 0;
 
-
-        D3DKMDT_VIDPN_PRESENT_PATH_ROTATION RotationNeededByFb = pPresentDisplayOnly->Flags.Rotate ?
-                                                                 m_CurrentModes[pPresentDisplayOnly->VidPnSourceId].Rotation :
-                                                                 D3DKMDT_VPPR_IDENTITY;
-        BYTE* pDst = (BYTE*)m_CurrentModes[pPresentDisplayOnly->VidPnSourceId].FrameBuffer.Ptr;
-        UINT DstBitPerPixel = BPPFromPixelFormat(m_CurrentModes[pPresentDisplayOnly->VidPnSourceId].DispInfo.ColorFormat);
-        if (m_CurrentModes[pPresentDisplayOnly->VidPnSourceId].Scaling == D3DKMDT_VPPS_CENTERED)
-        {
-            UINT CenterShift = (m_CurrentModes[pPresentDisplayOnly->VidPnSourceId].DispInfo.Height -
-                m_CurrentModes[pPresentDisplayOnly->VidPnSourceId].SrcModeHeight)*m_CurrentModes[pPresentDisplayOnly->VidPnSourceId].DispInfo.Pitch;
-            CenterShift += (m_CurrentModes[pPresentDisplayOnly->VidPnSourceId].DispInfo.Width -
-                m_CurrentModes[pPresentDisplayOnly->VidPnSourceId].SrcModeWidth)*DstBitPerPixel/8;
-            pDst += (int)CenterShift/2;
-        }
-        Status = m_pHWDevice->ExecutePresentDisplayOnly(
-                            pDst,
-                            DstBitPerPixel,
-                            (BYTE*)pPresentDisplayOnly->pSource,
-                            pPresentDisplayOnly->BytesPerPixel,
-                            pPresentDisplayOnly->Pitch,
-                            pPresentDisplayOnly->NumMoves,
-                            pPresentDisplayOnly->pMoves,
-                            pPresentDisplayOnly->NumDirtyRects,
-                            pPresentDisplayOnly->pDirtyRect,
-                            RotationNeededByFb,
-                            &m_CurrentModes[0]);
-    }
+    // If actual pixels are coming through, will need to completely zero out physical address next time in BlackOutScreen
+    m_CurrentModes[pPresentDisplayOnly->VidPnSourceId].ZeroedOutStart.QuadPart = 0;
+    m_CurrentModes[pPresentDisplayOnly->VidPnSourceId].ZeroedOutEnd.QuadPart = 0;
+
+
+    D3DKMDT_VIDPN_PRESENT_PATH_ROTATION RotationNeededByFb = pPresentDisplayOnly->Flags.Rotate ?
+                                                             m_CurrentModes[pPresentDisplayOnly->VidPnSourceId].Rotation :
+                                                             D3DKMDT_VPPR_IDENTITY;
+    BYTE* pDst = (BYTE*)m_CurrentModes[pPresentDisplayOnly->VidPnSourceId].FrameBuffer.Ptr;
+    UINT DstBitPerPixel = BPPFromPixelFormat(m_CurrentModes[pPresentDisplayOnly->VidPnSourceId].DispInfo.ColorFormat);
+    if (m_CurrentModes[pPresentDisplayOnly->VidPnSourceId].Scaling == D3DKMDT_VPPS_CENTERED)
+    {
+        UINT CenterShift = (m_CurrentModes[pPresentDisplayOnly->VidPnSourceId].DispInfo.Height -
+            m_CurrentModes[pPresentDisplayOnly->VidPnSourceId].SrcModeHeight)*m_CurrentModes[pPresentDisplayOnly->VidPnSourceId].DispInfo.Pitch;
+        CenterShift += (m_CurrentModes[pPresentDisplayOnly->VidPnSourceId].DispInfo.Width -
+            m_CurrentModes[pPresentDisplayOnly->VidPnSourceId].SrcModeWidth)*DstBitPerPixel/8;
+        pDst += (int)CenterShift/2;
+    }
+    Status = m_pHWDevice->ExecutePresentDisplayOnly(
+                        pDst,
+                        DstBitPerPixel,
+                        (BYTE*)pPresentDisplayOnly->pSource,
+                        pPresentDisplayOnly->BytesPerPixel,
+                        pPresentDisplayOnly->Pitch,
+                        pPresentDisplayOnly->NumMoves,
+                        pPresentDisplayOnly->pMoves,
+                        pPresentDisplayOnly->NumDirtyRects,
+                        pPresentDisplayOnly->pDirtyRect,
+                        RotationNeededByFb,
+                        &m_CurrentModes[0]);
     DbgPrint(TRACE_LEVEL_VERBOSE, ("<--- %s\n", __FUNCTION__));
     return Status;
 }
@@ -1534,12 +1531,15 @@ NTSTATUS QxlDod::SetSourceModeAndPath(CONST D3DKMDT_VIDPN_SOURCE_MODE* pSourceMo
         Status = MapFrameBuffer(pCurrentBddMode->DispInfo.PhysicAddress,
                                 pCurrentBddMode->DispInfo.Pitch * pCurrentBddMode->DispInfo.Height,
                                 &(pCurrentBddMode->FrameBuffer.Ptr));
+        if (NT_SUCCESS(Status))
+        {
+            pCurrentBddMode->Flags.FrameBufferIsActive = TRUE;
+        }
     }
 
     if (NT_SUCCESS(Status))
     {
 
-        pCurrentBddMode->Flags.FrameBufferIsActive = TRUE;
         m_pHWDevice->BlackOutScreen(&m_CurrentModes[pPath->VidPnSourceId]);
 
         // Mark that the next present should be fullscreen so the screen doesn't go from black to actual pixels one dirty rect at a time.
@@ -4328,26 +4328,23 @@ VOID QxlDevice::BlackOutScreen(CURRENT_BDD_MODE* pCurrentBddMod)
     QXLDrawable *drawable;
     RECT Rect;
     PAGED_CODE();
-    if (pCurrentBddMod->Flags.FrameBufferIsActive)
+    Rect.bottom = pCurrentBddMod->SrcModeHeight;
+    Rect.top = 0;
+    Rect.left = 0;
+    Rect.right = pCurrentBddMod->SrcModeWidth;
+    if (!(drawable = Drawable(QXL_DRAW_FILL, &Rect, NULL, 0)))
     {
-        Rect.bottom = pCurrentBddMod->SrcModeHeight;
-        Rect.top = 0;
-        Rect.left = 0;
-        Rect.right = pCurrentBddMod->SrcModeWidth;
-        if (!(drawable = Drawable(QXL_DRAW_FILL, &Rect, NULL, 0)))
-        {
-            DbgPrint(TRACE_LEVEL_ERROR, ("Cannot get Drawable.\n"));
-            return;
-        }
-        drawable->u.fill.brush.type = SPICE_BRUSH_TYPE_SOLID;
-        drawable->u.fill.brush.u.color = 0;
-        drawable->u.fill.rop_descriptor = SPICE_ROPD_OP_PUT;
-        drawable->u.fill.mask.flags = 0;
-        drawable->u.fill.mask.pos.x = 0;
-        drawable->u.fill.mask.pos.y = 0;
-        drawable->u.fill.mask.bitmap = 0;
-        PushDrawable(drawable);
+        DbgPrint(TRACE_LEVEL_ERROR, ("Cannot get Drawable.\n"));
+        return;
     }
+    drawable->u.fill.brush.type = SPICE_BRUSH_TYPE_SOLID;
+    drawable->u.fill.brush.u.color = 0;
+    drawable->u.fill.rop_descriptor = SPICE_ROPD_OP_PUT;
+    drawable->u.fill.mask.flags = 0;
+    drawable->u.fill.mask.pos.x = 0;
+    drawable->u.fill.mask.pos.y = 0;
+    drawable->u.fill.mask.bitmap = 0;
+    PushDrawable(drawable);
 }
 
 NTSTATUS QxlDevice::HWClose(void)
-- 
2.7.0.windows.1



More information about the Spice-devel mailing list