1d87a3195Smrg/*
2d87a3195Smrg * Copyright 1997-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 * Trident Blade3D accelerated options.
27d87a3195Smrg */
28d87a3195Smrg
29d87a3195Smrg#ifdef HAVE_CONFIG_H
30d87a3195Smrg#include "config.h"
31d87a3195Smrg#endif
32d87a3195Smrg
33d87a3195Smrg#include "xf86.h"
34d87a3195Smrg#include "xf86_OSproc.h"
35d87a3195Smrg
36d87a3195Smrg#include "xf86Pci.h"
37d87a3195Smrg
38d87a3195Smrg#include "miline.h"
39d87a3195Smrg
40d87a3195Smrg#include "trident.h"
41d87a3195Smrg#include "trident_regs.h"
42d87a3195Smrg
43d87a3195Smrg#ifdef HAVE_XAA_H
44d87a3195Smrg#include "xaarop.h"
45d87a3195Smrg#include "xaalocal.h"
46d87a3195Smrg
47d87a3195Smrgstatic void BladeSync(ScrnInfoPtr pScrn);
48d87a3195Smrg#if 0
49d87a3195Smrgstatic void BladeSetupForSolidLine(ScrnInfoPtr pScrn,
50d87a3195Smrg                                    int color,
51d87a3195Smrg                                    int rop,
52d87a3195Smrg                                    unsigned int planemask);
53d87a3195Smrgstatic void BladeSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn,
54d87a3195Smrg                                                int x, int y,
55d87a3195Smrg                                                int dmaj, int dmin,
56d87a3195Smrg                                                int e, int len,
57d87a3195Smrg                                                int octant);
58d87a3195Smrgstatic void BladeSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
59d87a3195Smrg                                                int x1, int y1,
60d87a3195Smrg                                                int x2, int y2,
61d87a3195Smrg                                                int flags);
62d87a3195Smrgstatic void BladeSetupForDashedLine(ScrnInfoPtr pScrn,
63d87a3195Smrg                                    int fg, int bg,
64d87a3195Smrg                                    int rop,
65d87a3195Smrg                                    unsigned int planemask,
66d87a3195Smrg                                    int length,
67d87a3195Smrg                                    unsigned char *pattern);
68d87a3195Smrgstatic void BladeSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
69d87a3195Smrg                                                int x1, int y1,
70d87a3195Smrg                                                int x2, int y2,
71d87a3195Smrg                                                int flags, int phase);
72d87a3195Smrg#endif
73d87a3195Smrgstatic void BladeSetupForFillRectSolid(ScrnInfoPtr pScrn,
74d87a3195Smrg                                        int color,
75d87a3195Smrg                                        int rop,
76d87a3195Smrg                                        unsigned int planemask);
77d87a3195Smrgstatic void BladeSubsequentFillRectSolid(ScrnInfoPtr pScrn,
78d87a3195Smrg                                            int x, int y,
79d87a3195Smrg                                            int w, int h);
80d87a3195Smrgstatic void BladeSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
81d87a3195Smrg                                                int x1, int y1,
82d87a3195Smrg                                                int x2, int y2,
83d87a3195Smrg                                                int w, int h);
84d87a3195Smrgstatic void BladeSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
85d87a3195Smrg                                            int xdir, int ydir,
86d87a3195Smrg                                            int rop,
87d87a3195Smrg                                            unsigned int planemask,
88d87a3195Smrg                                            int transparency_color);
89d87a3195Smrg#if 0
90d87a3195Smrgstatic void BladeSetupForScreenToScreenColorExpand(ScrnInfoPtr pScrn,
91d87a3195Smrg                                            int fg, int bg,
92d87a3195Smrg                                            int rop,
93d87a3195Smrg                                            unsigned int planemask);
94d87a3195Smrgstatic void BladeSubsequentScreenToScreenColorExpand(ScrnInfoPtr pScrn,
95d87a3195Smrg                                                    int x, int y,
96d87a3195Smrg                                                    int w, int h,
97d87a3195Smrg                                                    int srcx, int srcy,
98d87a3195Smrg                                                    int offset);
99d87a3195Smrg#endif
100d87a3195Smrgstatic void BladeSetupForCPUToScreenColorExpand(ScrnInfoPtr pScrn,
101d87a3195Smrg                                            int fg, int bg,
102d87a3195Smrg                                            int rop,
103d87a3195Smrg                                            unsigned int planemask);
104d87a3195Smrgstatic void BladeSubsequentCPUToScreenColorExpand(ScrnInfoPtr pScrn,
105d87a3195Smrg                                                    int x, int y,
106d87a3195Smrg                                                    int w, int h,
107d87a3195Smrg                                                    int skipleft);
108d87a3195Smrgstatic void BladeSetClippingRectangle(ScrnInfoPtr pScrn,
109d87a3195Smrg                                        int x1, int y1,
110d87a3195Smrg                                        int x2, int y2);
111d87a3195Smrgstatic void BladeDisableClipping(ScrnInfoPtr pScrn);
112d87a3195Smrgstatic void BladeSetupForMono8x8PatternFill(ScrnInfoPtr pScrn,
113d87a3195Smrg                                            int patternx,
114d87a3195Smrg                                            int patterny,
115d87a3195Smrg                                            int fg, int bg,
116d87a3195Smrg                                            int rop,
117d87a3195Smrg                                            unsigned int planemask);
118d87a3195Smrgstatic void BladeSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn,
119d87a3195Smrg                                                    int patternx,
120d87a3195Smrg                                                    int patterny,
121d87a3195Smrg                                                    int x, int y,
122d87a3195Smrg                                                    int w, int h);
123d87a3195Smrg#if 0
124d87a3195Smrgstatic void BladeSetupForColor8x8PatternFill(ScrnInfoPtr pScrn,
125d87a3195Smrg                                                int patternx,
126d87a3195Smrg                                                int patterny,
127d87a3195Smrg                                                int rop,
128d87a3195Smrg                                                unsigned int planemask,
129d87a3195Smrg                                                int trans_col);
130d87a3195Smrgstatic void BladeSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn,
131d87a3195Smrg                                                    int patternx,
132d87a3195Smrg                                                    int patterny,
133d87a3195Smrg                                                    int x, int y,
134d87a3195Smrg                                                    int w, int h);
135d87a3195Smrg#endif
136d87a3195Smrgstatic void BladeSetupForImageWrite(ScrnInfoPtr pScrn,
137d87a3195Smrg                                    int rop,
138d87a3195Smrg                                    unsigned int planemask,
139d87a3195Smrg                                    int transparency_color,
140d87a3195Smrg                                    int bpp, int depth);
141d87a3195Smrgstatic void BladeSubsequentImageWriteRect(ScrnInfoPtr pScrn,
142d87a3195Smrg                                            int x, int y,
143d87a3195Smrg                                            int w, int h,
144d87a3195Smrg                                            int skipleft);
145d87a3195Smrg
146d87a3195Smrgstatic void
147d87a3195SmrgBladeInitializeAccelerator(ScrnInfoPtr pScrn)
148d87a3195Smrg{
149d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
150d87a3195Smrg    CARD32 stride;
151d87a3195Smrg
152d87a3195Smrg    stride = (pScrn->displayWidth >> 3) << 20;
153d87a3195Smrg
154d87a3195Smrg    BLADE_OUT(0x21C8, stride);
155d87a3195Smrg    BLADE_OUT(0x21CC, stride);
156d87a3195Smrg    BLADE_OUT(0x21D0, stride);
157d87a3195Smrg    BLADE_OUT(0x21D4, stride);
158d87a3195Smrg    switch (pScrn->depth) {
159d87a3195Smrg        case 8:
160d87a3195Smrg        stride |= (0 << 29);
161d87a3195Smrg        break;
162d87a3195Smrg        case 15:
163d87a3195Smrg        stride |= (5 << 29);
164d87a3195Smrg        break;
165d87a3195Smrg        case 16:
166d87a3195Smrg        stride |= (1 << 29);
167d87a3195Smrg        break;
168d87a3195Smrg        case 24:
169d87a3195Smrg        stride |= (2 << 29);
170d87a3195Smrg        break;
171d87a3195Smrg    }
172d87a3195Smrg
173d87a3195Smrg    BLADE_OUT(0x21B8, 0);
174d87a3195Smrg    BLADE_OUT(0x21B8, stride);
175d87a3195Smrg    BLADE_OUT(0x21BC, stride);
176d87a3195Smrg    BLADE_OUT(0x21C0, stride);
177d87a3195Smrg    BLADE_OUT(0x21C4, stride);
178d87a3195Smrg#if 0
179d87a3195Smrg    /* It appears that the driver sometimes misdetects the RAM type, so we
180d87a3195Smrg     * don't force this for now */
181d87a3195Smrg    if (pTrident->HasSGRAM)
182d87a3195Smrg        BLADE_OUT(0x2168, 1 << 26); /* Enables Block Write if available (SGRAM) */
183d87a3195Smrg    else
184d87a3195Smrg        BLADE_OUT(0x2168, 0);
185d87a3195Smrg#endif
186d87a3195Smrg    BLADE_OUT(0x216C, 0);
187d87a3195Smrg}
188d87a3195Smrg#endif
189d87a3195Smrg
190d87a3195SmrgBool BladeXaaInit(ScreenPtr pScreen) {
191d87a3195Smrg#ifdef HAVE_XAA_H
192d87a3195Smrg    XAAInfoRecPtr infoPtr;
193d87a3195Smrg    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
194d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
195d87a3195Smrg
196d87a3195Smrg    if (pTrident->NoAccel)
197d87a3195Smrg        return FALSE;
198d87a3195Smrg
199d87a3195Smrg    pTrident->AccelInfoRec = infoPtr = XAACreateInfoRec();
200d87a3195Smrg    if (!infoPtr) return FALSE;
201d87a3195Smrg
202d87a3195Smrg    pTrident->InitializeAccelerator = BladeInitializeAccelerator;
203d87a3195Smrg    BladeInitializeAccelerator(pScrn);
204d87a3195Smrg
205d87a3195Smrg    infoPtr->Flags = PIXMAP_CACHE |
206d87a3195Smrg                        LINEAR_FRAMEBUFFER |
207d87a3195Smrg                        OFFSCREEN_PIXMAPS;
208d87a3195Smrg
209d87a3195Smrg    infoPtr->Sync = BladeSync;
210d87a3195Smrg
211d87a3195Smrg    infoPtr->SetClippingRectangle = BladeSetClippingRectangle;
212d87a3195Smrg    infoPtr->DisableClipping = BladeDisableClipping;
213d87a3195Smrg
214d87a3195Smrg#if 0
215d87a3195Smrg    infoPtr->SolidLineFlags = 0;
216d87a3195Smrg    infoPtr->SetupForSolidLine = BladeSetupForSolidLine;
217d87a3195Smrg    infoPtr->SubsequentSolidTwoPointLine =
218d87a3195Smrg                                    BladeSubsequentSolidTwoPointLine;
219d87a3195Smrg    infoPtr->SetupForDashedLine = BladeSetupForDashedLine;
220d87a3195Smrg    infoPtr->SubsequentDashedTwoPointLine =
221d87a3195Smrg                                    BladeSubsequentDashedTwoPointLine;
222d87a3195Smrg    infoPtr->DashPatternMaxLength = 16;
223d87a3195Smrg    infoPtr->DashedLineFlags = LINE_PATTERN_LSBFIRST_LSBJUSTIFIED |
224d87a3195Smrg                                LINE_PATTERN_POWER_OF_2_ONLY;
225d87a3195Smrg#endif
226d87a3195Smrg
227d87a3195Smrg    infoPtr->SolidFillFlags = NO_PLANEMASK;
228d87a3195Smrg    infoPtr->SetupForSolidFill = BladeSetupForFillRectSolid;
229d87a3195Smrg    infoPtr->SubsequentSolidFillRect = BladeSubsequentFillRectSolid;
230d87a3195Smrg
231d87a3195Smrg    infoPtr->ScreenToScreenCopyFlags = ONLY_TWO_BITBLT_DIRECTIONS |
232d87a3195Smrg                                        NO_PLANEMASK |
233d87a3195Smrg                                        NO_TRANSPARENCY;
234d87a3195Smrg
235d87a3195Smrg    infoPtr->SetupForScreenToScreenCopy =
236d87a3195Smrg                                    BladeSetupForScreenToScreenCopy;
237d87a3195Smrg    infoPtr->SubsequentScreenToScreenCopy =
238d87a3195Smrg                                    BladeSubsequentScreenToScreenCopy;
239d87a3195Smrg
240d87a3195Smrg    infoPtr->Mono8x8PatternFillFlags = NO_PLANEMASK |
241d87a3195Smrg                                    NO_TRANSPARENCY |
242d87a3195Smrg                                    BIT_ORDER_IN_BYTE_MSBFIRST |
243d87a3195Smrg                                    HARDWARE_PATTERN_SCREEN_ORIGIN |
244d87a3195Smrg                                    HARDWARE_PATTERN_PROGRAMMED_BITS;
245d87a3195Smrg
246d87a3195Smrg    infoPtr->SetupForMono8x8PatternFill =
247d87a3195Smrg                                    BladeSetupForMono8x8PatternFill;
248d87a3195Smrg    infoPtr->SubsequentMono8x8PatternFillRect =
249d87a3195Smrg                                BladeSubsequentMono8x8PatternFillRect;
250d87a3195Smrg
251d87a3195Smrg#if 0
252d87a3195Smrg    infoPtr->Color8x8PatternFillFlags =
253d87a3195Smrg                                    HARDWARE_PATTERN_SCREEN_ORIGIN |
254d87a3195Smrg                                    BIT_ORDER_IN_BYTE_MSBFIRST;
255d87a3195Smrg
256d87a3195Smrg    infoPtr->SetupForColor8x8PatternFill =
257d87a3195Smrg                                TridentSetupForColor8x8PatternFill;
258d87a3195Smrg    infoPtr->SubsequentColor8x8PatternFillRect =
259d87a3195Smrg                            TridentSubsequentColor8x8PatternFillRect;
260d87a3195Smrg
261d87a3195Smrg    infoPtr->ScreenToScreenColorExpandFillFlags = 0;
262d87a3195Smrg
263d87a3195Smrg    infoPtr->SetupForScreenToScreenColorExpandFill =
264d87a3195Smrg                            BladeSetupForScreenToScreenColorExpand;
265d87a3195Smrg    infoPtr->SubsequentScreenToScreenColorExpandFill =
266d87a3195Smrg                            BladeSubsequentScreenToScreenColorExpand;
267d87a3195Smrg#endif
268d87a3195Smrg
269d87a3195Smrg    infoPtr->CPUToScreenColorExpandFillFlags =
270d87a3195Smrg                                        CPU_TRANSFER_PAD_DWORD |
271d87a3195Smrg                                        LEFT_EDGE_CLIPPING |
272d87a3195Smrg                                        SYNC_AFTER_COLOR_EXPAND |
273d87a3195Smrg                                        NO_PLANEMASK |
274d87a3195Smrg                                        BIT_ORDER_IN_BYTE_MSBFIRST |
275d87a3195Smrg                                        SCANLINE_PAD_DWORD;
276d87a3195Smrg    infoPtr->ColorExpandRange = 0x10000;
277d87a3195Smrg    infoPtr->ColorExpandBase = pTrident->IOBase + 0x10000;
278d87a3195Smrg    infoPtr->SetupForCPUToScreenColorExpandFill =
279d87a3195Smrg                                BladeSetupForCPUToScreenColorExpand;
280d87a3195Smrg    infoPtr->SubsequentCPUToScreenColorExpandFill =
281d87a3195Smrg                                BladeSubsequentCPUToScreenColorExpand;
282d87a3195Smrg
283d87a3195Smrg    infoPtr->SetupForImageWrite = BladeSetupForImageWrite;
284d87a3195Smrg    infoPtr->SubsequentImageWriteRect =
285d87a3195Smrg                                        BladeSubsequentImageWriteRect;
286d87a3195Smrg    infoPtr->ImageWriteFlags = NO_PLANEMASK |
287d87a3195Smrg                                LEFT_EDGE_CLIPPING |
288d87a3195Smrg                                CPU_TRANSFER_PAD_DWORD |
289d87a3195Smrg                                SYNC_AFTER_IMAGE_WRITE;
290d87a3195Smrg    infoPtr->ImageWriteBase = pTrident->IOBase + 0x10000;
291d87a3195Smrg    infoPtr->ImageWriteRange = 0x10000;
292d87a3195Smrg
293d87a3195Smrg    return(XAAInit(pScreen, infoPtr));
294d87a3195Smrg#else
295d87a3195Smrg    return FALSE;
296d87a3195Smrg#endif
297d87a3195Smrg}
298d87a3195Smrg
299d87a3195Smrg#ifdef HAVE_XAA_H
300d87a3195Smrgstatic void
301d87a3195SmrgBladeSync(ScrnInfoPtr pScrn)
302d87a3195Smrg{
303d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
304d87a3195Smrg    int busy;
305d87a3195Smrg    int cnt = 10000000;
306d87a3195Smrg
307d87a3195Smrg    if (pTrident->Clipping) BladeDisableClipping(pScrn);
308d87a3195Smrg    BLADE_OUT(0x216C, 0);
309d87a3195Smrg
310d87a3195Smrg    BLADEBUSY(busy);
311d87a3195Smrg    while (busy != 0) {
312d87a3195Smrg        if (--cnt < 0) {
313d87a3195Smrg            ErrorF("GE timeout\n");
314d87a3195Smrg            BLADE_OUT(0x2124, 1 << 7);
315d87a3195Smrg            BLADE_OUT(0x2124, 0);
316d87a3195Smrg            break;
317d87a3195Smrg        }
318d87a3195Smrg
319d87a3195Smrg        BLADEBUSY(busy);
320d87a3195Smrg    }
321d87a3195Smrg}
322d87a3195Smrg
323d87a3195Smrgstatic void
324d87a3195SmrgBladeSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
325d87a3195Smrg                                int xdir, int ydir,
326d87a3195Smrg                                int rop,
327d87a3195Smrg                                unsigned int planemask,
328d87a3195Smrg                                int transparency_color)
329d87a3195Smrg{
330d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
331d87a3195Smrg
332d87a3195Smrg    pTrident->BltScanDirection = 0;
333d87a3195Smrg    if ((xdir < 0) || (ydir < 0))
334d87a3195Smrg        pTrident->BltScanDirection |= (1 << 1);
335d87a3195Smrg
336d87a3195Smrg#if 0
337d87a3195Smrg    if (transparency_color != -1) {
338d87a3195Smrg        BLADE_OUT(0x2168, transparency_color & 0xffffff);
339d87a3195Smrg        pTrident->BltScanDirection |= (1 << 6);
340d87a3195Smrg    }
341d87a3195Smrg
342d87a3195Smrg    REPLICATE(planemask);
343d87a3195Smrg    if (planemask != (unsigned int)-1) {
344d87a3195Smrg        BLADE_OUT(0x2184, ~planemask);
345d87a3195Smrg        pTrident->BltScanDirection |= (1 << 5);
346d87a3195Smrg    }
347d87a3195Smrg
348d87a3195Smrg#endif
349d87a3195Smrg    BLADE_OUT(0x2148, XAAGetCopyROP(rop));
350d87a3195Smrg}
351d87a3195Smrg
352d87a3195Smrgstatic void
353d87a3195SmrgBladeSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
354d87a3195Smrg                                    int x1, int y1,
355d87a3195Smrg                                    int x2, int y2,
356d87a3195Smrg                                    int w, int h)
357d87a3195Smrg{
358d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
359d87a3195Smrg    int clip = 0;
360d87a3195Smrg
361d87a3195Smrg    if (pTrident->Clipping) clip = 1;
362d87a3195Smrg
363d87a3195Smrg    BLADE_OUT(0x2144, 0xE0000000 |
364d87a3195Smrg                        (1 << 19) | (1 << 4) | (1 << 2) |
365d87a3195Smrg                        pTrident->BltScanDirection | clip);
366d87a3195Smrg
367d87a3195Smrg    if (pTrident->BltScanDirection) {
368d87a3195Smrg        BLADE_OUT(0x2100, ((y1 + h - 1) << 16) | (x1 + w - 1));
369d87a3195Smrg        BLADE_OUT(0x2104, (y1 << 16) | x1);
370d87a3195Smrg        BLADE_OUT(0x2108, ((y2 + h - 1) << 16) | (x2 + w - 1));
371d87a3195Smrg        BLADE_OUT(0x210C, ((y2 & 0xfff) << 16) | (x2 & 0xfff));
372d87a3195Smrg    } else {
373d87a3195Smrg        BLADE_OUT(0x2100, (y1 << 16) | x1);
374d87a3195Smrg        BLADE_OUT(0x2104, ((y1 + h - 1) << 16) | (x1 + w - 1));
375d87a3195Smrg        BLADE_OUT(0x2108, (y2 << 16) | x2);
376d87a3195Smrg        BLADE_OUT(0x210C, (((y2 + h - 1) & 0xfff) << 16) |
377d87a3195Smrg                            ((x2 + w - 1) & 0xfff));
378d87a3195Smrg    }
379d87a3195Smrg}
380d87a3195Smrg
381d87a3195Smrgstatic void
382d87a3195SmrgBladeSetClippingRectangle(ScrnInfoPtr pScrn,
383d87a3195Smrg                            int x1, int y1,
384d87a3195Smrg                            int x2, int y2)
385d87a3195Smrg{
386d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
387d87a3195Smrg
388d87a3195Smrg    BLADE_OUT(0x2154, ((y1 & 0x0fff) << 16) | (x1 & 0x0fff));
389d87a3195Smrg    BLADE_OUT(0x2158, ((y2 & 0x0fff) << 16) | (x2 & 0x0fff));
390d87a3195Smrg    pTrident->Clipping = TRUE;
391d87a3195Smrg}
392d87a3195Smrg
393d87a3195Smrgstatic void
394d87a3195SmrgBladeDisableClipping(ScrnInfoPtr pScrn)
395d87a3195Smrg{
396d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
397d87a3195Smrg    pTrident->Clipping = FALSE;
398d87a3195Smrg}
399d87a3195Smrg
400d87a3195Smrg#if 0
401d87a3195Smrgstatic void
402d87a3195SmrgBladeSetupForSolidLine(ScrnInfoPtr pScrn,
403d87a3195Smrg                        int color,
404d87a3195Smrg                        int rop,
405d87a3195Smrg                        unsigned int planemask)
406d87a3195Smrg{
407d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
408d87a3195Smrg
409d87a3195Smrg    REPLICATE(color);
410d87a3195Smrg    BLADE_OUT(0x2160, color);
411d87a3195Smrg    BLADE_OUT(0x2148, XAAGetCopyROP(rop));
412d87a3195Smrg    pTrident->BltScanDirection = 0;
413d87a3195Smrg    REPLICATE(planemask);
414d87a3195Smrg    if (planemask != -1) {
415d87a3195Smrg        BLADE_OUT(0x2184, ~planemask);
416d87a3195Smrg        pTrident->BltScanDirection |= (1 << 5);
417d87a3195Smrg    }
418d87a3195Smrg}
419d87a3195Smrg
420d87a3195Smrgstatic void
421d87a3195SmrgBladeSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn,
422d87a3195Smrg                                    int x, int y,
423d87a3195Smrg                                    int dmaj, int dmin,
424d87a3195Smrg                                    int e, int len,
425d87a3195Smrg                                    int octant)
426d87a3195Smrg{
427d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
428d87a3195Smrg    int tmp;
429d87a3195Smrg    int D = 0, E = 0, ymajor = 0;
430d87a3195Smrg
431d87a3195Smrg    BLADE_OUT(0x2144, 0x20000000 |
432d87a3195Smrg                        (3 << 19) | (1 << 4) | (2 << 2) |
433d87a3195Smrg                        (pTrident->Clipping ? 1 : 0));
434d87a3195Smrg
435d87a3195Smrg    if (!(octant & YMAJOR)) {
436d87a3195Smrg        if ((!(octant & XDECREASING)) && (!(octant & YDECREASING))) {
437d87a3195Smrg            E = 1; D = 0;
438d87a3195Smrg        }
439d87a3195Smrg
440d87a3195Smrg        if ((!(octant & XDECREASING)) && ( (octant & YDECREASING))) {
441d87a3195Smrg            E = 1; D = 1;
442d87a3195Smrg        }
443d87a3195Smrg
444d87a3195Smrg        if (( (octant & XDECREASING)) && (!(octant & YDECREASING))) {
445d87a3195Smrg            E = 1; D = 2;
446d87a3195Smrg        }
447d87a3195Smrg
448d87a3195Smrg        if (( (octant & XDECREASING)) && ( (octant & YDECREASING))) {
449d87a3195Smrg            E = 1; D = 3;
450d87a3195Smrg        }
451d87a3195Smrg
452d87a3195Smrg        ymajor = 0;
453d87a3195Smrg    } else {
454d87a3195Smrg        if ((!(octant & XDECREASING)) && (!(octant & YDECREASING))) {
455d87a3195Smrg            E = 0; D = 0;
456d87a3195Smrg        }
457d87a3195Smrg
458d87a3195Smrg        if ((!(octant & XDECREASING)) && ( (octant & YDECREASING))) {
459d87a3195Smrg            E = 0; D = 2;
460d87a3195Smrg        }
461d87a3195Smrg
462d87a3195Smrg        if (( (octant & XDECREASING)) && (!(octant & YDECREASING))) {
463d87a3195Smrg            E = 0; D = 1;
464d87a3195Smrg        }
465d87a3195Smrg
466d87a3195Smrg        if (( (octant & XDECREASING)) && ( (octant & YDECREASING))) {
467d87a3195Smrg            E = 0; D = 3;
468d87a3195Smrg        }
469d87a3195Smrg
470d87a3195Smrg        ymajor = 1 << 21;
471d87a3195Smrg    }
472d87a3195Smrg
473d87a3195Smrg    if (E) {
474d87a3195Smrg        tmp = x; x = y; y = tmp;
475d87a3195Smrg    }
476d87a3195Smrg
477d87a3195Smrg    BLADE_OUT(0x2130, 0x00000001);
478d87a3195Smrg    if (D & 0x02) {
479d87a3195Smrg        BLADE_OUT(0x213C, 0x10000000 |
480d87a3195Smrg                            (1 << 25) | (1 << 19) | (1 << 17) |
481d87a3195Smrg                            ymajor | ((x + len - 1) << 4));
482d87a3195Smrg    } else {
483d87a3195Smrg        BLADE_OUT(0x213C, 0x10000000 |
484d87a3195Smrg                            (1 << 25) | (1 << 19) | (1 << 17) |
485d87a3195Smrg                            ymajor | ((y + len - 1) << 4));
486d87a3195Smrg    }
487d87a3195Smrg
488d87a3195Smrg    BLADE_OUT(0x2140, (E << 30) |
489d87a3195Smrg                        ((y & 0xfff) << 20) | ((x & 0xfff) << 4));
490d87a3195Smrg    BLADE_OUT(0x2144, (D << 30) |
491d87a3195Smrg                        (((dmaj - dmin) & 0xfff) << 16) |
492d87a3195Smrg                        (-dmin & 0xfff));
493d87a3195Smrg    BLADE_OUT(0x2148, ((-(dmin + e) & 0xfff) << 16));
494d87a3195Smrg}
495d87a3195Smrg
496d87a3195Smrgstatic void
497d87a3195SmrgBladeSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
498d87a3195Smrg                                    int x1, int y1,
499d87a3195Smrg                                    int x2, int y2,
500d87a3195Smrg                                    int flags)
501d87a3195Smrg{
502d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
503d87a3195Smrg
504d87a3195Smrg#if 0
505d87a3195Smrg    if (flags & OMIT_LAST)
506d87a3195Smrg        BladeSetClippingRectangle(pScrn, x1, y1, x2 - 1, y2 - 1);
507d87a3195Smrg#endif
508d87a3195Smrg
509d87a3195Smrg    BLADE_OUT(0x2144, 0x20000000 |
510d87a3195Smrg                        pTrident->BltScanDirection |
511d87a3195Smrg                        (1 << 19) | (1 << 4) | (2 << 2));
512d87a3195Smrg    BLADE_OUT(0x2130, 0x3);
513d87a3195Smrg    BLADE_OUT(0x2108, (y1 << 16) | x1);
514d87a3195Smrg    BLADE_OUT(0x210C, ((y2 & 0xfff) << 16) | (x2 & 0xfff));
515d87a3195Smrg
516d87a3195Smrg#if 0
517d87a3195Smrg    if (flags & OMIT_LAST)
518d87a3195Smrg    BladeDisableClipping(pScrn);
519d87a3195Smrg#endif
520d87a3195Smrg}
521d87a3195Smrg
522d87a3195Smrgstatic void
523d87a3195SmrgBladeSetupForDashedLine(ScrnInfoPtr pScrn,
524d87a3195Smrg                        int fg, int bg,
525d87a3195Smrg                        int rop,
526d87a3195Smrg                        unsigned int planemask,
527d87a3195Smrg                        int length,
528d87a3195Smrg                        unsigned char *pattern)
529d87a3195Smrg{
530d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
531d87a3195Smrg
532d87a3195Smrg    pTrident->LinePattern = *((CARD16 *)pattern) & ((1 << length) - 1);
533d87a3195Smrg    switch (length) {
534d87a3195Smrg        case 2:
535d87a3195Smrg        pTrident->LinePattern = pTrident->LinePattern |
536d87a3195Smrg                                (pTrident->LinePattern << 2);
537d87a3195Smrg        case 4:
538d87a3195Smrg        pTrident->LinePattern = pTrident->LinePattern |
539d87a3195Smrg                                (pTrident->LinePattern << 4);
540d87a3195Smrg        case 8:
541d87a3195Smrg        pTrident->LinePattern = pTrident->LinePattern |
542d87a3195Smrg                                (pTrident->LinePattern << 8);
543d87a3195Smrg    }
544d87a3195Smrg
545d87a3195Smrg    REPLICATE(fg);
546d87a3195Smrg    REPLICATE(bg);
547d87a3195Smrg    BLADE_OUT(0x2160, fg);
548d87a3195Smrg    BLADE_OUT(0x2164, bg);
549d87a3195Smrg    BLADE_OUT(0x2148, XAAGetCopyROP(rop));
550d87a3195Smrg    pTrident->BltScanDirection = 0;
551d87a3195Smrg    REPLICATE(planemask);
552d87a3195Smrg    if (planemask != -1) {
553d87a3195Smrg        BLADE_OUT(0x2184, ~planemask);
554d87a3195Smrg        pTrident->BltScanDirection |= (1 << 5);
555d87a3195Smrg    }
556d87a3195Smrg}
557d87a3195Smrg
558d87a3195Smrgstatic void
559d87a3195SmrgBladeSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn,
560d87a3195Smrg                                    int x1, int y1,
561d87a3195Smrg                                    int x2, int y2,
562d87a3195Smrg                                    int flags, int phase)
563d87a3195Smrg{
564d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
565d87a3195Smrg
566d87a3195Smrg    if (flags & OMIT_LAST)
567d87a3195Smrg        BladeSetClippingRectangle(pScrn, x1, y1, x2 - 1, y2 - 1);
568d87a3195Smrg
569d87a3195Smrg    BLADE_OUT(0x216C, (pTrident->LinePattern >> phase) |
570d87a3195Smrg                        (pTrident->LinePattern << (16 - phase)));
571d87a3195Smrg    BLADE_OUT(0x2144, 0x20000000 |
572d87a3195Smrg                        pTrident->BltScanDirection |
573d87a3195Smrg                        (1 << 27) | (1 << 19) | (1 << 4) | (2 << 2));
574d87a3195Smrg    BLADE_OUT(0x2108, (y1 << 16) | x1);
575d87a3195Smrg    BLADE_OUT(0x210C, ((y2 & 0xfff) << 16) | (x2 & 0xfff));
576d87a3195Smrg
577d87a3195Smrg    if (flags & OMIT_LAST)
578d87a3195Smrg        BladeDisableClipping(pScrn);
579d87a3195Smrg}
580d87a3195Smrg#endif
581d87a3195Smrg
582d87a3195Smrgstatic void
583d87a3195SmrgBladeSetupForFillRectSolid(ScrnInfoPtr pScrn,
584d87a3195Smrg                            int color,
585d87a3195Smrg                            int rop,
586d87a3195Smrg                            unsigned int planemask)
587d87a3195Smrg{
588d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
589d87a3195Smrg
590d87a3195Smrg    REPLICATE(color);
591d87a3195Smrg    BLADE_OUT(0x2160, color);
592d87a3195Smrg    BLADE_OUT(0x2148, XAAGetCopyROP(rop));
593d87a3195Smrg    pTrident->BltScanDirection = 0;
594d87a3195Smrg#if 0
595d87a3195Smrg    REPLICATE(planemask);
596d87a3195Smrg    if (planemask != -1) {
597d87a3195Smrg        BLADE_OUT(0x2184, ~planemask);
598d87a3195Smrg        pTrident->BltScanDirection |= (1 << 5);
599d87a3195Smrg    }
600d87a3195Smrg#endif
601d87a3195Smrg}
602d87a3195Smrg
603d87a3195Smrgstatic void
604d87a3195SmrgBladeSubsequentFillRectSolid(ScrnInfoPtr pScrn,
605d87a3195Smrg                                int x, int y,
606d87a3195Smrg                                int w, int h)
607d87a3195Smrg{
608d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
609d87a3195Smrg
610d87a3195Smrg    BLADE_OUT(0x2144, 0x20000000 |
611d87a3195Smrg                        pTrident->BltScanDirection |
612d87a3195Smrg                        (1 << 19) | (1 << 4) | (2 << 2) |
613d87a3195Smrg                        (pTrident->Clipping ? 1 : 0));
614d87a3195Smrg    BLADE_OUT(0x2108, (y << 16) | x);
615d87a3195Smrg    BLADE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
616d87a3195Smrg                        ((x + w - 1) & 0xfff));
617d87a3195Smrg}
618d87a3195Smrg
619d87a3195Smrg#if 0
620d87a3195Smrgstatic void
621d87a3195SmrgBladeSetupForScreenToScreenColorExpand(ScrnInfoPtr pScrn,
622d87a3195Smrg                                        int fg, int bg,
623d87a3195Smrg                                        int rop,
624d87a3195Smrg                                        unsigned int planemask)
625d87a3195Smrg{
626d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
627d87a3195Smrg
628d87a3195Smrg    pTrident->ROP = rop;
629d87a3195Smrg
630d87a3195Smrg    REPLICATE(bg);
631d87a3195Smrg    REPLICATE(fg);
632d87a3195Smrg    IMAGE_OUT(0x44, fg);
633d87a3195Smrg    IMAGE_OUT(0x48, bg);
634d87a3195Smrg    IMAGE_OUT(0x20, 0x90000000 | XAAGetCopyROP(rop));
635d87a3195Smrg    pTrident->BltScanDirection = 0;
636d87a3195Smrg    REPLICATE(planemask);
637d87a3195Smrg    if (planemask != -1) {
638d87a3195Smrg        BLADE_OUT(0x2184, ~planemask);
639d87a3195Smrg        pTrident->BltScanDirection |= (1 << 5);
640d87a3195Smrg    }
641d87a3195Smrg}
642d87a3195Smrg
643d87a3195Smrgstatic void
644d87a3195SmrgBladeSubsequentScreenToScreenColorExpand(ScrnInfoPtr pScrn,
645d87a3195Smrg                                            int x, int y,
646d87a3195Smrg                                            int w, int h,
647d87a3195Smrg                                            int srcx, int srcy,
648d87a3195Smrg                                            int offset)
649d87a3195Smrg{
650d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
651d87a3195Smrg
652d87a3195Smrg    IMAGE_OUT(0x00, (srcy << 16) | srcx);
653d87a3195Smrg    IMAGE_OUT(0x04, ((srcy + h - 1) << 16) | (srcx + w - 1));
654d87a3195Smrg    IMAGE_OUT(0x08, (y << 16) | x);
655d87a3195Smrg    IMAGE_OUT(0x0C, ((y + h - 1) << 16) | (x + w - 1));
656d87a3195Smrg
657d87a3195Smrg    IMAGE_OUT(0x24, 0x80000000 |
658d87a3195Smrg                    (3 << 22) | (1 << 7) |
659d87a3195Smrg                    pTrident->BltScanDirection |
660d87a3195Smrg                    (pTrident->ROP == GXcopy ? 0 : (1 << 10)) |
661d87a3195Smrg                    (offset << 25));
662d87a3195Smrg}
663d87a3195Smrg#endif
664d87a3195Smrg
665d87a3195Smrgstatic void
666d87a3195SmrgBladeSetupForCPUToScreenColorExpand(ScrnInfoPtr pScrn,
667d87a3195Smrg                                    int fg, int bg,
668d87a3195Smrg                                    int rop,
669d87a3195Smrg                                    unsigned int planemask)
670d87a3195Smrg{
671d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
672d87a3195Smrg
673d87a3195Smrg    pTrident->BltScanDirection = 0;
674d87a3195Smrg    BLADE_OUT(0x2148, XAAGetCopyROP(rop));
675d87a3195Smrg    if (bg == -1) {
676d87a3195Smrg        pTrident->BltScanDirection |= (2 << 19);
677d87a3195Smrg        REPLICATE(fg);
678d87a3195Smrg        BLADE_OUT(0x2160, fg);
679d87a3195Smrg        BLADE_OUT(0x2164, ~fg);
680d87a3195Smrg    } else {
681d87a3195Smrg        pTrident->BltScanDirection |= (3 << 19);
682d87a3195Smrg        REPLICATE(fg);
683d87a3195Smrg        REPLICATE(bg);
684d87a3195Smrg        BLADE_OUT(0x2160, fg);
685d87a3195Smrg        BLADE_OUT(0x2164, bg);
686d87a3195Smrg    }
687d87a3195Smrg
688d87a3195Smrg#if 0
689d87a3195Smrg    REPLICATE(planemask);
690d87a3195Smrg    if (planemask != -1) {
691d87a3195Smrg        BLADE_OUT(0x2184, ~planemask);
692d87a3195Smrg        pTrident->BltScanDirection |= (1 << 5);
693d87a3195Smrg    }
694d87a3195Smrg#endif
695d87a3195Smrg}
696d87a3195Smrg
697d87a3195Smrgstatic void
698d87a3195SmrgBladeSubsequentCPUToScreenColorExpand(ScrnInfoPtr pScrn,
699d87a3195Smrg                                        int x, int y,
700d87a3195Smrg                                        int w, int h,
701d87a3195Smrg                                        int skipleft)
702d87a3195Smrg{
703d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
704d87a3195Smrg
705d87a3195Smrg    if (skipleft)
706d87a3195Smrg        BladeSetClippingRectangle(pScrn,
707d87a3195Smrg                                    x + skipleft, y,
708d87a3195Smrg                                    (x + w - 1), (y + h - 1));
709d87a3195Smrg    BLADE_OUT(0x2144, 0xE0000000 |
710d87a3195Smrg                        pTrident->BltScanDirection |
711d87a3195Smrg                        (1 << 4) |
712d87a3195Smrg                        (skipleft ? 1 : 0));
713d87a3195Smrg    BLADE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff));
714d87a3195Smrg    BLADE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
715d87a3195Smrg                        ((x + w - 1) & 0xfff));
716d87a3195Smrg}
717d87a3195Smrg
718d87a3195Smrgstatic void
719d87a3195SmrgBladeSetupForMono8x8PatternFill(ScrnInfoPtr pScrn,
720d87a3195Smrg                                int patternx, int patterny,
721d87a3195Smrg                                int fg, int bg,
722d87a3195Smrg                                int rop,
723d87a3195Smrg                                unsigned int planemask)
724d87a3195Smrg{
725d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
726d87a3195Smrg
727d87a3195Smrg    BladeSync(pScrn);
728d87a3195Smrg    BLADE_OUT(0x2148, XAAGetPatternROP(rop));
729d87a3195Smrg
730d87a3195Smrg    if (bg == -1) {
731d87a3195Smrg        REPLICATE(fg);
732d87a3195Smrg        BLADE_OUT(0x216C, 0x80000000 | (1 << 30));
733d87a3195Smrg        BLADE_OUT(0x216C, 0x80000000 | (1 << 28) | (1 << 30));
734d87a3195Smrg        BLADE_OUT(0x2170, patternx);
735d87a3195Smrg        BLADE_OUT(0x2170, patterny);
736d87a3195Smrg        BLADE_OUT(0x2174, fg);
737d87a3195Smrg#if 0
738d87a3195Smrg        BLADE_OUT(0x2178, ~fg);
739d87a3195Smrg#endif
740d87a3195Smrg    } else {
741d87a3195Smrg        REPLICATE(fg);
742d87a3195Smrg        REPLICATE(bg);
743d87a3195Smrg        BLADE_OUT(0x216C, 0x80000000);
744d87a3195Smrg        BLADE_OUT(0x216C, 0x80000000 | (1 << 28));
745d87a3195Smrg        BLADE_OUT(0x2170, patternx);
746d87a3195Smrg        BLADE_OUT(0x2170, patterny);
747d87a3195Smrg        BLADE_OUT(0x2174, fg);
748d87a3195Smrg        BLADE_OUT(0x2178, bg);
749d87a3195Smrg    }
750d87a3195Smrg
751d87a3195Smrg    pTrident->BltScanDirection = 0;
752d87a3195Smrg#if 0
753d87a3195Smrg    REPLICATE(planemask);
754d87a3195Smrg    if (planemask != -1) {
755d87a3195Smrg        BLADE_OUT(0x2184, ~planemask);
756d87a3195Smrg        pTrident->BltScanDirection |= (1 << 5);
757d87a3195Smrg    }
758d87a3195Smrg#endif
759d87a3195Smrg}
760d87a3195Smrg
761d87a3195Smrgstatic void
762d87a3195SmrgBladeSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn,
763d87a3195Smrg                                        int patternx, int patterny,
764d87a3195Smrg                                        int x, int y,
765d87a3195Smrg                                        int w, int h)
766d87a3195Smrg{
767d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
768d87a3195Smrg    int clip = 0;
769d87a3195Smrg
770d87a3195Smrg    if (pTrident->Clipping) clip = 1;
771d87a3195Smrg    BLADE_OUT(0x2144, 0x20000000 |
772d87a3195Smrg                        pTrident->BltScanDirection |
773d87a3195Smrg                        (7 << 12) | (1 << 4) |
774d87a3195Smrg                        (1 << 19) | (2 << 2) | clip);
775d87a3195Smrg    BLADE_OUT(0x2108, (y << 16) | x);
776d87a3195Smrg    BLADE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
777d87a3195Smrg                        ((x + w - 1) & 0xfff));
778d87a3195Smrg}
779d87a3195Smrg
780d87a3195Smrg#if 0
781d87a3195Smrgstatic void
782d87a3195SmrgBladeSetupForColor8x8PatternFill(ScrnInfoPtr pScrn,
783d87a3195Smrg                                    int patternx, int patterny,
784d87a3195Smrg                                    int rop,
785d87a3195Smrg                                    unsigned int planemask,
786d87a3195Smrg                                    int transparency_color)
787d87a3195Smrg{
788d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
789d87a3195Smrg
790d87a3195Smrg    TGUI_PATLOC(((patterny *
791d87a3195Smrg                        pScrn->displayWidth *
792d87a3195Smrg                        (pScrn->bitsPerPixel / 8)) +
793d87a3195Smrg                    (patternx *
794d87a3195Smrg                        (pScrn->bitsPerPixel / 8))) >> 6);
795d87a3195Smrg    pTrident->BltScanDirection = 0;
796d87a3195Smrg    if (transparency_color != -1) {
797d87a3195Smrg        BLADE_OUT(0x2168, transparency_color & 0xffffff);
798d87a3195Smrg        pTrident->BltScanDirection |= (1 << 6);
799d87a3195Smrg    }
800d87a3195Smrg    TGUI_FMIX(XAAGetPatternROP(rop));
801d87a3195Smrg    REPLICATE(planemask);
802d87a3195Smrg    if (planemask != -1) {
803d87a3195Smrg        BLADE_OUT(0x2184, ~planemask);
804d87a3195Smrg        pTrident->BltScanDirection |= (1 << 5);
805d87a3195Smrg    }
806d87a3195Smrg}
807d87a3195Smrg
808d87a3195Smrgstatic void
809d87a3195SmrgBladeSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn,
810d87a3195Smrg                                        int patternx, int patterny,
811d87a3195Smrg                                        int x, int y,
812d87a3195Smrg                                        int w, int h)
813d87a3195Smrg{
814d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
815d87a3195Smrg
816d87a3195Smrg    TGUI_DEST_XY(x, y);
817d87a3195Smrg    TGUI_DIM_XY(w, h);
818d87a3195Smrg    TGUI_COMMAND(GE_BLT);
819d87a3195Smrg    CHECKCLIPPING;
820d87a3195Smrg}
821d87a3195Smrg#endif
822d87a3195Smrg
823d87a3195Smrgstatic void
824d87a3195SmrgBladeSetupForImageWrite(ScrnInfoPtr pScrn,
825d87a3195Smrg                        int rop,
826d87a3195Smrg                        unsigned int planemask,
827d87a3195Smrg                        int transparency_color,
828d87a3195Smrg                        int bpp, int depth)
829d87a3195Smrg{
830d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
831d87a3195Smrg
832d87a3195Smrg    BLADE_OUT(0x2148, XAAGetCopyROP(rop));
833d87a3195Smrg    pTrident->BltScanDirection = 0;
834d87a3195Smrg#if 0
835d87a3195Smrg    REPLICATE(planemask);
836d87a3195Smrg    if (planemask != -1) {
837d87a3195Smrg        BLADE_OUT(0x2184, ~planemask);
838d87a3195Smrg        pTrident->BltScanDirection |= (1 << 5);
839d87a3195Smrg    }
840d87a3195Smrg#endif
841d87a3195Smrg}
842d87a3195Smrg
843d87a3195Smrgstatic void
844d87a3195SmrgBladeSubsequentImageWriteRect(ScrnInfoPtr pScrn,
845d87a3195Smrg                                int x, int y,
846d87a3195Smrg                                int w, int h,
847d87a3195Smrg                                int skipleft)
848d87a3195Smrg{
849d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
850d87a3195Smrg
851d87a3195Smrg    if (skipleft)
852d87a3195Smrg        BladeSetClippingRectangle(pScrn,
853d87a3195Smrg                                    x + skipleft, y,
854d87a3195Smrg                                    (x + w - 1), (y + h - 1));
855d87a3195Smrg    BLADE_OUT(0x2144, 0xE0000000 |
856d87a3195Smrg                        (1 << 19) | (1 << 4) |
857d87a3195Smrg                        pTrident->BltScanDirection |
858d87a3195Smrg                        (skipleft ? 1 : 0));
859d87a3195Smrg    BLADE_OUT(0x2108, (y << 16) | (x & 0xfff));
860d87a3195Smrg    BLADE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
861d87a3195Smrg                        ((x + w - 1) & 0xfff));
862d87a3195Smrg}
863d87a3195Smrg#endif
864