VBoxVideoVhwa.cpp revision 0e8fecb4a79ed5fd94d937fb94d3a4c4e8694598
d46ee884c41b808b239563b1978468aae12e33a2vboxsync/*
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync * Copyright (C) 2010 Oracle Corporation
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync *
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.
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync */
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync#include "../VBoxVideo.h"
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync#include "../Helper.h"
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync#ifndef VBOXVHWA_WITH_SHGSMI
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync# include <iprt/semaphore.h>
d46ee884c41b808b239563b1978468aae12e33a2vboxsync# include <iprt/asm.h>
d46ee884c41b808b239563b1978468aae12e33a2vboxsync#endif
d46ee884c41b808b239563b1978468aae12e33a2vboxsync
e2760cdc84c692bc46cfaf5018d313db2f122acavboxsync
d46ee884c41b808b239563b1978468aae12e33a2vboxsync
d46ee884c41b808b239563b1978468aae12e33a2vboxsyncDECLINLINE(void) vboxVhwaHdrInit(VBOXVHWACMD* pHdr, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, VBOXVHWACMD_TYPE enmCmd)
d46ee884c41b808b239563b1978468aae12e33a2vboxsync{
d46ee884c41b808b239563b1978468aae12e33a2vboxsync memset(pHdr, 0, sizeof(VBOXVHWACMD));
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync pHdr->iDisplay = srcId;
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync pHdr->rc = VERR_GENERAL_FAILURE;
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync pHdr->enmCmd = enmCmd;
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync#ifndef VBOXVHWA_WITH_SHGSMI
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync pHdr->cRefs = 1;
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync#endif
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync}
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync#ifdef VBOXVHWA_WITH_SHGSMI
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsyncstatic int vboxVhwaCommandSubmitHgsmi(struct _DEVICE_EXTENSION* pDevExt, HGSMIOFFSET offDr)
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync{
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync VBoxHGSMIGuestWrite(pDevExt, offDr);
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync return VINF_SUCCESS;
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync}
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync#else
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsyncDECLINLINE(void) vbvaVhwaCommandRelease(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd)
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync{
d46ee884c41b808b239563b1978468aae12e33a2vboxsync uint32_t cRefs = ASMAtomicDecU32(&pCmd->cRefs);
d46ee884c41b808b239563b1978468aae12e33a2vboxsync Assert(cRefs < UINT32_MAX / 2);
d46ee884c41b808b239563b1978468aae12e33a2vboxsync if(!cRefs)
d46ee884c41b808b239563b1978468aae12e33a2vboxsync {
d46ee884c41b808b239563b1978468aae12e33a2vboxsync vboxHGSMIBufferFree(pDevExt, pCmd);
d46ee884c41b808b239563b1978468aae12e33a2vboxsync }
3b70c9ab3cea93ab1a771d2db319311282041382vboxsync}
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
d46ee884c41b808b239563b1978468aae12e33a2vboxsyncDECLINLINE(void) vbvaVhwaCommandRetain(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync{
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync ASMAtomicIncU32(&pCmd->cRefs);
d46ee884c41b808b239563b1978468aae12e33a2vboxsync}
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync/* do not wait for completion */
2a229554eb081e98411c81dcdef146c35a000f80vboxsyncvoid vboxVhwaCommandSubmitAsynch(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd, PFNVBOXVHWACMDCOMPLETION pfnCompletion, void * pContext)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync{
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pCmd->GuestVBVAReserved1 = (uintptr_t)pfnCompletion;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pCmd->GuestVBVAReserved2 = (uintptr_t)pContext;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync vbvaVhwaCommandRetain(pDevExt, pCmd);
e33247bff4fddfdba92538374bcc9e2753044a38vboxsync
d46ee884c41b808b239563b1978468aae12e33a2vboxsync vboxHGSMIBufferSubmit(pDevExt, pCmd);
d46ee884c41b808b239563b1978468aae12e33a2vboxsync
d46ee884c41b808b239563b1978468aae12e33a2vboxsync if(!(pCmd->Flags & VBOXVHWACMD_FLAG_HG_ASYNCH)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync || ((pCmd->Flags & VBOXVHWACMD_FLAG_GH_ASYNCH_NOCOMPLETION)
e33247bff4fddfdba92538374bcc9e2753044a38vboxsync && (pCmd->Flags & VBOXVHWACMD_FLAG_HG_ASYNCH_RETURNED)))
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync {
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync /* the command is completed */
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pfnCompletion(pDevExt, pCmd, pContext);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync }
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
e33247bff4fddfdba92538374bcc9e2753044a38vboxsync vbvaVhwaCommandRelease(pDevExt, pCmd);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync}
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
71e8510a26b72d539cf6d7d7157bd87a53de8cf4vboxsyncstatic DECLCALLBACK(void) vboxVhwaCompletionSetEvent(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD * pCmd, void * pvContext)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync{
e33247bff4fddfdba92538374bcc9e2753044a38vboxsync RTSemEventSignal((RTSEMEVENT)pvContext);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync}
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsyncvoid vboxVhwaCommandSubmitAsynchByEvent(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd, RTSEMEVENT hEvent)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync{
358a99c385080f7f31166943f3ac3a2aea6b5263vboxsync vboxVhwaCommandSubmitAsynch(pDevExt, pCmd, vboxVhwaCompletionSetEvent, hEvent);
e33247bff4fddfdba92538374bcc9e2753044a38vboxsync}
e33247bff4fddfdba92538374bcc9e2753044a38vboxsync#endif
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
e33247bff4fddfdba92538374bcc9e2753044a38vboxsyncVBOXVHWACMD* vboxVhwaCommandCreate(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, VBOXVHWACMD_TYPE enmCmd, VBOXVHWACMD_LENGTH cbCmd)
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync{
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync#ifdef VBOXVHWA_WITH_SHGSMI
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync VBOXVHWACMD* pHdr = (VBOXVHWACMD*)VBoxSHGSMICommandAlloc(&pDevExt->u.primary.hgsmiAdapterHeap,
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync cbCmd + VBOXVHWACMD_HEADSIZE(),
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync HGSMI_CH_VBVA,
e33247bff4fddfdba92538374bcc9e2753044a38vboxsync VBVA_VHWA_CMD);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync#else
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync VBOXVHWACMD* pHdr = (VBOXVHWACMD*)vboxHGSMIBufferAlloc(pDevExt,
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync cbCmd + VBOXVHWACMD_HEADSIZE(),
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync HGSMI_CH_VBVA,
e33247bff4fddfdba92538374bcc9e2753044a38vboxsync VBVA_VHWA_CMD);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync#endif
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync Assert(pHdr);
e33247bff4fddfdba92538374bcc9e2753044a38vboxsync if (!pHdr)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync {
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync drprintf((__FUNCTION__": vboxHGSMIBufferAlloc failed\n"));
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync }
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync else
e33247bff4fddfdba92538374bcc9e2753044a38vboxsync {
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync vboxVhwaHdrInit(pHdr, srcId, enmCmd);
d46ee884c41b808b239563b1978468aae12e33a2vboxsync }
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync return pHdr;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync}
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
d46ee884c41b808b239563b1978468aae12e33a2vboxsyncvoid vboxVhwaCommandFree(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync{
d46ee884c41b808b239563b1978468aae12e33a2vboxsync#ifdef VBOXVHWA_WITH_SHGSMI
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync VBoxSHGSMICommandFree(&pDevExt->u.primary.hgsmiAdapterHeap, pCmd);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync#else
d46ee884c41b808b239563b1978468aae12e33a2vboxsync vbvaVhwaCommandRelease(pDevExt, pCmd);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync#endif
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync}
d46ee884c41b808b239563b1978468aae12e33a2vboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsyncint vboxVhwaCommandSubmit(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync{
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync#ifdef VBOXVHWA_WITH_SHGSMI
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync const VBOXSHGSMIHEADER* pHdr = VBoxSHGSMICommandPrepSynch(&pDevExt->u.primary.hgsmiAdapterHeap, pCmd);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync Assert(pHdr);
d46ee884c41b808b239563b1978468aae12e33a2vboxsync int rc = VERR_GENERAL_FAILURE;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync if (pHdr)
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync {
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync do
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync {
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync HGSMIOFFSET offCmd = VBoxSHGSMICommandOffset(&pDevExt->u.primary.hgsmiAdapterHeap, pHdr);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync Assert(offCmd != HGSMIOFFSET_VOID);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync if (offCmd != HGSMIOFFSET_VOID)
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync {
358a99c385080f7f31166943f3ac3a2aea6b5263vboxsync rc = vboxVhwaCommandSubmitHgsmi(pDevExt, offCmd);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync AssertRC(rc);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync if (RT_SUCCESS(rc))
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync {
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync VBoxSHGSMICommandDoneSynch(&pDevExt->u.primary.hgsmiAdapterHeap, pHdr);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync AssertRC(rc);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync break;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync }
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync }
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync else
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync rc = VERR_INVALID_PARAMETER;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync /* fail to submit, cancel it */
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync VBoxSHGSMICommandCancelSynch(&pDevExt->u.primary.hgsmiAdapterHeap, pHdr);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync } while (0);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync }
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync else
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync rc = VERR_INVALID_PARAMETER;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync return rc;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync#else
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync RTSEMEVENT hEvent;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync int rc = RTSemEventCreate(&hEvent);
fd0cf98cb3eafc5c96b7e95d934b01c5df4785fbvboxsync AssertRC(rc);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync if (RT_SUCCESS(rc))
d46ee884c41b808b239563b1978468aae12e33a2vboxsync {
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync pCmd->Flags |= VBOXVHWACMD_FLAG_GH_ASYNCH_IRQ;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync vboxVhwaCommandSubmitAsynchByEvent(pDevExt, pCmd, hEvent);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync rc = RTSemEventWait(hEvent, RT_INDEFINITE_WAIT);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync AssertRC(rc);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync if (RT_SUCCESS(rc))
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync RTSemEventDestroy(hEvent);
358a99c385080f7f31166943f3ac3a2aea6b5263vboxsync }
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync return rc;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync#endif
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync}
d46ee884c41b808b239563b1978468aae12e33a2vboxsync
358a99c385080f7f31166943f3ac3a2aea6b5263vboxsync#ifndef VBOXVHWA_WITH_SHGSMI
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsyncstatic DECLCALLBACK(void) vboxVhwaCompletionFreeCmd(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD * pCmd, void * pContext)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync{
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync vboxVhwaCommandFree(pDevExt, pCmd);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync}
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsyncvoid vboxVhwaCompletionListProcess(PDEVICE_EXTENSION pDevExt, VBOXSHGSMILIST *pList)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync{
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync PVBOXSHGSMILIST_ENTRY pNext, pCur;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync for (pCur = pList->pFirst; pCur; pCur = pNext)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync {
fd0cf98cb3eafc5c96b7e95d934b01c5df4785fbvboxsync /* need to save next since the command may be released in a pfnCallback and thus its data might be invalid */
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pNext = pCur->pNext;
d46ee884c41b808b239563b1978468aae12e33a2vboxsync VBOXVHWACMD *pCmd = VBOXVHWA_LISTENTRY2CMD(pCur);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync PFNVBOXVHWACMDCOMPLETION pfnCallback = (PFNVBOXVHWACMDCOMPLETION)pCmd->GuestVBVAReserved1;
d46ee884c41b808b239563b1978468aae12e33a2vboxsync void *pvCallback = (void*)pCmd->GuestVBVAReserved2;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pfnCallback(pDevExt, pCmd, pvCallback);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync }
d46ee884c41b808b239563b1978468aae12e33a2vboxsync}
358a99c385080f7f31166943f3ac3a2aea6b5263vboxsync
d46ee884c41b808b239563b1978468aae12e33a2vboxsync#endif
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsyncvoid vboxVhwaCommandSubmitAsynchAndComplete(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync{
d46ee884c41b808b239563b1978468aae12e33a2vboxsync#ifdef VBOXVHWA_WITH_SHGSMI
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync# error "port me"
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync#else
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pCmd->Flags |= VBOXVHWACMD_FLAG_GH_ASYNCH_NOCOMPLETION;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync vboxVhwaCommandSubmitAsynch(pDevExt, pCmd, vboxVhwaCompletionFreeCmd, NULL);
d46ee884c41b808b239563b1978468aae12e33a2vboxsync#endif
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync}
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
d46ee884c41b808b239563b1978468aae12e33a2vboxsyncvoid vboxVHWAFreeHostInfo1(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD_QUERYINFO1* pInfo)
358a99c385080f7f31166943f3ac3a2aea6b5263vboxsync{
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync VBOXVHWACMD* pCmd = VBOXVHWACMD_HEAD(pInfo);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync vboxVhwaCommandFree(pDevExt, pCmd);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync}
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsyncvoid vboxVHWAFreeHostInfo2(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD_QUERYINFO2* pInfo)
d46ee884c41b808b239563b1978468aae12e33a2vboxsync{
358a99c385080f7f31166943f3ac3a2aea6b5263vboxsync VBOXVHWACMD* pCmd = VBOXVHWACMD_HEAD(pInfo);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync vboxVhwaCommandFree(pDevExt, pCmd);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync}
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsyncVBOXVHWACMD_QUERYINFO1* vboxVHWAQueryHostInfo1(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync{
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync VBOXVHWACMD* pCmd = vboxVhwaCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_QUERY_INFO1, sizeof(VBOXVHWACMD_QUERYINFO1));
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync VBOXVHWACMD_QUERYINFO1 *pInfo1;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync Assert(pCmd);
d46ee884c41b808b239563b1978468aae12e33a2vboxsync if (!pCmd)
358a99c385080f7f31166943f3ac3a2aea6b5263vboxsync {
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync drprintf((0, "VBoxDISP::vboxVHWAQueryHostInfo1: vboxVHWACommandCreate failed\n"));
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync return NULL;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync }
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
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
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync int rc = vboxVhwaCommandSubmit(pDevExt, pCmd);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync AssertRC(rc);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync if(RT_SUCCESS(rc))
6c2e2f2be39d679eb8e2e371afd146099f8dc5e7vboxsync {
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync if(RT_SUCCESS(pCmd->rc))
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync {
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync return VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_QUERYINFO1);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync }
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync }
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync vboxVhwaCommandFree(pDevExt, pCmd);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync return NULL;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync}
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
5ff3fa0492332325f57e80636321619e2224027evboxsyncVBOXVHWACMD_QUERYINFO2* vboxVHWAQueryHostInfo2(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, uint32_t numFourCC)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync{
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync VBOXVHWACMD* pCmd = vboxVhwaCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_QUERY_INFO2, VBOXVHWAINFO2_SIZE(numFourCC));
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync VBOXVHWACMD_QUERYINFO2 *pInfo2;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync Assert(pCmd);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync if (!pCmd)
5ff3fa0492332325f57e80636321619e2224027evboxsync {
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync drprintf((0, "VBoxDISP::vboxVHWAQueryHostInfo2: vboxVHWACommandCreate failed\n"));
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync return NULL;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync }
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync pInfo2 = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_QUERYINFO2);
358a99c385080f7f31166943f3ac3a2aea6b5263vboxsync pInfo2->numFourCC = numFourCC;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync int rc = vboxVhwaCommandSubmit(pDevExt, pCmd);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync AssertRC(rc);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync if(RT_SUCCESS(rc))
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync {
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync AssertRC(pCmd->rc);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync if(RT_SUCCESS(pCmd->rc))
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync {
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync if(pInfo2->numFourCC == numFourCC)
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync {
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync return pInfo2;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync }
aa0632eb844172ced4bef7b3afdbb216c8462fb2vboxsync }
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync }
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
fd0cf98cb3eafc5c96b7e95d934b01c5df4785fbvboxsync vboxVhwaCommandFree(pDevExt, pCmd);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync return NULL;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync}
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
5ff3fa0492332325f57e80636321619e2224027evboxsyncint vboxVHWAEnable(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync{
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync int rc = VERR_GENERAL_FAILURE;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync VBOXVHWACMD* pCmd;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync pCmd = vboxVhwaCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_ENABLE, 0);
358a99c385080f7f31166943f3ac3a2aea6b5263vboxsync Assert(pCmd);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync if (!pCmd)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync {
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync drprintf((0, "VBoxDISP::vboxVHWAEnable: vboxVHWACommandCreate failed\n"));
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync return rc;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync }
a12929133f77ffa755a13a7d5d2ff3d87c41c9c5vboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync rc = vboxVhwaCommandSubmit(pDevExt, pCmd);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync AssertRC(rc);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync if(RT_SUCCESS(rc))
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync {
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync AssertRC(pCmd->rc);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync if(RT_SUCCESS(pCmd->rc))
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync rc = VINF_SUCCESS;
52262a1f2eed7acaf08d8a169159e8201c9da661vboxsync else
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync rc = pCmd->rc;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync }
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync vboxVhwaCommandFree(pDevExt, pCmd);
fd0cf98cb3eafc5c96b7e95d934b01c5df4785fbvboxsync return rc;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync}
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsyncint vboxVHWADisable(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
10153a147e7cb38821b5e7404bd2ef6b9af5be4avboxsync{
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync int rc = VERR_GENERAL_FAILURE;
5ff3fa0492332325f57e80636321619e2224027evboxsync VBOXVHWACMD* pCmd;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync pCmd = vboxVhwaCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_DISABLE, 0);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync Assert(pCmd);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync if (!pCmd)
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync {
358a99c385080f7f31166943f3ac3a2aea6b5263vboxsync drprintf((0, "VBoxDISP::vboxVHWADisable: vboxVHWACommandCreate failed\n"));
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync return rc;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync }
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync rc = vboxVhwaCommandSubmit(pDevExt, pCmd);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync AssertRC(rc);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync if(RT_SUCCESS(rc))
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync {
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync AssertRC(pCmd->rc);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync if(RT_SUCCESS(pCmd->rc))
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync rc = VINF_SUCCESS;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync else
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync rc = pCmd->rc;
5ff3fa0492332325f57e80636321619e2224027evboxsync }
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync vboxVhwaCommandFree(pDevExt, pCmd);
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync return rc;
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync}
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsyncstatic void vboxVHWAInitSrc(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync{
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync Assert(srcId < pDevExt->cSources);
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync VBOXVHWA_INFO *pSettings = &pDevExt->aSources[srcId].Vhwa.Settings;
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync memset (pSettings, 0, sizeof (VBOXVHWA_INFO));
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync VBOXVHWACMD_QUERYINFO1* pInfo1 = vboxVHWAQueryHostInfo1(pDevExt, srcId);
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync if (pInfo1)
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync {
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync if ((pInfo1->u.out.cfgFlags & VBOXVHWA_CFG_ENABLED)
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync && pInfo1->u.out.numOverlays)
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync {
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync if ((pInfo1->u.out.caps & VBOXVHWA_CAPS_OVERLAY)
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)
f7c0f913c4c22ee18059ff97055442566d0f14a1vboxsync && pInfo1->u.out.numOverlays)
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync {
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync pSettings->fFlags |= VBOXVHWA_F_ENABLED;
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync if (pInfo1->u.out.caps & VBOXVHWA_CAPS_COLORKEY)
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync {
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync if (pInfo1->u.out.colorKeyCaps & VBOXVHWA_CKEYCAPS_SRCOVERLAY)
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync {
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync pSettings->fFlags |= VBOXVHWA_F_CKEY_SRC;
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync /* todo: VBOXVHWA_CKEYCAPS_SRCOVERLAYONEACTIVE ? */
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync }
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync if (pInfo1->u.out.colorKeyCaps & VBOXVHWA_CKEYCAPS_DESTOVERLAY)
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync {
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync pSettings->fFlags |= VBOXVHWA_F_CKEY_DST;
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync /* todo: VBOXVHWA_CKEYCAPS_DESTOVERLAYONEACTIVE ? */
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync }
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync }
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync pSettings->cOverlaysSupported = pInfo1->u.out.numOverlays;
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync pSettings->cFormats = 0;
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync pSettings->aFormats[pSettings->cFormats] = D3DDDIFMT_X8R8G8B8;
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync ++pSettings->cFormats;
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync if (pInfo1->u.out.numFourCC
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync && (pInfo1->u.out.caps & VBOXVHWA_CAPS_OVERLAYFOURCC))
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync {
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync VBOXVHWACMD_QUERYINFO2* pInfo2 = vboxVHWAQueryHostInfo2(pDevExt, srcId, pInfo1->u.out.numFourCC);
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync if (pInfo2)
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync {
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync for (uint32_t i = 0; i < pInfo2->numFourCC; ++i)
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync {
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync pSettings->aFormats[pSettings->cFormats] = (D3DDDIFORMAT)pInfo2->FourCC[i];
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync ++pSettings->cFormats;
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync }
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync vboxVHWAFreeHostInfo2(pDevExt, pInfo2);
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync }
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync }
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync }
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync }
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync vboxVHWAFreeHostInfo1(pDevExt, pInfo1);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync }
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync}
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsyncvoid vboxVHWAInit(PDEVICE_EXTENSION pDevExt)
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync{
358a99c385080f7f31166943f3ac3a2aea6b5263vboxsync for (uint32_t i = 0; i < pDevExt->cSources; ++i)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync {
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync vboxVHWAInitSrc(pDevExt, i);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync }
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync}
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsyncvoid vboxVHWAFree(PDEVICE_EXTENSION pDevExt)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync{
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync /* we do not allocate/map anything, just issue a Disable command
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync * to ensure all pending commands are flushed */
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync for (uint32_t i = 0; i < pDevExt->cSources; ++i)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync {
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync vboxVHWADisable(pDevExt, i);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync }
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync}
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsyncint vboxVhwaHlpTranslateFormat(VBOXVHWA_PIXELFORMAT *pFormat, D3DDDIFORMAT enmFormat)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync{
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pFormat->Reserved = 0;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync switch (enmFormat)
fd0cf98cb3eafc5c96b7e95d934b01c5df4785fbvboxsync {
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync case D3DDDIFMT_A8R8G8B8:
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync case D3DDDIFMT_X8R8G8B8:
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pFormat->flags = VBOXVHWA_PF_RGB;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pFormat->c.rgbBitCount = 32;
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync pFormat->m1.rgbRBitMask = 0xff0000;
cebc93936b5bb4d867e1c086dd1b206db33c31dcvboxsync pFormat->m2.rgbGBitMask = 0xff00;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pFormat->m3.rgbBBitMask = 0xff;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync /* always zero for now */
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pFormat->m4.rgbABitMask = 0;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync return VINF_SUCCESS;
d46ee884c41b808b239563b1978468aae12e33a2vboxsync case D3DDDIFMT_R8G8B8:
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync pFormat->flags = VBOXVHWA_PF_RGB;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync pFormat->c.rgbBitCount = 24;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync pFormat->m1.rgbRBitMask = 0xff0000;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync pFormat->m2.rgbGBitMask = 0xff00;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync pFormat->m3.rgbBBitMask = 0xff;
358a99c385080f7f31166943f3ac3a2aea6b5263vboxsync /* always zero for now */
d46ee884c41b808b239563b1978468aae12e33a2vboxsync pFormat->m4.rgbABitMask = 0;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync return VINF_SUCCESS;
d3bef44ac7674167abeada174f0d6cf0572249c5vboxsync case D3DDDIFMT_R5G6B5:
d3bef44ac7674167abeada174f0d6cf0572249c5vboxsync pFormat->flags = VBOXVHWA_PF_RGB;
cbc68a61f0aa44b3f2b8a24217de2091c3ca2258vboxsync pFormat->c.rgbBitCount = 16;
cbc68a61f0aa44b3f2b8a24217de2091c3ca2258vboxsync pFormat->m1.rgbRBitMask = 0xf800;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pFormat->m2.rgbGBitMask = 0x7e0;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pFormat->m3.rgbBBitMask = 0x1f;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync /* always zero for now */
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pFormat->m4.rgbABitMask = 0;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync return VINF_SUCCESS;
d3bef44ac7674167abeada174f0d6cf0572249c5vboxsync case D3DDDIFMT_P8:
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync case D3DDDIFMT_A8:
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync case D3DDDIFMT_X1R5G5B5:
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync case D3DDDIFMT_A1R5G5B5:
fd0cf98cb3eafc5c96b7e95d934b01c5df4785fbvboxsync case D3DDDIFMT_A4R4G4B4:
fd0cf98cb3eafc5c96b7e95d934b01c5df4785fbvboxsync case D3DDDIFMT_R3G3B2:
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync case D3DDDIFMT_A8R3G3B2:
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync case D3DDDIFMT_X4R4G4B4:
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync case D3DDDIFMT_A2B10G10R10:
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync case D3DDDIFMT_A8B8G8R8:
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync case D3DDDIFMT_X8B8G8R8:
d46ee884c41b808b239563b1978468aae12e33a2vboxsync case D3DDDIFMT_G16R16:
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync case D3DDDIFMT_A2R10G10B10:
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync case D3DDDIFMT_A16B16G16R16:
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync case D3DDDIFMT_A8P8:
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync default:
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync {
358a99c385080f7f31166943f3ac3a2aea6b5263vboxsync uint32_t fourcc = vboxWddmFormatToFourcc(enmFormat);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync Assert(fourcc);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync if (fourcc)
04ee5d908f45a7883257fa7e40fb42bbdbaf24b9vboxsync {
04ee5d908f45a7883257fa7e40fb42bbdbaf24b9vboxsync pFormat->flags = VBOXVHWA_PF_FOURCC;
04ee5d908f45a7883257fa7e40fb42bbdbaf24b9vboxsync pFormat->fourCC = fourcc;
04ee5d908f45a7883257fa7e40fb42bbdbaf24b9vboxsync return VINF_SUCCESS;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync }
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync return VERR_NOT_SUPPORTED;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync }
04ee5d908f45a7883257fa7e40fb42bbdbaf24b9vboxsync }
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync}
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsyncint vboxVhwaHlpDestroySurface(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_ALLOCATION pSurf,
fd0cf98cb3eafc5c96b7e95d934b01c5df4785fbvboxsync D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
fd0cf98cb3eafc5c96b7e95d934b01c5df4785fbvboxsync{
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync Assert(pSurf->hHostHandle);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync if (!pSurf->hHostHandle)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync return VERR_INVALID_STATE;
d46ee884c41b808b239563b1978468aae12e33a2vboxsync
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync VBOXVHWACMD* pCmd = vboxVhwaCommandCreate(pDevExt, VidPnSourceId,
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync VBOXVHWACMD_TYPE_SURF_DESTROY, sizeof(VBOXVHWACMD_SURF_DESTROY));
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync Assert(pCmd);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync if(pCmd)
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync {
358a99c385080f7f31166943f3ac3a2aea6b5263vboxsync VBOXVHWACMD_SURF_DESTROY * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_DESTROY);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_DESTROY));
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pBody->u.in.hSurf = pSurf->hHostHandle;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync /* we're not interested in completion, just send the command */
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync vboxVhwaCommandSubmitAsynchAndComplete(pDevExt, pCmd);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync pSurf->hHostHandle = VBOXVHWA_SURFHANDLE_INVALID;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync return VINF_SUCCESS;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync }
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync return VERR_OUT_OF_RESOURCES;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync}
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsyncint vboxVhwaHlpPopulateSurInfo(VBOXVHWA_SURFACEDESC *pInfo, PVBOXWDDM_ALLOCATION pSurf,
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync uint32_t fFlags, uint32_t cBackBuffers, uint32_t fSCaps,
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync{
d46ee884c41b808b239563b1978468aae12e33a2vboxsync memset(pInfo, 0, sizeof(VBOXVHWA_SURFACEDESC));
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync pInfo->height = pSurf->SurfDesc.height;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync pInfo->width = pSurf->SurfDesc.width;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync pInfo->flags |= VBOXVHWA_SD_HEIGHT | VBOXVHWA_SD_WIDTH;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync if (fFlags & VBOXVHWA_SD_PITCH)
358a99c385080f7f31166943f3ac3a2aea6b5263vboxsync {
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pInfo->pitch = pSurf->SurfDesc.pitch;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pInfo->flags |= VBOXVHWA_SD_PITCH;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pInfo->sizeX = pSurf->SurfDesc.cbSize;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pInfo->sizeY = 1;
d46ee884c41b808b239563b1978468aae12e33a2vboxsync }
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync if (cBackBuffers)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync {
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pInfo->cBackBuffers = cBackBuffers;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pInfo->flags |= VBOXVHWA_SD_BACKBUFFERCOUNT;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync }
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync else
d46ee884c41b808b239563b1978468aae12e33a2vboxsync pInfo->cBackBuffers = 0;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync pInfo->Reserved = 0;
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);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync AssertRC(rc);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync if (RT_SUCCESS(rc))
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync {
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pInfo->flags |= VBOXVHWA_SD_PIXELFORMAT;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync pInfo->surfCaps = fSCaps;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync pInfo->flags |= VBOXVHWA_SD_CAPS;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync pInfo->offSurface = pSurf->offVram;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync }
fd0cf98cb3eafc5c96b7e95d934b01c5df4785fbvboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync return rc;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync}
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
d46ee884c41b808b239563b1978468aae12e33a2vboxsyncint vboxVhwaHlpCheckApplySurfInfo(PVBOXWDDM_ALLOCATION pSurf, VBOXVHWA_SURFACEDESC *pInfo,
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync uint32_t fFlags, bool bApplyHostHandle)
d46ee884c41b808b239563b1978468aae12e33a2vboxsync{
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync int rc = VINF_SUCCESS;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync if (!(fFlags & VBOXVHWA_SD_PITCH))
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync {
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync /* should be set by host */
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync Assert(pInfo->flags & VBOXVHWA_SD_PITCH);
34aaaf212fe61ccafbae15eb832d6062ba548799vboxsync pSurf->SurfDesc.cbSize = pInfo->sizeX * pInfo->sizeY;
34aaaf212fe61ccafbae15eb832d6062ba548799vboxsync Assert(pSurf->SurfDesc.cbSize);
34aaaf212fe61ccafbae15eb832d6062ba548799vboxsync pSurf->SurfDesc.pitch = pInfo->pitch;
1ea22ca610c19eb455275a4398575b6291c27629vboxsync Assert(pSurf->SurfDesc.pitch);
34aaaf212fe61ccafbae15eb832d6062ba548799vboxsync }
34aaaf212fe61ccafbae15eb832d6062ba548799vboxsync else
34aaaf212fe61ccafbae15eb832d6062ba548799vboxsync {
34aaaf212fe61ccafbae15eb832d6062ba548799vboxsync Assert(pSurf->SurfDesc.cbSize == pInfo->sizeX);
34aaaf212fe61ccafbae15eb832d6062ba548799vboxsync Assert(pInfo->sizeY == 1);
34aaaf212fe61ccafbae15eb832d6062ba548799vboxsync Assert(pInfo->pitch == pSurf->SurfDesc.pitch);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync if (pSurf->SurfDesc.cbSize != pInfo->sizeX
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync || pInfo->sizeY != 1
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync || pInfo->pitch != pSurf->SurfDesc.pitch)
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync {
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync rc = VERR_INVALID_PARAMETER;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync }
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync }
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync if (bApplyHostHandle && RT_SUCCESS(rc))
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync {
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync pSurf->hHostHandle = pInfo->hSurf;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync }
34aaaf212fe61ccafbae15eb832d6062ba548799vboxsync
34aaaf212fe61ccafbae15eb832d6062ba548799vboxsync return rc;
34aaaf212fe61ccafbae15eb832d6062ba548799vboxsync}
34aaaf212fe61ccafbae15eb832d6062ba548799vboxsync
34aaaf212fe61ccafbae15eb832d6062ba548799vboxsyncint vboxVhwaHlpCreateSurface(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_ALLOCATION pSurf,
34aaaf212fe61ccafbae15eb832d6062ba548799vboxsync uint32_t fFlags, uint32_t cBackBuffers, uint32_t fSCaps,
34aaaf212fe61ccafbae15eb832d6062ba548799vboxsync D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
34aaaf212fe61ccafbae15eb832d6062ba548799vboxsync{
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));
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync Assert(pCmd);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync if (pCmd)
6e12ccc60ac657fb87e27b7a2b26e0a63bebe024vboxsync {
6e12ccc60ac657fb87e27b7a2b26e0a63bebe024vboxsync VBOXVHWACMD_SURF_CREATE * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_CREATE);
6e12ccc60ac657fb87e27b7a2b26e0a63bebe024vboxsync int rc = VINF_SUCCESS;
6e12ccc60ac657fb87e27b7a2b26e0a63bebe024vboxsync
6e12ccc60ac657fb87e27b7a2b26e0a63bebe024vboxsync memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_CREATE));
6e12ccc60ac657fb87e27b7a2b26e0a63bebe024vboxsync
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync rc = vboxVhwaHlpPopulateSurInfo(&pBody->SurfInfo, pSurf,
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync fFlags, cBackBuffers, fSCaps,
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync VidPnSourceId);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync AssertRC(rc);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync if (RT_SUCCESS(rc))
6e12ccc60ac657fb87e27b7a2b26e0a63bebe024vboxsync {
6e12ccc60ac657fb87e27b7a2b26e0a63bebe024vboxsync vboxVhwaCommandSubmit(pDevExt, pCmd);
6e12ccc60ac657fb87e27b7a2b26e0a63bebe024vboxsync Assert(pCmd->rc == VINF_SUCCESS);
6e12ccc60ac657fb87e27b7a2b26e0a63bebe024vboxsync if(pCmd->rc == VINF_SUCCESS)
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsync {
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsync rc = vboxVhwaHlpCheckApplySurfInfo(pSurf, &pBody->SurfInfo, fFlags, true);
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsync }
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsync else
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsync rc = pCmd->rc;
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsync }
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsync vboxVhwaCommandFree(pDevExt, pCmd);
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsync return rc;
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsync }
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsync
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsync return VERR_OUT_OF_RESOURCES;
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsync}
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsync
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsyncint vboxVhwaHlpGetSurfInfoForSource(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_ALLOCATION pSurf, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsync{
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 Assert(pCmd);
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsync if (pCmd)
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsync {
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsync VBOXVHWACMD_SURF_GETINFO * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_GETINFO);
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsync int rc = VINF_SUCCESS;
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsync
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsync memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_GETINFO));
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync rc = vboxVhwaHlpPopulateSurInfo(&pBody->SurfInfo, pSurf,
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync 0, 0, VBOXVHWA_SCAPS_OVERLAY | VBOXVHWA_SCAPS_VIDEOMEMORY | VBOXVHWA_SCAPS_LOCALVIDMEM | VBOXVHWA_SCAPS_COMPLEX,
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync VidPnSourceId);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync AssertRC(rc);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync if (RT_SUCCESS(rc))
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync {
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync vboxVhwaCommandSubmit(pDevExt, pCmd);
358a99c385080f7f31166943f3ac3a2aea6b5263vboxsync Assert(pCmd->rc == VINF_SUCCESS);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync if(pCmd->rc == VINF_SUCCESS)
606bf1f8cb2c02eb19f231f75e56417f0439951fvboxsync {
d46ee884c41b808b239563b1978468aae12e33a2vboxsync rc = vboxVhwaHlpCheckApplySurfInfo(pSurf, &pBody->SurfInfo, 0, true);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync }
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync else
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync rc = pCmd->rc;
ad9e5a61fea617d40d07390ff1737277d6aef869vboxsync }
d46ee884c41b808b239563b1978468aae12e33a2vboxsync vboxVhwaCommandFree(pDevExt, pCmd);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync return rc;
2c744347b35ec425c206a25ca4095d30a12474d9vboxsync }
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
c33fc49611f2444dade533488bf431e29eb88bcdvboxsync return VERR_OUT_OF_RESOURCES;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync}
7119861e2c17e0a4e0638b06a544cc571cf6804avboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsyncint vboxVhwaHlpGetSurfInfo(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_ALLOCATION pSurf)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync{
7a5aa60c341d7f14da337f31a3ed1afcee98bc8avboxsync for (uint32_t i = 0; i < pDevExt->cSources; ++i)
7a5aa60c341d7f14da337f31a3ed1afcee98bc8avboxsync {
7a5aa60c341d7f14da337f31a3ed1afcee98bc8avboxsync PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[i];
7a5aa60c341d7f14da337f31a3ed1afcee98bc8avboxsync if (pSource->Vhwa.Settings.fFlags & VBOXVHWA_F_ENABLED)
34aaaf212fe61ccafbae15eb832d6062ba548799vboxsync {
d46ee884c41b808b239563b1978468aae12e33a2vboxsync int rc = vboxVhwaHlpGetSurfInfoForSource(pDevExt, pSurf, i);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync AssertRC(rc);
d46ee884c41b808b239563b1978468aae12e33a2vboxsync return rc;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync }
d46ee884c41b808b239563b1978468aae12e33a2vboxsync }
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync AssertBreakpoint();
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync return VERR_NOT_SUPPORTED;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync}
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsyncint vboxVhwaHlpDestroyPrimary(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_SOURCE pSource, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
7a5aa60c341d7f14da337f31a3ed1afcee98bc8avboxsync{
c606fa3531314e32f0ae90495618aeae47418477vboxsync#ifdef VBOXWDDM_RENDER_FROM_SHADOW
c606fa3531314e32f0ae90495618aeae47418477vboxsync PVBOXWDDM_ALLOCATION pFbSurf = pSource->pShadowAllocation;
d46ee884c41b808b239563b1978468aae12e33a2vboxsync#else
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync PVBOXWDDM_ALLOCATION pFbSurf = pSource->pPrimaryAllocation;
d46ee884c41b808b239563b1978468aae12e33a2vboxsync#endif
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync int rc = vboxVhwaHlpDestroySurface(pDevExt, pFbSurf, VidPnSourceId);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync AssertRC(rc);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync return rc;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync}
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
d46ee884c41b808b239563b1978468aae12e33a2vboxsyncint vboxVhwaHlpCreatePrimary(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_SOURCE pSource, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync{
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync#ifdef VBOXWDDM_RENDER_FROM_SHADOW
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync PVBOXWDDM_ALLOCATION pFbSurf = pSource->pShadowAllocation;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync#else
d46ee884c41b808b239563b1978468aae12e33a2vboxsync PVBOXWDDM_ALLOCATION pFbSurf = pSource->pPrimaryAllocation;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync#endif
d46ee884c41b808b239563b1978468aae12e33a2vboxsync Assert(pSource->Vhwa.cOverlaysCreated == 1);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync Assert(pFbSurf->hHostHandle == VBOXVHWA_SURFHANDLE_INVALID);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync if (pFbSurf->hHostHandle != VBOXVHWA_SURFHANDLE_INVALID)
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsync return VERR_INVALID_STATE;
2dad255b092a5659ea0274b9385e2019ad040ea7vboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync int rc = vboxVhwaHlpCreateSurface(pDevExt, pFbSurf,
d46ee884c41b808b239563b1978468aae12e33a2vboxsync VBOXVHWA_SD_PITCH, 0, VBOXVHWA_SCAPS_PRIMARYSURFACE | VBOXVHWA_SCAPS_VIDEOMEMORY | VBOXVHWA_SCAPS_LOCALVIDMEM,
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync VidPnSourceId);
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync AssertRC(rc);
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync return rc;
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync}
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsyncint vboxVhwaHlpCheckInit(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync{
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync Assert(VidPnSourceId < pDevExt->cSources);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync if (VidPnSourceId >= pDevExt->cSources)
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync return VERR_INVALID_PARAMETER;
358a99c385080f7f31166943f3ac3a2aea6b5263vboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[VidPnSourceId];
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync Assert(!!(pSource->Vhwa.Settings.fFlags & VBOXVHWA_F_ENABLED));
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync if (!(pSource->Vhwa.Settings.fFlags & VBOXVHWA_F_ENABLED))
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync return VERR_NOT_SUPPORTED;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync int rc = VINF_SUCCESS;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync /* @todo: need a better synch */
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync uint32_t cNew = ASMAtomicIncU32(&pSource->Vhwa.cOverlaysCreated);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync if (cNew == 1)
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync {
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync rc = vboxVhwaHlpCreatePrimary(pDevExt, pSource, VidPnSourceId);
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync AssertRC(rc);
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync }
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync else
10153a147e7cb38821b5e7404bd2ef6b9af5be4avboxsync {
10153a147e7cb38821b5e7404bd2ef6b9af5be4avboxsync#ifdef VBOXWDDM_RENDER_FROM_SHADOW
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync PVBOXWDDM_ALLOCATION pFbSurf = pSource->pShadowAllocation;
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync#else
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync PVBOXWDDM_ALLOCATION pFbSurf = pSource->pPrimaryAllocation;
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync#endif
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync Assert(pFbSurf->hHostHandle);
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync if (pFbSurf->hHostHandle)
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync rc = VINF_ALREADY_INITIALIZED;
fc148a6b23d25a87561beaffe0ba06c3ba93bf5avboxsync else
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync rc = VERR_INVALID_STATE;
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync }
d46ee884c41b808b239563b1978468aae12e33a2vboxsync
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync if (RT_FAILURE(rc))
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync ASMAtomicDecU32(&pSource->Vhwa.cOverlaysCreated);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync return rc;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync}
358a99c385080f7f31166943f3ac3a2aea6b5263vboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsyncint vboxVhwaHlpCheckTerm(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync{
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync Assert(VidPnSourceId < pDevExt->cSources);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync if (VidPnSourceId >= pDevExt->cSources)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync return VERR_INVALID_PARAMETER;
c8faf7a704e698dec3679d7df43ae55b1bab3eadvboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[VidPnSourceId];
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync Assert(!!(pSource->Vhwa.Settings.fFlags & VBOXVHWA_F_ENABLED));
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync /* @todo: need a better synch */
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync uint32_t cNew = ASMAtomicDecU32(&pSource->Vhwa.cOverlaysCreated);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync int rc = VINF_SUCCESS;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync if (!cNew)
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync {
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync rc = vboxVhwaHlpDestroyPrimary(pDevExt, pSource, VidPnSourceId);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync AssertRC(rc);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync }
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync else
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync {
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync Assert(cNew < UINT32_MAX / 2);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync }
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync return rc;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync}
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsyncint vboxVhwaHlpCreateOverlay(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_ALLOCATION pSurf, uint32_t cBackBuffers, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
d46ee884c41b808b239563b1978468aae12e33a2vboxsync{
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync int rc = vboxVhwaHlpCheckInit(pDevExt, VidPnSourceId);
d46ee884c41b808b239563b1978468aae12e33a2vboxsync AssertRC(rc);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync if (RT_SUCCESS(rc))
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync {
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync rc = vboxVhwaHlpCreateSurface(pDevExt, pSurf,
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync 0, cBackBuffers, VBOXVHWA_SCAPS_OVERLAY | VBOXVHWA_SCAPS_VIDEOMEMORY | VBOXVHWA_SCAPS_LOCALVIDMEM | VBOXVHWA_SCAPS_COMPLEX,
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync VidPnSourceId);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync AssertRC(rc);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync }
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync
358a99c385080f7f31166943f3ac3a2aea6b5263vboxsync return rc;
d46ee884c41b808b239563b1978468aae12e33a2vboxsync}
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsyncint vboxVhwaHlpDestroyOverlay(PDEVICE_EXTENSION pDevExt, PVBOXWDDM_ALLOCATION pSurf, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync{
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync int rc = vboxVhwaHlpDestroySurface(pDevExt, pSurf, VidPnSourceId);
d46ee884c41b808b239563b1978468aae12e33a2vboxsync AssertRC(rc);
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync if (RT_SUCCESS(rc))
fe06619ae576367ff3568e6abd99fb8ad28cc73avboxsync {
d46ee884c41b808b239563b1978468aae12e33a2vboxsync rc = vboxVhwaHlpCheckTerm(pDevExt, VidPnSourceId);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync AssertRC(rc);
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync }
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync return rc;
8cd393943ea52545c4d063f5a94436639f0f80b6vboxsync}
358a99c385080f7f31166943f3ac3a2aea6b5263vboxsync