Rework vesa driver for shadowing and multiple screen support. Allow enable
to fail and avoid crashing
This commit is contained in:
parent
3805965684
commit
c97fb611dd
|
@ -0,0 +1,13 @@
|
||||||
|
XCOMM $XFree86$
|
||||||
|
|
||||||
|
#include <Server.tmpl>
|
||||||
|
|
||||||
|
#if BuildRender
|
||||||
|
RENDERINCS=-I$(KDRIVE)/../../render -I$(EXTINCSRC)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
KDINCS = -I$(KDRIVE) -I$(XBUILDINCDIR) -I$(FONTINCSRC) \
|
||||||
|
-I$(KDRIVE)/../../fb -I$(KDRIVE)/../../mi \
|
||||||
|
-I$(KDRIVE)/../../miext/shadow \
|
||||||
|
-I$(KDRIVE)/../../include -I$(KDRIVE)/../../os \
|
||||||
|
-I$(EXTINCSRC) -I$(XINCLUDESRC) $(RENDERINCS)
|
|
@ -1,14 +1,13 @@
|
||||||
XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $
|
XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $
|
||||||
XCOMM $XFree86: xc/programs/Xserver/hw/nvfb/Imakefile,v 3.8 1996/12/23 06:30:19 dawes Exp $
|
XCOMM $XFree86: xc/programs/Xserver/hw/nvfb/Imakefile,v 3.8 1996/12/23 06:30:19 dawes Exp $
|
||||||
#include <Server.tmpl>
|
KDRIVE=..
|
||||||
|
#include "../Kdrive.tmpl"
|
||||||
|
|
||||||
SRCS = fbdev.c fbinit.c
|
SRCS = fbdev.c fbinit.c
|
||||||
|
|
||||||
OBJS = fbdev.o fbinit.o
|
OBJS = fbdev.o fbinit.o
|
||||||
|
|
||||||
INCLUDES = -I.. -I. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \
|
INCLUDES = $(KDINCS) -I.
|
||||||
-I../../../fb -I../../../mi -I../../../include -I../../../os \
|
|
||||||
-I$(EXTINCSRC) -I$(XINCLUDESRC)
|
|
||||||
|
|
||||||
NormalLibraryObjectRule()
|
NormalLibraryObjectRule()
|
||||||
NormalLibraryTarget(fbdev,$(OBJS))
|
NormalLibraryTarget(fbdev,$(OBJS))
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
/* $XFree86: xc/programs/Xserver/hw/kdrive/fbdev/fbdev.c,v 1.2 1999/12/30 03:03:08 robin Exp $ */
|
/* $XFree86: xc/programs/Xserver/hw/kdrive/fbdev/fbdev.c,v 1.4 2000/05/06 22:17:41 keithp Exp $ */
|
||||||
|
|
||||||
#include "fbdev.h"
|
#include "fbdev.h"
|
||||||
|
|
||||||
|
@ -136,7 +136,7 @@ fbdevPreserve (KdCardInfo *card)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
Bool
|
||||||
fbdevEnable (ScreenPtr pScreen)
|
fbdevEnable (ScreenPtr pScreen)
|
||||||
{
|
{
|
||||||
KdScreenPriv(pScreen);
|
KdScreenPriv(pScreen);
|
||||||
|
@ -148,7 +148,11 @@ fbdevEnable (ScreenPtr pScreen)
|
||||||
/* display it on the LCD */
|
/* display it on the LCD */
|
||||||
k = ioctl (priv->fd, FBIOPUT_VSCREENINFO, &priv->var);
|
k = ioctl (priv->fd, FBIOPUT_VSCREENINFO, &priv->var);
|
||||||
if (k < 0)
|
if (k < 0)
|
||||||
|
{
|
||||||
perror ("FBIOPUT_VSCREENINFO");
|
perror ("FBIOPUT_VSCREENINFO");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
Bool
|
Bool
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
/* $XFree86: xc/programs/Xserver/hw/kdrive/fbdev/fbdev.h,v 1.2 1999/12/30 03:03:08 robin Exp $ */
|
/* $XFree86: xc/programs/Xserver/hw/kdrive/fbdev/fbdev.h,v 1.4 2000/05/06 22:17:42 keithp Exp $ */
|
||||||
|
|
||||||
#ifndef _FBDEV_H_
|
#ifndef _FBDEV_H_
|
||||||
#define _FBDEV_H_
|
#define _FBDEV_H_
|
||||||
|
@ -56,7 +56,7 @@ fbdevInitScreen (ScreenPtr pScreen);
|
||||||
void
|
void
|
||||||
fbdevPreserve (KdCardInfo *card);
|
fbdevPreserve (KdCardInfo *card);
|
||||||
|
|
||||||
void
|
Bool
|
||||||
fbdevEnable (ScreenPtr pScreen);
|
fbdevEnable (ScreenPtr pScreen);
|
||||||
|
|
||||||
Bool
|
Bool
|
||||||
|
|
|
@ -1,13 +1,12 @@
|
||||||
XCOMM $XFree86: xc/programs/Xserver/hw/kdrive/igs/Imakefile,v 1.1 2000/05/06 22:17:42 keithp Exp $
|
XCOMM $XFree86: xc/programs/Xserver/hw/kdrive/igs/Imakefile,v 1.2 2000/05/24 23:52:47 keithp Exp $
|
||||||
#include <Server.tmpl>
|
KDRIVE=..
|
||||||
|
#include "../Kdrive.tmpl"
|
||||||
|
|
||||||
SRCS = igs.c igscmap.c igscurs.c igsdraw.c igsreg.c igsstub.c
|
SRCS = igs.c igscmap.c igscurs.c igsdraw.c igsreg.c igsstub.c
|
||||||
|
|
||||||
OBJS = igs.o igscmap.o igscurs.o igsdraw.o igsreg.o igsstub.o
|
OBJS = igs.o igscmap.o igscurs.o igsdraw.o igsreg.o igsstub.o
|
||||||
|
|
||||||
INCLUDES = -I.. -I. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \
|
INCLUDES = -I. $(KDINCS)
|
||||||
-I../../../fb -I../../../mi -I../../../include -I../../../os \
|
|
||||||
-I$(EXTINCSRC) -I$(XINCLUDESRC)
|
|
||||||
|
|
||||||
NormalLibraryObjectRule()
|
NormalLibraryObjectRule()
|
||||||
NormalLibraryTarget(igs,$(OBJS))
|
NormalLibraryTarget(igs,$(OBJS))
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* $XFree86: xc/programs/Xserver/hw/kdrive/igs/igs.c,v 1.1 2000/05/06 22:17:43 keithp Exp $
|
* $XFree86: xc/programs/Xserver/hw/kdrive/igs/igs.c,v 1.2 2000/05/24 23:52:47 keithp Exp $
|
||||||
*
|
*
|
||||||
* Copyright © 1999 SuSE, Inc.
|
* Copyright © 1999 SuSE, Inc.
|
||||||
*
|
*
|
||||||
|
@ -331,7 +331,7 @@ igsGetClock (int target, int *Mp, int *Np, int *Pp, int maxM, int maxN, int maxP
|
||||||
*Pp = P;
|
*Pp = P;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
Bool
|
||||||
igsEnable (ScreenPtr pScreen)
|
igsEnable (ScreenPtr pScreen)
|
||||||
{
|
{
|
||||||
KdScreenPriv(pScreen);
|
KdScreenPriv(pScreen);
|
||||||
|
@ -562,6 +562,7 @@ igsEnable (ScreenPtr pScreen)
|
||||||
VgaFetch (&igsvga->card, reg));
|
VgaFetch (&igsvga->card, reg));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
Bool
|
Bool
|
||||||
|
|
|
@ -1,14 +1,13 @@
|
||||||
XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $
|
XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $
|
||||||
XCOMM $XFree86: xc/programs/Xserver/hw/nvfb/Imakefile,v 3.8 1996/12/23 06:30:19 dawes Exp $
|
XCOMM $XFree86: xc/programs/Xserver/hw/nvfb/Imakefile,v 3.8 1996/12/23 06:30:19 dawes Exp $
|
||||||
#include <Server.tmpl>
|
KDRIVE=..
|
||||||
|
#include "../Kdrive.tmpl"
|
||||||
|
|
||||||
SRCS = itsy.c ts.c kbd.c
|
SRCS = itsy.c ts.c kbd.c
|
||||||
|
|
||||||
OBJS = itsy.o ts.o kbd.o
|
OBJS = itsy.o ts.o kbd.o
|
||||||
|
|
||||||
INCLUDES = -I.. -I. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \
|
INCLUDES = -I. $(KDINCS)
|
||||||
-I../../../fb -I../../../mi -I../../../include -I../../../os \
|
|
||||||
-I$(EXTINCSRC) -I$(XINCLUDESRC)
|
|
||||||
|
|
||||||
NormalLibraryObjectRule()
|
NormalLibraryObjectRule()
|
||||||
NormalLibraryTarget(itsy,$(OBJS))
|
NormalLibraryTarget(itsy,$(OBJS))
|
||||||
|
|
|
@ -1,14 +1,13 @@
|
||||||
XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $
|
XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $
|
||||||
XCOMM $XFree86: $
|
XCOMM $XFree86: $
|
||||||
#include <Server.tmpl>
|
KDRIVE=..
|
||||||
|
#include "../Kdrive.tmpl"
|
||||||
|
|
||||||
SRCS = keyboard.c linux.c ps2.c
|
SRCS = keyboard.c linux.c ps2.c
|
||||||
|
|
||||||
OBJS = keyboard.o linux.o ps2.o
|
OBJS = keyboard.o linux.o ps2.o
|
||||||
|
|
||||||
INCLUDES = -I. -I.. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \
|
INCLUDES = -I. $(KDINCS)
|
||||||
-I../../../fb -I../../../mi -I../../../include -I../../../os \
|
|
||||||
-I$(EXTINCSRC) -I$(XINCLUDESRC)
|
|
||||||
|
|
||||||
NormalLibraryObjectRule()
|
NormalLibraryObjectRule()
|
||||||
NormalLibraryTarget(linux,$(OBJS))
|
NormalLibraryTarget(linux,$(OBJS))
|
||||||
|
|
|
@ -1,14 +1,13 @@
|
||||||
XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $
|
XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $
|
||||||
XCOMM $XFree86: xc/programs/Xserver/hw/nvfb/Imakefile,v 3.8 1996/12/23 06:30:19 dawes Exp $
|
XCOMM $XFree86: xc/programs/Xserver/hw/nvfb/Imakefile,v 3.8 1996/12/23 06:30:19 dawes Exp $
|
||||||
#include <Server.tmpl>
|
KDRIVE=..
|
||||||
|
#include "../Kdrive.tmpl"
|
||||||
|
|
||||||
SRCS = s3.c s3clock.c s3cmap.c s3curs.c s3draw.c s3gc.c s3reg.c s3stub.c
|
SRCS = s3.c s3clock.c s3cmap.c s3curs.c s3draw.c s3gc.c s3reg.c s3stub.c
|
||||||
|
|
||||||
OBJS = s3.o s3clock.o s3cmap.o s3curs.o s3draw.o s3gc.o s3reg.o s3stub.o
|
OBJS = s3.o s3clock.o s3cmap.o s3curs.o s3draw.o s3gc.o s3reg.o s3stub.o
|
||||||
|
|
||||||
INCLUDES = -I.. -I. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \
|
INCLUDES = -I. $(KDINCS)
|
||||||
-I../../../fb -I../../../mi -I../../../include -I../../../os \
|
|
||||||
-I$(EXTINCSRC) -I$(XINCLUDESRC)
|
|
||||||
|
|
||||||
NormalLibraryObjectRule()
|
NormalLibraryObjectRule()
|
||||||
NormalLibraryTarget(savage,$(OBJS))
|
NormalLibraryTarget(savage,$(OBJS))
|
||||||
|
|
|
@ -964,7 +964,7 @@ s3SetGlobalBitmap (ScreenPtr pScreen, int ma)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
Bool
|
||||||
s3Enable (ScreenPtr pScreen)
|
s3Enable (ScreenPtr pScreen)
|
||||||
{
|
{
|
||||||
KdScreenPriv(pScreen);
|
KdScreenPriv(pScreen);
|
||||||
|
@ -1667,6 +1667,7 @@ s3Enable (ScreenPtr pScreen)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -463,7 +463,7 @@ typedef struct _s3ScreenInfo {
|
||||||
|
|
||||||
Bool s3CardInit (KdCardInfo *);
|
Bool s3CardInit (KdCardInfo *);
|
||||||
Bool s3ScreenInit (KdScreenInfo *);
|
Bool s3ScreenInit (KdScreenInfo *);
|
||||||
void s3Enable (ScreenPtr pScreen);
|
Bool s3Enable (ScreenPtr pScreen);
|
||||||
void s3Disable (ScreenPtr pScreen);
|
void s3Disable (ScreenPtr pScreen);
|
||||||
void s3Fini (ScreenPtr pScreen);
|
void s3Fini (ScreenPtr pScreen);
|
||||||
|
|
||||||
|
|
|
@ -1,14 +1,13 @@
|
||||||
XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $
|
XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $
|
||||||
XCOMM $XFree86: xc/programs/Xserver/hw/nvfb/Imakefile,v 3.8 1996/12/23 06:30:19 dawes Exp $
|
XCOMM $XFree86: xc/programs/Xserver/hw/nvfb/Imakefile,v 3.8 1996/12/23 06:30:19 dawes Exp $
|
||||||
#include <Server.tmpl>
|
KDRIVE=..
|
||||||
|
#include "../Kdrive.tmpl"
|
||||||
|
|
||||||
SRCS = sis.c sisclock.c siscmap.c siscurs.c sisdraw.c sisio.c sisstub.c
|
SRCS = sis.c sisclock.c siscmap.c siscurs.c sisdraw.c sisio.c sisstub.c
|
||||||
|
|
||||||
OBJS = sis.o sisclock.o siscmap.o siscurs.o sisdraw.o sisio.o sisstub.o
|
OBJS = sis.o sisclock.o siscmap.o siscurs.o sisdraw.o sisio.o sisstub.o
|
||||||
|
|
||||||
INCLUDES = -I.. -I. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \
|
INCLUDES = -I. $(KDINCS)
|
||||||
-I../../../fb -I../../../mi -I../../../include -I../../../os \
|
|
||||||
-I$(EXTINCSRC) -I$(XINCLUDESRC)
|
|
||||||
|
|
||||||
NormalLibraryObjectRule()
|
NormalLibraryObjectRule()
|
||||||
NormalLibraryTarget(sis530,$(OBJS))
|
NormalLibraryTarget(sis530,$(OBJS))
|
||||||
|
|
|
@ -530,7 +530,7 @@ sisPreserve (KdCardInfo *card)
|
||||||
memcpy (sisc->save.text_save, sisc->frameBuffer, SIS_TEXT_SAVE);
|
memcpy (sisc->save.text_save, sisc->frameBuffer, SIS_TEXT_SAVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
Bool
|
||||||
sisEnable (ScreenPtr pScreen)
|
sisEnable (ScreenPtr pScreen)
|
||||||
{
|
{
|
||||||
KdScreenPriv(pScreen);
|
KdScreenPriv(pScreen);
|
||||||
|
@ -827,6 +827,7 @@ sisEnable (ScreenPtr pScreen)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
_sisSetCrtc (sisc, &crtc);
|
_sisSetCrtc (sisc, &crtc);
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
Bool
|
Bool
|
||||||
|
|
|
@ -1149,7 +1149,7 @@ typedef struct _sisScreenInfo {
|
||||||
|
|
||||||
Bool sisCardInit (KdCardInfo *);
|
Bool sisCardInit (KdCardInfo *);
|
||||||
Bool sisScreenInit (KdScreenInfo *);
|
Bool sisScreenInit (KdScreenInfo *);
|
||||||
void sisEnable (ScreenPtr pScreen);
|
Bool sisEnable (ScreenPtr pScreen);
|
||||||
void sisDisable (ScreenPtr pScreen);
|
void sisDisable (ScreenPtr pScreen);
|
||||||
void sisFini (ScreenPtr pScreen);
|
void sisFini (ScreenPtr pScreen);
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $
|
XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $
|
||||||
XCOMM $XFree86: xc/programs/Xserver/hw/nvfb/Imakefile,v 3.8 1996/12/23 06:30:19 dawes Exp $
|
XCOMM $XFree86: xc/programs/Xserver/hw/kdrive/trident/Imakefile,v 1.2 2000/08/29 17:20:15 keithp Exp $
|
||||||
#include <Server.tmpl>
|
KDRIVE=..
|
||||||
|
#include "../Kdrive.tmpl"
|
||||||
|
|
||||||
SRCS = trident.c tridentdraw.c tridentcurs.c tridentstub.c
|
SRCS = trident.c tridentdraw.c tridentcurs.c tridentstub.c
|
||||||
|
|
||||||
|
@ -8,9 +9,7 @@ OBJS = trident.o tridentdraw.o tridentcurs.o tridentstub.o
|
||||||
|
|
||||||
DEFINES = -DVESA
|
DEFINES = -DVESA
|
||||||
|
|
||||||
INCLUDES = -I.. -I../fbdev -I../vesa -I. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \
|
INCLUDES = -I. $(KDINCS) -I$(KDRIVE)/fbdev -I$(KDRIVE)/vesa
|
||||||
-I../../../fb -I../../../mi -I../../../include -I../../../os \
|
|
||||||
-I$(EXTINCSRC) -I$(XINCLUDESRC)
|
|
||||||
|
|
||||||
NormalLibraryObjectRule()
|
NormalLibraryObjectRule()
|
||||||
NormalLibraryTarget(trident,$(OBJS))
|
NormalLibraryTarget(trident,$(OBJS))
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
/* $XFree86: xc/programs/Xserver/hw/kdrive/trident/trident.c,v 1.6 2000/08/26 00:17:50 keithp Exp $ */
|
/* $XFree86: xc/programs/Xserver/hw/kdrive/trident/trident.c,v 1.7 2000/08/29 17:20:15 keithp Exp $ */
|
||||||
|
|
||||||
#include "trident.h"
|
#include "trident.h"
|
||||||
#define extern
|
#define extern
|
||||||
|
@ -72,7 +72,7 @@ tridentScreenInit (KdScreenInfo *screen)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
memset (tridents, '\0', sizeof (TridentScreenInfo));
|
memset (tridents, '\0', sizeof (TridentScreenInfo));
|
||||||
#ifdef VESA
|
#ifdef VESA
|
||||||
if (!vesaScreenInit (screen))
|
if (!vesaScreenInitialize (screen, &tridents->vesa))
|
||||||
#else
|
#else
|
||||||
if (!fbdevScreenInit (screen))
|
if (!fbdevScreenInit (screen))
|
||||||
#endif
|
#endif
|
||||||
|
@ -83,14 +83,16 @@ tridentScreenInit (KdScreenInfo *screen)
|
||||||
if (!tridentc->cop)
|
if (!tridentc->cop)
|
||||||
screen->dumb = TRUE;
|
screen->dumb = TRUE;
|
||||||
#ifdef VESA
|
#ifdef VESA
|
||||||
tridentc->screen = tridentc->vesa.fb;
|
if (tridents->vesa.mapping != VESA_LINEAR)
|
||||||
|
screen->dumb = TRUE;
|
||||||
|
tridents->screen = tridents->vesa.fb;
|
||||||
#else
|
#else
|
||||||
tridentc->screen = tridentc->fb.fb;
|
tridents->screen = tridentc->fb.fb;
|
||||||
#endif
|
#endif
|
||||||
screen_size = screen->fb[0].byteStride * screen->height;
|
screen_size = screen->fb[0].byteStride * screen->height;
|
||||||
memory = (2048 + 512) * 1024;
|
memory = (2048 + 512) * 1024;
|
||||||
if (memory >= screen_size + 2048)
|
if (tridents->screen && memory >= screen_size + 2048)
|
||||||
tridents->cursor_base = tridentc->screen + memory - 2048;
|
tridents->cursor_base = tridents->screen + memory - 2048;
|
||||||
else
|
else
|
||||||
tridents->cursor_base = 0;
|
tridents->cursor_base = 0;
|
||||||
screen->driver = tridents;
|
screen->driver = tridents;
|
||||||
|
@ -100,7 +102,11 @@ tridentScreenInit (KdScreenInfo *screen)
|
||||||
Bool
|
Bool
|
||||||
tridentInitScreen (ScreenPtr pScreen)
|
tridentInitScreen (ScreenPtr pScreen)
|
||||||
{
|
{
|
||||||
|
#ifdef VESA
|
||||||
|
return vesaInitScreen (pScreen);
|
||||||
|
#else
|
||||||
return fbdevInitScreen (pScreen);
|
return fbdevInitScreen (pScreen);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
CARD8
|
CARD8
|
||||||
|
@ -215,18 +221,21 @@ tridentResetMMIO (TridentCardInfo *tridentc)
|
||||||
tridentPause ();
|
tridentPause ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
Bool
|
||||||
tridentEnable (ScreenPtr pScreen)
|
tridentEnable (ScreenPtr pScreen)
|
||||||
{
|
{
|
||||||
KdScreenPriv(pScreen);
|
KdScreenPriv(pScreen);
|
||||||
TridentCardInfo *tridentc = pScreenPriv->card->driver;
|
TridentCardInfo *tridentc = pScreenPriv->card->driver;
|
||||||
|
|
||||||
#ifdef VESA
|
#ifdef VESA
|
||||||
vesaEnable (pScreen);
|
if (!vesaEnable (pScreen))
|
||||||
|
return FALSE;
|
||||||
#else
|
#else
|
||||||
fbdevEnable (pScreen);
|
if (!fbdevEnable (pScreen))
|
||||||
|
return FALSE;
|
||||||
#endif
|
#endif
|
||||||
tridentSetMMIO (tridentc);
|
tridentSetMMIO (tridentc);
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
/* $XFree86: xc/programs/Xserver/hw/kdrive/trident/trident.h,v 1.2 1999/12/30 03:03:16 robin Exp $ */
|
/* $XFree86: xc/programs/Xserver/hw/kdrive/trident/trident.h,v 1.4 2000/08/29 17:20:15 keithp Exp $ */
|
||||||
|
|
||||||
#ifndef _TRIDENT_H_
|
#ifndef _TRIDENT_H_
|
||||||
#define _TRIDENT_H_
|
#define _TRIDENT_H_
|
||||||
|
@ -151,11 +151,10 @@ typedef struct _tridentSave {
|
||||||
|
|
||||||
typedef struct _tridentCardInfo {
|
typedef struct _tridentCardInfo {
|
||||||
#ifdef VESA
|
#ifdef VESA
|
||||||
VesaPrivRec vesa;
|
VesaCardPrivRec vesa;
|
||||||
#else
|
#else
|
||||||
FbdevPriv fb;
|
FbdevPriv fb;
|
||||||
#endif
|
#endif
|
||||||
CARD8 *screen;
|
|
||||||
CARD8 *cop_base;
|
CARD8 *cop_base;
|
||||||
Cop *cop;
|
Cop *cop;
|
||||||
CARD32 cop_depth;
|
CARD32 cop_depth;
|
||||||
|
@ -178,7 +177,11 @@ typedef struct _tridentCursor {
|
||||||
#define TRIDENT_CURSOR_HEIGHT 64
|
#define TRIDENT_CURSOR_HEIGHT 64
|
||||||
|
|
||||||
typedef struct _tridentScreenInfo {
|
typedef struct _tridentScreenInfo {
|
||||||
|
#ifdef VESA
|
||||||
|
VesaScreenPrivRec vesa;
|
||||||
|
#endif
|
||||||
CARD8 *cursor_base;
|
CARD8 *cursor_base;
|
||||||
|
CARD8 *screen;
|
||||||
TridentCursor cursor;
|
TridentCursor cursor;
|
||||||
} TridentScreenInfo;
|
} TridentScreenInfo;
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
/* $XFree86: xc/programs/Xserver/hw/kdrive/trident/tridentcurs.c,v 1.4 2000/05/06 22:17:51 keithp Exp $ */
|
/* $XFree86: xc/programs/Xserver/hw/kdrive/trident/tridentcurs.c,v 1.5 2000/08/29 17:20:15 keithp Exp $ */
|
||||||
|
|
||||||
#include "trident.h"
|
#include "trident.h"
|
||||||
#include "cursorstr.h"
|
#include "cursorstr.h"
|
||||||
|
@ -221,7 +221,7 @@ tridentLoadCursor (ScreenPtr pScreen, int x, int y)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set address for cursor bits */
|
/* Set address for cursor bits */
|
||||||
offset = tridents->cursor_base - (CARD8 *) tridentc->screen;
|
offset = tridents->cursor_base - (CARD8 *) tridents->screen;
|
||||||
offset >>= 10;
|
offset >>= 10;
|
||||||
tridentWriteIndex (tridentc, 0x3d4, 0x44, (CARD8) (offset & 0xff));
|
tridentWriteIndex (tridentc, 0x3d4, 0x44, (CARD8) (offset & 0xff));
|
||||||
tridentWriteIndex (tridentc, 0x3d4, 0x45, (CARD8) (offset >> 8));
|
tridentWriteIndex (tridentc, 0x3d4, 0x45, (CARD8) (offset >> 8));
|
||||||
|
|
|
@ -1,14 +1,13 @@
|
||||||
XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $
|
XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $
|
||||||
XCOMM $XFree86: xc/programs/Xserver/hw/nvfb/Imakefile,v 3.8 1996/12/23 06:30:19 dawes Exp $
|
XCOMM $XFree86: xc/programs/Xserver/hw/nvfb/Imakefile,v 3.8 1996/12/23 06:30:19 dawes Exp $
|
||||||
#include <Server.tmpl>
|
KDRIVE=..
|
||||||
|
#include "../Kdrive.tmpl"
|
||||||
|
|
||||||
SRCS = s3.c s3clock.c s3cmap.c s3curs.c s3draw.c s3gc.c s3stub.c
|
SRCS = s3.c s3clock.c s3cmap.c s3curs.c s3draw.c s3gc.c s3stub.c
|
||||||
|
|
||||||
OBJS = s3.o s3clock.o s3cmap.o s3curs.o s3draw.o s3gc.o s3stub.o
|
OBJS = s3.o s3clock.o s3cmap.o s3curs.o s3draw.o s3gc.o s3stub.o
|
||||||
|
|
||||||
INCLUDES = -I.. -I. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \
|
INCLUDES = -I. $(KDINCS)
|
||||||
-I../../../fb -I../../../mi -I../../../include -I../../../os \
|
|
||||||
-I$(EXTINCSRC) -I$(XINCLUDESRC)
|
|
||||||
|
|
||||||
DEFINES = -DS3_TRIO
|
DEFINES = -DS3_TRIO
|
||||||
|
|
||||||
|
|
|
@ -636,7 +636,7 @@ s3Preserve (KdCardInfo *card)
|
||||||
* Enable the card for rendering. Manipulate the initial settings
|
* Enable the card for rendering. Manipulate the initial settings
|
||||||
* of the card here.
|
* of the card here.
|
||||||
*/
|
*/
|
||||||
void
|
Bool
|
||||||
s3Enable (ScreenPtr pScreen)
|
s3Enable (ScreenPtr pScreen)
|
||||||
{
|
{
|
||||||
KdScreenPriv(pScreen);
|
KdScreenPriv(pScreen);
|
||||||
|
@ -904,6 +904,7 @@ s3Enable (ScreenPtr pScreen)
|
||||||
LockS3 (s3c);
|
LockS3 (s3c);
|
||||||
_s3SetDepth (s3c->s3, crtc);
|
_s3SetDepth (s3c->s3, crtc);
|
||||||
UnlockS3 (s3c);
|
UnlockS3 (s3c);
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
/* $XFree86: xc/programs/Xserver/hw/kdrive/trio/s3.h,v 1.2 1999/12/30 03:03:19 robin Exp $ */
|
/* $XFree86: xc/programs/Xserver/hw/kdrive/trio/s3.h,v 1.4 2000/05/06 22:17:53 keithp Exp $ */
|
||||||
|
|
||||||
#ifndef _S3_H_
|
#ifndef _S3_H_
|
||||||
#define _S3_H_
|
#define _S3_H_
|
||||||
|
@ -1126,7 +1126,7 @@ typedef struct _s3ScreenInfo {
|
||||||
|
|
||||||
Bool s3CardInit (KdCardInfo *);
|
Bool s3CardInit (KdCardInfo *);
|
||||||
Bool s3ScreenInit (KdScreenInfo *);
|
Bool s3ScreenInit (KdScreenInfo *);
|
||||||
void s3Enable (ScreenPtr pScreen);
|
Bool s3Enable (ScreenPtr pScreen);
|
||||||
void s3Disable (ScreenPtr pScreen);
|
void s3Disable (ScreenPtr pScreen);
|
||||||
void s3Fini (ScreenPtr pScreen);
|
void s3Fini (ScreenPtr pScreen);
|
||||||
|
|
||||||
|
|
|
@ -1,14 +1,13 @@
|
||||||
XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $
|
XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $
|
||||||
XCOMM $XFree86: xc/programs/Xserver/hw/nvfb/Imakefile,v 3.8 1996/12/23 06:30:19 dawes Exp $
|
XCOMM $XFree86: xc/programs/Xserver/hw/nvfb/Imakefile,v 3.8 1996/12/23 06:30:19 dawes Exp $
|
||||||
#include <Server.tmpl>
|
KDRIVE=..
|
||||||
|
#include "../Kdrive.tmpl"
|
||||||
|
|
||||||
SRCS = ts300.c
|
SRCS = ts300.c
|
||||||
|
|
||||||
OBJS = ts300.o
|
OBJS = ts300.o
|
||||||
|
|
||||||
INCLUDES = -I../trio -I../sis530 -I.. -I. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \
|
INCLUDES = -I. $(KDINCS) -I../trio -I../sis530
|
||||||
-I../../../fb -I../../../mi -I../../../include -I../../../os \
|
|
||||||
-I$(EXTINCSRC) -I$(XINCLUDESRC)
|
|
||||||
|
|
||||||
NormalLibraryObjectRule()
|
NormalLibraryObjectRule()
|
||||||
NormalLibraryTarget(ts300,$(OBJS))
|
NormalLibraryTarget(ts300,$(OBJS))
|
||||||
|
|
|
@ -1,14 +1,12 @@
|
||||||
XCOMM $XFree86$
|
XCOMM $XFree86$
|
||||||
|
KDRIVE=..
|
||||||
#include <Server.tmpl>
|
#include "../Kdrive.tmpl"
|
||||||
|
|
||||||
SRCS = vesa.c vesainit.c vbe.c
|
SRCS = vesa.c vesainit.c vbe.c
|
||||||
|
|
||||||
OBJS = vesa.o vesainit.o vbe.o
|
OBJS = vesa.o vesainit.o vbe.o
|
||||||
|
|
||||||
INCLUDES = -I.. -I. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \
|
INCLUDES = -I. $(KDINCS)
|
||||||
-I../../../fb -I../../../mi -I../../../include -I../../../os \
|
|
||||||
-I$(EXTINCSRC) -I$(XINCLUDESRC)
|
|
||||||
|
|
||||||
NormalLibraryObjectRule()
|
NormalLibraryObjectRule()
|
||||||
NormalLibraryTarget(vesa,$(OBJS))
|
NormalLibraryTarget(vesa,$(OBJS))
|
||||||
|
|
|
@ -7,8 +7,12 @@ Xvesa \- VESA VBE tiny X server
|
||||||
.RI [ :display ]
|
.RI [ :display ]
|
||||||
.RI [ option ...]
|
.RI [ option ...]
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
Xvesa is an X server for Linux on the x86 platform. Xvesa manipulates
|
.B Xvesa
|
||||||
the video hardware by running the VESA BIOS in VM86 mode. It
|
is a generic X server for Linux on the x86 platform.
|
||||||
|
.B Xvesa
|
||||||
|
doesn't know about any particular hardware, and sets the video mode by
|
||||||
|
running the video BIOS in VM86 mode.
|
||||||
|
.B Xvesa
|
||||||
therefore runs untrusted code with full priviledges, and is one of the
|
therefore runs untrusted code with full priviledges, and is one of the
|
||||||
most insecure X servers available.
|
most insecure X servers available.
|
||||||
.B Run at your own risk.
|
.B Run at your own risk.
|
||||||
|
@ -23,11 +27,10 @@ specifies the VESA video mode to use. If mode
|
||||||
.I n
|
.I n
|
||||||
is not supported by your BIOS and hardware,
|
is not supported by your BIOS and hardware,
|
||||||
.B Xvesa
|
.B Xvesa
|
||||||
will fail, hang your system, or make your monitor explode. You are on
|
will fail, hang your system, or make your monitor explode; you are on
|
||||||
your own. The list of video modes that your BIOS claims to support
|
your own. This option is ignored if the
|
||||||
can be obtained by using the
|
.B -screen
|
||||||
.B -listmodes
|
option was used.
|
||||||
option.
|
|
||||||
.TP 8
|
.TP 8
|
||||||
.B -listmodes
|
.B -listmodes
|
||||||
tells the server to list all supported video modes. If
|
tells the server to list all supported video modes. If
|
||||||
|
@ -40,8 +43,20 @@ the
|
||||||
server won't be able to use.
|
server won't be able to use.
|
||||||
.TP 8
|
.TP 8
|
||||||
.B -force
|
.B -force
|
||||||
tells the server to disable some sanity checks and use the specified
|
disables some sanity checks and use the specified mode even if the
|
||||||
mode even if the BIOS claims not to support it.
|
BIOS claims not to support it.
|
||||||
|
.TP 8
|
||||||
|
.B -shadow
|
||||||
|
use a shadow framebuffer even if it is not strictly necessary. This
|
||||||
|
may dramatically improve performance on some machines.
|
||||||
|
.TP 8
|
||||||
|
.B -nolinear
|
||||||
|
don't use a linear framebuffer even if one is available. You don't
|
||||||
|
want to use this option.
|
||||||
|
.TP 8
|
||||||
|
.B -swaprgb
|
||||||
|
pass RGB values in the order that works on my machine. Use this if
|
||||||
|
the colours are wrong in PseudoColor modes.
|
||||||
.SH KEYBOARD
|
.SH KEYBOARD
|
||||||
Xvesa handles the keyboard in the same manner as the
|
Xvesa handles the keyboard in the same manner as the
|
||||||
.B Xfbdev
|
.B Xfbdev
|
||||||
|
|
|
@ -114,7 +114,8 @@ VbeSetup()
|
||||||
MAP_SHARED | MAP_FIXED,
|
MAP_SHARED | MAP_FIXED,
|
||||||
devmem, HIMEM_BASE);
|
devmem, HIMEM_BASE);
|
||||||
if(hiMem == MAP_FAILED) {
|
if(hiMem == MAP_FAILED) {
|
||||||
munmap(magicMem, MAGICMEM_SIZE);
|
ErrorF("Couldn't map high memory\n");
|
||||||
|
munmap(magicMem, MAGICMEM_SIZE);
|
||||||
munmap(loMem, LOMEM_SIZE);
|
munmap(loMem, LOMEM_SIZE);
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -128,7 +129,6 @@ VbeSetup()
|
||||||
vi->magicMem = magicMem;
|
vi->magicMem = magicMem;
|
||||||
vi->loMem = loMem;
|
vi->loMem = loMem;
|
||||||
vi->hiMem = hiMem;
|
vi->hiMem = hiMem;
|
||||||
vi->fb = NULL;
|
|
||||||
vi->brk = LOMEM_BASE;
|
vi->brk = LOMEM_BASE;
|
||||||
|
|
||||||
stack_base = VbeAllocateMemory(vi, STACK_SIZE);
|
stack_base = VbeAllocateMemory(vi, STACK_SIZE);
|
||||||
|
@ -152,6 +152,9 @@ VbeSetup()
|
||||||
vi->palette_scratch_base = ~0;
|
vi->palette_scratch_base = ~0;
|
||||||
vi->palette_format = 6;
|
vi->palette_format = 6;
|
||||||
vi->palette_wait = 0;
|
vi->palette_wait = 0;
|
||||||
|
vi->windowA_offset = vi->windowB_offset = -1;
|
||||||
|
vi->last_window = 1;
|
||||||
|
vi->vga_palette = 1;
|
||||||
|
|
||||||
memset(&vi->vms, 0, sizeof(struct vm86_struct));
|
memset(&vi->vms, 0, sizeof(struct vm86_struct));
|
||||||
vi->vms.flags = 0;
|
vi->vms.flags = 0;
|
||||||
|
@ -181,8 +184,6 @@ VbeSetup()
|
||||||
void
|
void
|
||||||
VbeCleanup(VbeInfoPtr vi)
|
VbeCleanup(VbeInfoPtr vi)
|
||||||
{
|
{
|
||||||
if(vi->fb)
|
|
||||||
VbeUnmapFramebuffer(vi);
|
|
||||||
munmap(vi->magicMem, MAGICMEM_SIZE);
|
munmap(vi->magicMem, MAGICMEM_SIZE);
|
||||||
munmap(vi->loMem, LOMEM_SIZE);
|
munmap(vi->loMem, LOMEM_SIZE);
|
||||||
munmap(vi->hiMem, HIMEM_SIZE);
|
munmap(vi->hiMem, HIMEM_SIZE);
|
||||||
|
@ -233,12 +234,17 @@ VbeGetModeInfo(VbeInfoPtr vi, int mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
VbeSetMode(VbeInfoPtr vi, int mode)
|
VbeSetMode(VbeInfoPtr vi, int mode, int linear)
|
||||||
{
|
{
|
||||||
int code;
|
int code;
|
||||||
|
|
||||||
|
vi->windowA_offset = vi->windowB_offset = -1;
|
||||||
|
vi->last_window = 1;
|
||||||
|
|
||||||
vi->vms.regs.eax = 0x4F02;
|
vi->vms.regs.eax = 0x4F02;
|
||||||
vi->vms.regs.ebx = (mode & 0xFFFF) | 0xC000;
|
vi->vms.regs.ebx = (mode & 0xFFFF) | 0x8000;
|
||||||
|
if(linear)
|
||||||
|
vi->vms.regs.ebx |= 0x4000;
|
||||||
code = VbeDoInterrupt10(vi);
|
code = VbeDoInterrupt10(vi);
|
||||||
if(code < 0)
|
if(code < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -306,11 +312,24 @@ VbeRestoreState(VbeInfoPtr vi)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
VbeSetTextMode(VbeInfoPtr vi, int mode)
|
||||||
|
{
|
||||||
|
int code;
|
||||||
|
|
||||||
|
vi->vms.regs.eax = mode & 0x7f;
|
||||||
|
code = VbeDoInterrupt10(vi);
|
||||||
|
if(code < 0)
|
||||||
|
return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void *
|
void *
|
||||||
VbeMapFramebuffer(VbeInfoPtr vi) {
|
VbeMapFramebuffer(VbeInfoPtr vi,
|
||||||
|
VbeModeInfoBlock *vmib)
|
||||||
|
{
|
||||||
U8 *fb;
|
U8 *fb;
|
||||||
VbeInfoBlock *vib = (VbeInfoBlock*)&(LM(vi, vi->vib_base));
|
VbeInfoBlock *vib = (VbeInfoBlock*)&(LM(vi, vi->vib_base));
|
||||||
VbeModeInfoBlock *vmib = (VbeModeInfoBlock*)&(LM(vi, vi->vmib_base));
|
|
||||||
int size;
|
int size;
|
||||||
int pagesize = getpagesize(), before, after;
|
int pagesize = getpagesize(), before, after;
|
||||||
|
|
||||||
|
@ -329,18 +348,28 @@ VbeMapFramebuffer(VbeInfoPtr vi) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
vi->fb = fb;
|
|
||||||
vi->fb_size = before + size + after;
|
|
||||||
return fb + before;
|
return fb + before;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
VbeUnmapFramebuffer(VbeInfoPtr vi)
|
VbeUnmapFramebuffer(VbeInfoPtr vi,
|
||||||
|
VbeModeInfoBlock *vmib,
|
||||||
|
void *fb)
|
||||||
{
|
{
|
||||||
int code;
|
int code;
|
||||||
if(!vi->fb)
|
VbeInfoBlock *vib = (VbeInfoBlock*)&(LM(vi, vi->vib_base));
|
||||||
ErrorF("Unmapping frambuffer not mapped\n");
|
int size;
|
||||||
code = munmap(vi->fb, vi->fb_size);
|
int pagesize = getpagesize(), before, after;
|
||||||
|
|
||||||
|
size = 1024 * 64L * vib->TotalMemory;
|
||||||
|
|
||||||
|
before = vmib->PhysBasePtr % pagesize;
|
||||||
|
after = pagesize - ((vmib->PhysBasePtr + size) % pagesize);
|
||||||
|
if(after == pagesize)
|
||||||
|
after = 0;
|
||||||
|
|
||||||
|
fb = (void *) ((char *) fb - before);
|
||||||
|
code = munmap(fb, before + size + after);
|
||||||
if(code) {
|
if(code) {
|
||||||
ErrorF("Couldn't unmap framebuffer: %d\n", errno);
|
ErrorF("Couldn't unmap framebuffer: %d\n", errno);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -375,7 +404,7 @@ int
|
||||||
VbeSetPalette(VbeInfoPtr vi, int first, int number, U8 *entries)
|
VbeSetPalette(VbeInfoPtr vi, int first, int number, U8 *entries)
|
||||||
{
|
{
|
||||||
U8 *palette_scratch;
|
U8 *palette_scratch;
|
||||||
int i, code;
|
int i, j, code;
|
||||||
|
|
||||||
if(number == 0)
|
if(number == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -395,21 +424,41 @@ VbeSetPalette(VbeInfoPtr vi, int first, int number, U8 *entries)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(i=0; i<number*4; i++)
|
if (vi->vga_palette)
|
||||||
palette_scratch[i] = entries[i] >> (8 - vi->palette_format);
|
{
|
||||||
|
vi->vms.regs.eax = 0x1012;
|
||||||
vi->vms.regs.eax = 0x4F09;
|
vi->vms.regs.ebx = first;
|
||||||
if(vi->palette_wait)
|
vi->vms.regs.ecx = number;
|
||||||
vi->vms.regs.ebx = 0x80;
|
vi->vms.regs.es = POINTER_SEGMENT(vi->palette_scratch_base);
|
||||||
|
vi->vms.regs.edx = POINTER_OFFSET(vi->palette_scratch_base);
|
||||||
|
j = 0;
|
||||||
|
i = 0;
|
||||||
|
while (number--)
|
||||||
|
{
|
||||||
|
palette_scratch[j++] = entries[i++] >> (8-vi->palette_format);
|
||||||
|
palette_scratch[j++] = entries[i++] >> (8-vi->palette_format);
|
||||||
|
palette_scratch[j++] = entries[i++] >> (8-vi->palette_format);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
vi->vms.regs.ebx = 0x00;
|
{
|
||||||
vi->vms.regs.ecx = number;
|
for(i=0; i<number*4; i++)
|
||||||
vi->vms.regs.edx = first;
|
palette_scratch[i] = entries[i] >> (8 - vi->palette_format);
|
||||||
vi->vms.regs.es = POINTER_SEGMENT(vi->palette_scratch_base);
|
|
||||||
vi->vms.regs.edi = POINTER_OFFSET(vi->palette_scratch_base);
|
vi->vms.regs.eax = 0x4F09;
|
||||||
|
if(vi->palette_wait)
|
||||||
|
vi->vms.regs.ebx = 0x80;
|
||||||
|
else
|
||||||
|
vi->vms.regs.ebx = 0x00;
|
||||||
|
vi->vms.regs.ecx = number;
|
||||||
|
vi->vms.regs.edx = first;
|
||||||
|
vi->vms.regs.es = POINTER_SEGMENT(vi->palette_scratch_base);
|
||||||
|
vi->vms.regs.edi = POINTER_OFFSET(vi->palette_scratch_base);
|
||||||
|
}
|
||||||
code = VbeDoInterrupt10(vi);
|
code = VbeDoInterrupt10(vi);
|
||||||
if(code < 0)
|
if(code < 0)
|
||||||
return -1;
|
return -1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -417,7 +466,7 @@ int
|
||||||
VbeGetPalette(VbeInfoPtr vi, int first, int number, U8 *entries)
|
VbeGetPalette(VbeInfoPtr vi, int first, int number, U8 *entries)
|
||||||
{
|
{
|
||||||
U8 *palette_scratch;
|
U8 *palette_scratch;
|
||||||
int i, code;
|
int i, j, code;
|
||||||
|
|
||||||
code = PreparePalette(vi);
|
code = PreparePalette(vi);
|
||||||
if(code < 0)
|
if(code < 0)
|
||||||
|
@ -434,18 +483,45 @@ VbeGetPalette(VbeInfoPtr vi, int first, int number, U8 *entries)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
vi->vms.regs.eax = 0x4F09;
|
retry:
|
||||||
vi->vms.regs.ebx = 0x01;
|
if (vi->vga_palette)
|
||||||
vi->vms.regs.ecx = number;
|
{
|
||||||
vi->vms.regs.edx = first;
|
vi->vms.regs.eax = 0x1017;
|
||||||
vi->vms.regs.es = POINTER_SEGMENT(vi->palette_scratch_base);
|
vi->vms.regs.ebx = first;
|
||||||
vi->vms.regs.edi = POINTER_OFFSET(vi->palette_scratch_base);
|
vi->vms.regs.ecx = number;
|
||||||
code = VbeDoInterrupt10(vi);
|
vi->vms.regs.es = POINTER_SEGMENT(vi->palette_scratch_base);
|
||||||
if(code < 0)
|
vi->vms.regs.edx = POINTER_OFFSET(vi->palette_scratch_base);
|
||||||
return -1;
|
code = VbeDoInterrupt10(vi);
|
||||||
|
if(code < 0)
|
||||||
|
return -1;
|
||||||
|
j = 0;
|
||||||
|
i = 0;
|
||||||
|
while (number--)
|
||||||
|
{
|
||||||
|
entries[i++] = palette_scratch[j++] << (8-vi->palette_format);
|
||||||
|
entries[i++] = palette_scratch[j++] << (8-vi->palette_format);
|
||||||
|
entries[i++] = palette_scratch[j++] << (8-vi->palette_format);
|
||||||
|
entries[i++] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vi->vms.regs.eax = 0x4F09;
|
||||||
|
vi->vms.regs.ebx = 0x01;
|
||||||
|
vi->vms.regs.ecx = number;
|
||||||
|
vi->vms.regs.edx = first;
|
||||||
|
vi->vms.regs.es = POINTER_SEGMENT(vi->palette_scratch_base);
|
||||||
|
vi->vms.regs.edi = POINTER_OFFSET(vi->palette_scratch_base);
|
||||||
|
code = VbeDoInterrupt10(vi);
|
||||||
|
if(code < 0)
|
||||||
|
{
|
||||||
|
vi->vga_palette = TRUE;
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
|
|
||||||
for(i=0; i<number*4; i++)
|
for(i=0; i<number*4; i++)
|
||||||
entries[i] = palette_scratch[i] << (8-vi->palette_format);
|
entries[i] = palette_scratch[i] << (8-vi->palette_format);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -458,7 +534,6 @@ VbeSetPaletteOptions(VbeInfoPtr vi, U8 bits, int wait)
|
||||||
ErrorF("Impossible palette format %d\n", vi->palette_format);
|
ErrorF("Impossible palette format %d\n", vi->palette_format);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
ErrorF("Setting palette format to %d\n", vi->palette_format);
|
|
||||||
if(bits != vi->palette_format) {
|
if(bits != vi->palette_format) {
|
||||||
vi->palette_format = 0;
|
vi->palette_format = 0;
|
||||||
vi->vms.regs.eax = 0x4F08;
|
vi->vms.regs.eax = 0x4F08;
|
||||||
|
@ -472,6 +547,94 @@ VbeSetPaletteOptions(VbeInfoPtr vi, U8 bits, int wait)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
VbeReallySetWindow(VbeInfoPtr vi, U8 window, U16 winnum)
|
||||||
|
{
|
||||||
|
int code;
|
||||||
|
vi->vms.regs.eax = 0x4F05;
|
||||||
|
vi->vms.regs.ebx = window;
|
||||||
|
vi->vms.regs.edx = winnum;
|
||||||
|
code = VbeDoInterrupt10(vi);
|
||||||
|
if(code < 0)
|
||||||
|
return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
VbeSetWindow(VbeInfoPtr vi, int offset, int purpose, int *size_return)
|
||||||
|
{
|
||||||
|
VbeModeInfoBlock *vmib = (VbeModeInfoBlock*)&(LM(vi, vi->vmib_base));
|
||||||
|
int window_size = vmib->WinSize * 1024;
|
||||||
|
int code;
|
||||||
|
int winnum;
|
||||||
|
|
||||||
|
if(vi->windowA_offset >= 0)
|
||||||
|
if(vi->windowA_offset <= offset && vi->windowA_offset + window_size > offset)
|
||||||
|
if(vmib->WinAAttributes & purpose)
|
||||||
|
goto windowA;
|
||||||
|
|
||||||
|
if(vi->windowB_offset >= 0)
|
||||||
|
if(vi->windowB_offset <= offset && vi->windowB_offset + window_size > offset)
|
||||||
|
if(vmib->WinBAttributes & purpose)
|
||||||
|
goto windowB;
|
||||||
|
|
||||||
|
if(!(vmib->WinBAttributes & purpose) ||
|
||||||
|
!(vmib->WinBAttributes & VBE_WINDOW_RELOCATE))
|
||||||
|
goto set_windowA;
|
||||||
|
|
||||||
|
if(!(vmib->WinAAttributes & purpose) ||
|
||||||
|
!(vmib->WinAAttributes & VBE_WINDOW_RELOCATE))
|
||||||
|
goto set_windowB;
|
||||||
|
|
||||||
|
if(vi->last_window)
|
||||||
|
goto set_windowA;
|
||||||
|
else
|
||||||
|
goto set_windowB;
|
||||||
|
|
||||||
|
set_windowA:
|
||||||
|
winnum = offset / (vmib->WinGranularity * 1024);
|
||||||
|
code = VbeReallySetWindow(vi, 0, winnum);
|
||||||
|
if(code < 0) {
|
||||||
|
ErrorF("Couldn't set window A to %d*%d\n",
|
||||||
|
(int)winnum, (int)vmib->WinGranularity);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
vi->windowA_offset = winnum * vmib->WinGranularity * 1024;
|
||||||
|
windowA:
|
||||||
|
vi->last_window = 0;
|
||||||
|
*size_return = vmib->WinSize * 1024 - (offset - vi->windowA_offset);
|
||||||
|
return ((U8*)&(LM(vi, MAKE_POINTER(vmib->WinASegment, 0)))) +
|
||||||
|
offset - vi->windowA_offset;
|
||||||
|
|
||||||
|
set_windowB:
|
||||||
|
winnum = offset / (vmib->WinGranularity * 1024);
|
||||||
|
code = VbeReallySetWindow(vi, 1, winnum);
|
||||||
|
if(code < 0) {
|
||||||
|
ErrorF("Couldn't set window B to %d*%d\n",
|
||||||
|
(int)winnum, (int)vmib->WinGranularity);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
vi->windowB_offset = winnum * vmib->WinGranularity * 1024;
|
||||||
|
windowB:
|
||||||
|
vi->last_window = 1;
|
||||||
|
*size_return = vmib->WinSize * 1024 - (offset - vi->windowB_offset);
|
||||||
|
return ((U8*)&(LM(vi, MAKE_POINTER(vmib->WinBSegment, 0)))) + offset - vi->windowB_offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
VbeSetWritePlaneMask(VbeInfoPtr vi, int mask)
|
||||||
|
{
|
||||||
|
asm volatile ("outb %b0,%w1" : : "a" (2), "d" (0x3c4));
|
||||||
|
asm volatile ("outb %b0,%w1" : : "a" (mask), "d" (0x3c5));
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
VbeSetReadPlaneMap(VbeInfoPtr vi, int map)
|
||||||
|
{
|
||||||
|
asm volatile ("outb %b0,%w1" : : "a" (4), "d" (0x3ce));
|
||||||
|
asm volatile ("outb %b0,%w1" : : "a" (map), "d" (0x3cf));
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
VbeReportInfo(VbeInfoPtr vi, VbeInfoBlock *vib)
|
VbeReportInfo(VbeInfoPtr vi, VbeInfoBlock *vib)
|
||||||
{
|
{
|
||||||
|
@ -496,7 +659,7 @@ VbeReportInfo(VbeInfoPtr vi, VbeInfoBlock *vib)
|
||||||
(vib->Capabilities[0]&1)?"fixed":"switchable",
|
(vib->Capabilities[0]&1)?"fixed":"switchable",
|
||||||
(vib->Capabilities[0]&2)?"not ":"",
|
(vib->Capabilities[0]&2)?"not ":"",
|
||||||
(vib->Capabilities[0]&3)?", RAMDAC causes snow":"");
|
(vib->Capabilities[0]&3)?", RAMDAC causes snow":"");
|
||||||
ErrorF("Total memory: %lu bytes\n", 64L*vib->TotalMemory);
|
ErrorF("Total memory: %lu kilobytes\n", 64L*vib->TotalMemory);
|
||||||
if(error)
|
if(error)
|
||||||
return -1;
|
return -1;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -572,7 +735,7 @@ VbeDoInterrupt10(VbeInfoPtr vi)
|
||||||
if(code < 0)
|
if(code < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if((vi->vms.regs.eax & 0xFFFF) != 0x4F) {
|
if((vi->vms.regs.eax & 0xFFFF) != 0x4F && (oldax & 0xFF00) == 0x4F00) {
|
||||||
ErrorF("Int 10h (0x%04X) failed: 0x%04X",
|
ErrorF("Int 10h (0x%04X) failed: 0x%04X",
|
||||||
oldax, vi->vms.regs.eax & 0xFFFF);
|
oldax, vi->vms.regs.eax & 0xFFFF);
|
||||||
if((oldax & 0xFF00) == 0x4F00) {
|
if((oldax & 0xFF00) == 0x4F00) {
|
||||||
|
@ -627,7 +790,9 @@ VbeDoInterrupt(VbeInfoPtr vi, int num)
|
||||||
PUSHW(vi, POINTER_OFFSET(vi->ret_code));
|
PUSHW(vi, POINTER_OFFSET(vi->ret_code));
|
||||||
vi->vms.regs.cs = seg;
|
vi->vms.regs.cs = seg;
|
||||||
vi->vms.regs.eip = off;
|
vi->vms.regs.eip = off;
|
||||||
|
OsBlockSignals ();
|
||||||
code = vm86_loop(vi);
|
code = vm86_loop(vi);
|
||||||
|
OsReleaseSignals ();
|
||||||
if(code < 0) {
|
if(code < 0) {
|
||||||
perror("vm86 failed");
|
perror("vm86 failed");
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -873,6 +1038,7 @@ static int
|
||||||
vm86_loop(VbeInfoPtr vi)
|
vm86_loop(VbeInfoPtr vi)
|
||||||
{
|
{
|
||||||
int code;
|
int code;
|
||||||
|
|
||||||
while(1) {
|
while(1) {
|
||||||
code = vm86old(&vi->vms);
|
code = vm86old(&vi->vms);
|
||||||
switch(VM86_TYPE(code)) {
|
switch(VM86_TYPE(code)) {
|
||||||
|
@ -1030,18 +1196,20 @@ static int
|
||||||
vm86old(struct vm86_struct *vm)
|
vm86old(struct vm86_struct *vm)
|
||||||
{
|
{
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"pushl %%ebx\n\t"
|
"pushl %%ebx\n\t"
|
||||||
"movl %2, %%ebx\n\t"
|
"movl %2, %%ebx\n\t"
|
||||||
"movl %1,%%eax\n\t"
|
"movl %1,%%eax\n\t"
|
||||||
"int $0x80\n\t"
|
"int $0x80\n\t"
|
||||||
"popl %%ebx"
|
"popl %%ebx"
|
||||||
: "=a" (res) : "n" (113), "r" (vm));
|
: "=a" (res) : "n" (113), "r" (vm));
|
||||||
if(res < 0) {
|
if(res < 0) {
|
||||||
errno = -res;
|
errno = -res;
|
||||||
res = -1;
|
res = -1;
|
||||||
} else
|
} else
|
||||||
errno = 0;
|
errno = 0;
|
||||||
|
OsReleaseSignals ();
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,10 @@ THE SOFTWARE.
|
||||||
#ifndef _VBE_H
|
#ifndef _VBE_H
|
||||||
#define _VBE_H
|
#define _VBE_H
|
||||||
|
|
||||||
|
#define VBE_WINDOW_RELOCATE 1
|
||||||
|
#define VBE_WINDOW_READ 2
|
||||||
|
#define VBE_WINDOW_WRITE 4
|
||||||
|
|
||||||
#ifndef U8
|
#ifndef U8
|
||||||
#define U8 unsigned char
|
#define U8 unsigned char
|
||||||
#define U16 unsigned short
|
#define U16 unsigned short
|
||||||
|
@ -61,13 +65,16 @@ THE SOFTWARE.
|
||||||
|
|
||||||
typedef struct _VbeInfoRec {
|
typedef struct _VbeInfoRec {
|
||||||
int devmem, devzero;
|
int devmem, devzero;
|
||||||
void *magicMem, *loMem, *hiMem, *fb;
|
void *magicMem, *loMem, *hiMem;
|
||||||
U32 fb_size;
|
|
||||||
U32 brk;
|
U32 brk;
|
||||||
struct vm86_struct vms;
|
struct vm86_struct vms;
|
||||||
U32 ret_code, stack_base, vib_base, vmib_base, statebuffer_base, palette_scratch_base;
|
U32 ret_code, stack_base, vib_base, vmib_base, statebuffer_base, palette_scratch_base;
|
||||||
U8 palette_format;
|
U8 palette_format;
|
||||||
int palette_wait;
|
int palette_wait;
|
||||||
|
int windowA_offset;
|
||||||
|
int windowB_offset;
|
||||||
|
int last_window;
|
||||||
|
int vga_palette;
|
||||||
} VbeInfoRec, *VbeInfoPtr;
|
} VbeInfoRec, *VbeInfoPtr;
|
||||||
|
|
||||||
typedef struct _VbeInfoBlock {
|
typedef struct _VbeInfoBlock {
|
||||||
|
@ -143,15 +150,16 @@ VbeInfoPtr VbeSetup(void);
|
||||||
void VbeCleanup(VbeInfoPtr vi);
|
void VbeCleanup(VbeInfoPtr vi);
|
||||||
VbeInfoBlock *VbeGetInfo(VbeInfoPtr vi);
|
VbeInfoBlock *VbeGetInfo(VbeInfoPtr vi);
|
||||||
VbeModeInfoBlock *VbeGetModeInfo(VbeInfoPtr vi, int mode);
|
VbeModeInfoBlock *VbeGetModeInfo(VbeInfoPtr vi, int mode);
|
||||||
int VbeSetMode(VbeInfoPtr vi, int mode);
|
int VbeSetMode(VbeInfoPtr vi, int mode, int linear);
|
||||||
int VbeGetMode(VbeInfoPtr vi, int *mode);
|
int VbeGetMode(VbeInfoPtr vi, int *mode);
|
||||||
int VbeSetupStateBuffer(VbeInfoPtr vi);
|
int VbeSetupStateBuffer(VbeInfoPtr vi);
|
||||||
int VbeSaveState(VbeInfoPtr vi);
|
int VbeSaveState(VbeInfoPtr vi);
|
||||||
int VbeRestoreState(VbeInfoPtr vi);
|
int VbeRestoreState(VbeInfoPtr vi);
|
||||||
void *VbeMapFramebuffer(VbeInfoPtr vi);
|
void *VbeMapFramebuffer(VbeInfoPtr vi, VbeModeInfoBlock *vmib);
|
||||||
int VbeUnmapFrambuffer(VbeInfoPtr vi);
|
int VbeUnmapFrambuffer(VbeInfoPtr vi, VbeModeInfoBlock *vmib, void *fb);
|
||||||
int VbeSetPalette(VbeInfoPtr vi, int first, int number, U8 *entries);
|
int VbeSetPalette(VbeInfoPtr vi, int first, int number, U8 *entries);
|
||||||
int VbeSetPaletteOptions(VbeInfoPtr vi, U8 bits, int wait);
|
int VbeSetPaletteOptions(VbeInfoPtr vi, U8 bits, int wait);
|
||||||
|
void *VbeSetWindow(VbeInfoPtr vi, int offset, int purpose, int *size_return);
|
||||||
int VbeReportInfo(VbeInfoPtr, VbeInfoBlock *);
|
int VbeReportInfo(VbeInfoPtr, VbeInfoBlock *);
|
||||||
int VbeReportModeInfo(VbeInfoPtr, U16 mode, VbeModeInfoBlock *);
|
int VbeReportModeInfo(VbeInfoPtr, U16 mode, VbeModeInfoBlock *);
|
||||||
|
|
||||||
|
|
|
@ -22,11 +22,12 @@ THE SOFTWARE.
|
||||||
|
|
||||||
#include "vesa.h"
|
#include "vesa.h"
|
||||||
|
|
||||||
#define DEFAULT_MODE 0x115
|
int vesa_video_mode = 0;
|
||||||
|
|
||||||
int vesa_video_mode = DEFAULT_MODE;
|
|
||||||
Bool vesa_force_mode = FALSE;
|
Bool vesa_force_mode = FALSE;
|
||||||
Bool vesa_swap_rgb = FALSE;
|
Bool vesa_swap_rgb = FALSE;
|
||||||
|
Bool vesa_shadow = FALSE;
|
||||||
|
Bool vesa_linear_fb = TRUE;
|
||||||
|
Bool vesa_restore = FALSE;
|
||||||
|
|
||||||
static Bool
|
static Bool
|
||||||
vesaModeSupported(VbeInfoPtr vi, VbeModeInfoBlock *vmib, Bool complain)
|
vesaModeSupported(VbeInfoPtr vi, VbeModeInfoBlock *vmib, Bool complain)
|
||||||
|
@ -36,17 +37,19 @@ vesaModeSupported(VbeInfoPtr vi, VbeModeInfoBlock *vmib, Bool complain)
|
||||||
ErrorF("Text mode specified.\n");
|
ErrorF("Text mode specified.\n");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
if(vmib->MemoryModel != 0x06 && vmib->MemoryModel != 0x04) {
|
if(vmib->MemoryModel != 0x06 && vmib->MemoryModel != 0x04 && vmib->MemoryModel != 0x03) {
|
||||||
if(complain)
|
if(complain)
|
||||||
ErrorF("Unsupported memory model 0x%X\n", vmib->MemoryModel);
|
ErrorF("Unsupported memory model 0x%X\n", vmib->MemoryModel);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
if((vmib->ModeAttributes & 0x80) == 0) {
|
if((vmib->ModeAttributes & 0x80) == 0) {
|
||||||
if(complain)
|
if ((vmib->WinAAttributes & 0x5) != 0x5) {
|
||||||
ErrorF("No linear framebuffer available in this mode\n");
|
if(complain)
|
||||||
return FALSE;
|
ErrorF("Neither linear nor windowed framebuffer available in this mode\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(!(vmib->ModeAttributes&1)) {
|
if(!(vmib->ModeAttributes & 1)) {
|
||||||
if(complain)
|
if(complain)
|
||||||
ErrorF("Mode not supported on this hardware\n");
|
ErrorF("Mode not supported on this hardware\n");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -61,7 +64,8 @@ vesaListModes()
|
||||||
VbeInfoPtr vi = NULL;
|
VbeInfoPtr vi = NULL;
|
||||||
VbeInfoBlock *vib;
|
VbeInfoBlock *vib;
|
||||||
VbeModeInfoBlock *vmib;
|
VbeModeInfoBlock *vmib;
|
||||||
unsigned i;
|
unsigned p, num_modes, i;
|
||||||
|
CARD16 *modes_list = NULL;
|
||||||
|
|
||||||
vi = VbeSetup();
|
vi = VbeSetup();
|
||||||
if(!vi)
|
if(!vi)
|
||||||
|
@ -72,32 +76,91 @@ vesaListModes()
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
VbeReportInfo(vi, vib);
|
VbeReportInfo(vi, vib);
|
||||||
i = MAKE_POINTER_1(vib->VideoModePtr);
|
/* The spec says you need to copy the list */
|
||||||
|
p = MAKE_POINTER_1(vib->VideoModePtr);
|
||||||
|
num_modes = 0;
|
||||||
|
while(VbeMemoryW(vi, p) != 0xFFFF) {
|
||||||
|
num_modes++;
|
||||||
|
p+=2;
|
||||||
|
}
|
||||||
|
modes_list = ALLOCATE_LOCAL(num_modes * sizeof(CARD16));
|
||||||
|
if(!modes_list)
|
||||||
|
goto fail;
|
||||||
|
p = MAKE_POINTER_1(vib->VideoModePtr);
|
||||||
|
for(i=0; i<num_modes; i++) {
|
||||||
|
modes_list[i] = VbeMemoryW(vi, p);
|
||||||
|
p += 2;
|
||||||
|
}
|
||||||
|
|
||||||
while(VbeMemoryW(vi, i) != 0xFFFF) {
|
for(i=0; i<num_modes; i++) {
|
||||||
vmib = VbeGetModeInfo(vi, VbeMemoryW(vi, i));
|
vmib = VbeGetModeInfo(vi, modes_list[i]);
|
||||||
if(!vmib)
|
if(!vmib)
|
||||||
goto fail;
|
goto fail;
|
||||||
if(vesa_force_mode || vesaModeSupported(vi, vmib, FALSE))
|
if(vesa_force_mode || vesaModeSupported(vi, vmib, FALSE))
|
||||||
VbeReportModeInfo(vi, VbeMemoryW(vi, i), vmib);
|
VbeReportModeInfo(vi, modes_list[i], vmib);
|
||||||
i+=2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(modes_list)
|
||||||
|
DEALLOCATE_LOCAL(modes_list);
|
||||||
VbeCleanup(vi);
|
VbeCleanup(vi);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
if(modes_list)
|
||||||
|
DEALLOCATE_LOCAL(modes_list);
|
||||||
VbeCleanup(vi);
|
VbeCleanup(vi);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
Bool
|
Bool
|
||||||
vesaInitialize (KdCardInfo *card, VesaPrivPtr priv)
|
vesaGetModes (KdCardInfo *card, VesaCardPrivPtr priv)
|
||||||
|
{
|
||||||
|
VesaModePtr mode;
|
||||||
|
int nmode;
|
||||||
|
unsigned int i;
|
||||||
|
VbeInfoPtr vi = priv->vi;
|
||||||
|
VbeInfoBlock *vib = priv->vib;
|
||||||
|
VbeModeInfoBlock *vmib;
|
||||||
|
|
||||||
|
/* The spec says you need to copy the list */
|
||||||
|
i = MAKE_POINTER_1(vib->VideoModePtr);
|
||||||
|
nmode = 0;
|
||||||
|
while(VbeMemoryW(vi, i) != 0xFFFF) {
|
||||||
|
nmode++;
|
||||||
|
i+=2;
|
||||||
|
}
|
||||||
|
if (!nmode)
|
||||||
|
return FALSE;
|
||||||
|
priv->modes = xalloc (nmode * sizeof (VesaModeRec));
|
||||||
|
if (!priv->modes)
|
||||||
|
return FALSE;
|
||||||
|
priv->nmode = nmode;
|
||||||
|
i = MAKE_POINTER_1(vib->VideoModePtr);
|
||||||
|
nmode = 0;
|
||||||
|
while(nmode < priv->nmode) {
|
||||||
|
priv->modes[nmode].mode = VbeMemoryW(vi, i);
|
||||||
|
nmode++;
|
||||||
|
i+=2;
|
||||||
|
}
|
||||||
|
i = MAKE_POINTER_1(vib->VideoModePtr);
|
||||||
|
nmode = 0;
|
||||||
|
while(nmode < priv->nmode) {
|
||||||
|
vmib = VbeGetModeInfo(vi, priv->modes[nmode].mode);
|
||||||
|
if(!vmib)
|
||||||
|
break;
|
||||||
|
priv->modes[nmode].vmib = *vmib;
|
||||||
|
i += 2;
|
||||||
|
nmode++;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Bool
|
||||||
|
vesaInitialize (KdCardInfo *card, VesaCardPrivPtr priv)
|
||||||
{
|
{
|
||||||
int code;
|
int code;
|
||||||
|
|
||||||
priv->mode = vesa_video_mode;
|
|
||||||
|
|
||||||
priv->vi = VbeSetup();
|
priv->vi = VbeSetup();
|
||||||
if(!priv->vi)
|
if(!priv->vi)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -106,13 +169,6 @@ vesaInitialize (KdCardInfo *card, VesaPrivPtr priv)
|
||||||
if(!priv->vib)
|
if(!priv->vib)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
priv->vmib = VbeGetModeInfo(priv->vi, priv->mode);
|
|
||||||
if(!priv->vmib)
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
if(!vesa_force_mode && !vesaModeSupported(priv->vi, priv->vmib, TRUE))
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
code = VbeSetupStateBuffer(priv->vi);
|
code = VbeSetupStateBuffer(priv->vi);
|
||||||
if(code < 0)
|
if(code < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -121,9 +177,8 @@ vesaInitialize (KdCardInfo *card, VesaPrivPtr priv)
|
||||||
if(code<0)
|
if(code<0)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
priv->fb = VbeMapFramebuffer(priv->vi);
|
if (!vesaGetModes (card, priv))
|
||||||
if(!priv->vi)
|
goto fail;
|
||||||
goto fail;
|
|
||||||
|
|
||||||
card->driver = priv;
|
card->driver = priv;
|
||||||
|
|
||||||
|
@ -138,9 +193,9 @@ vesaInitialize (KdCardInfo *card, VesaPrivPtr priv)
|
||||||
Bool
|
Bool
|
||||||
vesaCardInit(KdCardInfo *card)
|
vesaCardInit(KdCardInfo *card)
|
||||||
{
|
{
|
||||||
VesaPrivPtr priv;
|
VesaCardPrivPtr priv;
|
||||||
|
|
||||||
priv = xalloc(sizeof(VesaPrivRec));
|
priv = xalloc(sizeof(VesaCardPrivRec));
|
||||||
if(!priv)
|
if(!priv)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
@ -153,30 +208,137 @@ vesaCardInit(KdCardInfo *card)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
Bool
|
int
|
||||||
vesaScreenInit(KdScreenInfo *screen)
|
vesaDepth (VbeModeInfoBlock *m)
|
||||||
{
|
{
|
||||||
VesaPrivPtr priv = screen->card->driver;
|
if (m->MemoryModel == 0x06)
|
||||||
|
return (m->RedMaskSize +
|
||||||
|
m->GreenMaskSize +
|
||||||
|
m->BlueMaskSize);
|
||||||
|
else
|
||||||
|
return m->BitsPerPixel;
|
||||||
|
}
|
||||||
|
|
||||||
|
Bool
|
||||||
|
vesaModeGood (KdScreenInfo *screen,
|
||||||
|
VbeModeInfoBlock *a)
|
||||||
|
{
|
||||||
|
if (a->XResolution <= screen->width &&
|
||||||
|
a->YResolution <= screen->height &&
|
||||||
|
vesaDepth (a) >= screen->fb[0].depth)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#define vabs(a) ((a) >= 0 ? (a) : -(a))
|
||||||
|
|
||||||
|
int
|
||||||
|
vesaSizeError (KdScreenInfo *screen,
|
||||||
|
VbeModeInfoBlock *a)
|
||||||
|
{
|
||||||
|
int xdist, ydist;
|
||||||
|
xdist = vabs (screen->width - a->XResolution);
|
||||||
|
ydist = vabs (screen->height - a->YResolution);
|
||||||
|
return xdist * xdist + ydist * ydist;
|
||||||
|
}
|
||||||
|
|
||||||
|
Bool
|
||||||
|
vesaModeBetter (KdScreenInfo *screen,
|
||||||
|
VbeModeInfoBlock *a,
|
||||||
|
VbeModeInfoBlock *b)
|
||||||
|
{
|
||||||
|
int aerr, berr;
|
||||||
|
|
||||||
|
if (vesaModeGood (screen, a))
|
||||||
|
{
|
||||||
|
if (!vesaModeGood (screen, b))
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (vesaModeGood (screen, b))
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
aerr = vesaSizeError (screen, a);
|
||||||
|
berr = vesaSizeError (screen, b);
|
||||||
|
if (aerr < berr)
|
||||||
|
return TRUE;
|
||||||
|
if (berr < aerr)
|
||||||
|
return FALSE;
|
||||||
|
if (vabs (screen->fb[0].depth - vesaDepth (a)) <
|
||||||
|
vabs (screen->fb[0].depth - vesaDepth (b)))
|
||||||
|
return TRUE;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
VesaModePtr
|
||||||
|
vesaSelectMode (KdScreenInfo *screen)
|
||||||
|
{
|
||||||
|
VesaCardPrivPtr priv = screen->card->driver;
|
||||||
|
int i, best;
|
||||||
|
|
||||||
|
if (vesa_video_mode)
|
||||||
|
{
|
||||||
|
for (best = 0; best < priv->nmode; best++)
|
||||||
|
if (priv->modes[best].mode == vesa_video_mode &&
|
||||||
|
(vesaModeSupported (priv->vi, &priv->modes[best].vmib, FALSE) ||
|
||||||
|
vesa_force_mode))
|
||||||
|
return &priv->modes[best];
|
||||||
|
}
|
||||||
|
for (best = 0; best < priv->nmode; best++)
|
||||||
|
{
|
||||||
|
if (vesaModeSupported (priv->vi, &priv->modes[best].vmib, FALSE))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (best == priv->nmode)
|
||||||
|
return 0;
|
||||||
|
for (i = best + 1; i < priv->nmode; i++)
|
||||||
|
if (vesaModeSupported (priv->vi, &priv->modes[i].vmib, FALSE) &&
|
||||||
|
vesaModeBetter (screen, &priv->modes[i].vmib,
|
||||||
|
&priv->modes[best].vmib))
|
||||||
|
best = i;
|
||||||
|
return &priv->modes[best];
|
||||||
|
}
|
||||||
|
|
||||||
|
Bool
|
||||||
|
vesaScreenInitialize (KdScreenInfo *screen, VesaScreenPrivPtr pscr)
|
||||||
|
{
|
||||||
|
VesaCardPrivPtr priv = screen->card->driver;
|
||||||
|
VbeModeInfoBlock *vmib;
|
||||||
Pixel allbits;
|
Pixel allbits;
|
||||||
int depth;
|
int depth;
|
||||||
|
|
||||||
screen->width = priv->vmib->XResolution;
|
pscr->mode = vesaSelectMode (screen);
|
||||||
screen->height = priv->vmib->YResolution;
|
if (!pscr->mode)
|
||||||
screen->fb[0].depth = priv->vmib->BitsPerPixel;
|
return FALSE;
|
||||||
screen->fb[0].bitsPerPixel = priv->vmib->BitsPerPixel;
|
|
||||||
screen->fb[0].byteStride = priv->vmib->BytesPerScanLine;
|
|
||||||
screen->fb[0].pixelStride =
|
|
||||||
(priv->vmib->BytesPerScanLine * 8) / priv->vmib->BitsPerPixel;
|
|
||||||
|
|
||||||
if(priv->vmib->MemoryModel == 0x06) {
|
pscr->shadow = vesa_shadow;
|
||||||
|
if (vesa_linear_fb)
|
||||||
|
pscr->mapping = VESA_LINEAR;
|
||||||
|
else
|
||||||
|
pscr->mapping = VESA_WINDOWED;
|
||||||
|
|
||||||
|
vmib = &pscr->mode->vmib;
|
||||||
|
|
||||||
|
screen->width = vmib->XResolution;
|
||||||
|
screen->height = vmib->YResolution;
|
||||||
|
screen->fb[0].depth = vesaDepth (vmib);
|
||||||
|
screen->fb[0].bitsPerPixel = vmib->BitsPerPixel;
|
||||||
|
screen->fb[0].byteStride = vmib->BytesPerScanLine;
|
||||||
|
screen->fb[0].pixelStride = ((vmib->BytesPerScanLine * 8) /
|
||||||
|
vmib->BitsPerPixel);
|
||||||
|
|
||||||
|
switch (vmib->MemoryModel) {
|
||||||
|
case 0x06:
|
||||||
/* TrueColor or DirectColor */
|
/* TrueColor or DirectColor */
|
||||||
screen->fb[0].visuals = (1 << TrueColor);
|
screen->fb[0].visuals = (1 << TrueColor);
|
||||||
screen->fb[0].redMask =
|
screen->fb[0].redMask =
|
||||||
FbStipMask(priv->vmib->RedFieldPosition, priv->vmib->RedMaskSize);
|
FbStipMask(vmib->RedFieldPosition, vmib->RedMaskSize);
|
||||||
screen->fb[0].greenMask =
|
screen->fb[0].greenMask =
|
||||||
FbStipMask(priv->vmib->GreenFieldPosition, priv->vmib->GreenMaskSize);
|
FbStipMask(vmib->GreenFieldPosition, vmib->GreenMaskSize);
|
||||||
screen->fb[0].blueMask =
|
screen->fb[0].blueMask =
|
||||||
FbStipMask(priv->vmib->BlueFieldPosition, priv->vmib->BlueMaskSize);
|
FbStipMask(vmib->BlueFieldPosition, vmib->BlueMaskSize);
|
||||||
allbits =
|
allbits =
|
||||||
screen->fb[0].redMask |
|
screen->fb[0].redMask |
|
||||||
screen->fb[0].greenMask |
|
screen->fb[0].greenMask |
|
||||||
|
@ -185,7 +347,8 @@ vesaScreenInit(KdScreenInfo *screen)
|
||||||
while (depth && !(allbits & (1 << (depth - 1))))
|
while (depth && !(allbits & (1 << (depth - 1))))
|
||||||
depth--;
|
depth--;
|
||||||
screen->fb[0].depth = depth;
|
screen->fb[0].depth = depth;
|
||||||
} else if (priv->vmib->MemoryModel == 0x04) {
|
break;
|
||||||
|
case 0x04:
|
||||||
/* PseudoColor */
|
/* PseudoColor */
|
||||||
screen->fb[0].visuals = ((1 << StaticGray) |
|
screen->fb[0].visuals = ((1 << StaticGray) |
|
||||||
(1 << GrayScale) |
|
(1 << GrayScale) |
|
||||||
|
@ -196,35 +359,204 @@ vesaScreenInit(KdScreenInfo *screen)
|
||||||
screen->fb[0].blueMask = 0x00;
|
screen->fb[0].blueMask = 0x00;
|
||||||
screen->fb[0].greenMask = 0x00;
|
screen->fb[0].greenMask = 0x00;
|
||||||
screen->fb[0].redMask = 0x00;
|
screen->fb[0].redMask = 0x00;
|
||||||
} else {
|
break;
|
||||||
|
case 0x03:
|
||||||
|
/* 4 plane planar */
|
||||||
|
screen->fb[0].visuals = (1 << StaticColor);
|
||||||
|
screen->fb[0].blueMask = 0x00;
|
||||||
|
screen->fb[0].greenMask = 0x00;
|
||||||
|
screen->fb[0].redMask = 0x00;
|
||||||
|
screen->fb[0].depth = 4;
|
||||||
|
screen->fb[0].bitsPerPixel = 4;
|
||||||
|
pscr->mapping = VESA_PLANAR;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
ErrorF("Unsupported VESA MemoryModel 0x%02X\n",
|
ErrorF("Unsupported VESA MemoryModel 0x%02X\n",
|
||||||
priv->vmib->MemoryModel);
|
vmib->MemoryModel);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pscr->mapping == VESA_LINEAR && !(vmib->ModeAttributes & 0x80))
|
||||||
|
pscr->mapping = VESA_WINDOWED;
|
||||||
|
|
||||||
|
switch (pscr->mapping) {
|
||||||
|
case VESA_LINEAR:
|
||||||
|
pscr->fb = VbeMapFramebuffer(priv->vi, vmib);
|
||||||
|
break;
|
||||||
|
case VESA_WINDOWED:
|
||||||
|
pscr->fb = NULL;
|
||||||
|
pscr->shadow = TRUE;
|
||||||
|
break;
|
||||||
|
case VESA_PLANAR:
|
||||||
|
pscr->fb = NULL;
|
||||||
|
pscr->shadow = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
screen->rate = 72;
|
screen->rate = 72;
|
||||||
screen->fb[0].frameBuffer = (CARD8 *)(priv->fb);
|
screen->fb[0].frameBuffer = (CARD8 *)(pscr->fb);
|
||||||
|
|
||||||
|
if (pscr->shadow)
|
||||||
|
return KdShadowScreenInit (screen);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
Bool
|
Bool
|
||||||
vesaInitScreen(ScreenPtr pScreen)
|
vesaScreenInit(KdScreenInfo *screen)
|
||||||
{
|
{
|
||||||
|
VesaScreenPrivPtr pscr;
|
||||||
|
|
||||||
|
pscr = xcalloc (1, sizeof (VesaScreenPrivRec));
|
||||||
|
if (!pscr)
|
||||||
|
return FALSE;
|
||||||
|
if (!vesaScreenInitialize (screen, pscr))
|
||||||
|
return FALSE;
|
||||||
|
screen->driver = pscr;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void *
|
||||||
|
vesaWindowPlanar (ScreenPtr pScreen,
|
||||||
|
CARD32 row,
|
||||||
|
CARD32 offset,
|
||||||
|
int mode,
|
||||||
|
CARD32 *size)
|
||||||
|
{
|
||||||
|
KdScreenPriv(pScreen);
|
||||||
|
VesaCardPrivPtr priv = pScreenPriv->card->driver;
|
||||||
|
VesaScreenPrivPtr pscr = pScreenPriv->screen->driver;
|
||||||
|
VbeModeInfoBlock *vmib = &pscr->mode->vmib;
|
||||||
|
static int plane;
|
||||||
|
int winSize;
|
||||||
|
void *base;
|
||||||
|
|
||||||
|
if (!pScreenPriv->enabled)
|
||||||
|
return 0;
|
||||||
|
plane = offset & 3;
|
||||||
|
VbeSetWritePlaneMask (priv->vi, (1 << plane));
|
||||||
|
offset = offset >> 2;
|
||||||
|
base = VbeSetWindow (priv->vi,
|
||||||
|
vmib->BytesPerScanLine * row + offset,
|
||||||
|
mode,
|
||||||
|
&winSize);
|
||||||
|
*size = (CARD32) winSize;
|
||||||
|
return base;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
vesaWindowLinear (ScreenPtr pScreen,
|
||||||
|
CARD32 row,
|
||||||
|
CARD32 offset,
|
||||||
|
int mode,
|
||||||
|
CARD32 *size)
|
||||||
|
{
|
||||||
|
KdScreenPriv(pScreen);
|
||||||
|
VesaCardPrivPtr priv = pScreenPriv->card->driver;
|
||||||
|
VesaScreenPrivPtr pscr = pScreenPriv->screen->driver;
|
||||||
|
VbeModeInfoBlock *vmib = &pscr->mode->vmib;
|
||||||
|
|
||||||
|
if (!pScreenPriv->enabled)
|
||||||
|
return 0;
|
||||||
|
*size = vmib->BytesPerScanLine;
|
||||||
|
return (CARD8 *) pscr->fb + row * vmib->BytesPerScanLine + offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
vesaWindowWindowed (ScreenPtr pScreen,
|
||||||
|
CARD32 row,
|
||||||
|
CARD32 offset,
|
||||||
|
int mode,
|
||||||
|
CARD32 *size)
|
||||||
|
{
|
||||||
|
KdScreenPriv(pScreen);
|
||||||
|
VesaCardPrivPtr priv = pScreenPriv->card->driver;
|
||||||
|
VesaScreenPrivPtr pscr = pScreenPriv->screen->driver;
|
||||||
|
VbeModeInfoBlock *vmib = &pscr->mode->vmib;
|
||||||
|
int winSize;
|
||||||
|
void *base;
|
||||||
|
|
||||||
|
if (!pScreenPriv->enabled)
|
||||||
|
return 0;
|
||||||
|
base = VbeSetWindow (priv->vi,
|
||||||
|
vmib->BytesPerScanLine * row + offset,
|
||||||
|
mode,
|
||||||
|
&winSize);
|
||||||
|
*size = (CARD32) winSize;
|
||||||
|
return base;
|
||||||
|
}
|
||||||
|
|
||||||
|
static CARD16 vga16Colors[16][3] = {
|
||||||
|
{ 0, 0, 0, }, /* 0 */
|
||||||
|
{ 0x80,0, 0, }, /* 1 */
|
||||||
|
{ 0, 0x80,0, }, /* 2 */
|
||||||
|
{ 0x80,0x80,0, }, /* 3 */
|
||||||
|
{ 0, 0, 0x80,}, /* 4 */
|
||||||
|
{ 0x80,0, 0x80,}, /* 5 */
|
||||||
|
{ 0, 0x80,0x80,}, /* 6 */
|
||||||
|
{ 0x80,0x80,0x80,}, /* 7 */
|
||||||
|
{ 0xC0,0xC0,0xC0,}, /* 8 */
|
||||||
|
{ 0xFF,0, 0 ,}, /* 9 */
|
||||||
|
{ 0, 0xFF,0 ,}, /* 10 */
|
||||||
|
{ 0xFF,0xFF,0 ,}, /* 11 */
|
||||||
|
{ 0 ,0, 0xFF,}, /* 12 */
|
||||||
|
{ 0xFF,0, 0xFF,}, /* 13 */
|
||||||
|
{ 0, 0xFF,0xFF,}, /* 14 */
|
||||||
|
{ 0xFF,0xFF,0xFF,}, /* 15 */
|
||||||
|
};
|
||||||
|
|
||||||
|
Bool
|
||||||
|
vesaCreateColormap16 (ColormapPtr pmap)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < 16; i++)
|
||||||
|
{
|
||||||
|
pmap->red[i].co.local.red = (vga16Colors[i][0]<<8)|vga16Colors[i][0];
|
||||||
|
pmap->red[i].co.local.green = (vga16Colors[i][1]<<8)|vga16Colors[i][1];
|
||||||
|
pmap->red[i].co.local.blue = (vga16Colors[i][2]<<8)|vga16Colors[i][2];
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Bool
|
||||||
|
vesaInitScreen(ScreenPtr pScreen)
|
||||||
|
{
|
||||||
|
KdScreenPriv(pScreen);
|
||||||
|
VesaScreenPrivPtr pscr = pScreenPriv->screen->driver;
|
||||||
|
|
||||||
|
if (pscr->shadow)
|
||||||
|
{
|
||||||
|
switch (pscr->mapping) {
|
||||||
|
case VESA_LINEAR:
|
||||||
|
return KdShadowInitScreen (pScreen, shadowUpdatePacked, vesaWindowLinear);
|
||||||
|
case VESA_WINDOWED:
|
||||||
|
return KdShadowInitScreen (pScreen, shadowUpdatePacked, vesaWindowWindowed);
|
||||||
|
case VESA_PLANAR:
|
||||||
|
pScreen->CreateColormap = vesaCreateColormap16;
|
||||||
|
return KdShadowInitScreen (pScreen, shadowUpdatePlanar4, vesaWindowPlanar);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Bool
|
||||||
vesaEnable(ScreenPtr pScreen)
|
vesaEnable(ScreenPtr pScreen)
|
||||||
{
|
{
|
||||||
KdScreenPriv(pScreen);
|
KdScreenPriv(pScreen);
|
||||||
VesaPrivPtr priv = pScreenPriv->card->driver;
|
VesaCardPrivPtr priv = pScreenPriv->card->driver;
|
||||||
|
VesaScreenPrivPtr pscr = pScreenPriv->screen->driver;
|
||||||
int code;
|
int code;
|
||||||
int palette_wait = 0, palette_hi = 0;
|
int palette_wait = 0, palette_hi = 0;
|
||||||
|
int i=0;
|
||||||
|
int size;
|
||||||
|
char *p;
|
||||||
|
|
||||||
code = VbeSetMode(priv->vi, priv->mode);
|
code = VbeSetMode(priv->vi, pscr->mode->mode, pscr->mapping == VESA_LINEAR);
|
||||||
if(code < 0)
|
if(code < 0)
|
||||||
FatalError("Couldn't set mode\n");
|
return FALSE;
|
||||||
|
|
||||||
if(priv->vib->Capabilities[0] & 1)
|
if(priv->vib->Capabilities[0] & 1)
|
||||||
palette_hi = 1;
|
palette_hi = 1;
|
||||||
|
@ -233,23 +565,85 @@ vesaEnable(ScreenPtr pScreen)
|
||||||
if(palette_hi || palette_wait)
|
if(palette_hi || palette_wait)
|
||||||
VbeSetPaletteOptions(priv->vi, palette_hi?8:6, palette_wait);
|
VbeSetPaletteOptions(priv->vi, palette_hi?8:6, palette_wait);
|
||||||
|
|
||||||
return;
|
switch (pscr->mapping) {
|
||||||
|
case VESA_LINEAR:
|
||||||
|
memcpy (priv->text, pscr->fb, VESA_TEXT_SAVE);
|
||||||
|
break;
|
||||||
|
case VESA_WINDOWED:
|
||||||
|
while(i < VESA_TEXT_SAVE) {
|
||||||
|
p = VbeSetWindow(priv->vi, i, VBE_WINDOW_READ, &size);
|
||||||
|
if(!p) {
|
||||||
|
ErrorF("Couldn't set window for saving VGA font\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(i + size > VESA_TEXT_SAVE)
|
||||||
|
size = VESA_TEXT_SAVE - i;
|
||||||
|
memcpy(((char*)priv->text) + i, p, size);
|
||||||
|
i += size;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case VESA_PLANAR:
|
||||||
|
p = VbeSetWindow (priv->vi, 0, VBE_WINDOW_READ, &size);
|
||||||
|
for (i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
VbeSetReadPlaneMap (priv->vi, i);
|
||||||
|
memcpy (((char *)priv->text) + i * (VESA_TEXT_SAVE/4), p,
|
||||||
|
(VESA_TEXT_SAVE/4));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
vesaDisable(ScreenPtr pScreen)
|
vesaDisable(ScreenPtr pScreen)
|
||||||
{
|
{
|
||||||
KdScreenPriv(pScreen);
|
KdScreenPriv(pScreen);
|
||||||
VesaPrivPtr priv = pScreenPriv->card->driver;
|
VesaCardPrivPtr priv = pScreenPriv->card->driver;
|
||||||
|
VesaScreenPrivPtr pscr = pScreenPriv->screen->driver;
|
||||||
|
int i=0;
|
||||||
|
int size;
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
switch (pscr->mapping) {
|
||||||
|
case VESA_LINEAR:
|
||||||
|
memcpy(pscr->fb, priv->text, VESA_TEXT_SAVE);
|
||||||
|
break;
|
||||||
|
case VESA_WINDOWED:
|
||||||
|
while(i < VESA_TEXT_SAVE) {
|
||||||
|
p = VbeSetWindow(priv->vi, i, VBE_WINDOW_WRITE, &size);
|
||||||
|
if(!p) {
|
||||||
|
ErrorF("Couldn't set window for restoring VGA font\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(i + size > VESA_TEXT_SAVE)
|
||||||
|
size = VESA_TEXT_SAVE - i;
|
||||||
|
memcpy(p, ((char*)priv->text) + i, size);
|
||||||
|
i += size;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case VESA_PLANAR:
|
||||||
|
p = VbeSetWindow (priv->vi, 0, VBE_WINDOW_WRITE, &size);
|
||||||
|
for (i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
VbeSetWritePlaneMask (priv->vi, 1 << i);
|
||||||
|
memcpy (p,
|
||||||
|
((char *)priv->text) + i * (VESA_TEXT_SAVE/4),
|
||||||
|
(VESA_TEXT_SAVE/4));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
vesaPreserve(KdCardInfo *card)
|
vesaPreserve(KdCardInfo *card)
|
||||||
{
|
{
|
||||||
VesaPrivPtr priv = card->driver;
|
VesaCardPrivPtr priv = card->driver;
|
||||||
int code;
|
int code;
|
||||||
|
|
||||||
|
/* The framebuffer might not be valid at this point, so we cannot
|
||||||
|
save the VGA fonts now; we do it in vesaEnable. */
|
||||||
|
|
||||||
code = VbeSaveState(priv->vi);
|
code = VbeSaveState(priv->vi);
|
||||||
if(code < 0)
|
if(code < 0)
|
||||||
FatalError("Couldn't save state\n");
|
FatalError("Couldn't save state\n");
|
||||||
|
@ -260,7 +654,7 @@ vesaPreserve(KdCardInfo *card)
|
||||||
void
|
void
|
||||||
vesaRestore(KdCardInfo *card)
|
vesaRestore(KdCardInfo *card)
|
||||||
{
|
{
|
||||||
VesaPrivPtr priv = card->driver;
|
VesaCardPrivPtr priv = card->driver;
|
||||||
VbeRestoreState(priv->vi);
|
VbeRestoreState(priv->vi);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -268,8 +662,9 @@ vesaRestore(KdCardInfo *card)
|
||||||
void
|
void
|
||||||
vesaCardFini(KdCardInfo *card)
|
vesaCardFini(KdCardInfo *card)
|
||||||
{
|
{
|
||||||
VesaPrivPtr priv = card->driver;
|
VesaCardPrivPtr priv = card->driver;
|
||||||
VbeUnmapFramebuffer(priv->vi);
|
if (vesa_restore)
|
||||||
|
VbeSetTextMode(priv->vi,3);
|
||||||
VbeCleanup(priv->vi);
|
VbeCleanup(priv->vi);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -277,15 +672,21 @@ vesaCardFini(KdCardInfo *card)
|
||||||
void
|
void
|
||||||
vesaScreenFini(KdScreenInfo *screen)
|
vesaScreenFini(KdScreenInfo *screen)
|
||||||
{
|
{
|
||||||
return;
|
VesaScreenPrivPtr pscr = screen->driver;
|
||||||
|
VesaCardPrivPtr priv = screen->card->driver;
|
||||||
|
|
||||||
|
if (pscr->fb)
|
||||||
|
VbeUnmapFramebuffer(priv->vi, &pscr->mode->vmib, pscr->fb);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
vesaPutColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs)
|
vesaPutColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs)
|
||||||
{
|
{
|
||||||
KdScreenPriv(pScreen);
|
KdScreenPriv(pScreen);
|
||||||
VesaPrivPtr priv = pScreenPriv->card->driver;
|
VesaScreenPrivPtr pscr = pScreenPriv->screen->driver;
|
||||||
int i, j, k;
|
VesaCardPrivPtr priv = pScreenPriv->card->driver;
|
||||||
|
int i, j, k, start;
|
||||||
CARD8 scratch[4*256];
|
CARD8 scratch[4*256];
|
||||||
int red, green, blue;
|
int red, green, blue;
|
||||||
|
|
||||||
|
@ -314,7 +715,14 @@ vesaPutColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs)
|
||||||
scratch[k+blue] = pdefs[i+k].blue >> 8;
|
scratch[k+blue] = pdefs[i+k].blue >> 8;
|
||||||
scratch[k+3] = 0;
|
scratch[k+3] = 0;
|
||||||
}
|
}
|
||||||
VbeSetPalette(priv->vi, pdefs[i].pixel, j - i, scratch);
|
start = pdefs[i].pixel;
|
||||||
|
if (pscr->mapping == VESA_PLANAR)
|
||||||
|
{
|
||||||
|
for (start = pdefs[i].pixel; start < 256; start += 16)
|
||||||
|
VbeSetPalette(priv->vi, start, j - i, scratch);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
VbeSetPalette(priv->vi, start, j - i, scratch);
|
||||||
i = j;
|
i = j;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -323,7 +731,7 @@ void
|
||||||
vesaGetColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs)
|
vesaGetColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs)
|
||||||
{
|
{
|
||||||
KdScreenPriv(pScreen);
|
KdScreenPriv(pScreen);
|
||||||
VesaPrivPtr priv = pScreenPriv->card->driver;
|
VesaCardPrivPtr priv = pScreenPriv->card->driver;
|
||||||
int first, i, j, k;
|
int first, i, j, k;
|
||||||
CARD8 scratch[4];
|
CARD8 scratch[4];
|
||||||
int red, green, blue;
|
int red, green, blue;
|
||||||
|
@ -367,6 +775,15 @@ vesaProcessArgument (int argc, char **argv, int i)
|
||||||
} else if(!strcmp(argv[i], "-swaprgb")) {
|
} else if(!strcmp(argv[i], "-swaprgb")) {
|
||||||
vesa_swap_rgb = TRUE;
|
vesa_swap_rgb = TRUE;
|
||||||
return 1;
|
return 1;
|
||||||
|
} else if(!strcmp(argv[i], "-shadow")) {
|
||||||
|
vesa_shadow = TRUE;
|
||||||
|
return 1;
|
||||||
|
} else if(!strcmp(argv[i], "-nolinear")) {
|
||||||
|
vesa_linear_fb = FALSE;
|
||||||
|
return 1;
|
||||||
|
} else if(!strcmp(argv[i], "-restore")) {
|
||||||
|
vesa_restore = TRUE;
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -27,24 +27,42 @@ THE SOFTWARE.
|
||||||
#include <sys/vm86.h>
|
#include <sys/vm86.h>
|
||||||
#include "vbe.h"
|
#include "vbe.h"
|
||||||
|
|
||||||
typedef struct _VesaPriv {
|
#define VESA_TEXT_SAVE (64*1024)
|
||||||
|
|
||||||
|
typedef struct _VesaMode {
|
||||||
int mode;
|
int mode;
|
||||||
|
VbeModeInfoBlock vmib;
|
||||||
|
} VesaModeRec, *VesaModePtr;
|
||||||
|
|
||||||
|
typedef struct _VesaCardPriv {
|
||||||
VbeInfoPtr vi;
|
VbeInfoPtr vi;
|
||||||
VbeInfoBlock *vib;
|
VbeInfoBlock *vib;
|
||||||
VbeModeInfoBlock *vmib;
|
VesaModePtr modes;
|
||||||
|
int nmode;
|
||||||
|
char text[VESA_TEXT_SAVE];
|
||||||
|
} VesaCardPrivRec, *VesaCardPrivPtr;
|
||||||
|
|
||||||
|
#define VESA_LINEAR 0
|
||||||
|
#define VESA_WINDOWED 1
|
||||||
|
#define VESA_PLANAR 2
|
||||||
|
typedef struct _VesaScreenPriv {
|
||||||
|
VesaModePtr mode;
|
||||||
|
Bool shadow;
|
||||||
|
int mapping;
|
||||||
void *fb;
|
void *fb;
|
||||||
} VesaPrivRec, *VesaPrivPtr;
|
} VesaScreenPrivRec, *VesaScreenPrivPtr;
|
||||||
|
|
||||||
extern int vesa_video_mode;
|
extern int vesa_video_mode;
|
||||||
extern Bool vesa_force_mode;
|
extern Bool vesa_force_mode;
|
||||||
|
|
||||||
Bool vesaListModes(void);
|
Bool vesaListModes(void);
|
||||||
Bool vesaInitialize(KdCardInfo *card, VesaPrivPtr priv);
|
Bool vesaInitialize(KdCardInfo *card, VesaCardPrivPtr priv);
|
||||||
Bool vesaCardInit(KdCardInfo *card);
|
Bool vesaCardInit(KdCardInfo *card);
|
||||||
Bool vesaInitialize (KdCardInfo *card, VesaPrivPtr priv);
|
Bool vesaInitialize (KdCardInfo *card, VesaCardPrivPtr priv);
|
||||||
|
Bool vesaScreenInitialize (KdScreenInfo *screen, VesaScreenPrivPtr pscr);
|
||||||
Bool vesaScreenInit(KdScreenInfo *screen);
|
Bool vesaScreenInit(KdScreenInfo *screen);
|
||||||
Bool vesaInitScreen(ScreenPtr pScreen);
|
Bool vesaInitScreen(ScreenPtr pScreen);
|
||||||
void vesaEnable(ScreenPtr pScreen);
|
Bool vesaEnable(ScreenPtr pScreen);
|
||||||
void vesaDisable(ScreenPtr pScreen);
|
void vesaDisable(ScreenPtr pScreen);
|
||||||
void vesaPreserve(KdCardInfo *card);
|
void vesaPreserve(KdCardInfo *card);
|
||||||
void vesaRestore(KdCardInfo *card);
|
void vesaRestore(KdCardInfo *card);
|
||||||
|
|
Loading…
Reference in New Issue