mirror of
https://github.com/X11Libre/xf86-video-vmware.git
synced 2026-03-24 01:24:37 +00:00
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:
committed by
Philip Langdale
parent
0576b87c27
commit
6ea8e50005
53
src/vmware.c
53
src/vmware.c
@@ -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,
|
||||
|
||||
@@ -243,6 +243,11 @@ DisplayModeRec *VMWAREAddDisplayMode(
|
||||
int height
|
||||
);
|
||||
|
||||
Bool vmwareIsRegionEqual(
|
||||
const RegionPtr reg1,
|
||||
const RegionPtr reg2
|
||||
);
|
||||
|
||||
/* vmwarecurs.c */
|
||||
Bool vmwareCursorInit(
|
||||
ScreenPtr pScr
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user