? cscope.files ? cscope.out ? cfb/compiler.h ? cfb24/.deps ? cfb24/.libs ? cfb24/Makefile ? cfb24/Makefile.in ? cfb24/cfb8lineCO.c ? cfb24/cfb8lineCO.lo ? cfb24/cfb8lineCP.c ? cfb24/cfb8lineCP.lo ? cfb24/cfb8lineG.c ? cfb24/cfb8lineG.lo ? cfb24/cfb8lineX.c ? cfb24/cfb8lineX.lo ? cfb24/cfb8segC.c ? cfb24/cfb8segC.lo ? cfb24/cfb8segCS.c ? cfb24/cfb8segCS.lo ? cfb24/cfb8segX.c ? cfb24/cfb8segX.lo ? cfb24/cfb8setG.c ? cfb24/cfb8setG.lo ? cfb24/cfballpriv.lo ? cfb24/cfbbitblt.lo ? cfb24/cfbbltC.c ? cfb24/cfbbltC.lo ? cfb24/cfbbltG.c ? cfb24/cfbbltG.lo ? cfb24/cfbbltO.c ? cfb24/cfbbltO.lo ? cfb24/cfbbltX.c ? cfb24/cfbbltX.lo ? cfb24/cfbbres.lo ? cfb24/cfbbresd.lo ? cfb24/cfbbstore.lo ? cfb24/cfbcmap.lo ? cfb24/cfbcppl.lo ? cfb24/cfbfillarcC.c ? cfb24/cfbfillarcC.lo ? cfb24/cfbfillarcG.c ? cfb24/cfbfillarcG.lo ? cfb24/cfbfillrct.lo ? cfb24/cfbfillsp.lo ? cfb24/cfbgc.lo ? cfb24/cfbgetsp.lo ? cfb24/cfbglblt8.lo ? cfb24/cfbhrzvert.lo ? cfb24/cfbigblt8.lo ? cfb24/cfbimage.lo ? cfb24/cfbline.lo ? cfb24/cfbmskbits.lo ? cfb24/cfbpixmap.lo ? cfb24/cfbply1rctC.c ? cfb24/cfbply1rctC.lo ? cfb24/cfbply1rctG.c ? cfb24/cfbply1rctG.lo ? cfb24/cfbpntwin.lo ? cfb24/cfbpolypnt.loT ? cfb24/cfbrrop.lo ? cfb24/cfbscrinit.lo ? cfb24/cfbseg.c ? cfb24/cfbseg.lo ? cfb24/cfbsetsp.lo ? cfb24/cfbsolidC.c ? cfb24/cfbsolidC.lo ? cfb24/cfbsolidG.c ? cfb24/cfbsolidG.lo ? cfb24/cfbsolidX.c ? cfb24/cfbsolidX.lo ? cfb24/cfbtegblt.lo ? cfb24/cfbtile32C.c ? cfb24/cfbtile32C.lo ? cfb24/cfbtile32G.c ? cfb24/cfbtile32G.lo ? cfb24/cfbtileoddC.c ? cfb24/cfbtileoddC.lo ? cfb24/cfbtileoddG.c ? cfb24/cfbtileoddG.lo ? cfb24/cfbwindow.lo ? cfb24/cfbzerarcC.c ? cfb24/cfbzerarcC.lo ? cfb24/cfbzerarcG.c ? cfb24/cfbzerarcG.lo ? cfb24/cfbzerarcX.c ? cfb24/cfbzerarcX.lo ? cfb24/libcfb24.la ? doc/Xserver.1x ? hw/dmx/Xdmx.1x ? hw/dmx/config/dmxtodmx.1x ? hw/dmx/config/vdltodmx.1x ? hw/dmx/config/xdmxconfig.1x ? hw/xfree86/xf8_32wid/.deps ? hw/xfree86/xf8_32wid/.libs ? hw/xfree86/xf8_32wid/Makefile ? hw/xfree86/xf8_32wid/Makefile.in ? hw/xfree86/xf8_32wid/cfb8_32widmodule.lo ? hw/xfree86/xf8_32wid/cfbscrinit.lo ? hw/xfree86/xf8_32wid/cfbwid.lo ? hw/xfree86/xf8_32wid/cfbwindow.lo ? hw/xfree86/xf8_32wid/libxf8_32wid.la ? ilbm/Makefile ? ilbm/Makefile.in ? iplan2p4/Makefile ? iplan2p4/Makefile.in Index: exa/exa.h =================================================================== RCS file: /cvs/xorg/xserver/xorg/exa/exa.h,v retrieving revision 1.10 diff -u -r1.10 exa.h --- exa/exa.h 16 Feb 2006 00:14:10 -0000 1.10 +++ exa/exa.h 25 Feb 2006 22:02:00 -0000 @@ -206,7 +206,7 @@ #define EXA_OFFSCREEN_PIXMAPS (1 << 0) #define EXA_OFFSCREEN_ALIGN_POT (1 << 1) - +#define EXA_TWO_BITBLT_DIRECTIONS (1 << 2) #define EXA_MAKE_VERSION(a, b, c) (((a) << 16) | ((b) << 8) | (c)) #define EXA_VERSION \ @@ -249,20 +249,23 @@ unsigned long exaGetPixmapSize(PixmapPtr pPix); -void -exaEnableDisableFBAccess (int index, Bool enable); - -#define exaInitCard(exa, sync, memory_base, off_screen_base, memory_size, \ - offscreen_byte_align, offscreen_pitch, flags, \ - max_x, max_y) \ - (exa)->card.Sync = sync; \ - (exa)->card.memoryBase = memory_base; \ - (exa)->card.offScreenBase = off_screen_base; \ - (exa)->card.memorySize = memory_size; \ - (exa)->card.offscreenByteAlign = offscreen_byte_align; \ - (exa)->card.offscreenPitch = offscreen_pitch; \ - (exa)->card.flags = flags; \ - (exa)->card.maxX = max_x; \ - (exa)->card.maxY = max_y +static void inline exaInitCard(ExaDriverPtr exa, int needsSync, + CARD8 *memory_base, + unsigned long off_screen_base, + unsigned long memory_size, + int offscreen_byte_align, + int offscreen_pitch, int flags, int max_x, + int max_y) +{ + exa->card.needsSync = needsSync; + exa->card.memoryBase = memory_base; + exa->card.offScreenBase = off_screen_base; + exa->card.memorySize = memory_size; + exa->card.pixmapOffsetAlign = offscreen_byte_align; + exa->card.pixmapPitchAlign = offscreen_pitch; + exa->card.flags = flags; + exa->card.maxX = max_x; + exa->card.maxY = max_y; +} #endif /* EXA_H */ Index: exa/exa_accel.c =================================================================== RCS file: /cvs/xorg/xserver/xorg/exa/exa_accel.c,v retrieving revision 1.35 diff -u -r1.35 exa_accel.c --- exa/exa_accel.c 16 Feb 2006 00:14:10 -0000 1.35 +++ exa/exa_accel.c 25 Feb 2006 22:02:00 -0000 @@ -141,6 +141,7 @@ PixmapPtr pSrcPixmap, pDstPixmap; int src_off_x, src_off_y; int dst_off_x, dst_off_y; + int dirsetup; /* Respect maxX/maxY in a trivial way: don't set up drawing when we might * violate the limits. The proper solution would be a temporary pixmap @@ -169,14 +170,23 @@ exaDrawableUseMemory (pDstDrawable); } - if ((pSrcPixmap = exaGetOffscreenPixmap (pSrcDrawable, &src_off_x, &src_off_y)) && - (pDstPixmap = exaGetOffscreenPixmap (pDstDrawable, &dst_off_x, &dst_off_y)) && - (*pExaScr->info->accel.PrepareCopy) (pSrcPixmap, - pDstPixmap, - dx, - dy, - pGC ? pGC->alu : GXcopy, - pGC ? pGC->planemask : FB_ALLONES)) + /* Need to get both pixmaps to call the driver routines */ + pSrcPixmap = exaGetOffscreenPixmap (pSrcDrawable, &src_off_x, &src_off_y); + pDstPixmap = exaGetOffscreenPixmap (pDstDrawable, &dst_off_x, &dst_off_y); + if (!pSrcPixmap || !pDstPixmap) + goto fallback; + + /* If the card only supports two blt directions, make sure dx * dy >= 0 */ + if ((!(pExaScr->info->card.flags & EXA_TWO_BITBLT_DIRECTIONS) || + (dx * dy) >= 0) && (*pExaScr->info->accel.PrepareCopy) (pSrcPixmap, + pDstPixmap, + dx, + dy, + pGC ? pGC->alu : + GXcopy, + pGC ? + pGC->planemask : + FB_ALLONES)) { while (nbox--) { @@ -193,6 +203,101 @@ exaDrawableDirty (pDstDrawable); return; } + else if (pExaScr->info->card.flags & EXA_TWO_BITBLT_DIRECTIONS) + { + /* + * Now the case of a chip that only supports xdir = ydir = 1 or + * xdir = ydir = -1, but we have xdir != ydir. + */ + dirsetup = 0; /* No direction set up yet. */ + for (; nbox; pbox++, nbox--) { + if (dx >= 0 && (src_off_y + pbox->y1 + dy) != pbox->y1) { + /* Do a xdir = ydir = -1 blit instead. */ + if (dirsetup != -1) { + dirsetup = -1; + (*pExaScr->info->accel.PrepareCopy)(pSrcPixmap, pDstPixmap, + -1, -1, + pGC ? pGC->alu : + GXcopy, + pGC ? pGC->planemask : + FB_ALLONES); + } + (*pExaScr->info->accel.Copy)(pDstPixmap, + src_off_x + pbox->x1 + dx, + src_off_y + pbox->y1 + dy, + dst_off_x + pbox->x1, + dst_off_y + pbox->y1, + pbox->x2 - pbox->x1, + pbox->y2 - pbox->y1); + } else if (dx < 0 && (src_off_y + pbox->y1 + dy) != pbox->y1) { + /* Do a xdir = ydir = 1 blit instead. */ + if (dirsetup != 1) { + dirsetup = 1; + (*pExaScr->info->accel.PrepareCopy)(pSrcPixmap, pDstPixmap, + 1, 1, + pGC ? pGC->alu : + GXcopy, + pGC ? pGC->planemask : + FB_ALLONES); + } + (*pExaScr->info->accel.Copy)(pDstPixmap, + src_off_x + pbox->x1 + dx, + src_off_y + pbox->y1 + dy, + dst_off_x + pbox->x1, + dst_off_y + pbox->y1, + pbox->x2 - pbox->x1, + pbox->y2 - pbox->y1); + } else if (dx >= 0) { + /* + * xdir = 1, ydir = -1. + * Perform line-by-line xdir = ydir = 1 blits, going up. + */ + int i; + if (dirsetup != 1) { + dirsetup = 1; + (*pExaScr->info->accel.PrepareCopy)(pSrcPixmap, pDstPixmap, + 1, 1, + pGC ? pGC->alu : + GXcopy, + pGC ? pGC->planemask : + FB_ALLONES); + } + for (i = pbox->y2 - pbox->y1 - 1; i >= 0; i--) + (*pExaScr->info->accel.Copy)(pDstPixmap, + src_off_x + pbox->x1 + dx, + src_off_y + pbox->y1 + dy + i, + dst_off_x + pbox->x1, + dst_off_y + pbox->y1 + i, + pbox->x2 - pbox->x1, 1); + } else { + /* + * xdir = -1, ydir = 1. + * Perform line-by-line xdir = ydir = -1 blits, going down. + */ + int i; + if (dirsetup != -1) { + dirsetup = -1; + (*pExaScr->info->accel.PrepareCopy)(pSrcPixmap, pDstPixmap, + -1, -1, + pGC ? pGC->alu : + GXcopy, + pGC ? pGC->planemask : + FB_ALLONES); + } + for (i = 0; i < pbox->y2 - pbox->y1; i++) + (*pExaScr->info->accel.Copy)(pDstPixmap, + src_off_x + pbox->x1 + dx, + src_off_y + pbox->y1 + dy + i, + dst_off_x + pbox->x1, + dst_off_y + pbox->y1 + i, + pbox->x2 - pbox->x1, 1); + } + } + (*pExaScr->info->accel.DoneCopy)(pDstPixmap); + exaMarkSync(pDstDrawable->pScreen); + exaDrawableDirty(pDstDrawable); + return; + } fallback: EXA_FALLBACK(("from 0x%lx to 0x%lx\n", (long)pSrcDrawable,