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