diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-07-17 21:22:57 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2012-07-17 21:37:28 +0100 |
commit | caef63e0268e59e439b030a9a338e81d5cf8e311 (patch) | |
tree | c853ced8515e58d7322d55cb4ead708bd78e71ab | |
parent | 53ff19f45a3cc4863845c23e8d3c2c2b95e03fd9 (diff) |
i810: Split xaa routines from common acceleration methods
Some of the routines in i810_accel.c are specific to XAA whilst others
are used elsewhere, for example in i810_dri.c. Therefore we have to be
selective over which ones we compile out without xaa.
Reported-by: Knut Petersen <Knut_Petersen@t-online.de>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r-- | src/legacy/i810/Makefile.am | 3 | ||||
-rw-r--r-- | src/legacy/i810/i810.h | 1 | ||||
-rw-r--r-- | src/legacy/i810/i810_accel.c | 303 | ||||
-rw-r--r-- | src/legacy/i810/i810_xaa.c | 320 |
4 files changed, 326 insertions, 301 deletions
diff --git a/src/legacy/i810/Makefile.am b/src/legacy/i810/Makefile.am index 07a384f6..51489b8c 100644 --- a/src/legacy/i810/Makefile.am +++ b/src/legacy/i810/Makefile.am @@ -8,6 +8,7 @@ AM_CFLAGS = @CWARNFLAGS@ @XORG_CFLAGS@ @DRM_CFLAGS@ @DRI_CFLAGS@ @PCIACCESS_CFLA $(NULL) liblegacy_i810_la_SOURCES = \ + i810_accel.c \ i810_common.h \ i810_cursor.c \ i810_driver.c \ @@ -20,7 +21,7 @@ liblegacy_i810_la_SOURCES = \ if XAA liblegacy_i810_la_SOURCES += \ - i810_accel.c + i810_xaa.c endif if DGA diff --git a/src/legacy/i810/i810.h b/src/legacy/i810/i810.h index a07fb699..a96c504f 100644 --- a/src/legacy/i810/i810.h +++ b/src/legacy/i810/i810.h @@ -310,7 +310,6 @@ extern void I810SelectBuffer(ScrnInfoPtr pScrn, int buffer); extern void I810RefreshRing(ScrnInfoPtr pScrn); extern void I810EmitFlush(ScrnInfoPtr pScrn); -extern void I810EmitInvarientState(ScrnInfoPtr pScrn); extern Bool I810DGAInit(ScreenPtr pScreen); diff --git a/src/legacy/i810/i810_accel.c b/src/legacy/i810/i810_accel.c index 7120b4ba..c079bfd2 100644 --- a/src/legacy/i810/i810_accel.c +++ b/src/legacy/i810/i810_accel.c @@ -40,137 +40,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "xaarop.h" #include "i810.h" -static void I810SetupForMono8x8PatternFill(ScrnInfoPtr pScrn, - int pattx, int patty, - int fg, int bg, int rop, - unsigned int planemask); -static void I810SubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, - int pattx, int patty, - int x, int y, int w, int h); - -static void I810SetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, - int fg, int bg, - int rop, - unsigned int mask); - -static void I810SubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr - pScrn, int x, - int y, int w, - int h, - int skipleft); - -static void I810SubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno); - -/* The following function sets up the supported acceleration. Call it - * from the FbInit() function in the SVGA driver, or before ScreenInit - * in a monolithic server. - */ -Bool -I810AccelInit(ScreenPtr pScreen) -{ - XAAInfoRecPtr infoPtr; - ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); - I810Ptr pI810 = I810PTR(pScrn); - - if (I810_DEBUG & DEBUG_VERBOSE_ACCEL) - ErrorF("I810AccelInit\n"); - - pI810->AccelInfoRec = infoPtr = XAACreateInfoRec(); - if (!infoPtr) - return FALSE; - - pI810->bufferOffset = 0; - infoPtr->Flags = LINEAR_FRAMEBUFFER | OFFSCREEN_PIXMAPS; - infoPtr->Flags |= PIXMAP_CACHE; - - /* Sync - */ - infoPtr->Sync = I810Sync; - - /* Solid filled rectangles - */ - { - infoPtr->SolidFillFlags = NO_PLANEMASK; - infoPtr->SetupForSolidFill = I810SetupForSolidFill; - infoPtr->SubsequentSolidFillRect = I810SubsequentSolidFillRect; - } - - /* Screen to screen copy - * - the transparency op hangs the blit engine, disable for now. - */ - { - infoPtr->ScreenToScreenCopyFlags = (0 - | NO_PLANEMASK - | NO_TRANSPARENCY | 0); - - infoPtr->SetupForScreenToScreenCopy = I810SetupForScreenToScreenCopy; - infoPtr->SubsequentScreenToScreenCopy = - I810SubsequentScreenToScreenCopy; - } - - /* 8x8 pattern fills - */ - { - infoPtr->SetupForMono8x8PatternFill = I810SetupForMono8x8PatternFill; - infoPtr->SubsequentMono8x8PatternFillRect = - I810SubsequentMono8x8PatternFillRect; - - infoPtr->Mono8x8PatternFillFlags = (HARDWARE_PATTERN_PROGRAMMED_BITS | - HARDWARE_PATTERN_SCREEN_ORIGIN | - BIT_ORDER_IN_BYTE_MSBFIRST | - NO_PLANEMASK | 0); - } - - /* 8x8 color fills - not considered useful for XAA. - */ - - /* Scanline color expansion - Use the same scheme as the 3.3 driver. - * - */ - if (pI810->Scratch.Size != 0) { - int i; - int width = ALIGN(pScrn->displayWidth, 32) / 8; - int nr_buffers = pI810->Scratch.Size / width; - unsigned char *ptr = pI810->FbBase + pI810->Scratch.Start; - - pI810->NumScanlineColorExpandBuffers = nr_buffers; - pI810->ScanlineColorExpandBuffers = (unsigned char **) - xnfcalloc(nr_buffers, sizeof(unsigned char *)); - - for (i = 0; i < nr_buffers; i++, ptr += width) - pI810->ScanlineColorExpandBuffers[i] = ptr; - - infoPtr->ScanlineCPUToScreenColorExpandFillFlags = (NO_PLANEMASK | - ROP_NEEDS_SOURCE | - BIT_ORDER_IN_BYTE_MSBFIRST - | 0); - - infoPtr->ScanlineColorExpandBuffers = (unsigned char **) - xnfcalloc(1, sizeof(unsigned char *)); - infoPtr->NumScanlineColorExpandBuffers = 1; - - infoPtr->ScanlineColorExpandBuffers[0] = - pI810->ScanlineColorExpandBuffers[0]; - pI810->nextColorExpandBuf = 0; - - infoPtr->SetupForScanlineCPUToScreenColorExpandFill = - I810SetupForScanlineCPUToScreenColorExpandFill; - - infoPtr->SubsequentScanlineCPUToScreenColorExpandFill = - I810SubsequentScanlineCPUToScreenColorExpandFill; - - infoPtr->SubsequentColorExpandScanline = - I810SubsequentColorExpandScanline; - } - - /* Possible todo: Image writes w/ non-GXCOPY rop. - */ - - I810SelectBuffer(pScrn, I810_SELECT_FRONT); - - return XAAInit(pScreen, infoPtr); -} - int I810WaitLpRing(ScrnInfoPtr pScrn, int n, int timeout_millis) { @@ -219,7 +88,9 @@ I810WaitLpRing(ScrnInfoPtr pScrn, int n, int timeout_millis) DRICloseScreen(xf86ScrnToScreen(pScrn)); } #endif +#if HAVE_XAA_H pI810->AccelInfoRec = NULL; /* Stops recursive behavior */ +#endif FatalError("lockup\n"); } @@ -399,145 +270,6 @@ I810SubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1, } while (1); } -static void -I810SetupForMono8x8PatternFill(ScrnInfoPtr pScrn, int pattx, int patty, - int fg, int bg, int rop, - unsigned int planemask) -{ - I810Ptr pI810 = I810PTR(pScrn); - - if (I810_DEBUG & DEBUG_VERBOSE_ACCEL) - ErrorF("I810SetupFor8x8PatternColorExpand\n"); - - /* FULL_MONO_PAT_BLT, p176 */ - pI810->BR[0] = (BR00_BITBLT_CLIENT | BR00_OP_MONO_PAT_BLT | 0x9); - pI810->BR[18] = bg; - pI810->BR[19] = fg; - pI810->BR[13] = (pScrn->displayWidth * pI810->cpp); - pI810->BR[13] |= XAAGetPatternROP(rop) << 16; - if (bg == -1) - pI810->BR[13] |= BR13_MONO_PATN_TRANS; -} - -static void -I810SubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, int pattx, int patty, - int x, int y, int w, int h) -{ - I810Ptr pI810 = I810PTR(pScrn); - int addr = - pI810->bufferOffset + (y * pScrn->displayWidth + x) * pI810->cpp; - - if (I810_DEBUG & DEBUG_VERBOSE_ACCEL) - ErrorF("I810Subsequent8x8PatternColorExpand\n"); - - { - BEGIN_LP_RING(12); - OUT_RING(pI810->BR[0] | ((y << 5) & BR00_PAT_VERT_ALIGN)); - OUT_RING(pI810->BR[13]); - OUT_RING((h << 16) | (w * pI810->cpp)); - OUT_RING(addr); - OUT_RING(pI810->BR[13] & 0xFFFF); /* src pitch */ - OUT_RING(addr); /* src addr */ - OUT_RING(0); /* transparency color */ - OUT_RING(pI810->BR[18]); /* bg */ - OUT_RING(pI810->BR[19]); /* fg */ - OUT_RING(pattx); /* pattern data */ - OUT_RING(patty); - OUT_RING(0); - ADVANCE_LP_RING(); - } -} - -static void -I810GetNextScanlineColorExpandBuffer(ScrnInfoPtr pScrn) -{ - I810Ptr pI810 = I810PTR(pScrn); - XAAInfoRecPtr infoPtr = pI810->AccelInfoRec; - - if (pI810->nextColorExpandBuf == pI810->NumScanlineColorExpandBuffers) - I810Sync(pScrn); - - infoPtr->ScanlineColorExpandBuffers[0] = - pI810->ScanlineColorExpandBuffers[pI810->nextColorExpandBuf]; - - if (I810_DEBUG & DEBUG_VERBOSE_ACCEL) - ErrorF("using color expand buffer %d\n", pI810->nextColorExpandBuf); - - pI810->nextColorExpandBuf++; -} - -static void -I810SetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, - int fg, int bg, int rop, - unsigned int planemask) -{ - I810Ptr pI810 = I810PTR(pScrn); - - if (I810_DEBUG & DEBUG_VERBOSE_ACCEL) - ErrorF("I810SetupForScanlineScreenToScreenColorExpand %d %d %x %x\n", - fg, bg, rop, planemask); - - pI810->BR[13] = (pScrn->displayWidth * pI810->cpp); - pI810->BR[13] |= XAAGetCopyROP(rop) << 16; - pI810->BR[13] |= (1 << 27); - if (bg == -1) - pI810->BR[13] |= BR13_MONO_TRANSPCY; - - pI810->BR[18] = bg; - pI810->BR[19] = fg; - - I810GetNextScanlineColorExpandBuffer(pScrn); -} - -static void -I810SubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, - int x, int y, - int w, int h, int skipleft) -{ - I810Ptr pI810 = I810PTR(pScrn); - - if (I810_DEBUG & DEBUG_VERBOSE_ACCEL) - ErrorF("I810SubsequentScanlineCPUToScreenColorExpandFill " - "%d,%d %dx%x %d\n", x, y, w, h, skipleft); - - pI810->BR[0] = BR00_BITBLT_CLIENT | BR00_OP_MONO_SRC_COPY_BLT | 0x06; - pI810->BR[9] = (pI810->bufferOffset + - (y * pScrn->displayWidth + x) * pI810->cpp); - pI810->BR[14] = ((1 << 16) | (w * pI810->cpp)); - pI810->BR[11] = ((w + 31) / 32) - 1; -} - -static void -I810SubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno) -{ - I810Ptr pI810 = I810PTR(pScrn); - - pI810->BR[12] = (pI810->AccelInfoRec->ScanlineColorExpandBuffers[0] - - pI810->FbBase); - - if (I810_DEBUG & DEBUG_VERBOSE_ACCEL) - ErrorF("I810SubsequentColorExpandScanline %d (addr %x)\n", - bufno, pI810->BR[12]); - - { - BEGIN_LP_RING(8); - OUT_RING(pI810->BR[0]); - OUT_RING(pI810->BR[13]); - OUT_RING(pI810->BR[14]); - OUT_RING(pI810->BR[9]); - OUT_RING(pI810->BR[11]); - OUT_RING(pI810->BR[12]); /* srcaddr */ - OUT_RING(pI810->BR[18]); - OUT_RING(pI810->BR[19]); - ADVANCE_LP_RING(); - } - - /* Advance to next scanline. - */ - pI810->BR[9] += pScrn->displayWidth * pI810->cpp; - I810GetNextScanlineColorExpandBuffer(pScrn); -} - void I810EmitFlush(ScrnInfoPtr pScrn) { @@ -583,35 +315,8 @@ I810RefreshRing(ScrnInfoPtr pScrn) if (pI810->LpRing->space < 0) pI810->LpRing->space += pI810->LpRing->mem.Size; +#if HAVE_XAA_H if (pI810->AccelInfoRec) pI810->AccelInfoRec->NeedToSync = TRUE; +#endif } - -/* Emit on gaining VT? - */ -void -I810EmitInvarientState(ScrnInfoPtr pScrn) -{ - I810Ptr pI810 = I810PTR(pScrn); - - BEGIN_LP_RING(10); - - OUT_RING(INST_PARSER_CLIENT | INST_OP_FLUSH | INST_FLUSH_MAP_CACHE); - OUT_RING(GFX_CMD_CONTEXT_SEL | CS_UPDATE_USE | CS_USE_CTX0); - OUT_RING(INST_PARSER_CLIENT | INST_OP_FLUSH | INST_FLUSH_MAP_CACHE); - OUT_RING(0); - - OUT_RING(GFX_OP_COLOR_CHROMA_KEY); - OUT_RING(CC1_UPDATE_KILL_WRITE | - CC1_DISABLE_KILL_WRITE | - CC1_UPDATE_COLOR_IDX | - CC1_UPDATE_CHROMA_LOW | CC1_UPDATE_CHROMA_HI | 0); - OUT_RING(0); - OUT_RING(0); - -/* OUT_RING( CMD_OP_Z_BUFFER_INFO ); */ -/* OUT_RING( pI810->DepthBuffer.Start | pI810->auxPitchBits); */ - - ADVANCE_LP_RING(); -} - diff --git a/src/legacy/i810/i810_xaa.c b/src/legacy/i810/i810_xaa.c new file mode 100644 index 00000000..600b631d --- /dev/null +++ b/src/legacy/i810/i810_xaa.c @@ -0,0 +1,320 @@ + +/************************************************************************** + +Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. +All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sub license, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice (including the +next paragraph) shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR +ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +**************************************************************************/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* + * Authors: + * Keith Whitwell <keith@tungstengraphics.com> + * + */ + +#include "xf86.h" +#include "xaarop.h" +#include "i810.h" + +static void +I810SetupForMono8x8PatternFill(ScrnInfoPtr pScrn, int pattx, int patty, + int fg, int bg, int rop, + unsigned int planemask) +{ + I810Ptr pI810 = I810PTR(pScrn); + + if (I810_DEBUG & DEBUG_VERBOSE_ACCEL) + ErrorF("I810SetupFor8x8PatternColorExpand\n"); + + /* FULL_MONO_PAT_BLT, p176 */ + pI810->BR[0] = (BR00_BITBLT_CLIENT | BR00_OP_MONO_PAT_BLT | 0x9); + pI810->BR[18] = bg; + pI810->BR[19] = fg; + pI810->BR[13] = (pScrn->displayWidth * pI810->cpp); + pI810->BR[13] |= XAAGetPatternROP(rop) << 16; + if (bg == -1) + pI810->BR[13] |= BR13_MONO_PATN_TRANS; +} + +static void +I810SubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, int pattx, int patty, + int x, int y, int w, int h) +{ + I810Ptr pI810 = I810PTR(pScrn); + int addr = + pI810->bufferOffset + (y * pScrn->displayWidth + x) * pI810->cpp; + + if (I810_DEBUG & DEBUG_VERBOSE_ACCEL) + ErrorF("I810Subsequent8x8PatternColorExpand\n"); + + { + BEGIN_LP_RING(12); + OUT_RING(pI810->BR[0] | ((y << 5) & BR00_PAT_VERT_ALIGN)); + OUT_RING(pI810->BR[13]); + OUT_RING((h << 16) | (w * pI810->cpp)); + OUT_RING(addr); + OUT_RING(pI810->BR[13] & 0xFFFF); /* src pitch */ + OUT_RING(addr); /* src addr */ + OUT_RING(0); /* transparency color */ + OUT_RING(pI810->BR[18]); /* bg */ + OUT_RING(pI810->BR[19]); /* fg */ + OUT_RING(pattx); /* pattern data */ + OUT_RING(patty); + OUT_RING(0); + ADVANCE_LP_RING(); + } +} + +static void +I810GetNextScanlineColorExpandBuffer(ScrnInfoPtr pScrn) +{ + I810Ptr pI810 = I810PTR(pScrn); + XAAInfoRecPtr infoPtr = pI810->AccelInfoRec; + + if (pI810->nextColorExpandBuf == pI810->NumScanlineColorExpandBuffers) + I810Sync(pScrn); + + infoPtr->ScanlineColorExpandBuffers[0] = + pI810->ScanlineColorExpandBuffers[pI810->nextColorExpandBuf]; + + if (I810_DEBUG & DEBUG_VERBOSE_ACCEL) + ErrorF("using color expand buffer %d\n", pI810->nextColorExpandBuf); + + pI810->nextColorExpandBuf++; +} + +static void +I810SetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, + int fg, int bg, int rop, + unsigned int planemask) +{ + I810Ptr pI810 = I810PTR(pScrn); + + if (I810_DEBUG & DEBUG_VERBOSE_ACCEL) + ErrorF("I810SetupForScanlineScreenToScreenColorExpand %d %d %x %x\n", + fg, bg, rop, planemask); + + pI810->BR[13] = (pScrn->displayWidth * pI810->cpp); + pI810->BR[13] |= XAAGetCopyROP(rop) << 16; + pI810->BR[13] |= (1 << 27); + if (bg == -1) + pI810->BR[13] |= BR13_MONO_TRANSPCY; + + pI810->BR[18] = bg; + pI810->BR[19] = fg; + + I810GetNextScanlineColorExpandBuffer(pScrn); +} + +static void +I810SubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, + int x, int y, + int w, int h, int skipleft) +{ + I810Ptr pI810 = I810PTR(pScrn); + + if (I810_DEBUG & DEBUG_VERBOSE_ACCEL) + ErrorF("I810SubsequentScanlineCPUToScreenColorExpandFill " + "%d,%d %dx%x %d\n", x, y, w, h, skipleft); + + pI810->BR[0] = BR00_BITBLT_CLIENT | BR00_OP_MONO_SRC_COPY_BLT | 0x06; + pI810->BR[9] = (pI810->bufferOffset + + (y * pScrn->displayWidth + x) * pI810->cpp); + pI810->BR[14] = ((1 << 16) | (w * pI810->cpp)); + pI810->BR[11] = ((w + 31) / 32) - 1; +} + +static void +I810SubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno) +{ + I810Ptr pI810 = I810PTR(pScrn); + + pI810->BR[12] = (pI810->AccelInfoRec->ScanlineColorExpandBuffers[0] - + pI810->FbBase); + + if (I810_DEBUG & DEBUG_VERBOSE_ACCEL) + ErrorF("I810SubsequentColorExpandScanline %d (addr %x)\n", + bufno, pI810->BR[12]); + + { + BEGIN_LP_RING(8); + OUT_RING(pI810->BR[0]); + OUT_RING(pI810->BR[13]); + OUT_RING(pI810->BR[14]); + OUT_RING(pI810->BR[9]); + OUT_RING(pI810->BR[11]); + OUT_RING(pI810->BR[12]); /* srcaddr */ + OUT_RING(pI810->BR[18]); + OUT_RING(pI810->BR[19]); + ADVANCE_LP_RING(); + } + + /* Advance to next scanline. + */ + pI810->BR[9] += pScrn->displayWidth * pI810->cpp; + I810GetNextScanlineColorExpandBuffer(pScrn); +} + +/* Emit on gaining VT? + */ +#if 0 +static void +I810EmitInvarientState(ScrnInfoPtr pScrn) +{ + I810Ptr pI810 = I810PTR(pScrn); + + BEGIN_LP_RING(10); + + OUT_RING(INST_PARSER_CLIENT | INST_OP_FLUSH | INST_FLUSH_MAP_CACHE); + OUT_RING(GFX_CMD_CONTEXT_SEL | CS_UPDATE_USE | CS_USE_CTX0); + OUT_RING(INST_PARSER_CLIENT | INST_OP_FLUSH | INST_FLUSH_MAP_CACHE); + OUT_RING(0); + + OUT_RING(GFX_OP_COLOR_CHROMA_KEY); + OUT_RING(CC1_UPDATE_KILL_WRITE | + CC1_DISABLE_KILL_WRITE | + CC1_UPDATE_COLOR_IDX | + CC1_UPDATE_CHROMA_LOW | CC1_UPDATE_CHROMA_HI | 0); + OUT_RING(0); + OUT_RING(0); + +/* OUT_RING( CMD_OP_Z_BUFFER_INFO ); */ +/* OUT_RING( pI810->DepthBuffer.Start | pI810->auxPitchBits); */ + + ADVANCE_LP_RING(); +} +#endif + +/* The following function sets up the supported acceleration. Call it + * from the FbInit() function in the SVGA driver, or before ScreenInit + * in a monolithic server. + */ +Bool +I810AccelInit(ScreenPtr pScreen) +{ + XAAInfoRecPtr infoPtr; + ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); + I810Ptr pI810 = I810PTR(pScrn); + + if (I810_DEBUG & DEBUG_VERBOSE_ACCEL) + ErrorF("I810AccelInit\n"); + + pI810->AccelInfoRec = infoPtr = XAACreateInfoRec(); + if (!infoPtr) + return FALSE; + + pI810->bufferOffset = 0; + infoPtr->Flags = LINEAR_FRAMEBUFFER | OFFSCREEN_PIXMAPS; + infoPtr->Flags |= PIXMAP_CACHE; + + /* Sync + */ + infoPtr->Sync = I810Sync; + + /* Solid filled rectangles + */ + { + infoPtr->SolidFillFlags = NO_PLANEMASK; + infoPtr->SetupForSolidFill = I810SetupForSolidFill; + infoPtr->SubsequentSolidFillRect = I810SubsequentSolidFillRect; + } + + /* Screen to screen copy + * - the transparency op hangs the blit engine, disable for now. + */ + { + infoPtr->ScreenToScreenCopyFlags = (0 + | NO_PLANEMASK + | NO_TRANSPARENCY | 0); + + infoPtr->SetupForScreenToScreenCopy = I810SetupForScreenToScreenCopy; + infoPtr->SubsequentScreenToScreenCopy = + I810SubsequentScreenToScreenCopy; + } + + /* 8x8 pattern fills + */ + { + infoPtr->SetupForMono8x8PatternFill = I810SetupForMono8x8PatternFill; + infoPtr->SubsequentMono8x8PatternFillRect = + I810SubsequentMono8x8PatternFillRect; + + infoPtr->Mono8x8PatternFillFlags = (HARDWARE_PATTERN_PROGRAMMED_BITS | + HARDWARE_PATTERN_SCREEN_ORIGIN | + BIT_ORDER_IN_BYTE_MSBFIRST | + NO_PLANEMASK | 0); + } + + /* 8x8 color fills - not considered useful for XAA. + */ + + /* Scanline color expansion - Use the same scheme as the 3.3 driver. + * + */ + if (pI810->Scratch.Size != 0) { + int i; + int width = ALIGN(pScrn->displayWidth, 32) / 8; + int nr_buffers = pI810->Scratch.Size / width; + unsigned char *ptr = pI810->FbBase + pI810->Scratch.Start; + + pI810->NumScanlineColorExpandBuffers = nr_buffers; + pI810->ScanlineColorExpandBuffers = (unsigned char **) + xnfcalloc(nr_buffers, sizeof(unsigned char *)); + + for (i = 0; i < nr_buffers; i++, ptr += width) + pI810->ScanlineColorExpandBuffers[i] = ptr; + + infoPtr->ScanlineCPUToScreenColorExpandFillFlags = (NO_PLANEMASK | + ROP_NEEDS_SOURCE | + BIT_ORDER_IN_BYTE_MSBFIRST + | 0); + + infoPtr->ScanlineColorExpandBuffers = (unsigned char **) + xnfcalloc(1, sizeof(unsigned char *)); + infoPtr->NumScanlineColorExpandBuffers = 1; + + infoPtr->ScanlineColorExpandBuffers[0] = + pI810->ScanlineColorExpandBuffers[0]; + pI810->nextColorExpandBuf = 0; + + infoPtr->SetupForScanlineCPUToScreenColorExpandFill = + I810SetupForScanlineCPUToScreenColorExpandFill; + + infoPtr->SubsequentScanlineCPUToScreenColorExpandFill = + I810SubsequentScanlineCPUToScreenColorExpandFill; + + infoPtr->SubsequentColorExpandScanline = + I810SubsequentColorExpandScanline; + } + + /* Possible todo: Image writes w/ non-GXCOPY rop. + */ + + I810SelectBuffer(pScrn, I810_SELECT_FRONT); + + return XAAInit(pScreen, infoPtr); +} |