summaryrefslogtreecommitdiff
path: root/src/atiscreen.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/atiscreen.c')
-rw-r--r--src/atiscreen.c635
1 files changed, 0 insertions, 635 deletions
diff --git a/src/atiscreen.c b/src/atiscreen.c
deleted file mode 100644
index ec784cb..0000000
--- a/src/atiscreen.c
+++ /dev/null
@@ -1,635 +0,0 @@
-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/atiscreen.c,v 1.30 2003/04/23 21:51:30 tsi Exp $ */
-/*
- * Copyright 1999 through 2003 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that copyright
- * notice and this permission notice appear in supporting documentation, and
- * that the name of Marc Aurele La France not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission. Marc Aurele La France makes no representations
- * about the suitability of this software for any purpose. It is provided
- * "as-is" without express or implied warranty.
- *
- * MARC AURELE LA FRANCE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
- * EVENT SHALL MARC AURELE LA FRANCE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- *
- * DRI support by:
- * Gareth Hughes <gareth@valinux.com>
- * José Fonseca <j_r_fonseca@yahoo.co.uk>
- * Leif Delgass <ldelgass@retinalburn.net>
- */
-
-#include "ati.h"
-#include "atibus.h"
-#include "atichip.h"
-#include "atiaccel.h"
-#include "aticonsole.h"
-#include "aticursor.h"
-#include "atidac.h"
-#include "atidga.h"
-#include "atidri.h"
-#include "atimach64.h"
-#include "atimode.h"
-#include "atiscreen.h"
-#include "atistruct.h"
-#include "atixv.h"
-#include "atimach64accel.h"
-
-#include "mach64_dri.h"
-#include "mach64_sarea.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"
-
-/*
- * ATIRefreshArea --
- *
- * This function is called by the shadow frame buffer code to refresh the
- * hardware frame buffer.
- */
-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++;
- }
-}
-
-/*
- * ATIMinBits --
- *
- * Compute log base 2 of val.
- */
-static int
-ATIMinBits
-(
- int val
-)
-{
- int bits;
-
- if (!val) return 1;
- for (bits = 0; val; val >>= 1, ++bits);
- return bits;
-}
-
-/*
- * ATIScreenInit --
- *
- * This function is called by DIX to initialise the screen.
- */
-Bool
-ATIScreenInit
-(
- int iScreen,
- ScreenPtr pScreen,
- int argc,
- char **argv
-)
-{
- ScrnInfoPtr pScreenInfo = xf86Screens[iScreen];
- ATIPtr pATI = ATIPTR(pScreenInfo);
- pointer pFB;
- int VisualMask;
- BoxRec ScreenArea;
-
- /* Set video hardware state */
- if (!ATIEnterGraphics(pScreen, pScreenInfo, pATI))
- return FALSE;
-
- /* Re-initialise mi's visual list */
- 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)
- {
- pATI->FBBytesPerPixel = pATI->bitsPerPixel >> 3;
- pATI->FBPitch = PixmapBytePad(pATI->displayWidth, pATI->depth);
- 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;
- }
- }
-
-#ifdef XF86DRI
-
- /* Setup DRI after visuals have been established, but before
- * cfbScreenInit is called. cfbScreenInit will eventually call the
- * driver's InitGLXVisuals call back.
- */
-
- /* According to atiregs.h, GTPro (3D Rage Pro) is the first chip type with
- * 3D triangle setup (the VERTEX_* registers)
- */
- if (pATI->Chip < ATI_CHIP_264GTPRO) {
- xf86DrvMsg(iScreen, X_WARNING,
- "Direct rendering is not supported for ATI chips earlier than "
- "the ATI 3D Rage Pro.\n");
- pATI->directRenderingEnabled = FALSE;
- } else {
- /* FIXME: When we move to dynamic allocation of back and depth
- * buffers, we will want to revisit the following check for 3
- * times the virtual size (or 2.5 times for 24-bit depth) of the screen below.
- */
- int cpp = pATI->bitsPerPixel >> 3;
- int maxY = pScreenInfo->videoRam * 1024 / (pATI->displayWidth * cpp);
- int requiredY;
-
- requiredY = pScreenInfo->virtualY * 2 /* front, back buffers */
- + (pScreenInfo->virtualY * 2 / cpp); /* depth buffer (always 16-bit) */
-
- if (!pATI->OptionAccel) {
- xf86DrvMsg(iScreen, X_WARNING,
- "Acceleration disabled, not initializing the DRI\n");
- pATI->directRenderingEnabled = FALSE;
- } else if ( maxY > requiredY ) {
- pATI->directRenderingEnabled = ATIDRIScreenInit(pScreen);
- } else {
- xf86DrvMsg(iScreen, X_WARNING,
- "DRI static buffer allocation failed -- "
- "need at least %d kB video memory\n",
- (pScreenInfo->displayWidth * requiredY * cpp ) / 1024);
- pATI->directRenderingEnabled = FALSE;
- }
- }
-
-#endif /* XF86DRI */
-
- /* Initialise framebuffer layer */
- 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 /* AVOID_CPIO */
-
- 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;
-
- /* Fixup RGB ordering */
- 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 applicable, initialise RENDER extension */
- 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 /* AVOID_CPIO */
-
- else if (!fbPictureInit(pScreen, NULL, 0) &&
- (serverGeneration == 1))
- {
- xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING,
- "RENDER extension initialisation failed.\n");
- }
- }
-
- xf86SetBlackWhitePixels(pScreen);
-
-#ifndef AVOID_CPIO
-
- /* Initialise banking if needed */
- if (!miInitializeBanking(pScreen,
- pScreenInfo->virtualX, pScreenInfo->virtualY,
- pATI->displayWidth, &pATI->BankInfo))
- return FALSE;
-
-#endif /* AVOID_CPIO */
-
- /* Memory manager setup */
-
-#ifdef XF86DRI
-
- if (pATI->directRenderingEnabled)
- {
- ATIDRIServerInfoPtr pATIDRIServer = pATI->pDRIServerInfo;
- int cpp = pATI->bitsPerPixel >> 3;
- int widthBytes = pScreenInfo->displayWidth * cpp;
- int zWidthBytes = pScreenInfo->displayWidth * 2; /* always 16-bit z-buffer */
- int fbSize = pScreenInfo->videoRam * 1024;
- int bufferSize = pScreenInfo->virtualY * widthBytes;
- int zBufferSize = pScreenInfo->virtualY * zWidthBytes;
- int offscreenBytes, total, scanlines;
-
- pATIDRIServer->fbX = 0;
- pATIDRIServer->fbY = 0;
- pATIDRIServer->frontOffset = 0;
- pATIDRIServer->frontPitch = pScreenInfo->displayWidth;
-
- /* Calculate memory remaining for pixcache and textures after
- * front, back, and depth buffers
- */
- offscreenBytes = fbSize - ( 2 * bufferSize + zBufferSize );
-
- if ( !pATIDRIServer->IsPCI && !pATI->OptionLocalTextures ) {
- /* Don't allocate a local texture heap for AGP unless requested */
- pATIDRIServer->textureSize = 0;
- } else {
- int l, maxPixcache;
-
-# ifdef XvExtension
-
- int xvBytes;
-
- /* Try for enough pixmap cache for DVD and a full viewport
- */
- xvBytes = 720*480*cpp; /* enough for single-buffered DVD */
- maxPixcache = xvBytes > bufferSize ? xvBytes : bufferSize;
-
-# else /* XvExtension */
-
- /* Try for one viewport */
- maxPixcache = bufferSize;
-
-# endif /* XvExtension */
-
- pATIDRIServer->textureSize = offscreenBytes - maxPixcache;
-
- /* If that gives us less than half the offscreen mem available for textures, split
- * the available mem between textures and pixmap cache
- */
- if (pATIDRIServer->textureSize < (offscreenBytes/2)) {
- pATIDRIServer->textureSize = offscreenBytes/2;
- }
-
- if (pATIDRIServer->textureSize <= 0)
- pATIDRIServer->textureSize = 0;
-
- l = ATIMinBits((pATIDRIServer->textureSize-1) / MACH64_NR_TEX_REGIONS);
- if (l < MACH64_LOG_TEX_GRANULARITY) l = MACH64_LOG_TEX_GRANULARITY;
-
- /* Round the texture size up to the nearest whole number of
- * texture regions. Again, be greedy about this, don't round
- * down.
- */
- pATIDRIServer->logTextureGranularity = l;
- pATIDRIServer->textureSize =
- (pATIDRIServer->textureSize >> l) << l;
- }
-
- total = fbSize - pATIDRIServer->textureSize;
- scanlines = total / widthBytes;
- if (scanlines > ATIMach64MaxY) scanlines = ATIMach64MaxY;
-
- /* Recalculate the texture offset and size to accomodate any
- * rounding to a whole number of scanlines.
- * FIXME: Is this actually needed?
- */
- pATIDRIServer->textureOffset = scanlines * widthBytes;
- pATIDRIServer->textureSize = fbSize - pATIDRIServer->textureOffset;
-
- /* Set a minimum usable local texture heap size. This will fit
- * two 256x256 textures. We check this after any rounding of
- * the texture area.
- */
- if (pATIDRIServer->textureSize < 256*256 * cpp * 2) {
- pATIDRIServer->textureOffset = 0;
- pATIDRIServer->textureSize = 0;
- scanlines = fbSize / widthBytes;
- if (scanlines > ATIMach64MaxY) scanlines = ATIMach64MaxY;
- }
-
- pATIDRIServer->depthOffset = scanlines * widthBytes - zBufferSize;
- pATIDRIServer->depthPitch = pScreenInfo->displayWidth;
- pATIDRIServer->depthY = pATIDRIServer->depthOffset/widthBytes;
- pATIDRIServer->depthX = (pATIDRIServer->depthOffset -
- (pATIDRIServer->depthY * widthBytes)) / cpp;
-
- pATIDRIServer->backOffset = pATIDRIServer->depthOffset - bufferSize;
- pATIDRIServer->backPitch = pScreenInfo->displayWidth;
- pATIDRIServer->backY = pATIDRIServer->backOffset/widthBytes;
- pATIDRIServer->backX = (pATIDRIServer->backOffset -
- (pATIDRIServer->backY * widthBytes)) / cpp;
-
- scanlines = fbSize / widthBytes;
- if (scanlines > ATIMach64MaxY) scanlines = ATIMach64MaxY;
-
- if ( pATIDRIServer->IsPCI && pATIDRIServer->textureSize == 0 ) {
- xf86DrvMsg(iScreen, X_WARNING,
- "Not enough memory for local textures, disabling DRI\n");
- ATIDRICloseScreen(pScreen);
- pATI->directRenderingEnabled = FALSE;
- } else {
-
- ScreenArea.x1 = 0;
- ScreenArea.y1 = 0;
- ScreenArea.x2 = pATI->displayWidth;
- ScreenArea.y2 = scanlines;
-
- if (!xf86InitFBManager(pScreen, &ScreenArea)) {
- xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR,
- "Memory manager initialization to (%d,%d) (%d,%d) failed\n",
- ScreenArea.x1, ScreenArea.y1,
- ScreenArea.x2, ScreenArea.y2);
- return FALSE;
- } else {
- int width, height;
-
- xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO,
- "Memory manager initialized to (%d,%d) (%d,%d)\n",
- ScreenArea.x1, ScreenArea.y1, ScreenArea.x2, ScreenArea.y2);
-
- if (xf86QueryLargestOffscreenArea(pScreen, &width, &height, 0, 0, 0)) {
- xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO,
- "Largest offscreen area available: %d x %d\n",
- width, height);
-
- /* lines in offscreen area needed for depth buffer and textures */
- pATI->depthTexLines = scanlines
- - pATIDRIServer->depthOffset / widthBytes;
- pATI->backLines = scanlines
- - pATIDRIServer->backOffset / widthBytes
- - pATI->depthTexLines;
- pATI->depthTexArea = NULL;
- pATI->backArea = NULL;
- } else {
- xf86DrvMsg(pScreenInfo->scrnIndex, X_ERROR,
- "Unable to determine largest offscreen area available\n");
- return FALSE;
- }
-
- }
-
- xf86DrvMsg(iScreen, X_INFO, "Will use %d kB of offscreen memory for XAA\n",
- (offscreenBytes - pATIDRIServer->textureSize)/1024);
-
- xf86DrvMsg(iScreen, X_INFO, "Will use back buffer at offset 0x%x\n",
- pATIDRIServer->backOffset);
-
- xf86DrvMsg(iScreen, X_INFO, "Will use depth buffer at offset 0x%x\n",
- pATIDRIServer->depthOffset);
-
- if (pATIDRIServer->textureSize > 0) {
- xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO,
- "Will use %d kB for local textures at offset 0x%x\n",
- pATIDRIServer->textureSize/1024,
- pATIDRIServer->textureOffset);
- }
- }
- }
-
-#endif /* XF86DRI */
-
- /* Setup acceleration */
- /* If direct rendering is not enabled, the framebuffer memory
- * manager is initialized by this function call */
- if (!ATIInitializeAcceleration(pScreen, pScreenInfo, pATI))
- return FALSE;
-
-#ifndef AVOID_DGA
-
- /* Initialise DGA support */
- (void)ATIDGAInit(pScreen, pScreenInfo, pATI);
-
-#endif /* AVOID_DGA */
-
- /* Initialise backing store */
- miInitializeBackingStore(pScreen);
- xf86SetBackingStore(pScreen);
-
- /* Initialise cursor */
- if (!ATIInitializeCursor(pScreen, pATI))
- return FALSE;
-
- /* Create default colourmap */
- 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 /* AVOID_CPIO */
-
- 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 /* AVOID_CPIO */
-
- /* Initialise shadow framebuffer */
- if (pATI->OptionShadowFB &&
- !ShadowFBInit(pScreen, ATIRefreshArea))
- return FALSE;
-
- /* Initialise DPMS support */
- (void)xf86DPMSInit(pScreen, ATISetDPMSMode, 0);
-
- /* Initialise XVideo support */
- (void)ATIInitializeXVideo(pScreen, pScreenInfo, pATI);
-
- /* Set pScreen->SaveScreen and wrap CloseScreen vector */
- pScreen->SaveScreen = ATISaveScreen;
- pATI->CloseScreen = pScreen->CloseScreen;
- pScreen->CloseScreen = ATICloseScreen;
-
- if (serverGeneration == 1)
- xf86ShowUnusedOptions(pScreenInfo->scrnIndex, pScreenInfo->options);
-
-#ifdef XF86DRI
-
- /* DRI finalization */
- if (pATI->directRenderingEnabled) {
- /* Now that mi, cfb, drm and others have done their thing,
- * complete the DRI setup.
- */
- pATI->directRenderingEnabled = ATIDRIFinishScreenInit(pScreen);
- }
- if (pATI->directRenderingEnabled) {
- xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO,
- "Direct rendering enabled\n");
- } else {
- /* FIXME: Release unused offscreen mem here? */
- xf86DrvMsg(pScreenInfo->scrnIndex, X_INFO,
- "Direct rendering disabled\n");
- }
-
-#endif /* XF86DRI */
-
- return TRUE;
-}
-
-/*
- * ATICloseScreen --
- *
- * This function is called by DIX to close the screen.
- */
-Bool
-ATICloseScreen
-(
- int iScreen,
- ScreenPtr pScreen
-)
-{
- ScrnInfoPtr pScreenInfo = xf86Screens[iScreen];
- ATIPtr pATI = ATIPTR(pScreenInfo);
- Bool Closed = TRUE;
-
-#ifdef XF86DRI
-
- /* Disable direct rendering */
- if (pATI->directRenderingEnabled)
- {
- ATIDRICloseScreen(pScreen);
- pATI->directRenderingEnabled = FALSE;
- }
-
-#endif /* XF86DRI */
-
- 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;
-}