VirtualBox

Changeset 22797 in vbox


Ignore:
Timestamp:
Sep 6, 2009 5:32:44 PM (15 years ago)
Author:
vboxsync
Message:

video 2d accel: next step in using ogl only when needed: working, but disabled to make some test/debug

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

Legend:

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

    r22796 r22797  
    12821282    static void doSetupMatrix(const QSize & aSize, bool bInverted);
    12831283
    1284     void vboxDoUpdateViewport(const QRect * pRect);
     1284    void vboxDoUpdateViewport(const QRect & aRect);
     1285    void vboxDoUpdateRect(const QRect * pRect);
     1286
    12851287    const QRect & vboxViewport() const {return mViewport;}
    12861288
     
    13101312
    13111313
    1312     void vboxDoUpdateRect(const QRect * pRect);
    13131314#ifdef VBOXQGL_DBG_SURF
    13141315    void vboxDoTestSurfaces(void *context);
     
    14491450    void vboxUpdateRect(const QRect * pRect);
    14501451private:
     1452    void makeCurrent()
     1453    {
     1454        if(!mGlCurrent)
     1455        {
     1456            mGlCurrent = true;
     1457            mpOverlayWidget->makeCurrent();
     1458        }
     1459    }
     1460
     1461    void performDisplayOverlay()
     1462    {
     1463        if(mOverlayVisible)
     1464        {
     1465#if 0
     1466            mpOverlayWidget->updateGL();
     1467#else
     1468            makeCurrent();
     1469            mpOverlayWidget->performDisplay();
     1470            mpOverlayWidget->swapBuffers();
     1471#endif
     1472        }
     1473    }
     1474
     1475    void vboxOpExit()
     1476    {
     1477        performDisplayOverlay();
     1478        mGlCurrent = false;
     1479    }
     1480
     1481
    14511482    void vboxSetGlOn(bool on);
    14521483    bool vboxGetGlOn() { return mGlOn; }
     
    14541485    void vboxDoVHWACmdExec(void *cmd);
    14551486    void vboxShowOverlay(bool show);
     1487    bool vboxDoCheckUpdateViewport();
     1488    void vboxDoVHWACmd(void *cmd);
     1489    void vboxDoUpdateRect(const QRect * pRect);
    14561490    void vboxUpdateOverlayPosition(const QPoint & pos);
    14571491    void vboxUpdateOverlay(const QRect & rect, bool show);
     
    14601494    bool mGlOn;
    14611495    bool mOverlayVisible;
     1496    bool mGlCurrent;
     1497    bool mProcessingCommands;
     1498    QRect mOverlayViewportCoords;
    14621499    VBoxVHWADirtyRect mMainDirtyRect;
    14631500
  • trunk/src/VBox/Frontends/VirtualBox/src/VBoxFBQGL.cpp

    r22796 r22797  
    30033003    if(vp != pw->vboxViewport())
    30043004    {
    3005         pw->vboxDoUpdateViewport(&vp);
     3005        pw->vboxDoUpdateViewport(vp);
    30063006    }
    30073007
     
    35603560    }
    35613561
     3562    Assert(handle != VBOXVHWA_SURFHANDLE_INVALID);
     3563    Assert(surf->handle() == VBOXVHWA_SURFHANDLE_INVALID);
    35623564    surf->setHandle(handle);
     3565    Assert(surf->handle() == handle);
    35633566
    35643567    VBOXQGLLOG_EXIT(("pSurf (0x%x)\n",surf));
     
    46284631#endif
    46294632
    4630 void VBoxGLWidget::vboxDoUpdateViewport(const QRect * pRect)
    4631 {
    4632     adjustViewport(mDisplay.getPrimary()->size(), *pRect);
    4633     mViewport = *pRect;
     4633void VBoxGLWidget::vboxDoUpdateViewport(const QRect & aRect)
     4634{
     4635    adjustViewport(mDisplay.getPrimary()->size(), aRect);
     4636    mViewport = aRect;
    46344637
    46354638    const SurfList & primaryList = mDisplay.primaries().surfaces();
     
    46394642    {
    46404643        VBoxVHWASurfaceBase *pSurf = *pr;
    4641         pSurf->updateVisibleTargRect(NULL, *pRect);
     4644        pSurf->updateVisibleTargRect(NULL, aRect);
    46424645    }
    46434646
     
    46534656        {
    46544657            VBoxVHWASurfaceBase *pSurf = *sit;
    4655             pSurf->updateVisibleTargRect(mDisplay.getPrimary(), *pRect);
     4658            pSurf->updateVisibleTargRect(mDisplay.getPrimary(), aRect);
    46564659        }
    46574660    }
     
    52295232      mGlOn(false),
    52305233      mOverlayVisible(false),
     5234      mGlCurrent(false),
     5235      mProcessingCommands(false),
    52315236      mCmdPipe(aView)
    52325237{
     
    52525257{
    52535258    Q_UNUSED(pEvent);
     5259    Assert(!mProcessingCommands);
     5260    mProcessingCommands = true;
     5261    Assert(!mGlCurrent);
     5262    mGlCurrent = false; /* just a fall-back */
    52545263    VBoxVHWACommandElement * pFirst = mCmdPipe.detachCmdList(NULL, NULL);
    52555264    do
     
    52595268        pFirst = mCmdPipe.detachCmdList(pFirst, pLast);
    52605269    } while(pFirst);
     5270
     5271    mProcessingCommands = false;
     5272    vboxOpExit();
    52615273}
    52625274
     
    52645276                         ULONG aW, ULONG aH)
    52655277{
     5278#if 1
    52665279    QRect r(aX, aY, aW, aH);
    52675280    mCmdPipe.postCmd(VBOXVHWA_PIPECMD_PAINT, &r);
    52685281    return S_OK;
     5282#else
     5283    /* We're not on the GUI thread and update() isn't thread safe in
     5284     * Qt 4.3.x on the Win, Qt 3.3.x on the Mac (4.2.x is),
     5285     * on Linux (didn't check Qt 4.x there) and probably on other
     5286     * non-DOS platforms, so post the event instead. */
     5287    QApplication::postEvent (mView,
     5288                             new VBoxRepaintEvent (aX, aY, aW, aH));
     5289
     5290    return S_OK;
     5291#endif
     5292}
     5293
     5294bool 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;
    52695304}
    52705305
    52715306void VBoxQGLOverlayFrameBuffer::paintEvent (QPaintEvent *pe)
    52725307{
     5308    if(mOverlayVisible && !mProcessingCommands)
     5309    {
     5310        Assert(!mGlCurrent);
     5311        vboxOpExit();
     5312    }
     5313
    52735314    VBoxQImageFrameBuffer::paintEvent (pe);
    52745315}
     
    52805321    if(mGlOn)
    52815322    {
     5323        Assert(!mGlCurrent);
     5324        mGlCurrent = false;
     5325        makeCurrent();
    52825326        /* need to ensure we're in synch */
    52835327        vboxSynchGl();
    5284     }
     5328        vboxOpExit();
     5329        Assert(mGlCurrent == false);
     5330    }
     5331}
     5332
     5333void VBoxQGLOverlayFrameBuffer::vboxDoVHWACmd(void *cmd)
     5334{
     5335    vboxDoVHWACmdExec(cmd);
     5336
     5337    CDisplay display = mView->console().GetDisplay();
     5338    Assert (!display.isNull());
     5339
     5340    display.CompleteVHWACommand((BYTE*)cmd);
     5341}
     5342
     5343void VBoxQGLOverlayFrameBuffer::vboxDoUpdateRect(const QRect * pRect)
     5344{
     5345    if(mGlOn)
     5346    {
     5347        makeCurrent();
     5348        mpOverlayWidget->vboxDoUpdateRect(pRect);
     5349//        if(mOverlayVisible)
     5350//        {
     5351//            mpOverlayWidget->performDisplay();
     5352//            mpOverlayWidget->swapBuffers();
     5353//        }
     5354        vboxOpExit();
     5355    }
     5356
     5357    mView->viewport()->repaint (pRect->x() - mView->contentsX(),
     5358            pRect->y() - mView->contentsY(),
     5359            pRect->width(), pRect->height());
     5360
     5361    /* translate to widget coords
     5362     * @todo: may eliminate this */
     5363//    QPaintEvent pe(pRect->translated(-mView->contentsX(), -mView->contentsY()));
     5364//    VBoxQImageFrameBuffer::paintEvent (&pe);
    52855365}
    52865366
     
    53245404{
    53255405    mpOverlayWidget->setVisible(show);
     5406    mOverlayVisible = show;
    53265407}
    53275408
    53285409void VBoxQGLOverlayFrameBuffer::vboxUpdateOverlayPosition(const QPoint & pos)
    53295410{
     5411    makeCurrent();
     5412
    53305413    mpOverlayWidget->move(pos);
     5414
     5415    /* */
     5416    QRect rect = mpOverlayWidget->vboxViewport();
     5417    rect.moveTo(pos);
     5418    mpOverlayWidget->vboxDoUpdateViewport(rect);
    53315419}
    53325420
     
    53355423    mpOverlayWidget->move(rect.x(), rect.y());
    53365424    mpOverlayWidget->resize(rect.width(), rect.height());
    5337     mpOverlayWidget->setVisible(show);
     5425
     5426    mpOverlayWidget->vboxDoUpdateViewport(rect);
     5427
     5428    vboxShowOverlay(show);
    53385429}
    53395430
     
    53415432{
    53425433    struct _VBOXVHWACMD * pCmd = (struct _VBOXVHWACMD *)cmd;
     5434    makeCurrent();
    53435435    switch(pCmd->enmCmd)
    53445436    {
     
    54015493                vboxUpdateOverlay(overRect, true);
    54025494            }
     5495            else
     5496            {
     5497                vboxShowOverlay(false);
     5498            }
    54035499        } break;
    54045500        case VBOXVHWACMD_TYPE_SURF_OVERLAY_SETPOSITION:
     
    54525548        {
    54535549        case VBOXVHWA_PIPECMD_PAINT:
    5454 //            vboxDoUpdateRect(&pCmd->rect());
     5550            vboxDoUpdateRect(&pCmd->rect());
    54555551            break;
    54565552#ifdef VBOX_WITH_VIDEOHWACCEL
    54575553        case VBOXVHWA_PIPECMD_VHWA:
    5458 //            vboxDoVHWACmd(pCmd->vhwaCmd());
     5554            vboxDoVHWACmd(pCmd->vhwaCmd());
    54595555            break;
    54605556        case VBOXVHWA_PIPECMD_OP:
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