1c35d236eSmrg/*
2c35d236eSmrg * Copyright 1997-2001 by Alan Hourihane, Wigan, England.
3c35d236eSmrg *
4c35d236eSmrg * Permission to use, copy, modify, distribute, and sell this software and its
5c35d236eSmrg * documentation for any purpose is hereby granted without fee, provided that
6c35d236eSmrg * the above copyright notice appear in all copies and that both that
7c35d236eSmrg * copyright notice and this permission notice appear in supporting
8c35d236eSmrg * documentation, and that the name of Alan Hourihane not be used in
9c35d236eSmrg * advertising or publicity pertaining to distribution of the software without
10c35d236eSmrg * specific, written prior permission.  Alan Hourihane makes no representations
11c35d236eSmrg * about the suitability of this software for any purpose.  It is provided
12c35d236eSmrg * "as is" without express or implied warranty.
13c35d236eSmrg *
14c35d236eSmrg * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15c35d236eSmrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16c35d236eSmrg * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17c35d236eSmrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18c35d236eSmrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19c35d236eSmrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20c35d236eSmrg * PERFORMANCE OF THIS SOFTWARE.
21c35d236eSmrg *
22c35d236eSmrg * Authors:  Alan Hourihane, <alanh@fairlite.demon.co.uk>
23c35d236eSmrg *           Dirk Hohndel, <hohndel@suse.de>
24c35d236eSmrg *           Stefan Dirsch, <sndirsch@suse.de>
25c35d236eSmrg *
26c35d236eSmrg * this work is sponsored by S.u.S.E. GmbH, Fuerth, Elsa GmbH, Aachen and
27c35d236eSmrg * Siemens Nixdorf Informationssysteme
28c35d236eSmrg *
29c35d236eSmrg * GLINT 500TX / MX accelerated options.
30c35d236eSmrg */
31c35d236eSmrg
32c35d236eSmrg#ifdef HAVE_CONFIG_H
33c35d236eSmrg#include "config.h"
34c35d236eSmrg#endif
35c35d236eSmrg
36c35d236eSmrg#include "xf86.h"
37c35d236eSmrg#include "xf86_OSproc.h"
38c35d236eSmrg
39c35d236eSmrg#include "xf86Pci.h"
40c35d236eSmrg
41c35d236eSmrg#include "fb.h"
42c35d236eSmrg
43c35d236eSmrg#include "miline.h"
44c35d236eSmrg
45c35d236eSmrg#include "glint_regs.h"
46c35d236eSmrg#include "glint.h"
47c35d236eSmrg
481fb744b4Smrg#ifdef HAVE_XAA_H
49c35d236eSmrg#include "xaalocal.h"	/* For replacements */
50c35d236eSmrg
51c35d236eSmrgstatic void TXSync(ScrnInfoPtr pScrn);
52c35d236eSmrgstatic void DualTXSync(ScrnInfoPtr pScrn);
53c35d236eSmrgstatic void TXSetupForFillRectSolid(ScrnInfoPtr pScrn, int color, int rop,
54c35d236eSmrg						unsigned int planemask);
55c35d236eSmrgstatic void TXSubsequentFillRectSolid(ScrnInfoPtr pScrn, int x, int y,
56c35d236eSmrg						int w, int h);
57c35d236eSmrgstatic void TXSetupForMono8x8PatternFill(ScrnInfoPtr pScrn, int patternx,
58c35d236eSmrg						int patterny,
59c35d236eSmrg					   	int fg, int bg, int rop,
60c35d236eSmrg					   	unsigned int planemask);
61c35d236eSmrgstatic void TXSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, int patternx,
62c35d236eSmrg						int patterny, int x, int y,
63c35d236eSmrg				   		int w, int h);
64c35d236eSmrgstatic void TXSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, int ydir,
65c35d236eSmrg						int rop, unsigned int planemask,
66c35d236eSmrg				    		int transparency_color);
67c35d236eSmrgstatic void TXSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1,
68c35d236eSmrg						int x2, int y2, int w, int h);
69c35d236eSmrgstatic void TXWriteBitmap(ScrnInfoPtr pScrn, int x, int y, int w, int h,
70c35d236eSmrg    				unsigned char *src, int srcwidth,
71c35d236eSmrg				int skipleft, int fg, int bg, int rop,
72c35d236eSmrg    				unsigned int planemask);
73c35d236eSmrgstatic void TXSetClippingRectangle(ScrnInfoPtr pScrn, int x1, int y1,
74c35d236eSmrg						int x2,int y2);
75c35d236eSmrgstatic void TXDisableClipping(ScrnInfoPtr pScrn);
76c35d236eSmrgstatic void TXWritePixmap(ScrnInfoPtr pScrn, int x, int y, int w, int h,
77c35d236eSmrg   				unsigned char *src, int srcwidth, int rop,
78c35d236eSmrg   				unsigned int planemask, int trans,
79c35d236eSmrg   				int bpp, int depth);
80c35d236eSmrgstatic void TXSetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, int fg,
81c35d236eSmrg				int bg, int rop, unsigned int planemask);
82c35d236eSmrgstatic void TXSubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, int x,
83c35d236eSmrg				int y, int w, int h, int skipleft);
84c35d236eSmrgstatic void TXSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno);
85c35d236eSmrgstatic void TXLoadCoord(ScrnInfoPtr pScrn, int x, int y, int w, int h,
86c35d236eSmrg				int a, int d);
87c35d236eSmrgstatic void TXSetupForSolidLine(ScrnInfoPtr pScrn, int color, int rop,
88c35d236eSmrg				unsigned int planemask);
89c35d236eSmrgstatic void TXSubsequentHorVertLine(ScrnInfoPtr pScrn, int x1, int y1,
90c35d236eSmrg				int len, int dir);
91c35d236eSmrgstatic void TXSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn,
92c35d236eSmrg        			int x, int y, int dmaj, int dmin, int e,
93c35d236eSmrg				int len, int octant);
94c35d236eSmrgstatic void TXPolylinesThinSolidWrapper(DrawablePtr pDraw, GCPtr pGC,
95c35d236eSmrg   				int mode, int npt, DDXPointPtr pPts);
96c35d236eSmrgstatic void TXPolySegmentThinSolidWrapper(DrawablePtr pDraw, GCPtr pGC,
97c35d236eSmrg 				int nseg, xSegment *pSeg);
98c35d236eSmrg
99c35d236eSmrgvoid
100c35d236eSmrgTXInitializeEngine(ScrnInfoPtr pScrn)
101c35d236eSmrg{
102c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
103c35d236eSmrg    /* Initialize the Accelerator Engine to defaults */
104c35d236eSmrg    pGlint->rasterizerMode = UNIT_DISABLE;
105c35d236eSmrg
106c35d236eSmrg    if (pGlint->MultiAperture) {
107c35d236eSmrg    	pGlint->rasterizerMode = RMMultiGLINT;
108c35d236eSmrg
109c35d236eSmrg    	/* Only write the following register to the first chip */
110c35d236eSmrg    	GLINT_SLOW_WRITE_REG(1, BroadcastMask);
111c35d236eSmrg    	GLINT_SLOW_WRITE_REG(0x00000001,    ScanLineOwnership);
112c35d236eSmrg
113c35d236eSmrg    	/* Only write the following register to the second chip */
114c35d236eSmrg    	GLINT_SLOW_WRITE_REG(2, BroadcastMask);
115c35d236eSmrg    	GLINT_SLOW_WRITE_REG(0x00000005,    ScanLineOwnership);
116c35d236eSmrg
117c35d236eSmrg    	/* Make sure the rest of the register writes go to both chip's */
118c35d236eSmrg    	GLINT_SLOW_WRITE_REG(3, BroadcastMask);
119c35d236eSmrg
120c35d236eSmrg    	pGlint->pprod |= FBRM_ScanlineInt2;
121c35d236eSmrg    }
122c35d236eSmrg
123c35d236eSmrg    GLINT_SLOW_WRITE_REG(pGlint->pprod, LBReadMode);
124c35d236eSmrg    GLINT_SLOW_WRITE_REG(pGlint->rasterizerMode, RasterizerMode);
125c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE, ScissorMode);
126c35d236eSmrg    GLINT_SLOW_WRITE_REG(pGlint->pprod,	FBReadMode);
127c35d236eSmrg    GLINT_SLOW_WRITE_REG(0, dXSub);
128c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	LBWriteMode);
129c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_ENABLE,	FBWriteMode);
130c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	DitherMode);
131c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	AlphaBlendMode);
132c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	ColorDDAMode);
133c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	TextureColorMode);
134c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	TextureAddressMode);
135c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,  TextureReadMode);
136c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,  GLINTWindow);
137c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,  AlphaBlendMode);
138c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,  DepthMode);
139c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,  RouterMode);
140c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	FogMode);
141c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	AntialiasMode);
142c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	AlphaTestMode);
143c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	StencilMode);
144c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	AreaStippleMode);
145c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	LineStippleMode);
146c35d236eSmrg    GLINT_SLOW_WRITE_REG(0,		UpdateLineStippleCounters);
147c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	LogicalOpMode);
148c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	DepthMode);
149c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	StatisticMode);
150c35d236eSmrg    GLINT_SLOW_WRITE_REG(0x400,		FilterMode);
151c35d236eSmrg    GLINT_SLOW_WRITE_REG(0xffffffff,	FBHardwareWriteMask);
152c35d236eSmrg    GLINT_SLOW_WRITE_REG(0xffffffff,	FBSoftwareWriteMask);
153c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	GLINTDepth);
154c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	FBSourceOffset);
155c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	FBPixelOffset);
156c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	LBSourceOffset);
157c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	WindowOrigin);
158c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	FBWindowBase);
159c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	LBWindowBase);
160c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	TextureAddressMode);
161c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	RouterMode);
162c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	PatternRamMode);
163c35d236eSmrg
164c35d236eSmrg    switch (pScrn->bitsPerPixel) {
165c35d236eSmrg    	case 8:
166c35d236eSmrg	    GLINT_SLOW_WRITE_REG(0x2,	PixelSize);
167c35d236eSmrg	    break;
168c35d236eSmrg	case 16:
169c35d236eSmrg	    GLINT_SLOW_WRITE_REG(0x1,	PixelSize);
170c35d236eSmrg	    break;
171c35d236eSmrg	case 32:
172c35d236eSmrg	    GLINT_SLOW_WRITE_REG(0x0,	PixelSize);
173c35d236eSmrg	    break;
174c35d236eSmrg    }
175c35d236eSmrg    pGlint->ROP = 0xFF;
176c35d236eSmrg    pGlint->ClippingOn = FALSE;
177c35d236eSmrg    pGlint->startxsub = 0;
178c35d236eSmrg    pGlint->startxdom = 0;
179c35d236eSmrg    pGlint->starty = 0;
180c35d236eSmrg    pGlint->count = 0;
181c35d236eSmrg    pGlint->dxdom = 0;
182c35d236eSmrg    pGlint->dy = 1;
183c35d236eSmrg    pGlint->planemask = 0;
184c35d236eSmrg    GLINT_SLOW_WRITE_REG(0, StartXSub);
185c35d236eSmrg    GLINT_SLOW_WRITE_REG(0, StartXDom);
186c35d236eSmrg    GLINT_SLOW_WRITE_REG(0, StartY);
187c35d236eSmrg    GLINT_SLOW_WRITE_REG(0, GLINTCount);
188c35d236eSmrg    GLINT_SLOW_WRITE_REG(0, dXDom);
189c35d236eSmrg    GLINT_SLOW_WRITE_REG(1<<16, dY);
190c35d236eSmrg}
1911fb744b4Smrg#endif
192c35d236eSmrg
193c35d236eSmrgBool
194c35d236eSmrgTXAccelInit(ScreenPtr pScreen)
195c35d236eSmrg{
1961fb744b4Smrg#ifdef HAVE_XAA_H
197c35d236eSmrg    XAAInfoRecPtr infoPtr;
1981fb744b4Smrg    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
199c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
200c35d236eSmrg    long memory = pGlint->FbMapSize;
201c35d236eSmrg    BoxRec AvailFBArea;
202c35d236eSmrg
203c35d236eSmrg    pGlint->AccelInfoRec = infoPtr = XAACreateInfoRec();
204c35d236eSmrg    if (!infoPtr) return FALSE;
205c35d236eSmrg
206c35d236eSmrg    TXInitializeEngine(pScrn);
207c35d236eSmrg
208c35d236eSmrg    infoPtr->Flags = PIXMAP_CACHE |
209c35d236eSmrg		     LINEAR_FRAMEBUFFER |
210c35d236eSmrg		     OFFSCREEN_PIXMAPS;
211c35d236eSmrg
212c35d236eSmrg    if (pGlint->MultiAperture)
213c35d236eSmrg    	infoPtr->Sync = DualTXSync;
214c35d236eSmrg    else
215c35d236eSmrg    	infoPtr->Sync = TXSync;
216c35d236eSmrg
217c35d236eSmrg    infoPtr->SetClippingRectangle = TXSetClippingRectangle;
218c35d236eSmrg    infoPtr->DisableClipping = TXDisableClipping;
219c35d236eSmrg    infoPtr->ClippingFlags = HARDWARE_CLIP_MONO_8x8_FILL |
220c35d236eSmrg			     HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY |
221c35d236eSmrg			     HARDWARE_CLIP_SOLID_FILL;
222c35d236eSmrg
223c35d236eSmrg    infoPtr->SolidFillFlags = 0;
224c35d236eSmrg    infoPtr->SetupForSolidFill = TXSetupForFillRectSolid;
225c35d236eSmrg    infoPtr->SubsequentSolidFillRect = TXSubsequentFillRectSolid;
226c35d236eSmrg
227c35d236eSmrg    infoPtr->SolidLineFlags = 0;
228c35d236eSmrg    infoPtr->PolySegmentThinSolidFlags = 0;
229c35d236eSmrg    infoPtr->PolylinesThinSolidFlags = 0;
230c35d236eSmrg    infoPtr->SetupForSolidLine = TXSetupForSolidLine;
231c35d236eSmrg    infoPtr->SubsequentSolidHorVertLine = TXSubsequentHorVertLine;
232c35d236eSmrg    if (!(pScrn->overlayFlags & OVERLAY_8_32_PLANAR))
233c35d236eSmrg    {
234c35d236eSmrg        infoPtr->SubsequentSolidBresenhamLine =
235c35d236eSmrg					TXSubsequentSolidBresenhamLine;
236c35d236eSmrg    }
237c35d236eSmrg    infoPtr->PolySegmentThinSolid = TXPolySegmentThinSolidWrapper;
238c35d236eSmrg    infoPtr->PolylinesThinSolid = TXPolylinesThinSolidWrapper;
239c35d236eSmrg
240c35d236eSmrg    if (!pGlint->MultiAperture) {
241c35d236eSmrg    	infoPtr->ScreenToScreenCopyFlags = NO_TRANSPARENCY |
242c35d236eSmrg					       ONLY_LEFT_TO_RIGHT_BITBLT;
243c35d236eSmrg    	infoPtr->SetupForScreenToScreenCopy = TXSetupForScreenToScreenCopy;
244c35d236eSmrg    	infoPtr->SubsequentScreenToScreenCopy = TXSubsequentScreenToScreenCopy;
245c35d236eSmrg    }
246c35d236eSmrg
247c35d236eSmrg    infoPtr->Mono8x8PatternFillFlags = HARDWARE_PATTERN_PROGRAMMED_ORIGIN |
248c35d236eSmrg				       HARDWARE_PATTERN_SCREEN_ORIGIN |
249c35d236eSmrg				       HARDWARE_PATTERN_PROGRAMMED_BITS;
250c35d236eSmrg    infoPtr->SetupForMono8x8PatternFill = TXSetupForMono8x8PatternFill;
251c35d236eSmrg    infoPtr->SubsequentMono8x8PatternFillRect = TXSubsequentMono8x8PatternFillRect;
252c35d236eSmrg
253c35d236eSmrg    infoPtr->ScanlineCPUToScreenColorExpandFillFlags =
254c35d236eSmrg					       TRANSPARENCY_ONLY |
255c35d236eSmrg					       BIT_ORDER_IN_BYTE_LSBFIRST;
256c35d236eSmrg
257c35d236eSmrg    infoPtr->NumScanlineColorExpandBuffers = 1;
2581fb744b4Smrg    pGlint->ScratchBuffer                 = malloc(((pScrn->virtualX + 62) / 32 * 4) + (pScrn->virtualX * pScrn->bitsPerPixel / 8));
259c35d236eSmrg    infoPtr->ScanlineColorExpandBuffers =
260c35d236eSmrg					pGlint->XAAScanlineColorExpandBuffers;
261c35d236eSmrg    pGlint->XAAScanlineColorExpandBuffers[0] =
262c35d236eSmrg					pGlint->IOBase + OutputFIFO + 4;
263c35d236eSmrg
264c35d236eSmrg    infoPtr->SetupForScanlineCPUToScreenColorExpandFill =
265c35d236eSmrg				TXSetupForScanlineCPUToScreenColorExpandFill;
266c35d236eSmrg    infoPtr->SubsequentScanlineCPUToScreenColorExpandFill =
267c35d236eSmrg				TXSubsequentScanlineCPUToScreenColorExpandFill;
268c35d236eSmrg    infoPtr->SubsequentColorExpandScanline =
269c35d236eSmrg				TXSubsequentColorExpandScanline;
270c35d236eSmrg
271c35d236eSmrg    infoPtr->ColorExpandRange = pGlint->FIFOSize;
272c35d236eSmrg
273c35d236eSmrg    infoPtr->WriteBitmap = TXWriteBitmap;
274c35d236eSmrg    infoPtr->WritePixmap = TXWritePixmap;
275c35d236eSmrg
276c35d236eSmrg    AvailFBArea.x1 = 0;
277c35d236eSmrg    AvailFBArea.y1 = 0;
278c35d236eSmrg    AvailFBArea.x2 = pScrn->displayWidth;
279c35d236eSmrg    if (memory > (16383*1024)) memory = 16383*1024;
280c35d236eSmrg    AvailFBArea.y2 = memory / (pScrn->displayWidth *
281c35d236eSmrg					  pScrn->bitsPerPixel / 8);
282c35d236eSmrg
283c35d236eSmrg    if (AvailFBArea.y2 > 4095) AvailFBArea.y2 = 4095;
284c35d236eSmrg
285c35d236eSmrg    xf86InitFBManager(pScreen, &AvailFBArea);
286c35d236eSmrg
287c35d236eSmrg    return (XAAInit(pScreen, infoPtr));
2881fb744b4Smrg#else
2891fb744b4Smrg    return FALSE;
2901fb744b4Smrg#endif
291c35d236eSmrg}
292c35d236eSmrg
2931fb744b4Smrg#ifdef HAVE_XAA_H
294c35d236eSmrgstatic void TXLoadCoord(
295c35d236eSmrg	ScrnInfoPtr pScrn,
296c35d236eSmrg	int x, int y,
297c35d236eSmrg	int w, int h,
298c35d236eSmrg	int a, int d
299c35d236eSmrg){
300c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
301c35d236eSmrg
302c35d236eSmrg    if (w != pGlint->startxsub) {
303c35d236eSmrg    	GLINT_WRITE_REG(w<<16, StartXSub);
304c35d236eSmrg	pGlint->startxsub = w;
305c35d236eSmrg    }
306c35d236eSmrg    if (x != pGlint->startxdom) {
307c35d236eSmrg    	GLINT_WRITE_REG(x<<16,StartXDom);
308c35d236eSmrg	pGlint->startxdom = x;
309c35d236eSmrg    }
310c35d236eSmrg    if (y != pGlint->starty) {
311c35d236eSmrg    	GLINT_WRITE_REG(y<<16,StartY);
312c35d236eSmrg	pGlint->starty = y;
313c35d236eSmrg    }
314c35d236eSmrg    if (h != pGlint->count) {
315c35d236eSmrg    	GLINT_WRITE_REG(h,GLINTCount);
316c35d236eSmrg	pGlint->count = h;
317c35d236eSmrg    }
318c35d236eSmrg    if (a != pGlint->dxdom) {
319c35d236eSmrg    	GLINT_WRITE_REG(a<<16,dXDom);
320c35d236eSmrg	pGlint->dxdom = a;
321c35d236eSmrg    }
322c35d236eSmrg    if (d != pGlint->dy) {
323c35d236eSmrg    	GLINT_WRITE_REG(d<<16,dY);
324c35d236eSmrg	pGlint->dy = d;
325c35d236eSmrg    }
326c35d236eSmrg}
327c35d236eSmrg
328c35d236eSmrgstatic void
329c35d236eSmrgTXSync(
330c35d236eSmrg	ScrnInfoPtr pScrn
331c35d236eSmrg){
332c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
333c35d236eSmrg    CARD32 readValue;
334c35d236eSmrg
335c35d236eSmrg    CHECKCLIPPING;
336c35d236eSmrg
337c35d236eSmrg    while (GLINT_READ_REG(DMACount) != 0);
338c35d236eSmrg    GLINT_WAIT(2);
339c35d236eSmrg    GLINT_WRITE_REG(0x400, FilterMode);
340c35d236eSmrg    GLINT_WRITE_REG(0, GlintSync);
341c35d236eSmrg    do {
342c35d236eSmrg   	while(GLINT_READ_REG(OutFIFOWords) == 0);
343c35d236eSmrg	readValue = GLINT_READ_REG(OutputFIFO);
344c35d236eSmrg    } while (readValue != Sync_tag);
345c35d236eSmrg}
346c35d236eSmrg
347c35d236eSmrgstatic void
348c35d236eSmrgDualTXSync(
349c35d236eSmrg	ScrnInfoPtr pScrn
350c35d236eSmrg){
351c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
352c35d236eSmrg    unsigned long readValue;
353c35d236eSmrg
354c35d236eSmrg    CHECKCLIPPING;
355c35d236eSmrg
356c35d236eSmrg    while (GLINT_READ_REG(DMACount) != 0);
357c35d236eSmrg    GLINT_WAIT(3);
358c35d236eSmrg
359c35d236eSmrg    /* hack! this shouldn't need to be reloaded */
360c35d236eSmrg    GLINT_WRITE_REG(3, BroadcastMask);
361c35d236eSmrg    GLINT_WRITE_REG(0x400, FilterMode);
362c35d236eSmrg    GLINT_WRITE_REG(0, GlintSync);
363c35d236eSmrg
364c35d236eSmrg    /* Read 1st MX until Sync Tag shows */
365c35d236eSmrg    ACCESSCHIP1();
366c35d236eSmrg    do {
367c35d236eSmrg   	while(GLINT_READ_REG(OutFIFOWords) == 0);
368c35d236eSmrg	readValue = GLINT_READ_REG(OutputFIFO);
369c35d236eSmrg    } while (readValue != Sync_tag);
370c35d236eSmrg
371c35d236eSmrg    ACCESSCHIP2();
372c35d236eSmrg    /* Read 2nd MX until Sync Tag shows */
373c35d236eSmrg    do {
374c35d236eSmrg   	while(GLINT_READ_REG(OutFIFOWords) == 0);
375c35d236eSmrg	readValue = GLINT_READ_REG(OutputFIFO);
376c35d236eSmrg    } while (readValue != Sync_tag);
377c35d236eSmrg
378c35d236eSmrg    ACCESSCHIP1();
379c35d236eSmrg}
380c35d236eSmrg
381c35d236eSmrg
382c35d236eSmrgstatic void
383c35d236eSmrgTXSetupForFillRectSolid(
384c35d236eSmrg	ScrnInfoPtr pScrn,
385c35d236eSmrg	int color, int rop,
386c35d236eSmrg	unsigned int planemask
387c35d236eSmrg){
388c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
389c35d236eSmrg    pGlint->ForeGroundColor = color;
390c35d236eSmrg
391c35d236eSmrg    GLINT_WAIT(5);
392c35d236eSmrg    REPLICATE(color);
393c35d236eSmrg    DO_PLANEMASK(planemask);
394c35d236eSmrg    if (rop == GXcopy) {
395c35d236eSmrg	GLINT_WRITE_REG(pGlint->pprod, FBReadMode);
396c35d236eSmrg	GLINT_WRITE_REG(UNIT_DISABLE, PatternRamMode);
397c35d236eSmrg	GLINT_WRITE_REG(color, FBBlockColor);
398c35d236eSmrg	pGlint->FrameBufferReadMode = FastFillEnable;
399c35d236eSmrg    } else {
400c35d236eSmrg	GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode);
401c35d236eSmrg	GLINT_WRITE_REG(UNIT_ENABLE, PatternRamMode);
402c35d236eSmrg	GLINT_WRITE_REG(color, PatternRamData0);
403c35d236eSmrg	pGlint->FrameBufferReadMode = FastFillEnable | SpanOperation;
404c35d236eSmrg    }
405c35d236eSmrg    LOADROP(rop);
406c35d236eSmrg}
407c35d236eSmrg
408c35d236eSmrgstatic void
409c35d236eSmrgTXSubsequentFillRectSolid(
410c35d236eSmrg	ScrnInfoPtr pScrn,
411c35d236eSmrg	int x, int y,
412c35d236eSmrg	int w, int h
413c35d236eSmrg){
414c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
415c35d236eSmrg
416c35d236eSmrg    GLINT_WAIT(7);
417c35d236eSmrg    TXLoadCoord(pScrn, x, y, x+w, h, 0, 1);
418c35d236eSmrg    GLINT_WRITE_REG(PrimitiveTrapezoid | pGlint->FrameBufferReadMode,Render);
419c35d236eSmrg}
420c35d236eSmrg
421c35d236eSmrgstatic void
422c35d236eSmrgTXSetClippingRectangle(
423c35d236eSmrg	ScrnInfoPtr pScrn,
424c35d236eSmrg	int x1, int y1,
425c35d236eSmrg	int x2, int y2
426c35d236eSmrg){
427c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
428c35d236eSmrg
429c35d236eSmrg    GLINT_WAIT(3);
430c35d236eSmrg    GLINT_WRITE_REG((y1&0xFFFF)<<16|(x1&0xFFFF), ScissorMinXY);
431c35d236eSmrg    GLINT_WRITE_REG((y2&0xFFFF)<<16|(x2&0xFFFF), ScissorMaxXY);
432c35d236eSmrg    GLINT_WRITE_REG(1, ScissorMode); /* Enable Scissor Mode */
433c35d236eSmrg    pGlint->ClippingOn = TRUE;
434c35d236eSmrg}
435c35d236eSmrg
436c35d236eSmrgstatic void
437c35d236eSmrgTXDisableClipping(
438c35d236eSmrg	ScrnInfoPtr pScrn
439c35d236eSmrg){
440c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
441c35d236eSmrg    CHECKCLIPPING;
442c35d236eSmrg}
443c35d236eSmrg
444c35d236eSmrgstatic void
445c35d236eSmrgTXSetupForScreenToScreenCopy(
446c35d236eSmrg	ScrnInfoPtr pScrn,
447c35d236eSmrg	int xdir, int  ydir,
448c35d236eSmrg	int rop,
449c35d236eSmrg	unsigned int planemask,
450c35d236eSmrg	int transparency_color
451c35d236eSmrg){
452c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
453c35d236eSmrg
454c35d236eSmrg    pGlint->BltScanDirection = ydir;
455c35d236eSmrg
456c35d236eSmrg    GLINT_WAIT(5);
457c35d236eSmrg    DO_PLANEMASK(planemask);
458c35d236eSmrg    GLINT_WRITE_REG(UNIT_DISABLE, PatternRamMode);
459c35d236eSmrg
460c35d236eSmrg    if (rop == GXcopy) {
461c35d236eSmrg	GLINT_WRITE_REG(pGlint->pprod | FBRM_SrcEnable, FBReadMode);
462c35d236eSmrg    } else {
463c35d236eSmrg	GLINT_WRITE_REG(pGlint->pprod | FBRM_SrcEnable | FBRM_DstEnable, FBReadMode);
464c35d236eSmrg    }
465c35d236eSmrg    LOADROP(rop);
466c35d236eSmrg}
467c35d236eSmrg
468c35d236eSmrgstatic void
469c35d236eSmrgTXSubsequentScreenToScreenCopy(
470c35d236eSmrg	ScrnInfoPtr pScrn,
471c35d236eSmrg	int x1, int y1,
472c35d236eSmrg	int x2, int y2,
473c35d236eSmrg	int w, int h
474c35d236eSmrg){
475c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
476c35d236eSmrg    int srcaddr, dstaddr;
477c35d236eSmrg
478c35d236eSmrg    GLINT_WAIT(8);
479c35d236eSmrg    if (pGlint->BltScanDirection != 1) {
480c35d236eSmrg	y1 += h - 1;
481c35d236eSmrg	y2 += h - 1;
482c35d236eSmrg        TXLoadCoord(pScrn, x2, y2, x2+w, h, 0, -1);
483c35d236eSmrg    } else {
484c35d236eSmrg        TXLoadCoord(pScrn, x2, y2, x2+w, h, 0, 1);
485c35d236eSmrg    }
486c35d236eSmrg
487c35d236eSmrg    srcaddr = y1 * pScrn->displayWidth + x1;
488c35d236eSmrg    dstaddr = y2 * pScrn->displayWidth + x2;
489c35d236eSmrg
490c35d236eSmrg    GLINT_WRITE_REG(srcaddr - dstaddr, FBSourceOffset);
491c35d236eSmrg    GLINT_WRITE_REG(PrimitiveTrapezoid| FastFillEnable | SpanOperation, Render);
492c35d236eSmrg}
493c35d236eSmrg
494c35d236eSmrgstatic void
495c35d236eSmrgTXSetupForScanlineCPUToScreenColorExpandFill(
496c35d236eSmrg	ScrnInfoPtr pScrn,
497c35d236eSmrg	int fg, int bg,
498c35d236eSmrg	int rop,
499c35d236eSmrg	unsigned int planemask
500c35d236eSmrg){
501c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
502c35d236eSmrg    REPLICATE(fg);
503c35d236eSmrg    REPLICATE(bg);
504c35d236eSmrg    GLINT_WAIT(6);
505c35d236eSmrg    DO_PLANEMASK(planemask);
506c35d236eSmrg    GLINT_WRITE_REG(pGlint->rasterizerMode, RasterizerMode);
507c35d236eSmrg    if (rop == GXcopy) {
508c35d236eSmrg        GLINT_WRITE_REG(pGlint->pprod, FBReadMode);
509c35d236eSmrg        GLINT_WRITE_REG(UNIT_DISABLE, PatternRamMode);
510c35d236eSmrg        pGlint->FrameBufferReadMode = FastFillEnable;
511c35d236eSmrg	GLINT_WRITE_REG(fg, FBBlockColor);
512c35d236eSmrg    } else {
513c35d236eSmrg        GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode);
514c35d236eSmrg        GLINT_WRITE_REG(UNIT_ENABLE, PatternRamMode);
515c35d236eSmrg        pGlint->FrameBufferReadMode = FastFillEnable | SpanOperation;
516c35d236eSmrg	GLINT_WRITE_REG(fg, PatternRamData0);
517c35d236eSmrg    }
518c35d236eSmrg    LOADROP(rop);
519c35d236eSmrg}
520c35d236eSmrg
521c35d236eSmrgstatic void
522c35d236eSmrgTXSubsequentScanlineCPUToScreenColorExpandFill(
523c35d236eSmrg	ScrnInfoPtr pScrn,
524c35d236eSmrg	int x, int y, int w, int h,
525c35d236eSmrg	int skipleft
526c35d236eSmrg){
527c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
528c35d236eSmrg
529c35d236eSmrg    pGlint->dwords = ((w + 31) >> 5); /* dwords per scanline */
530c35d236eSmrg
531c35d236eSmrg    pGlint->cpucount = h;
532c35d236eSmrg
533c35d236eSmrg    GLINT_WAIT(8);
534c35d236eSmrg    TXLoadCoord(pScrn, x, y, (x+w), h, 0, 1);
535c35d236eSmrg    GLINT_WRITE_REG(PrimitiveTrapezoid | pGlint->FrameBufferReadMode | SyncOnBitMask,
536c35d236eSmrg							Render);
537c35d236eSmrg#if defined(__alpha__)
538c35d236eSmrg    if (0) /* force Alpha to use indirect always */
539c35d236eSmrg#else
540c35d236eSmrg    if ((pGlint->dwords*h) < pGlint->FIFOSize)
541c35d236eSmrg#endif
542c35d236eSmrg    {
543c35d236eSmrg	/* Turn on direct for less than FIFOSize dword colour expansion */
544c35d236eSmrg    	pGlint->XAAScanlineColorExpandBuffers[0] = pGlint->IOBase+OutputFIFO+4;
545c35d236eSmrg	pGlint->ScanlineDirect = 1;
546c35d236eSmrg    	GLINT_WRITE_REG(((pGlint->dwords*h)-1)<<16 | 0x0D, OutputFIFO);
547c35d236eSmrg    	GLINT_WAIT(pGlint->dwords*h);
548c35d236eSmrg    } else {
549c35d236eSmrg	/* Use indirect for anything else */
550c35d236eSmrg    	pGlint->XAAScanlineColorExpandBuffers[0] = pGlint->ScratchBuffer;
551c35d236eSmrg	pGlint->ScanlineDirect   = 0;
552c35d236eSmrg    }
553c35d236eSmrg
554c35d236eSmrg    pGlint->cpucount--;
555c35d236eSmrg}
556c35d236eSmrg
557c35d236eSmrgstatic void
558c35d236eSmrgTXSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno)
559c35d236eSmrg{
560c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
561c35d236eSmrg    CARD32 *srcp = (CARD32*)pGlint->XAAScanlineColorExpandBuffers[bufno];
562c35d236eSmrg    int dwords = pGlint->dwords;
563c35d236eSmrg
564c35d236eSmrg    if (!pGlint->ScanlineDirect) {
565c35d236eSmrg	while(dwords >= pGlint->FIFOSize) {
566c35d236eSmrg	    GLINT_WAIT(pGlint->FIFOSize);
567c35d236eSmrg            GLINT_WRITE_REG(((pGlint->FIFOSize - 2) << 16) | 0x0D, OutputFIFO);
568c35d236eSmrg	    GLINT_MoveDWORDS(
569c35d236eSmrg			(CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4),
570c35d236eSmrg	 		(CARD32*)srcp, pGlint->FIFOSize - 1);
571c35d236eSmrg	    dwords -= pGlint->FIFOSize - 1;
572c35d236eSmrg	    srcp += pGlint->FIFOSize - 1;
573c35d236eSmrg	}
574c35d236eSmrg	if(dwords) {
575c35d236eSmrg	    GLINT_WAIT(dwords + 1);
576c35d236eSmrg            GLINT_WRITE_REG(((dwords - 1) << 16) | 0x0D, OutputFIFO);
577c35d236eSmrg	    GLINT_MoveDWORDS(
578c35d236eSmrg			(CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4),
579c35d236eSmrg	 		(CARD32*)srcp, dwords);
580c35d236eSmrg	}
581c35d236eSmrg    }
582c35d236eSmrg}
583c35d236eSmrg
584c35d236eSmrgvoid TXSetupForMono8x8PatternFill(
585c35d236eSmrg	ScrnInfoPtr pScrn,
586c35d236eSmrg	int patternx, int patterny,
587c35d236eSmrg	int fg, int bg, int rop,
588c35d236eSmrg	unsigned int planemask
589c35d236eSmrg){
590c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
591c35d236eSmrg
592c35d236eSmrg    if (bg == -1) pGlint->FrameBufferReadMode = -1;
593c35d236eSmrg	else    pGlint->FrameBufferReadMode = 0;
594c35d236eSmrg    pGlint->ForeGroundColor = fg;
595c35d236eSmrg    pGlint->BackGroundColor = bg;
596c35d236eSmrg    REPLICATE(pGlint->ForeGroundColor);
597c35d236eSmrg    REPLICATE(pGlint->BackGroundColor);
598c35d236eSmrg
599c35d236eSmrg    GLINT_WAIT(13);
600c35d236eSmrg    DO_PLANEMASK(planemask);
601c35d236eSmrg    GLINT_WRITE_REG((patternx & 0x000000FF),       AreaStipplePattern0);
602c35d236eSmrg    GLINT_WRITE_REG((patternx & 0x0000FF00) >> 8,  AreaStipplePattern1);
603c35d236eSmrg    GLINT_WRITE_REG((patternx & 0x00FF0000) >> 16, AreaStipplePattern2);
604c35d236eSmrg    GLINT_WRITE_REG((patternx & 0xFF000000) >> 24, AreaStipplePattern3);
605c35d236eSmrg    GLINT_WRITE_REG((patterny & 0x000000FF),       AreaStipplePattern4);
606c35d236eSmrg    GLINT_WRITE_REG((patterny & 0x0000FF00) >> 8,  AreaStipplePattern5);
607c35d236eSmrg    GLINT_WRITE_REG((patterny & 0x00FF0000) >> 16, AreaStipplePattern6);
608c35d236eSmrg    GLINT_WRITE_REG((patterny & 0xFF000000) >> 24, AreaStipplePattern7);
609c35d236eSmrg
610c35d236eSmrg    if (rop == GXcopy) {
611c35d236eSmrg	GLINT_WRITE_REG(UNIT_DISABLE, PatternRamMode);
612c35d236eSmrg	GLINT_WRITE_REG(pGlint->pprod, FBReadMode);
613c35d236eSmrg    } else {
614c35d236eSmrg	GLINT_WRITE_REG(UNIT_ENABLE, PatternRamMode);
615c35d236eSmrg	GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode);
616c35d236eSmrg    }
617c35d236eSmrg    LOADROP(rop);
618c35d236eSmrg}
619c35d236eSmrg
620c35d236eSmrgstatic void
621c35d236eSmrgTXSubsequentMono8x8PatternFillRect(
622c35d236eSmrg	ScrnInfoPtr pScrn,
623c35d236eSmrg	int patternx, int patterny,
624c35d236eSmrg	int x, int y,
625c35d236eSmrg	int w, int h
626c35d236eSmrg){
627c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
628c35d236eSmrg    int span = 0;
629c35d236eSmrg
630c35d236eSmrg    GLINT_WAIT(12);
631c35d236eSmrg    TXLoadCoord(pScrn, x, y, x+w, h, 0, 1);
632c35d236eSmrg
633c35d236eSmrg    if (pGlint->FrameBufferReadMode != -1) {
634c35d236eSmrg	if (pGlint->ROP == GXcopy) {
635c35d236eSmrg	  GLINT_WRITE_REG(pGlint->BackGroundColor, FBBlockColor);
636c35d236eSmrg	  span = 0;
637c35d236eSmrg	} else {
638c35d236eSmrg  	  GLINT_WRITE_REG(pGlint->BackGroundColor, PatternRamData0);
639c35d236eSmrg	  span = SpanOperation;
640c35d236eSmrg	}
641c35d236eSmrg	GLINT_WRITE_REG(2<<1|2<<4|patternx<<7|patterny<<12|ASM_InvertPattern |
642c35d236eSmrg					UNIT_ENABLE, AreaStippleMode);
643c35d236eSmrg	GLINT_WRITE_REG(AreaStippleEnable | span | FastFillEnable |
644c35d236eSmrg						PrimitiveTrapezoid, Render);
645c35d236eSmrg    }
646c35d236eSmrg
647c35d236eSmrg    if (pGlint->ROP == GXcopy) {
648c35d236eSmrg	GLINT_WRITE_REG(pGlint->ForeGroundColor, FBBlockColor);
649c35d236eSmrg	span = 0;
650c35d236eSmrg    } else {
651c35d236eSmrg  	GLINT_WRITE_REG(pGlint->ForeGroundColor, PatternRamData0);
652c35d236eSmrg	span = SpanOperation;
653c35d236eSmrg    }
654c35d236eSmrg    GLINT_WRITE_REG(2<<1|2<<4|patternx<<7|patterny<<12|
655c35d236eSmrg  						UNIT_ENABLE, AreaStippleMode);
656c35d236eSmrg    GLINT_WRITE_REG(AreaStippleEnable | span | FastFillEnable |
657c35d236eSmrg						PrimitiveTrapezoid, Render);
658c35d236eSmrg}
659c35d236eSmrg
660c35d236eSmrgstatic void
661c35d236eSmrgTXWriteBitmap(ScrnInfoPtr pScrn,
662c35d236eSmrg    int x, int y, int w, int h,
663c35d236eSmrg    unsigned char *src,
664c35d236eSmrg    int srcwidth,
665c35d236eSmrg    int skipleft,
666c35d236eSmrg    int fg, int bg,
667c35d236eSmrg    int rop,
668c35d236eSmrg    unsigned int planemask
669c35d236eSmrg){
670c35d236eSmrg    XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
671c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
672c35d236eSmrg    unsigned char *srcpntr;
673c35d236eSmrg    int dwords, height, mode;
674c35d236eSmrg    Bool SecondPass = FALSE;
675c35d236eSmrg    register int count;
676c35d236eSmrg    register CARD32* pattern;
677c35d236eSmrg
678c35d236eSmrg    w += skipleft;
679c35d236eSmrg    x -= skipleft;
680c35d236eSmrg    dwords = (w + 31) >> 5;
681c35d236eSmrg
682c35d236eSmrg    TXSetClippingRectangle(pScrn,x+skipleft, y, x+w, y+h);
683c35d236eSmrg
684c35d236eSmrg    GLINT_WAIT(11);
685c35d236eSmrg    DO_PLANEMASK(planemask);
686c35d236eSmrg    GLINT_WRITE_REG(pGlint->rasterizerMode, RasterizerMode);
687c35d236eSmrg    LOADROP(rop);
688c35d236eSmrg    if (rop == GXcopy) {
689c35d236eSmrg	mode = 0;
690c35d236eSmrg	GLINT_WRITE_REG(UNIT_DISABLE, PatternRamMode);
691c35d236eSmrg	GLINT_WRITE_REG(pGlint->pprod, FBReadMode);
692c35d236eSmrg    } else {
693c35d236eSmrg	mode = SpanOperation;
694c35d236eSmrg	GLINT_WRITE_REG(UNIT_ENABLE, PatternRamMode);
695c35d236eSmrg	GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode);
696c35d236eSmrg    }
697c35d236eSmrg    TXLoadCoord(pScrn, x, y, x+w, h, 0, 1);
698c35d236eSmrg
699c35d236eSmrg    if(bg == -1) {
700c35d236eSmrg	REPLICATE(fg);
701c35d236eSmrg	GLINT_WAIT(3);
702c35d236eSmrg	if (rop == GXcopy) {
703c35d236eSmrg	    GLINT_WRITE_REG(fg, FBBlockColor);
704c35d236eSmrg	} else {
705c35d236eSmrg	    GLINT_WRITE_REG(fg, PatternRamData0);
706c35d236eSmrg	}
707c35d236eSmrg    } else if(rop == GXcopy) {
708c35d236eSmrg	REPLICATE(bg);
709c35d236eSmrg	GLINT_WAIT(5);
710c35d236eSmrg	if (rop == GXcopy) {
711c35d236eSmrg	    GLINT_WRITE_REG(bg, FBBlockColor);
712c35d236eSmrg	} else {
713c35d236eSmrg	    GLINT_WRITE_REG(bg, PatternRamData0);
714c35d236eSmrg	}
715c35d236eSmrg	GLINT_WRITE_REG(PrimitiveTrapezoid |mode|FastFillEnable,Render);
716c35d236eSmrg	REPLICATE(fg);
717c35d236eSmrg	if (rop == GXcopy) {
718c35d236eSmrg	    GLINT_WRITE_REG(fg, FBBlockColor);
719c35d236eSmrg	} else {
720c35d236eSmrg	    GLINT_WRITE_REG(fg, PatternRamData0);
721c35d236eSmrg	}
722c35d236eSmrg    } else {
723c35d236eSmrg	SecondPass = TRUE;
724c35d236eSmrg	REPLICATE(fg);
725c35d236eSmrg	GLINT_WAIT(3);
726c35d236eSmrg	if (rop == GXcopy) {
727c35d236eSmrg	    GLINT_WRITE_REG(fg, FBBlockColor);
728c35d236eSmrg	} else {
729c35d236eSmrg	    GLINT_WRITE_REG(fg, PatternRamData0);
730c35d236eSmrg	}
731c35d236eSmrg    }
732c35d236eSmrg
733c35d236eSmrgSECOND_PASS:
734c35d236eSmrg    GLINT_WRITE_REG(PrimitiveTrapezoid | FastFillEnable | mode | SyncOnBitMask, Render);
735c35d236eSmrg
736c35d236eSmrg    height = h;
737c35d236eSmrg    srcpntr = src;
738c35d236eSmrg    while(height--) {
739c35d236eSmrg	count = dwords >> 3;
740c35d236eSmrg	pattern = (CARD32*)srcpntr;
741c35d236eSmrg	while(count--) {
742c35d236eSmrg		GLINT_WAIT(8);
743c35d236eSmrg		GLINT_WRITE_REG(*(pattern), BitMaskPattern);
744c35d236eSmrg		GLINT_WRITE_REG(*(pattern+1), BitMaskPattern);
745c35d236eSmrg		GLINT_WRITE_REG(*(pattern+2), BitMaskPattern);
746c35d236eSmrg		GLINT_WRITE_REG(*(pattern+3), BitMaskPattern);
747c35d236eSmrg		GLINT_WRITE_REG(*(pattern+4), BitMaskPattern);
748c35d236eSmrg		GLINT_WRITE_REG(*(pattern+5), BitMaskPattern);
749c35d236eSmrg		GLINT_WRITE_REG(*(pattern+6), BitMaskPattern);
750c35d236eSmrg		GLINT_WRITE_REG(*(pattern+7), BitMaskPattern);
751c35d236eSmrg		pattern+=8;
752c35d236eSmrg	}
753c35d236eSmrg	count = dwords & 0x07;
754c35d236eSmrg	GLINT_WAIT(count);
755c35d236eSmrg	while (count--)
756c35d236eSmrg		GLINT_WRITE_REG(*(pattern++), BitMaskPattern);
757c35d236eSmrg	srcpntr += srcwidth;
758c35d236eSmrg    }
759c35d236eSmrg
760c35d236eSmrg    if(SecondPass) {
761c35d236eSmrg	SecondPass = FALSE;
762c35d236eSmrg	REPLICATE(bg);
763c35d236eSmrg	GLINT_WAIT(4);
764c35d236eSmrg	GLINT_WRITE_REG(InvertBitMask | pGlint->rasterizerMode, RasterizerMode);
765c35d236eSmrg	if (rop == GXcopy) {
766c35d236eSmrg	    GLINT_WRITE_REG(bg, FBBlockColor);
767c35d236eSmrg	} else {
768c35d236eSmrg	    GLINT_WRITE_REG(bg, PatternRamData0);
769c35d236eSmrg	}
770c35d236eSmrg	goto SECOND_PASS;
771c35d236eSmrg    }
772c35d236eSmrg
773c35d236eSmrg    GLINT_WAIT(2);
774c35d236eSmrg    GLINT_WRITE_REG(pGlint->rasterizerMode, RasterizerMode);
775c35d236eSmrg    CHECKCLIPPING;
776c35d236eSmrg    SET_SYNC_FLAG(infoRec);
777c35d236eSmrg}
778c35d236eSmrg
779c35d236eSmrgstatic void
780c35d236eSmrgTXWritePixmap(
781c35d236eSmrg   ScrnInfoPtr pScrn,
782c35d236eSmrg   int x, int y, int w, int h,
783c35d236eSmrg   unsigned char *src,
784c35d236eSmrg   int srcwidth,	/* bytes */
785c35d236eSmrg   int rop,
786c35d236eSmrg   unsigned int planemask,
787c35d236eSmrg   int trans,
788c35d236eSmrg   int bpp, int depth
789c35d236eSmrg){
790c35d236eSmrg    XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
791c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
792c35d236eSmrg    CARD32 *srcp;
793c35d236eSmrg    int count,dwords, skipleft, Bpp = bpp >> 3;
794c35d236eSmrg
795c35d236eSmrg    if((skipleft = (long)src & 0x03L)) {
796c35d236eSmrg	skipleft /= Bpp;
797c35d236eSmrg
798c35d236eSmrg	x -= skipleft;
799c35d236eSmrg	w += skipleft;
800c35d236eSmrg
801c35d236eSmrg	src = (unsigned char*)((long)src & ~0x03L);
802c35d236eSmrg    }
803c35d236eSmrg
804c35d236eSmrg    switch(Bpp) {
805c35d236eSmrg    case 1:	dwords = (w + 3) >> 2;
806c35d236eSmrg		break;
807c35d236eSmrg    case 2:	dwords = (w + 1) >> 1;
808c35d236eSmrg		break;
809c35d236eSmrg    case 4:	dwords = w;
810c35d236eSmrg		break;
811c35d236eSmrg    default: return;
812c35d236eSmrg    }
813c35d236eSmrg
814c35d236eSmrg    TXSetClippingRectangle(pScrn,x+skipleft, y, x+w, y+h);
815c35d236eSmrg
816c35d236eSmrg    GLINT_WAIT(12);
817c35d236eSmrg    DO_PLANEMASK(planemask);
818c35d236eSmrg    GLINT_WRITE_REG(0, PatternRamMode);
819c35d236eSmrg    if (rop == GXcopy) {
820c35d236eSmrg        GLINT_WRITE_REG(pGlint->pprod, FBReadMode);
821c35d236eSmrg    } else {
822c35d236eSmrg        GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode);
823c35d236eSmrg    }
824c35d236eSmrg    LOADROP(rop);
825c35d236eSmrg    TXLoadCoord(pScrn, x, y, x+w, h, 0, 1);
826c35d236eSmrg    GLINT_WRITE_REG(PrimitiveTrapezoid | FastFillEnable | SpanOperation |
827c35d236eSmrg						SyncOnHostData, Render);
828c35d236eSmrg
829c35d236eSmrg    while(h--) {
830c35d236eSmrg      count = dwords;
831c35d236eSmrg      srcp = (CARD32*)src;
832c35d236eSmrg      while(count >= infoRec->ColorExpandRange) {
833c35d236eSmrg	GLINT_WAIT(infoRec->ColorExpandRange);
834c35d236eSmrg	/* (0x15 << 4) | 0x05 is the TAG for FBSourceData */
835c35d236eSmrg       	GLINT_WRITE_REG(((infoRec->ColorExpandRange - 2) << 16) | (0x15 << 4) |
836c35d236eSmrg				0x05, OutputFIFO);
837c35d236eSmrg	GLINT_MoveDWORDS(
838c35d236eSmrg		(CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4),
839c35d236eSmrg 		(CARD32*)srcp, infoRec->ColorExpandRange - 1);
840c35d236eSmrg	count -= infoRec->ColorExpandRange - 1;
841c35d236eSmrg	srcp += infoRec->ColorExpandRange - 1;
842c35d236eSmrg      }
843c35d236eSmrg      if(count) {
844c35d236eSmrg	GLINT_WAIT(count);
845c35d236eSmrg	/* (0x15 << 4) | 0x05 is the TAG for FBSourceData */
846c35d236eSmrg       	GLINT_WRITE_REG(((count - 1) << 16) | (0x15 << 4) |
847c35d236eSmrg				0x05, OutputFIFO);
848c35d236eSmrg	GLINT_MoveDWORDS(
849c35d236eSmrg		(CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4),
850c35d236eSmrg 		(CARD32*)srcp, count);
851c35d236eSmrg      }
852c35d236eSmrg      src += srcwidth;
853c35d236eSmrg    }
854c35d236eSmrg    CHECKCLIPPING;
855c35d236eSmrg    SET_SYNC_FLAG(infoRec);
856c35d236eSmrg}
857c35d236eSmrg
858c35d236eSmrgstatic void
859c35d236eSmrgTXPolylinesThinSolidWrapper(
860c35d236eSmrg   DrawablePtr     pDraw,
861c35d236eSmrg   GCPtr           pGC,
862c35d236eSmrg   int             mode,
863c35d236eSmrg   int             npt,
864c35d236eSmrg   DDXPointPtr     pPts
865c35d236eSmrg){
866c35d236eSmrg    XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC);
867c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(infoRec->pScrn);
868c35d236eSmrg    pGlint->CurrentGC = pGC;
869c35d236eSmrg    pGlint->CurrentDrawable = pDraw;
870c35d236eSmrg    if(infoRec->NeedToSync) (*infoRec->Sync)(infoRec->pScrn);
871c35d236eSmrg    XAAPolyLines(pDraw, pGC, mode, npt, pPts);
872c35d236eSmrg}
873c35d236eSmrg
874c35d236eSmrgstatic void
875c35d236eSmrgTXPolySegmentThinSolidWrapper(
876c35d236eSmrg   DrawablePtr     pDraw,
877c35d236eSmrg   GCPtr           pGC,
878c35d236eSmrg   int             nseg,
879c35d236eSmrg   xSegment        *pSeg
880c35d236eSmrg){
881c35d236eSmrg    XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC);
882c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(infoRec->pScrn);
883c35d236eSmrg    pGlint->CurrentGC = pGC;
884c35d236eSmrg    pGlint->CurrentDrawable = pDraw;
885c35d236eSmrg    if(infoRec->NeedToSync) (*infoRec->Sync)(infoRec->pScrn);
886c35d236eSmrg    XAAPolySegment(pDraw, pGC, nseg, pSeg);
887c35d236eSmrg}
888c35d236eSmrg
889c35d236eSmrgstatic void
890c35d236eSmrgTXSetupForSolidLine(ScrnInfoPtr pScrn, int color,
891c35d236eSmrg					 int rop, unsigned int planemask)
892c35d236eSmrg{
893c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
894c35d236eSmrg
895c35d236eSmrg    GLINT_WAIT(5);
896c35d236eSmrg    DO_PLANEMASK(planemask);
897c35d236eSmrg    GLINT_WRITE_REG(color, GLINTColor);
898c35d236eSmrg    if (rop == GXcopy) {
899c35d236eSmrg  	GLINT_WRITE_REG(pGlint->pprod, FBReadMode);
900c35d236eSmrg    } else {
901c35d236eSmrg  	GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode);
902c35d236eSmrg    }
903c35d236eSmrg    LOADROP(rop);
904c35d236eSmrg}
905c35d236eSmrg
906c35d236eSmrgstatic void
907c35d236eSmrgTXSubsequentHorVertLine(ScrnInfoPtr pScrn,int x,int y,int len,int dir)
908c35d236eSmrg{
909c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
910c35d236eSmrg
911c35d236eSmrg    GLINT_WAIT(7);
912c35d236eSmrg    if (dir == DEGREES_0) {
913c35d236eSmrg        TXLoadCoord(pScrn, x, y, 0, len, 1, 0);
914c35d236eSmrg    } else {
915c35d236eSmrg        TXLoadCoord(pScrn, x, y, 0, len, 0, 1);
916c35d236eSmrg    }
917c35d236eSmrg
918c35d236eSmrg    GLINT_WRITE_REG(PrimitiveLine, Render);
919c35d236eSmrg}
920c35d236eSmrg
921c35d236eSmrgstatic void
922c35d236eSmrgTXSubsequentSolidBresenhamLine( ScrnInfoPtr pScrn,
923c35d236eSmrg        int x, int y, int dmaj, int dmin, int e, int len, int octant)
924c35d236eSmrg{
925c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
926c35d236eSmrg    int dxdom, dy;
927c35d236eSmrg
928c35d236eSmrg    if(dmaj == dmin) {
929c35d236eSmrg	GLINT_WAIT(7);
930c35d236eSmrg	if(octant & YDECREASING) {
931c35d236eSmrg	    dy = -1;
932c35d236eSmrg	} else {
933c35d236eSmrg	    dy = 1;
934c35d236eSmrg	}
935c35d236eSmrg
936c35d236eSmrg	if(octant & XDECREASING) {
937c35d236eSmrg	    dxdom = -1;
938c35d236eSmrg	} else {
939c35d236eSmrg	    dxdom = 1;
940c35d236eSmrg	}
941c35d236eSmrg
942c35d236eSmrg        TXLoadCoord(pScrn, x, y, 0, len, dxdom, dy);
943c35d236eSmrg	GLINT_WRITE_REG(PrimitiveLine, Render);
944c35d236eSmrg	return;
945c35d236eSmrg    }
946c35d236eSmrg
947c35d236eSmrg    fbBres(pGlint->CurrentDrawable, pGlint->CurrentGC, 0,
948c35d236eSmrg                (octant & XDECREASING) ? -1 : 1,
949c35d236eSmrg                (octant & YDECREASING) ? -1 : 1,
950c35d236eSmrg                (octant & YMAJOR) ? Y_AXIS : X_AXIS,
951c35d236eSmrg                x, y,  e, dmin, -dmaj, len);
952c35d236eSmrg}
9531fb744b4Smrg#endif
954