9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* $Id$ */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/** @file
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VBox XPDM Display driver
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/*
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Copyright (C) 2011 Oracle Corporation
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * available from http://www.virtualbox.org. This file is free software;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * you can redistribute it and/or modify it under the terms of the GNU
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * General Public License (GPL) as published by the Free Software
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include "VBoxDisp.h"
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include "VBoxDispMini.h"
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <iprt/asm.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <iprt/asm-amd64-x86.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void VBoxDispVHWACommandFree(PVBOXDISPDEV pDev, VBOXVHWACMD* pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxHGSMIBufferFree(&pDev->hgsmi.ctx, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void VBoxDispVHWACommandRetain(PVBOXDISPDEV pDev, VBOXVHWACMD* pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ASMAtomicIncU32(&pCmd->cRefs);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void VBoxDispVHWACommandSubmitAsynchByEvent(PVBOXDISPDEV pDev, VBOXVHWACMD* pCmd, VBOXPEVENT pEvent)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmd->GuestVBVAReserved1 = (uintptr_t)pEvent;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmd->GuestVBVAReserved2 = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* ensure the command is not removed until we're processing it */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWACommandRetain(pDev, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* complete it asynchronously by setting event */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmd->Flags |= VBOXVHWACMD_FLAG_GH_ASYNCH_EVENT;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxHGSMIBufferSubmit(&pDev->hgsmi.ctx, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(!(ASMAtomicReadU32((volatile uint32_t *)&pCmd->Flags) & VBOXVHWACMD_FLAG_HG_ASYNCH))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* the command is completed */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDev->vpAPI.VideoPortProcs.pfnSetEvent(pDev->vpAPI.pContext, pEvent);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWACommandRelease(pDev, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void VBoxDispVHWAHanldeVHWACmdCompletion(PVBOXDISPDEV pDev, VBVAHOSTCMD * pHostCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBVAHOSTCMDVHWACMDCOMPLETE * pComplete = VBVAHOSTCMD_BODY(pHostCmd, VBVAHOSTCMDVHWACMDCOMPLETE);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD* pComplCmd = (VBOXVHWACMD*)HGSMIOffsetToPointer(&pDev->hgsmi.ctx.heapCtx.area, pComplete->offCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PFNVBOXVHWACMDCOMPLETION pfnCompletion = (PFNVBOXVHWACMDCOMPLETION)pComplCmd->GuestVBVAReserved1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync void *pContext = (void *)pComplCmd->GuestVBVAReserved2;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pfnCompletion(pDev, pComplCmd, pContext);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVBVAHostCommandComplete(pDev, pHostCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic void VBoxVHWAHostCommandHandler(PVBOXDISPDEV pDev, VBVAHOSTCMD * pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync switch(pCmd->customOpCode)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VBVAHG_DCUSTOM_VHWA_CMDCOMPLETE:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWAHanldeVHWACmdCompletion(pDev, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync default:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVBVAHostCommandComplete(pDev, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid VBoxDispVHWAInit(PVBOXDISPDEV pDev)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VHWAQUERYINFO info;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VBoxDispMPVHWAQueryInfo(pDev->hDriver, &info);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOX_WARNRC(rc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDev->vhwa.offVramBase = info.offVramBase;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint VBoxDispVHWAEnable(PVBOXDISPDEV pDev)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = VERR_GENERAL_FAILURE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD* pCmd;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!pDev->hgsmi.bSupported)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VERR_NOT_SUPPORTED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmd = VBoxDispVHWACommandCreate(pDev, VBOXVHWACMD_TYPE_ENABLE, 0);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("VBoxDispVHWACommandCreate failed"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(VBoxDispVHWACommandSubmit(pDev, pCmd))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(RT_SUCCESS(pCmd->rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWACommandRelease(pDev, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncVBOXVHWACMD* VBoxDispVHWACommandCreate(PVBOXDISPDEV pDev, VBOXVHWACMD_TYPE enmCmd, VBOXVHWACMD_LENGTH cbCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD* pHdr = (VBOXVHWACMD*)VBoxHGSMIBufferAlloc(&pDev->hgsmi.ctx,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync cbCmd + VBOXVHWACMD_HEADSIZE(),
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HGSMI_CH_VBVA,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBVA_VHWA_CMD);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!pHdr)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("HGSMIHeapAlloc failed"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memset(pHdr, 0, sizeof(VBOXVHWACMD));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHdr->iDisplay = pDev->iDevice;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHdr->rc = VERR_GENERAL_FAILURE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHdr->enmCmd = enmCmd;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pHdr->cRefs = 1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* @todo: temporary hack */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWACommandCheckHostCmds(pDev);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return pHdr;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid VBoxDispVHWACommandRelease(PVBOXDISPDEV pDev, VBOXVHWACMD* pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t cRefs = ASMAtomicDecU32(&pCmd->cRefs);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(cRefs < UINT32_MAX / 2);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(!cRefs)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWACommandFree(pDev, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOL VBoxDispVHWACommandSubmit(PVBOXDISPDEV pDev, VBOXVHWACMD* pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXPEVENT pEvent;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVP_STATUS rc = pDev->vpAPI.VideoPortProcs.pfnCreateEvent(pDev->vpAPI.pContext, VBOXNOTIFICATION_EVENT, NULL, &pEvent);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* don't assert here, otherwise NT4 will be unhappy */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(rc == VBOXNO_ERROR)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmd->Flags |= VBOXVHWACMD_FLAG_GH_ASYNCH_IRQ;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWACommandSubmitAsynchByEvent(pDev, pCmd, pEvent);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = pDev->vpAPI.VideoPortProcs.pfnWaitForSingleObject(pDev->vpAPI.pContext, pEvent,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync NULL /*IN PLARGE_INTEGER pTimeOut*/
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync );
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(rc == VBOXNO_ERROR);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(rc == VBOXNO_ERROR)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDev->vpAPI.VideoPortProcs.pfnDeleteEvent(pDev->vpAPI.pContext, pEvent);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc == VBOXNO_ERROR;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid VBoxDispVHWACommandCheckHostCmds(PVBOXDISPDEV pDev)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBVAHOSTCMD *pCmd, *pNextCmd;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = pDev->hgsmi.mp.pfnRequestCommandsHandler(pDev->hgsmi.mp.hContext, HGSMI_CH_VBVA, pDev->iDevice, &pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* don't assert here, otherwise NT4 will be unhappy */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for(;pCmd; pCmd = pNextCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pNextCmd = pCmd->u.pNext;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxVHWAHostCommandHandler(pDev, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic DECLCALLBACK(void) VBoxDispVHWACommandCompletionCallbackEvent(PVBOXDISPDEV pDev, VBOXVHWACMD * pCmd, void * pContext)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXPEVENT pEvent = (VBOXPEVENT)pContext;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LONG oldState = pDev->vpAPI.VideoPortProcs.pfnSetEvent(pDev->vpAPI.pContext, pEvent);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(!oldState);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* do not wait for completion */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid VBoxDispVHWACommandSubmitAsynch (PVBOXDISPDEV pDev, VBOXVHWACMD* pCmd, PFNVBOXVHWACMDCOMPLETION pfnCompletion, void * pContext)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmd->GuestVBVAReserved1 = (uintptr_t)pfnCompletion;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmd->GuestVBVAReserved2 = (uintptr_t)pContext;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWACommandRetain(pDev, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxHGSMIBufferSubmit(&pDev->hgsmi.ctx, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(!(pCmd->Flags & VBOXVHWACMD_FLAG_HG_ASYNCH))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* the command is completed */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pfnCompletion(pDev, pCmd, pContext);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWACommandRelease(pDev, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstatic DECLCALLBACK(void) VBoxDispVHWAFreeCmdCompletion(PVBOXDISPDEV pDev, VBOXVHWACMD * pCmd, void * pContext)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWACommandRelease(pDev, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid VBoxDispVHWACommandSubmitAsynchAndComplete (PVBOXDISPDEV pDev, VBOXVHWACMD* pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmd->GuestVBVAReserved1 = (uintptr_t)VBoxDispVHWAFreeCmdCompletion;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWACommandRetain(pDev, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmd->Flags |= VBOXVHWACMD_FLAG_GH_ASYNCH_NOCOMPLETION;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxHGSMIBufferSubmit(&pDev->hgsmi.ctx, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(!(pCmd->Flags & VBOXVHWACMD_FLAG_HG_ASYNCH)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync || pCmd->Flags & VBOXVHWACMD_FLAG_HG_ASYNCH_RETURNED)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* the command is completed */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWAFreeCmdCompletion(pDev, pCmd, NULL);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWACommandRelease(pDev, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid VBoxDispVHWAFreeHostInfo1(PVBOXDISPDEV pDev, VBOXVHWACMD_QUERYINFO1* pInfo)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD* pCmd = VBOXVHWACMD_HEAD(pInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWACommandRelease(pDev, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid VBoxDispVHWAFreeHostInfo2(PVBOXDISPDEV pDev, VBOXVHWACMD_QUERYINFO2* pInfo)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD* pCmd = VBOXVHWACMD_HEAD(pInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWACommandRelease(pDev, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncVBOXVHWACMD_QUERYINFO1* VBoxDispVHWAQueryHostInfo1(PVBOXDISPDEV pDev)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD* pCmd = VBoxDispVHWACommandCreate (pDev, VBOXVHWACMD_TYPE_QUERY_INFO1, sizeof(VBOXVHWACMD_QUERYINFO1));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD_QUERYINFO1 *pInfo1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("VBoxDispVHWACommandCreate 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 if(VBoxDispVHWACommandSubmit (pDev, pCmd))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(RT_SUCCESS(pCmd->rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_QUERYINFO1);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWACommandRelease(pDev, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncVBOXVHWACMD_QUERYINFO2* VBoxDispVHWAQueryHostInfo2(PVBOXDISPDEV pDev, uint32_t numFourCC)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD* pCmd = VBoxDispVHWACommandCreate (pDev, VBOXVHWACMD_TYPE_QUERY_INFO2, VBOXVHWAINFO2_SIZE(numFourCC));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD_QUERYINFO2 *pInfo2;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("VBoxDispVHWACommandCreate failed"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo2 = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_QUERYINFO2);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo2->numFourCC = numFourCC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(VBoxDispVHWACommandSubmit (pDev, pCmd))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(RT_SUCCESS(pCmd->rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(pInfo2->numFourCC == numFourCC)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return pInfo2;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWACommandRelease(pDev, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint VBoxDispVHWAInitHostInfo1(PVBOXDISPDEV pDev)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD_QUERYINFO1* pInfo;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!pDev->hgsmi.bSupported)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VERR_NOT_SUPPORTED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo = VBoxDispVHWAQueryHostInfo1(pDev);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(!pInfo)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDev->vhwa.bEnabled = false;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VERR_OUT_OF_RESOURCES;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDev->vhwa.caps = pInfo->u.out.caps;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDev->vhwa.caps2 = pInfo->u.out.caps2;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDev->vhwa.colorKeyCaps = pInfo->u.out.colorKeyCaps;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDev->vhwa.stretchCaps = pInfo->u.out.stretchCaps;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDev->vhwa.surfaceCaps = pInfo->u.out.surfaceCaps;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDev->vhwa.numOverlays = pInfo->u.out.numOverlays;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDev->vhwa.numFourCC = pInfo->u.out.numFourCC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDev->vhwa.bEnabled = (pInfo->u.out.cfgFlags & VBOXVHWA_CFG_ENABLED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWAFreeHostInfo1(pDev, pInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint VBoxDispVHWAInitHostInfo2(PVBOXDISPDEV pDev, DWORD *pFourCC)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD_QUERYINFO2* pInfo;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!pDev->hgsmi.bSupported)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VERR_NOT_SUPPORTED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo = VBoxDispVHWAQueryHostInfo2(pDev, pDev->vhwa.numFourCC);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(pInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(!pInfo)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VERR_OUT_OF_RESOURCES;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(pDev->vhwa.numFourCC)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memcpy(pFourCC, pInfo->FourCC, pDev->vhwa.numFourCC * sizeof(pFourCC[0]));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(0);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VERR_GENERAL_FAILURE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWAFreeHostInfo2(pDev, pInfo);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint VBoxDispVHWADisable(PVBOXDISPDEV pDev)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = VERR_GENERAL_FAILURE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWACMD* pCmd;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!pDev->hgsmi.bSupported)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VERR_NOT_SUPPORTED;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCmd = VBoxDispVHWACommandCreate (pDev, VBOXVHWACMD_TYPE_DISABLE, 0);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!pCmd)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("VBoxDispVHWACommandCreate failed"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(VBoxDispVHWACommandSubmit (pDev, pCmd))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(RT_SUCCESS(pCmd->rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWACommandRelease(pDev, pCmd);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWACommandCheckHostCmds(pDev);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define MEMTAG 'AWHV'
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncPVBOXVHWASURFDESC VBoxDispVHWASurfDescAlloc()
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return (PVBOXVHWASURFDESC) EngAllocMem(FL_NONPAGED_MEMORY | FL_ZERO_MEMORY, sizeof(VBOXVHWASURFDESC), MEMTAG);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid VBoxDispVHWASurfDescFree(PVBOXVHWASURFDESC pDesc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync EngFreeMem(pDesc);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint64_t VBoxDispVHWAVramOffsetFromPDEV(PVBOXDISPDEV pDev, ULONG_PTR offPdev)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return (uint64_t)(pDev->vhwa.offVramBase + offPdev);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOX_DD(_f) DD##_f
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOX_VHWA(_f) VBOXVHWA_##_f
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOX_DD2VHWA(_out, _in, _f) do {if((_in) & VBOX_DD(_f)) _out |= VBOX_VHWA(_f); }while(0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOX_DD_VHWA_PAIR(_v) {VBOX_DD(_v), VBOX_VHWA(_v)}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOX_DD_DUMMY_PAIR(_v) {VBOX_DD(_v), 0}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXVHWA_SUPPORTED_CAPS ( \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWA_CAPS_BLT \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CAPS_BLTCOLORFILL \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CAPS_BLTFOURCC \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CAPS_BLTSTRETCH \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CAPS_BLTQUEUE \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CAPS_OVERLAY \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CAPS_OVERLAYFOURCC \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CAPS_OVERLAYSTRETCH \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CAPS_OVERLAYCANTCLIP \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CAPS_COLORKEY \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CAPS_COLORKEYHWASSIST \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync )
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXVHWA_SUPPORTED_SCAPS ( \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWA_SCAPS_BACKBUFFER \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_SCAPS_COMPLEX \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_SCAPS_FLIP \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_SCAPS_FRONTBUFFER \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_SCAPS_OFFSCREENPLAIN \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_SCAPS_OVERLAY \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_SCAPS_PRIMARYSURFACE \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_SCAPS_SYSTEMMEMORY \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_SCAPS_VIDEOMEMORY \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_SCAPS_VISIBLE \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_SCAPS_LOCALVIDMEM \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync )
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXVHWA_SUPPORTED_SCAPS2 ( \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWA_CAPS2_CANRENDERWINDOWED \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CAPS2_WIDESURFACES \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CAPS2_COPYFOURCC \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync )
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXVHWA_SUPPORTED_PF ( \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWA_PF_PALETTEINDEXED8 \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_PF_RGB \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_PF_RGBTOYUV \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_PF_YUV \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_PF_FOURCC \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync )
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXVHWA_SUPPORTED_SD ( \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWA_SD_BACKBUFFERCOUNT \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_SD_CAPS \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_SD_CKDESTBLT \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_SD_CKDESTOVERLAY \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_SD_CKSRCBLT \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_SD_CKSRCOVERLAY \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_SD_HEIGHT \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_SD_PITCH \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_SD_PIXELFORMAT \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_SD_WIDTH \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync )
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXVHWA_SUPPORTED_CKEYCAPS ( \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWA_CKEYCAPS_DESTBLT \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CKEYCAPS_DESTBLTCLRSPACE \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CKEYCAPS_DESTBLTCLRSPACEYUV \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CKEYCAPS_DESTBLTYUV \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CKEYCAPS_DESTOVERLAY \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CKEYCAPS_DESTOVERLAYCLRSPACE \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CKEYCAPS_DESTOVERLAYCLRSPACEYUV \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CKEYCAPS_DESTOVERLAYONEACTIVE \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CKEYCAPS_DESTOVERLAYYUV \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CKEYCAPS_SRCBLT \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CKEYCAPS_SRCBLTCLRSPACE \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CKEYCAPS_SRCBLTCLRSPACEYUV \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CKEYCAPS_SRCBLTYUV \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CKEYCAPS_SRCOVERLAY \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CKEYCAPS_SRCOVERLAYCLRSPACE \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CKEYCAPS_SRCOVERLAYCLRSPACEYUV \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CKEYCAPS_SRCOVERLAYONEACTIVE \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CKEYCAPS_SRCOVERLAYYUV \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CKEYCAPS_NOCOSTOVERLAY \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync )
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXVHWA_SUPPORTED_CKEY ( \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWA_CKEY_COLORSPACE \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CKEY_DESTBLT \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CKEY_DESTOVERLAY \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CKEY_SRCBLT \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_CKEY_SRCOVERLAY \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync )
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXVHWA_SUPPORTED_OVER ( \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXVHWA_OVER_DDFX \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_OVER_HIDE \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_OVER_KEYDEST \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_OVER_KEYDESTOVERRIDE \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_OVER_KEYSRC \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_OVER_KEYSRCOVERRIDE \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync | VBOXVHWA_OVER_SHOW \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync )
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWAUnsupportedDDCAPS(uint32_t caps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return caps & (~VBOXVHWA_SUPPORTED_CAPS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWAUnsupportedDDSCAPS(uint32_t caps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return caps & (~VBOXVHWA_SUPPORTED_SCAPS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWAUnsupportedDDPFS(uint32_t caps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return caps & (~VBOXVHWA_SUPPORTED_PF);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWAUnsupportedDSS(uint32_t caps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return caps & (~VBOXVHWA_SUPPORTED_SD);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWAUnsupportedDDCEYCAPS(uint32_t caps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return caps & (~VBOXVHWA_SUPPORTED_CKEYCAPS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWASupportedDDCEYCAPS(uint32_t caps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return caps & (VBOXVHWA_SUPPORTED_CKEYCAPS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWASupportedDDCAPS(uint32_t caps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return caps & (VBOXVHWA_SUPPORTED_CAPS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWASupportedDDSCAPS(uint32_t caps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return caps & (VBOXVHWA_SUPPORTED_SCAPS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWASupportedDDPFS(uint32_t caps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return caps & (VBOXVHWA_SUPPORTED_PF);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWASupportedDSS(uint32_t caps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return caps & (VBOXVHWA_SUPPORTED_SD);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWASupportedOVERs(uint32_t caps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return caps & (VBOXVHWA_SUPPORTED_OVER);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWAUnsupportedOVERs(uint32_t caps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return caps & (~VBOXVHWA_SUPPORTED_OVER);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWASupportedCKEYs(uint32_t caps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return caps & (VBOXVHWA_SUPPORTED_CKEY);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWAUnsupportedCKEYs(uint32_t caps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return caps & (~VBOXVHWA_SUPPORTED_CKEY);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWAFromDDOVERs(uint32_t caps) { return caps; }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWAToDDOVERs(uint32_t caps) { return caps; }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWAFromDDCKEYs(uint32_t caps) { return caps; }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWAToDDCKEYs(uint32_t caps) { return caps; }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWAFromDDCAPS(uint32_t caps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return caps;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWAToDDCAPS(uint32_t caps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return caps;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWAFromDDCAPS2(uint32_t caps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return caps;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWAToDDCAPS2(uint32_t caps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return caps;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWAFromDDSCAPS(uint32_t caps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return caps;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWAToDDSCAPS(uint32_t caps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return caps;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWAFromDDPFS(uint32_t caps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return caps;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWAToDDPFS(uint32_t caps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return caps;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWAFromDDCKEYCAPS(uint32_t caps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return caps;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWAToDDCKEYCAPS(uint32_t caps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return caps;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWAToDDBLTs(uint32_t caps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return caps;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxDispVHWAFromDDBLTs(uint32_t caps)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return caps;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid VBoxDispVHWAFromDDCOLORKEY(VBOXVHWA_COLORKEY *pVHWACKey, DDCOLORKEY *pDdCKey)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVHWACKey->low = pDdCKey->dwColorSpaceLowValue;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVHWACKey->high = pDdCKey->dwColorSpaceHighValue;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid VBoxDispVHWAFromDDOVERLAYFX(VBOXVHWA_OVERLAYFX *pVHWAOverlay, DDOVERLAYFX *pDdOverlay)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync //TODO: fxFlags
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWAFromDDCOLORKEY(&pVHWAOverlay->DstCK, &pDdOverlay->dckDestColorkey);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWAFromDDCOLORKEY(&pVHWAOverlay->SrcCK, &pDdOverlay->dckSrcColorkey);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid VBoxDispVHWAFromDDBLTFX(VBOXVHWA_BLTFX *pVHWABlt, DDBLTFX *pDdBlt)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVHWABlt->fillColor = pDdBlt->dwFillColor;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWAFromDDCOLORKEY(&pVHWABlt->DstCK, &pDdBlt->ddckDestColorkey);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWAFromDDCOLORKEY(&pVHWABlt->SrcCK, &pDdBlt->ddckSrcColorkey);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint VBoxDispVHWAFromDDPIXELFORMAT(VBOXVHWA_PIXELFORMAT *pVHWAFormat, DDPIXELFORMAT *pDdFormat)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t unsup = VBoxDispVHWAUnsupportedDDPFS(pDdFormat->dwFlags);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(!unsup);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(unsup)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VERR_GENERAL_FAILURE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVHWAFormat->flags = VBoxDispVHWAFromDDPFS(pDdFormat->dwFlags);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVHWAFormat->fourCC = pDdFormat->dwFourCC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVHWAFormat->c.rgbBitCount = pDdFormat->dwRGBBitCount;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVHWAFormat->m1.rgbRBitMask = pDdFormat->dwRBitMask;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVHWAFormat->m2.rgbGBitMask = pDdFormat->dwGBitMask;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVHWAFormat->m3.rgbBBitMask = pDdFormat->dwBBitMask;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint VBoxDispVHWAFromDDSURFACEDESC(VBOXVHWA_SURFACEDESC *pVHWADesc, DDSURFACEDESC *pDdDesc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t unsupds = VBoxDispVHWAUnsupportedDSS(pDdDesc->dwFlags);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(!unsupds);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(unsupds)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VERR_GENERAL_FAILURE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVHWADesc->flags = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(pDdDesc->dwFlags & DDSD_BACKBUFFERCOUNT)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVHWADesc->flags |= VBOXVHWA_SD_BACKBUFFERCOUNT;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVHWADesc->cBackBuffers = pDdDesc->dwBackBufferCount;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(pDdDesc->dwFlags & DDSD_CAPS)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint32_t unsup = VBoxDispVHWAUnsupportedDDSCAPS(pDdDesc->ddsCaps.dwCaps);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync Assert(!unsup);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(unsup)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VERR_GENERAL_FAILURE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVHWADesc->flags |= VBOXVHWA_SD_CAPS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVHWADesc->surfCaps = VBoxDispVHWAFromDDSCAPS(pDdDesc->ddsCaps.dwCaps);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(pDdDesc->dwFlags & DDSD_CKDESTBLT)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVHWADesc->flags |= VBOXVHWA_SD_CKDESTBLT;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWAFromDDCOLORKEY(&pVHWADesc->DstBltCK, &pDdDesc->ddckCKDestBlt);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(pDdDesc->dwFlags & DDSD_CKDESTOVERLAY)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVHWADesc->flags |= VBOXVHWA_SD_CKDESTOVERLAY;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWAFromDDCOLORKEY(&pVHWADesc->DstOverlayCK, &pDdDesc->ddckCKDestOverlay);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(pDdDesc->dwFlags & DDSD_CKSRCBLT)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVHWADesc->flags |= VBOXVHWA_SD_CKSRCBLT;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWAFromDDCOLORKEY(&pVHWADesc->SrcBltCK, &pDdDesc->ddckCKSrcBlt);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(pDdDesc->dwFlags & DDSD_CKSRCOVERLAY)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVHWADesc->flags |= VBOXVHWA_SD_CKSRCOVERLAY;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWAFromDDCOLORKEY(&pVHWADesc->SrcOverlayCK, &pDdDesc->ddckCKSrcOverlay);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(pDdDesc->dwFlags & DDSD_HEIGHT)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVHWADesc->flags |= VBOXVHWA_SD_HEIGHT;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVHWADesc->height = pDdDesc->dwHeight;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(pDdDesc->dwFlags & DDSD_WIDTH)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVHWADesc->flags |= VBOXVHWA_SD_WIDTH;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVHWADesc->width = pDdDesc->dwWidth;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(pDdDesc->dwFlags & DDSD_PITCH)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVHWADesc->flags |= VBOXVHWA_SD_PITCH;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVHWADesc->pitch = pDdDesc->lPitch;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(pDdDesc->dwFlags & DDSD_PIXELFORMAT)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = VBoxDispVHWAFromDDPIXELFORMAT(&pVHWADesc->PixelFormat, &pDdDesc->ddpfPixelFormat);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(RT_FAILURE(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pVHWADesc->flags |= VBOXVHWA_SD_PIXELFORMAT;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VINF_SUCCESS;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid VBoxDispVHWAFromRECTL(VBOXVHWA_RECTL *pDst, RECTL *pSrc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDst->left = pSrc->left;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDst->top = pSrc->top;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDst->right = pSrc->right;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDst->bottom = pSrc->bottom;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define MIN(_a, _b) (_a) < (_b) ? (_a) : (_b)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define MAX(_a, _b) (_a) > (_b) ? (_a) : (_b)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid VBoxDispVHWARectUnited(RECTL * pDst, RECTL * pRect1, RECTL * pRect2)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDst->left = MIN(pRect1->left, pRect2->left);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDst->top = MIN(pRect1->top, pRect2->top);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDst->right = MAX(pRect1->right, pRect2->right);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pDst->bottom = MAX(pRect1->bottom, pRect2->bottom);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncbool VBoxDispVHWARectIsEmpty(RECTL * pRect)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return pRect->left == pRect->right-1 && pRect->top == pRect->bottom-1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncbool VBoxDispVHWARectIntersect(RECTL * pRect1, RECTL * pRect2)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return !((pRect1->left < pRect2->left && pRect1->right < pRect2->left)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync || (pRect2->left < pRect1->left && pRect2->right < pRect1->left)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync || (pRect1->top < pRect2->top && pRect1->bottom < pRect2->top)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync || (pRect2->top < pRect1->top && pRect2->bottom < pRect1->top));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncbool VBoxDispVHWARectInclude(RECTL * pRect1, RECTL * pRect2)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return ((pRect1->left <= pRect2->left && pRect1->right >= pRect2->right)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync && (pRect1->top <= pRect2->top && pRect1->bottom >= pRect2->bottom));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncbool VBoxDispVHWARegionIntersects(PVBOXVHWAREGION pReg, RECTL * pRect)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(!pReg->bValid)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return false;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VBoxDispVHWARectIntersect(&pReg->Rect, pRect);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncbool VBoxDispVHWARegionIncludes(PVBOXVHWAREGION pReg, RECTL * pRect)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(!pReg->bValid)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return false;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VBoxDispVHWARectInclude(&pReg->Rect, pRect);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncbool VBoxDispVHWARegionIncluded(PVBOXVHWAREGION pReg, RECTL * pRect)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(!pReg->bValid)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return true;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return VBoxDispVHWARectInclude(pRect, &pReg->Rect);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid VBoxDispVHWARegionSet(PVBOXVHWAREGION pReg, RECTL * pRect)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(VBoxDispVHWARectIsEmpty(pRect))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pReg->bValid = false;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pReg->Rect = *pRect;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pReg->bValid = true;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid VBoxDispVHWARegionAdd(PVBOXVHWAREGION pReg, RECTL * pRect)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(VBoxDispVHWARectIsEmpty(pRect))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if(!pReg->bValid)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWARegionSet(pReg, pRect);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxDispVHWARectUnited(&pReg->Rect, &pReg->Rect, pRect);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid VBoxDispVHWARegionInit(PVBOXVHWAREGION pReg)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pReg->bValid = false;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid VBoxDispVHWARegionClear(PVBOXVHWAREGION pReg)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pReg->bValid = false;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncbool VBoxDispVHWARegionValid(PVBOXVHWAREGION pReg)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return pReg->bValid;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid VBoxDispVHWARegionTrySubstitute(PVBOXVHWAREGION pReg, const RECTL *pRect)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(!pReg->bValid)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(pReg->Rect.left >= pRect->left && pReg->Rect.right <= pRect->right)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LONG t = MAX(pReg->Rect.top, pRect->top);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LONG b = MIN(pReg->Rect.bottom, pRect->bottom);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(t < b)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pReg->Rect.top = t;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pReg->Rect.bottom = b;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pReg->bValid = false;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else if(pReg->Rect.top >= pRect->top && pReg->Rect.bottom <= pRect->bottom)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LONG l = MAX(pReg->Rect.left, pRect->left);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LONG r = MIN(pReg->Rect.right, pRect->right);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if(l < r)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pReg->Rect.left = l;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pReg->Rect.right = r;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pReg->bValid = false;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}