Changeset 50754 in vbox for trunk/src/VBox/HostServices/SharedOpenGL/crserverlib
- Timestamp:
- Mar 12, 2014 5:43:09 PM (11 years ago)
- svn:sync-xref-src-repo-rev:
- 92767
- Location:
- trunk/src/VBox/HostServices/SharedOpenGL/crserverlib
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h
r50625 r50754 428 428 void CrFbVisitCreatedEntries(HCR_FRAMEBUFFER hFb, PFNCR_FRAMEBUFFER_ENTRIES_VISITOR_CB pfnVisitorCb, void *pvContext); 429 429 int CrFbResize(HCR_FRAMEBUFFER hFb, const struct VBVAINFOSCREEN * pScreen, void *pvVRAM); 430 int CrFbBltGetContents(HCR_FRAMEBUFFER hFb, const RTRECT *pSrcRect, uint32_t cRects, const RTRECT *pPrects, CR_BLITTER_IMG *pImg);430 int CrFbBltGetContents(HCR_FRAMEBUFFER hFb, const RTRECT *pSrcRect, const RTRECT *pDstRect, uint32_t cRects, const RTRECT *pPrects, CR_BLITTER_IMG *pImg); 431 431 bool CrFbIsEnabled(HCR_FRAMEBUFFER hFb); 432 432 int CrFbEntryCreateForTexId(HCR_FRAMEBUFFER hFb, GLuint idTex, uint32_t fFlags, HCR_FRAMEBUFFER_ENTRY *phEntry); -
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c
r50625 r50754 3186 3186 } 3187 3187 3188 static int32_t crVBoxServerCrCmdProcess(PVBOXCMDVBVA_HDR pCmd, uint32_t cbCmd) 3189 { 3188 static DECLCALLBACK(int) crVBoxCrCmdEnable(HVBOXCRCMDSVR hSvr, VBOXCRCMD_SVRENABLE_INFO *pInfo) 3189 { 3190 cr_server.CrCmdClientInfo = *pInfo; 3191 AssertFailed(); 3192 return VERR_NOT_IMPLEMENTED; 3193 } 3194 3195 static DECLCALLBACK(int) crVBoxCrCmdDisable(HVBOXCRCMDSVR hSvr) 3196 { 3197 AssertFailed(); 3198 memset(&cr_server.CrCmdClientInfo, 0, sizeof (cr_server.CrCmdClientInfo)); 3199 return VERR_NOT_IMPLEMENTED; 3200 } 3201 3202 static DECLCALLBACK(int) crVBoxCrCmdHostCtl(HVBOXCRCMDSVR hSvr, uint8_t* pCmd, uint32_t cbCmd) 3203 { 3204 AssertFailed(); 3205 return VERR_NOT_IMPLEMENTED; 3206 } 3207 3208 static DECLCALLBACK(int) crVBoxCrCmdGuestCtl(HVBOXCRCMDSVR hSvr, uint8_t* pCmd, uint32_t cbCmd) 3209 { 3210 AssertFailed(); 3211 return VERR_NOT_IMPLEMENTED; 3212 } 3213 3214 static DECLCALLBACK(int) crVBoxCrCmdSaveState(HVBOXCRCMDSVR hSvr, PSSMHANDLE pSSM) 3215 { 3216 AssertFailed(); 3217 return VERR_NOT_IMPLEMENTED; 3218 } 3219 3220 static DECLCALLBACK(int) crVBoxCrCmdLoadState(HVBOXCRCMDSVR hSvr, PSSMHANDLE pSSM, uint32_t u32Version) 3221 { 3222 AssertFailed(); 3223 return VERR_NOT_IMPLEMENTED; 3224 } 3225 3226 3227 static DECLCALLBACK(int) crVBoxCrCmdCmd(HVBOXCRCMDSVR hSvr, PVBOXCMDVBVA_HDR pCmd, uint32_t cbCmd) 3228 { 3229 AssertFailed(); 3190 3230 switch (pCmd->u8OpCode) 3191 3231 { … … 3219 3259 } 3220 3260 3221 int32_t crVBoxServerCrCmdNotifyCmds()3222 {3223 PVBOXCMDVBVA_HDR pCmd = NULL;3224 uint32_t cbCmd;3225 3226 for (;;)3227 {3228 int rc = cr_server.CltInfo.pfnCmdGet(cr_server.CltInfo.hClient, &pCmd, &cbCmd);3229 if (rc == VINF_EOF)3230 return VINF_SUCCESS;3231 if (!RT_SUCCESS(rc))3232 return rc;3233 3234 rc = crVBoxServerCrCmdProcess(pCmd, cbCmd);3235 if (!RT_SUCCESS(rc))3236 return rc;3237 }3238 3239 /* should not be here! */3240 AssertFailed();3241 return VERR_INTERNAL_ERROR;3242 }3243 3244 3261 /* We moved all CrHgsmi command processing to crserverlib to keep the logic of dealing with CrHgsmi commands in one place. 3245 3262 * … … 3594 3611 g_pvVRamBase = (uint8_t*)pSetup->pvVRamBase; 3595 3612 g_cbVRam = pSetup->cbVRam; 3596 cr_server.CltInfo = *pSetup->pCrCmdClientInfo; 3613 pSetup->CrCmdServerInfo.hSvr = NULL; 3614 pSetup->CrCmdServerInfo.pfnEnable = crVBoxCrCmdEnable; 3615 pSetup->CrCmdServerInfo.pfnDisable = crVBoxCrCmdDisable; 3616 pSetup->CrCmdServerInfo.pfnCmd = crVBoxCrCmdCmd; 3617 pSetup->CrCmdServerInfo.pfnHostCtl = crVBoxCrCmdHostCtl; 3618 pSetup->CrCmdServerInfo.pfnGuestCtl = crVBoxCrCmdGuestCtl; 3619 pSetup->CrCmdServerInfo.pfnSaveState = crVBoxCrCmdSaveState; 3620 pSetup->CrCmdServerInfo.pfnLoadState = crVBoxCrCmdLoadState; 3597 3621 rc = VINF_SUCCESS; 3598 3622 break; -
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_muralfbo.cpp
r50625 r50754 687 687 || pScreen->u16BitsPerPixel != 32) 688 688 { 689 RTRECT Rect; 689 RTRECT SrcRect; 690 RTRECT DstRect; 690 691 691 692 pScreenshot->Img.cbData = pScreen->u32LineSize * pScreen->u32Height; … … 711 712 pScreenshot->Img.bpp = 32; 712 713 pScreenshot->Img.pitch = pitch; 713 Rect.xLeft = 0; 714 Rect.yTop = 0; 715 Rect.xRight = pScreen->u32Width; 716 Rect.yBottom = pScreen->u32Height; 717 int rc = CrFbBltGetContents(hFb, &Rect, 1, &Rect, &pScreenshot->Img); 714 SrcRect.xLeft = 0; 715 SrcRect.yTop = 0; 716 SrcRect.xRight = pScreen->u32Width; 717 SrcRect.yBottom = pScreen->u32Height; 718 DstRect.xLeft = 0; 719 DstRect.yTop = 0; 720 DstRect.xRight = width; 721 DstRect.yBottom = height; 722 int rc = CrFbBltGetContents(hFb, &SrcRect, &DstRect, 1, &DstRect, &pScreenshot->Img); 718 723 if (!RT_SUCCESS(rc)) 719 724 { -
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp
r50430 r50754 320 320 } 321 321 322 static void crFbBltImgScaledRects(const CR_BLITTER_IMG *pSrc, const RTPOINT *pSrcDataPoint, bool fSrcInvert, const RTRECT *pCopyRect, const RTPOINT *pDstDataPoint, float strX, float strY, CR_BLITTER_IMG *pDst) 323 { 324 int32_t srcX = pCopyRect->xLeft - pSrcDataPoint->x; 325 int32_t srcY = pCopyRect->yTop - pSrcDataPoint->y; 326 Assert(srcX >= 0); 327 Assert(srcY >= 0); 328 329 RTRECT UnscaledCopyRect; 330 VBoxRectUnscaled(pCopyRect, strX, strY, &UnscaledCopyRect); 331 332 srcX = CR_FLOAT_RCAST(int32_t, srcX / strX); 333 srcY = CR_FLOAT_RCAST(int32_t, srcY / strY); 334 335 int32_t UnscaledSrcWidth = UnscaledCopyRect.xRight - UnscaledCopyRect.xLeft; 336 int32_t delta = (int32_t)pSrc->width - srcX - UnscaledSrcWidth; 337 if (delta < 0) 338 UnscaledSrcWidth += delta; 339 340 if (UnscaledSrcWidth <= 0) 341 { 342 LOG(("UnscaledSrcWidth <= 0")); 343 if (UnscaledSrcWidth < 0) 344 WARN(("src width (%d) < 0", UnscaledSrcWidth)); 345 return; 346 } 347 348 int32_t UnscaledSrcHeight = UnscaledCopyRect.yBottom - UnscaledCopyRect.yTop; 349 delta = (int32_t)pSrc->height - srcY - UnscaledSrcHeight; 350 if (delta < 0) 351 UnscaledSrcHeight += delta; 352 353 if (UnscaledSrcHeight <= 0) 354 { 355 LOG(("UnscaledSrcHeight <= 0")); 356 if (UnscaledSrcHeight < 0) 357 WARN(("src height (%d) < 0", UnscaledSrcHeight)); 358 return; 359 } 360 361 int32_t dstX = pCopyRect->xLeft - pDstDataPoint->x; 362 int32_t dstY = pCopyRect->yTop - pDstDataPoint->y; 363 Assert(dstX >= 0); 364 Assert(dstY >= 0); 365 366 367 uint8_t *pu8Src = ((uint8_t*)pSrc->pvData) + pSrc->pitch * (!fSrcInvert ? srcY : pSrc->height - srcY - 1) + srcX * 4; 368 uint8_t *pu8Dst = ((uint8_t*)pDst->pvData) + pDst->pitch * dstY + dstX * 4; 369 370 CrBmpScale32(pu8Dst, pDst->pitch, 371 pCopyRect->xRight - pCopyRect->xLeft, 372 pCopyRect->yBottom - pCopyRect->yTop, 373 pu8Src, 374 fSrcInvert ? -pSrc->pitch : pSrc->pitch, 375 UnscaledSrcWidth, 376 UnscaledSrcHeight 377 ); 378 } 379 322 380 static void crFbImgFromScreenVram(const VBVAINFOSCREEN *pScreen, void *pvVram, CR_BLITTER_IMG *pImg) 323 381 { … … 338 396 } 339 397 340 static int crFbBltGetContentsDirect(HCR_FRAMEBUFFER hFb, const RTRECT *pSrcRect, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pImg)398 static int crFbBltGetContentsDirect(HCR_FRAMEBUFFER hFb, const RTRECT *pSrcRect, const RTRECT *pDstRect, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pImg) 341 399 { 342 400 VBOXVR_LIST List; … … 348 406 349 407 VBOXVR_SCR_COMPOSITOR_CONST_ITERATOR Iter; 350 RTPOINT SrcPoint = {pSrcRect->xLeft, pSrcRect->yTop}; 351 float strX = ((float)pImg->width) / (pSrcRect->xRight - pSrcRect->xLeft); 352 float strY = ((float)pImg->height) / (pSrcRect->yBottom - pSrcRect->yTop); 353 354 RTPOINT ScaledSrcPoint; 355 ScaledSrcPoint.x = CR_FLOAT_RCAST(int32_t, strX * SrcPoint.x); 356 ScaledSrcPoint.y = CR_FLOAT_RCAST(int32_t, strY * SrcPoint.y); 357 358 RTPOINT ZeroPoint = {0, 0}; 408 int32_t srcWidth = pSrcRect->xRight - pSrcRect->xLeft; 409 int32_t srcHeight = pSrcRect->yBottom - pSrcRect->yTop; 410 int32_t dstWidth = pDstRect->xRight - pDstRect->xLeft; 411 int32_t dstHeight = pDstRect->yBottom - pDstRect->yTop; 412 413 RTPOINT DstPoint = {pDstRect->xLeft, pDstRect->yTop}; 414 float strX = ((float)dstWidth) / srcWidth; 415 float strY = ((float)dstHeight) / srcHeight; 416 bool fScale = (dstWidth != srcWidth || dstHeight != srcHeight); 417 418 const RTPOINT ZeroPoint = {0, 0}; 359 419 360 420 VBoxVrListInit(&List); … … 388 448 } 389 449 390 for (uint32_t i = 0; i < cRects; ++i) 391 { 392 const RTRECT * pRect = &pRects[i]; 393 for (uint32_t j = 0; j < cRegions; ++j) 450 for (uint32_t j = 0; j < cRegions; ++j) 451 { 452 /* rects are in dst coordinates, 453 * while the pReg is in source coords 454 * convert */ 455 const RTRECT * pReg = &pRegions[j]; 456 RTRECT ScaledReg; 457 /* scale */ 458 VBoxRectScaled(pReg, strX, strY, &ScaledReg); 459 /* translate */ 460 VBoxRectTranslate(&ScaledReg, pDstRect->xLeft, pDstRect->yTop); 461 462 for (uint32_t i = 0; i < cRects; ++i) 394 463 { 395 const RTRECT * pReg = &pRegions[j]; 464 const RTRECT * pRect = &pRects[i]; 465 396 466 RTRECT Intersection; 397 VBoxRectIntersected(pRect, pReg, &Intersection); 398 if (VBoxRectIsZero(&Intersection)) 399 continue; 400 401 VBoxRectScale(&Intersection, strX, strY); 467 VBoxRectIntersected(pRect, &ScaledReg, &Intersection); 402 468 if (VBoxRectIsZero(&Intersection)) 403 469 continue; … … 455 521 width = CR_FLOAT_RCAST(uint32_t, strX * pVrTex->width); 456 522 height = CR_FLOAT_RCAST(uint32_t, strY * pVrTex->height); 457 ScaledEntryPoint.x = CR_FLOAT_RCAST(int32_t, strX * CrVrScrCompositorEntryRectGet(pEntry)->xLeft) ;458 ScaledEntryPoint.y = CR_FLOAT_RCAST(int32_t, strY * CrVrScrCompositorEntryRectGet(pEntry)->yTop) ;523 ScaledEntryPoint.x = CR_FLOAT_RCAST(int32_t, strX * CrVrScrCompositorEntryRectGet(pEntry)->xLeft) + pDstRect->xLeft; 524 ScaledEntryPoint.y = CR_FLOAT_RCAST(int32_t, strY * CrVrScrCompositorEntryRectGet(pEntry)->yTop) + pDstRect->yTop; 459 525 } 460 526 … … 468 534 bool fInvert = !(CrVrScrCompositorEntryFlagsGet(pEntry) & CRBLT_F_INVERT_SRC_YCOORDS); 469 535 470 crFbBltImg(pSrcImg, &ScaledEntryPoint, fInvert, &Intersection, & ScaledSrcPoint, pImg);536 crFbBltImg(pSrcImg, &ScaledEntryPoint, fInvert, &Intersection, &ZeroPoint, pImg); 471 537 472 538 CrTdBltDataReleaseScaled(pTex, pSrcImg); … … 503 569 } 504 570 571 const RTRECT *pCompRect = CrVrScrCompositorRectGet(&hFb->Compositor); 572 573 CR_BLITTER_IMG FbImg; 574 575 crFbImgFromFb(hFb, &FbImg); 576 577 for (uint32_t j = 0; j < c2DRects; ++j) 578 { 579 const RTRECT * p2DRect = &p2DRects[j]; 580 RTRECT ScaledReg; 581 /* scale */ 582 VBoxRectScaled(p2DRect, strX, strY, &ScaledReg); 583 /* translate */ 584 VBoxRectTranslate(&ScaledReg, pDstRect->xLeft, pDstRect->yTop); 585 586 for (uint32_t i = 0; i < cRects; ++i) 587 { 588 const RTRECT * pRect = &pRects[i]; 589 RTRECT Intersection; 590 591 VBoxRectIntersected(pRect, &ScaledReg, &Intersection); 592 if (VBoxRectIsZero(&Intersection)) 593 continue; 594 595 if (!fScale) 596 crFbBltImg(&FbImg, &DstPoint, false, &Intersection, &ZeroPoint, pImg); 597 else 598 crFbBltImgScaledRects(&FbImg, &DstPoint, false, &Intersection, &ZeroPoint, strX, strY, pImg); 599 } 600 } 601 } 602 603 end: 604 605 if (pEnteredTex) 606 CrTdBltLeave(pEnteredTex); 607 608 if (pEnteredBlitter) 609 CrBltLeave(pEnteredBlitter); 610 611 VBoxVrListClear(&List); 612 613 return rc; 614 } 615 616 static int crFbBltGetContentsScaleCPU(HCR_FRAMEBUFFER hFb, const RTRECT *pSrcRect, const RTRECT *pDstRect, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pImg) 617 { 618 int32_t srcWidth = pSrcRect->xRight - pSrcRect->xLeft; 619 int32_t srcHeight = pSrcRect->yBottom - pSrcRect->yTop; 620 int32_t dstWidth = pDstRect->xRight - pDstRect->xLeft; 621 int32_t dstHeight = pDstRect->yBottom - pDstRect->yTop; 622 623 RTPOINT DstPoint = {pDstRect->xLeft, pDstRect->yTop}; 624 float strX = ((float)dstWidth) / srcWidth; 625 float strY = ((float)dstHeight) / srcHeight; 626 627 RTRECT DstRect; 628 VBoxRectUnscaled(pDstRect, strX, strY, &DstRect); 629 DstRect.xRight = DstRect.xLeft + srcWidth; 630 DstRect.yBottom = DstRect.yTop + srcHeight; 631 632 /* destination is bigger than the source, do 3D data stretching with CPU */ 633 CR_BLITTER_IMG Img; 634 Img.cbData = srcWidth * srcHeight * 4; 635 Img.pvData = RTMemAlloc(Img.cbData); 636 if (!Img.pvData) 637 { 638 WARN(("RTMemAlloc Failed")); 639 return VERR_NO_MEMORY; 640 } 641 Img.enmFormat = pImg->enmFormat; 642 Img.width = srcWidth; 643 Img.height = srcHeight; 644 Img.bpp = pImg->bpp; 645 Img.pitch = Img.width * 4; 646 647 int rc = CrFbBltGetContents(hFb, pSrcRect, &DstRect, cRects, pRects, &Img); 648 if (RT_SUCCESS(rc)) 649 { 650 CrBmpScale32((uint8_t *)pImg->pvData, 651 pImg->pitch, 652 pImg->width, pImg->height, 653 (const uint8_t *)Img.pvData, 654 Img.pitch, 655 Img.width, Img.height); 656 } 657 else 658 WARN(("CrFbBltGetContents failed %d", rc)); 659 660 RTMemFree(Img.pvData); 661 662 return rc; 663 664 } 665 666 int CrFbBltGetContents(HCR_FRAMEBUFFER hFb, const RTRECT *pSrcRect, const RTRECT *pDstRect, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pImg) 667 { 668 uint32_t srcWidth = pSrcRect->xRight - pSrcRect->xLeft; 669 uint32_t srcHeight = pSrcRect->yBottom - pSrcRect->yTop; 670 uint32_t dstWidth = pDstRect->xRight - pDstRect->xLeft; 671 uint32_t dstHeight = pDstRect->yBottom - pDstRect->yTop; 672 if ((srcWidth == dstWidth 673 && srcHeight == dstHeight) 674 || !CrFbHas3DData(hFb) 675 || (srcWidth * srcHeight > dstWidth * dstHeight)) 676 { 677 return crFbBltGetContentsDirect(hFb, pSrcRect, pDstRect, cRects, pRects, pImg); 678 } 679 680 return crFbBltGetContentsScaleCPU(hFb, pSrcRect, pDstRect, cRects, pRects, pImg); 681 } 682 683 #if 0 684 static int crFbBltPutContentsVram(HCR_FRAMEBUFFER hFb, const RTPOINT *pDstPoint, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pImg, float strX, float strY) 685 { 686 const RTRECT *pCompRect = CrVrScrCompositorRectGet(&hFb->Compositor); 687 const RTPOINT ZeroPoint = {0}; 688 689 uint32_t fbWidth = (pCompRect->xRight - pCompRect->xLeft); 690 uint32_t fbHeight = pCompRect->yBottom - pCompRect->yTop; 691 692 uint32_t stretchedWidth = CR_FLOAT_RCAST(uint32_t, strX * fbWidth); 693 uint32_t stretchedHeight = CR_FLOAT_RCAST(uint32_t, strY * fbHeight); 694 695 CR_BLITTER_IMG FbImg; 696 697 bool fScale = fbWidth != stretchedWidth || fbHeight != stretchedHeight; 698 699 crFbImgFromFb(hFb, &FbImg); 700 701 RTRECT Intersection; 702 703 for (uint32_t i = 0; i < cRects; ++i) 704 { 705 const RTRECT * pRect = &pRects[i]; 706 VBoxRectIntersected(pRect, pCompRect, &Intersection); 707 708 if (VBoxRectIsZero(&Intersection)) 709 continue; 710 711 if (!fScale) 712 crFbBltImg(pImg, pDstPoint, false, &Intersection, &ZeroPoint, &FbImg); 713 else 714 crFbBltImgScaled(pImg, pDstPoint, false, &Intersection, &ZeroPoint, strX, strY, &FbImg); 715 } 716 717 return VINF_SUCCESS; 718 } 719 720 int CrFbBltPutContents(HCR_FRAMEBUFFER hFb, const RTRECT *pDstRect, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pImg) 721 { 722 RTPOINT DstPoint = {pDstRect->xLeft, pDstRect->yTop}; 723 float strX = ((float)pImg->width) / (pDstRect->xRight - pDstRect->xLeft); 724 float strY = ((float)pImg->height) / (pDstRect->yBottom - pDstRect->yTop); 725 726 int rc = CrFbEntryRegionsAdd(hFb, NULL, const RTPOINT *pPos, cRects, pRects, true) 727 if (!hFb->cUpdating) 728 { 729 WARN(("not updating\n")); 730 return VERR_INVALID_STATE; 731 } 732 } 733 734 int CrFbBltPutContentsNe(HCR_FRAMEBUFFER hFb, const RTRECT *pDstRect, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pImg) 735 { 736 uint32_t cCompRects; 737 const RTRECT *pCompRects; 738 int rc = CrVrScrCompositorRegionsGet(&hFb->Compositor, &cCompRects, NULL, NULL, &pCompRects); 739 if (!RT_SUCCESS(rc)) 740 { 741 WARN(("CrVrScrCompositorRegionsGet failed rc %d", rc)); 742 return rc; 743 } 744 745 bool fRegChanged = false; 746 for (uint32_t i = 0; i < cCompRects; ++i) 747 { 748 const RTRECT *pCompRect = pCompRects[i]; 749 for (uint32_t j = 0; j < cRects; ++j) 750 { 751 const RTRECT *pRect = pRects[j]; 752 if (VBoxRectIsIntersect(pCompRect, pRect)) 753 { 754 fRegChanged = true; 755 break; 756 } 757 } 758 } 759 760 if (fRegChanged) 761 { 762 rc = CrFbUpdateBegin(hFb); 763 if (RT_SUCCESS(rc)) 764 { 765 rc = CrFbBltPutContents(hFb, pDstRect, cRects, pRects, pImg); 766 if (!RT_SUCCESS(rc)) 767 WARN(("CrFbBltPutContents failed rc %d", rc)); 768 CrFbUpdateEnd(hFb); 769 } 770 else 771 WARN(("CrFbUpdateBegin failed rc %d", rc)); 772 773 return rc; 774 } 775 776 return crFbBltPutContentsVram(HCR_FRAMEBUFFER hFb, const RTPOINT *pDstPoint, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pImg, float strX, float strY); 777 778 const RTPOINT ZeroPoint = {0, 0}; 779 780 c2DRects = VBoxVrListRectsCount(&List); 781 if (c2DRects) 782 { 783 if (g_CrPresenter.cbTmpBuf2 < c2DRects * sizeof (RTRECT)) 784 { 785 if (g_CrPresenter.pvTmpBuf2) 786 RTMemFree(g_CrPresenter.pvTmpBuf2); 787 788 g_CrPresenter.cbTmpBuf2 = (c2DRects + 10) * sizeof (RTRECT); 789 g_CrPresenter.pvTmpBuf2 = RTMemAlloc(g_CrPresenter.cbTmpBuf2); 790 if (!g_CrPresenter.pvTmpBuf2) 791 { 792 WARN(("RTMemAlloc failed!")); 793 g_CrPresenter.cbTmpBuf2 = 0; 794 rc = VERR_NO_MEMORY; 795 goto end; 796 } 797 } 798 799 RTRECT *p2DRects = (RTRECT *)g_CrPresenter.pvTmpBuf2; 800 801 rc = VBoxVrListRectsGet(&List, c2DRects, p2DRects); 802 if (!RT_SUCCESS(rc)) 803 { 804 WARN(("VBoxVrListRectsGet failed, rc %d", rc)); 805 goto end; 806 } 807 505 808 RTPOINT Pos = {0}; 506 809 const RTRECT *pCompRect = CrVrScrCompositorRectGet(&hFb->Compositor); 507 810 508 uint32_t fbWidth = (pCompRect->xRight - pCompRect->xLeft);509 uint32_t fbHeight = pCompRect->yBottom - pCompRect->yTop;510 511 uint32_t stretchedWidth = CR_FLOAT_RCAST(uint32_t, strX * fbWidth);512 uint32_t stretchedHeight = CR_FLOAT_RCAST(uint32_t, strY * fbHeight);513 514 811 CR_BLITTER_IMG FbImg; 515 516 bool fScale = fbWidth != stretchedWidth || fbHeight != stretchedHeight;517 812 518 813 crFbImgFromFb(hFb, &FbImg); … … 549 844 return rc; 550 845 } 551 552 static int crFbBltGetContentsScaleCPU(HCR_FRAMEBUFFER hFb, const RTRECT *pSrcRect, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pImg) 553 { 554 uint32_t srcWidth = pSrcRect->xRight - pSrcRect->xLeft; 555 uint32_t srcHeight = pSrcRect->yBottom - pSrcRect->yTop; 556 557 /* destination is bigger than the source, do 3D data stretching with CPU */ 558 CR_BLITTER_IMG Img; 559 Img.cbData = srcWidth * srcHeight * 4; 560 Img.pvData = RTMemAlloc(Img.cbData); 561 if (!Img.pvData) 562 { 563 WARN(("RTMemAlloc Failed")); 564 return VERR_NO_MEMORY; 565 } 566 Img.enmFormat = pImg->enmFormat; 567 Img.width = srcWidth; 568 Img.height = srcHeight; 569 Img.bpp = pImg->bpp; 570 Img.pitch = Img.width * 4; 571 572 int rc = CrFbBltGetContents(hFb, pSrcRect, cRects, pRects, &Img); 573 if (RT_SUCCESS(rc)) 574 { 575 CrBmpScale32((uint8_t *)pImg->pvData, 576 pImg->pitch, 577 pImg->width, pImg->height, 578 (const uint8_t *)Img.pvData, 579 Img.pitch, 580 Img.width, Img.height); 581 } 582 else 583 WARN(("CrFbBltGetContents failed %d", rc)); 584 585 RTMemFree(Img.pvData); 586 587 return rc; 588 589 } 590 591 int CrFbBltGetContents(HCR_FRAMEBUFFER hFb, const RTRECT *pSrcRect, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pImg) 592 { 593 uint32_t srcWidth = pSrcRect->xRight - pSrcRect->xLeft; 594 uint32_t srcHeight = pSrcRect->yBottom - pSrcRect->yTop; 595 if ((srcWidth == pImg->width 596 && srcHeight == pImg->height) 597 || !CrFbHas3DData(hFb) 598 || (srcWidth * srcHeight > pImg->width * pImg->height)) 599 { 600 return crFbBltGetContentsDirect(hFb, pSrcRect, cRects, pRects, pImg); 601 } 602 603 return crFbBltGetContentsScaleCPU(hFb, pSrcRect, cRects, pRects, pImg); 604 } 605 846 #endif 606 847 607 848 int CrFbResize(CR_FRAMEBUFFER *pFb, const struct VBVAINFOSCREEN * pScreen, void *pvVRAM) … … 4473 4714 uint8_t *pu8Buf = g_pvVRamBase + offVRAM; 4474 4715 texId = 0; 4716 // cr_server.CrCmdClientInfo.pfnCltScrUpdateBegin(cr_server.CrCmdClientInfo.hCltScr); 4475 4717 /*todo: notify VGA device to perform updates */ 4476 4718 } … … 4512 4754 uint8_t *pu8Buf = g_pvVRamBase + offVRAM; 4513 4755 4514 RTRECT Rect; 4515 Rect.xLeft = pBlt->Pos.x; 4516 Rect.yTop = pBlt->Pos.y; 4517 Rect.xRight = Rect.xLeft + pScreen->u32Width; 4518 Rect.yBottom = Rect.yTop + pScreen->u32Height; 4756 RTRECT SrcRect; 4757 SrcRect.xLeft = 0; 4758 SrcRect.yTop = 0; 4759 SrcRect.xRight = pScreen->u32Width; 4760 SrcRect.yBottom = pScreen->u32Height; 4761 RTRECT DstRect; 4762 DstRect.xLeft = pBlt->Pos.x; 4763 DstRect.yTop = pBlt->Pos.y; 4764 DstRect.xRight = DstRect.xLeft + pScreen->u32Width; 4765 DstRect.yBottom = DstRect.yTop + pScreen->u32Height; 4519 4766 CR_BLITTER_IMG Img; 4520 4767 crFbImgFromScreenVram(pScreen, pu8Buf, &Img); 4521 int rc = CrFbBltGetContents(hFb, & Rect, cRects, pRects, &Img);4768 int rc = CrFbBltGetContents(hFb, &SrcRect, &DstRect, cRects, pRects, &Img); 4522 4769 if (!RT_SUCCESS(rc)) 4523 4770 {
Note:
See TracChangeset
for help on using the changeset viewer.