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