From cb476dbdef5d75ec16dd1016a17f3f063d7e61a3 Mon Sep 17 00:00:00 2001 From: Alan Coopersmith Date: Sat, 18 May 2024 15:13:17 -0700 Subject: Raise minimum supported Xserver version to 1.18 (ABI_VIDEODRV_VERSION 20.0) Already effectively required by use of XNFcallocarray() introduced in xorg/xserver@b96dc999 - xserver-1.18.0, released in Nov. 2015. Allows dropping remnants of code for XAA and pre-pciaccess X servers Signed-off-by: Alan Coopersmith Part-of: --- configure.ac | 20 +- man/savage.man | 16 +- src/Makefile.am | 1 - src/savage_accel.c | 11 +- src/savage_dga.c | 53 --- src/savage_dri.c | 13 - src/savage_driver.c | 39 +- src/savage_driver.h | 16 +- src/savage_hwmc.c | 3 - src/savage_xaa.c | 1029 --------------------------------------------------- 10 files changed, 25 insertions(+), 1176 deletions(-) delete mode 100644 src/savage_xaa.c diff --git a/configure.ac b/configure.ac index 81da385..c6b1e78 100644 --- a/configure.ac +++ b/configure.ac @@ -63,7 +63,7 @@ XORG_DRIVER_CHECK_EXT(XV, videoproto) XORG_DRIVER_CHECK_EXT(DPMSExtension, xextproto) # Obtain compiler/linker options for the driver dependencies -PKG_CHECK_MODULES(XORG, [xorg-server >= 1.1.0 xproto fontsproto $REQUIRED_MODULES]) +PKG_CHECK_MODULES(XORG, [xorg-server >= 1.18.0 xproto fontsproto $REQUIRED_MODULES]) PKG_CHECK_MODULES(XEXT, [xextproto >= 7.0.99.1], HAVE_XEXTPROTO_71="yes"; AC_DEFINE(HAVE_XEXTPROTO_71, 1, [xextproto 7.1 available]), HAVE_XEXTPROTO_71="no") @@ -107,24 +107,6 @@ if test "$DRI" = yes; then AC_DEFINE(SAVAGEDRI_DEVEL,1,[Enable developmental DRI driver support]) fi -AC_ARG_ENABLE(xaa, - AS_HELP_STRING([--enable-xaa], - [Enable legacy X Acceleration Architecture (XAA) [default=auto]]), - [XAA="$enableval"], - [XAA=auto]) -if test "x$XAA" != xno; then - save_CFLAGS=$CFLAGS - save_CPPFLAGS=$CPPFLAGS - CFLAGS=$XORG_CFLAGS - CPPFLAGS="$XORG_CFLAGS" - AC_CHECK_HEADERS([xaa.h], XAA=yes, XAA=no) - CFLAGS=$save_CFLAGS - CPPFLAGS=$save_CPPFLAGS -fi -AC_MSG_CHECKING([whether to include XAA support]) -AM_CONDITIONAL(XAA, test "x$XAA" = xyes) -AC_MSG_RESULT([$XAA]) - save_CFLAGS="$CFLAGS" CFLAGS="$XORG_CFLAGS" AC_CHECK_DECL(XSERVER_LIBPCIACCESS, diff --git a/man/savage.man b/man/savage.man index 333f51d..e7c96cc 100644 --- a/man/savage.man +++ b/man/savage.man @@ -81,15 +81,13 @@ Default: hardware cursor. Disable or enable acceleration. Default: acceleration is enabled. .TP .BI "Option \*qAccelMethod\*q \*q" "string" \*q -Chooses between available acceleration architectures. Valid options are -.B XAA -and -.B EXA. -XAA is the traditional acceleration architecture and support for it is very -stable. EXA is a newer acceleration architecture with better performance for -the Render and Composite extensions, but the rendering code for it is newer and -possibly unstable. The default is -.B XAA. +Chooses between available acceleration architectures. The only valid option is +.BR EXA . +XAA was the traditional acceleration architecture, but support for it was +removed in Xorg 1.13. +EXA is a newer acceleration architecture with better performance for +the Render and Composite extensions. The default is +.BR EXA . .TP .BI "Option \*qRotate\*q \*qCW\*q" .TP diff --git a/src/Makefile.am b/src/Makefile.am index 4b16ded..b0eb923 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -31,7 +31,6 @@ savage_drv_ladir = @moduledir@/drivers savage_drv_la_SOURCES = \ compat-api.h \ savage_accel.c \ - savage_xaa.c \ savage_exa.c \ savage_bci.h \ savage_common.h \ diff --git a/src/savage_accel.c b/src/savage_accel.c index fb594f3..7ab80a4 100644 --- a/src/savage_accel.c +++ b/src/savage_accel.c @@ -11,6 +11,7 @@ * Created 20/03/97 by Sebastien Marineau for 3.3.6 * Modified 17-Nov-2000 by Tim Roberts for 4.0.1 * Modified Feb-2004 by Alex Deucher - integrating DRI support + * Modified 2005-2006 by Alex Deucher - adding exa support * Revision: * */ @@ -1535,7 +1536,7 @@ SavageInitAccel(ScreenPtr pScreen) if (psav->useEXA) return SavageEXAInit(pScreen); else - return SavageXAAInit(pScreen); + return FALSE; } int SavageGetCopyROP(int rop) { @@ -1564,6 +1565,14 @@ int SavageGetCopyROP(int rop) { } +/* The sync function for the GE */ +void +SavageAccelSync(ScrnInfoPtr pScrn) +{ + SavagePtr psav = SAVPTR(pScrn); + psav->WaitIdleEmpty(psav); +} + /* Routines for debugging. */ diff --git a/src/savage_dga.c b/src/savage_dga.c index d0184ef..d87a6a4 100644 --- a/src/savage_dga.c +++ b/src/savage_dga.c @@ -34,9 +34,6 @@ in this Software without prior written authorization from the XFree86 Project. * */ -#ifdef HAVE_XAA_H -#include "xaalocal.h" -#endif #include "savage_driver.h" #include "dgaproc.h" @@ -47,10 +44,6 @@ static Bool Savage_OpenFramebuffer(ScrnInfoPtr, char **, unsigned char **, static Bool Savage_SetMode(ScrnInfoPtr, DGAModePtr); static int Savage_GetViewport(ScrnInfoPtr); static void Savage_SetViewport(ScrnInfoPtr, int, int, int); -#ifdef HAVE_XAA_H -static void Savage_FillRect(ScrnInfoPtr, int, int, int, int, unsigned long); -static void Savage_BlitRect(ScrnInfoPtr, int, int, int, int, int, int); -#endif static DGAFunctionRec Savage_DGAFuncs = { @@ -60,12 +53,7 @@ DGAFunctionRec Savage_DGAFuncs = { Savage_SetViewport, Savage_GetViewport, SavageAccelSync, -#ifdef HAVE_XAA_H - Savage_FillRect, - Savage_BlitRect, -#else NULL, NULL, -#endif NULL /* BlitTransRect */ }; @@ -133,10 +121,6 @@ SECOND_PASS: mode->mode = pMode; mode->flags = DGA_CONCURRENT_ACCESS | DGA_PIXMAP_AVAILABLE; -#ifdef HAVE_XAA_H - if(!psav->NoAccel) - mode->flags |= DGA_FILL_RECT | DGA_BLIT_RECT; -#endif if(pMode->Flags & V_DBLSCAN) mode->flags |= DGA_DOUBLESCAN; if(pMode->Flags & V_INTERLACE) @@ -349,43 +333,6 @@ Savage_SetViewport( psav->DGAViewportStatus = 0; /* MGAAdjustFrame loops until finished */ } -#ifdef HAVE_XAA_H -static void -Savage_FillRect ( - ScrnInfoPtr pScrn, - int x, int y, int w, int h, - unsigned long color -){ - SavagePtr psav = SAVPTR(pScrn); - - if(psav->AccelInfoRec) { - (*psav->AccelInfoRec->SetupForSolidFill)(pScrn, color, GXcopy, ~0); - (*psav->AccelInfoRec->SubsequentSolidFillRect)(pScrn, x, y, w, h); - SET_SYNC_FLAG(psav->AccelInfoRec); - } -} - -static void -Savage_BlitRect( - ScrnInfoPtr pScrn, - int srcx, int srcy, - int w, int h, - int dstx, int dsty -){ - SavagePtr psav = SAVPTR(pScrn); - - if(psav->AccelInfoRec) { - int xdir = ((srcx < dstx) && (srcy == dsty)) ? -1 : 1; - int ydir = (srcy < dsty) ? -1 : 1; - - (*psav->AccelInfoRec->SetupForScreenToScreenCopy)( - pScrn, xdir, ydir, GXcopy, ~0, -1); - (*psav->AccelInfoRec->SubsequentScreenToScreenCopy)( - pScrn, srcx, srcy, dstx, dsty, w, h); - SET_SYNC_FLAG(psav->AccelInfoRec); - } -} -#endif static Bool Savage_OpenFramebuffer( diff --git a/src/savage_dri.c b/src/savage_dri.c index 02e4827..d91d18d 100644 --- a/src/savage_dri.c +++ b/src/savage_dri.c @@ -31,11 +31,6 @@ #include "xf86.h" #include "xf86_OSproc.h" -#ifdef HAVE_XAA_H -#include "xaalocal.h" -#include "xaarop.h" -#endif - #include "xf86Pci.h" #include "xf86fbman.h" @@ -128,10 +123,6 @@ static void SAVAGEWakeupHandler(WAKEUPHANDLER_ARGS_DECL) } if (psav->useEXA) exaMarkSync(pScreen); -#ifdef HAVE_XAA_H - else - psav->AccelInfoRec->NeedToSync = TRUE; -#endif /* FK: this flag doesn't seem to be used. */ } @@ -1364,10 +1355,6 @@ SAVAGEDRIMoveBuffers(WindowPtr pParent, DDXPointRec ptOldOrg, BCI_SEND(0xc0020000); /* wait for 2D idle */ if (psav->useEXA) exaMarkSync(pScreen); -#ifdef HAVE_XAA_H - else - psav->AccelInfoRec->NeedToSync = TRUE; -#endif } static void diff --git a/src/savage_driver.c b/src/savage_driver.c index 5a7412f..7804528 100644 --- a/src/savage_driver.c +++ b/src/savage_driver.c @@ -61,10 +61,6 @@ #include "savage_bci.h" #include "savage_streams.h" -#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6 -#include "xf86RAC.h" -#endif - #define TRANSPARENCY_KEY 0xff; #ifdef SAVAGEDRI @@ -1278,22 +1274,9 @@ static Bool SavagePreInit(ScrnInfoPtr pScrn, int flags) if(!psav->NoAccel) { from = X_DEFAULT; -#ifdef HAVE_XAA_H - char *strptr; - if((strptr = (char *)xf86GetOptValString(psav->Options, OPTION_ACCELMETHOD))) { - if(!xf86NameCmp(strptr,"XAA")) { - from = X_CONFIG; - psav->useEXA = FALSE; - } else if(!xf86NameCmp(strptr,"EXA")) { - from = X_CONFIG; - psav->useEXA = TRUE; - } - } -#else psav->useEXA = TRUE; -#endif - xf86DrvMsg(pScrn->scrnIndex, from, "Using %s acceleration architecture\n", - psav->useEXA ? "EXA" : "XAA"); + xf86DrvMsg(pScrn->scrnIndex, from, + "Using %s acceleration architecture\n", "EXA"); } if ((s = xf86GetOptValString(psav->Options, OPTION_OVERLAY))) { @@ -2179,14 +2162,10 @@ static Bool SavagePreInit(ScrnInfoPtr pScrn, int flags) return FALSE; } } else { - const char *modName = "xaa"; - - if( !xf86LoadSubModule(pScrn, modName) ) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Falling back to shadowfb\n"); - psav->NoAccel = 1; - psav->shadowFB = 1; - } + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Falling back to shadowfb\n"); + psav->NoAccel = 1; + psav->shadowFB = 1; } } @@ -4016,12 +3995,6 @@ static Bool SavageCloseScreen(CLOSE_SCREEN_ARGS_DECL) psav->EXADriverPtr = NULL; } -#ifdef HAVE_XAA_H - if( psav->AccelInfoRec ) { - XAADestroyInfoRec( psav->AccelInfoRec ); - psav->AccelInfoRec = NULL; - } -#endif if( psav->DGAModes ) { free( psav->DGAModes ); diff --git a/src/savage_driver.h b/src/savage_driver.h index 134fcf5..9cd7a5a 100644 --- a/src/savage_driver.h +++ b/src/savage_driver.h @@ -51,9 +51,6 @@ #include "compiler.h" #include "vgaHW.h" #include "xf86.h" -#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6 -#include "xf86Resources.h" -#endif #include "xf86Modes.h" #include "xf86Pci.h" #include "xf86_OSproc.h" @@ -64,9 +61,6 @@ #include "fboverlay.h" #include "xf86cmap.h" #include "vbe.h" -#ifdef HAVE_XAA_H -#include "xaa.h" -#endif #include "xf86fbman.h" #include "exa.h" #include "xf86xv.h" @@ -423,16 +417,9 @@ typedef struct _Savage { unsigned long pbd_high; unsigned long sbd_high; - /* Support for XAA acceleration */ -#ifdef HAVE_XAA_H - XAAInfoRecPtr AccelInfoRec; -#endif - xRectangle Rect; unsigned int SavedBciCmd; unsigned int SavedFgColor; unsigned int SavedBgColor; - unsigned int SavedSbdOffset; - unsigned int SavedSbd; SavageModeTablePtr ModeTable; @@ -601,8 +588,7 @@ void SavageSetGBD(ScrnInfoPtr); void SavageAccelSync(ScrnInfoPtr); /*int SavageHelpSolidROP(ScrnInfoPtr pScrn, int *fg, int pm, int *rop);*/ -/* XAA and EXA */ -Bool SavageXAAInit(ScreenPtr); +/* EXA */ Bool SavageEXAInit(ScreenPtr); /* In savage_i2c.c. */ diff --git a/src/savage_hwmc.c b/src/savage_hwmc.c index 5c085c3..a687944 100644 --- a/src/savage_hwmc.c +++ b/src/savage_hwmc.c @@ -40,9 +40,6 @@ #include "xf86xvmc.h" #include #include -#ifdef HAVE_XAA_H -#include "xaalocal.h" -#endif #include "dixstruct.h" #include "fourcc.h" diff --git a/src/savage_xaa.c b/src/savage_xaa.c deleted file mode 100644 index 361a0bb..0000000 --- a/src/savage_xaa.c +++ /dev/null @@ -1,1029 +0,0 @@ -/* - * The accel file for the Savage driver. - * - * Created 20/03/97 by Sebastien Marineau for 3.3.6 - * Modified 17-Nov-2000 by Tim Roberts for 4.0.1 - * Modified Feb-2004 by Alex Deucher - integrating DRI support - * Modified 2005-2006 by Alex Deucher - adding exa support - * Revision: - * - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include "savage_driver.h" -#ifdef HAVE_XAA_H -#include "xaalocal.h" -#include "xaarop.h" - -#include "miline.h" - -#include "savage_bci.h" - -extern int gSavageEntityIndex; - -static void SavageSetupForScreenToScreenCopy( - ScrnInfoPtr pScrn, - int xdir, - int ydir, - int rop, - unsigned planemask, - int transparency_color); - -static void SavageSubsequentScreenToScreenCopy( - ScrnInfoPtr pScrn, - int x1, - int y1, - int x2, - int y2, - int w, - int h); - -static void SavageSetupForSolidFill( - ScrnInfoPtr pScrn, - int color, - int rop, - unsigned int planemask); - -static void SavageSubsequentSolidFillRect( - ScrnInfoPtr pScrn, - int x, - int y, - int w, - int h); - -static void SavageSubsequentSolidBresenhamLine( - ScrnInfoPtr pScrn, - int x1, - int y1, - int e1, - int e2, - int err, - int length, - int octant); - -static void SavageSetupForCPUToScreenColorExpandFill( - ScrnInfoPtr pScrn, - int fg, - int bg, - int rop, - unsigned int planemask); - -static void SavageSubsequentScanlineCPUToScreenColorExpandFill( - ScrnInfoPtr pScrn, - int x, - int y, - int w, - int h, - int skipleft); - -static void SavageSubsequentColorExpandScanline( - ScrnInfoPtr pScrn, - int buffer_no); - -static void SavageSetupForMono8x8PatternFill( - ScrnInfoPtr pScrn, - int patternx, - int patterny, - int fg, - int bg, - int rop, - unsigned int planemask); - -static void SavageSubsequentMono8x8PatternFillRect( - ScrnInfoPtr pScrn, - int pattern0, - int pattern1, - int x, - int y, - int w, - int h); - -static void SavageSetClippingRectangle( - ScrnInfoPtr pScrn, - int x1, - int y1, - int x2, - int y2); - -static void SavageDisableClipping( ScrnInfoPtr ); - -/* from savage_image.c: */ - -void SavageSetupForImageWrite( - ScrnInfoPtr pScrn, - int rop, - unsigned int planemask, - int transparency_color, - int bpp, - int depth); - -void SavageSubsequentImageWriteRect( - ScrnInfoPtr pScrn, - int x, - int y, - int w, - int h, - int skipleft); - -void SavageWriteBitmapCPUToScreenColorExpand ( - ScrnInfoPtr pScrn, - int x, int y, int w, int h, - unsigned char * src, - int srcwidth, - int skipleft, - int fg, int bg, - int rop, - unsigned int planemask -); - -static -void SavageRestoreAccelState(ScrnInfoPtr pScrn) -{ - SavagePtr psav = SAVPTR(pScrn); - - psav->WaitIdleEmpty(psav); - - return; -} -#endif - -Bool -SavageXAAInit(ScreenPtr pScreen) -{ -#ifdef HAVE_XAA_H - ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); - SavagePtr psav = SAVPTR(pScrn); - XAAInfoRecPtr xaaptr; - BoxRec AvailFBArea; - int tmp; - - /* Set-up our GE command primitive */ - - if (pScrn->depth == 8) { - psav->PlaneMask = 0xFF; - } - else if (pScrn->depth == 15) { - psav->PlaneMask = 0x7FFF; - } - else if (pScrn->depth == 16) { - psav->PlaneMask = 0xFFFF; - } - else if (pScrn->depth == 24) { - psav->PlaneMask = 0xFFFFFF; - } - - /* General acceleration flags */ - - if (!(xaaptr = psav->AccelInfoRec = XAACreateInfoRec())) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Failed to allocate XAAInfoRec.\n"); - return FALSE; - } - - xaaptr->Flags = 0 - | PIXMAP_CACHE - | OFFSCREEN_PIXMAPS - | LINEAR_FRAMEBUFFER - ; - - - if(xf86IsEntityShared(pScrn->entityList[0])) - { - DevUnion* pPriv; - SavageEntPtr pEnt; - pPriv = xf86GetEntityPrivate(pScrn->entityList[0], - gSavageEntityIndex); - pEnt = pPriv->ptr; - - /*if there are more than one devices sharing this entity, we - have to assign this call back, otherwise the XAA will be - disabled */ - if(pEnt->HasSecondary) - xaaptr->RestoreAccelState = SavageRestoreAccelState; - } - - /* Clipping */ - - xaaptr->SetClippingRectangle = SavageSetClippingRectangle; - xaaptr->DisableClipping = SavageDisableClipping; - xaaptr->ClippingFlags = 0 -#if 0 - | HARDWARE_CLIP_SOLID_FILL - | HARDWARE_CLIP_SOLID_LINE - | HARDWARE_CLIP_DASHED_LINE -#endif - | HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY - | HARDWARE_CLIP_MONO_8x8_FILL - | HARDWARE_CLIP_COLOR_8x8_FILL - ; - - xaaptr->Sync = SavageAccelSync; - - /* ScreenToScreen copies */ - -#if 1 - - xaaptr->SetupForScreenToScreenCopy = SavageSetupForScreenToScreenCopy; - xaaptr->SubsequentScreenToScreenCopy = SavageSubsequentScreenToScreenCopy; - xaaptr->ScreenToScreenCopyFlags = 0 - | NO_TRANSPARENCY - | NO_PLANEMASK - | ROP_NEEDS_SOURCE; - -#endif - - - /* Solid filled rectangles */ - -#if 1 - xaaptr->SetupForSolidFill = SavageSetupForSolidFill; - xaaptr->SubsequentSolidFillRect = SavageSubsequentSolidFillRect; - xaaptr->SolidFillFlags = NO_PLANEMASK | ROP_NEEDS_SOURCE; -#endif - - /* Mono 8x8 pattern fills */ - -#if 1 - xaaptr->SetupForMono8x8PatternFill = SavageSetupForMono8x8PatternFill; - xaaptr->SubsequentMono8x8PatternFillRect - = SavageSubsequentMono8x8PatternFillRect; - xaaptr->Mono8x8PatternFillFlags = 0 - | HARDWARE_PATTERN_PROGRAMMED_BITS - | HARDWARE_PATTERN_SCREEN_ORIGIN - | BIT_ORDER_IN_BYTE_MSBFIRST - | ROP_NEEDS_SOURCE - ; - if( psav->Chipset == S3_SAVAGE4 ) - xaaptr->Mono8x8PatternFillFlags |= NO_TRANSPARENCY; -#endif - - /* Solid lines */ - -#if 1 - xaaptr->SolidLineFlags = NO_PLANEMASK; - xaaptr->SetupForSolidLine = SavageSetupForSolidFill; - xaaptr->SubsequentSolidBresenhamLine = SavageSubsequentSolidBresenhamLine; -#if 0 - xaaptr->SubsequentSolidFillTrap = SavageSubsequentSolidFillTrap; -#endif - - xaaptr->SolidBresenhamLineErrorTermBits = 13; -#endif - - /* ImageWrite */ - - xaaptr->ImageWriteFlags = 0 - | NO_PLANEMASK - | CPU_TRANSFER_PAD_DWORD - | SCANLINE_PAD_DWORD - | BIT_ORDER_IN_BYTE_MSBFIRST - | LEFT_EDGE_CLIPPING - ; - xaaptr->SetupForImageWrite = SavageSetupForImageWrite; - xaaptr->SubsequentImageWriteRect = SavageSubsequentImageWriteRect; - xaaptr->NumScanlineImageWriteBuffers = 1; - xaaptr->ImageWriteBase = psav->BciMem; - xaaptr->ImageWriteRange = 120 * 1024; - - - /* CPU to Screen color expansion */ - - xaaptr->ScanlineCPUToScreenColorExpandFillFlags = 0 - | NO_PLANEMASK - | CPU_TRANSFER_PAD_DWORD - | SCANLINE_PAD_DWORD - | BIT_ORDER_IN_BYTE_MSBFIRST - | LEFT_EDGE_CLIPPING - | ROP_NEEDS_SOURCE - ; - - xaaptr->SetupForScanlineCPUToScreenColorExpandFill = - SavageSetupForCPUToScreenColorExpandFill; - xaaptr->SubsequentScanlineCPUToScreenColorExpandFill = - SavageSubsequentScanlineCPUToScreenColorExpandFill; - xaaptr->SubsequentColorExpandScanline = - SavageSubsequentColorExpandScanline; - xaaptr->ColorExpandBase = psav->BciMem; - xaaptr->ScanlineColorExpandBuffers = &xaaptr->ColorExpandBase; - xaaptr->NumScanlineColorExpandBuffers = 1; - - /* Set up screen parameters. */ - - psav->Bpp = pScrn->bitsPerPixel / 8; - psav->Bpl = pScrn->displayWidth * psav->Bpp; - psav->ScissB = (psav->CursorKByte << 10) / psav->Bpl; - if (psav->ScissB > 2047) - psav->ScissB = 2047; - - /* - * Finally, we set up the video memory space available to the pixmap - * cache. In this case, all memory from the end of the virtual screen - * to the end of the command overflow buffer can be used. If you haven't - * enabled the PIXMAP_CACHE flag, then these lines can be omitted. - */ - - AvailFBArea.x1 = 0; - AvailFBArea.y1 = 0; - AvailFBArea.x2 = psav->cxMemory; - AvailFBArea.y2 = psav->cyMemory; - xf86InitFBManager(pScreen, &AvailFBArea); - /* - * because the alignment requirement,the on-screen need more memory - * than (0,0,virtualX,virtualY), but xf86InitFBManager only subtract - * (pScrn->virtualX * pScrn->virtualY from (0,0,cxMemory,cyMemory),so - * here,we should reserver some memory for on-screen - */ - tmp = ((psav->cxMemory * pScrn->virtualY - pScrn->virtualX * pScrn->virtualY) - + psav->cxMemory -1) / (psav->cxMemory); - if (tmp) - xf86AllocateOffscreenArea(pScreen, psav->cxMemory,tmp, 0, NULL, NULL, NULL); - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Using %d lines for offscreen memory.\n", - psav->cyMemory - pScrn->virtualY ); - - - return XAAInit(pScreen, xaaptr); -#else - return FALSE; -#endif -} - -/* The sync function for the GE */ -void -SavageAccelSync(ScrnInfoPtr pScrn) -{ - SavagePtr psav = SAVPTR(pScrn); - psav->WaitIdleEmpty(psav); -} - -#ifdef HAVE_XAA_H -/* - * The XAA ROP helper routines all assume that a solid color is a - * "pattern". The Savage chips, however, apply a non-stippled solid - * color as "source". Thus, we use a slightly customized version. - */ - -static int -SavageHelpPatternROP(ScrnInfoPtr pScrn, int *fg, int *bg, unsigned int pm, int *rop) -{ - XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn); - int ret = 0; - - pm &= infoRec->FullPlanemask; - - if(pm == infoRec->FullPlanemask) { - if(!NO_SRC_ROP(*rop)) - ret |= ROP_PAT; - *rop = XAAGetCopyROP(*rop); - } else { - switch(*rop) { - case GXnoop: - break; - case GXset: - case GXclear: - case GXinvert: - ret |= ROP_PAT; - *fg = pm; - if(*bg != -1) - *bg = pm; - break; - default: - ret |= ROP_PAT | ROP_SRC; - break; - } - *rop = XAAGetCopyROP_PM(*rop); - } - - return ret; -} - - -static int -SavageHelpSolidROP(ScrnInfoPtr pScrn, int *fg, unsigned int pm, int *rop) -{ - XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn); - int ret = 0; - - pm &= infoRec->FullPlanemask; - - if(pm == infoRec->FullPlanemask) { - if(!NO_SRC_ROP(*rop)) - ret |= ROP_PAT; - *rop = XAAGetCopyROP(*rop); - } else { - switch(*rop) { - case GXnoop: - break; - case GXset: - case GXclear: - case GXinvert: - ret |= ROP_PAT; - *fg = pm; - break; - default: - ret |= ROP_PAT | ROP_SRC; - break; - } - *rop = XAAGetCopyROP_PM(*rop); - } - - return ret; -} - - - -/* These are the ScreenToScreen bitblt functions. We support all ROPs, all - * directions, and a planemask by adjusting the ROP and using the mono pattern - * registers. - * - * (That's a lie; we don't really support planemask.) - */ - -static void -SavageSetupForScreenToScreenCopy( - ScrnInfoPtr pScrn, - int xdir, - int ydir, - int rop, - unsigned planemask, - int transparency_color) -{ - SavagePtr psav = SAVPTR(pScrn); - int cmd; - - cmd = BCI_CMD_RECT | BCI_CMD_DEST_PBD_NEW | BCI_CMD_SRC_SBD_COLOR_NEW; - - BCI_CMD_SET_ROP( cmd, XAAGetCopyROP(rop) ); - if (transparency_color != -1) - cmd |= BCI_CMD_SEND_COLOR | BCI_CMD_SRC_TRANSPARENT; - - if (xdir == 1 ) cmd |= BCI_CMD_RECT_XP; - if (ydir == 1 ) cmd |= BCI_CMD_RECT_YP; - - psav->SavedBciCmd = cmd; - psav->SavedBgColor = transparency_color; -} - -static void -SavageSubsequentScreenToScreenCopy( - ScrnInfoPtr pScrn, - int x1, - int y1, - int x2, - int y2, - int w, - int h) -{ - SavagePtr psav = SAVPTR(pScrn); - - BCI_GET_PTR; - - if (!w || !h) return; - - if (!(psav->SavedBciCmd & BCI_CMD_RECT_XP)) { - w --; - x1 += w; - x2 += w; - w ++; - } - if (!(psav->SavedBciCmd & BCI_CMD_RECT_YP)) { - h --; - y1 += h; - y2 += h; - h ++; - } - - psav->WaitQueue(psav,9); - - - BCI_SEND(psav->SavedBciCmd); - - BCI_SEND(psav->GlobalBD.bd2.LoPart); - BCI_SEND(psav->GlobalBD.bd2.HiPart); - - BCI_SEND(psav->GlobalBD.bd2.LoPart); - BCI_SEND(psav->GlobalBD.bd2.HiPart); - - if (psav->SavedBgColor != 0xffffffff) - BCI_SEND(psav->SavedBgColor); - BCI_SEND(BCI_X_Y(x1, y1)); - BCI_SEND(BCI_X_Y(x2, y2)); - BCI_SEND(BCI_W_H(w, h)); -} - - -/* - * SetupForSolidFill is also called to set up for lines. - */ - -static void -SavageSetupForSolidFill( - ScrnInfoPtr pScrn, - int color, - int rop, - unsigned int planemask) -{ - SavagePtr psav = SAVPTR(pScrn); - XAAInfoRecPtr xaaptr = GET_XAAINFORECPTR_FROM_SCRNINFOPTR( pScrn ); - int cmd; - int mix; - - cmd = BCI_CMD_RECT - | BCI_CMD_RECT_XP | BCI_CMD_RECT_YP - | BCI_CMD_DEST_PBD_NEW | BCI_CMD_SRC_SOLID; - - /* Don't send a color if we don't have to. */ - - if( rop == GXcopy ) - { - if( color == 0 ) - rop = GXclear; - else if( (unsigned int)color == xaaptr->FullPlanemask ) - rop = GXset; - } - - mix = SavageHelpSolidROP( pScrn, &color, planemask, &rop ); - - if( mix & ROP_PAT ) - cmd |= BCI_CMD_SEND_COLOR; - - BCI_CMD_SET_ROP( cmd, rop ); - - psav->SavedBciCmd = cmd; - psav->SavedFgColor = color; -} - - -static void -SavageSubsequentSolidFillRect( - ScrnInfoPtr pScrn, - int x, - int y, - int w, - int h) -{ - SavagePtr psav = SAVPTR(pScrn); - BCI_GET_PTR; - - if( !w || !h ) - return; - - psav->WaitQueue(psav,7); - - BCI_SEND(psav->SavedBciCmd); - - BCI_SEND(psav->GlobalBD.bd2.LoPart); - BCI_SEND(psav->GlobalBD.bd2.HiPart); - - if( psav->SavedBciCmd & BCI_CMD_SEND_COLOR ) - BCI_SEND(psav->SavedFgColor); - BCI_SEND(BCI_X_Y(x, y)); - BCI_SEND(BCI_W_H(w, h)); -} - -static void -SavageSetupForCPUToScreenColorExpandFill( - ScrnInfoPtr pScrn, - int fg, - int bg, - int rop, - unsigned int planemask) -{ - SavagePtr psav = SAVPTR(pScrn); - int cmd; - int mix; - - cmd = BCI_CMD_RECT | BCI_CMD_RECT_XP | BCI_CMD_RECT_YP - | BCI_CMD_CLIP_LR - | BCI_CMD_DEST_PBD_NEW | BCI_CMD_SRC_MONO; - - mix = SavageHelpPatternROP( pScrn, &fg, &bg, planemask, &rop ); - - if( mix & ROP_PAT ) - cmd |= BCI_CMD_SEND_COLOR; - - BCI_CMD_SET_ROP( cmd, rop ); - - if (bg != -1) - cmd |= BCI_CMD_SEND_COLOR; - else - cmd |= BCI_CMD_SRC_TRANSPARENT; - - psav->SavedBciCmd = cmd; - psav->SavedFgColor = fg; - psav->SavedBgColor = bg; -} - - -static void -SavageSubsequentScanlineCPUToScreenColorExpandFill( - ScrnInfoPtr pScrn, - int x, - int y, - int w, - int h, - int skipleft) -{ - SavagePtr psav = SAVPTR(pScrn); - BCI_GET_PTR; - - /* XAA will be sending bitmap data next. */ - /* We should probably wait for empty/idle here. */ - - psav->WaitQueue(psav,22); - - BCI_SEND(psav->SavedBciCmd); - - BCI_SEND(psav->GlobalBD.bd2.LoPart); - BCI_SEND(psav->GlobalBD.bd2.HiPart); - - BCI_SEND(BCI_CLIP_LR(x+skipleft, x+w-1)); - w = (w + 31) & ~31; - if( psav->SavedBciCmd & BCI_CMD_SEND_COLOR ) - BCI_SEND(psav->SavedFgColor); - if( psav->SavedBgColor != 0xffffffff ) - BCI_SEND(psav->SavedBgColor); - BCI_SEND(BCI_X_Y(x, y)); - BCI_SEND(BCI_W_H(w, 1)); - - psav->Rect.x = x; - psav->Rect.y = y + 1; - psav->Rect.width = w; - psav->Rect.height = h - 1; -} - -static void -SavageSubsequentColorExpandScanline( - ScrnInfoPtr pScrn, - int buffer_no) -{ - /* This gets call after each scanline's image data has been sent. */ - SavagePtr psav = SAVPTR(pScrn); - xRectangle xr = psav->Rect; - BCI_GET_PTR; - - if( xr.height ) - { - psav->WaitQueue(psav,20); - BCI_SEND(BCI_X_Y( xr.x, xr.y)); - BCI_SEND(BCI_W_H( xr.width, 1 )); - psav->Rect.height--; - psav->Rect.y++; - } -} - - -/* - * The meaning of the two pattern parameters to Setup & Subsequent for - * Mono8x8Patterns varies depending on the flag bits. We specify - * HW_PROGRAMMED_BITS, which means our hardware can handle 8x8 patterns - * without caching in the frame buffer. Thus, Setup gets the pattern bits. - * There is no way with BCI to rotate an 8x8 pattern, so we do NOT specify - * HW_PROGRAMMED_ORIGIN. XAA will rotate it for us and pass the rotated - * pattern to both Setup and Subsequent. If we DID specify PROGRAMMED_ORIGIN, - * then Setup would get the unrotated pattern, and Subsequent gets the - * origin values. - */ - -static void -SavageSetupForMono8x8PatternFill( - ScrnInfoPtr pScrn, - int patternx, - int patterny, - int fg, - int bg, - int rop, - unsigned int planemask) -{ - SavagePtr psav = SAVPTR(pScrn); - int cmd; - int mix; - - mix = XAAHelpPatternROP( pScrn, &fg, &bg, planemask, &rop ); - - cmd = BCI_CMD_RECT | BCI_CMD_RECT_XP | BCI_CMD_RECT_YP - | BCI_CMD_DEST_PBD_NEW; - - if( mix & ROP_PAT ) - cmd |= BCI_CMD_SEND_COLOR | BCI_CMD_PAT_MONO; - - if (bg == -1) - cmd |= BCI_CMD_PAT_TRANSPARENT; - - BCI_CMD_SET_ROP(cmd, rop); - - psav->SavedBciCmd = cmd; - psav->SavedFgColor = fg; - psav->SavedBgColor = bg; -} - - -static void -SavageSubsequentMono8x8PatternFillRect( - ScrnInfoPtr pScrn, - int pattern0, - int pattern1, - int x, - int y, - int w, - int h) -{ - SavagePtr psav = SAVPTR(pScrn); - BCI_GET_PTR; - - /* - * I didn't think it was my job to do trivial rejection, but - * miFillGeneralPolygon definitely generates null spans, and XAA - * just passes them through. - */ - - if( !w || !h ) - return; - - psav->WaitQueue(psav,9); - BCI_SEND(psav->SavedBciCmd); - - BCI_SEND(psav->GlobalBD.bd2.LoPart); - BCI_SEND(psav->GlobalBD.bd2.HiPart); - - if( psav->SavedBciCmd & BCI_CMD_SEND_COLOR ) - BCI_SEND(psav->SavedFgColor); - if( psav->SavedBgColor != 0xffffffff ) - BCI_SEND(psav->SavedBgColor); - BCI_SEND(BCI_X_Y(x, y)); - BCI_SEND(BCI_W_H(w, h)); - if( psav->SavedBciCmd & BCI_CMD_PAT_MONO ) - { - BCI_SEND(pattern0); - BCI_SEND(pattern1); - } -} - - -#if 0 -static void -SavageSetupForColor8x8PatternFill( - ScrnInfoPtr pScrn, - int patternx, - int patterny, - int rop, - unsigned planemask, - int trans_col) -{ - SavagePtr psav = SAVPTR(pScrn); - - int cmd; - unsigned int bd; - int pat_offset; - - /* ViRGEs and Savages do not support transparent color patterns. */ - /* We set the NO_TRANSPARENCY bit, so we should never receive one. */ - - pat_offset = (int) (patternx * psav->Bpp + patterny * psav->Bpl); - - cmd = BCI_CMD_RECT | BCI_CMD_RECT_XP | BCI_CMD_RECT_YP - | BCI_CMD_DEST_GBD | BCI_CMD_PAT_PBD_COLOR_NEW; - - (void) XAAHelpSolidROP( pScrn, &trans_col, planemask, &rop ); - - BCI_CMD_SET_ROP(cmd, rop); - bd = BCI_BD_BW_DISABLE; - BCI_BD_SET_BPP(bd, pScrn->bitsPerPixel); - BCI_BD_SET_STRIDE(bd, 8); - - psav->SavedBciCmd = cmd; - psav->SavedSbdOffset = pat_offset; - psav->SavedSbd = bd; - psav->SavedBgColor = trans_col; -} - - -static void -SavageSubsequentColor8x8PatternFillRect( - ScrnInfoPtr pScrn, - int patternx, - int patterny, - int x, - int y, - int w, - int h) -{ - SavagePtr psav = SAVPTR(pScrn); - BCI_GET_PTR; - - if( !w || !h ) - return; - - psav->WaitQueue(psav,6); - BCI_SEND(psav->SavedBciCmd); - BCI_SEND(psav->SavedSbdOffset); - BCI_SEND(psav->SavedSbd); - BCI_SEND(BCI_X_Y(patternx,patterny)); - BCI_SEND(BCI_X_Y(x, y)); - BCI_SEND(BCI_W_H(w, h)); -} -#endif - -static void -SavageSubsequentSolidBresenhamLine( - ScrnInfoPtr pScrn, - int x1, - int y1, - int e1, - int e2, - int err, - int length, - int octant) -{ - SavagePtr psav = SAVPTR(pScrn); - BCI_GET_PTR; - int cmd; - - cmd = (psav->SavedBciCmd & 0x00ffffff); - cmd |= BCI_CMD_LINE_LAST_PIXEL; - -#ifdef DEBUG_EXTRA - ErrorF("BresenhamLine, (%4d,%4d), len %4d, oct %d, err %4d,%4d,%4d clr %08x\n", - x1, y1, length, octant, e1, e2, err, psav->SavedFgColor ); -#endif - - psav->WaitQueue(psav, 7 ); - BCI_SEND(cmd); - - BCI_SEND(psav->GlobalBD.bd2.LoPart); - BCI_SEND(psav->GlobalBD.bd2.HiPart); - - if( cmd & BCI_CMD_SEND_COLOR ) - BCI_SEND( psav->SavedFgColor ); - BCI_SEND(BCI_LINE_X_Y(x1, y1)); - BCI_SEND(BCI_LINE_STEPS(e2-e1, e2)); - BCI_SEND(BCI_LINE_MISC(length, - (octant & YMAJOR), - !(octant & XDECREASING), - !(octant & YDECREASING), - e2+err)); -} - -static void -SavageSetClippingRectangle( - ScrnInfoPtr pScrn, - int x1, - int y1, - int x2, - int y2) -{ - SavagePtr psav = SAVPTR(pScrn); - BCI_GET_PTR; - int cmd; - -#ifdef DEBUG_EXTRA - ErrorF("ClipRect, (%4d,%4d)-(%4d,%4d) \n", x1, y1, x2, y2 ); -#endif - - cmd = BCI_CMD_NOP | BCI_CMD_CLIP_NEW; - psav->WaitQueue(psav,3); - BCI_SEND(cmd); - BCI_SEND(BCI_CLIP_TL(y1, x1)); - BCI_SEND(BCI_CLIP_BR(y2, x2)); - psav->SavedBciCmd |= BCI_CMD_CLIP_CURRENT; -} - - -static void SavageDisableClipping( ScrnInfoPtr pScrn ) -{ - SavagePtr psav = SAVPTR(pScrn); -#ifdef DEBUG_EXTRA - ErrorF("Kill ClipRect\n"); -#endif - psav->SavedBciCmd &= ~BCI_CMD_CLIP_CURRENT; -} - -void -SavageWriteBitmapCPUToScreenColorExpand ( - ScrnInfoPtr pScrn, - int x, int y, int w, int h, - unsigned char * src, - int srcwidth, - int skipleft, - int fg, int bg, - int rop, - unsigned int planemask -) -{ - SavagePtr psav = SAVPTR(pScrn); - BCI_GET_PTR; - int i, j, count, reset; - unsigned int cmd; - CARD32 * srcp; - -/* We aren't using planemask at all here... */ - - if( !srcwidth ) - return; - - cmd = BCI_CMD_RECT | BCI_CMD_RECT_XP | BCI_CMD_RECT_YP - | BCI_CMD_SEND_COLOR | BCI_CMD_CLIP_LR - | BCI_CMD_DEST_PBD_NEW | BCI_CMD_SRC_MONO; - cmd |= XAAGetCopyROP(rop) << 16; - - if( bg == -1 ) - cmd |= BCI_CMD_SRC_TRANSPARENT; - - BCI_SEND(cmd); - - BCI_SEND(psav->GlobalBD.bd2.LoPart); - BCI_SEND(psav->GlobalBD.bd2.HiPart); - - BCI_SEND(BCI_CLIP_LR(x+skipleft, x+w-1)); - BCI_SEND(fg); - if( bg != -1 ) - BCI_SEND(bg); - - /* Bitmaps come in in units of DWORDS, LSBFirst. This is exactly */ - /* reversed of what we expect. */ - - count = (w + 31) / 32; -/* src += ((srcx & ~31) / 8); */ - - /* The BCI region is 128k bytes. A screen-sized mono bitmap can */ - /* exceed that. */ - - reset = 65536 / count; - - for (j = 0; j < h; j ++) { - BCI_SEND(BCI_X_Y(x, y+j)); - BCI_SEND(BCI_W_H(w, 1)); - srcp = (CARD32 *) src; - for (i = count; i > 0; srcp ++, i --) { - /* We have to invert the bits in each byte. */ - CARD32 u = *srcp; - u = ((u & 0x0f0f0f0f) << 4) | ((u & 0xf0f0f0f0) >> 4); - u = ((u & 0x33333333) << 2) | ((u & 0xcccccccc) >> 2); - u = ((u & 0x55555555) << 1) | ((u & 0xaaaaaaaa) >> 1); - BCI_SEND(u); - } - src += srcwidth; - if( !--reset ) { - BCI_RESET; - reset = 65536 / count; - } - } -} - -void -SavageSetupForImageWrite( - ScrnInfoPtr pScrn, - int rop, - unsigned planemask, - int transparency_color, - int bpp, - int depth) -{ - SavagePtr psav = SAVPTR(pScrn); - int cmd; - - cmd = BCI_CMD_RECT | BCI_CMD_RECT_XP | BCI_CMD_RECT_YP - | BCI_CMD_CLIP_LR - | BCI_CMD_DEST_PBD_NEW | BCI_CMD_SRC_COLOR; - - cmd |= XAAGetCopyROP(rop) << 16; - - if( transparency_color != -1 ) - cmd |= BCI_CMD_SRC_TRANSPARENT; - - psav->SavedBciCmd = cmd; - psav->SavedBgColor = transparency_color; -} - - -void SavageSubsequentImageWriteRect -( - ScrnInfoPtr pScrn, - int x, - int y, - int w, - int h, - int skipleft) -{ - SavagePtr psav = SAVPTR(pScrn); - BCI_GET_PTR; - - psav->WaitQueue( psav, 8 ); - BCI_SEND(psav->SavedBciCmd); - - BCI_SEND(psav->GlobalBD.bd2.LoPart); - BCI_SEND(psav->GlobalBD.bd2.HiPart); - - BCI_SEND(BCI_CLIP_LR(x+skipleft, x+w-1)); - if( psav->SavedBgColor != 0xffffffff ) - BCI_SEND(psav->SavedBgColor); - BCI_SEND(BCI_X_Y(x, y)); - BCI_SEND(BCI_W_H(w, h)); -} - -#endif -- cgit v1.2.3