VirtualBox

Ignore:
Timestamp:
Sep 21, 2009 12:23:57 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
52609
Message:

Skip VBVA update if framebufer is being resized.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/DisplayImpl.cpp

    r23015 r23185  
    208208#ifdef VBOX_WITH_HGSMI
    209209        maFramebuffers[ul].fVBVAEnabled = false;
     210        maFramebuffers[ul].cVBVASkipUpdate = 0;
     211        memset (&maFramebuffers[ul].vbvaSkippedRect, 0, sizeof (maFramebuffers[ul].vbvaSkippedRect));
    210212#endif /* VBOX_WITH_HGSMI */
    211213    }
     
    24032405    PDRVMAINDISPLAY pDrv = PDMIDISPLAYCONNECTOR_2_MAINDISPLAY(pInterface);
    24042406    Display *pThis = pDrv->pDisplay;
    2405 
    2406     NOREF(uScreenId);
     2407    DISPLAYFBINFO *pFBInfo = &pThis->maFramebuffers[uScreenId];
     2408
     2409    if (RT_LIKELY(pFBInfo->u32ResizeStatus == ResizeStatus_Void))
     2410    {
     2411        if (RT_UNLIKELY(pFBInfo->cVBVASkipUpdate != 0))
     2412        {
     2413            /* Some updates were skipped. Note: displayVBVAUpdate* callbacks are called
     2414             * under display device lock, so thread safe.
     2415             */
     2416            pFBInfo->cVBVASkipUpdate = 0;
     2417            pThis->handleDisplayUpdate(pFBInfo->vbvaSkippedRect.xLeft,
     2418                                       pFBInfo->vbvaSkippedRect.yTop,
     2419                                       pFBInfo->vbvaSkippedRect.xRight - pFBInfo->vbvaSkippedRect.xLeft,
     2420                                       pFBInfo->vbvaSkippedRect.yBottom - pFBInfo->vbvaSkippedRect.yTop);
     2421        }
     2422    }
     2423    else
     2424    {
     2425        /* The framebuffer is being resized. */
     2426        pFBInfo->cVBVASkipUpdate++;
     2427    }
    24072428}
    24082429
     
    24132434    PDRVMAINDISPLAY pDrv = PDMIDISPLAYCONNECTOR_2_MAINDISPLAY(pInterface);
    24142435    Display *pThis = pDrv->pDisplay;
    2415 
    2416     pThis->mParent->consoleVRDPServer()->SendUpdate (uScreenId, pCmd, cbCmd);
    2417 }
    2418 
    2419 DECLCALLBACK(void) Display::displayVBVAUpdateEnd(PPDMIDISPLAYCONNECTOR pInterface, unsigned uScreenId, uint32_t x, uint32_t y, uint32_t cx, uint32_t cy)
     2436    DISPLAYFBINFO *pFBInfo = &pThis->maFramebuffers[uScreenId];
     2437
     2438    if (RT_LIKELY(pFBInfo->cVBVASkipUpdate == 0))
     2439    {
     2440         pThis->mParent->consoleVRDPServer()->SendUpdate (uScreenId, pCmd, cbCmd);
     2441    }
     2442}
     2443
     2444DECLCALLBACK(void) Display::displayVBVAUpdateEnd(PPDMIDISPLAYCONNECTOR pInterface, unsigned uScreenId, int32_t x, int32_t y, uint32_t cx, uint32_t cy)
    24202445{
    24212446    LogFlowFunc(("uScreenId %d %d,%d %dx%d\n", uScreenId, x, y, cx, cy));
     
    24232448    PDRVMAINDISPLAY pDrv = PDMIDISPLAYCONNECTOR_2_MAINDISPLAY(pInterface);
    24242449    Display *pThis = pDrv->pDisplay;
     2450    DISPLAYFBINFO *pFBInfo = &pThis->maFramebuffers[uScreenId];
    24252451
    24262452    /* @todo handleFramebufferUpdate (uScreenId,
     
    24292455     *                                cx, cy);
    24302456     */
    2431     pThis->handleDisplayUpdate(x, y, cx, cy);
     2457    if (RT_LIKELY(pFBInfo->cVBVASkipUpdate == 0))
     2458    {
     2459        pThis->handleDisplayUpdate(x, y, cx, cy);
     2460    }
     2461    else
     2462    {
     2463        /* Save the updated rectangle. */
     2464        int32_t xRight = x + cx;
     2465        int32_t yBottom = y + cy;
     2466
     2467        if (pFBInfo->cVBVASkipUpdate == 1)
     2468        {
     2469            pFBInfo->vbvaSkippedRect.xLeft = x;
     2470            pFBInfo->vbvaSkippedRect.yTop = y;
     2471            pFBInfo->vbvaSkippedRect.xRight = xRight;
     2472            pFBInfo->vbvaSkippedRect.yBottom = yBottom;
     2473        }
     2474        else
     2475        {
     2476            if (pFBInfo->vbvaSkippedRect.xLeft > x)
     2477            {
     2478                pFBInfo->vbvaSkippedRect.xLeft = x;
     2479            }
     2480            if (pFBInfo->vbvaSkippedRect.yTop > y)
     2481            {
     2482                pFBInfo->vbvaSkippedRect.yTop = y;
     2483            }
     2484            if (pFBInfo->vbvaSkippedRect.xRight < xRight)
     2485            {
     2486                pFBInfo->vbvaSkippedRect.xRight = xRight;
     2487            }
     2488            if (pFBInfo->vbvaSkippedRect.yBottom < yBottom)
     2489            {
     2490                pFBInfo->vbvaSkippedRect.yBottom = yBottom;
     2491            }
     2492        }
     2493    }
    24322494}
    24332495
Note: See TracChangeset for help on using the changeset viewer.

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