VirtualBox

Ignore:
Timestamp:
Jul 6, 2009 2:29:39 PM (16 years ago)
Author:
vboxsync
Message:

video hw accel: Blt fixes/enhances, Flip basis for Guest driver & QGLFramebuffer

Location:
trunk/src/VBox/Additions/WINNT/Graphics/Display
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/dd.c

    r20985 r21253  
    4848static DECLCALLBACK(void) vboxVHWAFreeCmdCompletion(PPDEV ppdev, VBOXVHWACMD * pCmd, void * pContext);
    4949static DECLCALLBACK(void) vboxVHWASurfBltCompletion(PPDEV ppdev, VBOXVHWACMD * pCmd, void * pContext);
    50 
     50static DECLCALLBACK(void) vboxVHWASurfFlipCompletion(PPDEV ppdev, VBOXVHWACMD * pCmd, void * pContext);
    5151#endif
    5252
     
    10371037            if(ASMAtomicUoReadU32(&pDesc->cPendingBltsSrc)
    10381038                    || ASMAtomicUoReadU32(&pDesc->cPendingBltsDst)
    1039                     || ASMAtomicUoReadU32(&pDesc->cPendingFlips))
     1039                    || ASMAtomicUoReadU32(&pDesc->cPendingFlipsTarg)
     1040                    || ASMAtomicUoReadU32(&pDesc->cPendingFlipsCurr))
    10401041            {
    10411042                lpLock->ddRVal = DDERR_WASSTILLDRAWING;
     
    14711472DWORD APIENTRY DdFlip(PDD_FLIPDATA  lpFlip)
    14721473{
     1474#ifdef VBOX_WITH_VIDEOHWACCEL
     1475    PPDEV pDev = (PPDEV)lpFlip->lpDD->dhpdev;
     1476    DD_SURFACE_LOCAL*   lpTargSurfaceLocal = lpFlip->lpSurfTarg;
     1477    DD_SURFACE_GLOBAL*  lpTargSurfaceGlobal = lpTargSurfaceLocal->lpGbl;
     1478    DD_SURFACE_LOCAL*   lpCurrSurfaceLocal = lpFlip->lpSurfCurr;
     1479    DD_SURFACE_GLOBAL*  lpCurrSurfaceGlobal = lpCurrSurfaceLocal->lpGbl;
     1480    PVBOXVHWASURFDESC pCurrDesc = (PVBOXVHWASURFDESC)lpCurrSurfaceGlobal->dwReserved1;
     1481    PVBOXVHWASURFDESC pTargDesc = (PVBOXVHWASURFDESC)lpTargSurfaceGlobal->dwReserved1;
     1482    VBOXVHWACMD* pCmd;
     1483
    14731484    DISPDBG((0, "%s\n", __FUNCTION__));
    1474     lpFlip->ddRVal = DD_OK;
     1485
     1486    /* ensure we have host cmds processed to update pending blits and flips */
     1487    vboxVHWACommandCheckHostCmds(pDev);
     1488
     1489//    if(VBOXDD_CHECKFLAG(lpLock, DDLOCK_DONOTWAIT))
     1490    {
     1491        if(
     1492//                ASMAtomicUoReadU32(&pDesc->cPendingBltsSrc)
     1493//                || ASMAtomicUoReadU32(&pDesc->cPendingBltsDst)
     1494//                ||
     1495                ASMAtomicUoReadU32(&pCurrDesc->cPendingFlipsTarg)
     1496                || ASMAtomicUoReadU32(&pCurrDesc->cPendingFlipsCurr)
     1497                || ASMAtomicUoReadU32(&pTargDesc->cPendingFlipsTarg)
     1498                || ASMAtomicUoReadU32(&pTargDesc->cPendingFlipsCurr))
     1499        {
     1500            lpFlip->ddRVal = DDERR_WASSTILLDRAWING;
     1501            return DDHAL_DRIVER_HANDLED;
     1502        }
     1503    }
     1504
     1505    pCmd = vboxVHWACommandCreate (pDev, VBOXVHWACMD_TYPE_SURF_FLIP, sizeof(VBOXVHWACMD_SURF_FLIP));
     1506    //    int rc = VERR_GENERAL_FAILURE;
     1507    if(pCmd)
     1508    {
     1509        VBOXVHWACMD_SURF_FLIP * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_FLIP);
     1510
     1511        memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_FLIP));
     1512
     1513        pBody->u.in.offCurrSurface = (uint64_t)lpCurrSurfaceGlobal->fpVidMem;
     1514        pBody->u.in.offTargSurface = (uint64_t)lpTargSurfaceGlobal->fpVidMem;
     1515
     1516        pBody->u.in.hTargSurf = pTargDesc->hHostHandle;
     1517        pBody->u.in.hCurrSurf = pCurrDesc->hHostHandle;
     1518        pBody->TargGuestSurfInfo = (uint64_t)pTargDesc;
     1519        pBody->CurrGuestSurfInfo = (uint64_t)pCurrDesc;
     1520
     1521//        pBody->u.in.flags = vboxVHWAFromDDFLIPs(lpFlip->dwFlags);
     1522
     1523        ASMAtomicIncU32(&pCurrDesc->cPendingFlipsCurr);
     1524        ASMAtomicIncU32(&pTargDesc->cPendingFlipsTarg);
     1525
     1526//            if(VBOXDD_CHECKFLAG(lpBlt->dwFlags, DDBLT_ASYNC))
     1527//            {
     1528                vboxVHWACommandSubmitAsynch(pDev, pCmd, vboxVHWASurfFlipCompletion, NULL);
     1529//            }
     1530//            else
     1531//            {
     1532//                vboxVHWACommandSubmit(pDev, pCmd);
     1533//            }
     1534        lpFlip->ddRVal = DD_OK;
     1535    }
     1536    else
     1537    {
     1538        lpFlip->ddRVal = DDERR_GENERIC;
     1539    }
    14751540    return DDHAL_DRIVER_HANDLED;
     1541#else
     1542    DISPDBG((0, "%s\n", __FUNCTION__));
     1543    lpFlip->ddRVal = DDERR_GENERIC;
     1544    return DDHAL_DRIVER_NOTHANDLED;
     1545#endif
    14761546}
    14771547
    14781548DWORD APIENTRY DdGetBltStatus(PDD_GETBLTSTATUSDATA  lpGetBltStatus)
    14791549{
     1550    PPDEV pDev = (PPDEV)lpGetBltStatus->lpDD->dhpdev;
     1551
    14801552    DISPDBG((0, "%s\n", __FUNCTION__));
    14811553
     
    14841556        lpGetBltStatus->ddRVal = DD_OK;
    14851557    }
    1486     else
    1487     {
    1488         lpGetBltStatus->ddRVal = DD_OK;
     1558    else /* DDGBS_ISBLTDONE */
     1559    {
     1560        DD_SURFACE_LOCAL*   lpSurfaceLocal = lpGetBltStatus->lpDDSurface;
     1561        DD_SURFACE_GLOBAL*  lpSurfaceGlobal = lpSurfaceLocal->lpGbl;
     1562        PVBOXVHWASURFDESC pDesc = (PVBOXVHWASURFDESC)lpSurfaceGlobal->dwReserved1;
     1563
     1564        /* ensure we have host cmds processed to update pending blits and flips */
     1565        vboxVHWACommandCheckHostCmds(pDev);
     1566
     1567        if(
     1568                    ASMAtomicUoReadU32(&pDesc->cPendingBltsSrc)
     1569                    || ASMAtomicUoReadU32(&pDesc->cPendingBltsDst)
     1570    //                || ASMAtomicUoReadU32(&pDesc->cPendingFlipsTarg)
     1571    //                || ASMAtomicUoReadU32(&pDesc->cPendingFlipsCurr)
     1572                    )
     1573        {
     1574            lpGetBltStatus->ddRVal = DDERR_WASSTILLDRAWING;
     1575        }
     1576        else
     1577        {
     1578            lpGetBltStatus->ddRVal = DD_OK;
     1579        }
    14891580    }
    14901581
     
    14941585DWORD APIENTRY DdGetFlipStatus(PDD_GETFLIPSTATUSDATA  lpGetFlipStatus)
    14951586{
     1587    PPDEV pDev = (PPDEV)lpGetFlipStatus->lpDD->dhpdev;
     1588    DD_SURFACE_LOCAL*   lpSurfaceLocal = lpGetFlipStatus->lpDDSurface;
     1589    DD_SURFACE_GLOBAL*  lpSurfaceGlobal = lpSurfaceLocal->lpGbl;
     1590    PVBOXVHWASURFDESC pDesc = (PVBOXVHWASURFDESC)lpSurfaceGlobal->dwReserved1;
     1591
    14961592    DISPDBG((0, "%s\n", __FUNCTION__));
    1497     if(lpGetFlipStatus->dwFlags == DDGFS_CANFLIP)
     1593
     1594    /* ensure we have host cmds processed to update pending blits and flips */
     1595    vboxVHWACommandCheckHostCmds(pDev);
     1596
     1597    if(
     1598//                ASMAtomicUoReadU32(&pDesc->cPendingBltsSrc)
     1599//                || ASMAtomicUoReadU32(&pDesc->cPendingBltsDst)
     1600//                ||
     1601                ASMAtomicUoReadU32(&pDesc->cPendingFlipsTarg)
     1602                || ASMAtomicUoReadU32(&pDesc->cPendingFlipsCurr)
     1603                )
     1604    {
     1605        lpGetFlipStatus->ddRVal = DDERR_WASSTILLDRAWING;
     1606    }
     1607    else
    14981608    {
    14991609        lpGetFlipStatus->ddRVal = DD_OK;
    15001610    }
    1501     else
    1502     {
    1503         lpGetFlipStatus->ddRVal = DD_OK;
    1504     }
     1611
     1612//    if(lpGetFlipStatus->dwFlags == DDGFS_CANFLIP)
     1613//    {
     1614//        lpGetFlipStatus->ddRVal = DD_OK;
     1615//    }
     1616//    else
     1617//    {
     1618//        lpGetFlipStatus->ddRVal = DD_OK;
     1619//    }
    15051620
    15061621    return DDHAL_DRIVER_HANDLED;
     
    18481963}
    18491964
     1965static DECLCALLBACK(void) vboxVHWASurfFlipCompletion(PPDEV ppdev, VBOXVHWACMD * pCmd, void * pContext)
     1966{
     1967    VBOXVHWACMD_SURF_FLIP * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_FLIP);
     1968    PVBOXVHWASURFDESC pCurrDesc = (PVBOXVHWASURFDESC)pBody->CurrGuestSurfInfo;
     1969    PVBOXVHWASURFDESC pTargDesc = (PVBOXVHWASURFDESC)pBody->TargGuestSurfInfo;
     1970
     1971    ASMAtomicDecU32(&pCurrDesc->cPendingFlipsCurr);
     1972    ASMAtomicDecU32(&pTargDesc->cPendingFlipsTarg);
     1973
     1974    vboxVHWACommandFree(ppdev, pCmd);
     1975}
     1976
    18501977#endif
    18511978
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/driver.h

    r20985 r21253  
    106106    volatile uint32_t cPendingBltsSrc;
    107107    volatile uint32_t cPendingBltsDst;
    108     volatile uint32_t cPendingFlips;
     108    volatile uint32_t cPendingFlipsCurr;
     109    volatile uint32_t cPendingFlipsTarg;
    109110    uint32_t cBitsPerPixel;
    110111}VBOXVHWASURFDESC, *PVBOXVHWASURFDESC;
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