Changeset 21939 in vbox for trunk/src/VBox/Additions/WINNT
- Timestamp:
- Aug 3, 2009 11:52:51 AM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 50619
- Location:
- trunk/src/VBox/Additions/WINNT/Graphics
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Display/dd.c
r21611 r21939 46 46 #define VBOXVHWA_CAP(_pdev, _cap) ((_pdev)->vhwaInfo.caps & (_cap)) 47 47 static bool getDDHALInfo(PPDEV pDev, DD_HALINFO* pHALInfo); 48 static DECLCALLBACK(void) vboxVHWAFreeCmdCompletion(PPDEV ppdev, VBOXVHWACMD * pCmd, void * pContext);49 48 static DECLCALLBACK(void) vboxVHWASurfBltCompletion(PPDEV ppdev, VBOXVHWACMD * pCmd, void * pContext); 50 49 static DECLCALLBACK(void) vboxVHWASurfFlipCompletion(PPDEV ppdev, VBOXVHWACMD * pCmd, void * pContext); … … 76 75 * 77 76 */ 77 78 DD_HALINFO g_h2; 79 78 80 BOOL APIENTRY DrvGetDirectDrawInfo( 79 81 DHPDEV dhpdev, … … 615 617 DDPIXELFORMAT * pFormat = &lpSurfaceGlobal->ddpfSurface; 616 618 617 if(lpSurfaceLocal->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)618 {619 lBpp = pDev->ulBitCount;620 lPitch = pDev->lDeltaScreen;621 }622 else623 {624 if (pFormat->dwFlags & DDPF_PALETTEINDEXED4)625 {626 lBpp = 4;627 lPitch = lpSurfaceGlobal->wWidth/2;628 lPitch = (lPitch + 31) & ~31;629 }630 else631 if (pFormat->dwFlags & DDPF_PALETTEINDEXED8)632 {633 lBpp = 8;634 lPitch = lpSurfaceGlobal->wWidth;635 lPitch = (lPitch + 31) & ~31;636 }637 else638 {639 lBpp = pFormat->dwRGBBitCount;640 lPitch = lpSurfaceGlobal->wWidth*(lBpp/8);641 }642 }643 644 DISPDBG((0, "New surface (%d,%d)\n", lpSurfaceGlobal->wWidth, lpSurfaceGlobal->wHeight));645 DISPDBG((0, "BPP %d lPitch=%d\n", lBpp, lPitch));646 #if 1647 lpSurfaceGlobal->dwBlockSizeX = lPitch;648 lpSurfaceGlobal->dwBlockSizeY = lpSurfaceGlobal->wHeight;649 lpSurfaceGlobal->lPitch = lPitch;650 #else651 lpSurfaceGlobal->dwBlockSizeX = lPitch * lpSurfaceGlobal->wHeight;652 lpSurfaceGlobal->dwBlockSizeY = 1;653 lpSurfaceGlobal->lPitch = lPitch;654 #endif655 656 #if 1657 lpSurfaceDesc->lPitch = lpSurfaceGlobal->lPitch;658 lpSurfaceDesc->dwFlags |= DDSD_PITCH;659 #endif660 661 619 // 662 620 // Modify surface descriptions as appropriate and let Direct … … 683 641 memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_CREATE)); 684 642 685 rc = vboxVHWAFromDDSURFACEDESC(&pBody-> u.in.SurfInfo, lpSurfaceDesc);686 687 pBody-> u.in.SurfInfo.surfCaps = vboxVHWAFromDDSCAPS(lpSurfaceLocal->ddsCaps.dwCaps);688 pBody-> u.in.SurfInfo.flags |= DDSD_CAPS;689 690 pBody-> u.in.SurfInfo.height = lpSurfaceGlobal->wHeight;691 pBody-> u.in.SurfInfo.width = lpSurfaceGlobal->wWidth;692 pBody-> u.in.SurfInfo.flags |= DDSD_HEIGHT | DDSD_WIDTH;693 694 vboxVHWAFromDDPIXELFORMAT(&pBody-> u.in.SurfInfo.PixelFormat, pFormat);695 pBody-> u.in.SurfInfo.flags |= VBOXVHWA_SD_PIXELFORMAT;643 rc = vboxVHWAFromDDSURFACEDESC(&pBody->SurfInfo, lpSurfaceDesc); 644 645 pBody->SurfInfo.surfCaps = vboxVHWAFromDDSCAPS(lpSurfaceLocal->ddsCaps.dwCaps); 646 pBody->SurfInfo.flags |= DDSD_CAPS; 647 648 pBody->SurfInfo.height = lpSurfaceGlobal->wHeight; 649 pBody->SurfInfo.width = lpSurfaceGlobal->wWidth; 650 pBody->SurfInfo.flags |= DDSD_HEIGHT | DDSD_WIDTH; 651 652 vboxVHWAFromDDPIXELFORMAT(&pBody->SurfInfo.PixelFormat, pFormat); 653 pBody->SurfInfo.flags |= VBOXVHWA_SD_PIXELFORMAT; 696 654 697 655 if (lpSurfaceLocal->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) … … 708 666 if(pDesc) 709 667 { 710 pDesc->cBitsPerPixel = lBpp;711 668 vboxVHWACommandSubmit(pDev, pCmd); 712 669 Assert(pCmd->rc == VINF_SUCCESS); … … 715 672 pDesc->hHostHandle = pBody->u.out.hSurf; 716 673 lpSurfaceGlobal->dwReserved1 = (ULONG_PTR)pDesc; 674 lPitch = pBody->SurfInfo.pitch; 675 lBpp = pBody->SurfInfo.bitsPerPixel; 676 pDesc->cBitsPerPixel = lBpp; 677 #if 0 678 lpSurfaceGlobal->dwBlockSizeX = lPitch; 679 lpSurfaceGlobal->dwBlockSizeY = lpSurfaceGlobal->wHeight; 680 lpSurfaceGlobal->lPitch = lPitch; 681 #else 682 lpSurfaceGlobal->dwBlockSizeX = lPitch * lpSurfaceGlobal->wHeight; 683 lpSurfaceGlobal->dwBlockSizeY = 1; 684 lpSurfaceGlobal->lPitch = lPitch; 685 #endif 686 #if 1 687 lpSurfaceDesc->lPitch = lpSurfaceGlobal->lPitch; 688 lpSurfaceDesc->dwFlags |= DDSD_PITCH; 689 #endif 690 717 691 lpCreateSurface->ddRVal = DD_OK; 718 692 } … … 831 805 memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_CANCREATE)); 832 806 833 rc = vboxVHWAFromDDSURFACEDESC(&pBody-> u.in.SurfInfo, lpDDS);807 rc = vboxVHWAFromDDSURFACEDESC(&pBody->SurfInfo, lpDDS); 834 808 pBody->u.in.bIsDifferentPixelFormat = lpCanCreateSurface->bIsDifferentPixelFormat; 835 809 … … 1029 1003 DD_SURFACE_GLOBAL* lpSurfaceGlobal = lpSurfaceLocal->lpGbl; 1030 1004 PVBOXVHWASURFDESC pDesc = (PVBOXVHWASURFDESC)lpSurfaceGlobal->dwReserved1; 1031 VBOXVHWACMD* pCmd; 1032 /* ensure we have host cmds processed to update pending blits and flips */ 1033 vboxVHWACommandCheckHostCmds(pDev); 1034 1035 // if(VBOXDD_CHECKFLAG(lpLock, DDLOCK_DONOTWAIT)) 1036 { 1005 RECTL tmpRect, *pRect; 1006 1007 if(ASMAtomicUoReadU32(&pDesc->cPendingBltsSrc) 1008 || ASMAtomicUoReadU32(&pDesc->cPendingFlipsCurr) 1009 || ASMAtomicUoReadU32(&pDesc->cPendingBltsDst) 1010 || ASMAtomicUoReadU32(&pDesc->cPendingFlipsTarg)) 1011 { 1012 /* ensure we have host cmds processed to update pending blits and flips */ 1013 vboxVHWACommandCheckHostCmds(pDev); 1037 1014 if(ASMAtomicUoReadU32(&pDesc->cPendingBltsSrc) 1038 || ASMAtomicUoReadU32(&pDesc->cPendingBltsDst)1039 || ASMAtomicUoReadU32(&pDesc->cPendingFlipsTarg)1040 || ASMAtomicUoReadU32(&pDesc->cPendingFlipsCurr))1015 || ASMAtomicUoReadU32(&pDesc->cPendingFlipsCurr) 1016 || ASMAtomicUoReadU32(&pDesc->cPendingBltsDst) 1017 || ASMAtomicUoReadU32(&pDesc->cPendingFlipsTarg)) 1041 1018 { 1042 1019 lpLock->ddRVal = DDERR_WASSTILLDRAWING; … … 1051 1028 // } 1052 1029 1053 pCmd = vboxVHWACommandCreate (pDev, VBOXVHWACMD_TYPE_SURF_LOCK, sizeof(VBOXVHWACMD_SURF_LOCK)); 1054 if(pCmd) 1055 { 1056 VBOXVHWACMD_SURF_LOCK * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_LOCK); 1057 RECTL tmpRect, *pRect; 1058 memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_LOCK)); 1059 1060 pBody->u.in.offSurface = (uint64_t)lpSurfaceGlobal->fpVidMem; 1061 1062 if (lpLock->bHasRect) 1030 if (lpLock->bHasRect) 1031 { 1032 pRect = &lpLock->rArea; 1033 } 1034 else 1035 { 1036 tmpRect.left=0; 1037 tmpRect.top=0; 1038 tmpRect.right=lpSurfaceGlobal->wWidth-1; 1039 tmpRect.bottom=lpSurfaceGlobal->wHeight-1; 1040 pRect = &tmpRect; 1041 } 1042 1043 if(VBOXDD_CHECKFLAG(lpLock->dwFlags, DDLOCK_DISCARDCONTENTS)) 1044 { 1045 // pBody->u.in.flags |= VBOXVHWA_LOCK_DISCARDCONTENTS; 1046 1047 vboxVHWARegionTrySubstitute(&pDesc->NonupdatedMemRegion, pRect); 1048 // /* we're not interested in completion, just send the command */ 1049 // vboxVHWACommandSubmitAsynch(pDev, pCmd, vboxVHWAFreeCmdCompletion, NULL); 1050 vboxVHWARegionAdd(&pDesc->UpdatedMemRegion, pRect); 1051 lpLock->ddRVal = DD_OK; 1052 } 1053 else if(!vboxVHWARegionIntersects(&pDesc->NonupdatedMemRegion, pRect)) 1054 { 1055 // vboxVHWACommandSubmitAsynch(pDev, pCmd, vboxVHWAFreeCmdCompletion, NULL); 1056 vboxVHWARegionAdd(&pDesc->UpdatedMemRegion, pRect); 1057 lpLock->ddRVal = DD_OK; 1058 } 1059 else 1060 { 1061 VBOXVHWACMD* pCmd = vboxVHWACommandCreate (pDev, VBOXVHWACMD_TYPE_SURF_LOCK, sizeof(VBOXVHWACMD_SURF_LOCK)); 1062 if(pCmd) 1063 1063 { 1064 DISPDBG((0, "%d,%d %dx%d\n", lpLock->rArea.left, lpLock->rArea.top, lpLock->rArea.right - lpLock->rArea.left, lpLock->rArea.bottom - lpLock->rArea.top)); 1065 vboxVHWAFromRECTL(&pBody->u.in.rect, &lpLock->rArea); 1064 VBOXVHWACMD_SURF_LOCK * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_LOCK); 1065 memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_LOCK)); 1066 1067 pBody->u.in.offSurface = (uint64_t)lpSurfaceGlobal->fpVidMem; 1068 1069 // if (lpLock->bHasRect) 1070 // { 1071 // DISPDBG((0, "%d,%d %dx%d\n", lpLock->rArea.left, lpLock->rArea.top, lpLock->rArea.right - lpLock->rArea.left, lpLock->rArea.bottom - lpLock->rArea.top)); 1072 // vboxVHWAFromRECTL(&pBody->u.in.rect, &lpLock->rArea); 1073 // pBody->u.in.rectValid = 1; 1074 // 1075 // } 1076 // else 1077 // { 1078 // pBody->u.in.rectValid = 0; 1079 // } 1080 Assert(pDesc->NonupdatedMemRegion.bValid); 1081 vboxVHWAFromRECTL(&pBody->u.in.rect, &pDesc->NonupdatedMemRegion.Rect); 1066 1082 pBody->u.in.rectValid = 1; 1067 1083 1068 pRect = &lpLock->rArea; 1069 1084 pBody->u.in.hSurf = pDesc->hHostHandle; 1085 1086 /* wait for the surface to be locked and memory buffer updated */ 1087 vboxVHWACommandSubmit(pDev, pCmd); 1088 vboxVHWACommandFree(pDev, pCmd); 1089 vboxVHWARegionClear(&pDesc->NonupdatedMemRegion); 1090 lpLock->ddRVal = DD_OK; 1070 1091 } 1071 1092 else 1072 1093 { 1073 pBody->u.in.rectValid = 0; 1074 1075 tmpRect.left=0; 1076 tmpRect.top=0; 1077 tmpRect.right=lpSurfaceGlobal->wWidth-1; 1078 tmpRect.bottom=lpSurfaceGlobal->wHeight-1; 1079 pRect = &tmpRect; 1094 lpLock->ddRVal = DDERR_GENERIC; 1080 1095 } 1081 1082 pBody->u.in.hSurf = pDesc->hHostHandle;1083 1084 if(VBOXDD_CHECKFLAG(lpLock->dwFlags, DDLOCK_DISCARDCONTENTS))1085 {1086 pBody->u.in.flags |= VBOXVHWA_LOCK_DISCARDCONTENTS;1087 1088 if(vboxVHWARegionIncluded(&pDesc->DirtyRegion, pRect))1089 {1090 vboxVHWARegionClear(&pDesc->DirtyRegion);1091 }1092 // }1093 // else if(vboxVHWARegionInterse)1094 /* we're not interested in completion, just send the command */1095 vboxVHWACommandSubmitAsynch(pDev, pCmd, vboxVHWAFreeCmdCompletion, NULL);1096 }1097 else if(!vboxVHWARegionIntersects(&pDesc->DirtyRegion, pRect))1098 {1099 vboxVHWACommandSubmitAsynch(pDev, pCmd, vboxVHWAFreeCmdCompletion, NULL);1100 }1101 else1102 {1103 /* wait for the surface to be locked and memory buffer updated */1104 vboxVHWACommandSubmit(pDev, pCmd);1105 vboxVHWACommandFree(pDev, pCmd);1106 vboxVHWARegionClear(&pDesc->DirtyRegion);1107 }1108 1109 lpLock->ddRVal = DD_OK;1110 }1111 else1112 {1113 lpLock->ddRVal = DDERR_GENERIC;1114 1096 } 1115 1097 return DDHAL_DRIVER_NOTHANDLED; … … 1174 1156 DD_SURFACE_GLOBAL* lpSurfaceGlobal = lpSurfaceLocal->lpGbl; 1175 1157 PVBOXVHWASURFDESC pDesc = (PVBOXVHWASURFDESC)lpSurfaceGlobal->dwReserved1; 1176 VBOXVHWACMD* pCmd;1177 1158 1178 1159 //TODO: hadle vrdp properly … … 1186 1167 } 1187 1168 1188 /* ensure we have host cmds processed to update pending blits and flips */ 1189 vboxVHWACommandCheckHostCmds(pDev); 1190 1191 pCmd = vboxVHWACommandCreate (pDev, VBOXVHWACMD_TYPE_SURF_UNLOCK, sizeof(VBOXVHWACMD_SURF_UNLOCK)); 1192 // int rc = VERR_GENERAL_FAILURE; 1193 if(pCmd) 1194 { 1195 VBOXVHWACMD_SURF_UNLOCK * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_UNLOCK); 1196 memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_UNLOCK)); 1197 1198 pBody->u.in.hSurf = pDesc->hHostHandle; 1199 1200 vboxVHWACommandSubmitAsynch(pDev, pCmd, vboxVHWAFreeCmdCompletion, NULL); 1201 1202 lpUnlock->ddRVal = DD_OK; 1203 } 1204 else 1205 { 1206 lpUnlock->ddRVal = DDERR_GENERIC; 1169 // /* ensure we have host cmds processed to update pending blits and flips */ 1170 // vboxVHWACommandCheckHostCmds(pDev); 1171 1172 if(lpSurfaceLocal->ddsCaps.dwCaps & DDSCAPS_VISIBLE 1173 || ( 1174 !(lpSurfaceLocal->ddsCaps.dwCaps & DDSCAPS_COMPLEX) 1175 && ( 1176 lpSurfaceLocal->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE 1177 || ( 1178 (lpSurfaceLocal->ddsCaps.dwCaps & DDSCAPS_OVERLAY) 1179 && !pDesc->bHidden 1180 ) 1181 ) 1182 ) 1183 ) 1184 { 1185 VBOXVHWACMD* pCmd = vboxVHWACommandCreate (pDev, VBOXVHWACMD_TYPE_SURF_UNLOCK, sizeof(VBOXVHWACMD_SURF_UNLOCK)); 1186 // int rc = VERR_GENERAL_FAILURE; 1187 if(pCmd) 1188 { 1189 VBOXVHWACMD_SURF_UNLOCK * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_UNLOCK); 1190 memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_UNLOCK)); 1191 1192 pBody->u.in.hSurf = pDesc->hHostHandle; 1193 if(pDesc->UpdatedMemRegion.bValid) 1194 { 1195 pBody->u.in.xUpdatedMemValid = 1; 1196 vboxVHWAFromRECTL(&pBody->u.in.xUpdatedMemRect, &pDesc->UpdatedMemRegion.Rect); 1197 vboxVHWARegionClear(&pDesc->UpdatedMemRegion); 1198 } 1199 1200 vboxVHWACommandSubmitAsynchAndComplete(pDev, pCmd); 1201 1202 lpUnlock->ddRVal = DD_OK; 1203 } 1204 else 1205 { 1206 lpUnlock->ddRVal = DDERR_GENERIC; 1207 } 1207 1208 } 1208 1209 … … 1308 1309 1309 1310 /* we're not interested in completion, just send the command */ 1310 vboxVHWACommandSubmitAsynch (pDev, pCmd, vboxVHWAFreeCmdCompletion, NULL);1311 vboxVHWACommandSubmitAsynchAndComplete(pDev, pCmd); 1311 1312 1312 1313 vboxVHWASurfDescFree(pDesc); … … 1406 1407 1407 1408 #ifdef VBOX_WITH_VIDEOHWACCEL 1409 #if 1 1408 1410 DWORD APIENTRY DdSetColorKey(PDD_SETCOLORKEYDATA lpSetColorKey) 1409 1411 { … … 1428 1430 vboxVHWAFromDDCOLORKEY(&pBody->u.in.CKey, &lpSetColorKey->ckNew); 1429 1431 1430 vboxVHWACommandSubmitAsynch (pDev, pCmd, vboxVHWAFreeCmdCompletion, NULL);1432 vboxVHWACommandSubmitAsynchAndComplete(pDev, pCmd); 1431 1433 lpSetColorKey->ddRVal = DD_OK; 1432 1434 } … … 1482 1484 ASMAtomicIncU32(&pDestDesc->cPendingBltsDst); 1483 1485 1484 vboxVHWARegionAdd(&pDestDesc->DirtyRegion, &lpBlt->rDest); 1486 vboxVHWARegionAdd(&pDestDesc->NonupdatedMemRegion, &lpBlt->rDest); 1487 vboxVHWARegionTrySubstitute(&pDestDesc->UpdatedMemRegion, &lpBlt->rDest); 1488 1489 if(pSrcDesc->UpdatedMemRegion.bValid) 1490 { 1491 pBody->u.in.xUpdatedSrcMemValid = 1; 1492 vboxVHWAFromRECTL(&pBody->u.in.xUpdatedSrcMemRect, &pSrcDesc->UpdatedMemRegion.Rect); 1493 vboxVHWARegionClear(&pSrcDesc->UpdatedMemRegion); 1494 } 1495 1485 1496 vboxVHWACommandSubmitAsynch(pDev, pCmd, vboxVHWASurfBltCompletion, NULL); 1486 1497 … … 1516 1527 DISPDBG((0, "%s\n", __FUNCTION__)); 1517 1528 1518 /* ensure we have host cmds processed to update pending blits and flips */ 1519 vboxVHWACommandCheckHostCmds(pDev); 1520 1521 // if(VBOXDD_CHECKFLAG(lpLock, DDLOCK_DONOTWAIT)) 1522 { 1523 if( 1529 if( 1524 1530 // ASMAtomicUoReadU32(&pDesc->cPendingBltsSrc) 1525 1531 // || ASMAtomicUoReadU32(&pDesc->cPendingBltsDst) 1526 1532 // || 1527 ASMAtomicUoReadU32(&pCurrDesc->cPendingFlipsTarg) 1528 || ASMAtomicUoReadU32(&pCurrDesc->cPendingFlipsCurr) 1529 || ASMAtomicUoReadU32(&pTargDesc->cPendingFlipsTarg) 1530 || ASMAtomicUoReadU32(&pTargDesc->cPendingFlipsCurr)) 1533 ASMAtomicUoReadU32(&pCurrDesc->cPendingFlipsTarg) 1534 || ASMAtomicUoReadU32(&pCurrDesc->cPendingFlipsCurr) 1535 || ASMAtomicUoReadU32(&pTargDesc->cPendingFlipsTarg) 1536 || ASMAtomicUoReadU32(&pTargDesc->cPendingFlipsCurr)) 1537 { 1538 /* ensure we have host cmds processed to update pending blits and flips */ 1539 vboxVHWACommandCheckHostCmds(pDev); 1540 if( 1541 // ASMAtomicUoReadU32(&pDesc->cPendingBltsSrc) 1542 // || ASMAtomicUoReadU32(&pDesc->cPendingBltsDst) 1543 // || 1544 ASMAtomicUoReadU32(&pCurrDesc->cPendingFlipsTarg) 1545 || ASMAtomicUoReadU32(&pCurrDesc->cPendingFlipsCurr) 1546 || ASMAtomicUoReadU32(&pTargDesc->cPendingFlipsTarg) 1547 || ASMAtomicUoReadU32(&pTargDesc->cPendingFlipsCurr)) 1531 1548 { 1532 1549 lpFlip->ddRVal = DDERR_WASSTILLDRAWING; … … 1534 1551 } 1535 1552 } 1553 1536 1554 1537 1555 pCmd = vboxVHWACommandCreate (pDev, VBOXVHWACMD_TYPE_SURF_FLIP, sizeof(VBOXVHWACMD_SURF_FLIP)); … … 1556 1574 ASMAtomicIncU32(&pTargDesc->cPendingFlipsTarg); 1557 1575 1576 if(pTargDesc->UpdatedMemRegion.bValid) 1577 { 1578 pBody->u.in.xUpdatedTargMemValid = 1; 1579 vboxVHWAFromRECTL(&pBody->u.in.xUpdatedTargMemRect, &pTargDesc->UpdatedMemRegion.Rect); 1580 vboxVHWARegionClear(&pTargDesc->UpdatedMemRegion); 1581 } 1582 1558 1583 vboxVHWACommandSubmitAsynch(pDev, pCmd, vboxVHWASurfFlipCompletion, NULL); 1559 1584 … … 1582 1607 DD_SURFACE_GLOBAL* lpSurfaceGlobal = lpSurfaceLocal->lpGbl; 1583 1608 PVBOXVHWASURFDESC pDesc = (PVBOXVHWASURFDESC)lpSurfaceGlobal->dwReserved1; 1584 1585 /* ensure we have host cmds processed to update pending blits and flips */1586 vboxVHWACommandCheckHostCmds(pDev);1587 1609 1588 1610 if( … … 1593 1615 ) 1594 1616 { 1595 lpGetBltStatus->ddRVal = DDERR_WASSTILLDRAWING; 1617 /* ensure we have host cmds processed to update pending blits and flips */ 1618 vboxVHWACommandCheckHostCmds(pDev); 1619 1620 if( 1621 ASMAtomicUoReadU32(&pDesc->cPendingBltsSrc) 1622 || ASMAtomicUoReadU32(&pDesc->cPendingBltsDst) 1623 // || ASMAtomicUoReadU32(&pDesc->cPendingFlipsTarg) 1624 // || ASMAtomicUoReadU32(&pDesc->cPendingFlipsCurr) 1625 ) 1626 { 1627 lpGetBltStatus->ddRVal = DDERR_WASSTILLDRAWING; 1628 } 1629 else 1630 { 1631 lpGetBltStatus->ddRVal = DD_OK; 1632 } 1596 1633 } 1597 1634 else … … 1612 1649 1613 1650 DISPDBG((0, "%s\n", __FUNCTION__)); 1614 1615 /* ensure we have host cmds processed to update pending blits and flips */1616 vboxVHWACommandCheckHostCmds(pDev);1617 1651 1618 1652 if( … … 1624 1658 ) 1625 1659 { 1626 lpGetFlipStatus->ddRVal = DDERR_WASSTILLDRAWING; 1660 /* ensure we have host cmds processed to update pending blits and flips */ 1661 vboxVHWACommandCheckHostCmds(pDev); 1662 1663 if( 1664 // ASMAtomicUoReadU32(&pDesc->cPendingBltsSrc) 1665 // || ASMAtomicUoReadU32(&pDesc->cPendingBltsDst) 1666 // || 1667 ASMAtomicUoReadU32(&pDesc->cPendingFlipsTarg) 1668 || ASMAtomicUoReadU32(&pDesc->cPendingFlipsCurr) 1669 ) 1670 { 1671 lpGetFlipStatus->ddRVal = DDERR_WASSTILLDRAWING; 1672 } 1673 else 1674 { 1675 lpGetFlipStatus->ddRVal = DD_OK; 1676 } 1627 1677 } 1628 1678 else … … 1679 1729 pBody->u.in.yPos = lpSetOverlayPosition->lYPos; 1680 1730 1681 vboxVHWACommandSubmitAsynch (pDev, pCmd, vboxVHWAFreeCmdCompletion, NULL);1731 vboxVHWACommandSubmitAsynchAndComplete(pDev, pCmd); 1682 1732 lpSetOverlayPosition->ddRVal = DD_OK; 1683 1733 } … … 1728 1778 { 1729 1779 pSrcDesc->bHidden = false; 1780 if(pSrcDesc->UpdatedMemRegion.bValid) 1781 { 1782 pBody->u.in.xUpdatedSrcMemValid = 1; 1783 vboxVHWAFromRECTL(&pBody->u.in.xUpdatedSrcMemRect, &pSrcDesc->UpdatedMemRegion.Rect); 1784 vboxVHWARegionClear(&pSrcDesc->UpdatedMemRegion); 1785 } 1730 1786 } 1731 1787 … … 1738 1794 } 1739 1795 1740 vboxVHWACommandSubmitAsynch (pDev, pCmd, vboxVHWAFreeCmdCompletion, NULL);1796 vboxVHWACommandSubmitAsynchAndComplete(pDev, pCmd); 1741 1797 lpUpdateOverlay->ddRVal = DD_OK; 1742 1798 } … … 1744 1800 return DDHAL_DRIVER_HANDLED; 1745 1801 } 1802 #else 1803 DWORD APIENTRY DdSetColorKey(PDD_SETCOLORKEYDATA lpSetColorKey) 1804 { 1805 DISPDBG((0, "%s\n", __FUNCTION__)); 1806 lpSetColorKey->ddRVal = DD_OK; 1807 return DDHAL_DRIVER_HANDLED; 1808 } 1809 1810 DWORD APIENTRY DdAddAttachedSurface(PDD_ADDATTACHEDSURFACEDATA lpAddAttachedSurface) 1811 { 1812 DISPDBG((0, "%s\n", __FUNCTION__)); 1813 lpAddAttachedSurface->ddRVal = DD_OK; 1814 return DDHAL_DRIVER_HANDLED; 1815 } 1816 1817 DWORD APIENTRY DdBlt(PDD_BLTDATA lpBlt) 1818 { 1819 DISPDBG((0, "%s\n", __FUNCTION__)); 1820 lpBlt->ddRVal = DD_OK; 1821 return DDHAL_DRIVER_HANDLED; 1822 } 1823 1824 //DWORD APIENTRY DdDestroySurface(PDD_DESTROYSURFACEDATA lpDestroySurface) 1825 //{ 1826 // DISPDBG((0, "%s\n", __FUNCTION__)); 1827 // lpDestroySurface->ddRVal = DD_OK; 1828 // return DDHAL_DRIVER_HANDLED; 1829 //} 1830 1831 DWORD APIENTRY DdFlip(PDD_FLIPDATA lpFlip) 1832 { 1833 DISPDBG((0, "%s\n", __FUNCTION__)); 1834 lpFlip->ddRVal = DD_OK; 1835 return DDHAL_DRIVER_HANDLED; 1836 } 1837 1838 DWORD APIENTRY DdGetBltStatus(PDD_GETBLTSTATUSDATA lpGetBltStatus) 1839 { 1840 DISPDBG((0, "%s\n", __FUNCTION__)); 1841 1842 if(lpGetBltStatus->dwFlags == DDGBS_CANBLT) 1843 { 1844 lpGetBltStatus->ddRVal = DD_OK; 1845 } 1846 else 1847 { 1848 lpGetBltStatus->ddRVal = DD_OK; 1849 } 1850 1851 return DDHAL_DRIVER_HANDLED; 1852 } 1853 1854 DWORD APIENTRY DdGetFlipStatus(PDD_GETFLIPSTATUSDATA lpGetFlipStatus) 1855 { 1856 DISPDBG((0, "%s\n", __FUNCTION__)); 1857 if(lpGetFlipStatus->dwFlags == DDGFS_CANFLIP) 1858 { 1859 lpGetFlipStatus->ddRVal = DD_OK; 1860 } 1861 else 1862 { 1863 lpGetFlipStatus->ddRVal = DD_OK; 1864 } 1865 1866 return DDHAL_DRIVER_HANDLED; 1867 } 1868 1869 DWORD APIENTRY DdSetOverlayPosition(PDD_SETOVERLAYPOSITIONDATA lpSetOverlayPosition) 1870 { 1871 DISPDBG((0, "%s\n", __FUNCTION__)); 1872 1873 lpSetOverlayPosition->ddRVal = DD_OK; 1874 return DDHAL_DRIVER_HANDLED; 1875 } 1876 1877 DWORD APIENTRY DdUpdateOverlay(PDD_UPDATEOVERLAYDATA lpUpdateOverlay) 1878 { 1879 DISPDBG((0, "%s\n", __FUNCTION__)); 1880 1881 lpUpdateOverlay->ddRVal = DD_OK; 1882 return DDHAL_DRIVER_HANDLED; 1883 } 1884 1885 #endif 1746 1886 1747 1887 //----------------------------------------------------------------------------- … … 1813 1953 static DWORD rops[DD_ROP_SPACE] = { 0 }; 1814 1954 1955 #if 1 1815 1956 static bool 1816 1957 getDDHALInfo( … … 1831 1972 rops, 1832 1973 sizeof(ropListNT)/sizeof(ropListNT[0])); 1974 1975 // 1976 // ROPS supported 1977 // 1978 for( i=0;i<DD_ROP_SPACE;i++ ) 1979 { 1980 pHALInfo->ddCaps.dwRops[i] = rops[i]; 1981 } 1833 1982 } 1834 1983 … … 1861 2010 // We need to flag we can run in windowed mode, otherwise we 1862 2011 // might get restricted by apps to run in fullscreen only 1863 pHALInfo->ddCaps.dwCaps2 |= DDCAPS2_CANRENDERWINDOWED;2012 // pHALInfo->ddCaps.dwCaps2 |= DDCAPS2_CANRENDERWINDOWED; 1864 2013 1865 2014 // Also permit surfaces wider than the display buffer. 1866 pHALInfo->ddCaps.dwCaps2 |= DDCAPS2_WIDESURFACES;2015 // pHALInfo->ddCaps.dwCaps2 |= DDCAPS2_WIDESURFACES; 1867 2016 //#endif 1868 2017 … … 1931 2080 } 1932 2081 1933 if(VBOXVHWA_CAP(pDev, VBOXVHWA_CAPS_BLT)1934 && VBOXVHWA_CAP(pDev, VBOXVHWA_CAPS_BLTFOURCC))1935 {1936 pHALInfo->ddCaps.dwCaps |= DDCAPS_BLTFOURCC;1937 1938 // Enable copy blts between Four CC formats for DShow acceleration1939 pHALInfo->ddCaps.dwCaps2 |= DDCAPS2_COPYFOURCC;1940 }1941 1942 if((VBOXVHWA_CAP(pDev, VBOXVHWA_CAPS_BLT) || VBOXVHWA_CAP(pDev, VBOXVHWA_CAPS_OVERLAY))1943 && VBOXVHWA_CAP(pDev, VBOXVHWA_CAPS_COLORKEY))2082 // if(VBOXVHWA_CAP(pDev, VBOXVHWA_CAPS_BLT) 2083 // && VBOXVHWA_CAP(pDev, VBOXVHWA_CAPS_BLTFOURCC)) 2084 // { 2085 // pHALInfo->ddCaps.dwCaps |= DDCAPS_BLTFOURCC; 2086 // 2087 // // Enable copy blts between Four CC formats for DShow acceleration 2088 // pHALInfo->ddCaps.dwCaps2 |= DDCAPS2_COPYFOURCC; 2089 // } 2090 2091 // if((VBOXVHWA_CAP(pDev, VBOXVHWA_CAPS_BLT) || VBOXVHWA_CAP(pDev, VBOXVHWA_CAPS_OVERLAY)) 2092 // && VBOXVHWA_CAP(pDev, VBOXVHWA_CAPS_COLORKEY)) 1944 2093 { 1945 2094 pHALInfo->ddCaps.dwCKeyCaps = vboxVHWAToDDCKEYCAPS(pDev->vhwaInfo.colorKeyCaps); … … 2055 2204 // DDBD_8; 2056 2205 2057 //2058 // ROPS supported2059 //2060 for( i=0;i<DD_ROP_SPACE;i++ )2061 {2062 pHALInfo->ddCaps.dwRops[i] = rops[i];2063 }2064 2206 2065 2207 //Reenable: // For DX5 and beyond we support this new informational callback. … … 2075 2217 return true; 2076 2218 } // getDDHALInfo 2077 2078 static DECLCALLBACK(void) vboxVHWAFreeCmdCompletion(PPDEV ppdev, VBOXVHWACMD * pCmd, void * pContext) 2079 { 2080 vboxVHWACommandFree(ppdev, pCmd); 2081 } 2219 #else 2220 bool 2221 getDDHALInfo2( 2222 PPDEV pDev, 2223 DD_HALINFO* pHALInfo) 2224 { 2225 int i; 2226 2227 #if 0 2228 /* TODO: only enable features supported by the host backend & host hw 2229 * for now this just combines all caps we might use */ 2230 2231 // Setup the ROPS we do. 2232 setupRops( ropListNT, 2233 rops, 2234 sizeof(ropListNT)/sizeof(ropListNT[0])); 2235 2236 // The most basic DirectDraw functionality 2237 pHALInfo->ddCaps.dwCaps |= DDCAPS_BLT 2238 | DDCAPS_BLTQUEUE 2239 | DDCAPS_BLTCOLORFILL 2240 // | DDCAPS_READSCANLINE 2241 ; 2242 #endif 2243 pHALInfo->ddCaps.ddsCaps.dwCaps |= DDSCAPS_OFFSCREENPLAIN 2244 | DDSCAPS_PRIMARYSURFACE 2245 | DDSCAPS_FLIP; 2246 #if 0 2247 pHALInfo->ddCaps.dwCaps |= DDCAPS_3D | 2248 DDCAPS_BLTDEPTHFILL; 2249 2250 pHALInfo->ddCaps.ddsCaps.dwCaps |= DDSCAPS_3DDEVICE | 2251 DDSCAPS_ZBUFFER | 2252 DDSCAPS_ALPHA; 2253 #endif 2254 pHALInfo->ddCaps.dwCaps2 = 0; 2255 2256 //#if DX7_TEXMANAGEMENT 2257 // We need to set this bit up in order to be able to do 2258 // out own texture management 2259 // pHALInfo->ddCaps.dwCaps2 |= DDCAPS2_CANMANAGETEXTURE; 2260 //#if DX8_DDI 2261 // pHALInfo->ddCaps.dwCaps2 |= DDCAPS2_CANMANAGERESOURCE; 2262 //#endif 2263 //#endif 2264 2265 //#if DX8_DDI 2266 // We need to flag we can run in windowed mode, otherwise we 2267 // might get restricted by apps to run in fullscreen only 2268 pHALInfo->ddCaps.dwCaps2 |= DDCAPS2_CANRENDERWINDOWED; 2269 //#endif 2270 2271 //#if DX8_DDI 2272 // We need to flag we support dynamic textures. That is , apps can 2273 // lock with high frequency video memory textures without paying a 2274 // penalty for it. Since on this sample driver we only support 2275 // linear memory formats for textures we don't need to do anything 2276 // else for this support. Otherwise we would have to keep two surfaces 2277 // for textures created with the DDSCAPS2_HINTDYNAMIC hint in order 2278 // to efficiently do the linear<->swizzled transformation or keep the 2279 // texture permanantly in an unswizzled state. 2280 // pHALInfo->ddCaps.dwCaps2 |= DDCAPS2_DYNAMICTEXTURES; 2281 #if DX9_DDI 2282 // Notice that dynamic textures MUST be supported in order to instantiate a DX9 device 2283 #endif // DX9_DDI 2284 //#endif 2285 2286 // pHALInfo->ddCaps.dwFXCaps = 0; 2287 2288 // P3RX can do: 2289 // 1. Stretching/Shrinking 2290 // 2. YUV->RGB conversion 2291 // 3. Mirroring in X and Y 2292 // 4. ColorKeying from a source color and a source color space 2293 pHALInfo->ddCaps.dwCaps |= 2294 #if 0 2295 DDCAPS_BLTSTRETCH 2296 | DDCAPS_BLTFOURCC 2297 | 2298 #endif 2299 DDCAPS_COLORKEY 2300 // | DDCAPS_CANBLTSYSMEM 2301 ; 2302 #if 0 2303 // Special effects caps 2304 pHALInfo->ddCaps.dwFXCaps |= DDFXCAPS_BLTSTRETCHY | 2305 DDFXCAPS_BLTSTRETCHX | 2306 DDFXCAPS_BLTSTRETCHYN | 2307 DDFXCAPS_BLTSTRETCHXN | 2308 DDFXCAPS_BLTSHRINKY | 2309 DDFXCAPS_BLTSHRINKX | 2310 DDFXCAPS_BLTSHRINKYN | 2311 DDFXCAPS_BLTSHRINKXN; 2312 2313 // ColorKey caps 2314 pHALInfo->ddCaps.dwCKeyCaps |= DDCKEYCAPS_SRCBLT | 2315 DDCKEYCAPS_SRCBLTCLRSPACE | 2316 DDCKEYCAPS_DESTBLT | 2317 DDCKEYCAPS_DESTBLTCLRSPACE; 2318 #endif 2319 // pHALInfo->ddCaps.dwSVBCaps = DDCAPS_BLT; 2320 2321 // // We can do a texture from sysmem to video mem. 2322 // pHALInfo->ddCaps.dwSVBCKeyCaps |= DDCKEYCAPS_DESTBLT | 2323 // DDCKEYCAPS_DESTBLTCLRSPACE; 2324 pHALInfo->ddCaps.dwSVBFXCaps = 0; 2325 2326 // // Fill in the sysmem->vidmem rops (only can copy); 2327 // for( i=0;i<DD_ROP_SPACE;i++ ) 2328 // { 2329 // pHALInfo->ddCaps.dwSVBRops[i] = rops[i]; 2330 // } 2331 #if 0 2332 //mirroring with blitting 2333 pHALInfo->ddCaps.dwFXCaps |= DDFXCAPS_BLTMIRRORUPDOWN | 2334 DDFXCAPS_BLTMIRRORLEFTRIGHT; 2335 2336 pHALInfo->ddCaps.dwCKeyCaps |= DDCKEYCAPS_SRCBLTCLRSPACEYUV; 2337 2338 pHALInfo->ddCaps.ddsCaps.dwCaps |= DDSCAPS_TEXTURE; 2339 #endif 2340 //#if DX7_STEREO 2341 // // Report the stereo capability back to runtime 2342 // pHALInfo->ddCaps.dwCaps2 |= DDCAPS2_STEREO; 2343 // pHALInfo->ddCaps.dwSVCaps = DDSVCAPS_STEREOSEQUENTIAL; 2344 //#endif 2345 2346 // Z Buffer is only 16 Bits 2347 // pHALInfo->ddCaps.dwZBufferBitDepths = DDBD_16; 2348 // pHALInfo->ddCaps.ddsCaps.dwCaps |= DDSCAPS_MIPMAP; 2349 2350 pHALInfo->ddCaps.ddsCaps.dwCaps |= DDSCAPS_LOCALVIDMEM; 2351 2352 { 2353 //#ifdef SUPPORT_VIDEOPORT 2354 // // We support 1 video port. Must set CurrVideoPorts to 0 2355 // // We can't do interleaved bobbing yet - maybe in the future. 2356 // pHALInfo->ddCaps.dwCaps2 |= DDCAPS2_VIDEOPORT | 2357 // DDCAPS2_CANBOBNONINTERLEAVED; 2358 // 2359 // pHALInfo->ddCaps.dwMaxVideoPorts = 1; 2360 // pHALInfo->ddCaps.dwCurrVideoPorts = 0; 2361 // 2362 // 2363 //#endif // SUPPORT_VIDEOPORT 2364 2365 2366 { 2367 // Overlay is free to use. 2368 pHALInfo->ddCaps.dwMaxVisibleOverlays = 1; 2369 pHALInfo->ddCaps.dwCurrVisibleOverlays = 0; 2370 2371 pHALInfo->ddCaps.dwCaps |= DDCAPS_OVERLAY | 2372 DDCAPS_OVERLAYFOURCC | 2373 DDCAPS_OVERLAYSTRETCH | 2374 DDCAPS_COLORKEYHWASSIST | 2375 DDCAPS_OVERLAYCANTCLIP; 2376 2377 pHALInfo->ddCaps.dwCKeyCaps |= DDCKEYCAPS_SRCOVERLAY | 2378 DDCKEYCAPS_SRCOVERLAYONEACTIVE | 2379 DDCKEYCAPS_SRCOVERLAYYUV | 2380 DDCKEYCAPS_DESTOVERLAY | 2381 DDCKEYCAPS_DESTOVERLAYONEACTIVE | 2382 DDCKEYCAPS_DESTOVERLAYYUV; 2383 2384 pHALInfo->ddCaps.ddsCaps.dwCaps |= DDSCAPS_OVERLAY; 2385 2386 pHALInfo->ddCaps.dwFXCaps |= DDFXCAPS_OVERLAYSHRINKX | 2387 DDFXCAPS_OVERLAYSHRINKXN | 2388 DDFXCAPS_OVERLAYSHRINKY | 2389 DDFXCAPS_OVERLAYSHRINKYN | 2390 DDFXCAPS_OVERLAYSTRETCHX | 2391 DDFXCAPS_OVERLAYSTRETCHXN | 2392 DDFXCAPS_OVERLAYSTRETCHY | 2393 DDFXCAPS_OVERLAYSTRETCHYN; 2394 2395 // Indicates that Perm3 has no stretch ratio limitation 2396 pHALInfo->ddCaps.dwMinOverlayStretch = 1; 2397 pHALInfo->ddCaps.dwMaxOverlayStretch = 32000; 2398 } 2399 } 2400 2401 //#ifdef W95_DDRAW 2402 //#ifdef USE_DD_CONTROL_COLOR 2403 // // Enable colour control asc brightness, contrast, gamma. 2404 // pHALInfo->ddCaps.dwCaps2 |= DDCAPS2_COLORCONTROLPRIMARY; 2405 //#endif 2406 //#endif 2407 2408 // Also permit surfaces wider than the display buffer. 2409 pHALInfo->ddCaps.dwCaps2 |= DDCAPS2_WIDESURFACES; 2410 #if 0 2411 // Enable copy blts betweemn Four CC formats for DShow acceleration 2412 pHALInfo->ddCaps.dwCaps2 |= DDCAPS2_COPYFOURCC; 2413 #endif 2414 // Won't do Video-Sys mem Blits. 2415 pHALInfo->ddCaps.dwVSBCaps = 0; 2416 pHALInfo->ddCaps.dwVSBCKeyCaps = 0; 2417 pHALInfo->ddCaps.dwVSBFXCaps = 0; 2418 for( i=0;i<DD_ROP_SPACE;i++ ) 2419 { 2420 pHALInfo->ddCaps.dwVSBRops[i] = 0; 2421 } 2422 2423 // Won't do Sys-Sys mem Blits 2424 pHALInfo->ddCaps.dwSSBCaps = 0; 2425 pHALInfo->ddCaps.dwSSBCKeyCaps = 0; 2426 pHALInfo->ddCaps.dwSSBFXCaps = 0; 2427 for( i=0;i<DD_ROP_SPACE;i++ ) 2428 { 2429 pHALInfo->ddCaps.dwSSBRops[i] = 0; 2430 } 2431 2432 // 2433 // bit depths supported for alpha and Z 2434 // 2435 // pHALInfo->ddCaps.dwAlphaBltConstBitDepths = DDBD_2 | 2436 // DDBD_4 | 2437 // DDBD_8; 2438 // 2439 // pHALInfo->ddCaps.dwAlphaBltPixelBitDepths = DDBD_1 | 2440 // DDBD_8; 2441 // pHALInfo->ddCaps.dwAlphaBltSurfaceBitDepths = DDBD_1 | 2442 // DDBD_2 | 2443 // DDBD_4 | 2444 // DDBD_8; 2445 #if 0 2446 // No alpha blending for overlays, so I'm not sure what these should be. 2447 // Because we support 32bpp overlays, it's just that you can't use the 2448 // alpha bits for blending. Pass. 2449 pHALInfo->ddCaps.dwAlphaBltConstBitDepths = DDBD_2 | 2450 DDBD_4 | 2451 DDBD_8; 2452 2453 pHALInfo->ddCaps.dwAlphaBltPixelBitDepths = DDBD_1 | 2454 DDBD_8; 2455 2456 pHALInfo->ddCaps.dwAlphaBltSurfaceBitDepths = DDBD_1 | 2457 DDBD_2 | 2458 DDBD_4 | 2459 DDBD_8; 2460 2461 // 2462 // ROPS supported 2463 // 2464 for( i=0;i<DD_ROP_SPACE;i++ ) 2465 { 2466 pHALInfo->ddCaps.dwRops[i] = rops[i]; 2467 } 2468 #endif 2469 //Reenable: // For DX5 and beyond we support this new informational callback. 2470 // pHALInfo->GetDriverInfo = DdGetDriverInfo; 2471 // pHALInfo->dwFlags |= DDHALINFO_GETDRIVERINFOSET; 2472 // 2473 //#if DX8_DDI 2474 // // Flag our support for a new class of GUIDs that may come through 2475 // // GetDriverInfo for DX8 drivers. (This support will be compulsory) 2476 // pHALInfo->dwFlags |= DDHALINFO_GETDRIVERINFO2; 2477 //#endif DX8_DDI 2478 2479 return true; 2480 } // getDDHALInfo 2481 2482 #endif 2082 2483 2083 2484 static DECLCALLBACK(void) vboxVHWASurfBltCompletion(PPDEV ppdev, VBOXVHWACMD * pCmd, void * pContext) -
trunk/src/VBox/Additions/WINNT/Graphics/Display/driver.h
r21611 r21939 110 110 uint32_t cBitsPerPixel; 111 111 bool bHidden; 112 VBOXVHWAREGION DirtyRegion; 112 VBOXVHWAREGION UpdatedMemRegion; 113 VBOXVHWAREGION NonupdatedMemRegion; 113 114 }VBOXVHWASURFDESC, *PVBOXVHWASURFDESC; 114 115 … … 307 308 void vboxVHWARegionInit(PVBOXVHWAREGION pReg); 308 309 void vboxVHWARegionClear(PVBOXVHWAREGION pReg); 310 bool vboxVHWARegionValid(PVBOXVHWAREGION pReg); 311 void vboxVHWARegionTrySubstitute(PVBOXVHWAREGION pReg, const RECTL *pRect); 309 312 310 313 VBOXVHWACMD* vboxVHWACommandCreate (PPDEV ppdev, VBOXVHWACMD_TYPE enmCmd, VBOXVHWACMD_LENGTH cbCmd); … … 314 317 void vboxVHWACommandSubmitAsynchByEvent (PPDEV ppdev, VBOXVHWACMD* pCmd, PEVENT pEvent); 315 318 void vboxVHWACommandCheckHostCmds(PPDEV ppdev); 319 void vboxVHWACommandSubmitAsynchAndComplete (PPDEV ppdev, VBOXVHWACMD* pCmd); 316 320 317 321 int vboxVHWAInitHostInfo1(PPDEV ppdev); -
trunk/src/VBox/Additions/WINNT/Graphics/Display/vbox.c
r21609 r21939 782 782 783 783 /* complete it asynchronously by setting event */ 784 pCmd->Flags |= VBOXVHWACMD_FLAG_ ASYNCH_EVENT;784 pCmd->Flags |= VBOXVHWACMD_FLAG_GH_ASYNCH_EVENT; 785 785 vboxHGSMIBufferSubmit (ppdev, pCmd); 786 786 787 if(!(ASMAtomicReadU32((volatile uint32_t *)&pCmd->Flags) & VBOXVHWACMD_FLAG_ ASYNCH))787 if(!(ASMAtomicReadU32((volatile uint32_t *)&pCmd->Flags) & VBOXVHWACMD_FLAG_HG_ASYNCH)) 788 788 { 789 789 /* the command is completed */ … … 800 800 if(brc) 801 801 { 802 pCmd->Flags = VBOXVHWACMD_FLAG_ASYNCH_IRQ;802 pCmd->Flags |= VBOXVHWACMD_FLAG_GH_ASYNCH_IRQ; 803 803 vboxVHWACommandSubmitAsynchByEvent (ppdev, pCmd, pEvent); 804 804 … … 822 822 pCmd->GuestVBVAReserved2 = (uintptr_t)pContext; 823 823 824 pCmd->Flags = 0;825 824 vboxHGSMIBufferSubmit (ppdev, pCmd); 826 825 827 if(!(pCmd->Flags & VBOXVHWACMD_FLAG_ASYNCH))826 if(!(pCmd->Flags & VBOXVHWACMD_FLAG_HG_ASYNCH)) 828 827 { 829 828 /* the command is completed */ 830 829 pfnCompletion(ppdev, pCmd, pContext); 830 } 831 } 832 833 static DECLCALLBACK(void) vboxVHWAFreeCmdCompletion(PPDEV ppdev, VBOXVHWACMD * pCmd, void * pContext) 834 { 835 vboxVHWACommandFree(ppdev, pCmd); 836 } 837 838 void vboxVHWACommandSubmitAsynchAndComplete (PPDEV ppdev, VBOXVHWACMD* pCmd) 839 { 840 // Assert(0); 841 pCmd->GuestVBVAReserved1 = (uintptr_t)vboxVHWAFreeCmdCompletion; 842 843 pCmd->Flags |= VBOXVHWACMD_FLAG_GH_ASYNCH_NOCOMPLETION; 844 845 vboxHGSMIBufferSubmit (ppdev, pCmd); 846 847 if(!(pCmd->Flags & VBOXVHWACMD_FLAG_HG_ASYNCH) 848 || pCmd->Flags & VBOXVHWACMD_FLAG_HG_ASYNCH_RETURNED) 849 { 850 /* the command is completed */ 851 vboxVHWAFreeCmdCompletion(ppdev, pCmd, NULL); 831 852 } 832 853 } … … 919 940 int rc = VINF_SUCCESS; 920 941 921 if(pInfo) 942 Assert(pInfo); 943 if(!pInfo) 922 944 return VERR_OUT_OF_RESOURCES; 923 945 -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.cpp
r21596 r21939 1327 1327 { 1328 1328 /* schedule a DPC*/ 1329 BOOLEAN bResult = VideoPortQueueDpc(PrimaryExtension, VBoxVideoHGSMIDpc, NULL);1329 BOOLEAN bResult = VideoPortQueueDpc(PrimaryExtension, VBoxVideoHGSMIDpc, (PVOID)1); 1330 1330 Assert(bResult); 1331 1331 }
Note:
See TracChangeset
for help on using the changeset viewer.