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 02:15:57 +02:00
|
|
|
NeoMMIO *mmio;
|
|
|
|
NeoScreenInfo *screen;
|
|
|
|
NeoCardInfo *card;
|
|
|
|
CARD32 fgColor;
|
|
|
|
|
|
|
|
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
|
|
|
DBGOUT("Waiting for idle...\n");
|
|
|
|
DBGOUT("blStat %lx=%lx\n", &mmio->bltStat, mmio->bltStat);
|
|
|
|
unsigned int i = 0;
|
|
|
|
while ((mmio->bltStat & 1) && ++i<100000);
|
|
|
|
if (i>=100000) DBGOUT("Wait Idle timeout\n");
|
|
|
|
else DBGOUT("*** Wait Idle ok\n");
|
2004-04-04 00:22:48 +02:00
|
|
|
}
|
|
|
|
|
2004-04-11 02:15:57 +02:00
|
|
|
static void neoWaitFifo(NeoCardInfo *neoc, int requested_fifo_space)
|
2004-04-04 00:22:48 +02:00
|
|
|
{
|
2004-04-04 09:30:07 +02:00
|
|
|
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;
|
|
|
|
/* set blt control */
|
2004-04-11 02:15:57 +02:00
|
|
|
/* NEO_BC0_SRC_IS_FG |
|
2004-04-04 09:30:07 +02:00
|
|
|
NEO_BC3_SRC_XY_ADDR |
|
2004-04-11 02:15:57 +02:00
|
|
|
NEO_BC3_DST_XY_ADDR |
|
|
|
|
NEO_BC3_SKIP_MAPPING | 0x0c0000; */
|
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
|
|
|
DBGOUT("Solid (%i, %i) - (%i, %i). \n", x1, y1, x2, y2);
|
|
|
|
int x, y, w, h;
|
|
|
|
x = x1;
|
|
|
|
y = y1;
|
|
|
|
w = x2-x1 + 1;
|
|
|
|
h = y2-y1 + 1;
|
|
|
|
if (x1>x2) {
|
|
|
|
x = x2;
|
|
|
|
w = -w;
|
|
|
|
}
|
|
|
|
if (y1>y2) {
|
|
|
|
y = y2;
|
|
|
|
h = -h;
|
|
|
|
}
|
|
|
|
|
2004-04-11 02:15:57 +02:00
|
|
|
int pitch = 16;
|
|
|
|
|
|
|
|
neoWaitIdle(card);
|
|
|
|
mmio->bltStat = NEO_MODE1_DEPTH16 << 16;
|
|
|
|
mmio->pitch = (pitch << 16) | (pitch & 0xffff);
|
|
|
|
|
|
|
|
neoWaitIdle(card);
|
|
|
|
mmio->fgColor = fgColor;
|
|
|
|
mmio->bltCntl =
|
|
|
|
NEO_BC3_FIFO_EN |
|
|
|
|
NEO_BC0_SRC_IS_FG |
|
|
|
|
NEO_BC3_SKIP_MAPPING | 0x0c0000;
|
2004-04-04 09:30:07 +02:00
|
|
|
mmio->dstStart = (y <<16) | (x & 0xffff);
|
|
|
|
|
|
|
|
mmio->xyExt = (h << 16) | (w & 0xffff);
|
|
|
|
DBGOUT("Solid (%i, %i) - (%i, %i). Color %li\n", x, y, w, h, fgColor);
|
2004-04-11 02:15:57 +02:00
|
|
|
// DBGOUT("Offset %lx. Extent %lx\n",mmio->dstStart, mmio->xyExt);
|
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-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-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
|
|
|
KaaScreenInfoRec neoKaa = {
|
2004-04-04 00:22:48 +02:00
|
|
|
neoPrepareSolid,
|
|
|
|
neoSolid,
|
|
|
|
neoDoneSolid,
|
|
|
|
|
|
|
|
neoPrepareCopy,
|
|
|
|
neoCopy,
|
|
|
|
neoDoneCopy
|
|
|
|
};
|
|
|
|
|
2004-04-04 09:30:07 +02:00
|
|
|
Bool neoDrawInit (ScreenPtr pScreen)
|
2004-04-04 00:22:48 +02:00
|
|
|
{
|
|
|
|
ENTER();
|
|
|
|
// SetupNeo(pScreen);
|
|
|
|
// PictureScreenPtr ps = GetPictureScreen(pScreen);
|
2004-04-04 09:30:07 +02:00
|
|
|
|
|
|
|
if (!kaaDrawInit (pScreen, &neoKaa)) {
|
|
|
|
return FALSE;
|
|
|
|
}
|
2004-04-04 00:22:48 +02:00
|
|
|
|
|
|
|
// if (ps && tridents->off_screen)
|
2004-04-04 09:30:07 +02:00
|
|
|
// ps->Composite = tridentComposite;
|
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-04-04 09:30:07 +02:00
|
|
|
DBGOUT("NEO AA MMIO=%p\n", mmio);
|
|
|
|
// screen->depth = screen->vesa.mode.BitsPerPixel/8;
|
|
|
|
// screen->pitch = screen->vesa.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();
|
|
|
|
}
|
|
|
|
|
2004-04-04 09:30:07 +02:00
|
|
|
void neoDrawSync (ScreenPtr pScreen)
|
2004-04-04 00:22:48 +02:00
|
|
|
{
|
|
|
|
ENTER();
|
|
|
|
SetupNeo(pScreen);
|
2004-04-04 09:30:07 +02:00
|
|
|
|
2004-04-04 00:22:48 +02:00
|
|
|
neoWaitIdle(neoc);
|
|
|
|
LEAVE();
|
|
|
|
}
|