From 179737d4a07ed10a734fe017b5680f8e78ffda96 Mon Sep 17 00:00:00 2001 From: Jens Granseuer Date: Wed, 7 Jun 2006 01:46:00 -0700 Subject: [PATCH 01/16] Bug 7145: fix build with gcc 2.95 & other c89 compilers Move variable declarations to start of blocks as required by c89 --- exa/exa.c | 5 ++++- hw/xfree86/common/xf86Config.c | 9 ++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/exa/exa.c b/exa/exa.c index aa5532a98..1022b2ec3 100644 --- a/exa/exa.c +++ b/exa/exa.c @@ -523,6 +523,9 @@ exaDriverInit (ScreenPtr pScreen, ExaDriverPtr pScreenInfo) { ExaScreenPrivPtr pExaScr; +#ifdef RENDER + PictureScreenPtr ps; +#endif if (pScreenInfo->exa_major != EXA_VERSION_MAJOR || pScreenInfo->exa_minor > EXA_VERSION_MINOR) @@ -536,7 +539,7 @@ exaDriverInit (ScreenPtr pScreen, } #ifdef RENDER - PictureScreenPtr ps = GetPictureScreenIfSet(pScreen); + ps = GetPictureScreenIfSet(pScreen); #endif if (exaGeneration != serverGeneration) { diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c index 36dde3031..d9f1dd903 100644 --- a/hw/xfree86/common/xf86Config.c +++ b/hw/xfree86/common/xf86Config.c @@ -617,6 +617,9 @@ static Bool configFiles(XF86ConfFilesPtr fileconf) { MessageType pathFrom = X_DEFAULT; + int countDirs; + char *temp_path; + char *log_buf; /* FontPath */ @@ -676,13 +679,13 @@ configFiles(XF86ConfFilesPtr fileconf) FatalError("No valid FontPath could be found."); /* make fontpath more readable in the logfiles */ - int countDirs = 1; - char *temp_path = defaultFontPath; + countDirs = 1; + temp_path = defaultFontPath; while((temp_path = index(temp_path, ',')) != NULL) { countDirs++; temp_path++; } - char *log_buf = xnfalloc(strlen(defaultFontPath) + (2 * countDirs) + 1); + log_buf = xnfalloc(strlen(defaultFontPath) + (2 * countDirs) + 1); if(!log_buf) /* fallback to old method */ xf86Msg(pathFrom, "FontPath set to \"%s\"\n", defaultFontPath); else { From d3d6c5f4d05e0ca5b566e19657e0fe2b3898482a Mon Sep 17 00:00:00 2001 From: Paul Mackerras Date: Sat, 1 Jul 2006 11:10:18 -0700 Subject: [PATCH 02/16] Bug #7381: Coordinates get wrapped in accelerated line drawing on pixmap XAAPolylinesWideSolid was adding the drawable origin onto each element in the pPts array. Since the values got stored back into the pPts array, they got truncated to 16 bits, causing the overflow I saw. This patch avoids storing the coords back into the pPts array (and actually reduces the size of the code too :). Now the 32-bit sum of coords + origin doesn't get truncated to 16 bits, and the problem is solved. --- hw/xfree86/xaa/xaaWideLine.c | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/hw/xfree86/xaa/xaaWideLine.c b/hw/xfree86/xaa/xaaWideLine.c index fbec29e7d..369088e32 100644 --- a/hw/xfree86/xaa/xaaWideLine.c +++ b/hw/xfree86/xaa/xaaWideLine.c @@ -818,20 +818,6 @@ XAAPolylinesWideSolid ( return; } - if (mode == CoordModePrevious) { - pPts->x += xorg; - pPts->y += yorg; - } else if(xorg | yorg) { - register int n = npt; - register DDXPointPtr pts = pPts; - - while(n--) { - pts->x += xorg; - pts->y += yorg; - pts++; - } - } - x2 = pPts->x; y2 = pPts->y; if (npt > 1) { @@ -869,6 +855,8 @@ XAAPolylinesWideSolid ( infoRec->ClipBox->x2 - 1, infoRec->ClipBox->y2 - 1); } + x2 += xorg; + y2 += yorg; while (--npt) { x1 = x2; y1 = y2; @@ -878,6 +866,9 @@ XAAPolylinesWideSolid ( if (mode == CoordModePrevious) { x2 += x1; y2 += y1; + } else { + x2 += xorg; + y2 += yorg; } if ((x1 != x2) || (y1 != y2)) { somethingDrawn = TRUE; From 50a3e1ad18c815a5adafee22beccdf970bae62d6 Mon Sep 17 00:00:00 2001 From: Rudo Thomas Date: Sat, 1 Jul 2006 12:34:36 -0700 Subject: [PATCH 03/16] Missing close parenthesis in one of the setuid() fixes. --- hw/xfree86/parser/write.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/xfree86/parser/write.c b/hw/xfree86/parser/write.c index 82baa5a04..de3bb8a49 100644 --- a/hw/xfree86/parser/write.c +++ b/hw/xfree86/parser/write.c @@ -170,7 +170,7 @@ xf86writeConfigFile (const char *filename, XF86ConfigPtr cptr) strerror(errno)); return 0; case 0: /* child */ - if (setuid(getuid() == -1) + if (setuid(getuid()) == -1) FatalError("xf86writeConfigFile(): " "setuid failed(%s)\n", strerror(errno)); From 6ef457913955d4289081c7d07d528963ccf5272c Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Fri, 30 Jun 2006 03:01:14 +0200 Subject: [PATCH 04/16] Bug #7366: Fix two crashes in operations on source pictures. A screen's ChangePictureTransform now isn't called when changing the transform, as source pictures aren't associated with screens. Also, attempting to set an AlphaMap to a source picture will fail with BadMatch just like a Window would, preventing another crash. --- render/picture.c | 17 +++++++++++------ render/picturestr.h | 5 +++++ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/render/picture.c b/render/picture.c index ee385e56b..55763fcc1 100644 --- a/render/picture.c +++ b/render/picture.c @@ -1217,7 +1217,8 @@ ChangePicture (PicturePtr pPicture, error = BadPixmap; break; } - if (pAlpha->pDrawable->type != DRAWABLE_PIXMAP) + if (pAlpha->pDrawable == NULL || + pAlpha->pDrawable->type != DRAWABLE_PIXMAP) { client->errorValue = pid; error = BadMatch; @@ -1469,9 +1470,6 @@ SetPictureTransform (PicturePtr pPicture, { 0x00000, xFixed1, 0x00000 }, { 0x00000, 0x00000, xFixed1 }, } }; - ScreenPtr pScreen = pPicture->pDrawable->pScreen; - PictureScreenPtr ps = GetPictureScreen(pScreen); - int result; if (transform && memcmp (transform, &identity, sizeof (PictTransform)) == 0) transform = 0; @@ -1496,9 +1494,16 @@ SetPictureTransform (PicturePtr pPicture, } pPicture->serialNumber |= GC_CHANGE_SERIAL_BIT; - result = (*ps->ChangePictureTransform) (pPicture, transform); + if (pPicture->pDrawable != NULL) { + int result; + PictureScreenPtr ps = GetPictureScreen(pPicture->pDrawable->pScreen); - return result; + result = (*ps->ChangePictureTransform) (pPicture, transform); + + return result; + } + + return Success; } void diff --git a/render/picturestr.h b/render/picturestr.h index 1ea91201e..25969a622 100644 --- a/render/picturestr.h +++ b/render/picturestr.h @@ -349,7 +349,12 @@ typedef struct _PictureScreen { PictFilterAliasPtr filterAliases; int nfilterAliases; + /** + * Called immediately after a picture's transform is changed through the + * SetPictureTransform request. Not called for source-only pictures. + */ ChangePictureTransformProcPtr ChangePictureTransform; + ChangePictureFilterProcPtr ChangePictureFilter; DestroyPictureFilterProcPtr DestroyPictureFilter; From f5e92542a14f51029347b6476e4e4af69144930b Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Fri, 30 Jun 2006 12:03:47 +0200 Subject: [PATCH 05/16] Bug #7366: Fix crashes when setting filters on source pictures. Now, filters may only be set on source pictures when the filter is common to all screens. Also, like SetPictureTransform, ChangePictureFilter is now not called on source pictures. --- render/filter.c | 24 +++++++++++++++++------- render/picturestr.h | 5 +++++ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/render/filter.c b/render/filter.c index f81cc4a8c..61e040093 100644 --- a/render/filter.c +++ b/render/filter.c @@ -271,11 +271,16 @@ PictureResetFilters (ScreenPtr pScreen) int SetPictureFilter (PicturePtr pPicture, char *name, int len, xFixed *params, int nparams) { - ScreenPtr pScreen = pPicture->pDrawable->pScreen; - PictureScreenPtr ps = GetPictureScreen(pScreen); - PictFilterPtr pFilter = PictureFindFilter (pScreen, name, len); + PictFilterPtr pFilter; xFixed *new_params; - int i, result; + int i, s, result; + + pFilter = PictureFindFilter (screenInfo.screens[0], name, len); + + for (s = 0; s < screenInfo.numScreens; s++) { + if (PictureFindFilter (screenInfo.screens[s], name, len) != pFilter) + return BadMatch; + } if (!pFilter) return BadName; @@ -300,8 +305,13 @@ SetPictureFilter (PicturePtr pPicture, char *name, int len, xFixed *params, int pPicture->filter_params[i] = params[i]; pPicture->filter = pFilter->id; - result = (*ps->ChangePictureFilter) (pPicture, pPicture->filter, - params, nparams); - return result; + if (pPicture->pDrawable) { + ScreenPtr pScreen = pPicture->pDrawable->pScreen; + PictureScreenPtr ps = GetPictureScreen(pScreen); + + result = (*ps->ChangePictureFilter) (pPicture, pPicture->filter, + params, nparams); + return result; + } return Success; } diff --git a/render/picturestr.h b/render/picturestr.h index 25969a622..f1617f627 100644 --- a/render/picturestr.h +++ b/render/picturestr.h @@ -355,7 +355,12 @@ typedef struct _PictureScreen { */ ChangePictureTransformProcPtr ChangePictureTransform; + /** + * Called immediately after a picture's transform is changed through the + * SetPictureFilter request. Not called for source-only pictures. + */ ChangePictureFilterProcPtr ChangePictureFilter; + DestroyPictureFilterProcPtr DestroyPictureFilter; TrapezoidsProcPtr Trapezoids; From 7106a77df37c06d2b5568eceeb9297096bff3137 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Sun, 2 Jul 2006 12:41:35 +0200 Subject: [PATCH 06/16] Fix bugs in support for new repeatTypes in XAA and EXA. EXA now won't pass pictures with new repeatTypes to drivers. We can add a flag for them to support it at a later time. --- exa/exa_render.c | 5 ++++- hw/xfree86/xaa/xaaPict.c | 8 +++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/exa/exa_render.c b/exa/exa_render.c index b21c5d724..2187af810 100644 --- a/exa/exa_render.c +++ b/exa/exa_render.c @@ -535,7 +535,8 @@ exaComposite(CARD8 op, if (op == PictOpSrc) { if (pSrc->pDrawable->width == 1 && - pSrc->pDrawable->height == 1 && pSrc->repeat) + pSrc->pDrawable->height == 1 && pSrc->repeat && + pSrc->repeatType == RepeatNormal) { ret = exaTryDriverSolidFill(pSrc, pDst, xSrc, ySrc, xDst, yDst, width, height); @@ -575,6 +576,8 @@ exaComposite(CARD8 op, pMask->repeat = 0; if (pExaScr->info->PrepareComposite && + (!pSrc->repeat || pSrc->repeat == RepeatNormal) && + (!pMask || !pMask->repeat || pMask->repeat == RepeatNormal) && !pSrc->alphaMap && (!pMask || !pMask->alphaMap) && !pDst->alphaMap) { ret = exaTryDriverComposite(op, pSrc, pMask, pDst, xSrc, ySrc, xMask, diff --git a/hw/xfree86/xaa/xaaPict.c b/hw/xfree86/xaa/xaaPict.c index a1ff51087..a7acf450a 100644 --- a/hw/xfree86/xaa/xaaPict.c +++ b/hw/xfree86/xaa/xaaPict.c @@ -218,7 +218,13 @@ XAADoComposite ( if (pDst->alphaMap || pSrc->alphaMap || (pMask && pMask->alphaMap)) return FALSE; - + + if ((pSrc->repeat && pSrc->repeatType != RepeatNormal) || + (pMask && pMask->repeat && pMask->repeatType != RepeatNormal)) + { + return FALSE; + } + xDst += pDst->pDrawable->x; yDst += pDst->pDrawable->y; xSrc += pSrc->pDrawable->x; From 25d871d98462f0481ee419295ddc94b8c79dc881 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Mon, 3 Jul 2006 19:22:26 +0200 Subject: [PATCH 07/16] Fix source picture filter check for multiple screens. Now, we only check for filter commonality if we're operating on a source picture, and we compare the id (screen-independent index of the filter name) rather than the pointer to the filter (per-screen state). --- render/filter.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/render/filter.c b/render/filter.c index 61e040093..71375dae9 100644 --- a/render/filter.c +++ b/render/filter.c @@ -277,9 +277,17 @@ SetPictureFilter (PicturePtr pPicture, char *name, int len, xFixed *params, int pFilter = PictureFindFilter (screenInfo.screens[0], name, len); - for (s = 0; s < screenInfo.numScreens; s++) { - if (PictureFindFilter (screenInfo.screens[s], name, len) != pFilter) - return BadMatch; + if (pPicture->pDrawable == NULL) { + /* For source pictures, the picture isn't tied to a screen. So, ensure + * that all screens can handle a filter we set for the picture. + */ + for (s = 0; s < screenInfo.numScreens; s++) { + if (PictureFindFilter (screenInfo.screens[s], name, len)->id != + pFilter->id) + { + return BadMatch; + } + } } if (!pFilter) From a838fb70c52a829872680f6a2a2e7dd6d2dc9247 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Mon, 3 Jul 2006 19:22:36 +0200 Subject: [PATCH 08/16] Bump server version to 7.1.99.2 for gradient and repeat fixes. --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index af7d06687..9d8dfed78 100644 --- a/configure.ac +++ b/configure.ac @@ -296,7 +296,7 @@ DEFAULT_VENDOR_NAME_SHORT="X.Org" DEFAULT_VERSION_MAJOR=7 DEFAULT_VERSION_MINOR=1 DEFAULT_VERSION_PATCH=99 -DEFAULT_VERSION_SNAP=1 +DEFAULT_VERSION_SNAP=2 DEFAULT_RELEASE_DATE="21 December 2005" DEFAULT_VENDOR_WEB="http://wiki.x.org" From cf46242e337481cd3b9b39d77dd621d2a63b11f9 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Wed, 28 Jun 2006 18:35:59 +0200 Subject: [PATCH 09/16] Optimize out computing a gradient pixel if the mask value is 0. Obtained from: kdrive CVS (DavidR XGL fb/ megapatch) --- fb/fbcompose.c | 207 +++++++++++++++++++++++++++++++------------------ 1 file changed, 131 insertions(+), 76 deletions(-) diff --git a/fb/fbcompose.c b/fb/fbcompose.c index 3a61e975a..7e17a0184 100644 --- a/fb/fbcompose.c +++ b/fb/fbcompose.c @@ -2635,7 +2635,8 @@ FbComposeFunctions composeFunctions = { }; -static void fbFetchSolid(PicturePtr pict, int x, int y, int width, CARD32 *buffer) +static void fbFetchSolid(PicturePtr pict, int x, int y, int width, + CARD32 *buffer, CARD32 *mask, CARD32 maskBits) { FbBits *bits; FbStride stride; @@ -2656,7 +2657,8 @@ static void fbFetchSolid(PicturePtr pict, int x, int y, int width, CARD32 *buffe *buffer++ = color; } -static void fbFetch(PicturePtr pict, int x, int y, int width, CARD32 *buffer) +static void fbFetch(PicturePtr pict, int x, int y, int width, CARD32 *buffer, + CARD32 *mask, CARD32 maskBits) { FbBits *bits; FbStride stride; @@ -2711,7 +2713,8 @@ static CARD32 gradientPixel(const SourcePictPtr pGradient, xFixed_48_16 pos, uns return pGradient->linear.colorTable[ipos]; } -static void fbFetchSourcePict(PicturePtr pict, int x, int y, int width, CARD32 *buffer) +static void fbFetchSourcePict(PicturePtr pict, int x, int y, int width, + CARD32 *buffer, CARD32 *mask, CARD32 maskBits) { SourcePictPtr pGradient = pict->pSourcePict; CARD32 *end = buffer + width; @@ -2761,22 +2764,30 @@ static void fbFetchSourcePict(PicturePtr pict, int x, int y, int width, CARD32 * inc = (a * unit.vector[0] + b * unit.vector[1]) >> 16; } while (buffer < end) { - *buffer++ = gradientPixel(pGradient, t, pict->repeatType); + if (mask == NULL || (*mask++ & maskBits) != 0) { + *buffer++ = gradientPixel(pGradient, t, pict->repeatType); + } else { + *buffer++ = 0; /* Set it to a value for valgrind */ + } t += inc; } } else { /* projective transformation */ while (buffer < end) { - xFixed_48_16 t; - if (v.vector[2] == 0) { - t = 0; - } else { - xFixed_48_16 x, y; - x = ((xFixed_48_16)v.vector[0] << 16) / v.vector[2]; - y = ((xFixed_48_16)v.vector[1] << 16) / v.vector[2]; - t = ((a*x + b*y) >> 16) + off; - } - *buffer++ = gradientPixel(pGradient, t, pict->repeatType); + if (mask == NULL || (*mask++ & maskBits) != 0) { + xFixed_48_16 t; + if (v.vector[2] == 0) { + t = 0; + } else { + xFixed_48_16 x, y; + x = ((xFixed_48_16)v.vector[0] << 16) / v.vector[2]; + y = ((xFixed_48_16)v.vector[1] << 16) / v.vector[2]; + t = ((a*x + b*y) >> 16) + off; + } + *buffer++ = gradientPixel(pGradient, t, pict->repeatType); + } else { + *buffer++ = 0; /* Set it to a value for valgrind */ + } v.vector[0] += unit.vector[0]; v.vector[1] += unit.vector[1]; v.vector[2] += unit.vector[2]; @@ -2816,37 +2827,45 @@ static void fbFetchSourcePict(PicturePtr pict, int x, int y, int width, CARD32 * ry -= pGradient->radial.fy; while (buffer < end) { - double b = 2*(rx*pGradient->radial.dx + ry*pGradient->radial.dy); - double c = -(rx*rx + ry*ry); - double det = (b * b) - (4 * pGradient->radial.a * c); - double s = (-b + sqrt(det))/(2. * pGradient->radial.a); - *buffer = gradientPixel(pGradient, - (xFixed_48_16)((s*pGradient->radial.m + pGradient->radial.b)*65536), - pict->repeatType); - ++buffer; + if (mask == NULL || (*mask++ & maskBits) != 0) { + double b = 2*(rx*pGradient->radial.dx + ry*pGradient->radial.dy); + double c = -(rx*rx + ry*ry); + double det = (b * b) - (4 * pGradient->radial.a * c); + double s = (-b + sqrt(det))/(2. * pGradient->radial.a); + *buffer++ = gradientPixel(pGradient, + (xFixed_48_16)((s * pGradient->radial.m + + pGradient->radial.b) * 65536), + pict->repeatType); + } else { + *buffer++ = 0; + } rx += cx; ry += cy; } } else { while (buffer < end) { - double x, y; - double b, c, det, s; - if (rz != 0) { - x = rx/rz; - y = ry/rz; - } else { - x = y = 0.; - } - x -= pGradient->radial.fx; - y -= pGradient->radial.fy; - b = 2*(x*pGradient->radial.dx + y*pGradient->radial.dy); - c = -(x*x + y*y); - det = (b * b) - (4 * pGradient->radial.a * c); - s = (-b + sqrt(det))/(2. * pGradient->radial.a); - *buffer = gradientPixel(pGradient, - (xFixed_48_16)((s*pGradient->radial.m + pGradient->radial.b)*65536), - pict->repeatType); - ++buffer; + if (mask == NULL || (*mask++ & maskBits) != 0) { + double x, y; + double b, c, det, s; + if (rz != 0) { + x = rx/rz; + y = ry/rz; + } else { + x = y = 0.; + } + x -= pGradient->radial.fx; + y -= pGradient->radial.fy; + b = 2*(x*pGradient->radial.dx + y*pGradient->radial.dy); + c = -(x*x + y*y); + det = (b * b) - (4 * pGradient->radial.a * c); + s = (-b + sqrt(det))/(2. * pGradient->radial.a); + *buffer++ = gradientPixel(pGradient, + (xFixed_48_16)((s * pGradient->radial.m + + pGradient->radial.b) * 65536), + pict->repeatType); + } else { + *buffer++ = 0; + } rx += cx; ry += cy; rz += cz; @@ -2859,29 +2878,37 @@ static void fbFetchSourcePict(PicturePtr pict, int x, int y, int width, CARD32 * ry -= pGradient->conical.center.y/65536.; while (buffer < end) { - double angle = atan2(ry, rx) + a; - *buffer = gradientPixel(pGradient, (xFixed_48_16) (angle * (65536. / (2*M_PI))), - pict->repeatType); - ++buffer; + if (mask == NULL || (*mask++ & maskBits) != 0) { + double angle = atan2(ry, rx) + a; + *buffer++ = gradientPixel(pGradient, + (xFixed_48_16) (angle * (65536. / (2*M_PI))), + pict->repeatType); + } else { + *buffer++ = 0; + } rx += cx; ry += cy; } } else { while (buffer < end) { - double x, y, angle; - if (rz != 0) { - x = rx/rz; - y = ry/rz; - } else { - x = y = 0.; - } - x -= pGradient->conical.center.x/65536.; - y -= pGradient->conical.center.y/65536.; - angle = atan2(y, x) + a; - *buffer = gradientPixel(pGradient, (xFixed_48_16) (angle * (65536. / (2*M_PI))), - pict->repeatType); - ++buffer; + if (mask == NULL || (*mask++ & maskBits) != 0) { + double x, y, angle; + if (rz != 0) { + x = rx/rz; + y = ry/rz; + } else { + x = y = 0.; + } + x -= pGradient->conical.center.x/65536.; + y -= pGradient->conical.center.y/65536.; + angle = atan2(y, x) + a; + *buffer++ = gradientPixel(pGradient, (xFixed_48_16) + (angle * (65536. / (2*M_PI))), + pict->repeatType); + } else { + *buffer++ = 0; + } rx += cx; ry += cy; rz += cz; @@ -2893,7 +2920,8 @@ static void fbFetchSourcePict(PicturePtr pict, int x, int y, int width, CARD32 * -static void fbFetchTransformed(PicturePtr pict, int x, int y, int width, CARD32 *buffer) +static void fbFetchTransformed(PicturePtr pict, int x, int y, int width, + CARD32 *buffer, CARD32 *mask, CARD32 maskBits) { FbBits *bits; FbStride stride; @@ -3357,21 +3385,24 @@ static void fbFetchTransformed(PicturePtr pict, int x, int y, int width, CARD32 } -static void fbFetchExternalAlpha(PicturePtr pict, int x, int y, int width, CARD32 *buffer) +static void fbFetchExternalAlpha(PicturePtr pict, int x, int y, int width, + CARD32 *buffer, CARD32 *mask, CARD32 maskBits) { int i; CARD32 _alpha_buffer[SCANLINE_BUFFER_LENGTH]; CARD32 *alpha_buffer = _alpha_buffer; if (!pict->alphaMap) { - fbFetchTransformed(pict, x, y, width, buffer); + fbFetchTransformed(pict, x, y, width, buffer, mask, maskBits); return; } if (width > SCANLINE_BUFFER_LENGTH) alpha_buffer = (CARD32 *) malloc(width*sizeof(CARD32)); - fbFetchTransformed(pict, x, y, width, buffer); - fbFetchTransformed(pict->alphaMap, x - pict->alphaOrigin.x, y - pict->alphaOrigin.y, width, alpha_buffer); + fbFetchTransformed(pict, x, y, width, buffer, mask, maskBits); + fbFetchTransformed(pict->alphaMap, x - pict->alphaOrigin.x, + y - pict->alphaOrigin.y, width, alpha_buffer, + mask, maskBits); for (i = 0; i < width; ++i) { int a = alpha_buffer[i]>>24; buffer[i] = (a << 24) @@ -3441,7 +3472,8 @@ static void fbStoreExternalAlpha(PicturePtr pict, int x, int y, int width, CARD3 } typedef void (*scanStoreProc)(PicturePtr , int , int , int , CARD32 *); -typedef void (*scanFetchProc)(PicturePtr , int , int , int , CARD32 *); +typedef void (*scanFetchProc)(PicturePtr , int , int , int , CARD32 *, + CARD32 *, CARD32); static void fbCompositeRect (const FbComposeData *data, CARD32 *scanline_buffer) @@ -3503,12 +3535,16 @@ fbCompositeRect (const FbComposeData *data, CARD32 *scanline_buffer) for (i = 0; i < data->height; ++i) { /* fill first half of scanline with source */ - fetchSrc(data->src, data->xSrc, data->ySrc + i, data->width, src_buffer); - fetchMask(data->mask, data->xMask, data->yMask + i, data->width, mask_buffer); + fetchMask(data->mask, data->xMask, data->yMask + i, data->width, + mask_buffer, NULL, 0); + fetchSrc(data->src, data->xSrc, data->ySrc + i, data->width, + src_buffer, mask_buffer, 0); /* fill dest into second half of scanline */ - if (fetchDest) - fetchDest(data->dest, data->xDest, data->yDest + i, data->width, dest_buffer); + if (fetchDest) { + fetchDest(data->dest, data->xDest, data->yDest + i, data->width, + dest_buffer, NULL, 0); + } /* blend */ compose(dest_buffer, src_buffer, mask_buffer, data->width); @@ -3517,17 +3553,27 @@ fbCompositeRect (const FbComposeData *data, CARD32 *scanline_buffer) store(data->dest, data->xDest, data->yDest + i, data->width, dest_buffer); } } else { - + CARD32 *mask_buffer; CombineFuncU compose = composeFunctions.combineU[data->op]; if (!compose) return; + if (fetchMask) + mask_buffer = dest_buffer + data->width; + else + mask_buffer = NULL; + if (fetchSrc == fbFetchSolid && (!fetchMask || fetchMask == fbFetchSolid)) { - fetchSrc(data->src, data->xSrc, data->ySrc, data->width, src_buffer); if (fetchMask) { - fetchMask(data->mask, data->xMask, data->yMask, data->width, dest_buffer); - composeFunctions.combineMaskU(src_buffer, dest_buffer, data->width); + fetchMask(data->mask, data->xMask, data->yMask, data->width, + dest_buffer, NULL, 0); } + fetchSrc(data->src, data->xSrc, data->ySrc, data->width, + src_buffer, mask_buffer, 0xff000000); + if (mask_buffer != NULL) { + composeFunctions.combineMaskU(src_buffer, dest_buffer, + data->width); + } fetchSrc = NULL; fetchMask = NULL; } @@ -3536,18 +3582,27 @@ fbCompositeRect (const FbComposeData *data, CARD32 *scanline_buffer) { /* fill first half of scanline with source */ if (fetchSrc) { - fetchSrc(data->src, data->xSrc, data->ySrc + i, data->width, src_buffer); + /* Fetch mask before source so that fetching of source can be + * optimized out if possible. + */ + if (fetchMask) { + fetchMask(data->mask, data->xMask, data->yMask + i, + data->width, dest_buffer, NULL, 0); + } + fetchSrc(data->src, data->xSrc, data->ySrc + i, data->width, + src_buffer, mask_buffer, 0xff000000); /* add in mask */ - if (fetchMask) { - fetchMask(data->mask, data->xMask, data->yMask + i, data->width, dest_buffer); + if (mask_buffer != NULL) { composeFunctions.combineMaskU(src_buffer, dest_buffer, data->width); } } /* fill dest into second half of scanline */ - if (fetchDest) - fetchDest(data->dest, data->xDest, data->yDest + i, data->width, dest_buffer); + if (fetchDest != NULL) { + fetchDest(data->dest, data->xDest, data->yDest + i, data->width, + dest_buffer, NULL, 0); + } /* blend */ compose(dest_buffer, src_buffer, data->width); From 002e28c12c74aa63777f65cbfb382c2bfd0d6850 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Mon, 3 Jul 2006 12:48:12 -0700 Subject: [PATCH 10/16] Correct AGP memory deallocation argument on *BSD. This fixes leaks and eventual crashes with RandR resizing on Intel. --- hw/xfree86/os-support/linux/lnx_agp.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/hw/xfree86/os-support/linux/lnx_agp.c b/hw/xfree86/os-support/linux/lnx_agp.c index 65a5a0ea3..77773f7fb 100644 --- a/hw/xfree86/os-support/linux/lnx_agp.c +++ b/hw/xfree86/os-support/linux/lnx_agp.c @@ -1,7 +1,7 @@ /* * Abstraction of the AGP GART interface. * - * This version is for both Linux and FreeBSD. + * This version is for Linux and Free/Open/NetBSD. * * Copyright © 2000 VA Linux Systems, Inc. * Copyright © 2001 The XFree86 Project, Inc. @@ -264,7 +264,11 @@ xf86DeallocateGARTMemory(int screenNum, int key) return FALSE; } +#ifdef __linux__ if (ioctl(gartFd, AGPIOC_DEALLOCATE, (int *)key) != 0) { +#else + if (ioctl(gartFd, AGPIOC_DEALLOCATE, &key) != 0) { +#endif xf86DrvMsg(screenNum, X_WARNING,"xf86DeAllocateGARTMemory: " "deallocation gart memory with key %d failed\n\t(%s)\n", key, strerror(errno)); From 12563db59dd613ecc926e3bed9534152ebc0a2fb Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Mon, 3 Jul 2006 12:52:27 -0700 Subject: [PATCH 11/16] Revert "Optimize out computing a gradient pixel if the mask value is 0." This reverts cf46242e337481cd3b9b39d77dd621d2a63b11f9 commit. It wasn't meant to be pushed to master yet, and doesn't work. --- fb/fbcompose.c | 207 ++++++++++++++++++------------------------------- 1 file changed, 76 insertions(+), 131 deletions(-) diff --git a/fb/fbcompose.c b/fb/fbcompose.c index 7e17a0184..3a61e975a 100644 --- a/fb/fbcompose.c +++ b/fb/fbcompose.c @@ -2635,8 +2635,7 @@ FbComposeFunctions composeFunctions = { }; -static void fbFetchSolid(PicturePtr pict, int x, int y, int width, - CARD32 *buffer, CARD32 *mask, CARD32 maskBits) +static void fbFetchSolid(PicturePtr pict, int x, int y, int width, CARD32 *buffer) { FbBits *bits; FbStride stride; @@ -2657,8 +2656,7 @@ static void fbFetchSolid(PicturePtr pict, int x, int y, int width, *buffer++ = color; } -static void fbFetch(PicturePtr pict, int x, int y, int width, CARD32 *buffer, - CARD32 *mask, CARD32 maskBits) +static void fbFetch(PicturePtr pict, int x, int y, int width, CARD32 *buffer) { FbBits *bits; FbStride stride; @@ -2713,8 +2711,7 @@ static CARD32 gradientPixel(const SourcePictPtr pGradient, xFixed_48_16 pos, uns return pGradient->linear.colorTable[ipos]; } -static void fbFetchSourcePict(PicturePtr pict, int x, int y, int width, - CARD32 *buffer, CARD32 *mask, CARD32 maskBits) +static void fbFetchSourcePict(PicturePtr pict, int x, int y, int width, CARD32 *buffer) { SourcePictPtr pGradient = pict->pSourcePict; CARD32 *end = buffer + width; @@ -2764,30 +2761,22 @@ static void fbFetchSourcePict(PicturePtr pict, int x, int y, int width, inc = (a * unit.vector[0] + b * unit.vector[1]) >> 16; } while (buffer < end) { - if (mask == NULL || (*mask++ & maskBits) != 0) { - *buffer++ = gradientPixel(pGradient, t, pict->repeatType); - } else { - *buffer++ = 0; /* Set it to a value for valgrind */ - } + *buffer++ = gradientPixel(pGradient, t, pict->repeatType); t += inc; } } else { /* projective transformation */ while (buffer < end) { - if (mask == NULL || (*mask++ & maskBits) != 0) { - xFixed_48_16 t; - if (v.vector[2] == 0) { - t = 0; - } else { - xFixed_48_16 x, y; - x = ((xFixed_48_16)v.vector[0] << 16) / v.vector[2]; - y = ((xFixed_48_16)v.vector[1] << 16) / v.vector[2]; - t = ((a*x + b*y) >> 16) + off; - } - *buffer++ = gradientPixel(pGradient, t, pict->repeatType); - } else { - *buffer++ = 0; /* Set it to a value for valgrind */ - } + xFixed_48_16 t; + if (v.vector[2] == 0) { + t = 0; + } else { + xFixed_48_16 x, y; + x = ((xFixed_48_16)v.vector[0] << 16) / v.vector[2]; + y = ((xFixed_48_16)v.vector[1] << 16) / v.vector[2]; + t = ((a*x + b*y) >> 16) + off; + } + *buffer++ = gradientPixel(pGradient, t, pict->repeatType); v.vector[0] += unit.vector[0]; v.vector[1] += unit.vector[1]; v.vector[2] += unit.vector[2]; @@ -2827,45 +2816,37 @@ static void fbFetchSourcePict(PicturePtr pict, int x, int y, int width, ry -= pGradient->radial.fy; while (buffer < end) { - if (mask == NULL || (*mask++ & maskBits) != 0) { - double b = 2*(rx*pGradient->radial.dx + ry*pGradient->radial.dy); - double c = -(rx*rx + ry*ry); - double det = (b * b) - (4 * pGradient->radial.a * c); - double s = (-b + sqrt(det))/(2. * pGradient->radial.a); - *buffer++ = gradientPixel(pGradient, - (xFixed_48_16)((s * pGradient->radial.m + - pGradient->radial.b) * 65536), - pict->repeatType); - } else { - *buffer++ = 0; - } + double b = 2*(rx*pGradient->radial.dx + ry*pGradient->radial.dy); + double c = -(rx*rx + ry*ry); + double det = (b * b) - (4 * pGradient->radial.a * c); + double s = (-b + sqrt(det))/(2. * pGradient->radial.a); + *buffer = gradientPixel(pGradient, + (xFixed_48_16)((s*pGradient->radial.m + pGradient->radial.b)*65536), + pict->repeatType); + ++buffer; rx += cx; ry += cy; } } else { while (buffer < end) { - if (mask == NULL || (*mask++ & maskBits) != 0) { - double x, y; - double b, c, det, s; - if (rz != 0) { - x = rx/rz; - y = ry/rz; - } else { - x = y = 0.; - } - x -= pGradient->radial.fx; - y -= pGradient->radial.fy; - b = 2*(x*pGradient->radial.dx + y*pGradient->radial.dy); - c = -(x*x + y*y); - det = (b * b) - (4 * pGradient->radial.a * c); - s = (-b + sqrt(det))/(2. * pGradient->radial.a); - *buffer++ = gradientPixel(pGradient, - (xFixed_48_16)((s * pGradient->radial.m + - pGradient->radial.b) * 65536), - pict->repeatType); - } else { - *buffer++ = 0; - } + double x, y; + double b, c, det, s; + if (rz != 0) { + x = rx/rz; + y = ry/rz; + } else { + x = y = 0.; + } + x -= pGradient->radial.fx; + y -= pGradient->radial.fy; + b = 2*(x*pGradient->radial.dx + y*pGradient->radial.dy); + c = -(x*x + y*y); + det = (b * b) - (4 * pGradient->radial.a * c); + s = (-b + sqrt(det))/(2. * pGradient->radial.a); + *buffer = gradientPixel(pGradient, + (xFixed_48_16)((s*pGradient->radial.m + pGradient->radial.b)*65536), + pict->repeatType); + ++buffer; rx += cx; ry += cy; rz += cz; @@ -2878,37 +2859,29 @@ static void fbFetchSourcePict(PicturePtr pict, int x, int y, int width, ry -= pGradient->conical.center.y/65536.; while (buffer < end) { - if (mask == NULL || (*mask++ & maskBits) != 0) { - double angle = atan2(ry, rx) + a; - *buffer++ = gradientPixel(pGradient, - (xFixed_48_16) (angle * (65536. / (2*M_PI))), - pict->repeatType); - } else { - *buffer++ = 0; - } + double angle = atan2(ry, rx) + a; + *buffer = gradientPixel(pGradient, (xFixed_48_16) (angle * (65536. / (2*M_PI))), + pict->repeatType); + ++buffer; rx += cx; ry += cy; } } else { while (buffer < end) { - if (mask == NULL || (*mask++ & maskBits) != 0) { - double x, y, angle; - if (rz != 0) { - x = rx/rz; - y = ry/rz; - } else { - x = y = 0.; - } - x -= pGradient->conical.center.x/65536.; - y -= pGradient->conical.center.y/65536.; - angle = atan2(y, x) + a; - *buffer++ = gradientPixel(pGradient, (xFixed_48_16) - (angle * (65536. / (2*M_PI))), - pict->repeatType); - } else { - *buffer++ = 0; - } + double x, y, angle; + if (rz != 0) { + x = rx/rz; + y = ry/rz; + } else { + x = y = 0.; + } + x -= pGradient->conical.center.x/65536.; + y -= pGradient->conical.center.y/65536.; + angle = atan2(y, x) + a; + *buffer = gradientPixel(pGradient, (xFixed_48_16) (angle * (65536. / (2*M_PI))), + pict->repeatType); + ++buffer; rx += cx; ry += cy; rz += cz; @@ -2920,8 +2893,7 @@ static void fbFetchSourcePict(PicturePtr pict, int x, int y, int width, -static void fbFetchTransformed(PicturePtr pict, int x, int y, int width, - CARD32 *buffer, CARD32 *mask, CARD32 maskBits) +static void fbFetchTransformed(PicturePtr pict, int x, int y, int width, CARD32 *buffer) { FbBits *bits; FbStride stride; @@ -3385,24 +3357,21 @@ static void fbFetchTransformed(PicturePtr pict, int x, int y, int width, } -static void fbFetchExternalAlpha(PicturePtr pict, int x, int y, int width, - CARD32 *buffer, CARD32 *mask, CARD32 maskBits) +static void fbFetchExternalAlpha(PicturePtr pict, int x, int y, int width, CARD32 *buffer) { int i; CARD32 _alpha_buffer[SCANLINE_BUFFER_LENGTH]; CARD32 *alpha_buffer = _alpha_buffer; if (!pict->alphaMap) { - fbFetchTransformed(pict, x, y, width, buffer, mask, maskBits); + fbFetchTransformed(pict, x, y, width, buffer); return; } if (width > SCANLINE_BUFFER_LENGTH) alpha_buffer = (CARD32 *) malloc(width*sizeof(CARD32)); - fbFetchTransformed(pict, x, y, width, buffer, mask, maskBits); - fbFetchTransformed(pict->alphaMap, x - pict->alphaOrigin.x, - y - pict->alphaOrigin.y, width, alpha_buffer, - mask, maskBits); + fbFetchTransformed(pict, x, y, width, buffer); + fbFetchTransformed(pict->alphaMap, x - pict->alphaOrigin.x, y - pict->alphaOrigin.y, width, alpha_buffer); for (i = 0; i < width; ++i) { int a = alpha_buffer[i]>>24; buffer[i] = (a << 24) @@ -3472,8 +3441,7 @@ static void fbStoreExternalAlpha(PicturePtr pict, int x, int y, int width, CARD3 } typedef void (*scanStoreProc)(PicturePtr , int , int , int , CARD32 *); -typedef void (*scanFetchProc)(PicturePtr , int , int , int , CARD32 *, - CARD32 *, CARD32); +typedef void (*scanFetchProc)(PicturePtr , int , int , int , CARD32 *); static void fbCompositeRect (const FbComposeData *data, CARD32 *scanline_buffer) @@ -3535,16 +3503,12 @@ fbCompositeRect (const FbComposeData *data, CARD32 *scanline_buffer) for (i = 0; i < data->height; ++i) { /* fill first half of scanline with source */ - fetchMask(data->mask, data->xMask, data->yMask + i, data->width, - mask_buffer, NULL, 0); - fetchSrc(data->src, data->xSrc, data->ySrc + i, data->width, - src_buffer, mask_buffer, 0); + fetchSrc(data->src, data->xSrc, data->ySrc + i, data->width, src_buffer); + fetchMask(data->mask, data->xMask, data->yMask + i, data->width, mask_buffer); /* fill dest into second half of scanline */ - if (fetchDest) { - fetchDest(data->dest, data->xDest, data->yDest + i, data->width, - dest_buffer, NULL, 0); - } + if (fetchDest) + fetchDest(data->dest, data->xDest, data->yDest + i, data->width, dest_buffer); /* blend */ compose(dest_buffer, src_buffer, mask_buffer, data->width); @@ -3553,27 +3517,17 @@ fbCompositeRect (const FbComposeData *data, CARD32 *scanline_buffer) store(data->dest, data->xDest, data->yDest + i, data->width, dest_buffer); } } else { - CARD32 *mask_buffer; + CombineFuncU compose = composeFunctions.combineU[data->op]; if (!compose) return; - if (fetchMask) - mask_buffer = dest_buffer + data->width; - else - mask_buffer = NULL; - if (fetchSrc == fbFetchSolid && (!fetchMask || fetchMask == fbFetchSolid)) { + fetchSrc(data->src, data->xSrc, data->ySrc, data->width, src_buffer); if (fetchMask) { - fetchMask(data->mask, data->xMask, data->yMask, data->width, - dest_buffer, NULL, 0); + fetchMask(data->mask, data->xMask, data->yMask, data->width, dest_buffer); + composeFunctions.combineMaskU(src_buffer, dest_buffer, data->width); } - fetchSrc(data->src, data->xSrc, data->ySrc, data->width, - src_buffer, mask_buffer, 0xff000000); - if (mask_buffer != NULL) { - composeFunctions.combineMaskU(src_buffer, dest_buffer, - data->width); - } fetchSrc = NULL; fetchMask = NULL; } @@ -3582,27 +3536,18 @@ fbCompositeRect (const FbComposeData *data, CARD32 *scanline_buffer) { /* fill first half of scanline with source */ if (fetchSrc) { - /* Fetch mask before source so that fetching of source can be - * optimized out if possible. - */ - if (fetchMask) { - fetchMask(data->mask, data->xMask, data->yMask + i, - data->width, dest_buffer, NULL, 0); - } - fetchSrc(data->src, data->xSrc, data->ySrc + i, data->width, - src_buffer, mask_buffer, 0xff000000); + fetchSrc(data->src, data->xSrc, data->ySrc + i, data->width, src_buffer); /* add in mask */ - if (mask_buffer != NULL) { + if (fetchMask) { + fetchMask(data->mask, data->xMask, data->yMask + i, data->width, dest_buffer); composeFunctions.combineMaskU(src_buffer, dest_buffer, data->width); } } /* fill dest into second half of scanline */ - if (fetchDest != NULL) { - fetchDest(data->dest, data->xDest, data->yDest + i, data->width, - dest_buffer, NULL, 0); - } + if (fetchDest) + fetchDest(data->dest, data->xDest, data->yDest + i, data->width, dest_buffer); /* blend */ compose(dest_buffer, src_buffer, data->width); From 59836c0f2abee3339e1aa30dacadb82e477943d6 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 5 Jul 2006 09:30:48 -0700 Subject: [PATCH 12/16] fix wrong function pointer type in hw/dmx/dmxcmap.c --- hw/dmx/dmxcmap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/dmx/dmxcmap.c b/hw/dmx/dmxcmap.c index f46dc5411..b4279e7ce 100644 --- a/hw/dmx/dmxcmap.c +++ b/hw/dmx/dmxcmap.c @@ -46,7 +46,7 @@ #include "micmap.h" -static int dmxInitColormapPrivateFunc(ColormapPtr pColormap) +static int dmxInitColormapPrivateFunc(ColormapPtr pColormap, int index) { return TRUE; } From cc3e99f747586f9d32622e5a682de39891b1fcba Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 5 Jul 2006 10:13:19 -0700 Subject: [PATCH 13/16] fix some more compiler warnings due to defines being declared differently --- hw/xfree86/os-support/shared/libc_wrapper.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hw/xfree86/os-support/shared/libc_wrapper.c b/hw/xfree86/os-support/shared/libc_wrapper.c index 1663893d9..fb1363ab2 100644 --- a/hw/xfree86/os-support/shared/libc_wrapper.c +++ b/hw/xfree86/os-support/shared/libc_wrapper.c @@ -89,8 +89,8 @@ extern int mmapFd; #include #endif -#define NEED_XF86_TYPES -#define NEED_XF86_PROTOTYPES +#define NEED_XF86_TYPES 1 +#define NEED_XF86_PROTOTYPES 1 #define DONT_DEFINE_WRAPPERS #include "xf86_ansic.h" From f059b61ab3af25b03c704669eddb838d3ce4366c Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 5 Jul 2006 11:47:25 -0700 Subject: [PATCH 14/16] fix compiler warning about xnestRecolorCursor() not being defined --- hw/xnest/XNCursor.h | 1 + 1 file changed, 1 insertion(+) diff --git a/hw/xnest/XNCursor.h b/hw/xnest/XNCursor.h index 8684a5e7f..6cbccfdec 100644 --- a/hw/xnest/XNCursor.h +++ b/hw/xnest/XNCursor.h @@ -29,6 +29,7 @@ typedef struct { Bool xnestRealizeCursor(ScreenPtr pScreen, CursorPtr pCursor); Bool xnestUnrealizeCursor(ScreenPtr pScreen, CursorPtr pCursor); +void xnestRecolorCursor(ScreenPtr pScreen, CursorPtr pCursor, Bool displayed); void xnestSetCursor (ScreenPtr pScreen, CursorPtr pCursor, int x, int y); void xnestMoveCursor (ScreenPtr pScreen, int x, int y); From 863f5cc31b747bc9f2fcd6a9e20c613a11733bf4 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 5 Jul 2006 13:26:34 -0700 Subject: [PATCH 15/16] fix compiler warning in hw/xfree86/common/xf86Config.c --- hw/xfree86/common/xf86Config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c index d9f1dd903..bcad246f5 100644 --- a/hw/xfree86/common/xf86Config.c +++ b/hw/xfree86/common/xf86Config.c @@ -75,6 +75,7 @@ extern DeviceAssocRec mouse_assoc; #endif #ifdef XKB +#undef XKB_IN_SERVER #define XKB_IN_SERVER #include #endif From eb35f812a5b65adcc5f6cbb91b31b69cae5d7f3d Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 5 Jul 2006 13:27:26 -0700 Subject: [PATCH 16/16] add another file to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 1e7970677..4118cd001 100644 --- a/.gitignore +++ b/.gitignore @@ -145,6 +145,7 @@ hw/xfree86/doc/man/Xorg.man hw/xfree86/doc/man/xorg.conf.5x hw/xfree86/doc/man/xorg.conf.man hw/xfree86/exa/exa.4 +hw/xfree86/exa/exa.4x hw/xfree86/exa/exa.man hw/xfree86/fbdevhw/fbdevhw.4x hw/xfree86/fbdevhw/fbdevhw.man