diff options
author | Adam Jackson <ajax@nwnk.net> | 2006-03-20 19:12:50 +0000 |
---|---|---|
committer | Adam Jackson <ajax@nwnk.net> | 2006-03-20 19:12:50 +0000 |
commit | 88ece3c37c4ed529686b6cdea1bf9b6eed8fceea (patch) | |
tree | b77f097e1d11610306339690a8eb40956a4f86dc | |
parent | 089c7be83d6cace94a692ec46a4c3a05b32fd4f4 (diff) |
Bug #5587: Refactor mga_storm.c to only build once for all color depths.
(Ian Romanick)
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | src/Makefile.am | 16 | ||||
-rw-r--r-- | src/mga.h | 36 | ||||
-rw-r--r-- | src/mga_dga.c | 90 | ||||
-rw-r--r-- | src/mga_dri.c | 38 | ||||
-rw-r--r-- | src/mga_macros.h | 49 | ||||
-rw-r--r-- | src/mga_map.h | 17 | ||||
-rw-r--r-- | src/mga_storm.c | 1250 | ||||
-rw-r--r-- | src/mga_video.c | 11 |
9 files changed, 716 insertions, 804 deletions
@@ -1,3 +1,16 @@ +2006-03-20 Adam Jackson <ajax@freedesktop.org> + + * src/Makefile.am: + * src/mga.h: + * src/mga_dga.c: + * src/mga_dri.c: + * src/mga_macros.h: + * src/mga_map.h: + * src/mga_storm.c: + * src/mga_video.c: + Bug #5587: Refactor mga_storm.c to only build once for all color + depths. (Ian Romanick) + 2006-03-15 Adam Jackson <ajax@freedesktop.org> * src/mga_dri.c: diff --git a/src/Makefile.am b/src/Makefile.am index 25b68ae..19ff915 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -18,20 +18,6 @@ # 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. -# FIXME: This is a little bit sick, but how else can you do it? -noinst_LTLIBRARIES = libmga_storm8.la libmga_storm16.la libmga_storm24.la libmga_storm32.la -libmga_storm8_la_SOURCES = mga_storm.c -libmga_storm8_la_CFLAGS = @XORG_CFLAGS@ @DRI_CFLAGS@ -DPSZ=8 - -libmga_storm16_la_SOURCES = mga_storm.c -libmga_storm16_la_CFLAGS = @XORG_CFLAGS@ @DRI_CFLAGS@ -DPSZ=16 - -libmga_storm24_la_SOURCES = mga_storm.c -libmga_storm24_la_CFLAGS = @XORG_CFLAGS@ @DRI_CFLAGS@ -DPSZ=24 - -libmga_storm32_la_SOURCES = mga_storm.c -libmga_storm32_la_CFLAGS = @XORG_CFLAGS@ @DRI_CFLAGS@ -DPSZ=32 - # this is obnoxious: # -module lets us name the module exactly how we want # -avoid-version prevents gratuitous .0.0.0 version numbers on the end @@ -61,7 +47,6 @@ mga_drv_la_SOURCES = \ mga_halmod.c \ mga_hwcurs.c \ mga_macros.h \ - mga_map.h \ mga_maven.h \ mga_merge.c \ mga_merge.h \ @@ -69,6 +54,7 @@ mga_drv_la_SOURCES = \ mga_reg.h \ mga_sarea.h \ mga_shadow.c \ + mga_storm.c \ mga_ucode.h \ mga_video.c @@ -592,15 +592,7 @@ void MGAStormEngineInit(ScrnInfoPtr pScrn); Bool MGAStormAccelInit(ScreenPtr pScreen); Bool MGAHWCursorInit(ScreenPtr pScreen); -Bool Mga8AccelInit(ScreenPtr pScreen); -Bool Mga16AccelInit(ScreenPtr pScreen); -Bool Mga24AccelInit(ScreenPtr pScreen); -Bool Mga32AccelInit(ScreenPtr pScreen); - -void Mga8InitSolidFillRectFuncs(MGAPtr pMga); -void Mga16InitSolidFillRectFuncs(MGAPtr pMga); -void Mga24InitSolidFillRectFuncs(MGAPtr pMga); -void Mga32InitSolidFillRectFuncs(MGAPtr pMga); +Bool mgaAccelInit(ScreenPtr pScreen); void MGAPolyArcThinSolid(DrawablePtr, GCPtr, int, xArc*); @@ -612,27 +604,11 @@ void MGARefreshArea16(ScrnInfoPtr pScrn, int num, BoxPtr pbox); void MGARefreshArea24(ScrnInfoPtr pScrn, int num, BoxPtr pbox); void MGARefreshArea32(ScrnInfoPtr pScrn, int num, BoxPtr pbox); -void Mga8SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, - int ydir, int rop, unsigned int planemask, - int trans); -void Mga16SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, - int ydir, int rop, unsigned int planemask, - int trans); -void Mga24SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, - int ydir, int rop, unsigned int planemask, - int trans); -void Mga32SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, - int ydir, int rop, unsigned int planemask, - int trans); - -void Mga8SetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop, - unsigned int planemask); -void Mga16SetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop, - unsigned int planemask); -void Mga24SetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop, - unsigned int planemask); -void Mga32SetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop, - unsigned int planemask); +void mgaDoSetupForScreenToScreenCopy( ScrnInfoPtr pScrn, int xdir, + int ydir, int rop, unsigned int planemask, int trans, unsigned int bpp ); + +void mgaDoSetupForSolidFill( ScrnInfoPtr pScrn, int color, int rop, + unsigned int planemask, unsigned int bpp ); void MGAPointerMoved(int index, int x, int y); diff --git a/src/mga_dga.c b/src/mga_dga.c index 28ff766..e728484 100644 --- a/src/mga_dga.c +++ b/src/mga_dga.c @@ -366,21 +366,8 @@ MGA_FillRect ( if(!pMga->AccelInfoRec) return; - switch(pMga->CurrentLayout.bitsPerPixel) { - case 8: - Mga8SetupForSolidFill(pScrn, color, GXcopy, ~0); - break; - case 16: - Mga16SetupForSolidFill(pScrn, color, GXcopy, ~0); - break; - case 24: - Mga24SetupForSolidFill(pScrn, color, GXcopy, ~0); - break; - case 32: - Mga32SetupForSolidFill(pScrn, color, GXcopy, ~0); - break; - } - + mgaDoSetupForSolidFill(pScrn, color, GXcopy, ~0, + pMga->CurrentLayout.bitsPerPixel); (*pMga->AccelInfoRec->SubsequentSolidFillRect)(pScrn, x, y, w, h); SET_SYNC_FLAG(pMga->AccelInfoRec); @@ -399,24 +386,8 @@ MGA_BlitRect( if(!pMga->AccelInfoRec) return; - switch(pMga->CurrentLayout.bitsPerPixel) { - case 8: - Mga8SetupForScreenToScreenCopy( - pScrn, xdir, ydir, GXcopy, ~0, -1); - break; - case 16: - Mga16SetupForScreenToScreenCopy( - pScrn, xdir, ydir, GXcopy, ~0, -1); - break; - case 24: - Mga24SetupForScreenToScreenCopy( - pScrn, xdir, ydir, GXcopy, ~0, -1); - break; - case 32: - Mga32SetupForScreenToScreenCopy( - pScrn, xdir, ydir, GXcopy, ~0, -1); - break; - } + mgaDoSetupForScreenToScreenCopy( pScrn, xdir, ydir, GXcopy, ~0, -1, + pMga->CurrentLayout.bitsPerPixel ); (*pMga->AccelInfoRec->SubsequentScreenToScreenCopy)( pScrn, srcx, srcy, dstx, dsty, w, h); @@ -425,45 +396,30 @@ MGA_BlitRect( } -static void -MGA_BlitTransRect( - ScrnInfoPtr pScrn, - int srcx, int srcy, - int w, int h, - int dstx, int dsty, - unsigned long color -){ +static void MGA_BlitTransRect( ScrnInfoPtr pScrn, int srcx, int srcy, + int w, int h, int dstx, int dsty, + unsigned long color ) +{ MGAPtr pMga = MGAPTR(pScrn); - int xdir = ((srcx < dstx) && (srcy == dsty)) ? -1 : 1; - int ydir = (srcy < dsty) ? -1 : 1; - if(!pMga->AccelInfoRec) return; - if(pMga->CurrentLayout.bitsPerPixel == 24) return; - if(pMga->Chipset == PCI_CHIP_MGA2064) return; - - pMga->DrawTransparent = TRUE; - - switch(pMga->CurrentLayout.bitsPerPixel) { - case 8: - Mga8SetupForScreenToScreenCopy( - pScrn, xdir, ydir, GXcopy, ~0, color); - break; - case 16: - Mga16SetupForScreenToScreenCopy( - pScrn, xdir, ydir, GXcopy, ~0, color); - break; - case 32: - Mga32SetupForScreenToScreenCopy( - pScrn, xdir, ydir, GXcopy, ~0, color); - break; - } + if( (pMga->AccelInfoRec != NULL) + && (pMga->CurrentLayout.bitsPerPixel != 24) + && (pMga->Chipset != PCI_CHIP_MGA2064) ) { + const int xdir = ((srcx < dstx) && (srcy == dsty)) ? -1 : 1; + const int ydir = (srcy < dsty) ? -1 : 1; - pMga->DrawTransparent = FALSE; + pMga->DrawTransparent = TRUE; - (*pMga->AccelInfoRec->SubsequentScreenToScreenCopy)( - pScrn, srcx, srcy, dstx, dsty, w, h); + mgaDoSetupForScreenToScreenCopy( pScrn, xdir, ydir, GXcopy, ~0, color, + pMga->CurrentLayout.bitsPerPixel ); - SET_SYNC_FLAG(pMga->AccelInfoRec); + pMga->DrawTransparent = FALSE; + + (*pMga->AccelInfoRec->SubsequentScreenToScreenCopy)( + pScrn, srcx, srcy, dstx, dsty, w, h); + + SET_SYNC_FLAG(pMga->AccelInfoRec); + } } diff --git a/src/mga_dri.c b/src/mga_dri.c index 8780160..c235321 100644 --- a/src/mga_dri.c +++ b/src/mga_dri.c @@ -80,25 +80,9 @@ static char MGAClientDriverName[] = "mga"; /* DRI buffer management */ -extern void Mga8DRIInitBuffers( WindowPtr pWin, RegionPtr prgn, - CARD32 index ); -extern void Mga8DRIMoveBuffers( WindowPtr pParent, DDXPointRec ptOldOrg, - RegionPtr prgnSrc, CARD32 index ); - -extern void Mga16DRIInitBuffers( WindowPtr pWin, RegionPtr prgn, - CARD32 index ); -extern void Mga16DRIMoveBuffers( WindowPtr pParent, DDXPointRec ptOldOrg, - RegionPtr prgnSrc, CARD32 index ); - -extern void Mga24DRIInitBuffers( WindowPtr pWin, RegionPtr prgn, - CARD32 index ); -extern void Mga24DRIMoveBuffers( WindowPtr pParent, DDXPointRec ptOldOrg, - RegionPtr prgnSrc, CARD32 index ); - -extern void Mga32DRIInitBuffers( WindowPtr pWin, RegionPtr prgn, - CARD32 index ); -extern void Mga32DRIMoveBuffers( WindowPtr pParent, DDXPointRec ptOldOrg, - RegionPtr prgnSrc, CARD32 index ); +extern void mgaDRIInitBuffers( WindowPtr pWin, RegionPtr prgn, CARD32 index ); +extern void mgaDRIMoveBuffers( WindowPtr pParent, DDXPointRec ptOldOrg, + RegionPtr prgnSrc, CARD32 index ); /* Initialize the visual configs that are supported by the hardware. @@ -1112,20 +1096,8 @@ Bool MGADRIScreenInit( ScreenPtr pScreen ) pDRIInfo->SwapContext = MGADRISwapContext; } - switch( pScrn->bitsPerPixel ) { - case 8: - pDRIInfo->InitBuffers = Mga8DRIInitBuffers; - pDRIInfo->MoveBuffers = Mga8DRIMoveBuffers; - case 16: - pDRIInfo->InitBuffers = Mga16DRIInitBuffers; - pDRIInfo->MoveBuffers = Mga16DRIMoveBuffers; - case 24: - pDRIInfo->InitBuffers = Mga24DRIInitBuffers; - pDRIInfo->MoveBuffers = Mga24DRIMoveBuffers; - case 32: - pDRIInfo->InitBuffers = Mga32DRIInitBuffers; - pDRIInfo->MoveBuffers = Mga32DRIMoveBuffers; - } + pDRIInfo->InitBuffers = mgaDRIInitBuffers; + pDRIInfo->MoveBuffers = mgaDRIMoveBuffers; pDRIInfo->bufferRequests = DRI_ALL_WINDOWS; diff --git a/src/mga_macros.h b/src/mga_macros.h index d985081..1c479e6 100644 --- a/src/mga_macros.h +++ b/src/mga_macros.h @@ -1,22 +1,8 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_macros.h,v 1.22 2002/02/20 17:17:50 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_macros.h,v 1.21 2001/09/26 12:59:17 alanh Exp $ */ #ifndef _MGA_MACROS_H_ #define _MGA_MACROS_H_ -#ifndef PSZ -#define PSZ 8 -#endif - -#if PSZ == 8 -#define REPLICATE(r) r &= 0xFF; r |= r << 8; r |= r << 16 -#elif PSZ == 16 -#define REPLICATE(r) r &= 0xFFFF; r |= r << 16 -#elif PSZ == 24 -#define REPLICATE(r) r &= 0xFFFFFF; r |= r << 24 -#else -#define REPLICATE(r) /* */ -#endif - #define RGBEQUAL(c) (!((((c) >> 8) ^ (c)) & 0xffff)) #ifdef XF86DRI @@ -51,30 +37,15 @@ while(INREG(MGAREG_DWGSYNC) != MGA_SYNC_XTAG) ; \ (MAKEDMAINDEX(three) << 16) | \ (MAKEDMAINDEX(four) << 24) ) -#if PSZ == 24 -#define SET_PLANEMASK(p) /**/ -#else -#define SET_PLANEMASK(p) \ - if(!(pMga->AccelFlags & MGA_NO_PLANEMASK) && ((p) != pMga->PlaneMask)) { \ - pMga->PlaneMask = (p); \ - REPLICATE((p)); \ - OUTREG(MGAREG_PLNWT,(p)); \ - } -#endif - -#define SET_FOREGROUND(c) \ - if((c) != pMga->FgColor) { \ - pMga->FgColor = (c); \ - REPLICATE((c)); \ - OUTREG(MGAREG_FCOL,(c)); \ - } - -#define SET_BACKGROUND(c) \ - if((c) != pMga->BgColor) { \ - pMga->BgColor = (c); \ - REPLICATE((c)); \ - OUTREG(MGAREG_BCOL,(c)); \ - } +#define SET_PLANEMASK_REPLICATED(mask, rep_mask, bpp) \ + do { \ + if( (bpp != 24) \ + && !(pMga->AccelFlags & MGA_NO_PLANEMASK) \ + && ((mask) != pMga->PlaneMask)) { \ + pMga->PlaneMask = (mask); \ + OUTREG(MGAREG_PLNWT,(rep_mask)); \ + } \ + } while( 0 ) #define DISABLE_CLIP() { \ pMga->AccelFlags &= ~CLIPPER_ON; \ diff --git a/src/mga_map.h b/src/mga_map.h deleted file mode 100644 index b41ca69..0000000 --- a/src/mga_map.h +++ /dev/null @@ -1,17 +0,0 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_map.h,v 1.2 2001/07/25 15:05:06 dawes Exp $ */ - -#if !defined(UNIXCPP) || defined(ANSICPP) -#define CATNAME(prefix,subname) prefix##subname -#else -#define CATNAME(prefix,subname) prefix/**/subname -#endif - -#if PSZ == 8 -#define MGANAME(subname) CATNAME(Mga8,subname) -#elif PSZ == 16 -#define MGANAME(subname) CATNAME(Mga16,subname) -#elif PSZ == 24 -#define MGANAME(subname) CATNAME(Mga24,subname) -#elif PSZ == 32 -#define MGANAME(subname) CATNAME(Mga32,subname) -#endif diff --git a/src/mga_storm.c b/src/mga_storm.c index e094669..366bddb 100644 --- a/src/mga_storm.c +++ b/src/mga_storm.c @@ -1,5 +1,7 @@ /* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_storm.c,v 1.99tsi Exp $ */ +#define PSZ 8 + #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -32,99 +34,120 @@ #include "mga.h" #include "mga_reg.h" -#include "mga_map.h" #include "mga_macros.h" #ifdef XF86DRI #include "mga_dri.h" #endif +#define REPLICATE_8(r) (((r) & 0x0ff) | (((r) & 0x0ff) << 8) \ + | (((r) & 0x0ff) << 16) | (((r) & 0x0ff) << 24)) +#define REPLICATE_16(r) (((r) & 0x0000ffff) | (((r) & 0x0000ffff) << 16)) +#define REPLICATE_24(r) (((r) & 0x00ffffff) | (((r) & 0x00ffffff) << 24)) +#define REPLICATE_32(r) (r) + + +#define SET_FOREGROUND_REPLICATED(c, rep_c) \ + if((c) != pMga->FgColor) { \ + pMga->FgColor = (c); \ + OUTREG(MGAREG_FCOL,(rep_c)); \ + } + +#define SET_BACKGROUND_REPLICATED(c, rep_c) \ + if((c) != pMga->BgColor) { \ + pMga->BgColor = (c); \ + OUTREG(MGAREG_BCOL,(rep_c)); \ + } + + #define MGAMoveDWORDS(d,s,c) \ do { \ write_mem_barrier(); \ XAAMoveDWORDS((d),(s),(c)); \ } while (0) -static void MGANAME(SubsequentScreenToScreenCopy)(ScrnInfoPtr pScrn, - int srcX, int srcY, int dstX, int dstY, - int w, int h); -static void MGANAME(SubsequentScreenToScreenCopy_FastBlit)(ScrnInfoPtr pScrn, - int srcX, int srcY, int dstX, int dstY, - int w, int h); -static void MGANAME(SetupForScanlineCPUToScreenColorExpandFill)( - ScrnInfoPtr pScrn, int fg, - int bg, int rop, unsigned int planemask); -static void MGANAME(SubsequentScanlineCPUToScreenColorExpandFill)( - ScrnInfoPtr pScrn, - int x, int y, int w, int h, int skipleft); -static void MGANAME(SubsequentColorExpandScanline)(ScrnInfoPtr pScrn, - int bufno); -static void MGANAME(SubsequentColorExpandScanlineIndirect)(ScrnInfoPtr pScrn, - int bufno); -static void MGANAME(SubsequentSolidFillRect)(ScrnInfoPtr pScrn, - int x, int y, int w, int h); -static void MGANAME(SubsequentSolidFillTrap)(ScrnInfoPtr pScrn, int y, int h, - int left, int dxL, int dyL, int eL, - int right, int dxR, int dyR, int eR); -static void MGANAME(SubsequentSolidHorVertLine) (ScrnInfoPtr pScrn, - int x, int y, int len, int dir); -static void MGANAME(SubsequentSolidTwoPointLine)(ScrnInfoPtr pScrn, - int x1, int y1, int x2, int y2, int flags); -static void MGANAME(SetupForMono8x8PatternFill)(ScrnInfoPtr pScrn, - int patx, int paty, int fg, int bg, - int rop, unsigned int planemask); -static void MGANAME(SubsequentMono8x8PatternFillRect)(ScrnInfoPtr pScrn, - int patx, int paty, - int x, int y, int w, int h ); -static void MGANAME(SubsequentMono8x8PatternFillRect_Additional)( - ScrnInfoPtr pScrn, int patx, int paty, - int x, int y, int w, int h ); -static void MGANAME(SubsequentMono8x8PatternFillTrap)( ScrnInfoPtr pScrn, - int patx, int paty, int y, int h, - int left, int dxL, int dyL, int eL, - int right, int dxR, int dyR, int eR); -static void MGANAME(SetupForScanlineImageWrite)(ScrnInfoPtr pScrn, int rop, - unsigned int planemask, - int transparency_color, int bpp, int depth); -static void MGANAME(SubsequentScanlineImageWriteRect)(ScrnInfoPtr pScrn, - int x, int y, int w, int h, int skipleft); -static void MGANAME(SubsequentImageWriteScanline)(ScrnInfoPtr pScrn, int num); -#if PSZ != 24 -static void MGANAME(SetupForPlanarScreenToScreenColorExpandFill)( - ScrnInfoPtr pScrn, int fg, int bg, int rop, - unsigned int planemask); -static void MGANAME(SubsequentPlanarScreenToScreenColorExpandFill)( - ScrnInfoPtr pScrn, - int x, int y, int w, int h, - int srcx, int srcy, int skipleft); -#endif -static void MGANAME(SetupForScreenToScreenColorExpandFill)(ScrnInfoPtr pScrn, - int fg, int bg, int rop, - unsigned int planemask); -static void MGANAME(SubsequentScreenToScreenColorExpandFill)(ScrnInfoPtr pScrn, - int x, int y, int w, int h, - int srcx, int srcy, int skipleft); +static void mgaSetupForSolidFill( ScrnInfoPtr pScrn, int color, + int rop, unsigned int planemask ); + +static void mgaSetupForScreenToScreenCopy( ScrnInfoPtr pScrn, + int xdir, int ydir, int rop, unsigned int planemask, int trans ); + +static void mgaSubsequentScreenToScreenCopy( ScrnInfoPtr pScrn, + int srcX, int srcY, int dstX, int dstY, int w, int h ); + +static void mgaSubsequentScreenToScreenCopy_FastBlit( ScrnInfoPtr pScrn, + int srcX, int srcY, int dstX, int dstY, int w, int h ); + +static void mgaSetupForScanlineCPUToScreenColorExpandFill( ScrnInfoPtr pScrn, + int fg, int bg, int rop, unsigned int planemask ); + +static void mgaSubsequentScanlineCPUToScreenColorExpandFill( ScrnInfoPtr pScrn, + int x, int y, int w, int h, int skipleft ); + +static void mgaSubsequentColorExpandScanline( ScrnInfoPtr pScrn, int bufno ); + +static void mgaSubsequentColorExpandScanlineIndirect( ScrnInfoPtr pScrn, + int bufno ); + +static void mgaSubsequentSolidFillRect( ScrnInfoPtr pScrn, int x, int y, + int w, int h ); + +static void mgaSubsequentSolidFillTrap( ScrnInfoPtr pScrn, int y, int h, + int left, int dxL, int dyL, int eL, int right, int dxR, int dyR, int eR ); + +static void mgaSubsequentSolidHorVertLine( ScrnInfoPtr pScrn, int x, int y, + int len, int dir ); + +static void mgaSubsequentSolidTwoPointLine( ScrnInfoPtr pScrn, int x1, int y1, + int x2, int y2, int flags ); + +static void mgaSetupForMono8x8PatternFill( ScrnInfoPtr pScrn, + int patx, int paty, int fg, int bg, int rop, unsigned int planemask ); + +static void mgaSubsequentMono8x8PatternFillRect( ScrnInfoPtr pScrn, + int patx, int paty, int x, int y, int w, int h ); + +static void mgaSubsequentMono8x8PatternFillRect_Additional( ScrnInfoPtr pScrn, + int patx, int paty, int x, int y, int w, int h ); + +static void mgaSubsequentMono8x8PatternFillTrap( ScrnInfoPtr pScrn, + int patx, int paty, int y, int h, int left, int dxL, int dyL, int eL, + int right, int dxR, int dyR, int eR ); + +static void mgaSetupForScanlineImageWrite( ScrnInfoPtr pScrn, int rop, + unsigned int planemask, int transparency_color, int bpp, int depth ); + +static void mgaSubsequentScanlineImageWriteRect( ScrnInfoPtr pScrn, + int x, int y, int w, int h, int skipleft ); + +static void mgaSubsequentImageWriteScanline( ScrnInfoPtr pScrn, int num ); + +static void mgaSetupForPlanarScreenToScreenColorExpandFill( ScrnInfoPtr pScrn, + int fg, int bg, int rop, unsigned int planemask ); + +static void mgaSubsequentPlanarScreenToScreenColorExpandFill( ScrnInfoPtr pScrn, + int x, int y, int w, int h, int srcx, int srcy, int skipleft ); + +static void mgaSetupForScreenToScreenColorExpandFill( ScrnInfoPtr pScrn, + int fg, int bg, int rop, unsigned int planemask ); + +static void mgaSubsequentScreenToScreenColorExpandFill( ScrnInfoPtr pScrn, + int x, int y, int w, int h, int srcx, int srcy, int skipleft ); + #if X_BYTE_ORDER == X_LITTLE_ENDIAN -static void MGANAME(SetupForDashedLine)(ScrnInfoPtr pScrn, int fg, int bg, - int rop, unsigned int planemask, int length, - unsigned char *pattern); -static void MGANAME(SubsequentDashedTwoPointLine)(ScrnInfoPtr pScrn, - int x1, int y1, int x2, int y2, - int flags, int phase); -#endif -void MGANAME(RestoreAccelState)(ScrnInfoPtr pScrn); -#if PSZ == 8 -void Mga16RestoreAccelState(ScrnInfoPtr pScrn); -void Mga24RestoreAccelState(ScrnInfoPtr pScrn); -void Mga32RestoreAccelState(ScrnInfoPtr pScrn); +static void mgaSetupForDashedLine( ScrnInfoPtr pScrn, int fg, int bg, + int rop, unsigned int planemask, int length, unsigned char *pattern ); + +static void mgaSubsequentDashedTwoPointLine( ScrnInfoPtr pScrn, + int x1, int y1, int x2, int y2, int flags, int phase ); #endif -#ifdef XF86DRI -void MGANAME(DRIInitBuffers)(WindowPtr pWin, - RegionPtr prgn, CARD32 index); -void MGANAME(DRIMoveBuffers)(WindowPtr pParent, DDXPointRec ptOldOrg, - RegionPtr prgnSrc, CARD32 index); +void mgaRestoreAccelState( ScrnInfoPtr pScrn ); +#ifdef XF86DRI +void mgaDRIInitBuffers(WindowPtr pWin, RegionPtr prgn, CARD32 index); +void mgaDRIMoveBuffers(WindowPtr pParent, DDXPointRec ptOldOrg, + RegionPtr prgnSrc, CARD32 index); #endif extern void MGASetClippingRectangle(ScrnInfoPtr pScrn, int x1, int y1, @@ -144,6 +167,40 @@ extern void MGAValidatePolyPoint(GCPtr, unsigned long, DrawablePtr); extern void MGAFillCacheBltRects(ScrnInfoPtr, int, unsigned int, int, BoxPtr, int, int, XAACacheInfoPtr); + +static __inline__ void +common_replicate_colors_and_mask( unsigned int fg, unsigned int bg, + unsigned int pm, + unsigned int bpp, + unsigned int * rep_fg, + unsigned int * rep_bg, + unsigned int * rep_pm ) +{ + switch( bpp ) { + case 8: + *rep_fg = REPLICATE_8( fg ); + *rep_bg = REPLICATE_8( bg ); + *rep_pm = REPLICATE_8( pm ); + break; + case 16: + *rep_fg = REPLICATE_16( fg ); + *rep_bg = REPLICATE_16( bg ); + *rep_pm = REPLICATE_16( pm ); + break; + case 24: + *rep_fg = REPLICATE_24( fg ); + *rep_bg = REPLICATE_24( bg ); + *rep_pm = REPLICATE_24( pm ); + break; + case 32: + *rep_fg = REPLICATE_32( fg ); + *rep_bg = REPLICATE_32( bg ); + *rep_pm = REPLICATE_32( pm ); + break; + } +} + + #ifdef RENDER extern Bool @@ -205,7 +262,6 @@ MGASubsequentCPUToScreenTexture ( extern CARD32 MGAAlphaTextureFormats[2]; extern CARD32 MGATextureFormats[2]; -#if PSZ == 8 #include "mipict.h" #include "dixstruct.h" @@ -285,22 +341,14 @@ GetPowerOfTwo(int w) static int tex_padw, tex_padh; -Bool -MGASetupForCPUToScreenAlphaTextureFaked ( - ScrnInfoPtr pScrn, - int op, - CARD16 red, - CARD16 green, - CARD16 blue, - CARD16 alpha, - int alphaType, - CARD8 *alphaPtr, - int alphaPitch, - int width, - int height, - int flags -){ - int log2w, log2h, i, pitch, sizeNeeded, offset; +Bool MGASetupForCPUToScreenAlphaTextureFaked( ScrnInfoPtr pScrn, int op, + CARD16 red, CARD16 green, + CARD16 blue, CARD16 alpha, + int alphaType, CARD8 *alphaPtr, + int alphaPitch, int width, + int height, int flags ) +{ + int log2w, log2h, pitch, sizeNeeded, offset; MGAPtr pMga = MGAPTR(pScrn); if(op != PictOpOver) /* only one tested */ @@ -315,9 +363,8 @@ MGASetupForCPUToScreenAlphaTextureFaked ( CHECK_DMA_QUIESCENT(pMga, pScrn); if(pMga->Overlay8Plus24) { - i = 0x00ffffff; WAITFIFO(1); - SET_PLANEMASK(i); + SET_PLANEMASK_REPLICATED( 0x00ffffff, 0xffffffff, 32 ); } pitch = (width + 15) & ~15; @@ -396,9 +443,8 @@ MGASetupForCPUToScreenAlphaTexture ( CHECK_DMA_QUIESCENT(pMga, pScrn); if(pMga->Overlay8Plus24) { - i = 0x00ffffff; WAITFIFO(1); - SET_PLANEMASK(i); + SET_PLANEMASK_REPLICATED( 0x00ffffff, 0xffffffff, 32 ); } pitch = (width + 15) & ~15; @@ -491,9 +537,8 @@ MGASetupForCPUToScreenTexture ( CHECK_DMA_QUIESCENT(pMga, pScrn); if(pMga->Overlay8Plus24) { - i = 0x00ffffff; WAITFIFO(1); - SET_PLANEMASK(i); + SET_PLANEMASK_REPLICATED( 0x00ffffff, 0xffffffff, 32 ); } pitch = (width + 15) & ~15; @@ -567,11 +612,9 @@ MGASubsequentCPUToScreenTexture ( } -#endif -#endif +#endif /* defined(RENDER) */ -Bool -MGANAME(AccelInit)(ScreenPtr pScreen) +Bool mgaAccelInit( ScreenPtr pScreen ) { XAAInfoRecPtr infoPtr; ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; @@ -580,7 +623,7 @@ MGANAME(AccelInit)(ScreenPtr pScreen) Bool doRender = FALSE; BoxRec AvailFBArea; - pMga->ScratchBuffer = xalloc(((pScrn->displayWidth * PSZ) + 127) >> 3); + pMga->ScratchBuffer = xalloc(((pScrn->displayWidth * pMga->CurrentLayout.bitsPerPixel) + 127) >> 3); if(!pMga->ScratchBuffer) return FALSE; pMga->AccelInfoRec = infoPtr = XAACreateInfoRec(); @@ -633,9 +676,9 @@ MGANAME(AccelInit)(ScreenPtr pScreen) /* all should be able to use this now with the bug fixes */ pMga->AccelFlags |= USE_LINEAR_EXPANSION; -#if PSZ == 24 - pMga->AccelFlags |= MGA_NO_PLANEMASK; -#endif + if ( pMga->CurrentLayout.bitsPerPixel == 24 ) { + pMga->AccelFlags |= MGA_NO_PLANEMASK; + } if(pMga->HasSDRAM) { pMga->Atype = pMga->AtypeNoBLK = MGAAtypeNoBLK; @@ -657,25 +700,22 @@ MGANAME(AccelInit)(ScreenPtr pScreen) /* screen to screen copy */ infoPtr->ScreenToScreenCopyFlags = NO_TRANSPARENCY; infoPtr->SetupForScreenToScreenCopy = - MGANAME(SetupForScreenToScreenCopy); - infoPtr->SubsequentScreenToScreenCopy = - MGANAME(SubsequentScreenToScreenCopy); + mgaSetupForScreenToScreenCopy; + infoPtr->SubsequentScreenToScreenCopy = mgaSubsequentScreenToScreenCopy; if(pMga->HasFBitBlt) { infoPtr->FillCacheBltRects = MGAFillCacheBltRects; infoPtr->FillCacheBltRectsFlags = NO_TRANSPARENCY; } /* solid fills */ - infoPtr->SetupForSolidFill = MGANAME(SetupForSolidFill); - infoPtr->SubsequentSolidFillRect = MGANAME(SubsequentSolidFillRect); - infoPtr->SubsequentSolidFillTrap = MGANAME(SubsequentSolidFillTrap); + infoPtr->SetupForSolidFill = mgaSetupForSolidFill; + infoPtr->SubsequentSolidFillRect = mgaSubsequentSolidFillRect; + infoPtr->SubsequentSolidFillTrap = mgaSubsequentSolidFillTrap; /* solid lines */ infoPtr->SetupForSolidLine = infoPtr->SetupForSolidFill; - infoPtr->SubsequentSolidHorVertLine = - MGANAME(SubsequentSolidHorVertLine); - infoPtr->SubsequentSolidTwoPointLine = - MGANAME(SubsequentSolidTwoPointLine); + infoPtr->SubsequentSolidHorVertLine = mgaSubsequentSolidHorVertLine; + infoPtr->SubsequentSolidTwoPointLine = mgaSubsequentSolidTwoPointLine; /* clipping */ infoPtr->SetClippingRectangle = MGASetClippingRectangle; @@ -688,9 +728,8 @@ MGANAME(AccelInit)(ScreenPtr pScreen) #if X_BYTE_ORDER == X_LITTLE_ENDIAN /* dashed lines */ infoPtr->DashedLineFlags = LINE_PATTERN_MSBFIRST_LSBJUSTIFIED; - infoPtr->SetupForDashedLine = MGANAME(SetupForDashedLine); - infoPtr->SubsequentDashedTwoPointLine = - MGANAME(SubsequentDashedTwoPointLine); + infoPtr->SetupForDashedLine = mgaSetupForDashedLine; + infoPtr->SubsequentDashedTwoPointLine = mgaSubsequentDashedTwoPointLine; infoPtr->DashPatternMaxLength = 128; #endif @@ -699,11 +738,11 @@ MGANAME(AccelInit)(ScreenPtr pScreen) HARDWARE_PATTERN_PROGRAMMED_ORIGIN | HARDWARE_PATTERN_SCREEN_ORIGIN | BIT_ORDER_IN_BYTE_MSBFIRST; - infoPtr->SetupForMono8x8PatternFill = MGANAME(SetupForMono8x8PatternFill); + infoPtr->SetupForMono8x8PatternFill = mgaSetupForMono8x8PatternFill; infoPtr->SubsequentMono8x8PatternFillRect = - MGANAME(SubsequentMono8x8PatternFillRect); + mgaSubsequentMono8x8PatternFillRect; infoPtr->SubsequentMono8x8PatternFillTrap = - MGANAME(SubsequentMono8x8PatternFillTrap); + mgaSubsequentMono8x8PatternFillTrap; /* cpu to screen color expansion */ infoPtr->ScanlineCPUToScreenColorExpandFillFlags = @@ -723,11 +762,10 @@ MGANAME(AccelInit)(ScreenPtr pScreen) pMga->ColorExpandBase = pMga->IOBase; } infoPtr->SetupForScanlineCPUToScreenColorExpandFill = - MGANAME(SetupForScanlineCPUToScreenColorExpandFill); + mgaSetupForScanlineCPUToScreenColorExpandFill; infoPtr->SubsequentScanlineCPUToScreenColorExpandFill = - MGANAME(SubsequentScanlineCPUToScreenColorExpandFill); - infoPtr->SubsequentColorExpandScanline = - MGANAME(SubsequentColorExpandScanline); + mgaSubsequentScanlineCPUToScreenColorExpandFill; + infoPtr->SubsequentColorExpandScanline = mgaSubsequentColorExpandScanline; infoPtr->NumScanlineColorExpandBuffers = 1; infoPtr->ScanlineColorExpandBuffers = &(pMga->ColorExpandBase); @@ -736,22 +774,23 @@ MGANAME(AccelInit)(ScreenPtr pScreen) infoPtr->ScreenToScreenColorExpandFillFlags = BIT_ORDER_IN_BYTE_LSBFIRST; infoPtr->SetupForScreenToScreenColorExpandFill = - MGANAME(SetupForScreenToScreenColorExpandFill); + mgaSetupForScreenToScreenColorExpandFill; infoPtr->SubsequentScreenToScreenColorExpandFill = - MGANAME(SubsequentScreenToScreenColorExpandFill); - } else { -#if PSZ != 24 - /* Alternate (but slower) planar expansions */ + mgaSubsequentScreenToScreenColorExpandFill; + } + else if ( pMga->CurrentLayout.bitsPerPixel != 24 ) { + /* Alternate (but slower) planar expansions */ infoPtr->SetupForScreenToScreenColorExpandFill = - MGANAME(SetupForPlanarScreenToScreenColorExpandFill); + mgaSetupForPlanarScreenToScreenColorExpandFill; infoPtr->SubsequentScreenToScreenColorExpandFill = - MGANAME(SubsequentPlanarScreenToScreenColorExpandFill); - infoPtr->CacheColorExpandDensity = PSZ; + mgaSubsequentPlanarScreenToScreenColorExpandFill; + infoPtr->CacheColorExpandDensity = pMga->CurrentLayout.bitsPerPixel; infoPtr->CacheMonoStipple = XAAGetCachePlanarMonoStipple(); - /* It's faster to blit the stipples if you have fastbilt */ + + /* It's faster to blit the stipples if you have fastbilt + */ if(pMga->HasFBitBlt) infoPtr->ScreenToScreenColorExpandFillFlags = TRANSPARENCY_ONLY; -#endif } /* image writes */ @@ -762,12 +801,10 @@ MGANAME(AccelInit)(ScreenPtr pScreen) NO_TRANSPARENCY | NO_GXCOPY; - infoPtr->SetupForScanlineImageWrite = - MGANAME(SetupForScanlineImageWrite); + infoPtr->SetupForScanlineImageWrite = mgaSetupForScanlineImageWrite; infoPtr->SubsequentScanlineImageWriteRect = - MGANAME(SubsequentScanlineImageWriteRect); - infoPtr->SubsequentImageWriteScanline = - MGANAME(SubsequentImageWriteScanline); + mgaSubsequentScanlineImageWriteRect; + infoPtr->SubsequentImageWriteScanline = mgaSubsequentImageWriteScanline; infoPtr->NumScanlineImageWriteBuffers = 1; infoPtr->ScanlineImageWriteBuffers = &(pMga->ScratchBuffer); @@ -813,11 +850,11 @@ MGANAME(AccelInit)(ScreenPtr pScreen) maxFastBlitMem = (pMga->Interleave ? 4096 : 2048) * 1024; if(pMga->FbMapSize > maxFastBlitMem) { - pMga->MaxFastBlitY = maxFastBlitMem / (pScrn->displayWidth * PSZ / 8); + pMga->MaxFastBlitY = maxFastBlitMem / (pScrn->displayWidth * pMga->CurrentLayout.bitsPerPixel / 8); } maxlines = (min(pMga->FbUsableSize, 16*1024*1024)) / - (pScrn->displayWidth * PSZ / 8); + (pScrn->displayWidth * pMga->CurrentLayout.bitsPerPixel / 8); #ifdef XF86DRI if ( pMga->directRenderingEnabled ) { @@ -921,7 +958,7 @@ MGANAME(AccelInit)(ScreenPtr pScreen) pMGADRIServer->textureOffset ); } else -#endif +#endif /* defined(XF86DRI) */ { AvailFBArea.x1 = 0; AvailFBArea.x2 = pScrn->displayWidth; @@ -951,7 +988,7 @@ MGANAME(AccelInit)(ScreenPtr pScreen) shared_accel = TRUE; } if(shared_accel == TRUE) - infoPtr->RestoreAccelState = MGANAME(RestoreAccelState); + infoPtr->RestoreAccelState = mgaRestoreAccelState; } #ifdef RENDER @@ -976,25 +1013,20 @@ MGANAME(AccelInit)(ScreenPtr pScreen) infoPtr->CPUToScreenTextureFlags = XAA_RENDER_NO_TILE; infoPtr->CPUToScreenTextureFormats = MGATextureFormats; } -#endif +#endif /* defined(RENDER) */ return(XAAInit(pScreen, infoPtr)); } -void -MGANAME(InitSolidFillRectFuncs)(MGAPtr pMga) -{ - pMga->SetupForSolidFill = MGANAME(SetupForSolidFill); - pMga->SubsequentSolidFillRect = MGANAME(SubsequentSolidFillRect); -} /* Support for multiscreen */ -void -MGANAME(RestoreAccelState)(ScrnInfoPtr pScrn) +void mgaRestoreAccelState(ScrnInfoPtr pScrn) { MGAPtr pMga = MGAPTR(pScrn); MGAFBLayout *pLayout = &pMga->CurrentLayout; - CARD32 tmp; + unsigned int replicate_fg = 0; + unsigned int replicate_bg = 0; + unsigned int replicate_pm = 0; MGAStormSync(pScrn); WAITFIFO(12); @@ -1002,15 +1034,21 @@ MGANAME(RestoreAccelState)(ScrnInfoPtr pScrn) OUTREG(MGAREG_MACCESS, pMga->MAccess); OUTREG(MGAREG_PITCH, pLayout->displayWidth); OUTREG(MGAREG_YDSTORG, pMga->YDstOrg); - tmp = pMga->PlaneMask; - pMga->PlaneMask = ~tmp; - SET_PLANEMASK(tmp); - tmp = pMga->BgColor; - pMga->BgColor = ~tmp; - SET_BACKGROUND(tmp); - tmp = pMga->FgColor; - pMga->FgColor = ~tmp; - SET_FOREGROUND(tmp); + + + common_replicate_colors_and_mask( pMga->FgColor, pMga->BgColor, + pMga->PlaneMask, pLayout->bitsPerPixel, + & replicate_fg, & replicate_bg, + & replicate_pm ); + + if( (pLayout->bitsPerPixel != 24) + && ((pMga->AccelFlags & MGA_NO_PLANEMASK) == 0) ) { + OUTREG( MGAREG_PLNWT, replicate_pm ); + } + + OUTREG( MGAREG_BCOL, replicate_bg ); + OUTREG( MGAREG_FCOL, replicate_fg ); + OUTREG(MGAREG_SRCORG, pMga->realSrcOrg); OUTREG(MGAREG_DSTORG, pMga->DstOrg); #if X_BYTE_ORDER == X_LITTLE_ENDIAN @@ -1024,7 +1062,6 @@ MGANAME(RestoreAccelState)(ScrnInfoPtr pScrn) pMga->AccelFlags &= ~CLIPPER_ON; } -#if PSZ == 8 CARD32 MGAAtype[16] = { MGADWG_RPL | 0x00000000, MGADWG_RSTR | 0x00080000, @@ -1053,20 +1090,7 @@ CARD32 MGAAtypeNoBLK[16] = { Bool MGAStormAccelInit(ScreenPtr pScreen) { - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - - switch( pScrn->bitsPerPixel ) - { - case 8: - return Mga8AccelInit(pScreen); - case 16: - return Mga16AccelInit(pScreen); - case 24: - return Mga24AccelInit(pScreen); - case 32: - return Mga32AccelInit(pScreen); - } - return FALSE; + return mgaAccelInit( pScreen ); } @@ -1089,13 +1113,21 @@ MGAStormSync(ScrnInfoPtr pScrn) } } -void -MGAStormEngineInit(ScrnInfoPtr pScrn) + +void MGAStormEngineInit( ScrnInfoPtr pScrn ) { long maccess = 0; MGAPtr pMga = MGAPTR(pScrn); MGAFBLayout *pLayout = &pMga->CurrentLayout; CARD32 opmode; + static const unsigned int maccess_table[5] = { + /* bpp: 8 16 24 32 */ + 0, 0, 1, 3, 2 + }; + static const unsigned int opmode_table[5] = { + /* bpp: 8 16 24 32 */ + 0x00000, 0x00000, 0x10000, 0x20000, 0x20000 + }; CHECK_DMA_QUIESCENT(pMga, pScrn); @@ -1105,36 +1137,21 @@ MGAStormEngineInit(ScrnInfoPtr pScrn) opmode = INREG(MGAREG_OPMODE); - switch( pLayout->bitsPerPixel ) - { - case 8: - pMga->RestoreAccelState = Mga8RestoreAccelState; - break; - case 16: - maccess |= 1; - if(pLayout->depth == 15) - maccess |= (1 << 31); - Mga16InitSolidFillRectFuncs(pMga); - pMga->RestoreAccelState = Mga16RestoreAccelState; - opmode |= 0x10000; - break; - case 24: - maccess |= 3; - Mga24InitSolidFillRectFuncs(pMga); - pMga->RestoreAccelState = Mga24RestoreAccelState; - opmode |= 0x20000; - break; - case 32: - maccess |= 2; - Mga32InitSolidFillRectFuncs(pMga); - pMga->RestoreAccelState = Mga32RestoreAccelState; - opmode |= 0x20000; - break; + maccess |= maccess_table[ pLayout->bitsPerPixel / 8 ]; + if ( pLayout->depth == 15 ) { + maccess |= (1 << 31); } + + opmode |= opmode_table[ pLayout->bitsPerPixel / 8 ]; #if X_BYTE_ORDER == X_LITTLE_ENDIAN opmode &= ~0x30000; #endif + pMga->SetupForSolidFill = mgaSetupForSolidFill; + pMga->SubsequentSolidFillRect = mgaSubsequentSolidFillRect; + pMga->RestoreAccelState = mgaRestoreAccelState; + + pMga->fifoCount = 0; while(MGAISBUSY()); @@ -1180,10 +1197,11 @@ MGAStormEngineInit(ScrnInfoPtr pScrn) default: break; } - xf86SetLastScrnFlag(pScrn->entityList[0], pScrn->scrnIndex); + xf86SetLastScrnFlag(pScrn->entityList[0], pScrn->scrnIndex); } + void MGASetClippingRectangle( ScrnInfoPtr pScrn, int x1, int y1, int x2, int y2 @@ -1212,7 +1230,70 @@ void MGADisableClipping(ScrnInfoPtr pScrn) pMga->AccelFlags &= ~CLIPPER_ON; } -#endif + +static CARD32 +common_setup_for_pattern_fill( MGAPtr pMga, int fg, int bg, int rop, + int planemask, + CARD32 * reg_data, unsigned int count, + CARD32 cmd ) +{ + unsigned int replicate_fg = 0; + unsigned int replicate_bg = 0; + unsigned int replicate_pm = 0; + unsigned int i; + + + common_replicate_colors_and_mask( fg, bg, planemask, + pMga->CurrentLayout.bitsPerPixel, + & replicate_fg, & replicate_bg, + & replicate_pm ); + + + if( bg == -1 ) { + if ( (pMga->CurrentLayout.bitsPerPixel == 24) && !RGBEQUAL(fg) ) { + cmd |= MGADWG_TRANSC | pMga->AtypeNoBLK[rop]; + } + else { + cmd |= MGADWG_TRANSC | pMga->Atype[rop]; + } + + WAITFIFO( count + 3 ); + } + else { + /* (Packed) 24-bit is a funky mode. We only use the Atype table in + * 24-bit if the components of the foreground color and the components + * of the background color are the same (e.g., fg = 0xf8f8f8 and bg = + * 0x131313). + */ + + if( ((pMga->AccelFlags & BLK_OPAQUE_EXPANSION) != 0) + && ((pMga->CurrentLayout.bitsPerPixel != 24) + || (RGBEQUAL(fg) && RGBEQUAL(bg))) ) { + cmd |= pMga->Atype[rop]; + } + else { + cmd |= pMga->AtypeNoBLK[rop]; + } + + WAITFIFO( count + 4 ); + SET_BACKGROUND_REPLICATED( bg, replicate_bg ); + } + + SET_FOREGROUND_REPLICATED( fg, replicate_fg ); + SET_PLANEMASK_REPLICATED( planemask, replicate_pm, + pMga->CurrentLayout.bitsPerPixel ); + + /* FIXME: Is this the right order? */ + + for ( i = 0 ; i < count ; i++ ) { + OUTREG( reg_data[0], reg_data[1] ); + reg_data += 2; + } + + OUTREG(MGAREG_DWGCTL, cmd); + + return cmd; +} /*********************************************\ @@ -1222,22 +1303,22 @@ void MGADisableClipping(ScrnInfoPtr pScrn) #define BLIT_LEFT 1 #define BLIT_UP 4 -void -MGANAME(SetupForScreenToScreenCopy)( - ScrnInfoPtr pScrn, - int xdir, int ydir, - int rop, - unsigned int planemask, - int trans -){ +void mgaDoSetupForScreenToScreenCopy( ScrnInfoPtr pScrn, int xdir, int ydir, + int rop, unsigned int planemask, + int trans, unsigned bpp ) +{ MGAPtr pMga = MGAPTR(pScrn); CARD32 dwgctl = pMga->AtypeNoBLK[rop] | MGADWG_SHIFTZERO | MGADWG_BITBLT | MGADWG_BFCOL; + unsigned int tmp; + unsigned int replicated_trans = 0; + unsigned int replicated_mask = 0; + CHECK_DMA_QUIESCENT(pMga, pScrn); pMga->AccelInfoRec->SubsequentScreenToScreenCopy = - MGANAME(SubsequentScreenToScreenCopy); + mgaSubsequentScreenToScreenCopy; pMga->BltScanDirection = 0; if(ydir == -1) pMga->BltScanDirection |= BLIT_UP; @@ -1245,35 +1326,54 @@ MGANAME(SetupForScreenToScreenCopy)( pMga->BltScanDirection |= BLIT_LEFT; else if(pMga->HasFBitBlt && (rop == GXcopy) && !pMga->DrawTransparent) pMga->AccelInfoRec->SubsequentScreenToScreenCopy = - MGANAME(SubsequentScreenToScreenCopy_FastBlit); + mgaSubsequentScreenToScreenCopy_FastBlit; + + + common_replicate_colors_and_mask( trans, 0, planemask, bpp, + & replicated_trans, & tmp, + & replicated_mask ); if(pMga->DrawTransparent) { dwgctl |= MGADWG_TRANSC; WAITFIFO(2); - SET_FOREGROUND(trans); - trans = ~0; - SET_BACKGROUND(trans); + + SET_FOREGROUND_REPLICATED( trans, replicated_trans ); + SET_BACKGROUND_REPLICATED( ~0, ~0 ); } WAITFIFO(4); OUTREG(MGAREG_DWGCTL, dwgctl); OUTREG(MGAREG_SGN, pMga->BltScanDirection); - SET_PLANEMASK(planemask); + + SET_PLANEMASK_REPLICATED( planemask, replicated_mask, bpp ); OUTREG(MGAREG_AR5, ydir * pMga->CurrentLayout.displayWidth); } -static void -MGANAME(SubsequentScreenToScreenCopy)( - ScrnInfoPtr pScrn, - int srcX, int srcY, int dstX, int dstY, int w, int h -){ +void mgaSetupForScreenToScreenCopy( ScrnInfoPtr pScrn, int xdir, int ydir, + int rop, unsigned int planemask, + int trans ) +{ + MGAPtr pMga = MGAPTR(pScrn); + + mgaDoSetupForScreenToScreenCopy( pScrn, xdir, ydir, rop, planemask, trans, + pMga->CurrentLayout.bitsPerPixel ); +} + + +void mgaSubsequentScreenToScreenCopy( ScrnInfoPtr pScrn, + int srcX, int srcY, int dstX, int dstY, + int w, int h ) +{ int start, end, SrcOrg = 0, DstOrg = 0; MGAPtr pMga = MGAPTR(pScrn); if (pMga->AccelFlags & LARGE_ADDRESSES) { - SrcOrg = ((srcY & ~1023) * pMga->CurrentLayout.displayWidth * PSZ) >> 9; - DstOrg = ((dstY & ~1023) * pMga->CurrentLayout.displayWidth * PSZ) >> 9; + const unsigned int display_bit_width = + (pMga->CurrentLayout.displayWidth * pMga->CurrentLayout.bitsPerPixel); + + SrcOrg = ((srcY & ~1023) * display_bit_width) >> 9; + DstOrg = ((dstY & ~1023) * display_bit_width) >> 9; dstY &= 1023; } @@ -1297,7 +1397,7 @@ MGANAME(SubsequentScreenToScreenCopy)( OUTREG(MGAREG_SRCORG, (SrcOrg << 6) + pMga->realSrcOrg); } if(SrcOrg) { - SrcOrg = (SrcOrg << 9) / PSZ; + SrcOrg = (SrcOrg << 9) / pMga->CurrentLayout.bitsPerPixel; end -= SrcOrg; start -= SrcOrg; } @@ -1317,14 +1417,16 @@ MGANAME(SubsequentScreenToScreenCopy)( } -static void -MGANAME(SubsequentScreenToScreenCopy_FastBlit)( - ScrnInfoPtr pScrn, - int srcX, int srcY, int dstX, int dstY, int w, int h -) +void mgaSubsequentScreenToScreenCopy_FastBlit( ScrnInfoPtr pScrn, + int srcX, int srcY, + int dstX, int dstY, + int w, int h ) { int start, end; MGAPtr pMga = MGAPTR(pScrn); + static const unsigned int masks[5] = { + 0, 0x07f, 0x03f, 0x7f, 0x1f + }; if(pMga->BltScanDirection & BLIT_UP) { srcY += h - 1; @@ -1337,15 +1439,7 @@ MGANAME(SubsequentScreenToScreenCopy_FastBlit)( /* we assume the driver asserts screen pitches such that we can always use fastblit for scrolling */ - if( -#if PSZ == 32 - !((srcX ^ dstX) & 31) -#elif PSZ == 16 - !((srcX ^ dstX) & 63) -#else - !((srcX ^ dstX) & 127) -#endif - ) { + if(((srcX ^ dstX) & masks[ pMga->CurrentLayout.bitsPerPixel / 8 ]) == 0) { if(pMga->MaxFastBlitY) { if(pMga->BltScanDirection & BLIT_UP) { if((srcY >= pMga->MaxFastBlitY) || @@ -1360,33 +1454,38 @@ MGANAME(SubsequentScreenToScreenCopy_FastBlit)( /* Millennium 1 fastblit bug fix */ if(pMga->AccelFlags & FASTBLT_BUG) { - int fxright = dstX + w; -#if PSZ == 8 - if((dstX & (1 << 6)) && (((fxright >> 6) - (dstX >> 6)) & 7) == 7) { - fxright |= 1 << 6; -#elif PSZ == 16 - if((dstX & (1 << 5)) && (((fxright >> 5) - (dstX >> 5)) & 7) == 7) { - fxright |= 1 << 5; -#elif PSZ == 24 - if(((dstX * 3) & (1 << 6)) && - ((((fxright * 3 + 2) >> 6) - ((dstX * 3) >> 6)) & 7) == 7) { - fxright = ((fxright * 3 + 2) | (1 << 6)) / 3; -#elif PSZ == 32 - if((dstX & (1 << 4)) && (((fxright >> 4) - (dstX >> 4)) & 7) == 7) { - fxright |= 1 << 4; -#endif - WAITFIFO(8); - OUTREG(MGAREG_CXRIGHT, dstX + w); - OUTREG(MGAREG_DWGCTL, 0x040A400C); - OUTREG(MGAREG_AR0, end); - OUTREG(MGAREG_AR3, start); - OUTREG(MGAREG_FXBNDRY, (fxright << 16) | (dstX & 0xffff)); - OUTREG(MGAREG_YDSTLEN + MGAREG_EXEC, (dstY << 16) | h); - OUTREG(MGAREG_DWGCTL, pMga->AtypeNoBLK[GXcopy] | - MGADWG_SHIFTZERO | MGADWG_BITBLT | MGADWG_BFCOL); - OUTREG(MGAREG_CXRIGHT, 0xFFFF); - return; - } /* } } } (preserve pairs for pair matching) */ + int fxright = dstX + w; + int tmp_dstX = dstX; + int tmp_fxright = fxright; + static const unsigned shift_tab[5] = { + 0, 6, 5, 6, 4 + }; + const unsigned shift = shift_tab[pMga->CurrentLayout.bitsPerPixel / 8]; + + if (pMga->CurrentLayout.bitsPerPixel == 24) { + tmp_dstX *= 3; + tmp_fxright = fxright * 3 + 2; + } + + if( (tmp_dstX & (1 << shift)) + && (((tmp_fxright >> shift) - (tmp_dstX >> shift)) & 7) == 7) { + fxright = (tmp_fxright | (1 << shift)); + if (pMga->CurrentLayout.bitsPerPixel == 24) { + fxright /= 3; + } + + WAITFIFO(8); + OUTREG(MGAREG_CXRIGHT, dstX + w); + OUTREG(MGAREG_DWGCTL, 0x040A400C); + OUTREG(MGAREG_AR0, end); + OUTREG(MGAREG_AR3, start); + OUTREG(MGAREG_FXBNDRY, (fxright << 16) | (dstX & 0xffff)); + OUTREG(MGAREG_YDSTLEN + MGAREG_EXEC, (dstY << 16) | h); + OUTREG(MGAREG_DWGCTL, pMga->AtypeNoBLK[GXcopy] | + MGADWG_SHIFTZERO | MGADWG_BITBLT | MGADWG_BFCOL); + OUTREG(MGAREG_CXRIGHT, 0xFFFF); + return; + } } WAITFIFO(6); @@ -1409,49 +1508,68 @@ FASTBLIT_BAILOUT: OUTREG(MGAREG_YDSTLEN + MGAREG_EXEC, (dstY << 16) | h); } - /******************\ | Solid Fills | \******************/ -void -MGANAME(SetupForSolidFill)( - ScrnInfoPtr pScrn, - int color, - int rop, - unsigned int planemask ) +void mgaDoSetupForSolidFill( ScrnInfoPtr pScrn, int color, int rop, + unsigned int planemask, unsigned int bpp ) { MGAPtr pMga = MGAPTR(pScrn); + unsigned int tmp; + unsigned int replicated_color = 0; + unsigned int replicated_planemask = 0; + + common_replicate_colors_and_mask( color, 0, planemask, bpp, + & replicated_color, & tmp, + & replicated_planemask ); CHECK_DMA_QUIESCENT(pMga, pScrn); -#if PSZ == 24 - if(!RGBEQUAL(color)) - pMga->FilledRectCMD = MGADWG_TRAP | MGADWG_SOLID | MGADWG_ARZERO | - MGADWG_SGNZERO | MGADWG_SHIFTZERO | - MGADWG_BMONOLEF | pMga->AtypeNoBLK[rop]; - else -#endif - pMga->FilledRectCMD = MGADWG_TRAP | MGADWG_SOLID | MGADWG_ARZERO | - MGADWG_SGNZERO | MGADWG_SHIFTZERO | - MGADWG_BMONOLEF | pMga->Atype[rop]; + if ( (bpp == 24) && !RGBEQUAL(color) ) { + pMga->FilledRectCMD = MGADWG_TRAP | MGADWG_SOLID | MGADWG_ARZERO | + MGADWG_SGNZERO | MGADWG_SHIFTZERO | + MGADWG_BMONOLEF | pMga->AtypeNoBLK[rop]; + } + else { + pMga->FilledRectCMD = MGADWG_TRAP | MGADWG_SOLID | MGADWG_ARZERO | + MGADWG_SGNZERO | MGADWG_SHIFTZERO | + MGADWG_BMONOLEF | pMga->Atype[rop]; + } - pMga->SolidLineCMD = MGADWG_SOLID | MGADWG_SHIFTZERO | MGADWG_BFCOL | - pMga->AtypeNoBLK[rop]; + pMga->SolidLineCMD = MGADWG_SOLID | MGADWG_SHIFTZERO | MGADWG_BFCOL | + pMga->AtypeNoBLK[rop]; if(pMga->AccelFlags & TRANSC_SOLID_FILL) pMga->FilledRectCMD |= MGADWG_TRANSC; WAITFIFO(3); - SET_FOREGROUND(color); - SET_PLANEMASK(planemask); + if ( color != pMga->FgColor ) { + pMga->FgColor = color; + OUTREG( MGAREG_FCOL, replicated_color ); + } + + if ( (bpp != 24) + && !(pMga->AccelFlags & MGA_NO_PLANEMASK) + && (planemask != pMga->PlaneMask) ) { + pMga->PlaneMask = planemask; + OUTREG( MGAREG_PLNWT, replicated_planemask ); + } + OUTREG(MGAREG_DWGCTL, pMga->FilledRectCMD); } -static void -MGANAME(SubsequentSolidFillRect)( - ScrnInfoPtr pScrn, - int x, int y, int w, int h ) +void mgaSetupForSolidFill( ScrnInfoPtr pScrn, int color, int rop, + unsigned int planemask ) +{ + MGAPtr pMga = MGAPTR(pScrn); + + mgaDoSetupForSolidFill( pScrn, color, rop, planemask, + pMga->CurrentLayout.bitsPerPixel ); +} + +void mgaSubsequentSolidFillRect( ScrnInfoPtr pScrn, + int x, int y, int w, int h ) { MGAPtr pMga = MGAPTR(pScrn); @@ -1460,10 +1578,9 @@ MGANAME(SubsequentSolidFillRect)( OUTREG(MGAREG_YDSTLEN + MGAREG_EXEC, (y << 16) | h); } -static void -MGANAME(SubsequentSolidFillTrap)(ScrnInfoPtr pScrn, int y, int h, - int left, int dxL, int dyL, int eL, - int right, int dxR, int dyR, int eR ) +void mgaSubsequentSolidFillTrap( ScrnInfoPtr pScrn, int y, int h, + int left, int dxL, int dyL, int eL, + int right, int dxR, int dyR, int eR ) { MGAPtr pMga = MGAPTR(pScrn); int sdxl = (dxL < 0); @@ -1485,18 +1602,15 @@ MGANAME(SubsequentSolidFillTrap)(ScrnInfoPtr pScrn, int y, int h, OUTREG(MGAREG_YDSTLEN + MGAREG_EXEC, (y << 16) | h); OUTREG(MGAREG_DWGCTL, pMga->FilledRectCMD); } + /***************\ | Solid Lines | \***************/ - -static void -MGANAME(SubsequentSolidHorVertLine) ( - ScrnInfoPtr pScrn, - int x, int y, - int len, int dir -){ +void mgaSubsequentSolidHorVertLine( ScrnInfoPtr pScrn, int x, int y, + int len, int dir ) +{ MGAPtr pMga = MGAPTR(pScrn); if(dir == DEGREES_0) { @@ -1517,11 +1631,9 @@ MGANAME(SubsequentSolidHorVertLine) ( } -static void -MGANAME(SubsequentSolidTwoPointLine)( - ScrnInfoPtr pScrn, - int x1, int y1, int x2, int y2, int flags -){ +void mgaSubsequentSolidTwoPointLine( ScrnInfoPtr pScrn, int x1, int y1, + int x2, int y2, int flags ) +{ MGAPtr pMga = MGAPTR(pScrn); WAITFIFO(4); @@ -1533,68 +1645,42 @@ MGANAME(SubsequentSolidTwoPointLine)( } - /***************************\ | 8x8 Mono Pattern Fills | \***************************/ -static void -MGANAME(SetupForMono8x8PatternFill)( - ScrnInfoPtr pScrn, - int patx, int paty, - int fg, int bg, - int rop, - unsigned int planemask ) +void mgaSetupForMono8x8PatternFill( ScrnInfoPtr pScrn, + int patx, int paty, int fg, int bg, + int rop, unsigned int planemask ) { MGAPtr pMga = MGAPTR(pScrn); XAAInfoRecPtr infoRec = pMga->AccelInfoRec; + CARD32 regs[4]; CHECK_DMA_QUIESCENT(pMga, pScrn); - pMga->PatternRectCMD = MGADWG_TRAP | MGADWG_ARZERO | MGADWG_SGNZERO | - MGADWG_BMONOLEF; - infoRec->SubsequentMono8x8PatternFillRect = - MGANAME(SubsequentMono8x8PatternFillRect); - - if(bg == -1) { -#if PSZ == 24 - if(!RGBEQUAL(fg)) - pMga->PatternRectCMD |= MGADWG_TRANSC | pMga->AtypeNoBLK[rop]; - else -#endif - pMga->PatternRectCMD |= MGADWG_TRANSC | pMga->Atype[rop]; - - WAITFIFO(5); - } else { -#if PSZ == 24 - if((pMga->AccelFlags & BLK_OPAQUE_EXPANSION) && RGBEQUAL(fg) && RGBEQUAL(bg)) -#else - if(pMga->AccelFlags & BLK_OPAQUE_EXPANSION) -#endif - pMga->PatternRectCMD |= pMga->Atype[rop]; - else - pMga->PatternRectCMD |= pMga->AtypeNoBLK[rop]; - WAITFIFO(6); - SET_BACKGROUND(bg); - } - - SET_FOREGROUND(fg); - SET_PLANEMASK(planemask); - OUTREG(MGAREG_DWGCTL, pMga->PatternRectCMD); - OUTREG(MGAREG_PAT0, patx); - OUTREG(MGAREG_PAT1, paty); + mgaSubsequentMono8x8PatternFillRect; + + regs[0] = MGAREG_PAT0; + regs[1] = patx; + regs[2] = MGAREG_PAT1; + regs[3] = paty; + + pMga->PatternRectCMD = common_setup_for_pattern_fill( pMga, fg, bg, rop, + planemask, regs, 2, + (MGADWG_TRAP + | MGADWG_ARZERO + | MGADWG_SGNZERO + | MGADWG_BMONOLEF) ); } - -static void -MGANAME(SubsequentMono8x8PatternFillRect)( - ScrnInfoPtr pScrn, - int patx, int paty, - int x, int y, int w, int h ) -{ +void mgaSubsequentMono8x8PatternFillRect( ScrnInfoPtr pScrn, + int patx, int paty, + int x, int y, int w, int h ) +{ MGAPtr pMga = MGAPTR(pScrn); WAITFIFO(3); @@ -1602,14 +1688,13 @@ MGANAME(SubsequentMono8x8PatternFillRect)( OUTREG(MGAREG_FXBNDRY, ((x + w) << 16) | (x & 0xffff)); OUTREG(MGAREG_YDSTLEN + MGAREG_EXEC, (y << 16) | h); pMga->AccelInfoRec->SubsequentMono8x8PatternFillRect = - MGANAME(SubsequentMono8x8PatternFillRect_Additional); + mgaSubsequentMono8x8PatternFillRect_Additional; } -static void -MGANAME(SubsequentMono8x8PatternFillRect_Additional)( - ScrnInfoPtr pScrn, - int patx, int paty, - int x, int y, int w, int h ) +static void mgaSubsequentMono8x8PatternFillRect_Additional( ScrnInfoPtr pScrn, + int patx, int paty, + int x, int y, + int w, int h ) { MGAPtr pMga = MGAPTR(pScrn); @@ -1619,14 +1704,12 @@ MGANAME(SubsequentMono8x8PatternFillRect_Additional)( } -static void -MGANAME(SubsequentMono8x8PatternFillTrap)( - ScrnInfoPtr pScrn, - int patx, int paty, - int y, int h, - int left, int dxL, int dyL, int eL, - int right, int dxR, int dyR, int eR -){ +void mgaSubsequentMono8x8PatternFillTrap( ScrnInfoPtr pScrn, + int patx, int paty, + int y, int h, + int left, int dxL, int dyL, int eL, + int right, int dxR, int dyR, int eR ) +{ MGAPtr pMga = MGAPTR(pScrn); int sdxl = (dxL < 0) ? (1<<1) : 0; @@ -1655,53 +1738,28 @@ MGANAME(SubsequentMono8x8PatternFillTrap)( \***********************/ -static void -MGANAME(SetupForScanlineCPUToScreenColorExpandFill)( - ScrnInfoPtr pScrn, - int fg, int bg, - int rop, - unsigned int planemask ) +void mgaSetupForScanlineCPUToScreenColorExpandFill( ScrnInfoPtr pScrn, + int fg, int bg, + int rop, + unsigned int planemask ) { MGAPtr pMga = MGAPTR(pScrn); - CARD32 mgaCMD = MGADWG_ILOAD | MGADWG_LINEAR | MGADWG_SGNZERO | - MGADWG_SHIFTZERO | MGADWG_BMONOLEF; - CHECK_DMA_QUIESCENT(pMga, pScrn); - if(bg == -1) { -#if PSZ == 24 - if(!RGBEQUAL(fg)) - mgaCMD |= MGADWG_TRANSC | pMga->AtypeNoBLK[rop]; - else -#endif - mgaCMD |= MGADWG_TRANSC | pMga->Atype[rop]; - - WAITFIFO(3); - } else { -#if PSZ == 24 - if((pMga->AccelFlags & BLK_OPAQUE_EXPANSION) && - RGBEQUAL(fg) && RGBEQUAL(bg)) -#else - if(pMga->AccelFlags & BLK_OPAQUE_EXPANSION) -#endif - mgaCMD |= pMga->Atype[rop]; - else - mgaCMD |= pMga->AtypeNoBLK[rop]; - WAITFIFO(4); - SET_BACKGROUND(bg); - } + CHECK_DMA_QUIESCENT(pMga, pScrn); - SET_FOREGROUND(fg); - SET_PLANEMASK(planemask); - OUTREG(MGAREG_DWGCTL, mgaCMD); + (void) common_setup_for_pattern_fill( pMga, fg, bg, rop, + planemask, NULL, 0, + MGADWG_ILOAD | MGADWG_LINEAR + | MGADWG_SGNZERO | MGADWG_SHIFTZERO + | MGADWG_BMONOLEF ); } -static void -MGANAME(SubsequentScanlineCPUToScreenColorExpandFill)( - ScrnInfoPtr pScrn, + +void mgaSubsequentScanlineCPUToScreenColorExpandFill( ScrnInfoPtr pScrn, int x, int y, int w, int h, - int skipleft -){ + int skipleft ) +{ MGAPtr pMga = MGAPTR(pScrn); pMga->AccelFlags |= CLIPPER_ON; @@ -1733,23 +1791,22 @@ MGANAME(SubsequentScanlineCPUToScreenColorExpandFill)( #endif { pMga->AccelInfoRec->SubsequentColorExpandScanline = - MGANAME(SubsequentColorExpandScanlineIndirect); + mgaSubsequentColorExpandScanlineIndirect; pMga->AccelInfoRec->ScanlineColorExpandBuffers = (unsigned char**)(&pMga->ScratchBuffer); } else { pMga->AccelInfoRec->SubsequentColorExpandScanline = - MGANAME(SubsequentColorExpandScanline); + mgaSubsequentColorExpandScanline; pMga->AccelInfoRec->ScanlineColorExpandBuffers = (unsigned char**)(&pMga->ColorExpandBase); WAITFIFO(pMga->expandDWORDs); } } -static void -MGANAME(SubsequentColorExpandScanlineIndirect)( - ScrnInfoPtr pScrn, - int bufno -){ + +void mgaSubsequentColorExpandScanlineIndirect( ScrnInfoPtr pScrn, + int bufno ) +{ MGAPtr pMga = MGAPTR(pScrn); int dwords = pMga->expandDWORDs; CARD32 *src = (CARD32*)(pMga->ScratchBuffer); @@ -1780,11 +1837,10 @@ MGANAME(SubsequentColorExpandScanlineIndirect)( } } -static void -MGANAME(SubsequentColorExpandScanline)( - ScrnInfoPtr pScrn, - int bufno -){ + +void mgaSubsequentColorExpandScanline( ScrnInfoPtr pScrn, + int bufno ) +{ MGAPtr pMga = MGAPTR(pScrn); if(--pMga->expandRows) { @@ -1810,35 +1866,49 @@ MGANAME(SubsequentColorExpandScanline)( \*******************/ -static void MGANAME(SetupForScanlineImageWrite)( - ScrnInfoPtr pScrn, - int rop, - unsigned int planemask, - int transparency_color, - int bpp, int depth -){ +void mgaSetupForScanlineImageWrite( ScrnInfoPtr pScrn, int rop, + unsigned int planemask, + int transparency_color, + int bpp, int depth ) +{ MGAPtr pMga = MGAPTR(pScrn); + unsigned int replicate_pm = 0; + + switch( pMga->CurrentLayout.bitsPerPixel ) { + case 8: + replicate_pm = REPLICATE_8( planemask ); + break; + case 16: + replicate_pm = REPLICATE_16( planemask ); + break; + case 24: + replicate_pm = REPLICATE_24( planemask ); + break; + case 32: + replicate_pm = REPLICATE_32( planemask ); + break; + } CHECK_DMA_QUIESCENT(pMga, pScrn); WAITFIFO(3); OUTREG(MGAREG_AR5, 0); - SET_PLANEMASK(planemask); + SET_PLANEMASK_REPLICATED( planemask, replicate_pm, + pMga->CurrentLayout.bitsPerPixel ); OUTREG(MGAREG_DWGCTL, MGADWG_ILOAD | MGADWG_BFCOL | MGADWG_SHIFTZERO | MGADWG_SGNZERO | pMga->AtypeNoBLK[rop]); } -static void MGANAME(SubsequentScanlineImageWriteRect)( - ScrnInfoPtr pScrn, - int x, int y, int w, int h, - int skipleft -){ +void mgaSubsequentScanlineImageWriteRect( ScrnInfoPtr pScrn, + int x, int y, int w, int h, + int skipleft ) +{ MGAPtr pMga = MGAPTR(pScrn); pMga->AccelFlags |= CLIPPER_ON; pMga->expandRows = h; - pMga->expandDWORDs = ((w * PSZ) + 31) >> 5; + pMga->expandDWORDs = ((w * pMga->CurrentLayout.bitsPerPixel) + 31) >> 5; WAITFIFO(5); OUTREG(MGAREG_CXBNDRY, 0xFFFF0000 | ((x + skipleft) & 0xFFFF)); @@ -1848,10 +1918,9 @@ static void MGANAME(SubsequentScanlineImageWriteRect)( OUTREG(MGAREG_YDSTLEN + MGAREG_EXEC, (y << 16) | h); } -static void MGANAME(SubsequentImageWriteScanline)( - ScrnInfoPtr pScrn, - int bufno -){ + +void mgaSubsequentImageWriteScanline( ScrnInfoPtr pScrn, int bufno ) +{ MGAPtr pMga = MGAPTR(pScrn); int dwords = pMga->expandDWORDs; CARD32 *src = (CARD32*)(pMga->ScratchBuffer); @@ -1871,25 +1940,31 @@ static void MGANAME(SubsequentImageWriteScanline)( } } + #if X_BYTE_ORDER == X_LITTLE_ENDIAN /***************************\ | Dashed Lines | \***************************/ - -void -MGANAME(SetupForDashedLine)( - ScrnInfoPtr pScrn, - int fg, int bg, int rop, - unsigned int planemask, - int length, - unsigned char *pattern -){ +void mgaSetupForDashedLine( ScrnInfoPtr pScrn, + int fg, int bg, int rop, + unsigned int planemask, int length, + unsigned char *pattern ) +{ MGAPtr pMga = MGAPTR(pScrn); CARD32 *DashPattern = (CARD32*)pattern; CARD32 NiceDashPattern = DashPattern[0]; int dwords = (length + 31) >> 5; + unsigned int replicate_fg = 0; + unsigned int replicate_bg = 0; + unsigned int replicate_pm = 0; + + + common_replicate_colors_and_mask( fg, bg, planemask, + pMga->CurrentLayout.bitsPerPixel, + & replicate_fg, & replicate_bg, + & replicate_pm ); CHECK_DMA_QUIESCENT(pMga, pScrn); @@ -1901,60 +1976,73 @@ MGANAME(SetupForDashedLine)( WAITFIFO(dwords + 2); } else { WAITFIFO(dwords + 3); - SET_BACKGROUND(bg); + SET_BACKGROUND_REPLICATED( bg, replicate_bg ); } - SET_PLANEMASK(planemask); - SET_FOREGROUND(fg); - /* We see if we can draw horizontal lines as 8x8 pattern fills. - This is worthwhile since the pattern fills can use block mode - and the default X pattern is 8 pixels long. The forward pattern - is the top scanline, the backwards pattern is the next one. */ + SET_PLANEMASK_REPLICATED( planemask, replicate_pm, + pMga->CurrentLayout.bitsPerPixel ); + SET_FOREGROUND_REPLICATED( fg, replicate_fg ); + + + /* We see if we can draw horizontal lines as 8x8 pattern fills. This is + * worthwhile since the pattern fills can use block mode and the default X + * pattern is 8 pixels long. The forward pattern is the top scanline, the + * backwards pattern is the next one. + */ switch(length) { - case 2: NiceDashPattern |= NiceDashPattern << 2; - case 4: NiceDashPattern |= NiceDashPattern << 4; - case 8: NiceDashPattern |= byte_reversed[NiceDashPattern] << 16; - NiceDashPattern |= NiceDashPattern << 8; - pMga->NiceDashCMD = MGADWG_TRAP | MGADWG_ARZERO | - MGADWG_SGNZERO | MGADWG_BMONOLEF; - pMga->AccelFlags |= NICE_DASH_PATTERN; - if(bg == -1) { -#if PSZ == 24 - if(!RGBEQUAL(fg)) - pMga->NiceDashCMD |= MGADWG_TRANSC | pMga->AtypeNoBLK[rop]; - else -#endif - pMga->NiceDashCMD |= MGADWG_TRANSC | pMga->Atype[rop]; - } else { -#if PSZ == 24 - if((pMga->AccelFlags & BLK_OPAQUE_EXPANSION) && - RGBEQUAL(fg) && RGBEQUAL(bg)) -#else - if(pMga->AccelFlags & BLK_OPAQUE_EXPANSION) -#endif - pMga->NiceDashCMD |= pMga->Atype[rop]; - else - pMga->NiceDashCMD |= pMga->AtypeNoBLK[rop]; - } - OUTREG(MGAREG_SRC0, NiceDashPattern); - break; - default: pMga->AccelFlags &= ~NICE_DASH_PATTERN; - switch (dwords) { - case 4: OUTREG(MGAREG_SRC3, DashPattern[3]); - case 3: OUTREG(MGAREG_SRC2, DashPattern[2]); - case 2: OUTREG(MGAREG_SRC1, DashPattern[1]); - default: OUTREG(MGAREG_SRC0, DashPattern[0]); - } + case 2: NiceDashPattern |= NiceDashPattern << 2; + case 4: NiceDashPattern |= NiceDashPattern << 4; + case 8: { + NiceDashPattern |= byte_reversed[NiceDashPattern] << 16; + NiceDashPattern |= NiceDashPattern << 8; + pMga->NiceDashCMD = MGADWG_TRAP | MGADWG_ARZERO | + MGADWG_SGNZERO | MGADWG_BMONOLEF; + pMga->AccelFlags |= NICE_DASH_PATTERN; + + if( bg == -1 ) { + if ( (pMga->CurrentLayout.bitsPerPixel == 24) && !RGBEQUAL(fg) ) { + pMga->NiceDashCMD |= MGADWG_TRANSC | pMga->AtypeNoBLK[rop]; + } + else { + pMga->NiceDashCMD |= MGADWG_TRANSC | pMga->Atype[rop]; + } + } + else { + /* (Packed) 24-bit is a funky mode. We only use the Atype table + * in 24-bit if the components of the foreground color and the + * components of the background color are the same (e.g., fg = + * 0xf8f8f8 and bg = 0x131313). + */ + + if( ((pMga->AccelFlags & BLK_OPAQUE_EXPANSION) != 0) + && ((pMga->CurrentLayout.bitsPerPixel != 24) + || (RGBEQUAL(fg) && RGBEQUAL(bg))) ) { + pMga->NiceDashCMD |= pMga->Atype[rop]; + } + else { + pMga->NiceDashCMD |= pMga->AtypeNoBLK[rop]; + } + } + OUTREG(MGAREG_SRC0, NiceDashPattern); + break; + } + default: { + pMga->AccelFlags &= ~NICE_DASH_PATTERN; + switch (dwords) { + case 4: OUTREG(MGAREG_SRC3, DashPattern[3]); + case 3: OUTREG(MGAREG_SRC2, DashPattern[2]); + case 2: OUTREG(MGAREG_SRC1, DashPattern[1]); + default: OUTREG(MGAREG_SRC0, DashPattern[0]); + } + } } } -void -MGANAME(SubsequentDashedTwoPointLine)( - ScrnInfoPtr pScrn, - int x1, int y1, int x2, int y2, - int flags, int phase -){ +void mgaSubsequentDashedTwoPointLine( ScrnInfoPtr pScrn, + int x1, int y1, int x2, int y2, + int flags, int phase ) +{ MGAPtr pMga = MGAPTR(pScrn); WAITFIFO(4); @@ -1981,49 +2069,39 @@ MGANAME(SubsequentDashedTwoPointLine)( OUTREG(MGAREG_XYEND + MGAREG_EXEC, (y2 << 16) | (x2 & 0xFFFF)); } } - #endif /* X_BYTE_ORDER == X_LITTLE_ENDIAN */ -#if PSZ != 24 /******************************************\ | Planar Screen to Screen Color Expansion | \******************************************/ -static void -MGANAME(SetupForPlanarScreenToScreenColorExpandFill)( - ScrnInfoPtr pScrn, - int fg, int bg, - int rop, - unsigned int planemask -){ +void mgaSetupForPlanarScreenToScreenColorExpandFill( ScrnInfoPtr pScrn, + int fg, int bg, + int rop, + unsigned int planemask ) +{ MGAPtr pMga = MGAPTR(pScrn); CARD32 mgaCMD = pMga->AtypeNoBLK[rop] | MGADWG_BITBLT | MGADWG_SGNZERO | MGADWG_BPLAN; + CARD32 regs[2]; - CHECK_DMA_QUIESCENT(pMga, pScrn); - if(bg == -1) { - mgaCMD |= MGADWG_TRANSC; - WAITFIFO(4); - } else { - WAITFIFO(5); - SET_BACKGROUND(bg); - } + regs[0] = MGAREG_AR5; + regs[1] = pScrn->displayWidth; + + CHECK_DMA_QUIESCENT(pMga, pScrn); - SET_FOREGROUND(fg); - SET_PLANEMASK(planemask); - OUTREG(MGAREG_AR5, pScrn->displayWidth); - OUTREG(MGAREG_DWGCTL, mgaCMD); + (void) common_setup_for_pattern_fill( pMga, fg, bg, 0, planemask, regs, 1, + mgaCMD ); } -static void -MGANAME(SubsequentPlanarScreenToScreenColorExpandFill)( - ScrnInfoPtr pScrn, - int x, int y, int w, int h, - int srcx, int srcy, - int skipleft -){ + +void mgaSubsequentPlanarScreenToScreenColorExpandFill( ScrnInfoPtr pScrn, + int x, int y, int w, int h, + int srcx, int srcy, + int skipleft ) +{ MGAPtr pMga = MGAPTR(pScrn); int start, end; @@ -2038,69 +2116,45 @@ MGANAME(SubsequentPlanarScreenToScreenColorExpandFill)( OUTREG(MGAREG_YDSTLEN + MGAREG_EXEC, (y << 16) | h); } -#endif /***********************************\ | Screen to Screen Color Expansion | \***********************************/ -static void -MGANAME(SetupForScreenToScreenColorExpandFill)( - ScrnInfoPtr pScrn, - int fg, int bg, - int rop, - unsigned int planemask -){ +void mgaSetupForScreenToScreenColorExpandFill( ScrnInfoPtr pScrn, + int fg, int bg, + int rop, + unsigned int planemask ) +{ MGAPtr pMga = MGAPTR(pScrn); - CARD32 mgaCMD = MGADWG_BITBLT | MGADWG_SGNZERO | MGADWG_SHIFTZERO; + CARD32 regs[2]; + + regs[0] = MGAREG_AR5; + regs[1] = pScrn->displayWidth * pMga->CurrentLayout.bitsPerPixel; CHECK_DMA_QUIESCENT(pMga, pScrn); - if(bg == -1) { -#if PSZ == 24 - if(!RGBEQUAL(fg)) - mgaCMD |= MGADWG_TRANSC | pMga->AtypeNoBLK[rop]; - else -#endif - mgaCMD |= MGADWG_TRANSC | pMga->Atype[rop]; - - WAITFIFO(4); - } else { -#if PSZ == 24 - if((pMga->AccelFlags & BLK_OPAQUE_EXPANSION) && - RGBEQUAL(fg) && RGBEQUAL(bg)) -#else - if((pMga->AccelFlags & BLK_OPAQUE_EXPANSION)) -#endif - mgaCMD |= pMga->Atype[rop]; - else - mgaCMD |= pMga->AtypeNoBLK[rop]; - WAITFIFO(5); - SET_BACKGROUND(bg); - } - - SET_FOREGROUND(fg); - SET_PLANEMASK(planemask); - OUTREG(MGAREG_AR5, pScrn->displayWidth * PSZ); - OUTREG(MGAREG_DWGCTL, mgaCMD); - + (void) common_setup_for_pattern_fill( pMga, fg, bg, rop, planemask, + regs, 1, + MGADWG_BITBLT | MGADWG_SGNZERO + | MGADWG_SHIFTZERO ); } -static void -MGANAME(SubsequentScreenToScreenColorExpandFill)( - ScrnInfoPtr pScrn, - int x, int y, int w, int h, - int srcx, int srcy, - int skipleft -){ + +void mgaSubsequentScreenToScreenColorExpandFill( ScrnInfoPtr pScrn, + int x, int y, int w, int h, + int srcx, int srcy, + int skipleft ) +{ MGAPtr pMga = MGAPTR(pScrn); - int pitch = pScrn->displayWidth * PSZ; + const unsigned int display_bit_width = + (pMga->CurrentLayout.displayWidth * pMga->CurrentLayout.bitsPerPixel); int start, end, next, num; Bool resetDstOrg = FALSE; if (pMga->AccelFlags & LARGE_ADDRESSES) { - int DstOrg = ((y & ~1023) * pScrn->displayWidth * PSZ) >> 9; - int SrcOrg = ((srcy & ~1023) * pScrn->displayWidth * PSZ) >> 9; + const int DstOrg = ((y & ~1023) * display_bit_width) >> 9; + const int SrcOrg = ((srcy & ~1023) * display_bit_width) >> 9; y &= 1023; srcy &= 1023; @@ -2117,8 +2171,9 @@ MGANAME(SubsequentScreenToScreenColorExpandFill)( } w--; - start = (XYADDRESS(srcx, srcy) * PSZ) + skipleft; - end = start + w + (pitch * (h - 1)); + start = (XYADDRESS(srcx, srcy) * pMga->CurrentLayout.bitsPerPixel) + + skipleft; + end = start + w + (display_bit_width * (h - 1)); /* src cannot split a 2 Meg boundary from SrcOrg */ if(!((start ^ end) & 0xff000000)) { @@ -2143,10 +2198,10 @@ MGANAME(SubsequentScreenToScreenColorExpandFill)( OUTREG(MGAREG_AR0, start + w ); OUTREG(MGAREG_FXBNDRY + MGAREG_EXEC, ((x + w) << 16) | ((x + num + 1) & 0xffff)); - start += pitch; + start += display_bit_width; h--; y++; } else { - num = ((next - start - w)/pitch) + 1; + num = ((next - start - w)/display_bit_width) + 1; if(num > h) num = h; WAITFIFO(4); @@ -2155,7 +2210,7 @@ MGANAME(SubsequentScreenToScreenColorExpandFill)( OUTREG(MGAREG_FXBNDRY, ((x + w) << 16) | (x & 0xffff)); OUTREG(MGAREG_YDSTLEN + MGAREG_EXEC, (y << 16) | num); - start += num * pitch; + start += num * display_bit_width; h -= num; y += num; } } @@ -2168,9 +2223,6 @@ MGANAME(SubsequentScreenToScreenColorExpandFill)( } - -#if PSZ == 8 - void MGAFillSolidRectsDMA( ScrnInfoPtr pScrn, @@ -2528,11 +2580,10 @@ MGAFillCacheBltRects( SET_SYNC_FLAG(infoRec); } -#endif -#ifdef XF86DRI +#if defined(XF86DRI) void -MGANAME(DRIInitBuffers)(WindowPtr pWin, RegionPtr prgn, CARD32 index) +mgaDRIInitBuffers(WindowPtr pWin, RegionPtr prgn, CARD32 index) { ScreenPtr pScreen = pWin->drawable.pScreen; ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; @@ -2542,14 +2593,14 @@ MGANAME(DRIInitBuffers)(WindowPtr pWin, RegionPtr prgn, CARD32 index) CHECK_DMA_QUIESCENT(MGAPTR(pScrn), pScrn); - MGANAME(SetupForSolidFill)(pScrn, 0, GXcopy, -1); + mgaSetupForSolidFill(pScrn, 0, GXcopy, -1); while (nbox--) { MGASelectBuffer(pScrn, MGA_BACK); - MGANAME(SubsequentSolidFillRect)(pScrn, pbox->x1, pbox->y1, - pbox->x2-pbox->x1, pbox->y2-pbox->y1); + mgaSubsequentSolidFillRect(pScrn, pbox->x1, pbox->y1, + pbox->x2-pbox->x1, pbox->y2-pbox->y1); MGASelectBuffer(pScrn, MGA_DEPTH); - MGANAME(SubsequentSolidFillRect)(pScrn, pbox->x1, pbox->y1, - pbox->x2-pbox->x1, pbox->y2-pbox->y1); + mgaSubsequentSolidFillRect(pScrn, pbox->x1, pbox->y1, + pbox->x2-pbox->x1, pbox->y2-pbox->y1); pbox++; } MGASelectBuffer(pScrn, MGA_FRONT); @@ -2565,8 +2616,8 @@ MGANAME(DRIInitBuffers)(WindowPtr pWin, RegionPtr prgn, CARD32 index) */ void -MGANAME(DRIMoveBuffers)(WindowPtr pParent, DDXPointRec ptOldOrg, - RegionPtr prgnSrc, CARD32 index) +mgaDRIMoveBuffers(WindowPtr pParent, DDXPointRec ptOldOrg, + RegionPtr prgnSrc, CARD32 index) { ScreenPtr pScreen = pParent->drawable.pScreen; ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; @@ -2668,9 +2719,8 @@ MGANAME(DRIMoveBuffers)(WindowPtr pParent, DDXPointRec ptOldOrg, xdir = 1; } - MGANAME(SetupForScreenToScreenCopy)(pScrn, xdir, ydir, GXcopy, -1, -1); - for ( ; nbox-- ; pbox++) - { + mgaSetupForScreenToScreenCopy(pScrn, xdir, ydir, GXcopy, -1, -1); + for ( ; nbox-- ; pbox++) { int x1 = pbox->x1; int y1 = pbox->y1; int destx = x1 + dx; @@ -2686,12 +2736,10 @@ MGANAME(DRIMoveBuffers)(WindowPtr pParent, DDXPointRec ptOldOrg, if ( h <= 0 ) continue; MGASelectBuffer(pScrn, MGA_BACK); - MGANAME(SubsequentScreenToScreenCopy)(pScrn, x1, y1, - destx,desty, w, h); + mgaSubsequentScreenToScreenCopy(pScrn, x1, y1, destx, desty, w, h); MGASelectBuffer(pScrn, MGA_DEPTH); - MGANAME(SubsequentScreenToScreenCopy)(pScrn, x1,y1, - destx,desty, w, h); - } + mgaSubsequentScreenToScreenCopy(pScrn, x1, y1, destx, desty, w, h); + } MGASelectBuffer(pScrn, MGA_FRONT); if (pboxNew2) { diff --git a/src/mga_video.c b/src/mga_video.c index bba12a7..3617ef8 100644 --- a/src/mga_video.c +++ b/src/mga_video.c @@ -650,6 +650,14 @@ MGADisplayVideoOverlay( } + +/** + * \todo + * Starting with at least the G200, the chip can handle non-mipmapped + * non-power-of-two textures. However, the code in this routine forces the + * texture dimensions to be powers of two. That should simplify the code and + * may improve performance slightly. + */ static void MGADisplayVideoTexture( ScrnInfoPtr pScrn, @@ -694,9 +702,8 @@ MGADisplayVideoTexture( CHECK_DMA_QUIESCENT(pMga, pScrn); if(pMga->Overlay8Plus24) { - i = 0x00ffffff; WAITFIFO(1); - SET_PLANEMASK(i); + SET_PLANEMASK_REPLICATED( 0x00ffffff, 0xffffffff, 32 ); } WAITFIFO(15); |