1d87a3195Smrg/*
2d87a3195Smrg * Copyright 1992-2003 by Alan Hourihane, North Wales, UK.
3d87a3195Smrg *
4d87a3195Smrg * Permission to use, copy, modify, distribute, and sell this software
5d87a3195Smrg * and its documentation for any purpose is hereby granted without
6d87a3195Smrg * fee, provided that the above copyright notice appear in all copies
7d87a3195Smrg * and that both that copyright notice and this permission notice
8d87a3195Smrg * appear in supporting documentation, and that the name of Alan
9d87a3195Smrg * Hourihane not be used in advertising or publicity pertaining to
10d87a3195Smrg * distribution of the software without specific, written prior
11d87a3195Smrg * permission.  Alan Hourihane makes no representations about the
12d87a3195Smrg * suitability of this software for any purpose.  It is provided
13d87a3195Smrg * "as is" without express or implied warranty.
14d87a3195Smrg *
15d87a3195Smrg * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
16d87a3195Smrg * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17d87a3195Smrg * FITNESS, IN NO EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY
18d87a3195Smrg * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19d87a3195Smrg * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
20d87a3195Smrg * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
21d87a3195Smrg * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
22d87a3195Smrg * SOFTWARE.
23d87a3195Smrg *
24d87a3195Smrg * Authors:  Alan Hourihane, <alanh@fairlite.demon.co.uk>
25d87a3195Smrg *
26d87a3195Smrg * CyberBladeXP4 accelerated options.
27d87a3195Smrg */
28d87a3195Smrg#ifdef HAVE_CONFIG_H
29d87a3195Smrg#include "config.h"
30d87a3195Smrg#endif
31d87a3195Smrg
32d87a3195Smrg#include "xf86.h"
33d87a3195Smrg#include "xf86_OSproc.h"
34d87a3195Smrg
35d87a3195Smrg#include "xf86Pci.h"
36d87a3195Smrg
37d87a3195Smrg#include "miline.h"
38d87a3195Smrg
39d87a3195Smrg#include "trident.h"
40d87a3195Smrg#include "trident_regs.h"
41d87a3195Smrg
42d87a3195Smrg#ifdef HAVE_XAA_H
43d87a3195Smrg#include "xaarop.h"
44d87a3195Smrg
45d87a3195Smrgstatic void XP4Sync(ScrnInfoPtr pScrn);
46d87a3195Smrg#if 0
47d87a3195Smrgstatic void XP4SetupForDashedLine(ScrnInfoPtr pScrn,
48d87a3195Smrg                                    int fg, int bg,
49d87a3195Smrg                                    int rop,
50d87a3195Smrg                                    unsigned int planemask,
51d87a3195Smrg                                    int length,
52d87a3195Smrg                                    unsigned char *pattern);
53d87a3195Smrgstatic void XP4SubsequentDashedBresenhamLine(ScrnInfoPtr pScrn,
54d87a3195Smrg                                                int x, int y,
55d87a3195Smrg                                                int dmaj, int dmin,
56d87a3195Smrg                                                int e, int len,
57d87a3195Smrg                                                int octant,
58d87a3195Smrg                                                int phase);
59d87a3195Smrgstatic void XP4SetupForSolidLine(ScrnInfoPtr pScrn,
60d87a3195Smrg                                    int color,
61d87a3195Smrg                                    int rop,
62d87a3195Smrg                                    unsigned int planemask);
63d87a3195Smrgstatic void XP4SubsequentSolidBresenhamLine(ScrnInfoPtr pScrn,
64d87a3195Smrg                                            int x, int y,
65d87a3195Smrg                                            int dmaj, int dmin,
66d87a3195Smrg                                            int e, int len,
67d87a3195Smrg                                            int octant);
68d87a3195Smrgstatic void XP4SubsequentSolidHorVertLine(ScrnInfoPtr pScrn,
69d87a3195Smrg                                            int x, int y,
70d87a3195Smrg                                            int len, int dir);
71d87a3195Smrg#endif
72d87a3195Smrgstatic void XP4SetupForFillRectSolid(ScrnInfoPtr pScrn,
73d87a3195Smrg                                        int color,
74d87a3195Smrg                                        int rop,
75d87a3195Smrg                                        unsigned int planemask);
76d87a3195Smrgstatic void XP4SubsequentFillRectSolid(ScrnInfoPtr pScrn,
77d87a3195Smrg                                        int x, int y,
78d87a3195Smrg                                        int w, int h);
79d87a3195Smrgstatic void XP4SubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
80d87a3195Smrg                                            int x1, int y1,
81d87a3195Smrg                                            int x2, int y2,
82d87a3195Smrg                                            int w, int h);
83d87a3195Smrgstatic void XP4SetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
84d87a3195Smrg                                            int xdir, int ydir,
85d87a3195Smrg                                            int rop,
86d87a3195Smrg                                            unsigned int planemask,
87d87a3195Smrg                                            int transparency_color);
88d87a3195Smrgstatic void XP4SetupForMono8x8PatternFill(ScrnInfoPtr pScrn,
89d87a3195Smrg                                            int patternx,
90d87a3195Smrg                                            int patterny,
91d87a3195Smrg                                            int fg, int bg,
92d87a3195Smrg                                            int rop,
93d87a3195Smrg                                            unsigned int planemask);
94d87a3195Smrgstatic void XP4SubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn,
95d87a3195Smrg                                                int patternx,
96d87a3195Smrg                                                int patterny,
97d87a3195Smrg                                                int x, int y,
98d87a3195Smrg                                                int w, int h);
99d87a3195Smrg#if 0
100d87a3195Smrgstatic void XP4SetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
101d87a3195Smrg                                            int fg, int bg,
102d87a3195Smrg                                            int rop,
103d87a3195Smrg                                            unsigned int planemask);
104d87a3195Smrgstatic void XP4SubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
105d87a3195Smrg                                                    int x, int y,
106d87a3195Smrg                                                    int w, int h,
107d87a3195Smrg                                                    int skipleft);
108d87a3195Smrg#endif
109d87a3195Smrg
110d87a3195Smrgstatic int bpp;
111d87a3195Smrgstatic int ropcode;
112d87a3195Smrg
113d87a3195Smrgstatic void
114d87a3195SmrgXP4InitializeAccelerator(ScrnInfoPtr pScrn)
115d87a3195Smrg{
116d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
117d87a3195Smrg    int shift;
118d87a3195Smrg
119d87a3195Smrg    /* This forces updating the clipper */
120d87a3195Smrg    pTrident->Clipping = TRUE;
121d87a3195Smrg
122d87a3195Smrg    CHECKCLIPPING;
123d87a3195Smrg
124d87a3195Smrg    switch (pScrn->bitsPerPixel) {
125d87a3195Smrg    case 8:
126d87a3195Smrg    default: /* Muffle compiler */
127d87a3195Smrg        shift = 18;
128d87a3195Smrg        break;
129d87a3195Smrg    case 16:
130d87a3195Smrg        shift = 19;
131d87a3195Smrg        break;
132d87a3195Smrg    case 32:
133d87a3195Smrg        shift = 20;
134d87a3195Smrg        break;
135d87a3195Smrg    }
136d87a3195Smrg
137d87a3195Smrg    switch (pScrn->bitsPerPixel) {
138d87a3195Smrg    case 8:
139d87a3195Smrg        bpp = 0x40;
140d87a3195Smrg        break;
141d87a3195Smrg    case 16:
142d87a3195Smrg        bpp = 0x41;
143d87a3195Smrg        break;
144d87a3195Smrg    case 32:
145d87a3195Smrg        bpp = 0x42;
146d87a3195Smrg        break;
147d87a3195Smrg    }
148d87a3195Smrg
149d87a3195Smrg    MMIO_OUT32(pTrident->IOBase, 0x2154,
150d87a3195Smrg                                    (pScrn->displayWidth) << shift);
151d87a3195Smrg    MMIO_OUT32(pTrident->IOBase, 0x2150,
152d87a3195Smrg                                    (pScrn->displayWidth) << shift);
153d87a3195Smrg}
154d87a3195Smrg#endif
155d87a3195Smrg
156d87a3195SmrgBool XP4XaaInit(ScreenPtr pScreen)
157d87a3195Smrg{
158d87a3195Smrg#ifdef HAVE_XAA_H
159d87a3195Smrg    XAAInfoRecPtr infoPtr;
160d87a3195Smrg    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
161d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
162d87a3195Smrg
163d87a3195Smrg    if (pTrident->NoAccel)
164d87a3195Smrg    return FALSE;
165d87a3195Smrg
166d87a3195Smrg    pTrident->AccelInfoRec = infoPtr = XAACreateInfoRec();
167d87a3195Smrg    if (!infoPtr) return FALSE;
168d87a3195Smrg
169d87a3195Smrg    infoPtr->Flags = PIXMAP_CACHE | OFFSCREEN_PIXMAPS |
170d87a3195Smrg                                    LINEAR_FRAMEBUFFER;
171d87a3195Smrg
172d87a3195Smrg    pTrident->InitializeAccelerator = XP4InitializeAccelerator;
173d87a3195Smrg    XP4InitializeAccelerator(pScrn);
174d87a3195Smrg
175d87a3195Smrg    infoPtr->Sync = XP4Sync;
176d87a3195Smrg
177d87a3195Smrg#if 0 /* TO DO for the XP */
178d87a3195Smrg    infoPtr->SolidLineFlags = NO_PLANEMASK;
179d87a3195Smrg    infoPtr->SetupForSolidLine = XP4SetupForSolidLine;
180d87a3195Smrg    infoPtr->SolidBresenhamLineErrorTermBits = 12;
181d87a3195Smrg    infoPtr->SubsequentSolidBresenhamLine =
182d87a3195Smrg                                    XP4SubsequentSolidBresenhamLine;
183d87a3195Smrg
184d87a3195Smrg    infoPtr->DashedLineFlags = LINE_PATTERN_MSBFIRST_LSBJUSTIFIED |
185d87a3195Smrg                                NO_PLANEMASK |
186d87a3195Smrg                                LINE_PATTERN_POWER_OF_2_ONLY;
187d87a3195Smrg    infoPtr->SetupForDashedLine = XP4SetupForDashedLine;
188d87a3195Smrg    infoPtr->DashedBresenhamLineErrorTermBits = 12;
189d87a3195Smrg    infoPtr->SubsequentDashedBresenhamLine =
190d87a3195Smrg                                    XP4SubsequentDashedBresenhamLine;
191d87a3195Smrg    infoPtr->DashPatternMaxLength = 16;
192d87a3195Smrg#endif
193d87a3195Smrg
194d87a3195Smrg    infoPtr->SolidFillFlags = NO_PLANEMASK;
195d87a3195Smrg    infoPtr->SetupForSolidFill = XP4SetupForFillRectSolid;
196d87a3195Smrg    infoPtr->SubsequentSolidFillRect = XP4SubsequentFillRectSolid;
197d87a3195Smrg#if 0
198d87a3195Smrg    infoPtr->SubsequentSolidHorVertLine = XP4SubsequentSolidHorVertLine;
199d87a3195Smrg#endif
200d87a3195Smrg
201d87a3195Smrg    infoPtr->ScreenToScreenCopyFlags = NO_PLANEMASK | NO_TRANSPARENCY;
202d87a3195Smrg
203d87a3195Smrg    infoPtr->SetupForScreenToScreenCopy =
204d87a3195Smrg                                        XP4SetupForScreenToScreenCopy;
205d87a3195Smrg    infoPtr->SubsequentScreenToScreenCopy =
206d87a3195Smrg                                    XP4SubsequentScreenToScreenCopy;
207d87a3195Smrg
208d87a3195Smrg    infoPtr->Mono8x8PatternFillFlags = NO_PLANEMASK |
209d87a3195Smrg                                    HARDWARE_PATTERN_PROGRAMMED_BITS |
210d87a3195Smrg                                    HARDWARE_PATTERN_SCREEN_ORIGIN |
211d87a3195Smrg                                    BIT_ORDER_IN_BYTE_MSBFIRST;
212d87a3195Smrg
213d87a3195Smrg    infoPtr->SetupForMono8x8PatternFill =
214d87a3195Smrg                                        XP4SetupForMono8x8PatternFill;
215d87a3195Smrg    infoPtr->SubsequentMono8x8PatternFillRect =
216d87a3195Smrg                                XP4SubsequentMono8x8PatternFillRect;
217d87a3195Smrg
218d87a3195Smrg#if 0
219d87a3195Smrg    infoPtr->CPUToScreenColorExpandFillFlags = NO_PLANEMASK |
220d87a3195Smrg                                        BIT_ORDER_IN_BYTE_MSBFIRST;
221d87a3195Smrg    infoPtr->ColorExpandBase = pTrident->D3Base;
222d87a3195Smrg    infoPtr->ColorExpandRange = pScrn->displayWidth;
223d87a3195Smrg
224d87a3195Smrg    infoPtr->SetupForCPUToScreenColorExpandFill =
225d87a3195Smrg                                XP4SetupForCPUToScreenColorExpandFill;
226d87a3195Smrg    infoPtr->SubsequentCPUToScreenColorExpandFill =
227d87a3195Smrg                            XP4SubsequentCPUToScreenColorExpandFill;
228d87a3195Smrg#endif
229d87a3195Smrg
230d87a3195Smrg    return(XAAInit(pScreen, infoPtr));
231d87a3195Smrg#else
232d87a3195Smrg    return FALSE;
233d87a3195Smrg#endif
234d87a3195Smrg}
235d87a3195Smrg
236d87a3195Smrg#ifdef HAVE_XAA_H
237d87a3195Smrgstatic void
238d87a3195SmrgXP4Sync(ScrnInfoPtr pScrn)
239d87a3195Smrg{
240d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
241d87a3195Smrg    int count = 0, timeout = 0;
242d87a3195Smrg    int busy;
243d87a3195Smrg
244d87a3195Smrg    for (;;) {
245d87a3195Smrg        BLTBUSY(busy);
246d87a3195Smrg        if (busy != GE_BUSY) {
247d87a3195Smrg            return;
248d87a3195Smrg        }
249d87a3195Smrg
250d87a3195Smrg        count++;
251d87a3195Smrg        if (count == 10000000) {
252d87a3195Smrg            ErrorF("XP: BitBLT engine time-out.\n");
253d87a3195Smrg            count = 9990000;
254d87a3195Smrg            timeout++;
255d87a3195Smrg            if (timeout == 4) {
256d87a3195Smrg                /* Reset BitBLT Engine */
257d87a3195Smrg                TGUI_STATUS(0x00);
258d87a3195Smrg                return;
259d87a3195Smrg            }
260d87a3195Smrg        }
261d87a3195Smrg    }
262d87a3195Smrg}
263d87a3195Smrg
264d87a3195Smrgstatic void
265d87a3195SmrgXP4SetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
266d87a3195Smrg                                int xdir, int ydir,
267d87a3195Smrg                                int rop,
268d87a3195Smrg                                unsigned int planemask,
269d87a3195Smrg                                int transparency_color)
270d87a3195Smrg{
271d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
272d87a3195Smrg    int dst = 0;
273d87a3195Smrg
274d87a3195Smrg    pTrident->BltScanDirection = 0;
275d87a3195Smrg    if (xdir < 0) pTrident->BltScanDirection |= XNEG;
276d87a3195Smrg    if (ydir < 0) pTrident->BltScanDirection |= YNEG;
277d87a3195Smrg
278d87a3195Smrg    REPLICATE(transparency_color);
279d87a3195Smrg    if (transparency_color != -1) {
280d87a3195Smrg        dst |= 3<<16;
281d87a3195Smrg        MMIO_OUT32(pTrident->IOBase, 0x2134, transparency_color);
282d87a3195Smrg    }
283d87a3195Smrg
284d87a3195Smrg    ropcode = rop;
285d87a3195Smrg
286d87a3195Smrg    MMIO_OUT32(pTrident->IOBase, 0x2128,
287d87a3195Smrg                                pTrident->BltScanDirection | SCR2SCR);
288d87a3195Smrg}
289d87a3195Smrg
290d87a3195Smrgstatic void
291d87a3195SmrgXP4SubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
292d87a3195Smrg                                int x1, int y1,
293d87a3195Smrg                                int x2, int y2,
294d87a3195Smrg                                int w, int h)
295d87a3195Smrg{
296d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
297d87a3195Smrg
298d87a3195Smrg    if (pTrident->BltScanDirection & YNEG) {
299d87a3195Smrg        y1 = y1 + h - 1;
300d87a3195Smrg        y2 = y2 + h - 1;
301d87a3195Smrg    }
302d87a3195Smrg    if (pTrident->BltScanDirection & XNEG) {
303d87a3195Smrg        x1 = x1 + w - 1;
304d87a3195Smrg        x2 = x2 + w - 1;
305d87a3195Smrg    }
306d87a3195Smrg    MMIO_OUT32(pTrident->IOBase, 0x2138, (x2 << 16) | y2);
307d87a3195Smrg    MMIO_OUT32(pTrident->IOBase, 0x213C, (x1 << 16) | y1);
308d87a3195Smrg    MMIO_OUT32(pTrident->IOBase, 0x2140, (w << 16) | h);
309d87a3195Smrg    XP4Sync(pScrn);
310d87a3195Smrg    MMIO_OUT32(pTrident->IOBase, 0x2124,
311d87a3195Smrg                                    (XAAGetCopyROP(ropcode) << 24) |
312d87a3195Smrg                                    (bpp << 8) |
313d87a3195Smrg                                    1);
314d87a3195Smrg}
315d87a3195Smrg
316d87a3195Smrg#if 0
317d87a3195Smrgstatic void
318d87a3195SmrgXP4SetupForSolidLine(ScrnInfoPtr pScrn,
319d87a3195Smrg                        int color,
320d87a3195Smrg                        int rop,
321d87a3195Smrg                        unsigned int planemask)
322d87a3195Smrg{
323d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
324d87a3195Smrg
325d87a3195Smrg    pTrident->BltScanDirection = 0;
326d87a3195Smrg    REPLICATE(color);
327d87a3195Smrg    TGUI_FMIX(XAAPatternROP[rop]);
328d87a3195Smrg    if (pTrident->Chipset >= PROVIDIA9685) {
329d87a3195Smrg        TGUI_FPATCOL(color);
330d87a3195Smrg    } else {
331d87a3195Smrg        TGUI_FCOLOUR(color);
332d87a3195Smrg    }
333d87a3195Smrg}
334d87a3195Smrg
335d87a3195Smrgstatic void
336d87a3195SmrgXP4SubsequentSolidBresenhamLine(ScrnInfoPtr pScrn,
337d87a3195Smrg                                int x, int y,
338d87a3195Smrg                                int dmaj, int dmin,
339d87a3195Smrg                                int e, int len, int octant)
340d87a3195Smrg{
341d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
342d87a3195Smrg    int tmp = pTrident->BltScanDirection;
343d87a3195Smrg
344d87a3195Smrg    if (octant & YMAJOR) tmp |= YMAJ;
345d87a3195Smrg    if (octant & XDECREASING) tmp |= XNEG;
346d87a3195Smrg    if (octant & YDECREASING) tmp |= YNEG;
347d87a3195Smrg    TGUI_DRAWFLAG(SOLIDFILL | STENCIL | tmp);
348d87a3195Smrg    XP_SRC_XY(dmin - dmaj, dmin);
349d87a3195Smrg    XP_DEST_XY(x, y);
350d87a3195Smrg    XP_DIM_XY(dmin + e, len);
351d87a3195Smrg    TGUI_COMMAND(GE_BRESLINE);
352d87a3195Smrg    XP4Sync(pScrn);
353d87a3195Smrg}
354d87a3195Smrg
355d87a3195Smrgstatic void
356d87a3195SmrgXP4SubsequentSolidHorVertLine(ScrnInfoPtr pScrn,
357d87a3195Smrg                                int x, int y,
358d87a3195Smrg                                int len, int dir)
359d87a3195Smrg{
360d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
361d87a3195Smrg
362d87a3195Smrg    TGUI_DRAWFLAG(SOLIDFILL);
363d87a3195Smrg    if (dir == DEGREES_0) {
364d87a3195Smrg        XP_DIM_XY(len, 1);
365d87a3195Smrg        XP_DEST_XY(x, y);
366d87a3195Smrg    } else {
367d87a3195Smrg        XP_DIM_XY(1, len);
368d87a3195Smrg        XP_DEST_XY(x, y);
369d87a3195Smrg    }
370d87a3195Smrg
371d87a3195Smrg    TGUI_COMMAND(GE_BLT);
372d87a3195Smrg    XP4Sync(pScrn);
373d87a3195Smrg}
374d87a3195Smrg
375d87a3195Smrgvoid
376d87a3195SmrgXP4SetupForDashedLine(ScrnInfoPtr pScrn,
377d87a3195Smrg                        int fg, int bg,
378d87a3195Smrg                        int rop,
379d87a3195Smrg                        unsigned int planemask,
380d87a3195Smrg                        int length,
381d87a3195Smrg                        unsigned char *pattern)
382d87a3195Smrg{
383d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
384d87a3195Smrg    CARD32 *DashPattern = (CARD32*)pattern;
385d87a3195Smrg    CARD32 NiceDashPattern = DashPattern[0];
386d87a3195Smrg
387d87a3195Smrg    NiceDashPattern = *((CARD16 *)pattern) & ((1 << length) - 1);
388d87a3195Smrg    switch(length) {
389d87a3195Smrg        case 2: NiceDashPattern |= NiceDashPattern << 2;
390d87a3195Smrg        case 4: NiceDashPattern |= NiceDashPattern << 4;
391d87a3195Smrg        case 8: NiceDashPattern |= NiceDashPattern << 8;
392d87a3195Smrg    }
393d87a3195Smrg    pTrident->BltScanDirection = 0;
394d87a3195Smrg    REPLICATE(fg);
395d87a3195Smrg    if (pTrident->Chipset >= PROVIDIA9685) {
396d87a3195Smrg        TGUI_FPATCOL(fg);
397d87a3195Smrg        if (bg == -1) {
398d87a3195Smrg            pTrident->BltScanDirection |= (1 << 12);
399d87a3195Smrg            TGUI_BPATCOL(~fg);
400d87a3195Smrg        } else {
401d87a3195Smrg            REPLICATE(bg);
402d87a3195Smrg            TGUI_BPATCOL(bg);
403d87a3195Smrg        }
404d87a3195Smrg    } else {
405d87a3195Smrg        TGUI_FCOLOUR(fg);
406d87a3195Smrg        if (bg == -1) {
407d87a3195Smrg            pTrident->BltScanDirection |= (1 << 12);
408d87a3195Smrg            TGUI_BCOLOUR(~fg);
409d87a3195Smrg        } else {
410d87a3195Smrg            REPLICATE(bg);
411d87a3195Smrg            TGUI_BCOLOUR(bg);
412d87a3195Smrg        }
413d87a3195Smrg    }
414d87a3195Smrg
415d87a3195Smrg    TGUI_FMIX(XAAPatternROP[rop]);
416d87a3195Smrg    pTrident->LinePattern = NiceDashPattern;
417d87a3195Smrg}
418d87a3195Smrg
419d87a3195Smrgvoid
420d87a3195SmrgXP4SubsequentDashedBresenhamLine(ScrnInfoPtr pScrn,
421d87a3195Smrg                                    int x, int y,
422d87a3195Smrg                                    int dmaj, int dmin,
423d87a3195Smrg                                    int e, int len,
424d87a3195Smrg                                    int octant, int phase)
425d87a3195Smrg{
426d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
427d87a3195Smrg    int tmp = pTrident->BltScanDirection;
428d87a3195Smrg
429d87a3195Smrg    if (octant & YMAJOR) tmp |= YMAJ;
430d87a3195Smrg    if (octant & XDECREASING) tmp |= XNEG;
431d87a3195Smrg    if (octant & YDECREASING) tmp |= YNEG;
432d87a3195Smrg
433d87a3195Smrg    TGUI_STYLE(((pTrident->LinePattern >> phase) |
434d87a3195Smrg                (pTrident->LinePattern << (16 - phase))) & 0x0000FFFF);
435d87a3195Smrg    TGUI_DRAWFLAG(STENCIL | tmp);
436d87a3195Smrg    XP_SRC_XY(dmin - dmaj, dmin);
437d87a3195Smrg    XP_DEST_XY(x, y);
438d87a3195Smrg    XP_DIM_XY(e + dmin, len);
439d87a3195Smrg    TGUI_COMMAND(GE_BRESLINE);
440d87a3195Smrg    XP4Sync(pScrn);
441d87a3195Smrg}
442d87a3195Smrg#endif
443d87a3195Smrg
444d87a3195Smrgstatic void
445d87a3195SmrgXP4SetupForFillRectSolid(ScrnInfoPtr pScrn,
446d87a3195Smrg                            int color,
447d87a3195Smrg                            int rop,
448d87a3195Smrg                            unsigned int planemask)
449d87a3195Smrg{
450d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
451d87a3195Smrg
452d87a3195Smrg    ropcode = rop;
453d87a3195Smrg
454d87a3195Smrg    REPLICATE(color);
455d87a3195Smrg    MMIO_OUT32(pTrident->IOBase, 0x2158, color);
456d87a3195Smrg    MMIO_OUT32(pTrident->IOBase, 0x2128, 1 << 14);
457d87a3195Smrg}
458d87a3195Smrg
459d87a3195Smrgstatic void
460d87a3195SmrgXP4SubsequentFillRectSolid(ScrnInfoPtr pScrn,
461d87a3195Smrg                            int x, int y,
462d87a3195Smrg                            int w, int h)
463d87a3195Smrg{
464d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
465d87a3195Smrg
466d87a3195Smrg    MMIO_OUT32(pTrident->IOBase, 0x2138, (x << 16) | y);
467d87a3195Smrg    MMIO_OUT32(pTrident->IOBase, 0x2140, (w << 16) | h);
468d87a3195Smrg    XP4Sync(pScrn);
469d87a3195Smrg    MMIO_OUT32(pTrident->IOBase, 0x2124,
470d87a3195Smrg                            (XAAGetPatternROP(ropcode) << 24) |
471d87a3195Smrg                            (bpp << 8) |
472d87a3195Smrg                            2);
473d87a3195Smrg}
474d87a3195Smrg
475d87a3195Smrg#if 0
476d87a3195Smrgstatic void
477d87a3195SmrgMoveDWORDS(register CARD32* dest,
478d87a3195Smrg            register CARD32* src,
479d87a3195Smrg            register int dwords)
480d87a3195Smrg{
481d87a3195Smrg    while(dwords & ~0x03) {
482d87a3195Smrg        *dest = *src;
483d87a3195Smrg        *(dest + 1) = *(src + 1);
484d87a3195Smrg        *(dest + 2) = *(src + 2);
485d87a3195Smrg        *(dest + 3) = *(src + 3);
486d87a3195Smrg        src += 4;
487d87a3195Smrg        dest += 4;
488d87a3195Smrg        dwords -= 4;
489d87a3195Smrg    }
490d87a3195Smrg
491d87a3195Smrg    if (!dwords) return;
492d87a3195Smrg    *dest = *src;
493d87a3195Smrg    dest += 1;
494d87a3195Smrg    src += 1;
495d87a3195Smrg    if (dwords == 1) return;
496d87a3195Smrg    *dest = *src;
497d87a3195Smrg    dest += 1;
498d87a3195Smrg    src += 1;
499d87a3195Smrg    if (dwords == 2) return;
500d87a3195Smrg    *dest = *src;
501d87a3195Smrg    dest += 1;
502d87a3195Smrg    src += 1;
503d87a3195Smrg}
504d87a3195Smrg#endif
505d87a3195Smrg
506d87a3195Smrg#if 0
507d87a3195Smrgstatic void
508d87a3195SmrgMoveDWORDS_FixedBase(register CARD32* dest,
509d87a3195Smrg                        register CARD32* src,
510d87a3195Smrg                        register int dwords)
511d87a3195Smrg{
512d87a3195Smrg    while(dwords & ~0x03) {
513d87a3195Smrg        *dest = *src;
514d87a3195Smrg        *dest = *(src + 1);
515d87a3195Smrg        *dest = *(src + 2);
516d87a3195Smrg        *dest = *(src + 3);
517d87a3195Smrg        dwords -= 4;
518d87a3195Smrg        src += 4;
519d87a3195Smrg    }
520d87a3195Smrg
521d87a3195Smrg    if(!dwords) return;
522d87a3195Smrg    *dest = *src;
523d87a3195Smrg    if(dwords == 1) return;
524d87a3195Smrg    *dest = *(src + 1);
525d87a3195Smrg    if(dwords == 2) return;
526d87a3195Smrg    *dest = *(src + 2);
527d87a3195Smrg}
528d87a3195Smrg#endif
529d87a3195Smrg
530d87a3195Smrgstatic void
531d87a3195SmrgXP4SetupForMono8x8PatternFill(ScrnInfoPtr pScrn,
532d87a3195Smrg                                int patternx, int patterny,
533d87a3195Smrg                                int fg, int bg,
534d87a3195Smrg                                int rop,
535d87a3195Smrg                                unsigned int planemask)
536d87a3195Smrg{
537d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
538d87a3195Smrg    int drawflag = 0;
539d87a3195Smrg
540d87a3195Smrg    REPLICATE(fg);
541d87a3195Smrg    MMIO_OUT32(pTrident->IOBase, 0x2158, fg);
542d87a3195Smrg
543d87a3195Smrg    if (bg == -1) {
544d87a3195Smrg        drawflag |= (1 << 12);
545d87a3195Smrg        MMIO_OUT32(pTrident->IOBase, 0x215C, ~fg);
546d87a3195Smrg    } else {
547d87a3195Smrg        REPLICATE(bg);
548d87a3195Smrg        MMIO_OUT32(pTrident->IOBase, 0x215C, bg);
549d87a3195Smrg    }
550d87a3195Smrg
551d87a3195Smrg    ropcode = rop;
552d87a3195Smrg
553d87a3195Smrg    drawflag |= (7 << 18);
554d87a3195Smrg    TGUI_DRAWFLAG(PATMONO | drawflag);
555d87a3195Smrg}
556d87a3195Smrg
557d87a3195Smrgstatic void
558d87a3195SmrgXP4SubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn,
559d87a3195Smrg                                    int patternx, int patterny,
560d87a3195Smrg                                    int x, int y,
561d87a3195Smrg                                    int w, int h)
562d87a3195Smrg{
563d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
564d87a3195Smrg
565d87a3195Smrg    MMIO_OUT32(pTrident->IOBase, 0x2180, patternx);
566d87a3195Smrg    MMIO_OUT32(pTrident->IOBase, 0x2184, patterny);
567d87a3195Smrg    MMIO_OUT32(pTrident->IOBase, 0x2138, (x << 16) | y);
568d87a3195Smrg    MMIO_OUT32(pTrident->IOBase, 0x2140, (w << 16) | h);
569d87a3195Smrg    XP4Sync(pScrn);
570d87a3195Smrg    MMIO_OUT32(pTrident->IOBase, 0x2124,
571d87a3195Smrg                                (XAAGetPatternROP(ropcode) << 24) |
572d87a3195Smrg                                (bpp << 8) |
573d87a3195Smrg                                2);
574d87a3195Smrg}
575d87a3195Smrg
576d87a3195Smrg#if 0
577d87a3195Smrgstatic void
578d87a3195SmrgXP4SetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
579d87a3195Smrg                                        int fg, int bg,
580d87a3195Smrg                                        int rop,
581d87a3195Smrg                                        unsigned int planemask)
582d87a3195Smrg{
583d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
584d87a3195Smrg
585d87a3195Smrg    ropcode = XAAGetCopyROP(rop);
586d87a3195Smrg#if 0
587d87a3195Smrg    TGUI_FMIX(XAACopyROP[rop]);
588d87a3195Smrg#endif
589d87a3195Smrg    if (bg == -1) {
590d87a3195Smrg        TGUI_DRAWFLAG(SRCMONO | (1 << 12));
591d87a3195Smrg        REPLICATE(fg);
592d87a3195Smrg        TGUI_FCOLOUR(fg);
593d87a3195Smrg    } else {
594d87a3195Smrg        TGUI_DRAWFLAG(SRCMONO);
595d87a3195Smrg        REPLICATE(fg);
596d87a3195Smrg        REPLICATE(bg);
597d87a3195Smrg        TGUI_FCOLOUR(fg);
598d87a3195Smrg        TGUI_BCOLOUR(bg);
599d87a3195Smrg    }
600d87a3195Smrg}
601d87a3195Smrg
602d87a3195Smrgstatic void
603d87a3195SmrgXP4SubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
604d87a3195Smrg                                        int x, int y,
605d87a3195Smrg                                        int w, int h,
606d87a3195Smrg                                        int skipleft)
607d87a3195Smrg{
608d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
609d87a3195Smrg
610d87a3195Smrg    MMIO_OUT32(pTrident->IOBase, 0x2138, (x << 16) | y);
611d87a3195Smrg    MMIO_OUT32(pTrident->IOBase, 0x2140, (w << 16) | h);
612d87a3195Smrg    XP4Sync(pScrn);
613d87a3195Smrg    MMIO_OUT32(pTrident->IOBase, 0x2124, (ropcode << 24) |
614d87a3195Smrg                                            (bpp << 8) |
615d87a3195Smrg                                            2);
616d87a3195Smrg}
617d87a3195Smrg#endif
618d87a3195Smrg#endif
619