diff options
Diffstat (limited to 'xc/programs/Xserver/hw/kdrive/kdrive.c')
-rw-r--r-- | xc/programs/Xserver/hw/kdrive/kdrive.c | 130 |
1 files changed, 100 insertions, 30 deletions
diff --git a/xc/programs/Xserver/hw/kdrive/kdrive.c b/xc/programs/Xserver/hw/kdrive/kdrive.c index d2e70ce65..83107c2af 100644 --- a/xc/programs/Xserver/hw/kdrive/kdrive.c +++ b/xc/programs/Xserver/hw/kdrive/kdrive.c @@ -21,7 +21,7 @@ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ -/* $XFree86: xc/programs/Xserver/hw/kdrive/kdrive.c,v 1.3 2000/02/23 20:29:53 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/kdrive/kdrive.c,v 1.5 2000/05/24 23:57:56 keithp Exp $ */ #include "kdrive.h" #ifdef PSEUDO8 @@ -58,7 +58,7 @@ KdSetRootClip (ScreenPtr pScreen, BOOL enable) #ifndef FB_OLD_SCREEN WindowPtr pWin = WindowTable[pScreen->myNum]; WindowPtr pChild; - Bool WasViewable = (Bool)(pWin->viewable); + Bool WasViewable; Bool anyMarked; RegionPtr pOldClip, bsExposed; #ifdef DO_SAVE_UNDERS @@ -67,6 +67,9 @@ KdSetRootClip (ScreenPtr pScreen, BOOL enable) WindowPtr pLayerWin; BoxRec box; + if (!pWin) + return; + WasViewable = (Bool)(pWin->viewable); if (WasViewable) { for (pChild = pWin->firstChild; pChild; pChild = pChild->nextSib) @@ -301,10 +304,14 @@ void KdParseScreen (KdScreenInfo *screen, char *arg) { + char *bpp; + int fb; + screen->width = 0; screen->height = 0; - screen->depth = 0; screen->rate = 0; + for (fb = 0; fb < KD_MAX_FB; fb++) + screen->fb[fb].depth = 0; if (!arg) return; @@ -320,7 +327,27 @@ KdParseScreen (KdScreenInfo *screen, return; arg++; - screen->depth = atoi(arg); + fb = 0; + while (fb < KD_MAX_FB) + { + screen->fb[fb].depth = atoi(arg); + + bpp = strchr (arg, '/'); + if (bpp) + { + bpp++; + screen->fb[fb].bitsPerPixel = atoi(bpp); + arg = bpp; + } + else + screen->fb[fb].bitsPerPixel = 0; + bpp = strchr (arg, ','); + if (!bpp) + break; + arg = bpp+1; + fb++; + } + arg = strchr (arg, 'x'); if (!arg) return; @@ -551,7 +578,7 @@ KdCreateWindow (WindowPtr pWin) } } #endif - return TRUE; + return fbCreateWindow (pWin); } /* Pass through AddScreen, which doesn't take any closure */ @@ -563,6 +590,7 @@ KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv) KdScreenInfo *screen = kdCurrentScreen; KdCardInfo *card = screen->card; KdPrivScreenPtr pScreenPriv; + int fb; KdAllocatePrivates (pScreen); @@ -571,7 +599,8 @@ KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv) screen->pScreen = pScreen; pScreenPriv->screen = screen; pScreenPriv->card = card; - pScreenPriv->bytesPerPixel = screen->bitsPerPixel >> 3; + for (fb = 0; fb < KD_MAX_FB && screen->fb[fb].depth; fb++) + pScreenPriv->bytesPerPixel[fb] = screen->fb[fb].bitsPerPixel >> 3; pScreenPriv->dpmsState = KD_DPMS_NORMAL; /* @@ -580,11 +609,11 @@ KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv) * backing store */ if (!fbSetupScreen (pScreen, - screen->frameBuffer, + screen->fb[0].frameBuffer, screen->width, screen->height, screen->dpix, screen->dpiy, - screen->pixelStride, - screen->bitsPerPixel)) + screen->fb[0].pixelStride, + screen->fb[0].bitsPerPixel)) { return FALSE; } @@ -608,14 +637,34 @@ KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv) pScreenPriv->BackingStoreFuncs.GetSpansPixmap = 0; #endif - if (!fbFinishScreenInit (pScreen, - screen->frameBuffer, - screen->width, screen->height, - screen->dpix, screen->dpiy, - screen->pixelStride, - screen->bitsPerPixel)) + if (screen->fb[1].depth) + { + if (!fbOverlayFinishScreenInit (pScreen, + screen->fb[0].frameBuffer, + screen->fb[1].frameBuffer, + screen->width, screen->height, + screen->dpix, screen->dpiy, + screen->fb[0].pixelStride, + screen->fb[1].pixelStride, + screen->fb[0].bitsPerPixel, + screen->fb[1].bitsPerPixel, + screen->fb[0].depth, + screen->fb[1].depth)) + { + return FALSE; + } + } + else { - return FALSE; + if (!fbFinishScreenInit (pScreen, + screen->fb[0].frameBuffer, + screen->width, screen->height, + screen->dpix, screen->dpiy, + screen->fb[0].pixelStride, + screen->fb[0].bitsPerPixel)) + { + return FALSE; + } } /* @@ -720,6 +769,8 @@ KdSetPixmapFormats (ScreenInfo *pScreenInfo) KdCardInfo *card; KdScreenInfo *screen; int i; + int bpp; + int fb; PixmapFormatRec *format; for (i = 1; i <= 32; i++) @@ -735,10 +786,16 @@ KdSetPixmapFormats (ScreenInfo *pScreenInfo) { for (screen = card->screenList; screen; screen = screen->next) { - if (!depthToBpp[screen->depth]) - depthToBpp[screen->depth] = screen->bitsPerPixel; - else if (depthToBpp[screen->depth] != screen->bitsPerPixel) - return FALSE; + for (fb = 0; fb < KD_MAX_FB && screen->fb[fb].depth; fb++) + { + bpp = screen->fb[fb].bitsPerPixel; + if (bpp == 24) + bpp = 32; + if (!depthToBpp[screen->fb[fb].depth]) + depthToBpp[screen->fb[fb].depth] = bpp; + else if (depthToBpp[screen->fb[fb].depth] != bpp) + return FALSE; + } } } @@ -784,18 +841,20 @@ KdAddScreen (ScreenInfo *pScreenInfo, { unsigned long visuals; Pixel rm, gm, bm; + int fb; - if (pScreenInfo->formats[i].depth == screen->depth) - { - visuals = screen->visuals; - rm = screen->redMask; - gm = screen->greenMask; - bm = screen->blueMask; - } - else + visuals = 0; + rm = gm = bm = 0; + for (fb = 0; fb < KD_MAX_FB && screen->fb[fb].depth; fb++) { - visuals = 0; - rm = gm = bm = 0; + if (pScreenInfo->formats[i].depth == screen->fb[fb].depth) + { + visuals = screen->fb[fb].visuals; + rm = screen->fb[fb].redMask; + gm = screen->fb[fb].greenMask; + bm = screen->fb[fb].blueMask; + break; + } } fbSetVisualTypesAndMasks (pScreenInfo->formats[i].depth, visuals, @@ -808,6 +867,17 @@ KdAddScreen (ScreenInfo *pScreenInfo, AddScreen (KdScreenInit, argc, argv); } +int +KdDepthToFb (ScreenPtr pScreen, int depth) +{ + KdScreenPriv(pScreen); + int fb; + + for (fb = 0; fb <= KD_MAX_FB && pScreenPriv->screen->fb[fb].frameBuffer; fb++) + if (pScreenPriv->screen->fb[fb].depth == depth) + return fb; +} + void KdInitOutput (ScreenInfo *pScreenInfo, int argc, |