2004-04-04 00:22:48 +02:00
|
|
|
/*
|
|
|
|
*
|
|
|
|
* Copyright © 2004 Franco Catrin
|
|
|
|
*
|
|
|
|
* 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 Franco Catrin not be used in
|
|
|
|
* advertising or publicity pertaining to distribution of the software without
|
|
|
|
* specific, written prior permission. Franco Catrin makes no
|
|
|
|
* representations about the suitability of this software for any purpose. It
|
|
|
|
* is provided "as is" without express or implied warranty.
|
|
|
|
*
|
|
|
|
* FRANCO CATRIN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
|
|
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
|
|
|
* EVENT SHALL FRANCO CATRIN 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.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
#include <config.h>
|
|
|
|
#endif
|
|
|
|
#include "neomagic.h"
|
|
|
|
|
2004-04-04 09:30:07 +02:00
|
|
|
#include <X11/Xmd.h>
|
|
|
|
#include "gcstruct.h"
|
|
|
|
#include "scrnintstr.h"
|
|
|
|
#include "pixmapstr.h"
|
|
|
|
#include "regionstr.h"
|
|
|
|
#include "mistruct.h"
|
|
|
|
#include "fontstruct.h"
|
|
|
|
#include "dixfontstr.h"
|
|
|
|
#include "fb.h"
|
|
|
|
#include "migc.h"
|
|
|
|
#include "miline.h"
|
|
|
|
#include "picturestr.h"
|
|
|
|
|
2004-04-11 18:24:03 +02:00
|
|
|
NeoMMIO *mmio;
|
2004-04-11 02:15:57 +02:00
|
|
|
NeoScreenInfo *screen;
|
|
|
|
NeoCardInfo *card;
|
2004-04-11 18:24:03 +02:00
|
|
|
CARD32 fgColor;
|
|
|
|
CARD32 rop;
|
|
|
|
|
|
|
|
CARD32 neoRop[16] = {
|
|
|
|
0x000000, /* GXclear */
|
|
|
|
0x080000, /* GXand */
|
|
|
|
0x040000, /* GXandReverse */
|
|
|
|
0x0c0000, /* GXcopy */
|
|
|
|
0x020000, /* GXandInvert */
|
|
|
|
0x0a0000, /* GXnoop */
|
|
|
|
0x060000, /* GXxor */
|
|
|
|
0x0e0000, /* GXor */
|
|
|
|
0x010000, /* GXnor */
|
|
|
|
0x090000, /* GXequiv */
|
|
|
|
0x050000, /* GXinvert */
|
|
|
|
0x0d0000, /* GXorReverse */
|
|
|
|
0x030000, /* GXcopyInvert */
|
|
|
|
0x0b0000, /* GXorInverted */
|
|
|
|
0x070000, /* GXnand */
|
|
|
|
0x0f0000 /* GXset */
|
|
|
|
};
|
2004-04-11 02:15:57 +02:00
|
|
|
|
|
|
|
static void neoWaitIdle(NeoCardInfo *neoc)
|
2004-04-04 00:22:48 +02:00
|
|
|
{
|
2004-04-04 09:30:07 +02:00
|
|
|
// if MMIO is not working it may halt the machine
|
2004-04-11 02:15:57 +02:00
|
|
|
unsigned int i = 0;
|
|
|
|
while ((mmio->bltStat & 1) && ++i<100000);
|
2004-04-04 00:22:48 +02:00
|
|
|
}
|
|
|
|
|
2005-06-09 12:44:45 +02:00
|
|
|
static void neoWaitMarker (ScreenPtr pScreen, int marker)
|
|
|
|
{
|
|
|
|
KdScreenPriv(pScreen);
|
|
|
|
neoCardInfo(pScreenPriv);
|
|
|
|
|
|
|
|
neoWaitIdle(neoc);
|
|
|
|
}
|
|
|
|
|
2004-04-04 00:22:48 +02:00
|
|
|
|
2004-04-04 09:30:07 +02:00
|
|
|
static Bool neoPrepareSolid(PixmapPtr pPixmap,
|
|
|
|
int alu,
|
|
|
|
Pixel pm,
|
|
|
|
Pixel fg)
|
2004-04-04 00:22:48 +02:00
|
|
|
{
|
2004-04-04 09:30:07 +02:00
|
|
|
FbBits depthMask = FbFullMask(pPixmap->drawable.depth);
|
|
|
|
if ((pm & depthMask) != depthMask) {
|
|
|
|
return FALSE;
|
|
|
|
} else {
|
|
|
|
fgColor = fg;
|
2004-04-11 18:24:03 +02:00
|
|
|
if (alu!=3) DBGOUT("used ROP %i\n", alu);
|
|
|
|
rop = neoRop[alu];
|
2004-04-04 09:30:07 +02:00
|
|
|
return TRUE;
|
|
|
|
}
|
2004-04-04 00:22:48 +02:00
|
|
|
}
|
|
|
|
|
2004-04-04 09:30:07 +02:00
|
|
|
static void neoSolid (int x1, int y1, int x2, int y2)
|
2004-04-04 00:22:48 +02:00
|
|
|
{
|
2004-04-04 09:30:07 +02:00
|
|
|
int x, y, w, h;
|
|
|
|
x = x1;
|
|
|
|
y = y1;
|
2004-04-11 17:51:04 +02:00
|
|
|
w = x2-x1;
|
|
|
|
h = y2-y1;
|
2004-04-11 02:15:57 +02:00
|
|
|
neoWaitIdle(card);
|
|
|
|
mmio->fgColor = fgColor;
|
|
|
|
mmio->bltCntl =
|
|
|
|
NEO_BC3_FIFO_EN |
|
|
|
|
NEO_BC0_SRC_IS_FG |
|
2004-04-11 18:24:03 +02:00
|
|
|
NEO_BC3_SKIP_MAPPING | rop;
|
2004-04-11 02:53:10 +02:00
|
|
|
mmio->dstStart = y * screen->pitch + x * screen->depth;
|
2004-04-04 09:30:07 +02:00
|
|
|
|
2004-04-11 02:53:10 +02:00
|
|
|
mmio->xyExt = (unsigned long)(h << 16) | (w & 0xffff);
|
2004-06-07 07:05:10 +02:00
|
|
|
|
2004-04-04 00:22:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-04-04 09:30:07 +02:00
|
|
|
static void neoDoneSolid(void)
|
2004-04-04 00:22:48 +02:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2004-04-04 09:30:07 +02:00
|
|
|
static Bool neoPrepareCopy (PixmapPtr pSrcPixpam, PixmapPtr pDstPixmap,
|
|
|
|
int dx, int dy, int alu, Pixel pm)
|
2004-04-04 00:22:48 +02:00
|
|
|
{
|
2004-04-11 18:24:03 +02:00
|
|
|
rop = neoRop[alu];
|
2004-04-04 09:30:07 +02:00
|
|
|
return TRUE;
|
2004-04-04 00:22:48 +02:00
|
|
|
}
|
|
|
|
|
2004-04-04 09:30:07 +02:00
|
|
|
static void neoCopy (int srcX, int srcY, int dstX, int dstY, int w, int h)
|
2004-04-04 00:22:48 +02:00
|
|
|
{
|
2004-04-11 17:20:17 +02:00
|
|
|
neoWaitIdle(card);
|
|
|
|
|
|
|
|
if ((dstY < srcY) || ((dstY == srcY) && (dstX < srcX))) {
|
|
|
|
mmio->bltCntl =
|
2004-04-11 17:51:04 +02:00
|
|
|
NEO_BC3_FIFO_EN |
|
2004-04-11 18:24:03 +02:00
|
|
|
NEO_BC3_SKIP_MAPPING | rop;
|
2004-04-11 17:20:17 +02:00
|
|
|
mmio->srcStart = srcY * screen->pitch + srcX * screen->depth;
|
|
|
|
mmio->dstStart = dstY * screen->pitch + dstX * screen->depth;
|
|
|
|
|
|
|
|
mmio->xyExt = (unsigned long)(h << 16) | (w & 0xffff);
|
|
|
|
} else {
|
|
|
|
mmio->bltCntl = NEO_BC0_X_DEC |
|
|
|
|
NEO_BC0_DST_Y_DEC |
|
|
|
|
NEO_BC0_SRC_Y_DEC |
|
|
|
|
NEO_BC3_FIFO_EN |
|
2004-06-07 07:05:10 +02:00
|
|
|
NEO_BC3_SKIP_MAPPING | rop;
|
2004-04-11 17:20:17 +02:00
|
|
|
srcX+=w-1;
|
|
|
|
dstX+=w-1;
|
|
|
|
srcY+=h-1;
|
|
|
|
dstY+=h-1;
|
|
|
|
mmio->srcStart = srcY * screen->pitch + srcX * screen->depth;
|
|
|
|
mmio->dstStart = dstY * screen->pitch + dstX * screen->depth;
|
|
|
|
mmio->xyExt = (unsigned long)(h << 16) | (w & 0xffff);
|
|
|
|
}
|
|
|
|
|
2004-04-04 00:22:48 +02:00
|
|
|
}
|
|
|
|
|
2004-04-04 09:30:07 +02:00
|
|
|
static void neoDoneCopy (void)
|
2004-04-04 00:22:48 +02:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-04-04 09:30:07 +02:00
|
|
|
Bool neoDrawInit (ScreenPtr pScreen)
|
2004-04-04 00:22:48 +02:00
|
|
|
{
|
2005-06-09 12:44:45 +02:00
|
|
|
KdScreenPriv(pScreen);
|
|
|
|
neoScreenInfo(pScreenPriv);
|
|
|
|
|
2004-04-04 00:22:48 +02:00
|
|
|
ENTER();
|
2005-06-09 12:44:45 +02:00
|
|
|
|
|
|
|
memset(&neos->kaa, 0, sizeof(KaaScreenInfoRec));
|
|
|
|
neos->kaa.waitMarker = neoWaitMarker;
|
|
|
|
neos->kaa.PrepareSolid = neoPrepareSolid;
|
|
|
|
neos->kaa.Solid = neoSolid;
|
|
|
|
neos->kaa.DoneSolid = neoDoneSolid;
|
|
|
|
neos->kaa.PrepareCopy = neoPrepareCopy;
|
|
|
|
neos->kaa.Copy = neoCopy;
|
|
|
|
neos->kaa.DoneCopy = neoDoneCopy;
|
|
|
|
|
|
|
|
if (!kaaDrawInit (pScreen, &neos->kaa)) {
|
2004-04-04 09:30:07 +02:00
|
|
|
return FALSE;
|
|
|
|
}
|
2004-04-04 00:22:48 +02:00
|
|
|
LEAVE();
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2004-04-04 09:30:07 +02:00
|
|
|
void neoDrawEnable (ScreenPtr pScreen)
|
2004-04-04 00:22:48 +02:00
|
|
|
{
|
|
|
|
ENTER();
|
|
|
|
SetupNeo(pScreen);
|
|
|
|
screen = neos;
|
|
|
|
card = neoc;
|
|
|
|
mmio = neoc->mmio;
|
2004-06-07 07:05:10 +02:00
|
|
|
screen->depth = (screen->backendScreen.mode.BitsPerPixel+7)/8;
|
2004-04-11 02:53:10 +02:00
|
|
|
screen->pitch = screen->backendScreen.mode.BytesPerScanLine;
|
|
|
|
DBGOUT("NEO depth=%x, pitch=%x\n", screen->depth, screen->pitch);
|
2004-04-04 00:22:48 +02:00
|
|
|
LEAVE();
|
|
|
|
}
|
|
|
|
|
2004-04-04 09:30:07 +02:00
|
|
|
void neoDrawDisable (ScreenPtr pScreen)
|
2004-04-04 00:22:48 +02:00
|
|
|
{
|
|
|
|
ENTER();
|
|
|
|
LEAVE();
|
|
|
|
}
|
|
|
|
|
2004-04-04 09:30:07 +02:00
|
|
|
void neoDrawFini (ScreenPtr pScreen)
|
2004-04-04 00:22:48 +02:00
|
|
|
{
|
|
|
|
ENTER();
|
|
|
|
LEAVE();
|
|
|
|
}
|
|
|
|
|