#include "ati.h"
#include "atiaccel.h"
#include "aticonsole.h"
#include "aticursor.h"
#include "atidac.h"
#include "atidga.h"
#include "atiscreen.h"
#include "atistruct.h"
#include "atixv.h"
#include "shadowfb.h"
#include "xf86cmap.h"
#include "xf1bpp.h"
#include "xf4bpp.h"
#include "fb.h"
#include "mibank.h"
#include "micmap.h"
#include "mipointer.h"
static void
ATIRefreshArea
(
ScrnInfoPtr pScreenInfo,
int nBox,
BoxPtr pBox
)
{
ATIPtr pATI = ATIPTR(pScreenInfo);
pointer pSrc, pDst;
int offset, w, h;
while (nBox-- > 0)
{
w = (pBox->x2 - pBox->x1) * pATI->AdjustDepth;
h = pBox->y2 - pBox->y1;
offset = (pBox->y1 * pATI->FBPitch) + (pBox->x1 * pATI->AdjustDepth);
pSrc = (char *)pATI->pShadow + offset;
pDst = (char *)pATI->pMemory + offset;
while (h-- > 0)
{
(void)memcpy(pDst, pSrc, w);
pSrc = (char *)pSrc + pATI->FBPitch;
pDst = (char *)pDst + pATI->FBPitch;
}
pBox++;
}
}
Bool
ATIScreenInit
(
int iScreen,
ScreenPtr pScreen,
int argc,
char **argv
)
{
ScrnInfoPtr pScreenInfo = xf86Screens[iScreen];
ATIPtr pATI = ATIPTR(pScreenInfo);
pointer pFB;
int VisualMask;
if (!ATIEnterGraphics(pScreen, pScreenInfo, pATI))
return FALSE;
miClearVisualTypes();
if ((pATI->depth > 8) && (pATI->DAC == ATI_DAC_INTERNAL))
VisualMask = TrueColorMask;
else
VisualMask = miGetDefaultVisualMask(pATI->depth);
if (!miSetVisualTypes(pATI->depth, VisualMask, pATI->rgbBits,
pScreenInfo->defaultVisual))
return FALSE;
if (!miSetPixmapDepths())
return FALSE;
pFB = pATI->pMemory;
pATI->FBPitch = PixmapBytePad(pATI->displayWidth, pATI->depth);
if (pATI->OptionShadowFB)
{
if ((pATI->pShadow = xalloc(pATI->FBPitch * pScreenInfo->virtualY)))
{
pFB = pATI->pShadow;
}
else
{
xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING,
"Insufficient virtual memory for shadow frame buffer.\n");
pATI->OptionShadowFB = FALSE;
}
}
switch (pATI->bitsPerPixel)
{
#ifndef AVOID_CPIO
case 1:
pATI->Closeable = xf1bppScreenInit(pScreen, pFB,
pScreenInfo->virtualX, pScreenInfo->virtualY,
pScreenInfo->xDpi, pScreenInfo->yDpi, pATI->displayWidth);
break;
case 4:
pATI->Closeable = xf4bppScreenInit(pScreen, pFB,
pScreenInfo->virtualX, pScreenInfo->virtualY,
pScreenInfo->xDpi, pScreenInfo->yDpi, pATI->displayWidth);
break;
#endif
case 8:
case 16:
case 24:
case 32:
pATI->Closeable = fbScreenInit(pScreen, pFB,
pScreenInfo->virtualX, pScreenInfo->virtualY,
pScreenInfo->xDpi, pScreenInfo->yDpi, pATI->displayWidth,
pATI->bitsPerPixel);
break;
default:
return FALSE;
}
if (!pATI->Closeable)
return FALSE;
if (pATI->depth > 8)
{
VisualPtr pVisual = pScreen->visuals + pScreen->numVisuals;
while (--pVisual >= pScreen->visuals)
{
if ((pVisual->class | DynamicClass) != DirectColor)
continue;
pVisual->offsetRed = pScreenInfo->offset.red;
pVisual->offsetGreen = pScreenInfo->offset.green;
pVisual->offsetBlue = pScreenInfo->offset.blue;
pVisual->redMask = pScreenInfo->mask.red;
pVisual->greenMask = pScreenInfo->mask.green;
pVisual->blueMask = pScreenInfo->mask.blue;
}
}
if (pATI->bitsPerPixel > 4)
{
if (pATI->OptionShadowFB)
{
if (serverGeneration == 1)
xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING,
"RENDER extension not supported with a shadowed"
" framebuffer.\n");
}
#ifndef AVOID_CPIO
else if (pATI->BankInfo.BankSize)
{
if (serverGeneration == 1)
xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING,
"RENDER extension not supported with a banked"
" framebuffer.\n");
}
#endif
else if (!fbPictureInit(pScreen, NULL, 0) &&
(serverGeneration == 1))
{
xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING,
"RENDER extension initialisation failed.\n");
}
}
xf86SetBlackWhitePixels(pScreen);
#ifndef AVOID_CPIO
if (!miInitializeBanking(pScreen,
pScreenInfo->virtualX, pScreenInfo->virtualY,
pATI->displayWidth, &pATI->BankInfo))
return FALSE;
#endif
if (!ATIInitializeAcceleration(pScreen, pScreenInfo, pATI))
return FALSE;
#ifndef AVOID_DGA
(void)ATIDGAInit(pScreen, pScreenInfo, pATI);
#endif
miInitializeBackingStore(pScreen);
xf86SetBackingStore(pScreen);
if (!ATIInitializeCursor(pScreen, pATI))
return FALSE;
if (!miCreateDefColormap(pScreen))
return FALSE;
#ifdef AVOID_CPIO
if (!xf86HandleColormaps(pScreen, 256, pATI->rgbBits, ATILoadPalette, NULL,
CMAP_PALETTED_TRUECOLOR |
CMAP_LOAD_EVEN_IF_OFFSCREEN))
return FALSE;
#else
if (pATI->depth > 1)
if (!xf86HandleColormaps(pScreen, (pATI->depth == 4) ? 16 : 256,
pATI->rgbBits, ATILoadPalette, NULL,
CMAP_PALETTED_TRUECOLOR |
CMAP_LOAD_EVEN_IF_OFFSCREEN))
return FALSE;
#endif
if (pATI->OptionShadowFB &&
!ShadowFBInit(pScreen, ATIRefreshArea))
return FALSE;
(void)xf86DPMSInit(pScreen, ATISetDPMSMode, 0);
(void)ATIInitializeXVideo(pScreen, pScreenInfo, pATI);
pScreen->SaveScreen = ATISaveScreen;
pATI->CloseScreen = pScreen->CloseScreen;
pScreen->CloseScreen = ATICloseScreen;
if (serverGeneration == 1)
xf86ShowUnusedOptions(pScreenInfo->scrnIndex, pScreenInfo->options);
return TRUE;
}
Bool
ATICloseScreen
(
int iScreen,
ScreenPtr pScreen
)
{
ScrnInfoPtr pScreenInfo = xf86Screens[iScreen];
ATIPtr pATI = ATIPTR(pScreenInfo);
Bool Closed = TRUE;
ATICloseXVideo(pScreen, pScreenInfo, pATI);
if (pATI->pXAAInfo)
{
XAADestroyInfoRec(pATI->pXAAInfo);
pATI->pXAAInfo = NULL;
}
if ((pScreen->CloseScreen = pATI->CloseScreen))
{
pATI->CloseScreen = NULL;
Closed = (*pScreen->CloseScreen)(iScreen, pScreen);
}
pATI->Closeable = FALSE;
if (pATI->pCursorInfo)
{
xf86DestroyCursorInfoRec(pATI->pCursorInfo);
pATI->pCursorInfo = NULL;
}
ATILeaveGraphics(pScreenInfo, pATI);
xfree(pATI->ExpansionBitmapScanlinePtr[1]);
pATI->ExpansionBitmapScanlinePtr[0] =
pATI->ExpansionBitmapScanlinePtr[1] = NULL;
xfree(pATI->pShadow);
pATI->pShadow = NULL;
pScreenInfo->pScreen = NULL;
return Closed;
}