summaryrefslogtreecommitdiff
path: root/src/smi_accel.c
diff options
context:
space:
mode:
authorDennis De Winter <de.winter.dennis@gmail.com>2007-03-04 23:17:57 -0500
committerAlex Deucher <alex@botch2.com>2007-03-13 00:17:29 -0400
commitc5b23ba581a3a4395b528d4ed824d5df986527e4 (patch)
treecb60545a1db1aa9407a80c57e6498839a7955ccd /src/smi_accel.c
parentcf83ef7685609cd9daea193b4c842d232edcf506 (diff)
Initial import of EXA support
Based on Dennis' code from bug 8721 with some minor changes by me.
Diffstat (limited to 'src/smi_accel.c')
-rw-r--r--src/smi_accel.c817
1 files changed, 2 insertions, 815 deletions
diff --git a/src/smi_accel.c b/src/smi_accel.c
index 48075f4..40c530a 100644
--- a/src/smi_accel.c
+++ b/src/smi_accel.c
@@ -34,200 +34,6 @@ authorization from the XFree86 Project and silicon Motion.
#include "smi.h"
-#include "miline.h"
-#include "xaalocal.h"
-#include "xaarop.h"
-#include "servermd.h"
-
-
-static void SMI_SetupForScreenToScreenCopy(ScrnInfoPtr, int, int, int,
- unsigned int, int);
-static void SMI_SubsequentScreenToScreenCopy(ScrnInfoPtr, int, int, int, int,
- int, int);
-static void SMI_SetupForSolidFill(ScrnInfoPtr, int, int, unsigned);
-static void SMI_SubsequentSolidFillRect(ScrnInfoPtr, int, int, int, int);
-static void SMI_SubsequentSolidHorVertLine(ScrnInfoPtr, int, int, int, int);
-static void SMI_SetupForCPUToScreenColorExpandFill(ScrnInfoPtr, int, int, int,
- unsigned int);
-static void SMI_SubsequentCPUToScreenColorExpandFill(ScrnInfoPtr, int, int, int,
- int, int);
-static void SMI_SetupForMono8x8PatternFill(ScrnInfoPtr, int, int, int, int, int,
- unsigned int);
-static void SMI_SubsequentMono8x8PatternFillRect(ScrnInfoPtr, int, int, int,
- int, int, int);
-static void SMI_SetupForColor8x8PatternFill(ScrnInfoPtr, int, int, int,
- unsigned int, int);
-static void SMI_SubsequentColor8x8PatternFillRect(ScrnInfoPtr, int, int, int,
- int, int, int);
-#if SMI_USE_IMAGE_WRITES
-static void SMI_SetupForImageWrite(ScrnInfoPtr, int, unsigned int, int, int,
- int);
-static void SMI_SubsequentImageWriteRect(ScrnInfoPtr, int, int, int, int, int);
-#endif
-static void SMI_SetClippingRectangle(ScrnInfoPtr, int, int, int, int);
-static void SMI_DisableClipping(ScrnInfoPtr);
-/* #671 */
-static void SMI_ValidatePolylines(GCPtr, unsigned long, DrawablePtr);
-static void SMI_Polylines(DrawablePtr, GCPtr, int, int, DDXPointPtr);
-
-Bool
-SMI_AccelInit(ScreenPtr pScreen)
-{
- XAAInfoRecPtr infoPtr;
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- SMIPtr pSmi = SMIPTR(pScrn);
- /*BoxRec AvailFBArea;*/
- Bool ret;
- /*int numLines, maxLines;*/
-
- ENTER_PROC("SMI_AccelInit");
-
- pSmi->AccelInfoRec = infoPtr = XAACreateInfoRec();
- if (infoPtr == NULL) {
- LEAVE_PROC("SMI_AccelInit");
- return FALSE;
- }
-
- infoPtr->Flags = PIXMAP_CACHE
- | LINEAR_FRAMEBUFFER
- | OFFSCREEN_PIXMAPS;
-
- infoPtr->Sync = SMI_AccelSync;
-
- /* Screen to screen copies */
- infoPtr->ScreenToScreenCopyFlags = NO_PLANEMASK
- | ONLY_TWO_BITBLT_DIRECTIONS;
- infoPtr->SetupForScreenToScreenCopy = SMI_SetupForScreenToScreenCopy;
- infoPtr->SubsequentScreenToScreenCopy = SMI_SubsequentScreenToScreenCopy;
- if (pScrn->bitsPerPixel == 24) {
- infoPtr->ScreenToScreenCopyFlags |= NO_TRANSPARENCY;
- }
- if ((pSmi->Chipset == SMI_LYNX3D) && (pScrn->bitsPerPixel == 8)) {
- infoPtr->ScreenToScreenCopyFlags |= GXCOPY_ONLY;
- }
-
- /* Solid Fills */
- infoPtr->SolidFillFlags = NO_PLANEMASK;
- infoPtr->SetupForSolidFill = SMI_SetupForSolidFill;
- infoPtr->SubsequentSolidFillRect = SMI_SubsequentSolidFillRect;
-
- /* Solid Lines */
- infoPtr->SolidLineFlags = NO_PLANEMASK;
- infoPtr->SetupForSolidLine = SMI_SetupForSolidFill;
- infoPtr->SubsequentSolidHorVertLine = SMI_SubsequentSolidHorVertLine;
-
- /* Color Expansion Fills */
- infoPtr->CPUToScreenColorExpandFillFlags = ROP_NEEDS_SOURCE
- | NO_PLANEMASK
- | BIT_ORDER_IN_BYTE_MSBFIRST
- | LEFT_EDGE_CLIPPING
- | CPU_TRANSFER_PAD_DWORD
- | SCANLINE_PAD_DWORD;
- infoPtr->ColorExpandBase = pSmi->DataPortBase;
- infoPtr->ColorExpandRange = pSmi->DataPortSize;
- infoPtr->SetupForCPUToScreenColorExpandFill =
- SMI_SetupForCPUToScreenColorExpandFill;
- infoPtr->SubsequentCPUToScreenColorExpandFill =
- SMI_SubsequentCPUToScreenColorExpandFill;
-
- /* 8x8 Mono Pattern Fills */
- infoPtr->Mono8x8PatternFillFlags = NO_PLANEMASK
- | HARDWARE_PATTERN_PROGRAMMED_BITS
- | HARDWARE_PATTERN_SCREEN_ORIGIN
- | BIT_ORDER_IN_BYTE_MSBFIRST;
- infoPtr->SetupForMono8x8PatternFill = SMI_SetupForMono8x8PatternFill;
- infoPtr->SubsequentMono8x8PatternFillRect =
- SMI_SubsequentMono8x8PatternFillRect;
-
- /* 8x8 Color Pattern Fills */
- if (!SMI_LYNX3D_SERIES(pSmi->Chipset) || (pScrn->bitsPerPixel != 24)) {
- infoPtr->Color8x8PatternFillFlags = NO_PLANEMASK
- | HARDWARE_PATTERN_SCREEN_ORIGIN;
- infoPtr->SetupForColor8x8PatternFill =
- SMI_SetupForColor8x8PatternFill;
- infoPtr->SubsequentColor8x8PatternFillRect =
- SMI_SubsequentColor8x8PatternFillRect;
- }
-
-#if SMI_USE_IMAGE_WRITES
- /* Image Writes */
- infoPtr->ImageWriteFlags = ROP_NEEDS_SOURCE
- | NO_PLANEMASK
- | CPU_TRANSFER_PAD_DWORD
- | SCANLINE_PAD_DWORD;
- infoPtr->ImageWriteBase = pSmi->DataPortBase;
- infoPtr->ImageWriteRange = pSmi->DataPortSize;
- infoPtr->SetupForImageWrite = SMI_SetupForImageWrite;
- infoPtr->SubsequentImageWriteRect = SMI_SubsequentImageWriteRect;
-#endif
-
- /* Clipping */
- infoPtr->ClippingFlags = HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY
- | HARDWARE_CLIP_MONO_8x8_FILL
- | HARDWARE_CLIP_COLOR_8x8_FILL
- | HARDWARE_CLIP_SOLID_FILL
- | HARDWARE_CLIP_SOLID_LINE
- | HARDWARE_CLIP_DASHED_LINE;
- infoPtr->SetClippingRectangle = SMI_SetClippingRectangle;
- infoPtr->DisableClipping = SMI_DisableClipping;
-
- /* Pixmap Cache */
- if (pScrn->bitsPerPixel == 24) {
- infoPtr->CachePixelGranularity = 16;
- } else {
- infoPtr->CachePixelGranularity = 128 / pScrn->bitsPerPixel;
- }
-
- /* Offscreen Pixmaps */
- infoPtr->maxOffPixWidth = 4096;
- infoPtr->maxOffPixHeight = 4096;
- if (pScrn->bitsPerPixel == 24) {
- infoPtr->maxOffPixWidth = 4096 / 3;
-
- if (pSmi->Chipset == SMI_LYNX) {
- infoPtr->maxOffPixHeight = 4096 / 3;
- }
- }
-
- SMI_EngineReset(pScrn);
-
-
- /* CZ 18.06.2001: moved to smi_driver.c before the NoAccel question
- to have offscreen framebuffer in NoAccel mode */
-#if 0
- maxLines = pSmi->FBReserved / (pSmi->width * pSmi->Bpp);
- if (pSmi->rotate) {
- numLines = maxLines;
- } else {
-#if SMI_USE_VIDEO
- numLines = ((pSmi->FBReserved - pSmi->width * pSmi->Bpp * pSmi->height)
- * 25 / 100 + pSmi->width * pSmi->Bpp - 1)
- / (pSmi->width * pSmi->Bpp);
- numLines += pSmi->height;
-#else
- numLines = maxLines;
-#endif
- }
-
- AvailFBArea.x1 = 0;
- AvailFBArea.y1 = 0;
- AvailFBArea.x2 = pSmi->width;
- AvailFBArea.y2 = numLines;
- xf86DrvMsg(pScrn->scrnIndex, X_INFO, "FrameBuffer Box: %d,%d - %d,%d\n",
- AvailFBArea.x1, AvailFBArea.y1, AvailFBArea.x2, AvailFBArea.y2);
- xf86InitFBManager(pScreen, &AvailFBArea);
-#endif
-
- ret = XAAInit(pScreen, infoPtr);
- if (ret && pSmi->shadowFB) /* #671 */ {
- pSmi->ValidatePolylines = infoPtr->ValidatePolylines;
- infoPtr->ValidatePolylines = SMI_ValidatePolylines;
- }
-
- LEAVE_PROC("SMI_AccelInit");
- return ret;
-}
-
void
SMI_GEReset(ScrnInfoPtr pScrn, int from_timeout, int line, char *file)
{
@@ -326,477 +132,10 @@ SMI_EngineReset(ScrnInfoPtr pScrn)
}
/******************************************************************************/
-/* Screen to Screen Copies */
-/******************************************************************************/
-
-static void
-SMI_SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, int ydir, int rop,
- unsigned int planemask, int trans)
-{
- SMIPtr pSmi = SMIPTR(pScrn);
-
- ENTER_PROC("SMI_SetupForScreenToScreenCopy");
- DEBUG((VERBLEV, "xdir=%d ydir=%d rop=%02X trans=%08X\n", xdir, ydir,
- rop, trans));
-
- pSmi->AccelCmd = XAAGetCopyROP(rop)
- | SMI_BITBLT
- | SMI_START_ENGINE;
-
- if ((xdir == -1) || (ydir == -1)) {
- pSmi->AccelCmd |= SMI_RIGHT_TO_LEFT;
- }
-
- if (trans != -1) {
- pSmi->AccelCmd |= SMI_TRANSPARENT_SRC | SMI_TRANSPARENT_PXL;
- WaitQueue(1);
- WRITE_DPR(pSmi, 0x20, trans);
- }
-
- if (pSmi->ClipTurnedOn) {
- WaitQueue(1);
- WRITE_DPR(pSmi, 0x2C, pSmi->ScissorsLeft);
- pSmi->ClipTurnedOn = FALSE;
- }
-
- LEAVE_PROC("SMI_SetupForScreenToScreenCopy");
-}
-
-static void
-SMI_SubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1, int x2,
- int y2, int w, int h)
-{
- SMIPtr pSmi = SMIPTR(pScrn);
-
- ENTER_PROC("SMI_SubsequentScreenToScreenCopy");
- DEBUG((VERBLEV, "x1=%d y1=%d x2=%d y2=%d w=%d h=%d\n", x1, y1, x2, y2, w, h));
-
- if (pSmi->AccelCmd & SMI_RIGHT_TO_LEFT) {
- x1 += w - 1;
- y1 += h - 1;
- x2 += w - 1;
- y2 += h - 1;
- }
-
- if (pScrn->bitsPerPixel == 24) {
- x1 *= 3;
- x2 *= 3;
- w *= 3;
-
- if (pSmi->Chipset == SMI_LYNX) {
- y1 *= 3;
- y2 *= 3;
- }
-
- if (pSmi->AccelCmd & SMI_RIGHT_TO_LEFT) {
- x1 += 2;
- x2 += 2;
- }
- }
-
- WaitQueue(4);
- WRITE_DPR(pSmi, 0x00, (x1 << 16) + (y1 & 0xFFFF));
- WRITE_DPR(pSmi, 0x04, (x2 << 16) + (y2 & 0xFFFF));
- WRITE_DPR(pSmi, 0x08, (w << 16) + (h & 0xFFFF));
- WRITE_DPR(pSmi, 0x0C, pSmi->AccelCmd);
-
- LEAVE_PROC("SMI_SubsequentScreenToScreenCopy");
-}
-
-/******************************************************************************/
-/* Solid Fills */
-/******************************************************************************/
-
-static void
-SMI_SetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop,
- unsigned int planemask)
-{
- SMIPtr pSmi = SMIPTR(pScrn);
-
- ENTER_PROC("SMI_SetupForSolidFill");
- DEBUG((VERBLEV, "color=%08X rop=%02X\n", color, rop));
-
- pSmi->AccelCmd = XAAGetPatternROP(rop)
- | SMI_BITBLT
- | SMI_START_ENGINE;
-
- if (pSmi->ClipTurnedOn) {
- WaitQueue(4);
- WRITE_DPR(pSmi, 0x2C, pSmi->ScissorsLeft);
- pSmi->ClipTurnedOn = FALSE;
- } else {
- WaitQueue(3);
- }
- WRITE_DPR(pSmi, 0x14, color);
- WRITE_DPR(pSmi, 0x34, 0xFFFFFFFF);
- WRITE_DPR(pSmi, 0x38, 0xFFFFFFFF);
-
- LEAVE_PROC("SMI_SetupForSolidFill");
-}
-
-void
-SMI_SubsequentSolidFillRect(ScrnInfoPtr pScrn, int x, int y, int w, int h)
-{
- SMIPtr pSmi = SMIPTR(pScrn);
-
- ENTER_PROC("SMI_SubsequentSolidFillRect");
- DEBUG((VERBLEV, "x=%d y=%d w=%d h=%d\n", x, y, w, h));
-
- if (pScrn->bitsPerPixel == 24) {
- x *= 3;
- w *= 3;
-
- if (pSmi->Chipset == SMI_LYNX) {
- y *= 3;
- }
- }
-
- WaitQueue(3);
- WRITE_DPR(pSmi, 0x04, (x << 16) | (y & 0xFFFF));
- WRITE_DPR(pSmi, 0x08, (w << 16) | (h & 0xFFFF));
- WRITE_DPR(pSmi, 0x0C, pSmi->AccelCmd);
-
- LEAVE_PROC("SMI_SubsequentSolidFillRect");
-}
-
-/******************************************************************************/
-/* Solid Lines */
-/******************************************************************************/
-
-static void
-SMI_SubsequentSolidHorVertLine(ScrnInfoPtr pScrn, int x, int y, int len,
- int dir)
-{
- SMIPtr pSmi = SMIPTR(pScrn);
- int w, h;
-
- ENTER_PROC("SMI_SubsequentSolidHorVertLine");
- DEBUG((VERBLEV, "x=%d y=%d len=%d dir=%d\n", x, y, len, dir));
-
- if (dir == DEGREES_0) {
- w = len;
- h = 1;
- } else {
- w = 1;
- h = len;
- }
-
- if (pScrn->bitsPerPixel == 24) {
- x *= 3;
- w *= 3;
-
- if (pSmi->Chipset == SMI_LYNX) {
- y *= 3;
- }
- }
-
- WaitQueue(3);
- WRITE_DPR(pSmi, 0x04, (x << 16) | (y & 0xFFFF));
- WRITE_DPR(pSmi, 0x08, (w << 16) | (h & 0xFFFF));
- WRITE_DPR(pSmi, 0x0C, pSmi->AccelCmd);
-
- LEAVE_PROC("SMI_SubsequentSolidHorVertLine");
-}
-
-/******************************************************************************/
-/* Color Expansion Fills */
-/******************************************************************************/
-
-static void
-SMI_SetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, int fg, int bg,
- int rop, unsigned int planemask)
-{
- SMIPtr pSmi = SMIPTR(pScrn);
-
- ENTER_PROC("SMI_SetupForCPUToScreenColorExpandFill");
- DEBUG((VERBLEV, "fg=%08X bg=%08X rop=%02X\n", fg, bg, rop));
-
- pSmi->AccelCmd = XAAGetCopyROP(rop)
- | SMI_HOSTBLT_WRITE
- | SMI_SRC_MONOCHROME
- | SMI_START_ENGINE;
-
- if (bg == -1) {
- pSmi->AccelCmd |= SMI_TRANSPARENT_SRC;
-
- WaitQueue(3);
- WRITE_DPR(pSmi, 0x14, fg);
- WRITE_DPR(pSmi, 0x18, ~fg);
- WRITE_DPR(pSmi, 0x20, fg);
- } else {
- WaitQueue(2);
- WRITE_DPR(pSmi, 0x14, fg);
- WRITE_DPR(pSmi, 0x18, bg);
- }
-
- LEAVE_PROC("SMI_SetupForCPUToScreenColorExpandFill");
-}
-
-void
-SMI_SubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, int x, int y, int w,
- int h, int skipleft)
-{
- SMIPtr pSmi = SMIPTR(pScrn);
-
- ENTER_PROC("SMI_SubsequentCPUToScreenColorExpandFill");
- DEBUG((VERBLEV, "x=%d y=%d w=%d h=%d skipleft=%d\n", x, y, w, h, skipleft));
-
- if (pScrn->bitsPerPixel == 24) {
- x *= 3;
- w *= 3;
- skipleft *= 3;
-
- if (pSmi->Chipset == SMI_LYNX) {
- y *= 3;
- }
- }
-
- if (skipleft) {
- WaitQueue(5);
- WRITE_DPR(pSmi, 0x2C, (pSmi->ScissorsLeft & 0xFFFF0000)
- | (x + skipleft) | 0x2000);
- pSmi->ClipTurnedOn = TRUE;
- } else {
- if (pSmi->ClipTurnedOn) {
- WaitQueue(5);
- WRITE_DPR(pSmi, 0x2C, pSmi->ScissorsLeft);
- pSmi->ClipTurnedOn = FALSE;
- } else {
- WaitQueue(4);
- }
- }
- WRITE_DPR(pSmi, 0x00, 0);
- WRITE_DPR(pSmi, 0x04, (x << 16) | (y & 0xFFFF));
- WRITE_DPR(pSmi, 0x08, (w << 16) | (h & 0xFFFF));
- WRITE_DPR(pSmi, 0x0C, pSmi->AccelCmd);
-
- LEAVE_PROC("SMI_SubsequentCPUToScreenColorExpandFill");
-}
-
-/******************************************************************************/
-/* 8x8 Mono Pattern Fills */
-/******************************************************************************/
-
-static void
-SMI_SetupForMono8x8PatternFill(ScrnInfoPtr pScrn, int patx, int paty, int fg,
- int bg, int rop, unsigned int planemask)
-{
- SMIPtr pSmi = SMIPTR(pScrn);
-
- ENTER_PROC("SMI_SetupForMono8x8PatternFill");
- DEBUG((VERBLEV, "patx=%08X paty=%08X fg=%08X bg=%08X rop=%02X\n", patx,
- paty, fg, bg, rop));
-
- pSmi->AccelCmd = XAAGetPatternROP(rop)
- | SMI_BITBLT
- | SMI_START_ENGINE;
-
- if (pSmi->ClipTurnedOn) {
- WaitQueue(1);
- WRITE_DPR(pSmi, 0x2C, pSmi->ScissorsLeft);
- pSmi->ClipTurnedOn = FALSE;
- }
-
- if (bg == -1) {
- WaitQueue(5);
- WRITE_DPR(pSmi, 0x14, fg);
- WRITE_DPR(pSmi, 0x18, ~fg);
- WRITE_DPR(pSmi, 0x20, fg);
- WRITE_DPR(pSmi, 0x34, patx);
- WRITE_DPR(pSmi, 0x38, paty);
- } else {
- WaitQueue(4);
- WRITE_DPR(pSmi, 0x14, fg);
- WRITE_DPR(pSmi, 0x18, bg);
- WRITE_DPR(pSmi, 0x34, patx);
- WRITE_DPR(pSmi, 0x38, paty);
- }
-
- LEAVE_PROC("SMI_SetupForMono8x8PatternFill");
-}
-
-static void
-SMI_SubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, int patx, int paty,
- int x, int y, int w, int h)
-{
- SMIPtr pSmi = SMIPTR(pScrn);
-
- ENTER_PROC("SMI_SubsequentMono8x8PatternFillRect");
- DEBUG((VERBLEV, "x=%d y=%d w=%d h=%d\n", x, y, w, h));
-
- if (pScrn->bitsPerPixel == 24) {
- x *= 3;
- w *= 3;
- if (pSmi->Chipset == SMI_LYNX) {
- y *= 3;
- }
- }
-
- WaitQueue(3);
- WRITE_DPR(pSmi, 0x04, (x << 16) | (y & 0xFFFF));
- WRITE_DPR(pSmi, 0x08, (w << 16) | (h & 0xFFFF));
- WRITE_DPR(pSmi, 0x0C, pSmi->AccelCmd);
-
- LEAVE_PROC("SMI_SubsequentMono8x8PatternFillRect");
-}
-
-/******************************************************************************/
-/* 8x8 Color Pattern Fills */
-/******************************************************************************/
-
-static void
-SMI_SetupForColor8x8PatternFill(ScrnInfoPtr pScrn, int patx, int paty, int rop,
- unsigned int planemask, int trans_color)
-{
- SMIPtr pSmi = SMIPTR(pScrn);
-
- ENTER_PROC("SMI_SetupForColor8x8PatternFill");
- DEBUG((VERBLEV, "patx=%d paty=%d rop=%02X trans_color=%08X\n", patx, paty,
- rop, trans_color));
-
- pSmi->AccelCmd = XAAGetPatternROP(rop)
- | SMI_BITBLT
- | SMI_COLOR_PATTERN
- | SMI_START_ENGINE;
-
- if (pScrn->bitsPerPixel <= 16) {
- /* PDR#950 */
- CARD8* pattern = pSmi->FBBase + (patx + paty * pSmi->Stride) * pSmi->Bpp;
-
- WaitIdleEmpty();
- WRITE_DPR(pSmi, 0x0C, SMI_BITBLT | SMI_COLOR_PATTERN);
- memcpy(pSmi->DataPortBase, pattern, 8 * pSmi->Bpp * 8);
- } else {
- if (pScrn->bitsPerPixel == 24) {
- patx *= 3;
-
- if (pSmi->Chipset == SMI_LYNX) {
- paty *= 3;
- }
- }
-
- WaitQueue(1);
- WRITE_DPR(pSmi, 0x00, (patx << 16) | (paty & 0xFFFF));
- }
-
- if (trans_color == -1) {
- pSmi->AccelCmd |= SMI_TRANSPARENT_SRC | SMI_TRANSPARENT_PXL;
-
- WaitQueue(1);
- WRITE_DPR(pSmi, 0x20, trans_color);
- }
-
- if (pSmi->ClipTurnedOn) {
- WaitQueue(1);
- WRITE_DPR(pSmi, 0x2C, pSmi->ScissorsLeft);
- pSmi->ClipTurnedOn = FALSE;
- }
-
- LEAVE_PROC("SMI_SetupForColor8x8PatternFill");
-}
-
-static void
-SMI_SubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn, int patx, int paty,
- int x, int y, int w, int h)
-{
- SMIPtr pSmi = SMIPTR(pScrn);
-
- ENTER_PROC("SMI_SubsequentColor8x8PatternFillRect");
- DEBUG((VERBLEV, "x=%d y=%d w=%d h=%d\n", x, y, w, h));
-
- if (pScrn->bitsPerPixel == 24) {
- x *= 3;
- w *= 3;
-
- if (pSmi->Chipset == SMI_LYNX) {
- y *= 3;
- }
- }
-
- WaitQueue(3);
- WRITE_DPR(pSmi, 0x04, (x << 16) | (y & 0xFFFF));
- WRITE_DPR(pSmi, 0x08, (w << 16) | (h & 0xFFFF)); /* PDR#950 */
- WRITE_DPR(pSmi, 0x0C, pSmi->AccelCmd);
-
- LEAVE_PROC("SMI_SubsequentColor8x8PatternFillRect");
-}
-
-#if SMI_USE_IMAGE_WRITES
-/******************************************************************************/
-/* Image Writes */
-/******************************************************************************/
-
-static void
-SMI_SetupForImageWrite(ScrnInfoPtr pScrn, int rop, unsigned int planemask,
- int trans_color, int bpp, int depth)
-{
- SMIPtr pSmi = SMIPTR(pScrn);
-
- ENTER_PROC("SMI_SetupForImageWrite");
- DEBUG((VERBLEV, "rop=%02X trans_color=%08X bpp=%d depth=%d\n", rop,
- trans_color, bpp, depth));
-
- pSmi->AccelCmd = XAAGetCopyROP(rop)
- | SMI_HOSTBLT_WRITE
- | SMI_START_ENGINE;
-
- if (trans_color != -1) {
- pSmi->AccelCmd |= SMI_TRANSPARENT_SRC | SMI_TRANSPARENT_PXL;
-
- WaitQueue(1);
- WRITE_DPR(pSmi, 0x20, trans_color);
- }
-
- LEAVE_PROC("SMI_SetupForImageWrite");
-}
-
-static void
-SMI_SubsequentImageWriteRect(ScrnInfoPtr pScrn, int x, int y, int w, int h,
- int skipleft)
-{
- SMIPtr pSmi = SMIPTR(pScrn);
-
- ENTER_PROC("SMI_SubsequentImageWriteRect");
- DEBUG((VERBLEV, "x=%d y=%d w=%d h=%d skipleft=%d\n", x, y, w, h, skipleft));
-
- if (pScrn->bitsPerPixel == 24) {
- x *= 3;
- w *= 3;
- skipleft *= 3;
-
- if (pSmi->Chipset == SMI_LYNX) {
- y *= 3;
- }
- }
-
- if (skipleft) {
- WaitQueue(5);
- WRITE_DPR(pSmi, 0x2C, (pSmi->ScissorsLeft & 0xFFFF0000) |
- (x + skipleft) | 0x2000);
- pSmi->ClipTurnedOn = TRUE;
- } else {
- if (pSmi->ClipTurnedOn) {
- WaitQueue(5);
- WRITE_DPR(pSmi, 0x2C, pSmi->ScissorsLeft);
- pSmi->ClipTurnedOn = FALSE;
- } else {
- WaitQueue(4);
- }
- }
- WRITE_DPR(pSmi, 0x00, 0);
- WRITE_DPR(pSmi, 0x04, (x << 16) | (y * 0xFFFF));
- WRITE_DPR(pSmi, 0x08, (w << 16) | (h & 0xFFFF));
- WRITE_DPR(pSmi, 0x0C, pSmi->AccelCmd);
-
- LEAVE_PROC("SMI_SubsequentImageWriteRect");
-}
-#endif
-
-/******************************************************************************/
/* Clipping */
/******************************************************************************/
-static void
+void
SMI_SetClippingRectangle(ScrnInfoPtr pScrn, int left, int top, int right,
int bottom)
{
@@ -835,7 +174,7 @@ SMI_SetClippingRectangle(ScrnInfoPtr pScrn, int left, int top, int right,
LEAVE_PROC("SMI_SetClippingRectangle");
}
-static void
+void
SMI_DisableClipping(ScrnInfoPtr pScrn)
{
SMIPtr pSmi = SMIPTR(pScrn);
@@ -862,155 +201,3 @@ SMI_DisableClipping(ScrnInfoPtr pScrn)
LEAVE_PROC("SMI_DisableClipping");
}
-/******************************************************************************/
-/* Polylines #671 */
-/******************************************************************************/
-
-/*
-
-In order to speed up the "logout" screen in rotated modes, we need to intercept
-the Polylines function. Normally, the polylines are drawn and the shadowFB is
-then sending a request of the bounding rectangle of those poylines. This should
-be okay, if it weren't for the fact that the Gnome logout screen is drawing
-polylines in rectangles and this asks for a rotation of the entire rectangle.
-This is very slow.
-
-To circumvent this slowness, we intercept the ValidatePolylines function and
-override the default "Fallback" Polylines with our own Polylines function. Our
-Polylines function first draws the polylines through the original Fallback
-function and then rotates the lines, line by line. We then set a flag and
-return control to the shadowFB which will try to rotate the bounding rectangle.
-However, the flag has been set and the RefreshArea function does nothing but
-clear the flag so the next Refresh that comes in shoiuld be handled correctly.
-
-All this code improves the speed quite a bit.
-
-*/
-
-#define IS_VISIBLE(pWin) \
-( \
- pScrn->vtSema \
- && (((WindowPtr) pWin)->visibility != VisibilityFullyObscured) \
-)
-
-#define TRIM_BOX(box, pGC) \
-{ \
- BoxPtr extents = &pGC->pCompositeClip->extents; \
- if (box.x1 < extents->x1) box.x1 = extents->x1; \
- if (box.y1 < extents->y1) box.y1 = extents->y1; \
- if (box.x2 > extents->x2) box.x2 = extents->x2; \
- if (box.y2 > extents->y2) box.y2 = extents->y2; \
-}
-
-#define TRANSLATE_BOX(box, pDraw) \
-{ \
- box.x1 += pDraw->x; \
- box.y1 += pDraw->y; \
- box.x2 += pDraw->x; \
- box.y2 += pDraw->y; \
-}
-
-#define BOX_NOT_EMPTY(box) \
- ((box.x2 > box.x1) && (box.y2 > box.y1))
-
-static void
-SMI_ValidatePolylines(GCPtr pGC, unsigned long changes, DrawablePtr pDraw)
-{
- XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC);
- SMIPtr pSmi = SMIPTR(infoRec->pScrn);
-
- ENTER_PROC("SMI_ValidatePolylines");
-
- pSmi->ValidatePolylines(pGC, changes, pDraw);
- if (pGC->ops->Polylines == XAAGetFallbackOps()->Polylines) {
- /* Override the Polylines function with our own Polylines function. */
- pGC->ops->Polylines = SMI_Polylines;
- }
-
- LEAVE_PROC("SMI_ValidatePolylines");
-}
-
-static void
-SMI_Polylines(DrawablePtr pDraw, GCPtr pGC, int mode, int npt,
- DDXPointPtr pptInit)
-{
- XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC);
- ScrnInfoPtr pScrn = infoRec->pScrn;
- SMIPtr pSmi = SMIPTR(pScrn);
-
- ENTER_PROC("SMI_Polylines");
-
- /* Call the original Polylines function. */
- pGC->ops->Polylines = XAAGetFallbackOps()->Polylines;
- (*pGC->ops->Polylines)(pDraw, pGC, mode, npt, pptInit);
- pGC->ops->Polylines = SMI_Polylines;
-
- if (IS_VISIBLE(pDraw) && npt) {
- /* Allocate a temporary buffer for all segments of the polyline. */
- BoxPtr pBox = xnfcalloc(sizeof(BoxRec), npt);
- int extra = pGC->lineWidth >> 1, box;
-
- if (npt > 1) {
- /* Adjust the extra space required per polyline segment. */
- if (pGC->joinStyle == JoinMiter) {
- extra = 6 * pGC->lineWidth;
- } else if (pGC->capStyle == CapProjecting) {
- extra = pGC->lineWidth;
- }
- }
-
- for (box = 0; --npt;) {
- /* Setup the bounding box for one polyline segment. */
- pBox[box].x1 = pptInit->x;
- pBox[box].y1 = pptInit->y;
- pptInit++;
- pBox[box].x2 = pptInit->x;
- pBox[box].y2 = pptInit->y;
- if (mode == CoordModePrevious) {
- pBox[box].x2 += pBox[box].x1;
- pBox[box].y2 += pBox[box].y1;
- }
-
- /* Sort coordinates. */
- if (pBox[box].x1 > pBox[box].x2) {
- int tmp = pBox[box].x1;
- pBox[box].x1 = pBox[box].x2;
- pBox[box].x2 = tmp;
- }
- if (pBox[box].y1 > pBox[box].y2) {
- int tmp = pBox[box].y1;
- pBox[box].y1 = pBox[box].y2;
- pBox[box].y2 = tmp;
- }
-
- /* Add extra space required for each polyline segment. */
- pBox[box].x1 -= extra;
- pBox[box].y1 -= extra;
- pBox[box].x2 += extra + 1;
- pBox[box].y2 += extra + 1;
-
- /* See if we need to draw this polyline segment. */
- TRANSLATE_BOX(pBox[box], pDraw);
- TRIM_BOX(pBox[box], pGC);
- if (BOX_NOT_EMPTY(pBox[box])) {
- box++;
- }
- }
-
- if (box) {
- /* Refresh all polyline segments now. */
- if (pSmi->Chipset == SMI_COUGAR3DR) {
- SMI_RefreshArea730(pScrn, box, pBox);
- } else {
- SMI_RefreshArea(pScrn, box, pBox);
- }
- }
-
- /* Free the temporary buffer. */
- xfree(pBox);
- }
-
- pSmi->polyLines = TRUE;
- LEAVE_PROC("SMI_Polylines");
-}
-