VirtualBox

Changeset 22798 in vbox


Ignore:
Timestamp:
Sep 6, 2009 10:39:41 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
51991
Message:

video hw accel: bugfixing for using ogl only when needed

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/include/VBoxFrameBuffer.h

    r22797 r22798  
    939939    }
    940940
    941     size_t size() {return mSurfaces.size(); }
     941    size_t size() const {return mSurfaces.size(); }
    942942
    943943    void remove(VBoxVHWASurfaceBase *pSurf)
     
    998998    }
    999999
    1000     VBoxVHWASurfaceBase * getVGA()
     1000    VBoxVHWASurfaceBase * getVGA() const
    10011001    {
    10021002        return mSurfVGA;
     
    14851485    void vboxDoVHWACmdExec(void *cmd);
    14861486    void vboxShowOverlay(bool show);
    1487     bool vboxDoCheckUpdateViewport();
     1487    void vboxDoCheckUpdateViewport();
    14881488    void vboxDoVHWACmd(void *cmd);
    14891489    void vboxDoUpdateRect(const QRect * pRect);
    1490     void vboxUpdateOverlayPosition(const QPoint & pos);
    1491     void vboxUpdateOverlay(const QRect & rect, bool show);
     1490//    void vboxUpdateOverlayPosition(const QPoint & pos);
     1491    void vboxCheckUpdateOverlay(const QRect & rect);
    14921492    VBoxVHWACommandElement * processCmdList(VBoxVHWACommandElement * pCmd);
    14931493    VBoxGLWidget *mpOverlayWidget;
    14941494    bool mGlOn;
     1495    bool mOverlayWidgetVisible;
    14951496    bool mOverlayVisible;
    14961497    bool mGlCurrent;
    14971498    bool mProcessingCommands;
    1498     QRect mOverlayViewportCoords;
     1499    QRect mOverlayViewport;
    14991500    VBoxVHWADirtyRect mMainDirtyRect;
    15001501
  • trunk/src/VBox/Frontends/VirtualBox/src/VBoxFBQGL.cpp

    r22797 r22798  
    46634663bool VBoxGLWidget::hasSurfaces() const
    46644664{
    4665     return mDisplay.overlays().size() != 0;
     4665    if(mDisplay.overlays().size() != 0)
     4666        return true;
     4667    if(mDisplay.primaries().size() > 1)
     4668        return true;
     4669    return mDisplay.getVGA()->handle() != VBOXVHWA_SURFHANDLE_INVALID;
    46664670}
    46674671
     
    52315235    : VBoxQImageFrameBuffer(aView),
    52325236      mGlOn(false),
     5237      mOverlayWidgetVisible(false),
    52335238      mOverlayVisible(false),
    52345239      mGlCurrent(false),
     
    52375242{
    52385243    mpOverlayWidget = new VBoxGLWidget (aView, aView->viewport());
    5239     mpOverlayWidget->setVisible(false);
     5244    mOverlayWidgetVisible = true; /* to ensure it is set hidden with vboxShowOverlay */
     5245    vboxShowOverlay(false);
    52405246}
    52415247
     
    52925298}
    52935299
    5294 bool VBoxQGLOverlayFrameBuffer::vboxDoCheckUpdateViewport()
    5295 {
    5296     Assert(0);
    5297 //    QRect vp(mView->contentsX(), mView->contentsY(), mpOverlayWidget->width(), mpOverlayWidget->height());
    5298 //    if(vp != mpOverlayWidget->vboxViewport())
    5299 //    {
    5300 //        mpOverlayWidget->vboxDoUpdateViewport(vp);
    5301 //        return true;
    5302 //    }
    5303     return false;
    5304 }
    5305 
    53065300void VBoxQGLOverlayFrameBuffer::paintEvent (QPaintEvent *pe)
    53075301{
    5308     if(mOverlayVisible && !mProcessingCommands)
     5302    if(mOverlayWidgetVisible && !mProcessingCommands)
    53095303    {
    53105304        Assert(!mGlCurrent);
     5305        vboxDoCheckUpdateViewport();
    53115306        vboxOpExit();
    53125307    }
     
    53475342        makeCurrent();
    53485343        mpOverlayWidget->vboxDoUpdateRect(pRect);
    5349 //        if(mOverlayVisible)
    5350 //        {
    5351 //            mpOverlayWidget->performDisplay();
    5352 //            mpOverlayWidget->swapBuffers();
    5353 //        }
    53545344        vboxOpExit();
    53555345    }
     
    53915381        Assert(!mpOverlayWidget->isVisible());
    53925382        /* just to ensure */
    5393         mpOverlayWidget->setVisible(false);
     5383        vboxShowOverlay(false);
     5384        mOverlayVisible = false;
    53945385        vboxSynchGl();
    53955386    }
     
    53975388    {
    53985389        VBOXQGLLOGREL(("Switching Gl mode off\n"));
     5390        mOverlayVisible = false;
     5391        vboxShowOverlay(false);
    53995392        /* for now just set the flag w/o destroying anything */
    54005393    }
    54015394}
    54025395
     5396void VBoxQGLOverlayFrameBuffer::vboxDoCheckUpdateViewport()
     5397{
     5398    Assert(0);
     5399    int cX = mView->contentsX();
     5400    int cY = mView->contentsY();
     5401    QRect fbVp(cX, cY, mView->viewport()->width(), mView->viewport()->height());
     5402    QRect overVp = fbVp.intersected(mOverlayViewport);
     5403
     5404    if(overVp.isEmpty())
     5405    {
     5406        vboxShowOverlay(false);
     5407    }
     5408    else
     5409    {
     5410        if(overVp != mpOverlayWidget->vboxViewport())
     5411        {
     5412            makeCurrent();
     5413            mpOverlayWidget->vboxDoUpdateViewport(overVp);
     5414        }
     5415
     5416        QRect rect(overVp.x() - cX, overVp.y() - cY, overVp.width(), overVp.height());
     5417
     5418        vboxCheckUpdateOverlay(rect);
     5419
     5420        vboxShowOverlay(true);
     5421    }
     5422}
     5423
    54035424void VBoxQGLOverlayFrameBuffer::vboxShowOverlay(bool show)
    54045425{
    5405     mpOverlayWidget->setVisible(show);
    5406     mOverlayVisible = show;
    5407 }
    5408 
    5409 void VBoxQGLOverlayFrameBuffer::vboxUpdateOverlayPosition(const QPoint & pos)
    5410 {
    5411     makeCurrent();
    5412 
    5413     mpOverlayWidget->move(pos);
    5414 
    5415     /* */
    5416     QRect rect = mpOverlayWidget->vboxViewport();
    5417     rect.moveTo(pos);
    5418     mpOverlayWidget->vboxDoUpdateViewport(rect);
    5419 }
    5420 
    5421 void VBoxQGLOverlayFrameBuffer::vboxUpdateOverlay(const QRect & rect, bool show)
    5422 {
    5423     mpOverlayWidget->move(rect.x(), rect.y());
    5424     mpOverlayWidget->resize(rect.width(), rect.height());
    5425 
    5426     mpOverlayWidget->vboxDoUpdateViewport(rect);
    5427 
    5428     vboxShowOverlay(show);
     5426    if(mOverlayWidgetVisible != show)
     5427    {
     5428        mpOverlayWidget->setVisible(show);
     5429        mOverlayWidgetVisible = show;
     5430    }
     5431}
     5432
     5433//void VBoxQGLOverlayFrameBuffer::vboxUpdateOverlayPosition(const QPoint & pos)
     5434//{
     5435////    makeCurrent();
     5436//
     5437//    mpOverlayWidget->move(pos);
     5438//
     5439////    /* */
     5440////    QRect rect = mpOverlayWidget->vboxViewport();
     5441////    rect.moveTo(pos);
     5442////    mpOverlayWidget->vboxDoUpdateViewport(rect);
     5443//}
     5444
     5445void VBoxQGLOverlayFrameBuffer::vboxCheckUpdateOverlay(const QRect & rect)
     5446{
     5447    QRect overRect = mpOverlayWidget->rect();
     5448    if(overRect.x() != rect.x() || overRect.y() != rect.y())
     5449    {
     5450        mpOverlayWidget->move(rect.x(), rect.y());
     5451    }
     5452
     5453    if(overRect.width() != rect.width() || overRect.height() != rect.height())
     5454    {
     5455        mpOverlayWidget->resize(rect.width(), rect.height());
     5456    }
     5457
     5458//    mpOverlayWidget->vboxDoUpdateViewport(rect);
     5459//
     5460//    vboxShowOverlay(show);
    54295461}
    54305462
     
    54495481                vboxSetGlOn(false);
    54505482            }
    5451             else if(mpOverlayWidget->hasVisibleOverlays())
     5483            else
    54525484            {
    5453                 QRect overRect = mpOverlayWidget->overlaysRectUnion();
    5454                 vboxUpdateOverlay(overRect, true);
     5485                mOverlayVisible = mpOverlayWidget->hasVisibleOverlays();
     5486                if(mOverlayVisible)
     5487                {
     5488                    mOverlayViewport = mpOverlayWidget->overlaysRectUnion();
     5489                }
    54555490            }
    54565491        } break;
     
    54635498                vboxSetGlOn(false);
    54645499            }
     5500            else
     5501            {
     5502                mOverlayVisible = mpOverlayWidget->hasVisibleOverlays();
     5503                if(mOverlayVisible)
     5504                {
     5505                    mOverlayViewport = mpOverlayWidget->overlaysRectUnion();
     5506                }
     5507            }
    54655508        } break;
    54665509        case VBOXVHWACMD_TYPE_SURF_LOCK:
     
    54885531            VBOXVHWACMD_SURF_OVERLAY_UPDATE * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_OVERLAY_UPDATE);
    54895532            pCmd->rc = mpOverlayWidget->vhwaSurfaceOverlayUpdate(pBody);
    5490             if(mpOverlayWidget->hasVisibleOverlays())
     5533            mOverlayVisible = mpOverlayWidget->hasVisibleOverlays();
     5534            if(mOverlayVisible)
    54915535            {
    5492                 QRect overRect = mpOverlayWidget->overlaysRectUnion();
    5493                 vboxUpdateOverlay(overRect, true);
     5536                mOverlayViewport = mpOverlayWidget->overlaysRectUnion();
    54945537            }
    5495             else
    5496             {
    5497                 vboxShowOverlay(false);
    5498             }
     5538            vboxDoCheckUpdateViewport();
    54995539        } break;
    55005540        case VBOXVHWACMD_TYPE_SURF_OVERLAY_SETPOSITION:
     
    55025542            VBOXVHWACMD_SURF_OVERLAY_SETPOSITION * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_OVERLAY_SETPOSITION);
    55035543            pCmd->rc = mpOverlayWidget->vhwaSurfaceOverlaySetPosition(pBody);
    5504             if(mpOverlayWidget->hasVisibleOverlays())
     5544            mOverlayVisible = mpOverlayWidget->hasVisibleOverlays();
     5545            if(mOverlayVisible)
    55055546            {
    5506                 QRect overRect = mpOverlayWidget->overlaysRectUnion();
    5507                 vboxUpdateOverlayPosition(QPoint(overRect.x(), overRect.y()));
     5547                mOverlayViewport = mpOverlayWidget->overlaysRectUnion();
    55085548            }
     5549            vboxDoCheckUpdateViewport();
    55095550        } break;
    55105551        case VBOXVHWACMD_TYPE_SURF_COLORKEY_SET:
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