diff options
Diffstat (limited to 'hw/kdrive/fbdev/fbdev.c')
-rw-r--r-- | hw/kdrive/fbdev/fbdev.c | 311 |
1 files changed, 91 insertions, 220 deletions
diff --git a/hw/kdrive/fbdev/fbdev.c b/hw/kdrive/fbdev/fbdev.c index e9ab57454..cb0a1b399 100644 --- a/hw/kdrive/fbdev/fbdev.c +++ b/hw/kdrive/fbdev/fbdev.c @@ -29,9 +29,6 @@ #include "fbdev.h" #include <sys/ioctl.h> -/* this code was used to debug MSB 24bpp code on a 16bpp frame buffer */ -#undef FAKE24_ON_16 - extern int KdTsPhyScreen; Bool @@ -114,9 +111,6 @@ fbdevScreenInitialize (KdScreenInfo *screen, FbdevScrPriv *scrpriv) Pixel allbits; int depth; Bool gray; -#ifdef FAKE24_ON_16 - Bool fake24; -#endif depth = priv->var.bits_per_pixel; gray = priv->var.grayscale; @@ -190,35 +184,8 @@ fbdevScreenInitialize (KdScreenInfo *screen, FbdevScrPriv *scrpriv) } screen->rate = 72; scrpriv->randr = screen->randr; - scrpriv->layerKind = LAYER_FB; -#ifdef FAKE24_ON_16 - if (screen->fb[0].depth == 24 && screen->fb[0].bitsPerPixel == 24 && - priv->var.bits_per_pixel == 16) - { - fake24 = TRUE; - scrpriv->shadow = TRUE; - scrpriv->rotation = 0; - screen->fb[0].redMask = 0xff0000; - screen->fb[0].greenMask = 0x00ff00; - screen->fb[0].blueMask = 0x0000ff; - screen->width = priv->var.xres; - screen->height = priv->var.yres; - screen->softCursor = TRUE; - } - else -#endif - { - screen->fb[0].depth = depth; - screen->fb[0].bitsPerPixel = priv->var.bits_per_pixel; - screen->width = priv->var.xres; - screen->height = priv->var.yres; - screen->fb[0].byteStride = priv->fix.line_length; - screen->fb[0].pixelStride = (priv->fix.line_length * 8 / - priv->var.bits_per_pixel); - screen->fb[0].frameBuffer = (CARD8 *) (priv->fb); - } - return TRUE; + return fbdevMapFramebuffer (screen); } Bool @@ -256,173 +223,94 @@ fbdevWindowLinear (ScreenPtr pScreen, return (CARD8 *) priv->fb + row * priv->fix.line_length + offset; } -#ifdef FAKE24_ON_16 -void -fbdevUpdateFake24 (ScreenPtr pScreen, - PixmapPtr pShadow, - RegionPtr damage) +Bool +fbdevMapFramebuffer (KdScreenInfo *screen) { - shadowScrPriv(pScreen); - int nbox = REGION_NUM_RECTS (damage); - BoxPtr pbox = REGION_RECTS (damage); - FbBits *shaBits; - CARD8 *shaBase, *shaLine, *sha; - CARD16 s; - FbStride shaStride; - int scrBase, scrLine, scr; - int shaBpp; - int x, y, w, h, width; - int i; - CARD16 *winBase, *winLine, *win; - CARD32 winSize; - - fbGetDrawable (&pShadow->drawable, shaBits, shaStride, shaBpp); - shaStride = shaStride * sizeof (FbBits) / sizeof (CARD8); - shaBase = (CARD8 *) shaBits; - while (nbox--) + FbdevScrPriv *scrpriv = screen->driver; + KdMouseMatrix m; + FbdevPriv *priv = screen->card->driver; + + if (scrpriv->randr != RR_Rotate_0) + scrpriv->shadow = TRUE; + else + scrpriv->shadow = FALSE; + + KdComputeMouseMatrix (&m, scrpriv->randr, screen->width, screen->height); + + KdSetMouseMatrix (&m); + + screen->width = priv->var.xres; + screen->height = priv->var.yres; + screen->memory_base = (CARD8 *) (priv->fb); + screen->memory_size = 0; + screen->off_screen_base = 0; + screen->fb[0].depth = priv->var.bits_per_pixel; + screen->fb[0].bitsPerPixel = priv->var.bits_per_pixel; + + if (scrpriv->shadow) { - x = pbox->x1; - y = pbox->y1; - w = (pbox->x2 - pbox->x1); - h = pbox->y2 - pbox->y1; - - shaLine = shaBase + y * shaStride + x * 3; - - while (h--) - { - winSize = 0; - scrBase = 0; - width = w; - scr = x; - sha = shaLine; - while (width) { - /* how much remains in this window */ - i = scrBase + winSize - scr; - if (i <= 0 || scr < scrBase) - { - winBase = (CARD16 *) (*pScrPriv->window) (pScreen, - y, - scr * sizeof (CARD16), - SHADOW_WINDOW_WRITE, - &winSize); - if(!winBase) - return; - scrBase = scr; - winSize /= sizeof (CARD16); - i = winSize; - } - win = winBase + (scr - scrBase); - if (i > width) - i = width; - width -= i; - scr += i; - while (i--) - { -#if IMAGE_BYTE_ORDER == MSBFirst - *win++ = ((sha[2] >> 3) | - ((sha[1] & 0xf8) << 2) | - ((sha[0] & 0xf8) << 7)); -#else - *win++ = ((sha[0] >> 3) | - ((sha[1] & 0xfc) << 3) | - ((sha[2] & 0xf8) << 8)); -#endif - sha += 3; - } - } - shaLine += shaStride; - y++; - } - pbox++; + if (!KdShadowFbAlloc (screen, 0, + scrpriv->randr & (RR_Rotate_90|RR_Rotate_270))) + return FALSE; + } + else + { + screen->fb[0].byteStride = priv->fix.line_length; + screen->fb[0].pixelStride = (priv->fix.line_length * 8 / + priv->var.bits_per_pixel); + screen->fb[0].frameBuffer = (CARD8 *) (priv->fb); } + + return TRUE; } -#endif /* FAKE24_ON_16 */ void -fbdevConfigureScreen (ScreenPtr pScreen) +fbdevSetScreenSizes (ScreenPtr pScreen) { KdScreenPriv(pScreen); KdScreenInfo *screen = pScreenPriv->screen; FbdevScrPriv *scrpriv = screen->driver; - KdMouseMatrix m; + FbdevPriv *priv = screen->card->driver; -#ifdef FAKE24_ON_16 - if (fake24) - { - scrpriv->randr = RR_Rotate_0; - scrpriv->shadow = TRUE; - } - else -#endif /* FAKE24_ON_16 */ + if (scrpriv->randr & (RR_Rotate_0|RR_Rotate_180)) { - if (scrpriv->randr != RR_Rotate_0) - scrpriv->shadow = TRUE; - else - scrpriv->shadow = FALSE; - } - - KdComputeMouseMatrix (&m, scrpriv->randr, screen->width, screen->height); - - if (m.matrix[0][0]) - { - pScreen->width = screen->width; - pScreen->height = screen->height; + pScreen->width = priv->var.xres; + pScreen->height = priv->var.yres; pScreen->mmWidth = screen->width_mm; pScreen->mmHeight = screen->height_mm; } else { - pScreen->width = screen->height; - pScreen->height = screen->width; + pScreen->width = priv->var.yres; + pScreen->height = priv->var.xres; pScreen->mmWidth = screen->height_mm; pScreen->mmHeight = screen->width_mm; } - KdSetMouseMatrix (&m); } -LayerPtr -fbdevLayerCreate (ScreenPtr pScreen) +Bool +fbdevUnmapFramebuffer (KdScreenInfo *screen) +{ + KdShadowFbFree (screen, 0); + return TRUE; +} + +Bool +fbdevSetShadow (ScreenPtr pScreen) { KdScreenPriv(pScreen); KdScreenInfo *screen = pScreenPriv->screen; FbdevScrPriv *scrpriv = screen->driver; ShadowUpdateProc update; ShadowWindowProc window; - PixmapPtr pPixmap; - int kind; - if (scrpriv->shadow) - { - window = fbdevWindowLinear; - update = 0; -#ifdef FAKE24_ON_16 - if (pScreenPriv->screen->fb[0].bitsPerPixel == 24 && priv->var.bits_per_pixel == 16) - { - update = fbdevUpdateFake24; - } - else -#endif /* FAKE24_ON_16 */ - { - if (scrpriv->randr) - update = shadowUpdateRotatePacked; - else - update = shadowUpdatePacked; - } - if (!update) - abort (); - kind = LAYER_SHADOW; - pPixmap = 0; - } + window = fbdevWindowLinear; + update = 0; + if (scrpriv->randr) + update = shadowUpdateRotatePacked; else - { - kind = scrpriv->layerKind; - pPixmap = LAYER_SCREEN_PIXMAP; - update = 0; - window = 0; - } - - return LayerCreate (pScreen, kind, screen->fb[0].depth, - pPixmap, update, window, scrpriv->randr, 0); + update = shadowUpdatePacked; + return KdShadowSet (pScreen, scrpriv->randr, update, window); } @@ -458,29 +346,6 @@ fbdevRandRGetInfo (ScreenPtr pScreen, Rotation *rotations) return TRUE; } -int -fbdevLayerAdd (WindowPtr pWin, pointer value) -{ - ScreenPtr pScreen = pWin->drawable.pScreen; - LayerPtr pLayer = (LayerPtr) value; - - if (!LayerWindowAdd (pScreen, pLayer, pWin)) - return WT_STOPWALKING; - - return WT_WALKCHILDREN; -} - -int -fbdevLayerRemove (WindowPtr pWin, pointer value) -{ - ScreenPtr pScreen = pWin->drawable.pScreen; - LayerPtr pLayer = (LayerPtr) value; - - LayerWindowRemove (pScreen, pLayer, pWin); - - return WT_WALKCHILDREN; -} - Bool fbdevRandRSetConfig (ScreenPtr pScreen, Rotation randr, @@ -496,7 +361,6 @@ fbdevRandRSetConfig (ScreenPtr pScreen, int oldheight; int oldmmwidth; int oldmmheight; - LayerPtr pNewLayer; int newwidth, newheight; if (screen->randr & (RR_Rotate_0|RR_Rotate_180)) @@ -526,34 +390,46 @@ fbdevRandRSetConfig (ScreenPtr pScreen, scrpriv->randr = KdAddRotation (screen->randr, randr); - fbdevConfigureScreen (pScreen); + KdOffscreenSwapOut (screen->pScreen); - pNewLayer = fbdevLayerCreate (pScreen); - if (!pNewLayer) + fbdevUnmapFramebuffer (screen); + + if (!fbdevMapFramebuffer (screen)) goto bail4; - if (WalkTree (pScreen, fbdevLayerAdd, (pointer) pNewLayer) == WT_STOPWALKING) - goto bail5; - WalkTree (pScreen, fbdevLayerRemove, (pointer) scrpriv->pLayer); - LayerDestroy (pScreen, scrpriv->pLayer); + if (!fbdevSetShadow (screen->pScreen)) + goto bail4; - scrpriv->pLayer = pNewLayer; + fbdevSetScreenSizes (screen->pScreen); + /* + * Set frame buffer mapping + */ + (*pScreen->ModifyPixmapHeader) (fbGetScreenPixmap (pScreen), + pScreen->width, + pScreen->height, + screen->fb[0].depth, + screen->fb[0].bitsPerPixel, + screen->fb[0].byteStride, + screen->fb[0].frameBuffer); + + /* set the subpixel order */ + KdSetSubpixelOrder (pScreen, scrpriv->randr); if (wasEnabled) KdEnableScreen (pScreen); return TRUE; -bail5: - WalkTree (pScreen, fbdevLayerRemove, (pointer) pNewLayer); - LayerDestroy (pScreen, pNewLayer); bail4: + fbdevUnmapFramebuffer (screen); + *scrpriv = oldscr; + (void) fbdevMapFramebuffer (screen); pScreen->width = oldwidth; pScreen->height = oldheight; pScreen->mmWidth = oldmmwidth; pScreen->mmHeight = oldmmheight; - *scrpriv = oldscr; + if (wasEnabled) KdEnableScreen (pScreen); return FALSE; @@ -616,27 +492,15 @@ fbdevInitScreen (ScreenPtr pScreen) #endif pScreen->CreateColormap = fbdevCreateColormap; - - if (!LayerStartInit (pScreen)) - return FALSE; return TRUE; } Bool fbdevFinishInitScreen (ScreenPtr pScreen) { - KdScreenPriv(pScreen); - FbdevScrPriv *scrpriv = pScreenPriv->screen->driver; - - scrpriv->layerKind = LayerNewKind (pScreen); - - if (!LayerFinishInit (pScreen)) + if (!shadowSetup (pScreen)) return FALSE; - scrpriv->pLayer = fbdevLayerCreate (pScreen); - if (!scrpriv->pLayer) - return FALSE; - #ifdef RANDR if (!fbdevRandRInit (pScreen)) return FALSE; @@ -645,6 +509,13 @@ fbdevFinishInitScreen (ScreenPtr pScreen) return TRUE; } + +Bool +fbdevCreateResources (ScreenPtr pScreen) +{ + return fbdevSetShadow (pScreen); +} + void fbdevPreserve (KdCardInfo *card) { |