9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* $Id$ */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/** @file
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VBox XPDM Display driver, DirectDraw callbacks VHWA related
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/*
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Copyright (C) 2011 Oracle Corporation
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * available from http://www.virtualbox.org. This file is free software;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * you can redistribute it and/or modify it under the terms of the GNU
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * General Public License (GPL) as published by the Free Software
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include "VBoxDisp.h"
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include "VBoxDispDDraw.h"
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <iprt/asm.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic DECLCALLBACK(void) VBoxDispVHWASurfBltCompletion(PVBOXDISPDEV pDev, VBOXVHWACMD * pCmd, void * pContext)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD_SURF_BLT *pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_BLT);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXVHWASURFDESC pSrcDesc = (PVBOXVHWASURFDESC)pBody->SrcGuestSurfInfo;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXVHWASURFDESC pDestDesc = (PVBOXVHWASURFDESC)pBody->DstGuestSurfInfo;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ASMAtomicDecU32(&pSrcDesc->cPendingBltsSrc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ASMAtomicDecU32(&pDestDesc->cPendingBltsDst);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWACommandRelease(pDev, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic DECLCALLBACK(void) VBoxDispVHWASurfFlipCompletion(PVBOXDISPDEV pDev, VBOXVHWACMD * pCmd, void * pContext)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD_SURF_FLIP *pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_FLIP);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXVHWASURFDESC pCurrDesc = (PVBOXVHWASURFDESC)pBody->CurrGuestSurfInfo;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXVHWASURFDESC pTargDesc = (PVBOXVHWASURFDESC)pBody->TargGuestSurfInfo;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ASMAtomicDecU32(&pCurrDesc->cPendingFlipsCurr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ASMAtomicDecU32(&pTargDesc->cPendingFlipsTarg);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWACommandRelease(pDev, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXVHWA_CAP(_pdev, _cap) ((_pdev)->vhwa.caps & (_cap))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define ROP_INDEX(_rop) ((BYTE)((_rop)>>16))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define SET_SUPPORT_ROP(_aRops, _rop) _aRops[ROP_INDEX(_rop)/32] |= 1L << ((DWORD)(ROP_INDEX(_rop)%32))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint VBoxDispVHWAUpdateDDHalInfo(PVBOXDISPDEV pDev, DD_HALINFO *pHalInfo)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!VBOXVHWA_CAP(pDev, VBOXVHWA_CAPS_BLT) && !VBOXVHWA_CAP(pDev, VBOXVHWA_CAPS_OVERLAY))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VERR_NOT_SUPPORTED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->ddCaps.dwCaps |= VBoxDispVHWAToDDCAPS(pDev->vhwa.caps);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (VBOXVHWA_CAP(pDev, VBOXVHWA_CAPS_BLT))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
b0a3d0ec5780199a2f379da63c59ccf48f1a73b9vboxsync /* we only support simple dst=src copy
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Note: search "ternary raster operations" on msdn for more info
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync SET_SUPPORT_ROP(pHalInfo->ddCaps.dwRops, SRCCOPY);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->ddCaps.ddsCaps.dwCaps |= VBoxDispVHWAToDDSCAPS(pDev->vhwa.surfaceCaps);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->ddCaps.dwCaps2 |= VBoxDispVHWAToDDCAPS2(pDev->vhwa.caps2);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (VBOXVHWA_CAP(pDev, VBOXVHWA_CAPS_BLT) && VBOXVHWA_CAP(pDev, VBOXVHWA_CAPS_BLTSTRETCH))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->ddCaps.dwFXCaps |= DDFXCAPS_BLTSTRETCHX|DDFXCAPS_BLTSTRETCHY|
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DDFXCAPS_BLTSTRETCHXN|DDFXCAPS_BLTSTRETCHYN|
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DDFXCAPS_BLTSHRINKX|DDFXCAPS_BLTSHRINKY|
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DDFXCAPS_BLTSHRINKXN|DDFXCAPS_BLTSHRINKYN|
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DDFXCAPS_BLTARITHSTRETCHY;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (VBOXVHWA_CAP(pDev, VBOXVHWA_CAPS_OVERLAY) && VBOXVHWA_CAP(pDev, VBOXVHWA_CAPS_OVERLAYSTRETCH))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->ddCaps.dwFXCaps |= DDFXCAPS_OVERLAYSTRETCHX|DDFXCAPS_OVERLAYSTRETCHY|
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DDFXCAPS_OVERLAYSTRETCHXN|DDFXCAPS_OVERLAYSTRETCHYN|
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DDFXCAPS_OVERLAYSHRINKX|DDFXCAPS_OVERLAYSHRINKY|
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DDFXCAPS_OVERLAYSHRINKXN|DDFXCAPS_OVERLAYSHRINKYN|
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DDFXCAPS_OVERLAYARITHSTRETCHY;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->ddCaps.dwCKeyCaps = VBoxDispVHWAToDDCKEYCAPS(pDev->vhwa.colorKeyCaps);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (VBOXVHWA_CAP(pDev, VBOXVHWA_CAPS_OVERLAY))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->ddCaps.dwMaxVisibleOverlays = pDev->vhwa.numOverlays;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->ddCaps.dwCurrVisibleOverlays = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->ddCaps.dwMinOverlayStretch = 1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHalInfo->ddCaps.dwMaxOverlayStretch = 32000;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/*
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * DirectDraw callbacks.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define IF_NOT_SUPPORTED(_guid) \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (IsEqualIID(&lpData->guidInfo, &(_guid))) \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync { \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG((#_guid)); \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncDWORD APIENTRY VBoxDispDDGetDriverInfo(DD_GETDRIVERINFODATA *lpData)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpData->ddRVal = DDERR_CURRENTLYNOTAVAIL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (IsEqualIID(&lpData->guidInfo, &GUID_NTPrivateDriverCaps))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("GUID_NTPrivateDriverCaps"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DD_NTPRIVATEDRIVERCAPS caps;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memset(&caps, 0, sizeof(caps));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync caps.dwSize = sizeof(DD_NTPRIVATEDRIVERCAPS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync caps.dwPrivateCaps = DDHAL_PRIVATECAP_NOTIFYPRIMARYCREATION;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpData->dwActualSize = sizeof(DD_NTPRIVATEDRIVERCAPS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpData->ddRVal = DD_OK;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memcpy(lpData->lpvData, &caps, min(lpData->dwExpectedSize, sizeof(DD_NTPRIVATEDRIVERCAPS)));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else IF_NOT_SUPPORTED(GUID_NTCallbacks)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else IF_NOT_SUPPORTED(GUID_D3DCallbacks2)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else IF_NOT_SUPPORTED(GUID_D3DCallbacks3)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else IF_NOT_SUPPORTED(GUID_D3DExtendedCaps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else IF_NOT_SUPPORTED(GUID_ZPixelFormats)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else IF_NOT_SUPPORTED(GUID_D3DParseUnknownCommandCallback)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else IF_NOT_SUPPORTED(GUID_Miscellaneous2Callbacks)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else IF_NOT_SUPPORTED(GUID_UpdateNonLocalHeap)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else IF_NOT_SUPPORTED(GUID_GetHeapAlignment)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else IF_NOT_SUPPORTED(GUID_DDStereoMode)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else IF_NOT_SUPPORTED(GUID_NonLocalVidMemCaps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else IF_NOT_SUPPORTED(GUID_KernelCaps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else IF_NOT_SUPPORTED(GUID_KernelCallbacks)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else IF_NOT_SUPPORTED(GUID_MotionCompCallbacks)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else IF_NOT_SUPPORTED(GUID_VideoPortCallbacks)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else IF_NOT_SUPPORTED(GUID_ColorControlCallbacks)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else IF_NOT_SUPPORTED(GUID_VideoPortCaps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else IF_NOT_SUPPORTED(GUID_DDMoreSurfaceCaps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("unknown guid"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return DDHAL_DRIVER_HANDLED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncDWORD APIENTRY VBoxDispDDSetColorKey(PDD_SETCOLORKEYDATA lpSetColorKey)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXDISPDEV pDev = (PVBOXDISPDEV) lpSetColorKey->lpDD->dhpdev;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DD_SURFACE_LOCAL *pSurf = lpSetColorKey->lpDDSurface;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXVHWASURFDESC pDesc = (PVBOXVHWASURFDESC)pSurf->lpGbl->dwReserved1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD* pCmd;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpSetColorKey->ddRVal = DD_OK;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pDesc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmd = VBoxDispVHWACommandCreate(pDev, VBOXVHWACMD_TYPE_SURF_COLORKEY_SET, sizeof(VBOXVHWACMD_SURF_COLORKEY_SET));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD_SURF_COLORKEY_SET *pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_COLORKEY_SET);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_COLORKEY_SET));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.offSurface = VBoxDispVHWAVramOffsetFromPDEV(pDev, pSurf->lpGbl->fpVidMem);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.hSurf = pDesc->hHostHandle;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.flags = VBoxDispVHWAFromDDCKEYs(lpSetColorKey->dwFlags);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWAFromDDCOLORKEY(&pBody->u.in.CKey, &lpSetColorKey->ckNew);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWACommandSubmitAsynchAndComplete(pDev, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("VBoxDispVHWACommandCreate failed!"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpSetColorKey->ddRVal = DDERR_GENERIC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("!pDesc"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpSetColorKey->ddRVal = DDERR_GENERIC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return DDHAL_DRIVER_HANDLED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncDWORD APIENTRY VBoxDispDDAddAttachedSurface(PDD_ADDATTACHEDSURFACEDATA lpAddAttachedSurface)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpAddAttachedSurface->ddRVal = DD_OK;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return DDHAL_DRIVER_HANDLED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncDWORD APIENTRY VBoxDispDDBlt(PDD_BLTDATA lpBlt)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXDISPDEV pDev = (PVBOXDISPDEV) lpBlt->lpDD->dhpdev;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DD_SURFACE_LOCAL *pSrcSurf = lpBlt->lpDDSrcSurface;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DD_SURFACE_LOCAL *pDstSurf = lpBlt->lpDDDestSurface;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXVHWASURFDESC pSrcDesc = (PVBOXVHWASURFDESC) pSrcSurf->lpGbl->dwReserved1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXVHWASURFDESC pDstDesc = (PVBOXVHWASURFDESC) pDstSurf->lpGbl->dwReserved1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pSrcDesc && pDstDesc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD *pCmd;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmd = VBoxDispVHWACommandCreate(pDev, VBOXVHWACMD_TYPE_SURF_BLT, sizeof(VBOXVHWACMD_SURF_BLT));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD_SURF_BLT *pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_BLT);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_BLT));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.offSrcSurface = VBoxDispVHWAVramOffsetFromPDEV(pDev, pSrcSurf->lpGbl->fpVidMem);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.offDstSurface = VBoxDispVHWAVramOffsetFromPDEV(pDev, pDstSurf->lpGbl->fpVidMem);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.hDstSurf = pDstDesc->hHostHandle;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWAFromRECTL(&pBody->u.in.dstRect, &lpBlt->rDest);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.hSrcSurf = pSrcDesc->hHostHandle;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWAFromRECTL(&pBody->u.in.srcRect, &lpBlt->rSrc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->DstGuestSurfInfo = (uint64_t)pDstDesc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->SrcGuestSurfInfo = (uint64_t)pSrcDesc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.flags = VBoxDispVHWAFromDDBLTs(lpBlt->dwFlags);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWAFromDDBLTFX(&pBody->u.in.desc, &lpBlt->bltFX);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ASMAtomicIncU32(&pSrcDesc->cPendingBltsSrc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ASMAtomicIncU32(&pDstDesc->cPendingBltsDst);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWARegionAdd(&pDstDesc->NonupdatedMemRegion, &lpBlt->rDest);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWARegionTrySubstitute(&pDstDesc->UpdatedMemRegion, &lpBlt->rDest);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(pSrcDesc->UpdatedMemRegion.bValid)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.xUpdatedSrcMemValid = 1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWAFromRECTL(&pBody->u.in.xUpdatedSrcMemRect, &pSrcDesc->UpdatedMemRegion.Rect);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWARegionClear(&pSrcDesc->UpdatedMemRegion);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWACommandSubmitAsynch(pDev, pCmd, VBoxDispVHWASurfBltCompletion, NULL);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpBlt->ddRVal = DD_OK;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("VBoxDispVHWACommandCreate failed!"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpBlt->ddRVal = DDERR_GENERIC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("!(pSrcDesc && pDstDesc)"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpBlt->ddRVal = DDERR_GENERIC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return DDHAL_DRIVER_HANDLED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncDWORD APIENTRY VBoxDispDDFlip(PDD_FLIPDATA lpFlip)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXDISPDEV pDev = (PVBOXDISPDEV) lpFlip->lpDD->dhpdev;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DD_SURFACE_LOCAL *pCurrSurf = lpFlip->lpSurfCurr;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DD_SURFACE_LOCAL *pTargSurf = lpFlip->lpSurfTarg;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXVHWASURFDESC pCurrDesc = (PVBOXVHWASURFDESC) pCurrSurf->lpGbl->dwReserved1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXVHWASURFDESC pTargDesc = (PVBOXVHWASURFDESC) pTargSurf->lpGbl->dwReserved1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pCurrDesc && pTargDesc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(ASMAtomicUoReadU32(&pCurrDesc->cPendingFlipsTarg) || ASMAtomicUoReadU32(&pCurrDesc->cPendingFlipsCurr)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync || ASMAtomicUoReadU32(&pTargDesc->cPendingFlipsTarg) || ASMAtomicUoReadU32(&pTargDesc->cPendingFlipsCurr))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWACommandCheckHostCmds(pDev);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(ASMAtomicUoReadU32(&pCurrDesc->cPendingFlipsTarg) || ASMAtomicUoReadU32(&pCurrDesc->cPendingFlipsCurr)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync || ASMAtomicUoReadU32(&pTargDesc->cPendingFlipsTarg) || ASMAtomicUoReadU32(&pTargDesc->cPendingFlipsCurr))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpFlip->ddRVal = DDERR_WASSTILLDRAWING;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return DDHAL_DRIVER_HANDLED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD *pCmd;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmd = VBoxDispVHWACommandCreate(pDev, VBOXVHWACMD_TYPE_SURF_FLIP, sizeof(VBOXVHWACMD_SURF_FLIP));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD_SURF_FLIP *pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_FLIP);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_FLIP));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.offCurrSurface = VBoxDispVHWAVramOffsetFromPDEV(pDev, pCurrSurf->lpGbl->fpVidMem);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.offTargSurface = VBoxDispVHWAVramOffsetFromPDEV(pDev, pTargSurf->lpGbl->fpVidMem);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.hTargSurf = pTargDesc->hHostHandle;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.hCurrSurf = pCurrDesc->hHostHandle;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->TargGuestSurfInfo = (uint64_t)pTargDesc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->CurrGuestSurfInfo = (uint64_t)pCurrDesc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pTargDesc->bVisible = pCurrDesc->bVisible;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCurrDesc->bVisible = false;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ASMAtomicIncU32(&pCurrDesc->cPendingFlipsCurr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ASMAtomicIncU32(&pTargDesc->cPendingFlipsTarg);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifdef DEBUG
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ASMAtomicIncU32(&pCurrDesc->cFlipsCurr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ASMAtomicIncU32(&pTargDesc->cFlipsTarg);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(pTargDesc->UpdatedMemRegion.bValid)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.xUpdatedTargMemValid = 1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWAFromRECTL(&pBody->u.in.xUpdatedTargMemRect, &pTargDesc->UpdatedMemRegion.Rect);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWARegionClear(&pTargDesc->UpdatedMemRegion);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWACommandSubmitAsynch(pDev, pCmd, VBoxDispVHWASurfFlipCompletion, NULL);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpFlip->ddRVal = DD_OK;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("VBoxDispVHWACommandCreate failed!"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpFlip->ddRVal = DDERR_GENERIC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("!(pCurrDesc && pTargDesc)"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpFlip->ddRVal = DDERR_GENERIC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return DDHAL_DRIVER_HANDLED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncDWORD APIENTRY VBoxDispDDGetBltStatus(PDD_GETBLTSTATUSDATA lpGetBltStatus)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXDISPDEV pDev = (PVBOXDISPDEV) lpGetBltStatus->lpDD->dhpdev;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXVHWASURFDESC pDesc = (PVBOXVHWASURFDESC)lpGetBltStatus->lpDDSurface->lpGbl->dwReserved1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(lpGetBltStatus->dwFlags == DDGBS_CANBLT)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpGetBltStatus->ddRVal = DD_OK;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else /* DDGBS_ISBLTDONE */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pDesc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(ASMAtomicUoReadU32(&pDesc->cPendingBltsSrc) || ASMAtomicUoReadU32(&pDesc->cPendingBltsDst))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWACommandCheckHostCmds(pDev);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(ASMAtomicUoReadU32(&pDesc->cPendingBltsSrc) || ASMAtomicUoReadU32(&pDesc->cPendingBltsDst))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpGetBltStatus->ddRVal = DDERR_WASSTILLDRAWING;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpGetBltStatus->ddRVal = DD_OK;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpGetBltStatus->ddRVal = DD_OK;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("!pDesc"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpGetBltStatus->ddRVal = DDERR_GENERIC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return DDHAL_DRIVER_HANDLED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncDWORD APIENTRY VBoxDispDDGetFlipStatus(PDD_GETFLIPSTATUSDATA lpGetFlipStatus)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXDISPDEV pDev = (PVBOXDISPDEV) lpGetFlipStatus->lpDD->dhpdev;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXVHWASURFDESC pDesc = (PVBOXVHWASURFDESC)lpGetFlipStatus->lpDDSurface->lpGbl->dwReserved1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /*can't flip is there's a flip pending, so result is same for DDGFS_CANFLIP/DDGFS_ISFLIPDONE */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pDesc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(ASMAtomicUoReadU32(&pDesc->cPendingFlipsTarg) || ASMAtomicUoReadU32(&pDesc->cPendingFlipsCurr))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWACommandCheckHostCmds(pDev);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(ASMAtomicUoReadU32(&pDesc->cPendingFlipsTarg) || ASMAtomicUoReadU32(&pDesc->cPendingFlipsCurr))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpGetFlipStatus->ddRVal = DDERR_WASSTILLDRAWING;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpGetFlipStatus->ddRVal = DD_OK;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpGetFlipStatus->ddRVal = DD_OK;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("!pDesc"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpGetFlipStatus->ddRVal = DDERR_GENERIC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return DDHAL_DRIVER_HANDLED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncDWORD APIENTRY VBoxDispDDSetOverlayPosition(PDD_SETOVERLAYPOSITIONDATA lpSetOverlayPosition)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXDISPDEV pDev = (PVBOXDISPDEV) lpSetOverlayPosition->lpDD->dhpdev;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DD_SURFACE_LOCAL *pSrcSurf = lpSetOverlayPosition->lpDDSrcSurface;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DD_SURFACE_LOCAL *pDstSurf = lpSetOverlayPosition->lpDDDestSurface;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXVHWASURFDESC pSrcDesc = (PVBOXVHWASURFDESC) pSrcSurf->lpGbl->dwReserved1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXVHWASURFDESC pDstDesc = (PVBOXVHWASURFDESC) pDstSurf->lpGbl->dwReserved1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pSrcDesc && pDstDesc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!pSrcDesc->bVisible)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("!pSrcDesc->bVisible"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpSetOverlayPosition->ddRVal = DDERR_GENERIC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return DDHAL_DRIVER_HANDLED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD *pCmd;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmd = VBoxDispVHWACommandCreate(pDev, VBOXVHWACMD_TYPE_SURF_OVERLAY_SETPOSITION, sizeof(VBOXVHWACMD_SURF_OVERLAY_SETPOSITION));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD_SURF_OVERLAY_SETPOSITION *pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_OVERLAY_SETPOSITION);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_OVERLAY_SETPOSITION));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.offSrcSurface = VBoxDispVHWAVramOffsetFromPDEV(pDev, pSrcSurf->lpGbl->fpVidMem);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.offDstSurface = VBoxDispVHWAVramOffsetFromPDEV(pDev, pDstSurf->lpGbl->fpVidMem);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.hSrcSurf = pSrcDesc->hHostHandle;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.hDstSurf = pDstDesc->hHostHandle;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.xPos = lpSetOverlayPosition->lXPos;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.yPos = lpSetOverlayPosition->lYPos;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWACommandSubmitAsynchAndComplete(pDev, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpSetOverlayPosition->ddRVal = DD_OK;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("VBoxDispVHWACommandCreate failed!"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpSetOverlayPosition->ddRVal = DDERR_GENERIC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("!(pSrcDesc && pDstDesc)"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpSetOverlayPosition->ddRVal = DDERR_GENERIC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return DDHAL_DRIVER_HANDLED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncDWORD APIENTRY VBoxDispDDUpdateOverlay(PDD_UPDATEOVERLAYDATA lpUpdateOverlay)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXDISPDEV pDev = (PVBOXDISPDEV) lpUpdateOverlay->lpDD->dhpdev;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DD_SURFACE_LOCAL* pSrcSurf = lpUpdateOverlay->lpDDSrcSurface;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync DD_SURFACE_LOCAL* pDstSurf = lpUpdateOverlay->lpDDDestSurface;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXVHWASURFDESC pSrcDesc = (PVBOXVHWASURFDESC) pSrcSurf->lpGbl->dwReserved1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pSrcDesc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD* pCmd;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmd = VBoxDispVHWACommandCreate (pDev, VBOXVHWACMD_TYPE_SURF_OVERLAY_UPDATE, sizeof(VBOXVHWACMD_SURF_OVERLAY_UPDATE));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD_SURF_OVERLAY_UPDATE *pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_OVERLAY_UPDATE);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_OVERLAY_UPDATE));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.offSrcSurface = VBoxDispVHWAVramOffsetFromPDEV(pDev, pSrcSurf->lpGbl->fpVidMem);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.hSrcSurf = pSrcDesc->hHostHandle;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWAFromRECTL(&pBody->u.in.dstRect, &lpUpdateOverlay->rDest);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWAFromRECTL(&pBody->u.in.srcRect, &lpUpdateOverlay->rSrc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.flags = VBoxDispVHWAFromDDOVERs(lpUpdateOverlay->dwFlags);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWAFromDDOVERLAYFX(&pBody->u.in.desc, &lpUpdateOverlay->overlayFX);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (lpUpdateOverlay->dwFlags & DDOVER_HIDE)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSrcDesc->bVisible = false;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if(lpUpdateOverlay->dwFlags & DDOVER_SHOW)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSrcDesc->bVisible = true;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(pSrcDesc->UpdatedMemRegion.bValid)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.xFlags = VBOXVHWACMD_SURF_OVERLAY_UPDATE_F_SRCMEMRECT;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWAFromRECTL(&pBody->u.in.xUpdatedSrcMemRect, &pSrcDesc->UpdatedMemRegion.Rect);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWARegionClear(&pSrcDesc->UpdatedMemRegion);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(pDstSurf)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXVHWASURFDESC pDstDesc = (PVBOXVHWASURFDESC) pDstSurf->lpGbl->dwReserved1;
b0a3d0ec5780199a2f379da63c59ccf48f1a73b9vboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!pDstDesc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("!pDstDesc"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpUpdateOverlay->ddRVal = DDERR_GENERIC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return DDHAL_DRIVER_HANDLED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.hDstSurf = pDstDesc->hHostHandle;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.offDstSurface = VBoxDispVHWAVramOffsetFromPDEV(pDev, pDstSurf->lpGbl->fpVidMem);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWACommandSubmitAsynchAndComplete(pDev, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpUpdateOverlay->ddRVal = DD_OK;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("VBoxDispVHWACommandCreate failed!"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpUpdateOverlay->ddRVal = DDERR_GENERIC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("!pSrcDesc"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync lpUpdateOverlay->ddRVal = DDERR_GENERIC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return DDHAL_DRIVER_HANDLED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}