Add RegionEqual function for older XFree86 versions.

Fixes bug : http://bugzilla.eng.vmware.com/show_bug.cgi?id=312853

When we added AUTOPAINT_COLORKEY capability to our VMware video driver,
region functions were used to keep track of colorkey painting.

REGION_EQUAL was one of them.

Unfortunately REGION_EQUAL was not present in regionstr.h shipped with XFree86 version
4.3.0.
This version is used by TurboLinux 10; causing X server to crash while playing videos.

REGION_EQUAL was added in revision 1.8 of regionstr.h and available for xfree86 version
4.3.99
onwards.
Reference:
http://cvsweb.xfree86.org/cvsweb/xc/programs/Xserver/include/regionstr.h.diff?r1=1.7&r2=1.8

When I compiled the existing code(without my change), I see a warning was generated
indicating REGION_EQUAL is not present.
Too bad we missed it.

This patch includes
1) Slightly modified version of miRegionEqual from miRegion.c
2) Some formating cleanup.
This commit is contained in:
Bankim Bhavsar
2008-08-19 11:23:02 -07:00
committed by Philip Langdale
parent 0576b87c27
commit 6ea8e50005
3 changed files with 123 additions and 49 deletions

View File

@@ -1447,6 +1447,59 @@ VMWAREAddDisplayMode(ScrnInfoPtr pScrn,
}
/*
*-----------------------------------------------------------------------------
*
* vmwareIsRegionEqual --
*
* This function implements REGION_EQUAL because older versions of
* regionstr.h don't define it.
* It is a slightly modified version of miRegionEqual from $Xorg: miregion.c
*
* Results:
* TRUE if regions are equal; FALSE otherwise
*
* Side effects:
* None.
*
*-----------------------------------------------------------------------------
*/
Bool
vmwareIsRegionEqual(const RegionPtr reg1,
const RegionPtr reg2)
{
int i, num;
BoxPtr rects1, rects2;
if ((reg1->extents.x1 != reg2->extents.x1) ||
(reg1->extents.x2 != reg2->extents.x2) ||
(reg1->extents.y1 != reg2->extents.y1) ||
(reg1->extents.y2 != reg2->extents.y2)) {
return FALSE;
}
num = REGION_NUM_RECTS(reg1);
if (num != REGION_NUM_RECTS(reg2)) {
return FALSE;
}
rects1 = REGION_RECTS(reg1);
rects2 = REGION_RECTS(reg2);
for (i = 0; i < num; i++) {
if ((rects1[i].x1 != rects2[i].x1) ||
(rects1[i].x2 != rects2[i].x2) ||
(rects1[i].y1 != rects2[i].y1) ||
(rects1[i].y2 != rects2[i].y2)) {
return FALSE;
}
}
return TRUE;
}
#if VMWARE_DRIVER_FUNC
static Bool
VMWareDriverFunc(ScrnInfoPtr pScrn,

View File

@@ -243,6 +243,11 @@ DisplayModeRec *VMWAREAddDisplayMode(
int height
);
Bool vmwareIsRegionEqual(
const RegionPtr reg1,
const RegionPtr reg2
);
/* vmwarecurs.c */
Bool vmwareCursorInit(
ScreenPtr pScr

View File

@@ -393,7 +393,8 @@ vmwareOffscreenFree(VMWAREOffscreenPtr memptr)
*-----------------------------------------------------------------------------
*/
Bool vmwareVideoEnabled(VMWAREPtr pVMWARE)
Bool
vmwareVideoEnabled(VMWAREPtr pVMWARE)
{
return ((pVMWARE->vmwareCapability & SVGA_CAP_EXTENDED_FIFO) &&
(pVMWARE->vmwareFIFO[SVGA_FIFO_CAPABILITIES] &
@@ -418,7 +419,8 @@ Bool vmwareVideoEnabled(VMWAREPtr pVMWARE)
*-----------------------------------------------------------------------------
*/
Bool vmwareVideoInit(ScreenPtr pScreen)
Bool
vmwareVideoInit(ScreenPtr pScreen)
{
ScrnInfoPtr pScrn = infoFromScreen(pScreen);
XF86VideoAdaptorPtr *overlayAdaptors, *newAdaptors = NULL;
@@ -486,7 +488,8 @@ Bool vmwareVideoInit(ScreenPtr pScreen)
*-----------------------------------------------------------------------------
*/
void vmwareVideoEnd(ScreenPtr pScreen)
void
vmwareVideoEnd(ScreenPtr pScreen)
{
ScrnInfoPtr pScrn = infoFromScreen(pScreen);
VMWAREPtr pVMWARE = VMWAREPTR(pScrn);
@@ -526,7 +529,8 @@ void vmwareVideoEnd(ScreenPtr pScreen)
*-----------------------------------------------------------------------------
*/
static XF86VideoAdaptorPtr vmwareVideoSetup(ScrnInfoPtr pScrn)
static XF86VideoAdaptorPtr
vmwareVideoSetup(ScrnInfoPtr pScrn)
{
VMWAREPtr pVMWARE = VMWAREPTR(pScrn);
XF86VideoAdaptorPtr adaptor;
@@ -614,12 +618,13 @@ static XF86VideoAdaptorPtr vmwareVideoSetup(ScrnInfoPtr pScrn)
*-----------------------------------------------------------------------------
*/
static int vmwareVideoInitStream(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
short src_x, short src_y, short drw_x,
short drw_y, short src_w, short src_h,
short drw_w, short drw_h, int format,
unsigned char *buf, short width,
short height, RegionPtr clipBoxes)
static int
vmwareVideoInitStream(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
short src_x, short src_y, short drw_x,
short drw_y, short src_w, short src_h,
short drw_w, short drw_h, int format,
unsigned char *buf, short width,
short height, RegionPtr clipBoxes)
{
VMWAREPtr pVMWARE = VMWAREPTR(pScrn);
int i;
@@ -689,9 +694,10 @@ static int vmwareVideoInitStream(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
*-----------------------------------------------------------------------------
*/
static int vmwareVideoInitAttributes(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
int format, unsigned short width,
unsigned short height)
static int
vmwareVideoInitAttributes(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
int format, unsigned short width,
unsigned short height)
{
int size;
VMWAREVideoFmtData *fmtData;
@@ -732,12 +738,13 @@ static int vmwareVideoInitAttributes(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
*-----------------------------------------------------------------------------
*/
static int vmwareVideoPlay(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
short src_x, short src_y, short drw_x,
short drw_y, short src_w, short src_h,
short drw_w, short drw_h, int format,
unsigned char *buf, short width,
short height, RegionPtr clipBoxes)
static int
vmwareVideoPlay(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
short src_x, short src_y, short drw_x,
short drw_y, short src_w, short src_h,
short drw_w, short drw_h, int format,
unsigned char *buf, short width,
short height, RegionPtr clipBoxes)
{
VMWAREPtr pVMWARE = VMWAREPTR(pScrn);
uint32 *fifoItem;
@@ -823,10 +830,10 @@ static int vmwareVideoPlay(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
vmwareWriteWordToFIFO(pVMWARE, fifoItem[i]);
}
/*
/*
* Update the clipList and paint the colorkey, if required.
*/
if (!REGION_EQUAL(pScrn->pScreen, &pVid->clipBoxes, clipBoxes)) {
if (!vmwareIsRegionEqual(&pVid->clipBoxes, clipBoxes)) {
REGION_COPY(pScrn->pScreen, &pVid->clipBoxes, clipBoxes);
if (pVid->isAutoPaintColorkey) {
xf86XVFillKeyHelper(pScrn->pScreen, pVid->colorKey, clipBoxes);
@@ -858,7 +865,8 @@ static int vmwareVideoPlay(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid,
*-----------------------------------------------------------------------------
*/
static void vmwareVideoFlush(VMWAREPtr pVMWARE, uint32 streamId)
static void
vmwareVideoFlush(VMWAREPtr pVMWARE, uint32 streamId)
{
struct PACKED _body {
uint32 escape;
@@ -904,8 +912,9 @@ static void vmwareVideoFlush(VMWAREPtr pVMWARE, uint32 streamId)
*-----------------------------------------------------------------------------
*/
static void vmwareVideoSetOneReg(VMWAREPtr pVMWARE, uint32 streamId,
uint32 regId, uint32 value)
static void
vmwareVideoSetOneReg(VMWAREPtr pVMWARE, uint32 streamId,
uint32 regId, uint32 value)
{
struct PACKED _item {
uint32 regId;
@@ -960,7 +969,8 @@ static void vmwareVideoSetOneReg(VMWAREPtr pVMWARE, uint32 streamId,
*-----------------------------------------------------------------------------
*/
static void vmwareVideoEndStream(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid)
static void
vmwareVideoEndStream(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid)
{
uint32 id, colorKey, flags;
Bool isAutoPaintColorkey;
@@ -1019,18 +1029,20 @@ static void vmwareVideoEndStream(ScrnInfoPtr pScrn, VMWAREVideoPtr pVid)
*/
#ifdef HAVE_XORG_SERVER_1_0_99_901
static int vmwareXvPutImage(ScrnInfoPtr pScrn, short src_x, short src_y,
short drw_x, short drw_y, short src_w, short src_h,
short drw_w, short drw_h, int format,
unsigned char *buf, short width, short height,
Bool sync, RegionPtr clipBoxes, pointer data,
DrawablePtr dst)
static int
vmwareXvPutImage(ScrnInfoPtr pScrn, short src_x, short src_y,
short drw_x, short drw_y, short src_w, short src_h,
short drw_w, short drw_h, int format,
unsigned char *buf, short width, short height,
Bool sync, RegionPtr clipBoxes, pointer data,
DrawablePtr dst)
#else
static int vmwareXvPutImage(ScrnInfoPtr pScrn, short src_x, short src_y,
short drw_x, short drw_y, short src_w, short src_h,
short drw_w, short drw_h, int format,
unsigned char *buf, short width, short height,
Bool sync, RegionPtr clipBoxes, pointer data)
static int
vmwareXvPutImage(ScrnInfoPtr pScrn, short src_x, short src_y,
short drw_x, short drw_y, short src_w, short src_h,
short drw_w, short drw_h, int format,
unsigned char *buf, short width, short height,
Bool sync, RegionPtr clipBoxes, pointer data)
#endif
{
VMWAREPtr pVMWARE = VMWAREPTR(pScrn);
@@ -1066,7 +1078,8 @@ static int vmwareXvPutImage(ScrnInfoPtr pScrn, short src_x, short src_y,
*-----------------------------------------------------------------------------
*/
static void vmwareStopVideo(ScrnInfoPtr pScrn, pointer data, Bool Cleanup)
static void
vmwareStopVideo(ScrnInfoPtr pScrn, pointer data, Bool Cleanup)
{
VMWAREVideoPtr pVid = data;
VMWAREPtr pVMWARE = VMWAREPTR(pScrn);
@@ -1107,10 +1120,10 @@ static void vmwareStopVideo(ScrnInfoPtr pScrn, pointer data, Bool Cleanup)
*-----------------------------------------------------------------------------
*/
static int vmwareQueryImageAttributes(ScrnInfoPtr pScrn, int format,
unsigned short *width,
unsigned short *height, int *pitches,
int *offsets)
static int
vmwareQueryImageAttributes(ScrnInfoPtr pScrn, int format,
unsigned short *width, unsigned short *height,
int *pitches, int *offsets)
{
INT32 size, tmp;
@@ -1184,8 +1197,9 @@ static int vmwareQueryImageAttributes(ScrnInfoPtr pScrn, int format,
*-----------------------------------------------------------------------------
*/
static int vmwareSetPortAttribute(ScrnInfoPtr pScrn, Atom attribute,
INT32 value, pointer data)
static int
vmwareSetPortAttribute(ScrnInfoPtr pScrn, Atom attribute,
INT32 value, pointer data)
{
VMWAREVideoPtr pVid = (VMWAREVideoPtr) data;
Atom xvColorKey = MAKE_ATOM("XV_COLORKEY");
@@ -1223,8 +1237,9 @@ static int vmwareSetPortAttribute(ScrnInfoPtr pScrn, Atom attribute,
*-----------------------------------------------------------------------------
*/
static int vmwareGetPortAttribute(ScrnInfoPtr pScrn, Atom attribute,
INT32 *value, pointer data)
static int
vmwareGetPortAttribute(ScrnInfoPtr pScrn, Atom attribute,
INT32 *value, pointer data)
{
VMWAREVideoPtr pVid = (VMWAREVideoPtr) data;
Atom xvColorKey = MAKE_ATOM("XV_COLORKEY");
@@ -1267,10 +1282,11 @@ static int vmwareGetPortAttribute(ScrnInfoPtr pScrn, Atom attribute,
*-----------------------------------------------------------------------------
*/
static void vmwareQueryBestSize(ScrnInfoPtr pScrn, Bool motion,
short vid_w, short vid_h, short drw_w,
short drw_h, unsigned int *p_w,
unsigned int *p_h, pointer data)
static void
vmwareQueryBestSize(ScrnInfoPtr pScrn, Bool motion,
short vid_w, short vid_h, short drw_w,
short drw_h, unsigned int *p_w,
unsigned int *p_h, pointer data)
{
*p_w = (drw_w + 1) & ~1;
*p_h = drw_h;