? Makefile ? savage-exa.diff ? savage.4.html ? savage._man ? savage_exa.c ? savage_xaa.c Index: Imakefile =================================================================== RCS file: /cvs/xorg/xc/programs/Xserver/hw/xfree86/drivers/savage/Imakefile,v retrieving revision 1.7 diff -u -r1.7 Imakefile --- Imakefile 7 Mar 2005 19:27:24 -0000 1.7 +++ Imakefile 25 Aug 2005 03:55:17 -0000 @@ -40,10 +40,11 @@ SRCS = savage_driver.c \ savage_accel.c \ + savage_xaa.c \ + savage_exa.c \ savage_cursor.c \ savage_dga.c \ savage_i2c.c \ - savage_image.c \ savage_shadow.c \ savage_vbe.c \ savage_video.c \ @@ -52,10 +53,11 @@ OBJS = savage_driver.o \ savage_accel.o \ + savage_xaa.o \ + savage_exa.o \ savage_cursor.o \ savage_dga.o \ savage_i2c.o \ - savage_image.o \ savage_shadow.o \ savage_vbe.o \ savage_video.o \ @@ -70,6 +72,7 @@ INCLUDES = -I. -I$(XF86COMSRC) -I$(XF86OSSRC) \ -I$(SERVERSRC)/fb -I$(SERVERSRC)/mi \ -I$(XF86SRC)/xaa \ + -I$(XF86SRC)/exa \ -I$(XF86SRC)/xf1bpp -I$(XF86SRC)/xf4bpp \ -I$(SERVERSRC)/Xext \ -I$(XF86SRC)/vgahw -I$(XF86SRC)/ramdac \ @@ -98,6 +101,8 @@ InstallDriverSDKNonExecFile(Imakefile,$(DRIVERSDKDIR)/drivers/savage) InstallDriverSDKNonExecFile(savage_accel.c,$(DRIVERSDKDIR)/drivers/savage) +InstallDriverSDKNonExecFile(savage_xaa.c,$(DRIVERSDKDIR)/drivers/savage) +InstallDriverSDKNonExecFile(savage_exa.c,$(DRIVERSDKDIR)/drivers/savage) InstallDriverSDKNonExecFile(savage_bci.h,$(DRIVERSDKDIR)/drivers/savage) InstallDriverSDKNonExecFile(savage_cursor.c,$(DRIVERSDKDIR)/drivers/savage) InstallDriverSDKNonExecFile(savage_dga.c,$(DRIVERSDKDIR)/drivers/savage) @@ -106,7 +111,6 @@ InstallDriverSDKNonExecFile(savage_dri.c,$(DRIVERSDKDIR)/drivers/savage) InstallDriverSDKNonExecFile(savage_dri.h,$(DRIVERSDKDIR)/drivers/savage) InstallDriverSDKNonExecFile(savage_i2c.c,$(DRIVERSDKDIR)/drivers/savage) -InstallDriverSDKNonExecFile(savage_image.c,$(DRIVERSDKDIR)/drivers/savage) InstallDriverSDKNonExecFile(savage_regs.h,$(DRIVERSDKDIR)/drivers/savage) InstallDriverSDKNonExecFile(savage_shadow.c,$(DRIVERSDKDIR)/drivers/savage) InstallDriverSDKNonExecFile(savage_vbe.c,$(DRIVERSDKDIR)/drivers/savage) Index: savage_accel.c =================================================================== RCS file: /cvs/xorg/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_accel.c,v retrieving revision 1.23 diff -u -r1.23 savage_accel.c --- savage_accel.c 6 Aug 2005 06:51:29 -0000 1.23 +++ savage_accel.c 25 Aug 2005 03:55:18 -0000 @@ -20,11 +20,6 @@ #include "config.h" #endif -#include -#include "xaalocal.h" -#include "xaarop.h" -#include "miline.h" - #include "savage_driver.h" #include "savage_regs.h" #include "savage_bci.h" @@ -39,182 +34,6 @@ /* Forward declaration of functions used in the driver */ -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); - -#if 0 -static void SavageSubsequentSolidTwoPointLine( - ScrnInfoPtr pScrn, - int x1, - int y1, - int x2, - int y2, - int bias); -#endif - -#if 0 -static void SavageSetupForScreenToScreenColorExpand( - ScrnInfoPtr pScrn, - int bg, - int fg, - int rop, - unsigned int planemask); - -static void SavageSubsequentScreenToScreenColorExpand( - ScrnInfoPtr pScrn, - int x, - int y, - int w, - int h, - int skipleft); -#endif - -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); - -#if 0 -static void SavageSetupForColor8x8PatternFill( - ScrnInfoPtr pScrn, - int patternx, - int patterny, - int rop, - unsigned planemask, - int trans_col); - -static void SavageSubsequentColor8x8PatternFillRect( - ScrnInfoPtr pScrn, - int pattern0, - int pattern1, - int x, - int y, - int w, - int h); -#endif - -static void SavageSetClippingRectangle( - ScrnInfoPtr pScrn, - int x1, - int y1, - int x2, - int y2); - -static void SavageDisableClipping( ScrnInfoPtr ); - -#if 0 -static void SavageSubsequentSolidFillTrap( - ScrnInfoPtr pScrn, - int y, - int h, - int left, - int dxl, - int dyl, - int el, - int right, - int dxr, - int dyr, - int er); -#endif - -/* 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 -); - unsigned long writedw( unsigned long addr, unsigned long value ); unsigned long readdw( unsigned long addr ); unsigned long readfb( unsigned long addr ); @@ -1446,198 +1265,7 @@ { ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; SavagePtr psav = SAVPTR(pScrn); - XAAInfoRecPtr xaaptr; - BoxRec AvailFBArea; - - /* 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())) - return FALSE; - - xaaptr->Flags = 0 - | PIXMAP_CACHE - | OFFSCREEN_PIXMAPS - | LINEAR_FRAMEBUFFER - ; - - /* 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 - - /* Color 8x8 pattern fills */ - - /* - * With the exception of the Savage3D and Savage4, all of the Savage - * chips require that bitmap descriptors have a stride that is a - * multiple of 16 pixels. This includes any descriptor used for - * color pattern fills, which COMPLETELY screws the XAA 8x8 color - * pattern support. - * - * We could double the width ourselves into a reserved frame buffer - * section, but since I went 18 months with only ONE report of this - * error, it seems hardly worth the trouble. - */ - -#if 0 - if( (psav->Chipset == S3_SAVAGE3D) || (psav->Chipset == S3_SAVAGE4) ) - { - xaaptr->SetupForColor8x8PatternFill = - SavageSetupForColor8x8PatternFill; - xaaptr->SubsequentColor8x8PatternFillRect = - SavageSubsequentColor8x8PatternFillRect; - xaaptr->Color8x8PatternFillFlags = 0 - | NO_TRANSPARENCY - | HARDWARE_PATTERN_PROGRAMMED_BITS - | HARDWARE_PATTERN_PROGRAMMED_ORIGIN - ; - } -#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; - - /* WriteBitmap color expand */ - -#if 0 - xaaptr->WriteBitmapFlags = NO_PLANEMASK; - xaaptr->WriteBitmap = SavageWriteBitmapCPUToScreenColorExpand; -#endif - - /* Screen to Screen color expansion. Not implemented. */ - -#if 0 - xaaptr->SetupForScreenToScreenColorExpand = - SavageSetupForScreenToScreenColorExpand; - xaaptr->SubsequentScreenToScreenColorExpand = - SavageSubsequentCPUToScreenColorExpand; -#endif - - /* 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. - */ #ifdef XF86DRI if (psav->directRenderingEnabled) { @@ -1857,52 +1485,7 @@ psav->cyMemory = 0x7FFF; } - MemBox.x1 = 0; - MemBox.y1 = 0; - MemBox.x2 = psav->cxMemory; - MemBox.y2 = psav->cyMemory; - - if (!xf86InitFBManager(pScreen, &MemBox)) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Memory manager initialization to (%d,%d) (%d,%d) failed\n", - MemBox.x1, MemBox.y1, MemBox.x2, MemBox.y2 ); - return FALSE; - } else { - int tmp,width, height; - - xf86DrvMsg( pScrn->scrnIndex, X_INFO, - "Memory manager initialized to (%d,%d) (%d,%d)\n", - MemBox.x1, MemBox.y1, MemBox.x2, MemBox.y2 ); - /* - * 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 reserve 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); - - if (xf86QueryLargestOffscreenArea(pScreen, &width, - &height, 0, 0, 0 ) ) { - xf86DrvMsg( pScrn->scrnIndex, X_INFO, - "Largest offscreen area available: %d x %d\n", - width, height ); - } - } - psav->reserved = 0; - - if(tiledBufferSize > bufferSize) - { - psav->reserved = xf86AllocateOffscreenLinear(pScreen, - (tiledBufferSize - bufferSize),1,0,0,0); - - } - if(psav->reserved) - xf86DrvMsg( pScrn->scrnIndex, X_INFO, - "Reserved for tiled front buffer at offset 0x%08x ,size:0x%08x\n", - psav->reserved->offset, psav->reserved->size); + psav->EXAendfb = pSAVAGEDRIServer->backOffset; xf86DrvMsg( pScrn->scrnIndex, X_INFO, "Reserved back buffer at offset 0x%x\n", @@ -1918,7 +1501,6 @@ else #endif { - int tmp; /* * why this code? because BoxRec members are short int @@ -1927,687 +1509,20 @@ if (psav->cyMemory > 0x7FFF) { psav->cyMemory = 0x7FFF; } - - 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 ); - } - -#if 0 - AvailFBArea.x1 = 0; - AvailFBArea.y1 = 0; - AvailFBArea.x2 = pScrn->displayWidth; - AvailFBArea.y2 = psav->ScissB; - xf86InitFBManager(pScreen, &AvailFBArea); - xf86DrvMsg( pScrn->scrnIndex, X_INFO, - "Using %d lines for offscreen memory.\n", - psav->ScissB - pScrn->virtualY ); -#endif - - - return XAAInit(pScreen, xaaptr); -} - - - - -/* The sync function for the GE */ -void -SavageAccelSync(ScrnInfoPtr pScrn) -{ - SavagePtr psav = SAVPTR(pScrn); - psav->WaitIdleEmpty(psav); -} - - -/* - * 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)); -} - -#if 0 -static void -SavageSetupForScreenToScreenColorExpand( - ScrnInfoPtr pScrn, - int bg, - int fg, - int rop, - unsigned int planemask) -{ -/* SavagePtr psav = SAVPTR(pScrn); */ -} - -static void -SavageSubsequentScreenToScreenColorExpand( - ScrnInfoPtr pScrn, - int x, - int y, - int w, - int h, - int skipleft) -{ -/* SavagePtr psav = SAVPTR(pScrn); */ -} -#endif - - -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 paremeters 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 wil 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)); -} - -#if 0 -static void -SavageSubsequentSolidTwoPointLine( - ScrnInfoPtr pScrn, - int x1, - int y1, - int x2, - int y2, - int bias) -{ - SavagePtr psav = SAVPTR(pScrn); - BCI_GET_PTR; - - int cmd; - int dx, dy; - int min, max, xp, yp, ym; - - dx = x2 - x1; - dy = y2 - y1; - -#ifdef DEBUG_EXTRA - ErrorF("TwoPointLine, (%4d,%4d)-(%4d,%4d), clr %08x, last pt %s\n", - x1, y1, x2, y2, psav->SavedFgColor, (bias & 0x100)?"NO ":"YES"); -#endif - - xp = (dx >= 0); - if( !xp ) { - dx = -dx; - } - - yp = (dy >= 0); - if( !yp ) { - dy = -dy; - } - - ym = (dy > dx); - if( ym ) { - max = dy; - min = dx; - } - else { - max = dx; - min = dy; - } - - if( !(bias & 0x100) ) { - max++; + psav->EXAendfb = (psav->videoRambytes - + 4096 - /* hw cursor*/ + psav->cobSize /*COB*/ + ) & ~SAVAGE_BUFFER_ALIGN; + } - cmd = (psav->SavedBciCmd & 0x00ffffff); - cmd |= BCI_CMD_LINE_LAST_PIXEL; - - psav->WaitQueue(psav,5); - BCI_SEND( cmd ); - if( cmd & BCI_CMD_SEND_COLOR ) - BCI_SEND( psav->SavedFgColor ); - BCI_SEND( BCI_LINE_X_Y( x1, y1 ) ); - BCI_SEND( BCI_LINE_STEPS( 2 * (min - max), 2 * min ) ); - BCI_SEND( BCI_LINE_MISC( max, ym, xp, yp, 2 * min - max ) ); -} -#endif - - -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; + if (psav->useEXA) + return SavageEXAInit(pScreen); + else + return SavageXAAInit(pScreen); } - /* Routines for debugging. */ Index: savage_driver.c =================================================================== RCS file: /cvs/xorg/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_driver.c,v retrieving revision 1.38 diff -u -r1.38 savage_driver.c --- savage_driver.c 5 Aug 2005 23:04:33 -0000 1.38 +++ savage_driver.c 25 Aug 2005 03:55:20 -0000 @@ -193,6 +193,7 @@ OPTION_PCI_BURST ,OPTION_PCI_RETRY ,OPTION_NOACCEL + ,OPTION_ACCELMETHOD ,OPTION_LCD_CENTER ,OPTION_LCDCLOCK ,OPTION_MCLK @@ -226,6 +227,7 @@ static const OptionInfoRec SavageOptions[] = { { OPTION_NOACCEL, "NoAccel", OPTV_BOOLEAN, {0}, FALSE }, + { OPTION_ACCELMETHOD, "AccelMethod", OPTV_STRING, {0}, FALSE }, { OPTION_HWCURSOR, "HWCursor", OPTV_BOOLEAN, {0}, FALSE }, { OPTION_SWCURSOR, "SWCursor", OPTV_BOOLEAN, {0}, FALSE }, { OPTION_SHADOW_FB, "ShadowFB", OPTV_BOOLEAN, {0}, FALSE }, @@ -405,6 +407,14 @@ NULL }; +static const char *exaSymbols[] = { + "exaDriverInit", + "exaDriverFini", + "exaOffscreenAlloc", + "exaOffscreenFree", + NULL +}; + static const char *shadowSymbols[] = { "ShadowFBInit", NULL @@ -448,7 +458,9 @@ setupDone = TRUE; xf86AddDriver(&SAVAGE, module, 0); LoaderRefSymLists(vgaHWSymbols, fbSymbols, ramdacSymbols, - xaaSymbols, shadowSymbols, vbeSymbols, vbeOptSymbols, + xaaSymbols, + exaSymbols, + shadowSymbols, vbeSymbols, vbeOptSymbols, #ifdef XF86DRI drmSymbols, driSymbols, #endif @@ -1156,6 +1168,22 @@ psav->NoAccel = TRUE; } + if(!psav->NoAccel) { + from = X_DEFAULT; + 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; + } + } + xf86DrvMsg(pScrn->scrnIndex, from, "Using %s acceleration architecture\n", + psav->useEXA ? "EXA" : "XAA"); + } + if ((s = xf86GetOptValString(psav->Options, OPTION_OVERLAY))) { if (psav->shadowFB) { @@ -1999,13 +2027,27 @@ xf86LoaderReqSymLists(fbSymbols, NULL); if( !psav->NoAccel ) { - if( !xf86LoadSubModule(pScrn, "xaa") ) { + + char *modName = NULL; + const char **symNames = NULL; + + if (psav->useEXA) { + modName = "exa"; + symNames = exaSymbols; + } else { + modName = "xaa"; + symNames = xaaSymbols; + } + + if( !xf86LoadSubModule(pScrn, modName) ) { SavageFreeRec(pScrn); vbeFree(psav->pVbe); psav->pVbe = NULL; return FALSE; } - xf86LoaderReqSymLists(xaaSymbols, NULL ); + + xf86LoaderReqSymLists(symNames, NULL ); + } if (psav->hwcursor) { @@ -3771,6 +3813,11 @@ } #endif + if (psav->EXADriverPtr) { + exaDriverFini(pScreen); + psav->EXADriverPtr = NULL; + } + if( psav->AccelInfoRec ) { XAADestroyInfoRec( psav->AccelInfoRec ); psav->AccelInfoRec = NULL; Index: savage_driver.h =================================================================== RCS file: /cvs/xorg/xc/programs/Xserver/hw/xfree86/drivers/savage/savage_driver.h,v retrieving revision 1.18 diff -u -r1.18 savage_driver.h --- savage_driver.h 13 Mar 2005 00:14:02 -0000 1.18 +++ savage_driver.h 25 Aug 2005 03:55:20 -0000 @@ -21,6 +21,7 @@ #include "xf86cmap.h" #include "vbe.h" #include "xaa.h" +#include "exa.h" #include "xf86xv.h" #include "savage_regs.h" @@ -343,6 +344,13 @@ int ShadowPitch; void (*PointerMoved)(int index, int x, int y); + /* support for EXA */ + ExaDriverPtr EXADriverPtr; + Bool useEXA; + unsigned long EXAendfb; + unsigned long pbd_offset; + unsigned long sbd_offset; + /* Support for XAA acceleration */ XAAInfoRecPtr AccelInfoRec; xRectangle Rect; @@ -532,6 +540,10 @@ void SavageAccelSync(ScrnInfoPtr); /*int SavageHelpSolidROP(ScrnInfoPtr pScrn, int *fg, int pm, int *rop);*/ +/* XAA and EXA */ +Bool SavageXAAInit(ScreenPtr); +Bool SavageEXAInit(ScreenPtr); + /* In savage_i2c.c. */ Bool SavageI2CInit(ScrnInfoPtr pScrn);