VBoxVideoVhwa.cpp revision 0e8fecb4a79ed5fd94d937fb94d3a4c4e8694598
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync * Copyright (C) 2010 Oracle Corporation
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync * available from http://www.virtualbox.org. This file is free software;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync * you can redistribute it and/or modify it under the terms of the GNU
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync * General Public License (GPL) as published by the Free Software
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync#include "../Helper.h"
d46ee884c41b808b239563b1978468aae12e33a2vboxsyncDECLINLINE(void) vboxVhwaHdrInit(VBOXVHWACMD* pHdr, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, VBOXVHWACMD_TYPE enmCmd)
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsyncstatic int vboxVhwaCommandSubmitHgsmi(struct _DEVICE_EXTENSION* pDevExt, HGSMIOFFSET offDr)
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsyncDECLINLINE(void) vbvaVhwaCommandRelease(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd)
d46ee884c41b808b239563b1978468aae12e33a2vboxsyncDECLINLINE(void) vbvaVhwaCommandRetain(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync/* do not wait for completion */
2a229554eb081e98411c81dcdef146c35a000f80vboxsyncvoid vboxVhwaCommandSubmitAsynch(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd, PFNVBOXVHWACMDCOMPLETION pfnCompletion, void * pContext)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pCmd->GuestVBVAReserved1 = (uintptr_t)pfnCompletion;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync || ((pCmd->Flags & VBOXVHWACMD_FLAG_GH_ASYNCH_NOCOMPLETION)
e33247bff4fddfdba92538374bcc9e2753044a38vboxsync && (pCmd->Flags & VBOXVHWACMD_FLAG_HG_ASYNCH_RETURNED)))
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync /* the command is completed */
71e8510a26b72d539cf6d7d7157bd87a53de8cf4vboxsyncstatic DECLCALLBACK(void) vboxVhwaCompletionSetEvent(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD * pCmd, void * pvContext)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsyncvoid vboxVhwaCommandSubmitAsynchByEvent(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd, RTSEMEVENT hEvent)
358a99c385080f7f31166943f3ac3a2aea6b5263vboxsync vboxVhwaCommandSubmitAsynch(pDevExt, pCmd, vboxVhwaCompletionSetEvent, hEvent);
e33247bff4fddfdba92538374bcc9e2753044a38vboxsyncVBOXVHWACMD* vboxVhwaCommandCreate(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, VBOXVHWACMD_TYPE enmCmd, VBOXVHWACMD_LENGTH cbCmd)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync VBOXVHWACMD* pHdr = (VBOXVHWACMD*)VBoxSHGSMICommandAlloc(&pDevExt->u.primary.hgsmiAdapterHeap,
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync VBOXVHWACMD* pHdr = (VBOXVHWACMD*)vboxHGSMIBufferAlloc(pDevExt,
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync drprintf((__FUNCTION__": vboxHGSMIBufferAlloc failed\n"));
d46ee884c41b808b239563b1978468aae12e33a2vboxsyncvoid vboxVhwaCommandFree(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync VBoxSHGSMICommandFree(&pDevExt->u.primary.hgsmiAdapterHeap, pCmd);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsyncint vboxVhwaCommandSubmit(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync const VBOXSHGSMIHEADER* pHdr = VBoxSHGSMICommandPrepSynch(&pDevExt->u.primary.hgsmiAdapterHeap, pCmd);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync HGSMIOFFSET offCmd = VBoxSHGSMICommandOffset(&pDevExt->u.primary.hgsmiAdapterHeap, pHdr);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync VBoxSHGSMICommandDoneSynch(&pDevExt->u.primary.hgsmiAdapterHeap, pHdr);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync /* fail to submit, cancel it */
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync VBoxSHGSMICommandCancelSynch(&pDevExt->u.primary.hgsmiAdapterHeap, pHdr);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync } while (0);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync vboxVhwaCommandSubmitAsynchByEvent(pDevExt, pCmd, hEvent);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsyncstatic DECLCALLBACK(void) vboxVhwaCompletionFreeCmd(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD * pCmd, void * pContext)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsyncvoid vboxVhwaCompletionListProcess(PDEVICE_EXTENSION pDevExt, VBOXSHGSMILIST *pList)
fd0cf98cb3eafc5c96b7e95d934b01c5df4785fbvboxsync /* need to save next since the command may be released in a pfnCallback and thus its data might be invalid */
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync PFNVBOXVHWACMDCOMPLETION pfnCallback = (PFNVBOXVHWACMDCOMPLETION)pCmd->GuestVBVAReserved1;
d46ee884c41b808b239563b1978468aae12e33a2vboxsync void *pvCallback = (void*)pCmd->GuestVBVAReserved2;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsyncvoid vboxVhwaCommandSubmitAsynchAndComplete(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pCmd->Flags |= VBOXVHWACMD_FLAG_GH_ASYNCH_NOCOMPLETION;
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync vboxVhwaCommandSubmitAsynch(pDevExt, pCmd, vboxVhwaCompletionFreeCmd, NULL);
d46ee884c41b808b239563b1978468aae12e33a2vboxsyncvoid vboxVHWAFreeHostInfo1(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD_QUERYINFO1* pInfo)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsyncvoid vboxVHWAFreeHostInfo2(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD_QUERYINFO2* pInfo)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsyncVBOXVHWACMD_QUERYINFO1* vboxVHWAQueryHostInfo1(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync VBOXVHWACMD* pCmd = vboxVhwaCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_QUERY_INFO1, sizeof(VBOXVHWACMD_QUERYINFO1));
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync drprintf((0, "VBoxDISP::vboxVHWAQueryHostInfo1: vboxVHWACommandCreate failed\n"));
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pInfo1 = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_QUERYINFO1);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pInfo1->u.in.guestVersion.maj = VBOXVHWA_VERSION_MAJ;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pInfo1->u.in.guestVersion.min = VBOXVHWA_VERSION_MIN;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pInfo1->u.in.guestVersion.bld = VBOXVHWA_VERSION_BLD;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pInfo1->u.in.guestVersion.reserved = VBOXVHWA_VERSION_RSV;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync return VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_QUERYINFO1);
5ff3fa0492332325f57e80636321619e2224027evboxsyncVBOXVHWACMD_QUERYINFO2* vboxVHWAQueryHostInfo2(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, uint32_t numFourCC)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync VBOXVHWACMD* pCmd = vboxVhwaCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_QUERY_INFO2, VBOXVHWAINFO2_SIZE(numFourCC));
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync drprintf((0, "VBoxDISP::vboxVHWAQueryHostInfo2: vboxVHWACommandCreate failed\n"));
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync pInfo2 = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_QUERYINFO2);
5ff3fa0492332325f57e80636321619e2224027evboxsyncint vboxVHWAEnable(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync pCmd = vboxVhwaCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_ENABLE, 0);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync drprintf((0, "VBoxDISP::vboxVHWAEnable: vboxVHWACommandCreate failed\n"));
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsyncint vboxVHWADisable(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync pCmd = vboxVhwaCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_DISABLE, 0);
358a99c385080f7f31166943f3ac3a2aea6b5263vboxsync drprintf((0, "VBoxDISP::vboxVHWADisable: vboxVHWACommandCreate failed\n"));
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsyncstatic void vboxVHWAInitSrc(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync VBOXVHWA_INFO *pSettings = &pDevExt->aSources[srcId].Vhwa.Settings;
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync VBOXVHWACMD_QUERYINFO1* pInfo1 = vboxVHWAQueryHostInfo1(pDevExt, srcId);
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync if ((pInfo1->u.out.cfgFlags & VBOXVHWA_CFG_ENABLED)
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync && (pInfo1->u.out.caps & VBOXVHWA_CAPS_OVERLAYSTRETCH)
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync && (pInfo1->u.out.surfaceCaps & VBOXVHWA_SCAPS_OVERLAY)
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync && (pInfo1->u.out.surfaceCaps & VBOXVHWA_SCAPS_FLIP)
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync && (pInfo1->u.out.surfaceCaps & VBOXVHWA_SCAPS_LOCALVIDMEM)
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync if (pInfo1->u.out.colorKeyCaps & VBOXVHWA_CKEYCAPS_SRCOVERLAY)
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync /* todo: VBOXVHWA_CKEYCAPS_SRCOVERLAYONEACTIVE ? */
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync if (pInfo1->u.out.colorKeyCaps & VBOXVHWA_CKEYCAPS_DESTOVERLAY)
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync /* todo: VBOXVHWA_CKEYCAPS_DESTOVERLAYONEACTIVE ? */
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync pSettings->cOverlaysSupported = pInfo1->u.out.numOverlays;
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync pSettings->aFormats[pSettings->cFormats] = D3DDDIFMT_X8R8G8B8;
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync && (pInfo1->u.out.caps & VBOXVHWA_CAPS_OVERLAYFOURCC))
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync VBOXVHWACMD_QUERYINFO2* pInfo2 = vboxVHWAQueryHostInfo2(pDevExt, srcId, pInfo1->u.out.numFourCC);
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync pSettings->aFormats[pSettings->cFormats] = (D3DDDIFORMAT)pInfo2->FourCC[i];
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync /* we do not allocate/map anything, just issue a Disable command
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync * to ensure all pending commands are flushed */
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsyncint vboxVhwaHlpTranslateFormat(VBOXVHWA_PIXELFORMAT *pFormat, D3DDDIFORMAT enmFormat)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync /* always zero for now */
358a99c385080f7f31166943f3ac3a2aea6b5263vboxsync /* always zero for now */
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync /* always zero for now */
358a99c385080f7f31166943f3ac3a2aea6b5263vboxsync uint32_t fourcc = vboxWddmFormatToFourcc(enmFormat);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsyncint vboxVhwaHlpDestroySurface(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_ALLOCATION pSurf,
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync VBOXVHWACMD* pCmd = vboxVhwaCommandCreate(pDevExt, VidPnSourceId,
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync VBOXVHWACMD_TYPE_SURF_DESTROY, sizeof(VBOXVHWACMD_SURF_DESTROY));
358a99c385080f7f31166943f3ac3a2aea6b5263vboxsync VBOXVHWACMD_SURF_DESTROY * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_DESTROY);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_DESTROY));
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync /* we're not interested in completion, just send the command */
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync vboxVhwaCommandSubmitAsynchAndComplete(pDevExt, pCmd);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsyncint vboxVhwaHlpPopulateSurInfo(VBOXVHWA_SURFACEDESC *pInfo, PVBOXWDDM_ALLOCATION pSurf,
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync uint32_t fFlags, uint32_t cBackBuffers, uint32_t fSCaps,
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync pInfo->flags |= VBOXVHWA_SD_HEIGHT | VBOXVHWA_SD_WIDTH;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync /* @todo: color keys */
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync// pInfo->DstOverlayCK;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync// pInfo->DstBltCK;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync// pInfo->SrcOverlayCK;
358a99c385080f7f31166943f3ac3a2aea6b5263vboxsync// pInfo->SrcBltCK;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync int rc = vboxVhwaHlpTranslateFormat(&pInfo->PixelFormat, pSurf->SurfDesc.format);
d46ee884c41b808b239563b1978468aae12e33a2vboxsyncint vboxVhwaHlpCheckApplySurfInfo(PVBOXWDDM_ALLOCATION pSurf, VBOXVHWA_SURFACEDESC *pInfo,
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync /* should be set by host */
34aaaf212fe61ccafbae15eb832d6062ba548799vboxsync pSurf->SurfDesc.cbSize = pInfo->sizeX * pInfo->sizeY;
34aaaf212fe61ccafbae15eb832d6062ba548799vboxsyncint vboxVhwaHlpCreateSurface(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_ALLOCATION pSurf,
34aaaf212fe61ccafbae15eb832d6062ba548799vboxsync uint32_t fFlags, uint32_t cBackBuffers, uint32_t fSCaps,
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync /* the first thing we need is to post create primary */
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync VBOXVHWACMD* pCmd = vboxVhwaCommandCreate(pDevExt, VidPnSourceId,
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync VBOXVHWACMD_TYPE_SURF_CREATE, sizeof(VBOXVHWACMD_SURF_CREATE));
6e12ccc60ac657fb87e27b7a2b26e0a63bebe024vboxsync VBOXVHWACMD_SURF_CREATE * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_CREATE);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync rc = vboxVhwaHlpPopulateSurInfo(&pBody->SurfInfo, pSurf,
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsync rc = vboxVhwaHlpCheckApplySurfInfo(pSurf, &pBody->SurfInfo, fFlags, true);
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsyncint vboxVhwaHlpGetSurfInfoForSource(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_ALLOCATION pSurf, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsync /* the first thing we need is to post create primary */
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsync VBOXVHWACMD* pCmd = vboxVhwaCommandCreate(pDevExt, VidPnSourceId,
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsync VBOXVHWACMD_TYPE_SURF_GETINFO, sizeof(VBOXVHWACMD_SURF_GETINFO));
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsync VBOXVHWACMD_SURF_GETINFO * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_GETINFO);
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsync memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_GETINFO));
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync rc = vboxVhwaHlpPopulateSurInfo(&pBody->SurfInfo, pSurf,
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync 0, 0, VBOXVHWA_SCAPS_OVERLAY | VBOXVHWA_SCAPS_VIDEOMEMORY | VBOXVHWA_SCAPS_LOCALVIDMEM | VBOXVHWA_SCAPS_COMPLEX,
d46ee884c41b808b239563b1978468aae12e33a2vboxsync rc = vboxVhwaHlpCheckApplySurfInfo(pSurf, &pBody->SurfInfo, 0, true);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsyncint vboxVhwaHlpGetSurfInfo(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_ALLOCATION pSurf)
7a5aa60c341d7f14da337f31a3ed1afcee98bc8avboxsync if (pSource->Vhwa.Settings.fFlags & VBOXVHWA_F_ENABLED)
d46ee884c41b808b239563b1978468aae12e33a2vboxsync int rc = vboxVhwaHlpGetSurfInfoForSource(pDevExt, pSurf, i);
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsyncint vboxVhwaHlpDestroyPrimary(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_SOURCE pSource, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
c606fa3531314e32f0ae90495618aeae47418477vboxsync PVBOXWDDM_ALLOCATION pFbSurf = pSource->pShadowAllocation;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync PVBOXWDDM_ALLOCATION pFbSurf = pSource->pPrimaryAllocation;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync int rc = vboxVhwaHlpDestroySurface(pDevExt, pFbSurf, VidPnSourceId);
d46ee884c41b808b239563b1978468aae12e33a2vboxsyncint vboxVhwaHlpCreatePrimary(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_SOURCE pSource, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync PVBOXWDDM_ALLOCATION pFbSurf = pSource->pShadowAllocation;
d46ee884c41b808b239563b1978468aae12e33a2vboxsync PVBOXWDDM_ALLOCATION pFbSurf = pSource->pPrimaryAllocation;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync Assert(pFbSurf->hHostHandle == VBOXVHWA_SURFHANDLE_INVALID);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync if (pFbSurf->hHostHandle != VBOXVHWA_SURFHANDLE_INVALID)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync int rc = vboxVhwaHlpCreateSurface(pDevExt, pFbSurf,
d46ee884c41b808b239563b1978468aae12e33a2vboxsync VBOXVHWA_SD_PITCH, 0, VBOXVHWA_SCAPS_PRIMARYSURFACE | VBOXVHWA_SCAPS_VIDEOMEMORY | VBOXVHWA_SCAPS_LOCALVIDMEM,
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsyncint vboxVhwaHlpCheckInit(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[VidPnSourceId];
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync Assert(!!(pSource->Vhwa.Settings.fFlags & VBOXVHWA_F_ENABLED));
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync if (!(pSource->Vhwa.Settings.fFlags & VBOXVHWA_F_ENABLED))
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync /* @todo: need a better synch */
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync uint32_t cNew = ASMAtomicIncU32(&pSource->Vhwa.cOverlaysCreated);
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync rc = vboxVhwaHlpCreatePrimary(pDevExt, pSource, VidPnSourceId);
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync PVBOXWDDM_ALLOCATION pFbSurf = pSource->pShadowAllocation;
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync PVBOXWDDM_ALLOCATION pFbSurf = pSource->pPrimaryAllocation;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsyncint vboxVhwaHlpCheckTerm(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[VidPnSourceId];
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync Assert(!!(pSource->Vhwa.Settings.fFlags & VBOXVHWA_F_ENABLED));
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync /* @todo: need a better synch */
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync uint32_t cNew = ASMAtomicDecU32(&pSource->Vhwa.cOverlaysCreated);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync rc = vboxVhwaHlpDestroyPrimary(pDevExt, pSource, VidPnSourceId);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsyncint vboxVhwaHlpCreateOverlay(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_ALLOCATION pSurf, uint32_t cBackBuffers, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync int rc = vboxVhwaHlpCheckInit(pDevExt, VidPnSourceId);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync 0, cBackBuffers, VBOXVHWA_SCAPS_OVERLAY | VBOXVHWA_SCAPS_VIDEOMEMORY | VBOXVHWA_SCAPS_LOCALVIDMEM | VBOXVHWA_SCAPS_COMPLEX,
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsyncint vboxVhwaHlpDestroyOverlay(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_ALLOCATION pSurf, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)