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