2005-07-11 04:29:47 +02:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
#include "config.h"
|
|
|
|
#endif
|
|
|
|
|
2003-11-14 17:48:55 +01:00
|
|
|
#include "xf86.h"
|
|
|
|
#include "xf86_OSproc.h"
|
|
|
|
#include "dgaproc.h"
|
|
|
|
#include "dummy.h"
|
|
|
|
|
|
|
|
static Bool DUMMY_OpenFramebuffer(ScrnInfoPtr, char **, unsigned char **,
|
|
|
|
int *, int *, int *);
|
|
|
|
static Bool DUMMY_SetMode(ScrnInfoPtr, DGAModePtr);
|
|
|
|
static int DUMMY_GetViewport(ScrnInfoPtr);
|
|
|
|
static void DUMMY_SetViewport(ScrnInfoPtr, int, int, int);
|
|
|
|
|
|
|
|
static
|
|
|
|
DGAFunctionRec DUMMYDGAFuncs = {
|
|
|
|
DUMMY_OpenFramebuffer,
|
|
|
|
NULL,
|
|
|
|
DUMMY_SetMode,
|
|
|
|
DUMMY_SetViewport,
|
|
|
|
DUMMY_GetViewport,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
#if 0
|
|
|
|
DUMMY_BlitTransRect
|
|
|
|
#else
|
|
|
|
NULL
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
|
|
|
|
Bool
|
|
|
|
DUMMYDGAInit(ScreenPtr pScreen)
|
|
|
|
{
|
|
|
|
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
|
|
|
|
DUMMYPtr pDUMMY = DUMMYPTR(pScrn);
|
|
|
|
DGAModePtr modes = NULL, newmodes = NULL, currentMode;
|
|
|
|
DisplayModePtr pMode, firstMode;
|
|
|
|
int Bpp = pScrn->bitsPerPixel >> 3;
|
|
|
|
int num = 0, imlines, pixlines;
|
|
|
|
|
|
|
|
imlines = (pScrn->videoRam * 1024) /
|
|
|
|
(pScrn->displayWidth * (pScrn->bitsPerPixel >> 3));
|
|
|
|
|
|
|
|
pixlines = imlines;
|
|
|
|
|
|
|
|
pMode = firstMode = pScrn->modes;
|
|
|
|
|
|
|
|
while(pMode) {
|
|
|
|
|
|
|
|
newmodes = xrealloc(modes, (num + 1) * sizeof(DGAModeRec));
|
|
|
|
|
|
|
|
if(!newmodes) {
|
|
|
|
xfree(modes);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
modes = newmodes;
|
|
|
|
|
|
|
|
currentMode = modes + num;
|
|
|
|
num++;
|
|
|
|
|
|
|
|
currentMode->mode = pMode;
|
|
|
|
currentMode->flags = DGA_CONCURRENT_ACCESS | DGA_PIXMAP_AVAILABLE;
|
|
|
|
if(pMode->Flags & V_DBLSCAN)
|
|
|
|
currentMode->flags |= DGA_DOUBLESCAN;
|
|
|
|
if(pMode->Flags & V_INTERLACE)
|
|
|
|
currentMode->flags |= DGA_INTERLACED;
|
|
|
|
currentMode->byteOrder = pScrn->imageByteOrder;
|
|
|
|
currentMode->depth = pScrn->depth;
|
|
|
|
currentMode->bitsPerPixel = pScrn->bitsPerPixel;
|
|
|
|
currentMode->red_mask = pScrn->mask.red;
|
|
|
|
currentMode->green_mask = pScrn->mask.green;
|
|
|
|
currentMode->blue_mask = pScrn->mask.blue;
|
|
|
|
currentMode->visualClass = (Bpp == 1) ? PseudoColor : TrueColor;
|
|
|
|
currentMode->viewportWidth = pMode->HDisplay;
|
|
|
|
currentMode->viewportHeight = pMode->VDisplay;
|
|
|
|
currentMode->xViewportStep = 1;
|
|
|
|
currentMode->yViewportStep = 1;
|
|
|
|
currentMode->viewportFlags = DGA_FLIP_RETRACE;
|
|
|
|
currentMode->offset = 0;
|
|
|
|
currentMode->address = (unsigned char *)pDUMMY->FBBase;
|
|
|
|
|
|
|
|
currentMode->bytesPerScanline =
|
|
|
|
((pScrn->displayWidth * Bpp) + 3) & ~3L;
|
|
|
|
currentMode->imageWidth = pScrn->displayWidth;
|
|
|
|
currentMode->imageHeight = imlines;
|
|
|
|
currentMode->pixmapWidth = currentMode->imageWidth;
|
|
|
|
currentMode->pixmapHeight = pixlines;
|
|
|
|
currentMode->maxViewportX = currentMode->imageWidth -
|
|
|
|
currentMode->viewportWidth;
|
|
|
|
currentMode->maxViewportY = currentMode->imageHeight -
|
|
|
|
currentMode->viewportHeight;
|
|
|
|
|
|
|
|
pMode = pMode->next;
|
|
|
|
if(pMode == firstMode)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
pDUMMY->numDGAModes = num;
|
|
|
|
pDUMMY->DGAModes = modes;
|
|
|
|
|
|
|
|
return DGAInit(pScreen, &DUMMYDGAFuncs, modes, num);
|
|
|
|
}
|
|
|
|
|
|
|
|
static DisplayModePtr DUMMYSavedDGAModes[MAXSCREENS];
|
|
|
|
|
|
|
|
static Bool
|
|
|
|
DUMMY_SetMode(
|
|
|
|
ScrnInfoPtr pScrn,
|
|
|
|
DGAModePtr pMode
|
|
|
|
){
|
|
|
|
int index = pScrn->pScreen->myNum;
|
|
|
|
DUMMYPtr pDUMMY = DUMMYPTR(pScrn);
|
|
|
|
|
|
|
|
if(!pMode) { /* restore the original mode */
|
|
|
|
if(pDUMMY->DGAactive) {
|
|
|
|
pScrn->currentMode = DUMMYSavedDGAModes[index];
|
|
|
|
DUMMYSwitchMode(index, pScrn->currentMode, 0);
|
|
|
|
DUMMYAdjustFrame(index, 0, 0, 0);
|
|
|
|
pDUMMY->DGAactive = FALSE;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if(!pDUMMY->DGAactive) { /* save the old parameters */
|
|
|
|
DUMMYSavedDGAModes[index] = pScrn->currentMode;
|
|
|
|
pDUMMY->DGAactive = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
DUMMYSwitchMode(index, pMode->mode, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
DUMMY_GetViewport(
|
|
|
|
ScrnInfoPtr pScrn
|
|
|
|
){
|
|
|
|
DUMMYPtr pDUMMY = DUMMYPTR(pScrn);
|
|
|
|
|
|
|
|
return pDUMMY->DGAViewportStatus;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
DUMMY_SetViewport(
|
|
|
|
ScrnInfoPtr pScrn,
|
|
|
|
int x, int y,
|
|
|
|
int flags
|
|
|
|
){
|
|
|
|
DUMMYPtr pDUMMY = DUMMYPTR(pScrn);
|
|
|
|
|
|
|
|
DUMMYAdjustFrame(pScrn->pScreen->myNum, x, y, flags);
|
|
|
|
pDUMMY->DGAViewportStatus = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static Bool
|
|
|
|
DUMMY_OpenFramebuffer(
|
|
|
|
ScrnInfoPtr pScrn,
|
|
|
|
char **name,
|
|
|
|
unsigned char **mem,
|
|
|
|
int *size,
|
|
|
|
int *offset,
|
|
|
|
int *flags
|
|
|
|
){
|
|
|
|
DUMMYPtr pDUMMY = DUMMYPTR(pScrn);
|
|
|
|
|
|
|
|
*name = NULL; /* no special device */
|
|
|
|
*mem = (unsigned char*)pDUMMY->FBBase;
|
|
|
|
*size = pScrn->videoRam * 1024;
|
|
|
|
*offset = 0;
|
|
|
|
*flags = DGA_NEED_ROOT;
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|