VirtualBox

Ignore:
Timestamp:
May 22, 2012 4:41:38 PM (13 years ago)
Author:
vboxsync
Message:

crOpenGL: VM window scroll handling

Location:
trunk/src/VBox/HostServices/SharedOpenGL
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp

    r41128 r41404  
    11331133                rc = VINF_SUCCESS;
    11341134            }
     1135            break;
     1136        }
     1137        case SHCRGL_HOST_FN_VIEWPORT_CHANGED:
     1138        {
     1139            Log(("svcCall: SHCRGL_HOST_FN_VIEWPORT_CHANGED\n"));
     1140
     1141            /* Verify parameter count and types. */
     1142            if (cParms != SHCRGL_CPARMS_VIEWPORT_CHANGED)
     1143            {
     1144                LogRel(("SHCRGL_HOST_FN_VIEWPORT_CHANGED: cParms invalid - %d", cParms));
     1145                rc = VERR_INVALID_PARAMETER;
     1146                break;
     1147            }
     1148
     1149            for (int i = 0; i < SHCRGL_CPARMS_VIEWPORT_CHANGED; ++i)
     1150            {
     1151                if (paParms[i].type != VBOX_HGCM_SVC_PARM_32BIT)
     1152                {
     1153                    LogRel(("SHCRGL_HOST_FN_VIEWPORT_CHANGED: param[%d] type invalid - %d", i, paParms[i].type));
     1154                    rc = VERR_INVALID_PARAMETER;
     1155                    break;
     1156                }
     1157            }
     1158
     1159            if (!RT_SUCCESS(rc))
     1160            {
     1161                LogRel(("SHCRGL_HOST_FN_VIEWPORT_CHANGED: param validation failed, returning.."));
     1162                break;
     1163            }
     1164
     1165            rc = crVBoxServerSetScreenViewport((int)paParms[0].u.uint32,
     1166                    paParms[1].u.uint32, /* x */
     1167                    paParms[2].u.uint32, /* y */
     1168                    paParms[3].u.uint32, /* w */
     1169                    paParms[4].u.uint32  /* h */);
     1170            if (!RT_SUCCESS(rc))
     1171            {
     1172                LogRel(("SHCRGL_HOST_FN_VIEWPORT_CHANGED: crVBoxServerSetScreenViewport failed, rc %d", rc));
     1173                break;
     1174            }
     1175
    11351176            break;
    11361177        }
  • 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.

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