[PATCH xf86-video-trident 3/3] Rename image_accel.c to image_xaa.c
Kevin Brace
kevinbrace at gmx.com
Tue Feb 19 20:37:37 UTC 2019
Signed-off-by: Kevin Brace <kevinbrace at gmx.com>
---
src/Makefile.am | 2 +-
src/image_accel.c | 788 ------------------------------------------------------
src/image_xaa.c | 788 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 789 insertions(+), 789 deletions(-)
delete mode 100644 src/image_accel.c
create mode 100644 src/image_xaa.c
diff --git a/src/Makefile.am b/src/Makefile.am
index 6c230ed..f2dc14c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -33,7 +33,7 @@ trident_drv_la_SOURCES = \
blade_accel.c \
blade_accel_exa.c \
compat-api.h \
- image_accel.c \
+ image_xaa.c \
tgui_xaa.c \
trident_bank.c \
trident_dac.c \
diff --git a/src/image_accel.c b/src/image_accel.c
deleted file mode 100644
index b90e0d3..0000000
--- a/src/image_accel.c
+++ /dev/null
@@ -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 at 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
diff --git a/src/image_xaa.c b/src/image_xaa.c
new file mode 100644
index 0000000..b90e0d3
--- /dev/null
+++ b/src/image_xaa.c
@@ -0,0 +1,788 @@
+/*
+ * 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 at 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
--
2.7.4
More information about the xorg-devel
mailing list