495 lines
12 KiB
C
495 lines
12 KiB
C
/*
|
|
* Id: tridentdraw.c,v 1.1 1999/11/02 03:54:47 keithp Exp $
|
|
*
|
|
* Copyright © 1999 Keith Packard
|
|
*
|
|
* Permission to use, copy, modify, distribute, and sell this software and its
|
|
* documentation for any purpose is hereby granted without fee, provided that
|
|
* the above copyright notice appear in all copies and that both that
|
|
* copyright notice and this permission notice appear in supporting
|
|
* documentation, and that the name of Keith Packard not be used in
|
|
* advertising or publicity pertaining to distribution of the software without
|
|
* specific, written prior permission. Keith Packard makes no
|
|
* representations about the suitability of this software for any purpose. It
|
|
* is provided "as is" without express or implied warranty.
|
|
*
|
|
* KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
|
* EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
|
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
|
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
|
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
* PERFORMANCE OF THIS SOFTWARE.
|
|
*/
|
|
/* $RCSId: xc/programs/Xserver/hw/kdrive/trident/tridentdraw.c,v 1.10 2001/06/03 18:48:19 keithp Exp $ */
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include <kdrive-config.h>
|
|
#endif
|
|
#include "chips.h"
|
|
|
|
#include <X11/Xmd.h>
|
|
#include "gcstruct.h"
|
|
#include "scrnintstr.h"
|
|
#include "pixmapstr.h"
|
|
#include "regionstr.h"
|
|
#include "mistruct.h"
|
|
#include "dixfontstr.h"
|
|
#include "fb.h"
|
|
#include "migc.h"
|
|
#include "miline.h"
|
|
#include "kaa.h"
|
|
|
|
CARD8 chipsBltRop[16] = {
|
|
/* GXclear */ 0x00, /* 0 */
|
|
/* GXand */ 0x88, /* src AND dst */
|
|
/* GXandReverse */ 0x44, /* src AND NOT dst */
|
|
/* GXcopy */ 0xcc, /* src */
|
|
/* GXandInverted*/ 0x22, /* NOT src AND dst */
|
|
/* GXnoop */ 0xaa, /* dst */
|
|
/* GXxor */ 0x66, /* src XOR dst */
|
|
/* GXor */ 0xee, /* src OR dst */
|
|
/* GXnor */ 0x11, /* NOT src AND NOT dst */
|
|
/* GXequiv */ 0x99, /* NOT src XOR dst */
|
|
/* GXinvert */ 0x55, /* NOT dst */
|
|
/* GXorReverse */ 0xdd, /* src OR NOT dst */
|
|
/* GXcopyInverted*/ 0x33, /* NOT src */
|
|
/* GXorInverted */ 0xbb, /* NOT src OR dst */
|
|
/* GXnand */ 0x77, /* NOT src OR NOT dst */
|
|
/* GXset */ 0xff, /* 1 */
|
|
};
|
|
|
|
CARD8 chipsSolidRop[16] = {
|
|
/* GXclear */ 0x00, /* 0 */
|
|
/* GXand */ 0xa0, /* src AND dst */
|
|
/* GXandReverse */ 0x50, /* src AND NOT dst */
|
|
/* GXcopy */ 0xf0, /* src */
|
|
/* GXandInverted*/ 0x0a, /* NOT src AND dst */
|
|
/* GXnoop */ 0xaa, /* dst */
|
|
/* GXxor */ 0x5a, /* src XOR dst */
|
|
/* GXor */ 0xfa, /* src OR dst */
|
|
/* GXnor */ 0x05, /* NOT src AND NOT dst */
|
|
/* GXequiv */ 0xa5, /* NOT src XOR dst */
|
|
/* GXinvert */ 0x55, /* NOT dst */
|
|
/* GXorReverse */ 0xf5, /* src OR NOT dst */
|
|
/* GXcopyInverted*/ 0x0f, /* NOT src */
|
|
/* GXorInverted */ 0xaf, /* NOT src OR dst */
|
|
/* GXnand */ 0x5f, /* NOT src OR NOT dst */
|
|
/* GXset */ 0xff, /* 1 */
|
|
};
|
|
|
|
/* Definitions for the Chips and Technology BitBLT engine communication. */
|
|
/* These are done using Memory Mapped IO, of the registers */
|
|
/* BitBLT modes for register 93D0. */
|
|
|
|
#ifdef HIQV
|
|
#define ctPATCOPY 0xF0
|
|
#define ctLEFT2RIGHT 0x000
|
|
#define ctRIGHT2LEFT 0x100
|
|
#define ctTOP2BOTTOM 0x000
|
|
#define ctBOTTOM2TOP 0x200
|
|
#define ctSRCSYSTEM 0x400
|
|
#define ctDSTSYSTEM 0x800
|
|
#define ctSRCMONO 0x1000
|
|
#define ctBGTRANSPARENT 0x22000
|
|
#define ctCOLORTRANSENABLE 0x4000
|
|
#define ctCOLORTRANSDISABLE 0x0
|
|
#define ctCOLORTRANSDST 0x8000
|
|
#define ctCOLORTRANSROP 0x0
|
|
#define ctCOLORTRANSEQUAL 0x10000L
|
|
#define ctCOLORTRANSNEQUAL 0x0
|
|
#define ctPATMONO 0x40000L
|
|
#define ctPATSOLID 0x80000L
|
|
#define ctPATSTART0 0x000000L
|
|
#define ctPATSTART1 0x100000L
|
|
#define ctPATSTART2 0x200000L
|
|
#define ctPATSTART3 0x300000L
|
|
#define ctPATSTART4 0x400000L
|
|
#define ctPATSTART5 0x500000L
|
|
#define ctPATSTART6 0x600000L
|
|
#define ctPATSTART7 0x700000L
|
|
#define ctSRCFG 0x000000L /* Where is this for the 65550?? */
|
|
#else
|
|
#define ctPATCOPY 0xF0
|
|
#define ctTOP2BOTTOM 0x100
|
|
#define ctBOTTOM2TOP 0x000
|
|
#define ctLEFT2RIGHT 0x200
|
|
#define ctRIGHT2LEFT 0x000
|
|
#define ctSRCFG 0x400
|
|
#define ctSRCMONO 0x800
|
|
#define ctPATMONO 0x1000
|
|
#define ctBGTRANSPARENT 0x2000
|
|
#define ctSRCSYSTEM 0x4000
|
|
#define ctPATSOLID 0x80000L
|
|
#define ctPATSTART0 0x00000L
|
|
#define ctPATSTART1 0x10000L
|
|
#define ctPATSTART2 0x20000L
|
|
#define ctPATSTART3 0x30000L
|
|
#define ctPATSTART4 0x40000L
|
|
#define ctPATSTART5 0x50000L
|
|
#define ctPATSTART6 0x60000L
|
|
#define ctPATSTART7 0x70000L
|
|
#endif
|
|
|
|
#define chipsFillPix(bpp,pixel) {\
|
|
if (bpp == 8) \
|
|
{ \
|
|
pixel = pixel & 0xff; \
|
|
} \
|
|
else if (bpp == 16) \
|
|
{ \
|
|
pixel = pixel & 0xffff; \
|
|
} \
|
|
}
|
|
|
|
static VOL8 *mmio;
|
|
static CARD32 byteStride;
|
|
static CARD32 bytesPerPixel;
|
|
static CARD32 pixelStride;
|
|
|
|
static void
|
|
chipsSet (ScreenPtr pScreen)
|
|
{
|
|
KdScreenPriv(pScreen);
|
|
chipsScreenInfo(pScreenPriv);
|
|
|
|
mmio = chipss->mmio_base;
|
|
byteStride = pScreenPriv->screen->fb[0].byteStride;
|
|
bytesPerPixel = pScreenPriv->screen->fb[0].bitsPerPixel >> 3;
|
|
pixelStride = pScreenPriv->screen->fb[0].pixelStride;
|
|
}
|
|
|
|
#ifdef HIQV
|
|
#define CHIPS_BR0 0x00 /* offset */
|
|
#define CHIPS_BR1 0x04 /* bg */
|
|
#define CHIPS_BR2 0x08 /* fg */
|
|
#define CHIPS_BR3 0x0c /* monochrome */
|
|
#define CHIPS_BR4 0x10 /* bitblt */
|
|
#define CHIPS_BR5 0x14 /* pattern addr */
|
|
#define CHIPS_BR6 0x18 /* source addr */
|
|
#define CHIPS_BR7 0x1c /* dst addr */
|
|
#define CHIPS_BR8 0x20 /* dst w/h */
|
|
#else
|
|
#define CHIPS_DR0 0x83d0
|
|
#define CHIPS_DR1 0x87d0
|
|
#define CHIPS_DR2 0x8bd0
|
|
#define CHIPS_DR3 0x8fd0
|
|
#define CHIPS_DR4 0x93d0
|
|
#define CHIPS_DR5 0x97d0
|
|
#define CHIPS_DR6 0x9bd0
|
|
#define CHIPS_DR7 0x9fd0
|
|
#endif
|
|
|
|
#define DBG(x)
|
|
|
|
static void
|
|
chipsPitch (int src, int dst)
|
|
{
|
|
CARD32 p;
|
|
|
|
p = ((dst & 0xffff) << 16) | (src & 0xffff);
|
|
DBG(ErrorF ("\tpitch 0x%x\n", p));
|
|
#ifdef HIQV
|
|
*(VOL32 *) (mmio + CHIPS_BR0) = p;
|
|
#else
|
|
*(VOL32 *) (mmio + CHIPS_DR0) = p;
|
|
#endif
|
|
}
|
|
|
|
static void
|
|
chipsBg (Pixel bg)
|
|
{
|
|
DBG(ErrorF ("\tbg 0x%x\n", bg));
|
|
#ifdef HIQV
|
|
*(VOL32 *) (mmio + CHIPS_BR1) = bg & 0xffff;
|
|
#else
|
|
*(VOL32 *) (mmio + CHIPS_DR2) = bg;
|
|
#endif
|
|
}
|
|
|
|
static void
|
|
chipsFg (Pixel fg)
|
|
{
|
|
DBG(ErrorF ("\tfg 0x%x\n", fg));
|
|
#ifdef HIQV
|
|
*(VOL32 *) (mmio + CHIPS_BR2) = fg;
|
|
#else
|
|
*(VOL32 *) (mmio + CHIPS_DR3) = fg;
|
|
#endif
|
|
}
|
|
|
|
static void
|
|
chipsOp (CARD32 op)
|
|
{
|
|
DBG(ErrorF ("\top 0x%x\n", op));
|
|
#ifdef HIQV
|
|
*(VOL32 *) (mmio + CHIPS_BR4) = op;
|
|
#else
|
|
*(VOL32 *) (mmio + CHIPS_DR4) = op;
|
|
#endif
|
|
}
|
|
|
|
static void
|
|
chipsRopSolid (int rop)
|
|
{
|
|
CARD32 op;
|
|
|
|
op = chipsSolidRop[rop] | ctTOP2BOTTOM | ctLEFT2RIGHT | ctPATSOLID | ctPATMONO;
|
|
chipsOp (op);
|
|
}
|
|
|
|
static void
|
|
chipsSrc (int addr)
|
|
{
|
|
DBG(ErrorF ("\tsrc 0x%x\n", addr));
|
|
#ifdef HIQV
|
|
*(VOL32 *) (mmio + CHIPS_BR6) = addr;
|
|
#else
|
|
*(VOL32 *) (mmio + CHIPS_DR5) = addr;
|
|
#endif
|
|
}
|
|
|
|
static void
|
|
chipsDst (int addr)
|
|
{
|
|
DBG(ErrorF ("\tdst 0x%x\n", addr));
|
|
#ifdef HIQV
|
|
*(VOL32 *) (mmio + CHIPS_BR7) = addr;
|
|
#else
|
|
*(VOL32 *) (mmio + CHIPS_DR6) = addr;
|
|
#endif
|
|
}
|
|
|
|
static void
|
|
chipsWidthHeightGo (int w, int h)
|
|
{
|
|
DBG(ErrorF ("\twidth height %d/%d\n", w, h));
|
|
#ifdef HIQV
|
|
*(VOL32 *) (mmio + CHIPS_BR8) = ((h & 0xffff) << 16) | (w & 0xffff);
|
|
#else
|
|
*(VOL32 *) (mmio + CHIPS_DR7) = ((h & 0xffff) << 16) | (w & 0xffff);
|
|
#endif
|
|
}
|
|
|
|
static void
|
|
chipsWaitIdle (void)
|
|
{
|
|
#ifdef HIQV
|
|
int timeout = 0;
|
|
CARD8 tmp;
|
|
VOL32 *br4 = (VOL32 *) (mmio + CHIPS_BR4);
|
|
|
|
DBG(ErrorF ("\tBR4 0x%x 0x%x\n", mmio + CHIPS_BR4, *br4));
|
|
DBG(ErrorF ("\tXR20 0x%x\n", chipsReadXR (0, 0x20)));
|
|
for (;;)
|
|
{
|
|
if ((*br4 & 0x80000000) == 0)
|
|
break;
|
|
tmp = chipsReadXR (0, 0x20);
|
|
if ((tmp & 1) == 0)
|
|
break;
|
|
if (++timeout > 1000000)
|
|
{
|
|
ErrorF ("timeout\n");
|
|
tmp = chipsReadXR (0, 0x20);
|
|
chipsWriteXR (0, 0x20, tmp | 2);
|
|
sleep (1);
|
|
chipsWriteXR (0, 0x20, tmp);
|
|
sleep (1);
|
|
}
|
|
}
|
|
#else
|
|
while (*(VOL32 *) (mmio + CHIPS_DR4) & 0x00100000)
|
|
;
|
|
#endif
|
|
}
|
|
|
|
static void
|
|
chipsWaitMarker (ScreenPtr pScreen, int marker)
|
|
{
|
|
chipsSet (pScreen);
|
|
chipsWaitIdle ();
|
|
}
|
|
|
|
static Bool
|
|
chipsPrepareSolid (PixmapPtr pPixmap,
|
|
int alu,
|
|
Pixel pm,
|
|
Pixel fg)
|
|
{
|
|
FbBits depthMask;
|
|
|
|
DBG(ErrorF ("PrepareSolid %d 0x%x\n", alu, fg));
|
|
depthMask = FbFullMask(pPixmap->drawable.depth);
|
|
if ((pm & depthMask) != depthMask)
|
|
return FALSE;
|
|
else
|
|
{
|
|
chipsSet (pPixmap->drawable.pScreen);
|
|
chipsWaitIdle ();
|
|
chipsFillPix(pPixmap->drawable.bitsPerPixel,fg);
|
|
chipsFg (fg);
|
|
chipsBg (fg);
|
|
chipsRopSolid (alu);
|
|
chipsPitch (byteStride, byteStride);
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
static void
|
|
chipsSolid (int x1, int y1, int x2, int y2)
|
|
{
|
|
CARD32 dst;
|
|
int w, h;
|
|
|
|
DBG(ErrorF (" Solid %dx%d %dx%d\n", x1, y1, x2, y2));
|
|
dst = y1 * byteStride + x1 * bytesPerPixel;
|
|
w = (x2 - x1) * bytesPerPixel;
|
|
h = (y2 - y1);
|
|
chipsWaitIdle ();
|
|
chipsDst (dst);
|
|
chipsWidthHeightGo (w, h);
|
|
}
|
|
|
|
static void
|
|
chipsDoneSolid (void)
|
|
{
|
|
}
|
|
|
|
static CARD32 copyOp;
|
|
|
|
static Bool
|
|
chipsPrepareCopy (PixmapPtr pSrcPixmap,
|
|
PixmapPtr pDstPixmap,
|
|
int dx,
|
|
int dy,
|
|
int alu,
|
|
Pixel pm)
|
|
{
|
|
FbBits depthMask;
|
|
|
|
DBG(ErrorF ("PrepareSolid %d 0x%x\n", alu, fg));
|
|
depthMask = FbFullMask(pDstPixmap->drawable.depth);
|
|
if ((pm & depthMask) != depthMask)
|
|
return FALSE;
|
|
else
|
|
{
|
|
copyOp = chipsBltRop[alu];
|
|
if (dy >= 0)
|
|
copyOp |= ctTOP2BOTTOM;
|
|
else
|
|
copyOp |= ctBOTTOM2TOP;
|
|
if (dx >= 0)
|
|
copyOp |= ctLEFT2RIGHT;
|
|
else
|
|
copyOp |= ctRIGHT2LEFT;
|
|
chipsSet (pDstPixmap->drawable.pScreen);
|
|
chipsWaitIdle ();
|
|
chipsOp (copyOp);
|
|
chipsPitch (byteStride, byteStride);
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
static void
|
|
chipsCopy (int srcX,
|
|
int srcY,
|
|
int dstX,
|
|
int dstY,
|
|
int w,
|
|
int h)
|
|
{
|
|
int src, dst;
|
|
if ((copyOp & (ctTOP2BOTTOM|ctBOTTOM2TOP)) == ctBOTTOM2TOP)
|
|
{
|
|
src = (srcY + h - 1) * byteStride;
|
|
dst = (dstY + h - 1) * byteStride;
|
|
}
|
|
else
|
|
{
|
|
src = srcY * byteStride;
|
|
dst = dstY * byteStride;
|
|
}
|
|
if ((copyOp & (ctLEFT2RIGHT|ctRIGHT2LEFT)) == ctRIGHT2LEFT)
|
|
{
|
|
src = src + (srcX + w) * bytesPerPixel - 1;
|
|
dst = dst + (dstX + w) * bytesPerPixel - 1;
|
|
}
|
|
else
|
|
{
|
|
src = src + srcX * bytesPerPixel;
|
|
dst = dst + dstX * bytesPerPixel;
|
|
}
|
|
chipsWaitIdle ();
|
|
chipsSrc (src);
|
|
chipsDst (dst);
|
|
chipsWidthHeightGo (w * bytesPerPixel, h);
|
|
}
|
|
|
|
static void
|
|
chipsDoneCopy (void)
|
|
{
|
|
}
|
|
|
|
Bool
|
|
chipsDrawInit (ScreenPtr pScreen)
|
|
{
|
|
KdScreenPriv(pScreen);
|
|
chipsScreenInfo(pScreenPriv);
|
|
|
|
switch (pScreenPriv->screen->fb[0].bitsPerPixel) {
|
|
case 8:
|
|
case 16:
|
|
break;
|
|
default:
|
|
return FALSE;
|
|
}
|
|
|
|
memset(&chipss->kaa, 0, sizeof(KaaScreenInfoRec));
|
|
chipss->kaa.waitMarker = chipsWaitMarker;
|
|
chipss->kaa.PrepareSolid = chipsPrepareSolid;
|
|
chipss->kaa.Solid = chipsSolid;
|
|
chipss->kaa.DoneSolid = chipsDoneSolid;
|
|
chipss->kaa.PrepareCopy = chipsPrepareCopy;
|
|
chipss->kaa.Copy = chipsCopy;
|
|
chipss->kaa.DoneCopy = chipsDoneCopy;
|
|
|
|
if (!kaaDrawInit (pScreen, &chipss->kaa))
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void
|
|
chipsDrawEnable (ScreenPtr pScreen)
|
|
{
|
|
KdScreenPriv(pScreen);
|
|
chipsScreenInfo(pScreenPriv);
|
|
CARD8 mode = 0x00;
|
|
|
|
switch (pScreenPriv->screen->fb[0].bitsPerPixel) {
|
|
case 8:
|
|
mode = 0x00;
|
|
break;
|
|
case 16:
|
|
mode = 0x10;
|
|
break;
|
|
}
|
|
chipsSet (pScreen);
|
|
chipsWaitIdle ();
|
|
chipsWriteXR (chipss, 0x20, mode);
|
|
|
|
kaaMarkSync (pScreen);
|
|
}
|
|
|
|
void
|
|
chipsDrawDisable (ScreenPtr pScreen)
|
|
{
|
|
}
|
|
|
|
void
|
|
chipsDrawFini (ScreenPtr pScreen)
|
|
{
|
|
}
|
|
|