Remove XAA support

Mostly done via unifdef -UHAVE_XAA_H, followed by minor manual editing

Since recent commits require xserver-1.18.0 or later to build against,
there's no reason leaving behind big chunks of code that can only build
against the XAA support removed in xserver-1.13.0 (released in 2012).

Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
Part-of: <https://gitlab.freedesktop.org/xorg/driver/xf86-video-trident/-/merge_requests/9>
This commit is contained in:
Alan Coopersmith
2024-05-19 14:14:29 -07:00
parent a5f2dea496
commit 4e392222bb
11 changed files with 17 additions and 3832 deletions

View File

@@ -72,24 +72,6 @@ AC_CHECK_DECL(XSERVER_LIBPCIACCESS,
[#include "xorg-server.h"])
CPPFLAGS="$SAVE_CPPFLAGS"
AC_ARG_ENABLE(xaa,
AS_HELP_STRING([--enable-xaa],
[Enable legacy X Acceleration Architecture (XAA) [default=auto]]),
[XAA="$enableval"],
[XAA=auto])
if test "x$XAA" != xno; then
save_CFLAGS=$CFLAGS
save_CPPFLAGS=$CPPFLAGS
CFLAGS=$XORG_CFLAGS
CPPFLAGS="$XORG_CFLAGS"
AC_CHECK_HEADERS([xaa.h], XAA=yes, XAA=no)
CFLAGS=$save_CFLAGS
CPPFLAGS=$save_CPPFLAGS
fi
AC_MSG_CHECKING([whether to include XAA support])
AM_CONDITIONAL(XAA, test "x$XAA" = xyes)
AC_MSG_RESULT([$XAA])
if test "x$XSERVER_LIBPCIACCESS" = xyes; then
PKG_CHECK_MODULES([PCIACCESS], [pciaccess >= 0.8.0])
XORG_CFLAGS="$XORG_CFLAGS $PCIACCESS_CFLAGS"

View File

@@ -20,7 +20,7 @@ The XvImage extension is supported on TGUI96xx and greater cards.
.SH SUPPORTED HARDWARE
The
.B trident
driver supports PCI,AGP and ISA video cards based on the following
driver supports PCI and AGP video cards based on the following
Trident chips:
.TP 12
.B Blade
@@ -127,10 +127,11 @@ an integer value greater or equal to 0 and less than 128.
Default: gamma and brightness control is turned off.
Note: This is not supported on all chipsets.
.BI "Option \*qAccelMethod\*q \*q" string \*q
Choose acceleration architecture, either "XAA" or "EXA". XAA is the old
(but stable) XFree86 based acceleration architecture. EXA is a newer and
Choose acceleration architecture, currently only "EXA". XAA was the old
(but stable) XFree86 based acceleration architecture, but is no longer available.
EXA is a newer and
simpler acceleration architecture designed to better accelerate the X Render
extension. Default: "XAA".
extension. Default: "EXA".
.SH "SEE ALSO"
__xservername__(__appmansuffix__), __xconfigfile__(__filemansuffix__), Xserver(__appmansuffix__), X(__miscmansuffix__)
.SH AUTHOR

View File

@@ -31,11 +31,8 @@ trident_drv_ladir = @moduledir@/drivers
trident_drv_la_SOURCES = \
blade_exa.c \
blade_xaa.c \
compat-api.h \
image_xaa.c \
pci_rename.h \
tgui_xaa.c \
trident_bank.c \
trident_dac.c \
trident_dga.c \
@@ -48,6 +45,4 @@ trident_drv_la_SOURCES = \
trident_video.c \
trident.h \
tvga_dac.c \
xp_xaa.c \
xp4_exa.c \
xp4_xaa.c
xp4_exa.c

View File

@@ -1,863 +0,0 @@
/*
* Copyright 1997-2003 by Alan Hourihane, North Wales, UK.
*
* 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 Alan
* Hourihane not be used in advertising or publicity pertaining to
* distribution of the software without specific, written prior
* permission. Alan Hourihane makes no representations about the
* suitability of this software for any purpose. It is provided
* "as is" without express or implied warranty.
*
* ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
* SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS, IN NO EVENT SHALL ALAN HOURIHANE 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.
*
* Authors: Alan Hourihane, <alanh@fairlite.demon.co.uk>
*
* Trident Blade3D accelerated options.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "xf86.h"
#include "xf86_OSproc.h"
#include "xf86Pci.h"
#include "miline.h"
#include "trident.h"
#include "trident_regs.h"
#ifdef HAVE_XAA_H
#include "xaarop.h"
#include "xaalocal.h"
static void BladeSync(ScrnInfoPtr pScrn);
#if 0
static void BladeSetupForSolidLine(ScrnInfoPtr pScrn,
int color,
int rop,
unsigned int planemask);
static void BladeSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn,
int x, int y,
int dmaj, int dmin,
int e, int len,
int octant);
static void BladeSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
int x1, int y1,
int x2, int y2,
int flags);
static void BladeSetupForDashedLine(ScrnInfoPtr pScrn,
int fg, int bg,
int rop,
unsigned int planemask,
int length,
unsigned char *pattern);
static void BladeSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
int x1, int y1,
int x2, int y2,
int flags, int phase);
#endif
static void BladeSetupForFillRectSolid(ScrnInfoPtr pScrn,
int color,
int rop,
unsigned int planemask);
static void BladeSubsequentFillRectSolid(ScrnInfoPtr pScrn,
int x, int y,
int w, int h);
static void BladeSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
int x1, int y1,
int x2, int y2,
int w, int h);
static void BladeSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
int xdir, int ydir,
int rop,
unsigned int planemask,
int transparency_color);
#if 0
static void BladeSetupForScreenToScreenColorExpand(ScrnInfoPtr pScrn,
int fg, int bg,
int rop,
unsigned int planemask);
static void BladeSubsequentScreenToScreenColorExpand(ScrnInfoPtr pScrn,
int x, int y,
int w, int h,
int srcx, int srcy,
int offset);
#endif
static void BladeSetupForCPUToScreenColorExpand(ScrnInfoPtr pScrn,
int fg, int bg,
int rop,
unsigned int planemask);
static void BladeSubsequentCPUToScreenColorExpand(ScrnInfoPtr pScrn,
int x, int y,
int w, int h,
int skipleft);
static void BladeSetClippingRectangle(ScrnInfoPtr pScrn,
int x1, int y1,
int x2, int y2);
static void BladeDisableClipping(ScrnInfoPtr pScrn);
static void BladeSetupForMono8x8PatternFill(ScrnInfoPtr pScrn,
int patternx,
int patterny,
int fg, int bg,
int rop,
unsigned int planemask);
static void BladeSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn,
int patternx,
int patterny,
int x, int y,
int w, int h);
#if 0
static void BladeSetupForColor8x8PatternFill(ScrnInfoPtr pScrn,
int patternx,
int patterny,
int rop,
unsigned int planemask,
int trans_col);
static void BladeSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn,
int patternx,
int patterny,
int x, int y,
int w, int h);
#endif
static void BladeSetupForImageWrite(ScrnInfoPtr pScrn,
int rop,
unsigned int planemask,
int transparency_color,
int bpp, int depth);
static void BladeSubsequentImageWriteRect(ScrnInfoPtr pScrn,
int x, int y,
int w, int h,
int skipleft);
static void
BladeInitializeAccelerator(ScrnInfoPtr pScrn)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
CARD32 stride;
stride = (pScrn->displayWidth >> 3) << 20;
BLADE_OUT(0x21C8, stride);
BLADE_OUT(0x21CC, stride);
BLADE_OUT(0x21D0, stride);
BLADE_OUT(0x21D4, stride);
switch (pScrn->depth) {
case 8:
stride |= (0 << 29);
break;
case 15:
stride |= (5 << 29);
break;
case 16:
stride |= (1 << 29);
break;
case 24:
stride |= (2 << 29);
break;
}
BLADE_OUT(0x21B8, 0);
BLADE_OUT(0x21B8, stride);
BLADE_OUT(0x21BC, stride);
BLADE_OUT(0x21C0, stride);
BLADE_OUT(0x21C4, stride);
#if 0
/* It appears that the driver sometimes misdetects the RAM type, so we
* don't force this for now */
if (pTrident->HasSGRAM)
BLADE_OUT(0x2168, 1 << 26); /* Enables Block Write if available (SGRAM) */
else
BLADE_OUT(0x2168, 0);
#endif
BLADE_OUT(0x216C, 0);
}
#endif
Bool BladeXaaInit(ScreenPtr pScreen) {
#ifdef HAVE_XAA_H
XAAInfoRecPtr infoPtr;
ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
if (pTrident->NoAccel)
return FALSE;
pTrident->AccelInfoRec = infoPtr = XAACreateInfoRec();
if (!infoPtr) return FALSE;
pTrident->InitializeAccelerator = BladeInitializeAccelerator;
BladeInitializeAccelerator(pScrn);
infoPtr->Flags = PIXMAP_CACHE |
LINEAR_FRAMEBUFFER |
OFFSCREEN_PIXMAPS;
infoPtr->Sync = BladeSync;
infoPtr->SetClippingRectangle = BladeSetClippingRectangle;
infoPtr->DisableClipping = BladeDisableClipping;
#if 0
infoPtr->SolidLineFlags = 0;
infoPtr->SetupForSolidLine = BladeSetupForSolidLine;
infoPtr->SubsequentSolidTwoPointLine =
BladeSubsequentSolidTwoPointLine;
infoPtr->SetupForDashedLine = BladeSetupForDashedLine;
infoPtr->SubsequentDashedTwoPointLine =
BladeSubsequentDashedTwoPointLine;
infoPtr->DashPatternMaxLength = 16;
infoPtr->DashedLineFlags = LINE_PATTERN_LSBFIRST_LSBJUSTIFIED |
LINE_PATTERN_POWER_OF_2_ONLY;
#endif
infoPtr->SolidFillFlags = NO_PLANEMASK;
infoPtr->SetupForSolidFill = BladeSetupForFillRectSolid;
infoPtr->SubsequentSolidFillRect = BladeSubsequentFillRectSolid;
infoPtr->ScreenToScreenCopyFlags = ONLY_TWO_BITBLT_DIRECTIONS |
NO_PLANEMASK |
NO_TRANSPARENCY;
infoPtr->SetupForScreenToScreenCopy =
BladeSetupForScreenToScreenCopy;
infoPtr->SubsequentScreenToScreenCopy =
BladeSubsequentScreenToScreenCopy;
infoPtr->Mono8x8PatternFillFlags = NO_PLANEMASK |
NO_TRANSPARENCY |
BIT_ORDER_IN_BYTE_MSBFIRST |
HARDWARE_PATTERN_SCREEN_ORIGIN |
HARDWARE_PATTERN_PROGRAMMED_BITS;
infoPtr->SetupForMono8x8PatternFill =
BladeSetupForMono8x8PatternFill;
infoPtr->SubsequentMono8x8PatternFillRect =
BladeSubsequentMono8x8PatternFillRect;
#if 0
infoPtr->Color8x8PatternFillFlags =
HARDWARE_PATTERN_SCREEN_ORIGIN |
BIT_ORDER_IN_BYTE_MSBFIRST;
infoPtr->SetupForColor8x8PatternFill =
TridentSetupForColor8x8PatternFill;
infoPtr->SubsequentColor8x8PatternFillRect =
TridentSubsequentColor8x8PatternFillRect;
infoPtr->ScreenToScreenColorExpandFillFlags = 0;
infoPtr->SetupForScreenToScreenColorExpandFill =
BladeSetupForScreenToScreenColorExpand;
infoPtr->SubsequentScreenToScreenColorExpandFill =
BladeSubsequentScreenToScreenColorExpand;
#endif
infoPtr->CPUToScreenColorExpandFillFlags =
CPU_TRANSFER_PAD_DWORD |
LEFT_EDGE_CLIPPING |
SYNC_AFTER_COLOR_EXPAND |
NO_PLANEMASK |
BIT_ORDER_IN_BYTE_MSBFIRST |
SCANLINE_PAD_DWORD;
infoPtr->ColorExpandRange = 0x10000;
infoPtr->ColorExpandBase = pTrident->IOBase + 0x10000;
infoPtr->SetupForCPUToScreenColorExpandFill =
BladeSetupForCPUToScreenColorExpand;
infoPtr->SubsequentCPUToScreenColorExpandFill =
BladeSubsequentCPUToScreenColorExpand;
infoPtr->SetupForImageWrite = BladeSetupForImageWrite;
infoPtr->SubsequentImageWriteRect =
BladeSubsequentImageWriteRect;
infoPtr->ImageWriteFlags = NO_PLANEMASK |
LEFT_EDGE_CLIPPING |
CPU_TRANSFER_PAD_DWORD |
SYNC_AFTER_IMAGE_WRITE;
infoPtr->ImageWriteBase = pTrident->IOBase + 0x10000;
infoPtr->ImageWriteRange = 0x10000;
return(XAAInit(pScreen, infoPtr));
#else
return FALSE;
#endif
}
#ifdef HAVE_XAA_H
static void
BladeSync(ScrnInfoPtr pScrn)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
int busy;
int cnt = 10000000;
if (pTrident->Clipping) BladeDisableClipping(pScrn);
BLADE_OUT(0x216C, 0);
BLADEBUSY(busy);
while (busy != 0) {
if (--cnt < 0) {
ErrorF("GE timeout\n");
BLADE_OUT(0x2124, 1 << 7);
BLADE_OUT(0x2124, 0);
break;
}
BLADEBUSY(busy);
}
}
static void
BladeSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
int xdir, int ydir,
int rop,
unsigned int planemask,
int transparency_color)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
pTrident->BltScanDirection = 0;
if ((xdir < 0) || (ydir < 0))
pTrident->BltScanDirection |= (1 << 1);
#if 0
if (transparency_color != -1) {
BLADE_OUT(0x2168, transparency_color & 0xffffff);
pTrident->BltScanDirection |= (1 << 6);
}
REPLICATE(planemask);
if (planemask != (unsigned int)-1) {
BLADE_OUT(0x2184, ~planemask);
pTrident->BltScanDirection |= (1 << 5);
}
#endif
BLADE_OUT(0x2148, XAAGetCopyROP(rop));
}
static void
BladeSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
int x1, int y1,
int x2, int y2,
int w, int h)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
int clip = 0;
if (pTrident->Clipping) clip = 1;
BLADE_OUT(0x2144, 0xE0000000 |
(1 << 19) | (1 << 4) | (1 << 2) |
pTrident->BltScanDirection | clip);
if (pTrident->BltScanDirection) {
BLADE_OUT(0x2100, ((y1 + h - 1) << 16) | (x1 + w - 1));
BLADE_OUT(0x2104, (y1 << 16) | x1);
BLADE_OUT(0x2108, ((y2 + h - 1) << 16) | (x2 + w - 1));
BLADE_OUT(0x210C, ((y2 & 0xfff) << 16) | (x2 & 0xfff));
} else {
BLADE_OUT(0x2100, (y1 << 16) | x1);
BLADE_OUT(0x2104, ((y1 + h - 1) << 16) | (x1 + w - 1));
BLADE_OUT(0x2108, (y2 << 16) | x2);
BLADE_OUT(0x210C, (((y2 + h - 1) & 0xfff) << 16) |
((x2 + w - 1) & 0xfff));
}
}
static void
BladeSetClippingRectangle(ScrnInfoPtr pScrn,
int x1, int y1,
int x2, int y2)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
BLADE_OUT(0x2154, ((y1 & 0x0fff) << 16) | (x1 & 0x0fff));
BLADE_OUT(0x2158, ((y2 & 0x0fff) << 16) | (x2 & 0x0fff));
pTrident->Clipping = TRUE;
}
static void
BladeDisableClipping(ScrnInfoPtr pScrn)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
pTrident->Clipping = FALSE;
}
#if 0
static void
BladeSetupForSolidLine(ScrnInfoPtr pScrn,
int color,
int rop,
unsigned int planemask)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
REPLICATE(color);
BLADE_OUT(0x2160, color);
BLADE_OUT(0x2148, XAAGetCopyROP(rop));
pTrident->BltScanDirection = 0;
REPLICATE(planemask);
if (planemask != -1) {
BLADE_OUT(0x2184, ~planemask);
pTrident->BltScanDirection |= (1 << 5);
}
}
static void
BladeSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn,
int x, int y,
int dmaj, int dmin,
int e, int len,
int octant)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
int tmp;
int D = 0, E = 0, ymajor = 0;
BLADE_OUT(0x2144, 0x20000000 |
(3 << 19) | (1 << 4) | (2 << 2) |
(pTrident->Clipping ? 1 : 0));
if (!(octant & YMAJOR)) {
if ((!(octant & XDECREASING)) && (!(octant & YDECREASING))) {
E = 1; D = 0;
}
if ((!(octant & XDECREASING)) && ( (octant & YDECREASING))) {
E = 1; D = 1;
}
if (( (octant & XDECREASING)) && (!(octant & YDECREASING))) {
E = 1; D = 2;
}
if (( (octant & XDECREASING)) && ( (octant & YDECREASING))) {
E = 1; D = 3;
}
ymajor = 0;
} else {
if ((!(octant & XDECREASING)) && (!(octant & YDECREASING))) {
E = 0; D = 0;
}
if ((!(octant & XDECREASING)) && ( (octant & YDECREASING))) {
E = 0; D = 2;
}
if (( (octant & XDECREASING)) && (!(octant & YDECREASING))) {
E = 0; D = 1;
}
if (( (octant & XDECREASING)) && ( (octant & YDECREASING))) {
E = 0; D = 3;
}
ymajor = 1 << 21;
}
if (E) {
tmp = x; x = y; y = tmp;
}
BLADE_OUT(0x2130, 0x00000001);
if (D & 0x02) {
BLADE_OUT(0x213C, 0x10000000 |
(1 << 25) | (1 << 19) | (1 << 17) |
ymajor | ((x + len - 1) << 4));
} else {
BLADE_OUT(0x213C, 0x10000000 |
(1 << 25) | (1 << 19) | (1 << 17) |
ymajor | ((y + len - 1) << 4));
}
BLADE_OUT(0x2140, (E << 30) |
((y & 0xfff) << 20) | ((x & 0xfff) << 4));
BLADE_OUT(0x2144, (D << 30) |
(((dmaj - dmin) & 0xfff) << 16) |
(-dmin & 0xfff));
BLADE_OUT(0x2148, ((-(dmin + e) & 0xfff) << 16));
}
static void
BladeSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
int x1, int y1,
int x2, int y2,
int flags)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
#if 0
if (flags & OMIT_LAST)
BladeSetClippingRectangle(pScrn, x1, y1, x2 - 1, y2 - 1);
#endif
BLADE_OUT(0x2144, 0x20000000 |
pTrident->BltScanDirection |
(1 << 19) | (1 << 4) | (2 << 2));
BLADE_OUT(0x2130, 0x3);
BLADE_OUT(0x2108, (y1 << 16) | x1);
BLADE_OUT(0x210C, ((y2 & 0xfff) << 16) | (x2 & 0xfff));
#if 0
if (flags & OMIT_LAST)
BladeDisableClipping(pScrn);
#endif
}
static void
BladeSetupForDashedLine(ScrnInfoPtr pScrn,
int fg, int bg,
int rop,
unsigned int planemask,
int length,
unsigned char *pattern)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
pTrident->LinePattern = *((CARD16 *)pattern) & ((1 << length) - 1);
switch (length) {
case 2:
pTrident->LinePattern = pTrident->LinePattern |
(pTrident->LinePattern << 2);
case 4:
pTrident->LinePattern = pTrident->LinePattern |
(pTrident->LinePattern << 4);
case 8:
pTrident->LinePattern = pTrident->LinePattern |
(pTrident->LinePattern << 8);
}
REPLICATE(fg);
REPLICATE(bg);
BLADE_OUT(0x2160, fg);
BLADE_OUT(0x2164, bg);
BLADE_OUT(0x2148, XAAGetCopyROP(rop));
pTrident->BltScanDirection = 0;
REPLICATE(planemask);
if (planemask != -1) {
BLADE_OUT(0x2184, ~planemask);
pTrident->BltScanDirection |= (1 << 5);
}
}
static void
BladeSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
int x1, int y1,
int x2, int y2,
int flags, int phase)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
if (flags & OMIT_LAST)
BladeSetClippingRectangle(pScrn, x1, y1, x2 - 1, y2 - 1);
BLADE_OUT(0x216C, (pTrident->LinePattern >> phase) |
(pTrident->LinePattern << (16 - phase)));
BLADE_OUT(0x2144, 0x20000000 |
pTrident->BltScanDirection |
(1 << 27) | (1 << 19) | (1 << 4) | (2 << 2));
BLADE_OUT(0x2108, (y1 << 16) | x1);
BLADE_OUT(0x210C, ((y2 & 0xfff) << 16) | (x2 & 0xfff));
if (flags & OMIT_LAST)
BladeDisableClipping(pScrn);
}
#endif
static void
BladeSetupForFillRectSolid(ScrnInfoPtr pScrn,
int color,
int rop,
unsigned int planemask)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
REPLICATE(color);
BLADE_OUT(0x2160, color);
BLADE_OUT(0x2148, XAAGetCopyROP(rop));
pTrident->BltScanDirection = 0;
#if 0
REPLICATE(planemask);
if (planemask != -1) {
BLADE_OUT(0x2184, ~planemask);
pTrident->BltScanDirection |= (1 << 5);
}
#endif
}
static void
BladeSubsequentFillRectSolid(ScrnInfoPtr pScrn,
int x, int y,
int w, int h)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
BLADE_OUT(0x2144, 0x20000000 |
pTrident->BltScanDirection |
(1 << 19) | (1 << 4) | (2 << 2) |
(pTrident->Clipping ? 1 : 0));
BLADE_OUT(0x2108, (y << 16) | x);
BLADE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
((x + w - 1) & 0xfff));
}
#if 0
static void
BladeSetupForScreenToScreenColorExpand(ScrnInfoPtr pScrn,
int fg, int bg,
int rop,
unsigned int planemask)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
pTrident->ROP = rop;
REPLICATE(bg);
REPLICATE(fg);
IMAGE_OUT(0x44, fg);
IMAGE_OUT(0x48, bg);
IMAGE_OUT(0x20, 0x90000000 | XAAGetCopyROP(rop));
pTrident->BltScanDirection = 0;
REPLICATE(planemask);
if (planemask != -1) {
BLADE_OUT(0x2184, ~planemask);
pTrident->BltScanDirection |= (1 << 5);
}
}
static void
BladeSubsequentScreenToScreenColorExpand(ScrnInfoPtr pScrn,
int x, int y,
int w, int h,
int srcx, int srcy,
int offset)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
IMAGE_OUT(0x00, (srcy << 16) | srcx);
IMAGE_OUT(0x04, ((srcy + h - 1) << 16) | (srcx + w - 1));
IMAGE_OUT(0x08, (y << 16) | x);
IMAGE_OUT(0x0C, ((y + h - 1) << 16) | (x + w - 1));
IMAGE_OUT(0x24, 0x80000000 |
(3 << 22) | (1 << 7) |
pTrident->BltScanDirection |
(pTrident->ROP == GXcopy ? 0 : (1 << 10)) |
(offset << 25));
}
#endif
static void
BladeSetupForCPUToScreenColorExpand(ScrnInfoPtr pScrn,
int fg, int bg,
int rop,
unsigned int planemask)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
pTrident->BltScanDirection = 0;
BLADE_OUT(0x2148, XAAGetCopyROP(rop));
if (bg == -1) {
pTrident->BltScanDirection |= (2 << 19);
REPLICATE(fg);
BLADE_OUT(0x2160, fg);
BLADE_OUT(0x2164, ~fg);
} else {
pTrident->BltScanDirection |= (3 << 19);
REPLICATE(fg);
REPLICATE(bg);
BLADE_OUT(0x2160, fg);
BLADE_OUT(0x2164, bg);
}
#if 0
REPLICATE(planemask);
if (planemask != -1) {
BLADE_OUT(0x2184, ~planemask);
pTrident->BltScanDirection |= (1 << 5);
}
#endif
}
static void
BladeSubsequentCPUToScreenColorExpand(ScrnInfoPtr pScrn,
int x, int y,
int w, int h,
int skipleft)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
if (skipleft)
BladeSetClippingRectangle(pScrn,
x + skipleft, y,
(x + w - 1), (y + h - 1));
BLADE_OUT(0x2144, 0xE0000000 |
pTrident->BltScanDirection |
(1 << 4) |
(skipleft ? 1 : 0));
BLADE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff));
BLADE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
((x + w - 1) & 0xfff));
}
static void
BladeSetupForMono8x8PatternFill(ScrnInfoPtr pScrn,
int patternx, int patterny,
int fg, int bg,
int rop,
unsigned int planemask)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
BladeSync(pScrn);
BLADE_OUT(0x2148, XAAGetPatternROP(rop));
if (bg == -1) {
REPLICATE(fg);
BLADE_OUT(0x216C, 0x80000000 | (1 << 30));
BLADE_OUT(0x216C, 0x80000000 | (1 << 28) | (1 << 30));
BLADE_OUT(0x2170, patternx);
BLADE_OUT(0x2170, patterny);
BLADE_OUT(0x2174, fg);
#if 0
BLADE_OUT(0x2178, ~fg);
#endif
} else {
REPLICATE(fg);
REPLICATE(bg);
BLADE_OUT(0x216C, 0x80000000);
BLADE_OUT(0x216C, 0x80000000 | (1 << 28));
BLADE_OUT(0x2170, patternx);
BLADE_OUT(0x2170, patterny);
BLADE_OUT(0x2174, fg);
BLADE_OUT(0x2178, bg);
}
pTrident->BltScanDirection = 0;
#if 0
REPLICATE(planemask);
if (planemask != -1) {
BLADE_OUT(0x2184, ~planemask);
pTrident->BltScanDirection |= (1 << 5);
}
#endif
}
static void
BladeSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn,
int patternx, int patterny,
int x, int y,
int w, int h)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
int clip = 0;
if (pTrident->Clipping) clip = 1;
BLADE_OUT(0x2144, 0x20000000 |
pTrident->BltScanDirection |
(7 << 12) | (1 << 4) |
(1 << 19) | (2 << 2) | clip);
BLADE_OUT(0x2108, (y << 16) | x);
BLADE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
((x + w - 1) & 0xfff));
}
#if 0
static void
BladeSetupForColor8x8PatternFill(ScrnInfoPtr pScrn,
int patternx, int patterny,
int rop,
unsigned int planemask,
int transparency_color)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
TGUI_PATLOC(((patterny *
pScrn->displayWidth *
(pScrn->bitsPerPixel / 8)) +
(patternx *
(pScrn->bitsPerPixel / 8))) >> 6);
pTrident->BltScanDirection = 0;
if (transparency_color != -1) {
BLADE_OUT(0x2168, transparency_color & 0xffffff);
pTrident->BltScanDirection |= (1 << 6);
}
TGUI_FMIX(XAAGetPatternROP(rop));
REPLICATE(planemask);
if (planemask != -1) {
BLADE_OUT(0x2184, ~planemask);
pTrident->BltScanDirection |= (1 << 5);
}
}
static void
BladeSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn,
int patternx, int patterny,
int x, int y,
int w, int h)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
TGUI_DEST_XY(x, y);
TGUI_DIM_XY(w, h);
TGUI_COMMAND(GE_BLT);
CHECKCLIPPING;
}
#endif
static void
BladeSetupForImageWrite(ScrnInfoPtr pScrn,
int rop,
unsigned int planemask,
int transparency_color,
int bpp, int depth)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
BLADE_OUT(0x2148, XAAGetCopyROP(rop));
pTrident->BltScanDirection = 0;
#if 0
REPLICATE(planemask);
if (planemask != -1) {
BLADE_OUT(0x2184, ~planemask);
pTrident->BltScanDirection |= (1 << 5);
}
#endif
}
static void
BladeSubsequentImageWriteRect(ScrnInfoPtr pScrn,
int x, int y,
int w, int h,
int skipleft)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
if (skipleft)
BladeSetClippingRectangle(pScrn,
x + skipleft, y,
(x + w - 1), (y + h - 1));
BLADE_OUT(0x2144, 0xE0000000 |
(1 << 19) | (1 << 4) |
pTrident->BltScanDirection |
(skipleft ? 1 : 0));
BLADE_OUT(0x2108, (y << 16) | (x & 0xfff));
BLADE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
((x + w - 1) & 0xfff));
}
#endif

View File

@@ -1,788 +0,0 @@
/*
* Copyright 1997-2003 by Alan Hourihane, North Wales, UK.
*
* 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 Alan
* Hourihane not be used in advertising or publicity pertaining to
* distribution of the software without specific, written prior
* permission. Alan Hourihane makes no representations about the
* suitability of this software for any purpose. It is provided
* "as is" without express or implied warranty.
*
* ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
* SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS, IN NO EVENT SHALL ALAN HOURIHANE 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.
*
* Authors: Alan Hourihane, <alanh@fairlite.demon.co.uk>
*
* Trident 3DImage' accelerated options.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "xf86.h"
#include "xf86_OSproc.h"
#include "xf86Pci.h"
#include "miline.h"
#include "trident.h"
#include "trident_regs.h"
#ifdef HAVE_XAA_H
#include "xaarop.h"
#include "xaalocal.h"
static void ImageSync(ScrnInfoPtr pScrn);
static void ImageSyncClip(ScrnInfoPtr pScrn);
#if 0
static void ImageSetupForSolidLine(ScrnInfoPtr pScrn,
int color,
int rop,
unsigned int planemask);
static void ImageSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn,
int x, int y,
int dmaj, int dmin,
int e, int len,
int octant);
#endif
static void ImageSetupForFillRectSolid(ScrnInfoPtr pScrn,
int color,
int rop,
unsigned int planemask);
static void ImageSubsequentFillRectSolid(ScrnInfoPtr pScrn,
int x, int y,
int w, int h);
static void ImageSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
int x1, int y1,
int x2, int y2,
int w, int h);
static void ImageSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
int xdir, int ydir,
int rop,
unsigned int planemask,
int transparency_color);
static void ImageSetClippingRectangle(ScrnInfoPtr pScrn,
int x1, int y1,
int x2, int y2);
static void ImageDisableClipping(ScrnInfoPtr pScrn);
static void ImageSetupForMono8x8PatternFill(ScrnInfoPtr pScrn,
int patternx,
int patterny,
int fg, int bg,
int rop,
unsigned int planemask);
static void ImageSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn,
int patternx,
int patterny,
int x, int y,
int w, int h);
#if 0
static void ImageSetupForColor8x8PatternFill(ScrnInfoPtr pScrn,
int patternx,
int patterny,
int rop,
unsigned int planemask,
int trans_col);
static void ImageSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn,
int patternx,
int patterny,
int x, int y,
int w, int h);
#endif
static void ImageSetupForScanlineImageWrite(ScrnInfoPtr pScrn,
int rop,
unsigned int planemask,
int transparency_color,
int bpp,
int depth);
static void ImageSubsequentScanlineImageWriteRect(ScrnInfoPtr pScrn,
int x, int y,
int w, int h,
int skipleft);
static void ImageSubsequentImageWriteScanline(ScrnInfoPtr pScrn,
int bufno);
static void ImageSetupForScanlineCPUToScreenColorExpandFill(
ScrnInfoPtr pScrn,
int fg, int bg,
int rop,
unsigned int planemask);
static void ImageSubsequentScanlineCPUToScreenColorExpandFill(
ScrnInfoPtr pScrn,
int x, int y,
int w, int h,
int skipleft);
static void ImageSubsequentColorExpandScanline(ScrnInfoPtr pScrn,
int bufno);
static void
ImageInitializeAccelerator(ScrnInfoPtr pScrn)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
switch (pScrn->depth) {
case 8:
pTrident->EngineOperation = 0;
break;
case 15:
pTrident->EngineOperation = 5;
break;
case 16:
pTrident->EngineOperation = 1;
break;
case 24:
pTrident->EngineOperation = 2;
break;
}
IMAGE_OUT(0x2120, 0xF0000000);
IMAGE_OUT(0x2120, 0x40000000 | pTrident->EngineOperation);
IMAGE_OUT(0x2120, 0x80000000);
IMAGE_OUT(0x2144, 0x00000000);
IMAGE_OUT(0x2148, 0x00000000);
IMAGE_OUT(0x2150, 0x00000000);
IMAGE_OUT(0x2154, 0x00000000);
IMAGE_OUT(0x2120, 0x60000000 |
(pScrn->displayWidth << 16) |
pScrn->displayWidth);
IMAGE_OUT(0x216C, 0x00000000);
IMAGE_OUT(0x2170, 0x00000000);
IMAGE_OUT(0x217C, 0x00000000);
IMAGE_OUT(0x2120, 0x10000000);
IMAGE_OUT(0x2130, (2047 << 16) | 2047);
pTrident->Clipping = FALSE;
pTrident->DstEnable = FALSE;
}
#endif
Bool
ImageAccelInit(ScreenPtr pScreen)
{
#ifdef HAVE_XAA_H
XAAInfoRecPtr infoPtr;
ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
if (pTrident->NoAccel)
return FALSE;
pTrident->AccelInfoRec = infoPtr = XAACreateInfoRec();
if (!infoPtr) return FALSE;
pTrident->InitializeAccelerator = ImageInitializeAccelerator;
ImageInitializeAccelerator(pScrn);
infoPtr->Flags = PIXMAP_CACHE |
LINEAR_FRAMEBUFFER |
OFFSCREEN_PIXMAPS;
infoPtr->Sync = ImageSync;
#if 0
infoPtr->SetClippingRectangle = ImageSetClippingRectangle;
infoPtr->DisableClipping = ImageDisableClipping;
infoPtr->ClippingFlags = HARDWARE_CLIP_SOLID_FILL |
HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY |
HARDWARE_CLIP_MONO_8x8_FILL;
#endif
#if 0
infoPtr->SolidLineFlags = NO_PLANEMASK;
infoPtr->SetupForSolidLine = ImageSetupForSolidLine;
infoPtr->SolidBresenhamLineErrorTermBits = 13;
infoPtr->SubsequentSolidBresenhamLine =
ImageSubsequentSolidBresenhamLine;
infoPtr->ClippingFlags |= HARDWARE_CLIP_SOLID_LINE;
#endif
infoPtr->SolidFillFlags = NO_PLANEMASK;
infoPtr->SetupForSolidFill = ImageSetupForFillRectSolid;
infoPtr->SubsequentSolidFillRect = ImageSubsequentFillRectSolid;
infoPtr->ScreenToScreenCopyFlags = NO_PLANEMASK |
NO_TRANSPARENCY |
ONLY_TWO_BITBLT_DIRECTIONS;
infoPtr->SetupForScreenToScreenCopy =
ImageSetupForScreenToScreenCopy;
infoPtr->SubsequentScreenToScreenCopy =
ImageSubsequentScreenToScreenCopy;
infoPtr->Mono8x8PatternFillFlags = NO_PLANEMASK |
BIT_ORDER_IN_BYTE_MSBFIRST |
HARDWARE_PATTERN_SCREEN_ORIGIN |
HARDWARE_PATTERN_PROGRAMMED_BITS;
infoPtr->SetupForMono8x8PatternFill =
ImageSetupForMono8x8PatternFill;
infoPtr->SubsequentMono8x8PatternFillRect =
ImageSubsequentMono8x8PatternFillRect;
#if 0
infoPtr->Color8x8PatternFillFlags = NO_PLANEMASK |
NO_TRANSPARENCY |
HARDWARE_PATTERN_SCREEN_ORIGIN |
BIT_ORDER_IN_BYTE_MSBFIRST;
infoPtr->SetupForColor8x8PatternFill =
ImageSetupForColor8x8PatternFill;
infoPtr->SubsequentColor8x8PatternFillRect =
ImageSubsequentColor8x8PatternFillRect;
infoPtr->ClippingFlags |= HARDWARE_CLIP_COLOR_8x8_FILL;
#endif
if (pTrident->Chipset != CYBER9397DVD) {
/*
* It seems as though the 9397DVD doesn't like the transfer
* window. But then, I've also tried at the two port
* addresses too, with no luck. Disable for this chipset for
* now. I'd guess there's some extra setup needed for this
* chipset.
*/
infoPtr->ScanlineCPUToScreenColorExpandFillFlags =
NO_PLANEMASK |
LEFT_EDGE_CLIPPING |
BIT_ORDER_IN_BYTE_MSBFIRST;
pTrident->XAAScanlineColorExpandBuffers[0] =
XNFalloc(((pScrn->virtualX + 63)) * 4 *
(pScrn->bitsPerPixel / 8));
infoPtr->NumScanlineColorExpandBuffers = 1;
infoPtr->ScanlineColorExpandBuffers =
pTrident->XAAScanlineColorExpandBuffers;
infoPtr->SetupForScanlineCPUToScreenColorExpandFill =
ImageSetupForScanlineCPUToScreenColorExpandFill;
infoPtr->SubsequentScanlineCPUToScreenColorExpandFill =
ImageSubsequentScanlineCPUToScreenColorExpandFill;
infoPtr->SubsequentColorExpandScanline =
ImageSubsequentColorExpandScanline;
infoPtr->ScanlineImageWriteFlags = NO_PLANEMASK |
LEFT_EDGE_CLIPPING;
infoPtr->SetupForScanlineImageWrite =
ImageSetupForScanlineImageWrite;
infoPtr->SubsequentScanlineImageWriteRect =
ImageSubsequentScanlineImageWriteRect;
infoPtr->SubsequentImageWriteScanline =
ImageSubsequentImageWriteScanline;
infoPtr->NumScanlineImageWriteBuffers = 1;
infoPtr->ScanlineImageWriteBuffers =
pTrident->XAAImageScanlineBuffer;
pTrident->XAAImageScanlineBuffer[0] =
XNFalloc(pScrn->virtualX * pScrn->bitsPerPixel / 8);
infoPtr->ImageWriteBase = pTrident->IOBase + 0x10000;
}
return(XAAInit(pScreen, infoPtr));
#else
return FALSE;
#endif
}
#ifdef HAVE_XAA_H
static void
ImageSync(ScrnInfoPtr pScrn)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
int busy;
int cnt = 5000000;
if (pTrident->Clipping) ImageDisableClipping(pScrn);
if (pTrident->DstEnable) {
IMAGE_OUT(0x2120, 0x70000000);
pTrident->DstEnable = FALSE;
}
IMAGEBUSY(busy);
while (busy != 0) {
if (--cnt < 0) {
ErrorF("GE timeout\n");
IMAGE_OUT(0x2164, 0x80000000);
}
IMAGEBUSY(busy);
}
}
static void
ImageSyncClip(ScrnInfoPtr pScrn)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
int busy;
int cnt = 5000000;
IMAGEBUSY(busy);
while (busy != 0) {
if (--cnt < 0) {
ErrorF("GE timeout\n");
IMAGE_OUT(0x2164, 0x80000000);
}
IMAGEBUSY(busy);
}
}
static void
ImageSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
int xdir, int ydir,
int rop,
unsigned int planemask,
int transparency_color)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
pTrident->BltScanDirection = 0;
if ((xdir < 0) || (ydir < 0))
pTrident->BltScanDirection |= (1 << 2);
IMAGE_OUT(0x2120, 0x80000000);
IMAGE_OUT(0x2120, 0x90000000 | XAAGetCopyROP(rop));
if (transparency_color != -1) {
IMAGE_OUT(0x2120, 0x70000000 |
(1 << 26) |
(transparency_color & 0xffffff));
pTrident->DstEnable = TRUE;
}
}
static void
ImageSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
int x1, int y1,
int x2, int y2,
int w, int h)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
if (pTrident->BltScanDirection) {
IMAGE_OUT(0x2100, ((y1 + h - 1) << 16) | (x1 + w - 1));
IMAGE_OUT(0x2104, (y1 << 16) | x1);
IMAGE_OUT(0x2108, ((y2 + h - 1) << 16) | (x2 + w - 1));
IMAGE_OUT(0x210C, y2<<16 | x2);
} else {
IMAGE_OUT(0x2100, (y1 << 16) | x1);
IMAGE_OUT(0x2104, ((y1 + h - 1) << 16) | (x1 + w - 1));
IMAGE_OUT(0x2108, (y2 << 16) | x2);
IMAGE_OUT(0x210C, ((y2 + h - 1) << 16) | (x2 + w - 1));
}
IMAGE_OUT(0x2124, 0x80000000 |
(1 << 7) | (1 << 22) | (1 << 10) |
pTrident->BltScanDirection |
(pTrident->Clipping ? 1 : 0));
if (!pTrident->UsePCIRetry)
ImageSyncClip(pScrn);
}
static void
ImageSetClippingRectangle(ScrnInfoPtr pScrn,
int x1, int y1,
int x2, int y2)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
IMAGE_OUT(0x2120, 0x10000000 |
((y1 & 0xfff) << 16) | (x1 & 0xfff));
IMAGE_OUT(0x2130, ((y2 & 0xfff) << 16) | (x2 & 0xfff));
pTrident->Clipping = TRUE;
}
static void
ImageDisableClipping(ScrnInfoPtr pScrn)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
pTrident->Clipping = FALSE;
}
#if 0
static void
ImageSetupForSolidLine(ScrnInfoPtr pScrn,
int color,
int rop,
unsigned int planemask)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
REPLICATE(color);
IMAGE_OUT(0x2120, 0x84000000);
IMAGE_OUT(0x2120, 0x90000000 | XAAGetCopyROP(rop));
IMAGE_OUT(0x2144, color);
}
static void
ImageSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn,
int x, int y,
int dmaj, int dmin,
int e, int len, int octant)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
int tmp;
int D = 0, E = 0, ymajor = 0;
IMAGE_OUT(0x2124, 0x20000000 |
(3 << 22) | (1 << 10) | (1 << 9) |
(pTrident->Clipping ? 1 : 0));
if (!(octant & YMAJOR)) {
if ((!(octant & XDECREASING)) && (!(octant & YDECREASING))) {
E = 1;
D = 0;
}
if ((!(octant & XDECREASING)) && ( (octant & YDECREASING))) {
E = 1;
D = 1;
}
if (( (octant & XDECREASING)) && (!(octant & YDECREASING))) {
E = 1;
D = 2;
}
if (( (octant & XDECREASING)) && ( (octant & YDECREASING))) {
E = 1;
D = 3;
}
ymajor = 0;
} else {
if ((!(octant & XDECREASING)) && (!(octant & YDECREASING))) {
E = 0;
D = 0;
}
if ((!(octant & XDECREASING)) && ( (octant & YDECREASING))) {
E = 0;
D = 2;
}
if (( (octant & XDECREASING)) && (!(octant & YDECREASING))) {
E = 0;
D = 1;
}
if (( (octant & XDECREASING)) && ( (octant & YDECREASING))) {
E = 0;
D = 3;
}
ymajor = (1 << 18);
}
if (E) {
tmp = x;
x = y;
y = tmp;
}
if (D & 0x02) {
IMAGE_OUT(0x21FC, 0x20000000 |
(1 << 27) | (1 << 19) | (1 << 17) |
ymajor | (x + len - 1));
} else {
IMAGE_OUT(0x21FC, 0x20000000 |
(1 << 27) | (1 << 19) | (1 << 17) |
ymajor | ( y + len - 1));
}
IMAGE_OUT(0x2100, (E << 30) | ((y & 0xfff) << 16) | (x & 0xfff));
IMAGE_OUT(0x2104, (D << 30) |
(((dmaj - dmin) & 0xfff) << 16) |
(-dmin & 0xfff));
IMAGE_OUT(0x2108, ((-e & 0xfff) << 16));
if (!pTrident->UsePCIRetry)
ImageSyncClip(pScrn);
}
#endif
static void
ImageSetupForFillRectSolid(ScrnInfoPtr pScrn,
int color,
int rop,
unsigned int planemask)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
REPLICATE(color);
IMAGE_OUT(0x2120, 0x80000000);
IMAGE_OUT(0x2120, 0x90000000 | XAAGetCopyROP(rop));
IMAGE_OUT(0x2144, color);
}
static void
ImageSubsequentFillRectSolid(ScrnInfoPtr pScrn,
int x, int y,
int w, int h)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
if ((w <= 0) || (h <= 0))
return;
IMAGE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff));
IMAGE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
((x + w - 1) & 0xfff));
IMAGE_OUT(0x2124, 0x80000000 |
(3 << 22) | (1 << 10) | (1 << 9) |
(pTrident->Clipping ? 1 : 0));
if (!pTrident->UsePCIRetry)
ImageSyncClip(pScrn);
}
static void
MoveDWORDS(register CARD32* dest,
register CARD32* src,
register int dwords )
{
Bool extra = FALSE;
if (dwords & 0x01) extra = TRUE;
while(dwords & ~0x03) {
*dest = *src;
*(dest + 1) = *(src + 1);
*(dest + 2) = *(src + 2);
*(dest + 3) = *(src + 3);
src += 4;
dest += 4;
dwords -= 4;
}
if(!dwords) {
if (extra) *dest = 0x00000000;
return;
}
*dest = *src;
if(dwords == 1) {
if (extra) *(dest + 1) = 0x00000000;
return;
}
*(dest + 1) = *(src + 1);
if(dwords == 2) {
if (extra) *(dest + 2) = 0x00000000;
return;
}
*(dest + 2) = *(src + 2);
if (extra) *(dest + 3) = 0x00000000;
}
static void
ImageSetupForMono8x8PatternFill(ScrnInfoPtr pScrn,
int patternx, int patterny,
int fg, int bg,
int rop,
unsigned int planemask)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
IMAGE_OUT(0x2120, 0x90000000 | XAAGetPatternROP(rop));
if (bg == -1) {
REPLICATE(fg);
IMAGE_OUT(0x2120, 0x80000000 | (1 << 27));
IMAGE_OUT(0x2130, patternx);
IMAGE_OUT(0x2134, patterny);
IMAGE_OUT(0x2150, fg);
IMAGE_OUT(0x2154, ~fg);
} else {
REPLICATE(bg);
REPLICATE(fg);
IMAGE_OUT(0x2120, 0x80000000 | (1 << 27) | (1 << 26));
IMAGE_OUT(0x2130, patternx);
IMAGE_OUT(0x2134, patterny);
IMAGE_OUT(0x2150, fg);
IMAGE_OUT(0x2154, bg);
}
}
static void
ImageSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn,
int patternx, int patterny,
int x, int y,
int w, int h)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
IMAGE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff));
IMAGE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
((x + w - 1) & 0xfff));
IMAGE_OUT(0x2124, 0x80000000 |
(7 << 18) | (1 << 22) | (1 << 10) | (1 << 9) |
(pTrident->Clipping ? 1 : 0));
if (!pTrident->UsePCIRetry)
ImageSyncClip(pScrn);
}
#if 0
static void
ImageSetupForColor8x8PatternFill(ScrnInfoPtr pScrn,
int patternx, int patterny,
int rop,
unsigned int planemask,
int transparency_color)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
IMAGE_OUT(0x2120, 0x90000000 | XAAGetPatternROP(rop));
IMAGE_OUT(0x2120, 0x80000000 | (1 << 26));
if (transparency_color != -1) {
IMAGE_OUT(0x2120, 0x70000000 |
(1 << 26) |
(transparency_color & 0xffffff));
pTrident->DstEnable = TRUE;
}
}
static void
ImageSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn,
int patternx, int patterny,
int x, int y,
int w, int h)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
IMAGE_OUT(0x2100, ((patterny & 0xfff) << 16) |
(patternx & 0xfff));
IMAGE_OUT(0x2104, (((patterny + h - 1) & 0xfff) << 16) |
((patternx + w - 1) & 0xfff));
IMAGE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff));
IMAGE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
((x + w - 1) & 0xfff));
IMAGE_OUT(0x2124, 0x80000000 |
(1 << 22) | (1 << 10) | (1 << 7) |
(pTrident->Clipping ? 1 : 0));
if (!pTrident->UsePCIRetry)
ImageSyncClip(pScrn);
}
#endif
static void
ImageSetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
int fg, int bg,
int rop,
unsigned int planemask
){
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
IMAGE_OUT(0x2120, 0x80000000);
IMAGE_OUT(0x2120, 0x90000000 | XAAGetCopyROP(rop));
if (bg == -1) {
pTrident->ROP = (2 << 22);
REPLICATE(fg);
IMAGE_OUT(0x2144, fg);
IMAGE_OUT(0x2148, ~fg);
} else {
pTrident->ROP = (3 << 22);
REPLICATE(fg);
IMAGE_OUT(0x2144, fg);
REPLICATE(bg);
IMAGE_OUT(0x2148, bg);
}
}
static void
ImageSubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
int x, int y,
int w, int h,
int skipleft
){
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
ImageSetClippingRectangle(pScrn,(x + skipleft), y,
(x + w - 1), (y + h - 1));
IMAGE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff));
IMAGE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
((x + w - 1) & 0xfff));
IMAGE_OUT(0x2124, 0x80000000 | (pTrident->ROP) | (1 << 10) | 1);
pTrident->dwords = (w + 31) >> 5;
pTrident->h = h;
}
static void
ImageSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
XAAInfoRecPtr infoRec;
infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
MoveDWORDS((CARD32*)infoRec->ImageWriteBase,
(CARD32*)pTrident->XAAScanlineColorExpandBuffers[bufno],
pTrident->dwords);
pTrident->h--;
if (!pTrident->h)
ImageSync(pScrn);
}
static void
ImageSetupForScanlineImageWrite(ScrnInfoPtr pScrn,
int rop,
unsigned int planemask,
int transparency_color,
int bpp, int depth)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
IMAGE_OUT(0x2120, 0x90000000 | XAAGetCopyROP(rop));
if (transparency_color != -1) {
IMAGE_OUT(0x2120, 0x70000000 |
(1 << 26) |
(transparency_color & 0xffffff));
pTrident->DstEnable = TRUE;
}
IMAGE_OUT(0x2120, 0x80000000);
}
static void
ImageSubsequentScanlineImageWriteRect(ScrnInfoPtr pScrn,
int x, int y,
int w, int h,
int skipleft)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
ImageSetClippingRectangle(pScrn,
(x + skipleft), y,
(x + w - 1), (y + h - 1));
IMAGE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff));
IMAGE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
((x + w - 1) & 0xfff));
IMAGE_OUT(0x2124, 0x80000000 |
(1 << 22) | (1 << 10) | 1);
pTrident->dwords = ((w * (pScrn->bitsPerPixel / 8)) + 3) >> 2;
pTrident->h = h;
}
static void
ImageSubsequentImageWriteScanline(ScrnInfoPtr pScrn, int bufno)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
XAAInfoRecPtr infoRec;
infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
MoveDWORDS((CARD32*)infoRec->ImageWriteBase,
(CARD32*)pTrident->XAAImageScanlineBuffer[bufno],
pTrident->dwords);
pTrident->h--;
if (!pTrident->h)
ImageSync(pScrn);
}
#endif

View File

@@ -1,738 +0,0 @@
/*
* Copyright 1992-2003 by Alan Hourihane, North Wales, UK.
*
* 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 Alan
* Hourihane not be used in advertising or publicity pertaining to
* distribution of the software without specific, written prior
* permission. Alan Hourihane makes no representations about the
* suitability of this software for any purpose. It is provided
* "as is" without express or implied warranty.
*
* ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
* SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS, IN NO EVENT SHALL ALAN HOURIHANE 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.
*
* Authors: Alan Hourihane, <alanh@fairlite.demon.co.uk>
*
* Trident accelerated options.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "xf86.h"
#include "xf86_OSproc.h"
#include "xf86Pci.h"
#include "miline.h"
#include "trident.h"
#include "trident_regs.h"
#ifdef HAVE_XAA_H
#include "xaalocal.h"
#include "xaarop.h"
static void TridentSync(ScrnInfoPtr pScrn);
static void TridentSetupForDashedLine(ScrnInfoPtr pScrn,
int fg, int bg,
int rop,
unsigned int planemask,
int length,
unsigned char *pattern);
static void TridentSubsequentDashedBresenhamLine(ScrnInfoPtr pScrn,
int x, int y,
int dmaj, int dmin,
int e, int len,
int octant,
int phase);
static void TridentSetupForSolidLine(ScrnInfoPtr pScrn,
int color,
int rop,
unsigned int planemask);
static void TridentSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn,
int x, int y,
int dmaj, int dmin,
int e, int len,
int octant);
static void TridentSubsequentSolidHorVertLine(ScrnInfoPtr pScrn,
int x, int y,
int len, int dir);
static void TridentSetupForFillRectSolid(ScrnInfoPtr pScrn,
int color,
int rop,
unsigned int planemask);
static void TridentSubsequentFillRectSolid(ScrnInfoPtr pScrn,
int x, int y,
int w, int h);
static void TridentSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
int x1, int y1,
int x2, int y2,
int w, int h);
static void TridentSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
int xdir, int ydir,
int rop,
unsigned int planemask,
int transparency_color);
static void TridentSetupForMono8x8PatternFill(ScrnInfoPtr pScrn,
int patternx,
int patterny,
int fg, int bg,
int rop,
unsigned int planemask);
static void TridentSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn,
int patternx,
int patterny,
int x, int y,
int w, int h);
#if 0
static void TridentSetupForColor8x8PatternFill(ScrnInfoPtr pScrn,
int patternx,
int patterny,
int rop,
unsigned int planemask,
int trans_col);
static void TridentSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn,
int patternx,
int patterny,
int x, int y,
int w, int h);
#endif
#if 0
static void TridentSetupForScanlineCPUToScreenColorExpandFill(
ScrnInfoPtr pScrn,
int fg, int bg,
int rop,
unsigned int planemask);
static void TridentSubsequentScanlineCPUToScreenColorExpandFill(
ScrnInfoPtr pScrn,
int x, int y,
int w, int h,
int skipleft);
static void TridentSubsequentColorExpandScanline(ScrnInfoPtr pScrn,
int bufno);
#endif
static void
TridentInitializeAccelerator(ScrnInfoPtr pScrn)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
/* This forces updating the clipper */
pTrident->Clipping = TRUE;
CHECKCLIPPING;
if ((pTrident->Chipset == PROVIDIA9682) ||
(pTrident->Chipset == CYBER9385) ||
(pTrident->Chipset == CYBER9382))
pTrident->EngineOperation |= 0x100; /* Disable Clipping */
TGUI_OPERMODE(pTrident->EngineOperation);
pTrident->PatternLocation = pScrn->displayWidth *
pScrn->bitsPerPixel / 8;
}
#endif
Bool
TridentAccelInit(ScreenPtr pScreen)
{
#ifdef HAVE_XAA_H
XAAInfoRecPtr infoPtr;
ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
if (pTrident->NoAccel)
return FALSE;
pTrident->AccelInfoRec = infoPtr = XAACreateInfoRec();
if (!infoPtr) return FALSE;
if (!((pTrident->Chipset == TGUI9440AGi) &&
(pScrn->bitsPerPixel > 8)))
infoPtr->Flags = PIXMAP_CACHE |
OFFSCREEN_PIXMAPS |
LINEAR_FRAMEBUFFER;
pTrident->InitializeAccelerator = TridentInitializeAccelerator;
TridentInitializeAccelerator(pScrn);
infoPtr->PixmapCacheFlags = DO_NOT_BLIT_STIPPLES;
infoPtr->Sync = TridentSync;
infoPtr->SolidLineFlags = NO_PLANEMASK;
infoPtr->SetupForSolidLine = TridentSetupForSolidLine;
infoPtr->SolidBresenhamLineErrorTermBits = 12;
infoPtr->SubsequentSolidBresenhamLine =
TridentSubsequentSolidBresenhamLine;
infoPtr->SubsequentSolidHorVertLine =
TridentSubsequentSolidHorVertLine;
infoPtr->DashedLineFlags = LINE_PATTERN_MSBFIRST_LSBJUSTIFIED |
NO_PLANEMASK |
LINE_PATTERN_POWER_OF_2_ONLY;
infoPtr->SetupForDashedLine = TridentSetupForDashedLine;
infoPtr->DashedBresenhamLineErrorTermBits = 12;
infoPtr->SubsequentDashedBresenhamLine =
TridentSubsequentDashedBresenhamLine;
infoPtr->DashPatternMaxLength = 16;
infoPtr->SolidFillFlags = NO_PLANEMASK;
infoPtr->SetupForSolidFill = TridentSetupForFillRectSolid;
infoPtr->SubsequentSolidFillRect = TridentSubsequentFillRectSolid;
infoPtr->ScreenToScreenCopyFlags = NO_PLANEMASK;
if (!HAS_DST_TRANS)
infoPtr->ScreenToScreenCopyFlags |= NO_TRANSPARENCY;
infoPtr->SetupForScreenToScreenCopy =
TridentSetupForScreenToScreenCopy;
infoPtr->SubsequentScreenToScreenCopy =
TridentSubsequentScreenToScreenCopy;
if (!(((pTrident->Chipset == PROVIDIA9685) ||
(pTrident->Chipset == CYBER9388)) &&
(pScrn->bitsPerPixel > 8))) {
infoPtr->Mono8x8PatternFillFlags = NO_PLANEMASK |
HARDWARE_PATTERN_SCREEN_ORIGIN |
BIT_ORDER_IN_BYTE_MSBFIRST;
infoPtr->SetupForMono8x8PatternFill =
TridentSetupForMono8x8PatternFill;
infoPtr->SubsequentMono8x8PatternFillRect =
TridentSubsequentMono8x8PatternFillRect;
}
#if 0
/*
* Not convinced this works 100% yet.
*/
infoPtr->Color8x8PatternFillFlags = NO_PLANEMASK |
HARDWARE_PATTERN_SCREEN_ORIGIN |
BIT_ORDER_IN_BYTE_MSBFIRST;
if (!HAS_DST_TRANS)
infoPtr->Color8x8PatternFillFlags |= NO_TRANSPARENCY;
infoPtr->SetupForColor8x8PatternFill =
TridentSetupForColor8x8PatternFill;
infoPtr->SubsequentColor8x8PatternFillRect =
TridentSubsequentColor8x8PatternFillRect;
#endif
#if 0
/*
* This is buggy, it only seems to work 95% of the time....
*/
{
infoPtr->ScanlineCPUToScreenColorExpandFillFlags =
NO_PLANEMASK |
NO_TRANSPARENCY |
BIT_ORDER_IN_BYTE_MSBFIRST;
pTrident->XAAScanlineColorExpandBuffers[0] =
XNFalloc(((pScrn->virtualX + 63)) * 4 *
(pScrn->bitsPerPixel / 8));
infoPtr->NumScanlineColorExpandBuffers = 1;
infoPtr->ScanlineColorExpandBuffers =
pTrident->XAAScanlineColorExpandBuffers;
infoPtr->SetupForScanlineCPUToScreenColorExpandFill =
TridentSetupForScanlineCPUToScreenColorExpandFill;
infoPtr->SubsequentScanlineCPUToScreenColorExpandFill =
TridentSubsequentScanlineCPUToScreenColorExpandFill;
infoPtr->SubsequentColorExpandScanline =
TridentSubsequentColorExpandScanline;
}
#endif
return(XAAInit(pScreen, infoPtr));
#else
return FALSE;
#endif
}
#ifdef HAVE_XAA_H
static void
TridentSync(ScrnInfoPtr pScrn)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
int count = 0, timeout = 0;
int busy;
TGUI_OPERMODE(pTrident->EngineOperation);
for (;;) {
BLTBUSY(busy);
if (busy != GE_BUSY) {
return;
}
count++;
if (count == 10000000) {
ErrorF("Trident: BitBLT engine time-out.\n");
count = 9990000;
timeout++;
if (timeout == 8) {
/* Reset BitBLT Engine */
TGUI_STATUS(0x00);
return;
}
}
}
}
static void
TridentClearSync(ScrnInfoPtr pScrn)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
int count = 0, timeout = 0;
int busy;
for (;;) {
BLTBUSY(busy);
if (busy != GE_BUSY) {
return;
}
count++;
if (count == 10000000) {
ErrorF("Trident: BitBLT engine time-out.\n");
count = 9990000;
timeout++;
if (timeout == 8) {
/* Reset BitBLT Engine */
TGUI_STATUS(0x00);
return;
}
}
}
}
static void
TridentSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
int xdir, int ydir,
int rop,
unsigned int planemask,
int transparency_color)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
int dst = 0;
pTrident->BltScanDirection = 0;
if (xdir < 0) pTrident->BltScanDirection |= XNEG;
if (ydir < 0) pTrident->BltScanDirection |= YNEG;
REPLICATE(transparency_color);
if (transparency_color != -1) {
if ((pTrident->Chipset == PROVIDIA9685) ||
(pTrident->Chipset == CYBER9388)) {
dst |= (1 << 16);
} else {
TGUI_OPERMODE(pTrident->EngineOperation | DST_ENABLE);
}
TGUI_CKEY(transparency_color);
}
TGUI_DRAWFLAG(pTrident->DrawFlag | pTrident->BltScanDirection |
SCR2SCR | dst);
TGUI_FMIX(XAAGetCopyROP(rop));
}
static void
TridentSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
int x1, int y1,
int x2, int y2,
int w, int h)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
if (pTrident->BltScanDirection & YNEG) {
y1 = y1 + h - 1;
y2 = y2 + h - 1;
}
if (pTrident->BltScanDirection & XNEG) {
x1 = x1 + w - 1;
x2 = x2 + w - 1;
}
TGUI_SRC_XY(x1,y1);
TGUI_DEST_XY(x2, y2);
TGUI_DIM_XY(w, h);
TGUI_COMMAND(GE_BLT);
TridentClearSync(pScrn);
}
static void
TridentSetupForSolidLine(ScrnInfoPtr pScrn,
int color,
int rop,
unsigned int planemask)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
pTrident->BltScanDirection = 0;
REPLICATE(color);
TGUI_FMIX(XAAGetPatternROP(rop));
if ((pTrident->Chipset == PROVIDIA9685) ||
(pTrident->Chipset == CYBER9388)) {
TGUI_FPATCOL(color);
} else {
TGUI_FCOLOUR(color);
}
}
static void
TridentSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn,
int x, int y,
int dmaj, int dmin,
int e, int len, int octant)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
int tmp = pTrident->BltScanDirection;
if (octant & YMAJOR) tmp |= YMAJ;
if (octant & XDECREASING) tmp |= XNEG;
if (octant & YDECREASING) tmp |= YNEG;
TGUI_DRAWFLAG(pTrident->DrawFlag | SOLIDFILL | STENCIL | tmp);
TGUI_SRC_XY(dmin-dmaj,dmin);
TGUI_DEST_XY(x, y);
TGUI_DIM_XY(dmin + e, len);
TGUI_COMMAND(GE_BRESLINE);
TridentSync(pScrn);
}
static void
TridentSubsequentSolidHorVertLine(ScrnInfoPtr pScrn,
int x, int y,
int len, int dir)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
TGUI_DRAWFLAG(pTrident->DrawFlag | SOLIDFILL);
if (dir == DEGREES_0) {
TGUI_DIM_XY(len, 1);
TGUI_DEST_XY(x, y);
} else {
TGUI_DIM_XY(1, len);
TGUI_DEST_XY(x, y);
}
TGUI_COMMAND(GE_BLT);
TridentSync(pScrn);
}
void
TridentSetupForDashedLine(ScrnInfoPtr pScrn,
int fg, int bg,
int rop,
unsigned int planemask,
int length,
unsigned char *pattern)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
CARD32 *DashPattern = (CARD32*)pattern;
CARD32 NiceDashPattern = DashPattern[0];
NiceDashPattern = *((CARD16 *)pattern) & ((1 << length) - 1);
switch(length) {
case 2: NiceDashPattern |= NiceDashPattern << 2;
case 4: NiceDashPattern |= NiceDashPattern << 4;
case 8: NiceDashPattern |= NiceDashPattern << 8;
}
pTrident->BltScanDirection = 0;
REPLICATE(fg);
if ((pTrident->Chipset == PROVIDIA9685) ||
(pTrident->Chipset == CYBER9388)) {
TGUI_FPATCOL(fg);
if (bg == -1) {
pTrident->BltScanDirection |= (1 << 12);
TGUI_BPATCOL(~fg);
} else {
REPLICATE(bg);
TGUI_BPATCOL(bg);
}
} else {
TGUI_FCOLOUR(fg);
if (bg == -1) {
pTrident->BltScanDirection |= (1 << 12);
TGUI_BCOLOUR(~fg);
} else {
REPLICATE(bg);
TGUI_BCOLOUR(bg);
}
}
TGUI_FMIX(XAAGetPatternROP(rop));
pTrident->LinePattern = NiceDashPattern;
}
void
TridentSubsequentDashedBresenhamLine(ScrnInfoPtr pScrn,
int x, int y,
int dmaj, int dmin,
int e, int len,
int octant, int phase)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
int tmp = pTrident->BltScanDirection;
if (octant & YMAJOR) tmp |= YMAJ;
if (octant & XDECREASING) tmp |= XNEG;
if (octant & YDECREASING) tmp |= YNEG;
TGUI_STYLE(((pTrident->LinePattern >> phase) |
(pTrident->LinePattern << (16-phase))) & 0x0000FFFF);
TGUI_DRAWFLAG(pTrident->DrawFlag | STENCIL | tmp);
TGUI_SRC_XY(dmin - dmaj, dmin);
TGUI_DEST_XY(x, y);
TGUI_DIM_XY(e + dmin, len);
TGUI_COMMAND(GE_BRESLINE);
TridentSync(pScrn);
}
static void
TridentSetupForFillRectSolid(ScrnInfoPtr pScrn,
int color,
int rop,
unsigned int planemask)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
int drawflag = 0;
REPLICATE(color);
TGUI_FMIX(XAAGetPatternROP(rop));
if ((pTrident->Chipset == PROVIDIA9685) ||
(pTrident->Chipset == CYBER9388)) {
TGUI_FPATCOL(color);
} else {
drawflag |= PATMONO;
TGUI_FCOLOUR(color);
}
TGUI_DRAWFLAG(pTrident->DrawFlag | SOLIDFILL | drawflag);
}
static void
TridentSubsequentFillRectSolid(ScrnInfoPtr pScrn,
int x, int y,
int w, int h)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
TGUI_DIM_XY(w, h);
TGUI_DEST_XY(x, y);
TGUI_COMMAND(GE_BLT);
TridentSync(pScrn);
}
#if 0
static void
MoveDWORDS(register CARD32* dest,
register CARD32* src,
register int dwords)
{
while(dwords & ~0x03) {
*dest = *src;
*(dest + 1) = *(src + 1);
*(dest + 2) = *(src + 2);
*(dest + 3) = *(src + 3);
src += 4;
dest += 4;
dwords -= 4;
}
if (!dwords) return;
*dest = *src;
dest += 1;
src += 1;
if (dwords == 1) return;
*dest = *src;
dest += 1;
src += 1;
if (dwords == 2) return;
*dest = *src;
dest += 1;
src += 1;
}
#endif
static void
TridentSetupForMono8x8PatternFill(ScrnInfoPtr pScrn,
int patternx, int patterny,
int fg, int bg,
int rop,
unsigned int planemask)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
int drawflag = 0;
REPLICATE(fg);
if ((pTrident->Chipset == PROVIDIA9685) ||
(pTrident->Chipset == CYBER9388))
TGUI_FPATCOL(fg);
else
TGUI_FCOLOUR(fg);
if (bg == -1) {
drawflag |= (1 << 12);
if ((pTrident->Chipset == PROVIDIA9685) ||
(pTrident->Chipset == CYBER9388))
TGUI_BPATCOL(~fg);
else
TGUI_BCOLOUR(~fg);
} else {
REPLICATE(bg);
if ((pTrident->Chipset == PROVIDIA9685) ||
(pTrident->Chipset == CYBER9388))
TGUI_BPATCOL(bg);
else
TGUI_BCOLOUR(bg);
}
if ((pTrident->Chipset == PROVIDIA9685) ||
(pTrident->Chipset == CYBER9388)) {
drawflag |= (7 << 18);
}
TGUI_DRAWFLAG(pTrident->DrawFlag | PAT2SCR | PATMONO | drawflag);
TGUI_PATLOC(((patterny * pTrident->PatternLocation) +
(patternx * pScrn->bitsPerPixel / 8)) >> 6);
TGUI_FMIX(XAAGetPatternROP(rop));
}
static void
TridentSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn,
int patternx, int patterny,
int x, int y,
int w, int h)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
TGUI_DEST_XY(x, y);
TGUI_DIM_XY(w, h);
TGUI_COMMAND(GE_BLT);
TridentSync(pScrn);
}
#if 0
static void
TridentSetupForColor8x8PatternFill(ScrnInfoPtr pScrn,
int patternx, int patterny,
int rop,
unsigned int planemask,
int transparency_color)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
int drawflag = 0;
REPLICATE(transparency_color);
if (transparency_color != -1) {
if ((pTrident->Chipset == PROVIDIA9685) ||
(pTrident->Chipset == CYBER9388)) {
drawflag |= (1 << 16);
} else {
TGUI_OPERMODE(pTrident->EngineOperation | DST_ENABLE);
}
TGUI_CKEY(transparency_color);
}
TGUI_DRAWFLAG(pTrident->DrawFlag | PAT2SCR | drawflag);
TGUI_PATLOC(((patterny * pTrident->PatternLocation) +
(patternx * pScrn->bitsPerPixel / 8)) >> 6);
TGUI_FMIX(XAAGetPatternROP(rop));
}
static void
TridentSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn,
int patternx, int patterny,
int x, int y,
int w, int h)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
TGUI_DEST_XY(x, y);
TGUI_DIM_XY(w, h);
TGUI_COMMAND(GE_BLT);
TridentClearSync(pScrn);
}
#endif
#if 0
static void
TridentSetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
int fg, int bg,
int rop,
unsigned int planemask)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
int drawflag = SRCMONO;
REPLICATE(fg);
TGUI_FCOLOUR(fg);
if (bg == -1) {
drawflag |= (1 << 12);
TGUI_BCOLOUR(~fg);
} else {
REPLICATE(bg);
TGUI_BCOLOUR(bg);
}
TGUI_SRC_XY(0, 0);
TGUI_DRAWFLAG(drawflag);
TGUI_FMIX(XAAGetCopyROP(rop));
}
static void
TridentSubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
int x, int y,
int w, int h,
int skipleft)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
pTrident->dwords = ((w + 31) >> 5);
pTrident->h = h;
pTrident->y = y;
pTrident->x = x;
pTrident->w = w;
TGUI_DEST_XY(x, pTrident->y++);
TGUI_DIM_XY(w, 1);
TGUI_COMMAND(GE_BLT);
}
static void
TridentSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
XAAInfoRecPtr infoRec;
infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
MoveDWORDS((CARD32 *)pTrident->FbBase,
(CARD32 *)pTrident->XAAScanlineColorExpandBuffers[0],
pTrident->dwords);
pTrident->h--;
TridentSync(pScrn);
if (pTrident->h) {
TGUI_DEST_XY(pTrident->x, pTrident->y++);
TGUI_DIM_XY(pTrident->w, 1);
TGUI_COMMAND(GE_BLT);
}
}
#endif
#endif

View File

@@ -34,9 +34,6 @@
#include "exa.h"
#include "xf86Cursor.h"
#ifdef HAVE_XAA_H
#include "xaa.h"
#endif
#include "xf86fbman.h"
#include "compiler.h"
#include "vgaHW.h"
@@ -168,9 +165,6 @@ typedef struct {
vbeInfoPtr pVbe;
#ifdef VBE_INFO
vbeModeInfoPtr vbeModes;
#endif
#ifdef HAVE_XAA_H
XAAInfoRecPtr AccelInfoRec;
#endif
CloseScreenProcPtr CloseScreen;
ScreenBlockHandlerProcPtr BlockHandler;
@@ -178,8 +172,6 @@ typedef struct {
int panelWidth;
int panelHeight;
unsigned int (*ddc1Read)(ScrnInfoPtr);
CARD8* XAAScanlineColorExpandBuffers[2];
CARD8* XAAImageScanlineBuffer[1];
void (*InitializeAccelerator)(ScrnInfoPtr);
void (*VideoTimerCallback)(ScrnInfoPtr, Time);
XF86VideoAdaptorPtr adaptor;
@@ -260,12 +252,7 @@ Bool TVGAInit(ScrnInfoPtr pScrn, DisplayModePtr mode);
void TridentRestore(ScrnInfoPtr pScrn, TRIDENTRegPtr tridentReg);
void TridentSave(ScrnInfoPtr pScrn, TRIDENTRegPtr tridentReg);
Bool TridentInit(ScrnInfoPtr pScrn, DisplayModePtr mode);
Bool TridentAccelInit(ScreenPtr pScreen);
Bool XPAccelInit(ScreenPtr pScreen);
Bool XP4XaaInit(ScreenPtr pScreen);
Bool XP4ExaInit(ScreenPtr pScreen);
Bool ImageAccelInit(ScreenPtr pScreen);
Bool BladeXaaInit(ScreenPtr pScreen);
Bool BladeExaInit(ScreenPtr pScreen);
Bool TridentHWCursorInit(ScreenPtr pScreen);
int TridentFindMode(int xres, int yres, int depth);

View File

@@ -39,15 +39,6 @@ static Bool TRIDENT_OpenFramebuffer(ScrnInfoPtr, char **, unsigned char **,
static Bool TRIDENT_SetMode(ScrnInfoPtr, DGAModePtr);
static int TRIDENT_GetViewport(ScrnInfoPtr);
static void TRIDENT_SetViewport(ScrnInfoPtr, int, int, int);
#ifdef HAVE_XAA_H
static void TRIDENT_Sync(ScrnInfoPtr);
static void TRIDENT_FillRect(ScrnInfoPtr, int, int, int, int, unsigned long);
static void TRIDENT_BlitRect(ScrnInfoPtr, int, int, int, int, int, int);
#if 0
static void TRIDENT_BlitTransRect(ScrnInfoPtr, int, int, int, int, int, int,
unsigned long);
#endif
#endif
static
DGAFunctionRec TRIDENTDGAFuncs = {
@@ -56,18 +47,7 @@ DGAFunctionRec TRIDENTDGAFuncs = {
TRIDENT_SetMode,
TRIDENT_SetViewport,
TRIDENT_GetViewport,
#ifdef HAVE_XAA_H
TRIDENT_Sync,
TRIDENT_FillRect,
TRIDENT_BlitRect,
#if 0
TRIDENT_BlitTransRect
#else
NULL
#endif
#else
NULL, NULL, NULL
#endif
};
Bool
@@ -106,10 +86,6 @@ SECOND_PASS:
currentMode->mode = pMode;
currentMode->flags = DGA_CONCURRENT_ACCESS | DGA_PIXMAP_AVAILABLE;
#ifdef HAVE_XAA_H
if(!pTrident->NoAccel)
currentMode->flags |= DGA_FILL_RECT | DGA_BLIT_RECT;
#endif
if(pMode->Flags & V_DBLSCAN)
currentMode->flags |= DGA_DOUBLESCAN;
if(pMode->Flags & V_INTERLACE)
@@ -223,69 +199,6 @@ TRIDENT_SetViewport(
pTrident->DGAViewportStatus = 0; /* TRIDENTAdjustFrame loops until finished */
}
#ifdef HAVE_XAA_H
static void
TRIDENT_FillRect (
ScrnInfoPtr pScrn,
int x, int y, int w, int h,
unsigned long color
){
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
if(pTrident->AccelInfoRec) {
(*pTrident->AccelInfoRec->SetupForSolidFill)(pScrn, color, GXcopy, ~0);
(*pTrident->AccelInfoRec->SubsequentSolidFillRect)(pScrn, x, y, w, h);
SET_SYNC_FLAG(pTrident->AccelInfoRec);
}
}
static void
TRIDENT_Sync(
ScrnInfoPtr pScrn
){
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
if(pTrident->AccelInfoRec) {
(*pTrident->AccelInfoRec->Sync)(pScrn);
}
}
static void
TRIDENT_BlitRect(
ScrnInfoPtr pScrn,
int srcx, int srcy,
int w, int h,
int dstx, int dsty
){
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
if(pTrident->AccelInfoRec) {
int xdir = ((srcx < dstx) && (srcy == dsty)) ? -1 : 1;
int ydir = (srcy < dsty) ? -1 : 1;
(*pTrident->AccelInfoRec->SetupForScreenToScreenCopy)(
pScrn, xdir, ydir, GXcopy, ~0, -1);
(*pTrident->AccelInfoRec->SubsequentScreenToScreenCopy)(
pScrn, srcx, srcy, dstx, dsty, w, h);
SET_SYNC_FLAG(pTrident->AccelInfoRec);
}
}
#if 0
static void
TRIDENT_BlitTransRect(
ScrnInfoPtr pScrn,
int srcx, int srcy,
int w, int h,
int dstx, int dsty,
unsigned long color
){
/* this one should be separate since the XAA function would
prohibit usage of ~0 as the key */
}
#endif
#endif
static Bool
TRIDENT_OpenFramebuffer(
ScrnInfoPtr pScrn,

View File

@@ -939,11 +939,6 @@ TRIDENTLeaveVT(VT_FUNC_ARGS_DECL)
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
vgaHWPtr hwp = VGAHWPTR(pScrn);
#ifdef HAVE_XAA_H
if (!pTrident->NoAccel && !pTrident->useEXA)
pTrident->AccelInfoRec->Sync(pScrn);
else
#endif
if (!pTrident->NoAccel && pTrident->useEXA)
pTrident->EXADriverPtr->WaitMarker(pScrn->pScreen, 0);
@@ -1628,13 +1623,9 @@ TRIDENTPreInit(ScrnInfoPtr pScrn, int flags)
pTrident->useEXA = TRUE;
from = X_CONFIG;
}
else if (!xf86NameCmp(s, "XAA")) {
pTrident->useEXA = FALSE;
from = X_CONFIG;
}
}
xf86DrvMsg(pScrn->scrnIndex, from, "Using %s for acceleration\n",
pTrident->useEXA ? "EXA" : "XAA");
pTrident->useEXA ? "EXA" : "none");
pTrident->HWCursor = TRUE;
if (xf86ReturnOptValBool(pTrident->Options, OPTION_SW_CURSOR, FALSE)) {
@@ -2802,15 +2793,13 @@ TRIDENTPreInit(ScrnInfoPtr pScrn, int flags)
return FALSE;
}
/* Load XAA if needed */
/* Load EXA if needed */
if (!pTrident->NoAccel) {
if (!pTrident->useEXA) {
if (!xf86LoadSubModule(pScrn, "xaa")) {
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
"Falling back to shadowfb\n");
pTrident->NoAccel = 1;
pTrident->ShadowFB = 1;
}
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
"Falling back to shadowfb\n");
pTrident->NoAccel = 1;
pTrident->ShadowFB = 1;
}
if (pTrident->useEXA) {
@@ -2904,11 +2893,6 @@ TRIDENTCloseScreen(CLOSE_SCREEN_ARGS_DECL)
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
if (pScrn->vtSema) {
#ifdef HAVE_XAA_H
if (!pTrident->NoAccel && !pTrident->useEXA)
pTrident->AccelInfoRec->Sync(pScrn);
else
#endif
if (!pTrident->NoAccel && pTrident->useEXA)
pTrident->EXADriverPtr->WaitMarker(pScreen, 0);
@@ -2918,10 +2902,6 @@ TRIDENTCloseScreen(CLOSE_SCREEN_ARGS_DECL)
TRIDENTUnmapMem(pScrn);
}
#ifdef HAVE_XAA_H
if (pTrident->AccelInfoRec)
XAADestroyInfoRec(pTrident->AccelInfoRec);
#endif
if (pTrident->EXADriverPtr) {
exaDriverFini(pScreen);
free(pTrident->EXADriverPtr);
@@ -3189,24 +3169,11 @@ TRIDENTScreenInit(SCREEN_INIT_ARGS_DECL)
(pTrident->Chipset == BLADE3D)) {
if (pTrident->useEXA)
BladeExaInit(pScreen);
else
BladeXaaInit(pScreen);
} else
if ((pTrident->Chipset == CYBERBLADEXP4) ||
(pTrident->Chipset == XP5)) {
if (pTrident->useEXA)
XP4ExaInit(pScreen);
else
XP4XaaInit(pScreen);
} else
if ((pTrident->Chipset == BLADEXP) ||
(pTrident->Chipset == CYBERBLADEXPAI1)) {
XPAccelInit(pScreen);
} else {
ImageAccelInit(pScreen);
}
} else {
TridentAccelInit(pScreen);
} else if ((pTrident->Chipset == CYBERBLADEXP4) ||
(pTrident->Chipset == XP5)) {
if (pTrident->useEXA)
XP4ExaInit(pScreen);
}
}
xf86SetBackingStore(pScreen);

View File

@@ -1,618 +0,0 @@
/*
* Copyright 1992-2003 by Alan Hourihane, North Wales, UK.
*
* 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 Alan
* Hourihane not be used in advertising or publicity pertaining to
* distribution of the software without specific, written prior
* permission. Alan Hourihane makes no representations about the
* suitability of this software for any purpose. It is provided
* "as is" without express or implied warranty.
*
* ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
* SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS, IN NO EVENT SHALL ALAN HOURIHANE 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.
*
* Authors: Alan Hourihane, <alanh@fairlite.demon.co.uk>
*
* CyberBladeXP4 accelerated options.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "xf86.h"
#include "xf86_OSproc.h"
#include "xf86Pci.h"
#include "miline.h"
#include "trident.h"
#include "trident_regs.h"
#ifdef HAVE_XAA_H
#include "xaarop.h"
static void XP4Sync(ScrnInfoPtr pScrn);
#if 0
static void XP4SetupForDashedLine(ScrnInfoPtr pScrn,
int fg, int bg,
int rop,
unsigned int planemask,
int length,
unsigned char *pattern);
static void XP4SubsequentDashedBresenhamLine(ScrnInfoPtr pScrn,
int x, int y,
int dmaj, int dmin,
int e, int len,
int octant,
int phase);
static void XP4SetupForSolidLine(ScrnInfoPtr pScrn,
int color,
int rop,
unsigned int planemask);
static void XP4SubsequentSolidBresenhamLine(ScrnInfoPtr pScrn,
int x, int y,
int dmaj, int dmin,
int e, int len,
int octant);
static void XP4SubsequentSolidHorVertLine(ScrnInfoPtr pScrn,
int x, int y,
int len, int dir);
#endif
static void XP4SetupForFillRectSolid(ScrnInfoPtr pScrn,
int color,
int rop,
unsigned int planemask);
static void XP4SubsequentFillRectSolid(ScrnInfoPtr pScrn,
int x, int y,
int w, int h);
static void XP4SubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
int x1, int y1,
int x2, int y2,
int w, int h);
static void XP4SetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
int xdir, int ydir,
int rop,
unsigned int planemask,
int transparency_color);
static void XP4SetupForMono8x8PatternFill(ScrnInfoPtr pScrn,
int patternx,
int patterny,
int fg, int bg,
int rop,
unsigned int planemask);
static void XP4SubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn,
int patternx,
int patterny,
int x, int y,
int w, int h);
#if 0
static void XP4SetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
int fg, int bg,
int rop,
unsigned int planemask);
static void XP4SubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
int x, int y,
int w, int h,
int skipleft);
#endif
static int bpp;
static int ropcode;
static void
XP4InitializeAccelerator(ScrnInfoPtr pScrn)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
int shift;
/* This forces updating the clipper */
pTrident->Clipping = TRUE;
CHECKCLIPPING;
switch (pScrn->bitsPerPixel) {
case 8:
default: /* Muffle compiler */
shift = 18;
break;
case 16:
shift = 19;
break;
case 32:
shift = 20;
break;
}
switch (pScrn->bitsPerPixel) {
case 8:
bpp = 0x40;
break;
case 16:
bpp = 0x41;
break;
case 32:
bpp = 0x42;
break;
}
MMIO_OUT32(pTrident->IOBase, 0x2154,
(pScrn->displayWidth) << shift);
MMIO_OUT32(pTrident->IOBase, 0x2150,
(pScrn->displayWidth) << shift);
}
#endif
Bool XP4XaaInit(ScreenPtr pScreen)
{
#ifdef HAVE_XAA_H
XAAInfoRecPtr infoPtr;
ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
if (pTrident->NoAccel)
return FALSE;
pTrident->AccelInfoRec = infoPtr = XAACreateInfoRec();
if (!infoPtr) return FALSE;
infoPtr->Flags = PIXMAP_CACHE | OFFSCREEN_PIXMAPS |
LINEAR_FRAMEBUFFER;
pTrident->InitializeAccelerator = XP4InitializeAccelerator;
XP4InitializeAccelerator(pScrn);
infoPtr->Sync = XP4Sync;
#if 0 /* TO DO for the XP */
infoPtr->SolidLineFlags = NO_PLANEMASK;
infoPtr->SetupForSolidLine = XP4SetupForSolidLine;
infoPtr->SolidBresenhamLineErrorTermBits = 12;
infoPtr->SubsequentSolidBresenhamLine =
XP4SubsequentSolidBresenhamLine;
infoPtr->DashedLineFlags = LINE_PATTERN_MSBFIRST_LSBJUSTIFIED |
NO_PLANEMASK |
LINE_PATTERN_POWER_OF_2_ONLY;
infoPtr->SetupForDashedLine = XP4SetupForDashedLine;
infoPtr->DashedBresenhamLineErrorTermBits = 12;
infoPtr->SubsequentDashedBresenhamLine =
XP4SubsequentDashedBresenhamLine;
infoPtr->DashPatternMaxLength = 16;
#endif
infoPtr->SolidFillFlags = NO_PLANEMASK;
infoPtr->SetupForSolidFill = XP4SetupForFillRectSolid;
infoPtr->SubsequentSolidFillRect = XP4SubsequentFillRectSolid;
#if 0
infoPtr->SubsequentSolidHorVertLine = XP4SubsequentSolidHorVertLine;
#endif
infoPtr->ScreenToScreenCopyFlags = NO_PLANEMASK | NO_TRANSPARENCY;
infoPtr->SetupForScreenToScreenCopy =
XP4SetupForScreenToScreenCopy;
infoPtr->SubsequentScreenToScreenCopy =
XP4SubsequentScreenToScreenCopy;
infoPtr->Mono8x8PatternFillFlags = NO_PLANEMASK |
HARDWARE_PATTERN_PROGRAMMED_BITS |
HARDWARE_PATTERN_SCREEN_ORIGIN |
BIT_ORDER_IN_BYTE_MSBFIRST;
infoPtr->SetupForMono8x8PatternFill =
XP4SetupForMono8x8PatternFill;
infoPtr->SubsequentMono8x8PatternFillRect =
XP4SubsequentMono8x8PatternFillRect;
#if 0
infoPtr->CPUToScreenColorExpandFillFlags = NO_PLANEMASK |
BIT_ORDER_IN_BYTE_MSBFIRST;
infoPtr->ColorExpandBase = pTrident->D3Base;
infoPtr->ColorExpandRange = pScrn->displayWidth;
infoPtr->SetupForCPUToScreenColorExpandFill =
XP4SetupForCPUToScreenColorExpandFill;
infoPtr->SubsequentCPUToScreenColorExpandFill =
XP4SubsequentCPUToScreenColorExpandFill;
#endif
return(XAAInit(pScreen, infoPtr));
#else
return FALSE;
#endif
}
#ifdef HAVE_XAA_H
static void
XP4Sync(ScrnInfoPtr pScrn)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
int count = 0, timeout = 0;
int busy;
for (;;) {
BLTBUSY(busy);
if (busy != GE_BUSY) {
return;
}
count++;
if (count == 10000000) {
ErrorF("XP: BitBLT engine time-out.\n");
count = 9990000;
timeout++;
if (timeout == 4) {
/* Reset BitBLT Engine */
TGUI_STATUS(0x00);
return;
}
}
}
}
static void
XP4SetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
int xdir, int ydir,
int rop,
unsigned int planemask,
int transparency_color)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
int dst = 0;
pTrident->BltScanDirection = 0;
if (xdir < 0) pTrident->BltScanDirection |= XNEG;
if (ydir < 0) pTrident->BltScanDirection |= YNEG;
REPLICATE(transparency_color);
if (transparency_color != -1) {
dst |= 3<<16;
MMIO_OUT32(pTrident->IOBase, 0x2134, transparency_color);
}
ropcode = rop;
MMIO_OUT32(pTrident->IOBase, 0x2128,
pTrident->BltScanDirection | SCR2SCR);
}
static void
XP4SubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
int x1, int y1,
int x2, int y2,
int w, int h)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
if (pTrident->BltScanDirection & YNEG) {
y1 = y1 + h - 1;
y2 = y2 + h - 1;
}
if (pTrident->BltScanDirection & XNEG) {
x1 = x1 + w - 1;
x2 = x2 + w - 1;
}
MMIO_OUT32(pTrident->IOBase, 0x2138, (x2 << 16) | y2);
MMIO_OUT32(pTrident->IOBase, 0x213C, (x1 << 16) | y1);
MMIO_OUT32(pTrident->IOBase, 0x2140, (w << 16) | h);
XP4Sync(pScrn);
MMIO_OUT32(pTrident->IOBase, 0x2124,
(XAAGetCopyROP(ropcode) << 24) |
(bpp << 8) |
1);
}
#if 0
static void
XP4SetupForSolidLine(ScrnInfoPtr pScrn,
int color,
int rop,
unsigned int planemask)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
pTrident->BltScanDirection = 0;
REPLICATE(color);
TGUI_FMIX(XAAPatternROP[rop]);
if (pTrident->Chipset >= PROVIDIA9685) {
TGUI_FPATCOL(color);
} else {
TGUI_FCOLOUR(color);
}
}
static void
XP4SubsequentSolidBresenhamLine(ScrnInfoPtr pScrn,
int x, int y,
int dmaj, int dmin,
int e, int len, int octant)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
int tmp = pTrident->BltScanDirection;
if (octant & YMAJOR) tmp |= YMAJ;
if (octant & XDECREASING) tmp |= XNEG;
if (octant & YDECREASING) tmp |= YNEG;
TGUI_DRAWFLAG(SOLIDFILL | STENCIL | tmp);
XP_SRC_XY(dmin - dmaj, dmin);
XP_DEST_XY(x, y);
XP_DIM_XY(dmin + e, len);
TGUI_COMMAND(GE_BRESLINE);
XP4Sync(pScrn);
}
static void
XP4SubsequentSolidHorVertLine(ScrnInfoPtr pScrn,
int x, int y,
int len, int dir)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
TGUI_DRAWFLAG(SOLIDFILL);
if (dir == DEGREES_0) {
XP_DIM_XY(len, 1);
XP_DEST_XY(x, y);
} else {
XP_DIM_XY(1, len);
XP_DEST_XY(x, y);
}
TGUI_COMMAND(GE_BLT);
XP4Sync(pScrn);
}
void
XP4SetupForDashedLine(ScrnInfoPtr pScrn,
int fg, int bg,
int rop,
unsigned int planemask,
int length,
unsigned char *pattern)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
CARD32 *DashPattern = (CARD32*)pattern;
CARD32 NiceDashPattern = DashPattern[0];
NiceDashPattern = *((CARD16 *)pattern) & ((1 << length) - 1);
switch(length) {
case 2: NiceDashPattern |= NiceDashPattern << 2;
case 4: NiceDashPattern |= NiceDashPattern << 4;
case 8: NiceDashPattern |= NiceDashPattern << 8;
}
pTrident->BltScanDirection = 0;
REPLICATE(fg);
if (pTrident->Chipset >= PROVIDIA9685) {
TGUI_FPATCOL(fg);
if (bg == -1) {
pTrident->BltScanDirection |= (1 << 12);
TGUI_BPATCOL(~fg);
} else {
REPLICATE(bg);
TGUI_BPATCOL(bg);
}
} else {
TGUI_FCOLOUR(fg);
if (bg == -1) {
pTrident->BltScanDirection |= (1 << 12);
TGUI_BCOLOUR(~fg);
} else {
REPLICATE(bg);
TGUI_BCOLOUR(bg);
}
}
TGUI_FMIX(XAAPatternROP[rop]);
pTrident->LinePattern = NiceDashPattern;
}
void
XP4SubsequentDashedBresenhamLine(ScrnInfoPtr pScrn,
int x, int y,
int dmaj, int dmin,
int e, int len,
int octant, int phase)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
int tmp = pTrident->BltScanDirection;
if (octant & YMAJOR) tmp |= YMAJ;
if (octant & XDECREASING) tmp |= XNEG;
if (octant & YDECREASING) tmp |= YNEG;
TGUI_STYLE(((pTrident->LinePattern >> phase) |
(pTrident->LinePattern << (16 - phase))) & 0x0000FFFF);
TGUI_DRAWFLAG(STENCIL | tmp);
XP_SRC_XY(dmin - dmaj, dmin);
XP_DEST_XY(x, y);
XP_DIM_XY(e + dmin, len);
TGUI_COMMAND(GE_BRESLINE);
XP4Sync(pScrn);
}
#endif
static void
XP4SetupForFillRectSolid(ScrnInfoPtr pScrn,
int color,
int rop,
unsigned int planemask)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
ropcode = rop;
REPLICATE(color);
MMIO_OUT32(pTrident->IOBase, 0x2158, color);
MMIO_OUT32(pTrident->IOBase, 0x2128, 1 << 14);
}
static void
XP4SubsequentFillRectSolid(ScrnInfoPtr pScrn,
int x, int y,
int w, int h)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
MMIO_OUT32(pTrident->IOBase, 0x2138, (x << 16) | y);
MMIO_OUT32(pTrident->IOBase, 0x2140, (w << 16) | h);
XP4Sync(pScrn);
MMIO_OUT32(pTrident->IOBase, 0x2124,
(XAAGetPatternROP(ropcode) << 24) |
(bpp << 8) |
2);
}
#if 0
static void
MoveDWORDS(register CARD32* dest,
register CARD32* src,
register int dwords)
{
while(dwords & ~0x03) {
*dest = *src;
*(dest + 1) = *(src + 1);
*(dest + 2) = *(src + 2);
*(dest + 3) = *(src + 3);
src += 4;
dest += 4;
dwords -= 4;
}
if (!dwords) return;
*dest = *src;
dest += 1;
src += 1;
if (dwords == 1) return;
*dest = *src;
dest += 1;
src += 1;
if (dwords == 2) return;
*dest = *src;
dest += 1;
src += 1;
}
#endif
#if 0
static void
MoveDWORDS_FixedBase(register CARD32* dest,
register CARD32* src,
register int dwords)
{
while(dwords & ~0x03) {
*dest = *src;
*dest = *(src + 1);
*dest = *(src + 2);
*dest = *(src + 3);
dwords -= 4;
src += 4;
}
if(!dwords) return;
*dest = *src;
if(dwords == 1) return;
*dest = *(src + 1);
if(dwords == 2) return;
*dest = *(src + 2);
}
#endif
static void
XP4SetupForMono8x8PatternFill(ScrnInfoPtr pScrn,
int patternx, int patterny,
int fg, int bg,
int rop,
unsigned int planemask)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
int drawflag = 0;
REPLICATE(fg);
MMIO_OUT32(pTrident->IOBase, 0x2158, fg);
if (bg == -1) {
drawflag |= (1 << 12);
MMIO_OUT32(pTrident->IOBase, 0x215C, ~fg);
} else {
REPLICATE(bg);
MMIO_OUT32(pTrident->IOBase, 0x215C, bg);
}
ropcode = rop;
drawflag |= (7 << 18);
TGUI_DRAWFLAG(PATMONO | drawflag);
}
static void
XP4SubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn,
int patternx, int patterny,
int x, int y,
int w, int h)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
MMIO_OUT32(pTrident->IOBase, 0x2180, patternx);
MMIO_OUT32(pTrident->IOBase, 0x2184, patterny);
MMIO_OUT32(pTrident->IOBase, 0x2138, (x << 16) | y);
MMIO_OUT32(pTrident->IOBase, 0x2140, (w << 16) | h);
XP4Sync(pScrn);
MMIO_OUT32(pTrident->IOBase, 0x2124,
(XAAGetPatternROP(ropcode) << 24) |
(bpp << 8) |
2);
}
#if 0
static void
XP4SetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
int fg, int bg,
int rop,
unsigned int planemask)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
ropcode = XAAGetCopyROP(rop);
#if 0
TGUI_FMIX(XAACopyROP[rop]);
#endif
if (bg == -1) {
TGUI_DRAWFLAG(SRCMONO | (1 << 12));
REPLICATE(fg);
TGUI_FCOLOUR(fg);
} else {
TGUI_DRAWFLAG(SRCMONO);
REPLICATE(fg);
REPLICATE(bg);
TGUI_FCOLOUR(fg);
TGUI_BCOLOUR(bg);
}
}
static void
XP4SubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
int x, int y,
int w, int h,
int skipleft)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
MMIO_OUT32(pTrident->IOBase, 0x2138, (x << 16) | y);
MMIO_OUT32(pTrident->IOBase, 0x2140, (w << 16) | h);
XP4Sync(pScrn);
MMIO_OUT32(pTrident->IOBase, 0x2124, (ropcode << 24) |
(bpp << 8) |
2);
}
#endif
#endif

View File

@@ -1,653 +0,0 @@
/*
* Copyright 1992-2003 by Alan Hourihane, North Wales, UK.
*
* 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 Alan
* Hourihane not be used in advertising or publicity pertaining to
* distribution of the software without specific, written prior
* permission. Alan Hourihane makes no representations about the
* suitability of this software for any purpose. It is provided
* "as is" without express or implied warranty.
*
* ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
* SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS, IN NO EVENT SHALL ALAN HOURIHANE 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.
*
* Authors: Alan Hourihane, <alanh@fairlite.demon.co.uk>
*
* BladeXP accelerated options.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "xf86.h"
#include "xf86_OSproc.h"
#include "xf86Pci.h"
#include "miline.h"
#include "trident.h"
#include "trident_regs.h"
#ifdef HAVE_XAA_H
#include "xaarop.h"
static void XPSync(ScrnInfoPtr pScrn);
#if 0
static void XPSetupForDashedLine(ScrnInfoPtr pScrn,
int fg, int bg,
int rop,
unsigned int planemask,
int length,
unsigned char *pattern);
static void XPSubsequentDashedBresenhamLine(ScrnInfoPtr pScrn,
int x, int y,
int dmaj, int dmin,
int e, int len,
int octant, int phase);
static void XPSetupForSolidLine(ScrnInfoPtr pScrn,
int color,
int rop,
unsigned int planemask);
static void XPSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn,
int x, int y,
int dmaj, int dmin,
int e, int len,
int octant);
#endif
static void XPSubsequentSolidHorVertLine(ScrnInfoPtr pScrn,
int x, int y,
int len, int dir);
static void XPSetupForFillRectSolid(ScrnInfoPtr pScrn,
int color,
int rop,
unsigned int planemask);
static void XPSubsequentFillRectSolid(ScrnInfoPtr pScrn,
int x, int y,
int w, int h);
static void XPSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
int x1, int y1,
int x2, int y2,
int w, int h);
static void XPSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
int xdir, int ydir,
int rop,
unsigned int planemask,
int transparency_color);
static void XPSetupForMono8x8PatternFill(ScrnInfoPtr pScrn,
int patternx,
int patterny,
int fg, int bg,
int rop,
unsigned int planemask);
static void XPSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn,
int patternx,
int patterny,
int x, int y,
int w, int h);
#if 0
static void XPSetupForScanlineCPUToScreenColorExpandFill(
ScrnInfoPtr pScrn,
int fg, int bg,
int rop,
unsigned int planemask);
static void XPSubsequentScanlineCPUToScreenColorExpandFill(
ScrnInfoPtr pScrn,
int x, int y,
int w, int h,
int skipleft);
static void XPSubsequentColorExpandScanline(ScrnInfoPtr pScrn,
int bufno);
#endif
static void
XPInitializeAccelerator(ScrnInfoPtr pScrn)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
int shift;
/* This forces updating the clipper */
pTrident->Clipping = TRUE;
CHECKCLIPPING;
BLADE_XP_OPERMODE(pTrident->EngineOperation);
pTrident->EngineOperation |= 0x40;
switch (pScrn->bitsPerPixel) {
case 8:
default: /* Muffle compiler */
shift = 18;
break;
case 16:
shift = 19;
break;
case 32:
shift = 20;
break;
}
MMIO_OUT32(pTrident->IOBase, 0x2154,
(pScrn->displayWidth) << shift);
MMIO_OUT32(pTrident->IOBase, 0x2150,
(pScrn->displayWidth) << shift);
MMIO_OUT8(pTrident->IOBase, 0x2126, 3);
}
#endif
Bool XPAccelInit(ScreenPtr pScreen) {
#ifdef HAVE_XAA_H
XAAInfoRecPtr infoPtr;
ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
if (pTrident->NoAccel)
return FALSE;
pTrident->AccelInfoRec = infoPtr = XAACreateInfoRec();
if (!infoPtr) return FALSE;
infoPtr->Flags = PIXMAP_CACHE |
OFFSCREEN_PIXMAPS |
LINEAR_FRAMEBUFFER;
pTrident->InitializeAccelerator = XPInitializeAccelerator;
XPInitializeAccelerator(pScrn);
infoPtr->Sync = XPSync;
#if 0 /* TO DO for the XP */
infoPtr->SolidLineFlags = NO_PLANEMASK;
infoPtr->SetupForSolidLine = XPSetupForSolidLine;
infoPtr->SolidBresenhamLineErrorTermBits = 12;
infoPtr->SubsequentSolidBresenhamLine =
XPSubsequentSolidBresenhamLine;
infoPtr->DashedLineFlags = LINE_PATTERN_MSBFIRST_LSBJUSTIFIED |
NO_PLANEMASK |
LINE_PATTERN_POWER_OF_2_ONLY;
infoPtr->SetupForDashedLine = XPSetupForDashedLine;
infoPtr->DashedBresenhamLineErrorTermBits = 12;
infoPtr->SubsequentDashedBresenhamLine =
XPSubsequentDashedBresenhamLine;
infoPtr->DashPatternMaxLength = 16;
#endif
infoPtr->SolidFillFlags = NO_PLANEMASK;
infoPtr->SetupForSolidFill = XPSetupForFillRectSolid;
infoPtr->SubsequentSolidFillRect = XPSubsequentFillRectSolid;
infoPtr->SubsequentSolidHorVertLine = XPSubsequentSolidHorVertLine;
infoPtr->ScreenToScreenCopyFlags = NO_PLANEMASK |
NO_TRANSPARENCY;
infoPtr->SetupForScreenToScreenCopy =
XPSetupForScreenToScreenCopy;
infoPtr->SubsequentScreenToScreenCopy =
XPSubsequentScreenToScreenCopy;
infoPtr->Mono8x8PatternFillFlags = NO_PLANEMASK |
HARDWARE_PATTERN_PROGRAMMED_BITS |
BIT_ORDER_IN_BYTE_MSBFIRST;
infoPtr->SetupForMono8x8PatternFill =
XPSetupForMono8x8PatternFill;
infoPtr->SubsequentMono8x8PatternFillRect =
XPSubsequentMono8x8PatternFillRect;
#if 0 /* Needs fixing */
infoPtr->ScanlineCPUToScreenColorExpandFillFlags = NO_PLANEMASK |
BIT_ORDER_IN_BYTE_MSBFIRST;
pTrident->XAAScanlineColorExpandBuffers[0] =
XNFalloc(((pScrn->virtualX + 63)) *
4 * (pScrn->bitsPerPixel / 8));
infoPtr->NumScanlineColorExpandBuffers = 1;
infoPtr->ScanlineColorExpandBuffers =
pTrident->XAAScanlineColorExpandBuffers;
infoPtr->SetupForScanlineCPUToScreenColorExpandFill =
XPSetupForScanlineCPUToScreenColorExpandFill;
infoPtr->SubsequentScanlineCPUToScreenColorExpandFill =
XPSubsequentScanlineCPUToScreenColorExpandFill;
infoPtr->SubsequentColorExpandScanline =
XPSubsequentColorExpandScanline;
#endif
return(XAAInit(pScreen, infoPtr));
#else
return FALSE;
#endif
}
#ifdef HAVE_XAA_H
static void
XPSync(ScrnInfoPtr pScrn)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
int count = 0, timeout = 0;
int busy;
BLADE_XP_OPERMODE(pTrident->EngineOperation);
for (;;) {
BLTBUSY(busy);
if (busy != GE_BUSY) {
return;
}
count++;
if (count == 10000000) {
ErrorF("XP: BitBLT engine time-out.\n");
count = 9990000;
timeout++;
if (timeout == 8) {
/*
* Reset BitBLT Engine.
*/
TGUI_STATUS(0x00);
return;
}
}
}
}
static void
XPClearSync(ScrnInfoPtr pScrn)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
int count = 0, timeout = 0;
int busy;
for (;;) {
BLTBUSY(busy);
if (busy != GE_BUSY) {
return;
}
count++;
if (count == 10000000) {
ErrorF("XP: BitBLT engine time-out.\n");
count = 9990000;
timeout++;
if (timeout == 8) {
/*
* Reset BitBLT Engine.
*/
TGUI_STATUS(0x00);
return;
}
}
}
}
static void
XPSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
int xdir, int ydir,
int rop,
unsigned int planemask,
int transparency_color)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
int dst = 0;
pTrident->BltScanDirection = 0;
if (xdir < 0) pTrident->BltScanDirection |= XNEG;
if (ydir < 0) pTrident->BltScanDirection |= YNEG;
REPLICATE(transparency_color);
if (transparency_color != -1) {
dst |= (3 << 16);
MMIO_OUT32(pTrident->IOBase, 0x2134, transparency_color);
}
TGUI_DRAWFLAG(pTrident->BltScanDirection | SCR2SCR | dst);
TGUI_FMIX(XAAGetCopyROP(rop));
}
static void
XPSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
int x1, int y1,
int x2, int y2,
int w, int h)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
if (pTrident->BltScanDirection & YNEG) {
y1 = y1 + h - 1;
y2 = y2 + h - 1;
}
if (pTrident->BltScanDirection & XNEG) {
x1 = x1 + w - 1;
x2 = x2 + w - 1;
}
XP_SRC_XY(x1,y1);
XP_DEST_XY(x2,y2);
XP_DIM_XY(w,h);
TGUI_COMMAND(GE_BLT);
XPClearSync(pScrn);
}
#if 0
static void
XPSetupForSolidLine(ScrnInfoPtr pScrn,
int color,
int rop,
unsigned int planemask)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
pTrident->BltScanDirection = 0;
REPLICATE(color);
TGUI_FMIX(XAAGetPatternROP(rop));
if (pTrident->Chipset >= PROVIDIA9685) {
TGUI_FPATCOL(color);
} else {
TGUI_FCOLOUR(color);
}
}
static void
XPSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn,
int x, int y,
int dmaj, int dmin,
int e, int len,
int octant)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
int tmp = pTrident->BltScanDirection;
if (octant & YMAJOR) tmp |= YMAJ;
if (octant & XDECREASING) tmp |= XNEG;
if (octant & YDECREASING) tmp |= YNEG;
TGUI_DRAWFLAG(SOLIDFILL | STENCIL | tmp);
XP_SRC_XY(dmin - dmaj, dmin);
XP_DEST_XY(x, y);
XP_DIM_XY(dmin + e, len);
TGUI_COMMAND(GE_BRESLINE);
XPSync(pScrn);
}
#endif
static void
XPSubsequentSolidHorVertLine(ScrnInfoPtr pScrn,
int x, int y,
int len, int dir)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
TGUI_DRAWFLAG(SOLIDFILL);
if (dir == DEGREES_0) {
XP_DIM_XY(len, 1);
XP_DEST_XY(x, y);
} else {
XP_DIM_XY(1, len);
XP_DEST_XY(x, y);
}
TGUI_COMMAND(GE_BLT);
XPSync(pScrn);
}
#if 0
void
XPSetupForDashedLine(ScrnInfoPtr pScrn,
int fg, int bg,
int rop,
unsigned int planemask,
int length,
unsigned char *pattern)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
CARD32 *DashPattern = (CARD32*)pattern;
CARD32 NiceDashPattern = DashPattern[0];
NiceDashPattern = *((CARD16 *)pattern) & ((1 << length) - 1);
switch(length) {
case 2: NiceDashPattern |= NiceDashPattern << 2;
case 4: NiceDashPattern |= NiceDashPattern << 4;
case 8: NiceDashPattern |= NiceDashPattern << 8;
}
pTrident->BltScanDirection = 0;
REPLICATE(fg);
if (pTrident->Chipset >= PROVIDIA9685) {
TGUI_FPATCOL(fg);
if (bg == -1) {
pTrident->BltScanDirection |= (1 << 12);
TGUI_BPATCOL(~fg);
} else {
REPLICATE(bg);
TGUI_BPATCOL(bg);
}
} else {
TGUI_FCOLOUR(fg);
if (bg == -1) {
pTrident->BltScanDirection |= (1 << 12);
TGUI_BCOLOUR(~fg);
} else {
REPLICATE(bg);
TGUI_BCOLOUR(bg);
}
}
TGUI_FMIX(XAAGetPatternROP(rop));
pTrident->LinePattern = NiceDashPattern;
}
void
XPSubsequentDashedBresenhamLine(ScrnInfoPtr pScrn,
int x, int y,
int dmaj, int dmin,
int e, int len,
int octant, int phase)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
int tmp = pTrident->BltScanDirection;
if (octant & YMAJOR) tmp |= YMAJ;
if (octant & XDECREASING) tmp |= XNEG;
if (octant & YDECREASING) tmp |= YNEG;
TGUI_STYLE(((pTrident->LinePattern >> phase) |
(pTrident->LinePattern << (16 - phase))) &
0x0000FFFF);
TGUI_DRAWFLAG(STENCIL | tmp);
XP_SRC_XY(dmin - dmaj, dmin);
XP_DEST_XY(x, y);
XP_DIM_XY(e + dmin, len);
TGUI_COMMAND(GE_BRESLINE);
XPSync(pScrn);
}
#endif
static void
XPSetupForFillRectSolid(ScrnInfoPtr pScrn,
int color,
int rop, unsigned int planemask)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
REPLICATE(color);
TGUI_FMIX(XAAGetPatternROP(rop));
MMIO_OUT32(pTrident->IOBase, 0x2158, color);
TGUI_DRAWFLAG(SOLIDFILL);
}
static void
XPSubsequentFillRectSolid(ScrnInfoPtr pScrn,
int x, int y,
int w, int h)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
XP_DIM_XY(w, h);
XP_DEST_XY(x, y);
TGUI_COMMAND(GE_BLT);
XPSync(pScrn);
}
#if 0
static void MoveDWORDS(register CARD32* dest,
register CARD32* src,
register int dwords)
{
while(dwords & ~0x03) {
*dest = *src;
*(dest + 1) = *(src + 1);
*(dest + 2) = *(src + 2);
*(dest + 3) = *(src + 3);
src += 4;
dest += 4;
dwords -= 4;
}
if (!dwords) return;
*dest = *src;
dest += 1;
src += 1;
if (dwords == 1) return;
*dest = *src;
dest += 1;
src += 1;
if (dwords == 2) return;
*dest = *src;
dest += 1;
src += 1;
}
#endif
#if 0
static void
MoveDWORDS_FixedBase(register CARD32* dest,
register CARD32* src,
register int dwords)
{
while(dwords & ~0x03) {
*dest = *src;
*dest = *(src + 1);
*dest = *(src + 2);
*dest = *(src + 3);
dwords -= 4;
src += 4;
}
if(!dwords) return;
*dest = *src;
if(dwords == 1) return;
*dest = *(src + 1);
if(dwords == 2) return;
*dest = *(src + 2);
}
#endif
static void
XPSetupForMono8x8PatternFill(ScrnInfoPtr pScrn,
int patternx, int patterny,
int fg, int bg,
int rop,
unsigned int planemask)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
int drawflag = 0;
REPLICATE(fg);
MMIO_OUT32(pTrident->IOBase, 0x2158, fg);
if (bg == -1) {
drawflag |= (1 << 12);
MMIO_OUT32(pTrident->IOBase, 0x215C, ~fg);
} else {
REPLICATE(bg);
MMIO_OUT32(pTrident->IOBase, 0x215C, bg);
}
drawflag |= (7 << 18);
TGUI_DRAWFLAG(PATMONO | drawflag);
MMIO_OUT32(pTrident->IOBase, 0x2180, patternx);
MMIO_OUT32(pTrident->IOBase, 0x2184, patterny);
TGUI_FMIX(XAAGetPatternROP(rop));
}
static void
XPSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn,
int patternx, int patterny,
int x, int y,
int w, int h)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
XP_DEST_XY(x, y);
XP_DIM_XY(w, h);
TGUI_COMMAND(GE_BLT);
XPSync(pScrn);
}
#if 0
static void
XPSetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
int fg, int bg,
int rop,
unsigned int planemask)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
TGUI_FMIX(XAAGetCopyROP(rop));
if (bg == -1) {
TGUI_DRAWFLAG(SRCMONO | (1 << 12));
REPLICATE(fg);
TGUI_FCOLOUR(fg);
} else {
TGUI_DRAWFLAG(SRCMONO);
REPLICATE(fg);
REPLICATE(bg);
TGUI_FCOLOUR(fg);
TGUI_BCOLOUR(bg);
}
}
static void
XPSubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
int x, int y,
int w, int h,
int skipleft)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
pTrident->dwords = (w + 31) >> 5;
pTrident->h = h;
XP_DEST_XY(x, y);
XP_DIM_XY(w >> 1, h);
TGUI_COMMAND(GE_BLT);
}
static void
XPSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno)
{
TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
XAAInfoRecPtr infoRec;
infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
MoveDWORDS_FixedBase((CARD32 *)pTrident->IOBase + 0x2160,
(CARD32 *)pTrident->XAAScanlineColorExpandBuffers[0],
pTrident->dwords);
pTrident->h--;
if (pTrident->h)
XPSync(pScrn);
}
#endif
#endif