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 "atichip.h"
3232b578d3Smrg#include "atidac.h"
3332b578d3Smrg#include "atidga.h"
3432b578d3Smrg#include "atimode.h"
3532b578d3Smrg#include "atistruct.h"
36e35d4d8eSmrg#include "atiadjust.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            frameX0, frameY0;
9832b578d3Smrg
9932b578d3Smrg    if (pDGAMode)
10032b578d3Smrg    {
10132b578d3Smrg        pMode = pDGAMode->mode;
10232b578d3Smrg        pATI->depth = pDGAMode->depth;
10332b578d3Smrg        pATI->bitsPerPixel = pDGAMode->bitsPerPixel;
10432b578d3Smrg        pATI->displayWidth =
10532b578d3Smrg            pDGAMode->bytesPerScanline * 8 / pATI->bitsPerPixel;
10632b578d3Smrg        pATI->weight.red = BitsSet(pDGAMode->red_mask);
10732b578d3Smrg        pATI->weight.green = BitsSet(pDGAMode->green_mask);
10832b578d3Smrg        pATI->weight.blue = BitsSet(pDGAMode->blue_mask);
10932b578d3Smrg        frameX0 = frameY0 = 0;
11032b578d3Smrg        if (!pATI->currentMode)
11132b578d3Smrg            pATI->currentMode = pScreenInfo->currentMode;
11232b578d3Smrg    }
11332b578d3Smrg    else
11432b578d3Smrg    {
11532b578d3Smrg        if (!(pMode = pATI->currentMode))
11632b578d3Smrg            return TRUE;
11732b578d3Smrg
11832b578d3Smrg        pATI->depth = pScreenInfo->depth;
11932b578d3Smrg        pATI->bitsPerPixel = pScreenInfo->bitsPerPixel;
12032b578d3Smrg        pATI->displayWidth = pScreenInfo->displayWidth;
12132b578d3Smrg        pATI->weight = pScreenInfo->weight;
12232b578d3Smrg        frameX0 = pScreenInfo->frameX0;
12332b578d3Smrg        frameY0 = pScreenInfo->frameY0;
12432b578d3Smrg    }
12532b578d3Smrg
12632b578d3Smrg    pATI->XModifier = pATI->bitsPerPixel / UnitOf(pATI->bitsPerPixel);
12732b578d3Smrg    ATIAdjustPreInit(pATI);
12832b578d3Smrg    ATIModePreInit(pScreenInfo, pATI, &pATI->NewHW);
12932b578d3Smrg
130e35d4d8eSmrg    if (!(*pScreenInfo->SwitchMode)(SWITCH_MODE_ARGS(pScreenInfo, pMode)))
13132b578d3Smrg        return FALSE;
13232b578d3Smrg    if (!pDGAMode)
13332b578d3Smrg        pATI->currentMode = NULL;
134e35d4d8eSmrg    (*pScreenInfo->AdjustFrame)(ADJUST_FRAME_ARGS(pScreenInfo, frameX0, frameY0));
13532b578d3Smrg
13632b578d3Smrg    return TRUE;
13732b578d3Smrg}
13832b578d3Smrg
13932b578d3Smrg/*
14032b578d3Smrg * ATIDGASetViewport --
14132b578d3Smrg *
14232b578d3Smrg * This function sets the display start address for a DGA client.
14332b578d3Smrg */
14432b578d3Smrgstatic void
14532b578d3SmrgATIDGASetViewport
14632b578d3Smrg(
14732b578d3Smrg    ScrnInfoPtr pScreenInfo,
14832b578d3Smrg    int         x,
14932b578d3Smrg    int         y,
15032b578d3Smrg    int         flags
15132b578d3Smrg)
15232b578d3Smrg{
153e35d4d8eSmrg    (*pScreenInfo->AdjustFrame)(ADJUST_FRAME_ARGS(pScreenInfo, x, y));
15432b578d3Smrg}
15532b578d3Smrg
15632b578d3Smrg/*
15732b578d3Smrg * ATIDGAGetViewport --
15832b578d3Smrg *
15932b578d3Smrg * This function returns the current status of prior DGA requests to set the
16032b578d3Smrg * adapter's display start address.
16132b578d3Smrg */
16232b578d3Smrgstatic int
16332b578d3SmrgATIDGAGetViewport
16432b578d3Smrg(
16532b578d3Smrg    ScrnInfoPtr pScreenInfo
16632b578d3Smrg)
16732b578d3Smrg{
16832b578d3Smrg    return 0;   /* There are never any pending requests */
16932b578d3Smrg}
17032b578d3Smrg
17132b578d3Smrg/*
17232b578d3Smrg * ATIDGAFillRect --
17332b578d3Smrg *
17432b578d3Smrg * This function calls XAA solid fill primitives to fill a rectangle.
17532b578d3Smrg */
17632b578d3Smrgstatic void
17732b578d3SmrgATIDGAFillRect
17832b578d3Smrg(
17932b578d3Smrg    ScrnInfoPtr   pScreenInfo,
18032b578d3Smrg    int           x,
18132b578d3Smrg    int           y,
18232b578d3Smrg    int           w,
18332b578d3Smrg    int           h,
18432b578d3Smrg    unsigned long colour
18532b578d3Smrg)
18632b578d3Smrg{
18732b578d3Smrg    ATIPtr        pATI     = ATIPTR(pScreenInfo);
18832b578d3Smrg/*FIXME : use EXA if available */
18932b578d3Smrg#ifdef USE_XAA
19032b578d3Smrg    XAAInfoRecPtr pXAAInfo = pATI->pXAAInfo;
19132b578d3Smrg
19232b578d3Smrg    (*pXAAInfo->SetupForSolidFill)(pScreenInfo, (int)colour, GXcopy,
19332b578d3Smrg                                   (CARD32)(~0));
19432b578d3Smrg    (*pXAAInfo->SubsequentSolidFillRect)(pScreenInfo, x, y, w, h);
19532b578d3Smrg
19632b578d3Smrg    if (pScreenInfo->bitsPerPixel == pATI->bitsPerPixel)
19732b578d3Smrg        SET_SYNC_FLAG(pXAAInfo);
19832b578d3Smrg#endif
19932b578d3Smrg}
20032b578d3Smrg
20132b578d3Smrg/*
20232b578d3Smrg * ATIDGABlitRect --
20332b578d3Smrg *
20432b578d3Smrg * This function calls XAA screen-to-screen copy primitives to copy a
20532b578d3Smrg * rectangle.
20632b578d3Smrg */
20732b578d3Smrgstatic void
20832b578d3SmrgATIDGABlitRect
20932b578d3Smrg(
21032b578d3Smrg    ScrnInfoPtr pScreenInfo,
21132b578d3Smrg    int         xSrc,
21232b578d3Smrg    int         ySrc,
21332b578d3Smrg    int         w,
21432b578d3Smrg    int         h,
21532b578d3Smrg    int         xDst,
21632b578d3Smrg    int         yDst
21732b578d3Smrg)
21832b578d3Smrg{
21932b578d3Smrg    ATIPtr        pATI     = ATIPTR(pScreenInfo);
22032b578d3Smrg/*FIXME : use EXA if available */
22132b578d3Smrg#ifdef USE_XAA
22232b578d3Smrg    XAAInfoRecPtr pXAAInfo = pATI->pXAAInfo;
22332b578d3Smrg    int           xdir     = ((xSrc < xDst) && (ySrc == yDst)) ? -1 : 1;
22432b578d3Smrg    int           ydir     = (ySrc < yDst) ? -1 : 1;
22532b578d3Smrg
22632b578d3Smrg    (*pXAAInfo->SetupForScreenToScreenCopy)(pScreenInfo,
22732b578d3Smrg        xdir, ydir, GXcopy, (CARD32)(~0), -1);
22832b578d3Smrg    (*pXAAInfo->SubsequentScreenToScreenCopy)(pScreenInfo,
22932b578d3Smrg        xSrc, ySrc, xDst, yDst, w, h);
23032b578d3Smrg
23132b578d3Smrg    if (pScreenInfo->bitsPerPixel == pATI->bitsPerPixel)
23232b578d3Smrg        SET_SYNC_FLAG(pXAAInfo);
23332b578d3Smrg#endif
23432b578d3Smrg}
23532b578d3Smrg
23632b578d3Smrg/*
23732b578d3Smrg * ATIDGABlitTransRect --
23832b578d3Smrg *
23932b578d3Smrg * This function calls XAA screen-to-screen copy primitives to transparently
24032b578d3Smrg * copy a rectangle.
24132b578d3Smrg */
24232b578d3Smrgstatic void
24332b578d3SmrgATIDGABlitTransRect
24432b578d3Smrg(
24532b578d3Smrg    ScrnInfoPtr   pScreenInfo,
24632b578d3Smrg    int           xSrc,
24732b578d3Smrg    int           ySrc,
24832b578d3Smrg    int           w,
24932b578d3Smrg    int           h,
25032b578d3Smrg    int           xDst,
25132b578d3Smrg    int           yDst,
25232b578d3Smrg    unsigned long colour
25332b578d3Smrg)
25432b578d3Smrg{
25532b578d3Smrg    ATIPtr        pATI     = ATIPTR(pScreenInfo);
25632b578d3Smrg/*FIXME : use EXA if available */
25732b578d3Smrg#ifdef USE_XAA
25832b578d3Smrg    XAAInfoRecPtr pXAAInfo = pATI->pXAAInfo;
25932b578d3Smrg    int           xdir     = ((xSrc < xDst) && (ySrc == yDst)) ? -1 : 1;
26032b578d3Smrg    int           ydir     = (ySrc < yDst) ? -1 : 1;
26132b578d3Smrg
26232b578d3Smrg    pATI->XAAForceTransBlit = TRUE;
26332b578d3Smrg
26432b578d3Smrg    (*pXAAInfo->SetupForScreenToScreenCopy)(pScreenInfo,
26532b578d3Smrg        xdir, ydir, GXcopy, (CARD32)(~0), (int)colour);
26632b578d3Smrg
26732b578d3Smrg    pATI->XAAForceTransBlit = FALSE;
26832b578d3Smrg
26932b578d3Smrg    (*pXAAInfo->SubsequentScreenToScreenCopy)(pScreenInfo,
27032b578d3Smrg        xSrc, ySrc, xDst, yDst, w, h);
27132b578d3Smrg
27232b578d3Smrg    if (pScreenInfo->bitsPerPixel == pATI->bitsPerPixel)
27332b578d3Smrg        SET_SYNC_FLAG(pXAAInfo);
27432b578d3Smrg#endif
27532b578d3Smrg}
27632b578d3Smrg
27732b578d3Smrg/*
27832b578d3Smrg * ATIDGAAddModes --
27932b578d3Smrg *
28032b578d3Smrg * This function translates DisplayModeRec's into DGAModeRec's.
28132b578d3Smrg */
28232b578d3Smrgstatic void
28332b578d3SmrgATIDGAAddModes
28432b578d3Smrg(
28532b578d3Smrg    ScrnInfoPtr pScreenInfo,
28632b578d3Smrg    ATIPtr      pATI,
28732b578d3Smrg    int         flags,
28832b578d3Smrg    int         depth,
28932b578d3Smrg    int         bitsPerPixel,
29032b578d3Smrg    int         redMask,
29132b578d3Smrg    int         greenMask,
29232b578d3Smrg    int         blueMask,
29332b578d3Smrg    int         visualClass
29432b578d3Smrg)
29532b578d3Smrg{
29632b578d3Smrg    DisplayModePtr pMode         = pScreenInfo->modes;
29732b578d3Smrg    DGAModePtr     pDGAMode;
29832b578d3Smrg    int            displayWidth  = pScreenInfo->displayWidth;
29932b578d3Smrg    int            videoBits     = pScreenInfo->videoRam * 1024 * 8;
30032b578d3Smrg    int            xViewportStep = 64 / UnitOf(bitsPerPixel);
30132b578d3Smrg    int            modePitch, bitsPerScanline, maxViewportY;
30232b578d3Smrg
30332b578d3Smrg    if (bitsPerPixel != pScreenInfo->bitsPerPixel)
30432b578d3Smrg        displayWidth = 0;
30532b578d3Smrg
30632b578d3Smrg    while (1)
30732b578d3Smrg    {
30832b578d3Smrg        /* Weed out multiscanned modes */
30932b578d3Smrg        if ((pMode->VScan <= 1) ||
31032b578d3Smrg            ((pMode->VScan == 2) && !(pMode->Flags & V_DBLSCAN)))
31132b578d3Smrg        {
31232b578d3Smrg            /*
31332b578d3Smrg             * For code simplicity, ensure DGA mode pitch is a multiple of 64
31432b578d3Smrg             * bytes.
31532b578d3Smrg             */
31632b578d3Smrg            if (!(modePitch = displayWidth))
31732b578d3Smrg            {
31832b578d3Smrg                modePitch = ((64 * 8) / UnitOf(bitsPerPixel)) - 1;
31932b578d3Smrg                modePitch = (pMode->HDisplay + modePitch) & ~modePitch;
32032b578d3Smrg            }
32132b578d3Smrg
32232b578d3Smrg            /* Ensure the mode fits in video memory */
32332b578d3Smrg            if ((modePitch * bitsPerPixel * pMode->VDisplay) <= videoBits)
32432b578d3Smrg            {
32532b578d3Smrg                /* Stop generating modes on out-of-memory conditions */
3261b12faf6Smrg                pDGAMode = realloc(pATI->pDGAMode,
32732b578d3Smrg                    (pATI->nDGAMode + 1) * SizeOf(DGAModeRec));
32832b578d3Smrg                if (!pDGAMode)
32932b578d3Smrg                    break;
33032b578d3Smrg
33132b578d3Smrg                pATI->pDGAMode = pDGAMode;
33232b578d3Smrg                pDGAMode += pATI->nDGAMode;
33332b578d3Smrg                pATI->nDGAMode++;
33432b578d3Smrg                (void)memset(pDGAMode, 0, SizeOf(DGAModeRec));
33532b578d3Smrg
33632b578d3Smrg                /* Fill in the mode structure */
33732b578d3Smrg                pDGAMode->mode = pMode;
33832b578d3Smrg                pDGAMode->flags = flags;
33932b578d3Smrg                if (bitsPerPixel == pScreenInfo->bitsPerPixel)
34032b578d3Smrg                {
34132b578d3Smrg                    pDGAMode->flags |= DGA_PIXMAP_AVAILABLE;
34232b578d3Smrg                    pDGAMode->address = pATI->pMemory;
34332b578d3Smrg
34432b578d3Smrg#ifdef USE_XAA
34532b578d3Smrg                    if (pATI->pXAAInfo)
34632b578d3Smrg                        pDGAMode->flags &= ~DGA_CONCURRENT_ACCESS;
34732b578d3Smrg#endif
34832b578d3Smrg                }
34932b578d3Smrg                if ((pMode->Flags & V_DBLSCAN) || (pMode->VScan > 1))
35032b578d3Smrg                    pDGAMode->flags |= DGA_DOUBLESCAN;
35132b578d3Smrg                if (pMode->Flags & V_INTERLACE)
35232b578d3Smrg                    pDGAMode->flags |= DGA_INTERLACED;
35332b578d3Smrg
35432b578d3Smrg                pDGAMode->byteOrder = pScreenInfo->imageByteOrder;
35532b578d3Smrg                pDGAMode->depth = depth;
35632b578d3Smrg                pDGAMode->bitsPerPixel = bitsPerPixel;
35732b578d3Smrg                pDGAMode->red_mask = redMask;
35832b578d3Smrg                pDGAMode->green_mask = greenMask;
35932b578d3Smrg                pDGAMode->blue_mask = blueMask;
36032b578d3Smrg                pDGAMode->visualClass = visualClass;
36132b578d3Smrg
36232b578d3Smrg                pDGAMode->viewportWidth = pMode->HDisplay;
36332b578d3Smrg                pDGAMode->viewportHeight = pMode->VDisplay;
36432b578d3Smrg                pDGAMode->xViewportStep = xViewportStep;
36532b578d3Smrg                pDGAMode->yViewportStep = 1;
36632b578d3Smrg
36732b578d3Smrg                bitsPerScanline = modePitch * bitsPerPixel;
36832b578d3Smrg                pDGAMode->bytesPerScanline = bitsPerScanline / 8;
36932b578d3Smrg                pDGAMode->imageWidth = pDGAMode->pixmapWidth = modePitch;
37032b578d3Smrg                pDGAMode->imageHeight = pDGAMode->pixmapHeight =
37132b578d3Smrg                    videoBits / bitsPerScanline;
37232b578d3Smrg
37332b578d3Smrg                pDGAMode->maxViewportX =
37432b578d3Smrg                    pDGAMode->imageWidth - pDGAMode->viewportWidth;
37532b578d3Smrg                pDGAMode->maxViewportY =
37632b578d3Smrg                    pDGAMode->imageHeight - pDGAMode->viewportHeight;
37732b578d3Smrg                maxViewportY =
37832b578d3Smrg                    ((((pATI->AdjustMaxBase * 8) / bitsPerPixel) +
37932b578d3Smrg                      xViewportStep) / modePitch) - 1;
38032b578d3Smrg                if (maxViewportY < pDGAMode->maxViewportY)
38132b578d3Smrg                    pDGAMode->maxViewportY = maxViewportY;
38232b578d3Smrg            }
38332b578d3Smrg        }
38432b578d3Smrg
38532b578d3Smrg        if ((pMode = pMode->next) == pScreenInfo->modes)
38632b578d3Smrg        {
38732b578d3Smrg            if (!displayWidth)
38832b578d3Smrg                break;
38932b578d3Smrg
39032b578d3Smrg            displayWidth = 0;
39132b578d3Smrg        }
39232b578d3Smrg    }
39332b578d3Smrg}
39432b578d3Smrg
39532b578d3Smrg/*
39632b578d3Smrg * ATIDGAInit --
39732b578d3Smrg *
39832b578d3Smrg * This function initialises the driver's support for the DGA extension.
39932b578d3Smrg */
40032b578d3SmrgBool
40132b578d3SmrgATIDGAInit
40232b578d3Smrg(
40332b578d3Smrg    ScreenPtr   pScreen,
40432b578d3Smrg    ScrnInfoPtr pScreenInfo,
40532b578d3Smrg    ATIPtr      pATI
40632b578d3Smrg)
40732b578d3Smrg{
40832b578d3Smrg#ifdef USE_XAA
40932b578d3Smrg    XAAInfoRecPtr pXAAInfo;
41032b578d3Smrg#endif
41132b578d3Smrg    int           flags;
41232b578d3Smrg
41332b578d3Smrg    if (!pATI->nDGAMode)
41432b578d3Smrg    {
41532b578d3Smrg        /* Set up DGA callbacks */
41632b578d3Smrg        pATI->ATIDGAFunctions.OpenFramebuffer = ATIDGAOpenFramebuffer;
41732b578d3Smrg        pATI->ATIDGAFunctions.SetMode         = ATIDGASetMode;
41832b578d3Smrg        pATI->ATIDGAFunctions.SetViewport     = ATIDGASetViewport;
41932b578d3Smrg        pATI->ATIDGAFunctions.GetViewport     = ATIDGAGetViewport;
42032b578d3Smrg
42132b578d3Smrg        flags = 0;
42232b578d3Smrg#ifdef USE_XAA
42332b578d3Smrg        if ((pXAAInfo = pATI->pXAAInfo))
42432b578d3Smrg        {
42532b578d3Smrg            pATI->ATIDGAFunctions.Sync = pXAAInfo->Sync;
42632b578d3Smrg            if (pXAAInfo->SetupForSolidFill &&
42732b578d3Smrg                pXAAInfo->SubsequentSolidFillRect)
42832b578d3Smrg            {
42932b578d3Smrg                flags |= DGA_FILL_RECT;
43032b578d3Smrg                pATI->ATIDGAFunctions.FillRect = ATIDGAFillRect;
43132b578d3Smrg            }
43232b578d3Smrg            if (pXAAInfo->SetupForScreenToScreenCopy &&
43332b578d3Smrg                pXAAInfo->SubsequentScreenToScreenCopy)
43432b578d3Smrg            {
43532b578d3Smrg                flags |= DGA_BLIT_RECT | DGA_BLIT_RECT_TRANS;
43632b578d3Smrg                pATI->ATIDGAFunctions.BlitRect      = ATIDGABlitRect;
43732b578d3Smrg                pATI->ATIDGAFunctions.BlitTransRect = ATIDGABlitTransRect;
43832b578d3Smrg            }
43932b578d3Smrg        }
44032b578d3Smrg#endif
44132b578d3Smrg        if (!flags)
44232b578d3Smrg            flags = DGA_CONCURRENT_ACCESS;
44332b578d3Smrg
44432b578d3Smrg        ATIDGAAddModes(pScreenInfo, pATI, flags,
44532b578d3Smrg            8, 8, 0, 0, 0, PseudoColor);
44632b578d3Smrg
44732b578d3Smrg        if ((pATI->Chip >= ATI_CHIP_264CT))
44832b578d3Smrg        {
44932b578d3Smrg            ATIDGAAddModes(pScreenInfo, pATI, flags,
45032b578d3Smrg                15, 16, 0x7C00U, 0x03E0U, 0x001FU, TrueColor);
45132b578d3Smrg
45232b578d3Smrg            ATIDGAAddModes(pScreenInfo, pATI, flags,
45332b578d3Smrg                16, 16, 0xF800U, 0x07E0U, 0x001FU, TrueColor);
45432b578d3Smrg
45532b578d3Smrg            ATIDGAAddModes(pScreenInfo, pATI, flags,
45632b578d3Smrg                24, 24, 0x00FF0000U, 0x0000FF00U, 0x000000FFU, TrueColor);
45732b578d3Smrg
45832b578d3Smrg            ATIDGAAddModes(pScreenInfo, pATI, flags,
45932b578d3Smrg                24, 32, 0x00FF0000U, 0x0000FF00U, 0x000000FFU, TrueColor);
46032b578d3Smrg
46132b578d3Smrg            if (pATI->DAC != ATI_DAC_INTERNAL)      /* Not first revision */
46232b578d3Smrg            {
46332b578d3Smrg                ATIDGAAddModes(pScreenInfo, pATI, flags,
46432b578d3Smrg                    15, 16, 0x7C00U, 0x03E0U, 0x001FU, DirectColor);
46532b578d3Smrg
46632b578d3Smrg                ATIDGAAddModes(pScreenInfo, pATI, flags,
46732b578d3Smrg                    16, 16, 0xF800U, 0x07E0U, 0x001FU, DirectColor);
46832b578d3Smrg
46932b578d3Smrg                ATIDGAAddModes(pScreenInfo, pATI, flags,
47032b578d3Smrg                    24, 24, 0x00FF0000U, 0x0000FF00U, 0x000000FFU, DirectColor);
47132b578d3Smrg
47232b578d3Smrg                ATIDGAAddModes(pScreenInfo, pATI, flags,
47332b578d3Smrg                    24, 32, 0x00FF0000U, 0x0000FF00U, 0x000000FFU, DirectColor);
47432b578d3Smrg            }
47532b578d3Smrg        }
47632b578d3Smrg    }
47732b578d3Smrg
47832b578d3Smrg    return DGAInit(pScreen, &pATI->ATIDGAFunctions, pATI->pDGAMode,
47932b578d3Smrg                   pATI->nDGAMode);
48032b578d3Smrg}
48132b578d3Smrg
48232b578d3Smrg#endif /* AVOID_DGA */
483