VirtualBox

Changeset 50405 in vbox


Ignore:
Timestamp:
Feb 10, 2014 8:10:18 PM (11 years ago)
Author:
vboxsync
Message:

crOpenGL: include 3D data in framebuffer saved state snapshot, saved state fix

Location:
trunk/src/VBox
Files:
4 edited

Legend:

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

    r50313 r50405  
    137137    GLint i;
    138138    CRClientNode *pNode, *pNext;
     139    GLboolean fOldEnableDiff;
    139140
    140141    /* avoid a race condition */
     
    159160    cr_server.currentMural = NULL;
    160161
    161     if (CrBltIsInitialized(&cr_server.Blitter))
    162     {
    163         CrBltTerm(&cr_server.Blitter);
    164     }
    165 
    166162    /* sync our state with renderspu,
    167163     * do it before mural & context deletion to avoid deleting currently set murals/contexts*/
     
    179175    crFreeHashtable(cr_server.contextTable, deleteContextInfoCallback);
    180176
     177    /* synchronize with reality */
     178    fOldEnableDiff = crStateEnableDiffOnMakeCurrent(GL_FALSE);
     179    Assert(cr_server.MainContextInfo.pContext);
     180    crStateMakeCurrent(cr_server.MainContextInfo.pContext);
     181    crStateEnableDiffOnMakeCurrent(fOldEnableDiff);
     182
    181183    /* Free vertex programs */
    182184    crFreeHashtable(cr_server.programTable, crFree);
    183185
     186    /* Free murals */
     187    crFreeHashtable(cr_server.muralTable, deleteMuralInfoCallback);
     188
     189    CrPMgrTerm();
     190
     191    if (CrBltIsInitialized(&cr_server.Blitter))
     192    {
     193        CrBltTerm(&cr_server.Blitter);
     194    }
     195
    184196    /* Free dummy murals */
    185197    crFreeHashtable(cr_server.dummyMuralTable, deleteMuralInfoCallback);
    186 
    187     /* Free murals */
    188     crFreeHashtable(cr_server.muralTable, deleteMuralInfoCallback);
    189 
    190     CrPMgrTerm();
    191198
    192199    for (i = 0; i < cr_server.numClients; i++) {
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp

    r50398 r50405  
    41394139        crFree(pRects);
    41404140
     4141    CrFbEntryRelease(pFb, hEntry);
     4142
    41414143    return VINF_SUCCESS;
    41424144}
  • trunk/src/VBox/HostServices/SharedOpenGL/render/renderspu.c

    r50274 r50405  
    302302
    303303    curCtx = GET_CONTEXT_VAL();
    304     CRASSERT(curCtx);
     304//    CRASSERT(curCtx);
    305305    if (curCtx == context)
    306306    {
  • trunk/src/VBox/Main/src-client/DisplayImpl.cpp

    r50394 r50405  
    248248}
    249249
     250#ifdef VBOX_WITH_CROGL
     251typedef struct
     252{
     253    CRVBOXHGCMTAKESCREENSHOT Base;
     254
     255    /* 32bpp small RGB image. */
     256    uint8_t *pu8Thumbnail;
     257    uint32_t cbThumbnail;
     258    uint32_t cxThumbnail;
     259    uint32_t cyThumbnail;
     260
     261    /* PNG screenshot. */
     262    uint8_t *pu8PNG;
     263    uint32_t cbPNG;
     264    uint32_t cxPNG;
     265    uint32_t cyPNG;
     266} VBOX_DISPLAY_SAVESCREENSHOT_DATA;
     267
     268static DECLCALLBACK(void) displaySaveScreenshotReport(void *pvCtx, uint32_t uScreen,
     269        uint32_t x, uint32_t y, uint32_t uBitsPerPixel,
     270        uint32_t uBytesPerLine, uint32_t uGuestWidth, uint32_t uGuestHeight,
     271        uint8_t *pu8BufferAddress, uint64_t u64TimeStamp)
     272{
     273    VBOX_DISPLAY_SAVESCREENSHOT_DATA *pData = (VBOX_DISPLAY_SAVESCREENSHOT_DATA*)pvCtx;
     274    displayMakeThumbnail(pu8BufferAddress, uGuestWidth, uGuestHeight, &pData->pu8Thumbnail, &pData->cbThumbnail, &pData->cxThumbnail, &pData->cyThumbnail);
     275    int rc = DisplayMakePNG(pu8BufferAddress, uGuestWidth, uGuestHeight, &pData->pu8PNG, &pData->cbPNG, &pData->cxPNG, &pData->cyPNG, 1);
     276    if (RT_FAILURE(rc))
     277    {
     278        AssertMsgFailed(("DisplayMakePNG failed %d\n", rc));
     279        if (pData->pu8PNG)
     280        {
     281            RTMemFree(pData->pu8PNG);
     282            pData->pu8PNG = NULL;
     283        }
     284        pData->cbPNG = 0;
     285        pData->cxPNG = 0;
     286        pData->cyPNG = 0;
     287    }
     288}
     289#endif
     290
    250291DECLCALLBACK(void)
    251292Display::displaySSMSaveScreenshot(PSSMHANDLE pSSM, void *pvUser)
     
    274315        uint32_t cy = 0;
    275316
    276         /* SSM code is executed on EMT(0), therefore no need to use VMR3ReqCallWait. */
    277         int rc = Display::displayTakeScreenshotEMT(that, VBOX_VIDEO_PRIMARY_SCREEN, &pu8Data, &cbData, &cx, &cy);
    278 
    279         /*
    280          * It is possible that success is returned but everything is 0 or NULL.
    281          * (no display attached if a VM is running with VBoxHeadless on OSE for example)
    282          */
    283         if (RT_SUCCESS(rc) && pu8Data)
    284         {
    285             Assert(cx && cy);
    286 
    287             /* Prepare a small thumbnail and a PNG screenshot. */
    288             displayMakeThumbnail(pu8Data, cx, cy, &pu8Thumbnail, &cbThumbnail, &cxThumbnail, &cyThumbnail);
    289             rc = DisplayMakePNG(pu8Data, cx, cy, &pu8PNG, &cbPNG, &cxPNG, &cyPNG, 1);
    290             if (RT_FAILURE(rc))
     317#ifdef VBOX_WITH_CROGL
     318        BOOL f3DSnapshot = FALSE;
     319        BOOL is3denabled;
     320        that->mParent->machine()->COMGETTER(Accelerate3DEnabled)(&is3denabled);
     321        if (is3denabled && that->mCrOglCallbacks.pfnHasData())
     322        {
     323            VMMDev *pVMMDev = that->mParent->getVMMDev();
     324            if (pVMMDev)
    291325            {
    292                 if (pu8PNG)
     326                VBOX_DISPLAY_SAVESCREENSHOT_DATA *pScreenshot = (VBOX_DISPLAY_SAVESCREENSHOT_DATA*)RTMemAllocZ(sizeof (*pScreenshot));
     327                if (pScreenshot)
    293328                {
    294                     RTMemFree(pu8PNG);
    295                     pu8PNG = NULL;
     329                    /* screen id or CRSCREEN_ALL to specify all enabled */
     330                    pScreenshot->Base.u32Screen = 0;
     331                    pScreenshot->Base.u32Width = 0;
     332                    pScreenshot->Base.u32Height = 0;
     333                    pScreenshot->Base.u32Pitch = 0;
     334                    pScreenshot->Base.pvBuffer = NULL;
     335                    pScreenshot->Base.pvContext = pScreenshot;
     336                    pScreenshot->Base.pfnScreenshotBegin = NULL;
     337                    pScreenshot->Base.pfnScreenshotPerform = displaySaveScreenshotReport;
     338                    pScreenshot->Base.pfnScreenshotEnd = NULL;
     339
     340                    VBOXHGCMSVCPARM parm;
     341
     342                    parm.type = VBOX_HGCM_SVC_PARM_PTR;
     343                    parm.u.pointer.addr = &pScreenshot->Base;
     344                    parm.u.pointer.size = sizeof (pScreenshot->Base);
     345
     346                    int rc = pVMMDev->hgcmHostCall("VBoxSharedCrOpenGL", SHCRGL_HOST_FN_TAKE_SCREENSHOT, 1, &parm);
     347                    if (RT_SUCCESS(rc))
     348                    {
     349                        if (pScreenshot->pu8PNG)
     350                        {
     351                            pu8Thumbnail = pScreenshot->pu8Thumbnail;
     352                            cbThumbnail = pScreenshot->cbThumbnail;
     353                            cxThumbnail = pScreenshot->cxThumbnail;
     354                            cyThumbnail = pScreenshot->cyThumbnail;
     355
     356                            /* PNG screenshot. */
     357                            pu8PNG = pScreenshot->pu8PNG;
     358                            cbPNG = pScreenshot->cbPNG;
     359                            cxPNG = pScreenshot->cxPNG;
     360                            cyPNG = pScreenshot->cyPNG;
     361                            f3DSnapshot = TRUE;
     362                        }
     363                        else
     364                            AssertMsgFailed(("no png\n"));
     365                    }
     366                    else
     367                        AssertMsgFailed(("SHCRGL_HOST_FN_TAKE_SCREENSHOT failed %d\n", rc));
     368
     369
     370                    RTMemFree(pScreenshot);
    296371                }
    297                 cbPNG = 0;
    298                 cxPNG = 0;
    299                 cyPNG = 0;
    300372            }
    301 
    302             /* This can be called from any thread. */
    303             that->mpDrv->pUpPort->pfnFreeScreenshot(that->mpDrv->pUpPort, pu8Data);
     373        }
     374
     375        if (!f3DSnapshot)
     376#endif
     377        {
     378            /* SSM code is executed on EMT(0), therefore no need to use VMR3ReqCallWait. */
     379            int rc = Display::displayTakeScreenshotEMT(that, VBOX_VIDEO_PRIMARY_SCREEN, &pu8Data, &cbData, &cx, &cy);
     380
     381            /*
     382             * It is possible that success is returned but everything is 0 or NULL.
     383             * (no display attached if a VM is running with VBoxHeadless on OSE for example)
     384             */
     385            if (RT_SUCCESS(rc) && pu8Data)
     386            {
     387                Assert(cx && cy);
     388
     389                /* Prepare a small thumbnail and a PNG screenshot. */
     390                displayMakeThumbnail(pu8Data, cx, cy, &pu8Thumbnail, &cbThumbnail, &cxThumbnail, &cyThumbnail);
     391                rc = DisplayMakePNG(pu8Data, cx, cy, &pu8PNG, &cbPNG, &cxPNG, &cyPNG, 1);
     392                if (RT_FAILURE(rc))
     393                {
     394                    if (pu8PNG)
     395                    {
     396                        RTMemFree(pu8PNG);
     397                        pu8PNG = NULL;
     398                    }
     399                    cbPNG = 0;
     400                    cxPNG = 0;
     401                    cyPNG = 0;
     402                }
     403
     404                /* This can be called from any thread. */
     405                that->mpDrv->pUpPort->pfnFreeScreenshot(that->mpDrv->pUpPort, pu8Data);
     406            }
    304407        }
    305408    }
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