VirtualBox

Changeset 106926 in vbox for trunk


Ignore:
Timestamp:
Nov 11, 2024 12:07:14 PM (3 months ago)
Author:
vboxsync
Message:

3D: Use memcpy for SVGA_3D_CMD_SURFACE_COPY if VMSVGA2dGBO extradata is set (i.e. 3D backend is not available). bugref:10580

Location:
trunk/src/VBox/Devices/Graphics
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA-cmd.cpp

    r106263 r106926  
    50165016
    50175017        uint32_t const cCopyBoxes = (cbCmd - sizeof(pCmd)) / sizeof(SVGA3dCopyBox);
    5018         vmsvga3dSurfaceCopy(pThisCC, pCmd->dest, pCmd->src, cCopyBoxes, (SVGA3dCopyBox *)(pCmd + 1));
     5018        vmsvga3dSurfaceCopy(pThisCC, pCmd->dest, pCmd->src, cCopyBoxes, (SVGA3dCopyBox *)(pCmd + 1), pThis->svga.fVMSVGA2dGBO);
    50195019        break;
    50205020    }
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-internal.h

    r106061 r106926  
    14551455void vmsvga3dShaderLogRel(char const *pszMsg, SVGA3dShaderType type, uint32_t cbShaderData, uint32_t const *pShaderData);
    14561456
     1457int vmsvga3dSurfaceCopySysMem(PVMSVGA3DSTATE pState, SVGA3dSurfaceImageId dest, SVGA3dSurfaceImageId src,
     1458                               uint32_t cCopyBoxes, SVGA3dCopyBox *pBox);
     1459
    14571460#endif /* !VBOX_INCLUDED_SRC_Graphics_DevVGA_SVGA3d_internal_h */
    14581461
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d.cpp

    r106154 r106926  
    13821382}
    13831383
    1384 int vmsvga3dSurfaceCopy(PVGASTATECC pThisCC, SVGA3dSurfaceImageId dest, SVGA3dSurfaceImageId src, uint32_t cCopyBoxes, SVGA3dCopyBox *pBox)
    1385 {
    1386     PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
    1387     AssertReturn(pSvgaR3State->pFuncs3D, VERR_NOT_IMPLEMENTED);
    1388     return pSvgaR3State->pFuncs3D->pfnSurfaceCopy(pThisCC, dest, src, cCopyBoxes, pBox);
     1384int vmsvga3dSurfaceCopySysMem(PVMSVGA3DSTATE pState, SVGA3dSurfaceImageId dest, SVGA3dSurfaceImageId src,
     1385                               uint32_t cCopyBoxes, SVGA3dCopyBox *pBox)
     1386{
     1387    RT_NOREF(cCopyBoxes);
     1388    AssertReturn(pBox, VERR_INVALID_PARAMETER);
     1389
     1390    LogFunc(("src sid %d -> dst sid %d\n", src.sid, dest.sid));
     1391
     1392    AssertReturn(pState, VERR_INVALID_STATE);
     1393
     1394    PVMSVGA3DSURFACE pSrcSurface;
     1395    int rc = vmsvga3dSurfaceFromSid(pState, src.sid, &pSrcSurface);
     1396    AssertRCReturn(rc, rc);
     1397
     1398    PVMSVGA3DSURFACE pDstSurface;
     1399    rc = vmsvga3dSurfaceFromSid(pState, dest.sid, &pDstSurface);
     1400    AssertRCReturn(rc, rc);
     1401
     1402    PVMSVGA3DMIPMAPLEVEL pSrcMipLevel;
     1403    rc = vmsvga3dMipmapLevel(pSrcSurface, src.face, src.mipmap, &pSrcMipLevel);
     1404    ASSERT_GUEST_RETURN(RT_SUCCESS(rc), rc);
     1405
     1406    PVMSVGA3DMIPMAPLEVEL pDstMipLevel;
     1407    rc = vmsvga3dMipmapLevel(pDstSurface, dest.face, dest.mipmap, &pDstMipLevel);
     1408    ASSERT_GUEST_RETURN(RT_SUCCESS(rc), rc);
     1409
     1410    SVGA3dCopyBox clipBox = *pBox;
     1411    vmsvgaR3ClipCopyBox(&pSrcMipLevel->mipmapSize, &pDstMipLevel->mipmapSize, &clipBox);
     1412
     1413    AssertReturn(pSrcSurface->format == pDstSurface->format, VERR_INVALID_PARAMETER);
     1414    AssertReturn(pSrcSurface->cbBlock == pDstSurface->cbBlock, VERR_INVALID_PARAMETER);
     1415    AssertReturn(pSrcMipLevel->pSurfaceData && pDstMipLevel->pSurfaceData, VERR_INVALID_STATE);
     1416
     1417    uint32_t const cxBlocks = (clipBox.w + pSrcSurface->cxBlock - 1) / pSrcSurface->cxBlock;
     1418    uint32_t const cyBlocks = (clipBox.h + pSrcSurface->cyBlock - 1) / pSrcSurface->cyBlock;
     1419    uint32_t const cbRow = cxBlocks * pSrcSurface->cbBlock;
     1420
     1421    uint8_t const *pu8Src = (uint8_t *)pSrcMipLevel->pSurfaceData
     1422            + (clipBox.srcx / pSrcSurface->cxBlock) * pSrcSurface->cbBlock
     1423            + (clipBox.srcy / pSrcSurface->cyBlock) * pSrcMipLevel->cbSurfacePitch
     1424            + clipBox.srcz * pSrcMipLevel->cbSurfacePlane;
     1425
     1426    uint8_t *pu8Dst = (uint8_t *)pDstMipLevel->pSurfaceData
     1427            + (clipBox.x / pDstSurface->cxBlock) * pDstSurface->cbBlock
     1428            + (clipBox.y / pDstSurface->cyBlock) * pDstMipLevel->cbSurfacePitch
     1429            + clipBox.z * pDstMipLevel->cbSurfacePlane;
     1430
     1431    for (uint32_t z = 0; z < clipBox.d; ++z)
     1432    {
     1433        uint8_t const *pu8PlaneSrc = pu8Src;
     1434        uint8_t *pu8PlaneDst = pu8Dst;
     1435
     1436        for (uint32_t y = 0; y < cyBlocks; ++y)
     1437        {
     1438            memcpy(pu8PlaneDst, pu8PlaneSrc, cbRow);
     1439            pu8PlaneDst += pDstMipLevel->cbSurfacePitch;
     1440            pu8PlaneSrc += pSrcMipLevel->cbSurfacePitch;
     1441        }
     1442
     1443        pu8Src += pSrcMipLevel->cbSurfacePlane;
     1444        pu8Dst += pDstMipLevel->cbSurfacePlane;
     1445    }
     1446
     1447    return VINF_SUCCESS;
     1448}
     1449
     1450int vmsvga3dSurfaceCopy(PVGASTATECC pThisCC, SVGA3dSurfaceImageId dest, SVGA3dSurfaceImageId src, uint32_t cCopyBoxes, SVGA3dCopyBox *pBox, bool fVMSVGA2dGBO)
     1451{
     1452    PVMSVGAR3STATE const pSvgaR3State = pThisCC->svga.pSvgaR3State;
     1453
     1454    if (!fVMSVGA2dGBO)
     1455    {
     1456        AssertReturn(pSvgaR3State->pFuncs3D, VERR_NOT_IMPLEMENTED);
     1457        return pSvgaR3State->pFuncs3D->pfnSurfaceCopy(pThisCC, dest, src, cCopyBoxes, pBox);
     1458    }
     1459    else
     1460    {
     1461        PVMSVGA3DSTATE pState = pThisCC->svga.p3dState;
     1462        AssertReturn(pState, VERR_INVALID_STATE);
     1463        return vmsvga3dSurfaceCopySysMem(pState, dest, src, cCopyBoxes, pBox);
     1464    }
    13891465}
    13901466
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d.h

    r106061 r106926  
    120120int vmsvga3dSurfaceDestroy(PVGASTATECC pThisCC, uint32_t sid);
    121121int vmsvga3dSurfaceCopy(PVGASTATECC pThisCC, SVGA3dSurfaceImageId dest, SVGA3dSurfaceImageId src,
    122                         uint32_t cCopyBoxes, SVGA3dCopyBox *pBox);
     122                        uint32_t cCopyBoxes, SVGA3dCopyBox *pBox, bool fVMSVGA2dGBO);
    123123int vmsvga3dSurfaceStretchBlt(PVGASTATE pThis, PVGASTATECC pThisCC,
    124124                              SVGA3dSurfaceImageId const *pDstSfcImg, SVGA3dBox const *pDstBox,
Note: See TracChangeset for help on using the changeset viewer.

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