Changeset 21253 in vbox for trunk/src/VBox/Additions/WINNT/Graphics
- Timestamp:
- Jul 6, 2009 2:29:39 PM (16 years ago)
- 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 48 48 static DECLCALLBACK(void) vboxVHWAFreeCmdCompletion(PPDEV ppdev, VBOXVHWACMD * pCmd, void * pContext); 49 49 static DECLCALLBACK(void) vboxVHWASurfBltCompletion(PPDEV ppdev, VBOXVHWACMD * pCmd, void * pContext); 50 50 static DECLCALLBACK(void) vboxVHWASurfFlipCompletion(PPDEV ppdev, VBOXVHWACMD * pCmd, void * pContext); 51 51 #endif 52 52 … … 1037 1037 if(ASMAtomicUoReadU32(&pDesc->cPendingBltsSrc) 1038 1038 || ASMAtomicUoReadU32(&pDesc->cPendingBltsDst) 1039 || ASMAtomicUoReadU32(&pDesc->cPendingFlips)) 1039 || ASMAtomicUoReadU32(&pDesc->cPendingFlipsTarg) 1040 || ASMAtomicUoReadU32(&pDesc->cPendingFlipsCurr)) 1040 1041 { 1041 1042 lpLock->ddRVal = DDERR_WASSTILLDRAWING; … … 1471 1472 DWORD APIENTRY DdFlip(PDD_FLIPDATA lpFlip) 1472 1473 { 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 1473 1484 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 } 1475 1540 return DDHAL_DRIVER_HANDLED; 1541 #else 1542 DISPDBG((0, "%s\n", __FUNCTION__)); 1543 lpFlip->ddRVal = DDERR_GENERIC; 1544 return DDHAL_DRIVER_NOTHANDLED; 1545 #endif 1476 1546 } 1477 1547 1478 1548 DWORD APIENTRY DdGetBltStatus(PDD_GETBLTSTATUSDATA lpGetBltStatus) 1479 1549 { 1550 PPDEV pDev = (PPDEV)lpGetBltStatus->lpDD->dhpdev; 1551 1480 1552 DISPDBG((0, "%s\n", __FUNCTION__)); 1481 1553 … … 1484 1556 lpGetBltStatus->ddRVal = DD_OK; 1485 1557 } 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 } 1489 1580 } 1490 1581 … … 1494 1585 DWORD APIENTRY DdGetFlipStatus(PDD_GETFLIPSTATUSDATA lpGetFlipStatus) 1495 1586 { 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 1496 1592 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 1498 1608 { 1499 1609 lpGetFlipStatus->ddRVal = DD_OK; 1500 1610 } 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 // } 1505 1620 1506 1621 return DDHAL_DRIVER_HANDLED; … … 1848 1963 } 1849 1964 1965 static 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 1850 1977 #endif 1851 1978 -
trunk/src/VBox/Additions/WINNT/Graphics/Display/driver.h
r20985 r21253 106 106 volatile uint32_t cPendingBltsSrc; 107 107 volatile uint32_t cPendingBltsDst; 108 volatile uint32_t cPendingFlips; 108 volatile uint32_t cPendingFlipsCurr; 109 volatile uint32_t cPendingFlipsTarg; 109 110 uint32_t cBitsPerPixel; 110 111 }VBOXVHWASURFDESC, *PVBOXVHWASURFDESC;
Note:
See TracChangeset
for help on using the changeset viewer.