Changeset 50364 in vbox for trunk/src/VBox/HostServices/SharedOpenGL
- Timestamp:
- Feb 7, 2014 2:11:50 PM (11 years ago)
- svn:sync-xref-src-repo-rev:
- 92115
- Location:
- trunk/src/VBox/HostServices/SharedOpenGL
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp
r50341 r50364 939 939 CR_SCREENSHOT Screenshot; 940 940 941 int rc = crServerVBoxScreenshotGet(idScreen, &Screenshot);941 int rc = crServerVBoxScreenshotGet(idScreen, pScreenshot->u32Width, pScreenshot->u32Height, pScreenshot->u32Pitch, pScreenshot->pvBuffer, &Screenshot); 942 942 if (RT_SUCCESS(rc)) 943 943 { 944 pScreenshot->pfnScreenshotPerform(pScreenshot->pvContext, idScreen, 945 0, 0, 32, 946 Screenshot.Img.pitch, Screenshot.Img.width, Screenshot.Img.height, 947 (uint8_t*)Screenshot.Img.pvData, u64Now); 944 if (pScreenshot->pfnScreenshotPerform) 945 pScreenshot->pfnScreenshotPerform(pScreenshot->pvContext, idScreen, 946 0, 0, 32, 947 Screenshot.Img.pitch, Screenshot.Img.width, Screenshot.Img.height, 948 (uint8_t*)Screenshot.Img.pvData, u64Now); 948 949 crServerVBoxScreenshotRelease(&Screenshot); 949 950 } -
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h
r50318 r50364 425 425 void CrFbVisitCreatedEntries(HCR_FRAMEBUFFER hFb, PFNCR_FRAMEBUFFER_ENTRIES_VISITOR_CB pfnVisitorCb, void *pvContext); 426 426 int CrFbResize(HCR_FRAMEBUFFER hFb, const struct VBVAINFOSCREEN * pScreen, void *pvVRAM); 427 int CrFbBltGetContents(HCR_FRAMEBUFFER hFb, const RT POINT *pPoint, uint32_t cRects, const RTRECT *pPrects, CR_BLITTER_IMG *pImg);427 int CrFbBltGetContents(HCR_FRAMEBUFFER hFb, const RTRECT *pSrcRect, uint32_t cRects, const RTRECT *pPrects, CR_BLITTER_IMG *pImg); 428 428 bool CrFbIsEnabled(HCR_FRAMEBUFFER hFb); 429 429 int CrFbEntryCreateForTexId(HCR_FRAMEBUFFER hFb, GLuint idTex, uint32_t fFlags, HCR_FRAMEBUFFER_ENTRY *phEntry); -
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_muralfbo.cpp
r50313 r50364 658 658 } 659 659 660 DECLEXPORT(int) crServerVBoxScreenshotGet(uint32_t u32Screen, CR_SCREENSHOT *pScreenshot) 660 DECLEXPORT(void) crServerVBoxScreenshotRelease(CR_SCREENSHOT *pScreenshot) 661 { 662 if (pScreenshot->fDataAllocated) 663 { 664 RTMemFree(pScreenshot->Img.pvData); 665 pScreenshot->fDataAllocated = 0; 666 } 667 } 668 669 DECLEXPORT(int) crServerVBoxScreenshotGet(uint32_t u32Screen, uint32_t width, uint32_t height, uint32_t pitch, void *pvBuffer, CR_SCREENSHOT *pScreenshot) 661 670 { 662 671 HCR_FRAMEBUFFER hFb = CrPMgrFbGetEnabled(u32Screen); … … 666 675 const VBVAINFOSCREEN *pScreen = CrFbGetScreenInfo(hFb); 667 676 668 if (CrFbHas3DData(hFb)) 669 { 670 RTPOINT Pos = {0, 0}; 677 if (!width) 678 width = pScreen->u32Width; 679 if (!height) 680 height = pScreen->u32Height; 681 if (!pitch) 682 pitch = pScreen->u32LineSize; 683 684 if (CrFbHas3DData(hFb) 685 || pScreen->u32Width != width 686 || pScreen->u32Height != height 687 || pScreen->u32LineSize != pitch 688 || pScreen->u16BitsPerPixel != 32) 689 { 671 690 RTRECT Rect; 672 691 673 692 pScreenshot->Img.cbData = pScreen->u32LineSize * pScreen->u32Height; 674 pScreenshot->Img.pvData = RTMemAlloc(pScreenshot->Img.cbData); 675 if (!pScreenshot->Img.pvData) 676 { 677 WARN(("RTMemAlloc failed")); 678 return VERR_NO_MEMORY; 693 if (!pvBuffer) 694 { 695 pScreenshot->Img.pvData = RTMemAlloc(pScreenshot->Img.cbData); 696 if (!pScreenshot->Img.pvData) 697 { 698 WARN(("RTMemAlloc failed")); 699 return VERR_NO_MEMORY; 700 } 701 pScreenshot->fDataAllocated = 1; 702 } 703 else 704 { 705 pScreenshot->Img.pvData = pvBuffer; 706 pScreenshot->fDataAllocated = 0; 707 } 708 709 pScreenshot->Img.enmFormat = GL_BGRA; 710 pScreenshot->Img.width = width; 711 pScreenshot->Img.height = height; 712 pScreenshot->Img.bpp = 32; 713 pScreenshot->Img.pitch = pitch; 714 Rect.xLeft = 0; 715 Rect.yTop = 0; 716 Rect.xRight = pScreen->u32Width; 717 Rect.yBottom = pScreen->u32Height; 718 int rc = CrFbBltGetContents(hFb, &Rect, 1, &Rect, &pScreenshot->Img); 719 if (!RT_SUCCESS(rc)) 720 { 721 WARN(("CrFbBltGetContents failed %d", rc)); 722 crServerVBoxScreenshotRelease(pScreenshot); 723 return rc; 724 } 725 } 726 else 727 { 728 pScreenshot->Img.cbData = pScreen->u32LineSize * pScreen->u32Height; 729 if (!pvBuffer) 730 pScreenshot->Img.pvData = CrFbGetVRAM(hFb); 731 else 732 { 733 pScreenshot->Img.pvData = pvBuffer; 734 memcpy(pvBuffer, CrFbGetVRAM(hFb), pScreenshot->Img.cbData); 679 735 } 680 736 pScreenshot->Img.enmFormat = GL_BGRA; … … 683 739 pScreenshot->Img.bpp = pScreen->u16BitsPerPixel; 684 740 pScreenshot->Img.pitch = pScreen->u32LineSize; 685 Rect.xLeft = 0; 686 Rect.yTop = 0; 687 Rect.xRight = pScreenshot->Img.width; 688 Rect.yBottom = pScreenshot->Img.height; 689 int rc = CrFbBltGetContents(hFb, &Pos, 1, &Rect, &pScreenshot->Img); 690 if (!RT_SUCCESS(rc)) 691 { 692 WARN(("CrFbBltGetContents failed %d", rc)); 693 RTMemFree(pScreenshot->Img.pvData); 694 return rc; 695 } 696 pScreenshot->fDataIsFbDirect = 0; 697 } 698 else 699 { 700 pScreenshot->Img.pvData = CrFbGetVRAM(hFb); 701 pScreenshot->Img.cbData = pScreen->u32LineSize * pScreen->u32Height; 702 pScreenshot->Img.enmFormat = GL_BGRA; 703 pScreenshot->Img.width = pScreen->u32Width; 704 pScreenshot->Img.height = pScreen->u32Height; 705 pScreenshot->Img.bpp = pScreen->u16BitsPerPixel; 706 pScreenshot->Img.pitch = pScreen->u32LineSize; 707 708 pScreenshot->fDataIsFbDirect = 1; 741 742 pScreenshot->fDataAllocated = 0; 709 743 } 710 744 … … 712 746 713 747 return VINF_SUCCESS; 714 }715 716 DECLEXPORT(void) crServerVBoxScreenshotRelease(CR_SCREENSHOT *pScreenshot)717 {718 if (!pScreenshot->fDataIsFbDirect)719 {720 RTMemFree(pScreenshot->Img.pvData);721 pScreenshot->fDataIsFbDirect = 1;722 }723 748 } 724 749 -
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp
r50313 r50364 27 27 #include <cr_vreg.h> 28 28 #include <cr_htable.h> 29 #include <cr_bmpscale.h> 29 30 30 31 #include <iprt/cdefs.h> … … 83 84 CRHTABLE SlotTable; 84 85 } CR_FRAMEBUFFER; 86 87 typedef union CR_FBENTRY_FLAGS 88 { 89 struct { 90 uint32_t fCreateNotified : 1; 91 uint32_t fInList : 1; 92 uint32_t Reserved : 30; 93 }; 94 uint32_t Value; 95 } CR_FBENTRY_FLAGS; 96 97 typedef struct CR_FRAMEBUFFER_ENTRY 98 { 99 VBOXVR_SCR_COMPOSITOR_ENTRY Entry; 100 RTLISTNODE Node; 101 uint32_t cRefs; 102 CR_FBENTRY_FLAGS Flags; 103 CRHTABLE HTable; 104 } CR_FRAMEBUFFER_ENTRY; 105 106 typedef struct CR_FBTEX 107 { 108 CR_TEXDATA Tex; 109 CRTextureObj *pTobj; 110 } CR_FBTEX; 111 112 #define PCR_FBTEX_FROM_TEX(_pTex) ((CR_FBTEX*)((uint8_t*)(_pTex) - RT_OFFSETOF(CR_FBTEX, Tex))) 113 #define PCR_FRAMEBUFFER_FROM_COMPOSITOR(_pCompositor) ((CR_FRAMEBUFFER*)((uint8_t*)(_pCompositor) - RT_OFFSETOF(CR_FRAMEBUFFER, Compositor))) 114 #define PCR_FBENTRY_FROM_ENTRY(_pEntry) ((CR_FRAMEBUFFER_ENTRY*)((uint8_t*)(_pEntry) - RT_OFFSETOF(CR_FRAMEBUFFER_ENTRY, Entry))) 115 85 116 86 117 typedef struct CR_FBDISPLAY_INFO … … 234 265 } 235 266 236 int CrFbBltGetContents(HCR_FRAMEBUFFER hFb, const RTPOINT *pPoint, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pImg) 267 static void crFbBltImgStretched(void *pvSrc, const RTRECT *pSrcDataRect, bool fSrcInvert, const RTRECT *pCopyRect, const RTPOINT *pDstDataPoint, float strX, float strY, CR_BLITTER_IMG *pDst) 268 { 269 int32_t cbSrcPitch = (pSrcDataRect->xRight - pSrcDataRect->xLeft) * 4; 270 int32_t srcX = pCopyRect->xLeft - pSrcDataRect->xLeft; 271 int32_t srcY = pCopyRect->yTop - pSrcDataRect->yTop; 272 Assert(srcX >= 0); 273 Assert(srcY >= 0); 274 Assert(srcX < pSrcDataRect->xRight - pSrcDataRect->xLeft); 275 Assert(srcY < pSrcDataRect->yBottom - pSrcDataRect->yTop); 276 277 int32_t cbDstPitch = (int32_t)pDst->pitch; 278 int32_t dstX = static_cast<uint32_t>(strX * pCopyRect->xLeft - pDstDataPoint->x); 279 int32_t dstY = static_cast<uint32_t>(strY * pCopyRect->yTop - pDstDataPoint->y); 280 Assert(dstX >= 0); 281 Assert(dstY >= 0); 282 283 uint8_t *pu8Src = ((uint8_t*)pvSrc) + cbSrcPitch * (!fSrcInvert ? srcY : pSrcDataRect->yBottom - pSrcDataRect->yTop - srcY - 1) + srcX * 4; 284 uint8_t *pu8Dst = ((uint8_t*)pDst->pvData) + cbDstPitch * dstY + dstX * 4; 285 if (fSrcInvert) 286 cbSrcPitch = -cbSrcPitch; 287 288 int srcW = pCopyRect->xRight - pCopyRect->xLeft; 289 int srcH = pCopyRect->yBottom - pCopyRect->yTop; 290 int dstW = static_cast<uint32_t>(strX * srcW); 291 int dstH = static_cast<uint32_t>(strY * srcH); 292 293 CrBmpScale32(pu8Dst, cbDstPitch, 294 dstW, dstH, 295 pu8Src, 296 cbSrcPitch, 297 srcW, srcH); 298 } 299 300 301 static int crFbBltGetContentsDirect(HCR_FRAMEBUFFER hFb, const RTRECT *pSrcRect, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pImg) 237 302 { 238 303 VBOXVR_LIST List; 239 304 uint32_t c2DRects = 0; 240 305 CR_TEXDATA *pEnteredTex = NULL; 306 PCR_BLITTER pEnteredBlitter = NULL; 307 308 VBOXVR_SCR_COMPOSITOR_CONST_ITERATOR Iter; 309 RTPOINT SrcPoint = {pSrcRect->xLeft, pSrcRect->yTop}; 310 float strX = ((float)pImg->width) / (pSrcRect->xRight - pSrcRect->xLeft); 311 float strY = ((float)pImg->height) / (pSrcRect->yBottom - pSrcRect->yTop); 312 241 313 VBoxVrListInit(&List); 242 314 int rc = VBoxVrListRectsAdd(&List, 1, CrVrScrCompositorRectGet(&hFb->Compositor), NULL); … … 247 319 } 248 320 249 VBOXVR_SCR_COMPOSITOR_CONST_ITERATOR Iter;250 251 321 CrVrScrCompositorConstIterInit(&hFb->Compositor, &Iter); 252 322 … … 271 341 } 272 342 273 Assert(!pEnteredTex); 343 uint32_t width, height; 344 RTRECT SrcRect; 274 345 275 346 for (uint32_t i = 0; i < cRects; ++i) … … 284 355 continue; 285 356 357 VBoxRectStretch(&Intersection, strX, strY); 358 if (VBoxRectIsZero(&Intersection)) 359 continue; 360 286 361 CR_TEXDATA *pTex = CrVrScrCompositorEntryTexGet(pEntry); 287 362 const CR_BLITTER_IMG *pSrcImg; 288 363 289 if ( !pEnteredTex)364 if (pEnteredTex != pTex) 290 365 { 366 if (!pEnteredBlitter) 367 { 368 pEnteredBlitter = CrTdBlitterGet(pTex); 369 rc = CrBltEnter(pEnteredBlitter); 370 if (!RT_SUCCESS(rc)) 371 { 372 WARN(("CrBltEnter failed %d", rc)); 373 pEnteredBlitter = NULL; 374 goto end; 375 } 376 } 377 378 if (pEnteredTex) 379 { 380 CrTdBltLeave(pEnteredTex); 381 382 pEnteredTex = NULL; 383 384 if (pEnteredBlitter != CrTdBlitterGet(pTex)) 385 { 386 WARN(("blitters not equal!")); 387 CrBltLeave(pEnteredBlitter); 388 389 pEnteredBlitter = CrTdBlitterGet(pTex); 390 rc = CrBltEnter(pEnteredBlitter); 391 if (!RT_SUCCESS(rc)) 392 { 393 WARN(("CrBltEnter failed %d", rc)); 394 pEnteredBlitter = NULL; 395 goto end; 396 } 397 } 398 } 399 291 400 rc = CrTdBltEnter(pTex); 292 401 if (!RT_SUCCESS(rc)) … … 297 406 298 407 pEnteredTex = pTex; 408 409 const VBOXVR_TEXTURE *pVrTex = CrTdTexGet(pTex); 410 411 width = static_cast<uint32_t>(strX * pVrTex->width); 412 height = static_cast<uint32_t>(strY * pVrTex->height); 413 VBoxRectStretched(CrVrScrCompositorEntryRectGet(pEntry), strX, strY, &SrcRect); 299 414 } 300 415 301 rc = CrTdBltDataAcquire (pTex, GL_BGRA, false, &pSrcImg);416 rc = CrTdBltDataAcquireStretched(pTex, GL_BGRA, false, width, height, &pSrcImg); 302 417 if (!RT_SUCCESS(rc)) 303 418 { … … 306 421 } 307 422 308 const RTRECT *pEntryRect = CrVrScrCompositorEntryRectGet(pEntry);309 423 bool fInvert = !(CrVrScrCompositorEntryFlagsGet(pEntry) & CRBLT_F_INVERT_SRC_YCOORDS); 310 424 311 crFbBltImg(pSrcImg->pvData, pEntryRect, fInvert, &Intersection, pPoint, pImg);312 313 CrTdBltDataRelease (pTex);425 crFbBltImg(pSrcImg->pvData, &SrcRect, fInvert, &Intersection, &SrcPoint, pImg); 426 427 CrTdBltDataReleaseStretched(pTex, pSrcImg); 314 428 } 315 }316 317 if (pEnteredTex)318 {319 CrTdBltLeave(pEnteredTex);320 pEnteredTex = NULL;321 429 } 322 430 } … … 351 459 352 460 RTPOINT Pos = {0}; 461 const RTRECT *pCompRect = CrVrScrCompositorRectGet(&hFb->Compositor); 462 uint32_t fbPitch = (pCompRect->xRight - pCompRect->xLeft) * 4; 463 uint32_t fbHeight = pCompRect->yBottom - pCompRect->yTop; 464 465 uint32_t dstPitch = static_cast<uint32_t>(strX * fbPitch); 466 uint32_t dstHeight = static_cast<uint32_t>(strY * fbHeight); 467 468 bool fStretch = fbPitch != dstPitch || fbHeight != dstHeight; 353 469 354 470 for (uint32_t i = 0; i < cRects; ++i) … … 363 479 continue; 364 480 365 crFbBltImg(hFb->pvVram, CrVrScrCompositorRectGet(&hFb->Compositor), false, &Intersection, pPoint, pImg); 481 if (!fStretch) 482 crFbBltImg(hFb->pvVram, pCompRect, false, &Intersection, &SrcPoint, pImg); 483 else 484 crFbBltImgStretched(hFb->pvVram, pCompRect, false, &Intersection, &SrcPoint, strX, strY, pImg); 366 485 } 367 486 } … … 373 492 CrTdBltLeave(pEnteredTex); 374 493 494 if (pEnteredBlitter) 495 CrBltLeave(pEnteredBlitter); 496 375 497 VBoxVrListClear(&List); 376 498 377 499 return rc; 378 500 } 501 502 static int crFbBltGetContentsStretchCPU(HCR_FRAMEBUFFER hFb, const RTRECT *pSrcRect, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pImg) 503 { 504 uint32_t srcWidth = pSrcRect->xRight - pSrcRect->xLeft; 505 uint32_t srcHeight = pSrcRect->yBottom - pSrcRect->yTop; 506 507 /* destination is bigger than the source, do 3D data stretching with CPU */ 508 CR_BLITTER_IMG Img; 509 Img.cbData = srcWidth * srcHeight * 4; 510 Img.pvData = RTMemAlloc(Img.cbData); 511 if (!Img.pvData) 512 { 513 WARN(("RTMemAlloc Failed")); 514 return VERR_NO_MEMORY; 515 } 516 Img.enmFormat = pImg->enmFormat; 517 Img.width = srcWidth; 518 Img.height = srcHeight; 519 Img.bpp = pImg->bpp; 520 Img.pitch = Img.width * 4; 521 522 int rc = CrFbBltGetContents(hFb, pSrcRect, cRects, pRects, &Img); 523 if (RT_SUCCESS(rc)) 524 { 525 CrBmpScale32((uint8_t *)pImg->pvData, 526 pImg->pitch, 527 pImg->width, pImg->height, 528 (const uint8_t *)Img.pvData, 529 Img.pitch, 530 Img.width, Img.height); 531 } 532 else 533 WARN(("CrFbBltGetContents failed %d", rc)); 534 535 RTMemFree(Img.pvData); 536 537 return rc; 538 539 } 540 541 int CrFbBltGetContents(HCR_FRAMEBUFFER hFb, const RTRECT *pSrcRect, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pImg) 542 { 543 uint32_t srcWidth = pSrcRect->xRight - pSrcRect->xLeft; 544 uint32_t srcHeight = pSrcRect->yBottom - pSrcRect->yTop; 545 if ((srcWidth == pImg->width 546 && srcHeight == pImg->height) 547 || !CrFbHas3DData(hFb) 548 || (srcWidth * srcHeight > pImg->width * pImg->height)) 549 { 550 return crFbBltGetContentsDirect(hFb, pSrcRect, cRects, pRects, pImg); 551 } 552 553 return crFbBltGetContentsStretchCPU(hFb, pSrcRect, cRects, pRects, pImg); 554 } 555 379 556 380 557 int CrFbResize(CR_FRAMEBUFFER *pFb, const struct VBVAINFOSCREEN * pScreen, void *pvVRAM) … … 454 631 } 455 632 456 typedef union CR_FBENTRY_FLAGS457 {458 struct {459 uint32_t fCreateNotified : 1;460 uint32_t fInList : 1;461 uint32_t Reserved : 30;462 };463 uint32_t Value;464 } CR_FBENTRY_FLAGS;465 466 typedef struct CR_FRAMEBUFFER_ENTRY467 {468 VBOXVR_SCR_COMPOSITOR_ENTRY Entry;469 RTLISTNODE Node;470 uint32_t cRefs;471 CR_FBENTRY_FLAGS Flags;472 CRHTABLE HTable;473 } CR_FRAMEBUFFER_ENTRY;474 475 typedef struct CR_FBTEX476 {477 CR_TEXDATA Tex;478 CRTextureObj *pTobj;479 } CR_FBTEX;480 481 #define PCR_FBTEX_FROM_TEX(_pTex) ((CR_FBTEX*)((uint8_t*)(_pTex) - RT_OFFSETOF(CR_FBTEX, Tex)))482 #define PCR_FRAMEBUFFER_FROM_COMPOSITOR(_pCompositor) ((CR_FRAMEBUFFER*)((uint8_t*)(_pCompositor) - RT_OFFSETOF(CR_FRAMEBUFFER, Compositor)))483 #define PCR_FBENTRY_FROM_ENTRY(_pEntry) ((CR_FRAMEBUFFER_ENTRY*)((uint8_t*)(_pEntry) - RT_OFFSETOF(CR_FRAMEBUFFER_ENTRY, Entry)))484 485 633 #define CR_PMGR_MODE_WINDOW 0x1 486 634 /* mutually exclusive with CR_PMGR_MODE_WINDOW */ … … 661 809 CR_TEXDATA *pTex = CrVrScrCompositorEntryTexGet(&pEntry->Entry); 662 810 if (pTex) 663 CrTdBltData DiscardNe(pTex);811 CrTdBltDataInvalidateNe(pTex); 664 812 } 665 813 } … … 702 850 703 851 CrHTableMoveTo(&pFbEntry->HTable, &pFbReplacingEntry->HTable); 852 853 CR_TEXDATA *pTex = CrVrScrCompositorEntryTexGet(&pFbEntry->Entry); 854 CR_TEXDATA *pReplacingTex = CrVrScrCompositorEntryTexGet(&pFbReplacingEntry->Entry); 855 856 CrTdBltStretchCacheMoveTo(pTex, pReplacingTex); 857 704 858 if (pFb->pDisplay) 705 859 pFb->pDisplay->EntryReplaced(pFb, pFbReplacingEntry, pFbEntry); 706 860 707 CR_TEXDATA *pTex = CrVrScrCompositorEntryTexGet(&pFbEntry->Entry); 708 if (pTex) 709 CrTdBltDataDiscardNe(pTex); 861 CrTdBltDataInvalidateNe(pTex); 710 862 711 863 /* 2. mark the replaced entry is destroyed */ … … 727 879 CR_TEXDATA *pTex = CrVrScrCompositorEntryTexGet(&pFbEntry->Entry); 728 880 if (pTex) 729 CrTdBltData DiscardNe(pTex);881 CrTdBltDataInvalidateNe(pTex); 730 882 } 731 883 } … … 791 943 CR_TEXDATA *pTex = CrVrScrCompositorEntryTexGet(&pEntry->Entry); 792 944 if (pTex) 793 CrTdBltData DiscardNe(pTex);945 CrTdBltDataInvalidateNe(pTex); 794 946 } 795 947 … … 931 1083 CR_TEXDATA *pTex = CrVrScrCompositorEntryTexGet(&hEntry->Entry); 932 1084 if (pTex) 933 CrTdBltData DiscardNe(pTex);1085 CrTdBltDataInvalidateNe(pTex); 934 1086 } 935 1087 } … … 1005 1157 CR_TEXDATA *pTex = CrVrScrCompositorEntryTexGet(&hEntry->Entry); 1006 1158 if (pTex) 1007 CrTdBltData DiscardNe(pTex);1159 CrTdBltDataInvalidateNe(pTex); 1008 1160 } 1009 1161 } … … 2791 2943 CR_TEXDATA *pNewTex = CrVrScrCompositorEntryTexGet(pNewEntry); 2792 2944 2793 rc = CrTdBltEnter(pReplacedTex); 2945 CrTdBltDataInvalidateNe(pReplacedTex); 2946 2947 rc = CrTdBltEnter(pNewTex); 2794 2948 if (RT_SUCCESS(rc)) 2795 2949 { 2796 if (pNewTex != pReplacedTex) 2797 { 2798 CrTdBltDataDiscard(pReplacedTex); 2799 rc = CrTdBltEnter(pNewTex); 2800 if (RT_SUCCESS(rc)) 2801 { 2802 rc = vrdpFrame(hNewEntry); 2803 CrTdBltLeave(pNewTex); 2804 } 2805 else 2806 WARN(("CrTdBltEnter failed %d", rc)); 2807 } 2808 else 2809 rc = vrdpFrame(hNewEntry); 2810 2811 CrTdBltLeave(pReplacedTex); 2950 rc = vrdpFrame(hNewEntry); 2951 CrTdBltLeave(pNewTex); 2812 2952 } 2813 2953 else 2814 2954 WARN(("CrTdBltEnter failed %d", rc)); 2815 2955 2816 2956 return rc; 2817 2957 } 2818 2958 … … 2849 2989 return rc; 2850 2990 } 2991 2992 const VBOXVR_SCR_COMPOSITOR_ENTRY* pEntry = CrFbEntryGetCompositorEntry(hEntry); 2993 CR_TEXDATA *pTex = CrVrScrCompositorEntryTexGet(pEntry); 2994 CrTdBltDataInvalidateNe(pTex); 2851 2995 2852 2996 return vrdpRegions(pFb, hEntry); … … 2990 3134 CR_TEXDATA *pTex = CrVrScrCompositorEntryTexGet(pEntry); 2991 3135 const CR_BLITTER_IMG *pImg; 2992 CrTdBltDataDiscard(pTex);3136 CrTdBltDataInvalidateNe(pTex); 2993 3137 int rc = CrTdBltDataAcquire(pTex, GL_BGRA, !!(CrVrScrCompositorEntryFlagsGet(pEntry) & CRBLT_F_INVERT_SRC_YCOORDS), &pImg); 2994 3138 if (!RT_SUCCESS(rc)) … … 3187 3331 } 3188 3332 #endif 3333 3334 class CrFbDisplayEntryDataMonitor : public CrFbDisplayBase 3335 { 3336 public: 3337 virtual int EntryReplaced(struct CR_FRAMEBUFFER *pFb, HCR_FRAMEBUFFER_ENTRY hNewEntry, HCR_FRAMEBUFFER_ENTRY hReplacedEntry) 3338 { 3339 entryDataChanged(pFb, hReplacedEntry); 3340 return VINF_SUCCESS; 3341 } 3342 3343 virtual int EntryTexChanged(struct CR_FRAMEBUFFER *pFb, HCR_FRAMEBUFFER_ENTRY hEntry) 3344 { 3345 entryDataChanged(pFb, hEntry); 3346 return VINF_SUCCESS; 3347 } 3348 3349 virtual int EntryRemoved(struct CR_FRAMEBUFFER *pFb, HCR_FRAMEBUFFER_ENTRY hEntry) 3350 { 3351 entryDataChanged(pFb, hEntry); 3352 return VINF_SUCCESS; 3353 } 3354 protected: 3355 virtual void entryDataChanged(HCR_FRAMEBUFFER hFb, HCR_FRAMEBUFFER_ENTRY hEntry) 3356 { 3357 3358 } 3359 }; 3189 3360 3190 3361 int CrPMgrInit() … … 4250 4421 uint8_t *pu8Buf = g_pvVRamBase + offVRAM; 4251 4422 4252 RTPOINT Pos = {pBlt->Pos.x, pBlt->Pos.y}; 4423 RTRECT Rect; 4424 Rect.xLeft = pBlt->Pos.x; 4425 Rect.yTop = pBlt->Pos.y; 4426 Rect.xRight = Rect.xLeft + pScreen->u32Width; 4427 Rect.yBottom = Rect.yTop + pScreen->u32Height; 4253 4428 CR_BLITTER_IMG Img; 4254 4429 Img.pvData = pu8Buf; … … 4259 4434 Img.bpp = pScreen->u16BitsPerPixel; 4260 4435 Img.pitch = pScreen->u32LineSize; 4261 int rc = CrFbBltGetContents(hFb, & Pos, cRects, pRects, &Img);4436 int rc = CrFbBltGetContents(hFb, &Rect, cRects, pRects, &Img); 4262 4437 if (!RT_SUCCESS(rc)) 4263 4438 {
Note:
See TracChangeset
for help on using the changeset viewer.