VirtualBox

Ignore:
Timestamp:
Mar 12, 2014 5:43:09 PM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
92767
Message:

Dev/VGA/crOpenGL/wddm: command thread, more command processing

Location:
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h

    r50625 r50754  
    428428void CrFbVisitCreatedEntries(HCR_FRAMEBUFFER hFb, PFNCR_FRAMEBUFFER_ENTRIES_VISITOR_CB pfnVisitorCb, void *pvContext);
    429429int 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);
     430int CrFbBltGetContents(HCR_FRAMEBUFFER hFb, const RTRECT *pSrcRect, const RTRECT *pDstRect, uint32_t cRects, const RTRECT *pPrects, CR_BLITTER_IMG *pImg);
    431431bool CrFbIsEnabled(HCR_FRAMEBUFFER hFb);
    432432int CrFbEntryCreateForTexId(HCR_FRAMEBUFFER hFb, GLuint idTex, uint32_t fFlags, HCR_FRAMEBUFFER_ENTRY *phEntry);
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c

    r50625 r50754  
    31863186}
    31873187
    3188 static int32_t crVBoxServerCrCmdProcess(PVBOXCMDVBVA_HDR pCmd, uint32_t cbCmd)
    3189 {
     3188static DECLCALLBACK(int) crVBoxCrCmdEnable(HVBOXCRCMDSVR hSvr, VBOXCRCMD_SVRENABLE_INFO *pInfo)
     3189{
     3190    cr_server.CrCmdClientInfo = *pInfo;
     3191    AssertFailed();
     3192    return VERR_NOT_IMPLEMENTED;
     3193}
     3194
     3195static 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
     3202static DECLCALLBACK(int) crVBoxCrCmdHostCtl(HVBOXCRCMDSVR hSvr, uint8_t* pCmd, uint32_t cbCmd)
     3203{
     3204    AssertFailed();
     3205    return VERR_NOT_IMPLEMENTED;
     3206}
     3207
     3208static DECLCALLBACK(int) crVBoxCrCmdGuestCtl(HVBOXCRCMDSVR hSvr, uint8_t* pCmd, uint32_t cbCmd)
     3209{
     3210    AssertFailed();
     3211    return VERR_NOT_IMPLEMENTED;
     3212}
     3213
     3214static DECLCALLBACK(int) crVBoxCrCmdSaveState(HVBOXCRCMDSVR hSvr, PSSMHANDLE pSSM)
     3215{
     3216    AssertFailed();
     3217    return VERR_NOT_IMPLEMENTED;
     3218}
     3219
     3220static DECLCALLBACK(int) crVBoxCrCmdLoadState(HVBOXCRCMDSVR hSvr, PSSMHANDLE pSSM, uint32_t u32Version)
     3221{
     3222    AssertFailed();
     3223    return VERR_NOT_IMPLEMENTED;
     3224}
     3225
     3226
     3227static DECLCALLBACK(int) crVBoxCrCmdCmd(HVBOXCRCMDSVR hSvr, PVBOXCMDVBVA_HDR pCmd, uint32_t cbCmd)
     3228{
     3229    AssertFailed();
    31903230    switch (pCmd->u8OpCode)
    31913231    {
     
    32193259}
    32203260
    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 
    32443261/* We moved all CrHgsmi command processing to crserverlib to keep the logic of dealing with CrHgsmi commands in one place.
    32453262 *
     
    35943611            g_pvVRamBase = (uint8_t*)pSetup->pvVRamBase;
    35953612            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;
    35973621            rc = VINF_SUCCESS;
    35983622            break;
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_muralfbo.cpp

    r50625 r50754  
    687687            || pScreen->u16BitsPerPixel != 32)
    688688    {
    689         RTRECT Rect;
     689        RTRECT SrcRect;
     690        RTRECT DstRect;
    690691
    691692        pScreenshot->Img.cbData = pScreen->u32LineSize * pScreen->u32Height;
     
    711712        pScreenshot->Img.bpp = 32;
    712713        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);
    718723        if (!RT_SUCCESS(rc))
    719724        {
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp

    r50430 r50754  
    320320}
    321321
     322static 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
    322380static void crFbImgFromScreenVram(const VBVAINFOSCREEN *pScreen, void *pvVram, CR_BLITTER_IMG *pImg)
    323381{
     
    338396}
    339397
    340 static int crFbBltGetContentsDirect(HCR_FRAMEBUFFER hFb, const RTRECT *pSrcRect, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pImg)
     398static int crFbBltGetContentsDirect(HCR_FRAMEBUFFER hFb, const RTRECT *pSrcRect, const RTRECT *pDstRect, uint32_t cRects, const RTRECT *pRects, CR_BLITTER_IMG *pImg)
    341399{
    342400    VBOXVR_LIST List;
     
    348406
    349407    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};
    359419
    360420    VBoxVrListInit(&List);
     
    388448        }
    389449
    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)
    394463            {
    395                 const RTRECT * pReg = &pRegions[j];
     464                const RTRECT * pRect = &pRects[i];
     465
    396466                RTRECT Intersection;
    397                 VBoxRectIntersected(pRect, pReg, &Intersection);
    398                 if (VBoxRectIsZero(&Intersection))
    399                     continue;
    400 
    401                 VBoxRectScale(&Intersection, strX, strY);
     467                VBoxRectIntersected(pRect, &ScaledReg, &Intersection);
    402468                if (VBoxRectIsZero(&Intersection))
    403469                    continue;
     
    455521                    width = CR_FLOAT_RCAST(uint32_t, strX * pVrTex->width);
    456522                    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;
    459525                }
    460526
     
    468534                bool fInvert = !(CrVrScrCompositorEntryFlagsGet(pEntry) & CRBLT_F_INVERT_SRC_YCOORDS);
    469535
    470                 crFbBltImg(pSrcImg, &ScaledEntryPoint, fInvert, &Intersection, &ScaledSrcPoint, pImg);
     536                crFbBltImg(pSrcImg, &ScaledEntryPoint, fInvert, &Intersection, &ZeroPoint, pImg);
    471537
    472538                CrTdBltDataReleaseScaled(pTex, pSrcImg);
     
    503569        }
    504570
     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
     603end:
     604
     605    if (pEnteredTex)
     606        CrTdBltLeave(pEnteredTex);
     607
     608    if (pEnteredBlitter)
     609        CrBltLeave(pEnteredBlitter);
     610
     611    VBoxVrListClear(&List);
     612
     613    return rc;
     614}
     615
     616static 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
     666int 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
     684static 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
     720int 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
     734int 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
    505808        RTPOINT Pos = {0};
    506809        const RTRECT *pCompRect = CrVrScrCompositorRectGet(&hFb->Compositor);
    507810
    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 
    514811        CR_BLITTER_IMG FbImg;
    515 
    516         bool fScale = fbWidth != stretchedWidth || fbHeight != stretchedHeight;
    517812
    518813        crFbImgFromFb(hFb, &FbImg);
     
    549844    return rc;
    550845}
    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
    606847
    607848int CrFbResize(CR_FRAMEBUFFER *pFb, const struct VBVAINFOSCREEN * pScreen, void *pvVRAM)
     
    44734714                    uint8_t *pu8Buf = g_pvVRamBase + offVRAM;
    44744715                    texId = 0;
     4716//                    cr_server.CrCmdClientInfo.pfnCltScrUpdateBegin(cr_server.CrCmdClientInfo.hCltScr);
    44754717                    /*todo: notify VGA device to perform updates */
    44764718                }
     
    45124754                uint8_t *pu8Buf = g_pvVRamBase + offVRAM;
    45134755
    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;
    45194766                CR_BLITTER_IMG Img;
    45204767                crFbImgFromScreenVram(pScreen, pu8Buf, &Img);
    4521                 int rc = CrFbBltGetContents(hFb, &Rect, cRects, pRects, &Img);
     4768                int rc = CrFbBltGetContents(hFb, &SrcRect, &DstRect, cRects, pRects, &Img);
    45224769                if (!RT_SUCCESS(rc))
    45234770                {
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette