Changeset 50405 in vbox
- Timestamp:
- Feb 10, 2014 8:10:18 PM (11 years ago)
- Location:
- trunk/src/VBox
- Files:
-
- 4 edited
-
HostServices/SharedOpenGL/crserverlib/server_main.c (modified) (3 diffs)
-
HostServices/SharedOpenGL/crserverlib/server_presenter.cpp (modified) (1 diff)
-
HostServices/SharedOpenGL/render/renderspu.c (modified) (1 diff)
-
Main/src-client/DisplayImpl.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c
r50313 r50405 137 137 GLint i; 138 138 CRClientNode *pNode, *pNext; 139 GLboolean fOldEnableDiff; 139 140 140 141 /* avoid a race condition */ … … 159 160 cr_server.currentMural = NULL; 160 161 161 if (CrBltIsInitialized(&cr_server.Blitter))162 {163 CrBltTerm(&cr_server.Blitter);164 }165 166 162 /* sync our state with renderspu, 167 163 * do it before mural & context deletion to avoid deleting currently set murals/contexts*/ … … 179 175 crFreeHashtable(cr_server.contextTable, deleteContextInfoCallback); 180 176 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 181 183 /* Free vertex programs */ 182 184 crFreeHashtable(cr_server.programTable, crFree); 183 185 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 184 196 /* Free dummy murals */ 185 197 crFreeHashtable(cr_server.dummyMuralTable, deleteMuralInfoCallback); 186 187 /* Free murals */188 crFreeHashtable(cr_server.muralTable, deleteMuralInfoCallback);189 190 CrPMgrTerm();191 198 192 199 for (i = 0; i < cr_server.numClients; i++) { -
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp
r50398 r50405 4139 4139 crFree(pRects); 4140 4140 4141 CrFbEntryRelease(pFb, hEntry); 4142 4141 4143 return VINF_SUCCESS; 4142 4144 } -
trunk/src/VBox/HostServices/SharedOpenGL/render/renderspu.c
r50274 r50405 302 302 303 303 curCtx = GET_CONTEXT_VAL(); 304 CRASSERT(curCtx);304 // CRASSERT(curCtx); 305 305 if (curCtx == context) 306 306 { -
trunk/src/VBox/Main/src-client/DisplayImpl.cpp
r50394 r50405 248 248 } 249 249 250 #ifdef VBOX_WITH_CROGL 251 typedef 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 268 static 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 250 291 DECLCALLBACK(void) 251 292 Display::displaySSMSaveScreenshot(PSSMHANDLE pSSM, void *pvUser) … … 274 315 uint32_t cy = 0; 275 316 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) 291 325 { 292 if (pu8PNG) 326 VBOX_DISPLAY_SAVESCREENSHOT_DATA *pScreenshot = (VBOX_DISPLAY_SAVESCREENSHOT_DATA*)RTMemAllocZ(sizeof (*pScreenshot)); 327 if (pScreenshot) 293 328 { 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); 296 371 } 297 cbPNG = 0;298 cxPNG = 0;299 cyPNG = 0;300 372 } 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 } 304 407 } 305 408 }
Note:
See TracChangeset
for help on using the changeset viewer.

