mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2025-12-25 15:20:05 +01:00
Add function called at CreateScreenResources to get shadow set up on pixmap
correctly. Rework vesa and fbdev code to handle shadows right with the
non-layer world.
Use GetScreenPixmap directly for damage detection of sprite. Avoids
problems during server shutdown with windows disappearing before the
sprite layer is closed.
This commit is contained in:
parent
d5b176b2d4
commit
faa7c94689
20 changed files with 351 additions and 419 deletions
|
|
@ -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;
|
||||
|
|
@ -191,33 +185,7 @@ fbdevScreenInitialize (KdScreenInfo *screen, FbdevScrPriv *scrpriv)
|
|||
screen->rate = 72;
|
||||
scrpriv->randr = screen->randr;
|
||||
|
||||
#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
|
||||
|
|
@ -255,177 +223,93 @@ 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;
|
||||
FbdevScrPriv *scrpriv = screen->driver;
|
||||
KdMouseMatrix m;
|
||||
FbdevPriv *priv = screen->card->driver;
|
||||
|
||||
fbGetDrawable (&pShadow->drawable, shaBits, shaStride, shaBpp);
|
||||
shaStride = shaStride * sizeof (FbBits) / sizeof (CARD8);
|
||||
shaBase = (CARD8 *) shaBits;
|
||||
while (nbox--)
|
||||
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)
|
||||
if (scrpriv->randr & (RR_Rotate_0|RR_Rotate_180))
|
||||
{
|
||||
scrpriv->randr = RR_Rotate_0;
|
||||
scrpriv->shadow = TRUE;
|
||||
}
|
||||
else
|
||||
#endif /* FAKE24_ON_16 */
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
PixmapPtr
|
||||
fbdevGetPixmap (ScreenPtr pScreen)
|
||||
Bool
|
||||
fbdevUnmapFramebuffer (KdScreenInfo *screen)
|
||||
{
|
||||
KdShadowFbFree (screen, 0);
|
||||
}
|
||||
|
||||
Bool
|
||||
fbdevSetShadow (ScreenPtr pScreen)
|
||||
{
|
||||
KdScreenPriv(pScreen);
|
||||
KdScreenInfo *screen = pScreenPriv->screen;
|
||||
FbdevScrPriv *scrpriv = screen->driver;
|
||||
ShadowUpdateProc update;
|
||||
ShadowWindowProc window;
|
||||
PixmapPtr pShadow, pPixmap;
|
||||
|
||||
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;
|
||||
}
|
||||
pPixmap = (*pScreen->CreatePixmap) (pScreen,
|
||||
pScreen->width,
|
||||
pScreen->height,
|
||||
screen->fb[0].depth);
|
||||
if (!pPixmap)
|
||||
return FALSE;
|
||||
shadowSet (pScreen, pPixmap, update, window, scrpriv->randr, 0);
|
||||
pShadow = pPixmap;
|
||||
}
|
||||
window = fbdevWindowLinear;
|
||||
update = 0;
|
||||
if (scrpriv->randr)
|
||||
update = shadowUpdateRotatePacked;
|
||||
else
|
||||
{
|
||||
pPixmap = (*pScreen->GetScreenPixmap) (pScreen);
|
||||
pShadow = 0;
|
||||
}
|
||||
|
||||
if (scrpriv->pShadow)
|
||||
(*pScreen->DestroyPixmap) (scrpriv->pShadow);
|
||||
scrpriv->pShadow = pShadow;
|
||||
|
||||
return pPixmap;
|
||||
update = shadowUpdatePacked;
|
||||
return KdShadowSet (pScreen, scrpriv->randr, update, window);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -461,16 +345,6 @@ fbdevRandRGetInfo (ScreenPtr pScreen, Rotation *rotations)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
int
|
||||
fbdevPixmapSet (WindowPtr pWin, pointer value)
|
||||
{
|
||||
ScreenPtr pScreen = pWin->drawable.pScreen;
|
||||
PixmapPtr pPixmap = value;
|
||||
|
||||
(*pScreen->SetWindowPixmap) (pWin, pPixmap);
|
||||
return WT_WALKCHILDREN;
|
||||
}
|
||||
|
||||
Bool
|
||||
fbdevRandRSetConfig (ScreenPtr pScreen,
|
||||
Rotation randr,
|
||||
|
|
@ -516,16 +390,30 @@ fbdevRandRSetConfig (ScreenPtr pScreen,
|
|||
|
||||
scrpriv->randr = KdAddRotation (screen->randr, randr);
|
||||
|
||||
fbdevConfigureScreen (pScreen);
|
||||
KdOffscreenSwapOut (screen->pScreen);
|
||||
|
||||
/*
|
||||
* Get the pixmap that windows live in
|
||||
*/
|
||||
pPixmap = fbdevGetPixmap (pScreen);
|
||||
if (!pPixmap)
|
||||
fbdevUnmapFramebuffer (screen);
|
||||
|
||||
if (!fbdevMapFramebuffer (screen))
|
||||
goto bail4;
|
||||
|
||||
WalkTree (pScreen, fbdevPixmapSet, (pointer) pPixmap);
|
||||
if (!fbdevSetShadow (screen->pScreen))
|
||||
goto bail4;
|
||||
|
||||
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)
|
||||
|
|
@ -534,11 +422,14 @@ fbdevRandRSetConfig (ScreenPtr pScreen,
|
|||
return TRUE;
|
||||
|
||||
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;
|
||||
|
|
@ -601,18 +492,13 @@ fbdevInitScreen (ScreenPtr pScreen)
|
|||
#endif
|
||||
|
||||
pScreen->CreateColormap = fbdevCreateColormap;
|
||||
return shadowSetup (pScreen);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
Bool
|
||||
fbdevFinishInitScreen (ScreenPtr pScreen)
|
||||
{
|
||||
PixmapPtr pPixmap;
|
||||
|
||||
fbdevConfigureScreen (pScreen);
|
||||
|
||||
pPixmap = fbdevGetPixmap (pScreen);
|
||||
if (!pPixmap)
|
||||
if (!shadowSetup (pScreen))
|
||||
return FALSE;
|
||||
|
||||
#ifdef RANDR
|
||||
|
|
@ -623,6 +509,13 @@ fbdevFinishInitScreen (ScreenPtr pScreen)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
Bool
|
||||
fbdevCreateResources (ScreenPtr pScreen)
|
||||
{
|
||||
return fbdevSetShadow (pScreen);
|
||||
}
|
||||
|
||||
void
|
||||
fbdevPreserve (KdCardInfo *card)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -69,6 +69,12 @@ fbdevScreenInitialize (KdScreenInfo *screen, FbdevScrPriv *scrpriv);
|
|||
Bool
|
||||
fbdevInitScreen (ScreenPtr pScreen);
|
||||
|
||||
Bool
|
||||
fbdevFinishInitScreen (ScreenPtr pScreen);
|
||||
|
||||
Bool
|
||||
fbdevCreateResources (ScreenPtr pScreen);
|
||||
|
||||
void
|
||||
fbdevPreserve (KdCardInfo *card);
|
||||
|
||||
|
|
@ -96,7 +102,4 @@ fbdevGetColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs);
|
|||
void
|
||||
fbdevPutColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs);
|
||||
|
||||
Bool
|
||||
fbdevFinishInitScreen (ScreenPtr pScreen);
|
||||
|
||||
#endif /* _FBDEV_H_ */
|
||||
|
|
|
|||
|
|
@ -63,6 +63,8 @@ KdCardFuncs fbdevFuncs = {
|
|||
fbdevCardInit, /* cardinit */
|
||||
fbdevScreenInit, /* scrinit */
|
||||
fbdevInitScreen, /* initScreen */
|
||||
fbdevFinishInitScreen, /* finishInitScreen */
|
||||
fbdevCreateResources, /* createRes */
|
||||
fbdevPreserve, /* preserve */
|
||||
fbdevEnable, /* enable */
|
||||
fbdevDPMS, /* dpms */
|
||||
|
|
@ -85,6 +87,4 @@ KdCardFuncs fbdevFuncs = {
|
|||
|
||||
fbdevGetColors, /* getColors */
|
||||
fbdevPutColors, /* putColors */
|
||||
|
||||
fbdevFinishInitScreen, /* finishInitScreen */
|
||||
};
|
||||
|
|
|
|||
|
|
@ -133,6 +133,12 @@ mach64FinishInitScreen (ScreenPtr pScreen)
|
|||
return ret;
|
||||
}
|
||||
|
||||
Bool
|
||||
mach64CreateResources (ScreenPtr pScreen)
|
||||
{
|
||||
return vesaCreateResources (pScreen);
|
||||
}
|
||||
|
||||
CARD32
|
||||
mach64ReadLCD (Reg *reg, int id)
|
||||
{
|
||||
|
|
@ -403,6 +409,7 @@ KdCardFuncs mach64Funcs = {
|
|||
mach64CardInit, /* cardinit */
|
||||
mach64ScreenInit, /* scrinit */
|
||||
mach64InitScreen, /* initScreen */
|
||||
mach64CreateResources, /* createRes */
|
||||
mach64Preserve, /* preserve */
|
||||
mach64Enable, /* enable */
|
||||
mach64DPMS, /* dpms */
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
INCLUDES = \
|
||||
@KDRIVE_INCS@ \
|
||||
$(KDRIVE_INCS) \
|
||||
-I$(top_srcdir)/hw/kdrive/vesa \
|
||||
$(XSERVER_CFLAGS)
|
||||
|
||||
|
|
@ -16,6 +16,7 @@ Xmga_SOURCES = \
|
|||
mgastub.c
|
||||
|
||||
Xmga_LDADD = \
|
||||
libmga.a \
|
||||
$(top_builddir)/hw/kdrive/vesa/libvesa.a \
|
||||
@KDRIVE_LIBS@
|
||||
libmga.a \
|
||||
$(top_builddir)/hw/kdrive/vesa/libvesa.a \
|
||||
$(KDRIVE_LIBS) \
|
||||
$(XSERVER_LIBS)
|
||||
|
|
|
|||
|
|
@ -94,6 +94,12 @@ mgaFinishInitScreen (ScreenPtr pScreen)
|
|||
return ret;
|
||||
}
|
||||
|
||||
Bool
|
||||
mgaCreateResources (ScreenPtr pScreen)
|
||||
{
|
||||
return vesaCreateResources (pScreen);
|
||||
}
|
||||
|
||||
void
|
||||
mgaPreserve (KdCardInfo *card)
|
||||
{
|
||||
|
|
@ -210,6 +216,8 @@ KdCardFuncs mgaFuncs = {
|
|||
mgaCardInit, /* cardinit */
|
||||
mgaScreenInit, /* scrinit */
|
||||
mgaInitScreen, /* initScreen */
|
||||
mgaFinishInitScreen, /* finishInitScreen */
|
||||
mgaCreateResources, /* createRes */
|
||||
mgaPreserve, /* preserve */
|
||||
mgaEnable, /* enable */
|
||||
mgaDPMS, /* dpms */
|
||||
|
|
@ -232,7 +240,5 @@ KdCardFuncs mgaFuncs = {
|
|||
|
||||
vesaGetColors, /* getColors */
|
||||
vesaPutColors, /* putColors */
|
||||
|
||||
mgaFinishInitScreen, /* finishInitScreen */
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
INCLUDES = \
|
||||
@KDRIVE_INCS@ \
|
||||
$(KDRIVE_INCS) \
|
||||
-I$(top_srcdir)/hw/kdrive/vesa \
|
||||
$(XSERVER_CFLAGS)
|
||||
|
||||
|
|
@ -23,4 +23,5 @@ Xnvidia_SOURCES = \
|
|||
Xnvidia_LDADD = \
|
||||
libnvidia.a \
|
||||
$(top_builddir)/hw/kdrive/vesa/libvesa.a \
|
||||
@KDRIVE_LIBS@
|
||||
$(KDRIVE_LIBS) \
|
||||
$(XSERVER_LIBS)
|
||||
|
|
|
|||
|
|
@ -336,6 +336,8 @@ KdCardFuncs nvidiaFuncs = {
|
|||
nvidiaCardInit, /* cardinit */
|
||||
nvidiaScreenInit, /* scrinit */
|
||||
nvidiaInitScreen, /* initScreen */
|
||||
nvidiaFinishInitScreen, /* finishInitScreen */
|
||||
vesaCreateResources, /* createRes */
|
||||
nvidiaPreserve, /* preserve */
|
||||
nvidiaEnable, /* enable */
|
||||
nvidiaDPMS, /* dpms */
|
||||
|
|
@ -358,6 +360,4 @@ KdCardFuncs nvidiaFuncs = {
|
|||
|
||||
vesaGetColors, /* getColors */
|
||||
vesaPutColors, /* putColors */
|
||||
|
||||
nvidiaFinishInitScreen, /* finishInitScreen */
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
INCLUDES = \
|
||||
@KDRIVE_INCS@ \
|
||||
$(KDRIVE_INCS) \
|
||||
-I$(top_srcdir)/hw/kdrive/vesa \
|
||||
$(XSERVER_CFLAGS)
|
||||
|
||||
|
|
@ -18,4 +18,5 @@ Xr128_SOURCES = \
|
|||
Xr128_LDADD = \
|
||||
libr128.a \
|
||||
$(top_builddir)/hw/kdrive/vesa/libvesa.a \
|
||||
@KDRIVE_LIBS@
|
||||
$(KDRIVE_LIBS) \
|
||||
$(XSERVER_LIBS)
|
||||
|
|
|
|||
|
|
@ -228,6 +228,8 @@ KdCardFuncs r128Funcs = {
|
|||
r128CardInit, /* cardinit */
|
||||
r128ScreenInit, /* scrinit */
|
||||
r128InitScreen, /* initScreen */
|
||||
r128FinishInitScreen, /* finishInitScreen */
|
||||
vesaCreateResources,/* createRes */
|
||||
r128Preserve, /* preserve */
|
||||
r128Enable, /* enable */
|
||||
r128DPMS, /* dpms */
|
||||
|
|
@ -250,7 +252,5 @@ KdCardFuncs r128Funcs = {
|
|||
|
||||
vesaGetColors, /* getColors */
|
||||
vesaPutColors, /* putColors */
|
||||
|
||||
r128FinishInitScreen, /* finishInitScreen */
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -130,12 +130,12 @@ r128Setup (ScreenPtr pScreen, int wait)
|
|||
}
|
||||
|
||||
Bool
|
||||
r128PrepareSolid (DrawablePtr pDrawable, int alu, Pixel pm, Pixel fg)
|
||||
r128PrepareSolid (PixmapPtr pPixmap, int alu, Pixel pm, Pixel fg)
|
||||
{
|
||||
KdScreenPriv (pDrawable->pScreen);
|
||||
KdScreenPriv (pPixmap->drawable.pScreen);
|
||||
r128ScreenInfo (pScreenPriv);
|
||||
|
||||
r128Setup (pDrawable->pScreen, 4);
|
||||
r128Setup (pPixmap->drawable.pScreen, 4);
|
||||
R128_OUT32 (mmio, R128_REG_DP_GUI_MASTER_CNTL, r128s->dp_gui_master_cntl
|
||||
| R128_GMC_BRUSH_SOLID_COLOR
|
||||
| R128_GMC_SRC_DATATYPE_COLOR
|
||||
|
|
@ -163,15 +163,15 @@ r128DoneSolid (void)
|
|||
}
|
||||
|
||||
Bool
|
||||
r128PrepareCopy (DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, int dx, int dy, int alu, Pixel pm)
|
||||
r128PrepareCopy (PixmapPtr pSrc, PixmapPtr pDst, int dx, int dy, int alu, Pixel pm)
|
||||
{
|
||||
KdScreenPriv (pSrcDrawable->pScreen);
|
||||
KdScreenPriv (pSrc->drawable.pScreen);
|
||||
r128ScreenInfo (pScreenPriv);
|
||||
|
||||
copydx = dx;
|
||||
copydy = dy;
|
||||
|
||||
r128Setup (pSrcDrawable->pScreen, 3);
|
||||
r128Setup (pSrc->drawable.pScreen, 3);
|
||||
R128_OUT32 (mmio, R128_REG_DP_GUI_MASTER_CNTL, r128s->dp_gui_master_cntl
|
||||
| R128_GMC_BRUSH_SOLID_COLOR
|
||||
| R128_GMC_SRC_DATATYPE_COLOR
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
INCLUDES = \
|
||||
@KDRIVE_INCS@ \
|
||||
$(KDRIVE_INCS) \
|
||||
-I$(top_srcdir)/hw/kdrive/fbdev \
|
||||
-I$(top_srcdir)/hw/kdrive/vesa \
|
||||
$(XSERVER_CFLAGS)
|
||||
|
|
@ -21,4 +21,5 @@ Xsmi_LDADD = \
|
|||
libsmi.a \
|
||||
$(top_builddir)/hw/kdrive/fbdev/libfbdev.a \
|
||||
$(top_builddir)/hw/kdrive/vesa/libvesa.a \
|
||||
@KDRIVE_LIBS@
|
||||
$(KDRIVE_LIBS) \
|
||||
$(XSERVER_LIBS)
|
||||
|
|
|
|||
|
|
@ -321,6 +321,8 @@ KdCardFuncs smiFuncs = {
|
|||
smiCardInit, /* cardinit */
|
||||
smiScreenInit, /* scrinit */
|
||||
smiInitScreen, /* initScreen */
|
||||
smiFinishInitScreen, /* finishInitScreen */
|
||||
subCreateResources, /* createRes */
|
||||
smiPreserve, /* preserve */
|
||||
smiEnable, /* enable */
|
||||
smiDPMS, /* dpms */
|
||||
|
|
@ -343,6 +345,4 @@ KdCardFuncs smiFuncs = {
|
|||
|
||||
subGetColors, /* getColors */
|
||||
subPutColors, /* putColors */
|
||||
|
||||
smiFinishInitScreen, /* finishInitScreen */
|
||||
};
|
||||
|
|
|
|||
|
|
@ -35,8 +35,9 @@
|
|||
#define subInitialize vesaInitialize
|
||||
#define subScreenInitialize vesaScreenInitialize
|
||||
#define subInitScreen vesaInitScreen
|
||||
#define subRandRSetConfig vesaRandRSetConfig
|
||||
#define subFinishInitScreen vesaFinishInitScreen
|
||||
#define subCreateResources vesaCreateResources
|
||||
#define subRandRSetConfig vesaRandRSetConfig
|
||||
#define subPreserve vesaPreserve
|
||||
#define subEnable vesaEnable
|
||||
#define subDPMS vesaDPMS
|
||||
|
|
@ -54,8 +55,9 @@
|
|||
#define subInitialize fbdevInitialize
|
||||
#define subScreenInitialize fbdevScreenInitialize
|
||||
#define subInitScreen fbdevInitScreen
|
||||
#define subRandRSetConfig fbdevRandRSetConfig
|
||||
#define subFinishInitScreen fbdevFinishInitScreen
|
||||
#define subCreateResources fbdevCreateResources
|
||||
#define subRandRSetConfig fbdevRandRSetConfig
|
||||
#define subPreserve fbdevPreserve
|
||||
#define subEnable fbdevEnable
|
||||
#define subDPMS fbdevDPMS
|
||||
|
|
|
|||
|
|
@ -832,6 +832,23 @@ KdAllocatePrivates (ScreenPtr pScreen)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
Bool
|
||||
KdCreateScreenResources (ScreenPtr pScreen)
|
||||
{
|
||||
KdScreenPriv(pScreen);
|
||||
KdScreenInfo *screen = pScreenPriv->screen;
|
||||
KdCardInfo *card = pScreenPriv->card;
|
||||
Bool ret;
|
||||
|
||||
pScreen->CreateScreenResources = pScreenPriv->CreateScreenResources;
|
||||
ret = (*pScreen->CreateScreenResources) (pScreen);
|
||||
pScreenPriv->CreateScreenResources = pScreen->CreateScreenResources;
|
||||
pScreen->CreateScreenResources = KdCreateScreenResources;
|
||||
if (ret && card->cfuncs->createRes)
|
||||
ret = (*card->cfuncs->createRes) (pScreen);
|
||||
return ret;
|
||||
}
|
||||
|
||||
Bool
|
||||
KdCloseScreen (int index, ScreenPtr pScreen)
|
||||
{
|
||||
|
|
@ -1015,11 +1032,32 @@ KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
|
|||
KdCardInfo *card = screen->card;
|
||||
KdPrivScreenPtr pScreenPriv;
|
||||
int fb;
|
||||
/*
|
||||
* note that screen->fb is set up for the nominal orientation
|
||||
* of the screen; that means if randr is rotated, the values
|
||||
* there should reflect a rotated frame buffer (or shadow).
|
||||
*/
|
||||
Bool rotated = (screen->randr & (RR_Rotate_90|RR_Rotate_270)) != 0;
|
||||
int width, height, *width_mmp, *height_mmp;
|
||||
|
||||
KdAllocatePrivates (pScreen);
|
||||
|
||||
pScreenPriv = KdGetScreenPriv(pScreen);
|
||||
|
||||
if (!rotated)
|
||||
{
|
||||
width = screen->width;
|
||||
height = screen->height;
|
||||
width_mmp = &screen->width_mm;
|
||||
height_mmp = &screen->height_mm;
|
||||
}
|
||||
else
|
||||
{
|
||||
width = screen->height;
|
||||
height = screen->width;
|
||||
width_mmp = &screen->height_mm;
|
||||
height_mmp = &screen->width_mm;
|
||||
}
|
||||
screen->pScreen = pScreen;
|
||||
pScreenPriv->screen = screen;
|
||||
pScreenPriv->card = card;
|
||||
|
|
@ -1039,7 +1077,7 @@ KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
|
|||
*/
|
||||
if (!fbSetupScreen (pScreen,
|
||||
screen->fb[0].frameBuffer,
|
||||
screen->width, screen->height,
|
||||
width, height,
|
||||
monitorResolution, monitorResolution,
|
||||
screen->fb[0].pixelStride,
|
||||
screen->fb[0].bitsPerPixel))
|
||||
|
|
@ -1072,7 +1110,7 @@ KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
|
|||
if (!fbOverlayFinishScreenInit (pScreen,
|
||||
screen->fb[0].frameBuffer,
|
||||
screen->fb[1].frameBuffer,
|
||||
screen->width, screen->height,
|
||||
width, height,
|
||||
monitorResolution, monitorResolution,
|
||||
screen->fb[0].pixelStride,
|
||||
screen->fb[1].pixelStride,
|
||||
|
|
@ -1089,7 +1127,7 @@ KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
|
|||
{
|
||||
if (!fbFinishScreenInit (pScreen,
|
||||
screen->fb[0].frameBuffer,
|
||||
screen->width, screen->height,
|
||||
width, height,
|
||||
monitorResolution, monitorResolution,
|
||||
screen->fb[0].pixelStride,
|
||||
screen->fb[0].bitsPerPixel))
|
||||
|
|
@ -1102,14 +1140,14 @@ KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
|
|||
* Fix screen sizes; for some reason mi takes dpi instead of mm.
|
||||
* Rounding errors are annoying
|
||||
*/
|
||||
if (screen->width_mm)
|
||||
pScreen->mmWidth = screen->width_mm;
|
||||
if (*width_mmp)
|
||||
pScreen->mmWidth = *width_mmp;
|
||||
else
|
||||
screen->width_mm = pScreen->mmWidth;
|
||||
if (screen->height_mm)
|
||||
pScreen->mmHeight = screen->height_mm;
|
||||
*width_mmp = pScreen->mmWidth;
|
||||
if (*height_mmp)
|
||||
pScreen->mmHeight = *height_mmp;
|
||||
else
|
||||
screen->height_mm = pScreen->mmHeight;
|
||||
*height_mmp = pScreen->mmHeight;
|
||||
|
||||
/*
|
||||
* Plug in our own block/wakeup handlers.
|
||||
|
|
@ -1163,6 +1201,9 @@ KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
|
|||
*/
|
||||
pScreenPriv->CloseScreen = pScreen->CloseScreen;
|
||||
pScreen->CloseScreen = KdCloseScreen;
|
||||
|
||||
pScreenPriv->CreateScreenResources = pScreen->CreateScreenResources;
|
||||
pScreen->CreateScreenResources = KdCreateScreenResources;
|
||||
|
||||
if (screen->softCursor ||
|
||||
!card->cfuncs->initCursor ||
|
||||
|
|
|
|||
|
|
@ -93,6 +93,7 @@ typedef struct _KdFrameBuffer {
|
|||
int bitsPerPixel;
|
||||
int pixelStride;
|
||||
int byteStride;
|
||||
Bool shadow;
|
||||
unsigned long visuals;
|
||||
Pixel redMask, greenMask, blueMask;
|
||||
void *closure;
|
||||
|
|
@ -128,6 +129,8 @@ typedef struct _KdCardFuncs {
|
|||
Bool (*cardinit) (KdCardInfo *); /* detect and map device */
|
||||
Bool (*scrinit) (KdScreenInfo *);/* initialize screen information */
|
||||
Bool (*initScreen) (ScreenPtr); /* initialize ScreenRec */
|
||||
Bool (*finishInitScreen) (ScreenPtr pScreen);
|
||||
Bool (*createRes) (ScreenPtr); /* create screen resources */
|
||||
void (*preserve) (KdCardInfo *); /* save graphics card state */
|
||||
Bool (*enable) (ScreenPtr); /* set up for rendering */
|
||||
Bool (*dpms) (ScreenPtr, int); /* set DPMS screen saver */
|
||||
|
|
@ -151,7 +154,6 @@ typedef struct _KdCardFuncs {
|
|||
void (*getColors) (ScreenPtr, int, int, xColorItem *);
|
||||
void (*putColors) (ScreenPtr, int, int, xColorItem *);
|
||||
|
||||
Bool (*finishInitScreen) (ScreenPtr pScreen);
|
||||
} KdCardFuncs;
|
||||
|
||||
#define KD_MAX_PSEUDO_DEPTH 8
|
||||
|
|
@ -170,6 +172,7 @@ typedef struct {
|
|||
ColormapPtr pInstalledmap[KD_MAX_FB]; /* current colormap */
|
||||
xColorItem systemPalette[KD_MAX_PSEUDO_SIZE];/* saved windows colors */
|
||||
|
||||
CreateScreenResourcesProcPtr CreateScreenResources;
|
||||
CloseScreenProcPtr CloseScreen;
|
||||
#ifdef FB_OLD_SCREEN
|
||||
miBSFuncRec BackingStoreFuncs;
|
||||
|
|
@ -567,6 +570,9 @@ KdOsInit (KdOsFuncs *pOsFuncs);
|
|||
Bool
|
||||
KdAllocatePrivates (ScreenPtr pScreen);
|
||||
|
||||
Bool
|
||||
KdCreateScreenResources (ScreenPtr pScreen);
|
||||
|
||||
Bool
|
||||
KdCloseScreen (int index, ScreenPtr pScreen);
|
||||
|
||||
|
|
@ -774,13 +780,16 @@ KdCheckComposite (CARD8 op,
|
|||
|
||||
/* kshadow.c */
|
||||
Bool
|
||||
KdShadowScreenInit (KdScreenInfo *screen);
|
||||
|
||||
Bool
|
||||
KdShadowInitScreen (ScreenPtr pScreen, ShadowUpdateProc update, ShadowWindowProc window);
|
||||
KdShadowFbAlloc (KdScreenInfo *screen, int fb, Bool rotate);
|
||||
|
||||
void
|
||||
KdShadowScreenFini (KdScreenInfo *screen);
|
||||
KdShadowFbFree (KdScreenInfo *screen, int fb);
|
||||
|
||||
Bool
|
||||
KdShadowSet (ScreenPtr pScreen, int randr, ShadowUpdateProc update, ShadowWindowProc window);
|
||||
|
||||
void
|
||||
KdShadowUnset (ScreenPtr pScreen);
|
||||
|
||||
/* ktest.c */
|
||||
Bool
|
||||
|
|
|
|||
|
|
@ -28,29 +28,58 @@
|
|||
#include "kdrive.h"
|
||||
|
||||
Bool
|
||||
KdShadowScreenInit (KdScreenInfo *screen)
|
||||
KdShadowFbAlloc (KdScreenInfo *screen, int fb, Bool rotate)
|
||||
{
|
||||
int paddedWidth;
|
||||
void *buf;
|
||||
int width = rotate ? screen->height : screen->width;
|
||||
int height = rotate ? screen->width : screen->height;
|
||||
int bpp = screen->fb[fb].bitsPerPixel;
|
||||
|
||||
buf = shadowAlloc (screen->width, screen->height, screen->fb[0].bitsPerPixel);
|
||||
/* use fb computation for width */
|
||||
paddedWidth = ((width * bpp + FB_MASK) >> FB_SHIFT) * sizeof (FbBits);
|
||||
buf = xalloc (paddedWidth * height);
|
||||
if (!buf)
|
||||
return FALSE;
|
||||
screen->fb[0].frameBuffer = buf;
|
||||
screen->fb[0].byteStride = BitmapBytePad (screen->width * screen->fb[0].bitsPerPixel);
|
||||
screen->fb[0].pixelStride = screen->fb[0].byteStride * 8 / screen->fb[0].bitsPerPixel;
|
||||
screen->dumb = TRUE;
|
||||
if (screen->fb[fb].shadow)
|
||||
xfree (screen->fb[fb].frameBuffer);
|
||||
screen->fb[fb].shadow = TRUE;
|
||||
screen->fb[fb].frameBuffer = buf;
|
||||
screen->fb[fb].byteStride = paddedWidth;
|
||||
screen->fb[fb].pixelStride = paddedWidth * 8 / bpp;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
Bool
|
||||
KdShadowInitScreen (ScreenPtr pScreen, ShadowUpdateProc update, ShadowWindowProc window)
|
||||
void
|
||||
KdShadowFbFree (KdScreenInfo *screen, int fb)
|
||||
{
|
||||
return shadowInit (pScreen, update, window);
|
||||
if (screen->fb[fb].shadow)
|
||||
{
|
||||
xfree (screen->fb[fb].frameBuffer);
|
||||
screen->fb[fb].frameBuffer = 0;
|
||||
screen->fb[fb].shadow = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
Bool
|
||||
KdShadowSet (ScreenPtr pScreen, int randr, ShadowUpdateProc update, ShadowWindowProc window)
|
||||
{
|
||||
KdScreenPriv(pScreen);
|
||||
KdScreenInfo *screen = pScreenPriv->screen;
|
||||
int fb;
|
||||
|
||||
for (fb = 0; fb < KD_MAX_FB && screen->fb[fb].depth; fb++)
|
||||
{
|
||||
if (screen->fb[fb].shadow)
|
||||
return shadowSet (pScreen, (*pScreen->GetScreenPixmap) (pScreen),
|
||||
update, window, randr, 0);
|
||||
else
|
||||
shadowUnset (pScreen);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
KdShadowScreenFini (KdScreenInfo *screen)
|
||||
KdShadowUnset (ScreenPtr pScreen)
|
||||
{
|
||||
if (screen->fb[0].frameBuffer)
|
||||
xfree (screen->fb[0].frameBuffer);
|
||||
shadowUnset (pScreen);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -789,30 +789,13 @@ vesaCreateColormap16 (ColormapPtr pmap)
|
|||
}
|
||||
|
||||
void
|
||||
vesaConfigureScreen (ScreenPtr pScreen)
|
||||
vesaSetScreenSizes (ScreenPtr pScreen)
|
||||
{
|
||||
KdScreenPriv(pScreen);
|
||||
KdScreenInfo *screen = pScreenPriv->screen;
|
||||
VesaScreenPrivPtr pscr = pScreenPriv->screen->driver;
|
||||
VesaScreenPrivPtr pscr = screen->driver;
|
||||
|
||||
KdMouseMatrix m;
|
||||
|
||||
if (pscr->mapping == VESA_PLANAR || pscr->mapping == VESA_MONO)
|
||||
{
|
||||
pscr->shadow = TRUE;
|
||||
pscr->randr = RR_Rotate_0;
|
||||
}
|
||||
else if (pscr->mapping == VESA_WINDOWED)
|
||||
pscr->shadow = TRUE;
|
||||
else if (pscr->randr != RR_Rotate_0)
|
||||
pscr->shadow = TRUE;
|
||||
else
|
||||
pscr->shadow = vesa_shadow;
|
||||
|
||||
KdComputeMouseMatrix (&m, pscr->randr,
|
||||
pscr->mode.XResolution, pscr->mode.YResolution);
|
||||
|
||||
if (m.matrix[0][0])
|
||||
if (pscr->randr & (RR_Rotate_0|RR_Rotate_180))
|
||||
{
|
||||
pScreen->width = pscr->mode.XResolution;
|
||||
pScreen->height = pscr->mode.YResolution;
|
||||
|
|
@ -826,78 +809,46 @@ vesaConfigureScreen (ScreenPtr pScreen)
|
|||
pScreen->mmWidth = screen->height_mm;
|
||||
pScreen->mmHeight = screen->width_mm;
|
||||
}
|
||||
KdSetMouseMatrix (&m);
|
||||
}
|
||||
|
||||
PixmapPtr
|
||||
vesaGetPixmap (ScreenPtr pScreen)
|
||||
Bool
|
||||
vesaSetShadow (ScreenPtr pScreen)
|
||||
{
|
||||
KdScreenPriv(pScreen);
|
||||
KdScreenInfo *screen = pScreenPriv->screen;
|
||||
VesaScreenPrivPtr pscr = pScreenPriv->screen->driver;
|
||||
ShadowUpdateProc update;
|
||||
ShadowWindowProc window = 0;
|
||||
PixmapPtr pShadow, pPixmap;
|
||||
|
||||
if (pscr->shadow)
|
||||
{
|
||||
if (pscr->randr != RR_Rotate_0)
|
||||
update = shadowUpdateRotatePacked;
|
||||
else
|
||||
update = shadowUpdatePacked;
|
||||
switch (pscr->mapping) {
|
||||
case VESA_LINEAR:
|
||||
window = vesaWindowLinear;
|
||||
break;
|
||||
case VESA_WINDOWED:
|
||||
window = vesaWindowWindowed;
|
||||
break;
|
||||
case VESA_PLANAR:
|
||||
pScreen->CreateColormap = vesaCreateColormap16;
|
||||
if (pScreenPriv->screen->fb[0].bitsPerPixel == 8)
|
||||
update = shadowUpdatePlanar4x8;
|
||||
else
|
||||
update = shadowUpdatePlanar4;
|
||||
window = vesaWindowPlanar;
|
||||
break;
|
||||
case VESA_MONO:
|
||||
update = vesaUpdateMono;
|
||||
if (pscr->mode.mode < 8)
|
||||
window = vesaWindowCga;
|
||||
else
|
||||
window = vesaWindowLinear;
|
||||
break;
|
||||
}
|
||||
|
||||
pPixmap = (*pScreen->CreatePixmap) (pScreen,
|
||||
pScreen->width,
|
||||
pScreen->height,
|
||||
screen->fb[0].depth);
|
||||
if (!pPixmap)
|
||||
return NullPixmap;
|
||||
if (!shadowSet (pScreen, pPixmap, update,
|
||||
window, pscr->randr, 0))
|
||||
{
|
||||
(*pScreen->DestroyPixmap) (pPixmap);
|
||||
return NullPixmap;
|
||||
}
|
||||
pShadow = pPixmap;
|
||||
}
|
||||
if (pscr->randr != RR_Rotate_0)
|
||||
update = shadowUpdateRotatePacked;
|
||||
else
|
||||
{
|
||||
pPixmap = (*pScreen->GetScreenPixmap) (pScreen);
|
||||
pShadow = 0;
|
||||
shadowUnset (pScreen);
|
||||
update = shadowUpdatePacked;
|
||||
switch (pscr->mapping) {
|
||||
case VESA_LINEAR:
|
||||
window = vesaWindowLinear;
|
||||
break;
|
||||
case VESA_WINDOWED:
|
||||
window = vesaWindowWindowed;
|
||||
break;
|
||||
case VESA_PLANAR:
|
||||
pScreen->CreateColormap = vesaCreateColormap16;
|
||||
if (pScreenPriv->screen->fb[0].bitsPerPixel == 8)
|
||||
update = shadowUpdatePlanar4x8;
|
||||
else
|
||||
update = shadowUpdatePlanar4;
|
||||
window = vesaWindowPlanar;
|
||||
break;
|
||||
case VESA_MONO:
|
||||
update = vesaUpdateMono;
|
||||
if (pscr->mode.mode < 8)
|
||||
window = vesaWindowCga;
|
||||
else
|
||||
window = vesaWindowLinear;
|
||||
break;
|
||||
}
|
||||
|
||||
if (pscr->pShadow)
|
||||
(*pScreen->DestroyPixmap) (pscr->pShadow);
|
||||
pscr->pShadow = pShadow;
|
||||
|
||||
if (vesa_verbose)
|
||||
ErrorF ("Mode selected %dx%dx%d\n",
|
||||
pScreen->width, pScreen->height, screen->fb[0].depth);
|
||||
return pPixmap;
|
||||
return KdShadowSet (pScreen, pscr->randr, update, window);
|
||||
}
|
||||
|
||||
Bool
|
||||
|
|
@ -907,11 +858,18 @@ vesaMapFramebuffer (KdScreenInfo *screen)
|
|||
VesaScreenPrivPtr pscr = screen->driver;
|
||||
int depth, bpp, fbbpp;
|
||||
Pixel allbits;
|
||||
KdMouseMatrix m;
|
||||
|
||||
if (vesa_linear_fb)
|
||||
{
|
||||
pscr->mapping = VESA_LINEAR;
|
||||
pscr->shadow = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
pscr->mapping = VESA_WINDOWED;
|
||||
pscr->shadow = TRUE;
|
||||
}
|
||||
|
||||
depth = vesaDepth (&pscr->mode);
|
||||
bpp = pscr->mode.BitsPerPixel;
|
||||
|
|
@ -972,9 +930,10 @@ vesaMapFramebuffer (KdScreenInfo *screen)
|
|||
bpp, depth);
|
||||
}
|
||||
pscr->randr = RR_Rotate_0;
|
||||
pscr->shadow = TRUE;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
switch (fbbpp) {
|
||||
|
|
@ -987,15 +946,17 @@ vesaMapFramebuffer (KdScreenInfo *screen)
|
|||
break;
|
||||
}
|
||||
|
||||
screen->width = pscr->mode.XResolution;
|
||||
screen->height = pscr->mode.YResolution;
|
||||
screen->fb[0].depth = depth;
|
||||
screen->fb[0].bitsPerPixel = bpp;
|
||||
screen->fb[0].byteStride = pscr->mode.BytesPerScanLine;
|
||||
screen->fb[0].pixelStride = ((pscr->mode.BytesPerScanLine * 8) / fbbpp);
|
||||
if (pscr->randr != RR_Rotate_0)
|
||||
pscr->shadow = TRUE;
|
||||
|
||||
if (vesa_shadow)
|
||||
pscr->shadow = vesa_shadow;
|
||||
|
||||
if (pscr->mapping == VESA_LINEAR && !(pscr->mode.ModeAttributes & MODE_LINEAR))
|
||||
{
|
||||
pscr->mapping = VESA_WINDOWED;
|
||||
pscr->shadow = TRUE;
|
||||
}
|
||||
|
||||
screen->softCursor = TRUE;
|
||||
|
||||
|
|
@ -1022,10 +983,34 @@ vesaMapFramebuffer (KdScreenInfo *screen)
|
|||
pscr->fb = NULL;
|
||||
break;
|
||||
}
|
||||
|
||||
KdComputeMouseMatrix (&m, pscr->randr,
|
||||
pscr->mode.XResolution, pscr->mode.YResolution);
|
||||
|
||||
KdSetMouseMatrix (&m);
|
||||
|
||||
screen->width = pscr->mode.XResolution;
|
||||
screen->height = pscr->mode.YResolution;
|
||||
screen->memory_base = pscr->fb;
|
||||
screen->memory_size = pscr->fb_size;
|
||||
screen->fb[0].frameBuffer = (CARD8 *)(pscr->fb);
|
||||
screen->off_screen_base = screen->fb[0].byteStride * screen->height;
|
||||
screen->fb[0].depth = depth;
|
||||
screen->fb[0].bitsPerPixel = bpp;
|
||||
|
||||
if (pscr->shadow)
|
||||
{
|
||||
if (!KdShadowFbAlloc (screen, 0,
|
||||
pscr->randr & (RR_Rotate_90|RR_Rotate_270)))
|
||||
return FALSE;
|
||||
screen->off_screen_base = screen->memory_size;
|
||||
}
|
||||
else
|
||||
{
|
||||
screen->fb[0].frameBuffer = (CARD8 *) (pscr->fb);
|
||||
screen->off_screen_base = screen->fb[0].byteStride * screen->height;
|
||||
screen->fb[0].byteStride = pscr->mode.BytesPerScanLine;
|
||||
screen->fb[0].pixelStride = ((pscr->mode.BytesPerScanLine * 8) /
|
||||
screen->fb[0].bitsPerPixel);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -1036,6 +1021,7 @@ vesaUnmapFramebuffer (KdScreenInfo *screen)
|
|||
VesaCardPrivPtr priv = screen->card->driver;
|
||||
VesaScreenPrivPtr pscr = screen->driver;
|
||||
|
||||
KdShadowFbFree (screen, 0);
|
||||
if (pscr->fb)
|
||||
{
|
||||
if (pscr->mode.vbe)
|
||||
|
|
@ -1121,17 +1107,6 @@ vesaRandRGetInfo (ScreenPtr pScreen, Rotation *rotations)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
int
|
||||
vesaPixmapSet (WindowPtr pWin, pointer value)
|
||||
{
|
||||
ScreenPtr pScreen = pWin->drawable.pScreen;
|
||||
PixmapPtr pPixmap = value;
|
||||
|
||||
pWin->drawable.serialNumber = NEXT_SERIAL_NUMBER;
|
||||
(*pScreen->SetWindowPixmap) (pWin, pPixmap);
|
||||
return WT_WALKCHILDREN;
|
||||
}
|
||||
|
||||
Bool
|
||||
vesaRandRSetConfig (ScreenPtr pScreen,
|
||||
Rotation randr,
|
||||
|
|
@ -1229,46 +1204,25 @@ vesaRandRSetConfig (ScreenPtr pScreen,
|
|||
KdOffscreenSwapOut (screen->pScreen);
|
||||
|
||||
vesaUnmapFramebuffer (screen);
|
||||
|
||||
if (!vesaMapFramebuffer (screen))
|
||||
goto bail3;
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* XXX can't switch depths
|
||||
*/
|
||||
screen->fb[0].depth = depth;
|
||||
screen->fb[0].bitsPerPixel = bpp;
|
||||
#endif
|
||||
screen->fb[0].byteStride = mode->BytesPerScanLine;
|
||||
screen->fb[0].pixelStride = ((mode->BytesPerScanLine * 8) / screen->fb[0].bitsPerPixel);
|
||||
vesaSetScreenSizes (screen->pScreen);
|
||||
|
||||
if (!vesaSetShadow (screen->pScreen))
|
||||
goto bail4;
|
||||
|
||||
/*
|
||||
* Compute screen geometry
|
||||
*/
|
||||
vesaConfigureScreen (pScreen);
|
||||
|
||||
/*
|
||||
* Set frame buffer mapping
|
||||
*/
|
||||
if (!pscr->shadow)
|
||||
{
|
||||
(*pScreen->ModifyPixmapHeader) (fbGetScreenPixmap (pScreen),
|
||||
pScreen->width,
|
||||
pScreen->height,
|
||||
screen->fb[0].depth,
|
||||
screen->fb[0].bitsPerPixel,
|
||||
screen->fb[0].byteStride,
|
||||
screen->fb[0].frameBuffer);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the pixmap that windows live in
|
||||
*/
|
||||
pPixmap = vesaGetPixmap (pScreen);
|
||||
if (!pPixmap)
|
||||
goto bail4;
|
||||
|
||||
WalkTree (pScreen, vesaPixmapSet, (pointer) pPixmap);
|
||||
(*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, pscr->randr);
|
||||
|
|
@ -1292,22 +1246,7 @@ bail3:
|
|||
bail2:
|
||||
*pscr = oldscr;
|
||||
|
||||
/*
|
||||
* Set frame buffer mapping
|
||||
*/
|
||||
if (!pscr->shadow)
|
||||
{
|
||||
(*pScreen->ModifyPixmapHeader) (fbGetScreenPixmap (pScreen),
|
||||
pScreen->width,
|
||||
pScreen->height,
|
||||
screen->fb[0].depth,
|
||||
screen->fb[0].bitsPerPixel,
|
||||
screen->fb[0].byteStride,
|
||||
screen->fb[0].frameBuffer);
|
||||
}
|
||||
|
||||
(void) vesaSetMode (pScreen, &pscr->mode);
|
||||
|
||||
bail1:
|
||||
if (wasEnabled)
|
||||
KdEnableScreen (pScreen);
|
||||
|
|
@ -1334,23 +1273,17 @@ vesaRandRInit (ScreenPtr pScreen)
|
|||
Bool
|
||||
vesaInitScreen(ScreenPtr pScreen)
|
||||
{
|
||||
KdScreenPriv(pScreen);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
Bool
|
||||
vesaFinishInitScreen (ScreenPtr pScreen)
|
||||
{
|
||||
PixmapPtr pPixmap;
|
||||
|
||||
vesaConfigureScreen (pScreen);
|
||||
|
||||
if (!shadowSetup (pScreen))
|
||||
return FALSE;
|
||||
|
||||
pPixmap = vesaGetPixmap (pScreen);
|
||||
if (!pPixmap)
|
||||
return FALSE;
|
||||
|
||||
#ifdef RANDR
|
||||
if (!vesaRandRInit (pScreen))
|
||||
return FALSE;
|
||||
|
|
@ -1359,6 +1292,12 @@ vesaFinishInitScreen (ScreenPtr pScreen)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
Bool
|
||||
vesaCreateResources (ScreenPtr pScreen)
|
||||
{
|
||||
return vesaSetShadow (pScreen);
|
||||
}
|
||||
|
||||
Bool
|
||||
vesaSetMode (ScreenPtr pScreen,
|
||||
VesaModePtr mode)
|
||||
|
|
@ -1656,11 +1595,7 @@ vesaScreenFini(KdScreenInfo *screen)
|
|||
{
|
||||
VesaScreenPrivPtr pscr = screen->driver;
|
||||
|
||||
if (pscr->pShadow)
|
||||
{
|
||||
(*screen->pScreen->DestroyPixmap) (pscr->pShadow);
|
||||
pscr->pShadow = 0;
|
||||
}
|
||||
KdShadowFbFree (screen, 0);
|
||||
vesaUnmapFramebuffer (screen);
|
||||
screen->fb[0].depth = pscr->origDepth;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -156,6 +156,9 @@ vesaInitScreen(ScreenPtr pScreen);
|
|||
Bool
|
||||
vesaFinishInitScreen(ScreenPtr pScreen);
|
||||
|
||||
Bool
|
||||
vesaCreateResources (ScreenPtr pScreen);
|
||||
|
||||
Bool
|
||||
vesaSetMode (ScreenPtr pScreen,
|
||||
VesaModePtr mode);
|
||||
|
|
|
|||
|
|
@ -30,6 +30,8 @@ const KdCardFuncs vesaFuncs = {
|
|||
vesaCardInit, /* cardinit */
|
||||
vesaScreenInit, /* scrinit */
|
||||
vesaInitScreen, /* initScreen */
|
||||
vesaFinishInitScreen, /* finishInitScreen */
|
||||
vesaCreateResources, /* createRes */
|
||||
vesaPreserve, /* preserve */
|
||||
vesaEnable, /* enable */
|
||||
vesaDPMS, /* dpms */
|
||||
|
|
@ -52,8 +54,6 @@ const KdCardFuncs vesaFuncs = {
|
|||
|
||||
vesaGetColors, /* getColors */
|
||||
vesaPutColors, /* putColors */
|
||||
|
||||
vesaFinishInitScreen, /* finishInitScreen */
|
||||
};
|
||||
|
||||
void
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue