VirtualBox

Changeset 82677 in vbox for trunk/src/VBox/Frontends


Ignore:
Timestamp:
Jan 8, 2020 5:08:09 PM (5 years ago)
Author:
vboxsync
Message:

VBoxFBOverlay: VHWA cleanup, adressed a todo

Location:
trunk/src/VBox/Frontends/VirtualBox/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.cpp

    r81210 r82677  
    7676*   Defined Constants And Macros                                                                                                 *
    7777*********************************************************************************************************************************/
     78/* 128 should be enough */
     79#define VBOXVHWA_MAX_SURFACES 128
     80#define VBOXVHWA_MAX_WIDTH    4096
     81#define VBOXVHWA_MAX_HEIGHT   4096
     82
    7883#ifdef VBOXQGL_PROF_BASE
    7984# ifdef VBOXQGL_DBG_SURF
     
    313318#endif
    314319
    315 VBoxVHWAHandleTable::VBoxVHWAHandleTable(uint32_t initialSize)
    316 {
    317     mTable = new void*[initialSize];
    318     memset(mTable, 0, initialSize*sizeof(void*));
    319     mcSize = initialSize;
    320     mcUsage = 0;
    321     mCursor = 1; /* 0 is treated as invalid */
     320VBoxVHWAHandleTable::VBoxVHWAHandleTable(uint32_t maxSize)
     321    :
     322    mcSize(maxSize),
     323    mcUsage(0),
     324    mCursor(1) /* 0 is treated as invalid */
     325{
     326    mTable = (void **)RTMemAllocZ(sizeof(void *) * maxSize);
    322327}
    323328
    324329VBoxVHWAHandleTable::~VBoxVHWAHandleTable()
    325330{
    326     delete[] mTable;
     331    RTMemFree(mTable);
    327332}
    328333
    329334uint32_t VBoxVHWAHandleTable::put(void *data)
    330335{
    331     Assert(data);
    332     if (!data)
    333         return VBOXVHWA_SURFHANDLE_INVALID;
    334 
    335     if (mcUsage == mcSize)
    336     {
    337         /** @todo resize */
    338         AssertFailed();
    339     }
    340 
    341     Assert(mcUsage < mcSize);
    342     if (mcUsage >= mcSize)
    343         return VBOXVHWA_SURFHANDLE_INVALID;
     336    AssertPtrReturn(data, VBOXVHWA_SURFHANDLE_INVALID);
     337    AssertReturn(mcUsage < mcSize, VBOXVHWA_SURFHANDLE_INVALID);
    344338
    345339    for (int k = 0; k < 2; ++k)
     
    362356}
    363357
    364 bool VBoxVHWAHandleTable::mapPut(uint32_t h, void * data)
    365 {
    366     if (mcSize <= h)
    367         return false;
    368     if (h == 0)
    369         return false;
     358bool VBoxVHWAHandleTable::mapPut(uint32_t h, void *data)
     359{
     360    AssertReturn(h > 0 && h < mcSize, false);
     361    RT_UNTRUSTED_VALIDATED_FENCE();
    370362    if (mTable[h])
    371363        return false;
    372 
    373364    doPut(h, data);
    374365    return true;
    375366}
    376367
    377 void* VBoxVHWAHandleTable::get(uint32_t h)
    378 {
    379     Assert(h < mcSize);
    380     Assert(h > 0);
     368void * VBoxVHWAHandleTable::get(uint32_t h)
     369{
     370    AssertReturn(h > 0 && h < mcSize, NULL);
     371    RT_UNTRUSTED_VALIDATED_FENCE();
    381372    return mTable[h];
    382373}
    383374
    384 void* VBoxVHWAHandleTable::remove(uint32_t h)
     375void * VBoxVHWAHandleTable::remove(uint32_t h)
    385376{
    386377    Assert(mcUsage);
    387     Assert(h < mcSize);
    388     void* val = mTable[h];
     378    AssertReturn(h > 0 && h < mcSize, NULL);
     379    RT_UNTRUSTED_VALIDATED_FENCE();
     380    void *val = mTable[h];
    389381    Assert(val);
    390382    if (val)
     
    14911483{
    14921484    GLenum tt = texTarget();
     1485    QRect rect = mRect;
    14931486    if (pRect)
    1494         Assert(mRect.contains(*pRect));
    1495     else
    1496         pRect = &mRect;
     1487        rect = rect.intersected(*pRect);
     1488    AssertReturnVoid(!rect.isEmpty());
    14971489
    14981490    Assert(glIsTexture(mTexture));
     
    15011493            );
    15021494
    1503     int x = pRect->x()/mColorFormat.widthCompression();
    1504     int y = pRect->y()/mColorFormat.heightCompression();
    1505     int width = pRect->width()/mColorFormat.widthCompression();
    1506     int height = pRect->height()/mColorFormat.heightCompression();
     1495    int x = rect.x()/mColorFormat.widthCompression();
     1496    int y = rect.y()/mColorFormat.heightCompression();
     1497    int width = rect.width()/mColorFormat.widthCompression();
     1498    int height = rect.height()/mColorFormat.heightCompression();
    15071499
    15081500    uchar *address = pAddress + pointOffsetTex(x, y);
     
    16681660{
    16691661    if (pRect)
    1670         Assert(mRect.contains(*pRect));
     1662        AssertReturn(mRect.contains(*pRect), false);
    16711663
    16721664    if (mUpdateMem2TexRect.isClear())
     
    18651857
    18661858    if (pRect)
    1867         Assert(mRect.contains(*pRect));
     1859        AssertReturn(mRect.contains(*pRect), VERR_GENERAL_FAILURE);
    18681860
    18691861    Assert(mLockCount >= 0);
     
    18771869    VBOXQGLLOG_METHODTIME("time ");
    18781870
    1879     mUpdateMem2TexRect.add(pRect ? *pRect : mRect);
     1871    mUpdateMem2TexRect.add(pRect ? mRect.intersected(*pRect) : mRect);
    18801872
    18811873    Assert(!mUpdateMem2TexRect.isClear());
     
    18941886{
    18951887    mTargRect = aTargRect;
    1896     mSrcRect = aSrcRect;
     1888    mSrcRect = mRect.intersected(aSrcRect);
    18971889}
    18981890
     
    19721964void VBoxVHWASurfaceBase::updatedMem(const QRect *rec)
    19731965{
    1974     if (rec)
    1975         Assert(mRect.contains(*rec));
     1966    AssertReturnVoid(mRect.contains(*rec));
    19761967    mUpdateMem2TexRect.add(*rec);
    19771968}
     
    20432034}
    20442035
    2045 
    20462036VBoxVHWAImage::VBoxVHWAImage ()
    2047     : mSurfHandleTable(128) /* 128 should be enough */
     2037    : mSurfHandleTable(VBOXVHWA_MAX_SURFACES)
    20482038    , mRepaintNeeded(false)
    20492039//  ,  mbVGASurfCreated(false)
     
    21942184    VBOXQGLLOG_ENTER(("\n"));
    21952185
     2186    if (pCmd->SurfInfo.width > VBOXVHWA_MAX_WIDTH || pCmd->SurfInfo.height > VBOXVHWA_MAX_HEIGHT)
     2187    {
     2188        AssertFailed();
     2189        pCmd->u.out.ErrInfo = -1;
     2190        return VINF_SUCCESS;
     2191    }
     2192
    21962193    const VBoxVHWAInfo & info = vboxVHWAGetSupportInfo(NULL);
    21972194
     
    22922289    VBOXQGLLOG_ENTER (("\n"));
    22932290
    2294     uint32_t handle = VBOXVHWA_SURFHANDLE_INVALID;
    2295     if (pCmd->SurfInfo.hSurf != VBOXVHWA_SURFHANDLE_INVALID)
    2296     {
    2297         handle = pCmd->SurfInfo.hSurf;
     2291    uint32_t handle = pCmd->SurfInfo.hSurf;
     2292    AssertReturn(handle == VBOXVHWA_SURFHANDLE_INVALID || handle < VBOXVHWA_MAX_SURFACES, VERR_GENERAL_FAILURE);
     2293    RT_UNTRUSTED_VALIDATED_FENCE();
     2294    if (handle != VBOXVHWA_SURFHANDLE_INVALID)
     2295    {
    22982296        if (mSurfHandleTable.get(handle))
    22992297        {
     
    23432341        VBoxVHWASurfaceBase *pVga = vgaSurface();
    23442342#ifdef VBOX_WITH_WDDM
    2345         uchar * addr = vboxVRAMAddressFromOffset(pCmd->SurfInfo.offSurface);
    2346         Assert(addr);
    2347         if (addr)
    2348         {
    2349             pVga->setAddress(addr);
    2350         }
     2343        uchar *addr = vboxVRAMAddressFromOffset(pCmd->SurfInfo.offSurface);
     2344        AssertPtrReturn(addr, VERR_GENERAL_FAILURE);
     2345        RT_UNTRUSTED_VALIDATED_FENCE();
     2346        pVga->setAddress(addr);
    23512347#endif
    23522348
     
    23962392    if (!surf)
    23972393    {
     2394        ASSERT_GUEST_RETURN(   pCmd->SurfInfo.width <= VBOXVHWA_MAX_WIDTH
     2395                            && pCmd->SurfInfo.height <= VBOXVHWA_MAX_HEIGHT, VERR_GENERAL_FAILURE);
     2396        ASSERT_GUEST_RETURN(pCmd->SurfInfo.cBackBuffers < VBOXVHWA_MAX_SURFACES, VERR_GENERAL_FAILURE);
     2397        RT_UNTRUSTED_VALIDATED_FENCE();
     2398
    23982399        VBOXVHWAIMG_TYPE fFlags = 0;
    23992400        if (!bNoPBO)
     
    24412442
    24422443        uchar *addr = vboxVRAMAddressFromOffset(pCmd->SurfInfo.offSurface);
     2444        AssertReturn(addr || pCmd->SurfInfo.offSurface == VBOXVHWA_OFFSET64_VOID, VERR_GENERAL_FAILURE);
    24432445        surf->init(mDisplay.getPrimary(), addr);
    24442446
     
    25342536int VBoxVHWAImage::vhwaSurfaceGetInfo(struct VBOXVHWACMD_SURF_GETINFO RT_UNTRUSTED_VOLATILE_GUEST *pCmd)
    25352537{
     2538    ASSERT_GUEST_RETURN(   pCmd->SurfInfo.width <= VBOXVHWA_MAX_WIDTH
     2539                        && pCmd->SurfInfo.height <= VBOXVHWA_MAX_HEIGHT, VERR_INVALID_PARAMETER);
     2540    RT_UNTRUSTED_VALIDATED_FENCE();
    25362541    VBoxVHWAColorFormat format;
    25372542    Assert(!format.isValid());
     
    25702575    {
    25712576        Assert(pList);
    2572         pList->remove(pSurf);
    2573         if (pList->surfaces().empty())
    2574         {
    2575             mDisplay.removeOverlay(pList);
    2576             if (pList == mConstructingList)
     2577        if (pList)
     2578        {
     2579            pList->remove(pSurf);
     2580            if (pList->surfaces().empty())
    25772581            {
    2578                 mConstructingList = NULL;
    2579                 mcRemaining2Contruct = 0;
     2582                mDisplay.removeOverlay(pList);
     2583                if (pList == mConstructingList)
     2584                {
     2585                    mConstructingList = NULL;
     2586                    mcRemaining2Contruct = 0;
     2587                }
     2588                delete pList;
    25802589            }
    2581             delete pList;
    25822590        }
    25832591
     
    25862594    else
    25872595    {
    2588         Assert(pList);
    2589         Assert(pList->size() >= 1);
    2590         if (pList->size() > 1)
     2596        Assert(pList && pList->size() >= 1);
     2597        if (pList && pList->size() > 1)
    25912598        {
    25922599            if (pSurf == mDisplay.getVGA())
     
    29072914    if (pSrcSurf->getComplexList()->current() != NULL)
    29082915    {
    2909         Assert(pDstSurf);
    29102916        if (pDstSurf != mDisplay.getPrimary())
    29112917        {
     
    36003606uchar *VBoxVHWAImage::vboxVRAMAddressFromOffset(uint64_t offset)
    36013607{
    3602     /** @todo check vramSize() */
    3603     return (offset != VBOXVHWA_OFFSET64_VOID) ? ((uint8_t *)vramBase()) + offset : NULL;
     3608    if (offset == VBOXVHWA_OFFSET64_VOID)
     3609        return NULL;
     3610    AssertReturn(offset <= vramSize(), NULL);
     3611    RT_UNTRUSTED_VALIDATED_FENCE();
     3612    return (uint8_t *)vramBase() + offset;
    36043613}
    36053614
    36063615uint64_t VBoxVHWAImage::vboxVRAMOffsetFromAddress(uchar *addr)
    36073616{
    3608     return uint64_t(addr - ((uchar *)vramBase()));
     3617    AssertReturn((uintptr_t)addr >= (uintptr_t)vramBase(), VBOXVHWA_OFFSET64_VOID);
     3618    uint64_t const offset = uint64_t((uintptr_t)addr - (uintptr_t)vramBase());
     3619    AssertReturn(offset <= vramSize(), VBOXVHWA_OFFSET64_VOID);
     3620    return offset;
    36093621}
    36103622
  • trunk/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.h

    r78967 r82677  
    750750{
    751751public:
    752     VBoxVHWAHandleTable(uint32_t initialSize);
     752    VBoxVHWAHandleTable(uint32_t maxSize);
    753753    ~VBoxVHWAHandleTable();
    754754    uint32_t put(void * data);
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