pm_accel.c revision e29e96eb
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 * Permedia 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 "glint_regs.h"
44c35d236eSmrg#include "glint.h"
45c35d236eSmrg
461fb744b4Smrg#ifdef HAVE_XAA_H
47c35d236eSmrg#include "miline.h"		/* for octants */
48c35d236eSmrg#include "xaalocal.h"		/* For replacements */
49c35d236eSmrg
50c35d236eSmrgstatic void PermediaSync(ScrnInfoPtr pScrn);
51c35d236eSmrgstatic void PermediaSetupForFillRectSolid(ScrnInfoPtr pScrn, int color, int rop,
52c35d236eSmrg				unsigned int planemask);
53c35d236eSmrgstatic void PermediaSubsequentFillRectSolid(ScrnInfoPtr pScrn, int x, int y,
54c35d236eSmrg				int w, int h);
55c35d236eSmrgstatic void PermediaSetupForSolidLine(ScrnInfoPtr pScrn, int color,
56c35d236eSmrg				int rop, unsigned int planemask);
57c35d236eSmrgstatic void PermediaSubsequentHorVertLine(ScrnInfoPtr pScrn, int x, int y,
58c35d236eSmrg				int len, int dir);
59c35d236eSmrgstatic void PermediaSubsequentSolidBresenhamLine(ScrnInfoPtr pScrn,
60c35d236eSmrg        			int x, int y, int dmaj, int dmin, int e,
61c35d236eSmrg				int len, int octant);
62c35d236eSmrgstatic void PermediaSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1,
63c35d236eSmrg				int y1, int x2, int y2, int w, int h);
64c35d236eSmrgstatic void PermediaSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir,
65c35d236eSmrg				int ydir, int rop, unsigned int planemask,
66c35d236eSmrg				int transparency_color);
67c35d236eSmrgstatic void PermediaSetClippingRectangle(ScrnInfoPtr pScrn, int x1, int y1,
68c35d236eSmrg				int x2, int y2);
69c35d236eSmrgstatic void PermediaDisableClipping(ScrnInfoPtr pScrn);
70c35d236eSmrgstatic void PermediaSetupForScanlineCPUToScreenColorExpandFill(
71c35d236eSmrg				ScrnInfoPtr pScrn,
72c35d236eSmrg				int fg, int bg, int rop,
73c35d236eSmrg				unsigned int planemask);
74c35d236eSmrgstatic void PermediaSubsequentScanlineCPUToScreenColorExpandFill(
75c35d236eSmrg				ScrnInfoPtr pScrn, int x,
76c35d236eSmrg				int y, int w, int h, int skipleft);
77c35d236eSmrgstatic void PermediaSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno);
78c35d236eSmrgstatic void PermediaWriteBitmap(ScrnInfoPtr pScrn, int x, int y, int w, int h,
79c35d236eSmrg    				unsigned char *src, int srcwidth, int skipleft,
80c35d236eSmrg    				int fg, int bg, int rop,unsigned int planemask);
81c35d236eSmrgstatic void PermediaWritePixmap8bpp(ScrnInfoPtr pScrn, int x, int y, int w,
82c35d236eSmrg    				int h, unsigned char *src, int srcwidth,
83c35d236eSmrg    				int rop, unsigned int planemask,
84c35d236eSmrg    				int transparency_color, int bpp, int depth);
85c35d236eSmrgstatic void PermediaWritePixmap16bpp(ScrnInfoPtr pScrn, int x, int y, int w,
86c35d236eSmrg    				int h, unsigned char *src, int srcwidth,
87c35d236eSmrg    				int rop, unsigned int planemask,
88c35d236eSmrg    				int transparency_color, int bpp, int depth);
89c35d236eSmrgstatic void PermediaWritePixmap32bpp(ScrnInfoPtr pScrn, int x, int y, int w,
90c35d236eSmrg    				int h, unsigned char *src, int srcwidth,
91c35d236eSmrg    				int rop, unsigned int planemask,
92c35d236eSmrg    				int transparency_color, int bpp, int depth);
93c35d236eSmrgstatic void PermediaSetupForMono8x8PatternFill(ScrnInfoPtr pScrn,
94c35d236eSmrg				int patternx, int patterny,
95c35d236eSmrg				int fg, int bg, int rop,
96c35d236eSmrg				unsigned planemask);
97c35d236eSmrgstatic void PermediaSubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn,
98c35d236eSmrg				int patternx, int patterny, int x, int y,
99c35d236eSmrg			   	int w, int h);
100c35d236eSmrgstatic void PermediaLoadCoord(ScrnInfoPtr pScrn, int x, int y, int w, int h,
101c35d236eSmrg				int a, int d);
102c35d236eSmrgstatic void PermediaPolylinesThinSolidWrapper(DrawablePtr pDraw, GCPtr pGC,
103c35d236eSmrg   				int mode, int npt, DDXPointPtr pPts);
104c35d236eSmrgstatic void PermediaPolySegmentThinSolidWrapper(DrawablePtr pDraw, GCPtr pGC,
105c35d236eSmrg 				int nseg, xSegment *pSeg);
106c35d236eSmrg
107c35d236eSmrgvoid
108c35d236eSmrgPermediaInitializeEngine(ScrnInfoPtr pScrn)
109c35d236eSmrg{
110c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
111c35d236eSmrg
112c35d236eSmrg    /* Initialize the Accelerator Engine to defaults */
113c35d236eSmrg
114c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	ScissorMode);
115c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_ENABLE,	FBWriteMode);
116c35d236eSmrg    GLINT_SLOW_WRITE_REG(0, 		dXSub);
117c35d236eSmrg    GLINT_SLOW_WRITE_REG(GWIN_DisableLBUpdate,   GLINTWindow);
118c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	DitherMode);
119c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	AlphaBlendMode);
120c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	ColorDDAMode);
121c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	TextureColorMode);
122c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	TextureAddressMode);
123c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	PMTextureReadMode);
124c35d236eSmrg    GLINT_SLOW_WRITE_REG(pGlint->pprod,	LBReadMode);
125c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	AlphaBlendMode);
126c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	TexelLUTMode);
127c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	YUVMode);
128c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	DepthMode);
129c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	RouterMode);
130c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	FogMode);
131c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	AntialiasMode);
132c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	AlphaTestMode);
133c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	StencilMode);
134c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	AreaStippleMode);
135c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	LogicalOpMode);
136c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	DepthMode);
137c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	StatisticMode);
138c35d236eSmrg    GLINT_SLOW_WRITE_REG(0x400,		FilterMode);
139c35d236eSmrg    GLINT_SLOW_WRITE_REG(0xffffffff,	FBHardwareWriteMask);
140c35d236eSmrg    GLINT_SLOW_WRITE_REG(0xffffffff,	FBSoftwareWriteMask);
141c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	RasterizerMode);
142c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	GLINTDepth);
143c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	FBSourceOffset);
144c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	FBPixelOffset);
145c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	LBSourceOffset);
146c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	WindowOrigin);
147c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	FBWindowBase);
148c35d236eSmrg    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	LBWindowBase);
149c35d236eSmrg
150c35d236eSmrg    switch (pScrn->bitsPerPixel) {
151c35d236eSmrg	case 8:
152c35d236eSmrg	    GLINT_SLOW_WRITE_REG(0x0, FBReadPixel); /* 8 Bits */
153c35d236eSmrg	    GLINT_SLOW_WRITE_REG(pGlint->pprod,	PMTextureMapFormat);
154c35d236eSmrg	    break;
155c35d236eSmrg	case 16:
156c35d236eSmrg	    GLINT_SLOW_WRITE_REG(0x1, FBReadPixel); /* 16 Bits */
157c35d236eSmrg	    GLINT_SLOW_WRITE_REG(pGlint->pprod | 1<<19,	PMTextureMapFormat);
158c35d236eSmrg	    break;
159c35d236eSmrg	case 32:
160c35d236eSmrg	    GLINT_SLOW_WRITE_REG(0x2, FBReadPixel); /* 32 Bits */
161c35d236eSmrg	    GLINT_SLOW_WRITE_REG(pGlint->pprod | 2<<19,	PMTextureMapFormat);
162c35d236eSmrg  	    break;
163c35d236eSmrg    }
164c35d236eSmrg    pGlint->ROP = 0xFF;
165c35d236eSmrg    pGlint->ClippingOn = FALSE;
166c35d236eSmrg    pGlint->startxsub = 0;
167c35d236eSmrg    pGlint->startxdom = 0;
168c35d236eSmrg    pGlint->starty = 0;
169c35d236eSmrg    pGlint->count = 0;
170c35d236eSmrg    pGlint->dxdom = 0;
171c35d236eSmrg    pGlint->dy = 1<<16;
172c35d236eSmrg    GLINT_WAIT(6);
173c35d236eSmrg    GLINT_WRITE_REG(0, StartXSub);
174c35d236eSmrg    GLINT_WRITE_REG(0,StartXDom);
175c35d236eSmrg    GLINT_WRITE_REG(0,StartY);
176c35d236eSmrg    GLINT_WRITE_REG(0,GLINTCount);
177c35d236eSmrg    GLINT_WRITE_REG(0,dXDom);
178c35d236eSmrg    GLINT_WRITE_REG(1<<16,dY);
179c35d236eSmrg}
1801fb744b4Smrg#endif
181c35d236eSmrg
182c35d236eSmrgBool
183c35d236eSmrgPermediaAccelInit(ScreenPtr pScreen)
184c35d236eSmrg{
1851fb744b4Smrg#ifdef HAVE_XAA_H
186c35d236eSmrg    XAAInfoRecPtr infoPtr;
1871fb744b4Smrg    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
188c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
189c35d236eSmrg    BoxRec AvailFBArea;
190c35d236eSmrg
191c35d236eSmrg    pGlint->AccelInfoRec = infoPtr = XAACreateInfoRec();
192c35d236eSmrg    if (!infoPtr) return FALSE;
193c35d236eSmrg
194c35d236eSmrg    PermediaInitializeEngine(pScrn);
195c35d236eSmrg
196c35d236eSmrg    infoPtr->Flags = PIXMAP_CACHE |
197c35d236eSmrg		     LINEAR_FRAMEBUFFER |
198c35d236eSmrg		     OFFSCREEN_PIXMAPS;
199c35d236eSmrg
200c35d236eSmrg    infoPtr->Sync = PermediaSync;
201c35d236eSmrg
202c35d236eSmrg    infoPtr->SetClippingRectangle = PermediaSetClippingRectangle;
203c35d236eSmrg    infoPtr->DisableClipping = PermediaDisableClipping;
204c35d236eSmrg    infoPtr->ClippingFlags = HARDWARE_CLIP_MONO_8x8_FILL;
205c35d236eSmrg
206c35d236eSmrg    infoPtr->SolidFillFlags = 0;
207c35d236eSmrg    infoPtr->SetupForSolidFill = PermediaSetupForFillRectSolid;
208c35d236eSmrg    infoPtr->SubsequentSolidFillRect = PermediaSubsequentFillRectSolid;
209c35d236eSmrg    infoPtr->SolidLineFlags = 0;
210c35d236eSmrg    infoPtr->PolySegmentThinSolidFlags = 0;
211c35d236eSmrg    infoPtr->PolylinesThinSolidFlags = 0;
212c35d236eSmrg    infoPtr->SetupForSolidLine = PermediaSetupForSolidLine;
213c35d236eSmrg    infoPtr->SubsequentSolidHorVertLine = PermediaSubsequentHorVertLine;
214c35d236eSmrg    if (!(pScrn->overlayFlags & OVERLAY_8_32_PLANAR))
215c35d236eSmrg    {
216c35d236eSmrg        infoPtr->SubsequentSolidBresenhamLine =
217c35d236eSmrg				PermediaSubsequentSolidBresenhamLine;
218c35d236eSmrg    }
219c35d236eSmrg    infoPtr->PolySegmentThinSolid = PermediaPolySegmentThinSolidWrapper;
220c35d236eSmrg    infoPtr->PolylinesThinSolid = PermediaPolylinesThinSolidWrapper;
221c35d236eSmrg
222c35d236eSmrg    infoPtr->ScreenToScreenCopyFlags = NO_TRANSPARENCY;
223c35d236eSmrg
224c35d236eSmrg    infoPtr->SetupForScreenToScreenCopy = PermediaSetupForScreenToScreenCopy;
225c35d236eSmrg    infoPtr->SubsequentScreenToScreenCopy = PermediaSubsequentScreenToScreenCopy;
226c35d236eSmrg
227c35d236eSmrg    infoPtr->Mono8x8PatternFillFlags =
228c35d236eSmrg    				HARDWARE_PATTERN_PROGRAMMED_ORIGIN |
229c35d236eSmrg    				HARDWARE_PATTERN_PROGRAMMED_BITS |
230c35d236eSmrg    				HARDWARE_PATTERN_SCREEN_ORIGIN;
231c35d236eSmrg
232c35d236eSmrg    infoPtr->SetupForMono8x8PatternFill =
233c35d236eSmrg				PermediaSetupForMono8x8PatternFill;
234c35d236eSmrg    infoPtr->SubsequentMono8x8PatternFillRect =
235c35d236eSmrg				PermediaSubsequentMono8x8PatternFillRect;
236c35d236eSmrg
237c35d236eSmrg    infoPtr->ScanlineCPUToScreenColorExpandFillFlags =
238c35d236eSmrg#if 0
239c35d236eSmrg					       LEFT_EDGE_CLIPPING |
240c35d236eSmrg					       LEFT_EDGE_CLIPPING_NEGATIVE_X |
241c35d236eSmrg#endif
242c35d236eSmrg					       BIT_ORDER_IN_BYTE_LSBFIRST;
243c35d236eSmrg
244c35d236eSmrg    infoPtr->NumScanlineColorExpandBuffers = 1;
2451fb744b4Smrg    pGlint->ScratchBuffer                 = malloc(((pScrn->virtualX + 62) / 32 * 4) + (pScrn->virtualX * pScrn->bitsPerPixel / 8));
246c35d236eSmrg    infoPtr->ScanlineColorExpandBuffers =
247c35d236eSmrg					pGlint->XAAScanlineColorExpandBuffers;
248c35d236eSmrg    pGlint->XAAScanlineColorExpandBuffers[0] =
249c35d236eSmrg					pGlint->IOBase + OutputFIFO + 4;
250c35d236eSmrg
251c35d236eSmrg    infoPtr->SetupForScanlineCPUToScreenColorExpandFill =
252c35d236eSmrg			PermediaSetupForScanlineCPUToScreenColorExpandFill;
253c35d236eSmrg    infoPtr->SubsequentScanlineCPUToScreenColorExpandFill =
254c35d236eSmrg			PermediaSubsequentScanlineCPUToScreenColorExpandFill;
255c35d236eSmrg    infoPtr->SubsequentColorExpandScanline =
256c35d236eSmrg			PermediaSubsequentColorExpandScanline;
257c35d236eSmrg
258c35d236eSmrg    infoPtr->ColorExpandRange = pGlint->FIFOSize;
259c35d236eSmrg
260c35d236eSmrg    infoPtr->WriteBitmap = PermediaWriteBitmap;
261c35d236eSmrg
262c35d236eSmrg    if (pScrn->bitsPerPixel == 8)
263c35d236eSmrg        infoPtr->WritePixmap = PermediaWritePixmap8bpp;
264c35d236eSmrg    else
265c35d236eSmrg    if (pScrn->bitsPerPixel == 16)
266c35d236eSmrg        infoPtr->WritePixmap = PermediaWritePixmap16bpp;
267c35d236eSmrg    else
268c35d236eSmrg    if (pScrn->bitsPerPixel == 32)
269c35d236eSmrg        infoPtr->WritePixmap = PermediaWritePixmap32bpp;
270c35d236eSmrg
271c35d236eSmrg    AvailFBArea.x1 = 0;
272c35d236eSmrg    AvailFBArea.y1 = 0;
273c35d236eSmrg    AvailFBArea.x2 = pScrn->displayWidth;
274c35d236eSmrg    AvailFBArea.y2 = pGlint->FbMapSize / (pScrn->displayWidth *
275c35d236eSmrg					  pScrn->bitsPerPixel / 8);
276c35d236eSmrg
277c35d236eSmrg    if (AvailFBArea.y2 > 1023) AvailFBArea.y2 = 1023;
278c35d236eSmrg
279c35d236eSmrg    xf86InitFBManager(pScreen, &AvailFBArea);
280c35d236eSmrg
281c35d236eSmrg    return (XAAInit(pScreen, infoPtr));
2821fb744b4Smrg#else
2831fb744b4Smrg    return FALSE;
2841fb744b4Smrg#endif
285c35d236eSmrg}
286c35d236eSmrg
2871fb744b4Smrg#ifdef HAVE_XAA_H
288c35d236eSmrgstatic void PermediaLoadCoord(
289c35d236eSmrg	ScrnInfoPtr pScrn,
290c35d236eSmrg	int x, int y,
291c35d236eSmrg	int w, int h,
292c35d236eSmrg	int a, int d
293c35d236eSmrg){
294c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
295c35d236eSmrg
296c35d236eSmrg    if (w != pGlint->startxsub) {
297c35d236eSmrg    	GLINT_WRITE_REG(w, StartXSub);
298c35d236eSmrg	pGlint->startxsub = w;
299c35d236eSmrg    }
300c35d236eSmrg    if (x != pGlint->startxdom) {
301c35d236eSmrg    	GLINT_WRITE_REG(x,StartXDom);
302c35d236eSmrg	pGlint->startxdom = x;
303c35d236eSmrg    }
304c35d236eSmrg    if (y != pGlint->starty) {
305c35d236eSmrg    	GLINT_WRITE_REG(y,StartY);
306c35d236eSmrg	pGlint->starty = y;
307c35d236eSmrg    }
308c35d236eSmrg    if (h != pGlint->count) {
309c35d236eSmrg    	GLINT_WRITE_REG(h,GLINTCount);
310c35d236eSmrg	pGlint->count = h;
311c35d236eSmrg    }
312c35d236eSmrg    if (a != pGlint->dxdom) {
313c35d236eSmrg    	GLINT_WRITE_REG(a,dXDom);
314c35d236eSmrg	pGlint->dxdom = a;
315c35d236eSmrg    }
316c35d236eSmrg    if (d != pGlint->dy) {
317c35d236eSmrg    	GLINT_WRITE_REG(d,dY);
318c35d236eSmrg	pGlint->dy = d;
319c35d236eSmrg    }
320c35d236eSmrg}
321c35d236eSmrg
322c35d236eSmrgstatic void
323c35d236eSmrgPermediaSync(ScrnInfoPtr pScrn)
324c35d236eSmrg{
325c35d236eSmrg	GLINTPtr pGlint = GLINTPTR(pScrn);
326c35d236eSmrg
327c35d236eSmrg	CHECKCLIPPING;
328c35d236eSmrg
329c35d236eSmrg	while (GLINT_READ_REG(DMACount) != 0);
330c35d236eSmrg	GLINT_WAIT(2);
331c35d236eSmrg    	GLINT_WRITE_REG(0x400, FilterMode);
332c35d236eSmrg	GLINT_WRITE_REG(0, GlintSync);
333c35d236eSmrg	do {
334c35d236eSmrg    		while(GLINT_READ_REG(OutFIFOWords) == 0);
335c35d236eSmrg	} while (GLINT_READ_REG(OutputFIFO) != Sync_tag);
336c35d236eSmrg}
337c35d236eSmrg
338c35d236eSmrgstatic void
339c35d236eSmrgPermediaSetClippingRectangle(
340c35d236eSmrg	ScrnInfoPtr pScrn,
341c35d236eSmrg	int x1, int y1,
342c35d236eSmrg	int x2, int y2
343c35d236eSmrg){
344c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
345c35d236eSmrg    GLINT_WAIT(3);
346c35d236eSmrg    GLINT_WRITE_REG (((y1&0x0FFF) << 16) | (x1&0x0FFF), ScissorMinXY);
347c35d236eSmrg    GLINT_WRITE_REG (((y2&0x0FFF) << 16) | (x2&0x0FFF), ScissorMaxXY);
348c35d236eSmrg    GLINT_WRITE_REG (1, ScissorMode);
349c35d236eSmrg    pGlint->ClippingOn = TRUE;
350c35d236eSmrg}
351c35d236eSmrg
352c35d236eSmrgstatic void
353c35d236eSmrgPermediaDisableClipping(
354c35d236eSmrg	ScrnInfoPtr pScrn
355c35d236eSmrg){
356c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
357c35d236eSmrg    CHECKCLIPPING;
358c35d236eSmrg}
359c35d236eSmrg
360c35d236eSmrgstatic void
361c35d236eSmrgPermediaSetupForScreenToScreenCopy(
362c35d236eSmrg	ScrnInfoPtr pScrn,
363c35d236eSmrg	int xdir, int ydir, int rop,
364c35d236eSmrg	unsigned int planemask, int transparency_color
365c35d236eSmrg){
366c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
367c35d236eSmrg
368c35d236eSmrg    pGlint->BltScanDirection = 0;
369c35d236eSmrg    if (ydir == 1) pGlint->BltScanDirection |= YPositive;
370c35d236eSmrg
371c35d236eSmrg    GLINT_WAIT(4);
372c35d236eSmrg    DO_PLANEMASK(planemask);
373c35d236eSmrg    GLINT_WRITE_REG(0, RasterizerMode);
374c35d236eSmrg    GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode);
375c35d236eSmrg
376c35d236eSmrg    if ((rop == GXset) || (rop == GXclear)) {
377c35d236eSmrg	pGlint->FrameBufferReadMode = pGlint->pprod;
378c35d236eSmrg    } else
379c35d236eSmrg    if ((rop == GXcopy) || (rop == GXcopyInverted)) {
380c35d236eSmrg	pGlint->FrameBufferReadMode = pGlint->pprod | FBRM_SrcEnable;
381c35d236eSmrg    } else {
382c35d236eSmrg	pGlint->FrameBufferReadMode = pGlint->pprod | FBRM_SrcEnable |
383c35d236eSmrg				      FBRM_DstEnable;
384c35d236eSmrg    }
385c35d236eSmrg    LOADROP(rop);
386c35d236eSmrg}
387c35d236eSmrg
388c35d236eSmrgstatic void
389c35d236eSmrgPermediaSubsequentScreenToScreenCopy(
390c35d236eSmrg	ScrnInfoPtr pScrn,
391c35d236eSmrg	int x1, int y1,
392c35d236eSmrg	int x2, int y2,
393c35d236eSmrg	int w, int h)
394c35d236eSmrg{
395c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
396c35d236eSmrg    int srcaddr;
397c35d236eSmrg    int dstaddr;
398c35d236eSmrg    char align;
399c35d236eSmrg    int direction;
400c35d236eSmrg
401c35d236eSmrg    if (!(pGlint->BltScanDirection & YPositive)) {
402c35d236eSmrg	y1 = y1 + h - 1;
403c35d236eSmrg	y2 = y2 + h - 1;
404e29e96ebSjoerg	direction = -65536;
405c35d236eSmrg    } else {
406c35d236eSmrg	direction = 1<<16;
407c35d236eSmrg    }
408c35d236eSmrg
409c35d236eSmrg    /* We can only use GXcopy for Packed modes, and less than 32 width
410c35d236eSmrg     * gives us speed for small blits. */
411c35d236eSmrg    if ((w < 32) || (pGlint->ROP != GXcopy)) {
412c35d236eSmrg  	GLINT_WAIT(9);
413c35d236eSmrg	PermediaLoadCoord(pScrn, x2<<16, y2<<16, (x2+w)<<16, h, 0, direction);
414c35d236eSmrg  	srcaddr = x1;
415c35d236eSmrg  	dstaddr = x2;
416c35d236eSmrg	GLINT_WRITE_REG(pGlint->FrameBufferReadMode, FBReadMode);
417c35d236eSmrg    } else {
418c35d236eSmrg  	GLINT_WAIT(10);
419c35d236eSmrg	PermediaLoadCoord(pScrn, (x2>>pGlint->BppShift)<<16, y2<<16,
420c35d236eSmrg				((x2+w+7)>>pGlint->BppShift)<<16, h, 0,
421c35d236eSmrg				direction);
422c35d236eSmrg  	srcaddr = (x1 & ~pGlint->bppalign);
423c35d236eSmrg  	dstaddr = (x2 & ~pGlint->bppalign);
424c35d236eSmrg  	align = (x2 & pGlint->bppalign) - (x1 & pGlint->bppalign);
425c35d236eSmrg	GLINT_WRITE_REG(pGlint->FrameBufferReadMode | FBRM_Packed |
426c35d236eSmrg						(align&7)<<20, FBReadMode);
427c35d236eSmrg  	GLINT_WRITE_REG(x2<<16|(x2+w), PackedDataLimits);
428c35d236eSmrg    }
429c35d236eSmrg    srcaddr += y1 * pScrn->displayWidth;
430c35d236eSmrg    dstaddr += y2 * pScrn->displayWidth;
431c35d236eSmrg    GLINT_WRITE_REG(srcaddr - dstaddr, FBSourceOffset);
432c35d236eSmrg    GLINT_WRITE_REG(PrimitiveTrapezoid, Render);
433c35d236eSmrg}
434c35d236eSmrg
435c35d236eSmrgstatic void
436c35d236eSmrgPermediaSetupForFillRectSolid(
437c35d236eSmrg	ScrnInfoPtr pScrn,
438c35d236eSmrg	int color, int rop,
439c35d236eSmrg	unsigned int planemask
440c35d236eSmrg){
441c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
442c35d236eSmrg    REPLICATE(color);
443c35d236eSmrg
444c35d236eSmrg    GLINT_WAIT(6);
445c35d236eSmrg    DO_PLANEMASK(planemask);
446c35d236eSmrg    GLINT_WRITE_REG(0, RasterizerMode);
447c35d236eSmrg    if (rop == GXcopy) {
448c35d236eSmrg  	GLINT_WRITE_REG(pGlint->pprod, FBReadMode);
449c35d236eSmrg  	GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode);
450c35d236eSmrg	GLINT_WRITE_REG(color, FBBlockColor);
451c35d236eSmrg    } else {
452c35d236eSmrg      	GLINT_WRITE_REG(UNIT_ENABLE, ColorDDAMode);
453c35d236eSmrg      	GLINT_WRITE_REG(color, ConstantColor);
454c35d236eSmrg    }
455c35d236eSmrg    LOADROP(rop);
456c35d236eSmrg}
457c35d236eSmrg
458c35d236eSmrgstatic void
459c35d236eSmrgPermediaSubsequentFillRectSolid(
460c35d236eSmrg	ScrnInfoPtr pScrn,
461c35d236eSmrg	int x, int y,
462c35d236eSmrg	int w, int h)
463c35d236eSmrg{
464c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
465c35d236eSmrg    int speed = 0;
466c35d236eSmrg    if (pGlint->ROP == GXcopy) {
467c35d236eSmrg	GLINT_WAIT(7);
468c35d236eSmrg	PermediaLoadCoord(pScrn, x<<16, y<<16, (x+w)<<16, h, 0, 1<<16);
469c35d236eSmrg  	speed = FastFillEnable;
470c35d236eSmrg    } else {
471c35d236eSmrg	GLINT_WAIT(9);
472c35d236eSmrg      	GLINT_WRITE_REG(pGlint->pprod | FBRM_Packed | FBRM_DstEnable, FBReadMode);
473c35d236eSmrg	PermediaLoadCoord(pScrn, (x>>pGlint->BppShift)<<16, y<<16,
474c35d236eSmrg				((x+w+7)>>pGlint->BppShift)<<16, h, 0, 1<<16);
475c35d236eSmrg  	GLINT_WRITE_REG(x<<16|(x+w), PackedDataLimits);
476c35d236eSmrg    }
477c35d236eSmrg    GLINT_WRITE_REG(PrimitiveTrapezoid | speed, Render);
478c35d236eSmrg}
479c35d236eSmrg
480c35d236eSmrgstatic void
481c35d236eSmrgPermediaSetupForMono8x8PatternFill(
482c35d236eSmrg	ScrnInfoPtr pScrn,
483c35d236eSmrg	int patternx, int patterny,
484c35d236eSmrg	int fg, int bg, int rop,
485c35d236eSmrg	unsigned int planemask)
486c35d236eSmrg{
487c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
488c35d236eSmrg    if (bg == -1) pGlint->FrameBufferReadMode = -1;
489c35d236eSmrg	else	pGlint->FrameBufferReadMode = 0;
490c35d236eSmrg    pGlint->ForeGroundColor = fg;
491c35d236eSmrg    pGlint->BackGroundColor = bg;
492c35d236eSmrg    REPLICATE(pGlint->ForeGroundColor);
493c35d236eSmrg    REPLICATE(pGlint->BackGroundColor);
494c35d236eSmrg
495c35d236eSmrg    GLINT_WAIT(8);
496c35d236eSmrg    GLINT_WRITE_REG ((patternx & 0x000000ff), AreaStipplePattern0);
497c35d236eSmrg    GLINT_WRITE_REG ((patternx & 0x0000ff00) >> 8, AreaStipplePattern1);
498c35d236eSmrg    GLINT_WRITE_REG ((patternx & 0x00ff0000) >> 16, AreaStipplePattern2);
499c35d236eSmrg    GLINT_WRITE_REG ((patternx & 0xff000000) >> 24, AreaStipplePattern3);
500c35d236eSmrg    GLINT_WRITE_REG ((patterny & 0x000000ff), AreaStipplePattern4);
501c35d236eSmrg    GLINT_WRITE_REG ((patterny & 0x0000ff00) >> 8, AreaStipplePattern5);
502c35d236eSmrg    GLINT_WRITE_REG ((patterny & 0x00ff0000) >> 16, AreaStipplePattern6);
503c35d236eSmrg    GLINT_WRITE_REG ((patterny & 0xff000000) >> 24, AreaStipplePattern7);
504c35d236eSmrg
505c35d236eSmrg    GLINT_WAIT(7);
506c35d236eSmrg    DO_PLANEMASK(planemask);
507c35d236eSmrg    GLINT_WRITE_REG(0, RasterizerMode);
508c35d236eSmrg
509c35d236eSmrg    if (rop == GXcopy) {
510c35d236eSmrg	GLINT_WRITE_REG(pGlint->pprod, FBReadMode);
511c35d236eSmrg    } else {
512c35d236eSmrg	GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode);
513c35d236eSmrg    }
514c35d236eSmrg    GLINT_WRITE_REG(UNIT_ENABLE, ColorDDAMode);
515c35d236eSmrg    GLINT_WRITE_REG(pGlint->ForeGroundColor, ConstantColor);
516c35d236eSmrg    GLINT_WRITE_REG(pGlint->BackGroundColor, Texel0);
517c35d236eSmrg    LOADROP(rop);
518c35d236eSmrg}
519c35d236eSmrg
520c35d236eSmrgstatic void
521c35d236eSmrgPermediaSubsequentMono8x8PatternFillRect(
522c35d236eSmrg	ScrnInfoPtr pScrn,
523c35d236eSmrg	int patternx, int patterny,
524c35d236eSmrg	int x, int y,
525c35d236eSmrg	int w, int h)
526c35d236eSmrg{
527c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
528c35d236eSmrg    GLINT_WAIT(8);
529c35d236eSmrg    PermediaLoadCoord(pScrn, x<<16, y<<16, (x+w)<<16, h, 0, 1<<16);
530c35d236eSmrg    if (pGlint->FrameBufferReadMode != -1) {
531c35d236eSmrg   	GLINT_WRITE_REG(1<<20|patternx<<7|patterny<<12|UNIT_ENABLE,
532c35d236eSmrg							AreaStippleMode);
533c35d236eSmrg  	GLINT_WRITE_REG(AreaStippleEnable | TextureEnable | PrimitiveTrapezoid,
534c35d236eSmrg							Render);
535c35d236eSmrg    } else {
536c35d236eSmrg  	GLINT_WRITE_REG(patternx<<7|patterny<<12|UNIT_ENABLE, AreaStippleMode);
537c35d236eSmrg  	GLINT_WRITE_REG(AreaStippleEnable | PrimitiveTrapezoid, Render);
538c35d236eSmrg    }
539c35d236eSmrg}
540c35d236eSmrg
541c35d236eSmrgstatic void
542c35d236eSmrgPermediaWriteBitmap(ScrnInfoPtr pScrn,
543c35d236eSmrg    int x, int y, int w, int h,
544c35d236eSmrg    unsigned char *src,
545c35d236eSmrg    int srcwidth,
546c35d236eSmrg    int skipleft,
547c35d236eSmrg    int fg, int bg,
548c35d236eSmrg    int rop,
549c35d236eSmrg    unsigned int planemask
550c35d236eSmrg){
551c35d236eSmrg    XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
552c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
553c35d236eSmrg    unsigned char *srcpntr;
554c35d236eSmrg    int dwords, height;
555c35d236eSmrg    register int count;
556c35d236eSmrg    register CARD32* pattern;
557c35d236eSmrg    int dobackground = 0;
558c35d236eSmrg
559c35d236eSmrg    w += skipleft;
560c35d236eSmrg    x -= skipleft;
561c35d236eSmrg    dwords = (w + 31) >> 5;
562c35d236eSmrg
563c35d236eSmrg    PermediaSetClippingRectangle(pScrn, x+skipleft, y, x+w, y+h);
564c35d236eSmrg
565c35d236eSmrg    GLINT_WAIT(14);
566c35d236eSmrg    DO_PLANEMASK(planemask);
567c35d236eSmrg    LOADROP(rop);
568c35d236eSmrg    if (bg != -1) dobackground = ForceBackgroundColor;
569c35d236eSmrg    if (rop == GXcopy) {
570c35d236eSmrg	GLINT_WRITE_REG(pGlint->pprod, FBReadMode);
571c35d236eSmrg    } else {
572c35d236eSmrg	GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode);
573c35d236eSmrg    }
574c35d236eSmrg    pGlint->BackGroundColor = bg;
575c35d236eSmrg    pGlint->ForeGroundColor = fg;
576c35d236eSmrg    REPLICATE(fg);
577c35d236eSmrg    REPLICATE(bg);
578c35d236eSmrg    if ((rop == GXcopy) && (pGlint->BackGroundColor == -1)) {
579c35d236eSmrg	pGlint->FrameBufferReadMode = FastFillEnable;
580c35d236eSmrg    	GLINT_WRITE_REG(0, RasterizerMode);
581c35d236eSmrg	GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode);
582c35d236eSmrg	GLINT_WRITE_REG(fg, FBBlockColor);
583c35d236eSmrg    } else {
584c35d236eSmrg    	GLINT_WRITE_REG(BitMaskPackingEachScanline|dobackground,RasterizerMode);
585c35d236eSmrg	GLINT_WRITE_REG(UNIT_ENABLE, ColorDDAMode);
586c35d236eSmrg	GLINT_WRITE_REG(fg, ConstantColor);
587c35d236eSmrg	if (dobackground) {
588c35d236eSmrg	    GLINT_WRITE_REG(bg, Texel0);
589c35d236eSmrg	    pGlint->FrameBufferReadMode = TextureEnable;
590c35d236eSmrg	} else {
591c35d236eSmrg            pGlint->FrameBufferReadMode = 0;
592c35d236eSmrg	}
593c35d236eSmrg    }
594c35d236eSmrg    PermediaLoadCoord(pScrn, x<<16, y<<16, (x+w)<<16, h, 0, 1<<16);
595c35d236eSmrg
596c35d236eSmrg    GLINT_WRITE_REG(PrimitiveTrapezoid | pGlint->FrameBufferReadMode | SyncOnBitMask, Render);
597c35d236eSmrg
598c35d236eSmrg    height = h;
599c35d236eSmrg    srcpntr = src;
600c35d236eSmrg    while(height--) {
601c35d236eSmrg	count = dwords >> 3;
602c35d236eSmrg	pattern = (CARD32*)srcpntr;
603c35d236eSmrg	while(count--) {
604c35d236eSmrg		GLINT_WAIT(8);
605c35d236eSmrg		GLINT_WRITE_REG(*(pattern), BitMaskPattern);
606c35d236eSmrg		GLINT_WRITE_REG(*(pattern+1), BitMaskPattern);
607c35d236eSmrg		GLINT_WRITE_REG(*(pattern+2), BitMaskPattern);
608c35d236eSmrg		GLINT_WRITE_REG(*(pattern+3), BitMaskPattern);
609c35d236eSmrg		GLINT_WRITE_REG(*(pattern+4), BitMaskPattern);
610c35d236eSmrg		GLINT_WRITE_REG(*(pattern+5), BitMaskPattern);
611c35d236eSmrg		GLINT_WRITE_REG(*(pattern+6), BitMaskPattern);
612c35d236eSmrg		GLINT_WRITE_REG(*(pattern+7), BitMaskPattern);
613c35d236eSmrg		pattern+=8;
614c35d236eSmrg	}
615c35d236eSmrg	count = dwords & 0x07;
616c35d236eSmrg	GLINT_WAIT(count);
617c35d236eSmrg	while (count--)
618c35d236eSmrg		GLINT_WRITE_REG(*(pattern++), BitMaskPattern);
619c35d236eSmrg	srcpntr += srcwidth;
620c35d236eSmrg    }
621c35d236eSmrg
622c35d236eSmrg    PermediaDisableClipping(pScrn);
623c35d236eSmrg    SET_SYNC_FLAG(infoRec);
624c35d236eSmrg}
625c35d236eSmrg
626c35d236eSmrgstatic void
627c35d236eSmrgPermediaSetupForScanlineCPUToScreenColorExpandFill(
628c35d236eSmrg	ScrnInfoPtr pScrn,
629c35d236eSmrg	int fg, int bg,
630c35d236eSmrg	int rop,
631c35d236eSmrg	unsigned int planemask
632c35d236eSmrg){
633c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
634c35d236eSmrg    int dobackground = 0;
635c35d236eSmrg
636c35d236eSmrg    if (bg != -1) dobackground |= ForceBackgroundColor;
637c35d236eSmrg    pGlint->BackGroundColor = bg;
638c35d236eSmrg    pGlint->ForeGroundColor = fg;
639c35d236eSmrg    REPLICATE(fg);
640c35d236eSmrg    REPLICATE(bg);
641c35d236eSmrg    GLINT_WAIT(7);
642c35d236eSmrg    DO_PLANEMASK(planemask);
643c35d236eSmrg    if (rop == GXcopy) {
644c35d236eSmrg  	GLINT_WRITE_REG(pGlint->pprod, FBReadMode);
645c35d236eSmrg    } else {
646c35d236eSmrg  	GLINT_WRITE_REG(pGlint->pprod|FBRM_DstEnable, FBReadMode);
647c35d236eSmrg    }
648c35d236eSmrg    if ((rop == GXcopy) && (pGlint->BackGroundColor == -1)) {
649c35d236eSmrg	pGlint->FrameBufferReadMode = FastFillEnable;
650c35d236eSmrg  	GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode);
651c35d236eSmrg        GLINT_WRITE_REG(fg, FBBlockColor);
652c35d236eSmrg	GLINT_WRITE_REG(0,RasterizerMode);
653c35d236eSmrg    } else {
654c35d236eSmrg        GLINT_WRITE_REG(UNIT_ENABLE, ColorDDAMode);
655c35d236eSmrg        GLINT_WRITE_REG(fg, ConstantColor);
656c35d236eSmrg	GLINT_WRITE_REG(BitMaskPackingEachScanline|dobackground,RasterizerMode);
657c35d236eSmrg	if (dobackground) {
658c35d236eSmrg	    GLINT_WRITE_REG(bg, Texel0);
659c35d236eSmrg	    pGlint->FrameBufferReadMode = TextureEnable;
660c35d236eSmrg	} else {
661c35d236eSmrg            pGlint->FrameBufferReadMode = 0;
662c35d236eSmrg	}
663c35d236eSmrg    }
664c35d236eSmrg    LOADROP(rop);
665c35d236eSmrg}
666c35d236eSmrg
667c35d236eSmrgstatic void
668c35d236eSmrgPermediaSubsequentScanlineCPUToScreenColorExpandFill(
669c35d236eSmrg	ScrnInfoPtr pScrn,
670c35d236eSmrg	int x, int y, int w, int h,
671c35d236eSmrg	int skipleft
672c35d236eSmrg){
673c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
674c35d236eSmrg
675c35d236eSmrg    pGlint->dwords = ((w + 31) >> 5); /* dwords per scanline */
676c35d236eSmrg
677c35d236eSmrg#if 0
678c35d236eSmrg    PermediaSetClippingRectangle(pScrn, x+skipleft, y, x+w, y+h);
679c35d236eSmrg#endif
680c35d236eSmrg
681c35d236eSmrg    pGlint->cpucount = h;
682c35d236eSmrg
683c35d236eSmrg    GLINT_WAIT(8);
684c35d236eSmrg    PermediaLoadCoord(pScrn, x<<16, y<<16, (x+w)<<16, h, 0, 1<<16);
685c35d236eSmrg    GLINT_WRITE_REG(PrimitiveTrapezoid | pGlint->FrameBufferReadMode | SyncOnBitMask,
686c35d236eSmrg							Render);
687c35d236eSmrg#if defined(__alpha__)
688c35d236eSmrg    if (0) /* force Alpha to use indirect always */
689c35d236eSmrg#else
690c35d236eSmrg    if ((pGlint->dwords*h) < pGlint->FIFOSize)
691c35d236eSmrg#endif
692c35d236eSmrg    {
693c35d236eSmrg	/* Turn on direct for less than FIFOSize dword colour expansion */
694c35d236eSmrg    	pGlint->XAAScanlineColorExpandBuffers[0] = pGlint->IOBase+OutputFIFO+4;
695c35d236eSmrg	pGlint->ScanlineDirect = 1;
696c35d236eSmrg    	GLINT_WRITE_REG(((pGlint->dwords*h)-1)<<16 | 0x0D, OutputFIFO);
697c35d236eSmrg    	GLINT_WAIT(pGlint->dwords*h);
698c35d236eSmrg    } else {
699c35d236eSmrg	/* Use indirect for anything else */
700c35d236eSmrg    	pGlint->XAAScanlineColorExpandBuffers[0] = pGlint->ScratchBuffer;
701c35d236eSmrg	pGlint->ScanlineDirect   = 0;
702c35d236eSmrg    }
703c35d236eSmrg
704c35d236eSmrg    pGlint->cpucount--;
705c35d236eSmrg}
706c35d236eSmrg
707c35d236eSmrgstatic void
708c35d236eSmrgPermediaSubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno)
709c35d236eSmrg{
710c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
711c35d236eSmrg    CARD32 *srcp = (CARD32*)pGlint->XAAScanlineColorExpandBuffers[bufno];
712c35d236eSmrg    int dwords = pGlint->dwords;
713c35d236eSmrg
714c35d236eSmrg    if (!pGlint->ScanlineDirect) {
715c35d236eSmrg	while(dwords >= pGlint->FIFOSize) {
716c35d236eSmrg	    GLINT_WAIT(pGlint->FIFOSize);
717c35d236eSmrg            GLINT_WRITE_REG(((pGlint->FIFOSize - 2) << 16) | 0x0D, OutputFIFO);
718c35d236eSmrg	    GLINT_MoveDWORDS(
719c35d236eSmrg			(CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4),
720c35d236eSmrg	 		(CARD32*)srcp, pGlint->FIFOSize - 1);
721c35d236eSmrg	    dwords -= pGlint->FIFOSize - 1;
722c35d236eSmrg	    srcp += pGlint->FIFOSize - 1;
723c35d236eSmrg	}
724c35d236eSmrg	if(dwords) {
725c35d236eSmrg	    GLINT_WAIT(dwords + 1);
726c35d236eSmrg            GLINT_WRITE_REG(((dwords - 1) << 16) | 0x0D, OutputFIFO);
727c35d236eSmrg	    GLINT_MoveDWORDS(
728c35d236eSmrg			(CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4),
729c35d236eSmrg	 		(CARD32*)srcp, dwords);
730c35d236eSmrg	}
731c35d236eSmrg    }
732c35d236eSmrg}
733c35d236eSmrg
734c35d236eSmrg
735c35d236eSmrgstatic void
736c35d236eSmrgPermediaWritePixmap8bpp(
737c35d236eSmrg    ScrnInfoPtr pScrn,
738c35d236eSmrg    int x, int y, int w, int h,
739c35d236eSmrg    unsigned char *src,
740c35d236eSmrg    int srcwidth,
741c35d236eSmrg    int rop,
742c35d236eSmrg    unsigned int planemask,
743c35d236eSmrg    int transparency_color,
744c35d236eSmrg    int bpp, int depth
745c35d236eSmrg)
746c35d236eSmrg{
747c35d236eSmrg    XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
748c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
749c35d236eSmrg    int dwords, count;
750c35d236eSmrg    CARD32* srcp;
751c35d236eSmrg    unsigned char *srcpbyte;
752c35d236eSmrg    Bool FastTexLoad = FALSE;
753c35d236eSmrg
754c35d236eSmrg    GLINT_WAIT(2);
755c35d236eSmrg    DO_PLANEMASK(planemask);
756c35d236eSmrg    GLINT_WRITE_REG(0, RasterizerMode);
757c35d236eSmrg
758c35d236eSmrg    dwords = (w + 3) >> 2;
759c35d236eSmrg    if((!(x&3)) && (!(w&3))) FastTexLoad = TRUE;
760c35d236eSmrg    if((rop != GXcopy) || (planemask != ~0))
761c35d236eSmrg	FastTexLoad = FALSE;
762c35d236eSmrg
763c35d236eSmrg#if 0
764c35d236eSmrg    if (rop != GXcopy) {
765c35d236eSmrg	int skipleft;
766c35d236eSmrg
767c35d236eSmrg	if((skipleft = (long)src & 0x03)) {
768c35d236eSmrg	    	skipleft /= (bpp>>3);
769c35d236eSmrg
770c35d236eSmrg	    x -= skipleft;
771c35d236eSmrg	    w += skipleft;
772c35d236eSmrg
773c35d236eSmrg	       src = (unsigned char*)((long)src & ~0x03);
774c35d236eSmrg	}
775c35d236eSmrg    }
776c35d236eSmrg#endif
777c35d236eSmrg
778c35d236eSmrg        if(FastTexLoad) {
779c35d236eSmrg	  int address;
780c35d236eSmrg
781c35d236eSmrg	  GLINT_WAIT(1);
782c35d236eSmrg	  GLINT_WRITE_REG(UNIT_DISABLE, FBWriteMode);
783c35d236eSmrg	  PermediaSync(pScrn);	/* we are not using the rasterizer */
784c35d236eSmrg	  while(h--) {
785c35d236eSmrg	      count = dwords;
786c35d236eSmrg	      address = ((y * pScrn->displayWidth) + x) >> 2;
787c35d236eSmrg	      srcp = (CARD32*)src;
788c35d236eSmrg	      GLINT_WAIT(1);
789c35d236eSmrg	      GLINT_WRITE_REG(address, TextureDownloadOffset);
790c35d236eSmrg	      while(count >= infoRec->ColorExpandRange) {
791c35d236eSmrg    	    	GLINT_WAIT(infoRec->ColorExpandRange);
792c35d236eSmrg		/* (0x11 << 4) | 0x0D is the TAG for TextureData */
793c35d236eSmrg        	GLINT_WRITE_REG(((infoRec->ColorExpandRange - 2) << 16)
794c35d236eSmrg					| (0x11 << 4) |	0x0D, OutputFIFO);
795c35d236eSmrg		GLINT_MoveDWORDS(
796c35d236eSmrg			(CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4),
797c35d236eSmrg	 		(CARD32*)srcp, infoRec->ColorExpandRange - 1);
798c35d236eSmrg		count -= infoRec->ColorExpandRange - 1;
799c35d236eSmrg		address += infoRec->ColorExpandRange - 1;
800c35d236eSmrg		srcp += infoRec->ColorExpandRange - 1;
801c35d236eSmrg	      }
802c35d236eSmrg	      if(count) {
803c35d236eSmrg    	    	GLINT_WAIT(count + 1);
804c35d236eSmrg		/* (0x11 << 4) | 0x0D is the TAG for TextureData */
805c35d236eSmrg        	GLINT_WRITE_REG(((count - 1) << 16) | (0x11 << 4) | 0x0D,
806c35d236eSmrg					 OutputFIFO);
807c35d236eSmrg		GLINT_MoveDWORDS(
808c35d236eSmrg			(CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4),
809c35d236eSmrg	 		(CARD32*)srcp, count);
810c35d236eSmrg	      }
811c35d236eSmrg	      src += srcwidth;
812c35d236eSmrg	      y++;
813c35d236eSmrg	  }
814c35d236eSmrg	  GLINT_WAIT(1);
815c35d236eSmrg	  GLINT_WRITE_REG(UNIT_ENABLE, FBWriteMode);
816c35d236eSmrg	} else {
817c35d236eSmrg	   GLINT_WAIT(10);
818c35d236eSmrg	   if (rop == GXcopy) {
819c35d236eSmrg	     GLINT_WRITE_REG(pGlint->pprod, FBReadMode);
820c35d236eSmrg	   } else {
821c35d236eSmrg	     GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode);
822c35d236eSmrg	   }
823c35d236eSmrg           PermediaLoadCoord(pScrn, x<<16, y<<16, (x+w)<<16, h, 0, 1<<16);
824c35d236eSmrg	   GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode);
825c35d236eSmrg	   LOADROP(rop);
826c35d236eSmrg  	   GLINT_WRITE_REG(PrimitiveTrapezoid | SyncOnHostData, Render);
827c35d236eSmrg
828c35d236eSmrg	   {
829c35d236eSmrg	    while(h--) {
830c35d236eSmrg	      count = w;
831c35d236eSmrg	      srcpbyte = (unsigned char *)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) |
836c35d236eSmrg				(0x15 << 4) | 0x05, OutputFIFO);
837c35d236eSmrg		GLINT_MoveBYTE(
838c35d236eSmrg			(CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4),
839c35d236eSmrg	 		(unsigned char *)srcpbyte, infoRec->ColorExpandRange-1);
840c35d236eSmrg		count -= infoRec->ColorExpandRange - 1;
841c35d236eSmrg		srcpbyte += infoRec->ColorExpandRange - 1;
842c35d236eSmrg	      }
843c35d236eSmrg	      if(count) {
844c35d236eSmrg    	    	GLINT_WAIT(count + 1);
845c35d236eSmrg		/* (0x15 << 4) | 0x05 is the TAG for FBSourceData */
846c35d236eSmrg        	GLINT_WRITE_REG(((count - 1) << 16) | (0x15 << 4) |
847c35d236eSmrg					0x05, OutputFIFO);
848c35d236eSmrg		GLINT_MoveBYTE(
849c35d236eSmrg			(CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4),
850c35d236eSmrg	 		(unsigned char *)srcpbyte, count);
851c35d236eSmrg	      }
852c35d236eSmrg	      src += srcwidth;
853c35d236eSmrg	    }
854c35d236eSmrg	   }
855c35d236eSmrg	}
856c35d236eSmrg
857c35d236eSmrg    SET_SYNC_FLAG(infoRec);
858c35d236eSmrg}
859c35d236eSmrg
860c35d236eSmrgstatic void
861c35d236eSmrgPermediaWritePixmap16bpp(
862c35d236eSmrg    ScrnInfoPtr pScrn,
863c35d236eSmrg    int x, int y, int w, int h,
864c35d236eSmrg    unsigned char *src,
865c35d236eSmrg    int srcwidth,
866c35d236eSmrg    int rop,
867c35d236eSmrg    unsigned int planemask,
868c35d236eSmrg    int transparency_color,
869c35d236eSmrg    int bpp, int depth
870c35d236eSmrg)
871c35d236eSmrg{
872c35d236eSmrg    XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
873c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
874c35d236eSmrg    int dwords, count;
875c35d236eSmrg    CARD32* srcp;
876c35d236eSmrg    unsigned short* srcpword;
877c35d236eSmrg    Bool FastTexLoad;
878c35d236eSmrg
879c35d236eSmrg    GLINT_WAIT(2);
880c35d236eSmrg    DO_PLANEMASK(planemask);
881c35d236eSmrg    GLINT_WRITE_REG(0, RasterizerMode);
882c35d236eSmrg
883c35d236eSmrg	FastTexLoad = FALSE;
884c35d236eSmrg	dwords = (w + 1) >> 1;
885c35d236eSmrg	if((!(x&1)) && (!(w&1))) FastTexLoad = TRUE;
886c35d236eSmrg	if((rop != GXcopy) || (planemask != ~0))
887c35d236eSmrg		FastTexLoad = FALSE;
888c35d236eSmrg
889c35d236eSmrg#if 0
890c35d236eSmrg	if (rop != GXcopy) {
891c35d236eSmrg	  int skipleft;
892c35d236eSmrg
893c35d236eSmrg	  if((skipleft = (long)src & 0x03L)) {
894c35d236eSmrg	    		skipleft /= (bpp>>3);
895c35d236eSmrg
896c35d236eSmrg	    	x -= skipleft;
897c35d236eSmrg	    	w += skipleft;
898c35d236eSmrg
899c35d236eSmrg	    	   src = (unsigned char*)((long)src & ~0x03L);
900c35d236eSmrg	  }
901c35d236eSmrg	}
902c35d236eSmrg#endif
903c35d236eSmrg
904c35d236eSmrg        if(FastTexLoad) {
905c35d236eSmrg	  int address;
906c35d236eSmrg
907c35d236eSmrg	  GLINT_WAIT(1);
908c35d236eSmrg	  GLINT_WRITE_REG(UNIT_DISABLE, FBWriteMode);
909c35d236eSmrg	  PermediaSync(pScrn);	/* we are not using the rasterizer */
910c35d236eSmrg	  while(h--) {
911c35d236eSmrg	      count = dwords;
912c35d236eSmrg	      address = ((y * pScrn->displayWidth) + x) >> 1;
913c35d236eSmrg	      srcp = (CARD32*)src;
914c35d236eSmrg	      GLINT_WAIT(1);
915c35d236eSmrg	      GLINT_WRITE_REG(address, TextureDownloadOffset);
916c35d236eSmrg	      while(count >= infoRec->ColorExpandRange) {
917c35d236eSmrg    	    	GLINT_WAIT(infoRec->ColorExpandRange);
918c35d236eSmrg		/* (0x11 << 4) | 0x0D is the TAG for TextureData */
919c35d236eSmrg        	GLINT_WRITE_REG(((infoRec->ColorExpandRange - 2) << 16) |
920c35d236eSmrg					(0x11 << 4) | 0x0D, OutputFIFO);
921c35d236eSmrg		GLINT_MoveDWORDS(
922c35d236eSmrg			(CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4),
923c35d236eSmrg	 		(CARD32*)srcp, infoRec->ColorExpandRange - 1);
924c35d236eSmrg		count -= infoRec->ColorExpandRange - 1;
925c35d236eSmrg		address += infoRec->ColorExpandRange - 1;
926c35d236eSmrg		srcp += infoRec->ColorExpandRange - 1;
927c35d236eSmrg	      }
928c35d236eSmrg	      if(count) {
929c35d236eSmrg    	    	GLINT_WAIT(count + 1);
930c35d236eSmrg		/* (0x11 << 4) | 0x0D is the TAG for TextureData */
931c35d236eSmrg        	GLINT_WRITE_REG(((count - 1) << 16) | (0x11 << 4) | 0x0D,
932c35d236eSmrg					 OutputFIFO);
933c35d236eSmrg		GLINT_MoveDWORDS(
934c35d236eSmrg			(CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4),
935c35d236eSmrg	 		(CARD32*)srcp, count);
936c35d236eSmrg	      }
937c35d236eSmrg	      src += srcwidth;
938c35d236eSmrg	      y++;
939c35d236eSmrg	  }
940c35d236eSmrg	  GLINT_WAIT(1);
941c35d236eSmrg	  GLINT_WRITE_REG(UNIT_ENABLE, FBWriteMode);
942c35d236eSmrg	} else {
943c35d236eSmrg	   GLINT_WAIT(10);
944c35d236eSmrg	   if (rop == GXcopy) {
945c35d236eSmrg	     GLINT_WRITE_REG(pGlint->pprod, FBReadMode);
946c35d236eSmrg	   } else {
947c35d236eSmrg	     GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode);
948c35d236eSmrg	   }
949c35d236eSmrg           PermediaLoadCoord(pScrn, x<<16, y<<16, (x+w)<<16, h, 0, 1<<16);
950c35d236eSmrg	   GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode);
951c35d236eSmrg	   LOADROP(rop);
952c35d236eSmrg  	   GLINT_WRITE_REG(PrimitiveTrapezoid | SyncOnHostData, Render);
953c35d236eSmrg
954c35d236eSmrg	   {
955c35d236eSmrg	    while(h--) {
956c35d236eSmrg	      count = w;
957c35d236eSmrg	      srcpword = (unsigned short *)src;
958c35d236eSmrg	      while(count >= infoRec->ColorExpandRange) {
959c35d236eSmrg    	    	GLINT_WAIT(infoRec->ColorExpandRange);
960c35d236eSmrg		/* (0x15 << 4) | 0x05 is the TAG for FBSourceData */
961c35d236eSmrg        	GLINT_WRITE_REG(((infoRec->ColorExpandRange - 2) << 16) |
962c35d236eSmrg				(0x15 << 4) | 0x05, OutputFIFO);
963c35d236eSmrg		GLINT_MoveWORDS(
964c35d236eSmrg			(CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4),
965c35d236eSmrg	 		(unsigned short *)srcpword,infoRec->ColorExpandRange-1);
966c35d236eSmrg		count -= infoRec->ColorExpandRange - 1;
967c35d236eSmrg		srcpword += infoRec->ColorExpandRange - 1;
968c35d236eSmrg	      }
969c35d236eSmrg	      if(count) {
970c35d236eSmrg    	    	GLINT_WAIT(count + 1);
971c35d236eSmrg		/* (0x15 << 4) | 0x05 is the TAG for FBSourceData */
972c35d236eSmrg        	GLINT_WRITE_REG(((count - 1) << 16) | (0x15 << 4) |
973c35d236eSmrg					0x05, OutputFIFO);
974c35d236eSmrg		GLINT_MoveWORDS(
975c35d236eSmrg			(CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4),
976c35d236eSmrg	 		(unsigned short *)srcpword, count);
977c35d236eSmrg	      }
978c35d236eSmrg	      src += srcwidth;
979c35d236eSmrg	    }
980c35d236eSmrg	   }
981c35d236eSmrg	}
982c35d236eSmrg
983c35d236eSmrg    SET_SYNC_FLAG(infoRec);
984c35d236eSmrg}
985c35d236eSmrg
986c35d236eSmrgstatic void
987c35d236eSmrgPermediaWritePixmap32bpp(
988c35d236eSmrg    ScrnInfoPtr pScrn,
989c35d236eSmrg    int x, int y, int w, int h,
990c35d236eSmrg    unsigned char *src,
991c35d236eSmrg    int srcwidth,
992c35d236eSmrg    int rop,
993c35d236eSmrg    unsigned int planemask,
994c35d236eSmrg    int transparency_color,
995c35d236eSmrg    int bpp, int depth
996c35d236eSmrg)
997c35d236eSmrg{
998c35d236eSmrg    XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
999c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
1000c35d236eSmrg    int dwords, count;
1001c35d236eSmrg    CARD32* srcp;
1002c35d236eSmrg    Bool FastTexLoad;
1003c35d236eSmrg
1004c35d236eSmrg    GLINT_WAIT(3);
1005c35d236eSmrg    DO_PLANEMASK(planemask);
1006c35d236eSmrg    GLINT_WRITE_REG(0, RasterizerMode);
1007c35d236eSmrg    if (rop == GXcopy) {
1008c35d236eSmrg	GLINT_WRITE_REG(pGlint->pprod, FBReadMode);
1009c35d236eSmrg    } else {
1010c35d236eSmrg	GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode);
1011c35d236eSmrg    }
1012c35d236eSmrg
1013c35d236eSmrg	FastTexLoad = TRUE;
1014c35d236eSmrg	dwords = w;
1015c35d236eSmrg	if((rop != GXcopy) || (planemask != ~0))
1016c35d236eSmrg		FastTexLoad = FALSE;
1017c35d236eSmrg
1018c35d236eSmrg#if 0
1019c35d236eSmrg	if (!FastTexLoad) {
1020c35d236eSmrg	  int skipleft;
1021c35d236eSmrg
1022c35d236eSmrg	  if((skipleft = (long)src & 0x03L)) {
1023c35d236eSmrg	    		skipleft /= (bpp>>3);
1024c35d236eSmrg
1025c35d236eSmrg	    	x -= skipleft;
1026c35d236eSmrg	    	w += skipleft;
1027c35d236eSmrg
1028c35d236eSmrg	    	   src = (unsigned char*)((long)src & ~0x03L);
1029c35d236eSmrg	  }
1030c35d236eSmrg	}
1031c35d236eSmrg#endif
1032c35d236eSmrg
1033c35d236eSmrg        if(FastTexLoad) {
1034c35d236eSmrg	  int address;
1035c35d236eSmrg
1036c35d236eSmrg	  GLINT_WAIT(1);
1037c35d236eSmrg	  GLINT_WRITE_REG(UNIT_DISABLE, FBWriteMode);
1038c35d236eSmrg	  PermediaSync(pScrn);	/* we are not using the rasterizer */
1039c35d236eSmrg	  while(h--) {
1040c35d236eSmrg	      count = dwords;
1041c35d236eSmrg	      address = (y * pScrn->displayWidth) + x;
1042c35d236eSmrg	      srcp = (CARD32*)src;
1043c35d236eSmrg	      GLINT_WAIT(1);
1044c35d236eSmrg	      GLINT_WRITE_REG(address, TextureDownloadOffset);
1045c35d236eSmrg	      while(count >= infoRec->ColorExpandRange) {
1046c35d236eSmrg    	    	GLINT_WAIT(infoRec->ColorExpandRange);
1047c35d236eSmrg		/* (0x11 << 4) | 0x0D is the TAG for TextureData */
1048c35d236eSmrg        	GLINT_WRITE_REG(((infoRec->ColorExpandRange - 2) << 16) |
1049c35d236eSmrg					(0x11 << 4) | 0x0D, OutputFIFO);
1050c35d236eSmrg		GLINT_MoveDWORDS(
1051c35d236eSmrg			(CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4),
1052c35d236eSmrg	 		(CARD32*)srcp, infoRec->ColorExpandRange - 1);
1053c35d236eSmrg		count -= infoRec->ColorExpandRange - 1;
1054c35d236eSmrg		address += infoRec->ColorExpandRange - 1;
1055c35d236eSmrg		srcp += infoRec->ColorExpandRange - 1;
1056c35d236eSmrg	      }
1057c35d236eSmrg	      if(count) {
1058c35d236eSmrg    	    	GLINT_WAIT(count + 1);
1059c35d236eSmrg		/* (0x11 << 4) | 0x0D is the TAG for TextureData */
1060c35d236eSmrg        	GLINT_WRITE_REG(((count - 1) << 16) | (0x11 << 4) | 0x0D,
1061c35d236eSmrg					 OutputFIFO);
1062c35d236eSmrg		GLINT_MoveDWORDS(
1063c35d236eSmrg			(CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4),
1064c35d236eSmrg	 		(CARD32*)srcp, count);
1065c35d236eSmrg	      }
1066c35d236eSmrg	      src += srcwidth;
1067c35d236eSmrg	      y++;
1068c35d236eSmrg	  }
1069c35d236eSmrg	  GLINT_WAIT(1);
1070c35d236eSmrg	  GLINT_WRITE_REG(UNIT_ENABLE, FBWriteMode);
1071c35d236eSmrg	} else {
1072c35d236eSmrg	   GLINT_WAIT(9);
1073c35d236eSmrg           PermediaLoadCoord(pScrn, (x&0xFFFF)<<16, y<<16, ((x&0xFFFF)+w)<<16, h, 0, 1<<16);
1074c35d236eSmrg	   LOADROP(rop);
1075c35d236eSmrg	   GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode);
1076c35d236eSmrg  	   GLINT_WRITE_REG(PrimitiveTrapezoid | SyncOnHostData, Render);
1077c35d236eSmrg
1078c35d236eSmrg	   while(h--) {
1079c35d236eSmrg	      count = dwords;
1080c35d236eSmrg	      srcp = (CARD32*)src;
1081c35d236eSmrg	      while(count >= infoRec->ColorExpandRange) {
1082c35d236eSmrg    	    	GLINT_WAIT(infoRec->ColorExpandRange);
1083c35d236eSmrg		/* (0x15 << 4) | 0x05 is the TAG for FBSourceData */
1084c35d236eSmrg        	GLINT_WRITE_REG(((infoRec->ColorExpandRange - 2) << 16) |
1085c35d236eSmrg				(0x15 << 4) | 0x05, OutputFIFO);
1086c35d236eSmrg		GLINT_MoveDWORDS(
1087c35d236eSmrg			(CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4),
1088c35d236eSmrg	 		(CARD32*)srcp, infoRec->ColorExpandRange - 1);
1089c35d236eSmrg		count -= infoRec->ColorExpandRange - 1;
1090c35d236eSmrg		srcp += infoRec->ColorExpandRange - 1;
1091c35d236eSmrg	      }
1092c35d236eSmrg	      if(count) {
1093c35d236eSmrg    	    	GLINT_WAIT(count + 1);
1094c35d236eSmrg		/* (0x15 << 4) | 0x05 is the TAG for FBSourceData */
1095c35d236eSmrg        	GLINT_WRITE_REG(((count - 1) << 16) | (0x15 << 4) |
1096c35d236eSmrg					0x05, OutputFIFO);
1097c35d236eSmrg		GLINT_MoveDWORDS(
1098c35d236eSmrg			(CARD32*)((char*)pGlint->IOBase + OutputFIFO + 4),
1099c35d236eSmrg	 		(CARD32*)srcp, count);
1100c35d236eSmrg	      }
1101c35d236eSmrg	      src += srcwidth;
1102c35d236eSmrg	   }
1103c35d236eSmrg	}
1104c35d236eSmrg
1105c35d236eSmrg    SET_SYNC_FLAG(infoRec);
1106c35d236eSmrg}
1107c35d236eSmrg
1108c35d236eSmrgstatic void
1109c35d236eSmrgPermediaPolylinesThinSolidWrapper(
1110c35d236eSmrg   DrawablePtr     pDraw,
1111c35d236eSmrg   GCPtr           pGC,
1112c35d236eSmrg   int             mode,
1113c35d236eSmrg   int             npt,
1114c35d236eSmrg   DDXPointPtr     pPts
1115c35d236eSmrg){
1116c35d236eSmrg    XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC);
1117c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(infoRec->pScrn);
1118c35d236eSmrg    pGlint->CurrentGC = pGC;
1119c35d236eSmrg    pGlint->CurrentDrawable = pDraw;
1120c35d236eSmrg    if(infoRec->NeedToSync) (*infoRec->Sync)(infoRec->pScrn);
1121c35d236eSmrg    XAAPolyLines(pDraw, pGC, mode, npt, pPts);
1122c35d236eSmrg}
1123c35d236eSmrg
1124c35d236eSmrgstatic void
1125c35d236eSmrgPermediaPolySegmentThinSolidWrapper(
1126c35d236eSmrg   DrawablePtr     pDraw,
1127c35d236eSmrg   GCPtr           pGC,
1128c35d236eSmrg   int             nseg,
1129c35d236eSmrg   xSegment        *pSeg
1130c35d236eSmrg){
1131c35d236eSmrg    XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC);
1132c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(infoRec->pScrn);
1133c35d236eSmrg    pGlint->CurrentGC = pGC;
1134c35d236eSmrg    pGlint->CurrentDrawable = pDraw;
1135c35d236eSmrg    if(infoRec->NeedToSync) (*infoRec->Sync)(infoRec->pScrn);
1136c35d236eSmrg    XAAPolySegment(pDraw, pGC, nseg, pSeg);
1137c35d236eSmrg}
1138c35d236eSmrg
1139c35d236eSmrgstatic void
1140c35d236eSmrgPermediaSetupForSolidLine(ScrnInfoPtr pScrn, int color,
1141c35d236eSmrg					 int rop, unsigned int planemask)
1142c35d236eSmrg{
1143c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
1144c35d236eSmrg
1145c35d236eSmrg    GLINT_WAIT(6);
1146c35d236eSmrg    DO_PLANEMASK(planemask);
1147c35d236eSmrg    GLINT_WRITE_REG(UNIT_DISABLE, ColorDDAMode);
1148c35d236eSmrg    GLINT_WRITE_REG(color, GLINTColor);
1149c35d236eSmrg    GLINT_WRITE_REG(0, RasterizerMode);
1150c35d236eSmrg    if (rop == GXcopy) {
1151c35d236eSmrg  	GLINT_WRITE_REG(pGlint->pprod, FBReadMode);
1152c35d236eSmrg    } else {
1153c35d236eSmrg  	GLINT_WRITE_REG(pGlint->pprod | FBRM_DstEnable, FBReadMode);
1154c35d236eSmrg    }
1155c35d236eSmrg    LOADROP(rop);
1156c35d236eSmrg}
1157c35d236eSmrg
1158c35d236eSmrgstatic void
1159c35d236eSmrgPermediaSubsequentHorVertLine(ScrnInfoPtr pScrn,int x,int y,int len,int dir)
1160c35d236eSmrg{
1161c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
1162c35d236eSmrg
1163c35d236eSmrg    GLINT_WAIT(7);
1164c35d236eSmrg    if (dir == DEGREES_0) {
1165e29e96ebSjoerg        PermediaLoadCoord(pScrn, x * 65536, y * 65536, 0, len, 1<<16, 0);
1166c35d236eSmrg    } else {
1167e29e96ebSjoerg        PermediaLoadCoord(pScrn, x * 65536, y * 65536, 0, len, 0, 1<<16);
1168c35d236eSmrg    }
1169c35d236eSmrg
1170c35d236eSmrg    GLINT_WRITE_REG(PrimitiveLine, Render);
1171c35d236eSmrg}
1172c35d236eSmrg
1173c35d236eSmrgstatic void
1174c35d236eSmrgPermediaSubsequentSolidBresenhamLine( ScrnInfoPtr pScrn,
1175c35d236eSmrg        int x, int y, int dmaj, int dmin, int e, int len, int octant)
1176c35d236eSmrg{
1177c35d236eSmrg    GLINTPtr pGlint = GLINTPTR(pScrn);
1178c35d236eSmrg    int dxdom, dy;
1179c35d236eSmrg
1180c35d236eSmrg    if(dmaj == dmin) {
1181c35d236eSmrg	GLINT_WAIT(7);
1182c35d236eSmrg	if(octant & YDECREASING) {
1183e29e96ebSjoerg	    dy = -65536;
1184c35d236eSmrg	} else {
1185e29e96ebSjoerg	    dy = 65536;
1186c35d236eSmrg	}
1187c35d236eSmrg
1188c35d236eSmrg	if(octant & XDECREASING) {
1189e29e96ebSjoerg	    dxdom = -65536;
1190c35d236eSmrg	} else {
1191e29e96ebSjoerg	    dxdom = 65536;
1192c35d236eSmrg	}
1193c35d236eSmrg
1194c35d236eSmrg        PermediaLoadCoord(pScrn, x<<16, y<<16, 0, len, dxdom, dy);
1195c35d236eSmrg	GLINT_WRITE_REG(PrimitiveLine, Render);
1196c35d236eSmrg	return;
1197c35d236eSmrg    }
1198c35d236eSmrg
1199c35d236eSmrg    fbBres(pGlint->CurrentDrawable, pGlint->CurrentGC, 0,
1200c35d236eSmrg                (octant & XDECREASING) ? -1 : 1,
1201c35d236eSmrg                (octant & YDECREASING) ? -1 : 1,
1202c35d236eSmrg                (octant & YMAJOR) ? Y_AXIS : X_AXIS,
1203c35d236eSmrg                x, y,  e, dmin, -dmaj, len);
1204c35d236eSmrg}
12051fb744b4Smrg#endif
1206