Changeset 20653 in vbox
- Timestamp:
- Jun 17, 2009 9:26:02 AM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 48745
- Location:
- trunk
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/VBoxVideo.h
r20483 r20653 264 264 VBOXVHWACMD_TYPE_SURF_BLT, 265 265 VBOXVHWACMD_TYPE_QUERY_INFO1, 266 VBOXVHWACMD_TYPE_QUERY_INFO2 266 VBOXVHWACMD_TYPE_QUERY_INFO2, 267 VBOXVHWACMD_TYPE_ENABLE, 268 VBOXVHWACMD_TYPE_DISABLE 267 269 } VBOXVHWACMD_TYPE; 268 270 … … 282 284 uint64_t GuestVBVAReserved1; /* field internally used by the guest VBVA cmd handling, must NOT be modified by clients */ 283 285 uint64_t GuestVBVAReserved2; /* field internally used by the guest VBVA cmd handling, must NOT be modified by clients */ 286 union 287 { 288 struct _VBOXVHWACMD *pNext; 289 uint32_t offNext; 290 uint64_t Data; /* the body is 64-bit aligned */ 291 } u; 284 292 char body[1]; 285 293 } VBOXVHWACMD; … … 372 380 #define VBOXVHWA_PF_FOURCC 0x00000010 373 381 382 #define VBOXVHWA_LOCK_DISCARDCONTENTS 0x00000001 383 374 384 #define VBOXVHWA_CFG_ENABLED 0x00000001 385 386 #define VBOXVHWA_OFFSET64_VOID (~0L) 375 387 376 388 typedef struct _VBOXVHWACMD_QUERYINFO1 … … 417 429 { 418 430 VBOXVHWA_SURFINFO SurfInfo; 431 uint64_t offSurface; 419 432 } in; 420 433 … … 444 457 { 445 458 VBOXVHWA_SURFHANDLE hSurf; 459 uint64_t offSurface; 446 460 uint32_t flags; 447 uint32_t Reserved;461 uint32_t rectValid; 448 462 VBOXVHWA_RECTL rect; 449 463 } in; … … 471 485 { 472 486 VBOXVHWA_SURFHANDLE hDstSurf; 487 uint64_t offDstSurface; 473 488 VBOXVHWA_RECTL dstRect; 474 489 VBOXVHWA_SURFHANDLE hSrcSurf; 490 uint64_t offSrcSurface; 475 491 VBOXVHWA_RECTL srcRect; 476 492 uint32_t flags; … … 558 574 { 559 575 struct _VBVAHOSTCMD *pNext; 560 uint64_t Data; /* the body is 64-bit alligned */ 576 uint32_t offNext; 577 uint64_t Data; /* the body is 64-bit aligned */ 561 578 } u; 562 579 char body[1]; -
trunk/src/VBox/Additions/WINNT/Graphics/Display/dd.c
r20483 r20653 42 42 43 43 #ifdef VBOX_WITH_VIDEOHWACCEL 44 #include <iprt/asm.h> 45 44 46 #define VBOXVHWA_CAP(_pdev, _cap) ((_pdev)->vhwaInfo.caps & (_cap)) 45 47 static bool getDDHALInfo(PPDEV pDev, DD_HALINFO* pHALInfo); 48 static DECLCALLBACK(void) vboxVHWAFreeCmdCompletion(PPDEV ppdev, VBOXVHWACMD * pCmd, void * pContext); 49 static DECLCALLBACK(void) vboxVHWASurfBltCompletion(PPDEV ppdev, VBOXVHWACMD * pCmd, void * pContext); 50 46 51 #endif 47 52 … … 228 233 #endif 229 234 230 #if 0 /* not mandatory */ 231 /* DX5 and up */ 232 pHalInfo->GetDriverInfo = DdGetDriverInfo; 233 pHalInfo->dwFlags |= DDHALINFO_GETDRIVERINFOSET; 235 #ifdef VBOX_WITH_VIDEOHWACCEL 236 if(pDev->vhwaInfo.bVHWAEnabled) 237 { 238 /* we need it to set DDHAL_PRIVATECAP_NOTIFYPRIMARYCREATION to make ddraw call us for primary surface creation */ 239 /* DX5 and up */ 240 pHalInfo->GetDriverInfo = DdGetDriverInfo; 241 pHalInfo->dwFlags |= DDHALINFO_GETDRIVERINFOSET; 242 } 234 243 #endif 235 244 … … 436 445 memset(&DDPrivateDriverCaps, 0, sizeof(DDPrivateDriverCaps)); 437 446 DDPrivateDriverCaps.dwSize=sizeof(DDPrivateDriverCaps); 438 447 #ifndef VBOX_WITH_VIDEOHWACCEL 439 448 DDPrivateDriverCaps.dwPrivateCaps = 0; /* DDHAL_PRIVATECAP_NOTIFYPRIMARYCREATION -> call CreateSurface for the primary surface */ 449 #else 450 DDPrivateDriverCaps.dwPrivateCaps = DDHAL_PRIVATECAP_NOTIFYPRIMARYCREATION; /* -> call CreateSurface for the primary surface */ 451 #endif 440 452 441 453 lpData->dwActualSize =sizeof(DDPrivateDriverCaps); … … 448 460 if (IsEqualIID(&(lpData->guidInfo), &GUID_DDMoreSurfaceCaps)) 449 461 { 462 #ifndef VBOX_WITH_VIDEOHWACCEL 450 463 DD_MORESURFACECAPS DDMoreSurfaceCaps; 451 464 DDSCAPSEX ddsCapsEx, ddsCapsExAlt; … … 481 494 482 495 lpData->ddRVal = DD_OK; 496 #else 497 DISPDBG((0, " -> GUID_DDMoreSurfaceCaps\n")); 498 #endif 483 499 } 484 500 else … … 495 511 if (IsEqualIID(&lpData->guidInfo, &GUID_NTCallbacks)) 496 512 { 513 #ifndef VBOX_WITH_VIDEOHWACCEL 497 514 DD_NTCALLBACKS NtCallbacks; 498 515 … … 514 531 515 532 lpData->ddRVal = DD_OK; 533 #else 534 DISPDBG((0, " -> GUID_NTCallbacks\n")); 535 #endif 516 536 } 517 537 else … … 589 609 lpSurfaceDesc = lpCreateSurface->lpDDSurfaceDesc; 590 610 611 #ifdef VBOX_WITH_VIDEOHWACCEL 612 if(pDev->vhwaInfo.bVHWAEnabled && lpSurfaceLocal->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) 613 { 614 lBpp = pDev->ulBitCount; 615 lPitch = pDev->lDeltaScreen; 616 } 617 else 618 #endif 619 { 591 620 lpSurfaceGlobal->dwReserved1 = 0; 592 621 … … 615 644 lpSurfaceGlobal->dwBlockSizeY = lpSurfaceGlobal->wHeight; 616 645 lpSurfaceGlobal->lPitch = lPitch; 646 647 lpSurfaceDesc->lPitch = lpSurfaceGlobal->lPitch; 648 lpSurfaceDesc->dwFlags |= DDSD_PITCH; 649 } 617 650 618 651 // … … 631 664 } 632 665 633 lpSurfaceDesc->lPitch = lpSurfaceGlobal->lPitch;634 lpSurfaceDesc->dwFlags |= DDSD_PITCH;635 636 666 #ifdef VBOX_WITH_VIDEOHWACCEL 637 vboxVHWASurfCreate(pDev, lpCreateSurface); 638 #endif 639 667 if(pDev->vhwaInfo.bVHWAEnabled) 668 { 669 VBOXVHWACMD* pCmd = vboxVHWACommandCreate (pDev, VBOXVHWACMD_TYPE_SURF_CREATE, sizeof(VBOXVHWACMD_SURF_CREATE)); 670 if(pCmd) 671 { 672 VBOXVHWACMD_SURF_CREATE * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_CREATE); 673 PVBOXVHWASURFDESC pDesc; 674 memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_CREATE)); 675 676 pBody->u.in.SurfInfo.surfCaps = vboxVHWAFromDDSCAPS(lpSurfaceLocal->ddsCaps.dwCaps); 677 678 pBody->u.in.SurfInfo.height = lpSurfaceGlobal->wHeight; 679 pBody->u.in.SurfInfo.width = lpSurfaceGlobal->wWidth; 680 681 vboxVHWAFromDDPIXELFORMAT(&pBody->u.in.SurfInfo.PixelFormat, &lpSurfaceGlobal->ddpfSurface); 682 683 if (lpSurfaceLocal->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) 684 { 685 pBody->u.in.offSurface = 0; 686 } 687 else 688 { 689 pBody->u.in.offSurface = VBOXVHWA_OFFSET64_VOID; 690 } 691 692 693 pDesc = vboxVHWASurfDescAlloc(); 694 if(pDesc) 695 { 696 pDesc->cBitsPerPixel = lBpp; 697 vboxVHWACommandSubmit(pDev, pCmd); 698 if(pCmd->rc == VINF_SUCCESS) 699 { 700 pDesc->hHostHandle = pBody->u.out.hSurf; 701 lpSurfaceGlobal->dwReserved1 = (ULONG_PTR)pDesc; 702 lpCreateSurface->ddRVal = DD_OK; 703 } 704 else 705 { 706 vboxVHWASurfDescFree(pDesc); 707 lpCreateSurface->ddRVal = DDERR_GENERIC; 708 } 709 } 710 vboxVHWACommandFree(pDev, pCmd); 711 } 712 } 713 #endif 640 714 return DDHAL_DRIVER_NOTHANDLED; 641 715 } … … 680 754 } 681 755 682 #ifndef VBOX_WITH_VIDEOHWACCEL 756 #ifdef VBOX_WITH_VIDEOHWACCEL 757 if(pDev->vhwaInfo.bVHWAEnabled) 758 { 759 VBOXVHWACMD* pCmd; 760 uint32_t unsupportedSCaps = vboxVHWAUnsupportedDDSCAPS(lpDDS->ddsCaps.dwCaps); 761 if(unsupportedSCaps) 762 { 763 VHWADBG(("vboxVHWASurfCanCreate: unsupported ddscaps: 0x%x", unsupportedSCaps)); 764 lpCanCreateSurface->ddRVal = DDERR_INVALIDCAPS; 765 return DDHAL_DRIVER_HANDLED; 766 } 767 768 unsupportedSCaps = vboxVHWAUnsupportedDDPFS(lpDDS->ddpfPixelFormat.dwFlags); 769 if(unsupportedSCaps) 770 { 771 VHWADBG(("vboxVHWASurfCanCreate: unsupported pixel format: 0x%x", unsupportedSCaps)); 772 lpCanCreateSurface->ddRVal = DDERR_INVALIDPIXELFORMAT; 773 return DDHAL_DRIVER_HANDLED; 774 } 775 776 pCmd = vboxVHWACommandCreate (pDev, VBOXVHWACMD_TYPE_SURF_CANCREATE, sizeof(VBOXVHWACMD_SURF_CANCREATE)); 777 if(pCmd) 778 { 779 VBOXVHWACMD_SURF_CANCREATE * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_CANCREATE); 780 memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_CANCREATE)); 781 782 pBody->u.in.SurfInfo.surfCaps = vboxVHWAFromDDSCAPS(lpDDS->ddsCaps.dwCaps); 783 784 pBody->u.in.SurfInfo.height = lpDDS->dwHeight; 785 pBody->u.in.SurfInfo.width = lpDDS->dwWidth; 786 vboxVHWAFromDDPIXELFORMAT(&pBody->u.in.SurfInfo.PixelFormat, &lpDDS->ddpfPixelFormat); 787 788 vboxVHWACommandSubmit(pDev, pCmd); 789 Assert(pCmd->rc == VINF_SUCCESS); 790 if(pCmd->rc == VINF_SUCCESS) 791 { 792 if(pBody->u.out.ErrInfo) 793 { 794 lpCanCreateSurface->ddRVal = DDERR_GENERIC; 795 } 796 else 797 { 798 lpCanCreateSurface->ddRVal = DD_OK; 799 } 800 } 801 else 802 { 803 lpCanCreateSurface->ddRVal = DDERR_GENERIC; 804 } 805 vboxVHWACommandFree(pDev, pCmd); 806 } 807 else 808 { 809 lpCanCreateSurface->ddRVal = DDERR_GENERIC; 810 } 811 return DDHAL_DRIVER_HANDLED; 812 } 813 #endif 683 814 if (lpCanCreateSurface->bIsDifferentPixelFormat && (lpDDS->ddpfPixelFormat.dwFlags & DDPF_FOURCC)) 684 815 { … … 687 818 return DDHAL_DRIVER_HANDLED; 688 819 } 820 689 821 lpCanCreateSurface->ddRVal = DD_OK; 690 #else691 vboxVHWASurfCanCreate(pDev, lpCanCreateSurface);692 #endif693 694 822 return DDHAL_DRIVER_HANDLED; 695 823 } … … 830 958 { 831 959 PPDEV pDev = (PPDEV)lpLock->lpDD->dhpdev; 832 833 PDD_SURFACE_LOCAL lpSurfaceLocal = lpLock->lpDDSurface; 960 DD_SURFACE_LOCAL* lpSurfaceLocal = lpLock->lpDDSurface; 834 961 835 962 DISPDBG((0, "%s: %p bHasRect = %d fpProcess = %p\n", __FUNCTION__, pDev, lpLock->bHasRect, lpLock->fpProcess)); 836 963 964 #ifdef VBOX_WITH_VIDEOHWACCEL 965 if(pDev->vhwaInfo.bVHWAEnabled) 966 { 967 DD_SURFACE_GLOBAL* lpSurfaceGlobal = lpSurfaceLocal->lpGbl; 968 PVBOXVHWASURFDESC pDesc = (PVBOXVHWASURFDESC)lpSurfaceGlobal->dwReserved1; 969 VBOXVHWACMD* pCmd; 970 /* ensure we have host cmds processed to update pending blits and flips */ 971 vboxVHWACommandCheckHostCmds(pDev); 972 973 // if(VBOXDD_CHECKFLAG(lpLock, DDLOCK_DONOTWAIT)) 974 { 975 if(ASMAtomicUoReadU32(&pDesc->cPendingBltsSrc) 976 || ASMAtomicUoReadU32(&pDesc->cPendingBltsDst) 977 || ASMAtomicUoReadU32(&pDesc->cPendingFlips)) 978 { 979 lpLock->ddRVal = DDERR_WASSTILLDRAWING; 980 return DDHAL_DRIVER_HANDLED; 981 } 982 } 983 984 if(VBOXDD_CHECKFLAG(lpLock->dwFlags, DDLOCK_SURFACEMEMORYPTR)) 985 { 986 lpLock->lpSurfData = (LPVOID)(lpSurfaceGlobal->fpVidMem + lpSurfaceGlobal->lPitch * lpLock->rArea.top 987 + lpLock->rArea.left * pDesc->cBitsPerPixel/8); 988 } 989 990 pCmd = vboxVHWACommandCreate (pDev, VBOXVHWACMD_TYPE_SURF_LOCK, sizeof(VBOXVHWACMD_SURF_LOCK)); 991 if(pCmd) 992 { 993 VBOXVHWACMD_SURF_LOCK * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_LOCK); 994 memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_LOCK)); 995 996 pBody->u.in.offSurface = (uint64_t)lpSurfaceGlobal->fpVidMem; 997 998 if (lpLock->bHasRect) 999 { 1000 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)); 1001 vboxVHWAFromRECTL(&pBody->u.in.rect, &lpLock->rArea); 1002 pBody->u.in.rectValid = 1; 1003 } 1004 else 1005 { 1006 pBody->u.in.rectValid = 0; 1007 } 1008 1009 pBody->u.in.hSurf = pDesc->hHostHandle; 1010 1011 if(VBOXDD_CHECKFLAG(lpLock->dwFlags, DDLOCK_DISCARDCONTENTS)) 1012 { 1013 pBody->u.in.flags |= VBOXVHWA_LOCK_DISCARDCONTENTS; 1014 /* we're not interested in completion, just send the command */ 1015 vboxVHWACommandSubmitAsynch(pDev, pCmd, vboxVHWAFreeCmdCompletion, NULL); 1016 } 1017 else 1018 { 1019 /* wait for the surface to be locked and memory buffer updated */ 1020 vboxVHWACommandSubmit(pDev, pCmd); 1021 vboxVHWACommandFree(pDev, pCmd); 1022 } 1023 1024 lpLock->ddRVal = DD_OK; 1025 } 1026 else 1027 { 1028 lpLock->ddRVal = DDERR_GENERIC; 1029 } 1030 return DDHAL_DRIVER_HANDLED; 1031 } 1032 #endif 837 1033 if (lpSurfaceLocal->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) 838 1034 { … … 887 1083 PPDEV pDev = (PPDEV)lpUnlock->lpDD->dhpdev; 888 1084 DISPDBG((0, "%s: %p\n", __FUNCTION__, pDev)); 889 1085 #ifdef VBOX_WITH_VIDEOHWACCEL 1086 if (pDev->vhwaInfo.bVHWAEnabled) 1087 { 1088 DD_SURFACE_LOCAL* lpSurfaceLocal = lpUnlock->lpDDSurface; 1089 DD_SURFACE_GLOBAL* lpSurfaceGlobal = lpSurfaceLocal->lpGbl; 1090 PVBOXVHWASURFDESC pDesc = (PVBOXVHWASURFDESC)lpSurfaceGlobal->dwReserved1; 1091 VBOXVHWACMD* pCmd; 1092 1093 //TODO: hadle vrdp properly 1094 if ( pDev->pVBVA->u32HostEvents 1095 & VBOX_VIDEO_INFO_HOST_EVENTS_F_VRDP_RESET) 1096 { 1097 vrdpReset (pDev); 1098 1099 pDev->pVBVA->u32HostEvents &= 1100 ~VBOX_VIDEO_INFO_HOST_EVENTS_F_VRDP_RESET; 1101 } 1102 1103 /* ensure we have host cmds processed to update pending blits and flips */ 1104 vboxVHWACommandCheckHostCmds(pDev); 1105 1106 pCmd = vboxVHWACommandCreate (pDev, VBOXVHWACMD_TYPE_SURF_UNLOCK, sizeof(VBOXVHWACMD_SURF_UNLOCK)); 1107 // int rc = VERR_GENERAL_FAILURE; 1108 if(pCmd) 1109 { 1110 VBOXVHWACMD_SURF_UNLOCK * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_UNLOCK); 1111 memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_UNLOCK)); 1112 1113 pBody->u.in.hSurf = pDesc->hHostHandle; 1114 1115 vboxVHWACommandSubmitAsynch(pDev, pCmd, vboxVHWAFreeCmdCompletion, NULL); 1116 1117 lpUnlock->ddRVal = DD_OK; 1118 } 1119 else 1120 { 1121 lpUnlock->ddRVal = DDERR_GENERIC; 1122 } 1123 1124 return DDHAL_DRIVER_HANDLED; 1125 } 1126 #endif 890 1127 if (pDev->ddLock.bLocked) 891 1128 { … … 964 1201 DWORD APIENTRY DdDestroySurface(PDD_DESTROYSURFACEDATA lpDestroySurface) 965 1202 { 1203 #ifdef VBOX_WITH_VIDEOHWACCEL 966 1204 PPDEV pDev = (PPDEV)lpDestroySurface->lpDD->dhpdev; 967 DISPDBG((0, "%s: %p\n", __FUNCTION__, pDev)); 968 969 #ifdef VBOX_WITH_VIDEOHWACCEL 970 vboxVHWASurfDestroy(pDev, lpDestroySurface); 971 #else 972 lpDestroySurface->ddRVal = DD_OK; 973 #endif 1205 if(pDev->vhwaInfo.bVHWAEnabled) 1206 { 1207 DD_SURFACE_LOCAL* lpSurfaceLocal = lpDestroySurface->lpDDSurface; 1208 DD_SURFACE_GLOBAL* lpSurfaceGlobal = lpSurfaceLocal->lpGbl; 1209 VBOXVHWACMD* pCmd; 1210 1211 DISPDBG((0, "%s: %p\n", __FUNCTION__, pDev)); 1212 1213 pCmd = vboxVHWACommandCreate (pDev, VBOXVHWACMD_TYPE_SURF_DESTROY, sizeof(VBOXVHWACMD_SURF_DESTROY)); 1214 // int rc = VERR_GENERAL_FAILURE; 1215 if(pCmd) 1216 { 1217 VBOXVHWACMD_SURF_DESTROY * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_DESTROY); 1218 PVBOXVHWASURFDESC pDesc = (PVBOXVHWASURFDESC)lpSurfaceGlobal->dwReserved1; 1219 1220 memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_DESTROY)); 1221 1222 pBody->u.in.hSurf = pDesc->hHostHandle; 1223 1224 /* we're not interested in completion, just send the command */ 1225 vboxVHWACommandSubmitAsynch(pDev, pCmd, vboxVHWAFreeCmdCompletion, NULL); 1226 1227 vboxVHWASurfDescFree(pDesc); 1228 1229 lpDestroySurface->ddRVal = DD_OK; 1230 } 1231 else 1232 { 1233 lpDestroySurface->ddRVal = DDERR_GENERIC; 1234 } 1235 } 1236 else 1237 #endif 1238 lpDestroySurface->ddRVal = DD_OK; 974 1239 return DDHAL_DRIVER_HANDLED; 975 1240 } … … 1072 1337 DWORD APIENTRY DdBlt(PDD_BLTDATA lpBlt) 1073 1338 { 1339 #ifdef VBOX_WITH_VIDEOHWACCEL 1074 1340 PPDEV pDev = (PPDEV)lpBlt->lpDD->dhpdev; 1075 1341 DISPDBG((0, "%s\n", __FUNCTION__)); 1076 vboxVHWASurfBlt(pDev, lpBlt); 1342 #if DX9_DDI 1343 if(VBOXDD_CHECKFLAG(lpBlt->dwFlags, DDBLT_EXTENDED_PRESENTATION_STRETCHFACTOR)) 1344 { 1345 lpBlt->ddRVal = DD_OK; 1346 } 1347 else 1348 #endif 1349 { 1350 DD_SURFACE_LOCAL* lpDestSurfaceLocal = lpBlt->lpDDDestSurface; 1351 DD_SURFACE_GLOBAL* lpDestSurfaceGlobal = lpDestSurfaceLocal->lpGbl; 1352 DD_SURFACE_LOCAL* lpSrcSurfaceLocal = lpBlt->lpDDSrcSurface; 1353 DD_SURFACE_GLOBAL* lpSrcSurfaceGlobal = lpSrcSurfaceLocal->lpGbl; 1354 VBOXVHWACMD* pCmd = vboxVHWACommandCreate (pDev, VBOXVHWACMD_TYPE_SURF_BLT, sizeof(VBOXVHWACMD_SURF_BLT)); 1355 // int rc = VERR_GENERAL_FAILURE; 1356 if(pCmd) 1357 { 1358 VBOXVHWACMD_SURF_BLT * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_BLT); 1359 PVBOXVHWASURFDESC pSrcDesc = (PVBOXVHWASURFDESC)lpSrcSurfaceGlobal->dwReserved1; 1360 PVBOXVHWASURFDESC pDestDesc = (PVBOXVHWASURFDESC)lpDestSurfaceGlobal->dwReserved1; 1361 memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_BLT)); 1362 1363 pBody->u.in.offSrcSurface = (uint64_t)lpSrcSurfaceGlobal->fpVidMem; 1364 pBody->u.in.offDstSurface = (uint64_t)lpDestSurfaceGlobal->fpVidMem; 1365 1366 pBody->u.in.hDstSurf = pDestDesc->hHostHandle; 1367 vboxVHWAFromRECTL(&pBody->u.in.dstRect, &lpBlt->rDest); 1368 pBody->u.in.hSrcSurf = pSrcDesc->hHostHandle; 1369 vboxVHWAFromRECTL(&pBody->u.in.srcRect, &lpBlt->rSrc); 1370 pBody->DstGuestSurfInfo = (uint64_t)pDestDesc; 1371 pBody->SrcGuestSurfInfo = (uint64_t)pSrcDesc; 1372 1373 ASMAtomicIncU32(&pSrcDesc->cPendingBltsSrc); 1374 ASMAtomicIncU32(&pDestDesc->cPendingBltsDst); 1375 1376 // if(VBOXDD_CHECKFLAG(lpBlt->dwFlags, DDBLT_ASYNC)) 1377 // { 1378 vboxVHWACommandSubmitAsynch(pDev, pCmd, vboxVHWASurfBltCompletion, NULL); 1379 // } 1380 // else 1381 // { 1382 // vboxVHWACommandSubmit(pDev, pCmd); 1383 // } 1384 lpBlt->ddRVal = DD_OK; 1385 } 1386 else 1387 { 1388 lpBlt->ddRVal = DDERR_GENERIC; 1389 } 1390 } 1391 1077 1392 return DDHAL_DRIVER_HANDLED; 1393 #else 1394 lpBlt->ddRVal = DDERR_GENERIC; 1395 return DDHAL_DRIVER_NOTHANDLED; 1396 #endif 1078 1397 } 1079 1398 … … 1207 1526 static DWORD rops[DD_ROP_SPACE] = { 0 }; 1208 1527 1209 bool1528 static bool 1210 1529 getDDHALInfo( 1211 1530 PPDEV pDev, … … 1527 1846 } // getDDHALInfo 1528 1847 1848 static DECLCALLBACK(void) vboxVHWAFreeCmdCompletion(PPDEV ppdev, VBOXVHWACMD * pCmd, void * pContext) 1849 { 1850 vboxVHWACommandFree(ppdev, pCmd); 1851 } 1852 1853 static DECLCALLBACK(void) vboxVHWASurfBltCompletion(PPDEV ppdev, VBOXVHWACMD * pCmd, void * pContext) 1854 { 1855 VBOXVHWACMD_SURF_BLT * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_BLT); 1856 PVBOXVHWASURFDESC pSrcDesc = (PVBOXVHWASURFDESC)pBody->SrcGuestSurfInfo; 1857 PVBOXVHWASURFDESC pDestDesc = (PVBOXVHWASURFDESC)pBody->DstGuestSurfInfo; 1858 1859 ASMAtomicDecU32(&pSrcDesc->cPendingBltsSrc); 1860 ASMAtomicDecU32(&pDestDesc->cPendingBltsDst); 1861 1862 vboxVHWACommandFree(ppdev, pCmd); 1863 } 1529 1864 1530 1865 #endif -
trunk/src/VBox/Additions/WINNT/Graphics/Display/driver.h
r20483 r20653 101 101 volatile uint32_t cPendingBltsDst; 102 102 volatile uint32_t cPendingFlips; 103 uint32_t cBitsPerPixel; 103 104 }VBOXVHWASURFDESC, *PVBOXVHWASURFDESC; 104 105 … … 280 281 #ifdef VBOX_WITH_VIDEOHWACCEL 281 282 283 #define VBOXDD_CHECKFLAG(_v, _f) ((_v) & (_f)) == (_f) 284 282 285 typedef DECLCALLBACK(void) FNVBOXVHWACMDCOMPLETION(PPDEV ppdev, VBOXVHWACMD * pCmd, void * pContext); 283 286 typedef FNVBOXVHWACMDCOMPLETION *PFNVBOXVHWACMDCOMPLETION; 284 287 285 VBOXVHWACMD* vboxVHWACommandCreate (PPDEV ppdev, VBOXVHWACMD_ LENGTH cbCmd);288 VBOXVHWACMD* vboxVHWACommandCreate (PPDEV ppdev, VBOXVHWACMD_TYPE enmCmd, VBOXVHWACMD_LENGTH cbCmd); 286 289 void vboxVHWACommandFree (PPDEV ppdev, VBOXVHWACMD* pCmd); 287 290 BOOL vboxVHWACommandSubmit (PPDEV ppdev, VBOXVHWACMD* pCmd); … … 300 303 void vboxVHWAInit(); 301 304 void vboxVHWATerm(); 302 void vboxVHWASurfCanCreate(PPDEV ppdev, PDD_CANCREATESURFACEDATA lpCanCreateSurface); 303 void vboxVHWASurfCreate(PPDEV ppdev, PDD_CREATESURFACEDATA lpCreateSurface); 304 void vboxVHWASurfDestroy(PPDEV ppdev, PDD_DESTROYSURFACEDATA lpDestroySurface); 305 void vboxVHWASurfBlt(PPDEV ppdev, PDD_BLTDATA lpBlt); 305 uint32_t vboxVHWAUnsupportedDDCAPS(uint32_t caps); 306 uint32_t vboxVHWAUnsupportedDDSCAPS(uint32_t caps); 307 uint32_t vboxVHWAUnsupportedDDPFS(uint32_t caps); 308 uint32_t vboxVHWASupportedDDCAPS(uint32_t caps); 309 uint32_t vboxVHWASupportedDDSCAPS(uint32_t caps); 310 uint32_t vboxVHWASupportedDDPFS(uint32_t caps); 311 uint32_t vboxVHWAFromDDCAPS(uint32_t caps); 312 uint32_t vboxVHWAToDDCAPS(uint32_t caps); 313 uint32_t vboxVHWAFromDDSCAPS(uint32_t caps); 314 uint32_t vboxVHWAToDDSCAPS(uint32_t caps); 315 uint32_t vboxVHWAFromDDPFS(uint32_t caps); 316 uint32_t vboxVHWAToDDPFS(uint32_t caps); 317 void vboxVHWAFromDDPIXELFORMAT(VBOXVHWA_PIXELFORMAT *pVHWAFormat, DDPIXELFORMAT *pDdFormat); 318 void vboxVHWAFromRECTL(VBOXVHWA_RECTL *pDst, RECTL *pSrc); 319 PVBOXVHWASURFDESC vboxVHWASurfDescAlloc(); 320 void vboxVHWASurfDescFree(PVBOXVHWASURFDESC pDesc); 321 322 int vboxVHWAEnable(PPDEV ppdev); 323 int vboxVHWADisable(PPDEV ppdev); 324 306 325 #endif 307 326 #endif -
trunk/src/VBox/Additions/WINNT/Graphics/Display/enable.c
r18246 r20653 101 101 case OPENGL_GETINFO: 102 102 { 103 if ( cjOut >= sizeof(OPENGL_INFO) 104 && pvOut) 105 { 106 POPENGL_INFO pInfo = (POPENGL_INFO)pvOut; 107 108 pInfo->dwVersion = 2; 109 pInfo->dwDriverVersion = 1; 110 pInfo->szDriverName[0] = 'V'; 111 pInfo->szDriverName[1] = 'B'; 112 pInfo->szDriverName[2] = 'o'; 113 pInfo->szDriverName[3] = 'x'; 114 pInfo->szDriverName[4] = 'O'; 115 pInfo->szDriverName[5] = 'G'; 116 pInfo->szDriverName[6] = 'L'; 117 pInfo->szDriverName[7] = 0; 118 119 DISPDBG((0, "OPENGL_GETINFO\n")); 120 return cjOut; 121 } 122 else 103 if ( cjOut >= sizeof(OPENGL_INFO) 104 && pvOut) 105 { 106 POPENGL_INFO pInfo = (POPENGL_INFO)pvOut; 107 108 pInfo->dwVersion = 2; 109 pInfo->dwDriverVersion = 1; 110 pInfo->szDriverName[0] = 'V'; 111 pInfo->szDriverName[1] = 'B'; 112 pInfo->szDriverName[2] = 'o'; 113 pInfo->szDriverName[3] = 'x'; 114 pInfo->szDriverName[4] = 'O'; 115 pInfo->szDriverName[5] = 'G'; 116 pInfo->szDriverName[6] = 'L'; 117 pInfo->szDriverName[7] = 0; 118 119 DISPDBG((0, "OPENGL_GETINFO\n")); 120 return cjOut; 121 } 122 else 123 123 DISPDBG((0, "OPENGL_GETINFO invalid size %d\n", cjOut)); /* It doesn't matter that we fail here. Opengl32 will fall back to software rendering when this escape is not supported. */ 124 124 break; … … 238 238 return 0; 239 239 } 240 240 241 241 BOOL DrvConnect (PVOID x1, PVOID x2, PVOID x3, PVOID x4) 242 242 { … … 318 318 // { 0x50, (PFN) DrvShadowConnect }, // 0x50 319 319 // { 0x51, (PFN) DrvShadowDisconnect }, // 0x51 320 320 321 321 }; 322 322 … … 443 443 444 444 DISPDBG((0, "VBoxDisp::DrvEnablePDEV called\n")); 445 445 446 446 UNREFERENCED_PARAMETER(pwszLogAddress); 447 447 UNREFERENCED_PARAMETER(pwszDeviceName); 448 448 449 449 RtlZeroMemory(&DevInfo, sizeof (DEVINFO)); 450 450 RtlZeroMemory(&GdiInfo, sizeof (GDIINFO)); … … 465 465 466 466 ppdev->hDriver = hDriver; 467 467 468 468 // Get the current screen mode information. Set up device caps and devinfo. 469 469 … … 481 481 DISPDBG((0, "DrvEnablePDEV failed bInitPointer\n")); 482 482 } 483 483 484 484 // Initialize palette information. 485 485 … … 489 489 goto error_free; 490 490 } 491 491 492 492 // // Start a thread that will process notifications from VMMDev 493 493 // if (!bInitNotificationThread(ppdev)) … … 496 496 // goto error_free; 497 497 // } 498 498 499 499 // Copy the devinfo into the engine buffer. 500 500 501 501 DISPDBG((0, "VBoxDisp::DrvEnablePDEV: sizeof(DEVINFO) = %d, cjDevInfo = %d, alpha = %d\n", sizeof(DEVINFO), cjDevInfo, DevInfo.flGraphicsCaps2 & GCAPS2_ALPHACURSOR)); 502 502 503 503 // @todo seems to be not necessary. these bits are initialized in screen.c DevInfo.flGraphicsCaps |= GCAPS_OPAQUERECT | 504 504 // GCAPS_DITHERONREALIZE | … … 509 509 // GCAPS_COLOR_DITHER | 510 510 // GCAPS_ASYNCMOVE; 511 // 511 // 512 512 // DevInfo.flGraphicsCaps |= GCAPS_DITHERONREALIZE; 513 513 514 514 DevInfo.flGraphicsCaps2 |= GCAPS2_RESERVED1; /* @todo figure out what is this. */ 515 515 … … 522 522 523 523 DISPDBG((0, "VBoxDisp::DrvEnablePDEV completed %x\n", ppdev)); 524 524 525 525 return((DHPDEV) ppdev); 526 526 … … 557 557 // vStopNotificationThread ((PPDEV) dhpdev); 558 558 vDisablePalette((PPDEV) dhpdev); 559 559 560 560 /* Free the driver's VBVA resources. */ 561 561 vboxVbvaDisable ((PPDEV) dhpdev); … … 615 615 #endif 616 616 DISPDBG((0, "DISP DrvEnableSurface called\n")); 617 617 618 618 // Create engine bitmap around frame buffer. 619 619 … … 630 630 631 631 DISPDBG((0, "DISP DrvEnableSurface bInitSURF success\n")); 632 632 633 633 sizl.cx = ppdev->cxScreen; 634 634 sizl.cy = ppdev->cyScreen; … … 690 690 ulBitmapType); 691 691 } 692 692 693 693 if ( hsurf == 0 ) 694 694 { … … 701 701 // GDI. We cant do this on NT4.0 hence we call EngAssociateSurface. 702 702 // 703 703 704 704 if(g_bOnNT40) 705 705 { … … 707 707 // We have to associate the surface we just created with our physical 708 708 // device so that GDI can get information related to the PDEV when 709 // it's drawing to the surface (such as, for example, the length of 709 // it's drawing to the surface (such as, for example, the length of 710 710 // styles on the device when simulating styled lines). 711 711 // … … 720 720 { 721 721 DISPDBG((0, "DrvEnableSurface: failed EngAssociateSurface\n")); 722 goto l_Failure; 722 goto l_Failure; 723 723 } 724 724 … … 726 726 // Jam in the value of dhsurf into screen SURFOBJ. We do this to 727 727 // make sure the driver acclerates Drv calls we hook and not 728 // punt them back to GDI as the SURFOBJ's dhsurf = 0. 728 // punt them back to GDI as the SURFOBJ's dhsurf = 0. 729 729 // 730 730 ppdev->psoScreenBitmap = EngLockSurface(hsurf); … … 732 732 { 733 733 DISPDBG((0, "DrvEnableSurface: failed EngLockSurface\n")); 734 goto l_Failure; 734 goto l_Failure; 735 735 } 736 736 … … 767 767 (ppdev->lDeltaScreen > 0) ? BMF_TOPDOWN : 0, 768 768 (PVOID) (ppdev->pjScreen)); 769 769 770 770 if (hsurf == (HSURF) 0) 771 771 { … … 776 776 { 777 777 ppdev->hsurfScreenBitmap = hsurf; 778 778 779 779 if (!EngAssociateSurface(hsurf, ppdev->hdevEng, 0)) 780 780 { … … 785 785 { 786 786 SURFOBJ *pso = EngLockSurface(hsurf); 787 787 788 788 ppdev->psoScreenBitmap = pso; 789 789 790 790 hsurf = (HSURF) EngCreateDeviceSurface((DHSURF)pso, 791 791 sizl, … … 816 816 } 817 817 } 818 #endif /* VBOX_NEW_SURFACE_CODE */ 818 #endif /* VBOX_NEW_SURFACE_CODE */ 819 819 return ppdev->hsurfScreen; 820 820 821 821 l_Failure: 822 822 823 823 DrvDisableSurface(dhpdev); 824 824 825 825 return((HSURF)0); 826 826 } … … 836 836 { 837 837 PPDEV ppdev = (PPDEV)dhpdev; 838 838 839 839 DISPDBG((0, "VBoxDisp::DrvDisableSurface called\n")); 840 840 if (ppdev->psoScreenBitmap) … … 861 861 ppdev->hsurfScreenBitmap = (HSURF)0; 862 862 } 863 #endif 863 #endif 864 865 #ifdef VBOX_WITH_VIDEOHWACCEL 866 /* tells we can not process host commands any more and ensures we've completed processing of the host VHWA commands */ 867 vboxVHWADisable(ppdev); 868 #endif 864 869 vDisableSURF(ppdev); 865 870 } … … 879 884 880 885 DISPDBG((0, "DISP DrvAssertMode called bEnable = %d\n", bEnable)); 881 886 882 887 if (bEnable) 883 888 { … … 898 903 SIZEL sizl; 899 904 SURFOBJ *pso; 900 905 901 906 DISPDBG((0, "DISP DrvAssertMode Screen pointer has changed!!!\n")); 902 907 903 908 sizl.cx = ppdev->cxScreen; 904 909 sizl.cy = ppdev->cyScreen; 905 910 906 911 hsurf = (HSURF) EngCreateBitmap(sizl, 907 912 ppdev->lDeltaScreen, … … 909 914 (ppdev->lDeltaScreen > 0) ? BMF_TOPDOWN : 0, 910 915 (PVOID) (ppdev->pjScreen)); 911 916 912 917 if (hsurf == (HSURF) 0) 913 918 { … … 915 920 return FALSE; 916 921 } 917 922 918 923 pso = EngLockSurface(hsurf); 919 924 920 925 if (ppdev->psoScreenBitmap) 921 926 { … … 929 934 ppdev->hsurfScreenBitmap = (HSURF)0; 930 935 } 931 936 932 937 ppdev->hsurfScreenBitmap = hsurf; 933 938 ppdev->psoScreenBitmap = pso; … … 939 944 return FALSE; 940 945 } 941 946 942 947 if (!EngAssociateSurface(ppdev->hsurfScreen, ppdev->hdevEng, ppdev->flHooks)) 943 948 { … … 945 950 return FALSE; 946 951 } 947 952 948 953 return TRUE; 949 954 } 950 955 else 951 956 { 957 #ifdef VBOX_WITH_VIDEOHWACCEL 958 /* tells we can not process host commands any more and ensures we've completed processing of the host VHWA commands */ 959 vboxVHWADisable(ppdev); 960 #endif 952 961 // 953 962 // We must give up the display. … … 987 996 \******************************************************************************/ 988 997 989 HBITMAP 998 HBITMAP 990 999 DrvCreateDeviceBitmap( 991 1000 DHPDEV dhpdev, … … 1005 1014 \******************************************************************************/ 1006 1015 1007 VOID 1016 VOID 1008 1017 DrvDeleteDeviceBitmap( 1009 1018 DHSURF dhsurf) … … 1149 1158 ppdev->ptlDevOrg = *(PPOINTL)pvData; 1150 1159 #ifndef VBOX_WITH_HGSMI 1151 DISPDBG((3, "DN_DEVICE_ORIGIN: %d, %d (PSO = %p, pInfo = %p)\n", ppdev->ptlDevOrg.x, 1160 DISPDBG((3, "DN_DEVICE_ORIGIN: %d, %d (PSO = %p, pInfo = %p)\n", ppdev->ptlDevOrg.x, 1152 1161 ppdev->ptlDevOrg.y, pso, ppdev->pInfo)); 1153 1162 if (ppdev->pInfo) … … 1158 1167 } 1159 1168 #else 1160 DISPDBG((3, "DN_DEVICE_ORIGIN: %d, %d (PSO = %p)\n", ppdev->ptlDevOrg.x, 1169 DISPDBG((3, "DN_DEVICE_ORIGIN: %d, %d (PSO = %p)\n", ppdev->ptlDevOrg.x, 1161 1170 ppdev->ptlDevOrg.y, pso)); 1162 1171 VBoxProcessDisplayInfo(ppdev); … … 1179 1188 // Parameters 1180 1189 // pDirectDraw-----Points to a DD_DIRECTDRAW_GLOBAL structure that describes 1181 // the DirectDraw object. 1190 // the DirectDraw object. 1182 1191 // pSurface--------Points to a DD_SURFACE_LOCAL structure that describes the 1183 1192 // DirectDraw surface around which to wrap a GDI surface. … … 1250 1259 { 1251 1260 SIZEL sizel; 1252 DWORD ulBitmapType, flHooks; 1261 DWORD ulBitmapType, flHooks; 1253 1262 1254 1263 sizel.cx = pSurfaceGlobal->wWidth; … … 1296 1305 SURFOBJ *surfobj = EngLockSurface ((HSURF)hbmDevice); 1297 1306 DISPDBG((0, "DrvDeriveSurface surfobj %x, hsurf = %x\n", surfobj, surfobj->hsurf)); 1298 1307 1299 1308 surfobj->dhpdev = (DHPDEV)pDev; 1300 1309 1301 1310 EngUnlockSurface(surfobj); 1302 1311 … … 1318 1327 DISPDBG((0, "DrvDeriveSurface return NULL\n")); 1319 1328 DISPDBG((0, "pSurfaceGlobal->ddpfSurface.dwRGBBitCount = %d, lPitch =%ld\n", pSurfaceGlobal->ddpfSurface.dwRGBBitCount,pSurfaceGlobal->lPitch)); 1320 1329 1321 1330 return(0); 1322 1331 } -
trunk/src/VBox/Additions/WINNT/Graphics/Display/screen.c
r20478 r20653 535 535 #endif /* VBOX_WITH_HGSMI */ 536 536 537 #ifdef VBOX_WITH_VIDEOHWACCEL 538 /* tells we can process host commands */ 539 vboxVHWAEnable(ppdev); 540 #endif 541 537 542 return(TRUE); 538 543 } -
trunk/src/VBox/Additions/WINNT/Graphics/Display/vbox.c
r20478 r20653 692 692 # ifdef VBOX_WITH_VIDEOHWACCEL 693 693 694 VBOXVHWACMD* vboxVHWACommandCreate (PPDEV ppdev, VBOXVHWACMD_ LENGTH cbCmd)694 VBOXVHWACMD* vboxVHWACommandCreate (PPDEV ppdev, VBOXVHWACMD_TYPE enmCmd, VBOXVHWACMD_LENGTH cbCmd) 695 695 { 696 696 VBOXVHWACMD* pHdr = (VBOXVHWACMD*)HGSMIHeapAlloc (&ppdev->hgsmiDisplayHeap, … … 702 702 DISPDBG((0, "VBoxDISP::vboxVHWACommandCreate: HGSMIHeapAlloc failed\n")); 703 703 } 704 else 705 { 706 memset(pHdr, 0, sizeof(VBOXVHWACMD)); 707 pHdr->iDisplay = ppdev->iDevice; 708 pHdr->rc = VERR_GENERAL_FAILURE; 709 pHdr->enmCmd = enmCmd; 710 } 704 711 705 712 /* temporary hack */ … … 837 844 VBOXVHWACMD_QUERYINFO1* vboxVHWAQueryHostInfo1(PPDEV ppdev) 838 845 { 839 VBOXVHWACMD* pCmd = vboxVHWACommandCreate (ppdev, sizeof(VBOXVHWACMD_QUERYINFO1));846 VBOXVHWACMD* pCmd = vboxVHWACommandCreate (ppdev, VBOXVHWACMD_TYPE_QUERY_INFO1, sizeof(VBOXVHWACMD_QUERYINFO1)); 840 847 if (!pCmd) 841 848 { … … 844 851 } 845 852 846 pCmd->enmCmd = VBOXVHWACMD_TYPE_QUERY_INFO1;847 853 if(vboxVHWACommandSubmit (ppdev, pCmd)) 848 854 { … … 859 865 VBOXVHWACMD_QUERYINFO2* vboxVHWAQueryHostInfo2(PPDEV ppdev, uint32_t numFourCC) 860 866 { 861 VBOXVHWACMD* pCmd = vboxVHWACommandCreate (ppdev, sizeof(VBOXVHWACMD_QUERYINFO2));867 VBOXVHWACMD* pCmd = vboxVHWACommandCreate (ppdev, VBOXVHWACMD_TYPE_QUERY_INFO2, sizeof(VBOXVHWACMD_QUERYINFO2)); 862 868 VBOXVHWACMD_QUERYINFO2 *pInfo2; 863 869 if (!pCmd) … … 867 873 } 868 874 869 pCmd->enmCmd = VBOXVHWACMD_TYPE_QUERY_INFO2;870 875 pInfo2 = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_QUERYINFO2); 871 876 pInfo2->numFourCC = numFourCC; … … 930 935 } 931 936 937 int vboxVHWAEnable(PPDEV ppdev) 938 { 939 int rc = VERR_GENERAL_FAILURE; 940 VBOXVHWACMD* pCmd = vboxVHWACommandCreate (ppdev, VBOXVHWACMD_TYPE_ENABLE, 0); 941 if (!pCmd) 942 { 943 DISPDBG((0, "VBoxDISP::vboxVHWAQueryHostInfo1: vboxVHWACommandCreate failed\n")); 944 return NULL; 945 } 946 947 if(vboxVHWACommandSubmit (ppdev, pCmd)) 948 { 949 if(RT_SUCCESS(pCmd->rc)) 950 { 951 rc = VINF_SUCCESS; 952 } 953 } 954 955 vboxVHWACommandFree (ppdev, pCmd); 956 return rc; 957 } 958 959 int vboxVHWADisable(PPDEV ppdev) 960 { 961 int rc = VERR_GENERAL_FAILURE; 962 VBOXVHWACMD* pCmd = vboxVHWACommandCreate (ppdev, VBOXVHWACMD_TYPE_DISABLE, 0); 963 if (!pCmd) 964 { 965 DISPDBG((0, "VBoxDISP::vboxVHWAQueryHostInfo1: vboxVHWACommandCreate failed\n")); 966 return NULL; 967 } 968 969 if(vboxVHWACommandSubmit (ppdev, pCmd)) 970 { 971 if(RT_SUCCESS(pCmd->rc)) 972 { 973 rc = VINF_SUCCESS; 974 } 975 } 976 977 vboxVHWACommandFree (ppdev, pCmd); 978 979 vboxVHWACommandCheckHostCmds(ppdev); 980 981 return rc; 982 } 932 983 933 984 # endif -
trunk/src/VBox/Frontends/VirtualBox/include/VBoxFrameBuffer.h
r20478 r20653 327 327 public: 328 328 VBoxVHWADirtyRect() : 329 mIsClear( false)329 mIsClear(true) 330 330 {} 331 331 … … 343 343 } 344 344 345 bool isClear() { return mIsClear; }345 bool isClear() const { return mIsClear; } 346 346 347 347 void add(const QRect & aRect) … … 363 363 { 364 364 mRect = aRect; 365 mIsClear = false; 365 366 } 366 367 } … … 368 369 void clear() { mIsClear = true; } 369 370 370 const QRect & rect() {return mRect;} 371 372 bool intersects(const QRect & aRect) {return mIsClear ? false : mRect.intersects(aRect);} 371 const QRect & rect() const {return mRect;} 372 373 bool intersects(const QRect & aRect) const {return mIsClear ? false : mRect.intersects(aRect);} 374 375 bool intersects(const VBoxVHWADirtyRect & aRect) const {return mIsClear ? false : aRect.intersects(mRect);} 376 377 QRect united(const QRect & aRect) const {return mIsClear ? aRect : aRect.united(mRect);} 378 379 bool contains(const QRect & aRect) const {return mIsClear ? false : aRect.contains(mRect);} 380 381 void subst(const VBoxVHWADirtyRect & aRect) { if(!mIsClear && aRect.contains(mRect)) clear(); } 373 382 374 383 private: … … 391 400 static void globalInit(); 392 401 393 int blt(const QRect * pDstRect, VBoxVHWASurfaceBase * pSrtSurface, const QRect * pSrcRect);394 395 int lock(const QRect * pRect );402 int blt(const QRect * aDstRect, VBoxVHWASurfaceBase * aSrtSurface, const QRect * aSrcRect); 403 404 int lock(const QRect * pRect, uint32_t flags); 396 405 397 406 int unlock(); … … 399 408 virtual void makeCurrent() = 0; 400 409 401 void paint(const QRect * pRect);410 void paint(const QRect * aRect); 402 411 403 412 void performDisplay() { Assert(mDisplayInitialized); glCallList(mDisplay); } … … 407 416 static GLsizei makePowerOf2(GLsizei val); 408 417 418 bool addressAlocated() const { return mFreeAddress; } 409 419 uchar * address(){ return mAddress; } 410 420 uchar * pointAddress(int x, int y) { return mAddress + y*mBytesPerLine + x*mBytesPerPixel; } 411 ulong memSize(){ return mBytesPerLine * m DisplayHeight; }412 413 ulong width() { return m DisplayWidth; }414 ulong height() { return m DisplayHeight; }421 ulong memSize(){ return mBytesPerLine * mRect.height(); } 422 423 ulong width() { return mRect.width(); } 424 ulong height() { return mRect.height(); } 415 425 416 426 GLenum format() {return mFormat; } … … 420 430 ulong bytesPerLine() { return mBytesPerLine; } 421 431 422 /* clients should treat the re rurned texture as read-only */432 /* clients should treat the returned texture as read-only */ 423 433 GLuint textureSynched(const QRect * aRect) { synchTexture(aRect); return mTexture; } 424 434 435 void setAddress(uchar * addr); 436 437 const QRect& rect() {return mRect;} 438 439 virtual bool isPrimary() = 0; 425 440 private: 426 441 void initDisplay(); 427 442 void deleteDisplay(); 428 void updateTexture(const QRect * pRect); 429 void synchTexture(const QRect * pRect); 430 void synchMem(const QRect * pRect); 443 void updateTexture(const QRect * aRect); 444 void synchTexture(const QRect * aRect); 445 void synchMem(const QRect * aRect); 446 447 QRect mRect; 431 448 432 449 GLuint mDisplay; … … 439 456 GLint mInternalFormat; 440 457 GLenum mType; 441 ulong mDisplayWidth;442 ulong mDisplayHeight;458 // ulong mDisplayWidth; 459 // ulong mDisplayHeight; 443 460 ulong mBytesPerPixel; 444 461 ulong mBytesPerLine; 445 462 446 VBoxVHWADirtyRect mLockedRect; 463 int mLockCount; 464 /* memory buffer not reflected in fm and texture, e.g if memory buffer is replaced or in case of lock/unlock */ 465 VBoxVHWADirtyRect mUpdateMemRect; 447 466 /*in case of blit we blit from another surface's texture, so our current texture gets durty */ 448 467 VBoxVHWADirtyRect mUpdateFB2TexRect; 449 /*in case of blit the memory buffer does not get updated until we need it, e.g. for pain or lock operations */468 /*in case of blit the memory buffer does not get updated until we need it, e.g. for paint or lock operations */ 450 469 VBoxVHWADirtyRect mUpdateFB2MemRect; 451 470 … … 464 483 {} 465 484 485 bool isPrimary() {return true;} 466 486 void makeCurrent(); 467 487 private: … … 536 556 bool usesGuestVRAM() { return vboxWidget()->vboxUsesGuestVRAM(); } 537 557 538 uchar *address() { /*Assert(0); */return vboxWidget()->vboxAddress(); }558 uchar *address() { return vboxWidget()->vboxAddress(); } 539 559 ulong bitsPerPixel() { return vboxWidget()->vboxBitsPerPixel(); } 540 560 ulong bytesPerLine() { return vboxWidget()->vboxBytesPerLine(); } 561 562 uchar *vramAddressFromOffset(uint64_t offset); 541 563 542 564 void paintEvent (QPaintEvent *pe); … … 548 570 private: 549 571 #ifdef VBOX_WITH_VIDEOHWACCEL 572 void checkUpdateAddress (VBoxVHWASurfaceBase * pSurface, uint64_t offset) 573 { 574 if (pSurface->addressAlocated()) 575 { 576 uchar * addr = vramAddressFromOffset(offset); 577 if(addr) 578 { 579 pSurface->setAddress(addr); 580 } 581 } 582 } 550 583 int vhwaSurfaceCanCreate(struct _VBOXVHWACMD_SURF_CANCREATE *pCmd); 551 584 int vhwaSurfaceCreate(struct _VBOXVHWACMD_SURF_CREATE *pCmd);
Note:
See TracChangeset
for help on using the changeset viewer.