Signed-off-by: Kevin Brace <kevinbr...@gmx.com> --- src/Makefile.am | 2 +- src/tgui_xaa.c | 738 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/trident_accel.c | 738 ---------------------------------------------------- 3 files changed, 739 insertions(+), 739 deletions(-) create mode 100644 src/tgui_xaa.c delete mode 100644 src/trident_accel.c
diff --git a/src/Makefile.am b/src/Makefile.am index 9e65055..6c230ed 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -34,7 +34,7 @@ trident_drv_la_SOURCES = \ blade_accel_exa.c \ compat-api.h \ image_accel.c \ - trident_accel.c \ + tgui_xaa.c \ trident_bank.c \ trident_dac.c \ trident_dga.c \ diff --git a/src/tgui_xaa.c b/src/tgui_xaa.c new file mode 100644 index 0000000..8b38543 --- /dev/null +++ b/src/tgui_xaa.c @@ -0,0 +1,738 @@ +/* + * Copyright 1992-2003 by Alan Hourihane, North Wales, UK. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of Alan + * Hourihane not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Alan Hourihane makes no representations about the + * suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * + * Authors: Alan Hourihane, <al...@fairlite.demon.co.uk> + * + * Trident accelerated options. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" +#include "xf86_OSproc.h" + +#include "xf86Pci.h" + +#include "miline.h" + +#include "trident.h" +#include "trident_regs.h" + +#ifdef HAVE_XAA_H +#include "xaalocal.h" +#include "xaarop.h" + +static void TridentSync(ScrnInfoPtr pScrn); +static void TridentSetupForDashedLine(ScrnInfoPtr pScrn, + int fg, int bg, + int rop, + unsigned int planemask, + int length, + unsigned char *pattern); +static void TridentSubsequentDashedBresenhamLine(ScrnInfoPtr pScrn, + int x, int y, + int dmaj, int dmin, + int e, int len, + int octant, + int phase); +static void TridentSetupForSolidLine(ScrnInfoPtr pScrn, + int color, + int rop, + unsigned int planemask); +static void TridentSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn, + int x, int y, + int dmaj, int dmin, + int e, int len, + int octant); +static void TridentSubsequentSolidHorVertLine(ScrnInfoPtr pScrn, + int x, int y, + int len, int dir); +static void TridentSetupForFillRectSolid(ScrnInfoPtr pScrn, + int color, + int rop, + unsigned int planemask); +static void TridentSubsequentFillRectSolid(ScrnInfoPtr pScrn, + int x, int y, + int w, int h); +static void TridentSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, + int x1, int y1, + int x2, int y2, + int w, int h); +static void TridentSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, + int xdir, int ydir, + int rop, + unsigned int planemask, + int transparency_color); +static void TridentSetupForMono8x8PatternFill(ScrnInfoPtr pScrn, + int patternx, + int patterny, + int fg, int bg, + int rop, + unsigned int planemask); +static void TridentSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, + int patternx, + int patterny, + int x, int y, + int w, int h); +#if 0 +static void TridentSetupForColor8x8PatternFill(ScrnInfoPtr pScrn, + int patternx, + int patterny, + int rop, + unsigned int planemask, + int trans_col); +static void TridentSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn, + int patternx, + int patterny, + int x, int y, + int w, int h); +#endif +#if 0 +static void TridentSetupForScanlineCPUToScreenColorExpandFill( + ScrnInfoPtr pScrn, + int fg, int bg, + int rop, + unsigned int planemask); +static void TridentSubsequentScanlineCPUToScreenColorExpandFill( + ScrnInfoPtr pScrn, + int x, int y, + int w, int h, + int skipleft); +static void TridentSubsequentColorExpandScanline(ScrnInfoPtr pScrn, + int bufno); +#endif + + +static void +TridentInitializeAccelerator(ScrnInfoPtr pScrn) +{ + TRIDENTPtr pTrident = TRIDENTPTR(pScrn); + + /* This forces updating the clipper */ + pTrident->Clipping = TRUE; + + CHECKCLIPPING; + + if ((pTrident->Chipset == PROVIDIA9682) || + (pTrident->Chipset == CYBER9385) || + (pTrident->Chipset == CYBER9382)) + pTrident->EngineOperation |= 0x100; /* Disable Clipping */ + + TGUI_OPERMODE(pTrident->EngineOperation); + + pTrident->PatternLocation = pScrn->displayWidth * + pScrn->bitsPerPixel / 8; +} +#endif + +Bool +TridentAccelInit(ScreenPtr pScreen) +{ +#ifdef HAVE_XAA_H + XAAInfoRecPtr infoPtr; + ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); + TRIDENTPtr pTrident = TRIDENTPTR(pScrn); + + if (pTrident->NoAccel) + return FALSE; + + pTrident->AccelInfoRec = infoPtr = XAACreateInfoRec(); + if (!infoPtr) return FALSE; + + if (!((pTrident->Chipset == TGUI9440AGi) && + (pScrn->bitsPerPixel > 8))) + infoPtr->Flags = PIXMAP_CACHE | + OFFSCREEN_PIXMAPS | + LINEAR_FRAMEBUFFER; + + pTrident->InitializeAccelerator = TridentInitializeAccelerator; + TridentInitializeAccelerator(pScrn); + + infoPtr->PixmapCacheFlags = DO_NOT_BLIT_STIPPLES; + + infoPtr->Sync = TridentSync; + + infoPtr->SolidLineFlags = NO_PLANEMASK; + infoPtr->SetupForSolidLine = TridentSetupForSolidLine; + infoPtr->SolidBresenhamLineErrorTermBits = 12; + infoPtr->SubsequentSolidBresenhamLine = + TridentSubsequentSolidBresenhamLine; + infoPtr->SubsequentSolidHorVertLine = + TridentSubsequentSolidHorVertLine; + + infoPtr->DashedLineFlags = LINE_PATTERN_MSBFIRST_LSBJUSTIFIED | + NO_PLANEMASK | + LINE_PATTERN_POWER_OF_2_ONLY; + infoPtr->SetupForDashedLine = TridentSetupForDashedLine; + infoPtr->DashedBresenhamLineErrorTermBits = 12; + infoPtr->SubsequentDashedBresenhamLine = + TridentSubsequentDashedBresenhamLine; + infoPtr->DashPatternMaxLength = 16; + + infoPtr->SolidFillFlags = NO_PLANEMASK; + infoPtr->SetupForSolidFill = TridentSetupForFillRectSolid; + infoPtr->SubsequentSolidFillRect = TridentSubsequentFillRectSolid; + + infoPtr->ScreenToScreenCopyFlags = NO_PLANEMASK; + + if (!HAS_DST_TRANS) + infoPtr->ScreenToScreenCopyFlags |= NO_TRANSPARENCY; + + infoPtr->SetupForScreenToScreenCopy = + TridentSetupForScreenToScreenCopy; + infoPtr->SubsequentScreenToScreenCopy = + TridentSubsequentScreenToScreenCopy; + + if (!(((pTrident->Chipset == PROVIDIA9685) || + (pTrident->Chipset == CYBER9388)) && + (pScrn->bitsPerPixel > 8))) { + infoPtr->Mono8x8PatternFillFlags = NO_PLANEMASK | + HARDWARE_PATTERN_SCREEN_ORIGIN | + BIT_ORDER_IN_BYTE_MSBFIRST; + + infoPtr->SetupForMono8x8PatternFill = + TridentSetupForMono8x8PatternFill; + infoPtr->SubsequentMono8x8PatternFillRect = + TridentSubsequentMono8x8PatternFillRect; + } + +#if 0 + /* + * Not convinced this works 100% yet. + */ + infoPtr->Color8x8PatternFillFlags = NO_PLANEMASK | + HARDWARE_PATTERN_SCREEN_ORIGIN | + BIT_ORDER_IN_BYTE_MSBFIRST; + + if (!HAS_DST_TRANS) + infoPtr->Color8x8PatternFillFlags |= NO_TRANSPARENCY; + + infoPtr->SetupForColor8x8PatternFill = + TridentSetupForColor8x8PatternFill; + infoPtr->SubsequentColor8x8PatternFillRect = + TridentSubsequentColor8x8PatternFillRect; +#endif + +#if 0 + /* + * This is buggy, it only seems to work 95% of the time.... + */ + { + infoPtr->ScanlineCPUToScreenColorExpandFillFlags = + NO_PLANEMASK | + NO_TRANSPARENCY | + BIT_ORDER_IN_BYTE_MSBFIRST; + + pTrident->XAAScanlineColorExpandBuffers[0] = + xnfalloc(((pScrn->virtualX + 63)) * 4 * + (pScrn->bitsPerPixel / 8)); + + infoPtr->NumScanlineColorExpandBuffers = 1; + infoPtr->ScanlineColorExpandBuffers = + pTrident->XAAScanlineColorExpandBuffers; + + infoPtr->SetupForScanlineCPUToScreenColorExpandFill = + TridentSetupForScanlineCPUToScreenColorExpandFill; + infoPtr->SubsequentScanlineCPUToScreenColorExpandFill = + TridentSubsequentScanlineCPUToScreenColorExpandFill; + infoPtr->SubsequentColorExpandScanline = + TridentSubsequentColorExpandScanline; + } +#endif + + return(XAAInit(pScreen, infoPtr)); +#else + return FALSE; +#endif +} + +#ifdef HAVE_XAA_H +static void +TridentSync(ScrnInfoPtr pScrn) +{ + TRIDENTPtr pTrident = TRIDENTPTR(pScrn); + int count = 0, timeout = 0; + int busy; + + TGUI_OPERMODE(pTrident->EngineOperation); + + for (;;) { + BLTBUSY(busy); + if (busy != GE_BUSY) { + return; + } + + count++; + if (count == 10000000) { + ErrorF("Trident: BitBLT engine time-out.\n"); + count = 9990000; + timeout++; + if (timeout == 8) { + /* Reset BitBLT Engine */ + TGUI_STATUS(0x00); + return; + } + } + } +} + +static void +TridentClearSync(ScrnInfoPtr pScrn) +{ + TRIDENTPtr pTrident = TRIDENTPTR(pScrn); + int count = 0, timeout = 0; + int busy; + + for (;;) { + BLTBUSY(busy); + if (busy != GE_BUSY) { + return; + } + count++; + if (count == 10000000) { + ErrorF("Trident: BitBLT engine time-out.\n"); + count = 9990000; + timeout++; + if (timeout == 8) { + /* Reset BitBLT Engine */ + TGUI_STATUS(0x00); + return; + } + } + } +} + +static void +TridentSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, + int xdir, int ydir, + int rop, + unsigned int planemask, + int transparency_color) +{ + TRIDENTPtr pTrident = TRIDENTPTR(pScrn); + int dst = 0; + + pTrident->BltScanDirection = 0; + if (xdir < 0) pTrident->BltScanDirection |= XNEG; + if (ydir < 0) pTrident->BltScanDirection |= YNEG; + + REPLICATE(transparency_color); + if (transparency_color != -1) { + if ((pTrident->Chipset == PROVIDIA9685) || + (pTrident->Chipset == CYBER9388)) { + dst |= (1 << 16); + } else { + TGUI_OPERMODE(pTrident->EngineOperation | DST_ENABLE); + } + TGUI_CKEY(transparency_color); + } + + TGUI_DRAWFLAG(pTrident->DrawFlag | pTrident->BltScanDirection | + SCR2SCR | dst); + TGUI_FMIX(XAAGetCopyROP(rop)); +} + +static void +TridentSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, + int x1, int y1, + int x2, int y2, + int w, int h) +{ + TRIDENTPtr pTrident = TRIDENTPTR(pScrn); + + if (pTrident->BltScanDirection & YNEG) { + y1 = y1 + h - 1; + y2 = y2 + h - 1; + } + if (pTrident->BltScanDirection & XNEG) { + x1 = x1 + w - 1; + x2 = x2 + w - 1; + } + TGUI_SRC_XY(x1,y1); + TGUI_DEST_XY(x2, y2); + TGUI_DIM_XY(w, h); + TGUI_COMMAND(GE_BLT); + TridentClearSync(pScrn); +} + +static void +TridentSetupForSolidLine(ScrnInfoPtr pScrn, + int color, + int rop, + unsigned int planemask) +{ + TRIDENTPtr pTrident = TRIDENTPTR(pScrn); + + pTrident->BltScanDirection = 0; + REPLICATE(color); + TGUI_FMIX(XAAGetPatternROP(rop)); + if ((pTrident->Chipset == PROVIDIA9685) || + (pTrident->Chipset == CYBER9388)) { + TGUI_FPATCOL(color); + } else { + TGUI_FCOLOUR(color); + } +} + +static void +TridentSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn, + int x, int y, + int dmaj, int dmin, + int e, int len, int octant) +{ + TRIDENTPtr pTrident = TRIDENTPTR(pScrn); + int tmp = pTrident->BltScanDirection; + + if (octant & YMAJOR) tmp |= YMAJ; + if (octant & XDECREASING) tmp |= XNEG; + if (octant & YDECREASING) tmp |= YNEG; + TGUI_DRAWFLAG(pTrident->DrawFlag | SOLIDFILL | STENCIL | tmp); + TGUI_SRC_XY(dmin-dmaj,dmin); + TGUI_DEST_XY(x, y); + TGUI_DIM_XY(dmin + e, len); + TGUI_COMMAND(GE_BRESLINE); + TridentSync(pScrn); +} + +static void +TridentSubsequentSolidHorVertLine(ScrnInfoPtr pScrn, + int x, int y, + int len, int dir) +{ + TRIDENTPtr pTrident = TRIDENTPTR(pScrn); + + TGUI_DRAWFLAG(pTrident->DrawFlag | SOLIDFILL); + if (dir == DEGREES_0) { + TGUI_DIM_XY(len, 1); + TGUI_DEST_XY(x, y); + } else { + TGUI_DIM_XY(1, len); + TGUI_DEST_XY(x, y); + } + TGUI_COMMAND(GE_BLT); + TridentSync(pScrn); +} + +void +TridentSetupForDashedLine(ScrnInfoPtr pScrn, + int fg, int bg, + int rop, + unsigned int planemask, + int length, + unsigned char *pattern) +{ + TRIDENTPtr pTrident = TRIDENTPTR(pScrn); + CARD32 *DashPattern = (CARD32*)pattern; + CARD32 NiceDashPattern = DashPattern[0]; + + NiceDashPattern = *((CARD16 *)pattern) & ((1 << length) - 1); + switch(length) { + case 2: NiceDashPattern |= NiceDashPattern << 2; + case 4: NiceDashPattern |= NiceDashPattern << 4; + case 8: NiceDashPattern |= NiceDashPattern << 8; + } + pTrident->BltScanDirection = 0; + REPLICATE(fg); + if ((pTrident->Chipset == PROVIDIA9685) || + (pTrident->Chipset == CYBER9388)) { + TGUI_FPATCOL(fg); + if (bg == -1) { + pTrident->BltScanDirection |= (1 << 12); + TGUI_BPATCOL(~fg); + } else { + REPLICATE(bg); + TGUI_BPATCOL(bg); + } + } else { + TGUI_FCOLOUR(fg); + if (bg == -1) { + pTrident->BltScanDirection |= (1 << 12); + TGUI_BCOLOUR(~fg); + } else { + REPLICATE(bg); + TGUI_BCOLOUR(bg); + } + } + TGUI_FMIX(XAAGetPatternROP(rop)); + pTrident->LinePattern = NiceDashPattern; +} + + +void +TridentSubsequentDashedBresenhamLine(ScrnInfoPtr pScrn, + int x, int y, + int dmaj, int dmin, + int e, int len, + int octant, int phase) +{ + TRIDENTPtr pTrident = TRIDENTPTR(pScrn); + int tmp = pTrident->BltScanDirection; + + if (octant & YMAJOR) tmp |= YMAJ; + if (octant & XDECREASING) tmp |= XNEG; + if (octant & YDECREASING) tmp |= YNEG; + + TGUI_STYLE(((pTrident->LinePattern >> phase) | + (pTrident->LinePattern << (16-phase))) & 0x0000FFFF); + TGUI_DRAWFLAG(pTrident->DrawFlag | STENCIL | tmp); + TGUI_SRC_XY(dmin - dmaj, dmin); + TGUI_DEST_XY(x, y); + TGUI_DIM_XY(e + dmin, len); + TGUI_COMMAND(GE_BRESLINE); + TridentSync(pScrn); +} + +static void +TridentSetupForFillRectSolid(ScrnInfoPtr pScrn, + int color, + int rop, + unsigned int planemask) +{ + TRIDENTPtr pTrident = TRIDENTPTR(pScrn); + int drawflag = 0; + + REPLICATE(color); + TGUI_FMIX(XAAGetPatternROP(rop)); + if ((pTrident->Chipset == PROVIDIA9685) || + (pTrident->Chipset == CYBER9388)) { + TGUI_FPATCOL(color); + } else { + drawflag |= PATMONO; + TGUI_FCOLOUR(color); + } + + TGUI_DRAWFLAG(pTrident->DrawFlag | SOLIDFILL | drawflag); +} + +static void +TridentSubsequentFillRectSolid(ScrnInfoPtr pScrn, + int x, int y, + int w, int h) +{ + TRIDENTPtr pTrident = TRIDENTPTR(pScrn); + + TGUI_DIM_XY(w, h); + TGUI_DEST_XY(x, y); + TGUI_COMMAND(GE_BLT); + TridentSync(pScrn); +} + +#if 0 +static void +MoveDWORDS(register CARD32* dest, + register CARD32* src, + register int dwords) +{ + while(dwords & ~0x03) { + *dest = *src; + *(dest + 1) = *(src + 1); + *(dest + 2) = *(src + 2); + *(dest + 3) = *(src + 3); + src += 4; + dest += 4; + dwords -= 4; + } + + if (!dwords) return; + *dest = *src; + dest += 1; + src += 1; + if (dwords == 1) return; + *dest = *src; + dest += 1; + src += 1; + if (dwords == 2) return; + *dest = *src; + dest += 1; + src += 1; +} +#endif + +static void +TridentSetupForMono8x8PatternFill(ScrnInfoPtr pScrn, + int patternx, int patterny, + int fg, int bg, + int rop, + unsigned int planemask) +{ + TRIDENTPtr pTrident = TRIDENTPTR(pScrn); + int drawflag = 0; + + REPLICATE(fg); + if ((pTrident->Chipset == PROVIDIA9685) || + (pTrident->Chipset == CYBER9388)) + TGUI_FPATCOL(fg); + else + TGUI_FCOLOUR(fg); + + if (bg == -1) { + drawflag |= (1 << 12); + if ((pTrident->Chipset == PROVIDIA9685) || + (pTrident->Chipset == CYBER9388)) + TGUI_BPATCOL(~fg); + else + TGUI_BCOLOUR(~fg); + } else { + REPLICATE(bg); + if ((pTrident->Chipset == PROVIDIA9685) || + (pTrident->Chipset == CYBER9388)) + TGUI_BPATCOL(bg); + else + TGUI_BCOLOUR(bg); + } + + if ((pTrident->Chipset == PROVIDIA9685) || + (pTrident->Chipset == CYBER9388)) { + drawflag |= (7 << 18); + } + + TGUI_DRAWFLAG(pTrident->DrawFlag | PAT2SCR | PATMONO | drawflag); + TGUI_PATLOC(((patterny * pTrident->PatternLocation) + + (patternx * pScrn->bitsPerPixel / 8)) >> 6); + TGUI_FMIX(XAAGetPatternROP(rop)); +} + +static void +TridentSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, + int patternx, int patterny, + int x, int y, + int w, int h) +{ + TRIDENTPtr pTrident = TRIDENTPTR(pScrn); + + TGUI_DEST_XY(x, y); + TGUI_DIM_XY(w, h); + TGUI_COMMAND(GE_BLT); + TridentSync(pScrn); +} + +#if 0 +static void +TridentSetupForColor8x8PatternFill(ScrnInfoPtr pScrn, + int patternx, int patterny, + int rop, + unsigned int planemask, + int transparency_color) +{ + TRIDENTPtr pTrident = TRIDENTPTR(pScrn); + int drawflag = 0; + + REPLICATE(transparency_color); + if (transparency_color != -1) { + if ((pTrident->Chipset == PROVIDIA9685) || + (pTrident->Chipset == CYBER9388)) { + drawflag |= (1 << 16); + } else { + TGUI_OPERMODE(pTrident->EngineOperation | DST_ENABLE); + } + + TGUI_CKEY(transparency_color); + } + + TGUI_DRAWFLAG(pTrident->DrawFlag | PAT2SCR | drawflag); + TGUI_PATLOC(((patterny * pTrident->PatternLocation) + + (patternx * pScrn->bitsPerPixel / 8)) >> 6); + TGUI_FMIX(XAAGetPatternROP(rop)); +} + +static void +TridentSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn, + int patternx, int patterny, + int x, int y, + int w, int h) +{ + TRIDENTPtr pTrident = TRIDENTPTR(pScrn); + + TGUI_DEST_XY(x, y); + TGUI_DIM_XY(w, h); + TGUI_COMMAND(GE_BLT); + TridentClearSync(pScrn); +} +#endif + +#if 0 +static void +TridentSetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, + int fg, int bg, + int rop, + unsigned int planemask) +{ + TRIDENTPtr pTrident = TRIDENTPTR(pScrn); + int drawflag = SRCMONO; + + REPLICATE(fg); + TGUI_FCOLOUR(fg); + if (bg == -1) { + drawflag |= (1 << 12); + TGUI_BCOLOUR(~fg); + } else { + REPLICATE(bg); + TGUI_BCOLOUR(bg); + } + + TGUI_SRC_XY(0, 0); + TGUI_DRAWFLAG(drawflag); + TGUI_FMIX(XAAGetCopyROP(rop)); +} + +static void +TridentSubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, + int x, int y, + int w, int h, + int skipleft) +{ + TRIDENTPtr pTrident = TRIDENTPTR(pScrn); + pTrident->dwords = ((w + 31) >> 5); + pTrident->h = h; + pTrident->y = y; + pTrident->x = x; + pTrident->w = w; + + TGUI_DEST_XY(x, pTrident->y++); + TGUI_DIM_XY(w, 1); + TGUI_COMMAND(GE_BLT); +} + +static void +TridentSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno) +{ + TRIDENTPtr pTrident = TRIDENTPTR(pScrn); + XAAInfoRecPtr infoRec; + infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn); + + MoveDWORDS((CARD32 *)pTrident->FbBase, + (CARD32 *)pTrident->XAAScanlineColorExpandBuffers[0], + pTrident->dwords); + + pTrident->h--; + TridentSync(pScrn); + if (pTrident->h) { + TGUI_DEST_XY(pTrident->x, pTrident->y++); + TGUI_DIM_XY(pTrident->w, 1); + TGUI_COMMAND(GE_BLT); + } +} +#endif +#endif diff --git a/src/trident_accel.c b/src/trident_accel.c deleted file mode 100644 index 8b38543..0000000 --- a/src/trident_accel.c +++ /dev/null @@ -1,738 +0,0 @@ -/* - * Copyright 1992-2003 by Alan Hourihane, North Wales, UK. - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies - * and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of Alan - * Hourihane not be used in advertising or publicity pertaining to - * distribution of the software without specific, written prior - * permission. Alan Hourihane makes no representations about the - * suitability of this software for any purpose. It is provided - * "as is" without express or implied warranty. - * - * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS, IN NO EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY - * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN - * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * - * Authors: Alan Hourihane, <al...@fairlite.demon.co.uk> - * - * Trident accelerated options. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "xf86.h" -#include "xf86_OSproc.h" - -#include "xf86Pci.h" - -#include "miline.h" - -#include "trident.h" -#include "trident_regs.h" - -#ifdef HAVE_XAA_H -#include "xaalocal.h" -#include "xaarop.h" - -static void TridentSync(ScrnInfoPtr pScrn); -static void TridentSetupForDashedLine(ScrnInfoPtr pScrn, - int fg, int bg, - int rop, - unsigned int planemask, - int length, - unsigned char *pattern); -static void TridentSubsequentDashedBresenhamLine(ScrnInfoPtr pScrn, - int x, int y, - int dmaj, int dmin, - int e, int len, - int octant, - int phase); -static void TridentSetupForSolidLine(ScrnInfoPtr pScrn, - int color, - int rop, - unsigned int planemask); -static void TridentSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn, - int x, int y, - int dmaj, int dmin, - int e, int len, - int octant); -static void TridentSubsequentSolidHorVertLine(ScrnInfoPtr pScrn, - int x, int y, - int len, int dir); -static void TridentSetupForFillRectSolid(ScrnInfoPtr pScrn, - int color, - int rop, - unsigned int planemask); -static void TridentSubsequentFillRectSolid(ScrnInfoPtr pScrn, - int x, int y, - int w, int h); -static void TridentSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, - int x1, int y1, - int x2, int y2, - int w, int h); -static void TridentSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, - int xdir, int ydir, - int rop, - unsigned int planemask, - int transparency_color); -static void TridentSetupForMono8x8PatternFill(ScrnInfoPtr pScrn, - int patternx, - int patterny, - int fg, int bg, - int rop, - unsigned int planemask); -static void TridentSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, - int patternx, - int patterny, - int x, int y, - int w, int h); -#if 0 -static void TridentSetupForColor8x8PatternFill(ScrnInfoPtr pScrn, - int patternx, - int patterny, - int rop, - unsigned int planemask, - int trans_col); -static void TridentSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn, - int patternx, - int patterny, - int x, int y, - int w, int h); -#endif -#if 0 -static void TridentSetupForScanlineCPUToScreenColorExpandFill( - ScrnInfoPtr pScrn, - int fg, int bg, - int rop, - unsigned int planemask); -static void TridentSubsequentScanlineCPUToScreenColorExpandFill( - ScrnInfoPtr pScrn, - int x, int y, - int w, int h, - int skipleft); -static void TridentSubsequentColorExpandScanline(ScrnInfoPtr pScrn, - int bufno); -#endif - - -static void -TridentInitializeAccelerator(ScrnInfoPtr pScrn) -{ - TRIDENTPtr pTrident = TRIDENTPTR(pScrn); - - /* This forces updating the clipper */ - pTrident->Clipping = TRUE; - - CHECKCLIPPING; - - if ((pTrident->Chipset == PROVIDIA9682) || - (pTrident->Chipset == CYBER9385) || - (pTrident->Chipset == CYBER9382)) - pTrident->EngineOperation |= 0x100; /* Disable Clipping */ - - TGUI_OPERMODE(pTrident->EngineOperation); - - pTrident->PatternLocation = pScrn->displayWidth * - pScrn->bitsPerPixel / 8; -} -#endif - -Bool -TridentAccelInit(ScreenPtr pScreen) -{ -#ifdef HAVE_XAA_H - XAAInfoRecPtr infoPtr; - ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); - TRIDENTPtr pTrident = TRIDENTPTR(pScrn); - - if (pTrident->NoAccel) - return FALSE; - - pTrident->AccelInfoRec = infoPtr = XAACreateInfoRec(); - if (!infoPtr) return FALSE; - - if (!((pTrident->Chipset == TGUI9440AGi) && - (pScrn->bitsPerPixel > 8))) - infoPtr->Flags = PIXMAP_CACHE | - OFFSCREEN_PIXMAPS | - LINEAR_FRAMEBUFFER; - - pTrident->InitializeAccelerator = TridentInitializeAccelerator; - TridentInitializeAccelerator(pScrn); - - infoPtr->PixmapCacheFlags = DO_NOT_BLIT_STIPPLES; - - infoPtr->Sync = TridentSync; - - infoPtr->SolidLineFlags = NO_PLANEMASK; - infoPtr->SetupForSolidLine = TridentSetupForSolidLine; - infoPtr->SolidBresenhamLineErrorTermBits = 12; - infoPtr->SubsequentSolidBresenhamLine = - TridentSubsequentSolidBresenhamLine; - infoPtr->SubsequentSolidHorVertLine = - TridentSubsequentSolidHorVertLine; - - infoPtr->DashedLineFlags = LINE_PATTERN_MSBFIRST_LSBJUSTIFIED | - NO_PLANEMASK | - LINE_PATTERN_POWER_OF_2_ONLY; - infoPtr->SetupForDashedLine = TridentSetupForDashedLine; - infoPtr->DashedBresenhamLineErrorTermBits = 12; - infoPtr->SubsequentDashedBresenhamLine = - TridentSubsequentDashedBresenhamLine; - infoPtr->DashPatternMaxLength = 16; - - infoPtr->SolidFillFlags = NO_PLANEMASK; - infoPtr->SetupForSolidFill = TridentSetupForFillRectSolid; - infoPtr->SubsequentSolidFillRect = TridentSubsequentFillRectSolid; - - infoPtr->ScreenToScreenCopyFlags = NO_PLANEMASK; - - if (!HAS_DST_TRANS) - infoPtr->ScreenToScreenCopyFlags |= NO_TRANSPARENCY; - - infoPtr->SetupForScreenToScreenCopy = - TridentSetupForScreenToScreenCopy; - infoPtr->SubsequentScreenToScreenCopy = - TridentSubsequentScreenToScreenCopy; - - if (!(((pTrident->Chipset == PROVIDIA9685) || - (pTrident->Chipset == CYBER9388)) && - (pScrn->bitsPerPixel > 8))) { - infoPtr->Mono8x8PatternFillFlags = NO_PLANEMASK | - HARDWARE_PATTERN_SCREEN_ORIGIN | - BIT_ORDER_IN_BYTE_MSBFIRST; - - infoPtr->SetupForMono8x8PatternFill = - TridentSetupForMono8x8PatternFill; - infoPtr->SubsequentMono8x8PatternFillRect = - TridentSubsequentMono8x8PatternFillRect; - } - -#if 0 - /* - * Not convinced this works 100% yet. - */ - infoPtr->Color8x8PatternFillFlags = NO_PLANEMASK | - HARDWARE_PATTERN_SCREEN_ORIGIN | - BIT_ORDER_IN_BYTE_MSBFIRST; - - if (!HAS_DST_TRANS) - infoPtr->Color8x8PatternFillFlags |= NO_TRANSPARENCY; - - infoPtr->SetupForColor8x8PatternFill = - TridentSetupForColor8x8PatternFill; - infoPtr->SubsequentColor8x8PatternFillRect = - TridentSubsequentColor8x8PatternFillRect; -#endif - -#if 0 - /* - * This is buggy, it only seems to work 95% of the time.... - */ - { - infoPtr->ScanlineCPUToScreenColorExpandFillFlags = - NO_PLANEMASK | - NO_TRANSPARENCY | - BIT_ORDER_IN_BYTE_MSBFIRST; - - pTrident->XAAScanlineColorExpandBuffers[0] = - xnfalloc(((pScrn->virtualX + 63)) * 4 * - (pScrn->bitsPerPixel / 8)); - - infoPtr->NumScanlineColorExpandBuffers = 1; - infoPtr->ScanlineColorExpandBuffers = - pTrident->XAAScanlineColorExpandBuffers; - - infoPtr->SetupForScanlineCPUToScreenColorExpandFill = - TridentSetupForScanlineCPUToScreenColorExpandFill; - infoPtr->SubsequentScanlineCPUToScreenColorExpandFill = - TridentSubsequentScanlineCPUToScreenColorExpandFill; - infoPtr->SubsequentColorExpandScanline = - TridentSubsequentColorExpandScanline; - } -#endif - - return(XAAInit(pScreen, infoPtr)); -#else - return FALSE; -#endif -} - -#ifdef HAVE_XAA_H -static void -TridentSync(ScrnInfoPtr pScrn) -{ - TRIDENTPtr pTrident = TRIDENTPTR(pScrn); - int count = 0, timeout = 0; - int busy; - - TGUI_OPERMODE(pTrident->EngineOperation); - - for (;;) { - BLTBUSY(busy); - if (busy != GE_BUSY) { - return; - } - - count++; - if (count == 10000000) { - ErrorF("Trident: BitBLT engine time-out.\n"); - count = 9990000; - timeout++; - if (timeout == 8) { - /* Reset BitBLT Engine */ - TGUI_STATUS(0x00); - return; - } - } - } -} - -static void -TridentClearSync(ScrnInfoPtr pScrn) -{ - TRIDENTPtr pTrident = TRIDENTPTR(pScrn); - int count = 0, timeout = 0; - int busy; - - for (;;) { - BLTBUSY(busy); - if (busy != GE_BUSY) { - return; - } - count++; - if (count == 10000000) { - ErrorF("Trident: BitBLT engine time-out.\n"); - count = 9990000; - timeout++; - if (timeout == 8) { - /* Reset BitBLT Engine */ - TGUI_STATUS(0x00); - return; - } - } - } -} - -static void -TridentSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, - int xdir, int ydir, - int rop, - unsigned int planemask, - int transparency_color) -{ - TRIDENTPtr pTrident = TRIDENTPTR(pScrn); - int dst = 0; - - pTrident->BltScanDirection = 0; - if (xdir < 0) pTrident->BltScanDirection |= XNEG; - if (ydir < 0) pTrident->BltScanDirection |= YNEG; - - REPLICATE(transparency_color); - if (transparency_color != -1) { - if ((pTrident->Chipset == PROVIDIA9685) || - (pTrident->Chipset == CYBER9388)) { - dst |= (1 << 16); - } else { - TGUI_OPERMODE(pTrident->EngineOperation | DST_ENABLE); - } - TGUI_CKEY(transparency_color); - } - - TGUI_DRAWFLAG(pTrident->DrawFlag | pTrident->BltScanDirection | - SCR2SCR | dst); - TGUI_FMIX(XAAGetCopyROP(rop)); -} - -static void -TridentSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, - int x1, int y1, - int x2, int y2, - int w, int h) -{ - TRIDENTPtr pTrident = TRIDENTPTR(pScrn); - - if (pTrident->BltScanDirection & YNEG) { - y1 = y1 + h - 1; - y2 = y2 + h - 1; - } - if (pTrident->BltScanDirection & XNEG) { - x1 = x1 + w - 1; - x2 = x2 + w - 1; - } - TGUI_SRC_XY(x1,y1); - TGUI_DEST_XY(x2, y2); - TGUI_DIM_XY(w, h); - TGUI_COMMAND(GE_BLT); - TridentClearSync(pScrn); -} - -static void -TridentSetupForSolidLine(ScrnInfoPtr pScrn, - int color, - int rop, - unsigned int planemask) -{ - TRIDENTPtr pTrident = TRIDENTPTR(pScrn); - - pTrident->BltScanDirection = 0; - REPLICATE(color); - TGUI_FMIX(XAAGetPatternROP(rop)); - if ((pTrident->Chipset == PROVIDIA9685) || - (pTrident->Chipset == CYBER9388)) { - TGUI_FPATCOL(color); - } else { - TGUI_FCOLOUR(color); - } -} - -static void -TridentSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn, - int x, int y, - int dmaj, int dmin, - int e, int len, int octant) -{ - TRIDENTPtr pTrident = TRIDENTPTR(pScrn); - int tmp = pTrident->BltScanDirection; - - if (octant & YMAJOR) tmp |= YMAJ; - if (octant & XDECREASING) tmp |= XNEG; - if (octant & YDECREASING) tmp |= YNEG; - TGUI_DRAWFLAG(pTrident->DrawFlag | SOLIDFILL | STENCIL | tmp); - TGUI_SRC_XY(dmin-dmaj,dmin); - TGUI_DEST_XY(x, y); - TGUI_DIM_XY(dmin + e, len); - TGUI_COMMAND(GE_BRESLINE); - TridentSync(pScrn); -} - -static void -TridentSubsequentSolidHorVertLine(ScrnInfoPtr pScrn, - int x, int y, - int len, int dir) -{ - TRIDENTPtr pTrident = TRIDENTPTR(pScrn); - - TGUI_DRAWFLAG(pTrident->DrawFlag | SOLIDFILL); - if (dir == DEGREES_0) { - TGUI_DIM_XY(len, 1); - TGUI_DEST_XY(x, y); - } else { - TGUI_DIM_XY(1, len); - TGUI_DEST_XY(x, y); - } - TGUI_COMMAND(GE_BLT); - TridentSync(pScrn); -} - -void -TridentSetupForDashedLine(ScrnInfoPtr pScrn, - int fg, int bg, - int rop, - unsigned int planemask, - int length, - unsigned char *pattern) -{ - TRIDENTPtr pTrident = TRIDENTPTR(pScrn); - CARD32 *DashPattern = (CARD32*)pattern; - CARD32 NiceDashPattern = DashPattern[0]; - - NiceDashPattern = *((CARD16 *)pattern) & ((1 << length) - 1); - switch(length) { - case 2: NiceDashPattern |= NiceDashPattern << 2; - case 4: NiceDashPattern |= NiceDashPattern << 4; - case 8: NiceDashPattern |= NiceDashPattern << 8; - } - pTrident->BltScanDirection = 0; - REPLICATE(fg); - if ((pTrident->Chipset == PROVIDIA9685) || - (pTrident->Chipset == CYBER9388)) { - TGUI_FPATCOL(fg); - if (bg == -1) { - pTrident->BltScanDirection |= (1 << 12); - TGUI_BPATCOL(~fg); - } else { - REPLICATE(bg); - TGUI_BPATCOL(bg); - } - } else { - TGUI_FCOLOUR(fg); - if (bg == -1) { - pTrident->BltScanDirection |= (1 << 12); - TGUI_BCOLOUR(~fg); - } else { - REPLICATE(bg); - TGUI_BCOLOUR(bg); - } - } - TGUI_FMIX(XAAGetPatternROP(rop)); - pTrident->LinePattern = NiceDashPattern; -} - - -void -TridentSubsequentDashedBresenhamLine(ScrnInfoPtr pScrn, - int x, int y, - int dmaj, int dmin, - int e, int len, - int octant, int phase) -{ - TRIDENTPtr pTrident = TRIDENTPTR(pScrn); - int tmp = pTrident->BltScanDirection; - - if (octant & YMAJOR) tmp |= YMAJ; - if (octant & XDECREASING) tmp |= XNEG; - if (octant & YDECREASING) tmp |= YNEG; - - TGUI_STYLE(((pTrident->LinePattern >> phase) | - (pTrident->LinePattern << (16-phase))) & 0x0000FFFF); - TGUI_DRAWFLAG(pTrident->DrawFlag | STENCIL | tmp); - TGUI_SRC_XY(dmin - dmaj, dmin); - TGUI_DEST_XY(x, y); - TGUI_DIM_XY(e + dmin, len); - TGUI_COMMAND(GE_BRESLINE); - TridentSync(pScrn); -} - -static void -TridentSetupForFillRectSolid(ScrnInfoPtr pScrn, - int color, - int rop, - unsigned int planemask) -{ - TRIDENTPtr pTrident = TRIDENTPTR(pScrn); - int drawflag = 0; - - REPLICATE(color); - TGUI_FMIX(XAAGetPatternROP(rop)); - if ((pTrident->Chipset == PROVIDIA9685) || - (pTrident->Chipset == CYBER9388)) { - TGUI_FPATCOL(color); - } else { - drawflag |= PATMONO; - TGUI_FCOLOUR(color); - } - - TGUI_DRAWFLAG(pTrident->DrawFlag | SOLIDFILL | drawflag); -} - -static void -TridentSubsequentFillRectSolid(ScrnInfoPtr pScrn, - int x, int y, - int w, int h) -{ - TRIDENTPtr pTrident = TRIDENTPTR(pScrn); - - TGUI_DIM_XY(w, h); - TGUI_DEST_XY(x, y); - TGUI_COMMAND(GE_BLT); - TridentSync(pScrn); -} - -#if 0 -static void -MoveDWORDS(register CARD32* dest, - register CARD32* src, - register int dwords) -{ - while(dwords & ~0x03) { - *dest = *src; - *(dest + 1) = *(src + 1); - *(dest + 2) = *(src + 2); - *(dest + 3) = *(src + 3); - src += 4; - dest += 4; - dwords -= 4; - } - - if (!dwords) return; - *dest = *src; - dest += 1; - src += 1; - if (dwords == 1) return; - *dest = *src; - dest += 1; - src += 1; - if (dwords == 2) return; - *dest = *src; - dest += 1; - src += 1; -} -#endif - -static void -TridentSetupForMono8x8PatternFill(ScrnInfoPtr pScrn, - int patternx, int patterny, - int fg, int bg, - int rop, - unsigned int planemask) -{ - TRIDENTPtr pTrident = TRIDENTPTR(pScrn); - int drawflag = 0; - - REPLICATE(fg); - if ((pTrident->Chipset == PROVIDIA9685) || - (pTrident->Chipset == CYBER9388)) - TGUI_FPATCOL(fg); - else - TGUI_FCOLOUR(fg); - - if (bg == -1) { - drawflag |= (1 << 12); - if ((pTrident->Chipset == PROVIDIA9685) || - (pTrident->Chipset == CYBER9388)) - TGUI_BPATCOL(~fg); - else - TGUI_BCOLOUR(~fg); - } else { - REPLICATE(bg); - if ((pTrident->Chipset == PROVIDIA9685) || - (pTrident->Chipset == CYBER9388)) - TGUI_BPATCOL(bg); - else - TGUI_BCOLOUR(bg); - } - - if ((pTrident->Chipset == PROVIDIA9685) || - (pTrident->Chipset == CYBER9388)) { - drawflag |= (7 << 18); - } - - TGUI_DRAWFLAG(pTrident->DrawFlag | PAT2SCR | PATMONO | drawflag); - TGUI_PATLOC(((patterny * pTrident->PatternLocation) + - (patternx * pScrn->bitsPerPixel / 8)) >> 6); - TGUI_FMIX(XAAGetPatternROP(rop)); -} - -static void -TridentSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, - int patternx, int patterny, - int x, int y, - int w, int h) -{ - TRIDENTPtr pTrident = TRIDENTPTR(pScrn); - - TGUI_DEST_XY(x, y); - TGUI_DIM_XY(w, h); - TGUI_COMMAND(GE_BLT); - TridentSync(pScrn); -} - -#if 0 -static void -TridentSetupForColor8x8PatternFill(ScrnInfoPtr pScrn, - int patternx, int patterny, - int rop, - unsigned int planemask, - int transparency_color) -{ - TRIDENTPtr pTrident = TRIDENTPTR(pScrn); - int drawflag = 0; - - REPLICATE(transparency_color); - if (transparency_color != -1) { - if ((pTrident->Chipset == PROVIDIA9685) || - (pTrident->Chipset == CYBER9388)) { - drawflag |= (1 << 16); - } else { - TGUI_OPERMODE(pTrident->EngineOperation | DST_ENABLE); - } - - TGUI_CKEY(transparency_color); - } - - TGUI_DRAWFLAG(pTrident->DrawFlag | PAT2SCR | drawflag); - TGUI_PATLOC(((patterny * pTrident->PatternLocation) + - (patternx * pScrn->bitsPerPixel / 8)) >> 6); - TGUI_FMIX(XAAGetPatternROP(rop)); -} - -static void -TridentSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn, - int patternx, int patterny, - int x, int y, - int w, int h) -{ - TRIDENTPtr pTrident = TRIDENTPTR(pScrn); - - TGUI_DEST_XY(x, y); - TGUI_DIM_XY(w, h); - TGUI_COMMAND(GE_BLT); - TridentClearSync(pScrn); -} -#endif - -#if 0 -static void -TridentSetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, - int fg, int bg, - int rop, - unsigned int planemask) -{ - TRIDENTPtr pTrident = TRIDENTPTR(pScrn); - int drawflag = SRCMONO; - - REPLICATE(fg); - TGUI_FCOLOUR(fg); - if (bg == -1) { - drawflag |= (1 << 12); - TGUI_BCOLOUR(~fg); - } else { - REPLICATE(bg); - TGUI_BCOLOUR(bg); - } - - TGUI_SRC_XY(0, 0); - TGUI_DRAWFLAG(drawflag); - TGUI_FMIX(XAAGetCopyROP(rop)); -} - -static void -TridentSubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, - int x, int y, - int w, int h, - int skipleft) -{ - TRIDENTPtr pTrident = TRIDENTPTR(pScrn); - pTrident->dwords = ((w + 31) >> 5); - pTrident->h = h; - pTrident->y = y; - pTrident->x = x; - pTrident->w = w; - - TGUI_DEST_XY(x, pTrident->y++); - TGUI_DIM_XY(w, 1); - TGUI_COMMAND(GE_BLT); -} - -static void -TridentSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno) -{ - TRIDENTPtr pTrident = TRIDENTPTR(pScrn); - XAAInfoRecPtr infoRec; - infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn); - - MoveDWORDS((CARD32 *)pTrident->FbBase, - (CARD32 *)pTrident->XAAScanlineColorExpandBuffers[0], - pTrident->dwords); - - pTrident->h--; - TridentSync(pScrn); - if (pTrident->h) { - TGUI_DEST_XY(pTrident->x, pTrident->y++); - TGUI_DIM_XY(pTrident->w, 1); - TGUI_COMMAND(GE_BLT); - } -} -#endif -#endif -- 2.7.4 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: https://lists.x.org/mailman/listinfo/xorg-devel