VirtualBox

Ignore:
Timestamp:
May 22, 2012 4:41:38 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
78116
Message:

crOpenGL: VM window scroll handling

Location:
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c

    r41380 r41404  
    13891389}
    13901390
     1391static void crVBoxServerUpdateScreenViewportCB(unsigned long key, void *data1, void *data2)
     1392{
     1393    CRMuralInfo *mural = (CRMuralInfo*) data1;
     1394    int *sIndex = (int*) data2;
     1395
     1396    if (mural->screenId != sIndex)
     1397        return;
     1398
     1399    if (!mural->width || !mural->height)
     1400        return;
     1401
     1402    crServerCheckMuralGeometry(mural);
     1403}
     1404
     1405
     1406DECLEXPORT(int32_t) crVBoxServerSetScreenViewport(int sIndex, int32_t x, int32_t y, uint32_t w, uint32_t h)
     1407{
     1408    CRScreenViewportInfo *pVieport;
     1409    GLboolean fPosChanged, fSizeChanged;
     1410
     1411    crDebug("crVBoxServerSetScreenViewport(%i)", sIndex);
     1412
     1413    if (sIndex<0 || sIndex>=cr_server.screenCount)
     1414    {
     1415        crWarning("crVBoxServerSetScreenViewport: invalid screen id %d", sIndex);
     1416        return VERR_INVALID_PARAMETER;
     1417    }
     1418
     1419    pVieport = &cr_server.screenVieport[sIndex];
     1420    fPosChanged = (pVieport->x != x || pVieport->y != y);
     1421    fSizeChanged = (pVieport->w != w || pVieport->h != h);
     1422
     1423    if (!fPosChanged && !fSizeChanged)
     1424    {
     1425        crDebug("crVBoxServerSetScreenViewport: no changes");
     1426        return;
     1427    }
     1428
     1429    if (fPosChanged)
     1430    {
     1431        pVieport->x = x;
     1432        pVieport->y = y;
     1433
     1434        crHashtableWalk(cr_server.muralTable, crVBoxServerUpdateScreenViewportCB, NULL);
     1435    }
     1436
     1437    if (fSizeChanged)
     1438    {
     1439        pVieport->w = w;
     1440        pVieport->h = h;
     1441
     1442        /* no need to do anything here actually */
     1443    }
     1444    return VINF_SUCCESS;
     1445}
     1446
    13911447
    13921448#ifdef VBOX_WITH_CRHGSMI
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_muralfbo.c

    r41258 r41404  
    103103    if (cr_server.screenCount<2 && !cr_server.bForceOffscreenRendering)
    104104    {
     105        CRScreenViewportInfo *pVieport = &cr_server.screenVieport[mural->screenId];
    105106        CRASSERT(cr_server.screenCount>0);
    106107
     
    108109        mural->hY = mural->gY-cr_server.screen[0].y;
    109110
    110         cr_server.head_spu->dispatch_table.WindowPosition(mural->spuWindow, mural->hX, mural->hY);
     111        cr_server.head_spu->dispatch_table.WindowPosition(mural->spuWindow, mural->hX - pVieport->x, mural->hY - pVieport->y);
    111112
    112113        return;
     
    157158    if (overlappingScreenCount<2 && !cr_server.bForceOffscreenRendering)
    158159    {
     160        CRScreenViewportInfo *pVieport = &cr_server.screenVieport[mural->screenId];
     161
    159162        if (mural->bUseFBO)
    160163        {
     
    163166        }
    164167
    165         cr_server.head_spu->dispatch_table.WindowPosition(mural->spuWindow, mural->hX, mural->hY);
     168        cr_server.head_spu->dispatch_table.WindowPosition(mural->spuWindow, mural->hX - pVieport->x, mural->hY - pVieport->y);
    166169    }
    167170    else
     
    193196        if (!mural->bUseFBO)
    194197        {
    195             cr_server.head_spu->dispatch_table.WindowPosition(mural->spuWindow, mural->hX, mural->hY);
     198            CRScreenViewportInfo *pVieport = &cr_server.screenVieport[mural->screenId];
     199
     200            cr_server.head_spu->dispatch_table.WindowPosition(mural->spuWindow, mural->hX - pVieport->x, mural->hY - pVieport->y);
    196201        }
    197202    }
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