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 <sam...@daynix.com> Signed-off-by: Dmitry Fleytman <dmi...@daynix.com> --- qxldod/QxlDod.cpp | 101 ++++++++++++++++++++++++++---------------------------- 1 file changed, 49 insertions(+), 52 deletions(-) diff --git a/qxldod/QxlDod.cpp b/qxldod/QxlDod.cpp index a550306..a34c728 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. @@ -4329,26 +4329,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) -- 1.8.3.1 _______________________________________________ Spice-devel mailing list Spice-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/spice-devel