atidga.c revision 1b12faf6
132b578d3Smrg/* 232b578d3Smrg * Copyright 2000 through 2004 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org 332b578d3Smrg * 432b578d3Smrg * Permission to use, copy, modify, distribute, and sell this software and its 532b578d3Smrg * documentation for any purpose is hereby granted without fee, provided that 632b578d3Smrg * the above copyright notice appear in all copies and that both that copyright 732b578d3Smrg * notice and this permission notice appear in supporting documentation, and 832b578d3Smrg * that the name of Marc Aurele La France not be used in advertising or 932b578d3Smrg * publicity pertaining to distribution of the software without specific, 1032b578d3Smrg * written prior permission. Marc Aurele La France makes no representations 1132b578d3Smrg * about the suitability of this software for any purpose. It is provided 1232b578d3Smrg * "as-is" without express or implied warranty. 1332b578d3Smrg * 1432b578d3Smrg * MARC AURELE LA FRANCE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 1532b578d3Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO 1632b578d3Smrg * EVENT SHALL MARC AURELE LA FRANCE BE LIABLE FOR ANY SPECIAL, INDIRECT OR 1732b578d3Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 1832b578d3Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 1932b578d3Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 2032b578d3Smrg * PERFORMANCE OF THIS SOFTWARE. 2132b578d3Smrg */ 2232b578d3Smrg 2332b578d3Smrg#ifdef HAVE_CONFIG_H 2432b578d3Smrg#include "config.h" 2532b578d3Smrg#endif 2632b578d3Smrg#ifndef AVOID_DGA 2732b578d3Smrg 2832b578d3Smrg#include <string.h> 2932b578d3Smrg 3032b578d3Smrg#include "ati.h" 3132b578d3Smrg#include "atiadjust.h" 3232b578d3Smrg#include "atichip.h" 3332b578d3Smrg#include "atidac.h" 3432b578d3Smrg#include "atidga.h" 3532b578d3Smrg#include "atimode.h" 3632b578d3Smrg#include "atistruct.h" 3732b578d3Smrg 3832b578d3Smrg#include "dgaproc.h" 3932b578d3Smrg 4032b578d3Smrg/* 4132b578d3Smrg * ATIDGAOpenFramebuffer -- 4232b578d3Smrg * 4332b578d3Smrg * This function returns various framebuffer attributes to a DGA client. 4432b578d3Smrg */ 4532b578d3Smrgstatic Bool 4632b578d3SmrgATIDGAOpenFramebuffer 4732b578d3Smrg( 4832b578d3Smrg ScrnInfoPtr pScreenInfo, 4932b578d3Smrg char **DeviceName, 5032b578d3Smrg unsigned char **ApertureBase, 5132b578d3Smrg int *ApertureSize, 5232b578d3Smrg int *ApertureOffset, 5332b578d3Smrg int *flags 5432b578d3Smrg) 5532b578d3Smrg{ 5632b578d3Smrg ATIPtr pATI = ATIPTR(pScreenInfo); 5732b578d3Smrg 5832b578d3Smrg *DeviceName = NULL; /* No special device */ 5932b578d3Smrg *ApertureBase = (unsigned char *)(pATI->LinearBase); 6032b578d3Smrg *ApertureSize = pScreenInfo->videoRam * 1024; 6132b578d3Smrg *ApertureOffset = 0; /* Always */ 6232b578d3Smrg *flags = 0; /* Root premissions OS-dependent */ 6332b578d3Smrg 6432b578d3Smrg return TRUE; 6532b578d3Smrg} 6632b578d3Smrg 6732b578d3Smrgstatic int 6832b578d3SmrgBitsSet 6932b578d3Smrg( 7032b578d3Smrg unsigned long data 7132b578d3Smrg) 7232b578d3Smrg{ 7332b578d3Smrg unsigned long mask = 1; 7432b578d3Smrg int set = 0; 7532b578d3Smrg 7632b578d3Smrg for (; mask; mask <<= 1) 7732b578d3Smrg if (data & mask) 7832b578d3Smrg set++; 7932b578d3Smrg 8032b578d3Smrg return set; 8132b578d3Smrg} 8232b578d3Smrg 8332b578d3Smrg/* 8432b578d3Smrg * ATIDGASetMode -- 8532b578d3Smrg * 8632b578d3Smrg * This function sets a graphics mode for a DGA client. 8732b578d3Smrg */ 8832b578d3Smrgstatic Bool 8932b578d3SmrgATIDGASetMode 9032b578d3Smrg( 9132b578d3Smrg ScrnInfoPtr pScreenInfo, 9232b578d3Smrg DGAModePtr pDGAMode 9332b578d3Smrg) 9432b578d3Smrg{ 9532b578d3Smrg ATIPtr pATI = ATIPTR(pScreenInfo); 9632b578d3Smrg DisplayModePtr pMode; 9732b578d3Smrg int iScreen = pScreenInfo->scrnIndex; 9832b578d3Smrg int frameX0, frameY0; 9932b578d3Smrg 10032b578d3Smrg if (pDGAMode) 10132b578d3Smrg { 10232b578d3Smrg pMode = pDGAMode->mode; 10332b578d3Smrg pATI->depth = pDGAMode->depth; 10432b578d3Smrg pATI->bitsPerPixel = pDGAMode->bitsPerPixel; 10532b578d3Smrg pATI->displayWidth = 10632b578d3Smrg pDGAMode->bytesPerScanline * 8 / pATI->bitsPerPixel; 10732b578d3Smrg pATI->weight.red = BitsSet(pDGAMode->red_mask); 10832b578d3Smrg pATI->weight.green = BitsSet(pDGAMode->green_mask); 10932b578d3Smrg pATI->weight.blue = BitsSet(pDGAMode->blue_mask); 11032b578d3Smrg frameX0 = frameY0 = 0; 11132b578d3Smrg if (!pATI->currentMode) 11232b578d3Smrg pATI->currentMode = pScreenInfo->currentMode; 11332b578d3Smrg } 11432b578d3Smrg else 11532b578d3Smrg { 11632b578d3Smrg if (!(pMode = pATI->currentMode)) 11732b578d3Smrg return TRUE; 11832b578d3Smrg 11932b578d3Smrg pATI->depth = pScreenInfo->depth; 12032b578d3Smrg pATI->bitsPerPixel = pScreenInfo->bitsPerPixel; 12132b578d3Smrg pATI->displayWidth = pScreenInfo->displayWidth; 12232b578d3Smrg pATI->weight = pScreenInfo->weight; 12332b578d3Smrg frameX0 = pScreenInfo->frameX0; 12432b578d3Smrg frameY0 = pScreenInfo->frameY0; 12532b578d3Smrg } 12632b578d3Smrg 12732b578d3Smrg pATI->XModifier = pATI->bitsPerPixel / UnitOf(pATI->bitsPerPixel); 12832b578d3Smrg ATIAdjustPreInit(pATI); 12932b578d3Smrg ATIModePreInit(pScreenInfo, pATI, &pATI->NewHW); 13032b578d3Smrg 13132b578d3Smrg if (!(*pScreenInfo->SwitchMode)(iScreen, pMode, 0)) 13232b578d3Smrg return FALSE; 13332b578d3Smrg if (!pDGAMode) 13432b578d3Smrg pATI->currentMode = NULL; 13532b578d3Smrg (*pScreenInfo->AdjustFrame)(iScreen, frameX0, frameY0, 0); 13632b578d3Smrg 13732b578d3Smrg return TRUE; 13832b578d3Smrg} 13932b578d3Smrg 14032b578d3Smrg/* 14132b578d3Smrg * ATIDGASetViewport -- 14232b578d3Smrg * 14332b578d3Smrg * This function sets the display start address for a DGA client. 14432b578d3Smrg */ 14532b578d3Smrgstatic void 14632b578d3SmrgATIDGASetViewport 14732b578d3Smrg( 14832b578d3Smrg ScrnInfoPtr pScreenInfo, 14932b578d3Smrg int x, 15032b578d3Smrg int y, 15132b578d3Smrg int flags 15232b578d3Smrg) 15332b578d3Smrg{ 15432b578d3Smrg (*pScreenInfo->AdjustFrame)(pScreenInfo->pScreen->myNum, x, y, flags); 15532b578d3Smrg} 15632b578d3Smrg 15732b578d3Smrg/* 15832b578d3Smrg * ATIDGAGetViewport -- 15932b578d3Smrg * 16032b578d3Smrg * This function returns the current status of prior DGA requests to set the 16132b578d3Smrg * adapter's display start address. 16232b578d3Smrg */ 16332b578d3Smrgstatic int 16432b578d3SmrgATIDGAGetViewport 16532b578d3Smrg( 16632b578d3Smrg ScrnInfoPtr pScreenInfo 16732b578d3Smrg) 16832b578d3Smrg{ 16932b578d3Smrg return 0; /* There are never any pending requests */ 17032b578d3Smrg} 17132b578d3Smrg 17232b578d3Smrg/* 17332b578d3Smrg * ATIDGAFillRect -- 17432b578d3Smrg * 17532b578d3Smrg * This function calls XAA solid fill primitives to fill a rectangle. 17632b578d3Smrg */ 17732b578d3Smrgstatic void 17832b578d3SmrgATIDGAFillRect 17932b578d3Smrg( 18032b578d3Smrg ScrnInfoPtr pScreenInfo, 18132b578d3Smrg int x, 18232b578d3Smrg int y, 18332b578d3Smrg int w, 18432b578d3Smrg int h, 18532b578d3Smrg unsigned long colour 18632b578d3Smrg) 18732b578d3Smrg{ 18832b578d3Smrg ATIPtr pATI = ATIPTR(pScreenInfo); 18932b578d3Smrg/*FIXME : use EXA if available */ 19032b578d3Smrg#ifdef USE_XAA 19132b578d3Smrg XAAInfoRecPtr pXAAInfo = pATI->pXAAInfo; 19232b578d3Smrg 19332b578d3Smrg (*pXAAInfo->SetupForSolidFill)(pScreenInfo, (int)colour, GXcopy, 19432b578d3Smrg (CARD32)(~0)); 19532b578d3Smrg (*pXAAInfo->SubsequentSolidFillRect)(pScreenInfo, x, y, w, h); 19632b578d3Smrg 19732b578d3Smrg if (pScreenInfo->bitsPerPixel == pATI->bitsPerPixel) 19832b578d3Smrg SET_SYNC_FLAG(pXAAInfo); 19932b578d3Smrg#endif 20032b578d3Smrg} 20132b578d3Smrg 20232b578d3Smrg/* 20332b578d3Smrg * ATIDGABlitRect -- 20432b578d3Smrg * 20532b578d3Smrg * This function calls XAA screen-to-screen copy primitives to copy a 20632b578d3Smrg * rectangle. 20732b578d3Smrg */ 20832b578d3Smrgstatic void 20932b578d3SmrgATIDGABlitRect 21032b578d3Smrg( 21132b578d3Smrg ScrnInfoPtr pScreenInfo, 21232b578d3Smrg int xSrc, 21332b578d3Smrg int ySrc, 21432b578d3Smrg int w, 21532b578d3Smrg int h, 21632b578d3Smrg int xDst, 21732b578d3Smrg int yDst 21832b578d3Smrg) 21932b578d3Smrg{ 22032b578d3Smrg ATIPtr pATI = ATIPTR(pScreenInfo); 22132b578d3Smrg/*FIXME : use EXA if available */ 22232b578d3Smrg#ifdef USE_XAA 22332b578d3Smrg XAAInfoRecPtr pXAAInfo = pATI->pXAAInfo; 22432b578d3Smrg int xdir = ((xSrc < xDst) && (ySrc == yDst)) ? -1 : 1; 22532b578d3Smrg int ydir = (ySrc < yDst) ? -1 : 1; 22632b578d3Smrg 22732b578d3Smrg (*pXAAInfo->SetupForScreenToScreenCopy)(pScreenInfo, 22832b578d3Smrg xdir, ydir, GXcopy, (CARD32)(~0), -1); 22932b578d3Smrg (*pXAAInfo->SubsequentScreenToScreenCopy)(pScreenInfo, 23032b578d3Smrg xSrc, ySrc, xDst, yDst, w, h); 23132b578d3Smrg 23232b578d3Smrg if (pScreenInfo->bitsPerPixel == pATI->bitsPerPixel) 23332b578d3Smrg SET_SYNC_FLAG(pXAAInfo); 23432b578d3Smrg#endif 23532b578d3Smrg} 23632b578d3Smrg 23732b578d3Smrg/* 23832b578d3Smrg * ATIDGABlitTransRect -- 23932b578d3Smrg * 24032b578d3Smrg * This function calls XAA screen-to-screen copy primitives to transparently 24132b578d3Smrg * copy a rectangle. 24232b578d3Smrg */ 24332b578d3Smrgstatic void 24432b578d3SmrgATIDGABlitTransRect 24532b578d3Smrg( 24632b578d3Smrg ScrnInfoPtr pScreenInfo, 24732b578d3Smrg int xSrc, 24832b578d3Smrg int ySrc, 24932b578d3Smrg int w, 25032b578d3Smrg int h, 25132b578d3Smrg int xDst, 25232b578d3Smrg int yDst, 25332b578d3Smrg unsigned long colour 25432b578d3Smrg) 25532b578d3Smrg{ 25632b578d3Smrg ATIPtr pATI = ATIPTR(pScreenInfo); 25732b578d3Smrg/*FIXME : use EXA if available */ 25832b578d3Smrg#ifdef USE_XAA 25932b578d3Smrg XAAInfoRecPtr pXAAInfo = pATI->pXAAInfo; 26032b578d3Smrg int xdir = ((xSrc < xDst) && (ySrc == yDst)) ? -1 : 1; 26132b578d3Smrg int ydir = (ySrc < yDst) ? -1 : 1; 26232b578d3Smrg 26332b578d3Smrg pATI->XAAForceTransBlit = TRUE; 26432b578d3Smrg 26532b578d3Smrg (*pXAAInfo->SetupForScreenToScreenCopy)(pScreenInfo, 26632b578d3Smrg xdir, ydir, GXcopy, (CARD32)(~0), (int)colour); 26732b578d3Smrg 26832b578d3Smrg pATI->XAAForceTransBlit = FALSE; 26932b578d3Smrg 27032b578d3Smrg (*pXAAInfo->SubsequentScreenToScreenCopy)(pScreenInfo, 27132b578d3Smrg xSrc, ySrc, xDst, yDst, w, h); 27232b578d3Smrg 27332b578d3Smrg if (pScreenInfo->bitsPerPixel == pATI->bitsPerPixel) 27432b578d3Smrg SET_SYNC_FLAG(pXAAInfo); 27532b578d3Smrg#endif 27632b578d3Smrg} 27732b578d3Smrg 27832b578d3Smrg/* 27932b578d3Smrg * ATIDGAAddModes -- 28032b578d3Smrg * 28132b578d3Smrg * This function translates DisplayModeRec's into DGAModeRec's. 28232b578d3Smrg */ 28332b578d3Smrgstatic void 28432b578d3SmrgATIDGAAddModes 28532b578d3Smrg( 28632b578d3Smrg ScrnInfoPtr pScreenInfo, 28732b578d3Smrg ATIPtr pATI, 28832b578d3Smrg int flags, 28932b578d3Smrg int depth, 29032b578d3Smrg int bitsPerPixel, 29132b578d3Smrg int redMask, 29232b578d3Smrg int greenMask, 29332b578d3Smrg int blueMask, 29432b578d3Smrg int visualClass 29532b578d3Smrg) 29632b578d3Smrg{ 29732b578d3Smrg DisplayModePtr pMode = pScreenInfo->modes; 29832b578d3Smrg DGAModePtr pDGAMode; 29932b578d3Smrg int displayWidth = pScreenInfo->displayWidth; 30032b578d3Smrg int videoBits = pScreenInfo->videoRam * 1024 * 8; 30132b578d3Smrg int xViewportStep = 64 / UnitOf(bitsPerPixel); 30232b578d3Smrg int modePitch, bitsPerScanline, maxViewportY; 30332b578d3Smrg 30432b578d3Smrg if (bitsPerPixel != pScreenInfo->bitsPerPixel) 30532b578d3Smrg displayWidth = 0; 30632b578d3Smrg 30732b578d3Smrg while (1) 30832b578d3Smrg { 30932b578d3Smrg /* Weed out multiscanned modes */ 31032b578d3Smrg if ((pMode->VScan <= 1) || 31132b578d3Smrg ((pMode->VScan == 2) && !(pMode->Flags & V_DBLSCAN))) 31232b578d3Smrg { 31332b578d3Smrg /* 31432b578d3Smrg * For code simplicity, ensure DGA mode pitch is a multiple of 64 31532b578d3Smrg * bytes. 31632b578d3Smrg */ 31732b578d3Smrg if (!(modePitch = displayWidth)) 31832b578d3Smrg { 31932b578d3Smrg modePitch = ((64 * 8) / UnitOf(bitsPerPixel)) - 1; 32032b578d3Smrg modePitch = (pMode->HDisplay + modePitch) & ~modePitch; 32132b578d3Smrg } 32232b578d3Smrg 32332b578d3Smrg /* Ensure the mode fits in video memory */ 32432b578d3Smrg if ((modePitch * bitsPerPixel * pMode->VDisplay) <= videoBits) 32532b578d3Smrg { 32632b578d3Smrg /* Stop generating modes on out-of-memory conditions */ 3271b12faf6Smrg pDGAMode = realloc(pATI->pDGAMode, 32832b578d3Smrg (pATI->nDGAMode + 1) * SizeOf(DGAModeRec)); 32932b578d3Smrg if (!pDGAMode) 33032b578d3Smrg break; 33132b578d3Smrg 33232b578d3Smrg pATI->pDGAMode = pDGAMode; 33332b578d3Smrg pDGAMode += pATI->nDGAMode; 33432b578d3Smrg pATI->nDGAMode++; 33532b578d3Smrg (void)memset(pDGAMode, 0, SizeOf(DGAModeRec)); 33632b578d3Smrg 33732b578d3Smrg /* Fill in the mode structure */ 33832b578d3Smrg pDGAMode->mode = pMode; 33932b578d3Smrg pDGAMode->flags = flags; 34032b578d3Smrg if (bitsPerPixel == pScreenInfo->bitsPerPixel) 34132b578d3Smrg { 34232b578d3Smrg pDGAMode->flags |= DGA_PIXMAP_AVAILABLE; 34332b578d3Smrg pDGAMode->address = pATI->pMemory; 34432b578d3Smrg 34532b578d3Smrg#ifdef USE_XAA 34632b578d3Smrg if (pATI->pXAAInfo) 34732b578d3Smrg pDGAMode->flags &= ~DGA_CONCURRENT_ACCESS; 34832b578d3Smrg#endif 34932b578d3Smrg } 35032b578d3Smrg if ((pMode->Flags & V_DBLSCAN) || (pMode->VScan > 1)) 35132b578d3Smrg pDGAMode->flags |= DGA_DOUBLESCAN; 35232b578d3Smrg if (pMode->Flags & V_INTERLACE) 35332b578d3Smrg pDGAMode->flags |= DGA_INTERLACED; 35432b578d3Smrg 35532b578d3Smrg pDGAMode->byteOrder = pScreenInfo->imageByteOrder; 35632b578d3Smrg pDGAMode->depth = depth; 35732b578d3Smrg pDGAMode->bitsPerPixel = bitsPerPixel; 35832b578d3Smrg pDGAMode->red_mask = redMask; 35932b578d3Smrg pDGAMode->green_mask = greenMask; 36032b578d3Smrg pDGAMode->blue_mask = blueMask; 36132b578d3Smrg pDGAMode->visualClass = visualClass; 36232b578d3Smrg 36332b578d3Smrg pDGAMode->viewportWidth = pMode->HDisplay; 36432b578d3Smrg pDGAMode->viewportHeight = pMode->VDisplay; 36532b578d3Smrg pDGAMode->xViewportStep = xViewportStep; 36632b578d3Smrg pDGAMode->yViewportStep = 1; 36732b578d3Smrg 36832b578d3Smrg bitsPerScanline = modePitch * bitsPerPixel; 36932b578d3Smrg pDGAMode->bytesPerScanline = bitsPerScanline / 8; 37032b578d3Smrg pDGAMode->imageWidth = pDGAMode->pixmapWidth = modePitch; 37132b578d3Smrg pDGAMode->imageHeight = pDGAMode->pixmapHeight = 37232b578d3Smrg videoBits / bitsPerScanline; 37332b578d3Smrg 37432b578d3Smrg pDGAMode->maxViewportX = 37532b578d3Smrg pDGAMode->imageWidth - pDGAMode->viewportWidth; 37632b578d3Smrg pDGAMode->maxViewportY = 37732b578d3Smrg pDGAMode->imageHeight - pDGAMode->viewportHeight; 37832b578d3Smrg maxViewportY = 37932b578d3Smrg ((((pATI->AdjustMaxBase * 8) / bitsPerPixel) + 38032b578d3Smrg xViewportStep) / modePitch) - 1; 38132b578d3Smrg if (maxViewportY < pDGAMode->maxViewportY) 38232b578d3Smrg pDGAMode->maxViewportY = maxViewportY; 38332b578d3Smrg } 38432b578d3Smrg } 38532b578d3Smrg 38632b578d3Smrg if ((pMode = pMode->next) == pScreenInfo->modes) 38732b578d3Smrg { 38832b578d3Smrg if (!displayWidth) 38932b578d3Smrg break; 39032b578d3Smrg 39132b578d3Smrg displayWidth = 0; 39232b578d3Smrg } 39332b578d3Smrg } 39432b578d3Smrg} 39532b578d3Smrg 39632b578d3Smrg/* 39732b578d3Smrg * ATIDGAInit -- 39832b578d3Smrg * 39932b578d3Smrg * This function initialises the driver's support for the DGA extension. 40032b578d3Smrg */ 40132b578d3SmrgBool 40232b578d3SmrgATIDGAInit 40332b578d3Smrg( 40432b578d3Smrg ScreenPtr pScreen, 40532b578d3Smrg ScrnInfoPtr pScreenInfo, 40632b578d3Smrg ATIPtr pATI 40732b578d3Smrg) 40832b578d3Smrg{ 40932b578d3Smrg#ifdef USE_XAA 41032b578d3Smrg XAAInfoRecPtr pXAAInfo; 41132b578d3Smrg#endif 41232b578d3Smrg int flags; 41332b578d3Smrg 41432b578d3Smrg if (!pATI->nDGAMode) 41532b578d3Smrg { 41632b578d3Smrg /* Set up DGA callbacks */ 41732b578d3Smrg pATI->ATIDGAFunctions.OpenFramebuffer = ATIDGAOpenFramebuffer; 41832b578d3Smrg pATI->ATIDGAFunctions.SetMode = ATIDGASetMode; 41932b578d3Smrg pATI->ATIDGAFunctions.SetViewport = ATIDGASetViewport; 42032b578d3Smrg pATI->ATIDGAFunctions.GetViewport = ATIDGAGetViewport; 42132b578d3Smrg 42232b578d3Smrg flags = 0; 42332b578d3Smrg#ifdef USE_XAA 42432b578d3Smrg if ((pXAAInfo = pATI->pXAAInfo)) 42532b578d3Smrg { 42632b578d3Smrg pATI->ATIDGAFunctions.Sync = pXAAInfo->Sync; 42732b578d3Smrg if (pXAAInfo->SetupForSolidFill && 42832b578d3Smrg pXAAInfo->SubsequentSolidFillRect) 42932b578d3Smrg { 43032b578d3Smrg flags |= DGA_FILL_RECT; 43132b578d3Smrg pATI->ATIDGAFunctions.FillRect = ATIDGAFillRect; 43232b578d3Smrg } 43332b578d3Smrg if (pXAAInfo->SetupForScreenToScreenCopy && 43432b578d3Smrg pXAAInfo->SubsequentScreenToScreenCopy) 43532b578d3Smrg { 43632b578d3Smrg flags |= DGA_BLIT_RECT | DGA_BLIT_RECT_TRANS; 43732b578d3Smrg pATI->ATIDGAFunctions.BlitRect = ATIDGABlitRect; 43832b578d3Smrg pATI->ATIDGAFunctions.BlitTransRect = ATIDGABlitTransRect; 43932b578d3Smrg } 44032b578d3Smrg } 44132b578d3Smrg#endif 44232b578d3Smrg if (!flags) 44332b578d3Smrg flags = DGA_CONCURRENT_ACCESS; 44432b578d3Smrg 44532b578d3Smrg ATIDGAAddModes(pScreenInfo, pATI, flags, 44632b578d3Smrg 8, 8, 0, 0, 0, PseudoColor); 44732b578d3Smrg 44832b578d3Smrg if ((pATI->Chip >= ATI_CHIP_264CT)) 44932b578d3Smrg { 45032b578d3Smrg ATIDGAAddModes(pScreenInfo, pATI, flags, 45132b578d3Smrg 15, 16, 0x7C00U, 0x03E0U, 0x001FU, TrueColor); 45232b578d3Smrg 45332b578d3Smrg ATIDGAAddModes(pScreenInfo, pATI, flags, 45432b578d3Smrg 16, 16, 0xF800U, 0x07E0U, 0x001FU, TrueColor); 45532b578d3Smrg 45632b578d3Smrg ATIDGAAddModes(pScreenInfo, pATI, flags, 45732b578d3Smrg 24, 24, 0x00FF0000U, 0x0000FF00U, 0x000000FFU, TrueColor); 45832b578d3Smrg 45932b578d3Smrg ATIDGAAddModes(pScreenInfo, pATI, flags, 46032b578d3Smrg 24, 32, 0x00FF0000U, 0x0000FF00U, 0x000000FFU, TrueColor); 46132b578d3Smrg 46232b578d3Smrg if (pATI->DAC != ATI_DAC_INTERNAL) /* Not first revision */ 46332b578d3Smrg { 46432b578d3Smrg ATIDGAAddModes(pScreenInfo, pATI, flags, 46532b578d3Smrg 15, 16, 0x7C00U, 0x03E0U, 0x001FU, DirectColor); 46632b578d3Smrg 46732b578d3Smrg ATIDGAAddModes(pScreenInfo, pATI, flags, 46832b578d3Smrg 16, 16, 0xF800U, 0x07E0U, 0x001FU, DirectColor); 46932b578d3Smrg 47032b578d3Smrg ATIDGAAddModes(pScreenInfo, pATI, flags, 47132b578d3Smrg 24, 24, 0x00FF0000U, 0x0000FF00U, 0x000000FFU, DirectColor); 47232b578d3Smrg 47332b578d3Smrg ATIDGAAddModes(pScreenInfo, pATI, flags, 47432b578d3Smrg 24, 32, 0x00FF0000U, 0x0000FF00U, 0x000000FFU, DirectColor); 47532b578d3Smrg } 47632b578d3Smrg } 47732b578d3Smrg } 47832b578d3Smrg 47932b578d3Smrg return DGAInit(pScreen, &pATI->ATIDGAFunctions, pATI->pDGAMode, 48032b578d3Smrg pATI->nDGAMode); 48132b578d3Smrg} 48232b578d3Smrg 48332b578d3Smrg#endif /* AVOID_DGA */ 484