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