? 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);