VBoxDispVBVA.cpp revision 6c28ed70192c3f2d1edf978697ff0ee0276bf0ee
/* $Id$ */
/** @file
* VBox XPDM Display driver
*/
/*
* 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 "VBoxDispMini.h"
#ifdef VBOX_VBVA_ADJUST_RECT
{
BYTE r, g, b;
ULONG ulConvertedPixel = 0;
switch (cbPixelFrom)
{
case 4:
{
switch (cbPixelTo)
{
case 3:
{
} break;
case 2:
{
b = (BYTE)(ulConvertedPixel);
} break;
}
} break;
case 3:
{
switch (cbPixelTo)
{
case 2:
{
b = (BYTE)(ulConvertedPixel);
} break;
}
} break;
}
return ulConvertedPixel;
}
{
int x, y;
int fTopNonEqualFound;
int yTopmost;
int yBottommost;
int cbPixelSrc;
int cbPixelDest;
{
return TRUE;
}
LOGF(("dest %d,%d %dx%d from %d,%d",
switch (psoDest->iBitmapFormat)
{
default: cbPixelDest = 0;
}
switch (psoSrc->iBitmapFormat)
{
default: cbPixelSrc = 0;
}
if (cbPixelDest == 0 || cbPixelSrc == 0)
{
return TRUE;
}
{
return FALSE;
}
{
return FALSE;
}
/*
* Compare the content of the screen surface (psoDest) with the source surface (psoSrc).
* Update the prclDest with the rectangle that will be actually changed after
* copying the source bits to the screen.
*/
pu8Dest = (BYTE *)psoDest->pvScan0 + psoDest->lDelta * prclDest->top + cbPixelDest * prclDest->left;
/* Use the rclDest as the bounding rectangle for the changed area. */
fTopNonEqualFound = 0;
{
int fLeftNonEqualFound = 0;
/* Init to an empty line. */
{
int fEqualPixels;
if (cbPixelSrc == cbPixelDest)
{
}
else
{
/* Convert larger pixel to the smaller pixel format. */
if (cbPixelSrc > cbPixelDest)
{
/* Convert the source pixel to the destination pixel format. */
/*to*/ cbPixelDest);
}
else
{
/* Convert the destination pixel to the source pixel format. */
/*to*/ cbPixelSrc);
}
}
if (fEqualPixels)
{
/* Equal pixels. */
if (!fLeftNonEqualFound)
{
xLeftmost = x;
}
}
else
{
fLeftNonEqualFound = 1;
xRightmost = x;
}
pu8SrcLine += cbPixelSrc;
}
/* min */
{
}
/* max */
{
}
{
/* Empty line. */
if (!fTopNonEqualFound)
{
yTopmost = y;
}
}
else
{
fTopNonEqualFound = 1;
yBottommost = y;
}
}
/* min */
{
}
/* max */
{
}
/* rclDest was calculated with right-bottom inclusive.
* The following checks and the caller require exclusive coords.
*/
LOG(("new dest %d,%d %dx%d from %d,%d",
/* Update the rectangle with the changed area. */
{
/* Empty rect. */
LOG(("empty"));
return FALSE;
}
LOG(("not empty"));
return TRUE;
}
#endif /* VBOX_VBVA_ADJUST_RECT */
{
return EngAllocMem(0, cb, 0);
}
{
EngFreeMem(pv);
}
static HGSMIENV g_hgsmiEnvDisp =
{
NULL,
};
{
int rc;
LOGF_ENTER();
/* Check if HGSMI is supported and obtain necessary info */
if (RT_SUCCESS(rc))
{
if (RT_SUCCESS(rc))
{
}
}
if (RT_SUCCESS(rc))
{
}
{
dwrc = EngDeviceIoControl(pDev->hDriver, IOCTL_VIDEO_HGSMI_HANDLER_ENABLE, &HandlerReg, sizeof(HandlerReg),
0, NULL, &cbReturned);
#ifdef VBOX_WITH_VIDEOHWACCEL
{
}
#endif
}
/* Check if we have enough VRAM and update layout info.
* 0=Framebuffer(fixed)->DDrawHeap(all left vram)->VBVABuffer(64k..cbFramebuffer)->DisplayInfo(fixed)->=EndOfVRAM
*/
{
vram->offFramebuffer = 0;
{
}
else
{
{
{
break;
}
}
{
}
else
{
}
}
}
/* Setup HGSMI heap in the display information area.
* The area has some space reserved for HGSMI event flags in the beginning.
*/
{
if (RT_SUCCESS(rc))
{
}
else
{
}
}
/* If we don't have HGSMI or doesn't have enough VRAM, setup layout without VBVA buffer and display info */
{
/* Setup a layout without both the VBVA buffer and the display information. */
vram->offFramebuffer = 0;
vram->cbVBVABuffer = 0;
vram->cbDisplayInfo = 0;
}
/* Update buffer layout in VBVA context info */
LOG(("\n"
" cbVRAM=%#X\n"
" offFramebuffer=%#X cbFramebuffer=%#X\n"
" offDDrawHeap=%#X cbDDrawHeap=%#X\n"
" offVBVABuffer=%#X cbVBVABuffer=%#X\n"
" offDisplayInfo=%#X cbDisplayInfo=%#X\n",
));
LOGF_LEAVE();
return VINF_SUCCESS;
}
{
}
{
{
LOG(("dirty rect: left %d, top: %d, width: %d, height: %d",
/* Ensure correct order. */
{
}
else
{
}
{
}
else
{
}
/* Clip the rectangle. */
/* If the rectangle is empty, still report it. */
{
}
{
}
}
}
{
}
{
if (prcl)
{
}
else if (pco)
{
}
}
/*
* VBVA driver functions.
*/
{
}
{
}
{
}
{
}
{
}
{
}
void vbvaDrvBitBlt(SURFOBJ *psoTrg, SURFOBJ *psoSrc, SURFOBJ *psoMask, CLIPOBJ *pco, XLATEOBJ *pxlo,
{
}
void vbvaDrvStretchBlt(SURFOBJ *psoDest, SURFOBJ *psoSrc, SURFOBJ *psoMask, CLIPOBJ *pco, XLATEOBJ *pxlo,
{
}
{
}