9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* $Id$ */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/** @file
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VBox WDDM Miniport driver
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/*
c7814cf6e1240a519cbec0441e033d0e2470ed00vboxsync * Copyright (C) 2011-2012 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 "VBoxMPWddm.h"
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include "VBoxMPVhwa.h"
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifndef VBOXVHWA_WITH_SHGSMI
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# include <iprt/semaphore.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# include <iprt/asm.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXVHWA_PRIMARY_ALLOCATION(_pSrc) ((_pSrc)->pPrimaryAllocation)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncDECLINLINE(void) vboxVhwaHdrInit(VBOXVHWACMD* pHdr, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, VBOXVHWACMD_TYPE enmCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memset(pHdr, 0, sizeof(VBOXVHWACMD));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHdr->iDisplay = srcId;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHdr->rc = VERR_GENERAL_FAILURE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHdr->enmCmd = enmCmd;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifndef VBOXVHWA_WITH_SHGSMI
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHdr->cRefs = 1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifdef VBOXVHWA_WITH_SHGSMI
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic int vboxVhwaCommandSubmitHgsmi(struct _DEVICE_EXTENSION* pDevExt, HGSMIOFFSET offDr)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxHGSMIGuestWrite(pDevExt, offDr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncDECLINLINE(void) vbvaVhwaCommandRelease(PVBOXMP_DEVEXT pDevExt, VBOXVHWACMD* pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t cRefs = ASMAtomicDecU32(&pCmd->cRefs);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(cRefs < UINT32_MAX / 2);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(!cRefs)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxHGSMIBufferFree(&VBoxCommonFromDeviceExt(pDevExt)->guestCtx, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncDECLINLINE(void) vbvaVhwaCommandRetain(PVBOXMP_DEVEXT pDevExt, VBOXVHWACMD* pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ASMAtomicIncU32(&pCmd->cRefs);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* do not wait for completion */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vboxVhwaCommandSubmitAsynch(PVBOXMP_DEVEXT pDevExt, VBOXVHWACMD* pCmd, PFNVBOXVHWACMDCOMPLETION pfnCompletion, void * pContext)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmd->GuestVBVAReserved1 = (uintptr_t)pfnCompletion;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmd->GuestVBVAReserved2 = (uintptr_t)pContext;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vbvaVhwaCommandRetain(pDevExt, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxHGSMIBufferSubmit(&VBoxCommonFromDeviceExt(pDevExt)->guestCtx, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(!(pCmd->Flags & VBOXVHWACMD_FLAG_HG_ASYNCH)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync || ((pCmd->Flags & VBOXVHWACMD_FLAG_GH_ASYNCH_NOCOMPLETION)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync && (pCmd->Flags & VBOXVHWACMD_FLAG_HG_ASYNCH_RETURNED)))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* the command is completed */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pfnCompletion(pDevExt, pCmd, pContext);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vbvaVhwaCommandRelease(pDevExt, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic DECLCALLBACK(void) vboxVhwaCompletionSetEvent(PVBOXMP_DEVEXT pDevExt, VBOXVHWACMD * pCmd, void * pvContext)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RTSemEventSignal((RTSEMEVENT)pvContext);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vboxVhwaCommandSubmitAsynchByEvent(PVBOXMP_DEVEXT pDevExt, VBOXVHWACMD* pCmd, RTSEMEVENT hEvent)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaCommandSubmitAsynch(pDevExt, pCmd, vboxVhwaCompletionSetEvent, hEvent);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vboxVhwaCommandCheckCompletion(PVBOXMP_DEVEXT pDevExt)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NTSTATUS Status = vboxWddmCallIsr(pDevExt);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(Status == STATUS_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncVBOXVHWACMD* vboxVhwaCommandCreate(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, VBOXVHWACMD_TYPE enmCmd, VBOXVHWACMD_LENGTH cbCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaCommandCheckCompletion(pDevExt);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifdef VBOXVHWA_WITH_SHGSMI
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD* pHdr = (VBOXVHWACMD*)VBoxSHGSMICommandAlloc(&pDevExt->u.primary.hgsmiAdapterHeap,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync cbCmd + VBOXVHWACMD_HEADSIZE(),
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HGSMI_CH_VBVA,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBVA_VHWA_CMD);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD* pHdr = (VBOXVHWACMD*)VBoxHGSMIBufferAlloc(&VBoxCommonFromDeviceExt(pDevExt)->guestCtx,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync cbCmd + VBOXVHWACMD_HEADSIZE(),
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HGSMI_CH_VBVA,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBVA_VHWA_CMD);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pHdr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!pHdr)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGREL(("VBoxHGSMIBufferAlloc failed"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaHdrInit(pHdr, srcId, enmCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return pHdr;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vboxVhwaCommandFree(PVBOXMP_DEVEXT pDevExt, VBOXVHWACMD* pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifdef VBOXVHWA_WITH_SHGSMI
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxSHGSMICommandFree(&pDevExt->u.primary.hgsmiAdapterHeap, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vbvaVhwaCommandRelease(pDevExt, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint vboxVhwaCommandSubmit(PVBOXMP_DEVEXT pDevExt, VBOXVHWACMD* pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifdef VBOXVHWA_WITH_SHGSMI
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const VBOXSHGSMIHEADER* pHdr = VBoxSHGSMICommandPrepSynch(&pDevExt->u.primary.hgsmiAdapterHeap, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pHdr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = VERR_GENERAL_FAILURE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pHdr)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync do
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HGSMIOFFSET offCmd = VBoxSHGSMICommandOffset(&pDevExt->u.primary.hgsmiAdapterHeap, pHdr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(offCmd != HGSMIOFFSET_VOID);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (offCmd != HGSMIOFFSET_VOID)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = vboxVhwaCommandSubmitHgsmi(pDevExt, offCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxSHGSMICommandDoneSynch(&pDevExt->u.primary.hgsmiAdapterHeap, pHdr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VERR_INVALID_PARAMETER;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* fail to submit, cancel it */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxSHGSMICommandCancelSynch(&pDevExt->u.primary.hgsmiAdapterHeap, pHdr);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync } while (0);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VERR_INVALID_PARAMETER;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RTSEMEVENT hEvent;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = RTSemEventCreate(&hEvent);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmd->Flags |= VBOXVHWACMD_FLAG_GH_ASYNCH_IRQ;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaCommandSubmitAsynchByEvent(pDevExt, pCmd, hEvent);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = RTSemEventWait(hEvent, RT_INDEFINITE_WAIT);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RTSemEventDestroy(hEvent);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifndef VBOXVHWA_WITH_SHGSMI
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic DECLCALLBACK(void) vboxVhwaCompletionFreeCmd(PVBOXMP_DEVEXT pDevExt, VBOXVHWACMD * pCmd, void * pContext)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaCommandFree(pDevExt, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
e6ad2e18e663b076aeabfec994947514566a7accvboxsyncvoid vboxVhwaCompletionListProcess(PVBOXMP_DEVEXT pDevExt, VBOXVTLIST *pList)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
e6ad2e18e663b076aeabfec994947514566a7accvboxsync PVBOXVTLIST_ENTRY pNext, pCur;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (pCur = pList->pFirst; pCur; pCur = pNext)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* need to save next since the command may be released in a pfnCallback and thus its data might be invalid */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pNext = pCur->pNext;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD *pCmd = VBOXVHWA_LISTENTRY2CMD(pCur);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PFNVBOXVHWACMDCOMPLETION pfnCallback = (PFNVBOXVHWACMDCOMPLETION)pCmd->GuestVBVAReserved1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync void *pvCallback = (void*)pCmd->GuestVBVAReserved2;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pfnCallback(pDevExt, pCmd, pvCallback);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vboxVhwaCommandSubmitAsynchAndComplete(PVBOXMP_DEVEXT pDevExt, VBOXVHWACMD* pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifdef VBOXVHWA_WITH_SHGSMI
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# error "port me"
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmd->Flags |= VBOXVHWACMD_FLAG_GH_ASYNCH_NOCOMPLETION;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaCommandSubmitAsynch(pDevExt, pCmd, vboxVhwaCompletionFreeCmd, NULL);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vboxVhwaFreeHostInfo1(PVBOXMP_DEVEXT pDevExt, VBOXVHWACMD_QUERYINFO1* pInfo)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD* pCmd = VBOXVHWACMD_HEAD(pInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaCommandFree(pDevExt, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vboxVhwaFreeHostInfo2(PVBOXMP_DEVEXT pDevExt, VBOXVHWACMD_QUERYINFO2* pInfo)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD* pCmd = VBOXVHWACMD_HEAD(pInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaCommandFree(pDevExt, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncVBOXVHWACMD_QUERYINFO1* vboxVhwaQueryHostInfo1(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD* pCmd = vboxVhwaCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_QUERY_INFO1, sizeof(VBOXVHWACMD_QUERYINFO1));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD_QUERYINFO1 *pInfo1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGREL(("vboxVhwaCommandCreate failed"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo1 = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_QUERYINFO1);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo1->u.in.guestVersion.maj = VBOXVHWA_VERSION_MAJ;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo1->u.in.guestVersion.min = VBOXVHWA_VERSION_MIN;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo1->u.in.guestVersion.bld = VBOXVHWA_VERSION_BLD;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo1->u.in.guestVersion.reserved = VBOXVHWA_VERSION_RSV;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = vboxVhwaCommandSubmit(pDevExt, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(RT_SUCCESS(pCmd->rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_QUERYINFO1);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaCommandFree(pDevExt, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncVBOXVHWACMD_QUERYINFO2* vboxVhwaQueryHostInfo2(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, uint32_t numFourCC)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD* pCmd = vboxVhwaCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_QUERY_INFO2, VBOXVHWAINFO2_SIZE(numFourCC));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD_QUERYINFO2 *pInfo2;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGREL(("vboxVhwaCommandCreate failed"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo2 = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_QUERYINFO2);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo2->numFourCC = numFourCC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = vboxVhwaCommandSubmit(pDevExt, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(pCmd->rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(RT_SUCCESS(pCmd->rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(pInfo2->numFourCC == numFourCC)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return pInfo2;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaCommandFree(pDevExt, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint vboxVhwaEnable(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = VERR_GENERAL_FAILURE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD* pCmd;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmd = vboxVhwaCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_ENABLE, 0);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGREL(("vboxVhwaCommandCreate failed"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = vboxVhwaCommandSubmit(pDevExt, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(pCmd->rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(RT_SUCCESS(pCmd->rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = pCmd->rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaCommandFree(pDevExt, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint vboxVhwaDisable(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaCommandCheckCompletion(pDevExt);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = VERR_GENERAL_FAILURE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD* pCmd;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmd = vboxVhwaCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_DISABLE, 0);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGREL(("vboxVhwaCommandCreate failed"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = vboxVhwaCommandSubmit(pDevExt, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(RT_SUCCESS(pCmd->rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = pCmd->rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaCommandFree(pDevExt, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncDECLINLINE(VOID) vboxVhwaHlpOverlayListInit(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[VidPnSourceId];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSource->cOverlays = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync InitializeListHead(&pSource->OverlayList);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KeInitializeSpinLock(&pSource->OverlayListLock);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void vboxVhwaInitSrc(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(srcId < (D3DDDI_VIDEO_PRESENT_SOURCE_ID)VBoxCommonFromDeviceExt(pDevExt)->cDisplays);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWA_INFO *pSettings = &pDevExt->aSources[srcId].Vhwa.Settings;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memset (pSettings, 0, sizeof (VBOXVHWA_INFO));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaHlpOverlayListInit(pDevExt, srcId);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD_QUERYINFO1* pInfo1 = vboxVhwaQueryHostInfo1(pDevExt, srcId);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pInfo1)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if ((pInfo1->u.out.cfgFlags & VBOXVHWA_CFG_ENABLED)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync && pInfo1->u.out.numOverlays)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if ((pInfo1->u.out.caps & VBOXVHWA_CAPS_OVERLAY)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync && (pInfo1->u.out.caps & VBOXVHWA_CAPS_OVERLAYSTRETCH)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync && (pInfo1->u.out.surfaceCaps & VBOXVHWA_SCAPS_OVERLAY)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync && (pInfo1->u.out.surfaceCaps & VBOXVHWA_SCAPS_FLIP)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync && (pInfo1->u.out.surfaceCaps & VBOXVHWA_SCAPS_LOCALVIDMEM)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync && pInfo1->u.out.numOverlays)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSettings->fFlags |= VBOXVHWA_F_ENABLED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pInfo1->u.out.caps & VBOXVHWA_CAPS_COLORKEY)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pInfo1->u.out.colorKeyCaps & VBOXVHWA_CKEYCAPS_SRCOVERLAY)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSettings->fFlags |= VBOXVHWA_F_CKEY_SRC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* todo: VBOXVHWA_CKEYCAPS_SRCOVERLAYONEACTIVE ? */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pInfo1->u.out.colorKeyCaps & VBOXVHWA_CKEYCAPS_DESTOVERLAY)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSettings->fFlags |= VBOXVHWA_F_CKEY_DST;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* todo: VBOXVHWA_CKEYCAPS_DESTOVERLAYONEACTIVE ? */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSettings->cOverlaysSupported = pInfo1->u.out.numOverlays;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSettings->cFormats = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSettings->aFormats[pSettings->cFormats] = D3DDDIFMT_X8R8G8B8;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ++pSettings->cFormats;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pInfo1->u.out.numFourCC
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync && (pInfo1->u.out.caps & VBOXVHWA_CAPS_OVERLAYFOURCC))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD_QUERYINFO2* pInfo2 = vboxVhwaQueryHostInfo2(pDevExt, srcId, pInfo1->u.out.numFourCC);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pInfo2)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (uint32_t i = 0; i < pInfo2->numFourCC; ++i)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSettings->aFormats[pSettings->cFormats] = (D3DDDIFORMAT)pInfo2->FourCC[i];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ++pSettings->cFormats;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaFreeHostInfo2(pDevExt, pInfo2);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaFreeHostInfo1(pDevExt, pInfo1);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vboxVhwaInit(PVBOXMP_DEVEXT pDevExt)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (int i = 0; i < VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaInitSrc(pDevExt, (D3DDDI_VIDEO_PRESENT_SOURCE_ID)i);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vboxVhwaFree(PVBOXMP_DEVEXT pDevExt)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* we do not allocate/map anything, just issue a Disable command
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * to ensure all pending commands are flushed */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (int i = 0; i < VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaDisable(pDevExt, i);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint vboxVhwaHlpTranslateFormat(VBOXVHWA_PIXELFORMAT *pFormat, D3DDDIFORMAT enmFormat)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pFormat->Reserved = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync switch (enmFormat)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case D3DDDIFMT_A8R8G8B8:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case D3DDDIFMT_X8R8G8B8:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pFormat->flags = VBOXVHWA_PF_RGB;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pFormat->c.rgbBitCount = 32;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pFormat->m1.rgbRBitMask = 0xff0000;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pFormat->m2.rgbGBitMask = 0xff00;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pFormat->m3.rgbBBitMask = 0xff;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* always zero for now */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pFormat->m4.rgbABitMask = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case D3DDDIFMT_R8G8B8:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pFormat->flags = VBOXVHWA_PF_RGB;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pFormat->c.rgbBitCount = 24;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pFormat->m1.rgbRBitMask = 0xff0000;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pFormat->m2.rgbGBitMask = 0xff00;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pFormat->m3.rgbBBitMask = 0xff;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* always zero for now */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pFormat->m4.rgbABitMask = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case D3DDDIFMT_R5G6B5:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pFormat->flags = VBOXVHWA_PF_RGB;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pFormat->c.rgbBitCount = 16;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pFormat->m1.rgbRBitMask = 0xf800;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pFormat->m2.rgbGBitMask = 0x7e0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pFormat->m3.rgbBBitMask = 0x1f;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* always zero for now */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pFormat->m4.rgbABitMask = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case D3DDDIFMT_P8:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case D3DDDIFMT_A8:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case D3DDDIFMT_X1R5G5B5:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case D3DDDIFMT_A1R5G5B5:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case D3DDDIFMT_A4R4G4B4:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case D3DDDIFMT_R3G3B2:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case D3DDDIFMT_A8R3G3B2:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case D3DDDIFMT_X4R4G4B4:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case D3DDDIFMT_A2B10G10R10:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case D3DDDIFMT_A8B8G8R8:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case D3DDDIFMT_X8B8G8R8:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case D3DDDIFMT_G16R16:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case D3DDDIFMT_A2R10G10B10:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case D3DDDIFMT_A16B16G16R16:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case D3DDDIFMT_A8P8:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync default:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t fourcc = vboxWddmFormatToFourcc(enmFormat);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(fourcc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (fourcc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pFormat->flags = VBOXVHWA_PF_FOURCC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pFormat->fourCC = fourcc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VERR_NOT_SUPPORTED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint vboxVhwaHlpDestroySurface(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_ALLOCATION pSurf,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pSurf->hHostHandle);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!pSurf->hHostHandle)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VERR_INVALID_STATE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD* pCmd = vboxVhwaCommandCreate(pDevExt, VidPnSourceId,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD_TYPE_SURF_DESTROY, sizeof(VBOXVHWACMD_SURF_DESTROY));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD_SURF_DESTROY * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_DESTROY);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_DESTROY));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.hSurf = pSurf->hHostHandle;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* we're not interested in completion, just send the command */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaCommandSubmitAsynchAndComplete(pDevExt, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSurf->hHostHandle = VBOXVHWA_SURFHANDLE_INVALID;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VERR_OUT_OF_RESOURCES;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint vboxVhwaHlpPopulateSurInfo(VBOXVHWA_SURFACEDESC *pInfo, PVBOXWDDM_ALLOCATION pSurf,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t fFlags, uint32_t cBackBuffers, uint32_t fSCaps,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memset(pInfo, 0, sizeof(VBOXVHWA_SURFACEDESC));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync if (pSurf->AllocData.Addr.SegmentId != 1)
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync {
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync WARN(("invalid segment id!"));
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync return VERR_INVALID_PARAMETER;
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync }
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync pInfo->height = pSurf->AllocData.SurfDesc.height;
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync pInfo->width = pSurf->AllocData.SurfDesc.width;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo->flags |= VBOXVHWA_SD_HEIGHT | VBOXVHWA_SD_WIDTH;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (fFlags & VBOXVHWA_SD_PITCH)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync pInfo->pitch = pSurf->AllocData.SurfDesc.pitch;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo->flags |= VBOXVHWA_SD_PITCH;
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync pInfo->sizeX = pSurf->AllocData.SurfDesc.cbSize;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo->sizeY = 1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (cBackBuffers)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo->cBackBuffers = cBackBuffers;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo->flags |= VBOXVHWA_SD_BACKBUFFERCOUNT;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo->cBackBuffers = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo->Reserved = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* @todo: color keys */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// pInfo->DstOverlayCK;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// pInfo->DstBltCK;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// pInfo->SrcOverlayCK;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// pInfo->SrcBltCK;
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync int rc = vboxVhwaHlpTranslateFormat(&pInfo->PixelFormat, pSurf->AllocData.SurfDesc.format);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo->flags |= VBOXVHWA_SD_PIXELFORMAT;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo->surfCaps = fSCaps;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo->flags |= VBOXVHWA_SD_CAPS;
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync pInfo->offSurface = pSurf->AllocData.Addr.offVram;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint vboxVhwaHlpCheckApplySurfInfo(PVBOXWDDM_ALLOCATION pSurf, VBOXVHWA_SURFACEDESC *pInfo,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t fFlags, bool bApplyHostHandle)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!(fFlags & VBOXVHWA_SD_PITCH))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* should be set by host */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// Assert(pInfo->flags & VBOXVHWA_SD_PITCH);
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync pSurf->AllocData.SurfDesc.cbSize = pInfo->sizeX * pInfo->sizeY;
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync Assert(pSurf->AllocData.SurfDesc.cbSize);
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync pSurf->AllocData.SurfDesc.pitch = pInfo->pitch;
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync Assert(pSurf->AllocData.SurfDesc.pitch);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* @todo: make this properly */
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync pSurf->AllocData.SurfDesc.bpp = pSurf->AllocData.SurfDesc.pitch * 8 / pSurf->AllocData.SurfDesc.width;
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync Assert(pSurf->AllocData.SurfDesc.bpp);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync Assert(pSurf->AllocData.SurfDesc.cbSize == pInfo->sizeX);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pInfo->sizeY == 1);
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync Assert(pInfo->pitch == pSurf->AllocData.SurfDesc.pitch);
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync if (pSurf->AllocData.SurfDesc.cbSize != pInfo->sizeX
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync || pInfo->sizeY != 1
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync || pInfo->pitch != pSurf->AllocData.SurfDesc.pitch)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VERR_INVALID_PARAMETER;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (bApplyHostHandle && RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pSurf->hHostHandle = pInfo->hSurf;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint vboxVhwaHlpCreateSurface(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_ALLOCATION pSurf,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t fFlags, uint32_t cBackBuffers, uint32_t fSCaps,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* the first thing we need is to post create primary */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD* pCmd = vboxVhwaCommandCreate(pDevExt, VidPnSourceId,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD_TYPE_SURF_CREATE, sizeof(VBOXVHWACMD_SURF_CREATE));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD_SURF_CREATE * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_CREATE);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_CREATE));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = vboxVhwaHlpPopulateSurInfo(&pBody->SurfInfo, pSurf,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync fFlags, cBackBuffers, fSCaps,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VidPnSourceId);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaCommandSubmit(pDevExt, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pCmd->rc == VINF_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(pCmd->rc == VINF_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = vboxVhwaHlpCheckApplySurfInfo(pSurf, &pBody->SurfInfo, fFlags, true);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = pCmd->rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaCommandFree(pDevExt, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VERR_OUT_OF_RESOURCES;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint vboxVhwaHlpGetSurfInfoForSource(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_ALLOCATION pSurf, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* the first thing we need is to post create primary */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD* pCmd = vboxVhwaCommandCreate(pDevExt, VidPnSourceId,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD_TYPE_SURF_GETINFO, sizeof(VBOXVHWACMD_SURF_GETINFO));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD_SURF_GETINFO * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_GETINFO);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_GETINFO));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = vboxVhwaHlpPopulateSurInfo(&pBody->SurfInfo, pSurf,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync 0, 0, VBOXVHWA_SCAPS_OVERLAY | VBOXVHWA_SCAPS_VIDEOMEMORY | VBOXVHWA_SCAPS_LOCALVIDMEM | VBOXVHWA_SCAPS_COMPLEX,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VidPnSourceId);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaCommandSubmit(pDevExt, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pCmd->rc == VINF_SUCCESS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(pCmd->rc == VINF_SUCCESS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = vboxVhwaHlpCheckApplySurfInfo(pSurf, &pBody->SurfInfo, 0, true);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = pCmd->rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaCommandFree(pDevExt, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VERR_OUT_OF_RESOURCES;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint vboxVhwaHlpGetSurfInfo(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_ALLOCATION pSurf)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (int i = 0; i < VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[i];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pSource->Vhwa.Settings.fFlags & VBOXVHWA_F_ENABLED)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = vboxVhwaHlpGetSurfInfoForSource(pDevExt, pSurf, i);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertBreakpoint();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VERR_NOT_SUPPORTED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint vboxVhwaHlpDestroyPrimary(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_SOURCE pSource, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDM_ALLOCATION pFbSurf = VBOXVHWA_PRIMARY_ALLOCATION(pSource);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = vboxVhwaHlpDestroySurface(pDevExt, pFbSurf, VidPnSourceId);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint vboxVhwaHlpCreatePrimary(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_SOURCE pSource, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDM_ALLOCATION pFbSurf = VBOXVHWA_PRIMARY_ALLOCATION(pSource);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pSource->Vhwa.cOverlaysCreated == 1);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pFbSurf->hHostHandle == VBOXVHWA_SURFHANDLE_INVALID);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pFbSurf->hHostHandle != VBOXVHWA_SURFHANDLE_INVALID)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VERR_INVALID_STATE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = vboxVhwaHlpCreateSurface(pDevExt, pFbSurf,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWA_SD_PITCH, 0, VBOXVHWA_SCAPS_PRIMARYSURFACE | VBOXVHWA_SCAPS_VIDEOMEMORY | VBOXVHWA_SCAPS_LOCALVIDMEM,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VidPnSourceId);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint vboxVhwaHlpCheckInit(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(VidPnSourceId < (D3DDDI_VIDEO_PRESENT_SOURCE_ID)VBoxCommonFromDeviceExt(pDevExt)->cDisplays);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (VidPnSourceId >= (D3DDDI_VIDEO_PRESENT_SOURCE_ID)VBoxCommonFromDeviceExt(pDevExt)->cDisplays)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VERR_INVALID_PARAMETER;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[VidPnSourceId];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(!!(pSource->Vhwa.Settings.fFlags & VBOXVHWA_F_ENABLED));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!(pSource->Vhwa.Settings.fFlags & VBOXVHWA_F_ENABLED))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VERR_NOT_SUPPORTED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* @todo: need a better sync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t cNew = ASMAtomicIncU32(&pSource->Vhwa.cOverlaysCreated);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (cNew == 1)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = vboxVhwaEnable(pDevExt, VidPnSourceId);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = vboxVhwaHlpCreatePrimary(pDevExt, pSource, VidPnSourceId);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_FAILURE(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int tmpRc = vboxVhwaDisable(pDevExt, VidPnSourceId);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(tmpRc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDM_ALLOCATION pFbSurf = VBOXVHWA_PRIMARY_ALLOCATION(pSource);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pFbSurf->hHostHandle);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pFbSurf->hHostHandle)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VINF_ALREADY_INITIALIZED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VERR_INVALID_STATE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_FAILURE(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ASMAtomicDecU32(&pSource->Vhwa.cOverlaysCreated);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint vboxVhwaHlpCheckTerm(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(VidPnSourceId < (D3DDDI_VIDEO_PRESENT_SOURCE_ID)VBoxCommonFromDeviceExt(pDevExt)->cDisplays);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (VidPnSourceId >= (D3DDDI_VIDEO_PRESENT_SOURCE_ID)VBoxCommonFromDeviceExt(pDevExt)->cDisplays)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VERR_INVALID_PARAMETER;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[VidPnSourceId];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(!!(pSource->Vhwa.Settings.fFlags & VBOXVHWA_F_ENABLED));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* @todo: need a better sync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t cNew = ASMAtomicDecU32(&pSource->Vhwa.cOverlaysCreated);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!cNew)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = vboxVhwaHlpDestroyPrimary(pDevExt, pSource, VidPnSourceId);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(cNew < UINT32_MAX / 2);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint vboxVhwaHlpOverlayFlip(PVBOXWDDM_OVERLAY pOverlay, const DXGKARG_FLIPOVERLAY *pFlipInfo)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDM_ALLOCATION pAlloc = (PVBOXWDDM_ALLOCATION)pFlipInfo->hSource;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pAlloc->hHostHandle);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pAlloc->pResource);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pAlloc->pResource == pOverlay->pResource);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pFlipInfo->PrivateDriverDataSize == sizeof (VBOXWDDM_OVERLAYFLIP_INFO));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pFlipInfo->pPrivateDriverData);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDM_SOURCE pSource = &pOverlay->pDevExt->aSources[pOverlay->VidPnSourceId];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(!!(pSource->Vhwa.Settings.fFlags & VBOXVHWA_F_ENABLED));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDM_ALLOCATION pFbSurf = VBOXVHWA_PRIMARY_ALLOCATION(pSource);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pFbSurf);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pFbSurf->hHostHandle);
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync Assert(pFbSurf->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pOverlay->pCurentAlloc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pOverlay->pCurentAlloc->pResource == pOverlay->pResource);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pOverlay->pCurentAlloc != pAlloc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = VINF_SUCCESS;
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync if (pFbSurf->AllocData.Addr.SegmentId != 1)
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync {
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync WARN(("invalid segment id on flip"));
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync return VERR_INVALID_PARAMETER;
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync }
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pFlipInfo->PrivateDriverDataSize == sizeof (VBOXWDDM_OVERLAYFLIP_INFO))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDM_OVERLAYFLIP_INFO pOurInfo = (PVBOXWDDM_OVERLAYFLIP_INFO)pFlipInfo->pPrivateDriverData;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD* pCmd = vboxVhwaCommandCreate(pOverlay->pDevExt, pOverlay->VidPnSourceId,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD_TYPE_SURF_FLIP, sizeof(VBOXVHWACMD_SURF_FLIP));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD_SURF_FLIP * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_FLIP);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_FLIP));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// pBody->TargGuestSurfInfo;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// pBody->CurrGuestSurfInfo;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.hTargSurf = pAlloc->hHostHandle;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.offTargSurface = pFlipInfo->SrcPhysicalAddress.QuadPart;
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync pAlloc->AllocData.Addr.offVram = pFlipInfo->SrcPhysicalAddress.QuadPart;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.hCurrSurf = pOverlay->pCurentAlloc->hHostHandle;
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync pBody->u.in.offCurrSurface = pOverlay->pCurentAlloc->AllocData.Addr.offVram;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pOurInfo->DirtyRegion.fFlags & VBOXWDDM_DIRTYREGION_F_VALID)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.xUpdatedTargMemValid = 1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pOurInfo->DirtyRegion.fFlags & VBOXWDDM_DIRTYREGION_F_RECT_VALID)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.xUpdatedTargMemRect = *(VBOXVHWA_RECTL*)((void*)&pOurInfo->DirtyRegion.Rect);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync pBody->u.in.xUpdatedTargMemRect.right = pAlloc->AllocData.SurfDesc.width;
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync pBody->u.in.xUpdatedTargMemRect.bottom = pAlloc->AllocData.SurfDesc.height;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* top & left are zero-inited with the above memset */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* we're not interested in completion, just send the command */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaCommandSubmitAsynchAndComplete(pOverlay->pDevExt, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pOverlay->pCurentAlloc = pAlloc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VERR_OUT_OF_RESOURCES;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VERR_INVALID_PARAMETER;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncAssertCompile(sizeof (RECT) == sizeof (VBOXVHWA_RECTL));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncAssertCompile(RT_SIZEOFMEMB(RECT, left) == RT_SIZEOFMEMB(VBOXVHWA_RECTL, left));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncAssertCompile(RT_SIZEOFMEMB(RECT, right) == RT_SIZEOFMEMB(VBOXVHWA_RECTL, right));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncAssertCompile(RT_SIZEOFMEMB(RECT, top) == RT_SIZEOFMEMB(VBOXVHWA_RECTL, top));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncAssertCompile(RT_SIZEOFMEMB(RECT, bottom) == RT_SIZEOFMEMB(VBOXVHWA_RECTL, bottom));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncAssertCompile(RT_OFFSETOF(RECT, left) == RT_OFFSETOF(VBOXVHWA_RECTL, left));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncAssertCompile(RT_OFFSETOF(RECT, right) == RT_OFFSETOF(VBOXVHWA_RECTL, right));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncAssertCompile(RT_OFFSETOF(RECT, top) == RT_OFFSETOF(VBOXVHWA_RECTL, top));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncAssertCompile(RT_OFFSETOF(RECT, bottom) == RT_OFFSETOF(VBOXVHWA_RECTL, bottom));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint vboxVhwaHlpColorFill(PVBOXWDDM_OVERLAY pOverlay, PVBOXWDDM_DMA_PRIVATEDATA_CLRFILL pCF)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDM_ALLOCATION pAlloc = pCF->ClrFill.Alloc.pAlloc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pAlloc->pResource == pOverlay->pResource);
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync if (pAlloc->AllocData.Addr.SegmentId != 1)
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync {
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync WARN(("invalid segment id on color fill"));
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync return VERR_INVALID_PARAMETER;
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync }
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pAlloc->hHostHandle);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pAlloc->pResource);
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync Assert(pAlloc->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD* pCmd = vboxVhwaCommandCreate(pOverlay->pDevExt, pOverlay->VidPnSourceId,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD_TYPE_SURF_FLIP, RT_OFFSETOF(VBOXVHWACMD_SURF_COLORFILL, u.in.aRects[pCF->ClrFill.Rects.cRects]));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD_SURF_COLORFILL * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_COLORFILL);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_COLORFILL));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.hSurf = pAlloc->hHostHandle;
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync pBody->u.in.offSurface = pAlloc->AllocData.Addr.offVram;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.cRects = pCF->ClrFill.Rects.cRects;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memcpy (pBody->u.in.aRects, pCF->ClrFill.Rects.aRects, pCF->ClrFill.Rects.cRects * sizeof (pCF->ClrFill.Rects.aRects[0]));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaCommandSubmitAsynchAndComplete(pOverlay->pDevExt, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VERR_OUT_OF_RESOURCES;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void vboxVhwaHlpOverlayDstRectSet(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_OVERLAY pOverlay, const RECT *pRect)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[pOverlay->VidPnSourceId];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KIRQL OldIrql;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KeAcquireSpinLock(&pSource->OverlayListLock, &OldIrql);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pOverlay->DstRect = *pRect;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KeReleaseSpinLock(&pSource->OverlayListLock, OldIrql);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void vboxVhwaHlpOverlayListAdd(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_OVERLAY pOverlay)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[pOverlay->VidPnSourceId];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KIRQL OldIrql;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KeAcquireSpinLock(&pSource->OverlayListLock, &OldIrql);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ASMAtomicIncU32(&pSource->cOverlays);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync InsertHeadList(&pSource->OverlayList, &pOverlay->ListEntry);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KeReleaseSpinLock(&pSource->OverlayListLock, OldIrql);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void vboxVhwaHlpOverlayListRemove(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_OVERLAY pOverlay)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[pOverlay->VidPnSourceId];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KIRQL OldIrql;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KeAcquireSpinLock(&pSource->OverlayListLock, &OldIrql);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ASMAtomicDecU32(&pSource->cOverlays);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RemoveEntryList(&pOverlay->ListEntry);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KeReleaseSpinLock(&pSource->OverlayListLock, OldIrql);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncAssertCompile(sizeof (RECT) == sizeof (VBOXVHWA_RECTL));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncAssertCompile(RT_SIZEOFMEMB(RECT, left) == RT_SIZEOFMEMB(VBOXVHWA_RECTL, left));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncAssertCompile(RT_SIZEOFMEMB(RECT, right) == RT_SIZEOFMEMB(VBOXVHWA_RECTL, right));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncAssertCompile(RT_SIZEOFMEMB(RECT, top) == RT_SIZEOFMEMB(VBOXVHWA_RECTL, top));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncAssertCompile(RT_SIZEOFMEMB(RECT, bottom) == RT_SIZEOFMEMB(VBOXVHWA_RECTL, bottom));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncAssertCompile(RT_OFFSETOF(RECT, left) == RT_OFFSETOF(VBOXVHWA_RECTL, left));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncAssertCompile(RT_OFFSETOF(RECT, right) == RT_OFFSETOF(VBOXVHWA_RECTL, right));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncAssertCompile(RT_OFFSETOF(RECT, top) == RT_OFFSETOF(VBOXVHWA_RECTL, top));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncAssertCompile(RT_OFFSETOF(RECT, bottom) == RT_OFFSETOF(VBOXVHWA_RECTL, bottom));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint vboxVhwaHlpOverlayUpdate(PVBOXWDDM_OVERLAY pOverlay, const DXGK_OVERLAYINFO *pOverlayInfo, RECT * pDstUpdateRect)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDM_ALLOCATION pAlloc = (PVBOXWDDM_ALLOCATION)pOverlayInfo->hAllocation;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pAlloc->hHostHandle);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pAlloc->pResource);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pAlloc->pResource == pOverlay->pResource);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pOverlayInfo->PrivateDriverDataSize == sizeof (VBOXWDDM_OVERLAY_INFO));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pOverlayInfo->pPrivateDriverData);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDM_SOURCE pSource = &pOverlay->pDevExt->aSources[pOverlay->VidPnSourceId];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(!!(pSource->Vhwa.Settings.fFlags & VBOXVHWA_F_ENABLED));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDM_ALLOCATION pFbSurf = VBOXVHWA_PRIMARY_ALLOCATION(pSource);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pFbSurf);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pFbSurf->hHostHandle);
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync Assert(pFbSurf->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = VINF_SUCCESS;
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync if (pFbSurf->AllocData.Addr.SegmentId != 1)
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync {
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync WARN(("invalid segment id on overlay update"));
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync return VERR_INVALID_PARAMETER;
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync }
1389294d44ac76b0a25f5655756c9d39855a73efvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pOverlayInfo->PrivateDriverDataSize == sizeof (VBOXWDDM_OVERLAY_INFO))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDM_OVERLAY_INFO pOurInfo = (PVBOXWDDM_OVERLAY_INFO)pOverlayInfo->pPrivateDriverData;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD* pCmd = vboxVhwaCommandCreate(pOverlay->pDevExt, pOverlay->VidPnSourceId,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD_TYPE_SURF_OVERLAY_UPDATE, sizeof(VBOXVHWACMD_SURF_OVERLAY_UPDATE));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD_SURF_OVERLAY_UPDATE * pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_OVERLAY_UPDATE);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_OVERLAY_UPDATE));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.hDstSurf = pFbSurf->hHostHandle;
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync pBody->u.in.offDstSurface = pFbSurf->AllocData.Addr.offVram;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.dstRect = *(VBOXVHWA_RECTL*)((void*)&pOverlayInfo->DstRect);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.hSrcSurf = pAlloc->hHostHandle;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.offSrcSurface = pOverlayInfo->PhysicalAddress.QuadPart;
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync pAlloc->AllocData.Addr.offVram = pOverlayInfo->PhysicalAddress.QuadPart;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.srcRect = *(VBOXVHWA_RECTL*)((void*)&pOverlayInfo->SrcRect);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.flags |= VBOXVHWA_OVER_SHOW;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pOurInfo->OverlayDesc.fFlags & VBOXWDDM_OVERLAY_F_CKEY_DST)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.flags |= VBOXVHWA_OVER_KEYDESTOVERRIDE /* ?? VBOXVHWA_OVER_KEYDEST */;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.desc.DstCK.high = pOurInfo->OverlayDesc.DstColorKeyHigh;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.desc.DstCK.low = pOurInfo->OverlayDesc.DstColorKeyLow;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pOurInfo->OverlayDesc.fFlags & VBOXWDDM_OVERLAY_F_CKEY_SRC)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.flags |= VBOXVHWA_OVER_KEYSRCOVERRIDE /* ?? VBOXVHWA_OVER_KEYSRC */;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.desc.SrcCK.high = pOurInfo->OverlayDesc.SrcColorKeyHigh;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.desc.SrcCK.low = pOurInfo->OverlayDesc.SrcColorKeyLow;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pOurInfo->DirtyRegion.fFlags & VBOXWDDM_DIRTYREGION_F_VALID)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.xFlags |= VBOXVHWACMD_SURF_OVERLAY_UPDATE_F_SRCMEMRECT;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pOurInfo->DirtyRegion.fFlags & VBOXWDDM_DIRTYREGION_F_RECT_VALID)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.xUpdatedSrcMemRect = *(VBOXVHWA_RECTL*)((void*)&pOurInfo->DirtyRegion.Rect);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync pBody->u.in.xUpdatedSrcMemRect.right = pAlloc->AllocData.SurfDesc.width;
73ba84f95f918cc170be38908ad240fbb2f8f354vboxsync pBody->u.in.xUpdatedSrcMemRect.bottom = pAlloc->AllocData.SurfDesc.height;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* top & left are zero-inited with the above memset */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pDstUpdateRect)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.xFlags |= VBOXVHWACMD_SURF_OVERLAY_UPDATE_F_DSTMEMRECT;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pBody->u.in.xUpdatedDstMemRect = *(VBOXVHWA_RECTL*)((void*)pDstUpdateRect);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* we're not interested in completion, just send the command */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaCommandSubmitAsynchAndComplete(pOverlay->pDevExt, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pOverlay->pCurentAlloc = pAlloc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaHlpOverlayDstRectSet(pOverlay->pDevExt, pOverlay, &pOverlayInfo->DstRect);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VERR_OUT_OF_RESOURCES;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VERR_INVALID_PARAMETER;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint vboxVhwaHlpOverlayUpdate(PVBOXWDDM_OVERLAY pOverlay, const DXGK_OVERLAYINFO *pOverlayInfo)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return vboxVhwaHlpOverlayUpdate(pOverlay, pOverlayInfo, NULL);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint vboxVhwaHlpOverlayDestroy(PVBOXWDDM_OVERLAY pOverlay)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaHlpOverlayListRemove(pOverlay->pDevExt, pOverlay);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (uint32_t i = 0; i < pOverlay->pResource->cAllocations; ++i)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDM_ALLOCATION pCurAlloc = &pOverlay->pResource->aAllocations[i];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = vboxVhwaHlpDestroySurface(pOverlay->pDevExt, pCurAlloc, pOverlay->VidPnSourceId);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int tmpRc = vboxVhwaHlpCheckTerm(pOverlay->pDevExt, pOverlay->VidPnSourceId);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(tmpRc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint vboxVhwaHlpOverlayCreate(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, DXGK_OVERLAYINFO *pOverlayInfo,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* OUT */ PVBOXWDDM_OVERLAY pOverlay)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = vboxVhwaHlpCheckInit(pDevExt, VidPnSourceId);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDM_ALLOCATION pAlloc = (PVBOXWDDM_ALLOCATION)pOverlayInfo->hAllocation;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDM_RESOURCE pRc = pAlloc->pResource;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pRc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (uint32_t i = 0; i < pRc->cAllocations; ++i)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDM_ALLOCATION pCurAlloc = &pRc->aAllocations[i];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = vboxVhwaHlpCreateSurface(pDevExt, pCurAlloc,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync 0, pRc->cAllocations - 1, VBOXVHWA_SCAPS_OVERLAY | VBOXVHWA_SCAPS_VIDEOMEMORY | VBOXVHWA_SCAPS_LOCALVIDMEM | VBOXVHWA_SCAPS_COMPLEX,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VidPnSourceId);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int tmpRc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (uint32_t j = 0; j < i; ++j)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDM_ALLOCATION pDestroyAlloc = &pRc->aAllocations[j];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync tmpRc = vboxVhwaHlpDestroySurface(pDevExt, pDestroyAlloc, VidPnSourceId);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(tmpRc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pOverlay->pDevExt = pDevExt;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pOverlay->pResource = pRc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pOverlay->VidPnSourceId = VidPnSourceId;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaHlpOverlayListAdd(pDevExt, pOverlay);
359416647a711739d1b14addbf399178949a1a60vboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RECT DstRect;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxVhwaHlpOverlayDstRectGet(pDevExt, pOverlay, &DstRect);
359416647a711739d1b14addbf399178949a1a60vboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = vboxVhwaHlpOverlayUpdate(pOverlay, pOverlayInfo, DstRect.right ? &DstRect : NULL);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int tmpRc = vboxVhwaHlpOverlayDestroy(pOverlay);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(tmpRc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_FAILURE(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int tmpRc = vboxVhwaHlpCheckTerm(pDevExt, VidPnSourceId);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(tmpRc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync AssertRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOLEAN vboxVhwaHlpOverlayListIsEmpty(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[VidPnSourceId];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return !ASMAtomicReadU32(&pSource->cOverlays);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXWDDM_OVERLAY_FROM_ENTRY(_pEntry) ((PVBOXWDDM_OVERLAY)(((uint8_t*)(_pEntry)) - RT_OFFSETOF(VBOXWDDM_OVERLAY, ListEntry)))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vboxVhwaHlpOverlayDstRectUnion(PVBOXMP_DEVEXT pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, RECT *pRect)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (vboxVhwaHlpOverlayListIsEmpty(pDevExt, VidPnSourceId))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memset(pRect, 0, sizeof (*pRect));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[VidPnSourceId];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KIRQL OldIrql;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KeAcquireSpinLock(&pSource->OverlayListLock, &OldIrql);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pSource->cOverlays)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDM_OVERLAY pOverlay = VBOXWDDM_OVERLAY_FROM_ENTRY(pSource->OverlayList.Flink);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *pRect = pOverlay->DstRect;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync while (pOverlay->ListEntry.Flink != &pSource->OverlayList)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pOverlay = VBOXWDDM_OVERLAY_FROM_ENTRY(pOverlay->ListEntry.Flink);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync vboxWddmRectUnite(pRect, &pOverlay->DstRect);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KeReleaseSpinLock(&pSource->OverlayListLock, OldIrql);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid vboxVhwaHlpOverlayDstRectGet(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_OVERLAY pOverlay, RECT *pRect)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[pOverlay->VidPnSourceId];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KIRQL OldIrql;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KeAcquireSpinLock(&pSource->OverlayListLock, &OldIrql);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *pRect = pOverlay->DstRect;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync KeReleaseSpinLock(&pSource->OverlayListLock, OldIrql);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}