Fix fbdev server to allow accelerated servers on top to use RandR. Switch

smi server to fbdev (vesa bios doesnt work on the Acer I have here)
This commit is contained in:
Keith Packard 2003-10-05 05:22:35 +00:00
parent f3d8476ced
commit adc5b8068d
8 changed files with 202 additions and 163 deletions

View File

@ -192,6 +192,7 @@ 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 &&
@ -339,18 +340,13 @@ fbdevUpdateFake24 (ScreenPtr pScreen,
}
#endif /* FAKE24_ON_16 */
LayerPtr
fbdevLayerCreate (ScreenPtr pScreen)
void
fbdevConfigureScreen (ScreenPtr pScreen)
{
KdScreenPriv(pScreen);
KdScreenInfo *screen = pScreenPriv->screen;
FbdevPriv *priv = pScreenPriv->card->driver;
FbdevScrPriv *scrpriv = screen->driver;
LayerPtr pLayer;
ShadowUpdateProc update;
ShadowWindowProc window;
PixmapPtr pPixmap;
int kind;
KdMouseMatrix m;
#ifdef FAKE24_ON_16
@ -385,7 +381,22 @@ fbdevLayerCreate (ScreenPtr pScreen)
pScreen->mmHeight = screen->width_mm;
}
KdSetMouseMatrix (&m);
}
LayerPtr
fbdevLayerCreate (ScreenPtr pScreen)
{
KdScreenPriv(pScreen);
KdScreenInfo *screen = pScreenPriv->screen;
FbdevPriv *priv = pScreenPriv->card->driver;
FbdevScrPriv *scrpriv = screen->driver;
LayerPtr pLayer;
ShadowUpdateProc update;
ShadowWindowProc window;
PixmapPtr pPixmap;
int kind;
KdMouseMatrix m;
if (scrpriv->shadow)
{
window = fbdevWindowLinear;
@ -410,7 +421,7 @@ fbdevLayerCreate (ScreenPtr pScreen)
}
else
{
kind = LAYER_FB;
kind = scrpriv->layerKind;
pPixmap = LAYER_SCREEN_PIXMAP;
update = 0;
window = 0;
@ -486,55 +497,76 @@ fbdevRandRSetConfig (ScreenPtr pScreen,
KdScreenInfo *screen = pScreenPriv->screen;
FbdevPriv *priv = pScreenPriv->card->driver;
FbdevScrPriv *scrpriv = screen->driver;
int rotate;
int reflect;
Bool wasEnabled = pScreenPriv->enabled;
FbdevScrPriv oldscr;
int oldwidth;
int oldheight;
int oldmmwidth;
int oldmmheight;
LayerPtr pNewLayer;
int newwidth, newheight;
/*
* The only thing that can change is rotation
*/
randr = KdAddRotation (randr, screen->randr);
if (scrpriv->randr != randr)
if (screen->randr & (RR_Rotate_0|RR_Rotate_180))
{
LayerPtr pNewLayer;
int kind;
int oldrandr = scrpriv->randr;
int oldshadow = scrpriv->shadow;
int oldwidth = pScreen->width;
int oldheight = pScreen->height;
PixmapPtr pPixmap;
if (wasEnabled)
KdDisableScreen (pScreen);
scrpriv->randr = randr;
pNewLayer = fbdevLayerCreate (pScreen);
if (!pNewLayer)
{
scrpriv->shadow = oldshadow;
scrpriv->randr = oldrandr;
}
if (WalkTree (pScreen, fbdevLayerAdd, (pointer) pNewLayer) == WT_STOPWALKING)
{
WalkTree (pScreen, fbdevLayerRemove, (pointer) pNewLayer);
LayerDestroy (pScreen, pNewLayer);
scrpriv->randr = oldrandr;
scrpriv->shadow = oldshadow;
pScreen->width = oldwidth;
pScreen->height = oldheight;
if (wasEnabled)
KdEnableScreen (pScreen);
return FALSE;
}
WalkTree (pScreen, fbdevLayerRemove, (pointer) scrpriv->pLayer);
LayerDestroy (pScreen, scrpriv->pLayer);
scrpriv->pLayer = pNewLayer;
KdSetSubpixelOrder (pScreen, scrpriv->randr);
if (wasEnabled)
KdEnableScreen (pScreen);
newwidth = pSize->width;
newheight = pSize->height;
}
else
{
newwidth = pSize->height;
newheight = pSize->width;
}
if (wasEnabled)
KdDisableScreen (pScreen);
oldscr = *scrpriv;
oldwidth = screen->width;
oldheight = screen->height;
oldmmwidth = pScreen->mmWidth;
oldmmheight = pScreen->mmHeight;
/*
* Set new configuration
*/
scrpriv->randr = KdAddRotation (screen->randr, randr);
fbdevConfigureScreen (pScreen);
pNewLayer = fbdevLayerCreate (pScreen);
if (!pNewLayer)
goto bail4;
if (WalkTree (pScreen, fbdevLayerAdd, (pointer) pNewLayer) == WT_STOPWALKING)
goto bail5;
WalkTree (pScreen, fbdevLayerRemove, (pointer) scrpriv->pLayer);
LayerDestroy (pScreen, scrpriv->pLayer);
scrpriv->pLayer = pNewLayer;
KdSetSubpixelOrder (pScreen, scrpriv->randr);
if (wasEnabled)
KdEnableScreen (pScreen);
return TRUE;
bail5:
WalkTree (pScreen, fbdevLayerRemove, (pointer) pNewLayer);
LayerDestroy (pScreen, pNewLayer);
bail4:
pScreen->width = oldwidth;
pScreen->height = oldheight;
pScreen->mmWidth = oldmmwidth;
pScreen->mmHeight = oldmmheight;
bail2:
*scrpriv = oldscr;
bail1:
if (wasEnabled)
KdEnableScreen (pScreen);
bail0:
return FALSE;
}
Bool
@ -590,10 +622,6 @@ Bool
fbdevInitScreen (ScreenPtr pScreen)
{
KdScreenPriv(pScreen);
FbdevPriv *priv = pScreenPriv->card->driver;
FbdevScrPriv *scrpriv = pScreenPriv->screen->driver;
ShadowUpdateProc update;
ShadowWindowProc window;
#ifdef TOUCHSCREEN
KdTsPhyScreen = pScreen->myNum;
@ -603,15 +631,30 @@ fbdevInitScreen (ScreenPtr pScreen)
if (!LayerStartInit (pScreen))
return FALSE;
return TRUE;
}
Bool
fbdevFinishInitScreen (ScreenPtr pScreen)
{
KdScreenPriv(pScreen);
FbdevPriv *priv = pScreenPriv->card->driver;
FbdevScrPriv *scrpriv = pScreenPriv->screen->driver;
scrpriv->layerKind = LayerNewKind (pScreen);
if (!LayerFinishInit (pScreen))
return FALSE;
scrpriv->pLayer = fbdevLayerCreate (pScreen);
if (!scrpriv->pLayer)
return FALSE;
#ifdef RANDR
if (!fbdevRandRInit (pScreen))
return FALSE;
#endif
return TRUE;
}
@ -789,32 +832,3 @@ fbdevPutColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs)
cmap.transp = 0;
ioctl (priv->fd, FBIOPUTCMAP, &cmap);
}
KdCardFuncs fbdevFuncs = {
fbdevCardInit, /* cardinit */
fbdevScreenInit, /* scrinit */
fbdevInitScreen, /* initScreen */
fbdevPreserve, /* preserve */
fbdevEnable, /* enable */
fbdevDPMS, /* dpms */
fbdevDisable, /* disable */
fbdevRestore, /* restore */
fbdevScreenFini, /* scrfini */
fbdevCardFini, /* cardfini */
0, /* initCursor */
0, /* enableCursor */
0, /* disableCursor */
0, /* finiCursor */
0, /* recolorCursor */
0, /* initAccel */
0, /* enableAccel */
0, /* syncAccel */
0, /* disableAccel */
0, /* finiAccel */
fbdevGetColors, /* getColors */
fbdevPutColors, /* putColors */
};

View File

@ -50,6 +50,7 @@ typedef struct _fbdevPriv {
typedef struct _fbdevScrPriv {
Rotation randr;
Bool shadow;
int layerKind;
LayerPtr pLayer;
} FbdevScrPriv;
@ -97,5 +98,7 @@ 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_ */

View File

@ -56,3 +56,35 @@ ddxProcessArgument (int argc, char **argv, int i)
{
return KdProcessArgument (argc, argv, i);
}
KdCardFuncs fbdevFuncs = {
fbdevCardInit, /* cardinit */
fbdevScreenInit, /* scrinit */
fbdevInitScreen, /* initScreen */
fbdevPreserve, /* preserve */
fbdevEnable, /* enable */
fbdevDPMS, /* dpms */
fbdevDisable, /* disable */
fbdevRestore, /* restore */
fbdevScreenFini, /* scrfini */
fbdevCardFini, /* cardfini */
0, /* initCursor */
0, /* enableCursor */
0, /* disableCursor */
0, /* finiCursor */
0, /* recolorCursor */
0, /* initAccel */
0, /* enableAccel */
0, /* syncAccel */
0, /* disableAccel */
0, /* finiAccel */
fbdevGetColors, /* getColors */
fbdevPutColors, /* putColors */
fbdevFinishInitScreen, /* finishInitScreen */
};

View File

@ -1,7 +1,7 @@
INCLUDES = \
-I$(top_srcdir)/fb \
-I$(top_srcdir)/hw/kdrive/src \
-I$(top_srcdir)/hw/kdrive/vesa \
-I$(top_srcdir)/hw/kdrive/fbdev \
-I$(top_srcdir)/mi \
-I$(top_srcdir)/miext/layer \
-I$(top_srcdir)/miext/shadow \
@ -24,7 +24,7 @@ Xsmi_SOURCES = \
Xsmi_LDADD = \
$(top_builddir)/hw/kdrive/smi/libsmi.a \
$(top_builddir)/hw/kdrive/vesa/libvesa.a \
$(top_builddir)/hw/kdrive/fbdev/libfbdev.a \
$(top_builddir)/dix/libdix.a \
$(top_builddir)/os/libos.a \
$(top_builddir)/miext/layer/liblayer.a \

View File

@ -27,18 +27,6 @@
#include "smi.h"
#include <sys/io.h>
#define DEBUG
#ifdef DEBUG
#define DBGOUT(fmt,a...) fprintf (stderr, fmt, ##a)
#else
#define DBGOUT(fmt,a...)
#endif
#define ENTER() DBGOUT("Enter %s\n", __FUNCTION__)
#define LEAVE() DBGOUT("Leave %s\n", __FUNCTION__)
Bool
smiCardInit (KdCardInfo *card)
{
@ -48,10 +36,11 @@ smiCardInit (KdCardInfo *card)
smic = (SmiCardInfo *) xalloc (sizeof (SmiCardInfo));
if (!smic)
return FALSE;
memset (smic, '\0', sizeof (SmiCardInfo));
(void) smiMapReg (card, smic);
if (!vesaInitialize (card, &smic->vesa))
if (!fbdevInitialize (card, &smic->fbdev))
{
xfree (smic);
return FALSE;
@ -67,37 +56,21 @@ smiScreenInit (KdScreenInfo *screen)
{
SmiCardInfo *smic = screen->card->driver;
SmiScreenInfo *smis;
int screen_size, memory;
ENTER();
smis = (SmiScreenInfo *) xalloc (sizeof (SmiScreenInfo));
if (!smis)
return FALSE;
memset (smis, '\0', sizeof (SmiScreenInfo));
if (!vesaScreenInitialize (screen, &smis->vesa))
if (!fbdevScreenInitialize (screen, &smis->fbdev))
{
xfree (smis);
return FALSE;
}
if (!smic->reg_base)
screen->dumb = TRUE;
if (smis->vesa.mapping != VESA_LINEAR)
screen->dumb = TRUE;
smis->screen = smis->vesa.fb;
memory = smis->vesa.fb_size;
screen_size = screen->fb[0].byteStride * screen->height;
screen->softCursor = TRUE;
memory -= screen_size;
if (memory > screen->fb[0].byteStride)
{
smis->off_screen = smis->screen + screen_size;
smis->off_screen_size = memory;
}
else
{
smis->off_screen = 0;
smis->off_screen_size = 0;
}
smis->screen = smic->fbdev.fb;
screen->driver = smis;
LEAVE();
return TRUE;
@ -116,8 +89,9 @@ smiInitScreen (ScreenPtr pScreen)
smiInitVideo(pScreen);
#endif
#endif
ret = vesaInitScreen (pScreen);
ret = fbdevInitScreen (pScreen);
LEAVE();
return ret;
}
#ifdef RANDR
@ -132,7 +106,7 @@ smiRandRSetConfig (ScreenPtr pScreen,
ENTER ();
KdCheckSync (pScreen);
ret = vesaRandRSetConfig (pScreen, randr, rate, pSize);
ret = fbdevRandRSetConfig (pScreen, randr, rate, pSize);
LEAVE();
return ret;
}
@ -152,15 +126,12 @@ smiRandRInit (ScreenPtr pScreen)
Bool
smiFinishInitScreen (ScreenPtr pScreen)
{
ENTER ();
if (!vesaFinishInitScreen (pScreen))
return FALSE;
Bool ret;
ret = fbdevFinishInitScreen (pScreen);
#ifdef RANDR
if (!smiRandRInit (pScreen))
return FALSE;
smiRandRInit (pScreen);
#endif
LEAVE ();
return TRUE;
return ret;
}
void
@ -169,7 +140,7 @@ smiPreserve (KdCardInfo *card)
SmiCardInfo *smic = card->driver;
ENTER ();
vesaPreserve(card);
fbdevPreserve(card);
LEAVE();
}
@ -261,7 +232,7 @@ smiEnable (ScreenPtr pScreen)
SmiCardInfo *smic = pScreenPriv->card->driver;
ENTER ();
if (!vesaEnable (pScreen))
if (!fbdevEnable (pScreen))
return FALSE;
smiSetMMIO (pScreenPriv->card, smic);
@ -286,7 +257,7 @@ smiDisable (ScreenPtr pScreen)
KdXVDisable (pScreen);
#endif
smiResetMMIO (pScreenPriv->card, smic);
vesaDisable (pScreen);
fbdevDisable (pScreen);
LEAVE ();
}
@ -295,7 +266,7 @@ smiDPMS (ScreenPtr pScreen, int mode)
{
Bool ret;
ENTER ();
ret = vesaDPMS (pScreen, mode);
ret = fbdevDPMS (pScreen, mode);
LEAVE ();
return ret;
}
@ -306,7 +277,7 @@ smiRestore (KdCardInfo *card)
SmiCardInfo *smic = card->driver;
ENTER ();
vesaRestore (card);
fbdevRestore (card);
LEAVE();
}
@ -316,7 +287,7 @@ smiScreenFini (KdScreenInfo *screen)
SmiScreenInfo *smis = (SmiScreenInfo *) screen->driver;
ENTER ();
vesaScreenFini (screen);
fbdevScreenFini (screen);
xfree (smis);
screen->driver = 0;
LEAVE ();
@ -329,7 +300,7 @@ smiCardFini (KdCardInfo *card)
ENTER ();
smiUnmapReg (card, smic);
vesaCardFini (card);
fbdevCardFini (card);
LEAVE ();
}
@ -363,8 +334,8 @@ KdCardFuncs smiFuncs = {
smiDrawDisable, /* disableAccel */
smiDrawFini, /* finiAccel */
vesaGetColors, /* getColors */
vesaPutColors, /* putColors */
fbdevGetColors, /* getColors */
fbdevPutColors, /* putColors */
smiFinishInitScreen, /* finishInitScreen */
};

View File

@ -25,9 +25,19 @@
#ifndef _SMI_H_
#define _SMI_H_
#include <vesa.h>
#include <fbdev.h>
#include "kxv.h"
#define DEBUG
#ifdef DEBUG
#define DBGOUT(fmt,a...) fprintf (stderr, fmt, ##a)
#else
#define DBGOUT(fmt,a...)
#endif
#define ENTER() DBGOUT("Enter %s\n", __FUNCTION__)
#define LEAVE() DBGOUT("Leave %s\n", __FUNCTION__)
/*
* offset from ioport beginning
*/
@ -114,7 +124,7 @@ typedef struct _DPR {
#define VGA_SEQ_DATA 0x3C5
typedef struct _smiCardInfo {
VesaCardPrivRec vesa;
FbdevPriv fbdev;
CARD16 io_base;
CARD8 *reg_base;
DPR *dpr;
@ -125,13 +135,11 @@ typedef struct _smiCardInfo {
#define smiCardInfo(kd) SmiCardInfo *smic = getSmiCardInfo(kd)
typedef struct _smiScreenInfo {
VesaScreenPrivRec vesa;
CARD8 *screen;
CARD8 *off_screen;
int off_screen_size;
CARD32 stride;
CARD32 data_format;
CARD8 dpr_vpr_enable;
FbdevScrPriv fbdev;
CARD8 *screen;
CARD32 stride;
CARD32 data_format;
CARD8 dpr_vpr_enable;
} SmiScreenInfo;
#define getSmiScreenInfo(kd) ((SmiScreenInfo *) ((kd)->screen->driver))

View File

@ -86,18 +86,6 @@ CARD8 smiSolidRop[16] = {
#define ENGINE_IDLE_EMPTY(smic) ((GET_STATUS(smic) & 0x18) == 0x10)
#define FIFO_EMPTY(smic) ((GET_STATUS(smic) & 0x10) == 0x10)
static void
smiSleep (int ms)
{
struct timespec req;
req.tv_sec = ms / 1000;
req.tv_nsec = (ms % 1000) * 1000000;
while (req.tv_sec || req.tv_nsec)
if (nanosleep (&req, &req) == 0)
break;
}
#define MAX_FIFO 16
void
@ -126,7 +114,7 @@ static DPR *dpr;
static CARD32 accel_cmd;
static Bool
smiSetup (ScreenPtr pScreen, int wait)
smiSetup (ScreenPtr pScreen, int wait)
{
KdScreenPriv(pScreen);
@ -259,13 +247,29 @@ Bool
smiDrawInit (ScreenPtr pScreen)
{
KdScreenPriv(pScreen);
smiCardInfo (pScreenPriv);
smiScreenInfo (pScreenPriv);
ENTER ();
if (pScreenPriv->screen->fb[0].depth == 4)
{
LEAVE ();
return FALSE;
}
if (!kaaDrawInit (pScreen, &smiKaa))
if (!smic->dpr)
{
LEAVE ();
return FALSE;
}
if (!kaaDrawInit (pScreen, &smiKaa))
{
LEAVE ();
return FALSE;
}
LEAVE ();
return TRUE;
}
@ -276,10 +280,13 @@ smiDrawEnable (ScreenPtr pScreen)
int i;
static const int xyAddress[] = { 320, 400, 512, 640, 800, 1024, 1280, 1600, 2048 };
ENTER ();
smis = getSmiScreenInfo (pScreenPriv);
smic = getSmiCardInfo(pScreenPriv);
dpr = smic->dpr;
iopl(3);
smis->stride = pScreenPriv->screen->fb[0].byteStride;
smis->dpr_vpr_enable = smiGetIndex (smic, VGA_SEQ_INDEX,
VGA_SEQ_DATA, 0x21) & ~0x03;
@ -310,23 +317,27 @@ smiDrawEnable (ScreenPtr pScreen)
}
}
smiSetup (pScreen, 0);
KdMarkSync (pScreen);
LEAVE ();
}
void
smiDrawDisable (ScreenPtr pScreen)
{
ENTER ();
smic = 0;
smis = 0;
dpr = 0;
accel_cmd = 0;
iopl (0);
LEAVE ();
}
void
smiDrawFini (ScreenPtr pScreen)
{
ENTER ();
LEAVE ();
}
void

View File

@ -55,7 +55,7 @@ ddxProcessArgument (int argc, char **argv, int i)
{
int ret;
if (!(ret = vesaProcessArgument (argc, argv, i)))
/* if (!(ret = vesaProcessArgument (argc, argv, i))) */
ret = KdProcessArgument(argc, argv, i);
return ret;
}