319 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			319 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			C
		
	
	
	
| #ifdef HAVE_CONFIG_H
 | |
| #include <kdrive-config.h>
 | |
| #endif
 | |
| #include "kdrive.h"
 | |
| #include "kaa.h"
 | |
| 
 | |
| #include "pm2.h"
 | |
| 
 | |
| static PM2CardInfo	*card;
 | |
| static VOL8	*mmio;
 | |
| 
 | |
| static void Permedia2LoadCoord(int x, int y, int w, int h);
 | |
| 
 | |
| static void
 | |
| pmWaitMarker (ScreenPtr pScreen, int marker)
 | |
| {
 | |
|     CHECKCLIPPING;
 | |
| 
 | |
|     while (GLINT_READ_REG(DMACount) != 0);
 | |
|     GLINT_WAIT(2);
 | |
|     GLINT_WRITE_REG(0x400, FilterMode);
 | |
|     GLINT_WRITE_REG(0, GlintSync);
 | |
|     do {
 | |
|    	while(GLINT_READ_REG(OutFIFOWords) == 0);
 | |
|     } while (GLINT_READ_REG(OutputFIFO) != Sync_tag);
 | |
| }
 | |
| 
 | |
| static Bool
 | |
| pmPrepareSolid (PixmapPtr   	pPixmap,
 | |
| 		int		rop,
 | |
| 		Pixel		planemask,
 | |
| 		Pixel		color)
 | |
| {
 | |
|     ScreenPtr pScreen = pPixmap->drawable.pScreen;
 | |
|     KdScreenPriv(pScreen);
 | |
|     pmCardInfo(pScreenPriv);
 | |
| 
 | |
|     card = pm2c;
 | |
|     mmio = pm2c->reg_base;
 | |
| 
 | |
|     if (~planemask & FbFullMask(pPixmap->drawable.depth))
 | |
| 	return FALSE;
 | |
| 
 | |
|     REPLICATE(color);
 | |
| 
 | |
|     GLINT_WAIT(6);
 | |
|     DO_PLANEMASK(planemask);
 | |
|     if (rop == GXcopy) {
 | |
| 	GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode);
 | |
| 	GLINT_WRITE_REG(card->pprod, FBReadMode);
 | |
| 	GLINT_WRITE_REG(color, FBBlockColor);
 | |
|     } else {
 | |
| 	GLINT_WRITE_REG(UNIT_ENABLE, ColorDDAMode);
 | |
|       	GLINT_WRITE_REG(color, ConstantColor);
 | |
| 	/* We can use Packed mode for filling solid non-GXcopy rasters */
 | |
| 	GLINT_WRITE_REG(card->pprod|FBRM_DstEnable|FBRM_Packed, FBReadMode);
 | |
|     }
 | |
|     LOADROP(rop);
 | |
| 
 | |
|     return TRUE;
 | |
| }
 | |
| 
 | |
| static void
 | |
| pmSolid (int x1, int y1, int x2, int y2)
 | |
| {
 | |
|     int speed = 0;
 | |
| 
 | |
|     if (card->ROP == GXcopy) {
 | |
| 	GLINT_WAIT(3);
 | |
|         Permedia2LoadCoord(x1, y1, x2-x1, y2-y1);
 | |
|   	speed = FastFillEnable;
 | |
|     } else {
 | |
| 	GLINT_WAIT(4);
 | |
|         Permedia2LoadCoord(x1>>card->BppShift, y1, 
 | |
| 			    ((x2-x1)+7)>>card->BppShift, y2-y1);
 | |
|   	GLINT_WRITE_REG(x1<<16|(x1+(x2-x1)), PackedDataLimits);
 | |
|   	speed = 0;
 | |
|     }
 | |
|     GLINT_WRITE_REG(PrimitiveRectangle | XPositive | YPositive | speed, Render);
 | |
| }
 | |
| 
 | |
| static void
 | |
| pmDoneSolid (void)
 | |
| {
 | |
| }
 | |
| 
 | |
| static Bool
 | |
| pmPrepareCopy (PixmapPtr	pSrcPixmap,
 | |
| 	       PixmapPtr	pDstPixmap,
 | |
| 	       int		dx,
 | |
| 	       int		dy,
 | |
| 	       int		rop,
 | |
| 	       Pixel		planemask)
 | |
| {
 | |
|     ScreenPtr pScreen = pDstPixmap->drawable.pScreen;
 | |
|     KdScreenPriv(pScreen);
 | |
|     pmCardInfo(pScreenPriv);
 | |
| 
 | |
|     card = pm2c;
 | |
|     mmio = pm2c->reg_base;
 | |
| 
 | |
|     if (~planemask & FbFullMask(pDstPixmap->drawable.depth))
 | |
| 	return FALSE;
 | |
| 
 | |
|     card->BltScanDirection = ((dx >= 0 ? XPositive : 0) | (dy >= 0 ? YPositive : 0));
 | |
| 
 | |
|     GLINT_WAIT(4);
 | |
|     DO_PLANEMASK(planemask);
 | |
| 
 | |
|     GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode);
 | |
|     if ((rop == GXset) || (rop == GXclear)) {
 | |
| 	card->FrameBufferReadMode = card->pprod;
 | |
|     } else
 | |
|     if ((rop == GXcopy) || (rop == GXcopyInverted)) {
 | |
| 	card->FrameBufferReadMode = card->pprod |FBRM_SrcEnable;
 | |
|     } else {
 | |
| 	card->FrameBufferReadMode = card->pprod | FBRM_SrcEnable |
 | |
| 							FBRM_DstEnable;
 | |
|     }
 | |
|     LOADROP(rop);
 | |
| 
 | |
|     return TRUE;
 | |
| }
 | |
| 
 | |
| 
 | |
| static void
 | |
| pmCopy (int x1,
 | |
|         int y1,
 | |
|         int x2,
 | |
|         int y2,
 | |
|         int w,
 | |
|         int h)
 | |
| {
 | |
|     char align;
 | |
| 
 | |
|     /* We can only use GXcopy for Packed modes */
 | |
|     if (card->ROP != GXcopy) {
 | |
| 	GLINT_WAIT(5);
 | |
| 	GLINT_WRITE_REG(card->FrameBufferReadMode, FBReadMode);
 | |
|         Permedia2LoadCoord(x2, y2, w, h);
 | |
|         GLINT_WRITE_REG(((y1-y2)&0x0FFF)<<16 | ((x1-x2)&0x0FFF), FBSourceDelta);
 | |
|     } else {
 | |
|   	align = (x2 & card->bppalign) - (x1 & card->bppalign);
 | |
| 	GLINT_WAIT(6);
 | |
| 	GLINT_WRITE_REG(card->FrameBufferReadMode|FBRM_Packed, FBReadMode);
 | |
|         Permedia2LoadCoord(x2>>card->BppShift, y2, 
 | |
| 				(w+7)>>card->BppShift, h);
 | |
|   	GLINT_WRITE_REG(align<<29|x2<<16|(x2+w), PackedDataLimits);
 | |
|         GLINT_WRITE_REG(((y1-y2)&0x0FFF)<<16 | (((x1 & ~card->bppalign)-(x2 & ~card->bppalign))&0x0FFF), FBSourceDelta);
 | |
|     }
 | |
| 
 | |
|     GLINT_WRITE_REG(PrimitiveRectangle | card->BltScanDirection, Render);
 | |
| }
 | |
| 
 | |
| 
 | |
| static void
 | |
| pmDoneCopy (void)
 | |
| {
 | |
| }
 | |
| 
 | |
| static void
 | |
| Permedia2LoadCoord(int x, int y,
 | |
| 		   int w, int h)
 | |
| {
 | |
|     if ((h != card->h) || (w != card->w)) {
 | |
| 	card->w = w;
 | |
| 	card->h = h;
 | |
| 	GLINT_WRITE_REG(((h&0x0FFF)<<16)|(w&0x0FFF), RectangleSize);
 | |
|     }
 | |
|     if ((y != card->y) || (x != card->x)) {
 | |
| 	card->x = x;
 | |
| 	card->y = y;
 | |
| 	GLINT_WRITE_REG(((y&0x0FFF)<<16)|(x&0x0FFF), RectangleOrigin);
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| Bool
 | |
| pmDrawInit (ScreenPtr pScreen)
 | |
| {
 | |
|     KdScreenPriv(pScreen);
 | |
|     pmCardInfo(pScreenPriv);
 | |
|     pmScreenInfo(pScreenPriv);
 | |
|     Bool    ret = TRUE;
 | |
| 
 | |
|     card = pm2c;
 | |
|     mmio = pm2c->reg_base;
 | |
| 
 | |
|     memset(&pm2s->kaa, 0, sizeof(KaaScreenInfoRec));
 | |
|     pm2s->kaa.waitMarker	= pmWaitMarker;
 | |
|     pm2s->kaa.PrepareSolid	= pmPrepareSolid;
 | |
|     pm2s->kaa.Solid		= pmSolid;
 | |
|     pm2s->kaa.DoneSolid		= pmDoneSolid;
 | |
|     pm2s->kaa.PrepareCopy	= pmPrepareCopy;
 | |
|     pm2s->kaa.Copy		= pmCopy;
 | |
|     pm2s->kaa.DoneCopy		= pmDoneCopy;
 | |
| 
 | |
|     if (ret && !kaaDrawInit (pScreen, &pm2s->kaa))
 | |
|     {
 | |
| 	ErrorF ("kaaDrawInit failed\n");
 | |
| 	ret = FALSE;
 | |
|     }
 | |
| 
 | |
|     return ret;
 | |
| }
 | |
| 
 | |
| 
 | |
| void
 | |
| pmDrawEnable (ScreenPtr pScreen)
 | |
| {
 | |
|     KdScreenPriv(pScreen);
 | |
|     pmCardInfo(pScreenPriv);
 | |
| 
 | |
|     card = pm2c;
 | |
|     mmio = pm2c->reg_base;
 | |
| 
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	ScissorMode);
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_ENABLE,	FBWriteMode);
 | |
|     GLINT_SLOW_WRITE_REG(0, 		dXSub);
 | |
|     GLINT_SLOW_WRITE_REG(GWIN_DisableLBUpdate,   GLINTWindow);
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	DitherMode);
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	AlphaBlendMode);
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	ColorDDAMode);
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	TextureColorMode);
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	TextureAddressMode);
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	PMTextureReadMode);
 | |
|     GLINT_SLOW_WRITE_REG(card->pprod,	LBReadMode);
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	AlphaBlendMode);
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	TexelLUTMode);
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	YUVMode);
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	DepthMode);
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	RouterMode);
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	FogMode);
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	AntialiasMode);
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	AlphaTestMode);
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	StencilMode);
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	AreaStippleMode);
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	LogicalOpMode);
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	DepthMode);
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	StatisticMode);
 | |
|     GLINT_SLOW_WRITE_REG(0x400,		FilterMode);
 | |
|     GLINT_SLOW_WRITE_REG(0xffffffff,	FBHardwareWriteMask);
 | |
|     GLINT_SLOW_WRITE_REG(0xffffffff,	FBSoftwareWriteMask);
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	RasterizerMode);
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	GLINTDepth);
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	FBSourceOffset);
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	FBPixelOffset);
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	LBSourceOffset);
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	WindowOrigin);
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	FBWindowBase);
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	FBSourceBase);
 | |
|     GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	LBWindowBase);
 | |
| 
 | |
| #if X_BYTE_ORDER == X_BIG_ENDIAN
 | |
|     card->RasterizerSwap = 1;
 | |
| #else
 | |
|     card->RasterizerSwap = 0;
 | |
| #endif
 | |
| 
 | |
|     switch (pScreenPriv->screen->fb[0].bitsPerPixel) {
 | |
| 	case 8:
 | |
| 	    card->PixelWidth = 0x0; /* 8 Bits */
 | |
| 	    card->TexMapFormat = card->pprod;
 | |
| #if X_BYTE_ORDER == X_BIG_ENDIAN
 | |
| 	    card->RasterizerSwap |= 3<<15;	/* Swap host data */
 | |
| #endif
 | |
| 	    break;
 | |
| 	case 16:
 | |
| 	    card->PixelWidth = 0x1; /* 16 Bits */
 | |
| 	    card->TexMapFormat = card->pprod | 1<<19;
 | |
| #if X_BYTE_ORDER == X_BIG_ENDIAN
 | |
| 	    card->RasterizerSwap |= 2<<15;	/* Swap host data */
 | |
| #endif
 | |
| 	    break;
 | |
| 	case 24:
 | |
|  	    card->PixelWidth = 0x4; /* 24 Bits */
 | |
| 	    card->TexMapFormat = card->pprod | 2<<19;
 | |
| 	    break;
 | |
| 	case 32:
 | |
| 	    card->PixelWidth = 0x2; /* 32 Bits */
 | |
| 	    card->TexMapFormat = card->pprod | 2<<19;
 | |
|   	    break;
 | |
|     }
 | |
|     card->ClippingOn = FALSE;
 | |
|     card->startxdom = 0;
 | |
|     card->startxsub = 0;
 | |
|     card->starty = 0;
 | |
|     card->count = 0;
 | |
|     card->dy = 1<<16;
 | |
|     card->dxdom = 0;
 | |
|     card->x = 0;
 | |
|     card->y = 0;
 | |
|     card->h = 0;
 | |
|     card->w = 0;
 | |
|     card->ROP = 0xFF;
 | |
|     GLINT_SLOW_WRITE_REG(card->PixelWidth, FBReadPixel);
 | |
|     GLINT_SLOW_WRITE_REG(card->TexMapFormat, PMTextureMapFormat);
 | |
|     GLINT_SLOW_WRITE_REG(0, RectangleSize);
 | |
|     GLINT_SLOW_WRITE_REG(0, RectangleOrigin);
 | |
|     GLINT_SLOW_WRITE_REG(0, dXDom);
 | |
|     GLINT_SLOW_WRITE_REG(1<<16, dY);
 | |
|     GLINT_SLOW_WRITE_REG(0, StartXDom);
 | |
|     GLINT_SLOW_WRITE_REG(0, StartXSub);
 | |
|     GLINT_SLOW_WRITE_REG(0, StartY);
 | |
|     GLINT_SLOW_WRITE_REG(0, GLINTCount);
 | |
| 
 | |
|     kaaMarkSync (pScreen);
 | |
| }
 | |
| 
 | |
| void
 | |
| pmDrawDisable (ScreenPtr pScreen)
 | |
| {
 | |
| }
 | |
| 
 | |
| void
 | |
| pmDrawFini (ScreenPtr pScreen)
 | |
| {
 | |
| }
 |