VirtualBox

Changeset 56468 in vbox for trunk


Ignore:
Timestamp:
Jun 17, 2015 7:12:16 AM (10 years ago)
Author:
vboxsync
Message:

Main/Display: update seamless rectangles if window origin changes.

Location:
trunk/src/VBox/Main
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/include/DisplayImpl.h

    r55133 r56468  
    179179    int i_notifyCroglResize(const PVBVAINFOVIEW pView, const PVBVAINFOSCREEN pScreen, void *pvVRAM);
    180180
     181    int  i_saveVisibleRegion(uint32_t cRect, PRTRECT pRect);
    181182    int  i_handleSetVisibleRegion(uint32_t cRect, PRTRECT pRect);
    182183    int  i_handleQueryVisibleRegion(uint32_t *pcRect, PRTRECT pRect);
     
    397398    bool volatile fVGAResizing;
    398399
     400    /** Are we in seamless mode?  Not saved, as we exit seamless on saving. */
     401    bool        mfSeamlessEnabled;
     402    /** Last set seamless visible region, number of rectangles. */
     403    uint32_t    mcRectVisibleRegion;
     404    /** Last set seamless visible region, data.  Freed on final clean-up. */
     405    PRTRECT     mpRectVisibleRegion;
     406
    399407    bool        mfVideoAccelVRDP;
    400408    uint32_t    mfu32SupportedOrders;
  • trunk/src/VBox/Main/src-client/DisplayImpl.cpp

    r55837 r56468  
    109109    mfu32SupportedOrders = 0;
    110110    mcVideoAccelVRDPRefs = 0;
     111
     112    mfSeamlessEnabled = false;
     113    mpRectVisibleRegion = NULL;
    111114
    112115#ifdef VBOX_WITH_CROGL
     
    157160
    158161    videoAccelDestroy(&mVideoAccelLegacy);
     162    i_saveVisibleRegion(0, NULL);
    159163
    160164    if (RTCritSectIsInitialized(&mVideoAccelLock))
     
    954958    mParent->i_consoleVRDPServer()->SendResize();
    955959
     960    /* And re-send the seamless rectangles if necessary. */
     961    if (mfSeamlessEnabled)
     962        i_handleSetVisibleRegion(mcRectVisibleRegion, mpRectVisibleRegion);
     963
    956964    LogRelFlowFunc(("[%d]: default format %d\n", uScreenId, pFBInfo->fDefaultFormat));
    957965
     
    11251133    cxInputMapping      = cx;
    11261134    cyInputMapping      = cy;
     1135
     1136    /* Re-send the seamless rectangles if necessary. */
     1137    if (mfSeamlessEnabled)
     1138        i_handleSetVisibleRegion(mcRectVisibleRegion, mpRectVisibleRegion);
    11271139}
    11281140
     
    12491261}
    12501262
     1263int Display::i_saveVisibleRegion(uint32_t cRect, PRTRECT pRect)
     1264{
     1265    RTRECT *pRectVisibleRegion = NULL;
     1266
     1267    if (pRect == mpRectVisibleRegion)
     1268        return VINF_SUCCESS;
     1269    if (cRect != 0)
     1270    {
     1271        pRectVisibleRegion = (RTRECT *)RTMemAlloc(cRect * sizeof(RTRECT));
     1272        if (!pRectVisibleRegion)
     1273        {
     1274            return VERR_NO_MEMORY;
     1275        }
     1276        memcpy(pRectVisibleRegion, pRect, cRect * sizeof(RTRECT));
     1277    }
     1278    if (mpRectVisibleRegion)
     1279        RTMemFree(mpRectVisibleRegion);
     1280    mcRectVisibleRegion = cRect;
     1281    mpRectVisibleRegion = pRectVisibleRegion;
     1282    return VINF_SUCCESS;
     1283}
     1284
    12511285int Display::i_handleSetVisibleRegion(uint32_t cRect, PRTRECT pRect)
    12521286{
     
    12571291        return VERR_NO_TMP_MEMORY;
    12581292    }
     1293    int rc = i_saveVisibleRegion(cRect, pRect);
     1294    if (RT_FAILURE(rc))
     1295    {
     1296        RTMemTmpFree(pVisibleRegion);
     1297        return rc;
     1298    }
    12591299
    12601300    unsigned uScreenId;
     
    12691309             */
    12701310            RTRECT rectFramebuffer;
    1271             rectFramebuffer.xLeft   = pFBInfo->xOrigin;
    1272             rectFramebuffer.yTop    = pFBInfo->yOrigin;
    1273             rectFramebuffer.xRight  = pFBInfo->xOrigin + pFBInfo->w;
    1274             rectFramebuffer.yBottom = pFBInfo->yOrigin + pFBInfo->h;
     1311            rectFramebuffer.xLeft   = pFBInfo->xOrigin - xInputMappingOrigin;
     1312            rectFramebuffer.yTop    = pFBInfo->yOrigin - yInputMappingOrigin;
     1313            rectFramebuffer.xRight  = rectFramebuffer.xLeft + pFBInfo->w;
     1314            rectFramebuffer.yBottom = rectFramebuffer.yTop + pFBInfo->h;
    12751315
    12761316            uint32_t cRectVisibleRegion = 0;
     
    12811321                if (displayIntersectRect(&pVisibleRegion[cRectVisibleRegion], &pRect[i], &rectFramebuffer))
    12821322                {
    1283                     pVisibleRegion[cRectVisibleRegion].xLeft -= pFBInfo->xOrigin;
    1284                     pVisibleRegion[cRectVisibleRegion].yTop -= pFBInfo->yOrigin;
    1285                     pVisibleRegion[cRectVisibleRegion].xRight -= pFBInfo->xOrigin;
    1286                     pVisibleRegion[cRectVisibleRegion].yBottom -= pFBInfo->yOrigin;
     1323                    pVisibleRegion[cRectVisibleRegion].xLeft -= rectFramebuffer.xLeft;
     1324                    pVisibleRegion[cRectVisibleRegion].yTop -= rectFramebuffer.yTop;
     1325                    pVisibleRegion[cRectVisibleRegion].xRight -= rectFramebuffer.xLeft;
     1326                    pVisibleRegion[cRectVisibleRegion].yBottom -= rectFramebuffer.yTop;
    12871327
    12881328                    cRectVisibleRegion++;
     
    13131353                pCtl->aParms[0].u.pointer.size = cRect * sizeof(RTRECT);
    13141354
    1315                 int rc = i_crCtlSubmit(&pCtl->Hdr, sizeof(*pCtl), i_displayCrCmdFree, pCtl);
     1355                rc = i_crCtlSubmit(&pCtl->Hdr, sizeof(*pCtl), i_displayCrCmdFree, pCtl);
    13161356                if (!RT_SUCCESS(rc))
    13171357                {
     
    17661806            pVMMDevPort->pfnRequestSeamlessChange(pVMMDevPort, !!enabled);
    17671807    }
     1808    mfSeamlessEnabled = enabled;
    17681809
    17691810#if defined(VBOX_WITH_HGCM) && defined(VBOX_WITH_CROGL)
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