Changeset 47566 in vbox for trunk/src/VBox/HostServices/SharedOpenGL/crserverlib
- Timestamp:
- Aug 6, 2013 10:20:23 PM (12 years ago)
- Location:
- trunk/src/VBox/HostServices/SharedOpenGL/crserverlib
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h
r47485 r47566 398 398 399 399 int crServerVBoxParseNumerics(const char *pszStr, const int defaultVal); 400 401 400 402 void CrDpEnter(PCR_DISPLAY pDisplay); 401 403 void CrDpLeave(PCR_DISPLAY pDisplay); 404 int CrDpInit(PCR_DISPLAY pDisplay); 405 void CrDpTerm(PCR_DISPLAY pDisplay); 406 407 DECLINLINE(bool) CrDpIsEmpty(PCR_DISPLAY pDisplay) 408 { 409 return CrVrScrCompositorIsEmpty(&pDisplay->Mural.Compositor); 410 } 411 412 int CrDpSaveState(PCR_DISPLAY pDisplay, PSSMHANDLE pSSM); 413 int CrDpLoadState(PCR_DISPLAY pDisplay, PSSMHANDLE pSSM, uint32_t version); 414 415 void CrDpResize(PCR_DISPLAY pDisplay, int32_t xPos, int32_t yPos, uint32_t width, uint32_t height); 416 void CrDpEntryInit(PCR_DISPLAY_ENTRY pEntry, const VBOXVR_TEXTURE *pTextureData); 417 void CrDpEntryCleanup(PCR_DISPLAY pDisplay, PCR_DISPLAY_ENTRY pEntry); 418 int CrDpEntryRegionsSet(PCR_DISPLAY pDisplay, PCR_DISPLAY_ENTRY pEntry, const RTPOINT *pPos, uint32_t cRegions, const RTRECT *paRegions); 419 int CrDpEntryRegionsAdd(PCR_DISPLAY pDisplay, PCR_DISPLAY_ENTRY pEntry, const RTPOINT *pPos, uint32_t cRegions, const RTRECT *paRegions); 420 void CrDpEntryRegionsClear(PCR_DISPLAY pDisplay); 421 DECLINLINE(bool) CrDpEntryIsUsed(PCR_DISPLAY_ENTRY pEntry) 422 { 423 return CrVrScrCompositorEntryIsInList(&pEntry->CEntry); 424 } 425 426 DECLINLINE(CRMuralInfo*) CrDpGetMural(PCR_DISPLAY pDisplay) 427 { 428 return &pDisplay->Mural; 429 } 430 431 int CrDemGlobalInit(); 432 void CrDemTeGlobalTerm(); 433 int CrDemInit(PCR_DISPLAY_ENTRY_MAP pMap); 434 void CrDemTerm(PCR_DISPLAY_ENTRY_MAP pMap); 435 PCR_DISPLAY_ENTRY CrDemEntryAcquire(PCR_DISPLAY_ENTRY_MAP pMap, GLuint idTexture); 436 void CrDemEntryRelease(PCR_DISPLAY_ENTRY pEntry); 437 int CrDemEntrySaveState(PCR_DISPLAY_ENTRY pEntry, PSSMHANDLE pSSM); 438 int CrDemEntryLoadState(PCR_DISPLAY_ENTRY_MAP pMap, PCR_DISPLAY_ENTRY *ppEntry, PSSMHANDLE pSSM); 439 440 int crServerDisplaySaveState(PSSMHANDLE pSSM); 441 int crServerDisplayLoadState(PSSMHANDLE pSSM, uint32_t u32Version); 402 442 403 443 //#define VBOX_WITH_CRSERVER_DUMPER -
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_context.c
r46173 r47566 382 382 if (id != mural->iCurDrawBuffer) 383 383 { 384 cr Warning("DBO draw buffer changed on make current");384 crDebug("DBO draw buffer changed on make current"); 385 385 mural->iCurDrawBuffer = id; 386 386 } … … 389 389 if (id != mural->iCurReadBuffer) 390 390 { 391 cr Warning("DBO read buffer changed on make current");391 crDebug("DBO read buffer changed on make current"); 392 392 mural->iCurReadBuffer = id; 393 393 } -
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c
r47529 r47566 189 189 crServerDisplayTermAll(); 190 190 CrDemTerm(&cr_server.PresentTexturepMap); 191 CrDemTeGlobalTerm(); 191 192 memset(cr_server.DisplaysInitMap, 0, sizeof (cr_server.DisplaysInitMap)); 192 193 memset(cr_server.aDispplays, 0, sizeof (cr_server.aDispplays)); … … 348 349 cr_server.u32Caps = 0; 349 350 #ifdef DEBUG_misha 350 //cr_server.u32Caps = CR_VBOX_CAP_TEX_PRESENT;351 cr_server.u32Caps = CR_VBOX_CAP_TEX_PRESENT; 351 352 #endif 352 353 } … … 381 382 cr_server.dummyMuralTable = crAllocHashtable(); 382 383 384 CrDemGlobalInit(); 385 383 386 CrDemInit(&cr_server.PresentTexturepMap); 384 387 memset(cr_server.DisplaysInitMap, 0, sizeof (cr_server.DisplaysInitMap)); … … 460 463 cr_server.u32Caps = 0; 461 464 #ifdef DEBUG_misha 462 //cr_server.u32Caps = CR_VBOX_CAP_TEX_PRESENT;465 cr_server.u32Caps = CR_VBOX_CAP_TEX_PRESENT; 463 466 #endif 464 467 } … … 501 504 502 505 cr_server.dummyMuralTable = crAllocHashtable(); 506 507 CrDemGlobalInit(); 503 508 504 509 CrDemInit(&cr_server.PresentTexturepMap); … … 1725 1730 } 1726 1731 1732 rc = crServerDisplaySaveState(pSSM); 1733 AssertRCReturn(rc, rc); 1734 1727 1735 /* all context gl error states should have now be synced with chromium erro states, 1728 1736 * reset the error if any */ … … 2612 2620 cr_server.curClient = NULL; 2613 2621 2622 if (version >= SHCROGL_SSM_VERSION_WITH_SCREEN_INFO) 2623 { 2624 rc = crServerDisplayLoadState(pSSM, version); 2625 AssertRCReturn(rc, rc); 2626 } 2627 2614 2628 while ((err = cr_server.head_spu->dispatch_table.GetError()) != GL_NO_ERROR) 2615 2629 crWarning("crServer: glGetError %d after loading snapshot", err); -
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp
r47116 r47566 31 31 #include <iprt/asm.h> 32 32 #include <iprt/mem.h> 33 #include <iprt/list.h> 34 #include <iprt/memcache.h> 33 35 34 36 … … 63 65 { 64 66 const GLint visBits = cr_server.MainContextInfo.CreateInfo.visualBits; 65 if (crServerMuralInit(&pDisplay->Mural, "", visBits, 0, GL_FALSE) < 0)67 if (crServerMuralInit(&pDisplay->Mural, "", visBits, -1, GL_FALSE) < 0) 66 68 { 67 69 crWarning("crServerMuralInit failed!"); … … 85 87 CrVrScrCompositorSetStretching(&pDisplay->Mural.Compositor, 1., 1.); 86 88 } 89 90 int CrDpSaveState(PCR_DISPLAY pDisplay, PSSMHANDLE pSSM) 91 { 92 VBOXVR_SCR_COMPOSITOR_ITERATOR Iter; 93 CrVrScrCompositorIterInit(&pDisplay->Mural.Compositor, &Iter); 94 PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry; 95 uint32_t u32 = 0; 96 while ((pEntry = CrVrScrCompositorIterNext(&Iter)) != NULL) 97 { 98 ++u32; 99 } 100 101 int rc = SSMR3PutU32(pSSM, u32); 102 AssertRCReturn(rc, rc); 103 104 CrVrScrCompositorIterInit(&pDisplay->Mural.Compositor, &Iter); 105 106 while ((pEntry = CrVrScrCompositorIterNext(&Iter)) != NULL) 107 { 108 CR_DISPLAY_ENTRY *pDEntry = CR_DENTRY_FROM_CENTRY(pEntry); 109 rc = CrDemEntrySaveState(pDEntry, pSSM); 110 AssertRCReturn(rc, rc); 111 112 u32 = CrVrScrCompositorEntryFlagsGet(&pDEntry->CEntry); 113 rc = SSMR3PutU32(pSSM, u32); 114 AssertRCReturn(rc, rc); 115 116 rc = SSMR3PutS32(pSSM, CrVrScrCompositorEntryPosGet(&pDEntry->CEntry)->x); 117 AssertRCReturn(rc, rc); 118 119 rc = SSMR3PutS32(pSSM, CrVrScrCompositorEntryPosGet(&pDEntry->CEntry)->y); 120 AssertRCReturn(rc, rc); 121 122 const RTRECT * pRects; 123 rc = CrVrScrCompositorEntryRegionsGet(&pDisplay->Mural.Compositor, &pDEntry->CEntry, &u32, NULL, NULL, &pRects); 124 AssertRCReturn(rc, rc); 125 126 rc = SSMR3PutU32(pSSM, u32); 127 AssertRCReturn(rc, rc); 128 129 if (u32) 130 { 131 rc = SSMR3PutMem(pSSM, pRects, u32 * sizeof (*pRects)); 132 AssertRCReturn(rc, rc); 133 } 134 } 135 136 return VINF_SUCCESS; 137 } 138 139 int CrDpLoadState(PCR_DISPLAY pDisplay, PSSMHANDLE pSSM, uint32_t version) 140 { 141 uint32_t u32 = 0; 142 int rc = SSMR3GetU32(pSSM, &u32); 143 AssertRCReturn(rc, rc); 144 145 if (!u32) 146 return VINF_SUCCESS; 147 148 CrDpEnter(pDisplay); 149 150 for (uint32_t i = 0; i < u32; ++i) 151 { 152 CR_DISPLAY_ENTRY *pDEntry; 153 rc = CrDemEntryLoadState(&cr_server.PresentTexturepMap, &pDEntry, pSSM); 154 AssertRCReturn(rc, rc); 155 156 uint32_t fFlags; 157 rc = SSMR3GetU32(pSSM, &fFlags); 158 AssertRCReturn(rc, rc); 159 160 CrVrScrCompositorEntryFlagsSet(&pDEntry->CEntry, fFlags); 161 162 RTPOINT Pos; 163 rc = SSMR3GetS32(pSSM, &Pos.x); 164 AssertRCReturn(rc, rc); 165 166 rc = SSMR3GetS32(pSSM, &Pos.y); 167 AssertRCReturn(rc, rc); 168 169 uint32_t cRects; 170 rc = SSMR3GetU32(pSSM, &cRects); 171 AssertRCReturn(rc, rc); 172 173 RTRECT * pRects = NULL; 174 if (cRects) 175 { 176 pRects = (RTRECT *)crAlloc(cRects * sizeof (*pRects)); 177 AssertReturn(pRects, VERR_NO_MEMORY); 178 179 rc = SSMR3GetMem(pSSM, pRects, cRects * sizeof (*pRects)); 180 AssertRCReturn(rc, rc); 181 } 182 183 rc = CrDpEntryRegionsAdd(pDisplay, pDEntry, &Pos, (uint32_t)cRects, (const RTRECT*)pRects); 184 AssertRCReturn(rc, rc); 185 186 if (pRects) 187 crFree(pRects); 188 } 189 190 CrDpLeave(pDisplay); 191 192 return VINF_SUCCESS; 193 } 194 87 195 88 196 int CrDpEntryRegionsSet(PCR_DISPLAY pDisplay, PCR_DISPLAY_ENTRY pEntry, const RTPOINT *pPos, uint32_t cRegions, const RTRECT *paRegions) … … 147 255 } 148 256 149 void CrDpEntryInit(PCR_DISPLAY_ENTRY pEntry, const VBOXVR_TEXTURE *pTextureData , void *pvUserData1, void *pvUserData2)257 void CrDpEntryInit(PCR_DISPLAY_ENTRY pEntry, const VBOXVR_TEXTURE *pTextureData) 150 258 { 151 259 CrVrScrCompositorEntryInit(&pEntry->CEntry, pTextureData, crDpEntryCEntryReleaseCB); … … 153 261 CrVrScrCompositorEntryInit(&pEntry->RootVrCEntry, pTextureData, NULL); 154 262 CrVrScrCompositorEntryFlagsSet(&pEntry->RootVrCEntry, CRBLT_F_INVERT_SRC_YCOORDS); 155 pEntry->pvUserData1 = pvUserData1;156 pEntry->pvUserData2 = pvUserData2;157 263 } 158 264 … … 174 280 } 175 281 176 int CrDemInit(PCR_DISPLAY_ENTRY_MAP pMap) 177 { 178 pMap->pTextureMap = crAllocHashtable(); 179 if (pMap->pTextureMap) 180 return VINF_SUCCESS; 181 182 crWarning("crAllocHashtable failed!"); 183 return VERR_NO_MEMORY; 184 } 185 186 void crDemEntryRelease(PCR_DISPLAY_ENTRY_MAP pMap, PCR_DISPLAY_ENTRY pEntry, bool fForceDelete) 187 { 188 CRTextureObj *pTobj = (CRTextureObj *)pEntry->pvUserData2; 189 if (!pTobj) 190 { 191 crWarning("Trying to release entry that does not have tobj specified"); 192 return; 193 } 194 195 CR_STATE_SHAREDOBJ_USAGE_CLEAR(pTobj, cr_server.MainContextInfo.pContext); 196 197 bool fDeleteEntry = fForceDelete; 198 GLuint idTexture = pTobj->id; 282 typedef struct CR_DEM_ENTRY_INFO 283 { 284 CRTextureObj *pTobj; 285 uint32_t cEntries; 286 } CR_DEM_ENTRY_INFO; 287 288 typedef struct CR_DEM_ENTRY 289 { 290 CR_DISPLAY_ENTRY Entry; 291 CR_DEM_ENTRY_INFO *pInfo; 292 CR_DISPLAY_ENTRY_MAP *pMap; 293 } CR_DEM_ENTRY; 294 295 #define PCR_DEM_ENTRY_FROM_ENTRY(_pEntry) ((CR_DEM_ENTRY*)((uint8_t*)(_pEntry) - RT_OFFSETOF(CR_DEM_ENTRY, Entry))) 296 297 static RTMEMCACHE g_VBoxCrDemLookasideList; 298 static RTMEMCACHE g_VBoxCrDemInfoLookasideList; 299 300 int CrDemGlobalInit() 301 { 302 int rc = RTMemCacheCreate(&g_VBoxCrDemLookasideList, sizeof (CR_DEM_ENTRY), 303 0, /* size_t cbAlignment */ 304 UINT32_MAX, /* uint32_t cMaxObjects */ 305 NULL, /* PFNMEMCACHECTOR pfnCtor*/ 306 NULL, /* PFNMEMCACHEDTOR pfnDtor*/ 307 NULL, /* void *pvUser*/ 308 0 /* uint32_t fFlags*/ 309 ); 310 if (RT_SUCCESS(rc)) 311 { 312 rc = RTMemCacheCreate(&g_VBoxCrDemInfoLookasideList, sizeof (CR_DEM_ENTRY_INFO), 313 0, /* size_t cbAlignment */ 314 UINT32_MAX, /* uint32_t cMaxObjects */ 315 NULL, /* PFNMEMCACHECTOR pfnCtor*/ 316 NULL, /* PFNMEMCACHEDTOR pfnDtor*/ 317 NULL, /* void *pvUser*/ 318 0 /* uint32_t fFlags*/ 319 ); 320 if (RT_SUCCESS(rc)) 321 return VINF_SUCCESS; 322 else 323 crWarning("RTMemCacheCreate failed rc %d", rc); 324 325 RTMemCacheDestroy(g_VBoxCrDemLookasideList); 326 } 327 else 328 crWarning("RTMemCacheCreate failed rc %d", rc); 329 return VINF_SUCCESS; 330 } 331 332 void CrDemTeGlobalTerm() 333 { 334 RTMemCacheDestroy(g_VBoxCrDemLookasideList); 335 RTMemCacheDestroy(g_VBoxCrDemInfoLookasideList); 336 } 337 338 static CR_DEM_ENTRY* crDemEntryAlloc() 339 { 340 return (CR_DEM_ENTRY*)RTMemCacheAlloc(g_VBoxCrDemLookasideList); 341 } 342 343 static CR_DEM_ENTRY_INFO* crDemEntryInfoAlloc() 344 { 345 return (CR_DEM_ENTRY_INFO*)RTMemCacheAlloc(g_VBoxCrDemInfoLookasideList); 346 } 347 348 static void crDemEntryFree(CR_DEM_ENTRY* pDemEntry) 349 { 350 RTMemCacheFree(g_VBoxCrDemLookasideList, pDemEntry); 351 } 352 353 static void crDemEntryInfoFree(CR_DEM_ENTRY_INFO* pDemEntryInfo) 354 { 355 RTMemCacheFree(g_VBoxCrDemInfoLookasideList, pDemEntryInfo); 356 } 357 358 void crDemEntryRelease(PCR_DISPLAY_ENTRY_MAP pMap, CR_DEM_ENTRY *pDemEntry) 359 { 360 CR_DEM_ENTRY_INFO *pInfo = pDemEntry->pInfo; 361 CRTextureObj *pTobj = pInfo->pTobj; 362 363 --pInfo->cEntries; 364 365 if (!pInfo->cEntries) 366 { 367 CR_STATE_SHAREDOBJ_USAGE_CLEAR(pInfo->pTobj, cr_server.MainContextInfo.pContext); 368 369 crHashtableDelete(pMap->pTexIdToDemInfoMap, pTobj->id, NULL); 370 371 crDemEntryInfoFree(pInfo); 372 } 199 373 200 374 if (!CR_STATE_SHAREDOBJ_USAGE_IS_USED(pTobj)) … … 205 379 /* on the host side, we need to delete an ogl texture object here as well, which crStateDeleteTextureCallback will do 206 380 * in addition to calling crStateDeleteTextureObject to delete a state object */ 207 crHashtableDelete(pShared->textureTable, idTexture, crStateDeleteTextureCallback);381 crHashtableDelete(pShared->textureTable, pTobj->id, crStateDeleteTextureCallback); 208 382 209 383 crStateGlobalSharedRelease(); 210 211 fDeleteEntry = true; 212 } 213 else 214 { 215 /* this is something we would not generally expect */ 216 CRASSERT(!fForceDelete); 217 } 218 219 if (fDeleteEntry) 220 { 221 if (pMap) 222 crHashtableDelete(pMap->pTextureMap, idTexture, crFree); 223 else 224 crFree(pEntry); /* <- when called from crDemTermEntryCb */ 225 226 crStateGlobalSharedRelease(); 227 } 228 } 229 230 void crDemTermEntryCb(void *pvEntry) 231 { 232 crDemEntryRelease(NULL, (PCR_DISPLAY_ENTRY)pvEntry, true); 384 } 385 386 crDemEntryFree(pDemEntry); 387 388 crStateGlobalSharedRelease(); 389 } 390 391 int CrDemInit(PCR_DISPLAY_ENTRY_MAP pMap) 392 { 393 pMap->pTexIdToDemInfoMap = crAllocHashtable(); 394 if (pMap->pTexIdToDemInfoMap) 395 return VINF_SUCCESS; 396 397 crWarning("crAllocHashtable failed"); 398 return VERR_NO_MEMORY; 233 399 } 234 400 235 401 void CrDemTerm(PCR_DISPLAY_ENTRY_MAP pMap) 236 402 { 237 crFreeHashtable(pMap->pTextureMap, crDemTermEntryCb); 403 crFreeHashtable(pMap->pTexIdToDemInfoMap, NULL); 404 pMap->pTexIdToDemInfoMap = NULL; 238 405 } 239 406 240 407 void CrDemEntryRelease(PCR_DISPLAY_ENTRY pEntry) 241 408 { 242 PCR_DISPLAY_ENTRY_MAP pMap = (PCR_DISPLAY_ENTRY_MAP)pEntry->pvUserData1; 243 Assert(pMap); 244 crDemEntryRelease(pMap, pEntry, false); 409 CR_DEM_ENTRY *pDemEntry = PCR_DEM_ENTRY_FROM_ENTRY(pEntry); 410 crDemEntryRelease(pDemEntry->pMap, pDemEntry); 411 } 412 413 int CrDemEntrySaveState(PCR_DISPLAY_ENTRY pEntry, PSSMHANDLE pSSM) 414 { 415 CR_DEM_ENTRY *pDemEntry = PCR_DEM_ENTRY_FROM_ENTRY(pEntry); 416 int rc = SSMR3PutU32(pSSM, pDemEntry->pInfo->pTobj->id); 417 AssertRCReturn(rc, rc); 418 return rc; 419 } 420 421 int CrDemEntryLoadState(PCR_DISPLAY_ENTRY_MAP pMap, PCR_DISPLAY_ENTRY *ppEntry, PSSMHANDLE pSSM) 422 { 423 uint32_t u32; 424 int rc = SSMR3GetU32(pSSM, &u32); 425 AssertRCReturn(rc, rc); 426 427 PCR_DISPLAY_ENTRY pEntry = CrDemEntryAcquire(pMap, u32); 428 if (!pEntry) 429 { 430 crWarning("CrDemEntryAcquire failed"); 431 return VERR_NO_MEMORY; 432 } 433 434 *ppEntry = pEntry; 435 return VINF_SUCCESS; 245 436 } 246 437 247 438 PCR_DISPLAY_ENTRY CrDemEntryAcquire(PCR_DISPLAY_ENTRY_MAP pMap, GLuint idTexture) 248 439 { 249 PCR_DISPLAY_ENTRY pEntry = (PCR_DISPLAY_ENTRY)crHashtableSearch(pMap->pTextureMap, idTexture); 250 if (pEntry) 251 return pEntry; 440 CR_DEM_ENTRY *pDemEntry = NULL; 252 441 253 442 CRSharedState *pShared = crStateGlobalSharedAcquire(); … … 282 471 TextureData.hwid = hwId; 283 472 284 p Entry = (PCR_DISPLAY_ENTRY)crAlloc(sizeof (*pEntry));285 if (!p Entry)286 { 287 crWarning("cr Alloc failed allocating CR_DISPLAY_ENTRY");473 pDemEntry = crDemEntryAlloc(); 474 if (!pDemEntry) 475 { 476 crWarning("crDemEntryAlloc failed allocating CR_DEM_ENTRY"); 288 477 crStateGlobalSharedRelease(); 289 478 return NULL; 290 479 } 291 480 292 CrDpEntryInit(pEntry, &TextureData, pMap, pTobj); 481 CrDpEntryInit(&pDemEntry->Entry, &TextureData); 482 483 CR_DEM_ENTRY_INFO *pInfo = (CR_DEM_ENTRY_INFO*)crHashtableSearch(pMap->pTexIdToDemInfoMap, pTobj->id); 484 if (!pInfo) 485 { 486 pInfo = crDemEntryInfoAlloc(); 487 CRASSERT(pInfo); 488 crHashtableAdd(pMap->pTexIdToDemInfoMap, pTobj->id, pInfo); 489 pInfo->cEntries = 0; 490 pInfo->pTobj = pTobj; 491 } 492 493 ++pInfo->cEntries; 494 pDemEntry->pInfo = pInfo; 495 pDemEntry->pMap = pMap; 293 496 294 497 /* just use main context info's context to hold the texture reference */ 295 498 CR_STATE_SHAREDOBJ_USAGE_SET(pTobj, cr_server.MainContextInfo.pContext); 296 499 297 crHashtableAdd(pMap->pTextureMap, idTexture, pEntry); 298 return pEntry; 299 300 } 301 #if 0 302 void CrDemEntryDestroy(PCR_DISPLAY_ENTRY_MAP pMap, GLuint idTexture) 303 { 304 #ifdef DEBUG 305 { 306 PCR_DISPLAY_ENTRY pEntry = (PCR_DISPLAY_ENTRY)crHashtableSearch(pMap->pTextureMap, idTexture); 307 if (!pEntry) 308 { 309 crWarning("request to delete inexistent entry"); 310 return; 311 } 312 313 Assert(!CrDpEntryIsUsed(pEntry)); 314 } 315 #endif 316 crHashtableDelete(pMap->pTextureMap, idTexture, crFree); 317 } 318 #endif 500 return &pDemEntry->Entry; 501 } 502 319 503 PCR_DISPLAY crServerDisplayGetInitialized(uint32_t idScreen) 320 504 { … … 352 536 } 353 537 538 int crServerDisplaySaveState(PSSMHANDLE pSSM) 539 { 540 int rc; 541 int cDisplays = 0, i; 542 for (i = 0; i < cr_server.screenCount; ++i) 543 { 544 if (ASMBitTest(cr_server.DisplaysInitMap, i) && !CrDpIsEmpty(&cr_server.aDispplays[i])) 545 ++cDisplays; 546 } 547 548 rc = SSMR3PutS32(pSSM, cDisplays); 549 AssertRCReturn(rc, rc); 550 551 for (i = 0; i < cr_server.screenCount; ++i) 552 { 553 if (ASMBitTest(cr_server.DisplaysInitMap, i) && !CrDpIsEmpty(&cr_server.aDispplays[i])) 554 { 555 rc = SSMR3PutS32(pSSM, i); 556 AssertRCReturn(rc, rc); 557 558 rc = CrDpSaveState(&cr_server.aDispplays[i], pSSM); 559 AssertRCReturn(rc, rc); 560 } 561 } 562 563 return VINF_SUCCESS; 564 } 565 566 int crServerDisplayLoadState(PSSMHANDLE pSSM, uint32_t u32Version) 567 { 568 int rc; 569 int s32, i; 570 571 rc = SSMR3GetS32(pSSM, &s32); 572 AssertRCReturn(rc, rc); 573 574 for (i = 0; i < s32; ++i) 575 { 576 int iScreen; 577 578 rc = SSMR3GetS32(pSSM, &iScreen); 579 AssertRCReturn(rc, rc); 580 581 PCR_DISPLAY pDisplay = crServerDisplayGet((uint32_t)iScreen); 582 if (!pDisplay) 583 { 584 crWarning("crServerDisplayGet failed"); 585 return VERR_GENERAL_FAILURE; 586 } 587 588 rc = CrDpLoadState(pDisplay, pSSM, u32Version); 589 AssertRCReturn(rc, rc); 590 } 591 592 return VINF_SUCCESS; 593 } 594 354 595 void crServerDisplayTermAll() 355 596 { -
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_window.c
r47529 r47566 492 492 } 493 493 494 #define CR_DENTRY_FROM_CENTRY(_pCentry) ((CR_DISPLAY_ENTRY*)((uint8_t*)(_pCentry) - RT_OFFSETOF(CR_DISPLAY_ENTRY, CEntry)))495 496 494 static DECLCALLBACK(VBOXVR_SCR_COMPOSITOR_ENTRY*) crServerMuralGetRootVrCEntry(VBOXVR_SCR_COMPOSITOR_ENTRY*pEntry, void *pvContext) 497 495 { … … 706 704 if (mural->fRootVrOn) 707 705 { 708 uint32_t cRects;709 const RTRECT *pRects;710 706 int rc = crServerMuralSynchRootVr(mural); 711 707 if (RT_SUCCESS(rc))
Note:
See TracChangeset
for help on using the changeset viewer.