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