Common subdirectories: tdfx/CVS and tdfx_exa/CVS diff -u -N tdfx/Imakefile tdfx_exa/Imakefile --- tdfx/Imakefile 2005-03-07 14:27:24.000000000 -0500 +++ tdfx_exa/Imakefile 2005-08-10 01:42:32.000000000 -0400 @@ -22,10 +22,10 @@ XVOBJS = tdfx_video.o #endif -SRCS = tdfx_driver.c tdfx_io.c tdfx_hwcurs.c tdfx_accel.c \ +SRCS = tdfx_driver.c tdfx_io.c tdfx_hwcurs.c tdfx_accel.c tdfx_exa.c \ tdfx_dga.c tdfx_priv.c tdfx_sli.c $(XVSRCS) $(DRISRCS) -OBJS = tdfx_driver.o tdfx_io.o tdfx_hwcurs.o tdfx_accel.o \ +OBJS = tdfx_driver.o tdfx_io.o tdfx_hwcurs.o tdfx_accel.o tdfx_exa.o \ tdfx_dga.o tdfx_priv.o tdfx_sli.o $(XVOBJS) $(DRIOBJS) #if defined(XF86DriverSDK) @@ -33,7 +33,7 @@ #else INCLUDES = -I. -I$(XF86COMSRC) -I$(XF86OSSRC) \ -I$(SERVERSRC)/mfb -I$(SERVERSRC)/mi \ - -I$(XF86SRC)/xaa -I$(XF86SRC)/rac -I$(XF86SRC)/int10 \ + -I$(XF86SRC)/exa -I$(XF86SRC)/rac -I$(XF86SRC)/int10 \ -I$(SERVERSRC)/fb -I$(XF86SRC)/xaa -I$(XF86SRC)/ramdac \ -I$(XF86SRC)/vgahw -I$(XF86SRC)/ddc -I$(XF86SRC)/i2c \ -I$(XF86SRC)/ddc -I$(XF86SRC)/vbe -I$(SERVERSRC)/Xext \ @@ -65,6 +65,7 @@ InstallDriverSDKNonExecFile(tdfxdefs.h,$(DRIVERSDKDIR)/drivers/tdfx) InstallDriverSDKNonExecFile(tdfx_accel.c,$(DRIVERSDKDIR)/drivers/tdfx) +InstallDriverSDKNonExecFile(tdfx_exa.c,$(DRIVERSDKDIR)/drivers/tdfx) InstallDriverSDKNonExecFile(tdfx_dga.c,$(DRIVERSDKDIR)/drivers/tdfx) InstallDriverSDKNonExecFile(tdfx_dri.c,$(DRIVERSDKDIR)/drivers/tdfx) InstallDriverSDKNonExecFile(tdfx_dri.h,$(DRIVERSDKDIR)/drivers/tdfx) diff -u -N tdfx/tdfx_accel.c tdfx_exa/tdfx_accel.c --- tdfx/tdfx_accel.c 2005-07-10 22:30:02.000000000 -0400 +++ tdfx_exa/tdfx_accel.c 2005-08-10 01:06:58.000000000 -0400 @@ -83,7 +83,7 @@ TDFXNeedSync(ScrnInfoPtr pScrn) { TDFXPtr pTDFX = TDFXPTR(pScrn); pTDFX->syncDone=FALSE; - pTDFX->AccelInfoRec->NeedToSync = TRUE; + pTDFX->XaaInfoRec->NeedToSync = TRUE; } void @@ -206,14 +206,14 @@ } Bool -TDFXAccelInit(ScreenPtr pScreen) +TDFXXaaInit(ScreenPtr pScreen) { XAAInfoRecPtr infoPtr; ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; TDFXPtr pTDFX = TDFXPTR(pScrn); CARD32 commonFlags; - pTDFX->AccelInfoRec = infoPtr = XAACreateInfoRec(); + pTDFX->XaaInfoRec = infoPtr = XAACreateInfoRec(); if (!infoPtr) return FALSE; infoPtr->Flags = PIXMAP_CACHE | OFFSCREEN_PIXMAPS | LINEAR_FRAMEBUFFER; diff -u -N tdfx/tdfx_dga.c tdfx_exa/tdfx_dga.c --- tdfx/tdfx_dga.c 2005-07-10 22:30:02.000000000 -0400 +++ tdfx_exa/tdfx_dga.c 2005-08-10 01:08:20.000000000 -0400 @@ -158,9 +158,9 @@ { TDFXPtr pTDFX = TDFXPTR(pScrn); - if (pTDFX->AccelInfoRec) { - (*pTDFX->AccelInfoRec->SetupForSolidFill)(pScrn, color, GXcopy, ~0); - (*pTDFX->AccelInfoRec->SubsequentSolidFillRect)(pScrn, x, y, w, h); + if (pTDFX->XaaInfoRec) { + (*pTDFX->XaaInfoRec->SetupForSolidFill)(pScrn, color, GXcopy, ~0); + (*pTDFX->XaaInfoRec->SubsequentSolidFillRect)(pScrn, x, y, w, h); } } @@ -170,12 +170,12 @@ { TDFXPtr pTDFX = TDFXPTR(pScrn); - if (pTDFX->AccelInfoRec) { + if (pTDFX->XaaInfoRec) { int xdir = ((srcx < dstx) && (srcy == dsty)) ? -1 : 1; int ydir = (srcy < dsty) ? -1 : 1; - (*pTDFX->AccelInfoRec->SetupForScreenToScreenCopy)(pScrn, xdir, ydir, GXcopy, ~0, -1); - (*pTDFX->AccelInfoRec->SubsequentScreenToScreenCopy)(pScrn, srcx, srcy, dstx, dsty, w, h); + (*pTDFX->XaaInfoRec->SetupForScreenToScreenCopy)(pScrn, xdir, ydir, GXcopy, ~0, -1); + (*pTDFX->XaaInfoRec->SubsequentScreenToScreenCopy)(pScrn, srcx, srcy, dstx, dsty, w, h); } } diff -u -N tdfx/tdfx_dri.c tdfx_exa/tdfx_dri.c --- tdfx/tdfx_dri.c 2005-07-10 22:30:02.000000000 -0400 +++ tdfx_exa/tdfx_dri.c 2005-08-10 01:11:19.000000000 -0400 @@ -551,7 +551,7 @@ } TDFXSelectBuffer(pTDFX, TDFX_FRONT); - pTDFX->AccelInfoRec->NeedToSync = TRUE; + if (pTDFX->XaaInfoRec) pTDFX->XaaInfoRec->NeedToSync = TRUE; } static void @@ -592,7 +592,7 @@ TDFXSelectBuffer(pTDFX, TDFX_FRONT); - pTDFX->AccelInfoRec->NeedToSync = TRUE; + if (pTDFX->XaaInfoRec) pTDFX->XaaInfoRec->NeedToSync = TRUE; } static Bool diff -u -N tdfx/tdfx_driver.c tdfx_exa/tdfx_driver.c --- tdfx/tdfx_driver.c 2005-08-05 19:04:33.000000000 -0400 +++ tdfx_exa/tdfx_driver.c 2005-08-10 06:01:19.000000000 -0400 @@ -177,7 +177,8 @@ OPTION_VIDEO_KEY, OPTION_NO_SLI, OPTION_TEXTURED_VIDEO, - OPTION_DRI + OPTION_DRI, + OPTION_ACCELMETHOD } TDFXOpts; static const OptionInfoRec TDFXOptions[] = { @@ -189,6 +190,7 @@ { OPTION_NO_SLI, "NoSLI", OPTV_BOOLEAN, {0}, FALSE}, { OPTION_TEXTURED_VIDEO, "TexturedVideo", OPTV_BOOLEAN, {1}, FALSE}, { OPTION_DRI, "DRI", OPTV_BOOLEAN, {0}, FALSE}, + { OPTION_ACCELMETHOD, "AccelMethod", OPTV_STRING, {0}, FALSE }, { -1, NULL, OPTV_NONE, {0}, FALSE} }; @@ -227,6 +229,12 @@ NULL }; +static const char *exaSymbols[] = { + "exaDriverInit", + "exaOffscreenInit", + NULL +}; + static const char *xaaSymbols[] = { "XAACreateInfoRec", "XAADestroyInfoRec", @@ -314,7 +322,7 @@ * Tell the loader about symbols from other modules that this module * might refer to. */ - LoaderRefSymLists(vgahwSymbols, fbSymbols, xaaSymbols, + LoaderRefSymLists(vgahwSymbols, fbSymbols, exaSymbols, xaaSymbols, ramdacSymbols, vbeSymbols, int10Symbols, #ifdef XF86DRI drmSymbols, driSymbols, @@ -1014,12 +1022,21 @@ xf86LoaderReqSymLists(fbSymbols, NULL); if (!xf86ReturnOptValBool(pTDFX->Options, OPTION_NOACCEL, FALSE)) { - if (!xf86LoadSubModule(pScrn, "xaa")) { - TDFXFreeRec(pScrn); - return FALSE; + char *s = xf86GetOptValString(pTDFX->Options, OPTION_ACCELMETHOD); + pTDFX->NoAccel = FALSE; + if (!xf86NameCmp(s, "EXA")) { + pTDFX->exa = TRUE; + if (!xf86LoadSubModule(pScrn, "exa")) { + TDFXFreeRec(pScrn); + return FALSE; + } else xf86LoaderReqSymLists(exaSymbols, NULL); + } else { + if (!xf86LoadSubModule(pScrn, "xaa")) { + TDFXFreeRec(pScrn); + return FALSE; + } else xf86LoaderReqSymLists(xaaSymbols, NULL); } - xf86LoaderReqSymLists(xaaSymbols, NULL); - } + } else pTDFX->NoAccel = TRUE; if (!xf86GetOptValBool(pTDFX->Options, OPTION_SHOWCACHE, &(pTDFX->ShowCache))) { xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "ShowCache %s\n", pTDFX->ShowCache ? "Enabled" : "Disabled"); @@ -2138,7 +2155,13 @@ miSetPixmapDepths (); - pTDFX->NoAccel=xf86ReturnOptValBool(pTDFX->Options, OPTION_NOACCEL, FALSE); + if (pTDFX->NoAccel) { + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Acceleration disabled\n"); + } else { + MessageType from = pTDFX->exa ? X_CONFIG : X_DEFAULT; + xf86DrvMsg(pScrn->scrnIndex, from, "Using %s acceleration\n", + pTDFX->exa ? "EXA" : "XAA"); + } #ifdef XF86DRI /* * Setup DRI after visuals have been established, but before fbScreenInit @@ -2198,9 +2221,14 @@ xf86InitFBManager(pScreen, &MemBox); if (!pTDFX->NoAccel) { - if (!TDFXAccelInit(pScreen)) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Hardware acceleration initialization failed\n"); + if (pTDFX->exa) { + if (!TDFXExaInit(pScreen)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "EXA initialization failed\n"); + } + } else { + if (!TDFXXaaInit(pScreen)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "XAA initialization failed\n"); + } } } @@ -2372,8 +2400,10 @@ vgaHWUnmapMem(pScrn); } - if (pTDFX->AccelInfoRec) XAADestroyInfoRec(pTDFX->AccelInfoRec); - pTDFX->AccelInfoRec=0; + if (pTDFX->XaaInfoRec) XAADestroyInfoRec(pTDFX->XaaInfoRec); + pTDFX->XaaInfoRec=0; + if (pTDFX->ExaDriver) xfree(pTDFX->ExaDriver); + pTDFX->ExaDriver=0; if (pTDFX->DGAModes) xfree(pTDFX->DGAModes); pTDFX->DGAModes=0; if (pTDFX->scanlineColorExpandBuffers[0]) diff -u -N tdfx/tdfx_exa.c tdfx_exa/tdfx_exa.c --- tdfx/tdfx_exa.c 1969-12-31 19:00:00.000000000 -0500 +++ tdfx_exa/tdfx_exa.c 2005-08-10 06:02:25.000000000 -0400 @@ -0,0 +1,218 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "exa.h" +#include "miline.h" +#include "servermd.h" + +#include "xf86.h" +#include "xf86_OSproc.h" +#include "xf86_ansic.h" +#include "xf86PciInfo.h" + +#include "tdfx.h" +#include "tdfxdefs.h" + +#define TDFX_FROM_PIXMAP(x) \ + TDFXPtr pTDFX = TDFXPTR(xf86Screens[x->drawable.pScreen->myNum]) + +static int TDFXROPCvt[] = {0x00, 0x88, 0x44, 0xCC, 0x22, 0xAA, 0x66, 0xEE, + 0x11, 0x99, 0x55, 0xDD, 0x33, 0xBB, 0x77, 0xFF, + 0x00, 0xA0, 0x50, 0xF0, 0x0A, 0xAA, 0x5A, 0xFA, + 0x05, 0xA5, 0x55, 0xF5, 0x0F, 0xAF, 0x5F, 0xFF}; + +static void +TDFXExaClearState(ScrnInfoPtr pScrn) +{ + TDFXPtr pTDFX; + + pTDFX=TDFXPTR(pScrn); + pTDFX->Cmd=0; + pTDFX->DrawState&=~DRAW_STATE_TRANSPARENT; + /* Make sure we've done a sync */ + TDFXFirstSync(pScrn); +} + +static void +TDFXExaMatchState(TDFXPtr pTDFX) +{ + if (pTDFX->PrevDrawState==pTDFX->DrawState) return; + + /* Do we need to set a clipping rectangle? */ + if (pTDFX->DrawState&DRAW_STATE_CLIPPING) + pTDFX->Cmd |= SST_2D_USECLIP1; + else + pTDFX->Cmd &= ~SST_2D_USECLIP1; + + /* Do we need to set transparency? */ + TDFXMakeRoom(pTDFX, 1); + DECLARE(SSTCP_COMMANDEXTRA); + if (pTDFX->DrawState&DRAW_STATE_TRANSPARENT) { + TDFXWriteLong(pTDFX, SST_2D_COMMANDEXTRA, SST_2D_SRC_COLORKEY_EX); + } else { + TDFXWriteLong(pTDFX, SST_2D_COMMANDEXTRA, 0); + } + + /* Has the previous routine left clip1 changed? Reset it. */ + if (pTDFX->DrawState&DRAW_STATE_CLIP1CHANGED) { + TDFXMakeRoom(pTDFX, 2); + DECLARE(SSTCP_CLIP1MIN|SSTCP_CLIP1MAX); + TDFXWriteLong(pTDFX, SST_2D_CLIP1MIN, pTDFX->ModeReg.clip1min); + TDFXWriteLong(pTDFX, SST_2D_CLIP1MAX, pTDFX->ModeReg.clip1max); + pTDFX->DrawState&=~DRAW_STATE_CLIP1CHANGED; + } + + pTDFX->PrevDrawState=pTDFX->DrawState; +} + + +static void +TDFXWaitMarker(ScreenPtr pScreen, int Marker) +{ + TDFXSendNOPFifo2D(xf86Screens[pScreen->myNum]); +} + +static Bool +TDFXPrepareSolid(PixmapPtr pPixmap, int alu, Pixel planemask, Pixel fg) +{ + TDFX_FROM_PIXMAP(pPixmap); + ScreenPtr pScreen = pPixmap->drawable.pScreen; + int fmt; + + TDFXExaClearState(xf86Screens[pScreen->myNum]); + + pTDFX->Cmd=TDFXROPCvt[alu]<<24; + + fmt = pTDFX->stride | (pTDFX->cpp == 1 ? (1 << 16) : ((pTDFX->cpp + 1) << 16)); + + TDFXMakeRoom(pTDFX, 3); + DECLARE (SSTCP_DSTFORMAT | SSTCP_COLORFORE | SSTCP_COLORBACK); + TDFXWriteLong(pTDFX, SST_2D_DSTFORMAT, fmt); + pTDFX->sst2DDstFmtShadow = fmt; + TDFXWriteLong(pTDFX, SST_2D_COLORBACK, fg); + TDFXWriteLong(pTDFX, SST_2D_COLORFORE, fg); + + return TRUE; +} + +static void +TDFXSolid(PixmapPtr pPixmap, int x1, int y1, int x2, int y2) +{ + TDFX_FROM_PIXMAP(pPixmap); + TDFXExaMatchState(pTDFX); + int w = x2 - x1, h = y2 - y1; + + TDFXMakeRoom(pTDFX, 3); + DECLARE(SSTCP_DSTSIZE | SSTCP_DSTXY | SSTCP_COMMAND); + TDFXWriteLong(pTDFX, SST_2D_DSTSIZE, (w&0x1FFF) | ((h&0x1FFF)<<16)); + TDFXWriteLong(pTDFX, SST_2D_DSTXY, (x1&0x1FFF) | ((y1&0x1FFF)<<16)); + TDFXWriteLong(pTDFX, SST_2D_COMMAND, pTDFX->Cmd | SST_2D_RECTANGLEFILL | SST_2D_GO); +} + +static void +TDFXDoneSolid(PixmapPtr pPixmap) +{ +} + +static Bool +TDFXPrepareCopy(PixmapPtr pSrcPixmap, PixmapPtr pDstPixmap, int xdir, int ydir, + int alu, Pixel planemask) +{ + TDFX_FROM_PIXMAP(pSrcPixmap); + int fmt; + + TDFXExaClearState(xf86Screens[pSrcPixmap->drawable.pScreen->myNum]); + + pTDFX->Cmd = (TDFXROPCvt[alu]<<24) | SST_2D_SCRNTOSCRNBLIT; + if (xdir == -1) pTDFX->Cmd |= SST_2D_X_RIGHT_TO_LEFT; + if (ydir == -1) pTDFX->Cmd |= SST_2D_Y_BOTTOM_TO_TOP; + fmt = pTDFX->stride | (pTDFX->cpp == 1 ? (1 << 16) : ((pTDFX->cpp + 1) << 16)); + + TDFXMakeRoom(pTDFX, 2); + DECLARE(SSTCP_SRCFORMAT | SSTCP_DSTFORMAT); + TDFXWriteLong(pTDFX, SST_2D_DSTFORMAT, fmt); + pTDFX->sst2DDstFmtShadow = fmt; + TDFXWriteLong(pTDFX, SST_2D_SRCFORMAT, fmt); + pTDFX->sst2DSrcFmtShadow = fmt; + + return TRUE; +} + +static void +TDFXCopy (PixmapPtr pDstPixmap, int srcX, int srcY, int dstX, int dstY, int w, int h) +{ + TDFX_FROM_PIXMAP(pDstPixmap); + TDFXExaMatchState(pTDFX); + ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum]; + + if (pTDFX->Cmd & SST_2D_Y_BOTTOM_TO_TOP) { + srcY += h - 1; + dstY += h - 1; + } + if (pTDFX->Cmd & SST_2D_X_RIGHT_TO_LEFT) { + srcX += w - 1; + dstX += w - 1; + } + if ((srcY >= dstY - 32 && srcY <= dstY) || + (srcY >= pTDFX->prevBlitDest.y1 - 32 && srcY <= pTDFX->prevBlitDest.y1)) { + TDFXSendNOP(pScrn); + } + pTDFX->sync(pScrn); + + TDFXMakeRoom(pTDFX, 4); + DECLARE (SSTCP_DSTSIZE | SSTCP_DSTXY | SSTCP_SRCXY | SSTCP_COMMAND); + TDFXWriteLong (pTDFX, SST_2D_SRCXY, (srcX & 0x1FFF) | ((srcY & 0x1FFF) << 16)); + TDFXWriteLong (pTDFX, SST_2D_DSTSIZE, (w & 0x1FFF) | ((h & 0x1FFF) << 16)); + TDFXWriteLong (pTDFX, SST_2D_DSTXY, (dstX & 0x1FF) | ((dstY & 0x1FFF) << 16)); + TDFXWriteLong (pTDFX, SST_2D_COMMAND, pTDFX->Cmd | SST_2D_GO); +} + +static void +TDFXDoneCopy (PixmapPtr pDstPixmap) +{ +} + +static Bool +TDFXPrepareComposite (int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, PicturePtr pDstPicture, PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst) +{ + return FALSE; +} + +Bool +TDFXExaInit(ScreenPtr pScreen) +{ + ExaDriverPtr pExa; + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + TDFXPtr pTDFX = TDFXPTR(pScrn); + + if (!(pExa = xnfcalloc(sizeof(ExaDriverRec), 1))) { + pTDFX->NoAccel = TRUE; + return FALSE; + } + + pTDFX->ExaDriver = pExa; + pExa->card.flags = EXA_OFFSCREEN_PIXMAPS; + pExa->card.memoryBase = pTDFX->FbBase; + pExa->card.memorySize = pScrn->videoRam * 1024; + pExa->card.offScreenBase = pScrn->virtualX * pScrn->virtualY * ((pScrn->bitsPerPixel + 7) / 8) * 2; + /* These are guessed. No idea if they're anywhere near right. */ + pExa->card.offscreenByteAlign = 256; + pExa->card.offscreenPitch = pTDFX->stride; + pExa->card.maxX = 2048; + pExa->card.maxY = 2048; + + pExa->accel.WaitMarker = TDFXWaitMarker; + + pExa->accel.PrepareSolid = TDFXPrepareSolid; + pExa->accel.Solid = TDFXSolid; + pExa->accel.DoneSolid = TDFXDoneSolid; + + pExa->accel.PrepareCopy = TDFXPrepareCopy; + pExa->accel.Copy = TDFXCopy; + pExa->accel.DoneCopy = TDFXDoneCopy; + + pExa->accel.PrepareComposite = TDFXPrepareComposite; + + return (exaDriverInit(pScreen, pExa)); +} Binary files tdfx/.tdfx_exa.c.swp and tdfx_exa/.tdfx_exa.c.swp differ diff -u -N tdfx/tdfx.h tdfx_exa/tdfx.h --- tdfx/tdfx.h 2005-07-31 13:19:29.000000000 -0400 +++ tdfx_exa/tdfx.h 2005-08-10 01:44:50.000000000 -0400 @@ -79,6 +79,7 @@ #define TDFXTRACEREG if(0) ErrorF #endif +#include "exa.h" #include "xaa.h" #include "xf86Cursor.h" @@ -161,11 +162,13 @@ BoxRec prevBlitDest; TDFXRegRec SavedReg; TDFXRegRec ModeReg; - XAAInfoRecPtr AccelInfoRec; + ExaDriverPtr ExaDriver; + XAAInfoRecPtr XaaInfoRec; xf86CursorInfoPtr CursorInfoRec; CloseScreenProcPtr CloseScreen; Bool usePIO; Bool NoAccel; + Bool exa; DGAModePtr DGAModes; Bool DGAactive; Bool initDone; @@ -256,7 +259,8 @@ #define TDFX2XCUTOFF 135000 -extern Bool TDFXAccelInit(ScreenPtr pScreen); +extern Bool TDFXXaaInit(ScreenPtr pScreen); +extern Bool TDFXExaInit(ScreenPtr pScreen); extern Bool TDFXCursorInit(ScreenPtr pScreen); extern void TDFXSync(ScrnInfoPtr pScrn); extern Bool TDFXDRIScreenInit(ScreenPtr pScreen);