1ab47cfaaSmrg
2ab47cfaaSmrg/*
3ab47cfaaSmrgCopyright (C) 1994-2000 The XFree86 Project, Inc.  All Rights Reserved.
4ab47cfaaSmrg
5ab47cfaaSmrgPermission is hereby granted, free of charge, to any person obtaining a copy of
6ab47cfaaSmrgthis software and associated documentation files (the "Software"), to deal in
7ab47cfaaSmrgthe Software without restriction, including without limitation the rights to
8ab47cfaaSmrguse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
9ab47cfaaSmrgof the Software, and to permit persons to whom the Software is furnished to do
10ab47cfaaSmrgso, subject to the following conditions:
11ab47cfaaSmrg
12ab47cfaaSmrgThe above copyright notice and this permission notice shall be included in all
13ab47cfaaSmrgcopies or substantial portions of the Software.
14ab47cfaaSmrg
15ab47cfaaSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16ab47cfaaSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
17ab47cfaaSmrgNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18ab47cfaaSmrgXFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
19ab47cfaaSmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20ab47cfaaSmrgWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21ab47cfaaSmrg
22ab47cfaaSmrgExcept as contained in this notice, the name of the XFree86 Project shall not
23ab47cfaaSmrgbe used in advertising or otherwise to promote the sale, use or other dealings
24ab47cfaaSmrgin this Software without prior written authorization from the XFree86 Project.
25ab47cfaaSmrg*/
26ab47cfaaSmrg
27ab47cfaaSmrg#ifdef HAVE_CONFIG_H
28ab47cfaaSmrg#include "config.h"
29ab47cfaaSmrg#endif
30ab47cfaaSmrg
31ab47cfaaSmrg/*
32ab47cfaaSmrg * file: savage_dga.c
33ab47cfaaSmrg * ported from s3v, which was ported from mga
34ab47cfaaSmrg *
35ab47cfaaSmrg */
36ab47cfaaSmrg
375788ca14Smrg#ifdef HAVE_XAA_H
38ab47cfaaSmrg#include "xaalocal.h"
395788ca14Smrg#endif
40ab47cfaaSmrg#include "savage_driver.h"
41ab47cfaaSmrg#include "dgaproc.h"
42ab47cfaaSmrg
43ab47cfaaSmrg
44ab47cfaaSmrgBool SavageDGAInit(ScreenPtr pScreen);
45ab47cfaaSmrgstatic Bool Savage_OpenFramebuffer(ScrnInfoPtr, char **, unsigned char **,
46ab47cfaaSmrg		int *, int *, int *);
47ab47cfaaSmrgstatic Bool Savage_SetMode(ScrnInfoPtr, DGAModePtr);
48ab47cfaaSmrgstatic int  Savage_GetViewport(ScrnInfoPtr);
49ab47cfaaSmrgstatic void Savage_SetViewport(ScrnInfoPtr, int, int, int);
505788ca14Smrg#ifdef HAVE_XAA_H
51ab47cfaaSmrgstatic void Savage_FillRect(ScrnInfoPtr, int, int, int, int, unsigned long);
52ab47cfaaSmrgstatic void Savage_BlitRect(ScrnInfoPtr, int, int, int, int, int, int);
535788ca14Smrg#endif
54ab47cfaaSmrg
55ab47cfaaSmrgstatic
56ab47cfaaSmrgDGAFunctionRec Savage_DGAFuncs = {
57ab47cfaaSmrg    Savage_OpenFramebuffer,
58ab47cfaaSmrg    NULL,	/* CloseFrameBuffer */
59ab47cfaaSmrg    Savage_SetMode,
60ab47cfaaSmrg    Savage_SetViewport,
61ab47cfaaSmrg    Savage_GetViewport,
62ab47cfaaSmrg    SavageAccelSync,
635788ca14Smrg#ifdef HAVE_XAA_H
64ab47cfaaSmrg    Savage_FillRect,
65ab47cfaaSmrg    Savage_BlitRect,
665788ca14Smrg#else
675788ca14Smrg    NULL, NULL,
685788ca14Smrg#endif
69ab47cfaaSmrg    NULL			 /* BlitTransRect */
70ab47cfaaSmrg};
71ab47cfaaSmrg
72ab47cfaaSmrg#define DGATRACE	4
73ab47cfaaSmrg
74ab47cfaaSmrg/*
75ab47cfaaSmrg * I don't understand the thinking here.  As near as I can tell, we are
76ab47cfaaSmrg * never asked to change into a depth other than the frame buffer depth.
77ab47cfaaSmrg * So why create modes to do so?
78ab47cfaaSmrg */
79ab47cfaaSmrg
80ab47cfaaSmrgstatic DGAModePtr
81ab47cfaaSmrgSavageSetupDGAMode(
82ab47cfaaSmrg    ScrnInfoPtr pScrn,
83ab47cfaaSmrg    DGAModePtr modes,
84ab47cfaaSmrg    int *num,
85ab47cfaaSmrg    int bitsPerPixel,
86ab47cfaaSmrg    int depth,
87ab47cfaaSmrg    Bool pixmap,
88ab47cfaaSmrg    int secondPitch,
89ab47cfaaSmrg    unsigned long red,
90ab47cfaaSmrg    unsigned long green,
91ab47cfaaSmrg    unsigned long blue,
92ab47cfaaSmrg    short visualClass
93ab47cfaaSmrg)
94ab47cfaaSmrg{
95ab47cfaaSmrg    SavagePtr psav = SAVPTR(pScrn);
96ab47cfaaSmrg    DGAModePtr mode, newmodes = NULL;
97ab47cfaaSmrg    DisplayModePtr pMode, firstMode;
98ab47cfaaSmrg    int otherPitch, Bpp = bitsPerPixel >> 3;
99ab47cfaaSmrg    Bool oneMore;
100ab47cfaaSmrg
101ab47cfaaSmrg    xf86ErrorFVerb(DGATRACE, "		SavageSetupDGAMode\n");
102ab47cfaaSmrg
103ab47cfaaSmrg    pMode = firstMode = pScrn->modes;
104ab47cfaaSmrg
105ab47cfaaSmrg    /*
106ab47cfaaSmrg     * DGA 1.0 would only provide modes where the depth and stride
107ab47cfaaSmrg     * matched the current desktop.  Some DGA apps might still expect
108ab47cfaaSmrg     * this, so we provide them, too.
109ab47cfaaSmrg     */
110ab47cfaaSmrg
111ab47cfaaSmrg    while(pMode) {
112ab47cfaaSmrg
113ab47cfaaSmrg	otherPitch = secondPitch ? secondPitch : pMode->HDisplay;
114ab47cfaaSmrg
115ab47cfaaSmrg	if(pMode->HDisplay != otherPitch) {
1165788ca14Smrg	    newmodes = realloc(modes, (*num + 2) * sizeof(DGAModeRec));
117ab47cfaaSmrg	    oneMore = TRUE;
118ab47cfaaSmrg	} else {
1195788ca14Smrg	    newmodes = realloc(modes, (*num + 1) * sizeof(DGAModeRec));
120ab47cfaaSmrg	    oneMore = FALSE;
121ab47cfaaSmrg	}
122ab47cfaaSmrg
123ab47cfaaSmrg	if(!newmodes) {
1245788ca14Smrg	   free(modes);
125ab47cfaaSmrg	   return NULL;
126ab47cfaaSmrg	}
127ab47cfaaSmrg	modes = newmodes;
128ab47cfaaSmrg
129ab47cfaaSmrgSECOND_PASS:
130ab47cfaaSmrg
131ab47cfaaSmrg	mode = modes + *num;
132ab47cfaaSmrg	(*num)++;
133ab47cfaaSmrg
134ab47cfaaSmrg	mode->mode = pMode;
135ab47cfaaSmrg	mode->flags = DGA_CONCURRENT_ACCESS | DGA_PIXMAP_AVAILABLE;
1365788ca14Smrg#ifdef HAVE_XAA_H
137ab47cfaaSmrg	if(!psav->NoAccel)
138ab47cfaaSmrg	    mode->flags |= DGA_FILL_RECT | DGA_BLIT_RECT;
1395788ca14Smrg#endif
140ab47cfaaSmrg	if(pMode->Flags & V_DBLSCAN)
141ab47cfaaSmrg	    mode->flags |= DGA_DOUBLESCAN;
142ab47cfaaSmrg	if(pMode->Flags & V_INTERLACE)
143ab47cfaaSmrg	    mode->flags |= DGA_INTERLACED;
144ab47cfaaSmrg	mode->byteOrder = pScrn->imageByteOrder;
145ab47cfaaSmrg	mode->depth = depth;
146ab47cfaaSmrg	mode->bitsPerPixel = bitsPerPixel;
147ab47cfaaSmrg	mode->red_mask = red;
148ab47cfaaSmrg	mode->green_mask = green;
149ab47cfaaSmrg	mode->blue_mask = blue;
150ab47cfaaSmrg	mode->visualClass = visualClass;
151ab47cfaaSmrg	mode->viewportWidth = pMode->HDisplay;
152ab47cfaaSmrg	mode->viewportHeight = pMode->VDisplay;
153ab47cfaaSmrg	mode->xViewportStep = 2;
154ab47cfaaSmrg	mode->yViewportStep = 1;
155ab47cfaaSmrg	mode->viewportFlags = DGA_FLIP_RETRACE;
156ab47cfaaSmrg	mode->offset = 0;
157ab47cfaaSmrg	mode->address = psav->FBBase;
158ab47cfaaSmrg
159ab47cfaaSmrg	xf86ErrorFVerb(DGATRACE,
160ab47cfaaSmrg	    "SavageDGAInit vpWid=%d, vpHgt=%d, Bpp=%d, mdbitsPP=%d\n",
161ab47cfaaSmrg	    mode->viewportWidth,
162ab47cfaaSmrg	    mode->viewportHeight,
163ab47cfaaSmrg	    Bpp,
164ab47cfaaSmrg	    mode->bitsPerPixel
165ab47cfaaSmrg	);
166ab47cfaaSmrg
167ab47cfaaSmrg	if(oneMore) { /* first one is narrow width */
168ab47cfaaSmrg	    /* Force stride to multiple of 16 pixels. */
169ab47cfaaSmrg	    mode->bytesPerScanline = ((pMode->HDisplay + 15) & ~15) * Bpp;
170ab47cfaaSmrg	    mode->imageWidth = pMode->HDisplay;
171ab47cfaaSmrg	    mode->imageHeight =  pMode->VDisplay;
172ab47cfaaSmrg	    mode->pixmapWidth = mode->imageWidth;
173ab47cfaaSmrg	    mode->pixmapHeight = mode->imageHeight;
174ab47cfaaSmrg	    mode->maxViewportX = mode->imageWidth - mode->viewportWidth;
175ab47cfaaSmrg	    /* this might need to get clamped to some maximum */
176ab47cfaaSmrg	    mode->maxViewportY = mode->imageHeight - mode->viewportHeight;
177ab47cfaaSmrg	    oneMore = FALSE;
178ab47cfaaSmrg
179ab47cfaaSmrg	    xf86ErrorFVerb(DGATRACE,
180ab47cfaaSmrg		"SavageDGAInit 1 imgHgt=%d, stride=%d\n",
181ab47cfaaSmrg		mode->imageHeight,
182ab47cfaaSmrg		mode->bytesPerScanline );
183ab47cfaaSmrg
184ab47cfaaSmrg	    goto SECOND_PASS;
185ab47cfaaSmrg	} else {
186ab47cfaaSmrg	    mode->bytesPerScanline = ((pScrn->displayWidth + 15) & ~15) * Bpp;
187ab47cfaaSmrg	    mode->imageWidth = pScrn->displayWidth;
188ab47cfaaSmrg	    mode->imageHeight = psav->videoRambytes / mode->bytesPerScanline;
189ab47cfaaSmrg	    mode->pixmapWidth = mode->imageWidth;
190ab47cfaaSmrg	    mode->pixmapHeight = mode->imageHeight;
191ab47cfaaSmrg	    mode->maxViewportX = mode->imageWidth - mode->viewportWidth;
192ab47cfaaSmrg	    /* this might need to get clamped to some maximum */
193ab47cfaaSmrg	    mode->maxViewportY = mode->imageHeight - mode->viewportHeight;
194ab47cfaaSmrg
195ab47cfaaSmrg	    xf86ErrorFVerb(DGATRACE,
196ab47cfaaSmrg		"SavageDGAInit 2 imgHgt=%d, stride=%d\n",
197ab47cfaaSmrg		mode->imageHeight,
198ab47cfaaSmrg		mode->bytesPerScanline );
199ab47cfaaSmrg	}
200ab47cfaaSmrg
201ab47cfaaSmrg	pMode = pMode->next;
202ab47cfaaSmrg	if(pMode == firstMode)
203ab47cfaaSmrg	    break;
204ab47cfaaSmrg    }
205ab47cfaaSmrg
206ab47cfaaSmrg    return modes;
207ab47cfaaSmrg}
208ab47cfaaSmrg
209ab47cfaaSmrg
210ab47cfaaSmrgBool
211ab47cfaaSmrgSavageDGAInit(ScreenPtr pScreen)
212ab47cfaaSmrg{
2135788ca14Smrg    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
214ab47cfaaSmrg    SavagePtr psav = SAVPTR(pScrn);
215ab47cfaaSmrg    DGAModePtr modes = NULL;
216ab47cfaaSmrg    int num = 0;
217ab47cfaaSmrg
218ab47cfaaSmrg    xf86ErrorFVerb(DGATRACE, "		SavageDGAInit\n");
219ab47cfaaSmrg
220ab47cfaaSmrg    /* 8 */
221ab47cfaaSmrg    modes = SavageSetupDGAMode (pScrn, modes, &num, 8, 8,
222ab47cfaaSmrg		(pScrn->bitsPerPixel == 8),
223ab47cfaaSmrg		(pScrn->bitsPerPixel != 8) ? 0 : pScrn->displayWidth,
224ab47cfaaSmrg		0, 0, 0, PseudoColor);
225ab47cfaaSmrg
226ab47cfaaSmrg    /* 15 */
227ab47cfaaSmrg    modes = SavageSetupDGAMode (pScrn, modes, &num, 16, 15,
228ab47cfaaSmrg		(pScrn->bitsPerPixel == 16),
229ab47cfaaSmrg		(pScrn->depth != 15) ? 0 : pScrn->displayWidth,
230ab47cfaaSmrg		0x7c00, 0x03e0, 0x001f, TrueColor);
231ab47cfaaSmrg
232ab47cfaaSmrg    modes = SavageSetupDGAMode (pScrn, modes, &num, 16, 15,
233ab47cfaaSmrg		(pScrn->bitsPerPixel == 16),
234ab47cfaaSmrg		(pScrn->depth != 15) ? 0 : pScrn->displayWidth,
235ab47cfaaSmrg		0x7c00, 0x03e0, 0x001f, DirectColor);
236ab47cfaaSmrg
237ab47cfaaSmrg    /* 16 */
238ab47cfaaSmrg    modes = SavageSetupDGAMode (pScrn, modes, &num, 16, 16,
239ab47cfaaSmrg		(pScrn->bitsPerPixel == 16),
240ab47cfaaSmrg		(pScrn->depth != 16) ? 0 : pScrn->displayWidth,
241ab47cfaaSmrg		0xf800, 0x07e0, 0x001f, TrueColor);
242ab47cfaaSmrg
243ab47cfaaSmrg    modes = SavageSetupDGAMode (pScrn, modes, &num, 16, 16,
244ab47cfaaSmrg		(pScrn->bitsPerPixel == 16),
245ab47cfaaSmrg		(pScrn->depth != 16) ? 0 : pScrn->displayWidth,
246ab47cfaaSmrg		0xf800, 0x07e0, 0x001f, DirectColor);
247ab47cfaaSmrg
248ab47cfaaSmrg    /* 24-in-32 */
249ab47cfaaSmrg    modes = SavageSetupDGAMode (pScrn, modes, &num, 32, 24,
250ab47cfaaSmrg		(pScrn->bitsPerPixel == 32),
251ab47cfaaSmrg		(pScrn->bitsPerPixel != 32) ? 0 : pScrn->displayWidth,
252ab47cfaaSmrg		0xff0000, 0x00ff00, 0x0000ff, TrueColor);
253ab47cfaaSmrg
254ab47cfaaSmrg    modes = SavageSetupDGAMode (pScrn, modes, &num, 32, 24,
255ab47cfaaSmrg		(pScrn->bitsPerPixel == 32),
256ab47cfaaSmrg		(pScrn->bitsPerPixel != 32) ? 0 : pScrn->displayWidth,
257ab47cfaaSmrg		0xff0000, 0x00ff00, 0x0000ff, DirectColor);
258ab47cfaaSmrg
259ab47cfaaSmrg    psav->numDGAModes = num;
260ab47cfaaSmrg    psav->DGAModes = modes;
261ab47cfaaSmrg
262ab47cfaaSmrg    return DGAInit(pScreen, &Savage_DGAFuncs, modes, num);
263ab47cfaaSmrg}
264ab47cfaaSmrg
265ab47cfaaSmrg
266ab47cfaaSmrgstatic Bool
267ab47cfaaSmrgSavage_SetMode(
268ab47cfaaSmrg    ScrnInfoPtr pScrn,
269ab47cfaaSmrg    DGAModePtr pMode
270ab47cfaaSmrg){
271ab47cfaaSmrg    static int OldDisplayWidth[MAXSCREENS];
272ab47cfaaSmrg    static int OldBitsPerPixel[MAXSCREENS];
273ab47cfaaSmrg    static int OldDepth[MAXSCREENS];
274ab47cfaaSmrg    static DisplayModePtr OldMode[MAXSCREENS];
275ab47cfaaSmrg    int index = pScrn->pScreen->myNum;
276ab47cfaaSmrg    SavagePtr psav = SAVPTR(pScrn);
277ab47cfaaSmrg
278ab47cfaaSmrg    if(!pMode) { /* restore the original mode */
279ab47cfaaSmrg	/* put the ScreenParameters back */
280ab47cfaaSmrg
281ab47cfaaSmrg	pScrn->displayWidth = OldDisplayWidth[index];
282ab47cfaaSmrg	pScrn->bitsPerPixel = OldBitsPerPixel[index];
283ab47cfaaSmrg	pScrn->depth = OldDepth[index];
284ab47cfaaSmrg	pScrn->currentMode = OldMode[index];
285ab47cfaaSmrg
286ab47cfaaSmrg	psav->DGAactive = FALSE;
2875788ca14Smrg	SavageSwitchMode(SWITCH_MODE_ARGS(pScrn, pScrn->currentMode));
288ab47cfaaSmrg	if( psav->hwcursor && psav->hwc_on )
289ab47cfaaSmrg	    SavageShowCursor(pScrn);
290ab47cfaaSmrg    } else {
291ab47cfaaSmrg	Bool holdBIOS = psav->UseBIOS;
292ab47cfaaSmrg
293ab47cfaaSmrg#if 0
294ab47cfaaSmrg	ErrorF(
295ab47cfaaSmrg	    "pScrn->bitsPerPixel %d, pScrn->depth %d\n",
296ab47cfaaSmrg	    pScrn->bitsPerPixel, pScrn->depth);
297ab47cfaaSmrg	ErrorF(
298ab47cfaaSmrg	    " want  bitsPerPixel %d,  want  depth %d\n",
299ab47cfaaSmrg	    pMode->bitsPerPixel, pMode->depth);
300ab47cfaaSmrg#endif
301ab47cfaaSmrg
302ab47cfaaSmrg	if( psav->hwcursor && psav->hwc_on) {
303ab47cfaaSmrg	    SavageHideCursor(pScrn);
304c744f008Smrg	    psav->hwc_on = TRUE;    /* save for later restoration */
305ab47cfaaSmrg	}
306ab47cfaaSmrg
307ab47cfaaSmrg
308ab47cfaaSmrg	if(!psav->DGAactive) {  /* save the old parameters */
309ab47cfaaSmrg	    OldDisplayWidth[index] = pScrn->displayWidth;
310ab47cfaaSmrg	    OldBitsPerPixel[index] = pScrn->bitsPerPixel;
311ab47cfaaSmrg	    OldDepth[index] = pScrn->depth;
312ab47cfaaSmrg	    OldMode[index] = pScrn->currentMode;
313ab47cfaaSmrg
314ab47cfaaSmrg	    psav->DGAactive = TRUE;
315ab47cfaaSmrg	}
316ab47cfaaSmrg
317ab47cfaaSmrg	pScrn->bitsPerPixel = pMode->bitsPerPixel;
318ab47cfaaSmrg	pScrn->depth = pMode->depth;
319ab47cfaaSmrg	pScrn->displayWidth = pMode->bytesPerScanline /
320ab47cfaaSmrg	    (pMode->bitsPerPixel >> 3);
321ab47cfaaSmrg
322ab47cfaaSmrg/*	psav->UseBIOS = FALSE; */
3235788ca14Smrg	SavageSwitchMode(SWITCH_MODE_ARGS(pScrn, pMode->mode));
324ab47cfaaSmrg	psav->UseBIOS = holdBIOS;
325ab47cfaaSmrg    }
326ab47cfaaSmrg
327ab47cfaaSmrg    return TRUE;
328ab47cfaaSmrg}
329ab47cfaaSmrg
330ab47cfaaSmrg
331ab47cfaaSmrgstatic int
332ab47cfaaSmrgSavage_GetViewport(
333ab47cfaaSmrg    ScrnInfoPtr pScrn
334ab47cfaaSmrg){
335ab47cfaaSmrg    SavagePtr psav = SAVPTR(pScrn);
336ab47cfaaSmrg    return psav->DGAViewportStatus;
337ab47cfaaSmrg}
338ab47cfaaSmrg
339ab47cfaaSmrg
340ab47cfaaSmrgstatic void
341ab47cfaaSmrgSavage_SetViewport(
342ab47cfaaSmrg   ScrnInfoPtr pScrn,
343ab47cfaaSmrg   int x, int y,
344ab47cfaaSmrg   int flags
345ab47cfaaSmrg){
346ab47cfaaSmrg    SavagePtr psav = SAVPTR(pScrn);
347ab47cfaaSmrg
3485788ca14Smrg    SavageAdjustFrame(ADJUST_FRAME_ARGS(pScrn, x, y));
349ab47cfaaSmrg    psav->DGAViewportStatus = 0;  /* MGAAdjustFrame loops until finished */
350ab47cfaaSmrg}
351ab47cfaaSmrg
3525788ca14Smrg#ifdef HAVE_XAA_H
353ab47cfaaSmrgstatic void
354ab47cfaaSmrgSavage_FillRect (
355ab47cfaaSmrg    ScrnInfoPtr pScrn,
356ab47cfaaSmrg    int x, int y, int w, int h,
357ab47cfaaSmrg    unsigned long color
358ab47cfaaSmrg){
359ab47cfaaSmrg    SavagePtr psav = SAVPTR(pScrn);
360ab47cfaaSmrg
361ab47cfaaSmrg    if(psav->AccelInfoRec) {
362ab47cfaaSmrg	(*psav->AccelInfoRec->SetupForSolidFill)(pScrn, color, GXcopy, ~0);
363ab47cfaaSmrg	(*psav->AccelInfoRec->SubsequentSolidFillRect)(pScrn, x, y, w, h);
364ab47cfaaSmrg	SET_SYNC_FLAG(psav->AccelInfoRec);
365ab47cfaaSmrg    }
366ab47cfaaSmrg}
367ab47cfaaSmrg
368ab47cfaaSmrgstatic void
369ab47cfaaSmrgSavage_BlitRect(
370ab47cfaaSmrg    ScrnInfoPtr pScrn,
371ab47cfaaSmrg    int srcx, int srcy,
372ab47cfaaSmrg    int w, int h,
373ab47cfaaSmrg    int dstx, int dsty
374ab47cfaaSmrg){
375ab47cfaaSmrg    SavagePtr psav = SAVPTR(pScrn);
376ab47cfaaSmrg
377ab47cfaaSmrg    if(psav->AccelInfoRec) {
378ab47cfaaSmrg    int xdir = ((srcx < dstx) && (srcy == dsty)) ? -1 : 1;
379ab47cfaaSmrg    int ydir = (srcy < dsty) ? -1 : 1;
380ab47cfaaSmrg
381ab47cfaaSmrg    (*psav->AccelInfoRec->SetupForScreenToScreenCopy)(
382ab47cfaaSmrg	pScrn, xdir, ydir, GXcopy, ~0, -1);
383ab47cfaaSmrg    (*psav->AccelInfoRec->SubsequentScreenToScreenCopy)(
384ab47cfaaSmrg	pScrn, srcx, srcy, dstx, dsty, w, h);
385ab47cfaaSmrg    SET_SYNC_FLAG(psav->AccelInfoRec);
386ab47cfaaSmrg    }
387ab47cfaaSmrg}
3885788ca14Smrg#endif
389ab47cfaaSmrg
390ab47cfaaSmrgstatic Bool
391ab47cfaaSmrgSavage_OpenFramebuffer(
392ab47cfaaSmrg    ScrnInfoPtr pScrn,
393ab47cfaaSmrg    char **name,
394ab47cfaaSmrg    unsigned char **mem,
395ab47cfaaSmrg    int *size,
396ab47cfaaSmrg    int *offset,
397ab47cfaaSmrg    int *flags
398ab47cfaaSmrg){
399ab47cfaaSmrg    SavagePtr psav = SAVPTR(pScrn);
400ab47cfaaSmrg
401ab47cfaaSmrg    *name = NULL;	 /* no special device */
4025788ca14Smrg    *mem = (unsigned char*)(uintptr_t) psav->FbRegion.base;
403ab47cfaaSmrg    *size = psav->videoRambytes;
404ab47cfaaSmrg    *offset = 0;
405ab47cfaaSmrg    *flags = DGA_NEED_ROOT;
406ab47cfaaSmrg
407ab47cfaaSmrg    return TRUE;
408ab47cfaaSmrg}
409