xenocara/driver/xf86-video-voodoo/src/voodoo_dga.c
2006-11-26 20:21:27 +00:00

188 lines
5.7 KiB
C

/*
* XFree86 driver for the Voodoo 2 using native X support and no
* Glide2. This is done for two reasons, firstly Glide2 is not portable
* to other than x86_32 which is becoming an issue, and secondly to get
* accelerations that Glide does not expose. The Voodoo 2 hardware has
* bit blit (screen->screen, cpu->screen), some colour expansion and
* also alpha (so could do hw render even!). Also can in theory use
* texture ram and engine to do arbitary Xv support as we have
* colour match on the 2D blit (ie 3D blit to back, 2D blit to front)
* along with alpha on the Xv 8) and with some care rotation of Xv.
*
* Alan Cox <alan@redhat.com>
*
* 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 names of Red Hat, Alan Cox and Henrik Harmsen
* not be used in advertising or publicity pertaining to distribution of the
* software without specific, written prior permission. Th authors make no
* representations about the suitability of this software for any purpose.
* It is provided "as is" without express or implied warranty.
*
* THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL RICHARD HECKER 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.
*
* THIS SOFTWARE IS NOT DESIGNED FOR USE IN SAFETY CRITICAL SYSTEMS OF
* ANY KIND OR FORM.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "fb.h"
#include "mibank.h"
#include "micmap.h"
#include "xf86.h"
#include "xf86_OSproc.h"
#include "xf86Version.h"
#include "xf86PciInfo.h"
#include "xf86Pci.h"
#include "xf86cmap.h"
#include "shadowfb.h"
#include "vgaHW.h"
#include "xf86DDC.h"
#include "xf86RAC.h"
#include "xf86Resources.h"
#include "compiler.h"
#include "xaa.h"
#include "dgaproc.h"
#include "voodoo.h"
#define _XF86DGA_SERVER_
#include <X11/extensions/xf86dgastr.h>
#include "opaque.h"
#define DPMS_SERVER
#include <X11/extensions/dpms.h>
/***********************************************************************
* DGA stuff
***********************************************************************/
static Bool VoodooDGAOpenFramebuffer(ScrnInfoPtr pScrn, char **DeviceName,
unsigned char **ApertureBase,
int *ApertureSize, int *ApertureOffset,
int *flags);
static Bool VoodooDGASetMode(ScrnInfoPtr pScrn, DGAModePtr pDGAMode);
static Bool VoodooDGAOpenFramebuffer(ScrnInfoPtr pScrn, char **DeviceName,
unsigned char **ApertureBase, int *ApertureSize,
int *ApertureOffset, int *flags)
{
*DeviceName = NULL; /* No special device */
*ApertureBase = (unsigned char *)(pScrn->memPhysBase);
*ApertureSize = pScrn->videoRam;
*ApertureOffset = pScrn->fbOffset;
*flags = 0;
return TRUE;
}
static Bool VoodooDGASetMode(ScrnInfoPtr pScrn, DGAModePtr pDGAMode)
{
DisplayModePtr pMode;
int scrnIdx = pScrn->pScreen->myNum;
int frameX0, frameY0;
if (pDGAMode) {
pMode = pDGAMode->mode;
frameX0 = frameY0 = 0;
}
else {
if (!(pMode = pScrn->currentMode))
return TRUE;
frameX0 = pScrn->frameX0;
frameY0 = pScrn->frameY0;
}
if (!(*pScrn->SwitchMode)(scrnIdx, pMode, 0))
return FALSE;
return TRUE;
}
static int VoodooDGAGetViewport(ScrnInfoPtr pScrn)
{
return (0);
}
static DGAFunctionRec VoodooDGAFunctions =
{
VoodooDGAOpenFramebuffer,
NULL, /* CloseFramebuffer */
VoodooDGASetMode,
NULL,
VoodooDGAGetViewport,
/* TODO - can do Sync/blit/fill on Voodoo2 */
NULL, /* Sync */
NULL, /* FillRect */
NULL, /* BlitRect */
NULL, /* BlitTransRect */
};
static void VoodooDGAAddModes(ScrnInfoPtr pScrn)
{
VoodooPtr pVoo = VoodooPTR(pScrn);
DisplayModePtr pMode = pScrn->modes;
DGAModePtr pDGAMode;
do {
pDGAMode = xrealloc(pVoo->pDGAMode,
(pVoo->nDGAMode + 1) * sizeof(DGAModeRec));
if (!pDGAMode)
break;
pVoo->pDGAMode = pDGAMode;
pDGAMode += pVoo->nDGAMode;
(void)memset(pDGAMode, 0, sizeof(DGAModeRec));
++pVoo->nDGAMode;
pDGAMode->mode = pMode;
pDGAMode->flags = DGA_CONCURRENT_ACCESS | DGA_PIXMAP_AVAILABLE;
pDGAMode->byteOrder = pScrn->imageByteOrder;
pDGAMode->depth = pScrn->depth;
pDGAMode->bitsPerPixel = pScrn->bitsPerPixel;
pDGAMode->red_mask = pScrn->mask.red;
pDGAMode->green_mask = pScrn->mask.green;
pDGAMode->blue_mask = pScrn->mask.blue;
pDGAMode->visualClass = TrueColor;
pDGAMode->xViewportStep = 1;
pDGAMode->yViewportStep = 1;
pDGAMode->viewportWidth = pMode->HDisplay;
pDGAMode->viewportHeight = pMode->VDisplay;
pDGAMode->bytesPerScanline = 2048;
pDGAMode->imageWidth = pMode->HDisplay;
pDGAMode->imageHeight = pMode->VDisplay;
pDGAMode->pixmapWidth = pDGAMode->imageWidth;
pDGAMode->pixmapHeight = pDGAMode->imageHeight;
pDGAMode->maxViewportX = pScrn->virtualX -
pDGAMode->viewportWidth;
pDGAMode->maxViewportY = pScrn->virtualY -
pDGAMode->viewportHeight;
pDGAMode->address = pVoo->FBBase;
pMode = pMode->next;
} while (pMode != pScrn->modes);
}
Bool VoodooDGAInit(ScrnInfoPtr pScrn, ScreenPtr pScreen)
{
VoodooPtr pVoo = VoodooPTR(pScrn);
if (!pVoo->nDGAMode)
VoodooDGAAddModes(pScrn);
return (DGAInit(pScreen, &VoodooDGAFunctions,
pVoo->pDGAMode, pVoo->nDGAMode));
}