VirtualBox

Ignore:
Timestamp:
Jun 30, 2010 3:55:53 PM (14 years ago)
Author:
vboxsync
Message:

wddm/3d: visible region tracking fixes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVdma.cpp

    r30515 r30532  
    309309    PVBOXWDDM_CONTEXT pContext = pRectsInfo->pContext;
    310310    PDEVICE_EXTENSION pDevExt = pContext->pDevice->pAdapter;
    311     RECT * pContextRect = &pRectsInfo->ContextsRects.ContextRect;
    312311    PVBOXWDDM_RECTS_INFO pRects = &pRectsInfo->ContextsRects.UpdateRects;
    313312    NTSTATUS Status = STATUS_SUCCESS;
     
    342341                Assert(pCmd->fFlags.Value == 0);
    343342                pCmd->fFlags.bAddHiddenRects = 1;
    344                 if (pContext->pLastReportedRects)
     343                if (pCurContext->pLastReportedRects)
    345344                {
    346                     if (pContext->pLastReportedRects->fFlags.bSetVisibleRects)
     345                    if (pCurContext->pLastReportedRects->fFlags.bSetVisibleRects)
    347346                    {
    348347                        RECT *paPrevRects;
    349348                        uint32_t cPrevRects;
    350                         if (pContext->pLastReportedRects->fFlags.bSetViewRect)
     349                        if (pCurContext->pLastReportedRects->fFlags.bSetViewRect)
    351350                        {
    352                             paPrevRects = &pContext->pLastReportedRects->RectsInfo.aRects[1];
    353                             cPrevRects = pContext->pLastReportedRects->RectsInfo.cRects - 1;
     351                            paPrevRects = &pCurContext->pLastReportedRects->RectsInfo.aRects[1];
     352                            cPrevRects = pCurContext->pLastReportedRects->RectsInfo.cRects - 1;
    354353                        }
    355354                        else
    356355                        {
    357                             paPrevRects = &pContext->pLastReportedRects->RectsInfo.aRects[0];
    358                             cPrevRects = pContext->pLastReportedRects->RectsInfo.cRects;
     356                            paPrevRects = &pCurContext->pLastReportedRects->RectsInfo.aRects[0];
     357                            cPrevRects = pCurContext->pLastReportedRects->RectsInfo.cRects;
    359358                        }
    360359
     
    366365                    else
    367366                    {
    368                         Assert(pContext->pLastReportedRects->fFlags.bAddHiddenRects);
    369                         if (!vboxVdmaDirtyRectsIsCover(pContext->pLastReportedRects->RectsInfo.aRects,
    370                                 pContext->pLastReportedRects->RectsInfo.cRects,
     367                        Assert(pCurContext->pLastReportedRects->fFlags.bAddHiddenRects);
     368                        if (!vboxVdmaDirtyRectsIsCover(pCurContext->pLastReportedRects->RectsInfo.aRects,
     369                                pCurContext->pLastReportedRects->RectsInfo.cRects,
    371370                                pCmd->RectsInfo.aRects, pCmd->RectsInfo.cRects))
    372371                        {
     
    380379                if (bSend)
    381380                {
    382                     if (pContext->pLastReportedRects)
    383                         vboxVideoCmCmdRelease(pContext->pLastReportedRects);
     381                    if (pCurContext->pLastReportedRects)
     382                        vboxVideoCmCmdRelease(pCurContext->pLastReportedRects);
    384383                    vboxVideoCmCmdRetain(pCmd);
    385                     pContext->pLastReportedRects = pCmd;
     384                    pCurContext->pLastReportedRects = pCmd;
    386385                    vboxVideoCmCmdSubmit(pCmd, VBOXVIDEOCM_CMD_RECTS_SIZE4CRECTS(pCmd->RectsInfo.cRects));
    387386                    pCmd = NULL;
     
    391390        else
    392391        {
     392            RECT * pContextRect = &pRectsInfo->ContextsRects.ContextRect;
    393393            bool bRectShanged = (pContext->ViewRect.left != pContextRect->left
    394394                    || pContext->ViewRect.top != pContextRect->top
     
    396396                    || pContext->ViewRect.bottom != pContextRect->bottom);
    397397            PVBOXVIDEOCM_CMD_RECTS pDrCmd;
     398
     399            bool bSend = false;
    398400
    399401            if (bRectShanged)
     
    407409                    break;
    408410                }
     411                pDrCmd->fFlags.Value = 0;
    409412                pDrCmd->RectsInfo.cRects = pRects->cRects + 1;
     413                pDrCmd->fFlags.bSetViewRect = 1;
     414                pDrCmd->RectsInfo.aRects[0] = *pContextRect;
     415                pContext->ViewRect = *pContextRect;
     416                memcpy(&pDrCmd->RectsInfo.aRects[1], pRects->aRects, sizeof (RECT) * pRects->cRects);
     417                bSend = true;
    410418            }
    411419            else
     
    426434                    }
    427435                }
     436                pDrCmd->fFlags.Value = 0;
    428437                pDrCmd->RectsInfo.cRects = pRects->cRects;
    429             }
    430 
    431             Assert(pDrCmd->fFlags.Value == 0);
    432             RECT *pDirtyRect;
    433             bool bSend = false;
    434             if (bRectShanged)
    435             {
    436                 pDrCmd->fFlags.bSetViewRect = 1;
    437                 pDrCmd->RectsInfo.aRects[0] = *pContextRect;
    438                 pDirtyRect = &pDrCmd->RectsInfo.aRects[1];
    439                 pContext->ViewRect = *pContextRect;
    440                 bSend = true;
    441             }
    442             else
    443             {
    444                 pDirtyRect = pDrCmd->RectsInfo.aRects;
     438                memcpy(&pDrCmd->RectsInfo.aRects[0], pRects->aRects, sizeof (RECT) * pRects->cRects);
    445439
    446440                if (pContext->pLastReportedRects)
     
    460454                            cRects = pContext->pLastReportedRects->RectsInfo.cRects;
    461455                        }
    462                         bSend = (pDrCmd->RectsInfo.cRects == cRects)
    463                                 && !memcmp(paRects, pDrCmd->RectsInfo.aRects, cRects * sizeof (RECT));
     456                        bSend = (pDrCmd->RectsInfo.cRects != cRects)
     457                                || memcmp(paRects, pDrCmd->RectsInfo.aRects, cRects * sizeof (RECT));
    464458                    }
    465459                    else
     
    481475
    482476                pDrCmd->fFlags.bSetVisibleRects = 1;
    483                 memcpy (pDirtyRect, pRects->aRects, sizeof (RECT) * pRects->cRects);
    484477
    485478                vboxVideoCmCmdRetain(pDrCmd);
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette