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)
 | 
						|
{
 | 
						|
}
 |