summaryrefslogtreecommitdiff
path: root/hw/kdrive/fbdev/fbdev.c
diff options
context:
space:
mode:
Diffstat (limited to 'hw/kdrive/fbdev/fbdev.c')
-rw-r--r--hw/kdrive/fbdev/fbdev.c311
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)
{