VirtualBox

Changeset 20653 in vbox


Ignore:
Timestamp:
Jun 17, 2009 9:26:02 AM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
48745
Message:

video hw accel: fixes for basic ddraw op hanlding

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/VBoxVideo.h

    r20483 r20653  
    264264    VBOXVHWACMD_TYPE_SURF_BLT,
    265265    VBOXVHWACMD_TYPE_QUERY_INFO1,
    266     VBOXVHWACMD_TYPE_QUERY_INFO2
     266    VBOXVHWACMD_TYPE_QUERY_INFO2,
     267    VBOXVHWACMD_TYPE_ENABLE,
     268    VBOXVHWACMD_TYPE_DISABLE
    267269} VBOXVHWACMD_TYPE;
    268270
     
    282284    uint64_t GuestVBVAReserved1; /* field internally used by the guest VBVA cmd handling, must NOT be modified by clients */
    283285    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;
    284292    char body[1];
    285293} VBOXVHWACMD;
     
    372380#define VBOXVHWA_PF_FOURCC              0x00000010
    373381
     382#define VBOXVHWA_LOCK_DISCARDCONTENTS   0x00000001
     383
    374384#define VBOXVHWA_CFG_ENABLED          0x00000001
     385
     386#define VBOXVHWA_OFFSET64_VOID        (~0L)
    375387
    376388typedef struct _VBOXVHWACMD_QUERYINFO1
     
    417429        {
    418430            VBOXVHWA_SURFINFO SurfInfo;
     431            uint64_t offSurface;
    419432        } in;
    420433
     
    444457        {
    445458            VBOXVHWA_SURFHANDLE hSurf;
     459            uint64_t offSurface;
    446460            uint32_t flags;
    447             uint32_t Reserved;
     461            uint32_t rectValid;
    448462            VBOXVHWA_RECTL rect;
    449463        } in;
     
    471485        {
    472486            VBOXVHWA_SURFHANDLE hDstSurf;
     487            uint64_t offDstSurface;
    473488            VBOXVHWA_RECTL dstRect;
    474489            VBOXVHWA_SURFHANDLE hSrcSurf;
     490            uint64_t offSrcSurface;
    475491            VBOXVHWA_RECTL srcRect;
    476492            uint32_t flags;
     
    558574    {
    559575        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 */
    561578    } u;
    562579    char body[1];
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/dd.c

    r20483 r20653  
    4242
    4343#ifdef VBOX_WITH_VIDEOHWACCEL
     44#include <iprt/asm.h>
     45
    4446#define VBOXVHWA_CAP(_pdev, _cap) ((_pdev)->vhwaInfo.caps & (_cap))
    4547static bool getDDHALInfo(PPDEV pDev, DD_HALINFO* pHALInfo);
     48static DECLCALLBACK(void) vboxVHWAFreeCmdCompletion(PPDEV ppdev, VBOXVHWACMD * pCmd, void * pContext);
     49static DECLCALLBACK(void) vboxVHWASurfBltCompletion(PPDEV ppdev, VBOXVHWACMD * pCmd, void * pContext);
     50
    4651#endif
    4752
     
    228233#endif
    229234
    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    }
    234243#endif
    235244
     
    436445        memset(&DDPrivateDriverCaps, 0, sizeof(DDPrivateDriverCaps));
    437446        DDPrivateDriverCaps.dwSize=sizeof(DDPrivateDriverCaps);
    438 
     447#ifndef VBOX_WITH_VIDEOHWACCEL
    439448        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
    440452
    441453        lpData->dwActualSize =sizeof(DDPrivateDriverCaps);
     
    448460    if (IsEqualIID(&(lpData->guidInfo), &GUID_DDMoreSurfaceCaps))
    449461    {
     462#ifndef VBOX_WITH_VIDEOHWACCEL
    450463        DD_MORESURFACECAPS DDMoreSurfaceCaps;
    451464        DDSCAPSEX   ddsCapsEx, ddsCapsExAlt;
     
    481494
    482495        lpData->ddRVal = DD_OK;
     496#else
     497        DISPDBG((0, " -> GUID_DDMoreSurfaceCaps\n"));
     498#endif
    483499    }
    484500    else
     
    495511    if (IsEqualIID(&lpData->guidInfo, &GUID_NTCallbacks))
    496512    {
     513#ifndef VBOX_WITH_VIDEOHWACCEL
    497514        DD_NTCALLBACKS NtCallbacks;
    498515
     
    514531
    515532        lpData->ddRVal = DD_OK;
     533#else
     534        DISPDBG((0, " -> GUID_NTCallbacks\n"));
     535#endif
    516536    }
    517537    else
     
    589609    lpSurfaceDesc                   = lpCreateSurface->lpDDSurfaceDesc;
    590610
     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    {
    591620    lpSurfaceGlobal->dwReserved1    = 0;
    592621
     
    615644    lpSurfaceGlobal->dwBlockSizeY   = lpSurfaceGlobal->wHeight;
    616645    lpSurfaceGlobal->lPitch         = lPitch;
     646
     647    lpSurfaceDesc->lPitch   = lpSurfaceGlobal->lPitch;
     648    lpSurfaceDesc->dwFlags |= DDSD_PITCH;
     649    }
    617650
    618651    //
     
    631664    }
    632665
    633     lpSurfaceDesc->lPitch   = lpSurfaceGlobal->lPitch;
    634     lpSurfaceDesc->dwFlags |= DDSD_PITCH;
    635 
    636666#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
    640714    return DDHAL_DRIVER_NOTHANDLED;
    641715}
     
    680754    }
    681755
    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
    683814    if (lpCanCreateSurface->bIsDifferentPixelFormat && (lpDDS->ddpfPixelFormat.dwFlags & DDPF_FOURCC))
    684815    {
     
    687818        return DDHAL_DRIVER_HANDLED;
    688819    }
     820
    689821    lpCanCreateSurface->ddRVal = DD_OK;
    690 #else
    691     vboxVHWASurfCanCreate(pDev, lpCanCreateSurface);
    692 #endif
    693 
    694822    return DDHAL_DRIVER_HANDLED;
    695823}
     
    830958{
    831959    PPDEV pDev = (PPDEV)lpLock->lpDD->dhpdev;
    832 
    833     PDD_SURFACE_LOCAL lpSurfaceLocal = lpLock->lpDDSurface;
     960    DD_SURFACE_LOCAL*   lpSurfaceLocal = lpLock->lpDDSurface;
    834961
    835962    DISPDBG((0, "%s: %p bHasRect = %d fpProcess = %p\n", __FUNCTION__, pDev, lpLock->bHasRect, lpLock->fpProcess));
    836963
     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
    8371033    if (lpSurfaceLocal->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
    8381034    {
     
    8871083    PPDEV pDev = (PPDEV)lpUnlock->lpDD->dhpdev;
    8881084    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
    8901127    if (pDev->ddLock.bLocked)
    8911128    {
     
    9641201DWORD APIENTRY DdDestroySurface(PDD_DESTROYSURFACEDATA lpDestroySurface)
    9651202{
     1203#ifdef VBOX_WITH_VIDEOHWACCEL
    9661204    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;
    9741239    return DDHAL_DRIVER_HANDLED;
    9751240}
     
    10721337DWORD APIENTRY DdBlt(PDD_BLTDATA  lpBlt)
    10731338{
     1339#ifdef VBOX_WITH_VIDEOHWACCEL
    10741340    PPDEV pDev = (PPDEV)lpBlt->lpDD->dhpdev;
    10751341    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
    10771392    return DDHAL_DRIVER_HANDLED;
     1393#else
     1394    lpBlt->ddRVal = DDERR_GENERIC;
     1395    return DDHAL_DRIVER_NOTHANDLED;
     1396#endif
    10781397}
    10791398
     
    12071526static DWORD rops[DD_ROP_SPACE] = { 0 };
    12081527
    1209 bool
     1528static bool
    12101529getDDHALInfo(
    12111530    PPDEV pDev,
     
    15271846} // getDDHALInfo
    15281847
     1848static DECLCALLBACK(void) vboxVHWAFreeCmdCompletion(PPDEV ppdev, VBOXVHWACMD * pCmd, void * pContext)
     1849{
     1850    vboxVHWACommandFree(ppdev, pCmd);
     1851}
     1852
     1853static 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}
    15291864
    15301865#endif
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/driver.h

    r20483 r20653  
    101101    volatile uint32_t cPendingBltsDst;
    102102    volatile uint32_t cPendingFlips;
     103    uint32_t cBitsPerPixel;
    103104}VBOXVHWASURFDESC, *PVBOXVHWASURFDESC;
    104105
     
    280281 #ifdef VBOX_WITH_VIDEOHWACCEL
    281282
     283#define VBOXDD_CHECKFLAG(_v, _f) ((_v) & (_f)) == (_f)
     284
    282285typedef DECLCALLBACK(void) FNVBOXVHWACMDCOMPLETION(PPDEV ppdev, VBOXVHWACMD * pCmd, void * pContext);
    283286typedef FNVBOXVHWACMDCOMPLETION *PFNVBOXVHWACMDCOMPLETION;
    284287
    285 VBOXVHWACMD* vboxVHWACommandCreate (PPDEV ppdev, VBOXVHWACMD_LENGTH cbCmd);
     288VBOXVHWACMD* vboxVHWACommandCreate (PPDEV ppdev, VBOXVHWACMD_TYPE enmCmd, VBOXVHWACMD_LENGTH cbCmd);
    286289void vboxVHWACommandFree (PPDEV ppdev, VBOXVHWACMD* pCmd);
    287290BOOL vboxVHWACommandSubmit (PPDEV ppdev, VBOXVHWACMD* pCmd);
     
    300303void vboxVHWAInit();
    301304void 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);
     305uint32_t vboxVHWAUnsupportedDDCAPS(uint32_t caps);
     306uint32_t vboxVHWAUnsupportedDDSCAPS(uint32_t caps);
     307uint32_t vboxVHWAUnsupportedDDPFS(uint32_t caps);
     308uint32_t vboxVHWASupportedDDCAPS(uint32_t caps);
     309uint32_t vboxVHWASupportedDDSCAPS(uint32_t caps);
     310uint32_t vboxVHWASupportedDDPFS(uint32_t caps);
     311uint32_t vboxVHWAFromDDCAPS(uint32_t caps);
     312uint32_t vboxVHWAToDDCAPS(uint32_t caps);
     313uint32_t vboxVHWAFromDDSCAPS(uint32_t caps);
     314uint32_t vboxVHWAToDDSCAPS(uint32_t caps);
     315uint32_t vboxVHWAFromDDPFS(uint32_t caps);
     316uint32_t vboxVHWAToDDPFS(uint32_t caps);
     317void vboxVHWAFromDDPIXELFORMAT(VBOXVHWA_PIXELFORMAT *pVHWAFormat, DDPIXELFORMAT *pDdFormat);
     318void vboxVHWAFromRECTL(VBOXVHWA_RECTL *pDst, RECTL *pSrc);
     319PVBOXVHWASURFDESC vboxVHWASurfDescAlloc();
     320void vboxVHWASurfDescFree(PVBOXVHWASURFDESC pDesc);
     321
     322int vboxVHWAEnable(PPDEV ppdev);
     323int vboxVHWADisable(PPDEV ppdev);
     324
    306325 #endif
    307326#endif
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/enable.c

    r18246 r20653  
    101101    case OPENGL_GETINFO:
    102102    {
    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
    123123            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. */
    124124        break;
     
    238238    return 0;
    239239}
    240    
     240
    241241BOOL DrvConnect (PVOID x1, PVOID x2, PVOID x3, PVOID x4)
    242242{
     
    318318//     {   0x50,                           (PFN) DrvShadowConnect      },       // 0x50
    319319//     {   0x51,                           (PFN) DrvShadowDisconnect   },       // 0x51
    320    
     320
    321321};
    322322
     
    443443
    444444    DISPDBG((0, "VBoxDisp::DrvEnablePDEV called\n"));
    445    
     445
    446446    UNREFERENCED_PARAMETER(pwszLogAddress);
    447447    UNREFERENCED_PARAMETER(pwszDeviceName);
    448    
     448
    449449    RtlZeroMemory(&DevInfo, sizeof (DEVINFO));
    450450    RtlZeroMemory(&GdiInfo, sizeof (GDIINFO));
     
    465465
    466466    ppdev->hDriver = hDriver;
    467    
     467
    468468    // Get the current screen mode information.  Set up device caps and devinfo.
    469469
     
    481481        DISPDBG((0, "DrvEnablePDEV failed bInitPointer\n"));
    482482    }
    483    
     483
    484484    // Initialize palette information.
    485485
     
    489489        goto error_free;
    490490    }
    491    
     491
    492492//    // Start a thread that will process notifications from VMMDev
    493493//    if (!bInitNotificationThread(ppdev))
     
    496496//        goto error_free;
    497497//    }
    498    
     498
    499499    // Copy the devinfo into the engine buffer.
    500    
     500
    501501    DISPDBG((0, "VBoxDisp::DrvEnablePDEV: sizeof(DEVINFO) = %d, cjDevInfo = %d, alpha = %d\n", sizeof(DEVINFO), cjDevInfo, DevInfo.flGraphicsCaps2 & GCAPS2_ALPHACURSOR));
    502    
     502
    503503// @todo seems to be not necessary. these bits are initialized in screen.c    DevInfo.flGraphicsCaps |= GCAPS_OPAQUERECT       |
    504504//                              GCAPS_DITHERONREALIZE  |
     
    509509//                              GCAPS_COLOR_DITHER     |
    510510//                              GCAPS_ASYNCMOVE;
    511 //                             
     511//
    512512//    DevInfo.flGraphicsCaps |= GCAPS_DITHERONREALIZE;
    513    
     513
    514514    DevInfo.flGraphicsCaps2 |= GCAPS2_RESERVED1; /* @todo figure out what is this. */
    515515
     
    522522
    523523    DISPDBG((0, "VBoxDisp::DrvEnablePDEV completed %x\n", ppdev));
    524    
     524
    525525    return((DHPDEV) ppdev);
    526526
     
    557557//    vStopNotificationThread ((PPDEV) dhpdev);
    558558    vDisablePalette((PPDEV) dhpdev);
    559    
     559
    560560    /* Free the driver's VBVA resources. */
    561561    vboxVbvaDisable ((PPDEV) dhpdev);
     
    615615#endif
    616616    DISPDBG((0, "DISP DrvEnableSurface called\n"));
    617        
     617
    618618    // Create engine bitmap around frame buffer.
    619619
     
    630630
    631631    DISPDBG((0, "DISP DrvEnableSurface bInitSURF success\n"));
    632    
     632
    633633    sizl.cx = ppdev->cxScreen;
    634634    sizl.cy = ppdev->cyScreen;
     
    690690                                              ulBitmapType);
    691691    }
    692  
     692
    693693    if ( hsurf == 0 )
    694694    {
     
    701701    // GDI. We cant do this on NT4.0 hence we call EngAssociateSurface.
    702702    //
    703      
     703
    704704    if(g_bOnNT40)
    705705    {
     
    707707        // We have to associate the surface we just created with our physical
    708708        // 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
    710710        // styles on the device when simulating styled lines).
    711711        //
     
    720720        {
    721721            DISPDBG((0, "DrvEnableSurface: failed EngAssociateSurface\n"));
    722             goto l_Failure; 
     722            goto l_Failure;
    723723        }
    724724
     
    726726        // Jam in the value of dhsurf into screen SURFOBJ. We do this to
    727727        // 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.
    729729        //
    730730        ppdev->psoScreenBitmap = EngLockSurface(hsurf);
     
    732732        {
    733733            DISPDBG((0, "DrvEnableSurface: failed EngLockSurface\n"));
    734             goto l_Failure; 
     734            goto l_Failure;
    735735        }
    736736
     
    767767                                    (ppdev->lDeltaScreen > 0) ? BMF_TOPDOWN : 0,
    768768                                    (PVOID) (ppdev->pjScreen));
    769                                      
     769
    770770    if (hsurf == (HSURF) 0)
    771771    {
     
    776776    {
    777777        ppdev->hsurfScreenBitmap = hsurf;
    778          
     778
    779779        if (!EngAssociateSurface(hsurf, ppdev->hdevEng, 0))
    780780        {
     
    785785        {
    786786            SURFOBJ *pso = EngLockSurface(hsurf);
    787              
     787
    788788            ppdev->psoScreenBitmap = pso;
    789    
     789
    790790            hsurf = (HSURF) EngCreateDeviceSurface((DHSURF)pso,
    791791                                                    sizl,
     
    816816        }
    817817    }
    818 #endif /* VBOX_NEW_SURFACE_CODE */   
     818#endif /* VBOX_NEW_SURFACE_CODE */
    819819    return ppdev->hsurfScreen;
    820      
     820
    821821l_Failure:
    822822
    823823    DrvDisableSurface(dhpdev);
    824    
     824
    825825    return((HSURF)0);
    826826}
     
    836836{
    837837    PPDEV ppdev = (PPDEV)dhpdev;
    838    
     838
    839839    DISPDBG((0, "VBoxDisp::DrvDisableSurface called\n"));
    840840    if (ppdev->psoScreenBitmap)
     
    861861        ppdev->hsurfScreenBitmap = (HSURF)0;
    862862    }
    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
    864869    vDisableSURF(ppdev);
    865870}
     
    879884
    880885    DISPDBG((0, "DISP DrvAssertMode called bEnable = %d\n", bEnable));
    881    
     886
    882887    if (bEnable)
    883888    {
     
    898903            SIZEL sizl;
    899904            SURFOBJ *pso;
    900            
     905
    901906            DISPDBG((0, "DISP DrvAssertMode Screen pointer has changed!!!\n"));
    902            
     907
    903908            sizl.cx = ppdev->cxScreen;
    904909            sizl.cy = ppdev->cyScreen;
    905            
     910
    906911            hsurf = (HSURF) EngCreateBitmap(sizl,
    907912                                            ppdev->lDeltaScreen,
     
    909914                                            (ppdev->lDeltaScreen > 0) ? BMF_TOPDOWN : 0,
    910915                                            (PVOID) (ppdev->pjScreen));
    911                                      
     916
    912917            if (hsurf == (HSURF) 0)
    913918            {
     
    915920                return FALSE;
    916921            }
    917            
     922
    918923            pso = EngLockSurface(hsurf);
    919              
     924
    920925            if (ppdev->psoScreenBitmap)
    921926            {
     
    929934                ppdev->hsurfScreenBitmap = (HSURF)0;
    930935            }
    931    
     936
    932937            ppdev->hsurfScreenBitmap = hsurf;
    933938            ppdev->psoScreenBitmap = pso;
     
    939944            return FALSE;
    940945        }
    941            
     946
    942947        if (!EngAssociateSurface(ppdev->hsurfScreen, ppdev->hdevEng, ppdev->flHooks))
    943948        {
     
    945950            return FALSE;
    946951        }
    947            
     952
    948953        return TRUE;
    949954    }
    950955    else
    951956    {
     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
    952961        //
    953962        // We must give up the display.
     
    987996\******************************************************************************/
    988997
    989 HBITMAP 
     998HBITMAP
    990999DrvCreateDeviceBitmap(
    9911000    DHPDEV      dhpdev,
     
    10051014\******************************************************************************/
    10061015
    1007 VOID 
     1016VOID
    10081017DrvDeleteDeviceBitmap(
    10091018    DHSURF      dhsurf)
     
    11491158            ppdev->ptlDevOrg = *(PPOINTL)pvData;
    11501159#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,
    11521161                     ppdev->ptlDevOrg.y, pso, ppdev->pInfo));
    11531162            if (ppdev->pInfo)
     
    11581167            }
    11591168#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,
    11611170                     ppdev->ptlDevOrg.y, pso));
    11621171            VBoxProcessDisplayInfo(ppdev);
     
    11791188// Parameters
    11801189//  pDirectDraw-----Points to a DD_DIRECTDRAW_GLOBAL structure that describes
    1181 //                  the DirectDraw object. 
     1190//                  the DirectDraw object.
    11821191//  pSurface--------Points to a DD_SURFACE_LOCAL structure that describes the
    11831192//                  DirectDraw surface around which to wrap a GDI surface.
     
    12501259    {
    12511260        SIZEL sizel;
    1252         DWORD ulBitmapType, flHooks;       
     1261        DWORD ulBitmapType, flHooks;
    12531262
    12541263        sizel.cx = pSurfaceGlobal->wWidth;
     
    12961305                    SURFOBJ *surfobj = EngLockSurface ((HSURF)hbmDevice);
    12971306                    DISPDBG((0, "DrvDeriveSurface surfobj %x, hsurf = %x\n", surfobj, surfobj->hsurf));
    1298                
     1307
    12991308                    surfobj->dhpdev = (DHPDEV)pDev;
    1300                
     1309
    13011310                    EngUnlockSurface(surfobj);
    13021311
     
    13181327    DISPDBG((0, "DrvDeriveSurface return NULL\n"));
    13191328    DISPDBG((0, "pSurfaceGlobal->ddpfSurface.dwRGBBitCount = %d, lPitch =%ld\n", pSurfaceGlobal->ddpfSurface.dwRGBBitCount,pSurfaceGlobal->lPitch));
    1320    
     1329
    13211330    return(0);
    13221331}
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/screen.c

    r20478 r20653  
    535535#endif /* VBOX_WITH_HGSMI */
    536536
     537#ifdef VBOX_WITH_VIDEOHWACCEL
     538    /* tells we can process host commands */
     539    vboxVHWAEnable(ppdev);
     540#endif
     541
    537542    return(TRUE);
    538543}
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/vbox.c

    r20478 r20653  
    692692# ifdef VBOX_WITH_VIDEOHWACCEL
    693693
    694 VBOXVHWACMD* vboxVHWACommandCreate (PPDEV ppdev, VBOXVHWACMD_LENGTH cbCmd)
     694VBOXVHWACMD* vboxVHWACommandCreate (PPDEV ppdev, VBOXVHWACMD_TYPE enmCmd, VBOXVHWACMD_LENGTH cbCmd)
    695695{
    696696    VBOXVHWACMD* pHdr = (VBOXVHWACMD*)HGSMIHeapAlloc (&ppdev->hgsmiDisplayHeap,
     
    702702        DISPDBG((0, "VBoxDISP::vboxVHWACommandCreate: HGSMIHeapAlloc failed\n"));
    703703    }
     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    }
    704711
    705712    /* temporary hack */
     
    837844VBOXVHWACMD_QUERYINFO1* vboxVHWAQueryHostInfo1(PPDEV ppdev)
    838845{
    839     VBOXVHWACMD* pCmd = vboxVHWACommandCreate (ppdev, sizeof(VBOXVHWACMD_QUERYINFO1));
     846    VBOXVHWACMD* pCmd = vboxVHWACommandCreate (ppdev, VBOXVHWACMD_TYPE_QUERY_INFO1, sizeof(VBOXVHWACMD_QUERYINFO1));
    840847    if (!pCmd)
    841848    {
     
    844851    }
    845852
    846     pCmd->enmCmd = VBOXVHWACMD_TYPE_QUERY_INFO1;
    847853    if(vboxVHWACommandSubmit (ppdev, pCmd))
    848854    {
     
    859865VBOXVHWACMD_QUERYINFO2* vboxVHWAQueryHostInfo2(PPDEV ppdev, uint32_t numFourCC)
    860866{
    861     VBOXVHWACMD* pCmd = vboxVHWACommandCreate (ppdev, sizeof(VBOXVHWACMD_QUERYINFO2));
     867    VBOXVHWACMD* pCmd = vboxVHWACommandCreate (ppdev, VBOXVHWACMD_TYPE_QUERY_INFO2, sizeof(VBOXVHWACMD_QUERYINFO2));
    862868    VBOXVHWACMD_QUERYINFO2 *pInfo2;
    863869    if (!pCmd)
     
    867873    }
    868874
    869     pCmd->enmCmd = VBOXVHWACMD_TYPE_QUERY_INFO2;
    870875    pInfo2 = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_QUERYINFO2);
    871876    pInfo2->numFourCC = numFourCC;
     
    930935}
    931936
     937int 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
     959int 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}
    932983
    933984# endif
  • trunk/src/VBox/Frontends/VirtualBox/include/VBoxFrameBuffer.h

    r20478 r20653  
    327327public:
    328328    VBoxVHWADirtyRect() :
    329         mIsClear(false)
     329        mIsClear(true)
    330330    {}
    331331
     
    343343    }
    344344
    345     bool isClear() { return mIsClear; }
     345    bool isClear() const { return mIsClear; }
    346346
    347347    void add(const QRect & aRect)
     
    363363        {
    364364            mRect = aRect;
     365            mIsClear = false;
    365366        }
    366367    }
     
    368369    void clear() { mIsClear = true; }
    369370
    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(); }
    373382
    374383private:
     
    391400    static void globalInit();
    392401
    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);
    396405
    397406    int unlock();
     
    399408    virtual void makeCurrent() = 0;
    400409
    401     void paint(const QRect * pRect);
     410    void paint(const QRect * aRect);
    402411
    403412    void performDisplay() { Assert(mDisplayInitialized); glCallList(mDisplay); }
     
    407416    static GLsizei makePowerOf2(GLsizei val);
    408417
     418    bool    addressAlocated() const { return mFreeAddress; }
    409419    uchar * address(){ return mAddress; }
    410420    uchar * pointAddress(int x, int y) { return mAddress + y*mBytesPerLine + x*mBytesPerPixel; }
    411     ulong   memSize(){ return mBytesPerLine * mDisplayHeight; }
    412 
    413     ulong width()  { return mDisplayWidth;  }
    414     ulong height() { return mDisplayHeight; }
     421    ulong   memSize(){ return mBytesPerLine * mRect.height(); }
     422
     423    ulong width()  { return mRect.width();  }
     424    ulong height() { return mRect.height(); }
    415425
    416426    GLenum format() {return mFormat; }
     
    420430    ulong  bytesPerLine() { return mBytesPerLine; }
    421431
    422     /* clients should treat the rerurned texture as read-only */
     432    /* clients should treat the returned texture as read-only */
    423433    GLuint textureSynched(const QRect * aRect) { synchTexture(aRect); return mTexture; }
    424434
     435    void setAddress(uchar * addr);
     436
     437    const QRect& rect() {return mRect;}
     438
     439    virtual bool isPrimary() = 0;
    425440private:
    426441    void initDisplay();
    427442    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;
    431448
    432449    GLuint mDisplay;
     
    439456    GLint  mInternalFormat;
    440457    GLenum mType;
    441     ulong  mDisplayWidth;
    442     ulong  mDisplayHeight;
     458//    ulong  mDisplayWidth;
     459//    ulong  mDisplayHeight;
    443460    ulong  mBytesPerPixel;
    444461    ulong  mBytesPerLine;
    445462
    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;
    447466    /*in case of blit we blit from another surface's texture, so our current texture gets durty  */
    448467    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 */
    450469    VBoxVHWADirtyRect mUpdateFB2MemRect;
    451470
     
    464483    {}
    465484
     485    bool isPrimary() {return true;}
    466486    void makeCurrent();
    467487private:
     
    536556    bool usesGuestVRAM() { return vboxWidget()->vboxUsesGuestVRAM(); }
    537557
    538     uchar *address() { /*Assert(0); */return vboxWidget()->vboxAddress(); }
     558    uchar *address() { return vboxWidget()->vboxAddress(); }
    539559    ulong bitsPerPixel() { return vboxWidget()->vboxBitsPerPixel(); }
    540560    ulong bytesPerLine() { return vboxWidget()->vboxBytesPerLine(); }
     561
     562    uchar *vramAddressFromOffset(uint64_t offset);
    541563
    542564    void paintEvent (QPaintEvent *pe);
     
    548570private:
    549571#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    }
    550583    int vhwaSurfaceCanCreate(struct _VBOXVHWACMD_SURF_CANCREATE *pCmd);
    551584    int vhwaSurfaceCreate(struct _VBOXVHWACMD_SURF_CREATE *pCmd);
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette