VBoxDispDDraw.cpp revision ccbb9941eeafd9ec56b8ed048910198240e6caaa
/* $Id$ */
/** @file
* VBox XPDM Display driver, DirectDraw callbacks
*/
/*
* Copyright (C) 2011 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
#include "VBoxDisp.h"
#include "VBoxDispDDraw.h"
#include "VBoxDispMini.h"
/* Called to check if our driver can create surface with requested attributes */
{
LOGF_ENTER();
#ifdef VBOX_WITH_VIDEOHWACCEL
{
if(unsupportedSCaps)
{
return DDHAL_DRIVER_HANDLED;
}
if(unsupportedSCaps)
{
return DDHAL_DRIVER_HANDLED;
}
pCmd = VBoxDispVHWACommandCreate(pDev, VBOXVHWACMD_TYPE_SURF_CANCREATE, sizeof(VBOXVHWACMD_SURF_CANCREATE));
if(pCmd)
{
int rc;
{
{
}
else
{
}
}
else
{
}
}
else
{
WARN(("VBoxDispVHWACommandCreate failed!"));
}
return DDHAL_DRIVER_HANDLED;
}
#endif /*VBOX_WITH_VIDEOHWACCEL*/
{
LOG(("No Z-Bufer support"));
return DDHAL_DRIVER_HANDLED;
}
{
LOG(("No texture support"));
return DDHAL_DRIVER_HANDLED;
}
{
LOG(("FOURCC not supported"));
return DDHAL_DRIVER_HANDLED;
}
LOGF_LEAVE();
return DDHAL_DRIVER_HANDLED;
}
/* Called to create DirectDraw surface.
* Note: we always return DDHAL_DRIVER_NOTHANDLED, which asks DirectDraw memory manager
* to perform actual memory allocation in our DDraw heap.
*/
{
LOGF_ENTER();
{
LOG(("primary surface"));
}
else
{
LOG(("non primary surface"));
}
#ifdef VBOX_WITH_VIDEOHWACCEL
{
pCmd = VBoxDispVHWACommandCreate(pDev, VBOXVHWACMD_TYPE_SURF_CREATE, sizeof(VBOXVHWACMD_SURF_CREATE));
if (pCmd)
{
int rc;
{
}
else
{
}
if (pDesc)
{
{
{
}
/*@todo: it's probably a memory leak, because DDDestroySurface wouldn't be called for
* primary surfaces.
*/
}
else
{
}
}
else
{
WARN(("VBoxDispVHWASurfDescAlloc failed"));
}
}
else
{
WARN(("VBoxDispVHWACommandCreate failed"));
}
return DDHAL_DRIVER_NOTHANDLED;
}
#endif /*VBOX_WITH_VIDEOHWACCEL*/
{
}
else
{
}
else
{
}
LOGF_LEAVE();
return DDHAL_DRIVER_NOTHANDLED;
}
/* Called to destroy DirectDraw surface,
* in particular we should free vhwa resources allocated on VBoxDispDDCreateSurface.
* Note: we're always returning DDHAL_DRIVER_NOTHANDLED because we rely on DirectDraw memory manager.
*/
{
LOGF_ENTER();
#ifdef VBOX_WITH_VIDEOHWACCEL
{
pCmd = VBoxDispVHWACommandCreate(pDev, VBOXVHWACMD_TYPE_SURF_DESTROY, sizeof(VBOXVHWACMD_SURF_DESTROY));
if (pCmd)
{
if (pDesc)
{
}
else
{
WARN(("!pDesc, memory overwrite somewhere?"));
}
}
else
{
WARN(("VBoxDispVHWACommandCreate failed!"));
}
}
else
#endif /*VBOX_WITH_VIDEOHWACCEL*/
LOGF_LEAVE();
return DDHAL_DRIVER_NOTHANDLED;
}
/* Called before first DDLock/after last DDUnlock to map/unmap surface memory from given process address space
* We go easy way and map whole framebuffer and offscreen DirectDraw heap every time.
*/
{
int rc;
LOGF_ENTER();
if (lpMapMemory->bMap)
{
}
else
{
}
LOGF_LEAVE();
return DDHAL_DRIVER_HANDLED;
}
/* Lock specified area of surface */
{
LOGF_ENTER();
#ifdef VBOX_WITH_VIDEOHWACCEL
{
if (!pDesc)
{
WARN(("!pDesc, memory overwrite somewhere?"));
return DDHAL_DRIVER_HANDLED;
}
/* Check if host is still processing drawing commands */
{
{
return DDHAL_DRIVER_HANDLED;
}
}
{
}
else
{
}
{
}
{
}
else
{
if (pCmd)
{
/* wait for the surface to be locked and memory buffer updated */
}
else
{
WARN(("VBoxDispVHWACommandCreate failed!"));
}
}
return DDHAL_DRIVER_NOTHANDLED;
}
#endif /*VBOX_WITH_VIDEOHWACCEL*/
/* We only care about primary surface as we'd have to report dirty rectangles to the host in the DDUnlock*/
{
{
}
else
{
}
}
LOGF_LEAVE();
return DDHAL_DRIVER_NOTHANDLED;
}
/* Unlock previously locked surface */
{
LOGF_ENTER();
#ifdef VBOX_WITH_VIDEOHWACCEL
{
if (!pDesc)
{
WARN(("!pDesc, memory overwrite somewhere?"));
return DDHAL_DRIVER_HANDLED;
}
{
{
}
{
}
}
{
pCmd = VBoxDispVHWACommandCreate (pDev, VBOXVHWACMD_TYPE_SURF_UNLOCK, sizeof(VBOXVHWACMD_SURF_UNLOCK));
if(pCmd)
{
{
}
}
else
{
WARN(("VBoxDispVHWACommandCreate failed!"));
}
}
return DDHAL_DRIVER_NOTHANDLED;
}
#endif /*VBOX_WITH_VIDEOHWACCEL*/
{
{
{
}
{
}
}
}
LOGF_LEAVE();
return DDHAL_DRIVER_NOTHANDLED;
}