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 3DImage' 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
47d87a3195Smrg
48d87a3195Smrgstatic void ImageSync(ScrnInfoPtr pScrn);
49d87a3195Smrgstatic void ImageSyncClip(ScrnInfoPtr pScrn);
50d87a3195Smrg#if 0
51d87a3195Smrgstatic void ImageSetupForSolidLine(ScrnInfoPtr pScrn,
52d87a3195Smrg                                    int color,
53d87a3195Smrg                                    int rop,
54d87a3195Smrg                                    unsigned int planemask);
55d87a3195Smrgstatic void ImageSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn,
56d87a3195Smrg                                                int x, int y,
57d87a3195Smrg                                                int dmaj, int dmin,
58d87a3195Smrg                                                int e, int len,
59d87a3195Smrg                                                int octant);
60d87a3195Smrg#endif
61d87a3195Smrgstatic void ImageSetupForFillRectSolid(ScrnInfoPtr pScrn,
62d87a3195Smrg                                            int color,
63d87a3195Smrg                                            int rop,
64d87a3195Smrg                                            unsigned int planemask);
65d87a3195Smrgstatic void ImageSubsequentFillRectSolid(ScrnInfoPtr pScrn,
66d87a3195Smrg                                            int x, int y,
67d87a3195Smrg                                            int w, int h);
68d87a3195Smrgstatic void ImageSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
69d87a3195Smrg                                                int x1, int y1,
70d87a3195Smrg                                                int x2, int y2,
71d87a3195Smrg                                                int w, int h);
72d87a3195Smrgstatic void ImageSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
73d87a3195Smrg                                            int xdir, int ydir,
74d87a3195Smrg                                            int rop,
75d87a3195Smrg                                            unsigned int planemask,
76d87a3195Smrg                                            int transparency_color);
77d87a3195Smrgstatic void ImageSetClippingRectangle(ScrnInfoPtr pScrn,
78d87a3195Smrg                                        int x1, int y1,
79d87a3195Smrg                                        int x2, int y2);
80d87a3195Smrgstatic void ImageDisableClipping(ScrnInfoPtr pScrn);
81d87a3195Smrgstatic void ImageSetupForMono8x8PatternFill(ScrnInfoPtr pScrn,
82d87a3195Smrg                                            int patternx,
83d87a3195Smrg                                            int patterny,
84d87a3195Smrg                                            int fg, int bg,
85d87a3195Smrg                                            int rop,
86d87a3195Smrg                                            unsigned int planemask);
87d87a3195Smrgstatic void ImageSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn,
88d87a3195Smrg                                                    int patternx,
89d87a3195Smrg                                                    int patterny,
90d87a3195Smrg                                                    int x, int y,
91d87a3195Smrg                                                    int w, int h);
92d87a3195Smrg#if 0
93d87a3195Smrgstatic void ImageSetupForColor8x8PatternFill(ScrnInfoPtr pScrn,
94d87a3195Smrg                                                int patternx,
95d87a3195Smrg                                                int patterny,
96d87a3195Smrg                                                int rop,
97d87a3195Smrg                                                unsigned int planemask,
98d87a3195Smrg                                                int trans_col);
99d87a3195Smrgstatic void ImageSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn,
100d87a3195Smrg                                                    int patternx,
101d87a3195Smrg                                                    int patterny,
102d87a3195Smrg                                                    int x, int y,
103d87a3195Smrg                                                    int w, int h);
104d87a3195Smrg#endif
105d87a3195Smrgstatic void ImageSetupForScanlineImageWrite(ScrnInfoPtr pScrn,
106d87a3195Smrg                                            int rop,
107d87a3195Smrg                                            unsigned int planemask,
108d87a3195Smrg                                            int transparency_color,
109d87a3195Smrg                                            int bpp,
110d87a3195Smrg                                            int depth);
111d87a3195Smrgstatic void ImageSubsequentScanlineImageWriteRect(ScrnInfoPtr pScrn,
112d87a3195Smrg                                                    int x, int y,
113d87a3195Smrg                                                    int w, int h,
114d87a3195Smrg                                                    int skipleft);
115d87a3195Smrgstatic void ImageSubsequentImageWriteScanline(ScrnInfoPtr pScrn,
116d87a3195Smrg                                                int bufno);
117d87a3195Smrgstatic void ImageSetupForScanlineCPUToScreenColorExpandFill(
118d87a3195Smrg                                            ScrnInfoPtr pScrn,
119d87a3195Smrg                                            int fg, int bg,
120d87a3195Smrg                                            int rop,
121d87a3195Smrg                                            unsigned int planemask);
122d87a3195Smrgstatic void ImageSubsequentScanlineCPUToScreenColorExpandFill(
123d87a3195Smrg                                                    ScrnInfoPtr pScrn,
124d87a3195Smrg                                                    int x, int y,
125d87a3195Smrg                                                    int w, int h,
126d87a3195Smrg                                                    int skipleft);
127d87a3195Smrgstatic void ImageSubsequentColorExpandScanline(ScrnInfoPtr pScrn,
128d87a3195Smrg                                                int bufno);
129d87a3195Smrg
130d87a3195Smrg
131d87a3195Smrgstatic void
132d87a3195SmrgImageInitializeAccelerator(ScrnInfoPtr pScrn)
133d87a3195Smrg{
134d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
135d87a3195Smrg
136d87a3195Smrg    switch (pScrn->depth) {
137d87a3195Smrg    case 8:
138d87a3195Smrg        pTrident->EngineOperation = 0;
139d87a3195Smrg        break;
140d87a3195Smrg    case 15:
141d87a3195Smrg        pTrident->EngineOperation = 5;
142d87a3195Smrg        break;
143d87a3195Smrg    case 16:
144d87a3195Smrg        pTrident->EngineOperation = 1;
145d87a3195Smrg        break;
146d87a3195Smrg    case 24:
147d87a3195Smrg        pTrident->EngineOperation = 2;
148d87a3195Smrg        break;
149d87a3195Smrg    }
150d87a3195Smrg    IMAGE_OUT(0x2120, 0xF0000000);
151d87a3195Smrg    IMAGE_OUT(0x2120, 0x40000000 | pTrident->EngineOperation);
152d87a3195Smrg    IMAGE_OUT(0x2120, 0x80000000);
153d87a3195Smrg    IMAGE_OUT(0x2144, 0x00000000);
154d87a3195Smrg    IMAGE_OUT(0x2148, 0x00000000);
155d87a3195Smrg    IMAGE_OUT(0x2150, 0x00000000);
156d87a3195Smrg    IMAGE_OUT(0x2154, 0x00000000);
157d87a3195Smrg    IMAGE_OUT(0x2120, 0x60000000 |
158d87a3195Smrg                        (pScrn->displayWidth << 16) |
159d87a3195Smrg                        pScrn->displayWidth);
160d87a3195Smrg    IMAGE_OUT(0x216C, 0x00000000);
161d87a3195Smrg    IMAGE_OUT(0x2170, 0x00000000);
162d87a3195Smrg    IMAGE_OUT(0x217C, 0x00000000);
163d87a3195Smrg    IMAGE_OUT(0x2120, 0x10000000);
164d87a3195Smrg    IMAGE_OUT(0x2130, (2047 << 16) | 2047);
165d87a3195Smrg    pTrident->Clipping = FALSE;
166d87a3195Smrg    pTrident->DstEnable = FALSE;
167d87a3195Smrg}
168d87a3195Smrg#endif
169d87a3195Smrg
170d87a3195SmrgBool
171d87a3195SmrgImageAccelInit(ScreenPtr pScreen)
172d87a3195Smrg{
173d87a3195Smrg#ifdef HAVE_XAA_H
174d87a3195Smrg    XAAInfoRecPtr infoPtr;
175d87a3195Smrg    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
176d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
177d87a3195Smrg
178d87a3195Smrg    if (pTrident->NoAccel)
179d87a3195Smrg        return FALSE;
180d87a3195Smrg
181d87a3195Smrg    pTrident->AccelInfoRec = infoPtr = XAACreateInfoRec();
182d87a3195Smrg    if (!infoPtr) return FALSE;
183d87a3195Smrg
184d87a3195Smrg    pTrident->InitializeAccelerator = ImageInitializeAccelerator;
185d87a3195Smrg    ImageInitializeAccelerator(pScrn);
186d87a3195Smrg
187d87a3195Smrg    infoPtr->Flags = PIXMAP_CACHE |
188d87a3195Smrg            LINEAR_FRAMEBUFFER |
189d87a3195Smrg            OFFSCREEN_PIXMAPS;
190d87a3195Smrg
191d87a3195Smrg    infoPtr->Sync = ImageSync;
192d87a3195Smrg
193d87a3195Smrg#if 0
194d87a3195Smrg    infoPtr->SetClippingRectangle = ImageSetClippingRectangle;
195d87a3195Smrg    infoPtr->DisableClipping = ImageDisableClipping;
196d87a3195Smrg    infoPtr->ClippingFlags = HARDWARE_CLIP_SOLID_FILL |
197d87a3195Smrg                                HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY |
198d87a3195Smrg                                HARDWARE_CLIP_MONO_8x8_FILL;
199d87a3195Smrg#endif
200d87a3195Smrg
201d87a3195Smrg#if 0
202d87a3195Smrg    infoPtr->SolidLineFlags = NO_PLANEMASK;
203d87a3195Smrg    infoPtr->SetupForSolidLine = ImageSetupForSolidLine;
204d87a3195Smrg    infoPtr->SolidBresenhamLineErrorTermBits = 13;
205d87a3195Smrg    infoPtr->SubsequentSolidBresenhamLine =
206d87a3195Smrg                                    ImageSubsequentSolidBresenhamLine;
207d87a3195Smrg    infoPtr->ClippingFlags |= HARDWARE_CLIP_SOLID_LINE;
208d87a3195Smrg#endif
209d87a3195Smrg
210d87a3195Smrg    infoPtr->SolidFillFlags = NO_PLANEMASK;
211d87a3195Smrg    infoPtr->SetupForSolidFill = ImageSetupForFillRectSolid;
212d87a3195Smrg    infoPtr->SubsequentSolidFillRect = ImageSubsequentFillRectSolid;
213d87a3195Smrg
214d87a3195Smrg    infoPtr->ScreenToScreenCopyFlags = NO_PLANEMASK |
215d87a3195Smrg                                        NO_TRANSPARENCY |
216d87a3195Smrg                                        ONLY_TWO_BITBLT_DIRECTIONS;
217d87a3195Smrg
218d87a3195Smrg    infoPtr->SetupForScreenToScreenCopy =
219d87a3195Smrg                                    ImageSetupForScreenToScreenCopy;
220d87a3195Smrg    infoPtr->SubsequentScreenToScreenCopy =
221d87a3195Smrg                                    ImageSubsequentScreenToScreenCopy;
222d87a3195Smrg
223d87a3195Smrg    infoPtr->Mono8x8PatternFillFlags =  NO_PLANEMASK |
224d87a3195Smrg                                    BIT_ORDER_IN_BYTE_MSBFIRST |
225d87a3195Smrg                                    HARDWARE_PATTERN_SCREEN_ORIGIN |
226d87a3195Smrg                                    HARDWARE_PATTERN_PROGRAMMED_BITS;
227d87a3195Smrg
228d87a3195Smrg    infoPtr->SetupForMono8x8PatternFill =
229d87a3195Smrg                                    ImageSetupForMono8x8PatternFill;
230d87a3195Smrg    infoPtr->SubsequentMono8x8PatternFillRect =
231d87a3195Smrg                                ImageSubsequentMono8x8PatternFillRect;
232d87a3195Smrg
233d87a3195Smrg#if 0
234d87a3195Smrg    infoPtr->Color8x8PatternFillFlags = NO_PLANEMASK |
235d87a3195Smrg                                    NO_TRANSPARENCY |
236d87a3195Smrg                                    HARDWARE_PATTERN_SCREEN_ORIGIN |
237d87a3195Smrg                                    BIT_ORDER_IN_BYTE_MSBFIRST;
238d87a3195Smrg
239d87a3195Smrg    infoPtr->SetupForColor8x8PatternFill =
240d87a3195Smrg                                    ImageSetupForColor8x8PatternFill;
241d87a3195Smrg    infoPtr->SubsequentColor8x8PatternFillRect =
242d87a3195Smrg                            ImageSubsequentColor8x8PatternFillRect;
243d87a3195Smrg    infoPtr->ClippingFlags |= HARDWARE_CLIP_COLOR_8x8_FILL;
244d87a3195Smrg#endif
245d87a3195Smrg
246d87a3195Smrg    if (pTrident->Chipset != CYBER9397DVD) {
247d87a3195Smrg        /*
248d87a3195Smrg         * It seems as though the 9397DVD doesn't like the transfer
249d87a3195Smrg         * window.  But then, I've also tried at the two port
250d87a3195Smrg         * addresses too, with no luck.  Disable for this chipset for
251d87a3195Smrg         * now. I'd guess there's some extra setup needed for this
252d87a3195Smrg         * chipset.
253d87a3195Smrg         */
254d87a3195Smrg        infoPtr->ScanlineCPUToScreenColorExpandFillFlags =
255d87a3195Smrg                                            NO_PLANEMASK |
256d87a3195Smrg                                            LEFT_EDGE_CLIPPING |
257d87a3195Smrg                                            BIT_ORDER_IN_BYTE_MSBFIRST;
258d87a3195Smrg
259d87a3195Smrg        pTrident->XAAScanlineColorExpandBuffers[0] =
260d87a3195Smrg                            xnfalloc(((pScrn->virtualX + 63)) * 4 *
261d87a3195Smrg                                        (pScrn->bitsPerPixel / 8));
262d87a3195Smrg
263d87a3195Smrg        infoPtr->NumScanlineColorExpandBuffers = 1;
264d87a3195Smrg        infoPtr->ScanlineColorExpandBuffers =
265d87a3195Smrg                            pTrident->XAAScanlineColorExpandBuffers;
266d87a3195Smrg
267d87a3195Smrg        infoPtr->SetupForScanlineCPUToScreenColorExpandFill =
268d87a3195Smrg                    ImageSetupForScanlineCPUToScreenColorExpandFill;
269d87a3195Smrg        infoPtr->SubsequentScanlineCPUToScreenColorExpandFill =
270d87a3195Smrg                    ImageSubsequentScanlineCPUToScreenColorExpandFill;
271d87a3195Smrg        infoPtr->SubsequentColorExpandScanline =
272d87a3195Smrg                                ImageSubsequentColorExpandScanline;
273d87a3195Smrg
274d87a3195Smrg        infoPtr->ScanlineImageWriteFlags = NO_PLANEMASK |
275d87a3195Smrg                                                LEFT_EDGE_CLIPPING;
276d87a3195Smrg
277d87a3195Smrg        infoPtr->SetupForScanlineImageWrite =
278d87a3195Smrg                                    ImageSetupForScanlineImageWrite;
279d87a3195Smrg        infoPtr->SubsequentScanlineImageWriteRect =
280d87a3195Smrg                ImageSubsequentScanlineImageWriteRect;
281d87a3195Smrg        infoPtr->SubsequentImageWriteScanline =
282d87a3195Smrg                                    ImageSubsequentImageWriteScanline;
283d87a3195Smrg
284d87a3195Smrg        infoPtr->NumScanlineImageWriteBuffers = 1;
285d87a3195Smrg        infoPtr->ScanlineImageWriteBuffers =
286d87a3195Smrg                                    pTrident->XAAImageScanlineBuffer;
287d87a3195Smrg
288d87a3195Smrg        pTrident->XAAImageScanlineBuffer[0] =
289d87a3195Smrg                xnfalloc(pScrn->virtualX * pScrn->bitsPerPixel / 8);
290d87a3195Smrg
291d87a3195Smrg        infoPtr->ImageWriteBase = pTrident->IOBase + 0x10000;
292d87a3195Smrg    }
293d87a3195Smrg
294d87a3195Smrg    return(XAAInit(pScreen, infoPtr));
295d87a3195Smrg#else
296d87a3195Smrg    return FALSE;
297d87a3195Smrg#endif
298d87a3195Smrg}
299d87a3195Smrg
300d87a3195Smrg#ifdef HAVE_XAA_H
301d87a3195Smrgstatic void
302d87a3195SmrgImageSync(ScrnInfoPtr pScrn)
303d87a3195Smrg{
304d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
305d87a3195Smrg    int busy;
306d87a3195Smrg    int cnt = 5000000;
307d87a3195Smrg
308d87a3195Smrg    if (pTrident->Clipping) ImageDisableClipping(pScrn);
309d87a3195Smrg    if (pTrident->DstEnable) {
310d87a3195Smrg        IMAGE_OUT(0x2120, 0x70000000);
311d87a3195Smrg        pTrident->DstEnable = FALSE;
312d87a3195Smrg    }
313d87a3195Smrg
314d87a3195Smrg    IMAGEBUSY(busy);
315d87a3195Smrg    while (busy != 0) {
316d87a3195Smrg        if (--cnt < 0) {
317d87a3195Smrg            ErrorF("GE timeout\n");
318d87a3195Smrg            IMAGE_OUT(0x2164, 0x80000000);
319d87a3195Smrg        }
320d87a3195Smrg
321d87a3195Smrg        IMAGEBUSY(busy);
322d87a3195Smrg    }
323d87a3195Smrg}
324d87a3195Smrg
325d87a3195Smrgstatic void
326d87a3195SmrgImageSyncClip(ScrnInfoPtr pScrn)
327d87a3195Smrg{
328d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
329d87a3195Smrg    int busy;
330d87a3195Smrg    int cnt = 5000000;
331d87a3195Smrg
332d87a3195Smrg    IMAGEBUSY(busy);
333d87a3195Smrg    while (busy != 0) {
334d87a3195Smrg        if (--cnt < 0) {
335d87a3195Smrg            ErrorF("GE timeout\n");
336d87a3195Smrg            IMAGE_OUT(0x2164, 0x80000000);
337d87a3195Smrg        }
338d87a3195Smrg
339d87a3195Smrg        IMAGEBUSY(busy);
340d87a3195Smrg    }
341d87a3195Smrg}
342d87a3195Smrg
343d87a3195Smrgstatic void
344d87a3195SmrgImageSetupForScreenToScreenCopy(ScrnInfoPtr pScrn,
345d87a3195Smrg                                int xdir, int ydir,
346d87a3195Smrg                                int rop,
347d87a3195Smrg                                unsigned int planemask,
348d87a3195Smrg                                int transparency_color)
349d87a3195Smrg{
350d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
351d87a3195Smrg
352d87a3195Smrg    pTrident->BltScanDirection = 0;
353d87a3195Smrg    if ((xdir < 0) || (ydir < 0))
354d87a3195Smrg        pTrident->BltScanDirection |= (1 << 2);
355d87a3195Smrg
356d87a3195Smrg    IMAGE_OUT(0x2120, 0x80000000);
357d87a3195Smrg    IMAGE_OUT(0x2120, 0x90000000 | XAAGetCopyROP(rop));
358d87a3195Smrg
359d87a3195Smrg    if (transparency_color != -1) {
360d87a3195Smrg        IMAGE_OUT(0x2120, 0x70000000 |
361d87a3195Smrg                            (1 << 26) |
362d87a3195Smrg                            (transparency_color & 0xffffff));
363d87a3195Smrg        pTrident->DstEnable = TRUE;
364d87a3195Smrg    }
365d87a3195Smrg}
366d87a3195Smrg
367d87a3195Smrgstatic void
368d87a3195SmrgImageSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
369d87a3195Smrg                                    int x1, int y1,
370d87a3195Smrg                                    int x2, int y2,
371d87a3195Smrg                                    int w, int h)
372d87a3195Smrg{
373d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
374d87a3195Smrg
375d87a3195Smrg    if (pTrident->BltScanDirection) {
376d87a3195Smrg        IMAGE_OUT(0x2100, ((y1 + h - 1) << 16) | (x1 + w - 1));
377d87a3195Smrg        IMAGE_OUT(0x2104, (y1 << 16) | x1);
378d87a3195Smrg        IMAGE_OUT(0x2108, ((y2 + h - 1) << 16) | (x2 + w - 1));
379d87a3195Smrg        IMAGE_OUT(0x210C, y2<<16 | x2);
380d87a3195Smrg    } else {
381d87a3195Smrg        IMAGE_OUT(0x2100, (y1 << 16) | x1);
382d87a3195Smrg        IMAGE_OUT(0x2104, ((y1 + h - 1) << 16) | (x1 + w - 1));
383d87a3195Smrg        IMAGE_OUT(0x2108, (y2 << 16) | x2);
384d87a3195Smrg        IMAGE_OUT(0x210C, ((y2 + h - 1) << 16) | (x2 + w - 1));
385d87a3195Smrg    }
386d87a3195Smrg
387d87a3195Smrg    IMAGE_OUT(0x2124, 0x80000000 |
388d87a3195Smrg                        (1 << 7) | (1 << 22) | (1 << 10) |
389d87a3195Smrg                        pTrident->BltScanDirection |
390d87a3195Smrg                        (pTrident->Clipping ? 1 : 0));
391d87a3195Smrg
392d87a3195Smrg    if (!pTrident->UsePCIRetry)
393d87a3195Smrg        ImageSyncClip(pScrn);
394d87a3195Smrg}
395d87a3195Smrg
396d87a3195Smrgstatic void
397d87a3195SmrgImageSetClippingRectangle(ScrnInfoPtr pScrn,
398d87a3195Smrg                            int x1, int y1,
399d87a3195Smrg                            int x2, int y2)
400d87a3195Smrg{
401d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
402d87a3195Smrg
403d87a3195Smrg    IMAGE_OUT(0x2120, 0x10000000 |
404d87a3195Smrg                        ((y1 & 0xfff) << 16) | (x1 & 0xfff));
405d87a3195Smrg    IMAGE_OUT(0x2130, ((y2 & 0xfff) << 16) | (x2 & 0xfff));
406d87a3195Smrg    pTrident->Clipping = TRUE;
407d87a3195Smrg}
408d87a3195Smrg
409d87a3195Smrgstatic void
410d87a3195SmrgImageDisableClipping(ScrnInfoPtr pScrn)
411d87a3195Smrg{
412d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
413d87a3195Smrg    pTrident->Clipping = FALSE;
414d87a3195Smrg}
415d87a3195Smrg
416d87a3195Smrg#if 0
417d87a3195Smrgstatic void
418d87a3195SmrgImageSetupForSolidLine(ScrnInfoPtr pScrn,
419d87a3195Smrg                        int color,
420d87a3195Smrg                        int rop,
421d87a3195Smrg                        unsigned int planemask)
422d87a3195Smrg{
423d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
424d87a3195Smrg
425d87a3195Smrg    REPLICATE(color);
426d87a3195Smrg    IMAGE_OUT(0x2120, 0x84000000);
427d87a3195Smrg    IMAGE_OUT(0x2120, 0x90000000 | XAAGetCopyROP(rop));
428d87a3195Smrg    IMAGE_OUT(0x2144, color);
429d87a3195Smrg}
430d87a3195Smrg
431d87a3195Smrgstatic void
432d87a3195SmrgImageSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn,
433d87a3195Smrg                                    int x, int y,
434d87a3195Smrg                                    int dmaj, int dmin,
435d87a3195Smrg                                    int e, int len, int octant)
436d87a3195Smrg{
437d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
438d87a3195Smrg    int tmp;
439d87a3195Smrg    int D = 0, E = 0, ymajor = 0;
440d87a3195Smrg
441d87a3195Smrg    IMAGE_OUT(0x2124, 0x20000000 |
442d87a3195Smrg                        (3 << 22) | (1 << 10) | (1 << 9) |
443d87a3195Smrg                        (pTrident->Clipping ? 1 : 0));
444d87a3195Smrg    if (!(octant & YMAJOR)) {
445d87a3195Smrg        if ((!(octant & XDECREASING)) && (!(octant & YDECREASING))) {
446d87a3195Smrg            E = 1;
447d87a3195Smrg            D = 0;
448d87a3195Smrg        }
449d87a3195Smrg
450d87a3195Smrg        if ((!(octant & XDECREASING)) && ( (octant & YDECREASING))) {
451d87a3195Smrg            E = 1;
452d87a3195Smrg            D = 1;
453d87a3195Smrg        }
454d87a3195Smrg
455d87a3195Smrg        if (( (octant & XDECREASING)) && (!(octant & YDECREASING))) {
456d87a3195Smrg            E = 1;
457d87a3195Smrg            D = 2;
458d87a3195Smrg        }
459d87a3195Smrg        if (( (octant & XDECREASING)) && ( (octant & YDECREASING))) {
460d87a3195Smrg            E = 1;
461d87a3195Smrg            D = 3;
462d87a3195Smrg        }
463d87a3195Smrg
464d87a3195Smrg        ymajor = 0;
465d87a3195Smrg    } else {
466d87a3195Smrg        if ((!(octant & XDECREASING)) && (!(octant & YDECREASING))) {
467d87a3195Smrg            E = 0;
468d87a3195Smrg            D = 0;
469d87a3195Smrg        }
470d87a3195Smrg
471d87a3195Smrg        if ((!(octant & XDECREASING)) && ( (octant & YDECREASING))) {
472d87a3195Smrg            E = 0;
473d87a3195Smrg            D = 2;
474d87a3195Smrg        }
475d87a3195Smrg
476d87a3195Smrg        if (( (octant & XDECREASING)) && (!(octant & YDECREASING))) {
477d87a3195Smrg            E = 0;
478d87a3195Smrg            D = 1;
479d87a3195Smrg        }
480d87a3195Smrg
481d87a3195Smrg        if (( (octant & XDECREASING)) && ( (octant & YDECREASING))) {
482d87a3195Smrg            E = 0;
483d87a3195Smrg            D = 3;
484d87a3195Smrg        }
485d87a3195Smrg
486d87a3195Smrg        ymajor = (1 << 18);
487d87a3195Smrg    }
488d87a3195Smrg
489d87a3195Smrg    if (E) {
490d87a3195Smrg        tmp = x;
491d87a3195Smrg        x = y;
492d87a3195Smrg        y = tmp;
493d87a3195Smrg    }
494d87a3195Smrg    if (D & 0x02) {
495d87a3195Smrg        IMAGE_OUT(0x21FC, 0x20000000 |
496d87a3195Smrg                            (1 << 27) | (1 << 19) | (1 << 17) |
497d87a3195Smrg                            ymajor | (x + len - 1));
498d87a3195Smrg    } else {
499d87a3195Smrg        IMAGE_OUT(0x21FC, 0x20000000 |
500d87a3195Smrg                            (1 << 27) | (1 << 19) | (1 << 17) |
501d87a3195Smrg                            ymajor | ( y + len - 1));
502d87a3195Smrg    }
503d87a3195Smrg    IMAGE_OUT(0x2100, (E << 30) | ((y & 0xfff) << 16) | (x & 0xfff));
504d87a3195Smrg    IMAGE_OUT(0x2104, (D << 30) |
505d87a3195Smrg                        (((dmaj - dmin) & 0xfff) << 16) |
506d87a3195Smrg                        (-dmin & 0xfff));
507d87a3195Smrg    IMAGE_OUT(0x2108, ((-e & 0xfff) << 16));
508d87a3195Smrg
509d87a3195Smrg    if (!pTrident->UsePCIRetry)
510d87a3195Smrg        ImageSyncClip(pScrn);
511d87a3195Smrg}
512d87a3195Smrg#endif
513d87a3195Smrg
514d87a3195Smrgstatic void
515d87a3195SmrgImageSetupForFillRectSolid(ScrnInfoPtr pScrn,
516d87a3195Smrg                            int color,
517d87a3195Smrg                            int rop,
518d87a3195Smrg                            unsigned int planemask)
519d87a3195Smrg{
520d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
521d87a3195Smrg
522d87a3195Smrg    REPLICATE(color);
523d87a3195Smrg    IMAGE_OUT(0x2120, 0x80000000);
524d87a3195Smrg    IMAGE_OUT(0x2120, 0x90000000 | XAAGetCopyROP(rop));
525d87a3195Smrg    IMAGE_OUT(0x2144, color);
526d87a3195Smrg}
527d87a3195Smrg
528d87a3195Smrgstatic void
529d87a3195SmrgImageSubsequentFillRectSolid(ScrnInfoPtr pScrn,
530d87a3195Smrg                                int x, int y,
531d87a3195Smrg                                int w, int h)
532d87a3195Smrg{
533d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
534d87a3195Smrg
535d87a3195Smrg    if ((w <= 0) || (h <= 0))
536d87a3195Smrg        return;
537d87a3195Smrg
538d87a3195Smrg    IMAGE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff));
539d87a3195Smrg    IMAGE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
540d87a3195Smrg                        ((x + w - 1) & 0xfff));
541d87a3195Smrg    IMAGE_OUT(0x2124, 0x80000000 |
542d87a3195Smrg                        (3 << 22) | (1 << 10) | (1 << 9) |
543d87a3195Smrg                        (pTrident->Clipping ? 1 : 0));
544d87a3195Smrg    if (!pTrident->UsePCIRetry)
545d87a3195Smrg        ImageSyncClip(pScrn);
546d87a3195Smrg}
547d87a3195Smrg
548d87a3195Smrgstatic void
549d87a3195SmrgMoveDWORDS(register CARD32* dest,
550d87a3195Smrg            register CARD32* src,
551d87a3195Smrg            register int dwords )
552d87a3195Smrg{
553d87a3195Smrg    Bool extra = FALSE;
554d87a3195Smrg
555d87a3195Smrg    if (dwords & 0x01) extra = TRUE;
556d87a3195Smrg
557d87a3195Smrg    while(dwords & ~0x03) {
558d87a3195Smrg        *dest = *src;
559d87a3195Smrg        *(dest + 1) = *(src + 1);
560d87a3195Smrg        *(dest + 2) = *(src + 2);
561d87a3195Smrg        *(dest + 3) = *(src + 3);
562d87a3195Smrg        src += 4;
563d87a3195Smrg        dest += 4;
564d87a3195Smrg        dwords -= 4;
565d87a3195Smrg    }
566d87a3195Smrg
567d87a3195Smrg    if(!dwords) {
568d87a3195Smrg        if (extra) *dest = 0x00000000;
569d87a3195Smrg        return;
570d87a3195Smrg    }
571d87a3195Smrg
572d87a3195Smrg    *dest = *src;
573d87a3195Smrg    if(dwords == 1) {
574d87a3195Smrg        if (extra) *(dest + 1) = 0x00000000;
575d87a3195Smrg        return;
576d87a3195Smrg    }
577d87a3195Smrg
578d87a3195Smrg    *(dest + 1) = *(src + 1);
579d87a3195Smrg    if(dwords == 2) {
580d87a3195Smrg        if (extra) *(dest + 2) = 0x00000000;
581d87a3195Smrg        return;
582d87a3195Smrg    }
583d87a3195Smrg
584d87a3195Smrg    *(dest + 2) = *(src + 2);
585d87a3195Smrg    if (extra) *(dest + 3) = 0x00000000;
586d87a3195Smrg}
587d87a3195Smrg
588d87a3195Smrgstatic void
589d87a3195SmrgImageSetupForMono8x8PatternFill(ScrnInfoPtr pScrn,
590d87a3195Smrg                                int patternx, int patterny,
591d87a3195Smrg                                int fg, int bg,
592d87a3195Smrg                                int rop,
593d87a3195Smrg                                unsigned int planemask)
594d87a3195Smrg{
595d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
596d87a3195Smrg
597d87a3195Smrg    IMAGE_OUT(0x2120, 0x90000000 | XAAGetPatternROP(rop));
598d87a3195Smrg    if (bg == -1) {
599d87a3195Smrg        REPLICATE(fg);
600d87a3195Smrg        IMAGE_OUT(0x2120, 0x80000000 | (1 << 27));
601d87a3195Smrg        IMAGE_OUT(0x2130, patternx);
602d87a3195Smrg        IMAGE_OUT(0x2134, patterny);
603d87a3195Smrg        IMAGE_OUT(0x2150, fg);
604d87a3195Smrg        IMAGE_OUT(0x2154, ~fg);
605d87a3195Smrg    } else {
606d87a3195Smrg        REPLICATE(bg);
607d87a3195Smrg        REPLICATE(fg);
608d87a3195Smrg        IMAGE_OUT(0x2120, 0x80000000 | (1 << 27) | (1 << 26));
609d87a3195Smrg        IMAGE_OUT(0x2130, patternx);
610d87a3195Smrg        IMAGE_OUT(0x2134, patterny);
611d87a3195Smrg        IMAGE_OUT(0x2150, fg);
612d87a3195Smrg        IMAGE_OUT(0x2154, bg);
613d87a3195Smrg    }
614d87a3195Smrg}
615d87a3195Smrg
616d87a3195Smrgstatic void
617d87a3195SmrgImageSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn,
618d87a3195Smrg                                        int patternx, int patterny,
619d87a3195Smrg                                        int x, int y,
620d87a3195Smrg                                        int w, int h)
621d87a3195Smrg{
622d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
623d87a3195Smrg
624d87a3195Smrg    IMAGE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff));
625d87a3195Smrg    IMAGE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
626d87a3195Smrg                        ((x + w - 1) & 0xfff));
627d87a3195Smrg    IMAGE_OUT(0x2124, 0x80000000 |
628d87a3195Smrg                        (7 << 18) | (1 << 22) | (1 << 10) | (1 << 9) |
629d87a3195Smrg                        (pTrident->Clipping ? 1 : 0));
630d87a3195Smrg    if (!pTrident->UsePCIRetry)
631d87a3195Smrg        ImageSyncClip(pScrn);
632d87a3195Smrg}
633d87a3195Smrg
634d87a3195Smrg#if 0
635d87a3195Smrgstatic void
636d87a3195SmrgImageSetupForColor8x8PatternFill(ScrnInfoPtr pScrn,
637d87a3195Smrg                                    int patternx, int patterny,
638d87a3195Smrg                                    int rop,
639d87a3195Smrg                                    unsigned int planemask,
640d87a3195Smrg                                    int transparency_color)
641d87a3195Smrg{
642d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
643d87a3195Smrg
644d87a3195Smrg    IMAGE_OUT(0x2120, 0x90000000 | XAAGetPatternROP(rop));
645d87a3195Smrg    IMAGE_OUT(0x2120, 0x80000000 | (1 << 26));
646d87a3195Smrg    if (transparency_color != -1) {
647d87a3195Smrg        IMAGE_OUT(0x2120, 0x70000000 |
648d87a3195Smrg                            (1 << 26) |
649d87a3195Smrg                            (transparency_color & 0xffffff));
650d87a3195Smrg        pTrident->DstEnable = TRUE;
651d87a3195Smrg    }
652d87a3195Smrg}
653d87a3195Smrg
654d87a3195Smrgstatic void
655d87a3195SmrgImageSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn,
656d87a3195Smrg                                        int patternx, int patterny,
657d87a3195Smrg                                        int x, int y,
658d87a3195Smrg                                        int w, int h)
659d87a3195Smrg{
660d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
661d87a3195Smrg
662d87a3195Smrg    IMAGE_OUT(0x2100, ((patterny & 0xfff) << 16) |
663d87a3195Smrg                        (patternx & 0xfff));
664d87a3195Smrg    IMAGE_OUT(0x2104, (((patterny + h - 1) & 0xfff) << 16) |
665d87a3195Smrg                        ((patternx + w - 1) & 0xfff));
666d87a3195Smrg    IMAGE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff));
667d87a3195Smrg    IMAGE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
668d87a3195Smrg                        ((x + w - 1) & 0xfff));
669d87a3195Smrg    IMAGE_OUT(0x2124, 0x80000000 |
670d87a3195Smrg                        (1 << 22) | (1 << 10) | (1 << 7) |
671d87a3195Smrg                        (pTrident->Clipping ? 1 : 0));
672d87a3195Smrg    if (!pTrident->UsePCIRetry)
673d87a3195Smrg        ImageSyncClip(pScrn);
674d87a3195Smrg}
675d87a3195Smrg#endif
676d87a3195Smrg
677d87a3195Smrgstatic void
678d87a3195SmrgImageSetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
679d87a3195Smrg                                                int fg, int bg,
680d87a3195Smrg                                                int rop,
681d87a3195Smrg                                                unsigned int planemask
682d87a3195Smrg){
683d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
684d87a3195Smrg
685d87a3195Smrg    IMAGE_OUT(0x2120, 0x80000000);
686d87a3195Smrg    IMAGE_OUT(0x2120, 0x90000000 | XAAGetCopyROP(rop));
687d87a3195Smrg    if (bg == -1) {
688d87a3195Smrg        pTrident->ROP = (2 << 22);
689d87a3195Smrg        REPLICATE(fg);
690d87a3195Smrg        IMAGE_OUT(0x2144, fg);
691d87a3195Smrg        IMAGE_OUT(0x2148, ~fg);
692d87a3195Smrg    } else {
693d87a3195Smrg        pTrident->ROP = (3 << 22);
694d87a3195Smrg        REPLICATE(fg);
695d87a3195Smrg        IMAGE_OUT(0x2144, fg);
696d87a3195Smrg        REPLICATE(bg);
697d87a3195Smrg        IMAGE_OUT(0x2148, bg);
698d87a3195Smrg    }
699d87a3195Smrg}
700d87a3195Smrg
701d87a3195Smrgstatic void
702d87a3195SmrgImageSubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
703d87a3195Smrg                                                    int x, int y,
704d87a3195Smrg                                                    int w, int h,
705d87a3195Smrg                                                    int skipleft
706d87a3195Smrg){
707d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
708d87a3195Smrg    ImageSetClippingRectangle(pScrn,(x + skipleft), y,
709d87a3195Smrg                                (x + w - 1), (y + h - 1));
710d87a3195Smrg    IMAGE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff));
711d87a3195Smrg    IMAGE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
712d87a3195Smrg                        ((x + w - 1) & 0xfff));
713d87a3195Smrg    IMAGE_OUT(0x2124, 0x80000000 | (pTrident->ROP) | (1 << 10) | 1);
714d87a3195Smrg    pTrident->dwords = (w + 31) >> 5;
715d87a3195Smrg    pTrident->h = h;
716d87a3195Smrg}
717d87a3195Smrg
718d87a3195Smrgstatic void
719d87a3195SmrgImageSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno)
720d87a3195Smrg{
721d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
722d87a3195Smrg    XAAInfoRecPtr infoRec;
723d87a3195Smrg    infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
724d87a3195Smrg
725d87a3195Smrg    MoveDWORDS((CARD32*)infoRec->ImageWriteBase,
726d87a3195Smrg            (CARD32*)pTrident->XAAScanlineColorExpandBuffers[bufno],
727d87a3195Smrg            pTrident->dwords);
728d87a3195Smrg
729d87a3195Smrg    pTrident->h--;
730d87a3195Smrg    if (!pTrident->h)
731d87a3195Smrg        ImageSync(pScrn);
732d87a3195Smrg}
733d87a3195Smrg
734d87a3195Smrgstatic void
735d87a3195SmrgImageSetupForScanlineImageWrite(ScrnInfoPtr pScrn,
736d87a3195Smrg                                int rop,
737d87a3195Smrg                                unsigned int planemask,
738d87a3195Smrg                                int transparency_color,
739d87a3195Smrg                                int bpp, int depth)
740d87a3195Smrg{
741d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
742d87a3195Smrg    IMAGE_OUT(0x2120, 0x90000000 | XAAGetCopyROP(rop));
743d87a3195Smrg    if (transparency_color != -1) {
744d87a3195Smrg        IMAGE_OUT(0x2120, 0x70000000 |
745d87a3195Smrg                            (1 << 26) |
746d87a3195Smrg                            (transparency_color & 0xffffff));
747d87a3195Smrg        pTrident->DstEnable = TRUE;
748d87a3195Smrg    }
749d87a3195Smrg
750d87a3195Smrg    IMAGE_OUT(0x2120, 0x80000000);
751d87a3195Smrg}
752d87a3195Smrg
753d87a3195Smrgstatic void
754d87a3195SmrgImageSubsequentScanlineImageWriteRect(ScrnInfoPtr pScrn,
755d87a3195Smrg                                        int x, int y,
756d87a3195Smrg                                        int w, int h,
757d87a3195Smrg                                        int skipleft)
758d87a3195Smrg{
759d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
760d87a3195Smrg    ImageSetClippingRectangle(pScrn,
761d87a3195Smrg                                (x + skipleft), y,
762d87a3195Smrg                                (x + w - 1), (y + h - 1));
763d87a3195Smrg    IMAGE_OUT(0x2108, ((y & 0xfff) << 16) | (x & 0xfff));
764d87a3195Smrg    IMAGE_OUT(0x210C, (((y + h - 1) & 0xfff) << 16) |
765d87a3195Smrg                        ((x + w - 1) & 0xfff));
766d87a3195Smrg    IMAGE_OUT(0x2124, 0x80000000 |
767d87a3195Smrg                        (1 << 22) | (1 << 10) | 1);
768d87a3195Smrg    pTrident->dwords = ((w * (pScrn->bitsPerPixel / 8)) + 3) >> 2;
769d87a3195Smrg    pTrident->h = h;
770d87a3195Smrg}
771d87a3195Smrg
772d87a3195Smrg
773d87a3195Smrgstatic void
774d87a3195SmrgImageSubsequentImageWriteScanline(ScrnInfoPtr pScrn, int bufno)
775d87a3195Smrg{
776d87a3195Smrg    TRIDENTPtr pTrident = TRIDENTPTR(pScrn);
777d87a3195Smrg    XAAInfoRecPtr infoRec;
778d87a3195Smrg    infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
779d87a3195Smrg
780d87a3195Smrg    MoveDWORDS((CARD32*)infoRec->ImageWriteBase,
781d87a3195Smrg                (CARD32*)pTrident->XAAImageScanlineBuffer[bufno],
782d87a3195Smrg                pTrident->dwords);
783d87a3195Smrg
784d87a3195Smrg    pTrident->h--;
785d87a3195Smrg    if (!pTrident->h)
786d87a3195Smrg        ImageSync(pScrn);
787d87a3195Smrg}
788d87a3195Smrg#endif
789